|
@@ -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;
|
|
|
}
|
|
|
|