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