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