mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
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:
parent
4609d0cdb8
commit
170435846c
4 changed files with 23 additions and 25 deletions
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue