|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.