ports/emulators/stonx/files/patch-di_dis.c
Dirk Meyer 0d3ad926cf emulators/stonx: Build with free EmuTOS
support localized ROMS
add printer support
preserve stonxrc on updates
fix sound
2025-04-12 17:03:37 +02:00

243 lines
7.9 KiB
C

--- di_dis.c.orig 2004-08-15 12:33:40 UTC
+++ di_dis.c
@@ -76,7 +76,6 @@ static const OP_DEF table[] = {
static const OP_DEF table[] = {
"ABCD",0xc100,0xf1f0,type_14,
- "ADD",0xd000,0xf000,type_3, /* add, adda */
"RESET",0x4e70,0xffff,type_10,
"RTE",0x4e73,0xffff,type_10,
@@ -105,12 +104,12 @@ static const OP_DEF table[] = {
"NBCD",0x4800,0xffc0,type_15,
"PEA",0x4840,0xffc0,type_5,
+ "CHK",0x4180,0xf1c0,type_16,
+ "LEA",0x41c0,0xf1c0,type_2,
"EXT",0x4800,0xfe30,type_12,
"MOVEM",0x4880,0xfb80,type_23,
- "CHK",0x4180,0xf1c0,type_16,
- "LEA",0x41c0,0xf1c0,type_2,
"TST",0x4a00,0xff00,type_7,
"CLR",0x4200,0xff00,type_15,
@@ -152,13 +151,13 @@ static const OP_DEF table[] = {
"SVC",0x58c0,0xffc0,type_5,
"SVS",0x59c0,0xffc0,type_5,
"ADDQ",0x5000,0xf100,type_6,
- "ADDX",0xd000,0xf130,type_14,
- "EXG",0xc100,0xf130,type_18,
+ "ADDA",0xd0c0,0xf0c0,type_3, /* ADDA can look like a ADDX! */
+ "ADDX",0xd100,0xf130,type_14,
+ "ADD",0xd000,0xf000,type_3, /* add, adda */
"MULS",0xc1c0,0xf1c0,type_16,
"MULU",0xc0c0,0xf1c0,type_16,
+ "EXG",0xc100,0xf130,type_18,
"AND",0xc000,0xf000,type_3,
- "ASL",0xe100,0xf118,type_11,
- "ASR",0xe000,0xf118,type_11,
"BCC",0x6400,0xff00,type_8,
"BCS",0x6500,0xff00,type_8,
"BEQ",0x6700,0xff00,type_8,
@@ -175,15 +174,14 @@ static const OP_DEF table[] = {
"BVS",0x6900,0xff00,type_8,
"BRA",0x6000,0xff00,type_8,
"BSR",0x6100,0xff00,type_8,
+ "CMPA",0xb0c0,0xf0c0,type_3, /* cmpa */
"CMPM",0xb108,0xf138,type_19,
+ "EOR",0xb100,0xf100,type_3,
"CMP",0xb000,0xf000,type_3, /* cmp,cmpa */
"DIVS",0x81c0,0xf1c0,type_16,
"DIVU",0x80c0,0xf1c0,type_16,
- "EOR",0xd000,0xf000,type_3,
- "LSR",0xe008,0xf118,type_11,
- "LSR",0xe2c0,0xffc0,type_11,
- "LSL",0xe108,0xf118,type_11,
- "LSL",0xe3c0,0xffc0,type_11,
+ "MOVEA.W",0x3040,0xf1c0,type_4,
+ "MOVEA.L",0x2040,0xf1c0,type_4,
"MOVE.B",0x1000,0xf000,type_4,
"MOVE.W",0x3000,0xf000,type_4,
"MOVE.L",0x2000,0xf000,type_4,
@@ -196,10 +194,10 @@ static const OP_DEF table[] = {
"%6lx EORI #$%x,SR",0x0a7c,0xffff,type_27,
"%6lx ANDI #$%x,CCR",0x023c,0xffff,type_27, /* ANDI #<data>,CCR */
"%6lx ANDI #$%x,SR",0x027c,0xffff,type_27, /* ANDI #data,SR */
- "%6lx MOVEP.W %x(%s),%s",0x0108,0xf1f8,type_29,
- "%6lx MOVEP.W %s,%x(%s)",0x0188,0xf1f8,type_29,
- "%6lx MOVEP.L %x(%s),%s",0x0148,0xf1f8,type_29,
- "%6lx MOVEP.L %s,%x(%s)",0x01c8,0xf1f8,type_29,
+ "%6lx MOVEP.W $%x(%s),%s",0x0108,0xf1f8,type_29,
+ "%6lx MOVEP.W %s,$%x(%s)",0x0188,0xf1f8,type_29,
+ "%6lx MOVEP.L $%x(%s),%s",0x0148,0xf1f8,type_29,
+ "%6lx MOVEP.L %s,$%x(%s)",0x01c8,0xf1f8,type_29,
"BTST",0x0800,0xffc0,type_20,
"BSET",0x08c0,0xffc0,type_20,
"BCHG",0x0840,0xffc0,type_20,
@@ -216,14 +214,23 @@ static const OP_DEF table[] = {
"BCHG",0x0140,0xf1c0,type_21,
"BCLR",0x0180,0xf1c0,type_21,
+ "ASR",0xe0c0,0xffc0,type_11,
+ "ASL",0xe1c0,0xffc0,type_11,
+ "LSR",0xe2c0,0xffc0,type_11,
+ "LSL",0xe3c0,0xffc0,type_11,
+ "ROXR",0xe4c0,0xffc0,type_11,
+ "ROXL",0xe5c0,0xffc0,type_11,
+ "ROR",0xe6c0,0xffc0,type_11,
+ "ROL",0xe7c0,0xffc0,type_11,
+ "ASR",0xe000,0xf118,type_11,
+ "ASL",0xe100,0xf118,type_11,
+ "LSR",0xe008,0xf118,type_11,
+ "LSL",0xe108,0xf118,type_11,
"ROL",0xe118,0xf118,type_11,
"ROR",0xe018,0xf118,type_11,
- "ROL",0xe7c0,0xffc0,type_11,
- "ROR",0xe6c0,0xffc0,type_11,
"ROXL",0xe110,0xf118,type_11,
"ROXR",0xe010,0xf118,type_11,
- "ROXL",0xe5c0,0xffc0,type_11,
- "ROXR",0xe4c0,0xffc0,type_11,
+
"SUBQ",0x5100,0xf100,type_6,
"SUBA",0x90c0,0xf0c0,type_3, /* SUBA can look like a SUBX! */
"SUBX",0x9100,0xf130,type_14,
@@ -237,8 +244,10 @@ static const char *data_regs[] = {
static const char *data_regs[] = {
"D0","D1","D2","D3","D4","D5","D6","D7"};
-static const char *sizes[] = {".B",".W",".L"};
+static const char *sizes[] = {".B",".W",".L",".?"};
+static const char *unknown = "??";
+
void *dis(void *c,char *s)
{
/*
@@ -309,7 +318,7 @@ static UWORD *type_27(UWORD *c,char *s,WORD index)
ULONG adr;
/* WORD data; */
- adr = LM_UL(MEM(c));
+ adr = (long) c;
c++;
sprintf(s,table[index].op,adr,LM_UW(MEM(c)));
return(++c);
@@ -524,7 +533,14 @@ static UWORD *type_21(UWORD *c,char *s,WORD index)
adr = (long)c;
dest_reg = (LM_UW(MEM(c)) & 0x0e00) >> 9; /* get destination reg */
source = LM_UW(MEM(c)) & 0x3f; /* this is an effective address */
- c = effective_address(c,e_a,source,index,0); /* do effective address */
+ if (0x0100 == (LM_UW(MEM(c)) & 0xf1c0))
+ {
+ c = effective_address(c,e_a,source,index,BYTE_SIZE); /* do effective address for BTST (special for BTST Dn,#) */
+ }
+ else
+ {
+ c = effective_address(c,e_a,source,index,0); /* do effective address */
+ }
sprintf(s,"%6lx %s %s,%s",adr,table[index].op,data_regs[dest_reg],e_a);
++c;
return(c);
@@ -575,7 +591,7 @@ static UWORD *type_18(UWORD *c,char *s,WORD index)
const char *rx,*ry;
adr = (long)c;
- dest = LM_UL(MEM(c)) & 0x07;
+ dest = LM_UW(MEM(c)) & 0x07;
source = (LM_UW(MEM(c)) & 0x0e00) >> 9;
op_mode = (LM_UW(MEM(c)) & 0xf8) >> 3;
if(op_mode == 0x08)
@@ -593,6 +609,11 @@ static UWORD *type_18(UWORD *c,char *s,WORD index)
rx = data_regs[source];
ry = adr_regs[dest];
}
+ else
+ {
+ rx = unknown;
+ ry = unknown;
+ }
sprintf(s,"%6lx %s %s,%s",adr,table[index].op,rx,ry);
++c;
return(c);
@@ -693,7 +714,7 @@ static UWORD *type_13(UWORD *c,char *s,WORD index)
}
else
{
- il_data = LM_UL(MEM(c));
+ il_data = LM_UW(MEM(c));
}
c = effective_address(c,e_a,dest,index,0);
sprintf(s,"%6lx %s%s #$%lx,%s",adr,table[index].op,sizes[size],il_data,e_a);
@@ -731,7 +752,7 @@ static UWORD *type_11(UWORD *c,char *s,WORD index)
size = (LM_UW(MEM(c)) & 0x0c0) >> 6;
if(size < 3) /* register shifts */
{
- type = (LM_UW(MEM(c)) & 0x100) >> 8;
+ type = (LM_UW(MEM(c)) & 0x20) >> 5;
dest = (LM_UW(MEM(c)) & 0x07);
count = (LM_UW(MEM(c)) & 0x0e00)>>9;
if(type)
@@ -796,9 +817,9 @@ static UWORD *type_8(UWORD *c,char *s,WORD index)
else
{
size = ".S";
- displacement = (UWORD)( (WORD)( (char)displacement) );
+ displacement = (UWORD)( (WORD)( (char)displacement) + 2 );
}
- dest = (long)c + (long)((WORD)displacement) + 2l;
+ dest = (long)c + (long)((WORD)displacement);
sprintf(s,"%6lx %s%s $%lx",adr,table[index].op,size,dest);
++c;
return(c);
@@ -952,7 +973,7 @@ static UWORD *type_1(UWORD *c,char *s,WORD index)
adr = (long)c;
the_reg = LM_UW(MEM(c)) & 0x07; /* get register number */
++c; /* point to word displacement */
- sprintf(s,"%6lx %s %s,#$%x",adr,table[index].op,adr_regs[the_reg],*c);
+ sprintf(s,"%6lx %s %s,#$%x",adr,table[index].op,adr_regs[the_reg],LM_UW(MEM(c)));
++c;
return(c);
}
@@ -1043,7 +1064,7 @@ static UWORD *effective_address(UWORD *a,char *s,UWORD
displacement = LM_UW(MEM(a)) & 0xff;
index_reg = (LM_UW(MEM(a)) & 0x7000) >> 12;
index_reg_ind = (LM_UW(MEM(a)) & 0x8000)>> 15;
- index_size = (LM_UW(MEM(a)) & 0x8000) >> 11;
+ index_size = (LM_UW(MEM(a)) & 0x0800) >> 11;
if(index_size)
{
s1 = ".L";
@@ -1082,15 +1103,15 @@ static UWORD *effective_address(UWORD *a,char *s,UWORD
case 2: /* program counter with displacement */
++a;
displacement = LM_UW(MEM(a));
- a1 = (long)a + (long)displacement;
- sprintf(s,"%lx(PC)",a1);
+ a1 = (long)a + (long)((WORD)displacement);
+ sprintf(s,"$%lx(PC)",a1);
break;
case 3:
++a;
a1 = (long)((char)(LM_UW(MEM(a)) & 0xff));
index_reg = (LM_UW(MEM(a)) & 0x7000) >> 12;
index_reg_ind = (LM_UW(MEM(a)) & 0x8000)>> 15;
- index_size = (LM_UW(MEM(a)) & 0x8000) >> 11;
+ index_size = (LM_UW(MEM(a)) & 0x0800) >> 11;
a1 += (long)a;
if(index_size)
{
@@ -1133,6 +1154,11 @@ static UWORD *effective_address(UWORD *a,char *s,UWORD
else if (op_mode == BYTE_SIZE)
sprintf(s,"#$%x.B",displacement);
}
+ break;
+ case 5:
+ case 6:
+ case 7:
+ sprintf (s, "%s", unknown);
break;
default:
{