mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-06 15:48:05 -04:00
z80, fix sms interrupt handling in cz80
This commit is contained in:
parent
4b3e9d92e3
commit
80bf9bcce9
5 changed files with 104 additions and 94 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue