z80, fix sms interrupt handling in cz80

This commit is contained in:
kub 2021-10-06 19:45:37 +02:00
parent 4b3e9d92e3
commit 80bf9bcce9
5 changed files with 104 additions and 94 deletions

View file

@ -421,8 +421,7 @@ OP_SBC16:
zIFF1 = (1 << 2);
if (CPU->IRQState)
{
USE_CYCLES(10)
goto Cz80_Check_Interrupt;
CPU->Status |= CZ80_HAS_INT;
}
}
else zIFF1 = zIFF2;
@ -492,23 +491,27 @@ OP_LDX:
-----------------------------------------*/
OPED(0xb0): // LDIR
if (zBC != 1)
PC -= 2;
do
{
val = READ_MEM8(zHL++);
WRITE_MEM8(zDE++, val);
zBC--;
USE_CYCLES(17)
} while (zBC && (CPU->ICount > 0));
USE_CYCLES(21)
} while (zBC > 1 && (CPU->ICount > 0) && !CPU->Status);
goto OP_LDXR;
OPED(0xb8): // LDDR
if (zBC != 1)
PC -= 2;
do
{
val = READ_MEM8(zHL--);
WRITE_MEM8(zDE--, val);
zBC--;
USE_CYCLES(17)
} while (zBC && (CPU->ICount > 0));
USE_CYCLES(21)
} while (zBC > 1 && (CPU->ICount > 0) && !CPU->Status);
OP_LDXR:
F = zF & (SF | ZF | CF);
@ -517,14 +520,14 @@ OP_LDXR:
if (zBC)
{
zF = F | VF;
PC -= 2;
#if CZ80_EMULATE_R_EXACTLY
zR--;
#endif
goto Cz80_Exec_End;
ADD_CYCLES(4)
goto Cz80_Exec;
}
zF = F;
ADD_CYCLES(5)
ADD_CYCLES(4+5)
goto Cz80_Exec;
/*-----------------------------------------
@ -553,6 +556,8 @@ OP_CPX:
-----------------------------------------*/
OPED(0xb1): // CPIR
if (zBC != 1)
PC -= 2;
do
{
val = READ_MEM8(zHL++);
@ -564,11 +569,13 @@ OP_CPX:
if (res & 0x08) F |= XF;
if (zBC) F |= VF;
zF = F;
USE_CYCLES(17)
} while (zBC && !(F & ZF) && (CPU->ICount > 0));
USE_CYCLES(21)
} while (zBC > 1 && !(F & ZF) && (CPU->ICount > 0) && !CPU->Status);
goto OP_CPXR;
OPED(0xb9): // CPDR
if (zBC != 1)
PC -= 2;
do
{
val = READ_MEM8(zHL--);
@ -580,19 +587,19 @@ OP_CPX:
if (res & 0x08) F |= XF;
if (zBC) F |= VF;
zF = F;
USE_CYCLES(17)
} while (zBC && !(F & ZF) && (CPU->ICount > 0));
USE_CYCLES(21)
} while (zBC > 1 && !(F & ZF) && (CPU->ICount > 0) && !CPU->Status);
OP_CPXR:
if (zBC && !(F & ZF))
{
PC -= 2;
#if CZ80_EMULATE_R_EXACTLY
zR--;
#endif
goto Cz80_Exec_End;
ADD_CYCLES(4)
goto Cz80_Exec;
}
ADD_CYCLES(5)
ADD_CYCLES(4+5)
goto Cz80_Exec;
/*-----------------------------------------
@ -614,7 +621,7 @@ OP_INX:
F = SZ[zB];
res = ((UINT32)(zC - 1) & 0xff) + (UINT32)val;
if (val & SF) F |= NF;
if (res & 0x100) F |= HF | CF;
if (res < val) F |= HF | CF;
F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
zF = F;
RET(12)
@ -624,40 +631,44 @@ OP_INX:
-----------------------------------------*/
OPED(0xb2): // INIR
if (zB != 1)
PC -= 2;
do
{
val = IN(zBC);
zB--;
WRITE_MEM8(zHL++, val);
USE_CYCLES(17)
} while (zB && (CPU->ICount > 0));
USE_CYCLES(21)
} while (zB > 1 && (CPU->ICount > 0) && !CPU->Status);
goto OP_INXR;
OPED(0xba): // INDR
if (zB != 1)
PC -= 2;
do
{
val = IN(zBC);
zB--;
WRITE_MEM8(zHL--, val);
USE_CYCLES(17)
} while (zB && (CPU->ICount > 0));
USE_CYCLES(21)
} while (zB > 1 && (CPU->ICount > 0) && !CPU->Status);
OP_INXR:
F = SZ[zB];
res = ((UINT32)(zC - 1) & 0xff) + (UINT32)val;
if (val & SF) F |= NF;
if (res & 0x100) F |= HF | CF;
if (res < val) F |= HF | CF;
F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
zF = F;
if (zB)
{
PC -= 2;
#if CZ80_EMULATE_R_EXACTLY
zR--;
#endif
goto Cz80_Exec_End;
ADD_CYCLES(4)
goto Cz80_Exec;
}
ADD_CYCLES(5);
ADD_CYCLES(4+5);
goto Cz80_Exec;
/*-----------------------------------------
@ -679,7 +690,7 @@ OP_OUTX:
F = SZ[zB];
res = (UINT32)zL + (UINT32)val;
if (val & SF) F |= NF;
if (res & 0x100) F |= HF | CF;
if (res < val) F |= HF | CF;
F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
zF = F;
RET(12)
@ -689,40 +700,44 @@ OP_OUTX:
-----------------------------------------*/
OPED(0xb3): // OTIR
if (zB != 1)
PC -= 2;
do
{
val = READ_MEM8(zHL++);
zB--;
OUT(zBC, val);
USE_CYCLES(17)
} while (zB && (CPU->ICount > 0));
USE_CYCLES(21)
} while (zB > 1 && (CPU->ICount > 0) && !CPU->Status);
goto OP_OTXR;
OPED(0xbb): // OTDR
if (zB != 1)
PC -= 2;
do
{
val = READ_MEM8(zHL--);
zB--;
OUT(zBC, val);
USE_CYCLES(17)
} while (zB && (CPU->ICount > 0));
USE_CYCLES(21)
} while (zB > 1 && (CPU->ICount > 0) && !CPU->Status);
OP_OTXR:
F = SZ[zB];
res = (UINT32)zL + (UINT32)val;
if (val & SF) F |= NF;
if (res & 0x100) F |= HF | CF;
if (res < val) F |= HF | CF;
F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
zF = F;
if (zB)
{
PC -= 2;
#if CZ80_EMULATE_R_EXACTLY
zR--;
#endif
goto Cz80_Exec_End;
ADD_CYCLES(4)
goto Cz80_Exec;
}
ADD_CYCLES(5)
ADD_CYCLES(4+5)
goto Cz80_Exec;
}