mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
converting drZ80 to use xmap (new mem handling)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@754 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
b2451ac666
commit
ee05564fc7
2 changed files with 155 additions and 179 deletions
|
@ -11,29 +11,28 @@
|
||||||
.global DrZ80Run
|
.global DrZ80Run
|
||||||
.global DrZ80Ver
|
.global DrZ80Ver
|
||||||
|
|
||||||
.equiv INTERRUPT_MODE, 0 ;@0 = Use internal int handler, 1 = Use Mames int handler
|
.equiv INTERRUPT_MODE, 0 ;@0 = Use internal int handler, 1 = Use Mames int handler
|
||||||
.equiv FAST_Z80SP, 1 ;@0 = Use mem functions for stack pointer, 1 = Use direct mem pointer
|
.equiv FAST_Z80SP, 1 ;@0 = Use mem functions for stack pointer, 1 = Use direct mem pointer
|
||||||
.equiv UPDATE_CONTEXT, 0
|
.equiv UPDATE_CONTEXT, 0
|
||||||
.equiv DRZ80_FOR_PICODRIVE, 1
|
.equiv DRZ80_FOR_PICODRIVE, 1
|
||||||
|
.equiv DRZ80_XMAP, 1
|
||||||
|
.equiv DRZ80_XMAP_MORE_INLINE, 1
|
||||||
|
|
||||||
|
.if DRZ80_XMAP
|
||||||
|
.equ Z80_MEM_SHIFT, 13
|
||||||
|
.endif
|
||||||
|
|
||||||
.if INTERRUPT_MODE
|
.if INTERRUPT_MODE
|
||||||
.extern Interrupt
|
.extern Interrupt
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
.if DRZ80_FOR_PICODRIVE
|
|
||||||
.extern PicoRead8
|
|
||||||
.extern Pico
|
|
||||||
.extern z80_write
|
|
||||||
.extern ym2612_read_local_z80
|
|
||||||
.endif
|
|
||||||
|
|
||||||
DrZ80Ver: .long 0x0001
|
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!
|
||||||
|
|
||||||
opcodes .req r3
|
z80_icount .req r3
|
||||||
z80_icount .req r4
|
opcodes .req r4
|
||||||
cpucontext .req r5
|
cpucontext .req r5
|
||||||
z80pc .req r6
|
z80pc .req r6
|
||||||
z80a .req r7
|
z80a .req r7
|
||||||
|
@ -104,139 +103,101 @@ DrZ80Ver: .long 0x0001
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
|
|
||||||
pico_z80_read8: @ addr
|
z80_xmap_read8: @ addr
|
||||||
cmp r0,#0x2000 @ Z80 RAM
|
ldr r1,[cpucontext,#z80_read8]
|
||||||
ldrlt r1,[cpucontext,#z80sp_base]
|
mov r2,r0,lsr #Z80_MEM_SHIFT
|
||||||
ldrltb r0,[r1,r0]
|
ldr r1,[r1,r2,lsl #2]
|
||||||
bxlt lr
|
movs r1,r1,lsl #1
|
||||||
|
ldrccb r0,[r1,r0]
|
||||||
|
bxcc lr
|
||||||
|
|
||||||
cmp r0,#0x8000 @ 68k bank
|
z80_xmap_read8_handler: @ addr, func
|
||||||
blt 1f
|
|
||||||
ldr r2,=(Pico+0x22212)
|
|
||||||
ldrh r1,[r2]
|
|
||||||
bic r0,r0,#0x3f8000
|
|
||||||
orr r0,r0,r1,lsl #15
|
|
||||||
ldr r1,[r2,#-0xe] @ ROM size
|
|
||||||
cmp r0,r1
|
|
||||||
ldrlt r1,[r2,#-0x12] @ ROM
|
|
||||||
eorlt r0,r0,#1 @ our ROM is byteswapped
|
|
||||||
ldrltb r0,[r1,r0]
|
|
||||||
bxlt lr
|
|
||||||
stmfd sp!,{r3,r12,lr}
|
|
||||||
bl PicoRead8
|
|
||||||
ldmfd sp!,{r3,r12,pc}
|
|
||||||
1:
|
|
||||||
mov r1,r0,lsr #13
|
|
||||||
cmp r1,#2 @ YM2612 (0x4000-0x5fff)
|
|
||||||
bne 0f
|
|
||||||
and r0,r0,#3
|
|
||||||
stmfd sp!,{r3,r12,lr}
|
|
||||||
str z80_icount,[cpucontext,#cycles_pointer]
|
str z80_icount,[cpucontext,#cycles_pointer]
|
||||||
bl ym2612_read_local_z80
|
stmfd sp!,{r12,lr}
|
||||||
ldmfd sp!,{r3,r12,pc}
|
mov lr,pc
|
||||||
0:
|
bx r1
|
||||||
cmp r0,#0x4000
|
ldr z80_icount,[cpucontext,#cycles_pointer]
|
||||||
movge r0,#0xff
|
ldmfd sp!,{r12,pc}
|
||||||
bxge lr
|
|
||||||
ldr r1,[cpucontext,#z80sp_base]
|
|
||||||
bic r0,r0,#0x0fe000 @ Z80 RAM (mirror)
|
|
||||||
ldrb r0,[r1,r0]
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
pico_z80_read16: @ addr
|
z80_xmap_write8: @ data, addr
|
||||||
cmp r0,#0x2000 @ Z80 RAM
|
ldr r2,[cpucontext,#z80_write8]
|
||||||
bge 2f
|
add r2,r2,r1,lsr #Z80_MEM_SHIFT-2
|
||||||
ldr r1,[cpucontext,#z80sp_base]
|
bic r2,r2,#3
|
||||||
|
ldr r2,[r2]
|
||||||
|
movs r2,r2,lsl #1
|
||||||
|
strccb r0,[r2,r1]
|
||||||
|
bxcc lr
|
||||||
|
|
||||||
|
z80_xmap_write8_handler: @ data, addr, func
|
||||||
|
str z80_icount,[cpucontext,#cycles_pointer]
|
||||||
|
mov r3,r0
|
||||||
|
mov r0,r1
|
||||||
|
mov r1,r3
|
||||||
|
stmfd sp!,{r12,lr}
|
||||||
|
mov lr,pc
|
||||||
|
bx r2
|
||||||
|
ldr z80_icount,[cpucontext,#cycles_pointer]
|
||||||
|
ldmfd sp!,{r12,pc}
|
||||||
|
|
||||||
|
z80_xmap_read16: @ addr
|
||||||
|
@ check if we cross bank boundary
|
||||||
|
add r1,r0,#1
|
||||||
|
eor r1,r0,r0
|
||||||
|
tst r1,#1<<Z80_MEM_SHIFT
|
||||||
|
bne 0f
|
||||||
|
|
||||||
|
ldr r1,[cpucontext,#z80_read8]
|
||||||
|
mov r2,r0,lsr #Z80_MEM_SHIFT
|
||||||
|
ldr r1,[r1,r2,lsl #2]
|
||||||
|
movs r1,r1,lsl #1
|
||||||
|
bcs 0f
|
||||||
ldrb r0,[r1,r0]!
|
ldrb r0,[r1,r0]!
|
||||||
ldrb r1,[r1,#1]
|
ldrb r1,[r1,#1]
|
||||||
orr r0,r0,r1,lsl #8
|
orr r0,r0,r1,lsl #8
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
2:
|
0:
|
||||||
cmp r0,#0x8000 @ 68k bank
|
@ z80_xmap_read8 will save r3 and r12 for us
|
||||||
blt 1f
|
stmfd sp!,{r4,r5,lr}
|
||||||
ldr r2,=(Pico+0x22212)
|
|
||||||
ldrh r1,[r2]
|
|
||||||
bic r0,r0,#0x1f8000
|
|
||||||
orr r0,r0,r1,lsl #15
|
|
||||||
ldr r1,[r2,#-0xe] @ ROM size
|
|
||||||
cmp r0,r1
|
|
||||||
ldr r1,[r2,#-0x12] @ ROM
|
|
||||||
tst r0,#1
|
|
||||||
eor r0,r0,#1
|
|
||||||
ldrb r0,[r1,r0]!
|
|
||||||
ldreqb r1,[r1,#-1]
|
|
||||||
ldrneb r1,[r1,#3] @ this is due to byteswapped ROM
|
|
||||||
orr r0,r0,r1,lsl #8
|
|
||||||
bx lr
|
|
||||||
3:
|
|
||||||
stmfd sp!,{r3-r5,r12,lr}
|
|
||||||
mov r4,r0
|
mov r4,r0
|
||||||
bl PicoRead8
|
bl z80_xmap_read8
|
||||||
mov r5,r0
|
mov r5,r0
|
||||||
add r0,r4,#1
|
add r0,r4,#1
|
||||||
bl PicoRead8
|
bl z80_xmap_read8
|
||||||
orr r0,r5,r0,lsl #8
|
orr r0,r5,r0,lsl #8
|
||||||
ldmfd sp!,{r3-r5,r12,pc}
|
ldmfd sp!,{r4,r5,pc}
|
||||||
1:
|
|
||||||
mov r1,r0,lsr #13
|
z80_xmap_write16: @ data, addr
|
||||||
cmp r1,#2 @ YM2612 (0x4000-0x5fff)
|
add r2,r1,#1
|
||||||
|
eor r2,r1,r1
|
||||||
|
tst r2,#1<<Z80_MEM_SHIFT
|
||||||
bne 0f
|
bne 0f
|
||||||
and r0,r0,#3
|
|
||||||
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
|
|
||||||
bxge lr
|
|
||||||
ldr r1,[cpucontext,#z80sp_base]
|
|
||||||
bic r0,r0,#0x0fe000 @ Z80 RAM (mirror)
|
|
||||||
ldrb r0,[r1,r0]!
|
|
||||||
ldrb r1,[r1,#1]
|
|
||||||
orr r0,r0,r1,lsl #8
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
pico_z80_write8: @ data, addr
|
ldr r2,[cpucontext,#z80_read8]
|
||||||
cmp r1,#0x4000
|
add r2,r2,r1,lsr #Z80_MEM_SHIFT-2
|
||||||
bge 1f
|
bic r2,r2,#3
|
||||||
ldr r2,[cpucontext,#z80sp_base]
|
ldr r2,[r2]
|
||||||
bic r1,r1,#0x0fe000 @ Z80 RAM
|
movs r2,r2,lsl #1
|
||||||
strb r0,[r2,r1]
|
bcs 0f
|
||||||
bx lr
|
|
||||||
1:
|
|
||||||
stmfd sp!,{r3,r12,lr}
|
|
||||||
str z80_icount,[cpucontext,#cycles_pointer]
|
|
||||||
bl z80_write
|
|
||||||
ldmfd sp!,{r3,r12,pc}
|
|
||||||
|
|
||||||
pico_z80_write16: @ data, addr
|
|
||||||
cmp r1,#0x4000
|
|
||||||
bge 1f
|
|
||||||
ldr r2,[cpucontext,#z80sp_base]
|
|
||||||
bic r1,r1,#0x0fe000 @ Z80 RAM
|
|
||||||
strb r0,[r2,r1]!
|
strb r0,[r2,r1]!
|
||||||
mov r0,r0,lsr #8
|
mov r0,r0,lsr #8
|
||||||
strb r0,[r2,#1]
|
strb r0,[r2,#1]
|
||||||
bx lr
|
bx lr
|
||||||
1:
|
|
||||||
stmfd sp!,{r3-r5,r12,lr}
|
0:
|
||||||
str z80_icount,[cpucontext,#cycles_pointer]
|
stmfd sp!,{r4,r5,lr}
|
||||||
mov r4,r0
|
mov r4,r0
|
||||||
mov r5,r1
|
mov r5,r1
|
||||||
bl z80_write
|
bl z80_xmap_write8
|
||||||
mov r0,r4,lsr #8
|
mov r0,r4,lsr #8
|
||||||
add r1,r5,#1
|
add r1,r5,#1
|
||||||
bl z80_write
|
bl z80_xmap_write8
|
||||||
ldmfd sp!,{r3-r5,r12,pc}
|
ldmfd sp!,{r4,r5,pc}
|
||||||
|
|
||||||
.pool
|
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
|
|
||||||
.macro fetch cycs
|
.macro fetch cycs
|
||||||
subs z80_icount,z80_icount,#\cycs
|
subs z80_icount,z80_icount,#\cycs
|
||||||
.if UPDATE_CONTEXT
|
.if UPDATE_CONTEXT
|
||||||
|
@ -262,9 +223,18 @@ pico_z80_write16: @ data, addr
|
||||||
.if UPDATE_CONTEXT
|
.if UPDATE_CONTEXT
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
str z80pc,[cpucontext,#z80pc_pointer]
|
||||||
.endif
|
.endif
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
bl pico_z80_read8
|
.if !DRZ80_XMAP_MORE_INLINE
|
||||||
|
ldr r1,[cpucontext,#z80_read8]
|
||||||
|
mov r2,r0,lsr #Z80_MEM_SHIFT
|
||||||
|
ldr r1,[r1,r2,lsl #2]
|
||||||
|
movs r1,r1,lsl #1
|
||||||
|
ldrccb r0,[r1,r0]
|
||||||
|
blcs z80_xmap_read8_handler
|
||||||
.else
|
.else
|
||||||
|
bl z80_xmap_read8
|
||||||
|
.endif
|
||||||
|
.else ;@ if !DRZ80_XMAP
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
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
|
||||||
|
@ -281,8 +251,8 @@ pico_z80_write16: @ data, addr
|
||||||
.if UPDATE_CONTEXT
|
.if UPDATE_CONTEXT
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
str z80pc,[cpucontext,#z80pc_pointer]
|
||||||
.endif
|
.endif
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
bl pico_z80_read16
|
bl z80_xmap_read16
|
||||||
.else
|
.else
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
|
@ -295,9 +265,18 @@ pico_z80_write16: @ data, addr
|
||||||
.if UPDATE_CONTEXT
|
.if UPDATE_CONTEXT
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
str z80pc,[cpucontext,#z80pc_pointer]
|
||||||
.endif
|
.endif
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
bl pico_z80_write8
|
.if DRZ80_XMAP_MORE_INLINE
|
||||||
|
ldr r2,[cpucontext,#z80_write8]
|
||||||
|
mov lr,r1,lsr #Z80_MEM_SHIFT
|
||||||
|
ldr r2,[r2,lr,lsl #2]
|
||||||
|
movs r2,r2,lsl #1
|
||||||
|
strccb r0,[r2,r1]
|
||||||
|
blcs z80_xmap_write8_handler
|
||||||
.else
|
.else
|
||||||
|
bl z80_xmap_write8
|
||||||
|
.endif
|
||||||
|
.else ;@ if !DRZ80_XMAP
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
||||||
|
@ -319,8 +298,8 @@ pico_z80_write16: @ data, addr
|
||||||
.if UPDATE_CONTEXT
|
.if UPDATE_CONTEXT
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
str z80pc,[cpucontext,#z80pc_pointer]
|
||||||
.endif
|
.endif
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
bl pico_z80_write16
|
bl z80_xmap_write16
|
||||||
.else
|
.else
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
|
@ -334,19 +313,16 @@ pico_z80_write16: @ data, addr
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
str z80pc,[cpucontext,#z80pc_pointer]
|
||||||
.endif
|
.endif
|
||||||
mov r0,z80hl, lsr #16
|
mov r0,z80hl, lsr #16
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
bl pico_z80_read8
|
bl z80_xmap_read8
|
||||||
.else
|
.else
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
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
|
||||||
.endif
|
|
||||||
.if UPDATE_CONTEXT
|
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
|
||||||
.endif
|
.endif
|
||||||
mov r1,z80de, lsr #16
|
mov r1,z80de, lsr #16
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
bl pico_z80_write8
|
bl z80_xmap_write8
|
||||||
.else
|
.else
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
||||||
|
@ -829,14 +805,13 @@ pico_z80_write16: @ data, addr
|
||||||
;@---------------------------------------
|
;@---------------------------------------
|
||||||
|
|
||||||
.macro opRESmemHL bit
|
.macro opRESmemHL bit
|
||||||
.if DRZ80_FOR_PICODRIVE
|
|
||||||
mov r0,z80hl, lsr #16
|
mov r0,z80hl, lsr #16
|
||||||
bl pico_z80_read8
|
.if DRZ80_XMAP
|
||||||
|
bl z80_xmap_read8
|
||||||
bic r0,r0,#1<<\bit
|
bic r0,r0,#1<<\bit
|
||||||
mov r1,z80hl, lsr #16
|
mov r1,z80hl, lsr #16
|
||||||
bl pico_z80_write8
|
bl z80_xmap_write8
|
||||||
.else
|
.else
|
||||||
mov r0,z80hl, lsr #16
|
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
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
|
||||||
|
@ -851,12 +826,12 @@ pico_z80_write16: @ data, addr
|
||||||
;@---------------------------------------
|
;@---------------------------------------
|
||||||
|
|
||||||
.macro opRESmem bit
|
.macro opRESmem bit
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
stmfd sp!,{r0} ;@ save addr as well
|
stmfd sp!,{r0} ;@ save addr as well
|
||||||
bl pico_z80_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} ;@ restore addr into r1
|
||||||
bl pico_z80_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} ;@ save addr as well
|
||||||
|
@ -1111,14 +1086,13 @@ pico_z80_write16: @ data, addr
|
||||||
;@---------------------------------------
|
;@---------------------------------------
|
||||||
|
|
||||||
.macro opSETmemHL bit
|
.macro opSETmemHL bit
|
||||||
.if DRZ80_FOR_PICODRIVE
|
|
||||||
mov r0,z80hl, lsr #16
|
mov r0,z80hl, lsr #16
|
||||||
bl pico_z80_read8
|
.if DRZ80_XMAP
|
||||||
|
bl z80_xmap_read8
|
||||||
orr r0,r0,#1<<\bit
|
orr r0,r0,#1<<\bit
|
||||||
mov r1,z80hl, lsr #16
|
mov r1,z80hl, lsr #16
|
||||||
bl pico_z80_write8
|
bl z80_xmap_write8
|
||||||
.else
|
.else
|
||||||
mov r0,z80hl, lsr #16
|
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
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
|
||||||
|
@ -1133,12 +1107,12 @@ pico_z80_write16: @ data, addr
|
||||||
;@---------------------------------------
|
;@---------------------------------------
|
||||||
|
|
||||||
.macro opSETmem bit
|
.macro opSETmem bit
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
stmfd sp!,{r0} ;@ save addr as well
|
stmfd sp!,{r0} ;@ save addr as well
|
||||||
bl pico_z80_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} ;@ restore addr into r1
|
||||||
bl pico_z80_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} ;@ save addr as well
|
||||||
|
@ -1502,23 +1476,18 @@ DoInterrupt_mode2:
|
||||||
orr r0,r0,r1,lsr#16
|
orr r0,r0,r1,lsr#16
|
||||||
|
|
||||||
;@ read new pc from vector address
|
;@ read new pc from vector address
|
||||||
.if DRZ80_FOR_PICODRIVE
|
|
||||||
bl pico_z80_read16
|
|
||||||
bic r0,r0,#0xfe000
|
|
||||||
ldr r1,[cpucontext,#z80pc_base]
|
|
||||||
add z80pc,r1,r0
|
|
||||||
.if UPDATE_CONTEXT
|
.if UPDATE_CONTEXT
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
str z80pc,[cpucontext,#z80pc_pointer]
|
||||||
.endif
|
.endif
|
||||||
|
.if DRZ80_XMAP
|
||||||
|
bl z80_xmap_read16
|
||||||
|
rebasepc
|
||||||
.else
|
.else
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_read16]
|
ldr pc,[cpucontext,#z80_read16]
|
||||||
|
|
||||||
;@ rebase new pc
|
;@ rebase new pc
|
||||||
.if UPDATE_CONTEXT
|
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
|
||||||
.endif
|
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
ldr pc,[cpucontext,#z80_rebasePC] ;@ r0=new pc - external function sets z80pc_base and returns new z80pc in r0
|
ldr pc,[cpucontext,#z80_rebasePC] ;@ r0=new pc - external function sets z80pc_base and returns new z80pc in r0
|
||||||
ldmfd sp!,{r3,r12}
|
ldmfd sp!,{r3,r12}
|
||||||
|
|
49
pico/z80if.c
49
pico/z80if.c
|
@ -63,20 +63,7 @@ int mz80_run(int cycles)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _USE_DRZ80
|
#ifdef _USE_DRZ80
|
||||||
|
|
||||||
struct DrZ80 drZ80;
|
struct DrZ80 drZ80;
|
||||||
|
|
||||||
static unsigned int DrZ80_rebasePC(unsigned short a)
|
|
||||||
{
|
|
||||||
drZ80.Z80PC_BASE = (unsigned int) Pico.zram;
|
|
||||||
return drZ80.Z80PC_BASE + a;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int DrZ80_rebaseSP(unsigned short a)
|
|
||||||
{
|
|
||||||
drZ80.Z80SP_BASE = (unsigned int) Pico.zram;
|
|
||||||
return drZ80.Z80SP_BASE + a;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,8 +88,8 @@ PICO_INTERNAL void z80_init(void)
|
||||||
#endif
|
#endif
|
||||||
#ifdef _USE_DRZ80
|
#ifdef _USE_DRZ80
|
||||||
memset(&drZ80, 0, sizeof(drZ80));
|
memset(&drZ80, 0, sizeof(drZ80));
|
||||||
drZ80.z80_rebasePC=DrZ80_rebasePC;
|
drZ80.z80_rebasePC=NULL; // unused, handled by xmap
|
||||||
drZ80.z80_rebaseSP=DrZ80_rebaseSP;
|
drZ80.z80_rebaseSP=NULL;
|
||||||
drZ80.z80_read8 =(void *)z80_read_map;
|
drZ80.z80_read8 =(void *)z80_read_map;
|
||||||
drZ80.z80_read16 =NULL;
|
drZ80.z80_read16 =NULL;
|
||||||
drZ80.z80_write8 =(void *)z80_write_map;
|
drZ80.z80_write8 =(void *)z80_write_map;
|
||||||
|
@ -130,8 +117,9 @@ PICO_INTERNAL void z80_reset(void)
|
||||||
drZ80.Z80IY = 0xFFFF << 16;
|
drZ80.Z80IY = 0xFFFF << 16;
|
||||||
drZ80.Z80IM = 0; // 1?
|
drZ80.Z80IM = 0; // 1?
|
||||||
drZ80.z80irqvector = 0xff0000; // RST 38h
|
drZ80.z80irqvector = 0xff0000; // RST 38h
|
||||||
drZ80.Z80PC = drZ80.z80_rebasePC(0);
|
drZ80.Z80PC_BASE = drZ80.Z80PC = z80_read_map[0] << 1;
|
||||||
drZ80.Z80SP = drZ80.z80_rebaseSP(0x2000); // 0xf000 ?
|
drZ80.Z80SP_BASE = z80_read_map[0] << 1;
|
||||||
|
// drZ80.Z80SP = drZ80.z80_rebaseSP(0x2000); // 0xf000 ?
|
||||||
#endif
|
#endif
|
||||||
#ifdef _USE_CZ80
|
#ifdef _USE_CZ80
|
||||||
Cz80_Reset(&CZ80);
|
Cz80_Reset(&CZ80);
|
||||||
|
@ -142,6 +130,7 @@ PICO_INTERNAL void z80_reset(void)
|
||||||
Pico.m.z80_fakeval = 0; // for faking when Z80 is disabled
|
Pico.m.z80_fakeval = 0; // for faking when Z80 is disabled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX TODO: should better use universal z80 save format
|
||||||
PICO_INTERNAL void z80_pack(unsigned char *data)
|
PICO_INTERNAL void z80_pack(unsigned char *data)
|
||||||
{
|
{
|
||||||
#if defined(_USE_MZ80)
|
#if defined(_USE_MZ80)
|
||||||
|
@ -151,8 +140,8 @@ PICO_INTERNAL void z80_pack(unsigned char *data)
|
||||||
memcpy(data+4, &mz80.z80clockticks, sizeof(mz80)-5*4); // don't save base&memhandlers
|
memcpy(data+4, &mz80.z80clockticks, sizeof(mz80)-5*4); // don't save base&memhandlers
|
||||||
#elif defined(_USE_DRZ80)
|
#elif defined(_USE_DRZ80)
|
||||||
*(int *)data = 0x015A7244; // "DrZ" v1
|
*(int *)data = 0x015A7244; // "DrZ" v1
|
||||||
drZ80.Z80PC = drZ80.z80_rebasePC(drZ80.Z80PC-drZ80.Z80PC_BASE);
|
// drZ80.Z80PC = drZ80.z80_rebasePC(drZ80.Z80PC-drZ80.Z80PC_BASE);
|
||||||
drZ80.Z80SP = drZ80.z80_rebaseSP(drZ80.Z80SP-drZ80.Z80SP_BASE);
|
// drZ80.Z80SP = drZ80.z80_rebaseSP(drZ80.Z80SP-drZ80.Z80SP_BASE);
|
||||||
memcpy(data+4, &drZ80, 0x54);
|
memcpy(data+4, &drZ80, 0x54);
|
||||||
#elif defined(_USE_CZ80)
|
#elif defined(_USE_CZ80)
|
||||||
*(int *)data = 0x00007a43; // "Cz"
|
*(int *)data = 0x00007a43; // "Cz"
|
||||||
|
@ -175,10 +164,28 @@ PICO_INTERNAL void z80_unpack(unsigned char *data)
|
||||||
}
|
}
|
||||||
#elif defined(_USE_DRZ80)
|
#elif defined(_USE_DRZ80)
|
||||||
if (*(int *)data == 0x015A7244) { // "DrZ" v1 save?
|
if (*(int *)data == 0x015A7244) { // "DrZ" v1 save?
|
||||||
|
int pc, sp;
|
||||||
memcpy(&drZ80, data+4, 0x54);
|
memcpy(&drZ80, data+4, 0x54);
|
||||||
|
pc = (drZ80.Z80PC - drZ80.Z80PC_BASE) & 0xffff;
|
||||||
|
sp = (drZ80.Z80SP - drZ80.Z80SP_BASE) & 0xffff;
|
||||||
// update bases
|
// update bases
|
||||||
drZ80.Z80PC = drZ80.z80_rebasePC(drZ80.Z80PC-drZ80.Z80PC_BASE);
|
drZ80.Z80PC_BASE = z80_read_map[pc >> Z80_MEM_SHIFT];
|
||||||
drZ80.Z80SP = drZ80.z80_rebaseSP(drZ80.Z80SP-drZ80.Z80SP_BASE);
|
if (drZ80.Z80PC & (1<<31)) {
|
||||||
|
elprintf(EL_STATUS|EL_ANOMALY, "bad PC in z80 save: %04x", pc);
|
||||||
|
drZ80.Z80PC_BASE = drZ80.Z80PC = z80_read_map[0];
|
||||||
|
} else {
|
||||||
|
drZ80.Z80PC_BASE <<= 1;
|
||||||
|
drZ80.Z80PC = drZ80.Z80PC_BASE + pc;
|
||||||
|
}
|
||||||
|
drZ80.Z80SP_BASE = z80_read_map[sp >> Z80_MEM_SHIFT];
|
||||||
|
if (drZ80.Z80SP & (1<<31)) {
|
||||||
|
elprintf(EL_STATUS|EL_ANOMALY, "bad SP in z80 save: %04x", sp);
|
||||||
|
drZ80.Z80SP_BASE = z80_read_map[0];
|
||||||
|
drZ80.Z80SP = drZ80.Z80SP_BASE + (1 << Z80_MEM_SHIFT);
|
||||||
|
} else {
|
||||||
|
drZ80.Z80SP_BASE <<= 1;
|
||||||
|
drZ80.Z80SP = drZ80.Z80SP_BASE + sp;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
z80_reset();
|
z80_reset();
|
||||||
drZ80.Z80IM = 1;
|
drZ80.Z80IM = 1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue