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 .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 pico_z80_read8: @ addr
cmp r0,#0x2000 @ Z80 RAM cmp r0,#0x2000 @ Z80 RAM
ldrlt r1,[cpucontext,#z80sp_base] ldrlt r1,[cpucontext,#z80sp_base]
@ -139,15 +124,18 @@ pico_z80_read8: @ addr
eorlt r0,r0,#1 @ our ROM is byteswapped eorlt r0,r0,#1 @ our ROM is byteswapped
ldrltb r0,[r1,r0] ldrltb r0,[r1,r0]
bxlt lr bxlt lr
stmfd sp!,{r3,r12,lr} stmfd sp!,{r3,r12,lr}
bl PicoRead8 bl PicoRead8
ldmfd sp!,{r3,r12,pc} ldmfd sp!,{r3,r12,pc}
1: 1:
mov r1,r0,lsr #13 mov r1,r0,lsr #13
cmp r1,#2 @ YM2612 (0x4000-0x5fff) cmp r1,#2 @ YM2612 (0x4000-0x5fff)
bne 0f bne 0f
and r0,r0,#3 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: 0:
cmp r0,#0x4000 cmp r0,#0x4000
movge r0,#0xff movge r0,#0xff
@ -197,7 +185,11 @@ pico_z80_read16: @ addr
cmp r1,#2 @ YM2612 (0x4000-0x5fff) cmp r1,#2 @ YM2612 (0x4000-0x5fff)
bne 0f bne 0f
and r0,r0,#3 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: 0:
cmp r0,#0x4000 cmp r0,#0x4000
movge r0,#0xff movge r0,#0xff
@ -218,6 +210,7 @@ pico_z80_write8: @ data, addr
bx lr bx lr
1: 1:
stmfd sp!,{r3,r12,lr} stmfd sp!,{r3,r12,lr}
str z80_icount,[cpucontext,#cycles_pointer]
bl z80_write bl z80_write
ldmfd sp!,{r3,r12,pc} ldmfd sp!,{r3,r12,pc}
@ -231,14 +224,15 @@ pico_z80_write16: @ data, addr
strb r0,[r2,#1] strb r0,[r2,#1]
bx lr bx lr
1: 1:
stmfd sp!,{r3-r5,r12,lr} stmfd sp!,{r3-r5,r12,lr}
str z80_icount,[cpucontext,#cycles_pointer]
mov r4,r0 mov r4,r0
mov r5,r1 mov r5,r1
bl z80_write bl z80_write
mov r0,r4,lsr #8 mov r0,r4,lsr #8
add r1,r5,#1 add r1,r5,#1
bl z80_write bl z80_write
ldmfd sp!,{r3-r5,r12,pc} ldmfd sp!,{r3-r5,r12,pc}
.pool .pool
.endif .endif

View file

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

View file

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

View file

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