split memories away from Pico
[picodrive.git] / pico / cd / memory_arm.S
CommitLineData
cff531af 1@*
2@* Memory I/O handlers for Sega/Mega CD emulation
3@* (C) notaz, 2007-2009
4@*
5@* This work is licensed under the terms of MAME license.
6@* See COPYING file in the top-level directory.
7@*
4ff2d527 8
88fd63ad 9#include "../pico_int_o32.h"
10
4ff2d527 11.equiv PCM_STEP_SHIFT, 11
4ff2d527 12
13.text
0ace9b9a 14.align 2
15
fa8fb754 16.global PicoRead8_mcd_io
17.global PicoRead16_mcd_io
18.global PicoWrite8_mcd_io
19.global PicoWrite16_mcd_io
0ace9b9a 20
21.global PicoReadS68k8_pr
22.global PicoReadS68k16_pr
23.global PicoWriteS68k8_pr
24.global PicoWriteS68k16_pr
25
26.global PicoReadM68k8_cell0
27.global PicoReadM68k8_cell1
28.global PicoReadM68k16_cell0
29.global PicoReadM68k16_cell1
30.global PicoWriteM68k8_cell0
31.global PicoWriteM68k8_cell1
32.global PicoWriteM68k16_cell0
33.global PicoWriteM68k16_cell1
34
35.global PicoReadS68k8_dec0
36.global PicoReadS68k8_dec1
37.global PicoReadS68k16_dec0
38.global PicoReadS68k16_dec1
39.global PicoWriteS68k8_dec_m0b0
40.global PicoWriteS68k8_dec_m1b0
41.global PicoWriteS68k8_dec_m2b0
42.global PicoWriteS68k8_dec_m0b1
43.global PicoWriteS68k8_dec_m1b1
44.global PicoWriteS68k8_dec_m2b1
45.global PicoWriteS68k16_dec_m0b0
46.global PicoWriteS68k16_dec_m1b0
47.global PicoWriteS68k16_dec_m2b0
48.global PicoWriteS68k16_dec_m0b1
49.global PicoWriteS68k16_dec_m1b1
50.global PicoWriteS68k16_dec_m2b1
4ff2d527 51
52@ externs, just for reference
53.extern Pico
3f23709e 54.extern cdc_host_r
4ff2d527 55.extern m68k_reg_write8
4ff2d527 56.extern s68k_reg_read16
4ff2d527 57.extern s68k_reg_write8
a93a80de 58.extern s68k_reg_write16
2433f409 59.extern s68k_poll_detect
33be04ca 60.extern pcd_pcm_write
61.extern pcd_pcm_read
0ace9b9a 62.extern PicoCpuCS68k
63.extern PicoRead8_io
64.extern PicoRead16_io
65.extern PicoWrite8_io
66.extern PicoWrite16_io
08769494 67.extern m68k_comm_check
4ff2d527 68
4ff2d527 69
70@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
71
72@ utilities
73
74@ r0=addr[in,out], r1,r2=tmp
75.macro cell_map
76 ands r1, r0, #0x01c000
77 ldrne pc, [pc, r1, lsr #12]
78 beq 0f @ most common?
79 .long 0f
80 .long 0f
81 .long 0f
82 .long 0f
83 .long 1f
84 .long 1f
85 .long 2f
86 .long 3f
871: @ x16 cells
88 and r1, r0, #0x7e00 @ col
89 and r2, r0, #0x01fc @ row
90 orr r2, r2, #0x0400
91 orr r1, r2, r1, ror #13
92 b 9f
932: @ x8 cells
94 and r1, r0, #0x3f00 @ col
95 and r2, r0, #0x00fc @ row
96 orr r2, r2, #0x0600
97 orr r1, r2, r1, ror #12
98 b 9f
993: @ x4 cells
100 and r1, r0, #0x1f80 @ col
101 and r2, r0, #0x007c @ row
102 orr r1, r2, r1, ror #11
103 and r2, r0,#0x1e000
104 orr r1, r1, r2, lsr #6
105 b 9f
1060: @ x32 cells
107 and r1, r0, #0xfc00 @ col
108 and r2, r0, #0x03fc @ row
109 orr r1, r2, r1, ror #14
1109:
111 and r0, r0, #3
112 orr r0, r0, r1, ror #26 @ rol 4+2
113.endm
114
115
4ff2d527 116@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
117
118
119m_read_null:
120 mov r0, #0
121 bx lr
122
123
0ace9b9a 124PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
125 mov r3, #0x0c0000
126 b 0f
4ff2d527 127
0ace9b9a 128PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
129 mov r3, #0x0e0000
1300:
4ff2d527 131 cell_map
88fd63ad 132 ldr r1, =Pico
0ace9b9a 133 add r0, r0, r3
88fd63ad 134 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd (used everywhere)
4ff2d527 135 eor r0, r0, #1
136 ldrb r0, [r1, r0]
137 bx lr
138
139
fa8fb754 140PicoRead8_mcd_io:
0ace9b9a 141 and r1, r0, #0xff00
142 cmp r1, #0x2000 @ a120xx?
143 bne PicoRead8_io
4ff2d527 144
88fd63ad 145 ldr r1, =Pico
4ff2d527 146 and r0, r0, #0x3f
88fd63ad 147 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
4ff2d527 148 cmp r0, #0x0e
149 ldrlt pc, [pc, r0, lsl #2]
150 b m_m68k_read8_hi
151 .long m_m68k_read8_r00
152 .long m_m68k_read8_r01
153 .long m_m68k_read8_r02
154 .long m_m68k_read8_r03
155 .long m_m68k_read8_r04
156 .long m_read_null @ unused bits
157 .long m_m68k_read8_r06
158 .long m_m68k_read8_r07
159 .long m_m68k_read8_r08
160 .long m_m68k_read8_r09
161 .long m_read_null @ reserved
162 .long m_read_null
163 .long m_m68k_read8_r0c
164 .long m_m68k_read8_r0d
165m_m68k_read8_r00:
166 add r1, r1, #0x110000
00bd648e 167 ldr r0, [r1, #0x30]
4ff2d527 168 and r0, r0, #0x04000000 @ we need irq2 mask state
169 mov r0, r0, lsr #19
170 bx lr
171m_m68k_read8_r01:
172 add r1, r1, #0x110000
173 add r1, r1, #0x002200
174 ldrb r0, [r1, #2] @ Pico_mcd->m.busreq
175 bx lr
176m_m68k_read8_r02:
177 add r1, r1, #0x110000
178 ldrb r0, [r1, #2]
179 bx lr
cc5ffc3c 180m_m68k_read8_r03:
181 add r1, r1, #0x110000
182 push {r1, lr}
183 bl m68k_comm_check
184 pop {r1, lr}
185 ldrb r0, [r1, #3]
186 and r0, r0, #0xc7
187 bx lr
4ff2d527 188m_m68k_read8_r04:
189 add r1, r1, #0x110000
190 ldrb r0, [r1, #4]
191 bx lr
192m_m68k_read8_r06:
193 ldrb r0, [r1, #0x73] @ IRQ vector
194 bx lr
195m_m68k_read8_r07:
196 ldrb r0, [r1, #0x72]
197 bx lr
198m_m68k_read8_r08:
199 mov r0, #0
3f23709e 200 bl cdc_host_r
4ff2d527 201 mov r0, r0, lsr #8
202 bx lr
203m_m68k_read8_r09:
204 mov r0, #0
3f23709e 205 b cdc_host_r
4ff2d527 206m_m68k_read8_r0c:
207 add r1, r1, #0x110000
208 add r1, r1, #0x002200
209 ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch
210 mov r0, r0, lsr #24
211 bx lr
212m_m68k_read8_r0d:
213 add r1, r1, #0x110000
214 add r1, r1, #0x002200
215 ldr r0, [r1, #0x14]
216 mov r0, r0, lsr #16
217 bx lr
218m_m68k_read8_hi:
219 cmp r0, #0x30
4ff2d527 220 add r1, r1, #0x110000
cc5ffc3c 221 movge r0, #0
222 bxge lr
223 add r1, r0
224 push {r1, lr}
225 bl m68k_comm_check
226 pop {r1, lr}
227 ldrb r0, [r1]
228 bx lr
4ff2d527 229
4ff2d527 230
231@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
232
233
0ace9b9a 234PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
235 mov r3, #0x0c0000
236 b 0f
4ff2d527 237
0ace9b9a 238PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
239 mov r3, #0x0e0000
2400:
4ff2d527 241 cell_map
88fd63ad 242 ldr r1, =Pico
0ace9b9a 243 add r0, r0, r3
88fd63ad 244 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
4ff2d527 245 bic r0, r0, #1
246 ldrh r0, [r1, r0]
247 bx lr
248
249
fa8fb754 250PicoRead16_mcd_io:
0ace9b9a 251 and r1, r0, #0xff00
252 cmp r1, #0x2000 @ a120xx
253 bne PicoRead16_io
4ff2d527 254
255m_m68k_read16_m68k_regs:
88fd63ad 256 ldr r1, =Pico
4ff2d527 257 and r0, r0, #0x3e
88fd63ad 258 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
4ff2d527 259 cmp r0, #0x0e
260 ldrlt pc, [pc, r0, lsl #1]
261 b m_m68k_read16_hi
262 .long m_m68k_read16_r00
263 .long m_m68k_read16_r02
264 .long m_m68k_read16_r04
265 .long m_m68k_read16_r06
266 .long m_m68k_read16_r08
267 .long m_read_null @ reserved
268 .long m_m68k_read16_r0c
269m_m68k_read16_r00:
270 add r1, r1, #0x110000
7a1f6e45 271 ldr r0, [r1, #0x30]
4ff2d527 272 add r1, r1, #0x002200
273 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
274 and r0, r0, #0x04000000 @ we need irq2 mask state
275 orr r0, r1, r0, lsr #11
276 bx lr
cc5ffc3c 277m_m68k_read16_r02:
278 add r1, r1, #0x110000
279 push {r1, lr}
280 bl m68k_comm_check
281 pop {r1, lr}
282 ldrb r2, [r1, #3]
283 ldrb r0, [r1, #2]
c008977e 284 and r2, r2, #0xc7
cc5ffc3c 285 orr r0, r2, r0, lsl #8
286 bx lr
4ff2d527 287m_m68k_read16_r04:
288 add r1, r1, #0x110000
289 ldrb r0, [r1, #4]
290 mov r0, r0, lsl #8
291 bx lr
292m_m68k_read16_r06:
293 ldrh r0, [r1, #0x72] @ IRQ vector
294 bx lr
295m_m68k_read16_r08:
296 mov r0, #0
3f23709e 297 b cdc_host_r
4ff2d527 298m_m68k_read16_r0c:
299 add r1, r1, #0x110000
300 add r1, r1, #0x002200
301 ldr r0, [r1, #0x14]
302 mov r0, r0, lsr #16
303 bx lr
304m_m68k_read16_hi:
305 cmp r0, #0x30
cc5ffc3c 306 add r1, r1, #0x110000
4ff2d527 307 movge r0, #0
308 bxge lr
cc5ffc3c 309
310 add r1, r0, r1
311 push {r1, lr}
312 bl m68k_comm_check
313 pop {r0, lr}
314 ldrh r0, [r0]
315 mov r1, r0, lsr #8
316 and r0, r0, #0xff
317 orr r0, r1, r0, lsl #8
318 bx lr
4ff2d527 319
320
0ace9b9a 321@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
4ff2d527 322
4ff2d527 323
0ace9b9a 324PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
325 mov r12,#0x0c0000
326 b 0f
4ff2d527 327
0ace9b9a 328PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
329 mov r12,#0x0e0000
3300:
331 mov r3, r1
332 cell_map
88fd63ad 333 ldr r2, =Pico
0ace9b9a 334 add r0, r0, r12
88fd63ad 335 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
0ace9b9a 336 ldr r2, [r2]
337 eor r0, r0, #1
338 strb r3, [r2, r0]
4ff2d527 339 bx lr
340
341
fa8fb754 342PicoWrite8_mcd_io:
0ace9b9a 343 and r2, r0, #0xff00
344 cmp r2, #0x2000 @ a120xx?
345 beq m68k_reg_write8
346 b PicoWrite8_io
347
348
4ff2d527 349@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
350
351
0ace9b9a 352PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
353 mov r12, #0x0c0000
354 b 0f
355
356PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
357 mov r12, #0x0e0000
3580:
359 mov r3, r1
360 cell_map
88fd63ad 361 ldr r1, =Pico
0ace9b9a 362 add r0, r0, r12
88fd63ad 363 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
4ff2d527 364 bic r0, r0, #1
0ace9b9a 365 strh r3, [r1, r0]
4ff2d527 366 bx lr
367
368
fa8fb754 369PicoWrite16_mcd_io:
0ace9b9a 370 and r2, r0, #0xff00
371 cmp r2, #0x2000 @ a120xx?
372 bne PicoWrite16_io
4ff2d527 373
0ace9b9a 374m_m68k_write16_regs:
375 and r0, r0, #0x3e
376 cmp r0, #0x0e
377 beq m_m68k_write16_regs_spec
378 and r3, r1, #0xff
379 add r2, r0, #1
380 stmfd sp!,{r2,r3,lr}
381 mov r1, r1, lsr #8
382 bl m68k_reg_write8
383 ldmfd sp!,{r0,r1,lr}
384 b m68k_reg_write8
4ff2d527 385
0ace9b9a 386m_m68k_write16_regs_spec: @ special case
0ace9b9a 387 mov r1, r1, lsr #8
08769494 388 b m68k_reg_write8
4ff2d527 389
390
0ace9b9a 391@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
392@ Sub 68k
393@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
4ff2d527 394
4ff2d527 395
0ace9b9a 396PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
397 mov r3, #0x080000 @ + ^ / 2
398 b 0f
4ff2d527 399
0ace9b9a 400PicoReadS68k8_dec1:
401 mov r3, #0x0a0000 @ + ^ / 2
4020:
88fd63ad 403 ldr r2, =Pico
5c69a605 404 eor r0, r0, #2
88fd63ad 405 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
5c69a605 406 movs r0, r0, lsr #1 @ +4-6 <<16
0ace9b9a 407 add r2, r2, r3 @ map to our address
5c69a605 408 ldrb r0, [r2, r0]
409 movcc r0, r0, lsr #4
410 andcs r0, r0, #0xf
411 bx lr
5c69a605 412
4ff2d527 413
0ace9b9a 414PicoReadS68k8_pr:
415 and r2, r0, #0xfe00
416 cmp r2, #0x8000
417 bne m_s68k_read8_pcm
4ff2d527 418
419m_s68k_read8_regs:
420 bic r0, r0, #0xff0000
421 bic r0, r0, #0x008000
2433f409 422 sub r2, r0, #0x0e
423 cmp r2, #(0x30-0x0e)
424 blo m_s68k_read8_comm
4ff2d527 425 stmfd sp!,{r0,lr}
426 bic r0, r0, #1
a93a80de 427 bl s68k_reg_read16
4ff2d527 428 ldmfd sp!,{r1,lr}
429 tst r1, #1
430 moveq r0, r0, lsr #8
431 and r0, r0, #0xff
432 bx lr
433
2433f409 434m_s68k_read8_comm:
88fd63ad 435 ldr r1, =Pico
436 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
2433f409 437 add r1, r1, #0x110000
438 ldrb r1, [r1, r0]
334d9fb6 439 bic r0, r0, #1
2433f409 440 b s68k_poll_detect
441
4ff2d527 442
0ace9b9a 443m_s68k_read8_pcm:
444 tst r0, #0x8000
445 bne m_read_null
4ff2d527 446
0ace9b9a 447 @ must not trash r3 and r12
88fd63ad 448 ldr r1, =Pico
0ace9b9a 449 bic r0, r0, #0xff0000
88fd63ad 450 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
0ace9b9a 451 mov r2, #0x110000
452 orr r2, r2, #0x002200
453 cmp r0, #0x2000
454 bge m_s68k_read8_pcm_ram
455 cmp r0, #0x20
33be04ca 456 movge r0, r0, lsr #1
457 bge pcd_pcm_read
458 mov r0, #0
5c69a605 459 bx lr
4ff2d527 460
0ace9b9a 461m_s68k_read8_pcm_ram:
462 orr r2, r2, #0x40
463 ldr r2, [r1, r2]
464 add r1, r1, #0x100000 @ pcm_ram
465 and r2, r2, #0x0f000000 @ bank
466 add r1, r1, r2, lsr #12
467 bic r0, r0, #0x00e000
468 mov r0, r0, lsr #1
469 ldrb r0, [r1, r0]
470 bx lr
4ff2d527 471
472
473@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
474
475
0ace9b9a 476PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
477 mov r3, #0x080000 @ + ^ / 2
478 b 0f
5c69a605 479
0ace9b9a 480PicoReadS68k16_dec1:
481 mov r3, #0x0a0000 @ + ^ / 2
4820:
88fd63ad 483 ldr r2, =Pico
5c69a605 484 eor r0, r0, #2
88fd63ad 485 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
5c69a605 486 mov r0, r0, lsr #1 @ +4-6 <<16
0ace9b9a 487 add r2, r2, r3 @ map to our address
488 ldrb r0, [r2, r0]
5c69a605 489 orr r0, r0, r0, lsl #4
490 bic r0, r0, #0xf0
5c69a605 491 bx lr
4ff2d527 492
493
0ace9b9a 494PicoReadS68k16_pr:
495 and r2, r0, #0xfe00
496 cmp r2, #0x8000
497 @ pcm is on 8-bit bus, would this be same as byte access?
498 bne m_s68k_read8_pcm
4ff2d527 499
0ace9b9a 500m_s68k_read16_regs:
4ff2d527 501 bic r0, r0, #0xff0000
502 bic r0, r0, #0x008000
503 bic r0, r0, #0x000001
0ace9b9a 504 cmp r0, #8
505 bne s68k_reg_read16
506 mov r0, #1
3f23709e 507 b cdc_host_r
4ff2d527 508
4ff2d527 509
510@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
511
512
0ace9b9a 513.macro m_s68k_write8_2M_decode
88fd63ad 514 ldr r2, =Pico
48e8482f 515 eor r0, r0, #2
88fd63ad 516 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
48e8482f 517 movs r0, r0, lsr #1 @ +4-6 <<16
0ace9b9a 518 add r2, r2, r3 @ map to our address
48e8482f 519.endm
520
0ace9b9a 521PicoWriteS68k8_dec_m2b0: @ overwrite
522 ands r1, r1, #0x0f
523 bxeq lr
524
525PicoWriteS68k8_dec_m0b0:
526 mov r3, #0x080000
527 b 0f
528
529PicoWriteS68k8_dec_m2b1: @ overwrite
530 ands r1, r1, #0x0f
531 bxeq lr
532
533PicoWriteS68k8_dec_m0b1:
534 mov r3, #0x0a0000
5350:
536 m_s68k_write8_2M_decode
48e8482f 537 ldrb r0, [r2, r0]!
538 and r1, r1, #0x0f
539 movcc r1, r1, lsl #4
540 andcc r3, r0, #0x0f
541 andcs r3, r0, #0xf0
542 orr r3, r3, r1
48e8482f 543 strneb r3, [r2]
544 bx lr
48e8482f 545
0ace9b9a 546PicoWriteS68k8_dec_m1b0: @ underwrite
547 mov r3, #0x080000
548 b 0f
549
550PicoWriteS68k8_dec_m1b1:
551 mov r3, #0x0a0000
5520:
48e8482f 553 ands r1, r1, #0x0f
554 bxeq lr
0ace9b9a 555 m_s68k_write8_2M_decode
48e8482f 556 ldrb r0, [r2, r0]!
557 movcc r1, r1, lsl #4
558 andcc r3, r0, #0x0f
559 andcs r3, r0, #0xf0
0ace9b9a 560 teq r3, r0
561 bxne lr
48e8482f 562 orr r3, r3, r1
48e8482f 563 strneb r3, [r2]
564 bx lr
48e8482f 565
48e8482f 566
0ace9b9a 567PicoWriteS68k8_pr:
568 and r2, r0, #0xfe00
569 cmp r2, #0x8000
570 bne m_s68k_write8_pcm
48e8482f 571
0ace9b9a 572m_s68k_write8_regs:
4ff2d527 573 bic r0, r0, #0xff0000
0ace9b9a 574 bic r0, r0, #0x008000
575 tst r0, #0x7e00
576 movne r0, #0
577 bxne lr
a93a80de 578 sub r2, r0, #0x59
579 cmp r2, #0x0f
0ace9b9a 580 bhs s68k_reg_write8
581 bic r0, r0, #1
582 orr r1, r1, r1, lsl #8
a93a80de 583 b s68k_reg_write16
4ff2d527 584
585
586m_s68k_write8_pcm:
0ace9b9a 587 tst r0, #0x8000
588 bxne lr
4ff2d527 589 bic r0, r0, #0xff0000
590 cmp r0, #0x12
591 movlt r0, r0, lsr #1
33be04ca 592 blt pcd_pcm_write
4ff2d527 593
594 cmp r0, #0x2000
595 bxlt lr
596
597m_s68k_write8_pcm_ram:
88fd63ad 598 ldr r3, =Pico
4ff2d527 599 bic r0, r0, #0x00e000
88fd63ad 600 ldr r3, [r3, #OFS_Pico_rom] @ Pico.mcd
4ff2d527 601 mov r0, r0, lsr #1
602 add r2, r3, #0x110000
603 add r2, r2, #0x002200
604 add r2, r2, #0x000040
605 ldr r2, [r2]
606 add r3, r3, #0x100000 @ pcm_ram
607 and r2, r2, #0x0f000000 @ bank
608 add r3, r3, r2, lsr #12
609 strb r1, [r3, r0]
610 bx lr
611
612
4ff2d527 613@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
614
615
0ace9b9a 616.macro m_s68k_write16_2M_decode
88fd63ad 617 ldr r2, =Pico
48e8482f 618 eor r0, r0, #2
88fd63ad 619 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
48e8482f 620 mov r0, r0, lsr #1 @ +4-6 <<16
0ace9b9a 621 add r2, r2, r3 @ map to our address
48e8482f 622.endm
623
0ace9b9a 624PicoWriteS68k16_dec_m0b0:
625 mov r3, #0x080000
626 b 0f
627
628PicoWriteS68k16_dec_m0b1:
629 mov r3, #0x0a0000
6300:
631 m_s68k_write16_2M_decode
48e8482f 632 bic r1, r1, #0xf0
633 orr r1, r1, r1, lsr #4
634 strb r1, [r2, r0]
635 bx lr
48e8482f 636
0ace9b9a 637PicoWriteS68k16_dec_m1b0: @ underwrite
638 mov r3, #0x080000
639 b 0f
640
641PicoWriteS68k16_dec_m1b1:
642 mov r3, #0x0a0000
6430:
48e8482f 644 bics r1, r1, #0xf000
645 bicnes r1, r1, #0x00f0
646 bxeq lr
647 orr r1, r1, r1, lsr #4
0ace9b9a 648 m_s68k_write16_2M_decode
48e8482f 649 ldrb r0, [r2, r0]!
650 and r3, r1, #0x0f
651 and r1, r1, #0xf0
652 tst r0, #0x0f
653 orreq r0, r0, r3
654 tst r0, #0xf0
655 orreq r0, r0, r1
656 strb r0, [r2]
657 bx lr
48e8482f 658
0ace9b9a 659PicoWriteS68k16_dec_m2b0: @ overwrite
660 mov r3, #0x080000
661 b 0f
662
663PicoWriteS68k16_dec_m2b1:
664 mov r3, #0x0a0000
6650:
48e8482f 666 bics r1, r1, #0xf000
667 bicnes r1, r1, #0x00f0
668 bxeq lr
669 orr r1, r1, r1, lsr #4
0ace9b9a 670 m_s68k_write16_2M_decode
48e8482f 671 ldrb r0, [r2, r0]!
672 ands r3, r1, #0x0f
673 andne r0, r0, #0xf0
674 orrne r0, r0, r3
675 ands r1, r1, #0xf0
676 andne r0, r0, #0x0f
677 orrne r0, r0, r1
678 strb r0, [r2]
679 bx lr
48e8482f 680
4ff2d527 681
0ace9b9a 682PicoWriteS68k16_pr:
683 and r2, r0, #0xfe00
684 cmp r2, #0x8000
685 bne m_s68k_write8_pcm
4ff2d527 686
687m_s68k_write16_regs:
688 bic r0, r0, #0xff0000
689 bic r0, r0, #0x008000
5c69a605 690 bic r0, r0, #1
4ff2d527 691 tst r0, #0x7e00
692 movne r0, #0
693 bxne lr
5c69a605 694 cmp r0, #0x0e
a93a80de 695 bne s68k_reg_write16
4ff2d527 696
5c69a605 697m_s68k_write16_regs_spec: @ special case
88fd63ad 698 ldr r2, =Pico
5c69a605 699 mov r0, #0x110000
88fd63ad 700 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
5c69a605 701 add r0, r0, #0x00000f
702 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
48e8482f 703 bx lr
4ff2d527 704
0ace9b9a 705.pool
6cadc2da 706
cff531af 707@ vim:filetype=armasm