- [FIX] Ja ignora correctament combinacions incorrectes de opcodes DD i FD.
This commit is contained in:
144
z80.cpp
144
z80.cpp
@@ -1141,8 +1141,11 @@ namespace z80
|
|||||||
if (out_ptr) out_ports[num] = out_ptr;
|
if (out_ptr) out_ports[num] = out_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool opcode_ignored = false;
|
||||||
uint32_t step()
|
uint32_t step()
|
||||||
{
|
{
|
||||||
|
do {
|
||||||
|
opcode_ignored = false;
|
||||||
current_opcode_address = rPC;
|
current_opcode_address = rPC;
|
||||||
t = 0;
|
t = 0;
|
||||||
const uint8_t opcode = READ_M1();
|
const uint8_t opcode = READ_M1();
|
||||||
@@ -1427,6 +1430,8 @@ namespace z80
|
|||||||
case 0xFF: RST(0x38); break;
|
case 0xFF: RST(0x38); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} while (opcode_ignored);
|
||||||
|
|
||||||
if (pending_ei==2) { pending_ei=0; actualEI(); }
|
if (pending_ei==2) { pending_ei=0; actualEI(); }
|
||||||
if (pending_ei==1) pending_ei=2;
|
if (pending_ei==1) pending_ei=2;
|
||||||
|
|
||||||
@@ -1717,6 +1722,13 @@ namespace z80
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IgnoreOpcode()
|
||||||
|
{
|
||||||
|
t-=3;
|
||||||
|
rPC--;
|
||||||
|
opcode_ignored=true;
|
||||||
|
}
|
||||||
|
|
||||||
void IX_INSTRUCTIONS()
|
void IX_INSTRUCTIONS()
|
||||||
{
|
{
|
||||||
const uint8_t opcode = READ_M1();
|
const uint8_t opcode = READ_M1();
|
||||||
@@ -1726,73 +1738,73 @@ namespace z80
|
|||||||
|
|
||||||
switch (opcode)
|
switch (opcode)
|
||||||
{
|
{
|
||||||
case 0x00: INVALID(opcode); break;
|
case 0x00: IgnoreOpcode(); break;
|
||||||
case 0x01: INVALID(opcode); break;
|
case 0x01: IgnoreOpcode(); break;
|
||||||
case 0x02: INVALID(opcode); break;
|
case 0x02: IgnoreOpcode(); break;
|
||||||
case 0x03: INVALID(opcode); break;
|
case 0x03: IgnoreOpcode(); break;
|
||||||
case 0x04: INC8(_rB); break;
|
case 0x04: INC8(_rB); break;
|
||||||
case 0x05: DEC8(_rB); break;
|
case 0x05: DEC8(_rB); break;
|
||||||
case 0x06: rB = READ_MEM_8(); break;
|
case 0x06: rB = READ_MEM_8(); break;
|
||||||
case 0x07: INVALID(opcode); break;
|
case 0x07: IgnoreOpcode(); break;
|
||||||
case 0x08: INVALID(opcode); break;
|
case 0x08: IgnoreOpcode(); break;
|
||||||
case 0x09: ADD16(_rIX, rBC); break;
|
case 0x09: ADD16(_rIX, rBC); break;
|
||||||
case 0x0A: INVALID(opcode); break;
|
case 0x0A: IgnoreOpcode(); break;
|
||||||
case 0x0B: INVALID(opcode); break;
|
case 0x0B: IgnoreOpcode(); break;
|
||||||
case 0x0C: INC8(_rC); break;
|
case 0x0C: INC8(_rC); break;
|
||||||
case 0x0D: DEC8(_rC); break;
|
case 0x0D: DEC8(_rC); break;
|
||||||
case 0x0E: rC = READ_MEM_8(); break;
|
case 0x0E: rC = READ_MEM_8(); break;
|
||||||
case 0x0F: INVALID(opcode); break;
|
case 0x0F: IgnoreOpcode(); break;
|
||||||
|
|
||||||
case 0x10: INVALID(opcode); break;
|
case 0x10: IgnoreOpcode(); break;
|
||||||
case 0x11: INVALID(opcode); break;
|
case 0x11: IgnoreOpcode(); break;
|
||||||
case 0x12: INVALID(opcode); break;
|
case 0x12: IgnoreOpcode(); break;
|
||||||
case 0x13: INVALID(opcode); break;
|
case 0x13: IgnoreOpcode(); break;
|
||||||
case 0x14: INC8(_rD); break;
|
case 0x14: INC8(_rD); break;
|
||||||
case 0x15: DEC8(_rD); break;
|
case 0x15: DEC8(_rD); break;
|
||||||
case 0x16: rD = READ_MEM_8(); break;
|
case 0x16: rD = READ_MEM_8(); break;
|
||||||
case 0x17: INVALID(opcode); break;
|
case 0x17: IgnoreOpcode(); break;
|
||||||
case 0x18: INVALID(opcode); break;
|
case 0x18: IgnoreOpcode(); break;
|
||||||
case 0x19: ADD16(_rIX, rDE); break;
|
case 0x19: ADD16(_rIX, rDE); break;
|
||||||
case 0x1A: INVALID(opcode); break;
|
case 0x1A: IgnoreOpcode(); break;
|
||||||
case 0x1B: INVALID(opcode); break;
|
case 0x1B: IgnoreOpcode(); break;
|
||||||
case 0x1C: INC8(_rE); break;
|
case 0x1C: INC8(_rE); break;
|
||||||
case 0x1D: DEC8(_rE); break;
|
case 0x1D: DEC8(_rE); break;
|
||||||
case 0x1E: rE = READ_MEM_8(); 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 0x21: rIX = READ_MEM_16(); break;
|
||||||
case 0x22: WRITE_MEM_16(READ_MEM_16(),rIX); break;
|
case 0x22: WRITE_MEM_16(READ_MEM_16(),rIX); break;
|
||||||
case 0x23: INC16(_rIX); break;
|
case 0x23: INC16(_rIX); break;
|
||||||
case 0x24: INC8(_rIXH); break;
|
case 0x24: INC8(_rIXH); break;
|
||||||
case 0x25: DEC8(_rIXH); break;
|
case 0x25: DEC8(_rIXH); break;
|
||||||
case 0x26: rIXH = READ_MEM_8(); break;
|
case 0x26: rIXH = READ_MEM_8(); break;
|
||||||
case 0x27: INVALID(opcode); break;
|
case 0x27: IgnoreOpcode(); break;
|
||||||
case 0x28: INVALID(opcode); break;
|
case 0x28: IgnoreOpcode(); break;
|
||||||
case 0x29: ADD16(_rIX, rIX); break;
|
case 0x29: ADD16(_rIX, rIX); break;
|
||||||
case 0x2A: rIX = READ_MEM_16(READ_MEM_16());break;
|
case 0x2A: rIX = READ_MEM_16(READ_MEM_16());break;
|
||||||
case 0x2B: DEC16(_rIX); break;
|
case 0x2B: DEC16(_rIX); break;
|
||||||
case 0x2C: INC8(_rIXL); break;
|
case 0x2C: INC8(_rIXL); break;
|
||||||
case 0x2D: DEC8(_rIXL); break;
|
case 0x2D: DEC8(_rIXL); break;
|
||||||
case 0x2E: rIXL = READ_MEM_8(); break;
|
case 0x2E: rIXL = READ_MEM_8(); break;
|
||||||
case 0x2F: INVALID(opcode); break;
|
case 0x2F: IgnoreOpcode(); break;
|
||||||
|
|
||||||
case 0x30: INVALID(opcode); break;
|
case 0x30: IgnoreOpcode(); break;
|
||||||
case 0x31: INVALID(opcode); break;
|
case 0x31: IgnoreOpcode(); break;
|
||||||
case 0x32: INVALID(opcode); break;
|
case 0x32: IgnoreOpcode(); break;
|
||||||
case 0x33: INVALID(opcode); break;
|
case 0x33: IgnoreOpcode(); break;
|
||||||
case 0x34: d=READ_MEM_8(); INCMEM8(rIX+d);t+=2; 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 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 0x36: d=READ_MEM_8(); WRITE_MEM_8(rIX+d, READ_MEM_8()); t+=2; break;
|
||||||
case 0x37: INVALID(opcode); break;
|
case 0x37: IgnoreOpcode(); break;
|
||||||
case 0x38: INVALID(opcode); break;
|
case 0x38: IgnoreOpcode(); break;
|
||||||
case 0x39: ADD16(_rIX, rSP); break;
|
case 0x39: ADD16(_rIX, rSP); break;
|
||||||
case 0x3A: INVALID(opcode); break;
|
case 0x3A: IgnoreOpcode(); break;
|
||||||
case 0x3B: INVALID(opcode); break;
|
case 0x3B: IgnoreOpcode(); break;
|
||||||
case 0x3C: INC8(_rA); break;
|
case 0x3C: INC8(_rA); break;
|
||||||
case 0x3D: DEC8(_rA); break;
|
case 0x3D: DEC8(_rA); break;
|
||||||
case 0x3E: rA = READ_MEM_8(); break;
|
case 0x3E: rA = READ_MEM_8(); break;
|
||||||
case 0x3F: INVALID(opcode); break;
|
case 0x3F: IgnoreOpcode(); break;
|
||||||
|
|
||||||
case 0x40: rB = rB; break;
|
case 0x40: rB = rB; break;
|
||||||
case 0x41: rB = rC; 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 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 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 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 0x77: d=READ_MEM_8(); WRITE_MEM_8(rIX+d, rA);t+=5;break;
|
||||||
case 0x78: rA = rB; break;
|
case 0x78: rA = rB; break;
|
||||||
case 0x79: rA = rC; break;
|
case 0x79: rA = rC; break;
|
||||||
@@ -1936,7 +1948,7 @@ namespace z80
|
|||||||
case 0xE5: PUSH(rIX); break;
|
case 0xE5: PUSH(rIX); break;
|
||||||
case 0xE9: JP(cNO, rIX); break;
|
case 0xE9: JP(cNO, rIX); break;
|
||||||
case 0xF9: rSP = rIX; t+=2; break;
|
case 0xF9: rSP = rIX; t+=2; break;
|
||||||
default: INVALID(opcode); break;
|
default: IgnoreOpcode(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2315,73 +2327,73 @@ namespace z80
|
|||||||
|
|
||||||
switch (opcode)
|
switch (opcode)
|
||||||
{
|
{
|
||||||
case 0x00: INVALID(opcode); break;
|
case 0x00: IgnoreOpcode(); break;
|
||||||
case 0x01: INVALID(opcode); break;
|
case 0x01: IgnoreOpcode(); break;
|
||||||
case 0x02: INVALID(opcode); break;
|
case 0x02: IgnoreOpcode(); break;
|
||||||
case 0x03: INVALID(opcode); break;
|
case 0x03: IgnoreOpcode(); break;
|
||||||
case 0x04: INC8(_rB); break;
|
case 0x04: INC8(_rB); break;
|
||||||
case 0x05: DEC8(_rB); break;
|
case 0x05: DEC8(_rB); break;
|
||||||
case 0x06: rB = READ_MEM_8(); break;
|
case 0x06: rB = READ_MEM_8(); break;
|
||||||
case 0x07: INVALID(opcode); break;
|
case 0x07: IgnoreOpcode(); break;
|
||||||
case 0x08: INVALID(opcode); break;
|
case 0x08: IgnoreOpcode(); break;
|
||||||
case 0x09: ADD16(_rIY, rBC); break;
|
case 0x09: ADD16(_rIY, rBC); break;
|
||||||
case 0x0A: INVALID(opcode); break;
|
case 0x0A: IgnoreOpcode(); break;
|
||||||
case 0x0B: INVALID(opcode); break;
|
case 0x0B: IgnoreOpcode(); break;
|
||||||
case 0x0C: INC8(_rC); break;
|
case 0x0C: INC8(_rC); break;
|
||||||
case 0x0D: DEC8(_rC); break;
|
case 0x0D: DEC8(_rC); break;
|
||||||
case 0x0E: rC = READ_MEM_8(); break;
|
case 0x0E: rC = READ_MEM_8(); break;
|
||||||
case 0x0F: INVALID(opcode); break;
|
case 0x0F: IgnoreOpcode(); break;
|
||||||
|
|
||||||
case 0x10: INVALID(opcode); break;
|
case 0x10: IgnoreOpcode(); break;
|
||||||
case 0x11: INVALID(opcode); break;
|
case 0x11: IgnoreOpcode(); break;
|
||||||
case 0x12: INVALID(opcode); break;
|
case 0x12: IgnoreOpcode(); break;
|
||||||
case 0x13: INVALID(opcode); break;
|
case 0x13: IgnoreOpcode(); break;
|
||||||
case 0x14: INC8(_rD); break;
|
case 0x14: INC8(_rD); break;
|
||||||
case 0x15: DEC8(_rD); break;
|
case 0x15: DEC8(_rD); break;
|
||||||
case 0x16: rD = READ_MEM_8(); break;
|
case 0x16: rD = READ_MEM_8(); break;
|
||||||
case 0x17: INVALID(opcode); break;
|
case 0x17: IgnoreOpcode(); break;
|
||||||
case 0x18: INVALID(opcode); break;
|
case 0x18: IgnoreOpcode(); break;
|
||||||
case 0x19: ADD16(_rIY, rDE); break;
|
case 0x19: ADD16(_rIY, rDE); break;
|
||||||
case 0x1A: INVALID(opcode); break;
|
case 0x1A: IgnoreOpcode(); break;
|
||||||
case 0x1B: INVALID(opcode); break;
|
case 0x1B: IgnoreOpcode(); break;
|
||||||
case 0x1C: INC8(_rE); break;
|
case 0x1C: INC8(_rE); break;
|
||||||
case 0x1D: DEC8(_rE); break;
|
case 0x1D: DEC8(_rE); break;
|
||||||
case 0x1E: rE = READ_MEM_8(); 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 0x21: rIY = READ_MEM_16(); break;
|
||||||
case 0x22: WRITE_MEM_16(READ_MEM_16(),rIY); break;
|
case 0x22: WRITE_MEM_16(READ_MEM_16(),rIY); break;
|
||||||
case 0x23: INC16(_rIY); break;
|
case 0x23: INC16(_rIY); break;
|
||||||
case 0x24: INC8(_rIYH); break;
|
case 0x24: INC8(_rIYH); break;
|
||||||
case 0x25: DEC8(_rIYH); break;
|
case 0x25: DEC8(_rIYH); break;
|
||||||
case 0x26: rIYH = READ_MEM_8(); break;
|
case 0x26: rIYH = READ_MEM_8(); break;
|
||||||
case 0x27: INVALID(opcode); break;
|
case 0x27: IgnoreOpcode(); break;
|
||||||
case 0x28: INVALID(opcode); break;
|
case 0x28: IgnoreOpcode(); break;
|
||||||
case 0x29: ADD16(_rIY, rIY); break;
|
case 0x29: ADD16(_rIY, rIY); break;
|
||||||
case 0x2A: rIY = READ_MEM_16(READ_MEM_16());break;
|
case 0x2A: rIY = READ_MEM_16(READ_MEM_16());break;
|
||||||
case 0x2B: DEC16(_rIY); break;
|
case 0x2B: DEC16(_rIY); break;
|
||||||
case 0x2C: INC8(_rIYL); break;
|
case 0x2C: INC8(_rIYL); break;
|
||||||
case 0x2D: DEC8(_rIYL); break;
|
case 0x2D: DEC8(_rIYL); break;
|
||||||
case 0x2E: rIYL = READ_MEM_8(); break;
|
case 0x2E: rIYL = READ_MEM_8(); break;
|
||||||
case 0x2F: INVALID(opcode); break;
|
case 0x2F: IgnoreOpcode(); break;
|
||||||
|
|
||||||
case 0x30: INVALID(opcode); break;
|
case 0x30: IgnoreOpcode(); break;
|
||||||
case 0x31: INVALID(opcode); break;
|
case 0x31: IgnoreOpcode(); break;
|
||||||
case 0x32: INVALID(opcode); break;
|
case 0x32: IgnoreOpcode(); break;
|
||||||
case 0x33: INVALID(opcode); break;
|
case 0x33: IgnoreOpcode(); break;
|
||||||
case 0x34: d=READ_MEM_8(); INCMEM8(rIY+d);t+=2; 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 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 0x36: d=READ_MEM_8(); WRITE_MEM_8(rIY+d, READ_MEM_8()); t+=2; break;
|
||||||
case 0x37: INVALID(opcode); break;
|
case 0x37: IgnoreOpcode(); break;
|
||||||
case 0x38: INVALID(opcode); break;
|
case 0x38: IgnoreOpcode(); break;
|
||||||
case 0x39: ADD16(_rIY, rSP); break;
|
case 0x39: ADD16(_rIY, rSP); break;
|
||||||
case 0x3A: INVALID(opcode); break;
|
case 0x3A: IgnoreOpcode(); break;
|
||||||
case 0x3B: INVALID(opcode); break;
|
case 0x3B: IgnoreOpcode(); break;
|
||||||
case 0x3C: INC8(_rA); break;
|
case 0x3C: INC8(_rA); break;
|
||||||
case 0x3D: DEC8(_rA); break;
|
case 0x3D: DEC8(_rA); break;
|
||||||
case 0x3E: rA = READ_MEM_8(); break;
|
case 0x3E: rA = READ_MEM_8(); break;
|
||||||
case 0x3F: INVALID(opcode); break;
|
case 0x3F: IgnoreOpcode(); break;
|
||||||
|
|
||||||
case 0x40: rB = rB; break;
|
case 0x40: rB = rB; break;
|
||||||
case 0x41: rB = rC; 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 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 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 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 0x77: d=READ_MEM_8(); WRITE_MEM_8(rIY+d, rA);t+=5;break;
|
||||||
case 0x78: rA = rB; break;
|
case 0x78: rA = rB; break;
|
||||||
case 0x79: rA = rC; break;
|
case 0x79: rA = rC; break;
|
||||||
@@ -2525,7 +2537,7 @@ namespace z80
|
|||||||
case 0xE5: PUSH(rIY); break;
|
case 0xE5: PUSH(rIY); break;
|
||||||
case 0xE9: JP(cNO, rIY); break;
|
case 0xE9: JP(cNO, rIY); break;
|
||||||
case 0xF9: rSP = rIY; t+=2; break;
|
case 0xF9: rSP = rIY; t+=2; break;
|
||||||
default: INVALID(opcode); break;
|
default: IgnoreOpcode(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user