code review and optimizations
[picodrive.git] / cpu / Cyclone / Disa / Disa.c
index e0d00b5..0743d2f 100644 (file)
@@ -39,7 +39,7 @@ int DisaGetEa(char *t,int ea,int size)
     // 110nnn - An + Disp + D/An\r
     int areg=0,ext=0,off=0,da=0,reg=0,wol=0,scale=0;\r
     ext=DisaWord(DisaPc)&0xffff;\r
-    \r
+\r
     areg=ea&7;\r
     off=ext&0xff;    da =ext&0x8000?'a':'d';\r
     reg=(ext>>12)&7; wol=ext&0x0800?'l':'w';\r
@@ -70,7 +70,7 @@ int DisaGetEa(char *t,int ea,int size)
     // 111011 - PC Relative + D/An\r
     int ext=0,off=0,da=0,reg=0,wol=0,scale=0;\r
     ext=DisaWord(DisaPc)&0xffff;\r
-    \r
+\r
     off=ext&0xff;    da =ext&0x8000?'a':'d';\r
     reg=(ext>>12)&7; wol=ext&0x0800?'l':'w';\r
     scale=1<<((ext>>9)&3);\r
@@ -225,7 +225,7 @@ static int DisaMove(int op)
 \r
   sea = op&0x003f;\r
   DisaGetEa(seat,sea,size);\r
-  \r
+\r
   dea =(op&0x01c0)>>3;\r
   dea|=(op&0x0e00)>>9;\r
   DisaGetEa(deat,dea,size);\r
@@ -272,6 +272,21 @@ static int DisaMoveSr(int op)
   return 0;\r
 }\r
 \r
+static int OpChk(op)\r
+{\r
+  int sea=0,dea=0;\r
+  char seat[64]="",deat[64]="";\r
+\r
+  sea=op&0x003f;\r
+  DisaGetEa(seat,sea,0);\r
+\r
+  dea=(op>>9)&7; dea|=8;\r
+  DisaGetEa(deat,dea,2);\r
+\r
+  sprintf(DisaText,"chk %s, %s",seat,deat);\r
+  return 0;\r
+}\r
+\r
 // ================ Opcodes 0x41c0+ ================\r
 static int DisaLea(int op)\r
 {\r
@@ -300,7 +315,7 @@ static int MakeRegList(char *list,int mask,int ea)
   for (i=0;i<17;i++)\r
   {\r
     int bit=0;\r
-    \r
+\r
     // Mask off bit i:\r
     if (reverse) bit=0x8000>>i; else bit=1<<i;\r
     bit&=mask;\r
@@ -322,7 +337,21 @@ static int MakeRegList(char *list,int mask,int ea)
 \r
   // Knock off trailing '/'\r
   len=strlen(list);\r
-  if (len>0) if (list[len-1]=='/') list[len-1]=0; \r
+  if (len>0) if (list[len-1]=='/') list[len-1]=0;\r
+  return 0;\r
+}\r
+\r
+// ================ Opcodes 0x4800+ ================\r
+static int DisaNbcd(int op)\r
+{\r
+  // Nbcd 01001000 00eeeeee  (eeeeee=ea)\r
+  int ea=0;\r
+  char eat[64]="";\r
+\r
+  ea=op&0x003f;\r
+  DisaGetEa(eat,ea,0);\r
+\r
+  sprintf(DisaText,"nbcd %s",eat);\r
   return 0;\r
 }\r
 \r
@@ -337,7 +366,7 @@ static int DisaSwap(int op)
 // ================ Opcodes 0x4850+ ================\r
 static int DisaPea(int op)\r
 {\r
-  // Pea 01001000 01eeeeee  (eeeeee=ea)  pea \r
+  // Pea 01001000 01eeeeee  (eeeeee=ea)  pea\r
   int ea=0;\r
   char eat[64]="";\r
 \r
@@ -445,7 +474,7 @@ static int Disa4E70(int op)
   sprintf(DisaText,"%s",inst[n]);\r
 \r
   //todo - 'stop' with 16 bit data\r
-  \r
+\r
   return 0;\r
 }\r
 \r
@@ -465,6 +494,19 @@ static int DisaTst(int op)
   return 0;\r
 }\r
 \r
+static int DisaTas(int op)\r
+{\r
+  // Tas 01001010 11eeeeee  (eeeeee=ea)\r
+  int ea=0;\r
+  char eat[64]="";\r
+\r
+  ea=op&0x003f;\r
+  DisaGetEa(eat,ea,0);\r
+\r
+  sprintf(DisaText,"tas %s",eat);\r
+  return 0;\r
+}\r
+\r
 // ================ Opcodes 0x4e80+ ================\r
 static int DisaJsr(int op)\r
 {\r
@@ -684,6 +726,23 @@ static int DisaCmpEor(int op)
   return 0;\r
 }\r
 \r
+static int DisaCmpm(int op)\r
+{\r
+  char seat[64]="",deat[64]="";\r
+  int type=0,size=0,sea,dea;\r
+\r
+  type=(op>>8)&1;\r
+  size=(op>>6)&3; if (size>=3) return 1;\r
+  sea=(op&7)|0x18;\r
+  dea=(op>>9)&0x3f;\r
+  DisaGetEa(seat,sea,size);\r
+  DisaGetEa(deat,dea,size);\r
+\r
+  sprintf(DisaText,"cmpm.%c %s, %s",Tasm[size],seat,deat);\r
+  return 0;\r
+}\r
+\r
+\r
 // ================ Opcodes 0xc140+ ================\r
 // 1100ttt1 01000sss  exg ds,dt\r
 // 1100ttt1 01001sss  exg as,at\r
@@ -708,14 +767,16 @@ static int DisaExg(int op)
 static int DisaAddx(int op)\r
 {\r
   // 1t01ddd1 xx000sss addx\r
-  int type=0,size=0,dea=0,sea=0;\r
+  int type=0,size=0,dea=0,sea=0,mem;\r
   char deat[64]="",seat[64]="";\r
   char *opcode[6]={"","subx","","","","addx"};\r
 \r
   type=(op>>12)&5;\r
   dea =(op>> 9)&7;\r
   size=(op>> 6)&3; if (size>=3) return 1;\r
-  sea  = op&0x3f;\r
+  sea = op&7;\r
+  mem = op&8;\r
+  if(mem) { sea+=0x20; dea+=0x20; }\r
 \r
   DisaGetEa(deat,dea,size);\r
   DisaGetEa(seat,sea,size);\r
@@ -749,7 +810,7 @@ static int DisaAsr(int op)
 \r
 static int DisaAsrEa(int op)\r
 {\r
-  // Asr/l/Ror/l etc EA - 11100ttd 11eeeeee \r
+  // Asr/l/Ror/l etc EA - 11100ttd 11eeeeee\r
   int type=0,dir=0,size=1;\r
   char eat[64]="";\r
 \r
@@ -772,13 +833,16 @@ static int TryOp(int op)
   if ((op&0xff00)==0x0800) DisaBtstImm(op); // Btst/Bchg/Bclr/Bset\r
   if ((op&0xc000)==0x0000) DisaMove(op);\r
   if ((op&0xf900)==0x4000) DisaNeg(op); // Negx/Clr/Neg/Not\r
+  if ((op&0xf140)==0x4100) OpChk(op);\r
   if ((op&0xf1c0)==0x41c0) DisaLea(op);\r
   if ((op&0xf9c0)==0x40c0) DisaMoveSr(op);\r
+  if ((op&0xffc0)==0x4800) DisaNbcd(op);\r
   if ((op&0xfff8)==0x4840) DisaSwap(op);\r
   if ((op&0xffc0)==0x4840) DisaPea(op);\r
   if ((op&0xffb8)==0x4880) DisaExt(op);\r
   if ((op&0xfb80)==0x4880) DisaMovem(op);\r
   if ((op&0xff00)==0x4a00) DisaTst(op);\r
+  if ((op&0xffc0)==0x4ac0) DisaTas(op);\r
   if ((op&0xfff0)==0x4e40) DisaTrap(op);\r
   if ((op&0xfff8)==0x4e50) DisaLink(op);\r
   if ((op&0xfff8)==0x4e58) DisaUnlk(op);\r
@@ -796,6 +860,7 @@ static int TryOp(int op)
   if ((op&0xf100)==0x7000) DisaMoveq(op);\r
   if ((op&0x90c0)==0x90c0) DisaAritha(op);\r
   if ((op&0xf000)==0xb000) DisaCmpEor(op);\r
+  if ((op&0xf138)==0xb108) DisaCmpm(op);\r
   if ((op&0xf130)==0xc100) DisaExg(op);\r
   if ((op&0xf000)==0xe000) DisaAsr(op);\r
   if ((op&0xf8c0)==0xe0c0) DisaAsrEa(op);\r