3 * (C) notaz, 2006-2009
\r
4 * (C) irixxxx, 2019,2020
\r
6 * This work is licensed under the terms of MAME license.
\r
7 * See COPYING file in the top-level directory.
\r
10 #include "arm_features.h"
\r
11 #include "pico_int_offs.h"
\r
13 .equ SRR_MAPPED, (1 << 0)
\r
14 .equ SRR_READONLY, (1 << 1)
\r
15 .equ SRF_EEPROM, (1 << 1)
\r
16 .equ POPT_EN_32X, (1 << 20)
\r
21 .global PicoRead8_sram
\r
22 .global PicoRead8_io
\r
23 .global PicoRead16_sram
\r
24 .global PicoRead16_io
\r
25 .global PicoWrite8_io
\r
26 .global PicoWrite16_io
\r
30 PicoRead8_sram: @ u32 a
\r
31 PIC_LDR(r3, r1, Pico)
\r
32 ldr r1, [r3, #OFS_Pico_sv_end]
\r
35 ldr r2, [r3, #OFS_Pico_sv_start]
\r
38 ldrb r1, [r3, #OFS_Pico_m_sram_reg]
\r
41 ldr r1, [r3, #OFS_Pico_sv_flags]
\r
44 ldr r1, [r3, #OFS_Pico_sv_data]
\r
50 ldr r1, [r3, #OFS_Pico_romsize]
\r
53 bxgt lr @ bad location
\r
54 @ XXX: banking unfriendly
\r
55 ldr r1, [r3, #OFS_Pico_rom]
\r
65 moveq r0, r0, lsr #8
\r
70 PicoRead8_io: @ u32 a
\r
71 bic r2, r0, #0x001f @ most commonly we get i/o port read,
\r
72 cmp r2, #0xa10000 @ so check for it first
\r
80 PIC_LDR(r3, r1, Pico)
\r
82 ldr r0, [r3, #OFS_Pico_m_rotate]
\r
84 strb r0, [r3, #OFS_Pico_m_rotate]
\r
85 eor r0, r0, r0, lsl #6
\r
88 bxne lr @ odd addr -> open bus
\r
89 bic r0, r0, #1 @ bit0 defined in this area
\r
92 bxne lr @ not busreq
\r
94 ldrb r1, [r3, #OFS_Pico_m_z80Run]
\r
95 ldrb r2, [r3, #OFS_Pico_m_z80_reset]
\r
100 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
102 PicoRead16_sram: @ u32 a, u32 d
\r
103 PIC_LDR(r3, r1, Pico)
\r
104 ldr r1, [r3, #OFS_Pico_sv_end]
\r
106 bgt m_read16_nosram
\r
107 ldr r2, [r3, #OFS_Pico_sv_start]
\r
109 blt m_read16_nosram
\r
110 ldrb r1, [r3, #OFS_Pico_m_sram_reg]
\r
111 tst r1, #SRR_MAPPED
\r
112 beq m_read16_nosram
\r
113 ldr r1, [r3, #OFS_Pico_sv_flags]
\r
114 tst r1, #SRF_EEPROM
\r
116 ldr r1, [r3, #OFS_Pico_sv_data]
\r
120 orr r0, r0, r1, lsl #8
\r
124 ldr r1, [r3, #OFS_Pico_romsize]
\r
127 bxgt lr @ bad location
\r
128 @ XXX: banking unfriendly
\r
129 ldr r1, [r3, #OFS_Pico_rom]
\r
134 PicoRead16_io: @ u32 a, u32 d
\r
135 bic r2, r0, #0x001f @ most commonly we get i/o port read,
\r
136 cmp r2, #0xa10000 @ so check for it first
\r
137 bne m_read16_not_io
\r
139 bl io_ports_read @ same as read8
\r
140 orr r0, r0, r0, lsl #8 @ only has bytes mirrored
\r
144 and r2, r0, #0xfc00
\r
148 PIC_LDR(r3, r2, Pico)
\r
149 and r2, r0, #0xff00
\r
150 ldr r0, [r3, #OFS_Pico_m_rotate]
\r
152 strb r0, [r3, #OFS_Pico_m_rotate]
\r
153 eor r0, r0, r0, lsl #5
\r
154 eor r0, r0, r0, lsl #8
\r
155 bic r0, r0, #0x100 @ bit8 defined in this area
\r
157 bxne lr @ not busreq
\r
159 ldrb r1, [r3, #OFS_Pico_m_z80Run]
\r
160 ldrb r2, [r3, #OFS_Pico_m_z80_reset]
\r
161 orr r0, r0, r1, lsl #8
\r
162 orr r0, r0, r2, lsl #8
\r
165 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
167 PicoWrite8_io: @ u32 a, u32 d
\r
168 bic r2, r0, #0x1e @ most commonly we get i/o port write,
\r
169 eor r2, r2, #0xa10000 @ so check for it first
\r
175 bne m_write8_not_z80ctl @ even addrs only
\r
176 and r2, r0, #0xff00
\r
179 beq ctl_write_z80busreq
\r
182 beq ctl_write_z80reset
\r
184 m_write8_not_z80ctl:
\r
186 eor r2, r0, #0xa10000
\r
187 eor r2, r2, #0x003000
\r
188 eors r2, r2, #0x0000f1
\r
190 PIC_LDR(r3, r2, Pico)
\r
191 ldrb r2, [r3, #OFS_Pico_m_sram_reg]
\r
192 and r1, r1, #(SRR_MAPPED|SRR_READONLY)
\r
193 bic r2, r2, #(SRR_MAPPED|SRR_READONLY)
\r
195 strb r2, [r3, #OFS_Pico_m_sram_reg]
\r
198 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
200 PicoWrite16_io: @ u32 a, u32 d
\r
201 bic r2, r0, #0x1f @ most commonly we get i/o port write,
\r
202 cmp r2, #0xa10000 @ so check for it first
\r
206 and r2, r0, #0xff00
\r
208 moveq r0, r1, lsr #8
\r
209 beq ctl_write_z80busreq
\r
211 moveq r0, r1, lsr #8
\r
212 beq ctl_write_z80reset
\r
214 m_write16_not_z80ctl:
\r
216 eor r2, r0, #0xa10000
\r
217 eor r2, r2, #0x003000
\r
218 eors r2, r2, #0x0000f0
\r
219 bne PicoWrite16_32x
\r
220 PIC_LDR(r3, r2, Pico)
\r
221 ldrb r2, [r3, #OFS_Pico_m_sram_reg]
\r
222 and r1, r1, #(SRR_MAPPED|SRR_READONLY)
\r
223 bic r2, r2, #(SRR_MAPPED|SRR_READONLY)
\r
225 strb r2, [r3, #OFS_Pico_m_sram_reg]
\r
229 .global m68k_read16
\r
230 .global m68k_read32
\r
231 .global m68k_write8
\r
232 .global m68k_write16
\r
233 .global m68k_write32
\r
236 PIC_LDR(r3, r2, m68k_read8_map)
\r
237 bic r0, r0, #0xff000000
\r
238 mov r2, r0, lsr #16
\r
239 ldr r3, [r3, r2, lsl #2]
\r
241 movs r3, r3, lsl #1
\r
242 ldrccb r0, [r3, r2]
\r
247 PIC_LDR(r3, r2, m68k_read16_map)
\r
248 bic r0, r0, #0xff000000
\r
249 mov r2, r0, lsr #16
\r
250 ldr r3, [r3, r2, lsl #2]
\r
252 movs r3, r3, lsl #1
\r
253 ldrcch r0, [r3, r0]
\r
258 PIC_LDR(r3, r2, m68k_read16_map)
\r
259 bic r0, r0, #0xff000000
\r
260 mov r2, r0, lsr #16
\r
261 ldr r3, [r3, r2, lsl #2]
\r
263 movs r3, r3, lsl #1
\r
264 ldrcch r1, [r3, r0]!
\r
265 ldrcch r0, [r3, #2]
\r
266 orrcc r0, r0, r1, lsl #16
\r
269 stmfd sp!, {r0, r3, r4, lr}
\r
272 ldmfd sp!, {r1, r3}
\r
277 ldmfd sp!, {r1, lr}
\r
278 mov r0, r0, lsl #16
\r
279 mov r1, r1, lsl #16
\r
280 orr r0, r1, r0, lsr #16
\r
284 PIC_LDR(r3, r2, m68k_write8_map)
\r
285 bic r0, r0, #0xff000000
\r
286 mov r2, r0, lsr #16
\r
287 ldr r3, [r3, r2, lsl #2]
\r
289 movs r3, r3, lsl #1
\r
290 strccb r1, [r3, r2]
\r
295 PIC_LDR(r3, r2, m68k_write16_map)
\r
296 bic r0, r0, #0xff000000
\r
297 mov r2, r0, lsr #16
\r
298 ldr r3, [r3, r2, lsl #2]
\r
300 movs r3, r3, lsl #1
\r
301 strcch r1, [r3, r0]
\r
306 PIC_LDR(r3, r2, m68k_write16_map)
\r
307 bic r0, r0, #0xff000000
\r
308 mov r2, r0, lsr #16
\r
309 ldr r3, [r3, r2, lsl #2]
\r
311 movs r3, r3, lsl #1
\r
312 movcc r2, r1, lsr #16
\r
313 strcch r2, [r3, r0]!
\r
314 strcch r1, [r3, #2]
\r
317 stmfd sp!, {r0, r1, r3, lr}
\r
318 mov r1, r1, lsr #16
\r
321 ldmfd sp!, {r0, r1, r3, lr}
\r
327 @ vim:filetype=armasm
\r