mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-04 14:57:45 -04:00

- PicoDrive was originally released by fDave with simple "free for non-commercial use / For commercial use, separate licencing terms must be obtained" license and I kept it in my releases. - in 2011, fDave re-released his code (same that I used as base many years ago) dual licensed with GPLv2 and MAME licenses: https://code.google.com/p/cyclone68000/ Based on the above I now proclaim that the whole source code is licensed under the MAME license as more elaborate form of "for non-commercial use". If that raises any doubt, I announce that all my modifications (which is the vast majority of code by now) is licensed under the MAME license, as it reads in COPYING file in this commit. This does not affect ym2612.c/sn76496.c that were MAME licensed already from the beginning.
309 lines
8.1 KiB
ArmAsm
309 lines
8.1 KiB
ArmAsm
/*
|
|
* PicoDrive
|
|
* (C) notaz, 2006-2009
|
|
*
|
|
* This work is licensed under the terms of MAME license.
|
|
* See COPYING file in the top-level directory.
|
|
*/
|
|
|
|
@@ .include "port_config.s"
|
|
|
|
.equ SRR_MAPPED, (1 << 0)
|
|
.equ SRR_READONLY, (1 << 1)
|
|
.equ SRF_EEPROM, (1 << 1)
|
|
.equ POPT_6BTN_PAD, (1 << 5)
|
|
.equ POPT_EN_32X, (1 << 20)
|
|
|
|
.text
|
|
.align 4
|
|
|
|
.global PicoRead8_sram
|
|
.global PicoRead8_io
|
|
.global PicoRead16_sram
|
|
.global PicoRead16_io
|
|
.global PicoWrite8_io
|
|
.global PicoWrite16_io
|
|
|
|
PicoRead8_sram: @ u32 a, u32 d
|
|
ldr r2, =(SRam)
|
|
ldr r3, =(Pico+0x22200)
|
|
ldr r1, [r2, #8] @ SRam.end
|
|
cmp r0, r1
|
|
bgt m_read8_nosram
|
|
ldr r1, [r2, #4] @ SRam.start
|
|
cmp r0, r1
|
|
blt m_read8_nosram
|
|
ldrb r1, [r3, #0x11] @ Pico.m.sram_reg
|
|
tst r1, #SRR_MAPPED
|
|
beq m_read8_nosram
|
|
ldr r1, [r2, #0x0c]
|
|
tst r1, #SRF_EEPROM
|
|
bne m_read8_eeprom
|
|
ldr r1, [r2, #4] @ SRam.start
|
|
ldr r2, [r2] @ SRam.data
|
|
sub r0, r0, r1
|
|
add r0, r0, r2
|
|
ldrb r0, [r0]
|
|
bx lr
|
|
|
|
m_read8_nosram:
|
|
ldr r1, [r3, #4] @ romsize
|
|
cmp r0, r1
|
|
movgt r0, #0
|
|
bxgt lr @ bad location
|
|
@ XXX: banking unfriendly
|
|
ldr r1, [r3]
|
|
eor r0, r0, #1
|
|
ldrb r0, [r1, r0]
|
|
bx lr
|
|
|
|
m_read8_eeprom:
|
|
stmfd sp!,{r0,lr}
|
|
bl EEPROM_read
|
|
ldmfd sp!,{r1,lr}
|
|
tst r1, #1
|
|
moveq r0, r0, lsr #8
|
|
bx lr
|
|
|
|
|
|
PicoRead8_io: @ u32 a, u32 d
|
|
bic r2, r0, #0x001f @ most commonly we get i/o port read,
|
|
cmp r2, #0xa10000 @ so check for it first
|
|
bne m_read8_not_io
|
|
|
|
m_read8_misc_io:
|
|
ands r0, r0, #0x1e
|
|
beq m_read8_misc_hwreg
|
|
cmp r0, #4
|
|
movlt r0, #0
|
|
moveq r0, #1
|
|
ble PadRead
|
|
ldr r3, =(Pico+0x22000)
|
|
mov r0, r0, lsr #1 @ other IO ports (Pico.ioports[a])
|
|
ldrb r0, [r3, r0]
|
|
bx lr
|
|
|
|
m_read8_misc_hwreg:
|
|
ldr r3, =(Pico+0x22200)
|
|
ldrb r0, [r3, #0x0f] @ Pico.m.hardware
|
|
bx lr
|
|
|
|
m_read8_not_io:
|
|
and r2, r0, #0xfc00
|
|
cmp r2, #0x1000
|
|
bne m_read8_not_brq
|
|
|
|
ldr r3, =(Pico+0x22200)
|
|
mov r1, r0
|
|
ldr r0, [r3, #8] @ Pico.m.rotate
|
|
add r0, r0, #1
|
|
strb r0, [r3, #8]
|
|
eor r0, r0, r0, lsl #6
|
|
|
|
tst r1, #1
|
|
bxne lr @ odd addr -> open bus
|
|
bic r0, r0, #1 @ bit0 defined in this area
|
|
and r2, r1, #0xff00
|
|
cmp r2, #0x1100
|
|
bxne lr @ not busreq
|
|
|
|
ldrb r1, [r3, #(8+0x01)] @ Pico.m.z80Run
|
|
ldrb r2, [r3, #(8+0x0f)] @ Pico.m.z80_reset
|
|
orr r0, r0, r1
|
|
orr r0, r0, r2
|
|
bx lr
|
|
|
|
m_read8_not_brq:
|
|
ldr r2, =PicoOpt
|
|
ldr r2, [r2]
|
|
tst r2, #POPT_EN_32X
|
|
bne PicoRead8_32x
|
|
mov r0, #0
|
|
bx lr
|
|
|
|
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
PicoRead16_sram: @ u32 a, u32 d
|
|
ldr r2, =(SRam)
|
|
ldr r3, =(Pico+0x22200)
|
|
ldr r1, [r2, #8] @ SRam.end
|
|
cmp r0, r1
|
|
bgt m_read16_nosram
|
|
ldr r1, [r2, #4] @ SRam.start
|
|
cmp r0, r1
|
|
blt m_read16_nosram
|
|
ldrb r1, [r3, #0x11] @ Pico.m.sram_reg
|
|
tst r1, #SRR_MAPPED
|
|
beq m_read16_nosram
|
|
ldr r1, [r2, #0x0c]
|
|
tst r1, #SRF_EEPROM
|
|
bne EEPROM_read
|
|
ldr r1, [r2, #4] @ SRam.start
|
|
ldr r2, [r2] @ SRam.data
|
|
sub r0, r0, r1
|
|
add r0, r0, r2
|
|
ldrb r1, [r0], #1
|
|
ldrb r0, [r0]
|
|
orr r0, r0, r1, lsl #8
|
|
bx lr
|
|
|
|
m_read16_nosram:
|
|
ldr r1, [r3, #4] @ romsize
|
|
cmp r0, r1
|
|
movgt r0, #0
|
|
bxgt lr @ bad location
|
|
@ XXX: banking unfriendly
|
|
ldr r1, [r3]
|
|
ldrh r0, [r1, r0]
|
|
bx lr
|
|
|
|
|
|
PicoRead16_io: @ u32 a, u32 d
|
|
bic r2, r0, #0x001f @ most commonly we get i/o port read,
|
|
cmp r2, #0xa10000 @ so check for it first
|
|
bne m_read16_not_io
|
|
stmfd sp!,{lr}
|
|
bl m_read8_misc_io @ same as read8
|
|
orr r0, r0, r0, lsl #8 @ only has bytes mirrored
|
|
ldmfd sp!,{pc}
|
|
|
|
m_read16_not_io:
|
|
and r2, r0, #0xfc00
|
|
cmp r2, #0x1000
|
|
bne m_read16_not_brq
|
|
|
|
ldr r3, =(Pico+0x22200)
|
|
and r2, r0, #0xff00
|
|
ldr r0, [r3, #8] @ Pico.m.rotate
|
|
add r0, r0, #1
|
|
strb r0, [r3, #8]
|
|
eor r0, r0, r0, lsl #5
|
|
eor r0, r0, r0, lsl #8
|
|
bic r0, r0, #0x100 @ bit8 defined in this area
|
|
cmp r2, #0x1100
|
|
bxne lr @ not busreq
|
|
|
|
ldrb r1, [r3, #(8+0x01)] @ Pico.m.z80Run
|
|
ldrb r2, [r3, #(8+0x0f)] @ Pico.m.z80_reset
|
|
orr r0, r0, r1, lsl #8
|
|
orr r0, r0, r2, lsl #8
|
|
bx lr
|
|
|
|
m_read16_not_brq:
|
|
ldr r2, =PicoOpt
|
|
ldr r2, [r2]
|
|
tst r2, #POPT_EN_32X
|
|
bne PicoRead16_32x
|
|
mov r0, #0
|
|
bx lr
|
|
|
|
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
PicoWrite8_io: @ u32 a, u32 d
|
|
bic r2, r0, #0x1e @ most commonly we get i/o port write,
|
|
eor r2, r2, #0xa10000 @ so check for it first
|
|
eors r2, r2, #1
|
|
bne m_write8_not_io
|
|
|
|
m_write8_io:
|
|
ldr r2, =PicoOpt
|
|
and r0, r0, #0x1e
|
|
ldr r2, [r2]
|
|
ldr r3, =(Pico+0x22000) @ Pico.ioports
|
|
tst r2, #POPT_6BTN_PAD
|
|
beq m_write8_io_done
|
|
cmp r0, #2
|
|
cmpne r0, #4
|
|
bne m_write8_io_done @ not likely to happen
|
|
add r2, r3, #0x200 @ Pico+0x22200
|
|
mov r12,#0
|
|
cmp r0, #2
|
|
streqb r12,[r2,#0x18]
|
|
strneb r12,[r2,#0x19] @ Pico.m.padDelay[i] = 0
|
|
tst r1, #0x40 @ TH
|
|
beq m_write8_io_done
|
|
ldrb r12,[r3, r0, lsr #1]
|
|
tst r12,#0x40
|
|
bne m_write8_io_done
|
|
cmp r0, #2
|
|
ldreqb r12,[r2,#0x0a]
|
|
ldrneb r12,[r2,#0x0b] @ Pico.m.padTHPhase
|
|
add r12,r12,#1
|
|
streqb r12,[r2,#0x0a]
|
|
strneb r12,[r2,#0x0b] @ Pico.m.padTHPhase
|
|
m_write8_io_done:
|
|
strb r1, [r3, r0, lsr #1]
|
|
bx lr
|
|
|
|
m_write8_not_io:
|
|
tst r0, #1
|
|
bne m_write8_not_z80ctl @ even addrs only
|
|
and r2, r0, #0xff00
|
|
cmp r2, #0x1100
|
|
moveq r0, r1
|
|
beq ctl_write_z80busreq
|
|
cmp r2, #0x1200
|
|
moveq r0, r1
|
|
beq ctl_write_z80reset
|
|
|
|
m_write8_not_z80ctl:
|
|
@ unlikely
|
|
eor r2, r0, #0xa10000
|
|
eor r2, r2, #0x003000
|
|
eors r2, r2, #0x0000f1
|
|
bne m_write8_not_sreg
|
|
ldr r3, =(Pico+0x22200)
|
|
ldrb r2, [r3, #(8+9)] @ Pico.m.sram_reg
|
|
and r1, r1, #(SRR_MAPPED|SRR_READONLY)
|
|
bic r2, r2, #(SRR_MAPPED|SRR_READONLY)
|
|
orr r2, r2, r1
|
|
strb r2, [r3, #(8+9)]
|
|
bx lr
|
|
|
|
m_write8_not_sreg:
|
|
ldr r2, =PicoOpt
|
|
ldr r2, [r2]
|
|
tst r2, #POPT_EN_32X
|
|
bne PicoWrite8_32x
|
|
bx lr
|
|
|
|
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
PicoWrite16_io: @ u32 a, u32 d
|
|
bic r2, r0, #0x1f @ most commonly we get i/o port write,
|
|
cmp r2, #0xa10000 @ so check for it first
|
|
beq m_write8_io
|
|
|
|
m_write16_not_io:
|
|
and r2, r0, #0xff00
|
|
cmp r2, #0x1100
|
|
moveq r0, r1, lsr #8
|
|
beq ctl_write_z80busreq
|
|
cmp r2, #0x1200
|
|
moveq r0, r1, lsr #8
|
|
beq ctl_write_z80reset
|
|
|
|
m_write16_not_z80ctl:
|
|
@ unlikely
|
|
eor r2, r0, #0xa10000
|
|
eor r2, r2, #0x003000
|
|
eors r2, r2, #0x0000f0
|
|
bne m_write16_not_sreg
|
|
ldr r3, =(Pico+0x22200)
|
|
ldrb r2, [r3, #(8+9)] @ Pico.m.sram_reg
|
|
and r1, r1, #(SRR_MAPPED|SRR_READONLY)
|
|
bic r2, r2, #(SRR_MAPPED|SRR_READONLY)
|
|
orr r2, r2, r1
|
|
strb r2, [r3, #(8+9)]
|
|
bx lr
|
|
|
|
m_write16_not_sreg:
|
|
ldr r2, =PicoOpt
|
|
ldr r2, [r2]
|
|
tst r2, #POPT_EN_32X
|
|
bne PicoWrite16_32x
|
|
bx lr
|
|
|
|
.pool
|
|
|
|
@ vim:filetype=armasm
|