- [FIX] Ja ignora correctament combinacions incorrectes de opcodes DD i FD.
This commit is contained in:
676
z80.cpp
676
z80.cpp
@@ -1141,291 +1141,296 @@ namespace z80
|
||||
if (out_ptr) out_ports[num] = out_ptr;
|
||||
}
|
||||
|
||||
bool opcode_ignored = false;
|
||||
uint32_t step()
|
||||
{
|
||||
current_opcode_address = rPC;
|
||||
t = 0;
|
||||
const uint8_t opcode = READ_M1();
|
||||
if (memtag[current_opcode_address] != MEMTAG_IGNORE) memtag[current_opcode_address] = MEMTAG_INST;
|
||||
memtouched[current_opcode_address] = memtouched[current_opcode_address] != MEMTAG_NONE ? MEMTAG_REPEAT : MEMTAG_INST;
|
||||
uint16_t tmp;
|
||||
do {
|
||||
opcode_ignored = false;
|
||||
current_opcode_address = rPC;
|
||||
t = 0;
|
||||
const uint8_t opcode = READ_M1();
|
||||
if (memtag[current_opcode_address] != MEMTAG_IGNORE) memtag[current_opcode_address] = MEMTAG_INST;
|
||||
memtouched[current_opcode_address] = memtouched[current_opcode_address] != MEMTAG_NONE ? MEMTAG_REPEAT : MEMTAG_INST;
|
||||
uint16_t tmp;
|
||||
|
||||
if (opcode!=0xED && opcode!=0xCB && opcode!=0xDD && opcode!=0xFD ) z80debug::useOpcode(opcode, 0);
|
||||
if (opcode!=0xED && opcode!=0xCB && opcode!=0xDD && opcode!=0xFD ) z80debug::useOpcode(opcode, 0);
|
||||
|
||||
switch (opcode)
|
||||
{
|
||||
case 0x00: /* NOP */ break;
|
||||
case 0x01: rBC = READ_MEM_16(); break;
|
||||
case 0x02: WRITE_MEM_8(rBC, rA); break;
|
||||
case 0x03: INC16(_rBC); break;
|
||||
case 0x04: INC8(_rB); break;
|
||||
case 0x05: DEC8(_rB); break;
|
||||
case 0x06: rB = READ_MEM_8(); break;
|
||||
case 0x07: RLCA(); break;
|
||||
case 0x08: EX(rAF, rAF2); break;
|
||||
case 0x09: ADD16(_rHL, rBC); break;
|
||||
case 0x0A: rA = READ_MEM_8(rBC); break;
|
||||
case 0x0B: DEC16(_rBC); break;
|
||||
case 0x0C: INC8(_rC); break;
|
||||
case 0x0D: DEC8(_rC); break;
|
||||
case 0x0E: rC = READ_MEM_8(); break;
|
||||
case 0x0F: RRCA(); break;
|
||||
switch (opcode)
|
||||
{
|
||||
case 0x00: /* NOP */ break;
|
||||
case 0x01: rBC = READ_MEM_16(); break;
|
||||
case 0x02: WRITE_MEM_8(rBC, rA); break;
|
||||
case 0x03: INC16(_rBC); break;
|
||||
case 0x04: INC8(_rB); break;
|
||||
case 0x05: DEC8(_rB); break;
|
||||
case 0x06: rB = READ_MEM_8(); break;
|
||||
case 0x07: RLCA(); break;
|
||||
case 0x08: EX(rAF, rAF2); break;
|
||||
case 0x09: ADD16(_rHL, rBC); break;
|
||||
case 0x0A: rA = READ_MEM_8(rBC); break;
|
||||
case 0x0B: DEC16(_rBC); break;
|
||||
case 0x0C: INC8(_rC); break;
|
||||
case 0x0D: DEC8(_rC); break;
|
||||
case 0x0E: rC = READ_MEM_8(); break;
|
||||
case 0x0F: RRCA(); break;
|
||||
|
||||
case 0x10: DJNZ(); break;
|
||||
case 0x11: rDE = READ_MEM_16(); break;
|
||||
case 0x12: WRITE_MEM_8(rDE, rA); break;
|
||||
case 0x13: INC16(_rDE); break;
|
||||
case 0x14: INC8(_rD); break;
|
||||
case 0x15: DEC8(_rD); break;
|
||||
case 0x16: rD = READ_MEM_8(); break;
|
||||
case 0x17: RLA(); break;
|
||||
case 0x18: JR(); break;
|
||||
case 0x19: ADD16(_rHL, rDE); break;
|
||||
case 0x1A: rA = READ_MEM_8(rDE); break;
|
||||
case 0x1B: DEC16(_rDE); break;
|
||||
case 0x1C: INC8(_rE); break;
|
||||
case 0x1D: DEC8(_rE); break;
|
||||
case 0x1E: rE = READ_MEM_8(); break;
|
||||
case 0x1F: RRA(); break;
|
||||
case 0x10: DJNZ(); break;
|
||||
case 0x11: rDE = READ_MEM_16(); break;
|
||||
case 0x12: WRITE_MEM_8(rDE, rA); break;
|
||||
case 0x13: INC16(_rDE); break;
|
||||
case 0x14: INC8(_rD); break;
|
||||
case 0x15: DEC8(_rD); break;
|
||||
case 0x16: rD = READ_MEM_8(); break;
|
||||
case 0x17: RLA(); break;
|
||||
case 0x18: JR(); break;
|
||||
case 0x19: ADD16(_rHL, rDE); break;
|
||||
case 0x1A: rA = READ_MEM_8(rDE); break;
|
||||
case 0x1B: DEC16(_rDE); break;
|
||||
case 0x1C: INC8(_rE); break;
|
||||
case 0x1D: DEC8(_rE); break;
|
||||
case 0x1E: rE = READ_MEM_8(); break;
|
||||
case 0x1F: RRA(); break;
|
||||
|
||||
case 0x20: JR(cNZ); break;
|
||||
case 0x21: rHL = READ_MEM_16(); break;
|
||||
case 0x22: WRITE_MEM_16(READ_MEM_16(), rHL);break;
|
||||
case 0x23: INC16(_rHL); break;
|
||||
case 0x24: INC8(_rH); break;
|
||||
case 0x25: DEC8(_rH); break;
|
||||
case 0x26: rH = READ_MEM_8(); break;
|
||||
case 0x27: DAA(); break;
|
||||
case 0x28: JR(cZ); break;
|
||||
case 0x29: ADD16(_rHL, rHL); break;
|
||||
case 0x2A: rHL = READ_MEM_16(READ_MEM_16());break;
|
||||
case 0x2B: DEC16(_rHL); break;
|
||||
case 0x2C: INC8(_rL); break;
|
||||
case 0x2D: DEC8(_rL); break;
|
||||
case 0x2E: rL = READ_MEM_8(); break;
|
||||
case 0x2F: CPL(); break;
|
||||
case 0x20: JR(cNZ); break;
|
||||
case 0x21: rHL = READ_MEM_16(); break;
|
||||
case 0x22: WRITE_MEM_16(READ_MEM_16(), rHL);break;
|
||||
case 0x23: INC16(_rHL); break;
|
||||
case 0x24: INC8(_rH); break;
|
||||
case 0x25: DEC8(_rH); break;
|
||||
case 0x26: rH = READ_MEM_8(); break;
|
||||
case 0x27: DAA(); break;
|
||||
case 0x28: JR(cZ); break;
|
||||
case 0x29: ADD16(_rHL, rHL); break;
|
||||
case 0x2A: rHL = READ_MEM_16(READ_MEM_16());break;
|
||||
case 0x2B: DEC16(_rHL); break;
|
||||
case 0x2C: INC8(_rL); break;
|
||||
case 0x2D: DEC8(_rL); break;
|
||||
case 0x2E: rL = READ_MEM_8(); break;
|
||||
case 0x2F: CPL(); break;
|
||||
|
||||
case 0x30: JR(cNC); break;
|
||||
case 0x31: rSP = READ_MEM_16(); break;
|
||||
case 0x32: WRITE_MEM_8(READ_MEM_16(), rA); break;
|
||||
case 0x33: INC16(_rSP); break;
|
||||
case 0x34: INCMEM8(rHL); break;
|
||||
case 0x35: DECMEM8(rHL); break;
|
||||
case 0x36: WRITE_MEM_8(rHL, READ_MEM_8()); break;
|
||||
case 0x37: SCF(); break;
|
||||
case 0x38: JR(cC); break;
|
||||
case 0x39: ADD16(_rHL, rSP); break;
|
||||
case 0x3A: rA = READ_MEM_8(READ_MEM_16()); break;
|
||||
case 0x3B: DEC16(_rSP); break;
|
||||
case 0x3C: INC8(_rA); break;
|
||||
case 0x3D: DEC8(_rA); break;
|
||||
case 0x3E: rA = READ_MEM_8(); break;
|
||||
case 0x3F: CCF(); break;
|
||||
case 0x30: JR(cNC); break;
|
||||
case 0x31: rSP = READ_MEM_16(); break;
|
||||
case 0x32: WRITE_MEM_8(READ_MEM_16(), rA); break;
|
||||
case 0x33: INC16(_rSP); break;
|
||||
case 0x34: INCMEM8(rHL); break;
|
||||
case 0x35: DECMEM8(rHL); break;
|
||||
case 0x36: WRITE_MEM_8(rHL, READ_MEM_8()); break;
|
||||
case 0x37: SCF(); break;
|
||||
case 0x38: JR(cC); break;
|
||||
case 0x39: ADD16(_rHL, rSP); break;
|
||||
case 0x3A: rA = READ_MEM_8(READ_MEM_16()); break;
|
||||
case 0x3B: DEC16(_rSP); break;
|
||||
case 0x3C: INC8(_rA); break;
|
||||
case 0x3D: DEC8(_rA); break;
|
||||
case 0x3E: rA = READ_MEM_8(); break;
|
||||
case 0x3F: CCF(); break;
|
||||
|
||||
case 0x40: rB = rB; break;
|
||||
case 0x41: rB = rC; break;
|
||||
case 0x42: rB = rD; break;
|
||||
case 0x43: rB = rE; break;
|
||||
case 0x44: rB = rH; break;
|
||||
case 0x45: rB = rL; break;
|
||||
case 0x46: rB = READ_MEM_8(rHL); break;
|
||||
case 0x47: rB = rA; break;
|
||||
case 0x48: rC = rB; break;
|
||||
case 0x49: rC = rC; break;
|
||||
case 0x4A: rC = rD; break;
|
||||
case 0x4B: rC = rE; break;
|
||||
case 0x4C: rC = rH; break;
|
||||
case 0x4D: rC = rL; break;
|
||||
case 0x4E: rC = READ_MEM_8(rHL); break;
|
||||
case 0x4F: rC = rA; break;
|
||||
case 0x40: rB = rB; break;
|
||||
case 0x41: rB = rC; break;
|
||||
case 0x42: rB = rD; break;
|
||||
case 0x43: rB = rE; break;
|
||||
case 0x44: rB = rH; break;
|
||||
case 0x45: rB = rL; break;
|
||||
case 0x46: rB = READ_MEM_8(rHL); break;
|
||||
case 0x47: rB = rA; break;
|
||||
case 0x48: rC = rB; break;
|
||||
case 0x49: rC = rC; break;
|
||||
case 0x4A: rC = rD; break;
|
||||
case 0x4B: rC = rE; break;
|
||||
case 0x4C: rC = rH; break;
|
||||
case 0x4D: rC = rL; break;
|
||||
case 0x4E: rC = READ_MEM_8(rHL); break;
|
||||
case 0x4F: rC = rA; break;
|
||||
|
||||
case 0x50: rD = rB; break;
|
||||
case 0x51: rD = rC; break;
|
||||
case 0x52: rD = rD; break;
|
||||
case 0x53: rD = rE; break;
|
||||
case 0x54: rD = rH; break;
|
||||
case 0x55: rD = rL; break;
|
||||
case 0x56: rD = READ_MEM_8(rHL); break;
|
||||
case 0x57: rD = rA; break;
|
||||
case 0x58: rE = rB; break;
|
||||
case 0x59: rE = rC; break;
|
||||
case 0x5A: rE = rD; break;
|
||||
case 0x5B: rE = rE; break;
|
||||
case 0x5C: rE = rH; break;
|
||||
case 0x5D: rE = rL; break;
|
||||
case 0x5E: rE = READ_MEM_8(rHL); break;
|
||||
case 0x5F: rE = rA; break;
|
||||
case 0x50: rD = rB; break;
|
||||
case 0x51: rD = rC; break;
|
||||
case 0x52: rD = rD; break;
|
||||
case 0x53: rD = rE; break;
|
||||
case 0x54: rD = rH; break;
|
||||
case 0x55: rD = rL; break;
|
||||
case 0x56: rD = READ_MEM_8(rHL); break;
|
||||
case 0x57: rD = rA; break;
|
||||
case 0x58: rE = rB; break;
|
||||
case 0x59: rE = rC; break;
|
||||
case 0x5A: rE = rD; break;
|
||||
case 0x5B: rE = rE; break;
|
||||
case 0x5C: rE = rH; break;
|
||||
case 0x5D: rE = rL; break;
|
||||
case 0x5E: rE = READ_MEM_8(rHL); break;
|
||||
case 0x5F: rE = rA; break;
|
||||
|
||||
case 0x60: rH = rB; break;
|
||||
case 0x61: rH = rC; break;
|
||||
case 0x62: rH = rD; break;
|
||||
case 0x63: rH = rE; break;
|
||||
case 0x64: rH = rH; break;
|
||||
case 0x65: rH = rL; break;
|
||||
case 0x66: rH = READ_MEM_8(rHL); break;
|
||||
case 0x67: rH = rA; break;
|
||||
case 0x68: rL = rB; break;
|
||||
case 0x69: rL = rC; break;
|
||||
case 0x6A: rL = rD; break;
|
||||
case 0x6B: rL = rE; break;
|
||||
case 0x6C: rL = rH; break;
|
||||
case 0x6D: rL = rL; break;
|
||||
case 0x6E: rL = READ_MEM_8(rHL); break;
|
||||
case 0x6F: rL = rA; break;
|
||||
case 0x60: rH = rB; break;
|
||||
case 0x61: rH = rC; break;
|
||||
case 0x62: rH = rD; break;
|
||||
case 0x63: rH = rE; break;
|
||||
case 0x64: rH = rH; break;
|
||||
case 0x65: rH = rL; break;
|
||||
case 0x66: rH = READ_MEM_8(rHL); break;
|
||||
case 0x67: rH = rA; break;
|
||||
case 0x68: rL = rB; break;
|
||||
case 0x69: rL = rC; break;
|
||||
case 0x6A: rL = rD; break;
|
||||
case 0x6B: rL = rE; break;
|
||||
case 0x6C: rL = rH; break;
|
||||
case 0x6D: rL = rL; break;
|
||||
case 0x6E: rL = READ_MEM_8(rHL); break;
|
||||
case 0x6F: rL = rA; break;
|
||||
|
||||
case 0x70: WRITE_MEM_8(rHL, rB); break;
|
||||
case 0x71: WRITE_MEM_8(rHL, rC); break;
|
||||
case 0x72: WRITE_MEM_8(rHL, rD); break;
|
||||
case 0x73: WRITE_MEM_8(rHL, rE); break;
|
||||
case 0x74: WRITE_MEM_8(rHL, rH); break;
|
||||
case 0x75: WRITE_MEM_8(rHL, rL); break;
|
||||
case 0x76: HALT(); break;
|
||||
case 0x77: WRITE_MEM_8(rHL, rA); break;
|
||||
case 0x78: rA = rB; break;
|
||||
case 0x79: rA = rC; break;
|
||||
case 0x7A: rA = rD; break;
|
||||
case 0x7B: rA = rE; break;
|
||||
case 0x7C: rA = rH; break;
|
||||
case 0x7D: rA = rL; break;
|
||||
case 0x7E: rA = READ_MEM_8(rHL); break;
|
||||
case 0x7F: rA = rA; break;
|
||||
case 0x70: WRITE_MEM_8(rHL, rB); break;
|
||||
case 0x71: WRITE_MEM_8(rHL, rC); break;
|
||||
case 0x72: WRITE_MEM_8(rHL, rD); break;
|
||||
case 0x73: WRITE_MEM_8(rHL, rE); break;
|
||||
case 0x74: WRITE_MEM_8(rHL, rH); break;
|
||||
case 0x75: WRITE_MEM_8(rHL, rL); break;
|
||||
case 0x76: HALT(); break;
|
||||
case 0x77: WRITE_MEM_8(rHL, rA); break;
|
||||
case 0x78: rA = rB; break;
|
||||
case 0x79: rA = rC; break;
|
||||
case 0x7A: rA = rD; break;
|
||||
case 0x7B: rA = rE; break;
|
||||
case 0x7C: rA = rH; break;
|
||||
case 0x7D: rA = rL; break;
|
||||
case 0x7E: rA = READ_MEM_8(rHL); break;
|
||||
case 0x7F: rA = rA; break;
|
||||
|
||||
case 0x80: ADD8(rB); break;
|
||||
case 0x81: ADD8(rC); break;
|
||||
case 0x82: ADD8(rD); break;
|
||||
case 0x83: ADD8(rE); break;
|
||||
case 0x84: ADD8(rH); break;
|
||||
case 0x85: ADD8(rL); break;
|
||||
case 0x86: ADD8(READ_MEM_8(rHL)); break;
|
||||
case 0x87: ADD8(rA); break;
|
||||
case 0x88: ADC8(rB); break;
|
||||
case 0x89: ADC8(rC); break;
|
||||
case 0x8A: ADC8(rD); break;
|
||||
case 0x8B: ADC8(rE); break;
|
||||
case 0x8C: ADC8(rH); break;
|
||||
case 0x8D: ADC8(rL); break;
|
||||
case 0x8E: ADC8(READ_MEM_8(rHL)); break;
|
||||
case 0x8F: ADC8(rA); break;
|
||||
case 0x80: ADD8(rB); break;
|
||||
case 0x81: ADD8(rC); break;
|
||||
case 0x82: ADD8(rD); break;
|
||||
case 0x83: ADD8(rE); break;
|
||||
case 0x84: ADD8(rH); break;
|
||||
case 0x85: ADD8(rL); break;
|
||||
case 0x86: ADD8(READ_MEM_8(rHL)); break;
|
||||
case 0x87: ADD8(rA); break;
|
||||
case 0x88: ADC8(rB); break;
|
||||
case 0x89: ADC8(rC); break;
|
||||
case 0x8A: ADC8(rD); break;
|
||||
case 0x8B: ADC8(rE); break;
|
||||
case 0x8C: ADC8(rH); break;
|
||||
case 0x8D: ADC8(rL); break;
|
||||
case 0x8E: ADC8(READ_MEM_8(rHL)); break;
|
||||
case 0x8F: ADC8(rA); break;
|
||||
|
||||
case 0x90: SUB8(rB); break;
|
||||
case 0x91: SUB8(rC); break;
|
||||
case 0x92: SUB8(rD); break;
|
||||
case 0x93: SUB8(rE); break;
|
||||
case 0x94: SUB8(rH); break;
|
||||
case 0x95: SUB8(rL); break;
|
||||
case 0x96: SUB8(READ_MEM_8(rHL)); break;
|
||||
case 0x97: SUB8(rA); break;
|
||||
case 0x98: SBC8(rB); break;
|
||||
case 0x99: SBC8(rC); break;
|
||||
case 0x9A: SBC8(rD); break;
|
||||
case 0x9B: SBC8(rE); break;
|
||||
case 0x9C: SBC8(rH); break;
|
||||
case 0x9D: SBC8(rL); break;
|
||||
case 0x9E: SBC8(READ_MEM_8(rHL)); break;
|
||||
case 0x9F: SBC8(rA); break;
|
||||
case 0x90: SUB8(rB); break;
|
||||
case 0x91: SUB8(rC); break;
|
||||
case 0x92: SUB8(rD); break;
|
||||
case 0x93: SUB8(rE); break;
|
||||
case 0x94: SUB8(rH); break;
|
||||
case 0x95: SUB8(rL); break;
|
||||
case 0x96: SUB8(READ_MEM_8(rHL)); break;
|
||||
case 0x97: SUB8(rA); break;
|
||||
case 0x98: SBC8(rB); break;
|
||||
case 0x99: SBC8(rC); break;
|
||||
case 0x9A: SBC8(rD); break;
|
||||
case 0x9B: SBC8(rE); break;
|
||||
case 0x9C: SBC8(rH); break;
|
||||
case 0x9D: SBC8(rL); break;
|
||||
case 0x9E: SBC8(READ_MEM_8(rHL)); break;
|
||||
case 0x9F: SBC8(rA); break;
|
||||
|
||||
case 0xA0: AND(rB); break;
|
||||
case 0xA1: AND(rC); break;
|
||||
case 0xA2: AND(rD); break;
|
||||
case 0xA3: AND(rE); break;
|
||||
case 0xA4: AND(rH); break;
|
||||
case 0xA5: AND(rL); break;
|
||||
case 0xA6: AND(READ_MEM_8(rHL)); break;
|
||||
case 0xA7: AND(rA); break;
|
||||
case 0xA8: XOR(rB); break;
|
||||
case 0xA9: XOR(rC); break;
|
||||
case 0xAA: XOR(rD); break;
|
||||
case 0xAB: XOR(rE); break;
|
||||
case 0xAC: XOR(rH); break;
|
||||
case 0xAD: XOR(rL); break;
|
||||
case 0xAE: XOR(READ_MEM_8(rHL)); break;
|
||||
case 0xAF: XOR(rA); break;
|
||||
case 0xA0: AND(rB); break;
|
||||
case 0xA1: AND(rC); break;
|
||||
case 0xA2: AND(rD); break;
|
||||
case 0xA3: AND(rE); break;
|
||||
case 0xA4: AND(rH); break;
|
||||
case 0xA5: AND(rL); break;
|
||||
case 0xA6: AND(READ_MEM_8(rHL)); break;
|
||||
case 0xA7: AND(rA); break;
|
||||
case 0xA8: XOR(rB); break;
|
||||
case 0xA9: XOR(rC); break;
|
||||
case 0xAA: XOR(rD); break;
|
||||
case 0xAB: XOR(rE); break;
|
||||
case 0xAC: XOR(rH); break;
|
||||
case 0xAD: XOR(rL); break;
|
||||
case 0xAE: XOR(READ_MEM_8(rHL)); break;
|
||||
case 0xAF: XOR(rA); break;
|
||||
|
||||
case 0xB0: OR(rB); break;
|
||||
case 0xB1: OR(rC); break;
|
||||
case 0xB2: OR(rD); break;
|
||||
case 0xB3: OR(rE); break;
|
||||
case 0xB4: OR(rH); break;
|
||||
case 0xB5: OR(rL); break;
|
||||
case 0xB6: OR(READ_MEM_8(rHL)); break;
|
||||
case 0xB7: OR(rA); break;
|
||||
case 0xB8: CP(rB); break;
|
||||
case 0xB9: CP(rC); break;
|
||||
case 0xBA: CP(rD); break;
|
||||
case 0xBB: CP(rE); break;
|
||||
case 0xBC: CP(rH); break;
|
||||
case 0xBD: CP(rL); break;
|
||||
case 0xBE: CP(READ_MEM_8(rHL)); break;
|
||||
case 0xBF: CP(rA); break;
|
||||
case 0xB0: OR(rB); break;
|
||||
case 0xB1: OR(rC); break;
|
||||
case 0xB2: OR(rD); break;
|
||||
case 0xB3: OR(rE); break;
|
||||
case 0xB4: OR(rH); break;
|
||||
case 0xB5: OR(rL); break;
|
||||
case 0xB6: OR(READ_MEM_8(rHL)); break;
|
||||
case 0xB7: OR(rA); break;
|
||||
case 0xB8: CP(rB); break;
|
||||
case 0xB9: CP(rC); break;
|
||||
case 0xBA: CP(rD); break;
|
||||
case 0xBB: CP(rE); break;
|
||||
case 0xBC: CP(rH); break;
|
||||
case 0xBD: CP(rL); break;
|
||||
case 0xBE: CP(READ_MEM_8(rHL)); break;
|
||||
case 0xBF: CP(rA); break;
|
||||
|
||||
case 0xC0: RET(cNZ); break;
|
||||
case 0xC1: POP(_rBC); break;
|
||||
case 0xC2: JP(cNZ, READ_MEM_16()); break;
|
||||
case 0xC3: JP(cNO, READ_MEM_16()); break;
|
||||
case 0xC4: CALL(cNZ, READ_MEM_16()); break;
|
||||
case 0xC5: PUSH(rBC); break;
|
||||
case 0xC6: ADD8(READ_MEM_8()); break;
|
||||
case 0xC7: RST(0x00); break;
|
||||
case 0xC8: RET(cZ); break;
|
||||
case 0xC9: RET(cNO); break;
|
||||
case 0xCA: JP(cZ, READ_MEM_16()); break;
|
||||
case 0xCB: BIT_INSTRUCTIONS(); break;
|
||||
case 0xCC: CALL(cZ, READ_MEM_16()); break;
|
||||
case 0xCD: CALL(cNO, READ_MEM_16()); break;
|
||||
case 0xCE: ADC8(READ_MEM_8()); break;
|
||||
case 0xCF: RST(0x08); break;
|
||||
case 0xC0: RET(cNZ); break;
|
||||
case 0xC1: POP(_rBC); break;
|
||||
case 0xC2: JP(cNZ, READ_MEM_16()); break;
|
||||
case 0xC3: JP(cNO, READ_MEM_16()); break;
|
||||
case 0xC4: CALL(cNZ, READ_MEM_16()); break;
|
||||
case 0xC5: PUSH(rBC); break;
|
||||
case 0xC6: ADD8(READ_MEM_8()); break;
|
||||
case 0xC7: RST(0x00); break;
|
||||
case 0xC8: RET(cZ); break;
|
||||
case 0xC9: RET(cNO); break;
|
||||
case 0xCA: JP(cZ, READ_MEM_16()); break;
|
||||
case 0xCB: BIT_INSTRUCTIONS(); break;
|
||||
case 0xCC: CALL(cZ, READ_MEM_16()); break;
|
||||
case 0xCD: CALL(cNO, READ_MEM_16()); break;
|
||||
case 0xCE: ADC8(READ_MEM_8()); break;
|
||||
case 0xCF: RST(0x08); break;
|
||||
|
||||
case 0xD0: RET(cNC); break;
|
||||
case 0xD1: POP(_rDE); break;
|
||||
case 0xD2: JP(cNC, READ_MEM_16()); break;
|
||||
case 0xD3: OUT(rA, READ_MEM_8()); break;
|
||||
case 0xD4: CALL(cNC, READ_MEM_16()); break;
|
||||
case 0xD5: PUSH(rDE); break;
|
||||
case 0xD6: SUB8(READ_MEM_8()); break;
|
||||
case 0xD7: RST(0x10); break;
|
||||
case 0xD8: RET(cC); break;
|
||||
case 0xD9: EX(rBC, rBC2);EX(rDE, rDE2);EX(rHL, rHL2); break;
|
||||
case 0xDA: JP(cC, READ_MEM_16()); break;
|
||||
case 0xDB: rA = IN(READ_MEM_8()); break;
|
||||
case 0xDC: CALL(cC, READ_MEM_16()); break;
|
||||
case 0xDD: IX_INSTRUCTIONS(); break;
|
||||
case 0xDE: SBC8(READ_MEM_8()); break;
|
||||
case 0xDF: RST(0x18); break;
|
||||
case 0xD0: RET(cNC); break;
|
||||
case 0xD1: POP(_rDE); break;
|
||||
case 0xD2: JP(cNC, READ_MEM_16()); break;
|
||||
case 0xD3: OUT(rA, READ_MEM_8()); break;
|
||||
case 0xD4: CALL(cNC, READ_MEM_16()); break;
|
||||
case 0xD5: PUSH(rDE); break;
|
||||
case 0xD6: SUB8(READ_MEM_8()); break;
|
||||
case 0xD7: RST(0x10); break;
|
||||
case 0xD8: RET(cC); break;
|
||||
case 0xD9: EX(rBC, rBC2);EX(rDE, rDE2);EX(rHL, rHL2); break;
|
||||
case 0xDA: JP(cC, READ_MEM_16()); break;
|
||||
case 0xDB: rA = IN(READ_MEM_8()); break;
|
||||
case 0xDC: CALL(cC, READ_MEM_16()); break;
|
||||
case 0xDD: IX_INSTRUCTIONS(); break;
|
||||
case 0xDE: SBC8(READ_MEM_8()); break;
|
||||
case 0xDF: RST(0x18); break;
|
||||
|
||||
case 0xE0: RET(cPO); break;
|
||||
case 0xE1: POP(_rHL); break;
|
||||
case 0xE2: JP(cPO, READ_MEM_16()); break;
|
||||
case 0xE3: EX_MEM(_rHL, rSP); break;
|
||||
case 0xE4: CALL(cPO, READ_MEM_16()); break;
|
||||
case 0xE5: PUSH(rHL); break;
|
||||
case 0xE6: AND(READ_MEM_8()); break;
|
||||
case 0xE7: RST(0x20); break;
|
||||
case 0xE8: RET(cPE); break;
|
||||
case 0xE9: JP(cNO, rHL); break;
|
||||
case 0xEA: JP(cPE, READ_MEM_16()); break;
|
||||
case 0xEB: EX(rDE, rHL); break;
|
||||
case 0xEC: CALL(cPE, READ_MEM_16()); break;
|
||||
case 0xED: MISC_INSTRUCTIONS(); break;
|
||||
case 0xEE: XOR(READ_MEM_8()); break;
|
||||
case 0xEF: RST(0x28); break;
|
||||
case 0xE0: RET(cPO); break;
|
||||
case 0xE1: POP(_rHL); break;
|
||||
case 0xE2: JP(cPO, READ_MEM_16()); break;
|
||||
case 0xE3: EX_MEM(_rHL, rSP); break;
|
||||
case 0xE4: CALL(cPO, READ_MEM_16()); break;
|
||||
case 0xE5: PUSH(rHL); break;
|
||||
case 0xE6: AND(READ_MEM_8()); break;
|
||||
case 0xE7: RST(0x20); break;
|
||||
case 0xE8: RET(cPE); break;
|
||||
case 0xE9: JP(cNO, rHL); break;
|
||||
case 0xEA: JP(cPE, READ_MEM_16()); break;
|
||||
case 0xEB: EX(rDE, rHL); break;
|
||||
case 0xEC: CALL(cPE, READ_MEM_16()); break;
|
||||
case 0xED: MISC_INSTRUCTIONS(); break;
|
||||
case 0xEE: XOR(READ_MEM_8()); break;
|
||||
case 0xEF: RST(0x28); break;
|
||||
|
||||
case 0xF0: RET(cP); break;
|
||||
case 0xF1: POP(_rAF); break;
|
||||
case 0xF2: JP(cP, READ_MEM_16()); break;
|
||||
case 0xF3: DI(); break;
|
||||
case 0xF4: CALL(cP, READ_MEM_16()); break;
|
||||
case 0xF5: PUSH(rAF); break;
|
||||
case 0xF6: OR(READ_MEM_8()); break;
|
||||
case 0xF7: RST(0x30); break;
|
||||
case 0xF8: RET(cM); break;
|
||||
case 0xF9: rSP = rHL; t+=2; break;
|
||||
case 0xFA: JP(cM, READ_MEM_16()); break;
|
||||
case 0xFB: EI(); break;
|
||||
case 0xFC: CALL(cM, READ_MEM_16()); break;
|
||||
case 0xFD: IY_INSTRUCTIONS(); break;
|
||||
case 0xFE: CP(READ_MEM_8()); break;
|
||||
case 0xFF: RST(0x38); break;
|
||||
}
|
||||
case 0xF0: RET(cP); break;
|
||||
case 0xF1: POP(_rAF); break;
|
||||
case 0xF2: JP(cP, READ_MEM_16()); break;
|
||||
case 0xF3: DI(); break;
|
||||
case 0xF4: CALL(cP, READ_MEM_16()); break;
|
||||
case 0xF5: PUSH(rAF); break;
|
||||
case 0xF6: OR(READ_MEM_8()); break;
|
||||
case 0xF7: RST(0x30); break;
|
||||
case 0xF8: RET(cM); break;
|
||||
case 0xF9: rSP = rHL; t+=2; break;
|
||||
case 0xFA: JP(cM, READ_MEM_16()); break;
|
||||
case 0xFB: EI(); break;
|
||||
case 0xFC: CALL(cM, READ_MEM_16()); break;
|
||||
case 0xFD: IY_INSTRUCTIONS(); break;
|
||||
case 0xFE: CP(READ_MEM_8()); break;
|
||||
case 0xFF: RST(0x38); break;
|
||||
}
|
||||
|
||||
} while (opcode_ignored);
|
||||
|
||||
if (pending_ei==2) { pending_ei=0; actualEI(); }
|
||||
if (pending_ei==1) pending_ei=2;
|
||||
@@ -1717,6 +1722,13 @@ namespace z80
|
||||
}
|
||||
}
|
||||
|
||||
void IgnoreOpcode()
|
||||
{
|
||||
t-=3;
|
||||
rPC--;
|
||||
opcode_ignored=true;
|
||||
}
|
||||
|
||||
void IX_INSTRUCTIONS()
|
||||
{
|
||||
const uint8_t opcode = READ_M1();
|
||||
@@ -1726,73 +1738,73 @@ namespace z80
|
||||
|
||||
switch (opcode)
|
||||
{
|
||||
case 0x00: INVALID(opcode); break;
|
||||
case 0x01: INVALID(opcode); break;
|
||||
case 0x02: INVALID(opcode); break;
|
||||
case 0x03: INVALID(opcode); break;
|
||||
case 0x00: IgnoreOpcode(); break;
|
||||
case 0x01: IgnoreOpcode(); break;
|
||||
case 0x02: IgnoreOpcode(); break;
|
||||
case 0x03: IgnoreOpcode(); break;
|
||||
case 0x04: INC8(_rB); break;
|
||||
case 0x05: DEC8(_rB); break;
|
||||
case 0x06: rB = READ_MEM_8(); break;
|
||||
case 0x07: INVALID(opcode); break;
|
||||
case 0x08: INVALID(opcode); break;
|
||||
case 0x07: IgnoreOpcode(); break;
|
||||
case 0x08: IgnoreOpcode(); break;
|
||||
case 0x09: ADD16(_rIX, rBC); break;
|
||||
case 0x0A: INVALID(opcode); break;
|
||||
case 0x0B: INVALID(opcode); break;
|
||||
case 0x0A: IgnoreOpcode(); break;
|
||||
case 0x0B: IgnoreOpcode(); break;
|
||||
case 0x0C: INC8(_rC); break;
|
||||
case 0x0D: DEC8(_rC); break;
|
||||
case 0x0E: rC = READ_MEM_8(); break;
|
||||
case 0x0F: INVALID(opcode); break;
|
||||
case 0x0F: IgnoreOpcode(); break;
|
||||
|
||||
case 0x10: INVALID(opcode); break;
|
||||
case 0x11: INVALID(opcode); break;
|
||||
case 0x12: INVALID(opcode); break;
|
||||
case 0x13: INVALID(opcode); break;
|
||||
case 0x10: IgnoreOpcode(); break;
|
||||
case 0x11: IgnoreOpcode(); break;
|
||||
case 0x12: IgnoreOpcode(); break;
|
||||
case 0x13: IgnoreOpcode(); break;
|
||||
case 0x14: INC8(_rD); break;
|
||||
case 0x15: DEC8(_rD); break;
|
||||
case 0x16: rD = READ_MEM_8(); break;
|
||||
case 0x17: INVALID(opcode); break;
|
||||
case 0x18: INVALID(opcode); break;
|
||||
case 0x17: IgnoreOpcode(); break;
|
||||
case 0x18: IgnoreOpcode(); break;
|
||||
case 0x19: ADD16(_rIX, rDE); break;
|
||||
case 0x1A: INVALID(opcode); break;
|
||||
case 0x1B: INVALID(opcode); break;
|
||||
case 0x1A: IgnoreOpcode(); break;
|
||||
case 0x1B: IgnoreOpcode(); break;
|
||||
case 0x1C: INC8(_rE); break;
|
||||
case 0x1D: DEC8(_rE); break;
|
||||
case 0x1E: rE = READ_MEM_8(); break;
|
||||
case 0x1F: INVALID(opcode); break;
|
||||
case 0x1F: IgnoreOpcode(); break;
|
||||
|
||||
case 0x20: INVALID(opcode); break;
|
||||
case 0x20: IgnoreOpcode(); break;
|
||||
case 0x21: rIX = READ_MEM_16(); break;
|
||||
case 0x22: WRITE_MEM_16(READ_MEM_16(),rIX); break;
|
||||
case 0x23: INC16(_rIX); break;
|
||||
case 0x24: INC8(_rIXH); break;
|
||||
case 0x25: DEC8(_rIXH); break;
|
||||
case 0x26: rIXH = READ_MEM_8(); break;
|
||||
case 0x27: INVALID(opcode); break;
|
||||
case 0x28: INVALID(opcode); break;
|
||||
case 0x27: IgnoreOpcode(); break;
|
||||
case 0x28: IgnoreOpcode(); break;
|
||||
case 0x29: ADD16(_rIX, rIX); break;
|
||||
case 0x2A: rIX = READ_MEM_16(READ_MEM_16());break;
|
||||
case 0x2B: DEC16(_rIX); break;
|
||||
case 0x2C: INC8(_rIXL); break;
|
||||
case 0x2D: DEC8(_rIXL); break;
|
||||
case 0x2E: rIXL = READ_MEM_8(); break;
|
||||
case 0x2F: INVALID(opcode); break;
|
||||
case 0x2F: IgnoreOpcode(); break;
|
||||
|
||||
case 0x30: INVALID(opcode); break;
|
||||
case 0x31: INVALID(opcode); break;
|
||||
case 0x32: INVALID(opcode); break;
|
||||
case 0x33: INVALID(opcode); break;
|
||||
case 0x30: IgnoreOpcode(); break;
|
||||
case 0x31: IgnoreOpcode(); break;
|
||||
case 0x32: IgnoreOpcode(); break;
|
||||
case 0x33: IgnoreOpcode(); break;
|
||||
case 0x34: d=READ_MEM_8(); INCMEM8(rIX+d);t+=2; break;
|
||||
case 0x35: d=READ_MEM_8(); DECMEM8(rIX+d);t+=2; break;
|
||||
case 0x36: d=READ_MEM_8(); WRITE_MEM_8(rIX+d, READ_MEM_8()); t+=2; break;
|
||||
case 0x37: INVALID(opcode); break;
|
||||
case 0x38: INVALID(opcode); break;
|
||||
case 0x37: IgnoreOpcode(); break;
|
||||
case 0x38: IgnoreOpcode(); break;
|
||||
case 0x39: ADD16(_rIX, rSP); break;
|
||||
case 0x3A: INVALID(opcode); break;
|
||||
case 0x3B: INVALID(opcode); break;
|
||||
case 0x3A: IgnoreOpcode(); break;
|
||||
case 0x3B: IgnoreOpcode(); break;
|
||||
case 0x3C: INC8(_rA); break;
|
||||
case 0x3D: DEC8(_rA); break;
|
||||
case 0x3E: rA = READ_MEM_8(); break;
|
||||
case 0x3F: INVALID(opcode); break;
|
||||
case 0x3F: IgnoreOpcode(); break;
|
||||
|
||||
case 0x40: rB = rB; break;
|
||||
case 0x41: rB = rC; break;
|
||||
@@ -1851,7 +1863,7 @@ namespace z80
|
||||
case 0x73: d=READ_MEM_8(); WRITE_MEM_8(rIX+d, rE);t+=5;break;
|
||||
case 0x74: d=READ_MEM_8(); WRITE_MEM_8(rIX+d, rH);t+=5;break;
|
||||
case 0x75: d=READ_MEM_8(); WRITE_MEM_8(rIX+d, rL);t+=5;break;
|
||||
case 0x76: INVALID(opcode); break;
|
||||
case 0x76: IgnoreOpcode(); break;
|
||||
case 0x77: d=READ_MEM_8(); WRITE_MEM_8(rIX+d, rA);t+=5;break;
|
||||
case 0x78: rA = rB; break;
|
||||
case 0x79: rA = rC; break;
|
||||
@@ -1936,7 +1948,7 @@ namespace z80
|
||||
case 0xE5: PUSH(rIX); break;
|
||||
case 0xE9: JP(cNO, rIX); break;
|
||||
case 0xF9: rSP = rIX; t+=2; break;
|
||||
default: INVALID(opcode); break;
|
||||
default: IgnoreOpcode(); break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2315,73 +2327,73 @@ namespace z80
|
||||
|
||||
switch (opcode)
|
||||
{
|
||||
case 0x00: INVALID(opcode); break;
|
||||
case 0x01: INVALID(opcode); break;
|
||||
case 0x02: INVALID(opcode); break;
|
||||
case 0x03: INVALID(opcode); break;
|
||||
case 0x00: IgnoreOpcode(); break;
|
||||
case 0x01: IgnoreOpcode(); break;
|
||||
case 0x02: IgnoreOpcode(); break;
|
||||
case 0x03: IgnoreOpcode(); break;
|
||||
case 0x04: INC8(_rB); break;
|
||||
case 0x05: DEC8(_rB); break;
|
||||
case 0x06: rB = READ_MEM_8(); break;
|
||||
case 0x07: INVALID(opcode); break;
|
||||
case 0x08: INVALID(opcode); break;
|
||||
case 0x07: IgnoreOpcode(); break;
|
||||
case 0x08: IgnoreOpcode(); break;
|
||||
case 0x09: ADD16(_rIY, rBC); break;
|
||||
case 0x0A: INVALID(opcode); break;
|
||||
case 0x0B: INVALID(opcode); break;
|
||||
case 0x0A: IgnoreOpcode(); break;
|
||||
case 0x0B: IgnoreOpcode(); break;
|
||||
case 0x0C: INC8(_rC); break;
|
||||
case 0x0D: DEC8(_rC); break;
|
||||
case 0x0E: rC = READ_MEM_8(); break;
|
||||
case 0x0F: INVALID(opcode); break;
|
||||
case 0x0F: IgnoreOpcode(); break;
|
||||
|
||||
case 0x10: INVALID(opcode); break;
|
||||
case 0x11: INVALID(opcode); break;
|
||||
case 0x12: INVALID(opcode); break;
|
||||
case 0x13: INVALID(opcode); break;
|
||||
case 0x10: IgnoreOpcode(); break;
|
||||
case 0x11: IgnoreOpcode(); break;
|
||||
case 0x12: IgnoreOpcode(); break;
|
||||
case 0x13: IgnoreOpcode(); break;
|
||||
case 0x14: INC8(_rD); break;
|
||||
case 0x15: DEC8(_rD); break;
|
||||
case 0x16: rD = READ_MEM_8(); break;
|
||||
case 0x17: INVALID(opcode); break;
|
||||
case 0x18: INVALID(opcode); break;
|
||||
case 0x17: IgnoreOpcode(); break;
|
||||
case 0x18: IgnoreOpcode(); break;
|
||||
case 0x19: ADD16(_rIY, rDE); break;
|
||||
case 0x1A: INVALID(opcode); break;
|
||||
case 0x1B: INVALID(opcode); break;
|
||||
case 0x1A: IgnoreOpcode(); break;
|
||||
case 0x1B: IgnoreOpcode(); break;
|
||||
case 0x1C: INC8(_rE); break;
|
||||
case 0x1D: DEC8(_rE); break;
|
||||
case 0x1E: rE = READ_MEM_8(); break;
|
||||
case 0x1F: INVALID(opcode); break;
|
||||
case 0x1F: IgnoreOpcode(); break;
|
||||
|
||||
case 0x20: INVALID(opcode); break;
|
||||
case 0x20: IgnoreOpcode(); break;
|
||||
case 0x21: rIY = READ_MEM_16(); break;
|
||||
case 0x22: WRITE_MEM_16(READ_MEM_16(),rIY); break;
|
||||
case 0x23: INC16(_rIY); break;
|
||||
case 0x24: INC8(_rIYH); break;
|
||||
case 0x25: DEC8(_rIYH); break;
|
||||
case 0x26: rIYH = READ_MEM_8(); break;
|
||||
case 0x27: INVALID(opcode); break;
|
||||
case 0x28: INVALID(opcode); break;
|
||||
case 0x27: IgnoreOpcode(); break;
|
||||
case 0x28: IgnoreOpcode(); break;
|
||||
case 0x29: ADD16(_rIY, rIY); break;
|
||||
case 0x2A: rIY = READ_MEM_16(READ_MEM_16());break;
|
||||
case 0x2B: DEC16(_rIY); break;
|
||||
case 0x2C: INC8(_rIYL); break;
|
||||
case 0x2D: DEC8(_rIYL); break;
|
||||
case 0x2E: rIYL = READ_MEM_8(); break;
|
||||
case 0x2F: INVALID(opcode); break;
|
||||
case 0x2F: IgnoreOpcode(); break;
|
||||
|
||||
case 0x30: INVALID(opcode); break;
|
||||
case 0x31: INVALID(opcode); break;
|
||||
case 0x32: INVALID(opcode); break;
|
||||
case 0x33: INVALID(opcode); break;
|
||||
case 0x30: IgnoreOpcode(); break;
|
||||
case 0x31: IgnoreOpcode(); break;
|
||||
case 0x32: IgnoreOpcode(); break;
|
||||
case 0x33: IgnoreOpcode(); break;
|
||||
case 0x34: d=READ_MEM_8(); INCMEM8(rIY+d);t+=2; break;
|
||||
case 0x35: d=READ_MEM_8(); DECMEM8(rIY+d);t+=2; break;
|
||||
case 0x36: d=READ_MEM_8(); WRITE_MEM_8(rIY+d, READ_MEM_8()); t+=2; break;
|
||||
case 0x37: INVALID(opcode); break;
|
||||
case 0x38: INVALID(opcode); break;
|
||||
case 0x37: IgnoreOpcode(); break;
|
||||
case 0x38: IgnoreOpcode(); break;
|
||||
case 0x39: ADD16(_rIY, rSP); break;
|
||||
case 0x3A: INVALID(opcode); break;
|
||||
case 0x3B: INVALID(opcode); break;
|
||||
case 0x3A: IgnoreOpcode(); break;
|
||||
case 0x3B: IgnoreOpcode(); break;
|
||||
case 0x3C: INC8(_rA); break;
|
||||
case 0x3D: DEC8(_rA); break;
|
||||
case 0x3E: rA = READ_MEM_8(); break;
|
||||
case 0x3F: INVALID(opcode); break;
|
||||
case 0x3F: IgnoreOpcode(); break;
|
||||
|
||||
case 0x40: rB = rB; break;
|
||||
case 0x41: rB = rC; break;
|
||||
@@ -2440,7 +2452,7 @@ namespace z80
|
||||
case 0x73: d=READ_MEM_8(); WRITE_MEM_8(rIY+d, rE);t+=5;break;
|
||||
case 0x74: d=READ_MEM_8(); WRITE_MEM_8(rIY+d, rH);t+=5;break;
|
||||
case 0x75: d=READ_MEM_8(); WRITE_MEM_8(rIY+d, rL);t+=5;break;
|
||||
case 0x76: INVALID(opcode); break;
|
||||
case 0x76: IgnoreOpcode(); break;
|
||||
case 0x77: d=READ_MEM_8(); WRITE_MEM_8(rIY+d, rA);t+=5;break;
|
||||
case 0x78: rA = rB; break;
|
||||
case 0x79: rA = rC; break;
|
||||
@@ -2525,7 +2537,7 @@ namespace z80
|
||||
case 0xE5: PUSH(rIY); break;
|
||||
case 0xE9: JP(cNO, rIY); break;
|
||||
case 0xF9: rSP = rIY; t+=2; break;
|
||||
default: INVALID(opcode); break;
|
||||
default: IgnoreOpcode(); break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user