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 DrZ80Ver
|
||||
|
||||
.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 UPDATE_CONTEXT, 0
|
||||
.equiv DRZ80_FOR_PICODRIVE, 1
|
||||
.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 UPDATE_CONTEXT, 0
|
||||
.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
|
||||
.extern Interrupt
|
||||
.endif
|
||||
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
.extern PicoRead8
|
||||
.extern Pico
|
||||
.extern z80_write
|
||||
.extern ym2612_read_local_z80
|
||||
.endif
|
||||
|
||||
DrZ80Ver: .long 0x0001
|
||||
|
||||
;@ --------------------------- Defines ----------------------------
|
||||
;@ Make sure that regs/pointers for z80pc to z80sp match up!
|
||||
|
||||
opcodes .req r3
|
||||
z80_icount .req r4
|
||||
z80_icount .req r3
|
||||
opcodes .req r4
|
||||
cpucontext .req r5
|
||||
z80pc .req r6
|
||||
z80a .req r7
|
||||
|
@ -104,139 +103,101 @@ DrZ80Ver: .long 0x0001
|
|||
|
||||
.text
|
||||
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
.if DRZ80_XMAP
|
||||
|
||||
pico_z80_read8: @ addr
|
||||
cmp r0,#0x2000 @ Z80 RAM
|
||||
ldrlt r1,[cpucontext,#z80sp_base]
|
||||
ldrltb r0,[r1,r0]
|
||||
bxlt lr
|
||||
z80_xmap_read8: @ addr
|
||||
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]
|
||||
bxcc lr
|
||||
|
||||
cmp r0,#0x8000 @ 68k bank
|
||||
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}
|
||||
z80_xmap_read8_handler: @ addr, func
|
||||
str z80_icount,[cpucontext,#cycles_pointer]
|
||||
bl ym2612_read_local_z80
|
||||
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]
|
||||
bx lr
|
||||
stmfd sp!,{r12,lr}
|
||||
mov lr,pc
|
||||
bx r1
|
||||
ldr z80_icount,[cpucontext,#cycles_pointer]
|
||||
ldmfd sp!,{r12,pc}
|
||||
|
||||
pico_z80_read16: @ addr
|
||||
cmp r0,#0x2000 @ Z80 RAM
|
||||
bge 2f
|
||||
ldr r1,[cpucontext,#z80sp_base]
|
||||
z80_xmap_write8: @ data, addr
|
||||
ldr r2,[cpucontext,#z80_write8]
|
||||
add r2,r2,r1,lsr #Z80_MEM_SHIFT-2
|
||||
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 r1,[r1,#1]
|
||||
orr r0,r0,r1,lsl #8
|
||||
bx lr
|
||||
|
||||
2:
|
||||
cmp r0,#0x8000 @ 68k bank
|
||||
blt 1f
|
||||
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}
|
||||
0:
|
||||
@ z80_xmap_read8 will save r3 and r12 for us
|
||||
stmfd sp!,{r4,r5,lr}
|
||||
mov r4,r0
|
||||
bl PicoRead8
|
||||
bl z80_xmap_read8
|
||||
mov r5,r0
|
||||
add r0,r4,#1
|
||||
bl PicoRead8
|
||||
bl z80_xmap_read8
|
||||
orr r0,r5,r0,lsl #8
|
||||
ldmfd sp!,{r3-r5,r12,pc}
|
||||
1:
|
||||
mov r1,r0,lsr #13
|
||||
cmp r1,#2 @ YM2612 (0x4000-0x5fff)
|
||||
ldmfd sp!,{r4,r5,pc}
|
||||
|
||||
z80_xmap_write16: @ data, addr
|
||||
add r2,r1,#1
|
||||
eor r2,r1,r1
|
||||
tst r2,#1<<Z80_MEM_SHIFT
|
||||
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
|
||||
cmp r1,#0x4000
|
||||
bge 1f
|
||||
ldr r2,[cpucontext,#z80sp_base]
|
||||
bic r1,r1,#0x0fe000 @ Z80 RAM
|
||||
strb r0,[r2,r1]
|
||||
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
|
||||
ldr r2,[cpucontext,#z80_read8]
|
||||
add r2,r2,r1,lsr #Z80_MEM_SHIFT-2
|
||||
bic r2,r2,#3
|
||||
ldr r2,[r2]
|
||||
movs r2,r2,lsl #1
|
||||
bcs 0f
|
||||
strb r0,[r2,r1]!
|
||||
mov r0,r0,lsr #8
|
||||
strb r0,[r2,#1]
|
||||
bx lr
|
||||
1:
|
||||
stmfd sp!,{r3-r5,r12,lr}
|
||||
str z80_icount,[cpucontext,#cycles_pointer]
|
||||
|
||||
0:
|
||||
stmfd sp!,{r4,r5,lr}
|
||||
mov r4,r0
|
||||
mov r5,r1
|
||||
bl z80_write
|
||||
bl z80_xmap_write8
|
||||
mov r0,r4,lsr #8
|
||||
add r1,r5,#1
|
||||
bl z80_write
|
||||
ldmfd sp!,{r3-r5,r12,pc}
|
||||
|
||||
.pool
|
||||
bl z80_xmap_write8
|
||||
ldmfd sp!,{r4,r5,pc}
|
||||
.endif
|
||||
|
||||
|
||||
.macro fetch cycs
|
||||
subs z80_icount,z80_icount,#\cycs
|
||||
.if UPDATE_CONTEXT
|
||||
|
@ -262,9 +223,18 @@ pico_z80_write16: @ data, addr
|
|||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_read8
|
||||
.if DRZ80_XMAP
|
||||
.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
|
||||
bl z80_xmap_read8
|
||||
.endif
|
||||
.else ;@ if !DRZ80_XMAP
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0
|
||||
|
@ -281,8 +251,8 @@ pico_z80_write16: @ data, addr
|
|||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_read16
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read16
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
|
@ -295,9 +265,18 @@ pico_z80_write16: @ data, addr
|
|||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_write8
|
||||
.if DRZ80_XMAP
|
||||
.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
|
||||
bl z80_xmap_write8
|
||||
.endif
|
||||
.else ;@ if !DRZ80_XMAP
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
||||
|
@ -319,8 +298,8 @@ pico_z80_write16: @ data, addr
|
|||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_write16
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_write16
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
|
@ -334,19 +313,16 @@ pico_z80_write16: @ data, addr
|
|||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
mov r0,z80hl, lsr #16
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_read8
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read8
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0
|
||||
.endif
|
||||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
mov r1,z80de, lsr #16
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_write8
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
||||
|
@ -829,14 +805,13 @@ pico_z80_write16: @ data, addr
|
|||
;@---------------------------------------
|
||||
|
||||
.macro opRESmemHL bit
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
mov r0,z80hl, lsr #16
|
||||
bl pico_z80_read8
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read8
|
||||
bic r0,r0,#1<<\bit
|
||||
mov r1,z80hl, lsr #16
|
||||
bl pico_z80_write8
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
mov r0,z80hl, lsr #16
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0
|
||||
|
@ -851,12 +826,12 @@ pico_z80_write16: @ data, addr
|
|||
;@---------------------------------------
|
||||
|
||||
.macro opRESmem bit
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
.if DRZ80_XMAP
|
||||
stmfd sp!,{r0} ;@ save addr as well
|
||||
bl pico_z80_read8
|
||||
bl z80_xmap_read8
|
||||
bic r0,r0,#1<<\bit
|
||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
||||
bl pico_z80_write8
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
stmfd sp!,{r0} ;@ save addr as well
|
||||
|
@ -1111,14 +1086,13 @@ pico_z80_write16: @ data, addr
|
|||
;@---------------------------------------
|
||||
|
||||
.macro opSETmemHL bit
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
mov r0,z80hl, lsr #16
|
||||
bl pico_z80_read8
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read8
|
||||
orr r0,r0,#1<<\bit
|
||||
mov r1,z80hl, lsr #16
|
||||
bl pico_z80_write8
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
mov r0,z80hl, lsr #16
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0
|
||||
|
@ -1133,12 +1107,12 @@ pico_z80_write16: @ data, addr
|
|||
;@---------------------------------------
|
||||
|
||||
.macro opSETmem bit
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
.if DRZ80_XMAP
|
||||
stmfd sp!,{r0} ;@ save addr as well
|
||||
bl pico_z80_read8
|
||||
bl z80_xmap_read8
|
||||
orr r0,r0,#1<<\bit
|
||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
||||
bl pico_z80_write8
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
stmfd sp!,{r0} ;@ save addr as well
|
||||
|
@ -1502,23 +1476,18 @@ DoInterrupt_mode2:
|
|||
orr r0,r0,r1,lsr#16
|
||||
|
||||
;@ 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
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read16
|
||||
rebasepc
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read16]
|
||||
|
||||
;@ rebase new pc
|
||||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_rebasePC] ;@ r0=new pc - external function sets z80pc_base and returns new z80pc in r0
|
||||
ldmfd sp!,{r3,r12}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue