rearrange globals
[picodrive.git] / pico / memory_arm.S
1 /*\r
2  * PicoDrive\r
3  * (C) notaz, 2006-2009\r
4  *\r
5  * This work is licensed under the terms of MAME license.\r
6  * See COPYING file in the top-level directory.\r
7  */\r
8 \r
9 #include "pico_int_o32.h"\r
10 \r
11 .equ SRR_MAPPED,    (1 <<  0)\r
12 .equ SRR_READONLY,  (1 <<  1)\r
13 .equ SRF_EEPROM,    (1 <<  1)\r
14 .equ POPT_EN_32X,   (1 << 20)\r
15 \r
16 .text\r
17 .align 4\r
18 \r
19 .global PicoRead8_sram\r
20 .global PicoRead8_io\r
21 .global PicoRead16_sram\r
22 .global PicoRead16_io\r
23 .global PicoWrite8_io\r
24 .global PicoWrite16_io\r
25 \r
26 PicoRead8_sram: @ u32 a\r
27     ldr     r3, =Pico\r
28     ldr     r1, [r3, #OFS_Pico_sv_end]\r
29     cmp     r0, r1\r
30     bgt     m_read8_nosram\r
31     ldr     r2, [r3, #OFS_Pico_sv_start]\r
32     cmp     r0, r2\r
33     blt     m_read8_nosram\r
34     ldrb    r1, [r3, #OFS_Pico_m_sram_reg]\r
35     tst     r1, #SRR_MAPPED\r
36     beq     m_read8_nosram\r
37     ldr     r1, [r3, #OFS_Pico_sv_flags]\r
38     tst     r1, #SRF_EEPROM\r
39     bne     m_read8_eeprom\r
40     ldr     r1, [r3, #OFS_Pico_sv_data]\r
41     sub     r0, r0, r2\r
42     ldrb    r0, [r0, r1]\r
43     bx      lr\r
44 \r
45 m_read8_nosram:\r
46     ldr     r1, [r3, #OFS_Pico_romsize]\r
47     cmp     r0, r1\r
48     movgt   r0, #0\r
49     bxgt    lr              @ bad location\r
50     @ XXX: banking unfriendly\r
51     ldr     r1, [r3, #OFS_Pico_rom]\r
52     eor     r0, r0, #1\r
53     ldrb    r0, [r1, r0]\r
54     bx      lr\r
55 \r
56 m_read8_eeprom:\r
57     stmfd   sp!,{r0,lr}\r
58     bl      EEPROM_read\r
59     ldmfd   sp!,{r1,lr}\r
60     tst     r1, #1\r
61     moveq   r0, r0, lsr #8\r
62     bx      lr\r
63 \r
64 \r
65 PicoRead8_io: @ u32 a\r
66     bic     r2, r0, #0x001f   @ most commonly we get i/o port read,\r
67     cmp     r2, #0xa10000     @ so check for it first\r
68     beq     io_ports_read\r
69 \r
70 m_read8_not_io:\r
71     and     r2, r0, #0xfc00\r
72     cmp     r2, #0x1000\r
73     bne     PicoRead8_32x\r
74 \r
75     ldr     r3, =Pico\r
76     mov     r1, r0\r
77     ldr     r0, [r3, #OFS_Pico_m_rotate]\r
78     add     r0, r0, #1\r
79     strb    r0, [r3, #OFS_Pico_m_rotate]\r
80     eor     r0, r0, r0, lsl #6\r
81 \r
82     tst     r1, #1\r
83     bxne    lr                @ odd addr -> open bus\r
84     bic     r0, r0, #1        @ bit0 defined in this area\r
85     and     r2, r1, #0xff00\r
86     cmp     r2, #0x1100\r
87     bxne    lr                @ not busreq\r
88 \r
89     ldrb    r1, [r3, #OFS_Pico_m_z80Run]\r
90     ldrb    r2, [r3, #OFS_Pico_m_z80_reset]\r
91     orr     r0, r0, r1\r
92     orr     r0, r0, r2\r
93     bx      lr\r
94 \r
95 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
96 \r
97 PicoRead16_sram: @ u32 a, u32 d\r
98     ldr     r3, =Pico\r
99     ldr     r1, [r3, #OFS_Pico_sv_end]\r
100     cmp     r0, r1\r
101     bgt     m_read16_nosram\r
102     ldr     r2, [r3, #OFS_Pico_sv_start]\r
103     cmp     r0, r2\r
104     blt     m_read16_nosram\r
105     ldrb    r1, [r3, #OFS_Pico_m_sram_reg]\r
106     tst     r1, #SRR_MAPPED\r
107     beq     m_read16_nosram\r
108     ldr     r1, [r3, #OFS_Pico_sv_flags]\r
109     tst     r1, #SRF_EEPROM\r
110     bne     EEPROM_read\r
111     ldr     r1, [r3, #OFS_Pico_sv_data]\r
112     sub     r0, r0, r2\r
113     ldrb    r1, [r0, r1]!\r
114     ldrb    r0, [r0, #1]\r
115     orr     r0, r0, r1, lsl #8\r
116     bx      lr\r
117 \r
118 m_read16_nosram:\r
119     ldr     r1, [r3, #OFS_Pico_romsize]\r
120     cmp     r0, r1\r
121     movgt   r0, #0\r
122     bxgt    lr              @ bad location\r
123     @ XXX: banking unfriendly\r
124     ldr     r1, [r3, #OFS_Pico_rom]\r
125     ldrh    r0, [r1, r0]\r
126     bx      lr\r
127 \r
128 \r
129 PicoRead16_io: @ u32 a, u32 d\r
130     bic     r2, r0, #0x001f   @ most commonly we get i/o port read,\r
131     cmp     r2, #0xa10000     @ so check for it first\r
132     bne     m_read16_not_io\r
133     stmfd   sp!,{lr}\r
134     bl      io_ports_read     @ same as read8\r
135     orr     r0, r0, r0, lsl #8 @ only has bytes mirrored\r
136     ldmfd   sp!,{pc}\r
137 \r
138 m_read16_not_io:\r
139     and     r2, r0, #0xfc00\r
140     cmp     r2, #0x1000\r
141     bne     PicoRead16_32x\r
142 \r
143     ldr     r3, =Pico\r
144     and     r2, r0, #0xff00\r
145     ldr     r0, [r3, #OFS_Pico_m_rotate]\r
146     add     r0, r0, #1\r
147     strb    r0, [r3, #OFS_Pico_m_rotate]\r
148     eor     r0, r0, r0, lsl #5\r
149     eor     r0, r0, r0, lsl #8\r
150     bic     r0, r0, #0x100    @ bit8 defined in this area\r
151     cmp     r2, #0x1100\r
152     bxne    lr                @ not busreq\r
153 \r
154     ldrb    r1, [r3, #OFS_Pico_m_z80Run]\r
155     ldrb    r2, [r3, #OFS_Pico_m_z80_reset]\r
156     orr     r0, r0, r1, lsl #8\r
157     orr     r0, r0, r2, lsl #8\r
158     bx      lr\r
159 \r
160 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
161 \r
162 PicoWrite8_io: @ u32 a, u32 d\r
163     bic     r2, r0, #0x1e       @ most commonly we get i/o port write,\r
164     eor     r2, r2, #0xa10000   @ so check for it first\r
165     eors    r2, r2, #1\r
166     beq     io_ports_write\r
167 \r
168 m_write8_not_io:\r
169     tst     r0, #1\r
170     bne     m_write8_not_z80ctl @ even addrs only\r
171     and     r2, r0, #0xff00\r
172     cmp     r2, #0x1100\r
173     moveq   r0, r1\r
174     beq     ctl_write_z80busreq\r
175     cmp     r2, #0x1200\r
176     moveq   r0, r1\r
177     beq     ctl_write_z80reset\r
178 \r
179 m_write8_not_z80ctl:\r
180     @ unlikely\r
181     eor     r2, r0, #0xa10000\r
182     eor     r2, r2, #0x003000\r
183     eors    r2, r2, #0x0000f1\r
184     bne     PicoWrite8_32x\r
185     ldr     r3, =Pico\r
186     ldrb    r2, [r3, #OFS_Pico_m_sram_reg]\r
187     and     r1, r1, #(SRR_MAPPED|SRR_READONLY)\r
188     bic     r2, r2, #(SRR_MAPPED|SRR_READONLY)\r
189     orr     r2, r2, r1\r
190     strb    r2, [r3, #OFS_Pico_m_sram_reg]\r
191     bx      lr\r
192 \r
193 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
194 \r
195 PicoWrite16_io: @ u32 a, u32 d\r
196     bic     r2, r0, #0x1f    @ most commonly we get i/o port write,\r
197     cmp     r2, #0xa10000    @ so check for it first\r
198     beq     io_ports_write\r
199 \r
200 m_write16_not_io:\r
201     and     r2, r0, #0xff00\r
202     cmp     r2, #0x1100\r
203     moveq   r0, r1, lsr #8\r
204     beq     ctl_write_z80busreq\r
205     cmp     r2, #0x1200\r
206     moveq   r0, r1, lsr #8\r
207     beq     ctl_write_z80reset\r
208 \r
209 m_write16_not_z80ctl:\r
210     @ unlikely\r
211     eor     r2, r0, #0xa10000\r
212     eor     r2, r2, #0x003000\r
213     eors    r2, r2, #0x0000f0\r
214     bne     PicoWrite16_32x\r
215     ldr     r3, =Pico\r
216     ldrb    r2, [r3, #OFS_Pico_m_sram_reg]\r
217     and     r1, r1, #(SRR_MAPPED|SRR_READONLY)\r
218     bic     r2, r2, #(SRR_MAPPED|SRR_READONLY)\r
219     orr     r2, r2, r1\r
220     strb    r2, [r3, #OFS_Pico_m_sram_reg]\r
221     bx      lr\r
222 \r
223 .pool\r
224 \r
225 @ vim:filetype=armasm\r