mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-06 07:38:05 -04:00
1.32 release
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@87 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
4696954094
commit
6cadc2da00
42 changed files with 803 additions and 167 deletions
256
Pico/cd/Memory.s
256
Pico/cd/Memory.s
|
@ -1,8 +1,7 @@
|
|||
@ vim:filetype=armasm
|
||||
|
||||
@ Memory i/o handlers for Sega/Mega CD emulation
|
||||
@ Memory I/O handlers for Sega/Mega CD emulation
|
||||
@ (c) Copyright 2007, Grazvydas "notaz" Ignotas
|
||||
@ All Rights Reserved
|
||||
|
||||
|
||||
|
||||
|
@ -27,14 +26,17 @@
|
|||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x280000 - 0x2fffff
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x300000
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x3fffff
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x400000
|
||||
.long m_m68k_&\on&\sz&_bcram_size @ 0x400000
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x420000
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x4fffff
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x500000
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x5fffff
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x600000
|
||||
.long m_m68k_&\on&\sz&_bcram @ 0x600000
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x620000
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x6fffff
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x700000
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x7fffff
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x7dffff
|
||||
.long m_m68k_&\on&\sz&_bcram_reg @ 0x7e0000
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x800000
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x8fffff
|
||||
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x900000
|
||||
|
@ -364,6 +366,25 @@ PicoWriteS68k32: @ u32 a, u32 d
|
|||
streq r1, [r2, r0]
|
||||
.endm
|
||||
|
||||
@
|
||||
.macro bcram_reg_rw is_read addr_check
|
||||
rsb r0, r0, #0x800000
|
||||
ldr r2, =(Pico+0x22200)
|
||||
cmp r0, #(0x800000-\addr_check)
|
||||
ldreq r2, [r2]
|
||||
.if \is_read
|
||||
movne r0, #0
|
||||
.endif
|
||||
bxne lr
|
||||
add r2, r2, #0x110000
|
||||
add r2, r2, #0x002200
|
||||
.if \is_read
|
||||
ldrb r0, [r2, #0x18]
|
||||
.else
|
||||
strb r1, [r2, #0x18]
|
||||
.endif
|
||||
bx lr
|
||||
.endm
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
@ -448,6 +469,35 @@ m_m68k_read8_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
|
|||
bx lr
|
||||
|
||||
|
||||
m_m68k_read8_bcram_size: @ 0x400000
|
||||
sub r0, r0, #1
|
||||
cmp r0, #0x400000
|
||||
ldreq r1, =SRam
|
||||
mov r0, #0
|
||||
ldreq r1, [r1]
|
||||
bxne lr
|
||||
tst r1, r1
|
||||
movne r0, #3 @ pretend to be a 64k cart (8<<3)
|
||||
bx lr
|
||||
|
||||
|
||||
m_m68k_read8_bcram: @ 0x600000 - 0x61ffff
|
||||
ldr r1, =SRam
|
||||
bic r0, r0, #0xfe0000
|
||||
ldr r1, [r1]
|
||||
mov r0, r0, lsr #1
|
||||
tst r1, r1
|
||||
moveq r0, #0
|
||||
bxeq lr
|
||||
add r1, r1, #0x2000
|
||||
ldrb r0, [r1, r0]
|
||||
bx lr
|
||||
|
||||
|
||||
m_m68k_read8_bcram_reg: @ 0x7fffff
|
||||
bcram_reg_rw 1, 0x7fffff
|
||||
|
||||
|
||||
m_m68k_read8_system_io:
|
||||
bic r2, r0, #0xfe0000
|
||||
bic r2, r2, #0x3f
|
||||
|
@ -656,6 +706,25 @@ m_m68k_read16_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
|
|||
bx lr
|
||||
|
||||
|
||||
m_m68k_read16_bcram_size: @ 0x400000
|
||||
cmp r0, #0x400000
|
||||
ldreq r1, =SRam
|
||||
mov r0, #0
|
||||
ldreq r1, [r1]
|
||||
bxne lr
|
||||
tst r1, r1
|
||||
movne r0, #3 @ pretend to be a 64k cart
|
||||
bx lr
|
||||
|
||||
|
||||
@ m_m68k_read16_bcram: @ 0x600000 - 0x61ffff
|
||||
.equiv m_m68k_read16_bcram, m_m68k_read8_bcram
|
||||
|
||||
|
||||
m_m68k_read16_bcram_reg: @ 0x7fffff
|
||||
bcram_reg_rw 1, 0x7ffffe
|
||||
|
||||
|
||||
m_m68k_read16_system_io:
|
||||
bic r1, r0, #0xfe0000
|
||||
bic r1, r1, #0x3f
|
||||
|
@ -851,6 +920,33 @@ m_m68k_read32_wordram1_1M_b1_unal:
|
|||
bx r12
|
||||
|
||||
|
||||
m_m68k_read32_bcram_size: @ 0x400000
|
||||
cmp r0, #0x400000
|
||||
ldreq r1, =SRam
|
||||
mov r0, #0
|
||||
ldreq r1, [r1]
|
||||
bxne lr
|
||||
tst r1, r1
|
||||
movne r0, #0x30000 @ pretend to be a 64k cart
|
||||
bx lr
|
||||
|
||||
|
||||
m_m68k_read32_bcram: @ 0x600000 - 0x61ffff, not likely to be called
|
||||
mov r12,lr
|
||||
add r3, r0, #2
|
||||
bl m_m68k_read8_bcram
|
||||
mov r1, r0
|
||||
mov r0, r3
|
||||
mov r3, r1
|
||||
bl m_m68k_read8_bcram
|
||||
orr r0, r0, r3, lsl #16
|
||||
bx r12
|
||||
|
||||
|
||||
m_m68k_read32_bcram_reg: @ 0x7fffff
|
||||
bcram_reg_rw 1, 0x7ffffc
|
||||
|
||||
|
||||
@ it is not very practical to use long access on hw registers, so I assume it is not used too much.
|
||||
m_m68k_read32_system_io:
|
||||
bic r1, r0, #0xfe0000
|
||||
|
@ -916,6 +1012,7 @@ m_m68k_read32_ram:
|
|||
|
||||
m_write_null:
|
||||
m_m68k_write8_bios:
|
||||
m_m68k_write8_bcram_size: @ 0x400000
|
||||
bx lr
|
||||
|
||||
|
||||
|
@ -986,6 +1083,33 @@ m_m68k_write8_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
|
|||
bx lr
|
||||
|
||||
|
||||
m_m68k_write8_bcram: @ 0x600000 - 0x61ffff
|
||||
@ can't use r3 or r12, because of write32
|
||||
ldr r2, =SRam
|
||||
bic r0, r0, #0xfe0000
|
||||
ldr r2, [r2]
|
||||
tst r2, r2
|
||||
bxeq lr
|
||||
add r0, r2, r0, lsr #1
|
||||
ldr r2, =(Pico+0x22200)
|
||||
ldr r2, [r2]
|
||||
add r0, r0, #0x2000
|
||||
add r2, r2, #0x110000
|
||||
add r2, r2, #0x002200
|
||||
ldr r2, [r2, #0x18]
|
||||
tst r2, #1 @ check bcram reg
|
||||
bxeq lr
|
||||
strb r1, [r0]
|
||||
ldr r2, =SRam
|
||||
mov r0, #1
|
||||
strb r0, [r2, #0x0e] @ SRam.changed = 1
|
||||
bx lr
|
||||
|
||||
|
||||
m_m68k_write8_bcram_reg: @ 0x7fffff
|
||||
bcram_reg_rw 0, 0x7fffff
|
||||
|
||||
|
||||
m_m68k_write8_system_io:
|
||||
bic r2, r0, #0xfe0000
|
||||
bic r2, r2, #0x3f
|
||||
|
@ -1020,6 +1144,7 @@ m_m68k_write8_ram:
|
|||
|
||||
|
||||
m_m68k_write16_bios:
|
||||
m_m68k_write16_bcram_size: @ 0x400000
|
||||
bx lr
|
||||
|
||||
|
||||
|
@ -1091,6 +1216,14 @@ m_m68k_write16_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
|
|||
bx lr
|
||||
|
||||
|
||||
@ m_m68k_write16_bcram: @ 0x600000 - 0x61ffff
|
||||
.equiv m_m68k_write16_bcram, m_m68k_write8_bcram
|
||||
|
||||
|
||||
m_m68k_write16_bcram_reg: @ 0x7fffff
|
||||
bcram_reg_rw 0, 0x7ffffe
|
||||
|
||||
|
||||
m_m68k_write16_system_io:
|
||||
bic r0, r0, #1
|
||||
bic r2, r0, #0xfe0000
|
||||
|
@ -1098,7 +1231,7 @@ m_m68k_write16_system_io:
|
|||
cmp r2, #0x012000
|
||||
bne OtherWrite16
|
||||
|
||||
m_m68k_write16_m68k_regs:
|
||||
m_m68k_write16_regs:
|
||||
and r0, r0, #0x3e
|
||||
cmp r0, #0x0e
|
||||
beq m_m68k_write16_regs_spec
|
||||
|
@ -1153,6 +1286,7 @@ m_m68k_write16_ram:
|
|||
|
||||
|
||||
m_m68k_write32_bios:
|
||||
m_m68k_write32_bcram_size: @ 0x400000
|
||||
bx lr
|
||||
|
||||
|
||||
|
@ -1248,6 +1382,22 @@ m_m68k_write32_wordram1_1M_b1_unal:
|
|||
b m_m68k_write16_wordram1_1M_b1
|
||||
|
||||
|
||||
m_m68k_write32_bcram: @ 0x600000 - 0x61ffff, not likely to be called
|
||||
mov r12,lr
|
||||
add r3, r0, #2
|
||||
mov r1, r1, ror #16
|
||||
bl m_m68k_write8_bcram
|
||||
mov r0, r3
|
||||
mov r1, r1, ror #16
|
||||
bl m_m68k_write8_bcram
|
||||
bx r12
|
||||
|
||||
|
||||
m_m68k_write32_bcram_reg: @ 0x7fffff
|
||||
bcram_reg_rw 0, 0x7ffffc
|
||||
|
||||
|
||||
|
||||
@ it is not very practical to use long access on hw registers, so I assume it is not used too much.
|
||||
m_m68k_write32_system_io:
|
||||
bic r2, r0, #0xfe0000
|
||||
|
@ -1255,26 +1405,13 @@ m_m68k_write32_system_io:
|
|||
cmp r2, #0x012000
|
||||
bne m_m68k_write32_misc
|
||||
and r2, r0, #0x3e
|
||||
cmp r2, #0x10
|
||||
blt m_m68k_write32_regs
|
||||
cmp r2, #0x20
|
||||
bxge lr
|
||||
@ Handle the 0x10-0x1f range
|
||||
ldr r0, =(Pico+0x22200)
|
||||
mov r3, #0xff
|
||||
ldr r0, [r0]
|
||||
orr r3, r3, r3, lsl #16
|
||||
add r0, r0, #0x110000
|
||||
and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap
|
||||
and r1, r3, r1, ror #24
|
||||
orr r1, r1, r12,lsl #8 @ end of byteswap
|
||||
strh r1, [r2, r0]!
|
||||
cmp r2, #0x1e
|
||||
movne r1, r1, lsr #16
|
||||
strneh r1, [r2, #2]
|
||||
bx lr
|
||||
cmp r2, #0x10
|
||||
bge m_m68k_write32_regs_comm
|
||||
cmp r2, #0x0c
|
||||
bge m_m68k_write32_regs_spec @ hits the nasty comm reg qiurk
|
||||
|
||||
m_m68k_write32_regs:
|
||||
bic r0, r0, #1
|
||||
stmfd sp!,{r0,r1,lr}
|
||||
mov r1, r1, lsr #24
|
||||
|
@ -1293,6 +1430,29 @@ m_m68k_write32_regs:
|
|||
add r0, r0, #3
|
||||
b m68k_reg_write8
|
||||
|
||||
m_m68k_write32_regs_comm: @ Handle the 0x10-0x1f range
|
||||
ldr r0, =(Pico+0x22200)
|
||||
mov r3, #0xff
|
||||
ldr r0, [r0]
|
||||
orr r3, r3, r3, lsl #16
|
||||
add r0, r0, #0x110000
|
||||
and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap
|
||||
and r1, r3, r1, ror #24
|
||||
orr r1, r1, r12,lsl #8 @ end of byteswap
|
||||
cmp r2, #0x1e
|
||||
strh r1, [r2, r0]!
|
||||
ldr r3, =s68k_poll_adclk
|
||||
ldr r0, [r3]
|
||||
movne r1, r1, lsr #16
|
||||
strneh r1, [r2, #2]
|
||||
cmp r0, #0x10
|
||||
bxlt lr
|
||||
ldr r0, =PicoCpuS68k @ remove poll detected state for s68k
|
||||
mov r1, #0
|
||||
str r1, [r0, #0x58]
|
||||
str r1, [r3]
|
||||
bx lr
|
||||
|
||||
m_m68k_write32_misc:
|
||||
bic r0, r0, #1
|
||||
stmfd sp!,{r0,r1,lr}
|
||||
|
@ -1302,6 +1462,15 @@ m_m68k_write32_misc:
|
|||
add r0, r0, #2
|
||||
b OtherWrite16
|
||||
|
||||
m_m68k_write32_regs_spec:
|
||||
bic r0, r0, #1
|
||||
stmfd sp!,{r0,r1,lr}
|
||||
mov r1, r1, lsr #16
|
||||
bl m_m68k_write16_regs
|
||||
ldmfd sp!,{r0,r1,lr}
|
||||
add r0, r0, #2
|
||||
b m_m68k_write16_regs
|
||||
|
||||
|
||||
m_m68k_write32_vdp:
|
||||
tst r0, #0x70000
|
||||
|
@ -2123,12 +2292,11 @@ m_s68k_write32_pcm_ram:
|
|||
|
||||
m_s68k_write32_pcm_reg:
|
||||
mov r0, r0, lsr #1
|
||||
add r2, r0, #1
|
||||
mov r3, r1
|
||||
stmfd sp!,{r2,r3,lr}
|
||||
stmfd sp!,{r0,r1,lr}
|
||||
mov r1, r1, lsr #16
|
||||
bl pcm_write
|
||||
ldmfd sp!,{r0,r1,lr}
|
||||
add r0, r0, #1
|
||||
b pcm_write
|
||||
|
||||
|
||||
|
@ -2137,11 +2305,16 @@ m_s68k_write32_regs:
|
|||
bic r0, r0, #0x008000
|
||||
bic r0, r0, #1
|
||||
tst r0, #0x7e00
|
||||
movne r0, #0
|
||||
bxne lr
|
||||
sub r2, r0, #0x58
|
||||
cmp r2, #0x10
|
||||
blo m_s68k_write32_regs_gfx
|
||||
and r2, r0, #0x1fc
|
||||
cmp r2, #0x0c
|
||||
beq m_s68k_write32_regs_spec @ hits 0x0f
|
||||
and r2, r0, #0x1f0
|
||||
cmp r2, #0x20
|
||||
beq m_s68k_write32_regs_comm
|
||||
|
||||
stmfd sp!,{r0,r1,lr}
|
||||
mov r1, r1, lsr #24
|
||||
|
@ -2161,11 +2334,34 @@ m_s68k_write32_regs:
|
|||
b s68k_reg_write8
|
||||
|
||||
m_s68k_write32_regs_gfx:
|
||||
mov r3, r1
|
||||
add r2, r0, #2
|
||||
stmfd sp!,{r2,r3,lr}
|
||||
stmfd sp!,{r0,r1,lr}
|
||||
mov r1, r1, lsr #16
|
||||
bl gfx_cd_write16
|
||||
ldmfd sp!,{r0,r1,lr}
|
||||
add r0, r0, #2
|
||||
b gfx_cd_write16
|
||||
|
||||
m_s68k_write32_regs_comm: @ Handle the 0x20-0x2f range
|
||||
ldr r2, =(Pico+0x22200)
|
||||
mov r3, #0xff
|
||||
ldr r2, [r2]
|
||||
orr r3, r3, r3, lsl #16
|
||||
add r2, r2, #0x110000
|
||||
and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap
|
||||
and r1, r3, r1, ror #24
|
||||
orr r1, r1, r12,lsl #8 @ end of byteswap
|
||||
cmp r0, #0x2e
|
||||
strh r1, [r0, r2]!
|
||||
movne r1, r1, lsr #16
|
||||
strneh r1, [r0, #2]
|
||||
bx lr
|
||||
|
||||
m_s68k_write32_regs_spec:
|
||||
stmfd sp!,{r0,r1,lr}
|
||||
mov r1, r1, lsr #16
|
||||
bl m_s68k_write16_regs
|
||||
ldmfd sp!,{r0,r1,lr}
|
||||
add r0, r0, #2
|
||||
b m_s68k_write16_regs
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue