mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-10-27 00:29:39 -04:00
split memories away from Pico
saves ~3k of code on ARM because Pico no longer crosses ldr limit
This commit is contained in:
parent
e64886365d
commit
88fd63ad10
30 changed files with 633 additions and 587 deletions
707
pico/cd/memory_arm.S
Normal file
707
pico/cd/memory_arm.S
Normal file
|
|
@ -0,0 +1,707 @@
|
|||
@*
|
||||
@* Memory I/O handlers for Sega/Mega CD emulation
|
||||
@* (C) notaz, 2007-2009
|
||||
@*
|
||||
@* This work is licensed under the terms of MAME license.
|
||||
@* See COPYING file in the top-level directory.
|
||||
@*
|
||||
|
||||
#include "../pico_int_o32.h"
|
||||
|
||||
.equiv PCM_STEP_SHIFT, 11
|
||||
|
||||
.text
|
||||
.align 2
|
||||
|
||||
.global PicoRead8_mcd_io
|
||||
.global PicoRead16_mcd_io
|
||||
.global PicoWrite8_mcd_io
|
||||
.global PicoWrite16_mcd_io
|
||||
|
||||
.global PicoReadS68k8_pr
|
||||
.global PicoReadS68k16_pr
|
||||
.global PicoWriteS68k8_pr
|
||||
.global PicoWriteS68k16_pr
|
||||
|
||||
.global PicoReadM68k8_cell0
|
||||
.global PicoReadM68k8_cell1
|
||||
.global PicoReadM68k16_cell0
|
||||
.global PicoReadM68k16_cell1
|
||||
.global PicoWriteM68k8_cell0
|
||||
.global PicoWriteM68k8_cell1
|
||||
.global PicoWriteM68k16_cell0
|
||||
.global PicoWriteM68k16_cell1
|
||||
|
||||
.global PicoReadS68k8_dec0
|
||||
.global PicoReadS68k8_dec1
|
||||
.global PicoReadS68k16_dec0
|
||||
.global PicoReadS68k16_dec1
|
||||
.global PicoWriteS68k8_dec_m0b0
|
||||
.global PicoWriteS68k8_dec_m1b0
|
||||
.global PicoWriteS68k8_dec_m2b0
|
||||
.global PicoWriteS68k8_dec_m0b1
|
||||
.global PicoWriteS68k8_dec_m1b1
|
||||
.global PicoWriteS68k8_dec_m2b1
|
||||
.global PicoWriteS68k16_dec_m0b0
|
||||
.global PicoWriteS68k16_dec_m1b0
|
||||
.global PicoWriteS68k16_dec_m2b0
|
||||
.global PicoWriteS68k16_dec_m0b1
|
||||
.global PicoWriteS68k16_dec_m1b1
|
||||
.global PicoWriteS68k16_dec_m2b1
|
||||
|
||||
@ externs, just for reference
|
||||
.extern Pico
|
||||
.extern cdc_host_r
|
||||
.extern m68k_reg_write8
|
||||
.extern s68k_reg_read16
|
||||
.extern s68k_reg_write8
|
||||
.extern s68k_reg_write16
|
||||
.extern s68k_poll_detect
|
||||
.extern pcd_pcm_write
|
||||
.extern pcd_pcm_read
|
||||
.extern PicoCpuCS68k
|
||||
.extern PicoRead8_io
|
||||
.extern PicoRead16_io
|
||||
.extern PicoWrite8_io
|
||||
.extern PicoWrite16_io
|
||||
.extern m68k_comm_check
|
||||
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
@ utilities
|
||||
|
||||
@ r0=addr[in,out], r1,r2=tmp
|
||||
.macro cell_map
|
||||
ands r1, r0, #0x01c000
|
||||
ldrne pc, [pc, r1, lsr #12]
|
||||
beq 0f @ most common?
|
||||
.long 0f
|
||||
.long 0f
|
||||
.long 0f
|
||||
.long 0f
|
||||
.long 1f
|
||||
.long 1f
|
||||
.long 2f
|
||||
.long 3f
|
||||
1: @ x16 cells
|
||||
and r1, r0, #0x7e00 @ col
|
||||
and r2, r0, #0x01fc @ row
|
||||
orr r2, r2, #0x0400
|
||||
orr r1, r2, r1, ror #13
|
||||
b 9f
|
||||
2: @ x8 cells
|
||||
and r1, r0, #0x3f00 @ col
|
||||
and r2, r0, #0x00fc @ row
|
||||
orr r2, r2, #0x0600
|
||||
orr r1, r2, r1, ror #12
|
||||
b 9f
|
||||
3: @ x4 cells
|
||||
and r1, r0, #0x1f80 @ col
|
||||
and r2, r0, #0x007c @ row
|
||||
orr r1, r2, r1, ror #11
|
||||
and r2, r0,#0x1e000
|
||||
orr r1, r1, r2, lsr #6
|
||||
b 9f
|
||||
0: @ x32 cells
|
||||
and r1, r0, #0xfc00 @ col
|
||||
and r2, r0, #0x03fc @ row
|
||||
orr r1, r2, r1, ror #14
|
||||
9:
|
||||
and r0, r0, #3
|
||||
orr r0, r0, r1, ror #26 @ rol 4+2
|
||||
.endm
|
||||
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
m_read_null:
|
||||
mov r0, #0
|
||||
bx lr
|
||||
|
||||
|
||||
PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
|
||||
mov r3, #0x0c0000
|
||||
b 0f
|
||||
|
||||
PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
|
||||
mov r3, #0x0e0000
|
||||
0:
|
||||
cell_map
|
||||
ldr r1, =Pico
|
||||
add r0, r0, r3
|
||||
ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd (used everywhere)
|
||||
eor r0, r0, #1
|
||||
ldrb r0, [r1, r0]
|
||||
bx lr
|
||||
|
||||
|
||||
PicoRead8_mcd_io:
|
||||
and r1, r0, #0xff00
|
||||
cmp r1, #0x2000 @ a120xx?
|
||||
bne PicoRead8_io
|
||||
|
||||
ldr r1, =Pico
|
||||
and r0, r0, #0x3f
|
||||
ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
|
||||
cmp r0, #0x0e
|
||||
ldrlt pc, [pc, r0, lsl #2]
|
||||
b m_m68k_read8_hi
|
||||
.long m_m68k_read8_r00
|
||||
.long m_m68k_read8_r01
|
||||
.long m_m68k_read8_r02
|
||||
.long m_m68k_read8_r03
|
||||
.long m_m68k_read8_r04
|
||||
.long m_read_null @ unused bits
|
||||
.long m_m68k_read8_r06
|
||||
.long m_m68k_read8_r07
|
||||
.long m_m68k_read8_r08
|
||||
.long m_m68k_read8_r09
|
||||
.long m_read_null @ reserved
|
||||
.long m_read_null
|
||||
.long m_m68k_read8_r0c
|
||||
.long m_m68k_read8_r0d
|
||||
m_m68k_read8_r00:
|
||||
add r1, r1, #0x110000
|
||||
ldr r0, [r1, #0x30]
|
||||
and r0, r0, #0x04000000 @ we need irq2 mask state
|
||||
mov r0, r0, lsr #19
|
||||
bx lr
|
||||
m_m68k_read8_r01:
|
||||
add r1, r1, #0x110000
|
||||
add r1, r1, #0x002200
|
||||
ldrb r0, [r1, #2] @ Pico_mcd->m.busreq
|
||||
bx lr
|
||||
m_m68k_read8_r02:
|
||||
add r1, r1, #0x110000
|
||||
ldrb r0, [r1, #2]
|
||||
bx lr
|
||||
m_m68k_read8_r03:
|
||||
add r1, r1, #0x110000
|
||||
push {r1, lr}
|
||||
bl m68k_comm_check
|
||||
pop {r1, lr}
|
||||
ldrb r0, [r1, #3]
|
||||
and r0, r0, #0xc7
|
||||
bx lr
|
||||
m_m68k_read8_r04:
|
||||
add r1, r1, #0x110000
|
||||
ldrb r0, [r1, #4]
|
||||
bx lr
|
||||
m_m68k_read8_r06:
|
||||
ldrb r0, [r1, #0x73] @ IRQ vector
|
||||
bx lr
|
||||
m_m68k_read8_r07:
|
||||
ldrb r0, [r1, #0x72]
|
||||
bx lr
|
||||
m_m68k_read8_r08:
|
||||
mov r0, #0
|
||||
bl cdc_host_r
|
||||
mov r0, r0, lsr #8
|
||||
bx lr
|
||||
m_m68k_read8_r09:
|
||||
mov r0, #0
|
||||
b cdc_host_r
|
||||
m_m68k_read8_r0c:
|
||||
add r1, r1, #0x110000
|
||||
add r1, r1, #0x002200
|
||||
ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch
|
||||
mov r0, r0, lsr #24
|
||||
bx lr
|
||||
m_m68k_read8_r0d:
|
||||
add r1, r1, #0x110000
|
||||
add r1, r1, #0x002200
|
||||
ldr r0, [r1, #0x14]
|
||||
mov r0, r0, lsr #16
|
||||
bx lr
|
||||
m_m68k_read8_hi:
|
||||
cmp r0, #0x30
|
||||
add r1, r1, #0x110000
|
||||
movge r0, #0
|
||||
bxge lr
|
||||
add r1, r0
|
||||
push {r1, lr}
|
||||
bl m68k_comm_check
|
||||
pop {r1, lr}
|
||||
ldrb r0, [r1]
|
||||
bx lr
|
||||
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
|
||||
mov r3, #0x0c0000
|
||||
b 0f
|
||||
|
||||
PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
|
||||
mov r3, #0x0e0000
|
||||
0:
|
||||
cell_map
|
||||
ldr r1, =Pico
|
||||
add r0, r0, r3
|
||||
ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
|
||||
bic r0, r0, #1
|
||||
ldrh r0, [r1, r0]
|
||||
bx lr
|
||||
|
||||
|
||||
PicoRead16_mcd_io:
|
||||
and r1, r0, #0xff00
|
||||
cmp r1, #0x2000 @ a120xx
|
||||
bne PicoRead16_io
|
||||
|
||||
m_m68k_read16_m68k_regs:
|
||||
ldr r1, =Pico
|
||||
and r0, r0, #0x3e
|
||||
ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
|
||||
cmp r0, #0x0e
|
||||
ldrlt pc, [pc, r0, lsl #1]
|
||||
b m_m68k_read16_hi
|
||||
.long m_m68k_read16_r00
|
||||
.long m_m68k_read16_r02
|
||||
.long m_m68k_read16_r04
|
||||
.long m_m68k_read16_r06
|
||||
.long m_m68k_read16_r08
|
||||
.long m_read_null @ reserved
|
||||
.long m_m68k_read16_r0c
|
||||
m_m68k_read16_r00:
|
||||
add r1, r1, #0x110000
|
||||
ldr r0, [r1, #0x30]
|
||||
add r1, r1, #0x002200
|
||||
ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
|
||||
and r0, r0, #0x04000000 @ we need irq2 mask state
|
||||
orr r0, r1, r0, lsr #11
|
||||
bx lr
|
||||
m_m68k_read16_r02:
|
||||
add r1, r1, #0x110000
|
||||
push {r1, lr}
|
||||
bl m68k_comm_check
|
||||
pop {r1, lr}
|
||||
ldrb r2, [r1, #3]
|
||||
ldrb r0, [r1, #2]
|
||||
and r2, r2, #0xc7
|
||||
orr r0, r2, r0, lsl #8
|
||||
bx lr
|
||||
m_m68k_read16_r04:
|
||||
add r1, r1, #0x110000
|
||||
ldrb r0, [r1, #4]
|
||||
mov r0, r0, lsl #8
|
||||
bx lr
|
||||
m_m68k_read16_r06:
|
||||
ldrh r0, [r1, #0x72] @ IRQ vector
|
||||
bx lr
|
||||
m_m68k_read16_r08:
|
||||
mov r0, #0
|
||||
b cdc_host_r
|
||||
m_m68k_read16_r0c:
|
||||
add r1, r1, #0x110000
|
||||
add r1, r1, #0x002200
|
||||
ldr r0, [r1, #0x14]
|
||||
mov r0, r0, lsr #16
|
||||
bx lr
|
||||
m_m68k_read16_hi:
|
||||
cmp r0, #0x30
|
||||
add r1, r1, #0x110000
|
||||
movge r0, #0
|
||||
bxge lr
|
||||
|
||||
add r1, r0, r1
|
||||
push {r1, lr}
|
||||
bl m68k_comm_check
|
||||
pop {r0, lr}
|
||||
ldrh r0, [r0]
|
||||
mov r1, r0, lsr #8
|
||||
and r0, r0, #0xff
|
||||
orr r0, r1, r0, lsl #8
|
||||
bx lr
|
||||
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
|
||||
mov r12,#0x0c0000
|
||||
b 0f
|
||||
|
||||
PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
|
||||
mov r12,#0x0e0000
|
||||
0:
|
||||
mov r3, r1
|
||||
cell_map
|
||||
ldr r2, =Pico
|
||||
add r0, r0, r12
|
||||
ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
|
||||
ldr r2, [r2]
|
||||
eor r0, r0, #1
|
||||
strb r3, [r2, r0]
|
||||
bx lr
|
||||
|
||||
|
||||
PicoWrite8_mcd_io:
|
||||
and r2, r0, #0xff00
|
||||
cmp r2, #0x2000 @ a120xx?
|
||||
beq m68k_reg_write8
|
||||
b PicoWrite8_io
|
||||
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
|
||||
mov r12, #0x0c0000
|
||||
b 0f
|
||||
|
||||
PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
|
||||
mov r12, #0x0e0000
|
||||
0:
|
||||
mov r3, r1
|
||||
cell_map
|
||||
ldr r1, =Pico
|
||||
add r0, r0, r12
|
||||
ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
|
||||
bic r0, r0, #1
|
||||
strh r3, [r1, r0]
|
||||
bx lr
|
||||
|
||||
|
||||
PicoWrite16_mcd_io:
|
||||
and r2, r0, #0xff00
|
||||
cmp r2, #0x2000 @ a120xx?
|
||||
bne PicoWrite16_io
|
||||
|
||||
m_m68k_write16_regs:
|
||||
and r0, r0, #0x3e
|
||||
cmp r0, #0x0e
|
||||
beq m_m68k_write16_regs_spec
|
||||
and r3, r1, #0xff
|
||||
add r2, r0, #1
|
||||
stmfd sp!,{r2,r3,lr}
|
||||
mov r1, r1, lsr #8
|
||||
bl m68k_reg_write8
|
||||
ldmfd sp!,{r0,r1,lr}
|
||||
b m68k_reg_write8
|
||||
|
||||
m_m68k_write16_regs_spec: @ special case
|
||||
mov r1, r1, lsr #8
|
||||
b m68k_reg_write8
|
||||
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
@ Sub 68k
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
|
||||
mov r3, #0x080000 @ + ^ / 2
|
||||
b 0f
|
||||
|
||||
PicoReadS68k8_dec1:
|
||||
mov r3, #0x0a0000 @ + ^ / 2
|
||||
0:
|
||||
ldr r2, =Pico
|
||||
eor r0, r0, #2
|
||||
ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
|
||||
movs r0, r0, lsr #1 @ +4-6 <<16
|
||||
add r2, r2, r3 @ map to our address
|
||||
ldrb r0, [r2, r0]
|
||||
movcc r0, r0, lsr #4
|
||||
andcs r0, r0, #0xf
|
||||
bx lr
|
||||
|
||||
|
||||
PicoReadS68k8_pr:
|
||||
and r2, r0, #0xfe00
|
||||
cmp r2, #0x8000
|
||||
bne m_s68k_read8_pcm
|
||||
|
||||
m_s68k_read8_regs:
|
||||
bic r0, r0, #0xff0000
|
||||
bic r0, r0, #0x008000
|
||||
sub r2, r0, #0x0e
|
||||
cmp r2, #(0x30-0x0e)
|
||||
blo m_s68k_read8_comm
|
||||
stmfd sp!,{r0,lr}
|
||||
bic r0, r0, #1
|
||||
bl s68k_reg_read16
|
||||
ldmfd sp!,{r1,lr}
|
||||
tst r1, #1
|
||||
moveq r0, r0, lsr #8
|
||||
and r0, r0, #0xff
|
||||
bx lr
|
||||
|
||||
m_s68k_read8_comm:
|
||||
ldr r1, =Pico
|
||||
ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
|
||||
add r1, r1, #0x110000
|
||||
ldrb r1, [r1, r0]
|
||||
bic r0, r0, #1
|
||||
b s68k_poll_detect
|
||||
|
||||
|
||||
m_s68k_read8_pcm:
|
||||
tst r0, #0x8000
|
||||
bne m_read_null
|
||||
|
||||
@ must not trash r3 and r12
|
||||
ldr r1, =Pico
|
||||
bic r0, r0, #0xff0000
|
||||
ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
|
||||
mov r2, #0x110000
|
||||
orr r2, r2, #0x002200
|
||||
cmp r0, #0x2000
|
||||
bge m_s68k_read8_pcm_ram
|
||||
cmp r0, #0x20
|
||||
movge r0, r0, lsr #1
|
||||
bge pcd_pcm_read
|
||||
mov r0, #0
|
||||
bx lr
|
||||
|
||||
m_s68k_read8_pcm_ram:
|
||||
orr r2, r2, #0x40
|
||||
ldr r2, [r1, r2]
|
||||
add r1, r1, #0x100000 @ pcm_ram
|
||||
and r2, r2, #0x0f000000 @ bank
|
||||
add r1, r1, r2, lsr #12
|
||||
bic r0, r0, #0x00e000
|
||||
mov r0, r0, lsr #1
|
||||
ldrb r0, [r1, r0]
|
||||
bx lr
|
||||
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
|
||||
mov r3, #0x080000 @ + ^ / 2
|
||||
b 0f
|
||||
|
||||
PicoReadS68k16_dec1:
|
||||
mov r3, #0x0a0000 @ + ^ / 2
|
||||
0:
|
||||
ldr r2, =Pico
|
||||
eor r0, r0, #2
|
||||
ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
|
||||
mov r0, r0, lsr #1 @ +4-6 <<16
|
||||
add r2, r2, r3 @ map to our address
|
||||
ldrb r0, [r2, r0]
|
||||
orr r0, r0, r0, lsl #4
|
||||
bic r0, r0, #0xf0
|
||||
bx lr
|
||||
|
||||
|
||||
PicoReadS68k16_pr:
|
||||
and r2, r0, #0xfe00
|
||||
cmp r2, #0x8000
|
||||
@ pcm is on 8-bit bus, would this be same as byte access?
|
||||
bne m_s68k_read8_pcm
|
||||
|
||||
m_s68k_read16_regs:
|
||||
bic r0, r0, #0xff0000
|
||||
bic r0, r0, #0x008000
|
||||
bic r0, r0, #0x000001
|
||||
cmp r0, #8
|
||||
bne s68k_reg_read16
|
||||
mov r0, #1
|
||||
b cdc_host_r
|
||||
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
.macro m_s68k_write8_2M_decode
|
||||
ldr r2, =Pico
|
||||
eor r0, r0, #2
|
||||
ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
|
||||
movs r0, r0, lsr #1 @ +4-6 <<16
|
||||
add r2, r2, r3 @ map to our address
|
||||
.endm
|
||||
|
||||
PicoWriteS68k8_dec_m2b0: @ overwrite
|
||||
ands r1, r1, #0x0f
|
||||
bxeq lr
|
||||
|
||||
PicoWriteS68k8_dec_m0b0:
|
||||
mov r3, #0x080000
|
||||
b 0f
|
||||
|
||||
PicoWriteS68k8_dec_m2b1: @ overwrite
|
||||
ands r1, r1, #0x0f
|
||||
bxeq lr
|
||||
|
||||
PicoWriteS68k8_dec_m0b1:
|
||||
mov r3, #0x0a0000
|
||||
0:
|
||||
m_s68k_write8_2M_decode
|
||||
ldrb r0, [r2, r0]!
|
||||
and r1, r1, #0x0f
|
||||
movcc r1, r1, lsl #4
|
||||
andcc r3, r0, #0x0f
|
||||
andcs r3, r0, #0xf0
|
||||
orr r3, r3, r1
|
||||
strneb r3, [r2]
|
||||
bx lr
|
||||
|
||||
PicoWriteS68k8_dec_m1b0: @ underwrite
|
||||
mov r3, #0x080000
|
||||
b 0f
|
||||
|
||||
PicoWriteS68k8_dec_m1b1:
|
||||
mov r3, #0x0a0000
|
||||
0:
|
||||
ands r1, r1, #0x0f
|
||||
bxeq lr
|
||||
m_s68k_write8_2M_decode
|
||||
ldrb r0, [r2, r0]!
|
||||
movcc r1, r1, lsl #4
|
||||
andcc r3, r0, #0x0f
|
||||
andcs r3, r0, #0xf0
|
||||
teq r3, r0
|
||||
bxne lr
|
||||
orr r3, r3, r1
|
||||
strneb r3, [r2]
|
||||
bx lr
|
||||
|
||||
|
||||
PicoWriteS68k8_pr:
|
||||
and r2, r0, #0xfe00
|
||||
cmp r2, #0x8000
|
||||
bne m_s68k_write8_pcm
|
||||
|
||||
m_s68k_write8_regs:
|
||||
bic r0, r0, #0xff0000
|
||||
bic r0, r0, #0x008000
|
||||
tst r0, #0x7e00
|
||||
movne r0, #0
|
||||
bxne lr
|
||||
sub r2, r0, #0x59
|
||||
cmp r2, #0x0f
|
||||
bhs s68k_reg_write8
|
||||
bic r0, r0, #1
|
||||
orr r1, r1, r1, lsl #8
|
||||
b s68k_reg_write16
|
||||
|
||||
|
||||
m_s68k_write8_pcm:
|
||||
tst r0, #0x8000
|
||||
bxne lr
|
||||
bic r0, r0, #0xff0000
|
||||
cmp r0, #0x12
|
||||
movlt r0, r0, lsr #1
|
||||
blt pcd_pcm_write
|
||||
|
||||
cmp r0, #0x2000
|
||||
bxlt lr
|
||||
|
||||
m_s68k_write8_pcm_ram:
|
||||
ldr r3, =Pico
|
||||
bic r0, r0, #0x00e000
|
||||
ldr r3, [r3, #OFS_Pico_rom] @ Pico.mcd
|
||||
mov r0, r0, lsr #1
|
||||
add r2, r3, #0x110000
|
||||
add r2, r2, #0x002200
|
||||
add r2, r2, #0x000040
|
||||
ldr r2, [r2]
|
||||
add r3, r3, #0x100000 @ pcm_ram
|
||||
and r2, r2, #0x0f000000 @ bank
|
||||
add r3, r3, r2, lsr #12
|
||||
strb r1, [r3, r0]
|
||||
bx lr
|
||||
|
||||
|
||||
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
.macro m_s68k_write16_2M_decode
|
||||
ldr r2, =Pico
|
||||
eor r0, r0, #2
|
||||
ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
|
||||
mov r0, r0, lsr #1 @ +4-6 <<16
|
||||
add r2, r2, r3 @ map to our address
|
||||
.endm
|
||||
|
||||
PicoWriteS68k16_dec_m0b0:
|
||||
mov r3, #0x080000
|
||||
b 0f
|
||||
|
||||
PicoWriteS68k16_dec_m0b1:
|
||||
mov r3, #0x0a0000
|
||||
0:
|
||||
m_s68k_write16_2M_decode
|
||||
bic r1, r1, #0xf0
|
||||
orr r1, r1, r1, lsr #4
|
||||
strb r1, [r2, r0]
|
||||
bx lr
|
||||
|
||||
PicoWriteS68k16_dec_m1b0: @ underwrite
|
||||
mov r3, #0x080000
|
||||
b 0f
|
||||
|
||||
PicoWriteS68k16_dec_m1b1:
|
||||
mov r3, #0x0a0000
|
||||
0:
|
||||
bics r1, r1, #0xf000
|
||||
bicnes r1, r1, #0x00f0
|
||||
bxeq lr
|
||||
orr r1, r1, r1, lsr #4
|
||||
m_s68k_write16_2M_decode
|
||||
ldrb r0, [r2, r0]!
|
||||
and r3, r1, #0x0f
|
||||
and r1, r1, #0xf0
|
||||
tst r0, #0x0f
|
||||
orreq r0, r0, r3
|
||||
tst r0, #0xf0
|
||||
orreq r0, r0, r1
|
||||
strb r0, [r2]
|
||||
bx lr
|
||||
|
||||
PicoWriteS68k16_dec_m2b0: @ overwrite
|
||||
mov r3, #0x080000
|
||||
b 0f
|
||||
|
||||
PicoWriteS68k16_dec_m2b1:
|
||||
mov r3, #0x0a0000
|
||||
0:
|
||||
bics r1, r1, #0xf000
|
||||
bicnes r1, r1, #0x00f0
|
||||
bxeq lr
|
||||
orr r1, r1, r1, lsr #4
|
||||
m_s68k_write16_2M_decode
|
||||
ldrb r0, [r2, r0]!
|
||||
ands r3, r1, #0x0f
|
||||
andne r0, r0, #0xf0
|
||||
orrne r0, r0, r3
|
||||
ands r1, r1, #0xf0
|
||||
andne r0, r0, #0x0f
|
||||
orrne r0, r0, r1
|
||||
strb r0, [r2]
|
||||
bx lr
|
||||
|
||||
|
||||
PicoWriteS68k16_pr:
|
||||
and r2, r0, #0xfe00
|
||||
cmp r2, #0x8000
|
||||
bne m_s68k_write8_pcm
|
||||
|
||||
m_s68k_write16_regs:
|
||||
bic r0, r0, #0xff0000
|
||||
bic r0, r0, #0x008000
|
||||
bic r0, r0, #1
|
||||
tst r0, #0x7e00
|
||||
movne r0, #0
|
||||
bxne lr
|
||||
cmp r0, #0x0e
|
||||
bne s68k_reg_write16
|
||||
|
||||
m_s68k_write16_regs_spec: @ special case
|
||||
ldr r2, =Pico
|
||||
mov r0, #0x110000
|
||||
ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
|
||||
add r0, r0, #0x00000f
|
||||
strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
|
||||
bx lr
|
||||
|
||||
.pool
|
||||
|
||||
@ vim:filetype=armasm
|
||||
Loading…
Add table
Add a link
Reference in a new issue