Annotation of hatari/src/disass.c, revision 1.1.1.1

1.1       root        1: /*
                      2:   Hatari
                      3: 
                      4:   Disassemble 'OpCode' into text string for use with debugger
                      5: 
                      6:   This works in a similar way to the decoding of instructions, which while produces
                      7:   more complicated code is very handy for debugging in the early stages of development.
                      8:   (Anyhow, none of this is included in the final executable!)
                      9:   Note the 'rprintf' functions; these do a sprintf but the variables are in reverse order
                     10:   as I use function calls as parameters which 'C' puts them on stack in the opposite order.
                     11:   These functions are also used when writing out a history of the last 'x' instructions
                     12:   ran, which is used for debugging.
                     13: */
                     14: 
                     15: #include "main.h"
                     16: //#include "debugger.h"
                     17: #include "decode.h"
                     18: #include "disass.h"
                     19: #include "m68000.h"
                     20: #include "misc.h"
                     21: #include "stMemory.h"
                     22: 
                     23: #ifdef USE_DEBUGGER
                     24: 
                     25: char szSizeString[4];             /* Size B,W or L */
                     26: char szParamString[256];          /* Data */
                     27: char szConditionString[256];      /* Condition code */
                     28: char szImmString[256];            /* Immediate */
                     29: char szEffAddrString[256];        /* Effective address */
                     30: char szUpperEffAddrString[256];   /* Effective address, upper bits in OpCode (for MOVE instruction) */
                     31: char szRegString[256];            /* MoveM register list */
                     32: char szOpString[256];             /* Final disassembly */
                     33: char szOpData[256];               /* Final disassembly */
                     34: 
                     35: unsigned short int OpCode;        /* Opcode of instruction */
                     36: unsigned long DisPC;              /* Disassembly Program Counter */
                     37: 
                     38: char *pszCC_Strings[] = {
                     39:   "T",   // 0000 (Not used in Bcc)
                     40:   "F",   // 0001 (Not used in Bcc)
                     41:   "HI",  // 0010
                     42:   "LS",  // 0011
                     43:   "CC",  // 0100
                     44:   "CS",  // 0101
                     45:   "NE",  // 0110
                     46:   "EQ",  // 0111
                     47:   "VC",  // 1000
                     48:   "VS",  // 1001
                     49:   "PL",  // 1010
                     50:   "MI",  // 1011
                     51:   "GE",  // 1100
                     52:   "LT",  // 1101
                     53:   "GT",  // 1110
                     54:   "LE"   // 1111
                     55: };
                     56: 
                     57: //-----------------------------------------------------------------------
                     58: /*
                     59:   As 'C' functions parameters are in 'reverse' order, have set of functions
                     60:   which pass parameters in correct order and swap in function.
                     61:   Uses 'C++' overloads to get correct types!
                     62: */
                     63: void rprintf0(char *pSrcString)
                     64: {
                     65:   sprintf(szOpString,pSrcString);
                     66: }
                     67: //-----------------------------------------------------------------------
                     68: // %s
                     69: void rprintf1(char *pSrcString, char *pString1)
                     70: {
                     71:   sprintf(szOpString,pSrcString,pString1);
                     72: }
                     73: // %d
                     74: void rprintf1(char *pSrcString, int Var1)
                     75: {
                     76:   sprintf(szOpString,pSrcString,Var1);
                     77: }
                     78: //-----------------------------------------------------------------------
                     79: // %s %s
                     80: void rprintf2(char *pSrcString, char *pString1, char *pString2)
                     81: {
                     82:   sprintf(szOpString,pSrcString,pString2,pString1);
                     83: }
                     84: // %d %s
                     85: void rprintf2(char *pSrcString, char *pString1, int Var2)
                     86: {
                     87:   sprintf(szOpString,pSrcString,Var2,pString1);
                     88: }
                     89: // %s %d
                     90: void rprintf2(char *pSrcString, int Var1, char *pString2)
                     91: {
                     92:   sprintf(szOpString,pSrcString,pString2,Var1);
                     93: }
                     94: // %d %d
                     95: void rprintf2(char *pSrcString, int Var1, int Var2)
                     96: {
                     97:   sprintf(szOpString,pSrcString,Var2,Var1);
                     98: }
                     99: //-----------------------------------------------------------------------
                    100: // %s %s %s
                    101: void rprintf3(char *pSrcString, char *pString1, char *pString2, char *pString3)
                    102: {
                    103:   sprintf(szOpString,pSrcString,pString3,pString2,pString1);
                    104: }
                    105: // %s %s %d
                    106: void rprintf3(char *pSrcString, int Var1, char *pString2, char *pString3)
                    107: {
                    108:   sprintf(szOpString,pSrcString,pString3,pString2,Var1);
                    109: }
                    110: // %s %d %s
                    111: void rprintf3(char *pSrcString, char *pString1, int Var2, char *pString3)
                    112: {
                    113:   sprintf(szOpString,pSrcString,pString3,Var2,pString1);
                    114: }
                    115: // %s %d %d
                    116: void rprintf3(char *pSrcString, int Var1, int Var2, char *pString3)
                    117: {
                    118:   sprintf(szOpString,pSrcString,pString3,Var2,Var1);
                    119: }
                    120: //-----------------------------------------------------------------------
                    121: // %s %d %s %d
                    122: void rprintf4(char *pSrcString, int Var1, char *pString2, int Var3, char *pString4)
                    123: {
                    124:   sprintf(szOpString,pSrcString,pString4,Var3,pString2,Var1);
                    125: }
                    126: // %s %s %d %d
                    127: void rprintf4(char *pSrcString, int Var1, int Var2, char *pString3, char *pString4)
                    128: {
                    129:   sprintf(szOpString,pSrcString,pString4,pString3,Var2,Var1);
                    130: }
                    131: 
                    132: 
                    133: //-----------------------------------------------------------------------
                    134: /*
                    135:   Read byte,byte(odd address),word and long from memory
                    136: */
                    137: unsigned char Disass_ReadByte(void)
                    138: {
                    139:   char szString[256];
                    140:   unsigned char Var;
                    141: 
                    142:   Var = *(unsigned char *)((unsigned long)STRam+(DisPC&0xffffff));
                    143:   DisPC += SIZE_BYTE;
                    144: 
                    145:   // Add to szOpString
                    146:   sprintf(szString,"%2.2X",Var);
                    147:   strcat(szOpData,szString);
                    148: 
                    149:   return(Var);
                    150: }
                    151: unsigned char Disass_ReadByte_OddAddr(void)
                    152: {
                    153:   char szString[256];
                    154:   unsigned char Var;
                    155: 
                    156:   Var = *(unsigned char *)((unsigned long)STRam+(DisPC&0xffffff)+1);
                    157:   DisPC += SIZE_WORD;
                    158: 
                    159:   // Add to szOpString
                    160:   sprintf(szString,"%4.4X",Var);
                    161:   strcat(szOpData,szString);
                    162: 
                    163:   return(Var);
                    164: }
                    165: unsigned short int Disass_ReadWord(void)
                    166: {
                    167:   char szString[256];
                    168:   unsigned short int Var;
                    169: 
                    170:   Var = *(unsigned short int *)((unsigned long)STRam+(DisPC&0xffffff));
                    171:   DisPC += SIZE_WORD;
                    172: 
                    173:   // Add to szOpString
                    174:   sprintf(szString,"%4.4X",STMemory_Swap68000Int(Var));
                    175:   strcat(szOpData,szString);
                    176: 
                    177:   return(STMemory_Swap68000Int(Var));
                    178: }
                    179: unsigned long Diass_ReadLong(void)
                    180: {
                    181:   char szString[256];
                    182:   unsigned long Var;
                    183: 
                    184:   Var = *(unsigned long *)((unsigned long)STRam+(DisPC&0xffffff));
                    185:   DisPC += SIZE_LONG;
                    186: 
                    187:   // Add to szOpString
                    188:   sprintf(szString,"%8.8X",STMemory_Swap68000Long(Var));
                    189:   strcat(szOpData,szString);
                    190: 
                    191:   return(STMemory_Swap68000Long(Var));
                    192: }
                    193: 
                    194: //-----------------------------------------------------------------------
                    195: /*
                    196:   Convert unsigned values to strings
                    197: */
                    198: char *Disass_ByteToString(unsigned char DataB)
                    199: {
                    200:   if (DataB<=9)
                    201:     sprintf(szParamString,"%d",DataB);
                    202:   else
                    203:     sprintf(szParamString,"$%X",DataB);
                    204:   
                    205:   return(szParamString);
                    206: }
                    207: char *Disass_WordToString(unsigned short int DataW)
                    208: {
                    209:   if (DataW<=9)
                    210:     sprintf(szParamString,"%d",DataW);
                    211:   else
                    212:     sprintf(szParamString,"$%X",DataW);
                    213:   
                    214:   return(szParamString);
                    215: }
                    216: char *Disass_LongToString(unsigned long DataL)
                    217: {
                    218:   if (DataL<=9)
                    219:     sprintf(szParamString,"%d",DataL);
                    220:   else
                    221:     sprintf(szParamString,"$%X",DataL);
                    222:   
                    223:   return(szParamString);
                    224: }
                    225: 
                    226: //-----------------------------------------------------------------------
                    227: /*
                    228:   Convert signed values to strings, pass NULL as String to write to 'szParamString' (default)
                    229: */
                    230: char *Disass_SignedByteToString(char DataB,char *pString=NULL)
                    231: {
                    232:   if (pString==NULL)
                    233:     pString = szParamString;
                    234: 
                    235:   if (abs(DataB)<=9) {
                    236:     if (DataB>=0)
                    237:       sprintf(pString,"%d",DataB);
                    238:     else
                    239:       sprintf(pString,"-%d",-DataB);
                    240:   }
                    241:   else {
                    242:     if (DataB>=0)
                    243:       sprintf(pString,"$%X",DataB);
                    244:     else
                    245:       sprintf(pString,"$%X",(unsigned char)DataB);
                    246:   }
                    247: 
                    248:   return(pString);
                    249: }
                    250: char *Disass_SignedWordToString(short int DataW,char *pString=NULL)
                    251: {
                    252:   if (pString==NULL)
                    253:     pString = szParamString;
                    254: 
                    255:   if (abs(DataW)<=9) {
                    256:     if (DataW>=0)
                    257:       sprintf(pString,"%d",DataW);
                    258:     else
                    259:       sprintf(pString,"-%d",-DataW);
                    260:   }
                    261:   else {
                    262:     if (DataW>=0)
                    263:       sprintf(pString,"$%X",DataW);
                    264:     else
                    265:       sprintf(pString,"$%X",(unsigned short int)DataW);
                    266:   }
                    267: 
                    268:   return(pString);
                    269: }
                    270: char *Disass_SignedLongToString(long DataL,char *pString=NULL)
                    271: {
                    272:   if (pString==NULL)
                    273:     pString = szParamString;
                    274: 
                    275:   if (abs(DataL)<=9) {
                    276:     if (DataL>=0)
                    277:       sprintf(pString,"%d",DataL);
                    278:     else
                    279:       sprintf(pString,"-%d",-DataL);
                    280:   }
                    281:   else {
                    282:     if (DataL>=0)
                    283:       sprintf(pString,"$%X",DataL);
                    284:     else
                    285:       sprintf(pString,"$%X",(unsigned long)DataL);
                    286:   }
                    287: 
                    288:   return(pString);
                    289: }
                    290: 
                    291: //-----------------------------------------------------------------------
                    292: /*
                    293:   Create 'Effective Address' string from OpCode and size, 'asserts' on error
                    294: */
                    295: char *Disass_CalcEffAddr(int Size,unsigned short int Mode,unsigned short int Reg, char *pString)
                    296: {
                    297:   unsigned long OffsetL;
                    298:   unsigned short int OffsetW,EReg,OffsetSize;
                    299:   unsigned char OffsetB;
                    300: 
                    301:   // Clear string, allows easy error check when complete
                    302:   strcpy(pString,"");
                    303: 
                    304:   switch(Mode) {
                    305:     case BIN3(0,0,0):  // Dn
                    306:       sprintf(pString,"D%d",Reg);
                    307:       break;
                    308:     case BIN3(0,0,1):  // An
                    309:       sprintf(pString,"A%d",Reg);
                    310:       break;
                    311: 
                    312:     case BIN3(0,1,0):  // (An)
                    313:       sprintf(pString,"(A%d)",Reg);
                    314:       break;
                    315:     case BIN3(0,1,1):  // (An)+
                    316:       sprintf(pString,"(A%d)+",Reg);
                    317:       break;
                    318:     case BIN3(1,0,0):  // -(An)
                    319:       sprintf(pString,"-(A%d)",Reg);
                    320:       break;
                    321: 
                    322:     case BIN3(1,0,1):  // (d16,An)
                    323:       OffsetW = Disass_ReadWord();
                    324:       sprintf(pString,"%s(A%d)",Disass_SignedWordToString(OffsetW),Reg);
                    325:       break;
                    326: 
                    327:     case BIN3(1,1,0):  // (d8,An,Xn)
                    328:       OffsetW = Disass_ReadWord();
                    329:       EReg = OffsetW>>12;        // d0-d7,a0-a7
                    330:       OffsetSize = (OffsetW>>11)&0x1;  // 0-Sign extended word, 1-long
                    331:       if (EReg<REG_A0) {
                    332:         if (OffsetSize==0)
                    333:           sprintf(pString,"%s(A%d,D%d.W)",Disass_SignedByteToString((char)OffsetW),Reg,EReg);
                    334:         else
                    335:           sprintf(pString,"%s(A%d,D%d.L)",Disass_SignedByteToString((char)OffsetW),Reg,EReg);
                    336:       }
                    337:       else {
                    338:         if (OffsetSize==0)
                    339:           sprintf(pString,"%s(A%d,A%d.W)",Disass_SignedByteToString((char)OffsetW),Reg,EReg-REG_A0);
                    340:         else
                    341:           sprintf(pString,"%s(A%d,A%d.L)",Disass_SignedByteToString((char)OffsetW),Reg,EReg-REG_A0);
                    342:       }
                    343:       break;
                    344: 
                    345:     case BIN3(1,1,1):  // 0x111
                    346:       switch(Reg) {
                    347:         case BIN3(0,0,0):  // xxx.W
                    348:           OffsetW = Disass_ReadWord();
                    349:           sprintf(pString,"%s",Disass_WordToString(OffsetW));
                    350:           break;
                    351:         case BIN3(0,0,1):  // xxx.L
                    352:           OffsetL = Diass_ReadLong();
                    353:           sprintf(pString,"%s",Disass_LongToString(OffsetL));
                    354:           break;
                    355:         case BIN3(0,1,0):  // (d16,PC)
                    356:           OffsetW = Disass_ReadWord();
                    357:           sprintf(pString,"%s(PC)",Disass_LongToString((long)DisPC+(short int)OffsetW-SIZE_WORD));
                    358:           break;
                    359:         case BIN3(0,1,1):  // (d8,PC,Xn)
                    360:           OffsetW = Disass_ReadWord();
                    361:           EReg = OffsetW>>12;        // d0-d7,a0-a7
                    362:           OffsetSize = (OffsetW>>11)&0x1;  // 0-Sign extended word, 1-long
                    363:           if (EReg<REG_A0) {
                    364:             if (OffsetSize==0)
                    365:               sprintf(pString,"%s(PC,D%d.W)",Disass_LongToString((long)DisPC+(char)OffsetW-SIZE_WORD),EReg);
                    366:             else
                    367:               sprintf(pString,"%s(PC,D%d.L)",Disass_LongToString((long)DisPC+(char)OffsetW-SIZE_WORD),EReg);
                    368:           }
                    369:           else {
                    370:             if (OffsetSize==0)
                    371:               sprintf(pString,"%s(PC,A%d.W)",Disass_LongToString((long)DisPC+(char)OffsetW-SIZE_WORD),EReg-REG_A0);
                    372:             else
                    373:               sprintf(pString,"%s(PC,A%d.L)",Disass_LongToString((long)DisPC+(char)OffsetW-SIZE_WORD),EReg-REG_A0);
                    374:           }
                    375:           break;
                    376:         case BIN3(1,0,0):  // 0x100  // # data
                    377:           switch(Size) {
                    378:             case SIZE_BYTE:
                    379:               OffsetB = Disass_ReadByte_OddAddr();
                    380:               sprintf(pString,"#%s",Disass_SignedByteToString(OffsetB));
                    381:               break;
                    382:             case SIZE_WORD:
                    383:               OffsetW = Disass_ReadWord();
                    384:               sprintf(pString,"#%s",Disass_SignedWordToString(OffsetW));
                    385:               break;
                    386:             case SIZE_LONG:
                    387:               OffsetL = Diass_ReadLong();
                    388:               sprintf(pString,"#%s",Disass_SignedLongToString(OffsetL));
                    389:               break;
                    390:           }
                    391:           break;
                    392:       }
                    393:       break;
                    394:   }
                    395: 
                    396:   // Check for errors!
                    397:   if (strlen(pString)==0) {
                    398:     assert(0);
                    399:   }
                    400: 
                    401:   return(pString);
                    402: }
                    403: 
                    404: //-----------------------------------------------------------------------
                    405: /*
                    406:   Use these two functions to find Effective Address, use 'upper' version for MOVE instruction
                    407: */
                    408: char *Disass_FindEffAddr(int Size)
                    409: {
                    410:   unsigned short int Mode,Reg;
                    411: 
                    412:   // Find effective address Mode and Register
                    413:   Mode = (OpCode>>3)&0x7;
                    414:   Reg = OpCode&0x7;
                    415: 
                    416:   return(Disass_CalcEffAddr(Size,Mode,Reg,szEffAddrString));
                    417: }
                    418: char *Disass_FindUpperEffAddr(int Size)
                    419: {
                    420:   unsigned short int Mode,Reg;
                    421: 
                    422:   // Find effective address Mode and Register in upper bits in OpCode
                    423:   Mode = (OpCode>>6)&0x7;
                    424:   Reg = (OpCode>>9)&0x7;
                    425: 
                    426:   return(Disass_CalcEffAddr(Size,Mode,Reg,szUpperEffAddrString));
                    427: }
                    428: 
                    429: //-----------------------------------------------------------------------
                    430: /*
                    431:   Find size .B,.W,.L
                    432:   Do as string and as SIZE_xxxx
                    433: */
                    434: char *Disass_FindSize_00_01_10(void)
                    435: {
                    436:   unsigned short int Size;
                    437: 
                    438:   Size = (OpCode>>6)&0x3;
                    439:   switch(Size) {
                    440:     case BIN2(0,0):    strcpy(szSizeString,"B"); break;
                    441:     case BIN2(0,1):    strcpy(szSizeString,"W"); break;
                    442:     case BIN2(1,0):    strcpy(szSizeString,"L"); break;
                    443:   }
                    444: 
                    445:   return(szSizeString);
                    446: }
                    447: int Disass_EffAddrSize_00_01_10(void)
                    448: {
                    449:   unsigned short int Size;
                    450: 
                    451:   Size = (OpCode>>6)&0x3;
                    452:   switch(Size) {
                    453:     case BIN2(0,0):    return(SIZE_BYTE);
                    454:     case BIN2(0,1):    return(SIZE_WORD);
                    455:     case BIN2(1,0):    return(SIZE_LONG);
                    456:   }
                    457: 
                    458:   // Error
                    459:   assert(0);
                    460:   return(0);
                    461: }
                    462: 
                    463: //-----------------------------------------------------------------------
                    464: char *Disass_FindSize_000_001_010(void)
                    465: {
                    466:   unsigned short int Size;
                    467: 
                    468:   Size = (OpCode>>6)&0x7;
                    469:   switch(Size) {
                    470:     case BIN3(0,0,0):    strcpy(szSizeString,"B"); break;
                    471:     case BIN3(0,0,1):    strcpy(szSizeString,"W"); break;
                    472:     case BIN3(0,1,0):    strcpy(szSizeString,"L"); break;
                    473:   }
                    474: 
                    475:   return(szSizeString);
                    476: }
                    477: int Disass_EffAddrSize_000_001_010(void)
                    478: {
                    479:   unsigned short int Size;
                    480: 
                    481:   Size = (OpCode>>6)&0x7;
                    482:   switch(Size) {
                    483:     case BIN3(0,0,0):    return(SIZE_BYTE);
                    484:     case BIN3(0,0,1):    return(SIZE_WORD);
                    485:     case BIN3(0,1,0):    return(SIZE_LONG);
                    486:   }
                    487: 
                    488:   // Error
                    489:   assert(0);
                    490:   return(0);
                    491: }
                    492: 
                    493: //-----------------------------------------------------------------------
                    494: char *Disass_FindSize_011_111(void)
                    495: {
                    496:   unsigned short int Size;
                    497: 
                    498:   Size = (OpCode>>6)&0x7;
                    499:   switch(Size) {
                    500:     case BIN3(0,1,1):    strcpy(szSizeString,"W"); break;
                    501:     case BIN3(1,1,1):    strcpy(szSizeString,"L"); break;
                    502:   }
                    503: 
                    504:   return(szSizeString);
                    505: }
                    506: int Disass_EffAddrSize_011_111(void)
                    507: {
                    508:   unsigned short int Size;
                    509: 
                    510:   Size = (OpCode>>6)&0x7;
                    511:   switch(Size) {
                    512:     case BIN3(0,1,1):    return(SIZE_WORD);
                    513:     case BIN3(1,1,1):    return(SIZE_LONG);
                    514:   }
                    515: 
                    516:   // Error
                    517:   assert(0);
                    518:   return(0);
                    519: }
                    520: 
                    521: //-----------------------------------------------------------------------
                    522: char *Disass_FindSize_100_101_110(void)
                    523: {
                    524:   unsigned short int Size;
                    525: 
                    526:   Size = (OpCode>>6)&0x7;
                    527:   switch(Size) {
                    528:     case BIN3(1,0,0):    strcpy(szSizeString,"B"); break;
                    529:     case BIN3(1,0,1):    strcpy(szSizeString,"W"); break;
                    530:     case BIN3(1,1,0):    strcpy(szSizeString,"L"); break;
                    531:   }
                    532: 
                    533:   return(szSizeString);
                    534: }
                    535: int Disass_EffAddrSize_100_101_110(void)
                    536: {
                    537:   unsigned short int Size;
                    538: 
                    539:   Size = (OpCode>>6)&0x7;
                    540:   switch(Size) {
                    541:     case BIN3(1,0,0):    return(SIZE_BYTE);
                    542:     case BIN3(1,0,1):    return(SIZE_WORD);
                    543:     case BIN3(1,1,0):    return(SIZE_LONG);
                    544:   }
                    545: 
                    546:   // Error
                    547:   assert(0);
                    548:   return(0);
                    549: }
                    550: 
                    551: //-----------------------------------------------------------------------
                    552: char *Disass_FindSize_010_011(void)
                    553: {
                    554:   unsigned short int Size;
                    555: 
                    556:   Size = (OpCode>>6)&0x7;
                    557:   switch(Size) {
                    558:     case BIN3(0,1,0):    strcpy(szSizeString,"W"); break;
                    559:     case BIN3(0,1,1):    strcpy(szSizeString,"L"); break;
                    560:   }
                    561: 
                    562:   return(szSizeString);
                    563: }
                    564: int Disass_EffAddrSize_010_011(void)
                    565: {
                    566:   unsigned short int Size;
                    567: 
                    568:   Size = (OpCode>>6)&0x7;
                    569:   switch(Size) {
                    570:     case BIN3(0,1,0):    return(SIZE_WORD);
                    571:     case BIN3(0,1,1):    return(SIZE_LONG);
                    572:   }
                    573: 
                    574:   // Error
                    575:   assert(0);
                    576:   return(0);
                    577: }
                    578: 
                    579: //-----------------------------------------------------------------------
                    580: char *Disass_FindSize_110_111(void)
                    581: {
                    582:   unsigned short int Size;
                    583: 
                    584:   Size = (OpCode>>6)&0x7;
                    585:   switch(Size) {
                    586:     case BIN3(1,1,0):  strcpy(szSizeString,"W"); break;
                    587:     case BIN3(1,1,1):  strcpy(szSizeString,"L"); break;
                    588:   }
                    589: 
                    590:   return(szSizeString);
                    591: }
                    592: 
                    593: //-----------------------------------------------------------------------
                    594: char *Disass_FindSize_100_101(void)
                    595: {
                    596:   unsigned short int Size;
                    597: 
                    598:   Size = (OpCode>>6)&0x7;
                    599:   switch(Size) {
                    600:     case BIN3(1,0,0):  strcpy(szSizeString,"W"); break;
                    601:     case BIN3(1,0,1):  strcpy(szSizeString,"L"); break;
                    602:   }
                    603: 
                    604:   return(szSizeString);
                    605: }
                    606: 
                    607: //-----------------------------------------------------------------------
                    608: /*
                    609:   NOTE This is ONLY to be used with MOVE instruction, as Size bits are 12,13
                    610: */
                    611: char *Disass_FindSize_01_11_10(void)
                    612: {
                    613:   unsigned short int Size;
                    614: 
                    615:   Size = (OpCode>>12)&0x3;
                    616:   switch(Size) {
                    617:     case BIN2(0,1):    strcpy(szSizeString,"B"); break;
                    618:     case BIN2(1,1):    strcpy(szSizeString,"W"); break;
                    619:     case BIN2(1,0):    strcpy(szSizeString,"L"); break;
                    620:   }
                    621: 
                    622:   return(szSizeString);
                    623: }
                    624: int Disass_EffAddrSize_01_11_10(void)
                    625: {
                    626:   unsigned short int Size;
                    627: 
                    628:   Size = (OpCode>>12)&0x3;
                    629:   switch(Size) {
                    630:     case BIN2(0,1):    return(SIZE_BYTE);
                    631:     case BIN2(1,1):    return(SIZE_WORD);
                    632:     case BIN2(1,0):    return(SIZE_LONG);
                    633:   }
                    634: 
                    635:   // Error
                    636:   assert(0);
                    637:   return(0);
                    638: }
                    639: 
                    640: //-----------------------------------------------------------------------
                    641: /*
                    642:   NOTE This is ONLY to be used with MOVE instruction, as Size bits are 12,13
                    643: */
                    644: char *Disass_FindSize_11_10(void)
                    645: {
                    646:   unsigned short int Size;
                    647: 
                    648:   Size = (OpCode>>12)&0x3;
                    649:   switch(Size) {
                    650:     case BIN2(1,1):    strcpy(szSizeString,"W"); break;
                    651:     case BIN2(1,0):    strcpy(szSizeString,"L"); break;
                    652:   }
                    653: 
                    654:   return(szSizeString);
                    655: }
                    656: int Disass_EffAddrSize_11_10(void)
                    657: {
                    658:   unsigned short int Size;
                    659: 
                    660:   Size = (OpCode>>12)&0x3;
                    661:   switch(Size) {
                    662:     case BIN2(1,1):    return(SIZE_WORD);
                    663:     case BIN2(1,0):    return(SIZE_LONG);
                    664:   }
                    665: 
                    666:   // Error
                    667:   assert(0);
                    668:   return(0);
                    669: }
                    670: 
                    671: //-----------------------------------------------------------------------
                    672: /*
                    673:   Find size of MOVEM instruction operands
                    674: */
                    675: char *Disass_FindSize_MoveM(void)
                    676: {
                    677:   if ((OpCode&BIN7(1,0,0,0,0,0,0))==0)
                    678:     sprintf(szSizeString,"W");
                    679:   else
                    680:     sprintf(szSizeString,"L");
                    681: 
                    682:   return(szSizeString);
                    683: }
                    684: int Disass_EffAddrSize_MoveM(void)
                    685: {
                    686:   if ((OpCode&BIN7(1,0,0,0,0,0,0))==0)
                    687:     return(SIZE_WORD);
                    688:   else
                    689:     return(SIZE_LONG);
                    690: }
                    691: 
                    692: //-----------------------------------------------------------------------
                    693: /*
                    694:   Find if access BYTE or LONG according to 'Dn' or other effective address (see BTST etc...)
                    695: */
                    696: char *Disass_FindSize_WordOrLong(void)
                    697: {
                    698:   if (((OpCode>>3)&0x7)==BIN3(0,0,0))  // Dn
                    699:     sprintf(szSizeString,"L");
                    700:   else
                    701:     sprintf(szSizeString,"B");
                    702: 
                    703:   return(szSizeString);
                    704: }
                    705: int Disass_EffAddrSize_WordOrLong(void)
                    706: {
                    707:   if (((OpCode>>3)&0x7)==BIN3(0,0,0))  // Dn
                    708:     return(SIZE_LONG);
                    709:   else
                    710:     return(SIZE_BYTE);
                    711: }
                    712: 
                    713: //-----------------------------------------------------------------------
                    714: /*
                    715:   Read Immediate data after OpCode
                    716: */
                    717: char *Disass_ReadImmediate(int Size)
                    718: {
                    719:   // Clear string, allows easy error check when complete
                    720:   strcpy(szImmString,"");
                    721: 
                    722:   switch(Size) {
                    723:     case SIZE_BYTE:
                    724:       Disass_SignedByteToString(Disass_ReadByte_OddAddr(),szImmString);
                    725:       break;
                    726:     case SIZE_WORD:
                    727:       Disass_SignedWordToString(Disass_ReadWord(),szImmString);
                    728:       break;
                    729:     case SIZE_LONG:
                    730:       Disass_SignedLongToString(Diass_ReadLong(),szImmString);
                    731:       break;
                    732:   }
                    733: 
                    734:   // Check for errors!
                    735:   if (strlen(szImmString)==0) {
                    736:     assert(0);
                    737:   }
                    738: 
                    739:   return(szImmString);
                    740: }
                    741: 
                    742: //-----------------------------------------------------------------------
                    743: /*
                    744:   Find conditon codes using in Bcc,Scc,DBcc etc...
                    745: */
                    746: char *Disass_FindCondition(void)
                    747: {
                    748:   strcpy(szConditionString,pszCC_Strings[(OpCode>>8)&0xf]);
                    749:   
                    750:   return(szConditionString);
                    751: }
                    752: 
                    753: //-----------------------------------------------------------------------
                    754: /*
                    755:   Find register index using bits 9,10,11
                    756: */
                    757: int Disass_FindRegister(void)
                    758: {
                    759:   return((OpCode>>9)&0x7);
                    760: }
                    761: 
                    762: // And using bits 0,1,2
                    763: int Disass_FindRegisterLower(void)
                    764: {
                    765:   return(OpCode&0x7);
                    766: }
                    767: 
                    768: //-----------------------------------------------------------------------
                    769: /*
                    770:   Find shift count 1,2,3,4...8 from data 0,1,2,3...7
                    771: */
                    772: #define Disass_FindQuickData  Disass_FindShiftCount  // 'Quick' data ie ADDQ uses same process
                    773: int Disass_FindShiftCount(void)
                    774: {
                    775:   unsigned short int Count;
                    776: 
                    777:   Count = (OpCode>>9)&0x7;
                    778:   if (Count==0)
                    779:     Count = 8;
                    780: 
                    781:   return(Count);
                    782: }
                    783: 
                    784: //-----------------------------------------------------------------------
                    785: /*
                    786:   Return TRUE is displacement is a signed 8-bit number
                    787:   Used in BRA,BSR,Bcc etc...
                    788: */
                    789: BOOL Disass_ShortDisplacement(void)
                    790: {
                    791:   if ((OpCode&0xff)==0)
                    792:     return(FALSE);    // 16-bit offset
                    793:   else
                    794:     return(TRUE);    // 8-bit offset
                    795: }
                    796: 
                    797: //-----------------------------------------------------------------------
                    798: /*
                    799:   Convert register mask for MOVEM into string, eg D0123/A167 (D0-D3/A1/A6-A7)
                    800: */
                    801: char *Disass_FindMoveMRegisters(unsigned short int MaskW)
                    802: {
                    803:   char szString[256];
                    804:   int i;
                    805: 
                    806:   // Set 'Dx-Dy/Ax-Ay' string
                    807:   strcpy(szRegString,"");
                    808:   // Is pre-decrement? -(An)
                    809:   if (((OpCode>>3)&0x7)==BIN3(1,0,0)) {  // D0..D7/A0..A7
                    810:     if (MaskW&0xff00) {  // Any 'D' registers?
                    811:       strcat(szRegString,"D");
                    812:       for(i=0; i<8; i++) {
                    813:         if (MaskW&(0x8000>>i)) {
                    814:           sprintf(szString,"%d",i);
                    815:           strcat(szRegString,szString);
                    816:         }
                    817:       }
                    818:     }
                    819:     if (MaskW&0x00ff) {  // Any 'A' registers?
                    820:       // Separate by '/'
                    821:       if (strlen(szRegString)>0)
                    822:         strcat(szRegString,"/");
                    823: 
                    824:       strcat(szRegString,"A");
                    825:       for(i=0; i<8; i++) {
                    826:         if (MaskW&(0x0080>>i)) {
                    827:           sprintf(szString,"%d",i);
                    828:           strcat(szRegString,szString);
                    829:         }
                    830:       }
                    831:     }
                    832:   }
                    833:   else {              // A7..A0/D7..D0
                    834:     if (MaskW&0x00ff) {  // Any 'D' registers?
                    835:       strcat(szRegString,"D");
                    836:       for(i=0; i<8; i++) {
                    837:         if (MaskW&(0x0001<<i)) {
                    838:           sprintf(szString,"%d",i);
                    839:           strcat(szRegString,szString);
                    840:         }
                    841:       }
                    842:     }
                    843:     if (MaskW&0xff00) {  // Any 'A' registers?
                    844:       // Separate by '/'
                    845:       if (strlen(szRegString)>0)
                    846:         strcat(szRegString,"/");
                    847: 
                    848:       strcat(szRegString,"A");
                    849:       for(i=0; i<8; i++) {
                    850:         if (MaskW&(0x0100<<i)) {
                    851:           sprintf(szString,"%d",i);
                    852:           strcat(szRegString,szString);
                    853:         }
                    854:       }
                    855:     }
                    856:   }
                    857: 
                    858:   return(szRegString);
                    859: }
                    860: 
                    861: 
                    862: 
                    863: //-----------------------------------------------------------------------
                    864: /*
                    865:   List of disassembly instruction functions
                    866: */
                    867: 
                    868: //-----------------------------------------------------------------------
                    869: // ABCD Dy,Dx
                    870: void Disass_ABCD_Dy_Dx(void)
                    871: {
                    872:   rprintf2( "ABCD.B\tD%d,D%d",Disass_FindRegister(),Disass_FindRegisterLower() );
                    873: }
                    874: 
                    875: // ABCD -(Ay),-(Ax)
                    876: void Disass_ABCD_Ay_Ax(void)
                    877: {
                    878:   rprintf2( "ABCD.B\t-(A%d),-(A%d)",Disass_FindRegister(),Disass_FindRegisterLower() );
                    879: }
                    880: 
                    881: //-----------------------------------------------------------------------
                    882: // ADD <ea>,Dn
                    883: void Disass_ADD_ea_Dn(void)
                    884: {
                    885:   rprintf3( "ADD.%s\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_000_001_010()),Disass_FindSize_000_001_010() );
                    886: }
                    887: 
                    888: // ADD Dn,<ea>
                    889: void Disass_ADD_Dn_ea(void)
                    890: {
                    891:   rprintf3( "ADD.%s\tD%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_100_101_110()),Disass_FindRegister(),Disass_FindSize_100_101_110() );
                    892: }
                    893: 
                    894: //-----------------------------------------------------------------------
                    895: // ADDA <ea>,An
                    896: void Disass_ADDA(void)
                    897: {
                    898:   rprintf3( "ADDA.%s\t%s,A%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_011_111()),Disass_FindSize_011_111() );
                    899: }
                    900: 
                    901: //-----------------------------------------------------------------------
                    902: // ADDI #<data>,<ea>
                    903: void Disass_ADDI(void)
                    904: {
                    905:   rprintf3( "ADDI.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_ReadImmediate(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                    906: }
                    907: 
                    908: //-----------------------------------------------------------------------
                    909: // ADDQ #<data>,<ea>
                    910: void Disass_ADDQ(void)
                    911: {
                    912:   rprintf3( "ADDQ.%s\t#%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_FindQuickData(),Disass_FindSize_00_01_10() );
                    913: }
                    914: 
                    915: //-----------------------------------------------------------------------
                    916: // ADDX Dy,Dx
                    917: void Disass_ADDX_Dy_Dx(void)
                    918: {
                    919:   rprintf3( "ADDX.%s\tD%d,D%d",Disass_FindRegister(),Disass_FindRegisterLower(),Disass_FindSize_00_01_10() );
                    920: }
                    921: 
                    922: // ADDX -(Ay),-(Ax)
                    923: void Disass_ADDX_Ay_Ax(void)
                    924: {
                    925:   rprintf3( "ADDX.%s\t-(A%d),-(A%d)",Disass_FindRegister(),Disass_FindRegisterLower(),Disass_FindSize_00_01_10() );
                    926: }
                    927: 
                    928: //-----------------------------------------------------------------------
                    929: // AND <ea>,Dn
                    930: void Disass_AND_ea_Dn(void)
                    931: {
                    932:   rprintf3( "AND.%s\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_000_001_010()),Disass_FindSize_000_001_010() );
                    933: }
                    934: 
                    935: // AND Dn,<ea>
                    936: void Disass_AND_Dn_ea(void)
                    937: {
                    938:   rprintf3( "AND.%s\tD%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_100_101_110()),Disass_FindRegister(),Disass_FindSize_100_101_110() );
                    939: }
                    940: 
                    941: //-----------------------------------------------------------------------
                    942: // ANDI #<data>,<ea>
                    943: void Disass_ANDI(void)
                    944: {
                    945:   rprintf3( "ANDI.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_ReadImmediate(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                    946: }
                    947: 
                    948: //-----------------------------------------------------------------------
                    949: // AND to CCR #<data>,CCR
                    950: void Disass_ANDI_to_CCR(void)
                    951: {
                    952:   rprintf1( "ANDI.B\t#%s,CCR",Disass_ReadImmediate(SIZE_BYTE) );
                    953: }
                    954: 
                    955: //-----------------------------------------------------------------------
                    956: // AND to SR #<data>,SR
                    957: void Disass_ANDI_to_SR(void)
                    958: {
                    959:   rprintf1( "ANDI.W\t#%s,SR",Disass_ReadImmediate(SIZE_WORD) );
                    960: }
                    961: 
                    962: //-----------------------------------------------------------------------
                    963: // ASL Dx,Dy
                    964: void Disass_ASL_Dx_Dy(void)
                    965: {
                    966:   rprintf3( "ASL.%s\tD%d,D%d",Disass_FindRegisterLower(),Disass_FindRegister(),Disass_FindSize_00_01_10() );
                    967: }
                    968: 
                    969: // ASL #<data>,Dy
                    970: void Disass_ASL_data_Dy(void)
                    971: {
                    972:   rprintf3( "ASL.%s\t#%s,D%d",Disass_FindRegisterLower(),Disass_WordToString(Disass_FindShiftCount()),Disass_FindSize_00_01_10() );
                    973: }
                    974: 
                    975: // ASL <ea>
                    976: void Disass_ASL(void)
                    977: {
                    978:   rprintf1( "ASL.W\t%s",Disass_FindEffAddr(NULL) );
                    979: }
                    980: 
                    981: //-----------------------------------------------------------------------
                    982: // ASR Dx,Dy
                    983: void Disass_ASR_Dx_Dy(void)
                    984: {
                    985:   rprintf3( "ASR.%s\tD%d,D%d",Disass_FindRegisterLower(),Disass_FindRegister(),Disass_FindSize_00_01_10() );
                    986: }
                    987: 
                    988: // ASR #<data>,Dy
                    989: void Disass_ASR_data_Dy(void)
                    990: {
                    991:   rprintf3( "ASR.%s\t#%s,D%d",Disass_FindRegisterLower(),Disass_WordToString(Disass_FindShiftCount()),Disass_FindSize_00_01_10() );
                    992: }
                    993: 
                    994: // ASR <ea>
                    995: void Disass_ASR(void)
                    996: {
                    997:   rprintf1( "ASR.W\t%s",Disass_FindEffAddr(NULL) );
                    998: }
                    999: 
                   1000: //-----------------------------------------------------------------------
                   1001: // Bcc <label>
                   1002: void Disass_Bcc(void)
                   1003: {
                   1004:   short int OffsetW;
                   1005: 
                   1006:   if (Disass_ShortDisplacement())
                   1007:     rprintf2( "B%s.S\t$%X",DisPC+(char)OpCode,Disass_FindCondition() );
                   1008:   else {
                   1009:     OffsetW = Disass_ReadWord();
                   1010:     rprintf2( "B%s.W\t$%X",(DisPC-SIZE_WORD)+OffsetW,Disass_FindCondition() );
                   1011:   }
                   1012: }
                   1013: 
                   1014: //-----------------------------------------------------------------------
                   1015: // BCHG Dn,<ea>
                   1016: void Disass_BCHG(void)
                   1017: {
                   1018:   rprintf3( "BCHG.%s\tD%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_WordOrLong()),Disass_FindRegister(),Disass_FindSize_WordOrLong() );
                   1019: }
                   1020: 
                   1021: // BCHG #<data>,<ea>
                   1022: void Disass_BCHG_imm(void)
                   1023: {
                   1024:   rprintf3( "BCHG.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_WordOrLong()),Disass_ReadImmediate(SIZE_BYTE),Disass_FindSize_WordOrLong() );
                   1025: }
                   1026: 
                   1027: //-----------------------------------------------------------------------
                   1028: // BCLR Dn,<ea>
                   1029: void Disass_BCLR(void)
                   1030: {
                   1031:   rprintf3( "BCLR.%s\tD%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_WordOrLong()),Disass_FindRegister(),Disass_FindSize_WordOrLong() );
                   1032: }
                   1033: 
                   1034: // BCLR #<data>,<ea>
                   1035: void Disass_BCLR_imm(void)
                   1036: {
                   1037:   rprintf3( "BCLR.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_WordOrLong()),Disass_ReadImmediate(SIZE_BYTE),Disass_FindSize_WordOrLong() );
                   1038: }
                   1039: 
                   1040: //-----------------------------------------------------------------------
                   1041: // BRA <label>
                   1042: void Disass_BRA(void)
                   1043: {
                   1044:   short int OffsetW;
                   1045: 
                   1046:   if (Disass_ShortDisplacement())
                   1047:     rprintf1( "BRA.S\t$%X",DisPC+(char)OpCode );
                   1048:   else {
                   1049:     OffsetW = Disass_ReadWord();
                   1050:     rprintf1( "BRA.W\t$%X",(DisPC-SIZE_WORD)+OffsetW );
                   1051:   }
                   1052: }
                   1053: 
                   1054: //-----------------------------------------------------------------------
                   1055: // BSET Dn,<ea>
                   1056: void Disass_BSET(void)
                   1057: {
                   1058:   rprintf3( "BSET.%s\tD%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_WordOrLong()),Disass_FindRegister(),Disass_FindSize_WordOrLong() );
                   1059: }
                   1060: 
                   1061: // BSET #<data>,<ea>
                   1062: void Disass_BSET_imm(void)
                   1063: {
                   1064:   rprintf3( "BSET.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_WordOrLong()),Disass_ReadImmediate(SIZE_BYTE),Disass_FindSize_WordOrLong() );
                   1065: }
                   1066: 
                   1067: //-----------------------------------------------------------------------
                   1068: // BSR <label>
                   1069: void Disass_BSR(void)
                   1070: {
                   1071:   short int OffsetW;
                   1072: 
                   1073:   if (Disass_ShortDisplacement())
                   1074:     rprintf1( "BSR.S\t$%X",DisPC+(char)OpCode );
                   1075:   else {
                   1076:     OffsetW = Disass_ReadWord();
                   1077:     rprintf1( "BSR.W\t$%X",(DisPC-SIZE_WORD)+OffsetW );
                   1078:   }
                   1079: }
                   1080: 
                   1081: //-----------------------------------------------------------------------
                   1082: // BTST Dn,<ea>
                   1083: void Disass_BTST(void)
                   1084: {
                   1085:   rprintf3( "BTST.%s\tD%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_WordOrLong()),Disass_FindRegister(),Disass_FindSize_WordOrLong() );
                   1086: }
                   1087: 
                   1088: // BTST #<data>,<ea>
                   1089: void Disass_BTST_imm(void)
                   1090: {
                   1091:   rprintf3( "BTST.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_WordOrLong()),Disass_ReadImmediate(SIZE_BYTE),Disass_FindSize_WordOrLong() );
                   1092: }
                   1093: 
                   1094: //-----------------------------------------------------------------------
                   1095: // CHK <ea>,Dn
                   1096: void Disass_CHK(void)
                   1097: {
                   1098:   rprintf2( "CHK.W\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(SIZE_WORD) );
                   1099: }
                   1100: 
                   1101: //-----------------------------------------------------------------------
                   1102: // CLR <ea>
                   1103: void Disass_CLR(void)
                   1104: {
                   1105:   rprintf2( "CLR.%s\t%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                   1106: }
                   1107: 
                   1108: //-----------------------------------------------------------------------
                   1109: // CMP <ea>,Dn
                   1110: void Disass_CMP(void)
                   1111: {
                   1112:   rprintf3( "CMP.%s\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_000_001_010()),Disass_FindSize_000_001_010() );
                   1113: }
                   1114: 
                   1115: //-----------------------------------------------------------------------
                   1116: // CMPA <ea>,An
                   1117: void Disass_CMPA(void)
                   1118: {
                   1119:   rprintf3( "CMPA.%s\t%s,A%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_011_111()),Disass_FindSize_011_111() );
                   1120: }
                   1121: 
                   1122: //-----------------------------------------------------------------------
                   1123: // CMPI #<data>,<ea>
                   1124: void Disass_CMPI(void)
                   1125: {
                   1126:   rprintf3( "CMPI.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_ReadImmediate(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                   1127: }
                   1128: 
                   1129: //-----------------------------------------------------------------------
                   1130: // CMPM (Ay)+,(Ax)+
                   1131: void Disass_CMPM(void)
                   1132: {
                   1133:   rprintf3( "CMPM.%s\t(A%d)+,(A%d)+",Disass_FindRegister(),Disass_FindRegisterLower(),Disass_FindSize_00_01_10() );
                   1134: }
                   1135: 
                   1136: //-----------------------------------------------------------------------
                   1137: // DBcc Dn,<label>
                   1138: void Disass_DBcc(void)
                   1139: {
                   1140:   short int OffsetW;
                   1141: 
                   1142:   OffsetW = Disass_ReadWord();
                   1143:   rprintf3( "DB%s.W\tD%d,$%X",(DisPC-SIZE_WORD)+OffsetW,Disass_FindRegisterLower(),Disass_FindCondition() );
                   1144: }
                   1145: 
                   1146: //-----------------------------------------------------------------------
                   1147: // DIVS <ea>,Dn
                   1148: void Disass_DIVS(void)
                   1149: {
                   1150:   rprintf2( "DIVS.W\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(SIZE_WORD) );
                   1151: }
                   1152: 
                   1153: //-----------------------------------------------------------------------
                   1154: // DIVU <ea>,Dn
                   1155: void Disass_DIVU(void)
                   1156: {
                   1157:   rprintf2( "DIVU.W\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(SIZE_WORD) );
                   1158: }
                   1159: 
                   1160: //-----------------------------------------------------------------------
                   1161: // EOR Dn,<ea>
                   1162: void Disass_EOR(void)
                   1163: {
                   1164:   rprintf3( "EOR.%s\t%s,A%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_100_101_110()),Disass_FindSize_100_101_110() );
                   1165: }
                   1166: 
                   1167: //-----------------------------------------------------------------------
                   1168: // EORI #<data>,Dn
                   1169: void Disass_EORI(void)
                   1170: {
                   1171:   rprintf3( "EORI.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_ReadImmediate(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                   1172: }
                   1173: 
                   1174: //-----------------------------------------------------------------------
                   1175: // EOR to CCR #<data>,CCR
                   1176: void Disass_EORI_to_CCR(void)
                   1177: {
                   1178:   rprintf1( "EORI.B\t#%s,CCR",Disass_ReadImmediate(SIZE_BYTE) );
                   1179: }
                   1180: 
                   1181: //-----------------------------------------------------------------------
                   1182: // EOR to SR #<data>,SR
                   1183: void Disass_EORI_to_SR(void)
                   1184: {
                   1185:   rprintf1( "EORI.W\t#%s,SR",Disass_ReadImmediate(SIZE_WORD) );
                   1186: }
                   1187: 
                   1188: //-----------------------------------------------------------------------
                   1189: // EXG Dx,Dy
                   1190: void Disass_EXG_Dx_Dy(void)
                   1191: {
                   1192:   rprintf2( "EXG.L\tD%d,D%d",Disass_FindRegisterLower(),Disass_FindRegister() );
                   1193: }
                   1194: 
                   1195: // EXG Ax,Ay
                   1196: void Disass_EXG_Ax_Ay(void)
                   1197: {
                   1198:   rprintf2( "EXG.L\tA%d,A%d",Disass_FindRegisterLower(),Disass_FindRegister() );
                   1199: }
                   1200: 
                   1201: // EXG Dx,Ay
                   1202: void Disass_EXG_Dx_Ay(void)
                   1203: {
                   1204:   rprintf2( "EXG.L\tD%d,A%d",Disass_FindRegisterLower(),Disass_FindRegister() );
                   1205: }
                   1206: 
                   1207: //-----------------------------------------------------------------------
                   1208: // EXT Dn
                   1209: void Disass_EXT(void)
                   1210: {
                   1211:   rprintf2( "EXT.%s\tD%d",Disass_FindRegisterLower(),Disass_FindSize_010_011() );
                   1212: }
                   1213: 
                   1214: //-----------------------------------------------------------------------
                   1215: // ILLEGAL
                   1216: void Disass_ILLEGAL(void)
                   1217: {
                   1218:   rprintf0( "ILLEGAL" );
                   1219: }
                   1220: 
                   1221: //-----------------------------------------------------------------------
                   1222: // JMP <ea>
                   1223: void Disass_JMP(void)
                   1224: {
                   1225:   rprintf1( "JMP\t%s",Disass_FindEffAddr(NULL) );
                   1226: }
                   1227: 
                   1228: //-----------------------------------------------------------------------
                   1229: // JSR <ea>
                   1230: void Disass_JSR(void)
                   1231: {
                   1232:   rprintf1( "JSR\t%s",Disass_FindEffAddr(NULL) );
                   1233: }
                   1234: 
                   1235: //-----------------------------------------------------------------------
                   1236: // LEA <ea>,An
                   1237: void Disass_LEA(void)
                   1238: {
                   1239:   rprintf2( "LEA\t%s,A%d",Disass_FindRegister(),Disass_FindEffAddr(SIZE_LONG) );
                   1240: }
                   1241: 
                   1242: //-----------------------------------------------------------------------
                   1243: // LINK An,#<displacement>
                   1244: void Disass_LINK(void)
                   1245: {
                   1246:   unsigned short int OffsetW;
                   1247: 
                   1248:   OffsetW = Disass_ReadWord();
                   1249:   rprintf2( "LINK\tA%d,#%s",Disass_WordToString(OffsetW),Disass_FindRegisterLower() );
                   1250: }
                   1251: 
                   1252: //-----------------------------------------------------------------------
                   1253: // LSL Dx,Dy
                   1254: void Disass_LSL_Dx_Dy(void)
                   1255: {
                   1256:   rprintf3( "LSL.%s\tD%d,D%d",Disass_FindRegisterLower(),Disass_FindRegister(),Disass_FindSize_00_01_10() );
                   1257: }
                   1258: 
                   1259: // LSL #<data>,Dy
                   1260: void Disass_LSL_data_Dy(void)
                   1261: {
                   1262:   rprintf3( "LSL.%s\t#%s,D%d",Disass_FindRegisterLower(),Disass_WordToString(Disass_FindShiftCount()),Disass_FindSize_00_01_10() );
                   1263: }
                   1264: 
                   1265: // LSL <ea>
                   1266: void Disass_LSL(void)
                   1267: {
                   1268:   rprintf1( "LSL.W\t%s",Disass_FindEffAddr(NULL) );
                   1269: }
                   1270: 
                   1271: //-----------------------------------------------------------------------
                   1272: // LSR Dx,Dy
                   1273: void Disass_LSR_Dx_Dy(void)
                   1274: {
                   1275:   rprintf3( "LSR.%s\tD%d,D%d",Disass_FindRegisterLower(),Disass_FindRegister(),Disass_FindSize_00_01_10() );
                   1276: }
                   1277: 
                   1278: // LSR #<data>,Dy
                   1279: void Disass_LSR_data_Dy(void)
                   1280: {
                   1281:   rprintf3( "LSR.%s\t#%s,D%d",Disass_FindRegisterLower(),Disass_WordToString(Disass_FindShiftCount()),Disass_FindSize_00_01_10() );
                   1282: }
                   1283: 
                   1284: // LSR <ea>
                   1285: void Disass_LSR(void)
                   1286: {
                   1287:   rprintf1( "LSR.W\t%s",Disass_FindEffAddr(NULL) );
                   1288: }
                   1289: 
                   1290: //-----------------------------------------------------------------------
                   1291: // MOVE <ea>,<ea>
                   1292: void Disass_MOVE(void)
                   1293: {
                   1294:   rprintf3( "MOVE.%s\t%s,%s",Disass_FindUpperEffAddr(Disass_EffAddrSize_01_11_10()),Disass_FindEffAddr(Disass_EffAddrSize_01_11_10()),Disass_FindSize_01_11_10() );
                   1295: }
                   1296: 
                   1297: //-----------------------------------------------------------------------
                   1298: // MOVEA <ea>,An
                   1299: void Disass_MOVEA(void)
                   1300: {
                   1301:   rprintf3( "MOVEA.%s\t%s,A%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_11_10()),Disass_FindSize_11_10() );
                   1302: }
                   1303: 
                   1304: //-----------------------------------------------------------------------
                   1305: // MOVE CCR,<ea>
                   1306: void Disass_MOVE_from_CCR(void)
                   1307: {
                   1308:   rprintf1( "MOVE.W\tCCR,%s",Disass_FindEffAddr(SIZE_WORD) );
                   1309: }
                   1310: 
                   1311: //-----------------------------------------------------------------------
                   1312: // MOVE <ea>,CCR
                   1313: void Disass_MOVE_to_CCR(void)
                   1314: {
                   1315:   rprintf1( "MOVE.W\t%s,CCR",Disass_FindEffAddr(SIZE_WORD) );
                   1316: }
                   1317: 
                   1318: //-----------------------------------------------------------------------
                   1319: // MOVE SR,<ea>
                   1320: void Disass_MOVE_from_SR(void)
                   1321: {
                   1322:   rprintf1( "MOVE.W\tSR,%s",Disass_FindEffAddr(SIZE_WORD) );
                   1323: }
                   1324: 
                   1325: //-----------------------------------------------------------------------
                   1326: // MOVE <ea>,SR
                   1327: void Disass_MOVE_to_SR(void)
                   1328: {
                   1329:   rprintf1( "MOVE.W\t%s,SR",Disass_FindEffAddr(SIZE_WORD) );
                   1330: }
                   1331: 
                   1332: //-----------------------------------------------------------------------
                   1333: // MOVE USP,An
                   1334: void Disass_MOVE_USP_An(void)
                   1335: {
                   1336:   rprintf1( "MOVE.L\tUSP,A%d",Disass_FindRegisterLower() );
                   1337: }
                   1338: 
                   1339: // MOVE An,USP
                   1340: void Disass_MOVE_An_USP(void)
                   1341: {
                   1342:   rprintf1( "MOVE.L\tA%d,USP",Disass_FindRegisterLower() );
                   1343: }
                   1344: 
                   1345: //-----------------------------------------------------------------------
                   1346: // MOVEM regs,<ea>
                   1347: void Disass_MOVEM_regs_ea(void)
                   1348: {
                   1349:   unsigned short int MaskW;
                   1350: 
                   1351:   MaskW = Disass_ReadWord();
                   1352:   rprintf3( "MOVEM.%s\t%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_MoveM()),Disass_FindMoveMRegisters(MaskW),Disass_FindSize_MoveM() );
                   1353: }
                   1354: 
                   1355: // MOVEM <ea>,regs
                   1356: void Disass_MOVEM_ea_regs(void)
                   1357: {
                   1358:   unsigned short int MaskW;
                   1359: 
                   1360:   MaskW = Disass_ReadWord();
                   1361:   rprintf3( "MOVEM.%s\t%s,%s",Disass_FindMoveMRegisters(MaskW),Disass_FindEffAddr(Disass_EffAddrSize_MoveM()),Disass_FindSize_MoveM() );
                   1362: }
                   1363: 
                   1364: //-----------------------------------------------------------------------
                   1365: // MOVEP Dx,(d,Ay)
                   1366: void Disass_MOVEP_Dn_An(void)
                   1367: {
                   1368:   rprintf4( "MOVEP.%s\tD%d,%s(A%d)",Disass_FindRegisterLower(),Disass_ReadImmediate(SIZE_WORD),Disass_FindRegister(),Disass_FindSize_110_111() );
                   1369: }
                   1370: 
                   1371: // MOVEP (d,Ay),Dx
                   1372: void Disass_MOVEP_An_Dn(void)
                   1373: {
                   1374:   rprintf4( "MOVEP.%s\t%s(A%d),D%d",Disass_FindRegisterLower(),Disass_FindRegister(),Disass_ReadImmediate(SIZE_WORD),Disass_FindSize_100_101() );
                   1375: }
                   1376: 
                   1377: //-----------------------------------------------------------------------
                   1378: // MOVEQ #<data>,Dn
                   1379: void Disass_MOVEQ(void)
                   1380: {
                   1381:   rprintf2( "MOVEQ.L\t#%d,D%d",Disass_FindRegister(),(char)OpCode );
                   1382: }
                   1383: 
                   1384: //-----------------------------------------------------------------------
                   1385: // MULS <ea>,Dn
                   1386: void Disass_MULS(void)
                   1387: {
                   1388:   rprintf2( "MULS.W\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(SIZE_WORD) );
                   1389: }
                   1390: 
                   1391: //-----------------------------------------------------------------------
                   1392: // MULU <ea>,Dn
                   1393: void Disass_MULU(void)
                   1394: {
                   1395:   rprintf2( "MULU.W\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(SIZE_WORD) );
                   1396: }
                   1397: 
                   1398: //-----------------------------------------------------------------------
                   1399: // NBCD <ea>
                   1400: void Disass_NBCD(void)
                   1401: {
                   1402:   rprintf1( "NBCD.B\t%s",Disass_FindEffAddr(SIZE_BYTE) );
                   1403: }
                   1404: 
                   1405: //-----------------------------------------------------------------------
                   1406: // NEG <ea>
                   1407: void Disass_NEG(void)
                   1408: {
                   1409:   rprintf2( "NEG.%s\t%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                   1410: }
                   1411: 
                   1412: //-----------------------------------------------------------------------
                   1413: // NEGX <ea>
                   1414: void Disass_NEGX(void)
                   1415: {
                   1416:   rprintf2( "NEGX.%s\t%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                   1417: }
                   1418: 
                   1419: //-----------------------------------------------------------------------
                   1420: // NOP
                   1421: void Disass_NOP(void)
                   1422: {
                   1423:   rprintf0( "NOP" );
                   1424: }
                   1425: 
                   1426: //-----------------------------------------------------------------------
                   1427: // NOT <ea>
                   1428: void Disass_NOT(void)
                   1429: {
                   1430:   rprintf2( "NOT.%s\t%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                   1431: }
                   1432: 
                   1433: //-----------------------------------------------------------------------
                   1434: // OR <ea>,Dn
                   1435: void Disass_OR_ea_Dn(void)
                   1436: {
                   1437:   rprintf3( "OR.%s\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_000_001_010()),Disass_FindSize_000_001_010() );
                   1438: }
                   1439: 
                   1440: // OR Dn,<ea>
                   1441: void Disass_OR_Dn_ea(void)
                   1442: {
                   1443:   rprintf3( "OR.%s\tD%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_100_101_110()),Disass_FindRegister(),Disass_FindSize_100_101_110() );
                   1444: }
                   1445: 
                   1446: //-----------------------------------------------------------------------
                   1447: // ORI #<data>,<ea>
                   1448: void Disass_ORI(void)
                   1449: {
                   1450:   rprintf3( "ORI.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_ReadImmediate(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                   1451: }
                   1452: 
                   1453: //-----------------------------------------------------------------------
                   1454: // OR to CCR #<data>,CCR
                   1455: void Disass_ORI_to_CCR(void)
                   1456: {
                   1457:   rprintf1( "ORI.B\t#%s,CCR",Disass_ReadImmediate(SIZE_BYTE) );
                   1458: }
                   1459: 
                   1460: //-----------------------------------------------------------------------
                   1461: // OR to SR #<data>,SR
                   1462: void Disass_ORI_to_SR(void)
                   1463: {
                   1464:   rprintf1( "ORI.W\t#%s,SR",Disass_ReadImmediate(SIZE_WORD) );
                   1465: }
                   1466: 
                   1467: //-----------------------------------------------------------------------
                   1468: // PEA <ea>
                   1469: void Disass_PEA(void)
                   1470: {
                   1471:   rprintf1( "PEA.L\t%s",Disass_FindEffAddr(SIZE_LONG) );
                   1472: }
                   1473: 
                   1474: //-----------------------------------------------------------------------
                   1475: // RESET
                   1476: void Disass_RESET(void)
                   1477: {
                   1478:   rprintf0( "RESET" );
                   1479: }
                   1480: 
                   1481: //-----------------------------------------------------------------------
                   1482: // ROL Dx,Dy
                   1483: void Disass_ROL_Dx_Dy(void)
                   1484: {
                   1485:   rprintf3( "ROL.%s\tD%d,D%d",Disass_FindRegisterLower(),Disass_FindRegister(),Disass_FindSize_00_01_10() );
                   1486: }
                   1487: 
                   1488: // ROL #<data>,Dy
                   1489: void Disass_ROL_data_Dy(void)
                   1490: {
                   1491:   rprintf3( "ROL.%s\t#%s,D%d",Disass_FindRegisterLower(),Disass_WordToString(Disass_FindShiftCount()),Disass_FindSize_00_01_10() );
                   1492: }
                   1493: 
                   1494: // ROL <ea>
                   1495: void Disass_ROL(void)
                   1496: {
                   1497:   rprintf1( "ROL.W\t%s",Disass_FindEffAddr(NULL) );
                   1498: }
                   1499: 
                   1500: //-----------------------------------------------------------------------
                   1501: // ROR Dx,Dy
                   1502: void Disass_ROR_Dx_Dy(void)
                   1503: {
                   1504:   rprintf3( "ROR.%s\tD%d,D%d",Disass_FindRegisterLower(),Disass_FindRegister(),Disass_FindSize_00_01_10() );
                   1505: }
                   1506: 
                   1507: // ROR #<data>,Dy
                   1508: void Disass_ROR_data_Dy(void)
                   1509: {
                   1510:   rprintf3( "ROR.%s\t#%s,D%d",Disass_FindRegisterLower(),Disass_WordToString(Disass_FindShiftCount()),Disass_FindSize_00_01_10() );
                   1511: }
                   1512: 
                   1513: // ROR <ea>
                   1514: void Disass_ROR(void)
                   1515: {
                   1516:   rprintf1( "ROR.W\t%s",Disass_FindEffAddr(NULL) );
                   1517: }
                   1518: 
                   1519: //-----------------------------------------------------------------------
                   1520: // ROXL Dx,Dy
                   1521: void Disass_ROXL_Dx_Dy(void)
                   1522: {
                   1523:   rprintf3( "ROXL.%s\tD%d,D%d",Disass_FindRegisterLower(),Disass_FindRegister(),Disass_FindSize_00_01_10() );
                   1524: }
                   1525: 
                   1526: // ROXL #<data>,Dy
                   1527: void Disass_ROXL_data_Dy(void)
                   1528: {
                   1529:   rprintf3( "ROXL.%s\t#%s,D%d",Disass_FindRegisterLower(),Disass_WordToString(Disass_FindShiftCount()),Disass_FindSize_00_01_10() );
                   1530: }
                   1531: 
                   1532: // ROXL <ea>
                   1533: void Disass_ROXL(void)
                   1534: {
                   1535:   rprintf1( "ROXL.W\t%s",Disass_FindEffAddr(NULL) );
                   1536: }
                   1537: 
                   1538: //-----------------------------------------------------------------------
                   1539: // ROXR Dx,Dy
                   1540: void Disass_ROXR_Dx_Dy(void)
                   1541: {
                   1542:   rprintf3( "ROXR.%s\tD%d,D%d",Disass_FindRegisterLower(),Disass_FindRegister(),Disass_FindSize_00_01_10() );
                   1543: }
                   1544: 
                   1545: // ROXR #<data>,Dy
                   1546: void Disass_ROXR_data_Dy(void)
                   1547: {
                   1548:   rprintf3( "ROXR.%s\t#%s,D%d",Disass_FindRegisterLower(),Disass_WordToString(Disass_FindShiftCount()),Disass_FindSize_00_01_10() );
                   1549: }
                   1550: 
                   1551: // ROXR <ea>
                   1552: void Disass_ROXR(void)
                   1553: {
                   1554:   rprintf1( "ROXR.W\t%s",Disass_FindEffAddr(NULL) );
                   1555: }
                   1556: 
                   1557: //-----------------------------------------------------------------------
                   1558: // RTE
                   1559: void Disass_RTE(void)
                   1560: {
                   1561:   rprintf0( "RTE" );
                   1562: }
                   1563: 
                   1564: //-----------------------------------------------------------------------
                   1565: // RTR
                   1566: void Disass_RTR(void)
                   1567: {
                   1568:   rprintf0( "RTR" );
                   1569: }
                   1570: 
                   1571: //-----------------------------------------------------------------------
                   1572: // RTS
                   1573: void Disass_RTS(void)
                   1574: {
                   1575:   rprintf0( "RTS" );
                   1576: }
                   1577: 
                   1578: //-----------------------------------------------------------------------
                   1579: // SBCD Dy,Dx
                   1580: void Disass_SBCD_Dy_Dx(void)
                   1581: {
                   1582:   rprintf2( "SBCD.B\tD%d,D%d",Disass_FindRegister(),Disass_FindRegisterLower() );
                   1583: }
                   1584: 
                   1585: // SBCD -(Ay),-(Ax)
                   1586: void Disass_SBCD_Ay_Ax(void)
                   1587: {
                   1588:   rprintf2( "SBCD.B\t-(A%d),-(A%d)",Disass_FindRegister(),Disass_FindRegisterLower() );
                   1589: }
                   1590: 
                   1591: //-----------------------------------------------------------------------
                   1592: // Scc <ea>
                   1593: void Disass_Scc(void)
                   1594: {
                   1595:   rprintf2( "S%s.B\t%s",Disass_FindEffAddr(SIZE_BYTE),Disass_FindCondition() );
                   1596: }
                   1597: 
                   1598: //-----------------------------------------------------------------------
                   1599: // STOP #<data>
                   1600: void Disass_STOP(void)
                   1601: {
                   1602:   rprintf1( "STOP\t#%s",Disass_ReadImmediate(SIZE_WORD) );
                   1603: }
                   1604: 
                   1605: //-----------------------------------------------------------------------
                   1606: // SUB <ea>,Dn
                   1607: void Disass_SUB_ea_Dn(void)
                   1608: {
                   1609:   rprintf3( "SUB.%s\t%s,D%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_000_001_010()),Disass_FindSize_000_001_010() );
                   1610: }
                   1611: 
                   1612: // SUB Dn,<ea>
                   1613: void Disass_SUB_Dn_ea(void)
                   1614: {
                   1615:   rprintf3( "SUB.%s\tD%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_100_101_110()),Disass_FindRegister(),Disass_FindSize_100_101_110() );
                   1616: }
                   1617: 
                   1618: //-----------------------------------------------------------------------
                   1619: // SUBA <ea>,An
                   1620: void Disass_SUBA(void)
                   1621: {
                   1622:   rprintf3( "SUBA.%s\t%s,A%d",Disass_FindRegister(),Disass_FindEffAddr(Disass_EffAddrSize_011_111()),Disass_FindSize_011_111() );
                   1623: }
                   1624: 
                   1625: //-----------------------------------------------------------------------
                   1626: // SUBI #<data>,<ea>
                   1627: void Disass_SUBI(void)
                   1628: {
                   1629:   rprintf3( "SUBI.%s\t#%s,%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_ReadImmediate(Disass_EffAddrSize_00_01_10()),Disass_FindSize_00_01_10() );
                   1630: }
                   1631: 
                   1632: //-----------------------------------------------------------------------
                   1633: // SUBQ #<data>,<ea>
                   1634: void Disass_SUBQ(void)
                   1635: {
                   1636:   rprintf3( "SUBQ.%s\t#%d,%s",Disass_FindEffAddr(Disass_EffAddrSize_00_01_10()),Disass_FindQuickData(),Disass_FindSize_00_01_10() );
                   1637: }
                   1638: 
                   1639: //-----------------------------------------------------------------------
                   1640: // SUBX Dy,Dx
                   1641: void Disass_SUBX_Dy_Dx(void)
                   1642: {
                   1643:   rprintf3( "SUBX.%s\tD%d,D%d",Disass_FindRegister(),Disass_FindRegisterLower(),Disass_FindSize_00_01_10() );
                   1644: }
                   1645: 
                   1646: // SUBX -(Ay),-(Ax)
                   1647: void Disass_SUBX_Ay_Ax(void)
                   1648: {
                   1649:   rprintf3( "SUBX.%s\t-(A%d),-(A%d)",Disass_FindRegister(),Disass_FindRegisterLower(),Disass_FindSize_00_01_10() );
                   1650: }
                   1651: 
                   1652: //-----------------------------------------------------------------------
                   1653: // SWAP Dn
                   1654: void Disass_SWAP(void)
                   1655: {
                   1656:   rprintf1( "SWAP.W\tD%d",Disass_FindRegisterLower() );
                   1657: }
                   1658: 
                   1659: //-----------------------------------------------------------------------
                   1660: // TAS <ea>
                   1661: void Disass_TAS(void)
                   1662: {
                   1663:   rprintf1( "TAS.B\t%s",Disass_FindEffAddr(SIZE_BYTE) );
                   1664: }
                   1665: 
                   1666: //-----------------------------------------------------------------------
                   1667: // TRAP #<vector>
                   1668: void Disass_TRAP(void)
                   1669: {
                   1670:   rprintf1( "TRAP\t#%d",OpCode&0xf );
                   1671: }
                   1672: 
                   1673: //-----------------------------------------------------------------------
                   1674: // TRAPV
                   1675: void Disass_TRAPV(void)
                   1676: {
                   1677:   rprintf0( "TRAPV" );
                   1678: }
                   1679: 
                   1680: //-----------------------------------------------------------------------
                   1681: // TST <ea>
                   1682: void Disass_TST(void)
                   1683: {
                   1684:   rprintf2( "TST.%s\t%s",Disass_FindEffAddr(SIZE_BYTE),Disass_FindSize_00_01_10() );
                   1685: }
                   1686: 
                   1687: //-----------------------------------------------------------------------
                   1688: // UNLK An
                   1689: void Disass_UNLK(void)
                   1690: {
                   1691:   rprintf1( "UNLK\tA%d",Disass_FindRegisterLower() );
                   1692: }
                   1693: 
                   1694: 
                   1695: 
                   1696: //-----------------------------------------------------------------------
                   1697: /*
                   1698:   Disassemble from 'DisPC' program counter to 'szOpData', update DisPC
                   1699:   Return TRUE if instruction was valid
                   1700: */
                   1701: BOOL Disass_DiassembleLine(void)
                   1702: {
                   1703:   void *pFunc;
                   1704:   int OpCodeIndex;
                   1705: 
                   1706:   // Clear OpCode data
                   1707:   strcpy(szOpData,"");
                   1708: 
                   1709:   // Read 'Opcode'
                   1710:   OpCode = Disass_ReadWord();
                   1711: 
                   1712:   // Look up disassembly function
                   1713:   OpCodeIndex = STMemory_Swap68000Int(OpCode)*SIZEOF_DECODE;
                   1714:   pFunc = (void *)DecodeTable[OpCodeIndex+(DECODE_DISASS/sizeof(long))];  
                   1715:   if (pFunc) {
                   1716:     CALL_VAR(pFunc);                // Disassemble
                   1717:     return(TRUE);
                   1718:   }
                   1719:   else {
                   1720:     strcpy(szOpString,"----");            // Not an instruction
                   1721:     return(FALSE);
                   1722:   }
                   1723: }
                   1724: 
                   1725: #endif  //USE_DEBUGGER

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.