improved irq handling Cz80_Exec() calls with lots of cycles

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@458 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2008-05-25 21:01:55 +00:00
parent 4609d0cdb8
commit 170435846c
4 changed files with 23 additions and 25 deletions

View file

@ -106,21 +106,6 @@ DrZ80Ver: .long 0x0001
.if DRZ80_FOR_PICODRIVE
.macro YM2612Read_and_ret8
ldr r0, =ym2612_st
ldr r0, [r0]
ldrb r0, [r0, #0x11] ;@ ym2612_st->status
bx lr
.endm
.macro YM2612Read_and_ret16
ldr r0, =ym2612_st
ldr r0, [r0]
ldrb r0, [r0, #0x11] ;@ ym2612_st->status
orr r0,r0,r0,lsl #8
bx lr
.endm
pico_z80_read8: @ addr
cmp r0,#0x2000 @ Z80 RAM
ldrlt r1,[cpucontext,#z80sp_base]
@ -139,15 +124,18 @@ pico_z80_read8: @ addr
eorlt r0,r0,#1 @ our ROM is byteswapped
ldrltb r0,[r1,r0]
bxlt lr
stmfd sp!,{r3,r12,lr}
stmfd sp!,{r3,r12,lr}
bl PicoRead8
ldmfd sp!,{r3,r12,pc}
ldmfd sp!,{r3,r12,pc}
1:
mov r1,r0,lsr #13
cmp r1,#2 @ YM2612 (0x4000-0x5fff)
bne 0f
and r0,r0,#3
YM2612Read_and_ret8
stmfd sp!,{r3,r12,lr}
str z80_icount,[cpucontext,#cycles_pointer]
bl ym2612_read_local_z80
ldmfd sp!,{r3,r12,pc}
0:
cmp r0,#0x4000
movge r0,#0xff
@ -197,7 +185,11 @@ pico_z80_read16: @ addr
cmp r1,#2 @ YM2612 (0x4000-0x5fff)
bne 0f
and r0,r0,#3
YM2612Read_and_ret16
stmfd sp!,{r3,r12,lr}
str z80_icount,[cpucontext,#cycles_pointer]
bl ym2612_read_local_z80
orr r0,r0,r0,lsl #8
ldmfd sp!,{r3,r12,pc}
0:
cmp r0,#0x4000
movge r0,#0xff
@ -218,6 +210,7 @@ pico_z80_write8: @ data, addr
bx lr
1:
stmfd sp!,{r3,r12,lr}
str z80_icount,[cpucontext,#cycles_pointer]
bl z80_write
ldmfd sp!,{r3,r12,pc}
@ -231,14 +224,15 @@ pico_z80_write16: @ data, addr
strb r0,[r2,#1]
bx lr
1:
stmfd sp!,{r3-r5,r12,lr}
stmfd sp!,{r3-r5,r12,lr}
str z80_icount,[cpucontext,#cycles_pointer]
mov r4,r0
mov r5,r1
bl z80_write
bl z80_write
mov r0,r4,lsr #8
add r1,r5,#1
bl z80_write
ldmfd sp!,{r3-r5,r12,pc}
bl z80_write
ldmfd sp!,{r3-r5,r12,pc}
.pool
.endif

View file

@ -270,6 +270,8 @@ Cz80_Check_Interrupt:
if (CPU->IRQState != CLEAR_LINE)
{
CHECK_INT
CPU->ICount -= CPU->ExtraCycles;
CPU->ExtraCycles = 0;
}
goto Cz80_Exec;
}

View file

@ -61,7 +61,7 @@ extern "C" {
//#else
#define CZ80_ENCRYPTED_ROM 0
//#endif
#define CZ80_EMULATE_R_EXACTLY 0
#define CZ80_EMULATE_R_EXACTLY 1
#define zR8(A) (*CPU->pzR8[A])
#define zR16(A) (CPU->pzR16[A]->W)

View file

@ -712,8 +712,10 @@ OP_EI:
if (CPU->IRQState)
{
afterEI = 1;
CPU->ExtraCycles += 1 - CPU->ICount;
CPU->ICount = 1;
}
if (CPU->ICount <= 0)
else if (CPU->ICount <= 0)
{
CPU->ICount = 1;
}