preserve r9 for apple
[picodrive.git] / pico / m68kif_cyclone.s
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.
24 cyclone_checkpc:
25     ldr     r1, [r7, #0x60]  @ membase
26     sub     r0, r0, r1
27     bic     r0, r0, #0xff000000
28     bics    r0, r0, #1
29     beq     crashed
30
31     ldr     r1, [r7, #0x6c]  @ read16 map
32     mov     r2, r0, lsr #M68K_MEM_SHIFT
33     ldr     r1, [r1, r2, lsl #2]
34     movs    r1, r1, lsl #1
35     bcs     crashed
36
37     str     r1, [r7, #0x60]  @ membase
38     add     r0, r0, r1
39     bx      lr
40
41 crashed:
42     stmfd   sp!,{lr}
43     mov     r1, r7
44     bl      cyclone_crashed
45     ldr     r0, [r7, #0x40]  @ reload PC + membase
46     ldmfd   sp!,{pc}
47
48
49 cyclone_read8: @ u32 a
50 cyclone_fetch8:
51     bic     r0, r0, #0xff000000
52     ldr     r1, [r7, #0x68]  @ read8 map
53     mov     r2, r0, lsr #M68K_MEM_SHIFT
54     ldr     r1, [r1, r2, lsl #2]
55     eor     r2, r0, #1
56     movs    r1, r1, lsl #1
57     ldrccb  r0, [r1, r2]
58     bxcc    lr
59     bx      r1
60
61
62 cyclone_read16: @ u32 a
63 cyclone_fetch16:
64     bic     r0, r0, #0xff000000
65     ldr     r1, [r7, #0x6c]  @ read16 map
66     mov     r2, r0, lsr #M68K_MEM_SHIFT
67     ldr     r1, [r1, r2, lsl #2]
68     bic     r0, r0, #1
69     movs    r1, r1, lsl #1
70     ldrcch  r0, [r1, r0]
71     bxcc    lr
72     bx      r1
73
74
75 cyclone_read32: @ u32 a
76 cyclone_fetch32:
77     bic     r0, r0, #0xff000000
78     ldr     r1, [r7, #0x6c]  @ read16 map
79     mov     r2, r0, lsr #M68K_MEM_SHIFT
80     ldr     r1, [r1, r2, lsl #2]
81     bic     r0, r0, #1
82     movs    r1, r1, lsl #1
83     ldrcch  r0, [r1, r0]!
84     ldrcch  r1, [r1, #2]
85     orrcc   r0, r1, r0, lsl #16
86     bxcc    lr
87
88     stmfd   sp!,{r0,r1,lr}
89     mov     lr, pc
90     bx      r1
91     mov     r2, r0, lsl #16
92     ldmia   sp, {r0,r1}
93     str     r2, [sp]
94     add     r0, r0, #2
95     mov     lr, pc
96     bx      r1
97     ldr     r1, [sp]
98     mov     r0, r0, lsl #16
99     orr     r0, r1, r0, lsr #16
100     ldmfd   sp!,{r1,r2,pc}
101
102
103 cyclone_write8: @ u32 a, u8 d
104     bic     r0, r0, #0xff000000
105     ldr     r2, [r7, #0x74]  @ write8 map
106     mov     r3, r0, lsr #M68K_MEM_SHIFT
107     ldr     r2, [r2, r3, lsl #2]
108     eor     r3, r0, #1
109     movs    r2, r2, lsl #1
110     strccb  r1, [r2, r3]
111     bxcc    lr
112     bx      r2
113
114
115 cyclone_write16: @ u32 a, u16 d
116     bic     r0, r0, #0xff000000
117     ldr     r2, [r7, #0x78]  @ write16 map
118     mov     r3, r0, lsr #M68K_MEM_SHIFT
119     ldr     r2, [r2, r3, lsl #2]
120     bic     r0, r0, #1
121     movs    r2, r2, lsl #1
122     strcch  r1, [r2, r0]
123     bxcc    lr
124     bx      r2
125
126
127 cyclone_write32: @ u32 a, u32 d
128     bic     r0, r0, #0xff000000
129     ldr     r2, [r7, #0x78]  @ write16 map
130     mov     r3, r0, lsr #M68K_MEM_SHIFT
131     ldr     r2, [r2, r3, lsl #2]
132     bic     r0, r0, #1
133     movs    r2, r2, lsl #1
134     movcc   r3, r1, lsr #16
135     strcch  r3, [r2, r0]!
136     strcch  r1, [r2, #2]
137     bxcc    lr
138
139     stmfd   sp!,{r0-r2,lr}
140     mov     r1, r1, lsr #16
141     mov     lr, pc
142     bx      r2
143     ldmfd   sp!,{r0-r2,lr}
144     add     r0, r0, #2
145     bx      r2
146
147 @ vim:filetype=armasm