cd: clean up dmna handling, stuff
[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
08769494 177m_m68k_read8_r03: @ FIXME: sync with C
178 add r2, r1, #0x110000
179 ldrb r1, [r2, #3]
180 add r2, r2, #0x002200
181 ldr r2, [r2, #4]
182 and r1, r1, #0xc7
183 tst r2, #2 @ DMNA pending?
184 bicne r1, r1, #1
185 orrne r1, r1, #2
186 b m68k_comm_check
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
219 movge r0, #0
220 bxeq lr
221 add r1, r1, #0x110000
08769494 222 ldrb r1, [r1, r0]
223 b m68k_comm_check
4ff2d527 224
4ff2d527 225
226@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
227
228
0ace9b9a 229PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
230 mov r3, #0x0c0000
231 b 0f
4ff2d527 232
0ace9b9a 233PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
234 mov r3, #0x0e0000
2350:
4ff2d527 236 cell_map
237 ldr r1, =(Pico+0x22200)
0ace9b9a 238 add r0, r0, r3
4ff2d527 239 ldr r1, [r1]
240 bic r0, r0, #1
241 ldrh r0, [r1, r0]
242 bx lr
243
244
0ace9b9a 245PicoReadM68k16_io:
246 and r1, r0, #0xff00
247 cmp r1, #0x2000 @ a120xx
248 bne PicoRead16_io
4ff2d527 249
250m_m68k_read16_m68k_regs:
251 ldr r1, =(Pico+0x22200)
252 and r0, r0, #0x3e
253 ldr r1, [r1] @ Pico.mcd (used everywhere)
254 cmp r0, #0x0e
255 ldrlt pc, [pc, r0, lsl #1]
256 b m_m68k_read16_hi
257 .long m_m68k_read16_r00
258 .long m_m68k_read16_r02
259 .long m_m68k_read16_r04
260 .long m_m68k_read16_r06
261 .long m_m68k_read16_r08
262 .long m_read_null @ reserved
263 .long m_m68k_read16_r0c
264m_m68k_read16_r00:
265 add r1, r1, #0x110000
7a1f6e45 266 ldr r0, [r1, #0x30]
4ff2d527 267 add r1, r1, #0x002200
268 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
269 and r0, r0, #0x04000000 @ we need irq2 mask state
270 orr r0, r1, r0, lsr #11
271 bx lr
08769494 272m_m68k_read16_r02: @ FIXME: out of sync from C
273 add r3, r1, #0x110000
274 ldrb r1, [r3, #2]
275 ldrb r2, [r3, #3]
276 add r3, r3, #0x002200
277 ldr r3, [r3, #4]
c008977e 278 and r2, r2, #0xc7
08769494 279 orr r1, r2, r1, lsl #8
280 tst r3, #2 @ DMNA pending?
281 bicne r1, r1, #1
282 orrne r1, r1, #2
283 b m68k_comm_check
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
303 addlt r1, r1, #0x110000
304 ldrlth r1, [r1, r0]
305 movge r0, #0
306 bxge lr
08769494 307 mov r2, r1, lsr #8
4ff2d527 308 and r1, r1, #0xff
08769494 309 orr r1, r2, r1, lsl #8
310 b m68k_comm_check
4ff2d527 311
312
0ace9b9a 313@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
4ff2d527 314
4ff2d527 315
0ace9b9a 316PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
317 mov r12,#0x0c0000
318 b 0f
4ff2d527 319
0ace9b9a 320PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
321 mov r12,#0x0e0000
3220:
323 mov r3, r1
324 cell_map
325 ldr r2, =(Pico+0x22200)
326 add r0, r0, r12
327 ldr r2, [r2]
328 eor r0, r0, #1
329 strb r3, [r2, r0]
4ff2d527 330 bx lr
331
332
0ace9b9a 333PicoWriteM68k8_io:
334 and r2, r0, #0xff00
335 cmp r2, #0x2000 @ a120xx?
336 beq m68k_reg_write8
337 b PicoWrite8_io
338
339
4ff2d527 340@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
341
342
0ace9b9a 343PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
344 mov r12, #0x0c0000
345 b 0f
346
347PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
348 mov r12, #0x0e0000
3490:
350 mov r3, r1
351 cell_map
4ff2d527 352 ldr r1, =(Pico+0x22200)
0ace9b9a 353 add r0, r0, r12
4ff2d527 354 ldr r1, [r1]
355 bic r0, r0, #1
0ace9b9a 356 strh r3, [r1, r0]
4ff2d527 357 bx lr
358
359
0ace9b9a 360PicoWriteM68k16_io:
361 and r2, r0, #0xff00
362 cmp r2, #0x2000 @ a120xx?
363 bne PicoWrite16_io
4ff2d527 364
0ace9b9a 365m_m68k_write16_regs:
366 and r0, r0, #0x3e
367 cmp r0, #0x0e
368 beq m_m68k_write16_regs_spec
369 and r3, r1, #0xff
370 add r2, r0, #1
371 stmfd sp!,{r2,r3,lr}
372 mov r1, r1, lsr #8
373 bl m68k_reg_write8
374 ldmfd sp!,{r0,r1,lr}
375 b m68k_reg_write8
4ff2d527 376
0ace9b9a 377m_m68k_write16_regs_spec: @ special case
0ace9b9a 378 mov r1, r1, lsr #8
08769494 379 b m68k_reg_write8
4ff2d527 380
381
0ace9b9a 382@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
383@ Sub 68k
384@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
4ff2d527 385
4ff2d527 386
0ace9b9a 387PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
388 mov r3, #0x080000 @ + ^ / 2
389 b 0f
4ff2d527 390
0ace9b9a 391PicoReadS68k8_dec1:
392 mov r3, #0x0a0000 @ + ^ / 2
3930:
5c69a605 394 ldr r2, =(Pico+0x22200)
395 eor r0, r0, #2
396 ldr r2, [r2]
397 movs r0, r0, lsr #1 @ +4-6 <<16
0ace9b9a 398 add r2, r2, r3 @ map to our address
5c69a605 399 ldrb r0, [r2, r0]
400 movcc r0, r0, lsr #4
401 andcs r0, r0, #0xf
402 bx lr
5c69a605 403
4ff2d527 404
0ace9b9a 405PicoReadS68k8_pr:
406 and r2, r0, #0xfe00
407 cmp r2, #0x8000
408 bne m_s68k_read8_pcm
4ff2d527 409
410m_s68k_read8_regs:
411 bic r0, r0, #0xff0000
412 bic r0, r0, #0x008000
2433f409 413 sub r2, r0, #0x0e
414 cmp r2, #(0x30-0x0e)
415 blo m_s68k_read8_comm
4ff2d527 416 sub r2, r0, #0x58
417 cmp r2, #0x10
418 ldrlo r2, =gfx_cd_read
419 ldrhs r2, =s68k_reg_read16
420 stmfd sp!,{r0,lr}
421 bic r0, r0, #1
422 mov lr, pc
423 bx r2
424 ldmfd sp!,{r1,lr}
425 tst r1, #1
426 moveq r0, r0, lsr #8
427 and r0, r0, #0xff
428 bx lr
429
2433f409 430m_s68k_read8_comm:
431 ldr r1, =(Pico+0x22200)
432 ldr r1, [r1]
433 add r1, r1, #0x110000
434 ldrb r1, [r1, r0]
435 b s68k_poll_detect
436
4ff2d527 437
0ace9b9a 438m_s68k_read8_pcm:
439 tst r0, #0x8000
440 bne m_read_null
4ff2d527 441
0ace9b9a 442 @ must not trash r3 and r12
4ff2d527 443 ldr r1, =(Pico+0x22200)
0ace9b9a 444 bic r0, r0, #0xff0000
445@ bic r0, r0, #0x008000
4ff2d527 446 ldr r1, [r1]
0ace9b9a 447 mov r2, #0x110000
448 orr r2, r2, #0x002200
449 cmp r0, #0x2000
450 bge m_s68k_read8_pcm_ram
451 cmp r0, #0x20
452 movlt r0, #0
453 bxlt lr
454 orr r2, r2, #(0x48+8) @ pcm.ch + addr_offset
455 add r1, r1, r2
456 and r2, r0, #0x1c
457 ldr r1, [r1, r2, lsl #2]
458 tst r0, #2
459 moveq r0, r1, lsr #PCM_STEP_SHIFT
460 movne r0, r1, lsr #(PCM_STEP_SHIFT+8)
461 and r0, r0, #0xff
5c69a605 462 bx lr
4ff2d527 463
0ace9b9a 464m_s68k_read8_pcm_ram:
465 orr r2, r2, #0x40
466 ldr r2, [r1, r2]
467 add r1, r1, #0x100000 @ pcm_ram
468 and r2, r2, #0x0f000000 @ bank
469 add r1, r1, r2, lsr #12
470 bic r0, r0, #0x00e000
471 mov r0, r0, lsr #1
472 ldrb r0, [r1, r0]
473 bx lr
4ff2d527 474
475
476@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
477
478
0ace9b9a 479PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
480 mov r3, #0x080000 @ + ^ / 2
481 b 0f
5c69a605 482
0ace9b9a 483PicoReadS68k16_dec1:
484 mov r3, #0x0a0000 @ + ^ / 2
4850:
5c69a605 486 ldr r2, =(Pico+0x22200)
487 eor r0, r0, #2
488 ldr r2, [r2]
489 mov r0, r0, lsr #1 @ +4-6 <<16
0ace9b9a 490 add r2, r2, r3 @ map to our address
491 ldrb r0, [r2, r0]
5c69a605 492 orr r0, r0, r0, lsl #4
493 bic r0, r0, #0xf0
5c69a605 494 bx lr
4ff2d527 495
496
0ace9b9a 497PicoReadS68k16_pr:
498 and r2, r0, #0xfe00
499 cmp r2, #0x8000
500 @ pcm is on 8-bit bus, would this be same as byte access?
501 bne m_s68k_read8_pcm
4ff2d527 502
0ace9b9a 503m_s68k_read16_regs:
4ff2d527 504 bic r0, r0, #0xff0000
505 bic r0, r0, #0x008000
506 bic r0, r0, #0x000001
4ff2d527 507 sub r2, r0, #0x58
508 cmp r2, #0x10
0ace9b9a 509 blo gfx_cd_read
510 cmp r0, #8
511 bne s68k_reg_read16
512 mov r0, #1
513 b Read_CDC_Host
4ff2d527 514
4ff2d527 515
516@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
517
518
0ace9b9a 519.macro m_s68k_write8_2M_decode
48e8482f 520 ldr r2, =(Pico+0x22200)
521 eor r0, r0, #2
0ace9b9a 522 ldr r2, [r2] @ Pico.rom
48e8482f 523 movs r0, r0, lsr #1 @ +4-6 <<16
0ace9b9a 524 add r2, r2, r3 @ map to our address
48e8482f 525.endm
526
0ace9b9a 527PicoWriteS68k8_dec_m2b0: @ overwrite
528 ands r1, r1, #0x0f
529 bxeq lr
530
531PicoWriteS68k8_dec_m0b0:
532 mov r3, #0x080000
533 b 0f
534
535PicoWriteS68k8_dec_m2b1: @ overwrite
536 ands r1, r1, #0x0f
537 bxeq lr
538
539PicoWriteS68k8_dec_m0b1:
540 mov r3, #0x0a0000
5410:
542 m_s68k_write8_2M_decode
48e8482f 543 ldrb r0, [r2, r0]!
544 and r1, r1, #0x0f
545 movcc r1, r1, lsl #4
546 andcc r3, r0, #0x0f
547 andcs r3, r0, #0xf0
548 orr r3, r3, r1
48e8482f 549 strneb r3, [r2]
550 bx lr
48e8482f 551
0ace9b9a 552PicoWriteS68k8_dec_m1b0: @ underwrite
553 mov r3, #0x080000
554 b 0f
555
556PicoWriteS68k8_dec_m1b1:
557 mov r3, #0x0a0000
5580:
48e8482f 559 ands r1, r1, #0x0f
560 bxeq lr
0ace9b9a 561 m_s68k_write8_2M_decode
48e8482f 562 ldrb r0, [r2, r0]!
563 movcc r1, r1, lsl #4
564 andcc r3, r0, #0x0f
565 andcs r3, r0, #0xf0
0ace9b9a 566 teq r3, r0
567 bxne lr
48e8482f 568 orr r3, r3, r1
48e8482f 569 strneb r3, [r2]
570 bx lr
48e8482f 571
48e8482f 572
0ace9b9a 573PicoWriteS68k8_pr:
574 and r2, r0, #0xfe00
575 cmp r2, #0x8000
576 bne m_s68k_write8_pcm
48e8482f 577
0ace9b9a 578m_s68k_write8_regs:
4ff2d527 579 bic r0, r0, #0xff0000
0ace9b9a 580 bic r0, r0, #0x008000
581 tst r0, #0x7e00
582 movne r0, #0
583 bxne lr
584 sub r2, r0, #0x58
585 cmp r2, #0x10
586 bhs s68k_reg_write8
587 bic r0, r0, #1
588 orr r1, r1, r1, lsl #8
589 b gfx_cd_write16
4ff2d527 590
591
592m_s68k_write8_pcm:
0ace9b9a 593 tst r0, #0x8000
594 bxne lr
4ff2d527 595 bic r0, r0, #0xff0000
596 cmp r0, #0x12
597 movlt r0, r0, lsr #1
598 blt pcm_write
599
600 cmp r0, #0x2000
601 bxlt lr
602
603m_s68k_write8_pcm_ram:
604 ldr r3, =(Pico+0x22200)
605 bic r0, r0, #0x00e000
606 ldr r3, [r3]
607 mov r0, r0, lsr #1
608 add r2, r3, #0x110000
609 add r2, r2, #0x002200
610 add r2, r2, #0x000040
611 ldr r2, [r2]
612 add r3, r3, #0x100000 @ pcm_ram
613 and r2, r2, #0x0f000000 @ bank
614 add r3, r3, r2, lsr #12
615 strb r1, [r3, r0]
616 bx lr
617
618
4ff2d527 619@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
620
621
0ace9b9a 622.macro m_s68k_write16_2M_decode
48e8482f 623 ldr r2, =(Pico+0x22200)
624 eor r0, r0, #2
625 ldr r2, [r2]
626 mov r0, r0, lsr #1 @ +4-6 <<16
0ace9b9a 627 add r2, r2, r3 @ map to our address
48e8482f 628.endm
629
0ace9b9a 630PicoWriteS68k16_dec_m0b0:
631 mov r3, #0x080000
632 b 0f
633
634PicoWriteS68k16_dec_m0b1:
635 mov r3, #0x0a0000
6360:
637 m_s68k_write16_2M_decode
48e8482f 638 bic r1, r1, #0xf0
639 orr r1, r1, r1, lsr #4
640 strb r1, [r2, r0]
641 bx lr
48e8482f 642
0ace9b9a 643PicoWriteS68k16_dec_m1b0: @ underwrite
644 mov r3, #0x080000
645 b 0f
646
647PicoWriteS68k16_dec_m1b1:
648 mov r3, #0x0a0000
6490:
48e8482f 650 bics r1, r1, #0xf000
651 bicnes r1, r1, #0x00f0
652 bxeq lr
653 orr r1, r1, r1, lsr #4
0ace9b9a 654 m_s68k_write16_2M_decode
48e8482f 655 ldrb r0, [r2, r0]!
656 and r3, r1, #0x0f
657 and r1, r1, #0xf0
658 tst r0, #0x0f
659 orreq r0, r0, r3
660 tst r0, #0xf0
661 orreq r0, r0, r1
662 strb r0, [r2]
663 bx lr
48e8482f 664
0ace9b9a 665PicoWriteS68k16_dec_m2b0: @ overwrite
666 mov r3, #0x080000
667 b 0f
668
669PicoWriteS68k16_dec_m2b1:
670 mov r3, #0x0a0000
6710:
48e8482f 672 bics r1, r1, #0xf000
673 bicnes r1, r1, #0x00f0
674 bxeq lr
675 orr r1, r1, r1, lsr #4
0ace9b9a 676 m_s68k_write16_2M_decode
48e8482f 677 ldrb r0, [r2, r0]!
678 ands r3, r1, #0x0f
679 andne r0, r0, #0xf0
680 orrne r0, r0, r3
681 ands r1, r1, #0xf0
682 andne r0, r0, #0x0f
683 orrne r0, r0, r1
684 strb r0, [r2]
685 bx lr
48e8482f 686
4ff2d527 687
0ace9b9a 688PicoWriteS68k16_pr:
689 and r2, r0, #0xfe00
690 cmp r2, #0x8000
691 bne m_s68k_write8_pcm
4ff2d527 692
693m_s68k_write16_regs:
694 bic r0, r0, #0xff0000
695 bic r0, r0, #0x008000
5c69a605 696 bic r0, r0, #1
4ff2d527 697 tst r0, #0x7e00
698 movne r0, #0
699 bxne lr
5c69a605 700 cmp r0, #0x0e
701 beq m_s68k_write16_regs_spec
4ff2d527 702 sub r2, r0, #0x58
703 cmp r2, #0x10
5c69a605 704 blo gfx_cd_write16
4ff2d527 705 and r3, r1, #0xff
706 add r2, r0, #1
4ff2d527 707 stmfd sp!,{r2,r3,lr}
708 mov r1, r1, lsr #8
709 bl s68k_reg_write8
710 ldmfd sp!,{r0,r1,lr}
711 b s68k_reg_write8
712
5c69a605 713m_s68k_write16_regs_spec: @ special case
714 ldr r2, =(Pico+0x22200)
715 mov r0, #0x110000
716 ldr r2, [r2]
717 add r0, r0, #0x00000f
718 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
48e8482f 719 bx lr
4ff2d527 720
0ace9b9a 721.pool
6cadc2da 722
cff531af 723@ vim:filetype=armasm