|
|
1.1 ! root 1: /* z80stb.c ! 2: * Zilog Z80 processor emulator in C. Modified to be API compliant with Neil ! 3: * Bradley's MZ80 (for ported projects) ! 4: * Ported to 'C' by Jeff Mitchell; original copyright follows: ! 5: * ! 6: * Abstract: ! 7: * Internal declarations for Zilog Z80 emulator. ! 8: * ! 9: * Revisions: ! 10: * 18-Apr-97 EAM Created ! 11: * ??-???-97 EAM Released in MageX 0.5 ! 12: * 26-Jul-97 EAM Fixed Time Pilot slowdown bug and ! 13: * Gyruss hiscore bugs (opcode 0xC3) ! 14: * ! 15: * Original copyright (C) 1997 Edward Massey ! 16: */ ! 17: ! 18: #define FALSE 0 ! 19: #define TRUE 1 ! 20: ! 21: #ifdef WORDS_BIGENDIAN ! 22: #define HOST_TO_LE16(y) ((((y>>8)&0x00FF)+((((y)<<8)&0xFF00))) ! 23: #else ! 24: #define HOST_TO_LE16(y) (y) ! 25: #endif ! 26: ! 27: #include <stdio.h> ! 28: #include <stdlib.h> ! 29: #include <assert.h> ! 30: #include "mz80.h" ! 31: #include "z80stb.h" ! 32: ! 33: /* *************************************************************************** ! 34: * Edward's Internals (so to speak) ! 35: * *************************************************************************** ! 36: */ ! 37: ! 38: #define _ASSERT assert ! 39: ! 40: union { /* WARN: Endianness! */ ! 41: WORD m_regAF; ! 42: struct { ! 43: #ifdef WORDS_BIGENDIAN ! 44: BYTE m_regA; ! 45: BYTE m_regF; ! 46: #else ! 47: BYTE m_regF; ! 48: BYTE m_regA; ! 49: #endif ! 50: } regAFs; ! 51: } regAF; ! 52: #define m_regAF regAF.m_regAF ! 53: #define m_regF regAF.regAFs.m_regF ! 54: #define m_regA regAF.regAFs.m_regA ! 55: ! 56: union { /* WARN: Endianness! */ ! 57: WORD m_regBC; ! 58: struct { ! 59: #ifdef WORDS_BIGENDIAN ! 60: BYTE m_regB; ! 61: BYTE m_regC; ! 62: #else ! 63: BYTE m_regC; ! 64: BYTE m_regB; ! 65: #endif ! 66: } regBCs; ! 67: } regBC; ! 68: #define m_regBC regBC.m_regBC ! 69: #define m_regB regBC.regBCs.m_regB ! 70: #define m_regC regBC.regBCs.m_regC ! 71: ! 72: union { /* WARN: Endianness! */ ! 73: WORD m_regDE; ! 74: struct { ! 75: #ifdef WORDS_BIGENDIAN ! 76: BYTE m_regD; ! 77: BYTE m_regE; ! 78: #else ! 79: BYTE m_regE; ! 80: BYTE m_regD; ! 81: #endif ! 82: } regDEs; ! 83: } regDE; ! 84: #define m_regDE regDE.m_regDE ! 85: #define m_regD regDE.regDEs.m_regD ! 86: #define m_regE regDE.regDEs.m_regE ! 87: ! 88: union { /* WARN: Endianness! */ ! 89: WORD m_regHL; ! 90: struct { ! 91: #ifdef WORDS_BIGENDIAN ! 92: BYTE m_regH; ! 93: BYTE m_regL; ! 94: #else ! 95: BYTE m_regL; ! 96: BYTE m_regH; ! 97: #endif ! 98: } regHLs; ! 99: } regHL; ! 100: #define m_regHL regHL.m_regHL ! 101: #define m_regH regHL.regHLs.m_regH ! 102: #define m_regL regHL.regHLs.m_regL ! 103: ! 104: union { /* WARN: Endianness! */ ! 105: WORD m_regIX; ! 106: struct { ! 107: #ifdef WORDS_BIGENDIAN ! 108: BYTE m_regIXh; ! 109: BYTE m_regIXl; ! 110: #else ! 111: BYTE m_regIXl; ! 112: BYTE m_regIXh; ! 113: #endif ! 114: } regIXs; ! 115: } regIX; ! 116: #define m_regIX regIX.m_regIX ! 117: #define m_regIXl regIX.regIXs.m_regIXl ! 118: #define m_regIXh regIX.regIXs.m_regIXh ! 119: ! 120: union { ! 121: WORD m_regIY; ! 122: struct { ! 123: #ifdef WORDS_BIGENDIAN ! 124: BYTE m_regIYh; ! 125: BYTE m_regIYl; ! 126: #else ! 127: BYTE m_regIYl; ! 128: BYTE m_regIYh; ! 129: #endif ! 130: } regIYs; ! 131: } regIY; ! 132: #define m_regIY regIY.m_regIY ! 133: #define m_regIYl regIY.regIYs.m_regIYl ! 134: #define m_regIYh regIY.regIYs.m_regIYh ! 135: ! 136: const BYTE *m_rgbOpcode; // takes place of the PC register ! 137: LPBYTE m_rgbStack; // takes place of the SP register ! 138: LPBYTE m_rgbMemory; // direct access to memory buffer (RAM) ! 139: const BYTE *m_rgbOpcodeBase; // "base" pointer for m_rgbOpcode ! 140: LPBYTE m_rgbStackBase; ! 141: static int cCycles = 0; ! 142: ! 143: BYTE m_regR; // consider: should be int for performance? ! 144: BYTE m_regI; // consider: combine into ! 145: ! 146: // TODO: combine into a single int... ! 147: int m_iff1, m_iff2; ! 148: BOOL m_fHalt; ! 149: int m_nIM; ! 150: BOOL m_fPendingInterrupt = FALSE; ! 151: ! 152: WORD m_regAF2; ! 153: static WORD m_regBC2; ! 154: static WORD m_regDE2; ! 155: static WORD m_regHL2; ! 156: WORD z80intAddr = 0x38; ! 157: WORD z80nmiAddr = 0x66; ! 158: ! 159: /* *************************************************************************** ! 160: * Pre-calculated math tables and junk (sucked from Marat and Edward) ! 161: * *************************************************************************** ! 162: */ ! 163: void InitTables (void); ! 164: ! 165: BYTE ZSTable[256]; ! 166: BYTE ZSPTable[256]; ! 167: BYTE rgfAdd[256][256]; ! 168: BYTE rgfSub[256][256]; ! 169: BYTE rgfAddc[256][256][2]; ! 170: BYTE rgfSubc[256][256][2]; ! 171: BYTE rgfInc[256]; ! 172: BYTE rgfDec[256]; ! 173: BYTE rgfBit[256][8]; ! 174: static UINT32 dwElapsedTicks = 0; ! 175: ! 176: /* #include "z80daa.h" */ ! 177: #include "z80stbd.h" ! 178: ! 179: /* *************************************************************************** ! 180: * Retrocade guts stuff ! 181: * *************************************************************************** ! 182: */ ! 183: static struct MemoryReadByte *z80MemoryRead = NULL; ! 184: static struct MemoryWriteByte *z80MemoryWrite = NULL; ! 185: static struct z80PortRead *z80IoRead = NULL; ! 186: static struct z80PortWrite *z80IoWrite = NULL; ! 187: WORD z80pc = 0; ! 188: ! 189: /* *************************************************************************** ! 190: * Retrocade interface follows ! 191: * *************************************************************************** ! 192: */ ! 193: ! 194: /* reset registers, interrupts, memory read/write memory handlers, ! 195: * port read and writing handlers, etc. ! 196: */ ! 197: void mz80reset(void) { ! 198: ! 199: InitTables(); ! 200: ! 201: m_fPendingInterrupt = FALSE; ! 202: m_rgbOpcodeBase = m_rgbMemory; ! 203: /* m_rgbMemory = */ ! 204: m_rgbStackBase = m_rgbMemory; ! 205: ! 206: m_regAF = 0; ! 207: m_regBC = 0; ! 208: m_regDE = 0; ! 209: m_regHL = 0; ! 210: m_regAF2 = 0; ! 211: m_regBC2 = 0; ! 212: m_regDE2 = 0; ! 213: m_regHL2 = 0; ! 214: m_regR = rand(); ! 215: m_regI = 0; ! 216: m_fHalt = FALSE; ! 217: m_nIM = 0; ! 218: m_regIX = 0xffff; // Yes, this intentional, and the way a Z80 comes ! 219: m_regIY = 0xffff; // up in power-on state! ! 220: m_iff1 = 0; ! 221: m_iff2 = 0; ! 222: z80intAddr = 0x38; ! 223: z80nmiAddr = 0x66; ! 224: ! 225: SetPC(0x0000); ! 226: SetSP(0x0000); ! 227: ! 228: #if 0 ! 229: fprintf ( stderr, "Reset\n" ); ! 230: #endif ! 231: } ! 232: ! 233: /* UINT32 mz80int(UINT32 a) { ! 234: * return ( Irq ( (BYTE) ( a & 0xFF ) ) ); ! 235: * } ! 236: */ ! 237: ! 238: /* UINT32 mz80nmi(void) { ! 239: * return ( Nmi() ); ! 240: * } ! 241: */ ! 242: ! 243: /* *************************************************************************** ! 244: * Edward Memory Handlers (guesses) ! 245: * *************************************************************************** ! 246: */ ! 247: ! 248: #define ImmedByte() *m_rgbOpcode++ ! 249: ! 250: /* static */ UINT16 ImmedWord ( void ) { ! 251: WORD w = HOST_TO_LE16(*(WORD*)m_rgbOpcode); ! 252: m_rgbOpcode += 2; ! 253: return w; // attn: little endian specific ! 254: } ! 255: ! 256: #define GetPC() ( (WORD)(m_rgbOpcode - m_rgbOpcodeBase) ) ! 257: ! 258: void SetPC ( WORD wAddr ) { ! 259: m_rgbOpcode = &m_rgbOpcodeBase[wAddr]; ! 260: } ! 261: ! 262: void AdjustPC ( signed char cb ) { ! 263: m_rgbOpcode += cb; ! 264: } ! 265: ! 266: void Push(WORD wArg) { ! 267: MemWriteByte(--m_rgbStack - m_rgbStackBase, HIBYTE(wArg)); ! 268: MemWriteByte(--m_rgbStack - m_rgbStackBase, LOBYTE(wArg)); ! 269: } ! 270: ! 271: WORD Pop() { ! 272: unsigned short wAddr = 0; ! 273: ! 274: wAddr = MemReadByte(m_rgbStack++ - m_rgbStackBase); ! 275: wAddr |= (MemReadByte(m_rgbStack++ - m_rgbStackBase) << 8); ! 276: ! 277: return(wAddr); ! 278: } ! 279: ! 280: WORD GetSP() { ! 281: return (WORD)(m_rgbStack - m_rgbStackBase); ! 282: } ! 283: ! 284: void SetSP(WORD wAddr) { ! 285: m_rgbStack = &m_rgbStackBase[wAddr]; ! 286: } ! 287: ! 288: /* static */ UINT8 mz80GetMemory ( UINT16 addr ) { ! 289: struct MemoryReadByte *mr = z80MemoryRead; ! 290: ! 291: z80pc = GetPC(); /* for some of the platforms */ ! 292: ! 293: while ( mr -> lowAddr != 0xffffffff ) { ! 294: ! 295: if (addr >= mr->lowAddr && addr <= mr->highAddr) { ! 296: z80pc = GetPC(); ! 297: return ( mr -> memoryCall ( addr, mr ) ); ! 298: } ! 299: ! 300: ++mr; ! 301: ! 302: } ! 303: ! 304: return ( m_rgbMemory [ addr ] ); ! 305: } ! 306: ! 307: /* static */ void mz80PutMemory ( unsigned short int addr, unsigned char byte ) { ! 308: struct MemoryWriteByte *mr = z80MemoryWrite; ! 309: ! 310: while ( mr->lowAddr != 0xffffffff ) { ! 311: if (addr >= mr->lowAddr && addr <= mr->highAddr) { ! 312: z80pc = GetPC(); ! 313: mr->memoryCall(addr, byte, mr); ! 314: return; ! 315: } ! 316: mr++; ! 317: } ! 318: ! 319: m_rgbMemory [ addr ] = byte; ! 320: ! 321: } ! 322: ! 323: BYTE In(BYTE bPort) { ! 324: BYTE bVal; ! 325: // BYTE bVal = m_rgpfnPortRead[bPort](bPort); ! 326: ! 327: struct z80PortRead *mr = z80IoRead; ! 328: ! 329: z80pc = GetPC(); /* for some of the platforms */ ! 330: ! 331: while ( mr->lowIoAddr != 0xffff ) { ! 332: if ( bPort >= mr->lowIoAddr && bPort <= mr->highIoAddr) { ! 333: bVal = mr->IOCall ( bPort, mr ); ! 334: break; ! 335: } ! 336: mr++; ! 337: } ! 338: ! 339: m_regF = (m_regF & C_FLAG) | ZSPTable[bVal]; ! 340: ! 341: return bVal; ! 342: } ! 343: ! 344: BYTE InRaw (BYTE bPort) { ! 345: BYTE bVal; ! 346: ! 347: struct z80PortRead *mr = z80IoRead; ! 348: ! 349: z80pc = GetPC(); /* for some of the platforms */ ! 350: ! 351: while ( mr->lowIoAddr != 0xffff ) { ! 352: if ( bPort >= mr->lowIoAddr && bPort <= mr->highIoAddr) { ! 353: bVal = mr->IOCall ( bPort, mr ); ! 354: break; ! 355: } ! 356: mr++; ! 357: } ! 358: ! 359: // m_regF = (m_regF & C_FLAG) | ZSPTable[bVal]; ! 360: return bVal; ! 361: } ! 362: ! 363: void Out(BYTE bPort, BYTE bVal) { ! 364: // m_rgpfnPortWrite[bPort](bPort, bVal); ! 365: struct z80PortWrite *mr = z80IoWrite; ! 366: ! 367: z80pc = GetPC(); /* for some of the platforms */ ! 368: ! 369: while ( mr->lowIoAddr != 0xffff ) { ! 370: if (bPort >= mr->lowIoAddr && bPort <= mr->highIoAddr) { ! 371: mr->IOCall ( bPort, bVal, mr ); ! 372: return; ! 373: } ! 374: mr++; ! 375: } ! 376: ! 377: } ! 378: ! 379: /* static */ void MemWriteWord ( UINT16 wAddr, UINT16 wVal ) { ! 380: MemWriteByte ( wAddr++, LOBYTE ( wVal ) ); ! 381: MemWriteByte ( wAddr, HIBYTE ( wVal ) ); ! 382: } ! 383: ! 384: /* static */ /* inline */ void MemWriteByte ( UINT16 wAddr, UINT8 bVal ) { ! 385: mz80PutMemory ( wAddr, bVal ); ! 386: } ! 387: ! 388: /* static */ /* inline */ UINT8 MemReadByte ( UINT16 wAddr ) { ! 389: return ( mz80GetMemory ( wAddr ) ); ! 390: } ! 391: ! 392: /* static */ /* inline */ UINT16 MemReadWord ( UINT16 wAddr ) { ! 393: UINT8 op1; ! 394: UINT8 op2; ! 395: ! 396: op1 = MemReadByte(wAddr ++); ! 397: op2 = MemReadByte(wAddr); ! 398: return ( MAKEWORD ( op1, op2 ) ); ! 399: } ! 400: ! 401: /* *************************************************************************** ! 402: * Retrocade guts stuff (again) (these guys are defined after macros) ! 403: * *************************************************************************** ! 404: */ ! 405: ! 406: unsigned long int mz80GetContextSize(void) { ! 407: return ( sizeof ( CONTEXTMZ80 ) ); ! 408: } ! 409: ! 410: /* set memory base, etc. */ ! 411: void mz80GetContext ( void *receiver ) { ! 412: CONTEXTMZ80 *c = receiver; ! 413: c -> z80MemRead = z80MemoryRead; ! 414: c -> z80MemWrite = z80MemoryWrite; ! 415: c -> z80Base = (UINT8 *) m_rgbOpcodeBase; ! 416: c -> z80IoRead = z80IoRead; ! 417: c -> z80IoWrite = z80IoWrite; ! 418: c -> z80af = m_regAF; ! 419: c -> z80bc = m_regBC; ! 420: c -> z80de = m_regDE; ! 421: c -> z80hl = m_regHL; ! 422: c -> z80afprime = m_regAF2; ! 423: c -> z80bcprime = m_regBC2; ! 424: c -> z80deprime = m_regDE2; ! 425: c -> z80hlprime = m_regHL2; ! 426: c -> z80ix = m_regIX; ! 427: c -> z80iy = m_regIY; ! 428: c -> z80sp = GetSP(); ! 429: c -> z80pc = GetPC(); ! 430: c -> z80i = m_regI; ! 431: c -> z80r = m_regR; ! 432: c -> z80intAddr = z80intAddr; ! 433: c -> z80nmiAddr = z80nmiAddr; ! 434: c -> z80inInterrupt = m_iff1; ! 435: c -> z80interruptMode = m_nIM; ! 436: c -> z80interruptState = m_iff2; ! 437: c -> z80halted = m_fHalt; ! 438: ! 439: #if 0 ! 440: fprintf ( stderr, "GetContext\n" ); ! 441: #endif ! 442: } ! 443: ! 444: void mz80SetContext( void *sender ) { ! 445: CONTEXTMZ80 *c = sender; ! 446: z80MemoryRead = c -> z80MemRead; ! 447: z80MemoryWrite = c -> z80MemWrite; ! 448: m_rgbMemory = c -> z80Base; ! 449: z80IoRead = c -> z80IoRead; ! 450: z80IoWrite = c -> z80IoWrite; ! 451: m_regAF = c -> z80af; ! 452: m_regBC = c -> z80bc; ! 453: m_regDE = c -> z80de; ! 454: m_regHL = c -> z80hl; ! 455: m_regAF2 = c -> z80afprime; ! 456: m_regBC2 = c -> z80bcprime; ! 457: m_regDE2 = c -> z80deprime; ! 458: m_regHL2 = c -> z80hlprime; ! 459: m_regIX = c -> z80ix; ! 460: m_regIY = c -> z80iy; ! 461: m_regI = c -> z80i; ! 462: m_regR = c -> z80r; ! 463: z80intAddr = c -> z80intAddr; ! 464: z80nmiAddr = c -> z80nmiAddr; ! 465: m_rgbOpcodeBase = m_rgbMemory; ! 466: ! 467: m_iff1 = c->z80inInterrupt; ! 468: m_iff2 = c->z80interruptState; ! 469: m_nIM = c->z80interruptMode; ! 470: m_fHalt = c->z80halted; ! 471: ! 472: SetPC ( c -> z80pc ); ! 473: SetSP ( c -> z80sp ); ! 474: ! 475: #if 0 ! 476: fprintf ( stderr, "SetContext\n" ); ! 477: #endif ! 478: } ! 479: ! 480: /* *************************************************************************** ! 481: * Z80 Please-inline-my-ass opcodes ! 482: * *************************************************************************** ! 483: */ ! 484: ! 485: /* inline */ int Ret0(int f) ! 486: { ! 487: if (f) ! 488: { ! 489: SetPC(Pop()); ! 490: return 6; ! 491: } ! 492: else ! 493: { ! 494: return 0; ! 495: } ! 496: } ! 497: ! 498: /* inline */ int Ret1(int f) ! 499: { ! 500: if (f) ! 501: { ! 502: return 0; ! 503: } ! 504: else ! 505: { ! 506: SetPC(Pop()); ! 507: return 6; ! 508: } ! 509: } ! 510: ! 511: /* inline */ WORD Adc_2 (WORD wArg1, WORD wArg2) ! 512: { ! 513: #ifdef ARITH_TABLES ! 514: int q = wArg1 + wArg2 + (m_regF & C_FLAG); ! 515: m_regF = (((wArg1^q^wArg2)&0x1000)>>8)|((q>>16)&1)|((q&0x8000)>>8)|((q&65535)?0:Z_FLAG)|(((wArg2^wArg1^0x8000)&(wArg2^q)&0x8000)>>13); ! 516: return q; ! 517: #else ! 518: int q = wArg1 + wArg2 + (m_regF & C_FLAG); ! 519: m_regF = (((wArg1^q^wArg2)&0x1000)>>8)|((q>>16)&1)|((q&0x8000)>>8)|((q&65535)?0:Z_FLAG)|(((wArg2^wArg1^0x8000)&(wArg2^q)&0x8000)>>13); ! 520: return q; ! 521: #endif ! 522: } ! 523: ! 524: /* inline */ WORD Sbc_2 (WORD wArg1, WORD wArg2) ! 525: { ! 526: #ifdef ARITH_TABLES ! 527: int q = wArg1 - wArg2 - (m_regF & C_FLAG); ! 528: ! 529: m_regF = (((wArg1^q^wArg2)&0x1000)>>8)|((q>>16)&1)|((q&0x8000)>>8)| ! 530: ((q&65535)?0:Z_FLAG)|(((wArg1^wArg2)&(wArg1^q)&0x8000)>>13)|N_FLAG; ! 531: ! 532: return q; ! 533: #else ! 534: int q = wArg1 - wArg2 - (m_regF & C_FLAG); ! 535: ! 536: m_regF = (((wArg1^q^wArg2)&0x1000)>>8)|((q>>16)&1)|((q&0x8000)>>8)| ! 537: ((q&65535)?0:Z_FLAG)|(((wArg1^wArg2)&(wArg1^q)&0x8000)>>13)|N_FLAG; ! 538: ! 539: return q; ! 540: #endif ! 541: } ! 542: ! 543: /* inline */ WORD Add_2 (WORD wArg1, WORD wArg2) ! 544: { ! 545: #ifdef ARITH_TABLES ! 546: int q = wArg1 + wArg2; ! 547: m_regF = (m_regF&(S_FLAG|Z_FLAG|V_FLAG))|(((wArg1^q^wArg2)&0x1000)>>8)|((q>>16)&1); ! 548: return q; ! 549: #else ! 550: int q = wArg1 + wArg2; ! 551: m_regF = (m_regF&(S_FLAG|Z_FLAG|V_FLAG))|(((wArg1^q^wArg2)&0x1000)>>8)|((q>>16)&1); ! 552: return q; ! 553: #endif ! 554: } ! 555: ! 556: /* inline */ void Add_1 (BYTE bArg) ! 557: { ! 558: #ifdef ARITH_TABLES ! 559: int q = m_regA + bArg; ! 560: m_regF = rgfAdd[m_regA][bArg]; ! 561: m_regA = q; ! 562: #else ! 563: int q = m_regA + bArg; ! 564: m_regF=ZSTable[q&255]|((q&256)>>8)| ((m_regA^q^bArg)&H_FLAG)| (((bArg^m_regA^0x80)&(bArg^q)&0x80)>>5); ! 565: m_regA=q; ! 566: #endif ! 567: } ! 568: ! 569: /* inline */ void Adc_1 (BYTE bArg) ! 570: { ! 571: #ifdef ARITH_TABLES ! 572: int q = m_regA + bArg + (m_regF & C_FLAG); ! 573: m_regF = rgfAddc[m_regA][bArg][m_regF & C_FLAG]; ! 574: m_regA = q; ! 575: #else ! 576: int q = m_regA + bArg + (m_regF & C_FLAG); ! 577: m_regF = ZSTable[q & 255]|((q & 256)>>8)|((m_regA^q^bArg)&H_FLAG)|(((bArg^m_regA^0x80)&(bArg^q)&0x80)>>5); ! 578: m_regA = q; ! 579: #endif ! 580: } ! 581: ! 582: /* inline */ void Sub_1 (BYTE bArg) ! 583: { ! 584: #ifdef ARITH_TABLES ! 585: int q = m_regA - bArg; ! 586: m_regF = rgfSub[m_regA][bArg]; ! 587: m_regA = q; ! 588: #else ! 589: int q = m_regA - bArg; ! 590: m_regF = ZSTable[q&255]|((q&256)>>8)|N_FLAG|((m_regA^q^bArg)&H_FLAG)|(((bArg^m_regA)&(m_regA^q)&0x80)>>5); ! 591: m_regA = q; ! 592: #endif ! 593: } ! 594: ! 595: /* inline */ void Sbc_1 (BYTE bArg) ! 596: { ! 597: #ifdef ARITH_TABLES ! 598: int q = m_regA - bArg - (m_regF & C_FLAG); ! 599: m_regF = rgfSubc[m_regA][bArg][m_regF & C_FLAG]; ! 600: m_regA = q; ! 601: #else ! 602: int q = m_regA - bArg - (m_regF & C_FLAG); ! 603: m_regF=ZSTable[q&255]|((q&256)>>8)|N_FLAG|((m_regA^q^bArg)&H_FLAG)|(((bArg^m_regA)&(bArg^q)&0x80)>>5); ! 604: m_regA=q; ! 605: #endif ! 606: } ! 607: ! 608: /* inline */ void And (BYTE bArg) ! 609: { ! 610: m_regF = ZSPTable[m_regA &= bArg] | H_FLAG; ! 611: } ! 612: ! 613: /* inline */ void Or(BYTE bArg) ! 614: { ! 615: m_regF = ZSPTable[m_regA |= bArg]; ! 616: } ! 617: ! 618: /* inline */ void Xor(BYTE bArg) ! 619: { ! 620: m_regF = ZSPTable[m_regA ^= bArg]; ! 621: } ! 622: ! 623: /* inline */ void Cp(BYTE bArg) ! 624: { ! 625: #ifdef ARITH_TABLES ! 626: int q = m_regA - bArg; ! 627: m_regF = rgfSub[m_regA][bArg]; ! 628: #else ! 629: int q = m_regA - bArg; ! 630: m_regF = ZSTable[q&255]|((q&256)>>8)|N_FLAG|((m_regA^q^bArg)&H_FLAG)|(((bArg^m_regA)&(bArg^q)&0x80)>>5); ! 631: #endif ! 632: } ! 633: ! 634: /* inline */ static BYTE Inc(BYTE bArg) ! 635: { ! 636: #ifdef ARITH_TABLES ! 637: bArg++; ! 638: m_regF = (m_regF & C_FLAG) | rgfInc[bArg]; ! 639: return bArg; ! 640: #else ! 641: bArg++; ! 642: m_regF = (m_regF&C_FLAG)|ZSTable[bArg]|((bArg==0x80)?V_FLAG:0)|((bArg&0x0F)?0:H_FLAG); ! 643: return bArg; ! 644: #endif ! 645: } ! 646: ! 647: /* inline */ static BYTE Dec(BYTE bArg) ! 648: { ! 649: #ifdef ARITH_TABLES ! 650: m_regF = (m_regF & C_FLAG) | rgfDec[bArg--]; ! 651: return bArg; ! 652: #else ! 653: m_regF=(m_regF&C_FLAG)|N_FLAG| ! 654: ((bArg==0x80)?V_FLAG:0)|((bArg&0x0F)?0:H_FLAG); ! 655: ! 656: m_regF|=ZSTable[--bArg]; ! 657: ! 658: return bArg; ! 659: #endif ! 660: } ! 661: ! 662: // shouldn't even be members... ! 663: ! 664: /* inline */ BYTE Set(BYTE bArg, int nBit) ! 665: { ! 666: return (bArg | (1 << nBit)); ! 667: } ! 668: ! 669: /* inline */ BYTE Res(BYTE bArg, int nBit) ! 670: { ! 671: return (bArg & ~(1 << nBit)); ! 672: } ! 673: ! 674: /* inline */ void Bit(BYTE bArg, int nBit) ! 675: { ! 676: #ifdef ARITH_TABLES ! 677: m_regF = (m_regF & C_FLAG) | rgfBit[bArg][nBit]; ! 678: #else ! 679: m_regF = (m_regF & C_FLAG) | H_FLAG | ((bArg&(1<< nBit))? ((nBit==7)?S_FLAG:0):Z_FLAG); ! 680: #endif ! 681: } ! 682: ! 683: /* inline */ BYTE Rlc(BYTE bArg) ! 684: { ! 685: int q = bArg >> 7; ! 686: bArg = (bArg << 1) | q; ! 687: m_regF = ZSPTable[bArg] | q; ! 688: return bArg; ! 689: } ! 690: ! 691: /* inline */ BYTE Rrc(BYTE bArg) ! 692: { ! 693: int q = bArg & 1; ! 694: bArg = (bArg >> 1) | (q << 7); ! 695: m_regF = ZSPTable[bArg]|q; ! 696: return bArg; ! 697: } ! 698: ! 699: /* inline */ BYTE Rl(BYTE bArg) ! 700: { ! 701: int q=bArg>>7; ! 702: bArg=(bArg<<1)|(m_regF&1); ! 703: m_regF=ZSPTable[bArg]|q; ! 704: return bArg; ! 705: } ! 706: ! 707: /* inline */ BYTE Rr(BYTE bArg) ! 708: { ! 709: int q = bArg&1; ! 710: bArg=(bArg>>1)|(m_regF<<7); ! 711: m_regF=ZSPTable[bArg]|q; ! 712: return bArg; ! 713: } ! 714: ! 715: /* inline */ BYTE Sll(BYTE bArg) ! 716: { ! 717: int q = bArg>>7; ! 718: bArg=(bArg<<1)|1; ! 719: m_regF=ZSPTable[bArg]|q; ! 720: return bArg; ! 721: } ! 722: ! 723: /* inline */ BYTE Srl(BYTE bArg) ! 724: { ! 725: int q = bArg&1; ! 726: bArg>>=1; ! 727: m_regF=ZSPTable[bArg]|q; ! 728: return bArg; ! 729: } ! 730: ! 731: /* inline */ BYTE Sla(BYTE bArg) ! 732: { ! 733: int q = bArg>>7; ! 734: bArg<<=1; ! 735: m_regF=ZSPTable[bArg]|q; ! 736: return bArg; ! 737: } ! 738: ! 739: /* inline */ BYTE Sra(BYTE bArg) ! 740: { ! 741: int q = bArg&1; ! 742: bArg = (bArg>>1)|(bArg&0x80); ! 743: m_regF = ZSPTable[bArg]|q; ! 744: return bArg; ! 745: } ! 746: ! 747: /* *************************************************************************** ! 748: * Edwards Z80 Utilities ! 749: * *************************************************************************** ! 750: */ ! 751: ! 752: UINT16 swap_variable; ! 753: #define swap(b1,b2) swap_variable = b1; b1 = b2; b2 = swap_variable; ! 754: /* inline void swap ( WORD &b1, WORD &b2 ) { ! 755: * WORD b = b1; ! 756: * b1 = b2; ! 757: * b2 = b; ! 758: * } ! 759: */ ! 760: ! 761: /* inline */ void Rlca() { ! 762: m_regA = (m_regA << 1) | ((m_regA & 0x80) >> 7); ! 763: m_regF = (m_regF & 0xEC) | (m_regA & C_FLAG); ! 764: } ! 765: ! 766: /* inline */ void Rrca() { ! 767: m_regF=(m_regF&0xEC)|(m_regA&0x01); ! 768: m_regA=(m_regA>>1)|(m_regA<<7); ! 769: } ! 770: ! 771: /* inline */ void Rla() { ! 772: int i = m_regF&C_FLAG; ! 773: m_regF = (m_regF&0xEC)|((m_regA&0x80)>>7); ! 774: m_regA = (m_regA<<1)|i; ! 775: } ! 776: ! 777: /* inline */ void Rra() { ! 778: int i = m_regF&C_FLAG; ! 779: m_regF=(m_regF&0xEC)|(m_regA&0x01); ! 780: m_regA=(m_regA>>1)|(i<<7); ! 781: } ! 782: ! 783: /* *************************************************************************** ! 784: * Edwards Z80 Good-bits follow ! 785: * *************************************************************************** ! 786: */ ! 787: ! 788: void InitTables (void) { ! 789: int i; ! 790: DWORD dw; ! 791: ! 792: // ! 793: // ! 794: // ! 795: ! 796: for (i=0; i<256; ++i) ! 797: { ! 798: BYTE zs = 0; ! 799: int p=0; ! 800: BYTE bArg; ! 801: int j; ! 802: ! 803: // zs |= i ? 0 : Z_FLAG; ! 804: if (i==0) ! 805: zs|=Z_FLAG; ! 806: ! 807: // zs |= i & S_FLAG; ! 808: if (i&0x80) ! 809: zs|=S_FLAG; ! 810: ! 811: if (i&1) ++p; ! 812: if (i&2) ++p; ! 813: if (i&4) ++p; ! 814: if (i&8) ++p; ! 815: if (i&16) ++p; ! 816: if (i&32) ++p; ! 817: if (i&64) ++p; ! 818: if (i&128) ++p; ! 819: ! 820: // PTable[i] = (p&1) ? 0:V_FLAG; ! 821: ZSTable[i] = zs; ! 822: ZSPTable[i]= zs | ((p&1) ? 0:V_FLAG); ! 823: ! 824: rgfInc[i] = ZSTable[i] | ((i == 0x80) ? V_FLAG : 0) | ((i & 0x0F) ? 0 : H_FLAG); ! 825: ! 826: // rgfDec[i] = N_FLAG | ((i == 0x80) ? V_FLAG : 0) | ((i & 0x0F) ? 0 : H_FLAG) | ZSTable[(BYTE)i - 1]; ! 827: ! 828: bArg = i; ! 829: rgfDec[i] = N_FLAG|((bArg==0x80)?V_FLAG:0)|((bArg&0x0F)?0:H_FLAG); ! 830: rgfDec[i]|=ZSTable[--bArg]; ! 831: ! 832: for ( j = 0; j < 8; j++) ! 833: rgfBit[i][j] = H_FLAG | ((i & (1 << j))? ((j == 7) ? S_FLAG : 0) : Z_FLAG); ! 834: } ! 835: ! 836: // ! 837: // Calculate flag tables ! 838: // ! 839: ! 840: for ( dw = 0; dw <= 256 * 256; dw++) ! 841: { ! 842: BYTE bLo = LOBYTE(LOWORD(dw)); ! 843: BYTE bHi = HIBYTE(LOWORD(dw)); ! 844: ! 845: const BYTE regA = bLo; ! 846: const BYTE bArg = bHi; ! 847: ! 848: int nAcc; ! 849: BYTE regF; ! 850: int c; ! 851: ! 852: // ! 853: // ADD ! 854: // ! 855: ! 856: nAcc = regA + bArg; ! 857: regF = 0; ! 858: ! 859: regF |= ZSTable[nAcc&255]; ! 860: regF |= ((nAcc&256)>>8); ! 861: regF |= ((regA^nAcc^bArg)&H_FLAG); ! 862: regF |= (((bArg^regA^0x80)&(bArg^nAcc)&0x80)>>5); ! 863: ! 864: rgfAdd[regA][bArg] = regF; ! 865: ! 866: // ! 867: // SUB ! 868: // ! 869: ! 870: nAcc = regA - bArg; ! 871: regF = ZSTable[nAcc&255]|((nAcc&256)>>8)|N_FLAG|((regA^nAcc^bArg)&H_FLAG)|(((bArg^regA)&(regA^nAcc)&0x80)>>5); ! 872: ! 873: rgfSub[regA][bArg] = regF; ! 874: ! 875: // ! 876: // ! 877: // ! 878: ! 879: for ( c = 0; c <= 1; c++) ! 880: { ! 881: // ! 882: // ADC ! 883: // ! 884: ! 885: nAcc = regA + bArg + c; ! 886: regF = 0; ! 887: ! 888: regF |= ZSTable[nAcc&255]; ! 889: regF |= ((nAcc&256)>>8); ! 890: regF |= ((regA^nAcc^bArg)&H_FLAG); ! 891: regF |= (((bArg^regA^0x80)&(bArg^nAcc)&0x80)>>5); ! 892: ! 893: rgfAddc[regA][bArg][c] = regF; ! 894: ! 895: // ! 896: // SBC ! 897: // ! 898: ! 899: nAcc = regA - bArg - c; ! 900: regF = ZSTable[nAcc&255]|((nAcc&256)>>8)|N_FLAG|((regA^nAcc^bArg)&H_FLAG)|(((bArg^regA)&(bArg^nAcc)&0x80)>>5); ! 901: ! 902: rgfSubc[regA][bArg][c] = regF; ! 903: } ! 904: } ! 905: } ! 906: ! 907: /* *************************************************************************** ! 908: * Opcodes ! 909: * *************************************************************************** ! 910: */ ! 911: ! 912: /*--------------------------------------------------------------------------- ! 913: ! 914: Exec ! 915: ! 916: Executes the specified number of t-states. Returns the actual number of ! 917: t-states executed. If a halt instruction is encountered, the execution ! 918: loop exits. If the processor is currently in a halted state this ! 919: function immediately returns 0. ! 920: ! 921: ---------------------------------------------------------------------------*/ ! 922: ! 923: unsigned long int mz80exec ( unsigned long int cCyclesArg ) { ! 924: UINT32 origElapsedTicks=dwElapsedTicks; ! 925: // ! 926: // ! 927: // ! 928: ! 929: // if (m_fHalt) ! 930: // return 0; ! 931: ! 932: // ! 933: // Save t-state count for return value calculation ! 934: // ! 935: ! 936: cCycles = cCyclesArg; ! 937: ! 938: // ! 939: // ! 940: // ! 941: ! 942: ! 943: #ifndef TRACE_Z80 ! 944: while (cCycles > 0) ! 945: #endif ! 946: { ! 947: #ifdef _DEBUG ! 948: static int cins; ! 949: ! 950: if ((cins % 1000) == 0 && GetAsyncKeyState('X') < 0) ! 951: _ASSERT(FALSE); ! 952: ! 953: _ASSERT(cins != _instrap); ! 954: ! 955: if (cins >= _rgcins[0] && cins <= _rgcins[0] + _rgcins[1] * _rgcins[2] && ((cins - _rgcins[0]) % _rgcins[2]) == 0) ! 956: { ! 957: if (cins == _rgcins[0]) ! 958: { ! 959: TRACE("instr PC AF BC DE HL IX IY SP cycl dasm \n"); ! 960: TRACE("-------- ---- ---- ---- ---- ---- ---- ---- ---- ---- ------------\n"); ! 961: } ! 962: ! 963: TCHAR szBuf[128]; ! 964: ! 965: Z80_Dasm(&m_rgbMemory[GetPC()], szBuf, GetPC()); ! 966: ! 967: TRACE("%08X %04X %04X %04X %04X %04X %04X %04X %04X %04X %s\n", ! 968: cins, GetPC(), m_regAF, m_regBC, m_regDE, m_regHL, m_regIX, m_regIY, GetSP(), cCycles, szBuf); ! 969: } ! 970: ! 971: cins++; ! 972: #endif ! 973: const BYTE bOpcode = ImmedByte(); ! 974: ! 975: #ifdef _DEBUG ! 976: m_rgcOpcode[0][bOpcode]++; ! 977: #endif ! 978: ! 979: m_regR++; ! 980: ! 981: #if 0 ! 982: /* debug crap for RC */ ! 983: { ! 984: char szBuf [ 128 ]; ! 985: Z80_Dasm(&m_rgbMemory[GetPC()], szBuf, GetPC()); ! 986: ! 987: fprintf ( stderr, ! 988: "%04X %04X %04X %04X %04X %04X %04X %04X %04X %s\n", ! 989: GetPC(), m_regAF, m_regBC, m_regDE, m_regHL, ! 990: m_regIX, m_regIY, GetSP(), cCycles, szBuf ); ! 991: } ! 992: ! 993: // fprintf ( stderr, "%d\n", bOpcode ); ! 994: #endif ! 995: z80pc = GetPC(); /* for some of the platforms */ ! 996: ! 997: dwElapsedTicks = origElapsedTicks + (cCyclesArg - cCycles); ! 998: ! 999: switch (bOpcode) ! 1000: { ! 1001: case 0x00: // nop ! 1002: cCycles -= 4; ! 1003: break; ! 1004: ! 1005: case 0x01: // ld_bc_word ! 1006: cCycles -= 10; ! 1007: m_regBC = ImmedWord(); ! 1008: break; ! 1009: ! 1010: case 0x02: // ld_xbc_a ! 1011: cCycles -= 7; ! 1012: MemWriteByte(m_regBC, m_regA); ! 1013: break; ! 1014: ! 1015: case 0x03: // inc_bc ! 1016: cCycles -= 6; ! 1017: m_regBC++; ! 1018: break; ! 1019: ! 1020: case 0x04: // inc_b ! 1021: cCycles -= 4; ! 1022: m_regB = Inc(m_regB); ! 1023: break; ! 1024: ! 1025: case 0x05: // dec_b ! 1026: cCycles -= 4; ! 1027: m_regB = Dec(m_regB); ! 1028: break; ! 1029: ! 1030: case 0x06: // ld_b_byte ! 1031: cCycles -= 7; ! 1032: m_regB = ImmedByte(); ! 1033: break; ! 1034: ! 1035: case 0x07: // rlca ! 1036: cCycles -= 4; ! 1037: Rlca(); ! 1038: break; ! 1039: ! 1040: case 0x08: // ex_af_af ! 1041: cCycles -= 4; ! 1042: swap(m_regAF, m_regAF2); ! 1043: break; ! 1044: ! 1045: case 0x09: // add_hl_bc ! 1046: cCycles -= 11; ! 1047: m_regHL = Add_2(m_regHL, m_regBC); ! 1048: break; ! 1049: ! 1050: case 0x0A: // ld_a_xbc ! 1051: cCycles -= 7; ! 1052: m_regA = MemReadByte(m_regBC); ! 1053: break; ! 1054: ! 1055: case 0x0B: // dec_bc ! 1056: cCycles -= 6; ! 1057: m_regBC--; ! 1058: break; ! 1059: ! 1060: case 0x0C: // inc_c ! 1061: cCycles -= 4; ! 1062: m_regC = Inc(m_regC); ! 1063: break; ! 1064: ! 1065: case 0x0D: // dec_c ! 1066: cCycles -= 4; ! 1067: m_regC = Dec(m_regC); ! 1068: break; ! 1069: ! 1070: case 0x0E: // ld_c_byte ! 1071: cCycles -= 7; ! 1072: m_regC = ImmedByte(); ! 1073: break; ! 1074: ! 1075: case 0x0F: // rrca ! 1076: cCycles -= 4; ! 1077: Rrca(); ! 1078: break; ! 1079: ! 1080: case 0x10: // djnz ! 1081: cCycles -= 8; ! 1082: cCycles -= Jr0(--m_regB); ! 1083: break; ! 1084: ! 1085: case 0x11: // ld_de_word ! 1086: cCycles -= 10; ! 1087: m_regDE = ImmedWord(); ! 1088: break; ! 1089: ! 1090: case 0x12: // ld_xde_a ! 1091: cCycles -= 7; ! 1092: MemWriteByte(m_regDE, m_regA); ! 1093: break; ! 1094: ! 1095: case 0x13: // inc_de ! 1096: cCycles -= 6; ! 1097: m_regDE++; ! 1098: break; ! 1099: ! 1100: case 0x14: // inc_d ! 1101: cCycles -= 4; ! 1102: m_regD = Inc(m_regD); ! 1103: break; ! 1104: ! 1105: case 0x15: // dec_d ! 1106: cCycles -= 4; ! 1107: m_regD = Dec(m_regD); ! 1108: break; ! 1109: ! 1110: case 0x16: // ld_d_byte ! 1111: cCycles -= 7; ! 1112: m_regD = ImmedByte(); ! 1113: break; ! 1114: ! 1115: case 0x17: // rla ! 1116: cCycles -= 4; ! 1117: Rla(); ! 1118: break; ! 1119: ! 1120: case 0x18: // jr ! 1121: { ! 1122: #if 0 ! 1123: cCycles -= Jr0(TRUE); ! 1124: #else ! 1125: // speedup technique adopted from Nicola's code in MAME to speedup ! 1126: // Galaga (the sound CPU spins with "loop: jr loop" waiting for ! 1127: // an interrupt). This technique is generic enough that is shouldn't ! 1128: // adversely effect other applications. ! 1129: ! 1130: signed char offset = (signed char)ImmedByte(); ! 1131: cCycles -= 7; ! 1132: cCycles -= 5; ! 1133: ! 1134: AdjustPC(offset); ! 1135: ! 1136: if (offset == -2) ! 1137: { ! 1138: // TRACE(__FILE__ ":jr (infinite loop) at %04X\n", GetPC()); ! 1139: goto z80ExecBottom; ! 1140: /* return (cCyclesArg - cCycles); */ ! 1141: } ! 1142: #endif ! 1143: break; ! 1144: } ! 1145: ! 1146: case 0x19: // add_hl_de ! 1147: cCycles -= 11; ! 1148: m_regHL = Add_2(m_regHL, m_regDE); ! 1149: break; ! 1150: ! 1151: case 0x1A: // ld_a_xde ! 1152: cCycles -= 7; ! 1153: m_regA = MemReadByte(m_regDE); ! 1154: break; ! 1155: ! 1156: case 0x1B: // dec_de ! 1157: cCycles -= 6; ! 1158: m_regDE--; ! 1159: break; ! 1160: ! 1161: case 0x1C: // inc_e ! 1162: cCycles -= 4; ! 1163: m_regE = Inc(m_regE); ! 1164: break; ! 1165: ! 1166: case 0x1D: // dec_e ! 1167: cCycles -= 4; ! 1168: m_regE = Dec(m_regE); ! 1169: break; ! 1170: ! 1171: case 0x1E: // ld_e_byte ! 1172: cCycles -= 7; ! 1173: m_regE = ImmedByte(); ! 1174: break; ! 1175: ! 1176: case 0x1F: // rra ! 1177: cCycles -= 4; ! 1178: Rra(); ! 1179: break; ! 1180: ! 1181: case 0x20: // jr_nz ! 1182: cCycles -= 7; ! 1183: cCycles -= Jr1(m_regF & Z_FLAG); ! 1184: break; ! 1185: ! 1186: case 0x21: // ld_hl_word ! 1187: cCycles -= 10; ! 1188: m_regHL = ImmedWord(); ! 1189: break; ! 1190: ! 1191: case 0x22: // ld_xword_hl ! 1192: cCycles -= 16; ! 1193: MemWriteWord(ImmedWord(), m_regHL); ! 1194: break; ! 1195: ! 1196: case 0x23: // inc_hl ! 1197: cCycles -= 6; ! 1198: m_regHL++; ! 1199: break; ! 1200: ! 1201: case 0x24: // inc_h ! 1202: cCycles -= 4; ! 1203: m_regH = Inc(m_regH); ! 1204: break; ! 1205: ! 1206: case 0x25: // dec_h ! 1207: cCycles -= 4; ! 1208: m_regH = Dec(m_regH); ! 1209: break; ! 1210: ! 1211: case 0x26: // ld_h_byte ! 1212: cCycles -= 7; ! 1213: m_regH = ImmedByte(); ! 1214: break; ! 1215: ! 1216: case 0x27: // daa ! 1217: { ! 1218: int i = m_regA; ! 1219: cCycles -= 4; ! 1220: if (m_regF&C_FLAG) i|=256; ! 1221: if (m_regF&H_FLAG) i|=512; ! 1222: if (m_regF&N_FLAG) i|=1024; ! 1223: m_regAF = DAATable[i]; ! 1224: break; ! 1225: } ! 1226: ! 1227: case 0x28: // jr_z ! 1228: cCycles -= 7; ! 1229: cCycles -= Jr0(m_regF & Z_FLAG); ! 1230: break; ! 1231: ! 1232: case 0x29: // add_hl_hl ! 1233: cCycles -= 11; ! 1234: m_regHL = Add_2(m_regHL, m_regHL); ! 1235: break; ! 1236: ! 1237: case 0x2A: // ld_hl_xword ! 1238: cCycles -= 16; ! 1239: m_regHL = MemReadWord(ImmedWord()); ! 1240: break; ! 1241: ! 1242: case 0x2B: // dec_hl ! 1243: cCycles -= 6; ! 1244: m_regHL--; ! 1245: break; ! 1246: ! 1247: case 0x2C: // inc_l ! 1248: cCycles -= 4; ! 1249: m_regL = Inc(m_regL); ! 1250: break; ! 1251: ! 1252: case 0x2D: // dec_l ! 1253: cCycles -= 4; ! 1254: m_regL = Dec(m_regL); ! 1255: break; ! 1256: ! 1257: case 0x2E: // ld_l_byte ! 1258: cCycles -= 7; ! 1259: m_regL = ImmedByte(); ! 1260: break; ! 1261: ! 1262: case 0x2F: // cpl ! 1263: cCycles -= 4; ! 1264: m_regA ^= 0xFF; ! 1265: m_regF |= (H_FLAG | N_FLAG); ! 1266: break; ! 1267: ! 1268: case 0x30: // jr_nc ! 1269: cCycles -= 7; ! 1270: cCycles -= Jr1(m_regF & C_FLAG); ! 1271: break; ! 1272: ! 1273: case 0x31: // ld_sp_word ! 1274: cCycles -= 10; ! 1275: SetSP(ImmedWord()); ! 1276: break; ! 1277: ! 1278: case 0x32: // ld_xbyte_a ! 1279: cCycles -= 13; ! 1280: MemWriteByte(ImmedWord(), m_regA); ! 1281: break; ! 1282: ! 1283: case 0x33: // inc_sp ! 1284: cCycles -= 6; ! 1285: SetSP(GetSP() + 1); ! 1286: break; ! 1287: ! 1288: case 0x34: // inc_xhl ! 1289: cCycles -= 11; ! 1290: MemWriteByte(m_regHL, Inc(MemReadByte(m_regHL))); ! 1291: break; ! 1292: ! 1293: case 0x35: // dec_xhl ! 1294: cCycles -= 11; ! 1295: MemWriteByte(m_regHL, Dec(MemReadByte(m_regHL))); ! 1296: break; ! 1297: ! 1298: case 0x36: // ld_xhl_byte ! 1299: cCycles -= 10; ! 1300: MemWriteByte(m_regHL, ImmedByte()); ! 1301: break; ! 1302: ! 1303: case 0x37: // scf ! 1304: cCycles -= 4; ! 1305: m_regF = (m_regF & 0xEC) | C_FLAG; ! 1306: break; ! 1307: ! 1308: case 0x38: // jr_c ! 1309: cCycles -= 7; ! 1310: cCycles -= Jr0(m_regF & C_FLAG); ! 1311: break; ! 1312: ! 1313: case 0x39: // add_hl_sp ! 1314: cCycles -= 11; ! 1315: m_regHL = Add_2(m_regHL, GetSP()); ! 1316: break; ! 1317: ! 1318: case 0x3A: // ld_a_xbyte ! 1319: cCycles -= 13; ! 1320: m_regA = MemReadByte(ImmedWord()); ! 1321: break; ! 1322: ! 1323: case 0x3B: // dec_sp ! 1324: cCycles -= 6; ! 1325: SetSP(GetSP() - 1); ! 1326: break; ! 1327: ! 1328: case 0x3C: // inc_a ! 1329: cCycles -= 4; ! 1330: m_regA = Inc(m_regA); ! 1331: break; ! 1332: ! 1333: case 0x3D: // dec_a ! 1334: cCycles -= 4; ! 1335: m_regA = Dec(m_regA); ! 1336: break; ! 1337: ! 1338: case 0x3E: // ld_a_byte ! 1339: cCycles -= 7; ! 1340: m_regA = ImmedByte(); ! 1341: break; ! 1342: ! 1343: case 0x3F: // ccf ! 1344: cCycles -= 4; ! 1345: m_regF =((m_regF & 0xED)|((m_regF & 1)<<4))^1; ! 1346: break; ! 1347: ! 1348: case 0x40: // ld_b_b ! 1349: cCycles -= 4; ! 1350: m_regB = m_regB; ! 1351: break; ! 1352: ! 1353: case 0x41: // ld_b_c ! 1354: cCycles -= 4; ! 1355: m_regB = m_regC; ! 1356: break; ! 1357: ! 1358: case 0x42: // ld_b_d ! 1359: cCycles -= 4; ! 1360: m_regB = m_regD; ! 1361: break; ! 1362: ! 1363: case 0x43: // ld_b_e ! 1364: cCycles -= 4; ! 1365: m_regB = m_regE; ! 1366: break; ! 1367: ! 1368: case 0x44: // ld_b_h ! 1369: cCycles -= 4; ! 1370: m_regB = m_regH; ! 1371: break; ! 1372: ! 1373: case 0x45: // ld_b_l ! 1374: cCycles -= 4; ! 1375: m_regB = m_regL; ! 1376: break; ! 1377: ! 1378: case 0x46: // ld_b_xhl ! 1379: cCycles -= 7; ! 1380: m_regB = MemReadByte(m_regHL); ! 1381: break; ! 1382: ! 1383: case 0x47: // ld_b_a ! 1384: cCycles -= 4; ! 1385: m_regB = m_regA; ! 1386: break; ! 1387: ! 1388: case 0x48: // ld_c_b ! 1389: cCycles -= 4; ! 1390: m_regC = m_regB; ! 1391: break; ! 1392: ! 1393: case 0x49: // ld_c_c ! 1394: cCycles -= 4; ! 1395: m_regC = m_regC; ! 1396: break; ! 1397: ! 1398: case 0x4A: // ld_c_d ! 1399: cCycles -= 4; ! 1400: m_regC = m_regD; ! 1401: break; ! 1402: ! 1403: case 0x4B: // ld_c_e ! 1404: cCycles -= 4; ! 1405: m_regC = m_regE; ! 1406: break; ! 1407: ! 1408: case 0x4C: // ld_c_h ! 1409: cCycles -= 4; ! 1410: m_regC = m_regH; ! 1411: break; ! 1412: ! 1413: case 0x4D: // ld_c_l ! 1414: cCycles -= 4; ! 1415: m_regC = m_regL; ! 1416: break; ! 1417: ! 1418: case 0x4E: // ld_c_xhl ! 1419: cCycles -= 7; ! 1420: m_regC = MemReadByte(m_regHL); ! 1421: break; ! 1422: ! 1423: case 0x4F: // ld_c_a ! 1424: cCycles -= 4; ! 1425: m_regC = m_regA; ! 1426: break; ! 1427: ! 1428: case 0x50: // ld_d_b ! 1429: cCycles -= 4; ! 1430: m_regD = m_regB; ! 1431: break; ! 1432: ! 1433: case 0x51: // ld_d_c ! 1434: cCycles -= 4; ! 1435: m_regD = m_regC; ! 1436: break; ! 1437: ! 1438: case 0x52: // ld_d_d ! 1439: cCycles -= 4; ! 1440: m_regD = m_regD; ! 1441: break; ! 1442: ! 1443: case 0x53: // ld_d_e ! 1444: cCycles -= 4; ! 1445: m_regD = m_regE; ! 1446: break; ! 1447: ! 1448: case 0x54: // ld_d_h ! 1449: cCycles -= 4; ! 1450: m_regD = m_regH; ! 1451: break; ! 1452: ! 1453: case 0x55: // ld_d_l ! 1454: cCycles -= 4; ! 1455: m_regD = m_regL; ! 1456: break; ! 1457: ! 1458: case 0x56: // ld_d_xhl ! 1459: cCycles -= 7; ! 1460: m_regD = MemReadByte(m_regHL); ! 1461: break; ! 1462: ! 1463: case 0x57: // ld_d_a ! 1464: cCycles -= 4; ! 1465: m_regD = m_regA; ! 1466: break; ! 1467: ! 1468: case 0x58: // ld_e_b ! 1469: cCycles -= 4; ! 1470: m_regE = m_regB; ! 1471: break; ! 1472: ! 1473: case 0x59: // ld_e_c ! 1474: cCycles -= 4; ! 1475: m_regE = m_regC; ! 1476: break; ! 1477: ! 1478: case 0x5A: // ld_e_d ! 1479: cCycles -= 4; ! 1480: m_regE = m_regD; ! 1481: break; ! 1482: ! 1483: case 0x5B: // ld_e_e ! 1484: cCycles -= 4; ! 1485: m_regE = m_regE; ! 1486: break; ! 1487: ! 1488: case 0x5C: // ld_e_h ! 1489: cCycles -= 4; ! 1490: m_regE = m_regH; ! 1491: break; ! 1492: ! 1493: case 0x5D: // ld_e_l ! 1494: cCycles -= 4; ! 1495: m_regE = m_regL; ! 1496: break; ! 1497: ! 1498: case 0x5E: // ld_e_xhl ! 1499: cCycles -= 7; ! 1500: m_regE = MemReadByte(m_regHL); ! 1501: break; ! 1502: ! 1503: case 0x5F: // ld_e_a ! 1504: cCycles -= 4; ! 1505: m_regE = m_regA; ! 1506: break; ! 1507: ! 1508: case 0x60: // ld_h_b ! 1509: cCycles -= 4; ! 1510: m_regH = m_regB; ! 1511: break; ! 1512: ! 1513: case 0x61: // ld_h_c ! 1514: cCycles -= 4; ! 1515: m_regH = m_regC; ! 1516: break; ! 1517: ! 1518: case 0x62: // ld_h_d ! 1519: cCycles -= 4; ! 1520: m_regH = m_regD; ! 1521: break; ! 1522: ! 1523: case 0x63: // ld_h_e ! 1524: cCycles -= 4; ! 1525: m_regH = m_regE; ! 1526: break; ! 1527: ! 1528: case 0x64: // ld_h_h ! 1529: cCycles -= 4; ! 1530: m_regH = m_regH; ! 1531: break; ! 1532: ! 1533: case 0x65: // ld_h_l ! 1534: cCycles -= 4; ! 1535: m_regH = m_regL; ! 1536: break; ! 1537: ! 1538: case 0x66: // ld_h_xhl ! 1539: cCycles -= 7; ! 1540: m_regH = MemReadByte(m_regHL); ! 1541: break; ! 1542: ! 1543: case 0x67: // ld_h_a ! 1544: cCycles -= 4; ! 1545: m_regH = m_regA; ! 1546: break; ! 1547: ! 1548: case 0x68: // ld_l_b ! 1549: cCycles -= 4; ! 1550: m_regL = m_regB; ! 1551: break; ! 1552: ! 1553: case 0x69: // ld_l_c ! 1554: cCycles -= 4; ! 1555: m_regL = m_regC; ! 1556: break; ! 1557: ! 1558: case 0x6A: // ld_l_d ! 1559: cCycles -= 4; ! 1560: m_regL = m_regD; ! 1561: break; ! 1562: ! 1563: case 0x6B: // ld_l_e ! 1564: cCycles -= 4; ! 1565: m_regL = m_regE; ! 1566: break; ! 1567: ! 1568: case 0x6C: // ld_l_h ! 1569: cCycles -= 4; ! 1570: m_regL = m_regH; ! 1571: break; ! 1572: ! 1573: case 0x6D: // ld_l_l ! 1574: cCycles -= 4; ! 1575: m_regL = m_regL; ! 1576: break; ! 1577: ! 1578: case 0x6E: // ld_l_xhl ! 1579: cCycles -= 7; ! 1580: m_regL = MemReadByte(m_regHL); ! 1581: break; ! 1582: ! 1583: case 0x6F: // ld_l_a ! 1584: cCycles -= 4; ! 1585: m_regL = m_regA; ! 1586: break; ! 1587: ! 1588: case 0x70: // ld_xhl_b ! 1589: cCycles -= 7; ! 1590: MemWriteByte(m_regHL, m_regB); ! 1591: break; ! 1592: ! 1593: case 0x71: // ld_xhl_c ! 1594: cCycles -= 7; ! 1595: MemWriteByte(m_regHL, m_regC); ! 1596: break; ! 1597: ! 1598: case 0x72: // ld_xhl_d ! 1599: cCycles -= 7; ! 1600: MemWriteByte(m_regHL, m_regD); ! 1601: break; ! 1602: ! 1603: case 0x73: // ld_xhl_e ! 1604: cCycles -= 7; ! 1605: MemWriteByte(m_regHL, m_regE); ! 1606: break; ! 1607: ! 1608: case 0x74: // ld_xhl_h ! 1609: cCycles -= 7; ! 1610: MemWriteByte(m_regHL, m_regH); ! 1611: break; ! 1612: ! 1613: case 0x75: // ld_xhl_l ! 1614: cCycles -= 7; ! 1615: MemWriteByte(m_regHL, m_regL); ! 1616: break; ! 1617: ! 1618: case 0x76: // halt ! 1619: cCycles -= 4; ! 1620: SetPC(GetPC() - 1); ! 1621: m_fHalt = TRUE; ! 1622: goto z80ExecBottom; ! 1623: /* return (cCyclesArg - cCycles); */ ! 1624: ! 1625: case 0x77: // ld_xhl_a ! 1626: cCycles -= 7; ! 1627: MemWriteByte(m_regHL, m_regA); ! 1628: break; ! 1629: ! 1630: case 0x78: // ld_a_b ! 1631: cCycles -= 4; ! 1632: m_regA = m_regB; ! 1633: break; ! 1634: ! 1635: case 0x79: // ld_a_c ! 1636: cCycles -= 4; ! 1637: m_regA = m_regC; ! 1638: break; ! 1639: ! 1640: case 0x7A: // ld_a_d ! 1641: cCycles -= 4; ! 1642: m_regA = m_regD; ! 1643: break; ! 1644: ! 1645: case 0x7B: // ld_a_e ! 1646: cCycles -= 4; ! 1647: m_regA = m_regE; ! 1648: break; ! 1649: ! 1650: case 0x7C: // ld_a_h ! 1651: cCycles -= 4; ! 1652: m_regA = m_regH; ! 1653: break; ! 1654: ! 1655: case 0x7D: // ld_a_l ! 1656: cCycles -= 4; ! 1657: m_regA = m_regL; ! 1658: break; ! 1659: ! 1660: case 0x7E: // ld_a_xhl ! 1661: cCycles -= 7; ! 1662: m_regA = MemReadByte(m_regHL); ! 1663: break; ! 1664: ! 1665: case 0x7F: // ld_a_a ! 1666: cCycles -= 4; ! 1667: m_regA = m_regA; ! 1668: break; ! 1669: ! 1670: case 0x80: // add_a_b ! 1671: cCycles -= 4; ! 1672: Add_1(m_regB); ! 1673: break; ! 1674: ! 1675: case 0x81: // add_a_c ! 1676: cCycles -= 4; ! 1677: Add_1(m_regC); ! 1678: break; ! 1679: ! 1680: case 0x82: // add_a_d ! 1681: cCycles -= 4; ! 1682: Add_1(m_regD); ! 1683: break; ! 1684: ! 1685: case 0x83: // add_a_e ! 1686: cCycles -= 4; ! 1687: Add_1(m_regE); ! 1688: break; ! 1689: ! 1690: case 0x84: // add_a_h ! 1691: cCycles -= 4; ! 1692: Add_1(m_regH); ! 1693: break; ! 1694: ! 1695: case 0x85: // add_a_l ! 1696: cCycles -= 4; ! 1697: Add_1(m_regL); ! 1698: break; ! 1699: ! 1700: case 0x86: // add_a_xhl ! 1701: cCycles -= 7; ! 1702: Add_1(MemReadByte(m_regHL)); ! 1703: break; ! 1704: ! 1705: case 0x87: // add_a_a ! 1706: cCycles -= 4; ! 1707: Add_1(m_regA); ! 1708: break; ! 1709: ! 1710: case 0x88: // adc_a_b ! 1711: cCycles -= 4; ! 1712: Adc_1(m_regB); ! 1713: break; ! 1714: ! 1715: case 0x89: // adc_a_c ! 1716: cCycles -= 4; ! 1717: Adc_1(m_regC); ! 1718: break; ! 1719: ! 1720: case 0x8A: // adc_a_d ! 1721: cCycles -= 4; ! 1722: Adc_1(m_regD); ! 1723: break; ! 1724: ! 1725: case 0x8B: // adc_a_e ! 1726: cCycles -= 4; ! 1727: Adc_1(m_regE); ! 1728: break; ! 1729: ! 1730: case 0x8C: // adc_a_h ! 1731: cCycles -= 4; ! 1732: Adc_1(m_regH); ! 1733: break; ! 1734: ! 1735: case 0x8D: // adc_a_l ! 1736: cCycles -= 4; ! 1737: Adc_1(m_regL); ! 1738: break; ! 1739: ! 1740: case 0x8E: // adc_a_xhl ! 1741: cCycles -= 7; ! 1742: Adc_1(MemReadByte(m_regHL)); ! 1743: break; ! 1744: ! 1745: case 0x8F: // adc_a_a ! 1746: cCycles -= 4; ! 1747: Adc_1(m_regA); ! 1748: break; ! 1749: ! 1750: case 0x90: // sub_b ! 1751: cCycles -= 4; ! 1752: Sub_1(m_regB); ! 1753: break; ! 1754: ! 1755: case 0x91: // sub_c ! 1756: cCycles -= 4; ! 1757: Sub_1(m_regC); ! 1758: break; ! 1759: ! 1760: case 0x92: // sub_d ! 1761: cCycles -= 4; ! 1762: Sub_1(m_regD); ! 1763: break; ! 1764: ! 1765: case 0x93: // sub_e ! 1766: cCycles -= 4; ! 1767: Sub_1(m_regE); ! 1768: break; ! 1769: ! 1770: case 0x94: // sub_h ! 1771: cCycles -= 4; ! 1772: Sub_1(m_regH); ! 1773: break; ! 1774: ! 1775: case 0x95: // sub_l ! 1776: cCycles -= 4; ! 1777: Sub_1(m_regL); ! 1778: break; ! 1779: ! 1780: case 0x96: // sub_xhl ! 1781: cCycles -= 7; ! 1782: Sub_1(MemReadByte(m_regHL)); ! 1783: break; ! 1784: ! 1785: case 0x97: // sub_a ! 1786: cCycles -= 4; ! 1787: Sub_1(m_regA); ! 1788: break; ! 1789: ! 1790: case 0x98: // sbc_a_b ! 1791: cCycles -= 4; ! 1792: Sbc_1(m_regB); ! 1793: break; ! 1794: ! 1795: case 0x99: // sbc_a_c ! 1796: cCycles -= 4; ! 1797: Sbc_1(m_regC); ! 1798: break; ! 1799: ! 1800: case 0x9A: // sbc_a_d ! 1801: cCycles -= 4; ! 1802: Sbc_1(m_regD); ! 1803: break; ! 1804: ! 1805: case 0x9B: // sbc_a_e ! 1806: cCycles -= 4; ! 1807: Sbc_1(m_regE); ! 1808: break; ! 1809: ! 1810: case 0x9C: // sbc_a_h ! 1811: cCycles -= 4; ! 1812: Sbc_1(m_regH); ! 1813: break; ! 1814: ! 1815: case 0x9D: // sbc_a_l ! 1816: cCycles -= 4; ! 1817: Sbc_1(m_regL); ! 1818: break; ! 1819: ! 1820: case 0x9E: // sbc_a_xhl ! 1821: cCycles -= 7; ! 1822: Sbc_1(MemReadByte(m_regHL)); ! 1823: break; ! 1824: ! 1825: case 0x9F: // sbc_a_a ! 1826: cCycles -= 4; ! 1827: Sbc_1(m_regA); ! 1828: break; ! 1829: ! 1830: case 0xA0: // and_b ! 1831: cCycles -= 4; ! 1832: And(m_regB); ! 1833: break; ! 1834: ! 1835: case 0xA1: // and_c ! 1836: cCycles -= 4; ! 1837: And(m_regC); ! 1838: break; ! 1839: ! 1840: case 0xA2: // and_d ! 1841: cCycles -= 4; ! 1842: And(m_regD); ! 1843: break; ! 1844: ! 1845: case 0xA3: // and_e ! 1846: cCycles -= 4; ! 1847: And(m_regE); ! 1848: break; ! 1849: ! 1850: case 0xA4: // and_h ! 1851: cCycles -= 4; ! 1852: And(m_regH); ! 1853: break; ! 1854: ! 1855: case 0xA5: // and_l ! 1856: cCycles -= 4; ! 1857: And(m_regL); ! 1858: break; ! 1859: ! 1860: case 0xA6: // and_xhl ! 1861: cCycles -= 7; ! 1862: And(MemReadByte(m_regHL)); ! 1863: break; ! 1864: ! 1865: case 0xA7: // and_a ! 1866: cCycles -= 4; ! 1867: And(m_regA); ! 1868: break; ! 1869: ! 1870: case 0xA8: // xor_b ! 1871: cCycles -= 4; ! 1872: Xor(m_regB); ! 1873: break; ! 1874: ! 1875: case 0xA9: // xor_c ! 1876: cCycles -= 4; ! 1877: Xor(m_regC); ! 1878: break; ! 1879: ! 1880: case 0xAA: // xor_d ! 1881: cCycles -= 4; ! 1882: Xor(m_regD); ! 1883: break; ! 1884: ! 1885: case 0xAB: // xor_e ! 1886: cCycles -= 4; ! 1887: Xor(m_regE); ! 1888: break; ! 1889: ! 1890: case 0xAC: // xor_h ! 1891: cCycles -= 4; ! 1892: Xor(m_regH); ! 1893: break; ! 1894: ! 1895: case 0xAD: // xor_l ! 1896: cCycles -= 4; ! 1897: Xor(m_regL); ! 1898: break; ! 1899: ! 1900: case 0xAE: // xor_xhl ! 1901: cCycles -= 7; ! 1902: Xor(MemReadByte(m_regHL)); ! 1903: break; ! 1904: ! 1905: case 0xAF: // xor_a ! 1906: cCycles -= 4; ! 1907: Xor(m_regA); ! 1908: break; ! 1909: ! 1910: case 0xB0: // or_b ! 1911: cCycles -= 4; ! 1912: Or(m_regB); ! 1913: break; ! 1914: ! 1915: case 0xB1: // or_c ! 1916: cCycles -= 4; ! 1917: Or(m_regC); ! 1918: break; ! 1919: ! 1920: case 0xB2: // or_d ! 1921: cCycles -= 4; ! 1922: Or(m_regD); ! 1923: break; ! 1924: ! 1925: case 0xB3: // or_e ! 1926: cCycles -= 4; ! 1927: Or(m_regE); ! 1928: break; ! 1929: ! 1930: case 0xB4: // or_h ! 1931: cCycles -= 4; ! 1932: Or(m_regH); ! 1933: break; ! 1934: ! 1935: case 0xB5: // or_l ! 1936: cCycles -= 4; ! 1937: Or(m_regL); ! 1938: break; ! 1939: ! 1940: case 0xB6: // or_xhl ! 1941: cCycles -= 7; ! 1942: Or(MemReadByte(m_regHL)); ! 1943: break; ! 1944: ! 1945: case 0xB7: // or_a ! 1946: cCycles -= 4; ! 1947: Or(m_regA); ! 1948: break; ! 1949: ! 1950: case 0xB8: // cp_b ! 1951: cCycles -= 4; ! 1952: Cp(m_regB); ! 1953: break; ! 1954: ! 1955: case 0xB9: // cp_c ! 1956: cCycles -= 4; ! 1957: Cp(m_regC); ! 1958: break; ! 1959: ! 1960: case 0xBA: // cp_d ! 1961: cCycles -= 4; ! 1962: Cp(m_regD); ! 1963: break; ! 1964: ! 1965: case 0xBB: // cp_e ! 1966: cCycles -= 4; ! 1967: Cp(m_regE); ! 1968: break; ! 1969: ! 1970: case 0xBC: // cp_h ! 1971: cCycles -= 4; ! 1972: Cp(m_regH); ! 1973: break; ! 1974: ! 1975: case 0xBD: // cp_l ! 1976: cCycles -= 4; ! 1977: Cp(m_regL); ! 1978: break; ! 1979: ! 1980: case 0xBE: // cp_xhl ! 1981: cCycles -= 7; ! 1982: Cp(MemReadByte(m_regHL)); ! 1983: break; ! 1984: ! 1985: case 0xBF: // cp_a ! 1986: cCycles -= 4; ! 1987: Cp(m_regA); ! 1988: break; ! 1989: ! 1990: case 0xC0: // ret_nz ! 1991: cCycles -= 5; ! 1992: cCycles -= Ret1(m_regF & Z_FLAG); ! 1993: break; ! 1994: ! 1995: case 0xC1: // pop_bc ! 1996: cCycles -= 10; ! 1997: m_regBC = Pop(); ! 1998: break; ! 1999: ! 2000: case 0xC2: // jp_nz ! 2001: cCycles -= 10; ! 2002: cCycles -= Jp1(m_regF & Z_FLAG); ! 2003: break; ! 2004: ! 2005: case 0xC3: // jp ! 2006: cCycles -= 10; ! 2007: #if 0 ! 2008: Jp0(TRUE); ! 2009: #else ! 2010: { ! 2011: // speedup hack for Galaga adopted from MAME... ! 2012: ! 2013: WORD w = ImmedWord(); ! 2014: WORD wPc = GetPC(); ! 2015: ! 2016: SetPC(w); ! 2017: ! 2018: // removed since Galaga never hit it (maybe 1942 will), and it ! 2019: // caused the slowdown in Time Pilot and Gyruss hiscore bug ! 2020: // it isn't correct anyway since "0085 jp 0088" causes is to return (Gyruss) ! 2021: // shouldn't it be if (w == wPC - 3)??? ! 2022: // jul-26-97 eam ! 2023: ! 2024: /* ! 2025: if (w == wPc) ! 2026: { ! 2027: // TRACE(__FILE__ ":jp (infinite loop) at %04X\n", GetPC()); ! 2028: return (cCyclesArg - cCycles); ! 2029: } ! 2030: else */ ! 2031: if (w == wPc - 6) // attn: very Galaga specific!!!! should be done in MageX by patching ROMs with HALTs (once I figure out how to fool the ROM check at bootup) ! 2032: { ! 2033: if (*m_rgbOpcode == 0x31) ! 2034: { ! 2035: // TRACE(__FILE__ ":jp (ld sp,#xxxx) at %04X\n", GetPC()); ! 2036: goto z80ExecBottom; ! 2037: /* return (cCyclesArg - cCycles); */ ! 2038: } ! 2039: } ! 2040: } ! 2041: #endif ! 2042: break; ! 2043: ! 2044: case 0xC4: // call_nz ! 2045: cCycles -= 10; ! 2046: cCycles -= Call1(m_regF & Z_FLAG); ! 2047: break; ! 2048: ! 2049: case 0xC5: // push_bc ! 2050: cCycles -= 11; ! 2051: Push(m_regBC); ! 2052: break; ! 2053: ! 2054: case 0xC6: // add_a_byte ! 2055: cCycles -= 7; ! 2056: Add_1(ImmedByte()); ! 2057: break; ! 2058: ! 2059: case 0xC7: // rst_00 ! 2060: cCycles -= 11; ! 2061: Rst(0x00); ! 2062: break; ! 2063: ! 2064: case 0xC8: // ret_z ! 2065: cCycles -= 5; ! 2066: cCycles -= Ret0(m_regF & Z_FLAG); ! 2067: break; ! 2068: ! 2069: case 0xC9: // ret ! 2070: cCycles -= 4; ! 2071: cCycles -= Ret0(TRUE); ! 2072: break; ! 2073: ! 2074: case 0xCA: // jp_z ! 2075: cCycles -= 10; ! 2076: cCycles -= Jp0(m_regF & Z_FLAG); ! 2077: break; ! 2078: ! 2079: case 0xCB: // cb ! 2080: cCycles -= HandleCB(); ! 2081: break; ! 2082: ! 2083: case 0xCC: // call_z ! 2084: cCycles -= 10; ! 2085: cCycles -= Call0(m_regF & Z_FLAG); ! 2086: break; ! 2087: ! 2088: case 0xCD: // call ! 2089: cCycles -= 10; ! 2090: cCycles -= Call0(TRUE); ! 2091: break; ! 2092: ! 2093: case 0xCE: // adc_a_byte ! 2094: cCycles -= 7; ! 2095: Adc_1(ImmedByte()); ! 2096: break; ! 2097: ! 2098: case 0xCF: // rst_08 ! 2099: cCycles -= 11; ! 2100: Rst(0x08); ! 2101: break; ! 2102: ! 2103: case 0xD0: // ret_nc ! 2104: cCycles -= 5; ! 2105: cCycles -= Ret1(m_regF & C_FLAG); ! 2106: break; ! 2107: ! 2108: case 0xD1: // pop_de ! 2109: cCycles -= 10; ! 2110: m_regDE = Pop(); ! 2111: break; ! 2112: ! 2113: case 0xD2: // jp_nc ! 2114: cCycles -= 10; ! 2115: cCycles -= Jp1(m_regF & C_FLAG); ! 2116: break; ! 2117: ! 2118: case 0xD3: // out_byte_a ! 2119: cCycles -= 11; ! 2120: Out(ImmedByte(), m_regA); ! 2121: break; ! 2122: ! 2123: case 0xD4: // call_nc ! 2124: cCycles -= 10; ! 2125: cCycles -= Call1(m_regF & C_FLAG); ! 2126: break; ! 2127: ! 2128: case 0xD5: // push_de ! 2129: cCycles -= 11; ! 2130: Push(m_regDE); ! 2131: break; ! 2132: ! 2133: case 0xD6: // sub_byte ! 2134: { ! 2135: cCycles -= 7; ! 2136: Sub_1(ImmedByte()); ! 2137: break; ! 2138: } ! 2139: ! 2140: case 0xD7: // rst_10 ! 2141: cCycles -= 11; ! 2142: Rst(0x10); ! 2143: break; ! 2144: ! 2145: case 0xD8: // ret_c ! 2146: cCycles -= 5; ! 2147: cCycles -= Ret0(m_regF & C_FLAG); ! 2148: break; ! 2149: ! 2150: case 0xD9: // exx ! 2151: cCycles -= 4; ! 2152: Exx(); ! 2153: break; ! 2154: ! 2155: case 0xDA: // jp_c ! 2156: cCycles -= 10; ! 2157: cCycles -= Jp0(m_regF & C_FLAG); ! 2158: break; ! 2159: ! 2160: case 0xDB: // in_a_byte ! 2161: { ! 2162: BYTE bPort = ImmedByte(); ! 2163: cCycles -= 11; ! 2164: m_regA = InRaw ( bPort ); ! 2165: break; ! 2166: } ! 2167: ! 2168: case 0xDC: // call_c ! 2169: cCycles -= 10; ! 2170: cCycles -= Call0(m_regF & C_FLAG); ! 2171: break; ! 2172: ! 2173: case 0xDD: // dd ! 2174: cCycles -= HandleDD(); ! 2175: break; ! 2176: ! 2177: case 0xDE: // sbc_a_byte ! 2178: cCycles -= 7; ! 2179: Sbc_1(ImmedByte()); ! 2180: break; ! 2181: ! 2182: case 0xDF: // rst_18 ! 2183: cCycles -= 11; ! 2184: Rst(0x18); ! 2185: break; ! 2186: ! 2187: case 0xE0: // ret_po ! 2188: cCycles -= 5; ! 2189: cCycles -= Ret1(m_regF & V_FLAG); ! 2190: break; ! 2191: ! 2192: case 0xE1: // pop_hl ! 2193: cCycles -= 10; ! 2194: m_regHL = Pop(); ! 2195: break; ! 2196: ! 2197: case 0xE2: // jp_po ! 2198: cCycles -= 10; ! 2199: cCycles -= Jp1(m_regF & V_FLAG); ! 2200: break; ! 2201: ! 2202: case 0xE3: // ex_xsp_hl ! 2203: cCycles -= 19; ! 2204: { ! 2205: int i = MemReadWord(GetSP()); ! 2206: MemWriteWord(GetSP(), m_regHL); ! 2207: m_regHL = i; ! 2208: break; ! 2209: } ! 2210: ! 2211: case 0xE4: // call_po ! 2212: cCycles -= 10; ! 2213: cCycles -= Call1(m_regF & V_FLAG); ! 2214: break; ! 2215: ! 2216: case 0xE5: // push_hl ! 2217: cCycles -= 11; ! 2218: Push(m_regHL); ! 2219: break; ! 2220: ! 2221: case 0xE6: // and_byte ! 2222: cCycles -= 7; ! 2223: And(ImmedByte()); ! 2224: break; ! 2225: ! 2226: case 0xE7: // rst_20 ! 2227: cCycles -= 11; ! 2228: Rst(0x20); ! 2229: break; ! 2230: ! 2231: case 0xE8: // ret_pe ! 2232: cCycles -= 5; ! 2233: cCycles -= Ret0(m_regF & V_FLAG); ! 2234: break; ! 2235: ! 2236: case 0xE9: // jp_hl ! 2237: cCycles -= 4; ! 2238: SetPC(m_regHL); ! 2239: break; ! 2240: ! 2241: case 0xEA: // jp_pe ! 2242: cCycles -= 10; ! 2243: cCycles -= Jp0(m_regF & V_FLAG); ! 2244: break; ! 2245: ! 2246: case 0xEB: // ex_de_hl ! 2247: cCycles -= 4; ! 2248: swap(m_regDE, m_regHL); ! 2249: break; ! 2250: ! 2251: case 0xEC: // call_pe ! 2252: cCycles -= 10; ! 2253: cCycles -= Call0(m_regF & V_FLAG); ! 2254: break; ! 2255: ! 2256: case 0xED: // ed ! 2257: cCycles -= HandleED(cCycles); ! 2258: break; ! 2259: ! 2260: case 0xEE: // xor_byte ! 2261: cCycles -= 7; ! 2262: Xor(ImmedByte()); ! 2263: break; ! 2264: ! 2265: case 0xEF: // rst_28 ! 2266: cCycles -= 11; ! 2267: Rst(0x28); ! 2268: break; ! 2269: ! 2270: case 0xF0: // ret_p ! 2271: cCycles -= 5; ! 2272: cCycles -= Ret1(m_regF & S_FLAG); ! 2273: break; ! 2274: ! 2275: case 0xF1: // pop_af ! 2276: cCycles -= 10; ! 2277: m_regAF = Pop(); ! 2278: break; ! 2279: ! 2280: case 0xF2: // jp_p ! 2281: cCycles -= 10; ! 2282: cCycles -= Jp1(m_regF & S_FLAG); ! 2283: break; ! 2284: ! 2285: case 0xF3: // di ! 2286: cCycles -= 4; ! 2287: Di(); ! 2288: break; ! 2289: ! 2290: case 0xF4: // call_p ! 2291: cCycles -= 10; ! 2292: cCycles -= Call1(m_regF & S_FLAG); ! 2293: break; ! 2294: ! 2295: case 0xF5: // push_af ! 2296: cCycles -= 11; ! 2297: Push(m_regAF); ! 2298: break; ! 2299: ! 2300: case 0xF6: // or_byte ! 2301: cCycles -= 7; ! 2302: Or(ImmedByte()); ! 2303: break; ! 2304: ! 2305: case 0xF7: // rst_30 ! 2306: cCycles -= 11; ! 2307: Rst(0x30); ! 2308: break; ! 2309: ! 2310: case 0xF8: // ret_m ! 2311: cCycles -= 5; ! 2312: cCycles -= Ret0(m_regF & S_FLAG); ! 2313: break; ! 2314: ! 2315: case 0xF9: // ld_sp_hl ! 2316: cCycles -= 6; ! 2317: SetSP(m_regHL); ! 2318: break; ! 2319: ! 2320: case 0xFA: // jp_m ! 2321: cCycles -= 10; ! 2322: cCycles -= Jp0(m_regF & S_FLAG); ! 2323: break; ! 2324: ! 2325: case 0xFB: // ei ! 2326: cCycles -= 4; ! 2327: cCycles -= Ei(); ! 2328: // if (m_fPendingInterrupt) ! 2329: { ! 2330: // return (cCyclesArg - cCycles); ! 2331: } ! 2332: break; ! 2333: ! 2334: case 0xFC: // call_m ! 2335: cCycles -= 10; ! 2336: cCycles -= Call0(m_regF & S_FLAG); ! 2337: break; ! 2338: ! 2339: case 0xFD: // fd ! 2340: cCycles -= HandleFD(); ! 2341: break; ! 2342: ! 2343: case 0xFE: // cp_byte ! 2344: cCycles -= 7; ! 2345: Cp(ImmedByte()); ! 2346: break; ! 2347: ! 2348: case 0xFF: // rst_38 ! 2349: cCycles -= 11; ! 2350: Rst(0x38); ! 2351: break; ! 2352: ! 2353: default: ! 2354: assert(FALSE); ! 2355: break; ! 2356: } ! 2357: } ! 2358: ! 2359: z80ExecBottom: ! 2360: z80pc = GetPC(); /* for some of the platforms */ ! 2361: dwElapsedTicks = origElapsedTicks + (cCyclesArg - cCycles); ! 2362: return ( 0x80000000 ); ! 2363: } ! 2364: ! 2365: UINT32 mz80int ( UINT32 bVal ) { ! 2366: if (m_iff1 == 0) // is IRQ disabled? ! 2367: return 0xffffffff; // Interrupt not taken! ! 2368: ! 2369: m_fPendingInterrupt = FALSE; ! 2370: ! 2371: m_iff1 = 0; ! 2372: ! 2373: if (m_fHalt) ! 2374: { ! 2375: SetPC(GetPC() + 1); ! 2376: m_fHalt = FALSE; ! 2377: } ! 2378: ! 2379: if (0 == m_nIM || 1 == m_nIM) ! 2380: { ! 2381: Rst(z80intAddr); ! 2382: return(0); // We took the interrupt ! 2383: } ! 2384: ! 2385: Push(GetPC()); ! 2386: SetPC(MemReadWord(MAKEWORD(bVal, m_regI))); ! 2387: ! 2388: return(0); // fix-me ! 2389: } ! 2390: ! 2391: UINT32 mz80nmi ( void ) { ! 2392: m_iff1 = 0; ! 2393: ! 2394: if (m_fHalt) ! 2395: { ! 2396: SetPC(GetPC() + 1); ! 2397: m_fHalt = FALSE; ! 2398: } ! 2399: ! 2400: Rst(z80nmiAddr); ! 2401: ! 2402: return(0); ! 2403: } ! 2404: ! 2405: /* *************************************************************************** ! 2406: * Flow of Control ! 2407: * *************************************************************************** ! 2408: */ ! 2409: ! 2410: /* inline */ int Jr0(int f) { ! 2411: if (f) ! 2412: { ! 2413: AdjustPC((signed char)ImmedByte()); ! 2414: return 5; ! 2415: } ! 2416: else ! 2417: { ! 2418: AdjustPC(1); ! 2419: return 0; ! 2420: } ! 2421: } ! 2422: ! 2423: /* inline */ int Jr1(int f) { ! 2424: if (f) ! 2425: { ! 2426: AdjustPC(1); ! 2427: return 0; ! 2428: } ! 2429: else ! 2430: { ! 2431: AdjustPC((signed char)ImmedByte()); ! 2432: return 5; ! 2433: } ! 2434: } ! 2435: ! 2436: /* inline */ int Call0(int f) { ! 2437: char string[150]; ! 2438: ! 2439: if (f) ! 2440: { ! 2441: WORD wAddr = ImmedWord(); ! 2442: Push(GetPC()); ! 2443: SetPC(wAddr); ! 2444: return 7; ! 2445: } ! 2446: else ! 2447: { ! 2448: AdjustPC(2); ! 2449: return 0; ! 2450: } ! 2451: } ! 2452: ! 2453: /* inline */ int Call1(int f) { ! 2454: if (f) ! 2455: { ! 2456: AdjustPC(2); ! 2457: return 0; ! 2458: } ! 2459: else ! 2460: { ! 2461: WORD wAddr = ImmedWord(); ! 2462: Push(GetPC()); ! 2463: SetPC(wAddr); ! 2464: return 7; ! 2465: } ! 2466: } ! 2467: ! 2468: /* inline */ int Jp0(int f) { ! 2469: if (f) ! 2470: { ! 2471: SetPC(ImmedWord()); ! 2472: return 0; // ???????????????? ! 2473: } ! 2474: else ! 2475: { ! 2476: AdjustPC(2); ! 2477: return 0; ! 2478: } ! 2479: } ! 2480: ! 2481: /* inline */ int Jp1(int f) { ! 2482: if (f) ! 2483: { ! 2484: AdjustPC(2); ! 2485: return 0; ! 2486: } ! 2487: else ! 2488: { ! 2489: SetPC(ImmedWord()); ! 2490: return 0; // ???????????????? ! 2491: } ! 2492: } ! 2493: ! 2494: /* inline */ void Rst(WORD wAddr) { ! 2495: Push(GetPC()); ! 2496: SetPC(wAddr); ! 2497: } ! 2498: ! 2499: /* *************************************************************************** ! 2500: * CB prefixed instructions ! 2501: * *************************************************************************** ! 2502: */ ! 2503: ! 2504: int HandleCB() { ! 2505: const BYTE bOpcode = ImmedByte(); ! 2506: m_regR++; ! 2507: ! 2508: switch (bOpcode) ! 2509: { ! 2510: case 0x00: // rlc_b ! 2511: m_regB = Rlc(m_regB); ! 2512: return 8; ! 2513: ! 2514: case 0x01: // rlc_c ! 2515: m_regC = Rlc(m_regC); ! 2516: return 8; ! 2517: ! 2518: case 0x02: // rlc_d ! 2519: m_regD = Rlc(m_regD); ! 2520: return 8; ! 2521: ! 2522: case 0x03: // rlc_e ! 2523: m_regE = Rlc(m_regE); ! 2524: return 8; ! 2525: ! 2526: case 0x04: // rlc_h ! 2527: m_regH = Rlc(m_regH); ! 2528: return 8; ! 2529: ! 2530: case 0x05: // rlc_l ! 2531: m_regL = Rlc(m_regL); ! 2532: return 8; ! 2533: ! 2534: case 0x06: // rlc_xhl ! 2535: MemWriteByte(m_regHL, Rlc(MemReadByte(m_regHL))); ! 2536: return 15; ! 2537: ! 2538: case 0x07: // rlc_a ! 2539: m_regA = Rlc(m_regA); ! 2540: return 8; ! 2541: ! 2542: case 0x08: // rrc_b ! 2543: m_regB = Rrc(m_regB); ! 2544: return 8; ! 2545: ! 2546: case 0x09: // rrc_c ! 2547: m_regC = Rrc(m_regC); ! 2548: return 8; ! 2549: ! 2550: case 0x0A: // rrc_d ! 2551: m_regD = Rrc(m_regD); ! 2552: return 8; ! 2553: ! 2554: case 0x0B: // rrc_e ! 2555: m_regE = Rrc(m_regE); ! 2556: return 8; ! 2557: ! 2558: case 0x0C: // rrc_h ! 2559: m_regH = Rrc(m_regH); ! 2560: return 8; ! 2561: ! 2562: case 0x0D: // rrc_l ! 2563: m_regL = Rrc(m_regL); ! 2564: return 8; ! 2565: ! 2566: case 0x0E: // rrc_xhl ! 2567: MemWriteByte(m_regHL, Rrc(MemReadByte(m_regHL))); ! 2568: return 15; ! 2569: ! 2570: case 0x0F: // rrc_a ! 2571: m_regA = Rrc(m_regA); ! 2572: return 8; ! 2573: ! 2574: case 0x10: // rl_b ! 2575: m_regB = Rl(m_regB); ! 2576: return 8; ! 2577: ! 2578: case 0x11: // rl_c ! 2579: m_regC = Rl(m_regC); ! 2580: return 8; ! 2581: ! 2582: case 0x12: // rl_d ! 2583: m_regD = Rl(m_regD); ! 2584: return 8; ! 2585: ! 2586: case 0x13: // rl_e ! 2587: m_regE = Rl(m_regE); ! 2588: return 8; ! 2589: ! 2590: case 0x14: // rl_h ! 2591: m_regH = Rl(m_regH); ! 2592: return 8; ! 2593: ! 2594: case 0x15: // rl_l ! 2595: m_regL = Rl(m_regL); ! 2596: return 8; ! 2597: ! 2598: case 0x16: // rl_xhl ! 2599: MemWriteByte(m_regHL, Rl(MemReadByte(m_regHL))); ! 2600: return 15; ! 2601: ! 2602: case 0x17: // rl_a ! 2603: m_regA = Rl(m_regA); ! 2604: return 8; ! 2605: ! 2606: case 0x18: // rr_b ! 2607: m_regB = Rr(m_regB); ! 2608: return 8; ! 2609: ! 2610: case 0x19: // rr_c ! 2611: m_regC = Rr(m_regC); ! 2612: return 8; ! 2613: ! 2614: case 0x1A: // rr_d ! 2615: m_regD = Rr(m_regD); ! 2616: return 8; ! 2617: ! 2618: case 0x1B: // rr_e ! 2619: m_regE = Rr(m_regE); ! 2620: return 8; ! 2621: ! 2622: case 0x1C: // rr_h ! 2623: m_regH = Rr(m_regH); ! 2624: return 8; ! 2625: ! 2626: case 0x1D: // rr_l ! 2627: m_regL = Rr(m_regL); ! 2628: return 8; ! 2629: ! 2630: case 0x1E: // rr_xhl ! 2631: MemWriteByte(m_regHL, Rr(MemReadByte(m_regHL))); ! 2632: return 15; ! 2633: ! 2634: case 0x1F: // rr_a ! 2635: m_regA = Rr(m_regA); ! 2636: return 8; ! 2637: ! 2638: case 0x20: // sla_b ! 2639: m_regB = Sla(m_regB); ! 2640: return 8; ! 2641: ! 2642: case 0x21: // sla_c ! 2643: m_regC = Sla(m_regC); ! 2644: return 8; ! 2645: ! 2646: case 0x22: // sla_d ! 2647: m_regD = Sla(m_regD); ! 2648: return 8; ! 2649: ! 2650: case 0x23: // sla_e ! 2651: m_regE = Sla(m_regE); ! 2652: return 8; ! 2653: ! 2654: case 0x24: // sla_h ! 2655: m_regH = Sla(m_regH); ! 2656: return 8; ! 2657: ! 2658: case 0x25: // sla_l ! 2659: m_regL = Sla(m_regL); ! 2660: return 8; ! 2661: ! 2662: case 0x26: // sla_xhl ! 2663: MemWriteByte(m_regHL, Sla(MemReadByte(m_regHL))); ! 2664: return 15; ! 2665: ! 2666: case 0x27: // sla_a ! 2667: m_regA = Sla(m_regA); ! 2668: return 8; ! 2669: ! 2670: case 0x28: // sra_b ! 2671: m_regB = Sra(m_regB); ! 2672: return 8; ! 2673: ! 2674: case 0x29: // sra_c ! 2675: m_regC = Sra(m_regC); ! 2676: return 8; ! 2677: ! 2678: case 0x2A: // sra_d ! 2679: m_regD = Sra(m_regD); ! 2680: return 8; ! 2681: ! 2682: case 0x2B: // sra_e ! 2683: m_regE = Sra(m_regE); ! 2684: return 8; ! 2685: ! 2686: case 0x2C: // sra_h ! 2687: m_regH = Sra(m_regH); ! 2688: return 8; ! 2689: ! 2690: case 0x2D: // sra_l ! 2691: m_regL = Sra(m_regL); ! 2692: return 8; ! 2693: ! 2694: case 0x2E: // sra_xhl ! 2695: MemWriteByte(m_regHL, Sra(MemReadByte(m_regHL))); ! 2696: return 15; ! 2697: ! 2698: case 0x2F: // sra_a ! 2699: m_regA = Sra(m_regA); ! 2700: return 8; ! 2701: ! 2702: case 0x30: // sll_b ! 2703: m_regB = Sll(m_regB); ! 2704: return 8; ! 2705: ! 2706: case 0x31: // sll_c ! 2707: m_regC = Sll(m_regC); ! 2708: return 8; ! 2709: ! 2710: case 0x32: // sll_d ! 2711: m_regD = Sll(m_regD); ! 2712: return 8; ! 2713: ! 2714: case 0x33: // sll_e ! 2715: m_regE = Sll(m_regE); ! 2716: return 8; ! 2717: ! 2718: case 0x34: // sll_h ! 2719: m_regH = Sll(m_regH); ! 2720: return 8; ! 2721: ! 2722: case 0x35: // sll_l ! 2723: m_regL = Sll(m_regL); ! 2724: return 8; ! 2725: ! 2726: case 0x36: // sll_xhl ! 2727: MemWriteByte(m_regHL, Sll(MemReadByte(m_regHL))); ! 2728: return 15; ! 2729: ! 2730: case 0x37: // sll_a ! 2731: m_regA = Sll(m_regA); ! 2732: return 8; ! 2733: ! 2734: case 0x38: // srl_b ! 2735: m_regB = Srl(m_regB); ! 2736: return 8; ! 2737: ! 2738: case 0x39: // srl_c ! 2739: m_regC = Srl(m_regC); ! 2740: return 8; ! 2741: ! 2742: case 0x3A: // srl_d ! 2743: m_regD = Srl(m_regD); ! 2744: return 8; ! 2745: ! 2746: case 0x3B: // srl_e ! 2747: m_regE = Srl(m_regE); ! 2748: return 8; ! 2749: ! 2750: case 0x3C: // srl_h ! 2751: m_regH = Srl(m_regH); ! 2752: return 8; ! 2753: ! 2754: case 0x3D: // srl_l ! 2755: m_regL = Srl(m_regL); ! 2756: return 8; ! 2757: ! 2758: case 0x3E: // srl_xhl ! 2759: MemWriteByte(m_regHL, Srl(MemReadByte(m_regHL))); ! 2760: return 15; ! 2761: ! 2762: case 0x3F: // srl_a ! 2763: m_regA = Srl(m_regA); ! 2764: return 8; ! 2765: ! 2766: case 0x40: // bit_0_b ! 2767: Bit(m_regB, 0); ! 2768: return 8; ! 2769: ! 2770: case 0x41: // bit_0_c ! 2771: Bit(m_regC, 0); ! 2772: return 8; ! 2773: ! 2774: case 0x42: // bit_0_d ! 2775: Bit(m_regD, 0); ! 2776: return 8; ! 2777: ! 2778: case 0x43: // bit_0_e ! 2779: Bit(m_regE, 0); ! 2780: return 8; ! 2781: ! 2782: case 0x44: // bit_0_h ! 2783: Bit(m_regH, 0); ! 2784: return 8; ! 2785: ! 2786: case 0x45: // bit_0_l ! 2787: Bit(m_regL, 0); ! 2788: return 8; ! 2789: ! 2790: case 0x46: // bit_0_xhl ! 2791: Bit(MemReadByte(m_regHL), 0); ! 2792: return 12; ! 2793: ! 2794: case 0x47: // bit_0_a ! 2795: Bit(m_regA, 0); ! 2796: return 8; ! 2797: ! 2798: case 0x48: // bit_1_b ! 2799: Bit(m_regB, 1); ! 2800: return 8; ! 2801: ! 2802: case 0x49: // bit_1_c ! 2803: Bit(m_regC, 1); ! 2804: return 8; ! 2805: ! 2806: case 0x4A: // bit_1_d ! 2807: Bit(m_regD, 1); ! 2808: return 8; ! 2809: ! 2810: case 0x4B: // bit_1_e ! 2811: Bit(m_regE, 1); ! 2812: return 8; ! 2813: ! 2814: case 0x4C: // bit_1_h ! 2815: Bit(m_regH, 1); ! 2816: return 8; ! 2817: ! 2818: case 0x4D: // bit_1_l ! 2819: Bit(m_regL, 1); ! 2820: return 8; ! 2821: ! 2822: case 0x4E: // bit_1_xhl ! 2823: Bit(MemReadByte(m_regHL), 1); ! 2824: return 12; ! 2825: ! 2826: case 0x4F: // bit_1_a ! 2827: Bit(m_regA, 1); ! 2828: return 8; ! 2829: ! 2830: case 0x50: // bit_2_b ! 2831: Bit(m_regB, 2); ! 2832: return 8; ! 2833: ! 2834: case 0x51: // bit_2_c ! 2835: Bit(m_regC, 2); ! 2836: return 8; ! 2837: ! 2838: case 0x52: // bit_2_d ! 2839: Bit(m_regD, 2); ! 2840: return 8; ! 2841: ! 2842: case 0x53: // bit_2_e ! 2843: Bit(m_regE, 2); ! 2844: return 8; ! 2845: ! 2846: case 0x54: // bit_2_h ! 2847: Bit(m_regH, 2); ! 2848: return 8; ! 2849: ! 2850: case 0x55: // bit_2_l ! 2851: Bit(m_regL, 2); ! 2852: return 8; ! 2853: ! 2854: case 0x56: // bit_2_xhl ! 2855: Bit(MemReadByte(m_regHL), 2); ! 2856: return 12; ! 2857: ! 2858: case 0x57: // bit_2_a ! 2859: Bit(m_regA, 2); ! 2860: return 8; ! 2861: ! 2862: case 0x58: // bit_3_b ! 2863: Bit(m_regB, 3); ! 2864: return 8; ! 2865: ! 2866: case 0x59: // bit_3_c ! 2867: Bit(m_regC, 3); ! 2868: return 8; ! 2869: ! 2870: case 0x5A: // bit_3_d ! 2871: Bit(m_regD, 3); ! 2872: return 8; ! 2873: ! 2874: case 0x5B: // bit_3_e ! 2875: Bit(m_regE, 3); ! 2876: return 8; ! 2877: ! 2878: case 0x5C: // bit_3_h ! 2879: Bit(m_regH, 3); ! 2880: return 8; ! 2881: ! 2882: case 0x5D: // bit_3_l ! 2883: Bit(m_regL, 3); ! 2884: return 8; ! 2885: ! 2886: case 0x5E: // bit_3_xhl ! 2887: Bit(MemReadByte(m_regHL), 3); ! 2888: return 12; ! 2889: ! 2890: case 0x5F: // bit_3_a ! 2891: Bit(m_regA, 3); ! 2892: return 8; ! 2893: ! 2894: case 0x60: // bit_4_b ! 2895: Bit(m_regB, 4); ! 2896: return 8; ! 2897: ! 2898: case 0x61: // bit_4_c ! 2899: Bit(m_regC, 4); ! 2900: return 8; ! 2901: ! 2902: case 0x62: // bit_4_d ! 2903: Bit(m_regD, 4); ! 2904: return 8; ! 2905: ! 2906: case 0x63: // bit_4_e ! 2907: Bit(m_regE, 4); ! 2908: return 8; ! 2909: ! 2910: case 0x64: // bit_4_h ! 2911: Bit(m_regH, 4); ! 2912: return 8; ! 2913: ! 2914: case 0x65: // bit_4_l ! 2915: Bit(m_regL, 4); ! 2916: return 8; ! 2917: ! 2918: case 0x66: // bit_4_xhl ! 2919: Bit(MemReadByte(m_regHL), 4); ! 2920: return 12; ! 2921: ! 2922: case 0x67: // bit_4_a ! 2923: Bit(m_regA, 4); ! 2924: return 8; ! 2925: ! 2926: case 0x68: // bit_5_b ! 2927: Bit(m_regB, 5); ! 2928: return 8; ! 2929: ! 2930: case 0x69: // bit_5_c ! 2931: Bit(m_regC, 5); ! 2932: return 8; ! 2933: ! 2934: case 0x6A: // bit_5_d ! 2935: Bit(m_regD, 5); ! 2936: return 8; ! 2937: ! 2938: case 0x6B: // bit_5_e ! 2939: Bit(m_regE, 5); ! 2940: return 8; ! 2941: ! 2942: case 0x6C: // bit_5_h ! 2943: Bit(m_regH, 5); ! 2944: return 8; ! 2945: ! 2946: case 0x6D: // bit_5_l ! 2947: Bit(m_regL, 5); ! 2948: return 8; ! 2949: ! 2950: case 0x6E: // bit_5_xhl ! 2951: Bit(MemReadByte(m_regHL), 5); ! 2952: return 12; ! 2953: ! 2954: case 0x6F: // bit_5_a ! 2955: Bit(m_regA, 5); ! 2956: return 8; ! 2957: ! 2958: case 0x70: // bit_6_b ! 2959: Bit(m_regB, 6); ! 2960: return 8; ! 2961: ! 2962: case 0x71: // bit_6_c ! 2963: Bit(m_regC, 6); ! 2964: return 8; ! 2965: ! 2966: case 0x72: // bit_6_d ! 2967: Bit(m_regD, 6); ! 2968: return 8; ! 2969: ! 2970: case 0x73: // bit_6_e ! 2971: Bit(m_regE, 6); ! 2972: return 8; ! 2973: ! 2974: case 0x74: // bit_6_h ! 2975: Bit(m_regH, 6); ! 2976: return 8; ! 2977: ! 2978: case 0x75: // bit_6_l ! 2979: Bit(m_regL, 6); ! 2980: return 8; ! 2981: ! 2982: case 0x76: // bit_6_xhl ! 2983: Bit(MemReadByte(m_regHL), 6); ! 2984: return 12; ! 2985: ! 2986: case 0x77: // bit_6_a ! 2987: Bit(m_regA, 6); ! 2988: return 8; ! 2989: ! 2990: case 0x78: // bit_7_b ! 2991: Bit(m_regB, 7); ! 2992: return 8; ! 2993: ! 2994: case 0x79: // bit_7_c ! 2995: Bit(m_regC, 7); ! 2996: return 8; ! 2997: ! 2998: case 0x7A: // bit_7_d ! 2999: Bit(m_regD, 7); ! 3000: return 8; ! 3001: ! 3002: case 0x7B: // bit_7_e ! 3003: Bit(m_regE, 7); ! 3004: return 8; ! 3005: ! 3006: case 0x7C: // bit_7_h ! 3007: Bit(m_regH, 7); ! 3008: return 8; ! 3009: ! 3010: case 0x7D: // bit_7_l ! 3011: Bit(m_regL, 7); ! 3012: return 8; ! 3013: ! 3014: case 0x7E: // bit_7_xhl ! 3015: Bit(MemReadByte(m_regHL), 7); ! 3016: return 12; ! 3017: ! 3018: case 0x7F: // bit_7_a ! 3019: Bit(m_regA, 7); ! 3020: return 8; ! 3021: ! 3022: case 0x80: // res_0_b ! 3023: m_regB = Res(m_regB, 0); ! 3024: return 8; ! 3025: ! 3026: case 0x81: // res_0_c ! 3027: m_regC = Res(m_regC, 0); ! 3028: return 8; ! 3029: ! 3030: case 0x82: // res_0_d ! 3031: m_regD = Res(m_regD, 0); ! 3032: return 8; ! 3033: ! 3034: case 0x83: // res_0_e ! 3035: m_regE = Res(m_regE, 0); ! 3036: return 8; ! 3037: ! 3038: case 0x84: // res_0_h ! 3039: m_regH = Res(m_regH, 0); ! 3040: return 8; ! 3041: ! 3042: case 0x85: // res_0_l ! 3043: m_regL = Res(m_regL, 0); ! 3044: return 8; ! 3045: ! 3046: case 0x86: // res_0_xhl ! 3047: MemWriteByte(m_regHL, Res(MemReadByte(m_regHL), 0)); ! 3048: return 15; ! 3049: ! 3050: case 0x87: // res_0_a ! 3051: m_regA = Res(m_regA, 0); ! 3052: return 8; ! 3053: ! 3054: case 0x88: // res_1_b ! 3055: m_regB = Res(m_regB ,1); ! 3056: return 8; ! 3057: ! 3058: case 0x89: // res_1_c ! 3059: m_regC = Res(m_regC, 1); ! 3060: return 8; ! 3061: ! 3062: case 0x8A: // res_1_d ! 3063: m_regD = Res(m_regD, 1); ! 3064: return 8; ! 3065: ! 3066: case 0x8B: // res_1_e ! 3067: m_regE = Res(m_regE, 1); ! 3068: return 8; ! 3069: ! 3070: case 0x8C: // res_1_h ! 3071: m_regH = Res(m_regH, 1); ! 3072: return 8; ! 3073: ! 3074: case 0x8D: // res_1_l ! 3075: m_regL = Res(m_regL, 1); ! 3076: return 8; ! 3077: ! 3078: case 0x8E: // res_1_xhl ! 3079: MemWriteByte(m_regHL, Res(MemReadByte(m_regHL), 1)); ! 3080: return 15; ! 3081: ! 3082: case 0x8F: // res_1_a ! 3083: m_regA = Res(m_regA, 1); ! 3084: return 8; ! 3085: ! 3086: case 0x90: // res_2_b ! 3087: m_regB = Res(m_regB ,2); ! 3088: return 8; ! 3089: ! 3090: case 0x91: // res_2_c ! 3091: m_regC = Res(m_regC, 2); ! 3092: return 8; ! 3093: ! 3094: case 0x92: // res_2_d ! 3095: m_regD = Res(m_regD, 2); ! 3096: return 8; ! 3097: ! 3098: case 0x93: // res_2_e ! 3099: m_regE = Res(m_regE, 2); ! 3100: return 8; ! 3101: ! 3102: case 0x94: // res_2_h ! 3103: m_regH = Res(m_regH, 2); ! 3104: return 8; ! 3105: ! 3106: case 0x95: // res_2_l ! 3107: m_regL = Res(m_regL, 2); ! 3108: return 8; ! 3109: ! 3110: case 0x96: // res_2_xhl ! 3111: MemWriteByte(m_regHL, Res(MemReadByte(m_regHL), 2)); ! 3112: return 15; ! 3113: ! 3114: case 0x97: // res_2_a ! 3115: m_regA = Res(m_regA, 2); ! 3116: return 8; ! 3117: ! 3118: case 0x98: // res_3_b ! 3119: m_regB = Res(m_regB ,3); ! 3120: return 8; ! 3121: ! 3122: case 0x99: // res_3_c ! 3123: m_regC = Res(m_regC, 3); ! 3124: return 8; ! 3125: ! 3126: case 0x9A: // res_3_d ! 3127: m_regD = Res(m_regD, 3); ! 3128: return 8; ! 3129: ! 3130: case 0x9B: // res_3_e ! 3131: m_regE = Res(m_regE, 3); ! 3132: return 8; ! 3133: ! 3134: case 0x9C: // res_3_h ! 3135: m_regH = Res(m_regH, 3); ! 3136: return 8; ! 3137: ! 3138: case 0x9D: // res_3_l ! 3139: m_regL = Res(m_regL, 3); ! 3140: return 8; ! 3141: ! 3142: case 0x9E: // res_3_xhl ! 3143: MemWriteByte(m_regHL, Res(MemReadByte(m_regHL), 3)); ! 3144: return 15; ! 3145: ! 3146: case 0x9F: // res_3_a ! 3147: m_regA = Res(m_regA, 3); ! 3148: return 8; ! 3149: ! 3150: case 0xA0: // res_4_b ! 3151: m_regB = Res(m_regB ,4); ! 3152: return 8; ! 3153: ! 3154: case 0xA1: // res_4_c ! 3155: m_regC = Res(m_regC, 4); ! 3156: return 8; ! 3157: ! 3158: case 0xA2: // res_4_d ! 3159: m_regD = Res(m_regD, 4); ! 3160: return 8; ! 3161: ! 3162: case 0xA3: // res_4_e ! 3163: m_regE = Res(m_regE, 4); ! 3164: return 8; ! 3165: ! 3166: case 0xA4: // res_4_h ! 3167: m_regH = Res(m_regH, 4); ! 3168: return 8; ! 3169: ! 3170: case 0xA5: // res_4_l ! 3171: m_regL = Res(m_regL, 4); ! 3172: return 8; ! 3173: ! 3174: case 0xA6: // res_4_xhl ! 3175: MemWriteByte(m_regHL, Res(MemReadByte(m_regHL), 4)); ! 3176: return 15; ! 3177: ! 3178: case 0xA7: // res_4_a ! 3179: m_regA = Res(m_regA, 4); ! 3180: return 8; ! 3181: ! 3182: case 0xA8: // res_5_b ! 3183: m_regB = Res(m_regB ,5); ! 3184: return 8; ! 3185: ! 3186: case 0xA9: // res_5_c ! 3187: m_regC = Res(m_regC, 5); ! 3188: return 8; ! 3189: ! 3190: case 0xAA: // res_5_d ! 3191: m_regD = Res(m_regD, 5); ! 3192: return 8; ! 3193: ! 3194: case 0xAB: // res_5_e ! 3195: m_regE = Res(m_regE, 5); ! 3196: return 8; ! 3197: ! 3198: case 0xAC: // res_5_h ! 3199: m_regH = Res(m_regH, 5); ! 3200: return 8; ! 3201: ! 3202: case 0xAD: // res_5_l ! 3203: m_regL = Res(m_regL, 5); ! 3204: return 8; ! 3205: ! 3206: case 0xAE: // res_5_xhl ! 3207: MemWriteByte(m_regHL, Res(MemReadByte(m_regHL), 5)); ! 3208: return 15; ! 3209: ! 3210: case 0xAF: // res_5_a ! 3211: m_regA = Res(m_regA, 5); ! 3212: return 8; ! 3213: ! 3214: case 0xB0: // res_6_b ! 3215: m_regB = Res(m_regB ,6); ! 3216: return 8; ! 3217: ! 3218: case 0xB1: // res_6_c ! 3219: m_regC = Res(m_regC, 6); ! 3220: return 8; ! 3221: ! 3222: case 0xB2: // res_6_d ! 3223: m_regD = Res(m_regD, 6); ! 3224: return 8; ! 3225: ! 3226: case 0xB3: // res_6_e ! 3227: m_regE = Res(m_regE, 6); ! 3228: return 8; ! 3229: ! 3230: case 0xB4: // res_6_h ! 3231: m_regH = Res(m_regH, 6); ! 3232: return 8; ! 3233: ! 3234: case 0xB5: // res_6_l ! 3235: m_regL = Res(m_regL, 6); ! 3236: return 8; ! 3237: ! 3238: case 0xB6: // res_6_xhl ! 3239: MemWriteByte(m_regHL, Res(MemReadByte(m_regHL), 6)); ! 3240: return 15; ! 3241: ! 3242: case 0xB7: // res_6_a ! 3243: m_regA = Res(m_regA, 6); ! 3244: return 8; ! 3245: ! 3246: case 0xB8: // res_7_b ! 3247: m_regB = Res(m_regB ,7); ! 3248: return 8; ! 3249: ! 3250: case 0xB9: // res_7_c ! 3251: m_regC = Res(m_regC, 7); ! 3252: return 8; ! 3253: ! 3254: case 0xBA: // res_7_d ! 3255: m_regD = Res(m_regD, 7); ! 3256: return 8; ! 3257: ! 3258: case 0xBB: // res_7_e ! 3259: m_regE = Res(m_regE, 7); ! 3260: return 8; ! 3261: ! 3262: case 0xBC: // res_7_h ! 3263: m_regH = Res(m_regH, 7); ! 3264: return 8; ! 3265: ! 3266: case 0xBD: // res_7_l ! 3267: m_regL = Res(m_regL, 7); ! 3268: return 8; ! 3269: ! 3270: case 0xBE: // res_7_xhl ! 3271: MemWriteByte(m_regHL, Res(MemReadByte(m_regHL), 7)); ! 3272: return 15; ! 3273: ! 3274: case 0xBF: // res_7_a ! 3275: m_regA = Res(m_regA, 7); ! 3276: return 8; ! 3277: ! 3278: case 0xC0: // set_0_b ! 3279: m_regB = Set(m_regB ,0); ! 3280: return 8; ! 3281: ! 3282: case 0xC1: // set_0_c ! 3283: m_regC = Set(m_regC, 0); ! 3284: return 8; ! 3285: ! 3286: case 0xC2: // set_0_d ! 3287: m_regD = Set(m_regD, 0); ! 3288: return 8; ! 3289: ! 3290: case 0xC3: // set_0_e ! 3291: m_regE = Set(m_regE, 0); ! 3292: return 8; ! 3293: ! 3294: case 0xC4: // set_0_h ! 3295: m_regH = Set(m_regH, 0); ! 3296: return 8; ! 3297: ! 3298: case 0xC5: // set_0_l ! 3299: m_regL = Set(m_regL, 0); ! 3300: return 8; ! 3301: ! 3302: case 0xC6: // set_0_xhl ! 3303: MemWriteByte(m_regHL, Set(MemReadByte(m_regHL), 0)); ! 3304: return 15; ! 3305: ! 3306: case 0xC7: // set_0_a ! 3307: m_regA = Set(m_regA, 0); ! 3308: return 8; ! 3309: ! 3310: case 0xC8: // set_1_b ! 3311: m_regB = Set(m_regB ,1); ! 3312: return 8; ! 3313: ! 3314: case 0xC9: // set_1_c ! 3315: m_regC = Set(m_regC, 1); ! 3316: return 8; ! 3317: ! 3318: case 0xCA: // set_1_d ! 3319: m_regD = Set(m_regD, 1); ! 3320: return 8; ! 3321: ! 3322: case 0xCB: // set_1_e ! 3323: m_regE = Set(m_regE, 1); ! 3324: return 8; ! 3325: ! 3326: case 0xCC: // set_1_h ! 3327: m_regH = Set(m_regH, 1); ! 3328: return 8; ! 3329: ! 3330: case 0xCD: // set_1_l ! 3331: m_regL = Set(m_regL, 1); ! 3332: return 8; ! 3333: ! 3334: case 0xCE: // set_1_xhl ! 3335: MemWriteByte(m_regHL, Set(MemReadByte(m_regHL), 1)); ! 3336: return 15; ! 3337: ! 3338: case 0xCF: // set_1_a ! 3339: m_regA = Set(m_regA, 1); ! 3340: return 8; ! 3341: ! 3342: case 0xD0: // set_2_b ! 3343: m_regB = Set(m_regB ,2); ! 3344: return 8; ! 3345: ! 3346: case 0xD1: // set_2_c ! 3347: m_regC = Set(m_regC, 2); ! 3348: return 8; ! 3349: ! 3350: case 0xD2: // set_2_d ! 3351: m_regD = Set(m_regD, 2); ! 3352: return 8; ! 3353: ! 3354: case 0xD3: // set_2_e ! 3355: m_regE = Set(m_regE, 2); ! 3356: return 8; ! 3357: ! 3358: case 0xD4: // set_2_h ! 3359: m_regH = Set(m_regH, 2); ! 3360: return 8; ! 3361: ! 3362: case 0xD5: // set_2_l ! 3363: m_regL = Set(m_regL, 2); ! 3364: return 8; ! 3365: ! 3366: case 0xD6: // set_2_xhl ! 3367: MemWriteByte(m_regHL, Set(MemReadByte(m_regHL), 2)); ! 3368: return 15; ! 3369: ! 3370: case 0xD7: // set_2_a ! 3371: m_regA = Set(m_regA, 2); ! 3372: return 8; ! 3373: ! 3374: case 0xD8: // set_3_b ! 3375: m_regB = Set(m_regB ,3); ! 3376: return 8; ! 3377: ! 3378: case 0xD9: // set_3_c ! 3379: m_regC = Set(m_regC, 3); ! 3380: return 8; ! 3381: ! 3382: case 0xDA: // set_3_d ! 3383: m_regD = Set(m_regD, 3); ! 3384: return 8; ! 3385: ! 3386: case 0xDB: // set_3_e ! 3387: m_regE = Set(m_regE, 3); ! 3388: return 8; ! 3389: ! 3390: case 0xDC: // set_3_h ! 3391: m_regH = Set(m_regH, 3); ! 3392: return 8; ! 3393: ! 3394: case 0xDD: // set_3_l ! 3395: m_regL = Set(m_regL, 3); ! 3396: return 8; ! 3397: ! 3398: case 0xDE: // set_3_xhl ! 3399: MemWriteByte(m_regHL, Set(MemReadByte(m_regHL), 3)); ! 3400: return 15; ! 3401: ! 3402: case 0xDF: // set_3_a ! 3403: m_regA = Set(m_regA, 3); ! 3404: return 8; ! 3405: ! 3406: case 0xE0: // set_4_b ! 3407: m_regB = Set(m_regB ,4); ! 3408: return 8; ! 3409: ! 3410: case 0xE1: // set_4_c ! 3411: m_regC = Set(m_regC, 4); ! 3412: return 8; ! 3413: ! 3414: case 0xE2: // set_4_d ! 3415: m_regD = Set(m_regD, 4); ! 3416: return 8; ! 3417: ! 3418: case 0xE3: // set_4_e ! 3419: m_regE = Set(m_regE, 4); ! 3420: return 8; ! 3421: ! 3422: case 0xE4: // set_4_h ! 3423: m_regH = Set(m_regH, 4); ! 3424: return 8; ! 3425: ! 3426: case 0xE5: // set_4_l ! 3427: m_regL = Set(m_regL, 4); ! 3428: return 8; ! 3429: ! 3430: case 0xE6: // set_4_xhl ! 3431: MemWriteByte(m_regHL, Set(MemReadByte(m_regHL), 4)); ! 3432: return 15; ! 3433: ! 3434: case 0xE7: // set_4_a ! 3435: m_regA = Set(m_regA, 4); ! 3436: return 8; ! 3437: ! 3438: case 0xE8: // set_5_b ! 3439: m_regB = Set(m_regB ,5); ! 3440: return 8; ! 3441: ! 3442: case 0xE9: // set_5_c ! 3443: m_regC = Set(m_regC, 5); ! 3444: return 8; ! 3445: ! 3446: case 0xEA: // set_5_d ! 3447: m_regD = Set(m_regD, 5); ! 3448: return 8; ! 3449: ! 3450: case 0xEB: // set_5_e ! 3451: m_regE = Set(m_regE, 5); ! 3452: return 8; ! 3453: ! 3454: case 0xEC: // set_5_h ! 3455: m_regH = Set(m_regH, 5); ! 3456: return 8; ! 3457: ! 3458: case 0xED: // set_5_l ! 3459: m_regL = Set(m_regL, 5); ! 3460: return 8; ! 3461: ! 3462: case 0xEE: // set_5_xhl ! 3463: MemWriteByte(m_regHL, Set(MemReadByte(m_regHL), 5)); ! 3464: return 15; ! 3465: ! 3466: case 0xEF: // set_5_a ! 3467: m_regA = Set(m_regA, 5); ! 3468: return 8; ! 3469: ! 3470: case 0xF0: // set_6_b ! 3471: m_regB = Set(m_regB ,6); ! 3472: return 8; ! 3473: ! 3474: case 0xF1: // set_6_c ! 3475: m_regC = Set(m_regC, 6); ! 3476: return 8; ! 3477: ! 3478: case 0xF2: // set_6_d ! 3479: m_regD = Set(m_regD, 6); ! 3480: return 8; ! 3481: ! 3482: case 0xF3: // set_6_e ! 3483: m_regE = Set(m_regE, 6); ! 3484: return 8; ! 3485: ! 3486: case 0xF4: // set_6_h ! 3487: m_regH = Set(m_regH, 6); ! 3488: return 8; ! 3489: ! 3490: case 0xF5: // set_6_l ! 3491: m_regL = Set(m_regL, 6); ! 3492: return 8; ! 3493: ! 3494: case 0xF6: // set_6_xhl ! 3495: MemWriteByte(m_regHL, Set(MemReadByte(m_regHL), 6)); ! 3496: return 15; ! 3497: ! 3498: case 0xF7: // set_6_a ! 3499: m_regA = Set(m_regA, 6); ! 3500: return 8; ! 3501: ! 3502: case 0xF8: // set_7_b ! 3503: m_regB = Set(m_regB ,7); ! 3504: return 8; ! 3505: ! 3506: case 0xF9: // set_7_c ! 3507: m_regC = Set(m_regC, 7); ! 3508: return 8; ! 3509: ! 3510: case 0xFA: // set_7_d ! 3511: m_regD = Set(m_regD, 7); ! 3512: return 8; ! 3513: ! 3514: case 0xFB: // set_7_e ! 3515: m_regE = Set(m_regE, 7); ! 3516: return 8; ! 3517: ! 3518: case 0xFC: // set_7_h ! 3519: m_regH = Set(m_regH, 7); ! 3520: return 8; ! 3521: ! 3522: case 0xFD: // set_7_l ! 3523: m_regL = Set(m_regL, 7); ! 3524: return 8; ! 3525: ! 3526: case 0xFE: // set_7_xhl ! 3527: MemWriteByte(m_regHL, Set(MemReadByte(m_regHL), 7)); ! 3528: return 15; ! 3529: ! 3530: case 0xFF: // set_7_a ! 3531: m_regA = Set(m_regA, 7); ! 3532: return 8; ! 3533: ! 3534: default: ! 3535: _ASSERT(FALSE); ! 3536: return 0; ! 3537: } ! 3538: } ! 3539: ! 3540: void Exx() { ! 3541: swap(m_regBC, m_regBC2); ! 3542: swap(m_regDE, m_regDE2); ! 3543: swap(m_regHL, m_regHL2); ! 3544: } ! 3545: ! 3546: /* *************************************************************************** ! 3547: * DD prefixed opcodes ! 3548: * *************************************************************************** ! 3549: */ ! 3550: /* inline */ WORD IndirectIX() { ! 3551: return m_regIX + (signed char)ImmedByte(); ! 3552: } ! 3553: ! 3554: int HandleDD() { ! 3555: WORD wAddr; ! 3556: WORD wTemp; ! 3557: ! 3558: const BYTE bOpcode = ImmedByte(); ! 3559: ! 3560: m_regR++; ! 3561: ! 3562: switch (bOpcode) ! 3563: { ! 3564: case 0x00: // no_op ! 3565: SetPC(GetPC() - 1); ! 3566: return 0; ! 3567: ! 3568: case 0x01: // no_op ! 3569: SetPC(GetPC() - 1); ! 3570: return 0; ! 3571: ! 3572: case 0x02: // no_op ! 3573: SetPC(GetPC() - 1); ! 3574: return 0; ! 3575: ! 3576: case 0x03: // no_op ! 3577: SetPC(GetPC() - 1); ! 3578: return 0; ! 3579: ! 3580: case 0x04: // no_op ! 3581: SetPC(GetPC() - 1); ! 3582: return 0; ! 3583: ! 3584: case 0x05: // no_op ! 3585: SetPC(GetPC() - 1); ! 3586: return 0; ! 3587: ! 3588: case 0x06: // no_op ! 3589: SetPC(GetPC() - 1); ! 3590: return 0; ! 3591: ! 3592: case 0x07: // no_op ! 3593: SetPC(GetPC() - 1); ! 3594: return 0; ! 3595: ! 3596: case 0x08: // no_op ! 3597: SetPC(GetPC() - 1); ! 3598: return 0; ! 3599: ! 3600: case 0x09: // add_ix_bc ! 3601: m_regIX = Add_2(m_regIX, m_regBC); ! 3602: return 15; ! 3603: ! 3604: case 0x0A: // no_op ! 3605: SetPC(GetPC() - 1); ! 3606: return 0; ! 3607: ! 3608: case 0x0B: // no_op ! 3609: SetPC(GetPC() - 1); ! 3610: return 0; ! 3611: ! 3612: case 0x0C: // no_op ! 3613: SetPC(GetPC() - 1); ! 3614: return 0; ! 3615: ! 3616: case 0x0D: // no_op ! 3617: SetPC(GetPC() - 1); ! 3618: return 0; ! 3619: ! 3620: case 0x0E: // no_op ! 3621: SetPC(GetPC() - 1); ! 3622: return 0; ! 3623: ! 3624: case 0x0F: // no_op ! 3625: SetPC(GetPC() - 1); ! 3626: return 0; ! 3627: ! 3628: case 0x10: // no_op ! 3629: SetPC(GetPC() - 1); ! 3630: return 0; ! 3631: ! 3632: case 0x11: // no_op ! 3633: SetPC(GetPC() - 1); ! 3634: return 0; ! 3635: ! 3636: case 0x12: // no_op ! 3637: SetPC(GetPC() - 1); ! 3638: return 0; ! 3639: ! 3640: case 0x13: // no_op ! 3641: SetPC(GetPC() - 1); ! 3642: return 0; ! 3643: ! 3644: case 0x14: // no_op ! 3645: SetPC(GetPC() - 1); ! 3646: return 0; ! 3647: ! 3648: case 0x15: // no_op ! 3649: SetPC(GetPC() - 1); ! 3650: return 0; ! 3651: ! 3652: case 0x16: // no_op ! 3653: SetPC(GetPC() - 1); ! 3654: return 0; ! 3655: ! 3656: case 0x17: // no_op ! 3657: SetPC(GetPC() - 1); ! 3658: return 0; ! 3659: ! 3660: case 0x18: // no_op ! 3661: SetPC(GetPC() - 1); ! 3662: return 0; ! 3663: ! 3664: case 0x19: // add_ix_de ! 3665: m_regIX = Add_2(m_regIX, m_regDE); ! 3666: return 15; ! 3667: ! 3668: case 0x1A: // no_op ! 3669: SetPC(GetPC() - 1); ! 3670: return 0; ! 3671: ! 3672: case 0x1B: // no_op ! 3673: SetPC(GetPC() - 1); ! 3674: return 0; ! 3675: ! 3676: case 0x1C: // no_op ! 3677: SetPC(GetPC() - 1); ! 3678: return 0; ! 3679: ! 3680: case 0x1D: // no_op ! 3681: SetPC(GetPC() - 1); ! 3682: return 0; ! 3683: ! 3684: case 0x1E: // no_op ! 3685: SetPC(GetPC() - 1); ! 3686: return 0; ! 3687: ! 3688: case 0x1F: // no_op ! 3689: SetPC(GetPC() - 1); ! 3690: return 0; ! 3691: ! 3692: case 0x20: // no_op ! 3693: SetPC(GetPC() - 1); ! 3694: return 0; ! 3695: ! 3696: case 0x21: // ld_ix_word ! 3697: m_regIX = ImmedWord(); ! 3698: return 14; ! 3699: ! 3700: case 0x22: // ld_xword_ix ! 3701: MemWriteWord(ImmedWord(), m_regIX); ! 3702: return 20; ! 3703: ! 3704: case 0x23: // inc_ix ! 3705: m_regIX++; ! 3706: return 10; ! 3707: ! 3708: case 0x24: // inc_ixh ! 3709: m_regIXh = Inc(m_regIXh); ! 3710: return 9; ! 3711: ! 3712: case 0x25: // dec_ixh ! 3713: m_regIXh = Dec(m_regIXh); ! 3714: return 9; ! 3715: ! 3716: case 0x26: // ld_ixh_byte ! 3717: m_regIXh = ImmedByte(); ! 3718: return 9; ! 3719: ! 3720: case 0x27: // no_op ! 3721: SetPC(GetPC() - 1); ! 3722: return 0; ! 3723: ! 3724: case 0x28: // no_op ! 3725: SetPC(GetPC() - 1); ! 3726: return 0; ! 3727: ! 3728: case 0x29: // add_ix_ix ! 3729: m_regIX = Add_2(m_regIX, m_regIX); ! 3730: return 15; ! 3731: ! 3732: case 0x2A: // ld_ix_xword ! 3733: m_regIX = MemReadWord(ImmedWord()); ! 3734: return 20; ! 3735: ! 3736: case 0x2B: // dec_ix ! 3737: m_regIX--; ! 3738: return 10; ! 3739: ! 3740: case 0x2C: // inc_ixl ! 3741: m_regIXl = Inc(m_regIXl); ! 3742: return 9; ! 3743: ! 3744: case 0x2D: // dec_ixl ! 3745: m_regIXl = Dec(m_regIXl); ! 3746: return 9; ! 3747: ! 3748: case 0x2E: // ld_ixl_byte ! 3749: m_regIXl = ImmedByte(); ! 3750: return 9; ! 3751: ! 3752: case 0x2F: // no_op ! 3753: SetPC(GetPC() - 1); ! 3754: return 0; ! 3755: ! 3756: case 0x30: // no_op ! 3757: SetPC(GetPC() - 1); ! 3758: return 0; ! 3759: ! 3760: case 0x31: // no_op ! 3761: SetPC(GetPC() - 1); ! 3762: return 0; ! 3763: ! 3764: case 0x32: // no_op ! 3765: SetPC(GetPC() - 1); ! 3766: return 0; ! 3767: ! 3768: case 0x33: // no_op ! 3769: SetPC(GetPC() - 1); ! 3770: return 0; ! 3771: ! 3772: case 0x34: // inc_xix ! 3773: wAddr = IndirectIX(); ! 3774: MemWriteByte(wAddr, Inc(MemReadByte(wAddr))); ! 3775: return 23; ! 3776: ! 3777: case 0x35: // dec_xix ! 3778: wAddr = IndirectIX(); ! 3779: MemWriteByte(wAddr, Dec(MemReadByte(wAddr))); ! 3780: return 23; ! 3781: ! 3782: case 0x36: // ld_xix_byte ! 3783: wAddr = IndirectIX(); ! 3784: MemWriteByte(wAddr, ImmedByte()); ! 3785: return 19; ! 3786: ! 3787: case 0x37: // no_op ! 3788: SetPC(GetPC() - 1); ! 3789: return 0; ! 3790: ! 3791: case 0x38: // no_op ! 3792: SetPC(GetPC() - 1); ! 3793: return 0; ! 3794: ! 3795: case 0x39: // add_ix_sp ! 3796: m_regIX = Add_2(m_regIX, GetSP()); ! 3797: return 15; ! 3798: ! 3799: case 0x3A: // no_op ! 3800: SetPC(GetPC() - 1); ! 3801: return 0; ! 3802: ! 3803: case 0x3B: // no_op ! 3804: SetPC(GetPC() - 1); ! 3805: return 0; ! 3806: ! 3807: case 0x3C: // no_op ! 3808: SetPC(GetPC() - 1); ! 3809: return 0; ! 3810: ! 3811: case 0x3D: // no_op ! 3812: SetPC(GetPC() - 1); ! 3813: return 0; ! 3814: ! 3815: case 0x3E: // no_op ! 3816: SetPC(GetPC() - 1); ! 3817: return 0; ! 3818: ! 3819: case 0x3F: // no_op ! 3820: SetPC(GetPC() - 1); ! 3821: return 0; ! 3822: ! 3823: case 0x40: // no_op ! 3824: SetPC(GetPC() - 1); ! 3825: return 0; ! 3826: ! 3827: case 0x41: // no_op ! 3828: SetPC(GetPC() - 1); ! 3829: return 0; ! 3830: ! 3831: case 0x42: // no_op ! 3832: SetPC(GetPC() - 1); ! 3833: return 0; ! 3834: ! 3835: case 0x43: // no_op ! 3836: SetPC(GetPC() - 1); ! 3837: return 0; ! 3838: ! 3839: case 0x44: // ld_b_ixh ! 3840: m_regB = m_regIXh; ! 3841: return 9; ! 3842: ! 3843: case 0x45: // ld_b_ixl ! 3844: m_regB = m_regIXl; ! 3845: return 9; ! 3846: ! 3847: case 0x46: // ld_b_xix ! 3848: m_regB = MemReadByte(IndirectIX()); ! 3849: return 19; ! 3850: ! 3851: case 0x47: // no_op ! 3852: SetPC(GetPC() - 1); ! 3853: return 0; ! 3854: ! 3855: case 0x48: // no_op ! 3856: SetPC(GetPC() - 1); ! 3857: return 0; ! 3858: ! 3859: case 0x49: // no_op ! 3860: SetPC(GetPC() - 1); ! 3861: return 0; ! 3862: ! 3863: case 0x4A: // no_op ! 3864: SetPC(GetPC() - 1); ! 3865: return 0; ! 3866: ! 3867: case 0x4B: // no_op ! 3868: SetPC(GetPC() - 1); ! 3869: return 0; ! 3870: ! 3871: case 0x4C: // ld_c_ixh ! 3872: m_regC = m_regIXh; ! 3873: return 9; ! 3874: ! 3875: case 0x4D: // ld_c_ixl ! 3876: m_regC = m_regIXl; ! 3877: return 9; ! 3878: ! 3879: case 0x4E: // ld_c_xix ! 3880: m_regC = MemReadByte(IndirectIX()); ! 3881: return 19; ! 3882: ! 3883: case 0x4F: // no_op ! 3884: SetPC(GetPC() - 1); ! 3885: return 0; ! 3886: ! 3887: case 0x50: // no_op ! 3888: SetPC(GetPC() - 1); ! 3889: return 0; ! 3890: ! 3891: case 0x51: // no_op ! 3892: SetPC(GetPC() - 1); ! 3893: return 0; ! 3894: ! 3895: case 0x52: // no_op ! 3896: SetPC(GetPC() - 1); ! 3897: return 0; ! 3898: ! 3899: case 0x53: // no_op ! 3900: SetPC(GetPC() - 1); ! 3901: return 0; ! 3902: ! 3903: case 0x54: // ld_d_ixh ! 3904: m_regD = m_regIXh; ! 3905: return 9; ! 3906: ! 3907: case 0x55: // ld_d_ixl ! 3908: m_regD = m_regIXl; ! 3909: return 9; ! 3910: ! 3911: case 0x56: // ld_d_xix ! 3912: m_regD = MemReadByte(IndirectIX()); ! 3913: return 19; ! 3914: ! 3915: case 0x57: // no_op ! 3916: SetPC(GetPC() - 1); ! 3917: return 0; ! 3918: ! 3919: case 0x58: // no_op ! 3920: SetPC(GetPC() - 1); ! 3921: return 0; ! 3922: ! 3923: case 0x59: // no_op ! 3924: SetPC(GetPC() - 1); ! 3925: return 0; ! 3926: ! 3927: case 0x5A: // no_op ! 3928: SetPC(GetPC() - 1); ! 3929: return 0; ! 3930: ! 3931: case 0x5B: // no_op ! 3932: SetPC(GetPC() - 1); ! 3933: return 0; ! 3934: ! 3935: case 0x5C: // ld_e_ixh ! 3936: m_regE = m_regIXh; ! 3937: return 9; ! 3938: ! 3939: case 0x5D: // ld_e_ixl ! 3940: m_regE = m_regIXl; ! 3941: return 9; ! 3942: ! 3943: case 0x5E: // ld_e_xix ! 3944: m_regE = MemReadByte(IndirectIX()); ! 3945: return 19; ! 3946: ! 3947: case 0x5F: // no_op ! 3948: SetPC(GetPC() - 1); ! 3949: return 0; ! 3950: ! 3951: case 0x60: // ld_ixh_b ! 3952: m_regIXh = m_regB; ! 3953: return 9; ! 3954: ! 3955: case 0x61: // ld_ixh_c ! 3956: m_regIXh = m_regC; ! 3957: return 9; ! 3958: ! 3959: case 0x62: // ld_ixh_d ! 3960: m_regIXh = m_regD; ! 3961: return 9; ! 3962: ! 3963: case 0x63: // ld_ixh_e ! 3964: m_regIXh = m_regE; ! 3965: return 9; ! 3966: ! 3967: case 0x64: // ld_ixh_h ! 3968: m_regIXh = m_regH; ! 3969: return 9; ! 3970: ! 3971: case 0x65: // ld_ixh_l ! 3972: m_regIXh = m_regL; ! 3973: return 9; ! 3974: ! 3975: case 0x66: // ld_h_xix ! 3976: m_regH = MemReadByte(IndirectIX()); ! 3977: return 9; ! 3978: ! 3979: case 0x67: // ld_ixh_a ! 3980: m_regIXh = m_regA; ! 3981: return 9; ! 3982: ! 3983: case 0x68: // ld_ixl_b ! 3984: m_regIXl = m_regB; ! 3985: return 9; ! 3986: ! 3987: case 0x69: // ld_ixl_c ! 3988: m_regIXl = m_regC; ! 3989: return 9; ! 3990: ! 3991: case 0x6A: // ld_ixl_d ! 3992: m_regIXl = m_regD; ! 3993: return 9; ! 3994: ! 3995: case 0x6B: // ld_ixl_e ! 3996: m_regIXl = m_regE; ! 3997: return 9; ! 3998: ! 3999: case 0x6C: // ld_ixl_h ! 4000: m_regIXl = m_regH; ! 4001: return 9; ! 4002: ! 4003: case 0x6D: // ld_ixl_l ! 4004: m_regIXl = m_regL; ! 4005: return 9; ! 4006: ! 4007: case 0x6E: // ld_l_xix ! 4008: m_regL = MemReadByte(IndirectIX()); ! 4009: return 9; ! 4010: ! 4011: case 0x6F: // ld_ixl_a ! 4012: m_regIXl = m_regA; ! 4013: return 9; ! 4014: ! 4015: case 0x70: // ld_xix_b ! 4016: MemWriteByte(IndirectIX(), m_regB); ! 4017: return 19; ! 4018: ! 4019: case 0x71: // ld_xix_c ! 4020: MemWriteByte(IndirectIX(), m_regC); ! 4021: return 19; ! 4022: ! 4023: case 0x72: // ld_xix_d ! 4024: MemWriteByte(IndirectIX(), m_regD); ! 4025: return 19; ! 4026: ! 4027: case 0x73: // ld_xix_e ! 4028: MemWriteByte(IndirectIX(), m_regE); ! 4029: return 19; ! 4030: ! 4031: case 0x74: // ld_xix_h ! 4032: MemWriteByte(IndirectIX(), m_regH); ! 4033: return 19; ! 4034: ! 4035: case 0x75: // ld_xix_l ! 4036: MemWriteByte(IndirectIX(), m_regL); ! 4037: return 19; ! 4038: ! 4039: case 0x76: // no_op ! 4040: SetPC(GetPC() - 1); ! 4041: return 19; ! 4042: ! 4043: case 0x77: // ld_xix_a ! 4044: MemWriteByte(IndirectIX(), m_regA); ! 4045: return 19; ! 4046: ! 4047: case 0x78: // no_op ! 4048: SetPC(GetPC() - 1); ! 4049: return 0; ! 4050: ! 4051: case 0x79: // no_op ! 4052: SetPC(GetPC() - 1); ! 4053: return 0; ! 4054: ! 4055: case 0x7A: // no_op ! 4056: SetPC(GetPC() - 1); ! 4057: return 0; ! 4058: ! 4059: case 0x7B: // no_op ! 4060: SetPC(GetPC() - 1); ! 4061: return 0; ! 4062: ! 4063: case 0x7C: // ld_a_ixh ! 4064: m_regA = m_regIXh; ! 4065: return 9; ! 4066: ! 4067: case 0x7D: // ld_a_ixl ! 4068: m_regA = m_regIXl; ! 4069: return 9; ! 4070: ! 4071: case 0x7E: // ld_a_xix ! 4072: m_regA = MemReadByte(IndirectIX()); ! 4073: return 19; ! 4074: ! 4075: case 0x7F: // no_op ! 4076: SetPC(GetPC() - 1); ! 4077: return 0; ! 4078: ! 4079: case 0x80: // no_op ! 4080: SetPC(GetPC() - 1); ! 4081: return 0; ! 4082: ! 4083: case 0x81: // no_op ! 4084: SetPC(GetPC() - 1); ! 4085: return 0; ! 4086: ! 4087: case 0x82: // no_op ! 4088: SetPC(GetPC() - 1); ! 4089: return 0; ! 4090: ! 4091: case 0x83: // no_op ! 4092: SetPC(GetPC() - 1); ! 4093: return 0; ! 4094: ! 4095: case 0x84: // add_a_ixh ! 4096: Add_1(m_regIXh); ! 4097: return 9; ! 4098: ! 4099: case 0x85: // add_a_ixl ! 4100: Add_1(m_regIXl); ! 4101: return 9; ! 4102: ! 4103: case 0x86: // add_a_xix ! 4104: Add_1(MemReadByte(IndirectIX())); ! 4105: return 19; ! 4106: ! 4107: case 0x87: // no_op ! 4108: SetPC(GetPC() - 1); ! 4109: return 0; ! 4110: ! 4111: case 0x88: // no_op ! 4112: SetPC(GetPC() - 1); ! 4113: return 0; ! 4114: ! 4115: case 0x89: // no_op ! 4116: SetPC(GetPC() - 1); ! 4117: return 0; ! 4118: ! 4119: case 0x8A: // no_op ! 4120: SetPC(GetPC() - 1); ! 4121: return 0; ! 4122: ! 4123: case 0x8B: // no_op ! 4124: SetPC(GetPC() - 1); ! 4125: return 0; ! 4126: ! 4127: case 0x8C: // adc_a_ixh ! 4128: Adc_1(m_regIXh); ! 4129: return 9; ! 4130: ! 4131: case 0x8D: // adc_a_ixl ! 4132: Adc_1(m_regIXl); ! 4133: return 9; ! 4134: ! 4135: case 0x8E: // adc_a_xix ! 4136: Adc_1(MemReadByte(IndirectIX())); ! 4137: return 19; ! 4138: ! 4139: case 0x8F: // no_op ! 4140: SetPC(GetPC() - 1); ! 4141: return 0; ! 4142: ! 4143: case 0x90: // no_op ! 4144: SetPC(GetPC() - 1); ! 4145: return 0; ! 4146: ! 4147: case 0x91: // no_op ! 4148: SetPC(GetPC() - 1); ! 4149: return 0; ! 4150: ! 4151: case 0x92: // no_op ! 4152: SetPC(GetPC() - 1); ! 4153: return 0; ! 4154: ! 4155: case 0x93: // no_op ! 4156: SetPC(GetPC() - 1); ! 4157: return 0; ! 4158: ! 4159: case 0x94: // sub_ixh ! 4160: Sub_1(m_regIXh); ! 4161: return 9; ! 4162: ! 4163: case 0x95: // sub_ixl ! 4164: Sub_1(m_regIXl); ! 4165: return 9; ! 4166: ! 4167: case 0x96: // sub_xix ! 4168: Sub_1(MemReadByte(IndirectIX())); ! 4169: return 19; ! 4170: ! 4171: case 0x97: // no_op ! 4172: SetPC(GetPC() - 1); ! 4173: return 0; ! 4174: ! 4175: case 0x98: // no_op ! 4176: SetPC(GetPC() - 1); ! 4177: return 0; ! 4178: ! 4179: case 0x99: // no_op ! 4180: SetPC(GetPC() - 1); ! 4181: return 0; ! 4182: ! 4183: case 0x9A: // no_op ! 4184: SetPC(GetPC() - 1); ! 4185: return 0; ! 4186: ! 4187: case 0x9B: // no_op ! 4188: SetPC(GetPC() - 1); ! 4189: return 0; ! 4190: ! 4191: case 0x9C: // sbc_a_ixh ! 4192: Sbc_1(m_regIXh); ! 4193: return 9; ! 4194: ! 4195: case 0x9D: // sbc_a_ixl ! 4196: Sbc_1(m_regIXl); ! 4197: return 9; ! 4198: ! 4199: case 0x9E: // sbc_a_xix ! 4200: Sbc_1(MemReadByte(IndirectIX())); ! 4201: return 19; ! 4202: ! 4203: case 0x9F: // no_op ! 4204: SetPC(GetPC() - 1); ! 4205: return 0; ! 4206: ! 4207: case 0xA0: // no_op ! 4208: SetPC(GetPC() - 1); ! 4209: return 0; ! 4210: ! 4211: case 0xA1: // no_op ! 4212: SetPC(GetPC() - 1); ! 4213: return 0; ! 4214: ! 4215: case 0xA2: // no_op ! 4216: SetPC(GetPC() - 1); ! 4217: return 0; ! 4218: ! 4219: case 0xA3: // no_op ! 4220: SetPC(GetPC() - 1); ! 4221: return 0; ! 4222: ! 4223: case 0xA4: // and_ixh ! 4224: And(m_regIXh); ! 4225: return 9; ! 4226: ! 4227: case 0xA5: // and_ixl ! 4228: And(m_regIXl); ! 4229: return 9; ! 4230: ! 4231: case 0xA6: // and_xix ! 4232: And(MemReadByte(IndirectIX())); ! 4233: return 19; ! 4234: ! 4235: case 0xA7: // no_op ! 4236: SetPC(GetPC() - 1); ! 4237: return 0; ! 4238: ! 4239: case 0xA8: // no_op ! 4240: SetPC(GetPC() - 1); ! 4241: return 0; ! 4242: ! 4243: case 0xA9: // no_op ! 4244: SetPC(GetPC() - 1); ! 4245: return 0; ! 4246: ! 4247: case 0xAA: // no_op ! 4248: SetPC(GetPC() - 1); ! 4249: return 0; ! 4250: ! 4251: case 0xAB: // no_op ! 4252: SetPC(GetPC() - 1); ! 4253: return 0; ! 4254: ! 4255: case 0xAC: // xor_ixh ! 4256: Xor(m_regIXh); ! 4257: return 9; ! 4258: ! 4259: case 0xAD: // xor_ixl ! 4260: Xor(m_regIXl); ! 4261: return 9; ! 4262: ! 4263: case 0xAE: // xor_xix ! 4264: Xor(MemReadByte(IndirectIX())); ! 4265: return 19; ! 4266: ! 4267: case 0xAF: // no_op ! 4268: SetPC(GetPC() - 1); ! 4269: return 0; ! 4270: ! 4271: case 0xB0: // no_op ! 4272: SetPC(GetPC() - 1); ! 4273: return 0; ! 4274: ! 4275: case 0xB1: // no_op ! 4276: SetPC(GetPC() - 1); ! 4277: return 0; ! 4278: ! 4279: case 0xB2: // no_op ! 4280: SetPC(GetPC() - 1); ! 4281: return 0; ! 4282: ! 4283: case 0xB3: // no_op ! 4284: SetPC(GetPC() - 1); ! 4285: return 0; ! 4286: ! 4287: case 0xB4: // or_ixh ! 4288: Or(m_regIXh); ! 4289: return 9; ! 4290: ! 4291: case 0xB5: // or_ixl ! 4292: Or(m_regIXl); ! 4293: return 9; ! 4294: ! 4295: case 0xB6: // or_xix ! 4296: Or(MemReadByte(IndirectIX())); ! 4297: return 19; ! 4298: ! 4299: case 0xB7: // no_op ! 4300: SetPC(GetPC() - 1); ! 4301: return 0; ! 4302: ! 4303: case 0xB8: // no_op ! 4304: SetPC(GetPC() - 1); ! 4305: return 0; ! 4306: ! 4307: case 0xB9: // no_op ! 4308: SetPC(GetPC() - 1); ! 4309: return 0; ! 4310: ! 4311: case 0xBA: // no_op ! 4312: SetPC(GetPC() - 1); ! 4313: return 0; ! 4314: ! 4315: case 0xBB: // no_op ! 4316: SetPC(GetPC() - 1); ! 4317: return 0; ! 4318: ! 4319: case 0xBC: // cp_ixh ! 4320: Cp(m_regIXh); ! 4321: return 9; ! 4322: ! 4323: case 0xBD: // cp_ixl ! 4324: Cp(m_regIXl); ! 4325: return 9; ! 4326: ! 4327: case 0xBE: // cp_xix ! 4328: Cp(MemReadByte(IndirectIX())); ! 4329: return 19; ! 4330: ! 4331: case 0xBF: // no_op ! 4332: SetPC(GetPC() - 1); ! 4333: return 0; ! 4334: ! 4335: case 0xC0: // no_op ! 4336: SetPC(GetPC() - 1); ! 4337: return 0; ! 4338: ! 4339: case 0xC1: // no_op ! 4340: SetPC(GetPC() - 1); ! 4341: return 0; ! 4342: ! 4343: case 0xC2: // no_op ! 4344: SetPC(GetPC() - 1); ! 4345: return 0; ! 4346: ! 4347: case 0xC3: // no_op ! 4348: SetPC(GetPC() - 1); ! 4349: return 0; ! 4350: ! 4351: case 0xC4: // no_op ! 4352: SetPC(GetPC() - 1); ! 4353: return 0; ! 4354: ! 4355: case 0xC5: // no_op ! 4356: SetPC(GetPC() - 1); ! 4357: return 0; ! 4358: ! 4359: case 0xC6: // no_op ! 4360: SetPC(GetPC() - 1); ! 4361: return 0; ! 4362: ! 4363: case 0xC7: // no_op ! 4364: SetPC(GetPC() - 1); ! 4365: return 0; ! 4366: ! 4367: case 0xC8: // no_op ! 4368: SetPC(GetPC() - 1); ! 4369: return 0; ! 4370: ! 4371: case 0xC9: // no_op ! 4372: SetPC(GetPC() - 1); ! 4373: return 0; ! 4374: ! 4375: case 0xCA: // no_op ! 4376: SetPC(GetPC() - 1); ! 4377: return 0; ! 4378: ! 4379: case 0xCB: // dd_cb ! 4380: return HandleDDCB(); ! 4381: break; ! 4382: ! 4383: case 0xCC: // no_op ! 4384: SetPC(GetPC() - 1); ! 4385: return 0; ! 4386: ! 4387: case 0xCD: // no_op ! 4388: SetPC(GetPC() - 1); ! 4389: return 0; ! 4390: ! 4391: case 0xCE: // no_op ! 4392: SetPC(GetPC() - 1); ! 4393: return 0; ! 4394: ! 4395: case 0xCF: // no_op ! 4396: SetPC(GetPC() - 1); ! 4397: return 0; ! 4398: ! 4399: case 0xD0: // no_op ! 4400: SetPC(GetPC() - 1); ! 4401: return 0; ! 4402: ! 4403: case 0xD1: // no_op ! 4404: SetPC(GetPC() - 1); ! 4405: return 0; ! 4406: ! 4407: case 0xD2: // no_op ! 4408: SetPC(GetPC() - 1); ! 4409: return 0; ! 4410: ! 4411: case 0xD3: // no_op ! 4412: SetPC(GetPC() - 1); ! 4413: return 0; ! 4414: ! 4415: case 0xD4: // no_op ! 4416: SetPC(GetPC() - 1); ! 4417: return 0; ! 4418: ! 4419: case 0xD5: // no_op ! 4420: SetPC(GetPC() - 1); ! 4421: return 0; ! 4422: ! 4423: case 0xD6: // no_op ! 4424: SetPC(GetPC() - 1); ! 4425: return 0; ! 4426: ! 4427: case 0xD7: // no_op ! 4428: SetPC(GetPC() - 1); ! 4429: return 0; ! 4430: ! 4431: case 0xD8: // no_op ! 4432: SetPC(GetPC() - 1); ! 4433: return 0; ! 4434: ! 4435: case 0xD9: // no_op ! 4436: SetPC(GetPC() - 1); ! 4437: return 0; ! 4438: ! 4439: case 0xDA: // no_op ! 4440: SetPC(GetPC() - 1); ! 4441: return 0; ! 4442: ! 4443: case 0xDB: // no_op ! 4444: SetPC(GetPC() - 1); ! 4445: return 0; ! 4446: ! 4447: case 0xDC: // no_op ! 4448: SetPC(GetPC() - 1); ! 4449: return 0; ! 4450: ! 4451: case 0xDD: // no_op ! 4452: SetPC(GetPC() - 1); ! 4453: return 0; ! 4454: ! 4455: case 0xDE: // no_op ! 4456: SetPC(GetPC() - 1); ! 4457: return 0; ! 4458: ! 4459: case 0xDF: // no_op ! 4460: SetPC(GetPC() - 1); ! 4461: return 0; ! 4462: ! 4463: case 0xE0: // no_op ! 4464: SetPC(GetPC() - 1); ! 4465: return 0; ! 4466: ! 4467: case 0xE1: // pop_ix ! 4468: m_regIX = Pop(); ! 4469: return 14; ! 4470: ! 4471: case 0xE2: // no_op ! 4472: SetPC(GetPC() - 1); ! 4473: return 0; ! 4474: ! 4475: case 0xE3: // ex_xsp_ix ! 4476: wTemp = MemReadWord(GetSP()); ! 4477: MemWriteWord(GetSP(), m_regIX); ! 4478: m_regIX = wTemp; ! 4479: return 23; ! 4480: ! 4481: case 0xE4: // no_op ! 4482: SetPC(GetPC() - 1); ! 4483: return 0; ! 4484: ! 4485: case 0xE5: // push_ix ! 4486: Push(m_regIX); ! 4487: return 15; ! 4488: ! 4489: case 0xE6: // no_op ! 4490: SetPC(GetPC() - 1); ! 4491: return 0; ! 4492: ! 4493: case 0xE7: // no_op ! 4494: SetPC(GetPC() - 1); ! 4495: return 0; ! 4496: ! 4497: case 0xE8: // no_op ! 4498: SetPC(GetPC() - 1); ! 4499: return 0; ! 4500: ! 4501: case 0xE9: // jp_ix ! 4502: SetPC(m_regIX); ! 4503: return 8; ! 4504: ! 4505: case 0xEA: // no_op ! 4506: SetPC(GetPC() - 1); ! 4507: return 0; ! 4508: ! 4509: case 0xEB: // no_op ! 4510: SetPC(GetPC() - 1); ! 4511: return 0; ! 4512: ! 4513: case 0xEC: // no_op ! 4514: SetPC(GetPC() - 1); ! 4515: return 0; ! 4516: ! 4517: case 0xED: // no_op ! 4518: SetPC(GetPC() - 1); ! 4519: return 0; ! 4520: ! 4521: case 0xEE: // no_op ! 4522: SetPC(GetPC() - 1); ! 4523: return 0; ! 4524: ! 4525: case 0xEF: // no_op ! 4526: SetPC(GetPC() - 1); ! 4527: return 0; ! 4528: ! 4529: case 0xF0: // no_op ! 4530: SetPC(GetPC() - 1); ! 4531: return 0; ! 4532: ! 4533: case 0xF1: // no_op ! 4534: SetPC(GetPC() - 1); ! 4535: return 0; ! 4536: ! 4537: case 0xF2: // no_op ! 4538: SetPC(GetPC() - 1); ! 4539: return 0; ! 4540: ! 4541: case 0xF3: // no_op ! 4542: SetPC(GetPC() - 1); ! 4543: return 0; ! 4544: ! 4545: case 0xF4: // no_op ! 4546: SetPC(GetPC() - 1); ! 4547: return 0; ! 4548: ! 4549: case 0xF5: // no_op ! 4550: SetPC(GetPC() - 1); ! 4551: return 0; ! 4552: ! 4553: case 0xF6: // no_op ! 4554: SetPC(GetPC() - 1); ! 4555: return 0; ! 4556: ! 4557: case 0xF7: // no_op ! 4558: SetPC(GetPC() - 1); ! 4559: return 0; ! 4560: ! 4561: case 0xF8: // no_op ! 4562: SetPC(GetPC() - 1); ! 4563: return 0; ! 4564: ! 4565: case 0xF9: // ld_sp_ix ! 4566: SetSP(m_regIX); ! 4567: return 10; ! 4568: ! 4569: case 0xFA: // no_op ! 4570: SetPC(GetPC() - 1); ! 4571: return 0; ! 4572: ! 4573: case 0xFB: // no_op ! 4574: SetPC(GetPC() - 1); ! 4575: return 0; ! 4576: ! 4577: case 0xFC: // no_op ! 4578: SetPC(GetPC() - 1); ! 4579: return 0; ! 4580: ! 4581: case 0xFD: // no_op ! 4582: SetPC(GetPC() - 1); ! 4583: return 0; ! 4584: ! 4585: case 0xFE: // no_op ! 4586: SetPC(GetPC() - 1); ! 4587: return 0; ! 4588: ! 4589: case 0xFF: // no_op ! 4590: SetPC(GetPC() - 1); ! 4591: return 0; ! 4592: ! 4593: default: ! 4594: return 0; ! 4595: } ! 4596: } ! 4597: ! 4598: /* *************************************************************************** ! 4599: * ED prefixed opcodes ! 4600: * *************************************************************************** ! 4601: */ ! 4602: int HandleED(int cCyclesArg) { ! 4603: ! 4604: const BYTE bOpcode = ImmedByte(); ! 4605: int cCycles = cCyclesArg; ! 4606: ! 4607: m_regR++; ! 4608: ! 4609: switch (bOpcode) ! 4610: { ! 4611: case 0x00: // nop ! 4612: cCycles -= 0; ! 4613: break; ! 4614: ! 4615: case 0x01: // nop ! 4616: cCycles -= 0; ! 4617: break; ! 4618: ! 4619: case 0x02: // nop ! 4620: cCycles -= 0; ! 4621: break; ! 4622: ! 4623: case 0x03: // nop ! 4624: cCycles -= 0; ! 4625: break; ! 4626: ! 4627: case 0x04: // nop ! 4628: cCycles -= 0; ! 4629: break; ! 4630: ! 4631: case 0x05: // nop ! 4632: cCycles -= 0; ! 4633: break; ! 4634: ! 4635: case 0x06: // nop ! 4636: cCycles -= 0; ! 4637: break; ! 4638: ! 4639: case 0x07: // nop ! 4640: cCycles -= 0; ! 4641: break; ! 4642: ! 4643: case 0x08: // nop ! 4644: cCycles -= 0; ! 4645: break; ! 4646: ! 4647: case 0x09: // nop ! 4648: cCycles -= 0; ! 4649: break; ! 4650: ! 4651: case 0x0A: // nop ! 4652: cCycles -= 0; ! 4653: break; ! 4654: ! 4655: case 0x0B: // nop ! 4656: cCycles -= 0; ! 4657: break; ! 4658: ! 4659: case 0x0C: // nop ! 4660: cCycles -= 0; ! 4661: break; ! 4662: ! 4663: case 0x0D: // nop ! 4664: cCycles -= 0; ! 4665: break; ! 4666: ! 4667: case 0x0E: // nop ! 4668: cCycles -= 0; ! 4669: break; ! 4670: ! 4671: case 0x0F: // nop ! 4672: cCycles -= 0; ! 4673: break; ! 4674: ! 4675: case 0x10: // nop ! 4676: cCycles -= 0; ! 4677: break; ! 4678: ! 4679: case 0x11: // nop ! 4680: cCycles -= 0; ! 4681: break; ! 4682: ! 4683: case 0x12: // nop ! 4684: cCycles -= 0; ! 4685: break; ! 4686: ! 4687: case 0x13: // nop ! 4688: cCycles -= 0; ! 4689: break; ! 4690: ! 4691: case 0x14: // nop ! 4692: cCycles -= 0; ! 4693: break; ! 4694: ! 4695: case 0x15: // nop ! 4696: cCycles -= 0; ! 4697: break; ! 4698: ! 4699: case 0x16: // nop ! 4700: cCycles -= 0; ! 4701: break; ! 4702: ! 4703: case 0x17: // nop ! 4704: cCycles -= 0; ! 4705: break; ! 4706: ! 4707: case 0x18: // nop ! 4708: cCycles -= 0; ! 4709: break; ! 4710: ! 4711: case 0x19: // nop ! 4712: cCycles -= 0; ! 4713: break; ! 4714: ! 4715: case 0x1A: // nop ! 4716: cCycles -= 0; ! 4717: break; ! 4718: ! 4719: case 0x1B: // nop ! 4720: cCycles -= 0; ! 4721: break; ! 4722: ! 4723: case 0x1C: // nop ! 4724: cCycles -= 0; ! 4725: break; ! 4726: ! 4727: case 0x1D: // nop ! 4728: cCycles -= 0; ! 4729: break; ! 4730: ! 4731: case 0x1E: // nop ! 4732: cCycles -= 0; ! 4733: break; ! 4734: ! 4735: case 0x1F: // nop ! 4736: cCycles -= 0; ! 4737: break; ! 4738: ! 4739: case 0x20: // nop ! 4740: cCycles -= 0; ! 4741: break; ! 4742: ! 4743: case 0x21: // nop ! 4744: cCycles -= 0; ! 4745: break; ! 4746: ! 4747: case 0x22: // nop ! 4748: cCycles -= 0; ! 4749: break; ! 4750: ! 4751: case 0x23: // nop ! 4752: cCycles -= 0; ! 4753: break; ! 4754: ! 4755: case 0x24: // nop ! 4756: cCycles -= 0; ! 4757: break; ! 4758: ! 4759: case 0x25: // nop ! 4760: cCycles -= 0; ! 4761: break; ! 4762: ! 4763: case 0x26: // nop ! 4764: cCycles -= 0; ! 4765: break; ! 4766: ! 4767: case 0x27: // nop ! 4768: cCycles -= 0; ! 4769: break; ! 4770: ! 4771: case 0x28: // nop ! 4772: cCycles -= 0; ! 4773: break; ! 4774: ! 4775: case 0x29: // nop ! 4776: cCycles -= 0; ! 4777: break; ! 4778: ! 4779: case 0x2A: // nop ! 4780: cCycles -= 0; ! 4781: break; ! 4782: ! 4783: case 0x2B: // nop ! 4784: cCycles -= 0; ! 4785: break; ! 4786: ! 4787: case 0x2C: // nop ! 4788: cCycles -= 0; ! 4789: break; ! 4790: ! 4791: case 0x2D: // nop ! 4792: cCycles -= 0; ! 4793: break; ! 4794: ! 4795: case 0x2E: // nop ! 4796: cCycles -= 0; ! 4797: break; ! 4798: ! 4799: case 0x2F: // nop ! 4800: cCycles -= 0; ! 4801: break; ! 4802: ! 4803: case 0x30: // nop ! 4804: cCycles -= 0; ! 4805: break; ! 4806: ! 4807: case 0x31: // nop ! 4808: cCycles -= 0; ! 4809: break; ! 4810: ! 4811: case 0x32: // nop ! 4812: cCycles -= 0; ! 4813: break; ! 4814: ! 4815: case 0x33: // nop ! 4816: cCycles -= 0; ! 4817: break; ! 4818: ! 4819: case 0x34: // nop ! 4820: cCycles -= 0; ! 4821: break; ! 4822: ! 4823: case 0x35: // nop ! 4824: cCycles -= 0; ! 4825: break; ! 4826: ! 4827: case 0x36: // nop ! 4828: cCycles -= 0; ! 4829: break; ! 4830: ! 4831: case 0x37: // nop ! 4832: cCycles -= 0; ! 4833: break; ! 4834: ! 4835: case 0x38: // nop ! 4836: cCycles -= 0; ! 4837: break; ! 4838: ! 4839: case 0x39: // nop ! 4840: cCycles -= 0; ! 4841: break; ! 4842: ! 4843: case 0x3A: // nop ! 4844: cCycles -= 0; ! 4845: break; ! 4846: ! 4847: case 0x3B: // nop ! 4848: cCycles -= 0; ! 4849: break; ! 4850: ! 4851: case 0x3C: // nop ! 4852: cCycles -= 0; ! 4853: break; ! 4854: ! 4855: case 0x3D: // nop ! 4856: cCycles -= 0; ! 4857: break; ! 4858: ! 4859: case 0x3E: // nop ! 4860: cCycles -= 0; ! 4861: break; ! 4862: ! 4863: case 0x3F: // nop ! 4864: cCycles -= 0; ! 4865: break; ! 4866: ! 4867: case 0x40: // in_b_c ! 4868: cCycles -= 12; ! 4869: m_regB = In(m_regC); ! 4870: break; ! 4871: ! 4872: case 0x41: // out_c_b ! 4873: cCycles -= 12; ! 4874: Out(m_regC, m_regB); ! 4875: break; ! 4876: ! 4877: case 0x42: // sbc_hl_bc ! 4878: cCycles -= 15; ! 4879: m_regHL = Sbc_2(m_regHL, m_regBC); ! 4880: break; ! 4881: ! 4882: case 0x43: // ld_xword_bc ! 4883: cCycles -= 20; ! 4884: MemWriteWord(ImmedWord(), m_regBC); ! 4885: break; ! 4886: ! 4887: case 0x44: // neg ! 4888: cCycles -= 8; ! 4889: { ! 4890: BYTE b = m_regA; ! 4891: m_regA = 0; ! 4892: Sub_1(b); ! 4893: break; ! 4894: } ! 4895: ! 4896: case 0x45: // retn ! 4897: cCycles -= 8; ! 4898: m_iff1 = m_iff2; ! 4899: cCycles -= Ret0(TRUE); ! 4900: break; ! 4901: ! 4902: case 0x46: // im_0 ! 4903: cCycles -= 8; ! 4904: m_nIM = 0; ! 4905: break; ! 4906: ! 4907: case 0x47: // ld_i_a ! 4908: cCycles -= 9; ! 4909: m_regI = m_regA; ! 4910: break; ! 4911: ! 4912: case 0x48: // in_c_c ! 4913: cCycles -= 12; ! 4914: m_regC = In(m_regC); ! 4915: break; ! 4916: ! 4917: case 0x49: // out_c_c ! 4918: cCycles -= 12; ! 4919: Out(m_regC, m_regC); ! 4920: break; ! 4921: ! 4922: case 0x4A: // adc_hl_bc ! 4923: cCycles -= 15; ! 4924: m_regHL = Adc_2(m_regHL, m_regBC); ! 4925: break; ! 4926: ! 4927: case 0x4B: // ld_bc_xword ! 4928: cCycles -= 20; ! 4929: m_regBC = MemReadWord(ImmedWord()); ! 4930: break; ! 4931: ! 4932: case 0x4C: // neg ! 4933: cCycles -= 8; ! 4934: { ! 4935: BYTE b = m_regA; ! 4936: m_regA = 0; ! 4937: Sub_1(b); ! 4938: break; ! 4939: } ! 4940: ! 4941: case 0x4D: // reti ! 4942: cCycles -= 8; ! 4943: cCycles -= Ret0(TRUE); ! 4944: break; ! 4945: ! 4946: case 0x4E: // im_0 ! 4947: cCycles -= 8; ! 4948: m_nIM = 0; ! 4949: break; ! 4950: ! 4951: case 0x4F: // ld_r_a ! 4952: cCycles -= 9; ! 4953: m_regR = m_regA; ! 4954: // m_regR2 = m_regA; ! 4955: break; ! 4956: ! 4957: case 0x50: // in_d_c ! 4958: cCycles -= 12; ! 4959: m_regD = In(m_regC); ! 4960: break; ! 4961: ! 4962: case 0x51: // out_c_d ! 4963: cCycles -= 12; ! 4964: Out(m_regC, m_regD); ! 4965: break; ! 4966: ! 4967: case 0x52: // sbc_hl_de ! 4968: cCycles -= 15; ! 4969: m_regHL = Sbc_2(m_regHL, m_regDE); ! 4970: break; ! 4971: ! 4972: case 0x53: // ld_xword_de ! 4973: cCycles -= 20; ! 4974: MemWriteWord(ImmedWord(), m_regDE); ! 4975: break; ! 4976: ! 4977: case 0x54: // neg ! 4978: cCycles -= 8; ! 4979: { ! 4980: BYTE b = m_regA; ! 4981: m_regA = 0; ! 4982: Sub_1(b); ! 4983: break; ! 4984: } ! 4985: ! 4986: case 0x55: // retn ! 4987: cCycles -= 8; ! 4988: m_iff1 = m_iff2; ! 4989: cCycles -= Ret0(TRUE); ! 4990: break; ! 4991: ! 4992: case 0x56: // im_1 ! 4993: cCycles -= 8; ! 4994: m_nIM = 1; ! 4995: break; ! 4996: ! 4997: case 0x57: // ld_a_i ! 4998: cCycles -= 9; ! 4999: m_regA = m_regI; ! 5000: m_regF = (m_regF & C_FLAG)| ZSTable[m_regI] | (m_iff2 << 2); ! 5001: break; ! 5002: ! 5003: case 0x58: // in_e_c ! 5004: cCycles -= 12; ! 5005: m_regE = In(m_regC); ! 5006: break; ! 5007: ! 5008: case 0x59: // out_c_e ! 5009: cCycles -= 12; ! 5010: Out(m_regC, m_regE); ! 5011: break; ! 5012: ! 5013: case 0x5A: // adc_hl_de ! 5014: cCycles -= 15; ! 5015: m_regHL = Adc_2(m_regHL, m_regDE); ! 5016: break; ! 5017: ! 5018: case 0x5B: // ld_de_xword ! 5019: cCycles -= 20; ! 5020: m_regDE = MemReadWord(ImmedWord()); ! 5021: break; ! 5022: ! 5023: case 0x5C: // neg ! 5024: cCycles -= 8; ! 5025: { ! 5026: BYTE b = m_regA; ! 5027: m_regA = 0; ! 5028: Sub_1(b); ! 5029: break; ! 5030: } ! 5031: ! 5032: case 0x5D: // reti ! 5033: cCycles -= 8; ! 5034: cCycles -= Ret0(TRUE); ! 5035: break; ! 5036: ! 5037: case 0x5E: // im_2 ! 5038: cCycles -= 8; ! 5039: m_nIM = 2; ! 5040: break; ! 5041: ! 5042: case 0x5F: // ld_a_r ! 5043: cCycles -= 9; ! 5044: m_regA = (m_regR & 0x7F); /////////////////////////////////////// | (m_regR2 & 0x80); ! 5045: m_regF = (m_regF & C_FLAG) | ZSTable[m_regA] | (m_iff2 << 2); ! 5046: break; ! 5047: ! 5048: case 0x60: // in_h_c ! 5049: cCycles -= 12; ! 5050: m_regH = In(m_regC); ! 5051: break; ! 5052: ! 5053: case 0x61: // out_c_h ! 5054: cCycles -= 12; ! 5055: Out(m_regC, m_regH); ! 5056: break; ! 5057: ! 5058: case 0x62: // sbc_hl_hl ! 5059: cCycles -= 15; ! 5060: m_regHL = Sbc_2(m_regHL, m_regHL); ! 5061: break; ! 5062: ! 5063: case 0x63: // ld_xword_hl ! 5064: cCycles -= 20; ! 5065: MemWriteWord(ImmedWord(), m_regHL); ! 5066: break; ! 5067: ! 5068: case 0x64: // neg ! 5069: cCycles -= 8; ! 5070: { ! 5071: BYTE b = m_regA; ! 5072: m_regA = 0; ! 5073: Sub_1(b); ! 5074: break; ! 5075: } ! 5076: ! 5077: case 0x65: // retn ! 5078: cCycles -= 8; ! 5079: m_iff1 = m_iff2; ! 5080: cCycles -= Ret0(TRUE); ! 5081: break; ! 5082: ! 5083: case 0x66: // im_0 ! 5084: cCycles -= 8; ! 5085: m_nIM = 0; ! 5086: break; ! 5087: ! 5088: case 0x67: // rrd ! 5089: cCycles -= 18; ! 5090: { ! 5091: BYTE i = MemReadByte(m_regHL); ! 5092: MemWriteByte(m_regHL, (i>>4) | (m_regA << 4)); ! 5093: m_regA = (m_regA & 0xF0) | (i&0x0F); ! 5094: m_regF =(m_regF&C_FLAG)|ZSPTable[m_regA]; ! 5095: break; ! 5096: } ! 5097: ! 5098: case 0x68: // in_l_c ! 5099: cCycles -= 12; ! 5100: m_regL = In(m_regC); ! 5101: break; ! 5102: ! 5103: case 0x69: // out_c_l ! 5104: cCycles -= 12; ! 5105: Out(m_regC, m_regL); ! 5106: break; ! 5107: ! 5108: case 0x6A: // adc_hl_hl ! 5109: cCycles -= 15; ! 5110: m_regHL = Adc_2(m_regHL, m_regHL); ! 5111: break; ! 5112: ! 5113: case 0x6B: // ld_hl_xword ! 5114: cCycles -= 20; ! 5115: m_regHL = MemReadWord(ImmedWord()); ! 5116: break; ! 5117: ! 5118: case 0x6C: // neg ! 5119: cCycles -= 8; ! 5120: { ! 5121: BYTE b = m_regA; ! 5122: m_regA = 0; ! 5123: Sub_1(b); ! 5124: break; ! 5125: } ! 5126: ! 5127: case 0x6D: // reti ! 5128: cCycles -= 8; ! 5129: cCycles -= Ret0(TRUE); ! 5130: break; ! 5131: ! 5132: case 0x6E: // im_0 ! 5133: cCycles -= 8; ! 5134: m_nIM = 0; ! 5135: break; ! 5136: ! 5137: case 0x6F: // rld ! 5138: cCycles -= 18; ! 5139: { ! 5140: BYTE i; ! 5141: i=MemReadByte(m_regHL); ! 5142: MemWriteByte(m_regHL,(i<<4)|(m_regA&0x0F)); ! 5143: m_regA=(m_regA&0xF0)|(i>>4); ! 5144: m_regF=(m_regF&C_FLAG)|ZSPTable[m_regA]; ! 5145: break; ! 5146: } ! 5147: ! 5148: case 0x70: // in_0_c ! 5149: cCycles -= 12; ! 5150: In(m_regC); ! 5151: break; ! 5152: ! 5153: case 0x71: // out_c_0 ! 5154: cCycles -= 12; ! 5155: Out(m_regC, 0); ! 5156: break; ! 5157: ! 5158: case 0x72: // sbc_hl_sp ! 5159: cCycles -= 15; ! 5160: m_regHL = Sbc_2(m_regHL, GetSP()); ! 5161: break; ! 5162: ! 5163: case 0x73: // ld_xword_sp ! 5164: cCycles -= 20; ! 5165: MemWriteWord(ImmedWord(), GetSP()); ! 5166: break; ! 5167: ! 5168: case 0x74: // neg ! 5169: cCycles -= 8; ! 5170: { ! 5171: BYTE b = m_regA; ! 5172: m_regA = 0; ! 5173: Sub_1(b); ! 5174: break; ! 5175: } ! 5176: ! 5177: case 0x75: // retn ! 5178: cCycles -= 8; ! 5179: m_iff1 = m_iff2; ! 5180: cCycles -= Ret0(TRUE); ! 5181: break; ! 5182: ! 5183: case 0x76: // im_1 ! 5184: cCycles -= 8; ! 5185: m_nIM = 1; ! 5186: break; ! 5187: ! 5188: case 0x77: // nop ! 5189: cCycles -= 0; ! 5190: break; ! 5191: ! 5192: case 0x78: // in_a_c ! 5193: cCycles -= 12; ! 5194: m_regA = In(m_regC); ! 5195: break; ! 5196: ! 5197: case 0x79: // out_c_a ! 5198: cCycles -= 12; ! 5199: Out(m_regC, m_regA); ! 5200: break; ! 5201: ! 5202: case 0x7A: // adc_hl_sp ! 5203: cCycles -= 15; ! 5204: m_regHL = Adc_2(m_regHL, GetSP()); ! 5205: break; ! 5206: ! 5207: case 0x7B: // ld_sp_xword ! 5208: cCycles -= 20; ! 5209: SetSP(MemReadWord(ImmedWord())); ! 5210: break; ! 5211: ! 5212: case 0x7C: // neg ! 5213: cCycles -= 8; ! 5214: { ! 5215: BYTE b = m_regA; ! 5216: m_regA = 0; ! 5217: Sub_1(b); ! 5218: break; ! 5219: } ! 5220: ! 5221: case 0x7D: // reti ! 5222: cCycles -= 8; ! 5223: cCycles -= Ret0(TRUE); ! 5224: break; ! 5225: ! 5226: case 0x7E: // im_2 ! 5227: cCycles -= 8; ! 5228: m_nIM = 2; ! 5229: break; ! 5230: ! 5231: case 0x7F: // nop ! 5232: cCycles -= 0; ! 5233: break; ! 5234: ! 5235: case 0x80: // nop ! 5236: cCycles -= 0; ! 5237: break; ! 5238: ! 5239: case 0x81: // nop ! 5240: cCycles -= 0; ! 5241: break; ! 5242: ! 5243: case 0x82: // nop ! 5244: cCycles -= 0; ! 5245: break; ! 5246: ! 5247: case 0x83: // nop ! 5248: cCycles -= 0; ! 5249: break; ! 5250: ! 5251: case 0x84: // nop ! 5252: cCycles -= 0; ! 5253: break; ! 5254: ! 5255: case 0x85: // nop ! 5256: cCycles -= 0; ! 5257: break; ! 5258: ! 5259: case 0x86: // nop ! 5260: cCycles -= 0; ! 5261: break; ! 5262: ! 5263: case 0x87: // nop ! 5264: cCycles -= 0; ! 5265: break; ! 5266: ! 5267: case 0x88: // nop ! 5268: cCycles -= 0; ! 5269: break; ! 5270: ! 5271: case 0x89: // nop ! 5272: cCycles -= 0; ! 5273: break; ! 5274: ! 5275: case 0x8A: // nop ! 5276: cCycles -= 0; ! 5277: break; ! 5278: ! 5279: case 0x8B: // nop ! 5280: cCycles -= 0; ! 5281: break; ! 5282: ! 5283: case 0x8C: // nop ! 5284: cCycles -= 0; ! 5285: break; ! 5286: ! 5287: case 0x8D: // nop ! 5288: cCycles -= 0; ! 5289: break; ! 5290: ! 5291: case 0x8E: // nop ! 5292: cCycles -= 0; ! 5293: break; ! 5294: ! 5295: case 0x8F: // nop ! 5296: cCycles -= 0; ! 5297: break; ! 5298: ! 5299: case 0x90: // nop ! 5300: cCycles -= 0; ! 5301: break; ! 5302: ! 5303: case 0x91: // nop ! 5304: cCycles -= 0; ! 5305: break; ! 5306: ! 5307: case 0x92: // nop ! 5308: cCycles -= 0; ! 5309: break; ! 5310: ! 5311: case 0x93: // nop ! 5312: cCycles -= 0; ! 5313: break; ! 5314: ! 5315: case 0x94: // nop ! 5316: cCycles -= 0; ! 5317: break; ! 5318: ! 5319: case 0x95: // nop ! 5320: cCycles -= 0; ! 5321: break; ! 5322: ! 5323: case 0x96: // nop ! 5324: cCycles -= 0; ! 5325: break; ! 5326: ! 5327: case 0x97: // nop ! 5328: cCycles -= 0; ! 5329: break; ! 5330: ! 5331: case 0x98: // nop ! 5332: cCycles -= 0; ! 5333: break; ! 5334: ! 5335: case 0x99: // nop ! 5336: cCycles -= 0; ! 5337: break; ! 5338: ! 5339: case 0x9A: // nop ! 5340: cCycles -= 0; ! 5341: break; ! 5342: ! 5343: case 0x9B: // nop ! 5344: cCycles -= 0; ! 5345: break; ! 5346: ! 5347: case 0x9C: // nop ! 5348: cCycles -= 0; ! 5349: break; ! 5350: ! 5351: case 0x9D: // nop ! 5352: cCycles -= 0; ! 5353: break; ! 5354: ! 5355: case 0x9E: // nop ! 5356: cCycles -= 0; ! 5357: break; ! 5358: ! 5359: case 0x9F: // nop ! 5360: cCycles -= 0; ! 5361: break; ! 5362: ! 5363: case 0xA0: // ldi ! 5364: cCycles -= 16; ! 5365: { ! 5366: MemWriteByte(m_regDE++, MemReadByte(m_regHL++)); ! 5367: m_regBC--; ! 5368: m_regF = (m_regF & 0xE9) | (m_regBC ? V_FLAG : 0); ! 5369: break; ! 5370: } ! 5371: ! 5372: case 0xA1: // cpi ! 5373: cCycles -= 16; ! 5374: { ! 5375: BYTE i,j; ! 5376: i=MemReadByte(m_regHL); ! 5377: j=m_regA-i; ! 5378: ++m_regHL; ! 5379: --m_regBC; ! 5380: m_regF=(m_regF&C_FLAG)|ZSTable[j]| ! 5381: ((m_regA^i^j)&H_FLAG)|(m_regBC? V_FLAG:0)|N_FLAG; ! 5382: break; ! 5383: } ! 5384: ! 5385: case 0xA2: // ini ! 5386: cCycles -= 16; ! 5387: { ! 5388: MemWriteByte(m_regHL,In(m_regC)); ! 5389: ++m_regHL; ! 5390: --m_regB; ! 5391: m_regF=(m_regB)? N_FLAG:(N_FLAG|Z_FLAG); ! 5392: break; ! 5393: } ! 5394: ! 5395: case 0xA3: // outi ! 5396: cCycles -= 16; ! 5397: { ! 5398: Out(m_regC, MemReadByte(m_regHL)); ! 5399: ++m_regHL; ! 5400: --m_regB; ! 5401: m_regF=(m_regB)? N_FLAG:(Z_FLAG|N_FLAG); ! 5402: break; ! 5403: } ! 5404: ! 5405: case 0xA4: // nop ! 5406: cCycles -= 0; ! 5407: break; ! 5408: ! 5409: case 0xA5: // nop ! 5410: cCycles -= 0; ! 5411: break; ! 5412: ! 5413: case 0xA6: // nop ! 5414: cCycles -= 0; ! 5415: break; ! 5416: ! 5417: case 0xA7: // nop ! 5418: cCycles -= 0; ! 5419: break; ! 5420: ! 5421: case 0xA8: // ldd ! 5422: cCycles -= 16; ! 5423: { ! 5424: MemWriteByte(m_regDE,MemReadByte(m_regHL)); ! 5425: --m_regDE; ! 5426: --m_regHL; ! 5427: --m_regBC; ! 5428: m_regF=(m_regF&0xE9)|(m_regBC? V_FLAG:0); ! 5429: break; ! 5430: } ! 5431: ! 5432: case 0xA9: // cpd ! 5433: cCycles -= 16; ! 5434: { ! 5435: BYTE i,j; ! 5436: i=MemReadByte(m_regHL); ! 5437: j=m_regA-i; ! 5438: --m_regHL; ! 5439: --m_regBC; ! 5440: m_regF=(m_regF&C_FLAG)|ZSTable[j]| ! 5441: ((m_regA^i^j)&H_FLAG)|(m_regBC? V_FLAG:0)|N_FLAG; ! 5442: break; ! 5443: } ! 5444: ! 5445: case 0xAA: // ind ! 5446: cCycles -= 16; ! 5447: { ! 5448: MemWriteByte(m_regHL,In(m_regC)); ! 5449: --m_regHL; ! 5450: --m_regB; ! 5451: m_regF=(m_regB)? N_FLAG:(N_FLAG|Z_FLAG); ! 5452: break; ! 5453: } ! 5454: ! 5455: case 0xAB: // outd ! 5456: cCycles -= 16; ! 5457: { ! 5458: Out (m_regC,MemReadByte(m_regHL)); ! 5459: --m_regHL; ! 5460: --m_regB; ! 5461: m_regF=(m_regB)? N_FLAG:(Z_FLAG|N_FLAG); ! 5462: break; ! 5463: } ! 5464: ! 5465: case 0xAC: // nop ! 5466: cCycles -= 0; ! 5467: break; ! 5468: ! 5469: case 0xAD: // nop ! 5470: cCycles -= 0; ! 5471: break; ! 5472: ! 5473: case 0xAE: // nop ! 5474: cCycles -= 0; ! 5475: break; ! 5476: ! 5477: case 0xAF: // nop ! 5478: cCycles -= 0; ! 5479: break; ! 5480: ! 5481: case 0xB0: // ldir ! 5482: cCycles -= 0; ! 5483: { ! 5484: m_regR -= 2; ! 5485: ! 5486: /* ! 5487: if (m_rgfMemDesc[m_regHL] & MF_READ_DIRECT && ! 5488: m_rgfMemDesc[m_regDE] & MF_WRITE_DIRECT) ! 5489: { ! 5490: do ! 5491: { ! 5492: m_regR += 2; ! 5493: m_rgbMemory[m_regDE++] = m_rgbMemory[m_regHL++]; ! 5494: cCycles -= 21; ! 5495: } ! 5496: while (--m_regBC); // && cCycles>0); ! 5497: ! 5498: m_regF=(m_regF&0xE9)|(m_regBC? V_FLAG:0); ! 5499: ! 5500: if (m_regBC) ! 5501: // m_regPC -= 2; ! 5502: AdjustPC(-2); ! 5503: else ! 5504: cCycles += 5; ! 5505: } ! 5506: else ! 5507: */ ! 5508: { ! 5509: do ! 5510: { ! 5511: m_regR += 2; ! 5512: MemWriteByte(m_regDE++, MemReadByte(m_regHL++)); ! 5513: cCycles -= 21; ! 5514: } ! 5515: while (--m_regBC); // && cCycles>0); ! 5516: ! 5517: m_regF=(m_regF&0xE9)|(m_regBC? V_FLAG:0); ! 5518: ! 5519: if (m_regBC) ! 5520: // m_regPC -= 2; ! 5521: AdjustPC(-2); ! 5522: else ! 5523: cCycles += 5; ! 5524: } ! 5525: ! 5526: break; ! 5527: } ! 5528: ! 5529: case 0xB1: // cpir ! 5530: cCycles -= 0; ! 5531: { ! 5532: BYTE i,j; ! 5533: m_regR-=2; ! 5534: do ! 5535: { ! 5536: m_regR+=2; ! 5537: i=MemReadByte(m_regHL); ! 5538: j=m_regA-i; ! 5539: ++m_regHL; ! 5540: --m_regBC; ! 5541: cCycles-=21; ! 5542: } ! 5543: while (m_regBC && j && cCycles>0); ! 5544: m_regF=(m_regF&C_FLAG)|ZSTable[j]| ! 5545: ((m_regA^i^j)&H_FLAG)|(m_regBC? V_FLAG:0)|N_FLAG; ! 5546: if (m_regBC && j) AdjustPC(-2); // m_regPC-=2; ! 5547: else cCycles+=5; ! 5548: break; ! 5549: } ! 5550: ! 5551: case 0xB2: // inir ! 5552: cCycles -= 0; ! 5553: { ! 5554: m_regR-=2; ! 5555: do ! 5556: { ! 5557: m_regR+=2; ! 5558: MemWriteByte(m_regHL,In(m_regC)); ! 5559: ++m_regHL; ! 5560: --m_regB; ! 5561: cCycles-=21; ! 5562: } ! 5563: while (m_regB && cCycles>0); ! 5564: m_regF=(m_regB)? N_FLAG:(N_FLAG|Z_FLAG); ! 5565: if (m_regB) AdjustPC(-2); // m_regPC-=2; ! 5566: else cCycles+=5; ! 5567: break; ! 5568: } ! 5569: ! 5570: case 0xB3: // otir ! 5571: cCycles -= 0; ! 5572: { ! 5573: m_regR-=2; ! 5574: do ! 5575: { ! 5576: m_regR+=2; ! 5577: Out (m_regC,MemReadByte(m_regHL)); ! 5578: ++m_regHL; ! 5579: --m_regB; ! 5580: cCycles-=21; ! 5581: } ! 5582: while (m_regB && cCycles>0); ! 5583: m_regF=(m_regB)? N_FLAG:(Z_FLAG|N_FLAG); ! 5584: if (m_regB) AdjustPC(-2); // m_regPC-=2; ! 5585: else cCycles+=5; ! 5586: } ! 5587: break; ! 5588: ! 5589: case 0xB4: // nop ! 5590: cCycles -= 0; ! 5591: break; ! 5592: ! 5593: case 0xB5: // nop ! 5594: cCycles -= 0; ! 5595: break; ! 5596: ! 5597: case 0xB6: // nop ! 5598: cCycles -= 0; ! 5599: break; ! 5600: ! 5601: case 0xB7: // nop ! 5602: cCycles -= 0; ! 5603: break; ! 5604: ! 5605: case 0xB8: // lddr ! 5606: cCycles -= 0; ! 5607: { ! 5608: m_regR-=2; ! 5609: do ! 5610: { ! 5611: m_regR+=2; ! 5612: MemWriteByte(m_regDE,MemReadByte(m_regHL)); ! 5613: --m_regDE; ! 5614: --m_regHL; ! 5615: --m_regBC; ! 5616: cCycles-=21; ! 5617: } ! 5618: while (m_regBC); ! 5619: m_regF=(m_regF&0xE9)|(m_regBC? V_FLAG:0); ! 5620: if (m_regBC) AdjustPC(-2); // m_regPC-=2; ! 5621: else ! 5622: cCycles+=5; ! 5623: break; ! 5624: } ! 5625: ! 5626: case 0xB9: // cpdr ! 5627: cCycles -= 0; ! 5628: { ! 5629: BYTE i,j; ! 5630: m_regR-=2; ! 5631: do ! 5632: { ! 5633: m_regR+=2; ! 5634: i=MemReadByte(m_regHL); ! 5635: j=m_regA-i; ! 5636: --m_regHL; ! 5637: --m_regBC; ! 5638: cCycles-=21; ! 5639: } ! 5640: while (m_regBC && j && cCycles>0); ! 5641: m_regF=(m_regF&C_FLAG)|ZSTable[j]| ! 5642: ((m_regA^i^j)&H_FLAG)|(m_regBC? V_FLAG:0)|N_FLAG; ! 5643: if (m_regBC && j) AdjustPC(-2); // m_regPC-=2; ! 5644: else cCycles+=5; ! 5645: break; ! 5646: } ! 5647: ! 5648: case 0xBA: // indr ! 5649: cCycles -= 0; ! 5650: { ! 5651: m_regR-=2; ! 5652: do ! 5653: { ! 5654: m_regR+=2; ! 5655: MemWriteByte(m_regHL,In(m_regC)); ! 5656: --m_regHL; ! 5657: --m_regB; ! 5658: cCycles-=21; ! 5659: } ! 5660: while (m_regB && cCycles>0); ! 5661: m_regF=(m_regB)? N_FLAG:(N_FLAG|Z_FLAG); ! 5662: if (m_regB) AdjustPC(-2); // m_regPC-=2; ! 5663: else cCycles+=5; ! 5664: break; ! 5665: } ! 5666: ! 5667: case 0xBB: // otdr ! 5668: cCycles -= 0; ! 5669: { ! 5670: m_regR-=2; ! 5671: do ! 5672: { ! 5673: m_regR+=2; ! 5674: Out (m_regC,MemReadByte(m_regHL)); ! 5675: --m_regHL; ! 5676: --m_regB; ! 5677: cCycles-=21; ! 5678: } ! 5679: while (m_regB && cCycles>0); ! 5680: m_regF=(m_regB)? N_FLAG:(Z_FLAG|N_FLAG); ! 5681: if (m_regB) AdjustPC(-2); // m_regPC-=2; ! 5682: else cCycles+=5; ! 5683: break; ! 5684: } ! 5685: ! 5686: case 0xBC: // nop ! 5687: cCycles -= 0; ! 5688: break; ! 5689: ! 5690: case 0xBD: // nop ! 5691: cCycles -= 0; ! 5692: break; ! 5693: ! 5694: case 0xBE: // nop ! 5695: cCycles -= 0; ! 5696: break; ! 5697: ! 5698: case 0xBF: // nop ! 5699: cCycles -= 0; ! 5700: break; ! 5701: ! 5702: case 0xC0: // nop ! 5703: cCycles -= 0; ! 5704: break; ! 5705: ! 5706: case 0xC1: // nop ! 5707: cCycles -= 0; ! 5708: break; ! 5709: ! 5710: case 0xC2: // nop ! 5711: cCycles -= 0; ! 5712: break; ! 5713: ! 5714: case 0xC3: // nop ! 5715: cCycles -= 0; ! 5716: break; ! 5717: ! 5718: case 0xC4: // nop ! 5719: cCycles -= 0; ! 5720: break; ! 5721: ! 5722: case 0xC5: // nop ! 5723: cCycles -= 0; ! 5724: break; ! 5725: ! 5726: case 0xC6: // nop ! 5727: cCycles -= 0; ! 5728: break; ! 5729: ! 5730: case 0xC7: // nop ! 5731: cCycles -= 0; ! 5732: break; ! 5733: ! 5734: case 0xC8: // nop ! 5735: cCycles -= 0; ! 5736: break; ! 5737: ! 5738: case 0xC9: // nop ! 5739: cCycles -= 0; ! 5740: break; ! 5741: ! 5742: case 0xCA: // nop ! 5743: cCycles -= 0; ! 5744: break; ! 5745: ! 5746: case 0xCB: // nop ! 5747: cCycles -= 0; ! 5748: break; ! 5749: ! 5750: case 0xCC: // nop ! 5751: cCycles -= 0; ! 5752: break; ! 5753: ! 5754: case 0xCD: // nop ! 5755: cCycles -= 0; ! 5756: break; ! 5757: ! 5758: case 0xCE: // nop ! 5759: cCycles -= 0; ! 5760: break; ! 5761: ! 5762: case 0xCF: // nop ! 5763: cCycles -= 0; ! 5764: break; ! 5765: ! 5766: case 0xD0: // nop ! 5767: cCycles -= 0; ! 5768: break; ! 5769: ! 5770: case 0xD1: // nop ! 5771: cCycles -= 0; ! 5772: break; ! 5773: ! 5774: case 0xD2: // nop ! 5775: cCycles -= 0; ! 5776: break; ! 5777: ! 5778: case 0xD3: // nop ! 5779: cCycles -= 0; ! 5780: break; ! 5781: ! 5782: case 0xD4: // nop ! 5783: cCycles -= 0; ! 5784: break; ! 5785: ! 5786: case 0xD5: // nop ! 5787: cCycles -= 0; ! 5788: break; ! 5789: ! 5790: case 0xD6: // nop ! 5791: cCycles -= 0; ! 5792: break; ! 5793: ! 5794: case 0xD7: // nop ! 5795: cCycles -= 0; ! 5796: break; ! 5797: ! 5798: case 0xD8: // nop ! 5799: cCycles -= 0; ! 5800: break; ! 5801: ! 5802: case 0xD9: // nop ! 5803: cCycles -= 0; ! 5804: break; ! 5805: ! 5806: case 0xDA: // nop ! 5807: cCycles -= 0; ! 5808: break; ! 5809: ! 5810: case 0xDB: // nop ! 5811: cCycles -= 0; ! 5812: break; ! 5813: ! 5814: case 0xDC: // nop ! 5815: cCycles -= 0; ! 5816: break; ! 5817: ! 5818: case 0xDD: // nop ! 5819: cCycles -= 0; ! 5820: break; ! 5821: ! 5822: case 0xDE: // nop ! 5823: cCycles -= 0; ! 5824: break; ! 5825: ! 5826: case 0xDF: // nop ! 5827: cCycles -= 0; ! 5828: break; ! 5829: ! 5830: case 0xE0: // nop ! 5831: cCycles -= 0; ! 5832: break; ! 5833: ! 5834: case 0xE1: // nop ! 5835: cCycles -= 0; ! 5836: break; ! 5837: ! 5838: case 0xE2: // nop ! 5839: cCycles -= 0; ! 5840: break; ! 5841: ! 5842: case 0xE3: // nop ! 5843: cCycles -= 0; ! 5844: break; ! 5845: ! 5846: case 0xE4: // nop ! 5847: cCycles -= 0; ! 5848: break; ! 5849: ! 5850: case 0xE5: // nop ! 5851: cCycles -= 0; ! 5852: break; ! 5853: ! 5854: case 0xE6: // nop ! 5855: cCycles -= 0; ! 5856: break; ! 5857: ! 5858: case 0xE7: // nop ! 5859: cCycles -= 0; ! 5860: break; ! 5861: ! 5862: case 0xE8: // nop ! 5863: cCycles -= 0; ! 5864: break; ! 5865: ! 5866: case 0xE9: // nop ! 5867: cCycles -= 0; ! 5868: break; ! 5869: ! 5870: case 0xEA: // nop ! 5871: cCycles -= 0; ! 5872: break; ! 5873: ! 5874: case 0xEB: // nop ! 5875: cCycles -= 0; ! 5876: break; ! 5877: ! 5878: case 0xEC: // nop ! 5879: cCycles -= 0; ! 5880: break; ! 5881: ! 5882: case 0xED: // nop ! 5883: cCycles -= 0; ! 5884: break; ! 5885: ! 5886: case 0xEE: // nop ! 5887: cCycles -= 0; ! 5888: break; ! 5889: ! 5890: case 0xEF: // nop ! 5891: cCycles -= 0; ! 5892: break; ! 5893: ! 5894: case 0xF0: // nop ! 5895: cCycles -= 0; ! 5896: break; ! 5897: ! 5898: case 0xF1: // nop ! 5899: cCycles -= 0; ! 5900: break; ! 5901: ! 5902: case 0xF2: // nop ! 5903: cCycles -= 0; ! 5904: break; ! 5905: ! 5906: case 0xF3: // nop ! 5907: cCycles -= 0; ! 5908: break; ! 5909: ! 5910: case 0xF4: // nop ! 5911: cCycles -= 0; ! 5912: break; ! 5913: ! 5914: case 0xF5: // nop ! 5915: cCycles -= 0; ! 5916: break; ! 5917: ! 5918: case 0xF6: // nop ! 5919: cCycles -= 0; ! 5920: break; ! 5921: ! 5922: case 0xF7: // nop ! 5923: cCycles -= 0; ! 5924: break; ! 5925: ! 5926: case 0xF8: // nop ! 5927: cCycles -= 0; ! 5928: break; ! 5929: ! 5930: case 0xF9: // nop ! 5931: cCycles -= 0; ! 5932: break; ! 5933: ! 5934: case 0xFA: // nop ! 5935: cCycles -= 0; ! 5936: break; ! 5937: ! 5938: case 0xFB: // nop ! 5939: cCycles -= 0; ! 5940: break; ! 5941: ! 5942: case 0xFC: // nop ! 5943: cCycles -= 0; ! 5944: break; ! 5945: ! 5946: case 0xFD: // nop ! 5947: cCycles -= 0; ! 5948: break; ! 5949: ! 5950: case 0xFE: // patch ! 5951: cCycles -= 0; ! 5952: break; ! 5953: ! 5954: case 0xFF: // nop ! 5955: cCycles -= 0; ! 5956: break; ! 5957: ! 5958: default: ! 5959: _ASSERT(FALSE); ! 5960: break; ! 5961: } ! 5962: ! 5963: return (cCyclesArg - cCycles); ! 5964: } ! 5965: ! 5966: int Ei() { ! 5967: /* fprintf ( stderr, "Enable Interrupt\n" ); */ ! 5968: m_iff2 = 1; ! 5969: ! 5970: if (m_iff1 != 0) ! 5971: return 0; ! 5972: ! 5973: m_iff1 = 1; ! 5974: ! 5975: return(0); ! 5976: } ! 5977: ! 5978: void Di() { ! 5979: /* fprintf ( stderr, "Disable Interrupt\n" ); */ ! 5980: m_iff1 = 0; ! 5981: m_iff2 = 0; ! 5982: } ! 5983: ! 5984: /* *************************************************************************** ! 5985: * FD prefixed opcodes ! 5986: * *************************************************************************** ! 5987: */ ! 5988: /* inline */ WORD IndirectIY() { ! 5989: return m_regIY + (signed char)ImmedByte(); ! 5990: } ! 5991: ! 5992: int HandleFD() { ! 5993: ! 5994: WORD wAddr; ! 5995: WORD wTemp; ! 5996: const BYTE bOpcode = ImmedByte(); ! 5997: ! 5998: m_regR++; ! 5999: ! 6000: switch (bOpcode) ! 6001: { ! 6002: case 0x00: // no_op ! 6003: SetPC(GetPC() - 1); ! 6004: return 0; ! 6005: ! 6006: case 0x01: // no_op ! 6007: SetPC(GetPC() - 1); ! 6008: return 0; ! 6009: ! 6010: case 0x02: // no_op ! 6011: SetPC(GetPC() - 1); ! 6012: return 0; ! 6013: ! 6014: case 0x03: // no_op ! 6015: SetPC(GetPC() - 1); ! 6016: return 0; ! 6017: ! 6018: case 0x04: // no_op ! 6019: SetPC(GetPC() - 1); ! 6020: return 0; ! 6021: ! 6022: case 0x05: // no_op ! 6023: SetPC(GetPC() - 1); ! 6024: return 0; ! 6025: ! 6026: case 0x06: // no_op ! 6027: SetPC(GetPC() - 1); ! 6028: return 0; ! 6029: ! 6030: case 0x07: // no_op ! 6031: SetPC(GetPC() - 1); ! 6032: return 0; ! 6033: ! 6034: case 0x08: // no_op ! 6035: SetPC(GetPC() - 1); ! 6036: return 0; ! 6037: ! 6038: case 0x09: // add_iy_bc ! 6039: m_regIY = Add_2(m_regIY, m_regBC); ! 6040: return 15; ! 6041: ! 6042: case 0x0A: // no_op ! 6043: SetPC(GetPC() - 1); ! 6044: return 0; ! 6045: ! 6046: case 0x0B: // no_op ! 6047: SetPC(GetPC() - 1); ! 6048: return 0; ! 6049: ! 6050: case 0x0C: // no_op ! 6051: SetPC(GetPC() - 1); ! 6052: return 0; ! 6053: ! 6054: case 0x0D: // no_op ! 6055: SetPC(GetPC() - 1); ! 6056: return 0; ! 6057: ! 6058: case 0x0E: // no_op ! 6059: SetPC(GetPC() - 1); ! 6060: return 0; ! 6061: ! 6062: case 0x0F: // no_op ! 6063: SetPC(GetPC() - 1); ! 6064: return 0; ! 6065: ! 6066: case 0x10: // no_op ! 6067: SetPC(GetPC() - 1); ! 6068: return 0; ! 6069: ! 6070: case 0x11: // no_op ! 6071: SetPC(GetPC() - 1); ! 6072: return 0; ! 6073: ! 6074: case 0x12: // no_op ! 6075: SetPC(GetPC() - 1); ! 6076: return 0; ! 6077: ! 6078: case 0x13: // no_op ! 6079: SetPC(GetPC() - 1); ! 6080: return 0; ! 6081: ! 6082: case 0x14: // no_op ! 6083: SetPC(GetPC() - 1); ! 6084: return 0; ! 6085: ! 6086: case 0x15: // no_op ! 6087: SetPC(GetPC() - 1); ! 6088: return 0; ! 6089: ! 6090: case 0x16: // no_op ! 6091: SetPC(GetPC() - 1); ! 6092: return 0; ! 6093: ! 6094: case 0x17: // no_op ! 6095: SetPC(GetPC() - 1); ! 6096: return 0; ! 6097: ! 6098: case 0x18: // no_op ! 6099: SetPC(GetPC() - 1); ! 6100: return 0; ! 6101: ! 6102: case 0x19: // add_iy_de ! 6103: m_regIY = Add_2(m_regIY, m_regDE); ! 6104: return 15; ! 6105: ! 6106: case 0x1A: // no_op ! 6107: SetPC(GetPC() - 1); ! 6108: return 0; ! 6109: ! 6110: case 0x1B: // no_op ! 6111: SetPC(GetPC() - 1); ! 6112: return 0; ! 6113: ! 6114: case 0x1C: // no_op ! 6115: SetPC(GetPC() - 1); ! 6116: return 0; ! 6117: ! 6118: case 0x1D: // no_op ! 6119: SetPC(GetPC() - 1); ! 6120: return 0; ! 6121: ! 6122: case 0x1E: // no_op ! 6123: SetPC(GetPC() - 1); ! 6124: return 0; ! 6125: ! 6126: case 0x1F: // no_op ! 6127: SetPC(GetPC() - 1); ! 6128: return 0; ! 6129: ! 6130: case 0x20: // no_op ! 6131: SetPC(GetPC() - 1); ! 6132: return 0; ! 6133: ! 6134: case 0x21: // ld_iy_word ! 6135: m_regIY = ImmedWord(); ! 6136: return 14; ! 6137: ! 6138: case 0x22: // ld_xword_iy ! 6139: MemWriteWord(ImmedWord(), m_regIY); ! 6140: return 20; ! 6141: ! 6142: case 0x23: // inc_iy ! 6143: m_regIY++; ! 6144: return 10; ! 6145: ! 6146: case 0x24: // inc_iyh ! 6147: m_regIYh = Inc(m_regIYh); ! 6148: return 9; ! 6149: ! 6150: case 0x25: // dec_iyh ! 6151: m_regIYh = Dec(m_regIYh); ! 6152: return 9; ! 6153: ! 6154: case 0x26: // ld_iyh_byte ! 6155: m_regIYh = ImmedByte(); ! 6156: return 9; ! 6157: ! 6158: case 0x27: // no_op ! 6159: SetPC(GetPC() - 1); ! 6160: return 0; ! 6161: ! 6162: case 0x28: // no_op ! 6163: SetPC(GetPC() - 1); ! 6164: return 0; ! 6165: ! 6166: case 0x29: // add_iy_iy ! 6167: m_regIY = Add_2(m_regIY, m_regIY); ! 6168: return 15; ! 6169: ! 6170: case 0x2A: // ld_iy_xword ! 6171: m_regIY = MemReadWord(ImmedWord()); ! 6172: return 20; ! 6173: ! 6174: case 0x2B: // dec_iy ! 6175: m_regIY--; ! 6176: return 10; ! 6177: ! 6178: case 0x2C: // inc_iyl ! 6179: m_regIYl = Inc(m_regIYl); ! 6180: return 9; ! 6181: ! 6182: case 0x2D: // dec_iyl ! 6183: m_regIYl = Dec(m_regIYl); ! 6184: return 9; ! 6185: ! 6186: case 0x2E: // ld_iyl_byte ! 6187: m_regIYl = ImmedByte(); ! 6188: return 9; ! 6189: ! 6190: case 0x2F: // no_op ! 6191: SetPC(GetPC() - 1); ! 6192: return 0; ! 6193: ! 6194: case 0x30: // no_op ! 6195: SetPC(GetPC() - 1); ! 6196: return 0; ! 6197: ! 6198: case 0x31: // no_op ! 6199: SetPC(GetPC() - 1); ! 6200: return 0; ! 6201: ! 6202: case 0x32: // no_op ! 6203: SetPC(GetPC() - 1); ! 6204: return 0; ! 6205: ! 6206: case 0x33: // no_op ! 6207: SetPC(GetPC() - 1); ! 6208: return 0; ! 6209: ! 6210: case 0x34: // inc_xiy ! 6211: wAddr = IndirectIY(); ! 6212: MemWriteByte(wAddr, Inc(MemReadByte(wAddr))); ! 6213: return 23; ! 6214: ! 6215: case 0x35: // dec_xiy ! 6216: wAddr = IndirectIY(); ! 6217: MemWriteByte(wAddr, Dec(MemReadByte(wAddr))); ! 6218: return 23; ! 6219: ! 6220: case 0x36: // ld_xiy_byte ! 6221: wAddr = IndirectIY(); ! 6222: MemWriteByte(wAddr, ImmedByte()); ! 6223: return 19; ! 6224: ! 6225: case 0x37: // no_op ! 6226: SetPC(GetPC() - 1); ! 6227: return 0; ! 6228: ! 6229: case 0x38: // no_op ! 6230: SetPC(GetPC() - 1); ! 6231: return 0; ! 6232: ! 6233: case 0x39: // add_iy_sp ! 6234: m_regIY = Add_2(m_regIY, GetSP()); ! 6235: return 15; ! 6236: ! 6237: case 0x3A: // no_op ! 6238: SetPC(GetPC() - 1); ! 6239: return 0; ! 6240: ! 6241: case 0x3B: // no_op ! 6242: SetPC(GetPC() - 1); ! 6243: return 0; ! 6244: ! 6245: case 0x3C: // no_op ! 6246: SetPC(GetPC() - 1); ! 6247: return 0; ! 6248: ! 6249: case 0x3D: // no_op ! 6250: SetPC(GetPC() - 1); ! 6251: return 0; ! 6252: ! 6253: case 0x3E: // no_op ! 6254: SetPC(GetPC() - 1); ! 6255: return 0; ! 6256: ! 6257: case 0x3F: // no_op ! 6258: SetPC(GetPC() - 1); ! 6259: return 0; ! 6260: ! 6261: case 0x40: // no_op ! 6262: SetPC(GetPC() - 1); ! 6263: return 0; ! 6264: ! 6265: case 0x41: // no_op ! 6266: SetPC(GetPC() - 1); ! 6267: return 0; ! 6268: ! 6269: case 0x42: // no_op ! 6270: SetPC(GetPC() - 1); ! 6271: return 0; ! 6272: ! 6273: case 0x43: // no_op ! 6274: SetPC(GetPC() - 1); ! 6275: return 0; ! 6276: ! 6277: case 0x44: // ld_b_iyh ! 6278: m_regB = m_regIYh; ! 6279: return 9; ! 6280: ! 6281: case 0x45: // ld_b_iyl ! 6282: m_regB = m_regIYl; ! 6283: return 9; ! 6284: ! 6285: case 0x46: // ld_b_xiy ! 6286: m_regB = MemReadByte(IndirectIY()); ! 6287: return 19; ! 6288: ! 6289: case 0x47: // no_op ! 6290: SetPC(GetPC() - 1); ! 6291: return 0; ! 6292: ! 6293: case 0x48: // no_op ! 6294: SetPC(GetPC() - 1); ! 6295: return 0; ! 6296: ! 6297: case 0x49: // no_op ! 6298: SetPC(GetPC() - 1); ! 6299: return 0; ! 6300: ! 6301: case 0x4A: // no_op ! 6302: SetPC(GetPC() - 1); ! 6303: return 0; ! 6304: ! 6305: case 0x4B: // no_op ! 6306: SetPC(GetPC() - 1); ! 6307: return 0; ! 6308: ! 6309: case 0x4C: // ld_c_iyh ! 6310: m_regC = m_regIYh; ! 6311: return 9; ! 6312: ! 6313: case 0x4D: // ld_c_iyl ! 6314: m_regC = m_regIYl; ! 6315: return 9; ! 6316: ! 6317: case 0x4E: // ld_c_xiy ! 6318: m_regC = MemReadByte(IndirectIY()); ! 6319: return 19; ! 6320: ! 6321: case 0x4F: // no_op ! 6322: SetPC(GetPC() - 1); ! 6323: return 0; ! 6324: ! 6325: case 0x50: // no_op ! 6326: SetPC(GetPC() - 1); ! 6327: return 0; ! 6328: ! 6329: case 0x51: // no_op ! 6330: SetPC(GetPC() - 1); ! 6331: return 0; ! 6332: ! 6333: case 0x52: // no_op ! 6334: SetPC(GetPC() - 1); ! 6335: return 0; ! 6336: ! 6337: case 0x53: // no_op ! 6338: SetPC(GetPC() - 1); ! 6339: return 0; ! 6340: ! 6341: case 0x54: // ld_d_iyh ! 6342: m_regD = m_regIYh; ! 6343: return 9; ! 6344: ! 6345: case 0x55: // ld_d_iyl ! 6346: m_regD = m_regIYl; ! 6347: return 9; ! 6348: ! 6349: case 0x56: // ld_d_xiy ! 6350: m_regD = MemReadByte(IndirectIY()); ! 6351: return 19; ! 6352: ! 6353: case 0x57: // no_op ! 6354: SetPC(GetPC() - 1); ! 6355: return 0; ! 6356: ! 6357: case 0x58: // no_op ! 6358: SetPC(GetPC() - 1); ! 6359: return 0; ! 6360: ! 6361: case 0x59: // no_op ! 6362: SetPC(GetPC() - 1); ! 6363: return 0; ! 6364: ! 6365: case 0x5A: // no_op ! 6366: SetPC(GetPC() - 1); ! 6367: return 0; ! 6368: ! 6369: case 0x5B: // no_op ! 6370: SetPC(GetPC() - 1); ! 6371: return 0; ! 6372: ! 6373: case 0x5C: // ld_e_iyh ! 6374: m_regE = m_regIYh; ! 6375: return 9; ! 6376: ! 6377: case 0x5D: // ld_e_iyl ! 6378: m_regE = m_regIYl; ! 6379: return 9; ! 6380: ! 6381: case 0x5E: // ld_e_xiy ! 6382: m_regE = MemReadByte(IndirectIY()); ! 6383: return 19; ! 6384: ! 6385: case 0x5F: // no_op ! 6386: SetPC(GetPC() - 1); ! 6387: return 0; ! 6388: ! 6389: case 0x60: // ld_iyh_b ! 6390: m_regIYh = m_regB; ! 6391: return 9; ! 6392: ! 6393: case 0x61: // ld_iyh_c ! 6394: m_regIYh = m_regC; ! 6395: return 9; ! 6396: ! 6397: case 0x62: // ld_iyh_d ! 6398: m_regIYh = m_regD; ! 6399: return 9; ! 6400: ! 6401: case 0x63: // ld_iyh_e ! 6402: m_regIYh = m_regE; ! 6403: return 9; ! 6404: ! 6405: case 0x64: // ld_iyh_h ! 6406: m_regIYh = m_regH; ! 6407: return 9; ! 6408: ! 6409: case 0x65: // ld_iyh_l ! 6410: m_regIYh = m_regL; ! 6411: return 9; ! 6412: ! 6413: case 0x66: // ld_h_xiy ! 6414: m_regH = MemReadByte(IndirectIY()); ! 6415: return 9; ! 6416: ! 6417: case 0x67: // ld_iyh_a ! 6418: m_regIYh = m_regA; ! 6419: return 9; ! 6420: ! 6421: case 0x68: // ld_iyl_b ! 6422: m_regIYl = m_regB; ! 6423: return 9; ! 6424: ! 6425: case 0x69: // ld_iyl_c ! 6426: m_regIYl = m_regC; ! 6427: return 9; ! 6428: ! 6429: case 0x6A: // ld_iyl_d ! 6430: m_regIYl = m_regD; ! 6431: return 9; ! 6432: ! 6433: case 0x6B: // ld_iyl_e ! 6434: m_regIYl = m_regE; ! 6435: return 9; ! 6436: ! 6437: case 0x6C: // ld_iyl_h ! 6438: m_regIYl = m_regH; ! 6439: return 9; ! 6440: ! 6441: case 0x6D: // ld_iyl_l ! 6442: m_regIYl = m_regL; ! 6443: return 9; ! 6444: ! 6445: case 0x6E: // ld_l_xiy ! 6446: m_regL = MemReadByte(IndirectIY()); ! 6447: return 9; ! 6448: ! 6449: case 0x6F: // ld_iyl_a ! 6450: m_regIYl = m_regA; ! 6451: return 9; ! 6452: ! 6453: case 0x70: // ld_xiy_b ! 6454: MemWriteByte(IndirectIY(), m_regB); ! 6455: return 19; ! 6456: ! 6457: case 0x71: // ld_xiy_c ! 6458: MemWriteByte(IndirectIY(), m_regC); ! 6459: return 19; ! 6460: ! 6461: case 0x72: // ld_xiy_d ! 6462: MemWriteByte(IndirectIY(), m_regD); ! 6463: return 19; ! 6464: ! 6465: case 0x73: // ld_xiy_e ! 6466: MemWriteByte(IndirectIY(), m_regE); ! 6467: return 19; ! 6468: ! 6469: case 0x74: // ld_xiy_h ! 6470: MemWriteByte(IndirectIY(), m_regH); ! 6471: return 19; ! 6472: ! 6473: case 0x75: // ld_xiy_l ! 6474: MemWriteByte(IndirectIY(), m_regL); ! 6475: return 19; ! 6476: ! 6477: case 0x76: // no_op ! 6478: SetPC(GetPC() - 1); ! 6479: return 19; ! 6480: ! 6481: case 0x77: // ld_xiy_a ! 6482: MemWriteByte(IndirectIY(), m_regA); ! 6483: return 19; ! 6484: ! 6485: case 0x78: // no_op ! 6486: SetPC(GetPC() - 1); ! 6487: return 0; ! 6488: ! 6489: case 0x79: // no_op ! 6490: SetPC(GetPC() - 1); ! 6491: return 0; ! 6492: ! 6493: case 0x7A: // no_op ! 6494: SetPC(GetPC() - 1); ! 6495: return 0; ! 6496: ! 6497: case 0x7B: // no_op ! 6498: SetPC(GetPC() - 1); ! 6499: return 0; ! 6500: ! 6501: case 0x7C: // ld_a_iyh ! 6502: m_regA = m_regIYh; ! 6503: return 9; ! 6504: ! 6505: case 0x7D: // ld_a_iyl ! 6506: m_regA = m_regIYl; ! 6507: return 9; ! 6508: ! 6509: case 0x7E: // ld_a_xiy ! 6510: m_regA = MemReadByte(IndirectIY()); ! 6511: return 19; ! 6512: ! 6513: case 0x7F: // no_op ! 6514: SetPC(GetPC() - 1); ! 6515: return 0; ! 6516: ! 6517: case 0x80: // no_op ! 6518: SetPC(GetPC() - 1); ! 6519: return 0; ! 6520: ! 6521: case 0x81: // no_op ! 6522: SetPC(GetPC() - 1); ! 6523: return 0; ! 6524: ! 6525: case 0x82: // no_op ! 6526: SetPC(GetPC() - 1); ! 6527: return 0; ! 6528: ! 6529: case 0x83: // no_op ! 6530: SetPC(GetPC() - 1); ! 6531: return 0; ! 6532: ! 6533: case 0x84: // add_a_iyh ! 6534: Add_1(m_regIYh); ! 6535: return 9; ! 6536: ! 6537: case 0x85: // add_a_iyl ! 6538: Add_1(m_regIYl); ! 6539: return 9; ! 6540: ! 6541: case 0x86: // add_a_xiy ! 6542: Add_1(MemReadByte(IndirectIY())); ! 6543: return 19; ! 6544: ! 6545: case 0x87: // no_op ! 6546: SetPC(GetPC() - 1); ! 6547: return 0; ! 6548: ! 6549: case 0x88: // no_op ! 6550: SetPC(GetPC() - 1); ! 6551: return 0; ! 6552: ! 6553: case 0x89: // no_op ! 6554: SetPC(GetPC() - 1); ! 6555: return 0; ! 6556: ! 6557: case 0x8A: // no_op ! 6558: SetPC(GetPC() - 1); ! 6559: return 0; ! 6560: ! 6561: case 0x8B: // no_op ! 6562: SetPC(GetPC() - 1); ! 6563: return 0; ! 6564: ! 6565: case 0x8C: // adc_a_iyh ! 6566: Adc_1(m_regIYh); ! 6567: return 9; ! 6568: ! 6569: case 0x8D: // adc_a_iyl ! 6570: Adc_1(m_regIYl); ! 6571: return 9; ! 6572: ! 6573: case 0x8E: // adc_a_xiy ! 6574: Adc_1(MemReadByte(IndirectIY())); ! 6575: return 19; ! 6576: ! 6577: case 0x8F: // no_op ! 6578: SetPC(GetPC() - 1); ! 6579: return 0; ! 6580: ! 6581: case 0x90: // no_op ! 6582: SetPC(GetPC() - 1); ! 6583: return 0; ! 6584: ! 6585: case 0x91: // no_op ! 6586: SetPC(GetPC() - 1); ! 6587: return 0; ! 6588: ! 6589: case 0x92: // no_op ! 6590: SetPC(GetPC() - 1); ! 6591: return 0; ! 6592: ! 6593: case 0x93: // no_op ! 6594: SetPC(GetPC() - 1); ! 6595: return 0; ! 6596: ! 6597: case 0x94: // sub_iyh ! 6598: Sub_1(m_regIYh); ! 6599: return 9; ! 6600: ! 6601: case 0x95: // sub_iyl ! 6602: Sub_1(m_regIYl); ! 6603: return 9; ! 6604: ! 6605: case 0x96: // sub_xiy ! 6606: Sub_1(MemReadByte(IndirectIY())); ! 6607: return 19; ! 6608: ! 6609: case 0x97: // no_op ! 6610: SetPC(GetPC() - 1); ! 6611: return 0; ! 6612: ! 6613: case 0x98: // no_op ! 6614: SetPC(GetPC() - 1); ! 6615: return 0; ! 6616: ! 6617: case 0x99: // no_op ! 6618: SetPC(GetPC() - 1); ! 6619: return 0; ! 6620: ! 6621: case 0x9A: // no_op ! 6622: SetPC(GetPC() - 1); ! 6623: return 0; ! 6624: ! 6625: case 0x9B: // no_op ! 6626: SetPC(GetPC() - 1); ! 6627: return 0; ! 6628: ! 6629: case 0x9C: // sbc_a_iyh ! 6630: Sbc_1(m_regIYh); ! 6631: return 9; ! 6632: ! 6633: case 0x9D: // sbc_a_iyl ! 6634: Sbc_1(m_regIYl); ! 6635: return 9; ! 6636: ! 6637: case 0x9E: // sbc_a_xiy ! 6638: Sbc_1(MemReadByte(IndirectIY())); ! 6639: return 19; ! 6640: ! 6641: case 0x9F: // no_op ! 6642: SetPC(GetPC() - 1); ! 6643: return 0; ! 6644: ! 6645: case 0xA0: // no_op ! 6646: SetPC(GetPC() - 1); ! 6647: return 0; ! 6648: ! 6649: case 0xA1: // no_op ! 6650: SetPC(GetPC() - 1); ! 6651: return 0; ! 6652: ! 6653: case 0xA2: // no_op ! 6654: SetPC(GetPC() - 1); ! 6655: return 0; ! 6656: ! 6657: case 0xA3: // no_op ! 6658: SetPC(GetPC() - 1); ! 6659: return 0; ! 6660: ! 6661: case 0xA4: // and_iyh ! 6662: And(m_regIYh); ! 6663: return 9; ! 6664: ! 6665: case 0xA5: // and_iyl ! 6666: And(m_regIYl); ! 6667: return 9; ! 6668: ! 6669: case 0xA6: // and_xiy ! 6670: And(MemReadByte(IndirectIY())); ! 6671: return 19; ! 6672: ! 6673: case 0xA7: // no_op ! 6674: SetPC(GetPC() - 1); ! 6675: return 0; ! 6676: ! 6677: case 0xA8: // no_op ! 6678: SetPC(GetPC() - 1); ! 6679: return 0; ! 6680: ! 6681: case 0xA9: // no_op ! 6682: SetPC(GetPC() - 1); ! 6683: return 0; ! 6684: ! 6685: case 0xAA: // no_op ! 6686: SetPC(GetPC() - 1); ! 6687: return 0; ! 6688: ! 6689: case 0xAB: // no_op ! 6690: SetPC(GetPC() - 1); ! 6691: return 0; ! 6692: ! 6693: case 0xAC: // xor_iyh ! 6694: Xor(m_regIYh); ! 6695: return 9; ! 6696: ! 6697: case 0xAD: // xor_iyl ! 6698: Xor(m_regIYl); ! 6699: return 9; ! 6700: ! 6701: case 0xAE: // xor_xiy ! 6702: Xor(MemReadByte(IndirectIY())); ! 6703: return 19; ! 6704: ! 6705: case 0xAF: // no_op ! 6706: SetPC(GetPC() - 1); ! 6707: return 0; ! 6708: ! 6709: case 0xB0: // no_op ! 6710: SetPC(GetPC() - 1); ! 6711: return 0; ! 6712: ! 6713: case 0xB1: // no_op ! 6714: SetPC(GetPC() - 1); ! 6715: return 0; ! 6716: ! 6717: case 0xB2: // no_op ! 6718: SetPC(GetPC() - 1); ! 6719: return 0; ! 6720: ! 6721: case 0xB3: // no_op ! 6722: SetPC(GetPC() - 1); ! 6723: return 0; ! 6724: ! 6725: case 0xB4: // or_iyh ! 6726: Or(m_regIYh); ! 6727: return 9; ! 6728: ! 6729: case 0xB5: // or_iyl ! 6730: Or(m_regIYl); ! 6731: return 9; ! 6732: ! 6733: case 0xB6: // or_xiy ! 6734: Or(MemReadByte(IndirectIY())); ! 6735: return 19; ! 6736: ! 6737: case 0xB7: // no_op ! 6738: SetPC(GetPC() - 1); ! 6739: return 0; ! 6740: ! 6741: case 0xB8: // no_op ! 6742: SetPC(GetPC() - 1); ! 6743: return 0; ! 6744: ! 6745: case 0xB9: // no_op ! 6746: SetPC(GetPC() - 1); ! 6747: return 0; ! 6748: ! 6749: case 0xBA: // no_op ! 6750: SetPC(GetPC() - 1); ! 6751: return 0; ! 6752: ! 6753: case 0xBB: // no_op ! 6754: SetPC(GetPC() - 1); ! 6755: return 0; ! 6756: ! 6757: case 0xBC: // cp_iyh ! 6758: Cp(m_regIYh); ! 6759: return 9; ! 6760: ! 6761: case 0xBD: // cp_iyl ! 6762: Cp(m_regIYl); ! 6763: return 9; ! 6764: ! 6765: case 0xBE: // cp_xiy ! 6766: Cp(MemReadByte(IndirectIY())); ! 6767: return 19; ! 6768: ! 6769: case 0xBF: // no_op ! 6770: SetPC(GetPC() - 1); ! 6771: return 0; ! 6772: ! 6773: case 0xC0: // no_op ! 6774: SetPC(GetPC() - 1); ! 6775: return 0; ! 6776: ! 6777: case 0xC1: // no_op ! 6778: SetPC(GetPC() - 1); ! 6779: return 0; ! 6780: ! 6781: case 0xC2: // no_op ! 6782: SetPC(GetPC() - 1); ! 6783: return 0; ! 6784: ! 6785: case 0xC3: // no_op ! 6786: SetPC(GetPC() - 1); ! 6787: return 0; ! 6788: ! 6789: case 0xC4: // no_op ! 6790: SetPC(GetPC() - 1); ! 6791: return 0; ! 6792: ! 6793: case 0xC5: // no_op ! 6794: SetPC(GetPC() - 1); ! 6795: return 0; ! 6796: ! 6797: case 0xC6: // no_op ! 6798: SetPC(GetPC() - 1); ! 6799: return 0; ! 6800: ! 6801: case 0xC7: // no_op ! 6802: SetPC(GetPC() - 1); ! 6803: return 0; ! 6804: ! 6805: case 0xC8: // no_op ! 6806: SetPC(GetPC() - 1); ! 6807: return 0; ! 6808: ! 6809: case 0xC9: // no_op ! 6810: SetPC(GetPC() - 1); ! 6811: return 0; ! 6812: ! 6813: case 0xCA: // no_op ! 6814: SetPC(GetPC() - 1); ! 6815: return 0; ! 6816: ! 6817: case 0xCB: // fd_cb ! 6818: return HandleFDCB(); ! 6819: ! 6820: case 0xCC: // no_op ! 6821: SetPC(GetPC() - 1); ! 6822: return 0; ! 6823: ! 6824: case 0xCD: // no_op ! 6825: SetPC(GetPC() - 1); ! 6826: return 0; ! 6827: ! 6828: case 0xCE: // no_op ! 6829: SetPC(GetPC() - 1); ! 6830: return 0; ! 6831: ! 6832: case 0xCF: // no_op ! 6833: SetPC(GetPC() - 1); ! 6834: return 0; ! 6835: ! 6836: case 0xD0: // no_op ! 6837: SetPC(GetPC() - 1); ! 6838: return 0; ! 6839: ! 6840: case 0xD1: // no_op ! 6841: SetPC(GetPC() - 1); ! 6842: return 0; ! 6843: ! 6844: case 0xD2: // no_op ! 6845: SetPC(GetPC() - 1); ! 6846: return 0; ! 6847: ! 6848: case 0xD3: // no_op ! 6849: SetPC(GetPC() - 1); ! 6850: return 0; ! 6851: ! 6852: case 0xD4: // no_op ! 6853: SetPC(GetPC() - 1); ! 6854: return 0; ! 6855: ! 6856: case 0xD5: // no_op ! 6857: SetPC(GetPC() - 1); ! 6858: return 0; ! 6859: ! 6860: case 0xD6: // no_op ! 6861: SetPC(GetPC() - 1); ! 6862: return 0; ! 6863: ! 6864: case 0xD7: // no_op ! 6865: SetPC(GetPC() - 1); ! 6866: return 0; ! 6867: ! 6868: case 0xD8: // no_op ! 6869: SetPC(GetPC() - 1); ! 6870: return 0; ! 6871: ! 6872: case 0xD9: // no_op ! 6873: SetPC(GetPC() - 1); ! 6874: return 0; ! 6875: ! 6876: case 0xDA: // no_op ! 6877: SetPC(GetPC() - 1); ! 6878: return 0; ! 6879: ! 6880: case 0xDB: // no_op ! 6881: SetPC(GetPC() - 1); ! 6882: return 0; ! 6883: ! 6884: case 0xDC: // no_op ! 6885: SetPC(GetPC() - 1); ! 6886: return 0; ! 6887: ! 6888: case 0xDD: // no_op ! 6889: SetPC(GetPC() - 1); ! 6890: return 0; ! 6891: ! 6892: case 0xDE: // no_op ! 6893: SetPC(GetPC() - 1); ! 6894: return 0; ! 6895: ! 6896: case 0xDF: // no_op ! 6897: SetPC(GetPC() - 1); ! 6898: return 0; ! 6899: ! 6900: case 0xE0: // no_op ! 6901: SetPC(GetPC() - 1); ! 6902: return 0; ! 6903: ! 6904: case 0xE1: // pop_iy ! 6905: m_regIY = Pop(); ! 6906: return 14; ! 6907: ! 6908: case 0xE2: // no_op ! 6909: SetPC(GetPC() - 1); ! 6910: return 0; ! 6911: ! 6912: case 0xE3: // ex_xsp_iy ! 6913: wTemp = MemReadWord(GetSP()); ! 6914: MemWriteWord(GetSP(), m_regIY); ! 6915: m_regIY = wTemp; ! 6916: return 23; ! 6917: ! 6918: case 0xE4: // no_op ! 6919: SetPC(GetPC() - 1); ! 6920: return 0; ! 6921: ! 6922: case 0xE5: // push_iy ! 6923: Push(m_regIY); ! 6924: return 15; ! 6925: ! 6926: case 0xE6: // no_op ! 6927: SetPC(GetPC() - 1); ! 6928: return 0; ! 6929: ! 6930: case 0xE7: // no_op ! 6931: SetPC(GetPC() - 1); ! 6932: return 0; ! 6933: ! 6934: case 0xE8: // no_op ! 6935: SetPC(GetPC() - 1); ! 6936: return 0; ! 6937: ! 6938: case 0xE9: // jp_iy ! 6939: SetPC(m_regIY); ! 6940: return 8; ! 6941: ! 6942: case 0xEA: // no_op ! 6943: SetPC(GetPC() - 1); ! 6944: return 0; ! 6945: ! 6946: case 0xEB: // no_op ! 6947: SetPC(GetPC() - 1); ! 6948: return 0; ! 6949: ! 6950: case 0xEC: // no_op ! 6951: SetPC(GetPC() - 1); ! 6952: return 0; ! 6953: ! 6954: case 0xED: // no_op ! 6955: SetPC(GetPC() - 1); ! 6956: return 0; ! 6957: ! 6958: case 0xEE: // no_op ! 6959: SetPC(GetPC() - 1); ! 6960: return 0; ! 6961: ! 6962: case 0xEF: // no_op ! 6963: SetPC(GetPC() - 1); ! 6964: return 0; ! 6965: ! 6966: case 0xF0: // no_op ! 6967: SetPC(GetPC() - 1); ! 6968: return 0; ! 6969: ! 6970: case 0xF1: // no_op ! 6971: SetPC(GetPC() - 1); ! 6972: return 0; ! 6973: ! 6974: case 0xF2: // no_op ! 6975: SetPC(GetPC() - 1); ! 6976: return 0; ! 6977: ! 6978: case 0xF3: // no_op ! 6979: SetPC(GetPC() - 1); ! 6980: return 0; ! 6981: ! 6982: case 0xF4: // no_op ! 6983: SetPC(GetPC() - 1); ! 6984: return 0; ! 6985: ! 6986: case 0xF5: // no_op ! 6987: SetPC(GetPC() - 1); ! 6988: return 0; ! 6989: ! 6990: case 0xF6: // no_op ! 6991: SetPC(GetPC() - 1); ! 6992: return 0; ! 6993: ! 6994: case 0xF7: // no_op ! 6995: SetPC(GetPC() - 1); ! 6996: return 0; ! 6997: ! 6998: case 0xF8: // no_op ! 6999: SetPC(GetPC() - 1); ! 7000: return 0; ! 7001: ! 7002: case 0xF9: // ld_sp_iy ! 7003: SetSP(m_regIY); ! 7004: return 10; ! 7005: ! 7006: case 0xFA: // no_op ! 7007: SetPC(GetPC() - 1); ! 7008: return 0; ! 7009: ! 7010: case 0xFB: // no_op ! 7011: SetPC(GetPC() - 1); ! 7012: return 0; ! 7013: ! 7014: case 0xFC: // no_op ! 7015: SetPC(GetPC() - 1); ! 7016: return 0; ! 7017: ! 7018: case 0xFD: // no_op ! 7019: SetPC(GetPC() - 1); ! 7020: return 0; ! 7021: ! 7022: case 0xFE: // no_op ! 7023: SetPC(GetPC() - 1); ! 7024: return 0; ! 7025: ! 7026: case 0xFF: // no_op ! 7027: SetPC(GetPC() - 1); ! 7028: return 0; ! 7029: ! 7030: default: ! 7031: _ASSERT(FALSE); ! 7032: return 0; ! 7033: } ! 7034: } ! 7035: ! 7036: /* *************************************************************************** ! 7037: * FDCD prefixed opcodes ! 7038: * *************************************************************************** ! 7039: */ ! 7040: ! 7041: int HandleFDCB() { ! 7042: const WORD wAddr = m_regIY + (signed char)ImmedByte(); ! 7043: const BYTE bOpcode = ImmedByte(); ! 7044: ! 7045: switch (bOpcode) ! 7046: { ! 7047: case 0x00: // no_op_xx ! 7048: return 0; ! 7049: ! 7050: case 0x01: // no_op_xx ! 7051: return 0; ! 7052: ! 7053: case 0x02: // no_op_xx ! 7054: return 0; ! 7055: ! 7056: case 0x03: // no_op_xx ! 7057: return 0; ! 7058: ! 7059: case 0x04: // no_op_xx ! 7060: return 0; ! 7061: ! 7062: case 0x05: // no_op_xx ! 7063: return 0; ! 7064: ! 7065: case 0x06: // rlc_xiy ! 7066: MemWriteByte(wAddr, Rlc(MemReadByte(wAddr))); ! 7067: return 23; ! 7068: ! 7069: case 0x07: // no_op_xx ! 7070: return 0; ! 7071: ! 7072: case 0x08: // no_op_xx ! 7073: return 0; ! 7074: ! 7075: case 0x09: // no_op_xx ! 7076: return 0; ! 7077: ! 7078: case 0x0A: // no_op_xx ! 7079: return 0; ! 7080: ! 7081: case 0x0B: // no_op_xx ! 7082: return 0; ! 7083: ! 7084: case 0x0C: // no_op_xx ! 7085: return 0; ! 7086: ! 7087: case 0x0D: // no_op_xx ! 7088: return 0; ! 7089: ! 7090: case 0x0E: // rrc_xiy ! 7091: MemWriteByte(wAddr, Rrc(MemReadByte(wAddr))); ! 7092: return 23; ! 7093: ! 7094: case 0x0F: // no_op_xx ! 7095: return 0; ! 7096: ! 7097: case 0x10: // no_op_xx ! 7098: return 0; ! 7099: ! 7100: case 0x11: // no_op_xx ! 7101: return 0; ! 7102: ! 7103: case 0x12: // no_op_xx ! 7104: return 0; ! 7105: ! 7106: case 0x13: // no_op_xx ! 7107: return 0; ! 7108: ! 7109: case 0x14: // no_op_xx ! 7110: return 0; ! 7111: ! 7112: case 0x15: // no_op_xx ! 7113: return 0; ! 7114: ! 7115: case 0x16: // rl_xiy ! 7116: MemWriteByte(wAddr, Rl(MemReadByte(wAddr))); ! 7117: return 23; ! 7118: ! 7119: case 0x17: // no_op_xx ! 7120: return 0; ! 7121: ! 7122: case 0x18: // no_op_xx ! 7123: return 0; ! 7124: ! 7125: case 0x19: // no_op_xx ! 7126: return 0; ! 7127: ! 7128: case 0x1A: // no_op_xx ! 7129: return 0; ! 7130: ! 7131: case 0x1B: // no_op_xx ! 7132: return 0; ! 7133: ! 7134: case 0x1C: // no_op_xx ! 7135: return 0; ! 7136: ! 7137: case 0x1D: // no_op_xx ! 7138: return 0; ! 7139: ! 7140: case 0x1E: // rr_xiy ! 7141: MemWriteByte(wAddr, Rr(MemReadByte(wAddr))); ! 7142: return 23; ! 7143: ! 7144: case 0x1F: // no_op_xx ! 7145: return 0; ! 7146: ! 7147: case 0x20: // no_op_xx ! 7148: return 0; ! 7149: ! 7150: case 0x21: // no_op_xx ! 7151: return 0; ! 7152: ! 7153: case 0x22: // no_op_xx ! 7154: return 0; ! 7155: ! 7156: case 0x23: // no_op_xx ! 7157: return 0; ! 7158: ! 7159: case 0x24: // no_op_xx ! 7160: return 0; ! 7161: ! 7162: case 0x25: // no_op_xx ! 7163: return 0; ! 7164: ! 7165: case 0x26: // sla_xiy ! 7166: MemWriteByte(wAddr, Sla(MemReadByte(wAddr))); ! 7167: return 23; ! 7168: ! 7169: case 0x27: // no_op_xx ! 7170: return 0; ! 7171: ! 7172: case 0x28: // no_op_xx ! 7173: return 0; ! 7174: ! 7175: case 0x29: // no_op_xx ! 7176: return 0; ! 7177: ! 7178: case 0x2A: // no_op_xx ! 7179: return 0; ! 7180: ! 7181: case 0x2B: // no_op_xx ! 7182: return 0; ! 7183: ! 7184: case 0x2C: // no_op_xx ! 7185: return 0; ! 7186: ! 7187: case 0x2D: // no_op_xx ! 7188: return 0; ! 7189: ! 7190: case 0x2E: // sra_xiy ! 7191: MemWriteByte(wAddr, Sra(MemReadByte(wAddr))); ! 7192: return 23; ! 7193: ! 7194: case 0x2F: // no_op_xx ! 7195: return 0; ! 7196: ! 7197: case 0x30: // no_op_xx ! 7198: return 0; ! 7199: ! 7200: case 0x31: // no_op_xx ! 7201: return 0; ! 7202: ! 7203: case 0x32: // no_op_xx ! 7204: return 0; ! 7205: ! 7206: case 0x33: // no_op_xx ! 7207: return 0; ! 7208: ! 7209: case 0x34: // no_op_xx ! 7210: return 0; ! 7211: ! 7212: case 0x35: // no_op_xx ! 7213: return 0; ! 7214: ! 7215: case 0x36: // sll_xiy ! 7216: MemWriteByte(wAddr, Sll(MemReadByte(wAddr))); ! 7217: return 23; ! 7218: ! 7219: case 0x37: // no_op_xx ! 7220: return 0; ! 7221: ! 7222: case 0x38: // no_op_xx ! 7223: return 0; ! 7224: ! 7225: case 0x39: // no_op_xx ! 7226: return 0; ! 7227: ! 7228: case 0x3A: // no_op_xx ! 7229: return 0; ! 7230: ! 7231: case 0x3B: // no_op_xx ! 7232: return 0; ! 7233: ! 7234: case 0x3C: // no_op_xx ! 7235: return 0; ! 7236: ! 7237: case 0x3D: // no_op_xx ! 7238: return 0; ! 7239: ! 7240: case 0x3E: // srl_xiy ! 7241: MemWriteByte(wAddr, Srl(MemReadByte(wAddr))); ! 7242: return 23; ! 7243: ! 7244: case 0x3F: // no_op_xx ! 7245: return 0; ! 7246: ! 7247: case 0x40: // bit_0_xiy ! 7248: case 0x41: // bit_0_xiy ! 7249: case 0x42: // bit_0_xiy ! 7250: case 0x43: // bit_0_xiy ! 7251: case 0x44: // bit_0_xiy ! 7252: case 0x45: // bit_0_xiy ! 7253: case 0x46: // bit_0_xiy ! 7254: case 0x47: // bit_0_xiy ! 7255: Bit(MemReadByte(wAddr), 0); ! 7256: return 20; ! 7257: ! 7258: case 0x48: // bit_1_xiy ! 7259: case 0x49: // bit_1_xiy ! 7260: case 0x4A: // bit_1_xiy ! 7261: case 0x4B: // bit_1_xiy ! 7262: case 0x4C: // bit_1_xiy ! 7263: case 0x4D: // bit_1_xiy ! 7264: case 0x4E: // bit_1_xiy ! 7265: case 0x4F: // bit_1_xiy ! 7266: Bit(MemReadByte(wAddr), 1); ! 7267: return 20; ! 7268: ! 7269: case 0x50: // bit_2_xiy ! 7270: case 0x51: // bit_2_xiy ! 7271: case 0x52: // bit_2_xiy ! 7272: case 0x53: // bit_2_xiy ! 7273: case 0x54: // bit_2_xiy ! 7274: case 0x55: // bit_2_xiy ! 7275: case 0x56: // bit_2_xiy ! 7276: case 0x57: // bit_2_xiy ! 7277: Bit(MemReadByte(wAddr), 2); ! 7278: return 20; ! 7279: ! 7280: case 0x58: // bit_3_xiy ! 7281: case 0x59: // bit_3_xiy ! 7282: case 0x5A: // bit_3_xiy ! 7283: case 0x5B: // bit_3_xiy ! 7284: case 0x5C: // bit_3_xiy ! 7285: case 0x5D: // bit_3_xiy ! 7286: case 0x5E: // bit_3_xiy ! 7287: case 0x5F: // bit_3_xiy ! 7288: Bit(MemReadByte(wAddr), 3); ! 7289: return 20; ! 7290: ! 7291: case 0x60: // bit_4_xiy ! 7292: case 0x61: // bit_4_xiy ! 7293: case 0x62: // bit_4_xiy ! 7294: case 0x63: // bit_4_xiy ! 7295: case 0x64: // bit_4_xiy ! 7296: case 0x65: // bit_4_xiy ! 7297: case 0x66: // bit_4_xiy ! 7298: case 0x67: // bit_4_xiy ! 7299: Bit(MemReadByte(wAddr), 4); ! 7300: return 20; ! 7301: ! 7302: case 0x68: // bit_5_xiy ! 7303: case 0x69: // bit_5_xiy ! 7304: case 0x6A: // bit_5_xiy ! 7305: case 0x6B: // bit_5_xiy ! 7306: case 0x6C: // bit_5_xiy ! 7307: case 0x6D: // bit_5_xiy ! 7308: case 0x6E: // bit_5_xiy ! 7309: case 0x6F: // bit_5_xiy ! 7310: Bit(MemReadByte(wAddr), 5); ! 7311: return 20; ! 7312: ! 7313: case 0x70: // bit_6_xiy ! 7314: case 0x71: // bit_6_xiy ! 7315: case 0x72: // bit_6_xiy ! 7316: case 0x73: // bit_6_xiy ! 7317: case 0x74: // bit_6_xiy ! 7318: case 0x75: // bit_6_xiy ! 7319: case 0x76: // bit_6_xiy ! 7320: case 0x77: // bit_6_xiy ! 7321: Bit(MemReadByte(wAddr), 6); ! 7322: return 20; ! 7323: ! 7324: case 0x78: // bit_7_xiy ! 7325: case 0x79: // bit_7_xiy ! 7326: case 0x7A: // bit_7_xiy ! 7327: case 0x7B: // bit_7_xiy ! 7328: case 0x7C: // bit_7_xiy ! 7329: case 0x7D: // bit_7_xiy ! 7330: case 0x7E: // bit_7_xiy ! 7331: case 0x7F: // bit_7_xiy ! 7332: Bit(MemReadByte(wAddr), 7); ! 7333: return 20; ! 7334: ! 7335: case 0x80: // no_op_xx ! 7336: return 0; ! 7337: ! 7338: case 0x81: // no_op_xx ! 7339: return 0; ! 7340: ! 7341: case 0x82: // no_op_xx ! 7342: return 0; ! 7343: ! 7344: case 0x83: // no_op_xx ! 7345: return 0; ! 7346: ! 7347: case 0x84: // no_op_xx ! 7348: return 0; ! 7349: ! 7350: case 0x85: // no_op_xx ! 7351: return 0; ! 7352: ! 7353: case 0x86: // res_0_xiy ! 7354: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 0)); ! 7355: return 23; ! 7356: ! 7357: case 0x87: // no_op_xx ! 7358: return 0; ! 7359: ! 7360: case 0x88: // no_op_xx ! 7361: return 0; ! 7362: ! 7363: case 0x89: // no_op_xx ! 7364: return 0; ! 7365: ! 7366: case 0x8A: // no_op_xx ! 7367: return 0; ! 7368: ! 7369: case 0x8B: // no_op_xx ! 7370: return 0; ! 7371: ! 7372: case 0x8C: // no_op_xx ! 7373: return 0; ! 7374: ! 7375: case 0x8D: // no_op_xx ! 7376: return 0; ! 7377: ! 7378: case 0x8E: // res_1_xiy ! 7379: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 1)); ! 7380: return 23; ! 7381: ! 7382: case 0x8F: // no_op_xx ! 7383: return 0; ! 7384: ! 7385: case 0x90: // no_op_xx ! 7386: return 0; ! 7387: ! 7388: case 0x91: // no_op_xx ! 7389: return 0; ! 7390: ! 7391: case 0x92: // no_op_xx ! 7392: return 0; ! 7393: ! 7394: case 0x93: // no_op_xx ! 7395: return 0; ! 7396: ! 7397: case 0x94: // no_op_xx ! 7398: return 0; ! 7399: ! 7400: case 0x95: // no_op_xx ! 7401: return 0; ! 7402: ! 7403: case 0x96: // res_2_xiy ! 7404: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 2)); ! 7405: return 23; ! 7406: ! 7407: case 0x97: // no_op_xx ! 7408: return 0; ! 7409: ! 7410: case 0x98: // no_op_xx ! 7411: return 0; ! 7412: ! 7413: case 0x99: // no_op_xx ! 7414: return 0; ! 7415: ! 7416: case 0x9A: // no_op_xx ! 7417: return 0; ! 7418: ! 7419: case 0x9B: // no_op_xx ! 7420: return 0; ! 7421: ! 7422: case 0x9C: // no_op_xx ! 7423: return 0; ! 7424: ! 7425: case 0x9D: // no_op_xx ! 7426: return 0; ! 7427: ! 7428: case 0x9E: // res_3_xiy ! 7429: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 3)); ! 7430: return 23; ! 7431: ! 7432: case 0x9F: // no_op_xx ! 7433: return 0; ! 7434: ! 7435: case 0xA0: // no_op_xx ! 7436: return 0; ! 7437: ! 7438: case 0xA1: // no_op_xx ! 7439: return 0; ! 7440: ! 7441: case 0xA2: // no_op_xx ! 7442: return 0; ! 7443: ! 7444: case 0xA3: // no_op_xx ! 7445: return 0; ! 7446: ! 7447: case 0xA4: // no_op_xx ! 7448: return 0; ! 7449: ! 7450: case 0xA5: // no_op_xx ! 7451: return 0; ! 7452: ! 7453: case 0xA6: // res_4_xiy ! 7454: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 4)); ! 7455: return 23; ! 7456: ! 7457: case 0xA7: // no_op_xx ! 7458: return 0; ! 7459: ! 7460: case 0xA8: // no_op_xx ! 7461: return 0; ! 7462: ! 7463: case 0xA9: // no_op_xx ! 7464: return 0; ! 7465: ! 7466: case 0xAA: // no_op_xx ! 7467: return 0; ! 7468: ! 7469: case 0xAB: // no_op_xx ! 7470: return 0; ! 7471: ! 7472: case 0xAC: // no_op_xx ! 7473: return 0; ! 7474: ! 7475: case 0xAD: // no_op_xx ! 7476: return 0; ! 7477: ! 7478: case 0xAE: // res_5_xiy ! 7479: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 5)); ! 7480: return 23; ! 7481: ! 7482: case 0xAF: // no_op_xx ! 7483: return 0; ! 7484: ! 7485: case 0xB0: // no_op_xx ! 7486: return 0; ! 7487: ! 7488: case 0xB1: // no_op_xx ! 7489: return 0; ! 7490: ! 7491: case 0xB2: // no_op_xx ! 7492: return 0; ! 7493: ! 7494: case 0xB3: // no_op_xx ! 7495: return 0; ! 7496: ! 7497: case 0xB4: // no_op_xx ! 7498: return 0; ! 7499: ! 7500: case 0xB5: // no_op_xx ! 7501: return 0; ! 7502: ! 7503: case 0xB6: // res_6_xiy ! 7504: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 6)); ! 7505: return 23; ! 7506: ! 7507: case 0xB7: // no_op_xx ! 7508: return 0; ! 7509: ! 7510: case 0xB8: // no_op_xx ! 7511: return 0; ! 7512: ! 7513: case 0xB9: // no_op_xx ! 7514: return 0; ! 7515: ! 7516: case 0xBA: // no_op_xx ! 7517: return 0; ! 7518: ! 7519: case 0xBB: // no_op_xx ! 7520: return 0; ! 7521: ! 7522: case 0xBC: // no_op_xx ! 7523: return 0; ! 7524: ! 7525: case 0xBD: // no_op_xx ! 7526: return 0; ! 7527: ! 7528: case 0xBE: // res_7_xiy ! 7529: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 7)); ! 7530: return 23; ! 7531: ! 7532: case 0xBF: // no_op_xx ! 7533: return 0; ! 7534: ! 7535: case 0xC0: // no_op_xx ! 7536: return 0; ! 7537: ! 7538: case 0xC1: // no_op_xx ! 7539: return 0; ! 7540: ! 7541: case 0xC2: // no_op_xx ! 7542: return 0; ! 7543: ! 7544: case 0xC3: // no_op_xx ! 7545: return 0; ! 7546: ! 7547: case 0xC4: // no_op_xx ! 7548: return 0; ! 7549: ! 7550: case 0xC5: // no_op_xx ! 7551: return 0; ! 7552: ! 7553: case 0xC6: // set_0_xiy ! 7554: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 0)); ! 7555: return 23; ! 7556: ! 7557: case 0xC7: // no_op_xx ! 7558: return 0; ! 7559: ! 7560: case 0xC8: // no_op_xx ! 7561: return 0; ! 7562: ! 7563: case 0xC9: // no_op_xx ! 7564: return 0; ! 7565: ! 7566: case 0xCA: // no_op_xx ! 7567: return 0; ! 7568: ! 7569: case 0xCB: // no_op_xx ! 7570: return 0; ! 7571: ! 7572: case 0xCC: // no_op_xx ! 7573: return 0; ! 7574: ! 7575: case 0xCD: // no_op_xx ! 7576: return 0; ! 7577: ! 7578: case 0xCE: // set_1_xiy ! 7579: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 1)); ! 7580: return 23; ! 7581: ! 7582: case 0xCF: // no_op_xx ! 7583: return 0; ! 7584: ! 7585: case 0xD0: // no_op_xx ! 7586: return 0; ! 7587: ! 7588: case 0xD1: // no_op_xx ! 7589: return 0; ! 7590: ! 7591: case 0xD2: // no_op_xx ! 7592: return 0; ! 7593: ! 7594: case 0xD3: // no_op_xx ! 7595: return 0; ! 7596: ! 7597: case 0xD4: // no_op_xx ! 7598: return 0; ! 7599: ! 7600: case 0xD5: // no_op_xx ! 7601: return 0; ! 7602: ! 7603: case 0xD6: // set_2_xiy ! 7604: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 2)); ! 7605: return 23; ! 7606: ! 7607: case 0xD7: // no_op_xx ! 7608: return 0; ! 7609: ! 7610: case 0xD8: // no_op_xx ! 7611: return 0; ! 7612: ! 7613: case 0xD9: // no_op_xx ! 7614: return 0; ! 7615: ! 7616: case 0xDA: // no_op_xx ! 7617: return 0; ! 7618: ! 7619: case 0xDB: // no_op_xx ! 7620: return 0; ! 7621: ! 7622: case 0xDC: // no_op_xx ! 7623: return 0; ! 7624: ! 7625: case 0xDD: // no_op_xx ! 7626: return 0; ! 7627: ! 7628: case 0xDE: // set_3_xiy ! 7629: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 3)); ! 7630: return 23; ! 7631: ! 7632: case 0xDF: // no_op_xx ! 7633: return 0; ! 7634: ! 7635: case 0xE0: // no_op_xx ! 7636: return 0; ! 7637: ! 7638: case 0xE1: // no_op_xx ! 7639: return 0; ! 7640: ! 7641: case 0xE2: // no_op_xx ! 7642: return 0; ! 7643: ! 7644: case 0xE3: // no_op_xx ! 7645: return 0; ! 7646: ! 7647: case 0xE4: // no_op_xx ! 7648: return 0; ! 7649: ! 7650: case 0xE5: // no_op_xx ! 7651: return 0; ! 7652: ! 7653: case 0xE6: // set_4_xiy ! 7654: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 4)); ! 7655: return 23; ! 7656: ! 7657: case 0xE7: // no_op_xx ! 7658: return 0; ! 7659: ! 7660: case 0xE8: // no_op_xx ! 7661: return 0; ! 7662: ! 7663: case 0xE9: // no_op_xx ! 7664: return 0; ! 7665: ! 7666: case 0xEA: // no_op_xx ! 7667: return 0; ! 7668: ! 7669: case 0xEB: // no_op_xx ! 7670: return 0; ! 7671: ! 7672: case 0xEC: // no_op_xx ! 7673: return 0; ! 7674: ! 7675: case 0xED: // no_op_xx ! 7676: return 0; ! 7677: ! 7678: case 0xEE: // set_5_xiy ! 7679: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 5)); ! 7680: return 23; ! 7681: ! 7682: case 0xEF: // no_op_xx ! 7683: return 0; ! 7684: ! 7685: case 0xF0: // no_op_xx ! 7686: return 0; ! 7687: ! 7688: case 0xF1: // no_op_xx ! 7689: return 0; ! 7690: ! 7691: case 0xF2: // no_op_xx ! 7692: return 0; ! 7693: ! 7694: case 0xF3: // no_op_xx ! 7695: return 0; ! 7696: ! 7697: case 0xF4: // no_op_xx ! 7698: return 0; ! 7699: ! 7700: case 0xF5: // no_op_xx ! 7701: return 0; ! 7702: ! 7703: case 0xF6: // set_6_xiy ! 7704: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 6)); ! 7705: return 23; ! 7706: ! 7707: case 0xF7: // no_op_xx ! 7708: return 0; ! 7709: ! 7710: case 0xF8: // no_op_xx ! 7711: return 0; ! 7712: ! 7713: case 0xF9: // no_op_xx ! 7714: return 0; ! 7715: ! 7716: case 0xFA: // no_op_xx ! 7717: return 0; ! 7718: ! 7719: case 0xFB: // no_op_xx ! 7720: return 0; ! 7721: ! 7722: case 0xFC: // no_op_xx ! 7723: return 0; ! 7724: ! 7725: case 0xFD: // no_op_xx ! 7726: return 0; ! 7727: ! 7728: case 0xFE: // set_7_xiy ! 7729: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 7)); ! 7730: return 23; ! 7731: ! 7732: case 0xFF: // no_op_x ! 7733: return 0; ! 7734: ! 7735: default: ! 7736: _ASSERT(FALSE); ! 7737: return 0; ! 7738: } ! 7739: } ! 7740: ! 7741: /* *************************************************************************** ! 7742: * DDCB prefixed opcodes ! 7743: * *************************************************************************** ! 7744: */ ! 7745: ! 7746: int HandleDDCB() { ! 7747: const WORD wAddr = m_regIX + (signed char)ImmedByte(); ! 7748: const BYTE bOpcode = ImmedByte(); ! 7749: ! 7750: switch (bOpcode) ! 7751: { ! 7752: case 0x00: // no_op_xx ! 7753: return 0; ! 7754: ! 7755: case 0x01: // no_op_xx ! 7756: return 0; ! 7757: ! 7758: case 0x02: // no_op_xx ! 7759: return 0; ! 7760: ! 7761: case 0x03: // no_op_xx ! 7762: return 0; ! 7763: ! 7764: case 0x04: // no_op_xx ! 7765: return 0; ! 7766: ! 7767: case 0x05: // no_op_xx ! 7768: return 0; ! 7769: ! 7770: case 0x06: // rlc_xix ! 7771: MemWriteByte(wAddr, Rlc(MemReadByte(wAddr))); ! 7772: return 23; ! 7773: ! 7774: case 0x07: // no_op_xx ! 7775: return 0; ! 7776: ! 7777: case 0x08: // no_op_xx ! 7778: return 0; ! 7779: ! 7780: case 0x09: // no_op_xx ! 7781: return 0; ! 7782: ! 7783: case 0x0A: // no_op_xx ! 7784: return 0; ! 7785: ! 7786: case 0x0B: // no_op_xx ! 7787: return 0; ! 7788: ! 7789: case 0x0C: // no_op_xx ! 7790: return 0; ! 7791: ! 7792: case 0x0D: // no_op_xx ! 7793: return 0; ! 7794: ! 7795: case 0x0E: // rrc_xix ! 7796: MemWriteByte(wAddr, Rrc(MemReadByte(wAddr))); ! 7797: return 23; ! 7798: ! 7799: case 0x0F: // no_op_xx ! 7800: return 0; ! 7801: ! 7802: case 0x10: // no_op_xx ! 7803: return 0; ! 7804: ! 7805: case 0x11: // no_op_xx ! 7806: return 0; ! 7807: ! 7808: case 0x12: // no_op_xx ! 7809: return 0; ! 7810: ! 7811: case 0x13: // no_op_xx ! 7812: return 0; ! 7813: ! 7814: case 0x14: // no_op_xx ! 7815: return 0; ! 7816: ! 7817: case 0x15: // no_op_xx ! 7818: return 0; ! 7819: ! 7820: case 0x16: // rl_xix ! 7821: MemWriteByte(wAddr, Rl(MemReadByte(wAddr))); ! 7822: return 23; ! 7823: ! 7824: case 0x17: // no_op_xx ! 7825: return 0; ! 7826: ! 7827: case 0x18: // no_op_xx ! 7828: return 0; ! 7829: ! 7830: case 0x19: // no_op_xx ! 7831: return 0; ! 7832: ! 7833: case 0x1A: // no_op_xx ! 7834: return 0; ! 7835: ! 7836: case 0x1B: // no_op_xx ! 7837: return 0; ! 7838: ! 7839: case 0x1C: // no_op_xx ! 7840: return 0; ! 7841: ! 7842: case 0x1D: // no_op_xx ! 7843: return 0; ! 7844: ! 7845: case 0x1E: // rr_xix ! 7846: MemWriteByte(wAddr, Rr(MemReadByte(wAddr))); ! 7847: return 23; ! 7848: ! 7849: case 0x1F: // no_op_xx ! 7850: return 0; ! 7851: ! 7852: case 0x20: // no_op_xx ! 7853: return 0; ! 7854: ! 7855: case 0x21: // no_op_xx ! 7856: return 0; ! 7857: ! 7858: case 0x22: // no_op_xx ! 7859: return 0; ! 7860: ! 7861: case 0x23: // no_op_xx ! 7862: return 0; ! 7863: ! 7864: case 0x24: // no_op_xx ! 7865: return 0; ! 7866: ! 7867: case 0x25: // no_op_xx ! 7868: return 0; ! 7869: ! 7870: case 0x26: // sla_xix ! 7871: MemWriteByte(wAddr, Sla(MemReadByte(wAddr))); ! 7872: return 23; ! 7873: ! 7874: case 0x27: // no_op_xx ! 7875: return 0; ! 7876: ! 7877: case 0x28: // no_op_xx ! 7878: return 0; ! 7879: ! 7880: case 0x29: // no_op_xx ! 7881: return 0; ! 7882: ! 7883: case 0x2A: // no_op_xx ! 7884: return 0; ! 7885: ! 7886: case 0x2B: // no_op_xx ! 7887: return 0; ! 7888: ! 7889: case 0x2C: // no_op_xx ! 7890: return 0; ! 7891: ! 7892: case 0x2D: // no_op_xx ! 7893: return 0; ! 7894: ! 7895: case 0x2E: // sra_xix ! 7896: MemWriteByte(wAddr, Sra(MemReadByte(wAddr))); ! 7897: return 23; ! 7898: ! 7899: case 0x2F: // no_op_xx ! 7900: return 0; ! 7901: ! 7902: case 0x30: // no_op_xx ! 7903: return 0; ! 7904: ! 7905: case 0x31: // no_op_xx ! 7906: return 0; ! 7907: ! 7908: case 0x32: // no_op_xx ! 7909: return 0; ! 7910: ! 7911: case 0x33: // no_op_xx ! 7912: return 0; ! 7913: ! 7914: case 0x34: // no_op_xx ! 7915: return 0; ! 7916: ! 7917: case 0x35: // no_op_xx ! 7918: return 0; ! 7919: ! 7920: case 0x36: // sll_xix ! 7921: MemWriteByte(wAddr, Sll(MemReadByte(wAddr))); ! 7922: return 23; ! 7923: ! 7924: case 0x37: // no_op_xx ! 7925: return 0; ! 7926: ! 7927: case 0x38: // no_op_xx ! 7928: return 0; ! 7929: ! 7930: case 0x39: // no_op_xx ! 7931: return 0; ! 7932: ! 7933: case 0x3A: // no_op_xx ! 7934: return 0; ! 7935: ! 7936: case 0x3B: // no_op_xx ! 7937: return 0; ! 7938: ! 7939: case 0x3C: // no_op_xx ! 7940: return 0; ! 7941: ! 7942: case 0x3D: // no_op_xx ! 7943: return 0; ! 7944: ! 7945: case 0x3E: // srl_xix ! 7946: MemWriteByte(wAddr, Srl(MemReadByte(wAddr))); ! 7947: return 23; ! 7948: ! 7949: case 0x3F: // no_op_xx ! 7950: return 0; ! 7951: ! 7952: case 0x40: // bit_0_xix ! 7953: case 0x41: // bit_0_xix ! 7954: case 0x42: // bit_0_xix ! 7955: case 0x43: // bit_0_xix ! 7956: case 0x44: // bit_0_xix ! 7957: case 0x45: // bit_0_xix ! 7958: case 0x46: // bit_0_xix ! 7959: case 0x47: // bit_0_xix ! 7960: Bit(MemReadByte(wAddr), 0); ! 7961: return 20; ! 7962: ! 7963: case 0x48: // bit_1_xix ! 7964: case 0x49: // bit_1_xix ! 7965: case 0x4A: // bit_1_xix ! 7966: case 0x4B: // bit_1_xix ! 7967: case 0x4C: // bit_1_xix ! 7968: case 0x4D: // bit_1_xix ! 7969: case 0x4E: // bit_1_xix ! 7970: case 0x4F: // bit_1_xix ! 7971: Bit(MemReadByte(wAddr), 1); ! 7972: return 20; ! 7973: ! 7974: case 0x50: // bit_2_xix ! 7975: case 0x51: // bit_2_xix ! 7976: case 0x52: // bit_2_xix ! 7977: case 0x53: // bit_2_xix ! 7978: case 0x54: // bit_2_xix ! 7979: case 0x55: // bit_2_xix ! 7980: case 0x56: // bit_2_xix ! 7981: case 0x57: // bit_2_xix ! 7982: Bit(MemReadByte(wAddr), 2); ! 7983: return 20; ! 7984: ! 7985: case 0x58: // bit_3_xix ! 7986: case 0x59: // bit_3_xix ! 7987: case 0x5A: // bit_3_xix ! 7988: case 0x5B: // bit_3_xix ! 7989: case 0x5C: // bit_3_xix ! 7990: case 0x5D: // bit_3_xix ! 7991: case 0x5E: // bit_3_xix ! 7992: case 0x5F: // bit_3_xix ! 7993: Bit(MemReadByte(wAddr), 3); ! 7994: return 20; ! 7995: ! 7996: case 0x60: // bit_4_xix ! 7997: case 0x61: // bit_4_xix ! 7998: case 0x62: // bit_4_xix ! 7999: case 0x63: // bit_4_xix ! 8000: case 0x64: // bit_4_xix ! 8001: case 0x65: // bit_4_xix ! 8002: case 0x66: // bit_4_xix ! 8003: case 0x67: // bit_4_xix ! 8004: Bit(MemReadByte(wAddr), 4); ! 8005: return 20; ! 8006: ! 8007: case 0x68: // bit_5_xix ! 8008: case 0x69: // bit_5_xix ! 8009: case 0x6A: // bit_5_xix ! 8010: case 0x6B: // bit_5_xix ! 8011: case 0x6C: // bit_5_xix ! 8012: case 0x6D: // bit_5_xix ! 8013: case 0x6E: // bit_5_xix ! 8014: case 0x6F: // bit_5_xix ! 8015: Bit(MemReadByte(wAddr), 5); ! 8016: return 20; ! 8017: ! 8018: case 0x70: // bit_6_xix ! 8019: case 0x71: // bit_6_xix ! 8020: case 0x72: // bit_6_xix ! 8021: case 0x73: // bit_6_xix ! 8022: case 0x74: // bit_6_xix ! 8023: case 0x75: // bit_6_xix ! 8024: case 0x76: // bit_6_xix ! 8025: case 0x77: // bit_6_xix ! 8026: Bit(MemReadByte(wAddr), 6); ! 8027: return 20; ! 8028: ! 8029: case 0x78: // bit_7_xix ! 8030: case 0x79: // bit_7_xix ! 8031: case 0x7A: // bit_7_xix ! 8032: case 0x7B: // bit_7_xix ! 8033: case 0x7C: // bit_7_xix ! 8034: case 0x7D: // bit_7_xix ! 8035: case 0x7E: // bit_7_xix ! 8036: case 0x7F: // bit_7_xix ! 8037: Bit(MemReadByte(wAddr), 7); ! 8038: return 20; ! 8039: ! 8040: case 0x80: // no_op_xx ! 8041: return 0; ! 8042: ! 8043: case 0x81: // no_op_xx ! 8044: return 0; ! 8045: ! 8046: case 0x82: // no_op_xx ! 8047: return 0; ! 8048: ! 8049: case 0x83: // no_op_xx ! 8050: return 0; ! 8051: ! 8052: case 0x84: // no_op_xx ! 8053: return 0; ! 8054: ! 8055: case 0x85: // no_op_xx ! 8056: return 0; ! 8057: ! 8058: case 0x86: // res_0_xix ! 8059: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 0)); ! 8060: return 23; ! 8061: ! 8062: case 0x87: // no_op_xx ! 8063: return 0; ! 8064: ! 8065: case 0x88: // no_op_xx ! 8066: return 0; ! 8067: ! 8068: case 0x89: // no_op_xx ! 8069: return 0; ! 8070: ! 8071: case 0x8A: // no_op_xx ! 8072: return 0; ! 8073: ! 8074: case 0x8B: // no_op_xx ! 8075: return 0; ! 8076: ! 8077: case 0x8C: // no_op_xx ! 8078: return 0; ! 8079: ! 8080: case 0x8D: // no_op_xx ! 8081: return 0; ! 8082: ! 8083: case 0x8E: // res_1_xix ! 8084: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 1)); ! 8085: return 23; ! 8086: ! 8087: case 0x8F: // no_op_xx ! 8088: return 0; ! 8089: ! 8090: case 0x90: // no_op_xx ! 8091: return 0; ! 8092: ! 8093: case 0x91: // no_op_xx ! 8094: return 0; ! 8095: ! 8096: case 0x92: // no_op_xx ! 8097: return 0; ! 8098: ! 8099: case 0x93: // no_op_xx ! 8100: return 0; ! 8101: ! 8102: case 0x94: // no_op_xx ! 8103: return 0; ! 8104: ! 8105: case 0x95: // no_op_xx ! 8106: return 0; ! 8107: ! 8108: case 0x96: // res_2_xix ! 8109: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 2)); ! 8110: return 23; ! 8111: ! 8112: case 0x97: // no_op_xx ! 8113: return 0; ! 8114: ! 8115: case 0x98: // no_op_xx ! 8116: return 0; ! 8117: ! 8118: case 0x99: // no_op_xx ! 8119: return 0; ! 8120: ! 8121: case 0x9A: // no_op_xx ! 8122: return 0; ! 8123: ! 8124: case 0x9B: // no_op_xx ! 8125: return 0; ! 8126: ! 8127: case 0x9C: // no_op_xx ! 8128: return 0; ! 8129: ! 8130: case 0x9D: // no_op_xx ! 8131: return 0; ! 8132: ! 8133: case 0x9E: // res_3_xix ! 8134: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 3)); ! 8135: return 23; ! 8136: ! 8137: case 0x9F: // no_op_xx ! 8138: return 0; ! 8139: ! 8140: case 0xA0: // no_op_xx ! 8141: return 0; ! 8142: ! 8143: case 0xA1: // no_op_xx ! 8144: return 0; ! 8145: ! 8146: case 0xA2: // no_op_xx ! 8147: return 0; ! 8148: ! 8149: case 0xA3: // no_op_xx ! 8150: return 0; ! 8151: ! 8152: case 0xA4: // no_op_xx ! 8153: return 0; ! 8154: ! 8155: case 0xA5: // no_op_xx ! 8156: return 0; ! 8157: ! 8158: case 0xA6: // res_4_xix ! 8159: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 4)); ! 8160: return 23; ! 8161: ! 8162: case 0xA7: // no_op_xx ! 8163: return 0; ! 8164: ! 8165: case 0xA8: // no_op_xx ! 8166: return 0; ! 8167: ! 8168: case 0xA9: // no_op_xx ! 8169: return 0; ! 8170: ! 8171: case 0xAA: // no_op_xx ! 8172: return 0; ! 8173: ! 8174: case 0xAB: // no_op_xx ! 8175: return 0; ! 8176: ! 8177: case 0xAC: // no_op_xx ! 8178: return 0; ! 8179: ! 8180: case 0xAD: // no_op_xx ! 8181: return 0; ! 8182: ! 8183: case 0xAE: // res_5_xix ! 8184: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 5)); ! 8185: return 23; ! 8186: ! 8187: case 0xAF: // no_op_xx ! 8188: return 0; ! 8189: ! 8190: case 0xB0: // no_op_xx ! 8191: return 0; ! 8192: ! 8193: case 0xB1: // no_op_xx ! 8194: return 0; ! 8195: ! 8196: case 0xB2: // no_op_xx ! 8197: return 0; ! 8198: ! 8199: case 0xB3: // no_op_xx ! 8200: return 0; ! 8201: ! 8202: case 0xB4: // no_op_xx ! 8203: return 0; ! 8204: ! 8205: case 0xB5: // no_op_xx ! 8206: return 0; ! 8207: ! 8208: case 0xB6: // res_6_xix ! 8209: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 6)); ! 8210: return 23; ! 8211: ! 8212: case 0xB7: // no_op_xx ! 8213: return 0; ! 8214: ! 8215: case 0xB8: // no_op_xx ! 8216: return 0; ! 8217: ! 8218: case 0xB9: // no_op_xx ! 8219: return 0; ! 8220: ! 8221: case 0xBA: // no_op_xx ! 8222: return 0; ! 8223: ! 8224: case 0xBB: // no_op_xx ! 8225: return 0; ! 8226: ! 8227: case 0xBC: // no_op_xx ! 8228: return 0; ! 8229: ! 8230: case 0xBD: // no_op_xx ! 8231: return 0; ! 8232: ! 8233: case 0xBE: // res_7_xix ! 8234: MemWriteByte(wAddr, Res(MemReadByte(wAddr), 7)); ! 8235: return 23; ! 8236: ! 8237: case 0xBF: // no_op_xx ! 8238: return 0; ! 8239: ! 8240: case 0xC0: // no_op_xx ! 8241: return 0; ! 8242: ! 8243: case 0xC1: // no_op_xx ! 8244: return 0; ! 8245: ! 8246: case 0xC2: // no_op_xx ! 8247: return 0; ! 8248: ! 8249: case 0xC3: // no_op_xx ! 8250: return 0; ! 8251: ! 8252: case 0xC4: // no_op_xx ! 8253: return 0; ! 8254: ! 8255: case 0xC5: // no_op_xx ! 8256: return 0; ! 8257: ! 8258: case 0xC6: // set_0_xix ! 8259: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 0)); ! 8260: return 23; ! 8261: ! 8262: case 0xC7: // no_op_xx ! 8263: return 0; ! 8264: ! 8265: case 0xC8: // no_op_xx ! 8266: return 0; ! 8267: ! 8268: case 0xC9: // no_op_xx ! 8269: return 0; ! 8270: ! 8271: case 0xCA: // no_op_xx ! 8272: return 0; ! 8273: ! 8274: case 0xCB: // no_op_xx ! 8275: return 0; ! 8276: ! 8277: case 0xCC: // no_op_xx ! 8278: return 0; ! 8279: ! 8280: case 0xCD: // no_op_xx ! 8281: return 0; ! 8282: ! 8283: case 0xCE: // set_1_xix ! 8284: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 1)); ! 8285: return 23; ! 8286: ! 8287: case 0xCF: // no_op_xx ! 8288: return 0; ! 8289: ! 8290: case 0xD0: // no_op_xx ! 8291: return 0; ! 8292: ! 8293: case 0xD1: // no_op_xx ! 8294: return 0; ! 8295: ! 8296: case 0xD2: // no_op_xx ! 8297: return 0; ! 8298: ! 8299: case 0xD3: // no_op_xx ! 8300: return 0; ! 8301: ! 8302: case 0xD4: // no_op_xx ! 8303: return 0; ! 8304: ! 8305: case 0xD5: // no_op_xx ! 8306: return 0; ! 8307: ! 8308: case 0xD6: // set_2_xix ! 8309: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 2)); ! 8310: return 23; ! 8311: ! 8312: case 0xD7: // no_op_xx ! 8313: return 0; ! 8314: ! 8315: case 0xD8: // no_op_xx ! 8316: return 0; ! 8317: ! 8318: case 0xD9: // no_op_xx ! 8319: return 0; ! 8320: ! 8321: case 0xDA: // no_op_xx ! 8322: return 0; ! 8323: ! 8324: case 0xDB: // no_op_xx ! 8325: return 0; ! 8326: ! 8327: case 0xDC: // no_op_xx ! 8328: return 0; ! 8329: ! 8330: case 0xDD: // no_op_xx ! 8331: return 0; ! 8332: ! 8333: case 0xDE: // set_3_xix ! 8334: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 3)); ! 8335: return 23; ! 8336: ! 8337: case 0xDF: // no_op_xx ! 8338: return 0; ! 8339: ! 8340: case 0xE0: // no_op_xx ! 8341: return 0; ! 8342: ! 8343: case 0xE1: // no_op_xx ! 8344: return 0; ! 8345: ! 8346: case 0xE2: // no_op_xx ! 8347: return 0; ! 8348: ! 8349: case 0xE3: // no_op_xx ! 8350: return 0; ! 8351: ! 8352: case 0xE4: // no_op_xx ! 8353: return 0; ! 8354: ! 8355: case 0xE5: // no_op_xx ! 8356: return 0; ! 8357: ! 8358: case 0xE6: // set_4_xix ! 8359: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 4)); ! 8360: return 23; ! 8361: ! 8362: case 0xE7: // no_op_xx ! 8363: return 0; ! 8364: ! 8365: case 0xE8: // no_op_xx ! 8366: return 0; ! 8367: ! 8368: case 0xE9: // no_op_xx ! 8369: return 0; ! 8370: ! 8371: case 0xEA: // no_op_xx ! 8372: return 0; ! 8373: ! 8374: case 0xEB: // no_op_xx ! 8375: return 0; ! 8376: ! 8377: case 0xEC: // no_op_xx ! 8378: return 0; ! 8379: ! 8380: case 0xED: // no_op_xx ! 8381: return 0; ! 8382: ! 8383: case 0xEE: // set_5_xix ! 8384: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 5)); ! 8385: return 23; ! 8386: ! 8387: case 0xEF: // no_op_xx ! 8388: return 0; ! 8389: ! 8390: case 0xF0: // no_op_xx ! 8391: return 0; ! 8392: ! 8393: case 0xF1: // no_op_xx ! 8394: return 0; ! 8395: ! 8396: case 0xF2: // no_op_xx ! 8397: return 0; ! 8398: ! 8399: case 0xF3: // no_op_xx ! 8400: return 0; ! 8401: ! 8402: case 0xF4: // no_op_xx ! 8403: return 0; ! 8404: ! 8405: case 0xF5: // no_op_xx ! 8406: return 0; ! 8407: ! 8408: case 0xF6: // set_6_xix ! 8409: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 6)); ! 8410: return 23; ! 8411: ! 8412: case 0xF7: // no_op_xx ! 8413: return 0; ! 8414: ! 8415: case 0xF8: // no_op_xx ! 8416: return 0; ! 8417: ! 8418: case 0xF9: // no_op_xx ! 8419: return 0; ! 8420: ! 8421: case 0xFA: // no_op_xx ! 8422: return 0; ! 8423: ! 8424: case 0xFB: // no_op_xx ! 8425: return 0; ! 8426: ! 8427: case 0xFC: // no_op_xx ! 8428: return 0; ! 8429: ! 8430: case 0xFD: // no_op_xx ! 8431: return 0; ! 8432: ! 8433: case 0xFE: // set_7_xix ! 8434: MemWriteByte(wAddr, Set(MemReadByte(wAddr), 7)); ! 8435: return 23; ! 8436: ! 8437: case 0xFF: // no_op_x ! 8438: return 0; ! 8439: ! 8440: default: ! 8441: _ASSERT(FALSE); ! 8442: return 0; ! 8443: } ! 8444: } ! 8445: ! 8446: /* *************************************************************************** ! 8447: * Debugger shit ! 8448: * *************************************************************************** ! 8449: */ ! 8450: ! 8451: /*** Z80Em: Portable Z80 emulator *******************************************/ ! 8452: /*** ***/ ! 8453: /*** Z80Dasm.h ***/ ! 8454: /*** ***/ ! 8455: /*** This file contains a routine to disassemble a buffer containing Z80 ***/ ! 8456: /*** opcodes. It is included from Z80Debug.c and z80dasm.c ***/ ! 8457: /*** ***/ ! 8458: /*** Copyright (C) Marcel de Kogel 1996,1997 ***/ ! 8459: /*** You are not allowed to distribute this software commercially ***/ ! 8460: /*** Please, notify me, if you make any changes to this file ***/ ! 8461: /****************************************************************************/ ! 8462: ! 8463: #include <stdio.h> ! 8464: #include <string.h> ! 8465: ! 8466: static char *mnemonic_xx_cb[256]= ! 8467: { ! 8468: "#","#","#","#","#","#","rlc Y" ,"#", ! 8469: "#","#","#","#","#","#","rrc Y" ,"#", ! 8470: "#","#","#","#","#","#","rl Y" ,"#", ! 8471: "#","#","#","#","#","#","rr Y" ,"#", ! 8472: "#","#","#","#","#","#","sla Y" ,"#", ! 8473: "#","#","#","#","#","#","sra Y" ,"#", ! 8474: "#","#","#","#","#","#","sll Y" ,"#", ! 8475: "#","#","#","#","#","#","srl Y" ,"#", ! 8476: "#","#","#","#","#","#","bit 0,Y","#", ! 8477: "#","#","#","#","#","#","bit 1,Y","#", ! 8478: "#","#","#","#","#","#","bit 2,Y","#", ! 8479: "#","#","#","#","#","#","bit 3,Y","#", ! 8480: "#","#","#","#","#","#","bit 4,Y","#", ! 8481: "#","#","#","#","#","#","bit 5,Y","#", ! 8482: "#","#","#","#","#","#","bit 6,Y","#", ! 8483: "#","#","#","#","#","#","bit 7,Y","#", ! 8484: "#","#","#","#","#","#","res 0,Y","#", ! 8485: "#","#","#","#","#","#","res 1,Y","#", ! 8486: "#","#","#","#","#","#","res 2,Y","#", ! 8487: "#","#","#","#","#","#","res 3,Y","#", ! 8488: "#","#","#","#","#","#","res 4,Y","#", ! 8489: "#","#","#","#","#","#","res 5,Y","#", ! 8490: "#","#","#","#","#","#","res 6,Y","#", ! 8491: "#","#","#","#","#","#","res 7,Y","#", ! 8492: "#","#","#","#","#","#","set 0,Y","#", ! 8493: "#","#","#","#","#","#","set 1,Y","#", ! 8494: "#","#","#","#","#","#","set 2,Y","#", ! 8495: "#","#","#","#","#","#","set 3,Y","#", ! 8496: "#","#","#","#","#","#","set 4,Y","#", ! 8497: "#","#","#","#","#","#","set 5,Y","#", ! 8498: "#","#","#","#","#","#","set 6,Y","#", ! 8499: "#","#","#","#","#","#","set 7,Y","#" ! 8500: }; ! 8501: ! 8502: static char *mnemonic_cb[256]= ! 8503: { ! 8504: "rlc b" ,"rlc c" ,"rlc d" ,"rlc e" ,"rlc h" ,"rlc l" ,"rlc (hl)" ,"rlc a" , ! 8505: "rrc b" ,"rrc c" ,"rrc d" ,"rrc e" ,"rrc h" ,"rrc l" ,"rrc (hl)" ,"rrc a" , ! 8506: "rl b" ,"rl c" ,"rl d" ,"rl e" ,"rl h" ,"rl l" ,"rl (hl)" ,"rl a" , ! 8507: "rr b" ,"rr c" ,"rr d" ,"rr e" ,"rr h" ,"rr l" ,"rr (hl)" ,"rr a" , ! 8508: "sla b" ,"sla c" ,"sla d" ,"sla e" ,"sla h" ,"sla l" ,"sla (hl)" ,"sla a" , ! 8509: "sra b" ,"sra c" ,"sra d" ,"sra e" ,"sra h" ,"sra l" ,"sra (hl)" ,"sra a" , ! 8510: "sll b" ,"sll c" ,"sll d" ,"sll e" ,"sll h" ,"sll l" ,"sll (hl)" ,"sll a" , ! 8511: "srl b" ,"srl c" ,"srl d" ,"srl e" ,"srl h" ,"srl l" ,"srl (hl)" ,"srl a" , ! 8512: "bit 0,b","bit 0,c","bit 0,d","bit 0,e","bit 0,h","bit 0,l","bit 0,(hl)","bit 0,a", ! 8513: "bit 1,b","bit 1,c","bit 1,d","bit 1,e","bit 1,h","bit 1,l","bit 1,(hl)","bit 1,a", ! 8514: "bit 2,b","bit 2,c","bit 2,d","bit 2,e","bit 2,h","bit 2,l","bit 2,(hl)","bit 2,a", ! 8515: "bit 3,b","bit 3,c","bit 3,d","bit 3,e","bit 3,h","bit 3,l","bit 3,(hl)","bit 3,a", ! 8516: "bit 4,b","bit 4,c","bit 4,d","bit 4,e","bit 4,h","bit 4,l","bit 4,(hl)","bit 4,a", ! 8517: "bit 5,b","bit 5,c","bit 5,d","bit 5,e","bit 5,h","bit 5,l","bit 5,(hl)","bit 5,a", ! 8518: "bit 6,b","bit 6,c","bit 6,d","bit 6,e","bit 6,h","bit 6,l","bit 6,(hl)","bit 6,a", ! 8519: "bit 7,b","bit 7,c","bit 7,d","bit 7,e","bit 7,h","bit 7,l","bit 7,(hl)","bit 7,a", ! 8520: "res 0,b","res 0,c","res 0,d","res 0,e","res 0,h","res 0,l","res 0,(hl)","res 0,a", ! 8521: "res 1,b","res 1,c","res 1,d","res 1,e","res 1,h","res 1,l","res 1,(hl)","res 1,a", ! 8522: "res 2,b","res 2,c","res 2,d","res 2,e","res 2,h","res 2,l","res 2,(hl)","res 2,a", ! 8523: "res 3,b","res 3,c","res 3,d","res 3,e","res 3,h","res 3,l","res 3,(hl)","res 3,a", ! 8524: "res 4,b","res 4,c","res 4,d","res 4,e","res 4,h","res 4,l","res 4,(hl)","res 4,a", ! 8525: "res 5,b","res 5,c","res 5,d","res 5,e","res 5,h","res 5,l","res 5,(hl)","res 5,a", ! 8526: "res 6,b","res 6,c","res 6,d","res 6,e","res 6,h","res 6,l","res 6,(hl)","res 6,a", ! 8527: "res 7,b","res 7,c","res 7,d","res 7,e","res 7,h","res 7,l","res 7,(hl)","res 7,a", ! 8528: "set 0,b","set 0,c","set 0,d","set 0,e","set 0,h","set 0,l","set 0,(hl)","set 0,a", ! 8529: "set 1,b","set 1,c","set 1,d","set 1,e","set 1,h","set 1,l","set 1,(hl)","set 1,a", ! 8530: "set 2,b","set 2,c","set 2,d","set 2,e","set 2,h","set 2,l","set 2,(hl)","set 2,a", ! 8531: "set 3,b","set 3,c","set 3,d","set 3,e","set 3,h","set 3,l","set 3,(hl)","set 3,a", ! 8532: "set 4,b","set 4,c","set 4,d","set 4,e","set 4,h","set 4,l","set 4,(hl)","set 4,a", ! 8533: "set 5,b","set 5,c","set 5,d","set 5,e","set 5,h","set 5,l","set 5,(hl)","set 5,a", ! 8534: "set 6,b","set 6,c","set 6,d","set 6,e","set 6,h","set 6,l","set 6,(hl)","set 6,a", ! 8535: "set 7,b","set 7,c","set 7,d","set 7,e","set 7,h","set 7,l","set 7,(hl)","set 7,a" ! 8536: }; ! 8537: ! 8538: static char *mnemonic_ed[256]= ! 8539: { ! 8540: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8541: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8542: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8543: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8544: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8545: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8546: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8547: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8548: "in b,(c)","out (c),b","sbc hl,bc","ld (W),bc","neg","retn","im 0","ld i,a", ! 8549: "in c,(c)","out (c),c","adc hl,bc","ld bc,(W)","!" ,"reti","!" ,"ld r,a", ! 8550: "in d,(c)","out (c),d","sbc hl,de","ld (W),de","!" ,"!" ,"im 1","ld a,i", ! 8551: "in e,(c)","out (c),e","adc hl,de","ld de,(W)","!" ,"!" ,"im 2","ld a,r", ! 8552: "in h,(c)","out (c),h","sbc hl,hl","ld (W),hl","!" ,"!" ,"!" ,"rrd" , ! 8553: "in l,(c)","out (c),l","adc hl,hl","ld hl,(W)","!" ,"!" ,"!" ,"rld" , ! 8554: "in 0,(c)","out (c),0","sbc hl,sp","ld (W),sp","!" ,"!" ,"!" ,"!" , ! 8555: "in a,(c)","out (c),a","adc hl,sp","ld sp,(W)","!" ,"!" ,"!" ,"!" , ! 8556: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8557: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8558: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8559: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8560: "ldi" ,"cpi" ,"ini" ,"outi" ,"!" ,"!" ,"!" ,"!" , ! 8561: "ldd" ,"cpd" ,"ind" ,"outd" ,"!" ,"!" ,"!" ,"!" , ! 8562: "ldir" ,"cpir" ,"inir" ,"otir" ,"!" ,"!" ,"!" ,"!" , ! 8563: "lddr" ,"cpdr" ,"indr" ,"otdr" ,"!" ,"!" ,"!" ,"!" , ! 8564: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8565: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8566: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8567: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8568: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8569: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8570: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" , ! 8571: "!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ,"!" ! 8572: }; ! 8573: ! 8574: static char *mnemonic_xx[256]= ! 8575: { ! 8576: "@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8577: "@" ,"add I,bc","@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8578: "@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8579: "@" ,"add I,de","@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8580: "@" ,"ld I,W" ,"ld (W),I","inc I" ,"inc Ih" ,"dec Ih" ,"ld Ih,B","@" , ! 8581: "@" ,"add I,I" ,"ld I,(W)","dec I" ,"inc Il" ,"dec Il" ,"ld Il,B","@" , ! 8582: "@" ,"@" ,"@" ,"@" ,"inc X" ,"dec X" ,"ld X,B" ,"@" , ! 8583: "@" ,"add I,sp","@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8584: "@" ,"@" ,"@" ,"@" ,"ld b,Ih" ,"ld b,Il" ,"ld b,X" ,"@" , ! 8585: "@" ,"@" ,"@" ,"@" ,"ld c,Ih" ,"ld c,Il" ,"ld c,X" ,"@" , ! 8586: "@" ,"@" ,"@" ,"@" ,"ld d,Ih" ,"ld d,Il" ,"ld d,X" ,"@" , ! 8587: "@" ,"@" ,"@" ,"@" ,"ld e,Ih" ,"ld e,Il" ,"ld e,X" ,"@" , ! 8588: "ld Ih,b","ld Ih,c" ,"ld Ih,d" ,"ld Ih,e" ,"ld Ih,h" ,"ld Ih,l" ,"ld h,X" ,"ld Ih,a", ! 8589: "ld Il,b","ld Il,c" ,"ld Il,d" ,"ld Il,e" ,"ld Il,h" ,"ld Il,l" ,"ld l,X" ,"ld Il,a", ! 8590: "ld X,b" ,"ld X,c" ,"ld X,d" ,"ld X,e" ,"ld X,h" ,"ld X,l" ,"@" ,"ld X,a" , ! 8591: "@" ,"@" ,"@" ,"@" ,"ld a,Ih" ,"ld a,Il" ,"ld a,X" ,"@" , ! 8592: "@" ,"@" ,"@" ,"@" ,"add a,Ih","add a,Il","add a,X","@" , ! 8593: "@" ,"@" ,"@" ,"@" ,"adc a,Ih","adc a,Il","adc a,X","@" , ! 8594: "@" ,"@" ,"@" ,"@" ,"sub Ih" ,"sub Il" ,"sub X" ,"@" , ! 8595: "@" ,"@" ,"@" ,"@" ,"sbc a,Ih","sbc a,Il","sbc a,X","@" , ! 8596: "@" ,"@" ,"@" ,"@" ,"and Ih" ,"and Il" ,"and X" ,"@" , ! 8597: "@" ,"@" ,"@" ,"@" ,"xor Ih" ,"xor Il" ,"xor X" ,"@" , ! 8598: "@" ,"@" ,"@" ,"@" ,"or Ih" ,"or Il" ,"or X" ,"@" , ! 8599: "@" ,"@" ,"@" ,"@" ,"cp Ih" ,"cp Il" ,"cp X" ,"@" , ! 8600: "@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8601: "@" ,"@" ,"@" ,"fd cb" ,"@" ,"@" ,"@" ,"@" , ! 8602: "@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8603: "@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8604: "@" ,"pop I" ,"@" ,"ex (sp),I","@" ,"push I" ,"@" ,"@" , ! 8605: "@" ,"jp (I)" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8606: "@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" , ! 8607: "@" ,"ld sp,I" ,"@" ,"@" ,"@" ,"@" ,"@" ,"@" ! 8608: }; ! 8609: ! 8610: static char *mnemonic_main[256]= ! 8611: { ! 8612: "nop" ,"ld bc,W" ,"ld (bc),a","inc bc" ,"inc b" ,"dec b" ,"ld b,B" ,"rlca" , ! 8613: "ex af,af'","add hl,bc","ld a,(bc)","dec bc" ,"inc c" ,"dec c" ,"ld c,B" ,"rrca" , ! 8614: "djnz R" ,"ld de,W" ,"ld (de),a","inc de" ,"inc d" ,"dec d" ,"ld d,B" ,"rla" , ! 8615: "jr R" ,"add hl,de","ld a,(de)","dec de" ,"inc e" ,"dec e" ,"ld e,B" ,"rra" , ! 8616: "jr nz,R" ,"ld hl,W" ,"ld (W),hl","inc hl" ,"inc h" ,"dec h" ,"ld h,B" ,"daa" , ! 8617: "jr z,R" ,"add hl,hl","ld hl,(W)","dec hl" ,"inc l" ,"dec l" ,"ld l,B" ,"cpl" , ! 8618: "jr nc,R" ,"ld sp,W" ,"ld (W),a" ,"inc sp" ,"inc (hl)" ,"dec (hl)" ,"ld (hl),B" ,"scf" , ! 8619: "jr c,R" ,"add hl,sp","ld a,(W)" ,"dec sp" ,"inc a" ,"dec a" ,"ld a,B" ,"ccf" , ! 8620: "ld b,b" ,"ld b,c" ,"ld b,d" ,"ld b,e" ,"ld b,h" ,"ld b,l" ,"ld b,(hl)" ,"ld b,a" , ! 8621: "ld c,b" ,"ld c,c" ,"ld c,d" ,"ld c,e" ,"ld c,h" ,"ld c,l" ,"ld c,(hl)" ,"ld c,a" , ! 8622: "ld d,b" ,"ld d,c" ,"ld d,d" ,"ld d,e" ,"ld d,h" ,"ld d,l" ,"ld d,(hl)" ,"ld d,a" , ! 8623: "ld e,b" ,"ld e,c" ,"ld e,d" ,"ld e,e" ,"ld e,h" ,"ld e,l" ,"ld e,(hl)" ,"ld e,a" , ! 8624: "ld h,b" ,"ld h,c" ,"ld h,d" ,"ld h,e" ,"ld h,h" ,"ld h,l" ,"ld h,(hl)" ,"ld h,a" , ! 8625: "ld l,b" ,"ld l,c" ,"ld l,d" ,"ld l,e" ,"ld l,h" ,"ld l,l" ,"ld l,(hl)" ,"ld l,a" , ! 8626: "ld (hl),b","ld (hl),c","ld (hl),d","ld (hl),e" ,"ld (hl),h","ld (hl),l","halt" ,"ld (hl),a", ! 8627: "ld a,b" ,"ld a,c" ,"ld a,d" ,"ld a,e" ,"ld a,h" ,"ld a,l" ,"ld a,(hl)" ,"ld a,a" , ! 8628: "add a,b" ,"add a,c" ,"add a,d" ,"add a,e" ,"add a,h" ,"add a,l" ,"add a,(hl)","add a,a" , ! 8629: "adc a,b" ,"adc a,c" ,"adc a,d" ,"adc a,e" ,"adc a,h" ,"adc a,l" ,"adc a,(hl)","adc a,a" , ! 8630: "sub b" ,"sub c" ,"sub d" ,"sub e" ,"sub h" ,"sub l" ,"sub (hl)" ,"sub a" , ! 8631: "sbc a,b" ,"sbc a,c" ,"sbc a,d" ,"sbc a,e" ,"sbc a,h" ,"sbc a,l" ,"sbc a,(hl)","sbc a,a" , ! 8632: "and b" ,"and c" ,"and d" ,"and e" ,"and h" ,"and l" ,"and (hl)" ,"and a" , ! 8633: "xor b" ,"xor c" ,"xor d" ,"xor e" ,"xor h" ,"xor l" ,"xor (hl)" ,"xor a" , ! 8634: "or b" ,"or c" ,"or d" ,"or e" ,"or h" ,"or l" ,"or (hl)" ,"or a" , ! 8635: "cp b" ,"cp c" ,"cp d" ,"cp e" ,"cp h" ,"cp l" ,"cp (hl)" ,"cp a" , ! 8636: "ret nz" ,"pop bc" ,"jp nz,W" ,"jp W" ,"call nz,W","push bc" ,"add a,B" ,"rst 00h" , ! 8637: "ret z" ,"ret" ,"jp z,W" ,"cb" ,"call z,W" ,"call W" ,"adc a,B" ,"rst 08h" , ! 8638: "ret nc" ,"pop de" ,"jp nc,W" ,"out (B),a" ,"call nc,W","push de" ,"sub B" ,"rst 10h" , ! 8639: "ret c" ,"exx" ,"jp c,W" ,"in a,(B)" ,"call c,W" ,"dd" ,"sbc a,B" ,"rst 18h" , ! 8640: "ret po" ,"pop hl" ,"jp po,W" ,"ex (sp),hl","call po,W","push hl" ,"and B" ,"rst 20h" , ! 8641: "ret pe" ,"jp (hl)" ,"jp pe,W" ,"ex de,hl" ,"call pe,W","ed" ,"xor B" ,"rst 28h" , ! 8642: "ret p" ,"pop af" ,"jp p,W" ,"di" ,"call p,W" ,"push af" ,"or B" ,"rst 30h" , ! 8643: "ret m" ,"ld sp,hl" ,"jp m,W" ,"ei" ,"call m,W" ,"fd" ,"cp B" ,"rst 38h" ! 8644: }; ! 8645: ! 8646: static char Sign (unsigned char a) ! 8647: { ! 8648: return (a&128)? '-':'+'; ! 8649: } ! 8650: ! 8651: static int Abs (unsigned char a) ! 8652: { ! 8653: if (a&128) return 256-a; ! 8654: else return a; ! 8655: } ! 8656: ! 8657: /****************************************************************************/ ! 8658: /* Disassemble first opcode in buffer and return number of bytes it takes */ ! 8659: /****************************************************************************/ ! 8660: int Z80_Dasm (unsigned char *buffer,char *dest,unsigned PC) { ! 8661: char *S; ! 8662: char *r; ! 8663: int i,j,k; ! 8664: unsigned char buf[10]; ! 8665: char Offset; ! 8666: i=Offset=0; ! 8667: r="INTERNAL PROGRAM ERROR"; ! 8668: dest[0]='\0'; ! 8669: switch (buffer[i]) ! 8670: { ! 8671: case 0xCB: ! 8672: i++; ! 8673: S=mnemonic_cb[buffer[i++]]; ! 8674: break; ! 8675: case 0xED: ! 8676: i++; ! 8677: S=mnemonic_ed[buffer[i++]]; ! 8678: break; ! 8679: case 0xDD: ! 8680: i++; ! 8681: r="ix"; ! 8682: switch (buffer[i]) ! 8683: { ! 8684: case 0xcb: ! 8685: i++; ! 8686: Offset=buffer[i++]; ! 8687: S=mnemonic_xx_cb[buffer[i++]]; ! 8688: break; ! 8689: default: ! 8690: S=mnemonic_xx[buffer[i++]]; ! 8691: break; ! 8692: } ! 8693: break; ! 8694: case 0xFD: ! 8695: i++; ! 8696: r="iy"; ! 8697: switch (buffer[i]) ! 8698: { ! 8699: case 0xcb: ! 8700: i++; ! 8701: Offset=buffer[i++]; ! 8702: S=mnemonic_xx_cb[buffer[i++]]; ! 8703: break; ! 8704: default: ! 8705: S=mnemonic_xx[buffer[i++]]; ! 8706: break; ! 8707: } ! 8708: break; ! 8709: default: ! 8710: S=mnemonic_main[buffer[i++]]; ! 8711: break; ! 8712: } ! 8713: for (j=0;S[j];++j) ! 8714: { ! 8715: switch (S[j]) ! 8716: { ! 8717: case 'B': ! 8718: sprintf (buf,"$%02x",buffer[i++]); ! 8719: strcat (dest,buf); ! 8720: break; ! 8721: case 'R': ! 8722: sprintf (buf,"$%04x",(PC+2+(signed char)buffer[i])&0xFFFF); ! 8723: i++; ! 8724: strcat (dest,buf); ! 8725: break; ! 8726: case 'W': ! 8727: sprintf (buf,"$%04x",buffer[i]+buffer[i+1]*256); ! 8728: i+=2; ! 8729: strcat (dest,buf); ! 8730: break; ! 8731: case 'X': ! 8732: sprintf (buf,"(%s%c$%02x)",r,Sign(buffer[i]),Abs(buffer[i])); ! 8733: i++; ! 8734: strcat (dest,buf); ! 8735: break; ! 8736: case 'Y': ! 8737: sprintf (buf,"(%s%c$%02x)",r,Sign(Offset),Abs(Offset)); ! 8738: strcat (dest,buf); ! 8739: break; ! 8740: case 'I': ! 8741: strcat (dest,r); ! 8742: break; ! 8743: case '!': ! 8744: sprintf (dest,"db $ed,$%02x",buffer[1]); ! 8745: return 2; ! 8746: case '@': ! 8747: sprintf (dest,"db $%02x",buffer[0]); ! 8748: return 1; ! 8749: case '#': ! 8750: sprintf (dest,"db $%02x,$cb,$%02x",buffer[0],buffer[2]); ! 8751: return 2; ! 8752: case ' ': ! 8753: k=strlen(dest); ! 8754: if (k<6) k=7-k; ! 8755: else k=1; ! 8756: memset (buf,' ',k); ! 8757: buf[k]='\0'; ! 8758: strcat (dest,buf); ! 8759: break; ! 8760: default: ! 8761: buf[0]=S[j]; ! 8762: buf[1]='\0'; ! 8763: strcat (dest,buf); ! 8764: break; ! 8765: } ! 8766: } ! 8767: return i; ! 8768: } ! 8769: ! 8770: UINT32 mz80GetElapsedTicks(UINT32 dwClearIt) ! 8771: { ! 8772: UINT32 dwTempVar = 0; ! 8773: char string[150]; ! 8774: ! 8775: dwTempVar = dwElapsedTicks; ! 8776: if (dwClearIt) ! 8777: dwElapsedTicks = 0; ! 8778: return(dwTempVar); ! 8779: } ! 8780: ! 8781: void mz80ReleaseTimeslice() ! 8782: { ! 8783: cCycles = 0; ! 8784: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.