mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 23:37:46 -04:00
z80, DrZ80: save/restore cycles for IN/OUT, fix EABI stack alignment
This commit is contained in:
parent
f8dba3f63a
commit
ac871e1ab3
1 changed files with 55 additions and 50 deletions
|
@ -32,6 +32,7 @@ DrZ80Ver: .long 0x0001
|
||||||
;@ --------------------------- Defines ----------------------------
|
;@ --------------------------- Defines ----------------------------
|
||||||
;@ Make sure that regs/pointers for z80pc to z80sp match up!
|
;@ Make sure that regs/pointers for z80pc to z80sp match up!
|
||||||
|
|
||||||
|
eabi_align .req r2 @ pushed for EABI alignment all over the place
|
||||||
z80_icount .req r3
|
z80_icount .req r3
|
||||||
opcodes .req r4
|
opcodes .req r4
|
||||||
cpucontext .req r5
|
cpucontext .req r5
|
||||||
|
@ -163,14 +164,14 @@ z80_xmap_read16: @ addr
|
||||||
|
|
||||||
0:
|
0:
|
||||||
@ z80_xmap_read8 will save r3 and r12 for us
|
@ z80_xmap_read8 will save r3 and r12 for us
|
||||||
stmfd sp!,{r8,r9,lr}
|
stmfd sp!,{r2,r8,r9,lr}
|
||||||
mov r8,r0
|
mov r8,r0
|
||||||
bl z80_xmap_read8
|
bl z80_xmap_read8
|
||||||
mov r9,r0
|
mov r9,r0
|
||||||
add r0,r8,#1
|
add r0,r8,#1
|
||||||
bl z80_xmap_read8
|
bl z80_xmap_read8
|
||||||
orr r0,r9,r0,lsl #8
|
orr r0,r9,r0,lsl #8
|
||||||
ldmfd sp!,{r8,r9,pc}
|
ldmfd sp!,{r2,r8,r9,pc}
|
||||||
|
|
||||||
z80_xmap_write16: @ data, addr
|
z80_xmap_write16: @ data, addr
|
||||||
add r2,r1,#1
|
add r2,r1,#1
|
||||||
|
@ -190,14 +191,14 @@ z80_xmap_write16: @ data, addr
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
0:
|
0:
|
||||||
stmfd sp!,{r8,r9,lr}
|
stmfd sp!,{r2,r8,r9,lr}
|
||||||
mov r8,r0
|
mov r8,r0
|
||||||
mov r9,r1
|
mov r9,r1
|
||||||
bl z80_xmap_write8
|
bl z80_xmap_write8
|
||||||
mov r0,r8,lsr #8
|
mov r0,r8,lsr #8
|
||||||
add r1,r9,#1
|
add r1,r9,#1
|
||||||
bl z80_xmap_write8
|
bl z80_xmap_write8
|
||||||
ldmfd sp!,{r8,r9,pc}
|
ldmfd sp!,{r2,r8,r9,pc}
|
||||||
|
|
||||||
z80_xmap_rebase_pc:
|
z80_xmap_rebase_pc:
|
||||||
ldr r1,[cpucontext,#z80_read8]
|
ldr r1,[cpucontext,#z80_read8]
|
||||||
|
@ -209,11 +210,11 @@ z80_xmap_rebase_pc:
|
||||||
bxcc lr
|
bxcc lr
|
||||||
|
|
||||||
z80_bad_jump:
|
z80_bad_jump:
|
||||||
stmfd sp!,{r3,r12,lr}
|
stmfd sp!,{r2,r3,r12,lr}
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_rebasePC]
|
ldr pc,[cpucontext,#z80_rebasePC]
|
||||||
mov z80pc,r0
|
mov z80pc,r0
|
||||||
ldmfd sp!,{r3,r12,pc}
|
ldmfd sp!,{r2,r3,r12,pc}
|
||||||
|
|
||||||
.if FAST_Z80SP
|
.if FAST_Z80SP
|
||||||
z80_xmap_rebase_sp:
|
z80_xmap_rebase_sp:
|
||||||
|
@ -227,11 +228,11 @@ z80_xmap_rebase_sp:
|
||||||
addcc z80sp,r1,r0
|
addcc z80sp,r1,r0
|
||||||
bxcc lr
|
bxcc lr
|
||||||
|
|
||||||
stmfd sp!,{r3,r12,lr}
|
stmfd sp!,{r2,r3,r12,lr}
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_rebaseSP]
|
ldr pc,[cpucontext,#z80_rebaseSP]
|
||||||
mov z80sp,r0
|
mov z80sp,r0
|
||||||
ldmfd sp!,{r3,r12,pc}
|
ldmfd sp!,{r2,r3,r12,pc}
|
||||||
.endif @ FAST_Z80SP
|
.endif @ FAST_Z80SP
|
||||||
|
|
||||||
.endif @ DRZ80_XMAP
|
.endif @ DRZ80_XMAP
|
||||||
|
@ -676,10 +677,12 @@ z80_xmap_rebase_sp:
|
||||||
;@---------------------------------------
|
;@---------------------------------------
|
||||||
|
|
||||||
.macro opIN
|
.macro opIN
|
||||||
stmfd sp!,{r3,r12}
|
str z80_icount,[cpucontext,#cycles_pointer]
|
||||||
|
stmfd sp!,{r2,r12}
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_in] ;@ r0=port - data returned in r0
|
ldr pc,[cpucontext,#z80_in] ;@ r0=port - data returned in r0
|
||||||
ldmfd sp!,{r3,r12}
|
ldr z80_icount,[cpucontext,#cycles_pointer]
|
||||||
|
ldmfd sp!,{r2,r12}
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro opIN_C
|
.macro opIN_C
|
||||||
|
@ -744,10 +747,12 @@ z80_xmap_rebase_sp:
|
||||||
;@---------------------------------------
|
;@---------------------------------------
|
||||||
|
|
||||||
.macro opOUT
|
.macro opOUT
|
||||||
stmfd sp!,{r3,r12}
|
str z80_icount,[cpucontext,#cycles_pointer]
|
||||||
|
stmfd sp!,{r2,r12}
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_out] ;@ r0=port r1=data
|
ldr pc,[cpucontext,#z80_out] ;@ r0=port r1=data
|
||||||
ldmfd sp!,{r3,r12}
|
ldr z80_icount,[cpucontext,#cycles_pointer]
|
||||||
|
ldmfd sp!,{r2,r12}
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro opOUT_C
|
.macro opOUT_C
|
||||||
|
@ -840,18 +845,18 @@ z80_xmap_rebase_sp:
|
||||||
|
|
||||||
.macro opRESmem bit
|
.macro opRESmem bit
|
||||||
.if DRZ80_XMAP
|
.if DRZ80_XMAP
|
||||||
stmfd sp!,{r0} ;@ save addr as well
|
stmfd sp!,{r0,r2} ;@ save addr as well
|
||||||
bl z80_xmap_read8
|
bl z80_xmap_read8
|
||||||
bic r0,r0,#1<<\bit
|
bic r0,r0,#1<<\bit
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
bl z80_xmap_write8
|
bl z80_xmap_write8
|
||||||
.else
|
.else
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
stmfd sp!,{r0} ;@ save addr as well
|
stmfd sp!,{r0,r2} ;@ save addr as well
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_read8] ;@ r0=addr - data returned in r0
|
ldr pc,[cpucontext,#z80_read8] ;@ r0=addr - data returned in r0
|
||||||
bic r0,r0,#1<<\bit
|
bic r0,r0,#1<<\bit
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
||||||
ldmfd sp!,{r3,r12}
|
ldmfd sp!,{r3,r12}
|
||||||
|
@ -1121,18 +1126,18 @@ z80_xmap_rebase_sp:
|
||||||
|
|
||||||
.macro opSETmem bit
|
.macro opSETmem bit
|
||||||
.if DRZ80_XMAP
|
.if DRZ80_XMAP
|
||||||
stmfd sp!,{r0} ;@ save addr as well
|
stmfd sp!,{r0,r2} ;@ save addr as well
|
||||||
bl z80_xmap_read8
|
bl z80_xmap_read8
|
||||||
orr r0,r0,#1<<\bit
|
orr r0,r0,#1<<\bit
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
bl z80_xmap_write8
|
bl z80_xmap_write8
|
||||||
.else
|
.else
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
stmfd sp!,{r0} ;@ save addr as well
|
stmfd sp!,{r0,r2} ;@ save addr as well
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_read8] ;@ r0=addr - data returned in r0
|
ldr pc,[cpucontext,#z80_read8] ;@ r0=addr - data returned in r0
|
||||||
orr r0,r0,#1<<\bit
|
orr r0,r0,#1<<\bit
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
||||||
ldmfd sp!,{r3,r12}
|
ldmfd sp!,{r3,r12}
|
||||||
|
@ -1404,7 +1409,7 @@ DoInterrupt:
|
||||||
.else
|
.else
|
||||||
|
|
||||||
;@ r0 == z80if
|
;@ r0 == z80if
|
||||||
stmfd sp!,{lr}
|
stmfd sp!,{r2,lr}
|
||||||
|
|
||||||
tst r0,#4 ;@ check halt
|
tst r0,#4 ;@ check halt
|
||||||
addne z80pc,z80pc,#1
|
addne z80pc,z80pc,#1
|
||||||
|
@ -1517,11 +1522,11 @@ DoInterrupt_end:
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
mov pc,r0 ;@ call callback function
|
mov pc,r0 ;@ call callback function
|
||||||
ldmfd sp!,{r3,r12}
|
ldmfd sp!,{r3,r12}
|
||||||
ldmfd sp!,{pc} ;@ return
|
ldmfd sp!,{r2,pc} ;@ return
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
DoNMI:
|
DoNMI:
|
||||||
stmfd sp!,{lr}
|
stmfd sp!,{r2,lr}
|
||||||
|
|
||||||
bic r0,r0,#((Z80_NMI|Z80_HALT|Z80_IF1)<<8)
|
bic r0,r0,#((Z80_NMI|Z80_HALT|Z80_IF1)<<8)
|
||||||
strh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits
|
strh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits
|
||||||
|
@ -1547,7 +1552,7 @@ DoNMI:
|
||||||
.endif
|
.endif
|
||||||
ldrh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits
|
ldrh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits
|
||||||
eatcycles 11
|
eatcycles 11
|
||||||
ldmfd sp!,{pc}
|
ldmfd sp!,{r2,pc}
|
||||||
|
|
||||||
|
|
||||||
.data
|
.data
|
||||||
|
@ -6734,9 +6739,9 @@ opcode_DD_2A:
|
||||||
ldrb r0,[z80pc],#1
|
ldrb r0,[z80pc],#1
|
||||||
ldrb r1,[z80pc],#1
|
ldrb r1,[z80pc],#1
|
||||||
orr r0,r0,r1, lsl #8
|
orr r0,r0,r1, lsl #8
|
||||||
stmfd sp!,{z80xx}
|
stmfd sp!,{r2,z80xx}
|
||||||
readmem16
|
readmem16
|
||||||
ldmfd sp!,{z80xx}
|
ldmfd sp!,{r2,z80xx}
|
||||||
strh r0,[z80xx,#2]
|
strh r0,[z80xx,#2]
|
||||||
fetch 20
|
fetch 20
|
||||||
;@DEC IX
|
;@DEC IX
|
||||||
|
@ -6768,10 +6773,10 @@ opcode_DD_34:
|
||||||
ldr r1,[z80xx]
|
ldr r1,[z80xx]
|
||||||
add r0,r1,r0, lsl #16
|
add r0,r1,r0, lsl #16
|
||||||
mov r0,r0,lsr #16
|
mov r0,r0,lsr #16
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opINC8b
|
opINC8b
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
;@DEC (IX+N)
|
;@DEC (IX+N)
|
||||||
|
@ -6780,10 +6785,10 @@ opcode_DD_35:
|
||||||
ldr r1,[z80xx]
|
ldr r1,[z80xx]
|
||||||
add r0,r1,r0, lsl #16
|
add r0,r1,r0, lsl #16
|
||||||
mov r0,r0,lsr #16
|
mov r0,r0,lsr #16
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opDEC8b
|
opDEC8b
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
;@LD (IX+N),N
|
;@LD (IX+N),N
|
||||||
|
@ -7278,67 +7283,67 @@ opcodes_DD_CB:
|
||||||
|
|
||||||
;@RLC (IX+N)
|
;@RLC (IX+N)
|
||||||
opcode_DD_CB_06:
|
opcode_DD_CB_06:
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opRLCb
|
opRLCb
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
;@RRC (IX+N)
|
;@RRC (IX+N)
|
||||||
opcode_DD_CB_0E:
|
opcode_DD_CB_0E:
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opRRCb
|
opRRCb
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
;@RL (IX+N)
|
;@RL (IX+N)
|
||||||
opcode_DD_CB_16:
|
opcode_DD_CB_16:
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opRLb
|
opRLb
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
;@RR (IX+N)
|
;@RR (IX+N)
|
||||||
opcode_DD_CB_1E:
|
opcode_DD_CB_1E:
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opRRb
|
opRRb
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
|
|
||||||
;@SLA (IX+N)
|
;@SLA (IX+N)
|
||||||
opcode_DD_CB_26:
|
opcode_DD_CB_26:
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opSLAb
|
opSLAb
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
;@SRA (IX+N)
|
;@SRA (IX+N)
|
||||||
opcode_DD_CB_2E:
|
opcode_DD_CB_2E:
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opSRAb
|
opSRAb
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
;@SLL (IX+N)
|
;@SLL (IX+N)
|
||||||
opcode_DD_CB_36:
|
opcode_DD_CB_36:
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opSLLb
|
opSLLb
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
;@SRL (IX+N)
|
;@SRL (IX+N)
|
||||||
opcode_DD_CB_3E:
|
opcode_DD_CB_3E:
|
||||||
stmfd sp!,{r0} ;@ save addr
|
stmfd sp!,{r0,r2} ;@ save addr
|
||||||
readmem8
|
readmem8
|
||||||
opSRLb
|
opSRLb
|
||||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
ldmfd sp!,{r1,r2} ;@ restore addr into r1
|
||||||
writemem8
|
writemem8
|
||||||
fetch 23
|
fetch 23
|
||||||
|
|
||||||
|
@ -7440,9 +7445,9 @@ opcode_DD_E1:
|
||||||
opPOP
|
opPOP
|
||||||
.else
|
.else
|
||||||
mov r0,z80sp
|
mov r0,z80sp
|
||||||
stmfd sp!,{z80xx}
|
stmfd sp!,{r2,z80xx}
|
||||||
readmem16
|
readmem16
|
||||||
ldmfd sp!,{z80xx}
|
ldmfd sp!,{r2,z80xx}
|
||||||
add z80sp,z80sp,#2
|
add z80sp,z80sp,#2
|
||||||
.endif
|
.endif
|
||||||
strh r0,[z80xx,#2]
|
strh r0,[z80xx,#2]
|
||||||
|
@ -7460,9 +7465,9 @@ opcode_DD_E3:
|
||||||
strh r2,[z80xx,#2]
|
strh r2,[z80xx,#2]
|
||||||
.else
|
.else
|
||||||
mov r0,z80sp
|
mov r0,z80sp
|
||||||
stmfd sp!,{z80xx}
|
stmfd sp!,{r2,z80xx}
|
||||||
readmem16
|
readmem16
|
||||||
ldmfd sp!,{z80xx}
|
ldmfd sp!,{r2,z80xx}
|
||||||
mov r2,r0
|
mov r2,r0
|
||||||
ldrh r0,[z80xx,#2]
|
ldrh r0,[z80xx,#2]
|
||||||
strh r2,[z80xx,#2]
|
strh r2,[z80xx,#2]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue