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