123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /*
- * PicoDrive
- * (C) notaz, 2009
- *
- * This work is licensed under the terms of MAME license.
- * See COPYING file in the top-level directory.
- */
- .equ M68K_MEM_SHIFT, 16
- .global cyclone_checkpc
- .global cyclone_fetch8
- .global cyclone_fetch16
- .global cyclone_fetch32
- .global cyclone_read8
- .global cyclone_read16
- .global cyclone_read32
- .global cyclone_write8
- .global cyclone_write16
- .global cyclone_write32
- @ Warning: here we abuse the fact that we are only called
- @ from Cyclone, and assume that r7 contains context pointer.
- cyclone_checkpc:
- ldr r1, [r7, #0x60] @ membase
- sub r0, r0, r1
- and r3, r0, #0xff000000
- bic r0, r0, #1
- bics r2, r0, #0xff000000
- @ ouf, some Codemasters titles actually start at address 0
- @ beq crashed
- ldr r1, [r7, #0x6c] @ read16 map
- mov r2, r2, lsr #M68K_MEM_SHIFT
- ldr r1, [r1, r2, lsl #2]
- movs r1, r1, lsl #1
- subcc r1, r1, r3
- strcc r1, [r7, #0x60] @ membase
- addcc r0, r0, r1
- bxcc lr
- crashed:
- stmfd sp!,{lr}
- mov r1, r7
- bl cyclone_crashed
- ldr r0, [r7, #0x40] @ reload PC + membase
- ldmfd sp!,{pc}
- cyclone_read8: @ u32 a
- cyclone_fetch8:
- bic r0, r0, #0xff000000
- ldr r1, [r7, #0x68] @ read8 map
- mov r2, r0, lsr #M68K_MEM_SHIFT
- ldr r1, [r1, r2, lsl #2]
- eor r2, r0, #1
- movs r1, r1, lsl #1
- ldrccb r0, [r1, r2]
- bxcc lr
- bx r1
- cyclone_read16: @ u32 a
- cyclone_fetch16:
- bic r0, r0, #0xff000000
- ldr r1, [r7, #0x6c] @ read16 map
- mov r2, r0, lsr #M68K_MEM_SHIFT
- ldr r1, [r1, r2, lsl #2]
- bic r0, r0, #1
- movs r1, r1, lsl #1
- ldrcch r0, [r1, r0]
- bxcc lr
- bx r1
- cyclone_read32: @ u32 a
- cyclone_fetch32:
- bic r0, r0, #0xff000000
- ldr r1, [r7, #0x6c] @ read16 map
- mov r2, r0, lsr #M68K_MEM_SHIFT
- ldr r1, [r1, r2, lsl #2]
- bic r0, r0, #1
- movs r1, r1, lsl #1
- ldrcch r2, [r1, r0]!
- ldrcch r1, [r1, #2]
- orrcc r0, r1, r2, lsl #16
- bxcc lr
- stmfd sp!,{r0,r1,r2,lr}
- mov lr, pc
- bx r1
- mov r2, r0, lsl #16
- ldmfd sp!, {r0,r1}
- str r2, [sp]
- add r0, r0, #2
- mov lr, pc
- bx r1
- ldmfd sp!, {r1,lr}
- mov r0, r0, lsl #16
- orr r0, r1, r0, lsr #16
- bx lr
- cyclone_write8: @ u32 a, u8 d
- bic r0, r0, #0xff000000
- ldr r2, [r7, #0x74] @ write8 map
- mov r3, r0, lsr #M68K_MEM_SHIFT
- ldr r2, [r2, r3, lsl #2]
- eor r3, r0, #1
- movs r2, r2, lsl #1
- strccb r1, [r2, r3]
- bxcc lr
- bx r2
- cyclone_write16: @ u32 a, u16 d
- bic r0, r0, #0xff000000
- ldr r2, [r7, #0x78] @ write16 map
- mov r3, r0, lsr #M68K_MEM_SHIFT
- ldr r2, [r2, r3, lsl #2]
- bic r0, r0, #1
- movs r2, r2, lsl #1
- strcch r1, [r2, r0]
- bxcc lr
- bx r2
- cyclone_write32: @ u32 a, u32 d
- bic r0, r0, #0xff000000
- ldr r2, [r7, #0x78] @ write16 map
- mov r3, r0, lsr #M68K_MEM_SHIFT
- ldr r2, [r2, r3, lsl #2]
- bic r0, r0, #1
- movs r2, r2, lsl #1
- movcc r3, r1, lsr #16
- strcch r3, [r2, r0]!
- strcch r1, [r2, #2]
- bxcc lr
- stmfd sp!,{r0-r2,lr}
- mov r1, r1, lsr #16
- mov lr, pc
- bx r2
- ldmfd sp!,{r0-r2,lr}
- add r0, r0, #2
- bx r2
- @ vim:filetype=armasm
|