c321391a9bda953bd3873ad59b56eefd13232712
[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     and     r3, r0, #0xff000000
28     bic     r0, r0, #1
29     bics    r2, r0, #0xff000000
30     @ ouf, some Codemasters titles actually start at address 0
31     @ beq     crashed
32
33     ldr     r1, [r7, #0x6c]  @ read16 map
34     mov     r2, r2, lsr #M68K_MEM_SHIFT
35     ldr     r1, [r1, r2, lsl #2]
36
37     movs    r1, r1, lsl #1
38     subcc   r1, r1, r3
39     strcc   r1, [r7, #0x60]  @ membase
40     addcc   r0, r0, r1
41     bxcc    lr
42
43 crashed:
44     stmfd   sp!,{lr}
45     mov     r1, r7
46     bl      cyclone_crashed
47     ldmfd   sp!,{pc}
48
49
50 cyclone_read8: @ u32 a
51 cyclone_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
63 cyclone_read16: @ u32 a
64 cyclone_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
76 cyclone_read32: @ u32 a
77 cyclone_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  r2, [r1, r0]!
85     ldrcch  r1, [r1, #2]
86     orrcc   r0, r1, r2, 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
104 cyclone_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
116 cyclone_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
128 cyclone_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