1/* 2 * PicoDrive 3 * (C) notaz, 2009 4 * 5 * This work is licensed under the terms of MAME license. 6 * See COPYING file in the top-level directory. 7 */ 8 9.equ M68K_MEM_SHIFT, 16 10 11.global cyclone_checkpc 12.global cyclone_fetch8 13.global cyclone_fetch16 14.global cyclone_fetch32 15.global cyclone_read8 16.global cyclone_read16 17.global cyclone_read32 18.global cyclone_write8 19.global cyclone_write16 20.global cyclone_write32 21 22@ Warning: here we abuse the fact that we are only called 23@ from Cyclone, and assume that r7 contains context pointer. 24cyclone_checkpc: 25 ldr r1, [r7, #0x60] @ membase 26 sub r0, r0, r1 27 and r3, r0, #0xff000000 28 bic r0, r0, #1 29 bics r2, r0, #0xff000000 30 beq crashed 31 32 ldr r1, [r7, #0x6c] @ read16 map 33 mov r2, r2, lsr #M68K_MEM_SHIFT 34 ldr r1, [r1, r2, lsl #2] 35 36 movs r1, r1, lsl #1 37 subcc r1, r1, r3 38 strcc r1, [r7, #0x60] @ membase 39 addcc r0, r0, r1 40 bxcc lr 41 42crashed: 43 stmfd sp!,{lr} 44 mov r1, r7 45 bl cyclone_crashed 46 ldr r0, [r7, #0x40] @ reload PC + membase 47 ldmfd sp!,{pc} 48 49 50cyclone_read8: @ u32 a 51cyclone_fetch8: 52 bic r0, r0, #0xff000000 53 ldr r1, [r7, #0x68] @ read8 map 54 mov r2, r0, lsr #M68K_MEM_SHIFT 55 ldr r1, [r1, r2, lsl #2] 56 eor r2, r0, #1 57 movs r1, r1, lsl #1 58 ldrccb r0, [r1, r2] 59 bxcc lr 60 bx r1 61 62 63cyclone_read16: @ u32 a 64cyclone_fetch16: 65 bic r0, r0, #0xff000000 66 ldr r1, [r7, #0x6c] @ read16 map 67 mov r2, r0, lsr #M68K_MEM_SHIFT 68 ldr r1, [r1, r2, lsl #2] 69 bic r0, r0, #1 70 movs r1, r1, lsl #1 71 ldrcch r0, [r1, r0] 72 bxcc lr 73 bx r1 74 75 76cyclone_read32: @ u32 a 77cyclone_fetch32: 78 bic r0, r0, #0xff000000 79 ldr r1, [r7, #0x6c] @ read16 map 80 mov r2, r0, lsr #M68K_MEM_SHIFT 81 ldr r1, [r1, r2, lsl #2] 82 bic r0, r0, #1 83 movs r1, r1, lsl #1 84 ldrcch r0, [r1, r0]! 85 ldrcch r1, [r1, #2] 86 orrcc r0, r1, r0, lsl #16 87 bxcc lr 88 89 stmfd sp!,{r0,r1,r2,lr} 90 mov lr, pc 91 bx r1 92 mov r2, r0, lsl #16 93 ldmfd sp!, {r0,r1} 94 str r2, [sp] 95 add r0, r0, #2 96 mov lr, pc 97 bx r1 98 ldmfd sp!, {r1,lr} 99 mov r0, r0, lsl #16 100 orr r0, r1, r0, lsr #16 101 bx lr 102 103 104cyclone_write8: @ u32 a, u8 d 105 bic r0, r0, #0xff000000 106 ldr r2, [r7, #0x74] @ write8 map 107 mov r3, r0, lsr #M68K_MEM_SHIFT 108 ldr r2, [r2, r3, lsl #2] 109 eor r3, r0, #1 110 movs r2, r2, lsl #1 111 strccb r1, [r2, r3] 112 bxcc lr 113 bx r2 114 115 116cyclone_write16: @ u32 a, u16 d 117 bic r0, r0, #0xff000000 118 ldr r2, [r7, #0x78] @ write16 map 119 mov r3, r0, lsr #M68K_MEM_SHIFT 120 ldr r2, [r2, r3, lsl #2] 121 bic r0, r0, #1 122 movs r2, r2, lsl #1 123 strcch r1, [r2, r0] 124 bxcc lr 125 bx r2 126 127 128cyclone_write32: @ u32 a, u32 d 129 bic r0, r0, #0xff000000 130 ldr r2, [r7, #0x78] @ write16 map 131 mov r3, r0, lsr #M68K_MEM_SHIFT 132 ldr r2, [r2, r3, lsl #2] 133 bic r0, r0, #1 134 movs r2, r2, lsl #1 135 movcc r3, r1, lsr #16 136 strcch r3, [r2, r0]! 137 strcch r1, [r2, #2] 138 bxcc lr 139 140 stmfd sp!,{r0-r2,lr} 141 mov r1, r1, lsr #16 142 mov lr, pc 143 bx r2 144 ldmfd sp!,{r0-r2,lr} 145 add r0, r0, #2 146 bx r2 147 148@ vim:filetype=armasm 149