X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fm68kif_cyclone.s;fp=pico%2Fm68kif_cyclone.s;h=ea5daa687e89956d28f340bfd89f8505506bc0ad;hb=5e89f0f5aebedc086888415e063b9883fc4a9e92;hp=0000000000000000000000000000000000000000;hpb=fc1874de8af2fb53449bcfa931e025071f188b3e;p=picodrive.git diff --git a/pico/m68kif_cyclone.s b/pico/m68kif_cyclone.s new file mode 100644 index 0000000..ea5daa6 --- /dev/null +++ b/pico/m68kif_cyclone.s @@ -0,0 +1,140 @@ +@ vim:filetype=armasm + +.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 + bic r0, r0, #0xff000000 + bics r0, r0, #1 + beq crashed + + ldr r1, [r7, #0x6c] @ read16 map + mov r2, r0, lsr #M68K_MEM_SHIFT + ldr r1, [r1, r2, lsl #2] + movs r1, r1, lsl #1 + bcs crashed + + str r1, [r7, #0x60] @ membase + add r0, r0, r1 + bx 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 r0, [r1, r0]! + ldrcch r1, [r1, #2] + orrcc r0, r1, r0, lsl #16 + bxcc lr + + stmfd sp!,{r0,r1,lr} + mov lr, pc + bx r1 + mov r2, r0, lsl #16 + ldmia sp, {r0,r1} + str r2, [sp] + add r0, r0, #2 + mov lr, pc + bx r1 + ldr r1, [sp] + mov r0, r0, lsl #16 + orr r0, r1, r0, lsr #16 + ldmfd sp!,{r1,r2,pc} + + +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 +