mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
arm asm memory access functions for m/s68k
This commit is contained in:
parent
e0396782f3
commit
78d817c370
4 changed files with 205 additions and 9 deletions
|
@ -14,12 +14,14 @@ uptr s68k_read16_map [0x1000000 >> M68K_MEM_SHIFT];
|
||||||
uptr s68k_write8_map [0x1000000 >> M68K_MEM_SHIFT];
|
uptr s68k_write8_map [0x1000000 >> M68K_MEM_SHIFT];
|
||||||
uptr s68k_write16_map[0x1000000 >> M68K_MEM_SHIFT];
|
uptr s68k_write16_map[0x1000000 >> M68K_MEM_SHIFT];
|
||||||
|
|
||||||
|
#ifndef _ASM_CD_MEMORY_C
|
||||||
MAKE_68K_READ8(s68k_read8, s68k_read8_map)
|
MAKE_68K_READ8(s68k_read8, s68k_read8_map)
|
||||||
MAKE_68K_READ16(s68k_read16, s68k_read16_map)
|
MAKE_68K_READ16(s68k_read16, s68k_read16_map)
|
||||||
MAKE_68K_READ32(s68k_read32, s68k_read16_map)
|
MAKE_68K_READ32(s68k_read32, s68k_read16_map)
|
||||||
MAKE_68K_WRITE8(s68k_write8, s68k_write8_map)
|
MAKE_68K_WRITE8(s68k_write8, s68k_write8_map)
|
||||||
MAKE_68K_WRITE16(s68k_write16, s68k_write16_map)
|
MAKE_68K_WRITE16(s68k_write16, s68k_write16_map)
|
||||||
MAKE_68K_WRITE32(s68k_write32, s68k_write16_map)
|
MAKE_68K_WRITE32(s68k_write32, s68k_write16_map)
|
||||||
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -178,9 +178,9 @@ m_m68k_read8_r02:
|
||||||
bx lr
|
bx lr
|
||||||
m_m68k_read8_r03:
|
m_m68k_read8_r03:
|
||||||
add r1, r1, #0x110000
|
add r1, r1, #0x110000
|
||||||
push {r1, lr}
|
stmfd sp!, {r1, lr}
|
||||||
bl m68k_comm_check
|
bl m68k_comm_check
|
||||||
pop {r1, lr}
|
ldmfd sp!, {r1, lr}
|
||||||
ldrb r0, [r1, #3]
|
ldrb r0, [r1, #3]
|
||||||
and r0, r0, #0xc7
|
and r0, r0, #0xc7
|
||||||
bx lr
|
bx lr
|
||||||
|
@ -219,10 +219,10 @@ m_m68k_read8_hi:
|
||||||
add r1, r1, #0x110000
|
add r1, r1, #0x110000
|
||||||
movge r0, #0
|
movge r0, #0
|
||||||
bxge lr
|
bxge lr
|
||||||
add r1, r0
|
add r1, r1, r0
|
||||||
push {r1, lr}
|
stmfd sp!, {r1, lr}
|
||||||
bl m68k_comm_check
|
bl m68k_comm_check
|
||||||
pop {r1, lr}
|
ldmfd sp!, {r1, lr}
|
||||||
ldrb r0, [r1]
|
ldrb r0, [r1]
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
|
@ -275,9 +275,9 @@ m_m68k_read16_r00:
|
||||||
bx lr
|
bx lr
|
||||||
m_m68k_read16_r02:
|
m_m68k_read16_r02:
|
||||||
add r1, r1, #0x110000
|
add r1, r1, #0x110000
|
||||||
push {r1, lr}
|
stmfd sp!, {r1, lr}
|
||||||
bl m68k_comm_check
|
bl m68k_comm_check
|
||||||
pop {r1, lr}
|
ldmfd sp!, {r1, lr}
|
||||||
ldrb r2, [r1, #3]
|
ldrb r2, [r1, #3]
|
||||||
ldrb r0, [r1, #2]
|
ldrb r0, [r1, #2]
|
||||||
and r2, r2, #0xc7
|
and r2, r2, #0xc7
|
||||||
|
@ -307,9 +307,9 @@ m_m68k_read16_hi:
|
||||||
bxge lr
|
bxge lr
|
||||||
|
|
||||||
add r1, r0, r1
|
add r1, r0, r1
|
||||||
push {r1, lr}
|
stmfd sp!, {r1, lr}
|
||||||
bl m68k_comm_check
|
bl m68k_comm_check
|
||||||
pop {r0, lr}
|
ldmfd sp!, {r0, lr}
|
||||||
ldrh r0, [r0]
|
ldrh r0, [r0]
|
||||||
mov r1, r0, lsr #8
|
mov r1, r0, lsr #8
|
||||||
and r0, r0, #0xff
|
and r0, r0, #0xff
|
||||||
|
@ -701,6 +701,101 @@ m_s68k_write16_regs_spec: @ special case
|
||||||
strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
|
strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
|
.global s68k_read8
|
||||||
|
.global s68k_read16
|
||||||
|
.global s68k_write8
|
||||||
|
.global s68k_write16
|
||||||
|
|
||||||
|
s68k_read8:
|
||||||
|
ldr r3, =s68k_read8_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
eor r2, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
ldrccb r0, [r3, r2]
|
||||||
|
bxcc lr
|
||||||
|
bx r3
|
||||||
|
|
||||||
|
s68k_read16:
|
||||||
|
ldr r3, =s68k_read16_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
bic r0, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
ldrcch r0, [r3, r0]
|
||||||
|
bxcc lr
|
||||||
|
bx r3
|
||||||
|
|
||||||
|
s68k_read32:
|
||||||
|
ldr r3, =s68k_read16_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
bic r0, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
ldrcch r1, [r3, r0]!
|
||||||
|
ldrcch r0, [r3, #2]
|
||||||
|
orrcc r0, r0, r1, lsl #16
|
||||||
|
bxcc lr
|
||||||
|
|
||||||
|
stmfd sp!, {r0, r3, r4, lr}
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
ldmfd sp!, {r1, r3}
|
||||||
|
str r0, [sp]
|
||||||
|
add r0, r1, #2
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
ldmfd sp!, {r1, lr}
|
||||||
|
mov r0, r0, lsl #16
|
||||||
|
mov r1, r1, lsl #16
|
||||||
|
orr r0, r1, r0, lsr #16
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
s68k_write8:
|
||||||
|
ldr r3, =s68k_write8_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
eor r2, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
strccb r1, [r3, r2]
|
||||||
|
bxcc lr
|
||||||
|
bx r3
|
||||||
|
|
||||||
|
s68k_write16:
|
||||||
|
ldr r3, =s68k_write16_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
bic r0, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
strcch r1, [r3, r0]
|
||||||
|
bxcc lr
|
||||||
|
bx r3
|
||||||
|
|
||||||
|
s68k_write32:
|
||||||
|
ldr r3, =s68k_write16_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
bic r0, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
movcc r2, r1, lsr #16
|
||||||
|
strcch r2, [r3, r0]!
|
||||||
|
strcch r1, [r3, #2]
|
||||||
|
bxcc lr
|
||||||
|
|
||||||
|
stmfd sp!, {r0, r1, r3, lr}
|
||||||
|
mov r1, r1, lsr #16
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
ldmfd sp!, {r0, r1, r3, lr}
|
||||||
|
add r0, r0, #2
|
||||||
|
bx r3
|
||||||
|
|
||||||
.pool
|
.pool
|
||||||
|
|
||||||
@ vim:filetype=armasm
|
@ vim:filetype=armasm
|
||||||
|
|
|
@ -163,12 +163,14 @@ void m68k_map_unmap(int start_addr, int end_addr)
|
||||||
m68k_write16_map[i] = (addr >> 1) | MAP_FLAG;
|
m68k_write16_map[i] = (addr >> 1) | MAP_FLAG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _ASM_MEMORY_C
|
||||||
MAKE_68K_READ8(m68k_read8, m68k_read8_map)
|
MAKE_68K_READ8(m68k_read8, m68k_read8_map)
|
||||||
MAKE_68K_READ16(m68k_read16, m68k_read16_map)
|
MAKE_68K_READ16(m68k_read16, m68k_read16_map)
|
||||||
MAKE_68K_READ32(m68k_read32, m68k_read16_map)
|
MAKE_68K_READ32(m68k_read32, m68k_read16_map)
|
||||||
MAKE_68K_WRITE8(m68k_write8, m68k_write8_map)
|
MAKE_68K_WRITE8(m68k_write8, m68k_write8_map)
|
||||||
MAKE_68K_WRITE16(m68k_write16, m68k_write16_map)
|
MAKE_68K_WRITE16(m68k_write16, m68k_write16_map)
|
||||||
MAKE_68K_WRITE32(m68k_write32, m68k_write16_map)
|
MAKE_68K_WRITE32(m68k_write32, m68k_write16_map)
|
||||||
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -420,6 +422,7 @@ static u32 PicoRead8_sram(u32 a)
|
||||||
d = EEPROM_read();
|
d = EEPROM_read();
|
||||||
if (!(a & 1))
|
if (!(a & 1))
|
||||||
d >>= 8;
|
d >>= 8;
|
||||||
|
d &= 0xff;
|
||||||
} else
|
} else
|
||||||
d = *(u8 *)(Pico.sv.data - Pico.sv.start + a);
|
d = *(u8 *)(Pico.sv.data - Pico.sv.start + a);
|
||||||
elprintf(EL_SRAMIO, "sram r8 [%06x] %02x @ %06x", a, d, SekPc);
|
elprintf(EL_SRAMIO, "sram r8 [%06x] %02x @ %06x", a, d, SekPc);
|
||||||
|
|
|
@ -59,6 +59,7 @@ m_read8_eeprom:
|
||||||
ldmfd sp!,{r1,lr}
|
ldmfd sp!,{r1,lr}
|
||||||
tst r1, #1
|
tst r1, #1
|
||||||
moveq r0, r0, lsr #8
|
moveq r0, r0, lsr #8
|
||||||
|
and r0, r0, #0xff
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
|
|
||||||
|
@ -220,6 +221,101 @@ m_write16_not_z80ctl:
|
||||||
strb r2, [r3, #OFS_Pico_m_sram_reg]
|
strb r2, [r3, #OFS_Pico_m_sram_reg]
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
|
.global m68k_read8
|
||||||
|
.global m68k_read16
|
||||||
|
.global m68k_write8
|
||||||
|
.global m68k_write16
|
||||||
|
|
||||||
|
m68k_read8:
|
||||||
|
ldr r3, =m68k_read8_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
eor r2, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
ldrccb r0, [r3, r2]
|
||||||
|
bxcc lr
|
||||||
|
bx r3
|
||||||
|
|
||||||
|
m68k_read16:
|
||||||
|
ldr r3, =m68k_read16_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
bic r0, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
ldrcch r0, [r3, r0]
|
||||||
|
bxcc lr
|
||||||
|
bx r3
|
||||||
|
|
||||||
|
m68k_read32:
|
||||||
|
ldr r3, =m68k_read16_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
bic r0, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
ldrcch r1, [r3, r0]!
|
||||||
|
ldrcch r0, [r3, #2]
|
||||||
|
orrcc r0, r0, r1, lsl #16
|
||||||
|
bxcc lr
|
||||||
|
|
||||||
|
stmfd sp!, {r0, r3, r4, lr}
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
ldmfd sp!, {r1, r3}
|
||||||
|
str r0, [sp]
|
||||||
|
add r0, r1, #2
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
ldmfd sp!, {r1, lr}
|
||||||
|
mov r0, r0, lsl #16
|
||||||
|
mov r1, r1, lsl #16
|
||||||
|
orr r0, r1, r0, lsr #16
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
m68k_write8:
|
||||||
|
ldr r3, =m68k_write8_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
eor r2, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
strccb r1, [r3, r2]
|
||||||
|
bxcc lr
|
||||||
|
bx r3
|
||||||
|
|
||||||
|
m68k_write16:
|
||||||
|
ldr r3, =m68k_write16_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
bic r0, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
strcch r1, [r3, r0]
|
||||||
|
bxcc lr
|
||||||
|
bx r3
|
||||||
|
|
||||||
|
m68k_write32:
|
||||||
|
ldr r3, =m68k_write16_map
|
||||||
|
bic r0, r0, #0xff000000
|
||||||
|
mov r2, r0, lsr #16
|
||||||
|
ldr r3, [r3, r2, lsl #2]
|
||||||
|
bic r0, r0, #1
|
||||||
|
movs r3, r3, lsl #1
|
||||||
|
movcc r2, r1, lsr #16
|
||||||
|
strcch r2, [r3, r0]!
|
||||||
|
strcch r1, [r3, #2]
|
||||||
|
bxcc lr
|
||||||
|
|
||||||
|
stmfd sp!, {r0, r1, r3, lr}
|
||||||
|
mov r1, r1, lsr #16
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
ldmfd sp!, {r0, r1, r3, lr}
|
||||||
|
add r0, r0, #2
|
||||||
|
bx r3
|
||||||
|
|
||||||
.pool
|
.pool
|
||||||
|
|
||||||
@ vim:filetype=armasm
|
@ vim:filetype=armasm
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue