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@* 8 9#include "../arm_features.h" 10#include "../pico_int_offs.h" 11 12.equiv PCM_STEP_SHIFT, 11 13 14.text 15.align 2 16 17.global PicoRead8_mcd_io 18.global PicoRead16_mcd_io 19.global PicoWrite8_mcd_io 20.global PicoWrite16_mcd_io 21 22.global PicoReadS68k8_pr 23.global PicoReadS68k16_pr 24.global PicoWriteS68k8_pr 25.global PicoWriteS68k16_pr 26 27.global PicoReadM68k8_cell0 28.global PicoReadM68k8_cell1 29.global PicoReadM68k16_cell0 30.global PicoReadM68k16_cell1 31.global PicoWriteM68k8_cell0 32.global PicoWriteM68k8_cell1 33.global PicoWriteM68k16_cell0 34.global PicoWriteM68k16_cell1 35 36.global PicoReadS68k8_dec0 37.global PicoReadS68k8_dec1 38.global PicoReadS68k16_dec0 39.global PicoReadS68k16_dec1 40.global PicoWriteS68k8_dec_m0b0 41.global PicoWriteS68k8_dec_m1b0 42.global PicoWriteS68k8_dec_m2b0 43.global PicoWriteS68k8_dec_m0b1 44.global PicoWriteS68k8_dec_m1b1 45.global PicoWriteS68k8_dec_m2b1 46.global PicoWriteS68k16_dec_m0b0 47.global PicoWriteS68k16_dec_m1b0 48.global PicoWriteS68k16_dec_m2b0 49.global PicoWriteS68k16_dec_m0b1 50.global PicoWriteS68k16_dec_m1b1 51.global PicoWriteS68k16_dec_m2b1 52 53@ externs, just for reference 54.extern Pico 55.extern cdc_host_r 56.extern m68k_reg_write8 57.extern s68k_reg_read16 58.extern s68k_reg_write8 59.extern s68k_reg_write16 60.extern s68k_poll_detect 61.extern pcd_pcm_write 62.extern pcd_pcm_read 63.extern PicoRead8_io 64.extern PicoRead16_io 65.extern PicoWrite8_io 66.extern PicoWrite16_io 67.extern m68k_comm_check 68 69 PIC_LDR_INIT() 70 71@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 72 73@ utilities 74 75@ r0=addr[in,out], r1,r2=tmp 76.macro cell_map 77 ands r1, r0, #0x01c000 78 PIC_XB(ne ,r1, lsr #12) 79 b 0f @ most common? 80 PIC_BT(0f) 81 PIC_BT(0f) 82 PIC_BT(0f) 83 PIC_BT(0f) 84 PIC_BT(1f) 85 PIC_BT(1f) 86 PIC_BT(2f) 87 PIC_BT(3f) 881: @ x16 cells 89 and r1, r0, #0x7e00 @ col 90 and r2, r0, #0x01fc @ row 91 orr r2, r2, #0x0400 92 orr r1, r2, r1, ror #13 93 b 9f 942: @ x8 cells 95 and r1, r0, #0x3f00 @ col 96 and r2, r0, #0x00fc @ row 97 orr r2, r2, #0x0600 98 orr r1, r2, r1, ror #12 99 b 9f 1003: @ x4 cells 101 and r1, r0, #0x1f80 @ col 102 and r2, r0, #0x007c @ row 103 orr r1, r2, r1, ror #11 104 and r2, r0,#0x1e000 105 orr r1, r1, r2, lsr #6 106 b 9f 1070: @ x32 cells 108 and r1, r0, #0xfc00 @ col 109 and r2, r0, #0x03fc @ row 110 orr r1, r2, r1, ror #14 1119: 112 and r0, r0, #3 113 orr r0, r0, r1, ror #26 @ rol 4+2 114.endm 115 116 117@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 118 119 120m_read_null: 121 mov r0, #0 122 bx lr 123 124 125PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged 126 mov r3, #0x0c0000 127 b 0f 128 129PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged 130 mov r3, #0x0e0000 1310: 132 cell_map 133 PIC_LDR(r1, r2, Pico) 134 add r0, r0, r3 135 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd (used everywhere) 136 eor r0, r0, #1 137 ldrb r0, [r1, r0] 138 bx lr 139 140 141PicoRead8_mcd_io: 142 and r1, r0, #0xff00 143 cmp r1, #0x2000 @ a120xx? 144 bne PicoRead8_io 145 146 PIC_LDR(r1, r2, Pico) 147 and r0, r0, #0x3f 148 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd 149 cmp r0, #0x0e 150 PIC_XB(lt ,r0, lsl #2) 151 b m_m68k_read8_hi 152 PIC_BT(m_m68k_read8_r00) 153 PIC_BT(m_m68k_read8_r01) 154 PIC_BT(m_m68k_read8_r02) 155 PIC_BT(m_m68k_read8_r03) 156 PIC_BT(m_m68k_read8_r04) 157 PIC_BT(m_read_null) @ unused bits 158 PIC_BT(m_m68k_read8_r06) 159 PIC_BT(m_m68k_read8_r07) 160 PIC_BT(m_m68k_read8_r08) 161 PIC_BT(m_m68k_read8_r09) 162 PIC_BT(m_read_null) @ reserved 163 PIC_BT(m_read_null) 164 PIC_BT(m_m68k_read8_r0c) 165 PIC_BT(m_m68k_read8_r0d) 166m_m68k_read8_r00: 167 add r1, r1, #0x110000 168 ldr r0, [r1, #0x30] 169 and r0, r0, #0x04000000 @ we need irq2 mask state 170 mov r0, r0, lsr #19 171 bx lr 172m_m68k_read8_r01: 173 add r1, r1, #0x110000 174 add r1, r1, #0x002200 175 ldrb r0, [r1, #2] @ Pico_mcd->m.busreq 176 bx lr 177m_m68k_read8_r02: 178 add r1, r1, #0x110000 179 ldrb r0, [r1, #2] 180 bx lr 181m_m68k_read8_r03: 182 add r1, r1, #0x110000 183 stmfd sp!, {r1, lr} 184 bl m68k_comm_check 185 ldmfd sp!, {r1, lr} 186 ldrb r0, [r1, #3] 187 and r0, r0, #0xc7 188 bx lr 189m_m68k_read8_r04: 190 add r1, r1, #0x110000 191 ldrb r0, [r1, #4] 192 bx lr 193m_m68k_read8_r06: 194 ldrb r0, [r1, #0x73] @ IRQ vector 195 bx lr 196m_m68k_read8_r07: 197 ldrb r0, [r1, #0x72] 198 bx lr 199m_m68k_read8_r08: 200 mov r0, #0 201 bl cdc_host_r 202 mov r0, r0, lsr #8 203 bx lr 204m_m68k_read8_r09: 205 mov r0, #0 206 b cdc_host_r 207m_m68k_read8_r0c: 208 add r1, r1, #0x110000 209 add r1, r1, #0x002200 210 ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch 211 mov r0, r0, lsr #24 212 bx lr 213m_m68k_read8_r0d: 214 add r1, r1, #0x110000 215 add r1, r1, #0x002200 216 ldr r0, [r1, #0x14] 217 mov r0, r0, lsr #16 218 bx lr 219m_m68k_read8_hi: 220 cmp r0, #0x30 221 add r1, r1, #0x110000 222 movge r0, #0 223 bxge lr 224 add r1, r1, r0 225 stmfd sp!, {r1, lr} 226 bl m68k_comm_check 227 ldmfd sp!, {r1, lr} 228 ldrb r0, [r1] 229 bx lr 230 231 232@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 233 234 235PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged 236 mov r3, #0x0c0000 237 b 0f 238 239PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged 240 mov r3, #0x0e0000 2410: 242 cell_map 243 PIC_LDR(r1, r2, Pico) 244 add r0, r0, r3 245 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd 246 bic r0, r0, #1 247 ldrh r0, [r1, r0] 248 bx lr 249 250 251PicoRead16_mcd_io: 252 and r1, r0, #0xff00 253 cmp r1, #0x2000 @ a120xx 254 bne PicoRead16_io 255 256m_m68k_read16_m68k_regs: 257 PIC_LDR(r1, r2, Pico) 258 and r0, r0, #0x3e 259 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd 260 cmp r0, #0x0e 261 PIC_XB(lt ,r0, lsl #1) 262 b m_m68k_read16_hi 263 PIC_BT(m_m68k_read16_r00) 264 PIC_BT(m_m68k_read16_r02) 265 PIC_BT(m_m68k_read16_r04) 266 PIC_BT(m_m68k_read16_r06) 267 PIC_BT(m_m68k_read16_r08) 268 PIC_BT(m_read_null) @ reserved 269 PIC_BT(m_m68k_read16_r0c) 270m_m68k_read16_r00: 271 add r1, r1, #0x110000 272 ldr r0, [r1, #0x30] 273 add r1, r1, #0x002200 274 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq 275 and r0, r0, #0x04000000 @ we need irq2 mask state 276 orr r0, r1, r0, lsr #11 277 bx lr 278m_m68k_read16_r02: 279 add r1, r1, #0x110000 280 stmfd sp!, {r1, lr} 281 bl m68k_comm_check 282 ldmfd sp!, {r1, lr} 283 ldrb r2, [r1, #3] 284 ldrb r0, [r1, #2] 285 and r2, r2, #0xc7 286 orr r0, r2, r0, lsl #8 287 bx lr 288m_m68k_read16_r04: 289 add r1, r1, #0x110000 290 ldrb r0, [r1, #4] 291 mov r0, r0, lsl #8 292 bx lr 293m_m68k_read16_r06: 294 ldrh r0, [r1, #0x72] @ IRQ vector 295 bx lr 296m_m68k_read16_r08: 297 mov r0, #0 298 b cdc_host_r 299m_m68k_read16_r0c: 300 add r1, r1, #0x110000 301 add r1, r1, #0x002200 302 ldr r0, [r1, #0x14] 303 mov r0, r0, lsr #16 304 bx lr 305m_m68k_read16_hi: 306 cmp r0, #0x30 307 add r1, r1, #0x110000 308 movge r0, #0 309 bxge lr 310 311 add r1, r0, r1 312 stmfd sp!, {r1, lr} 313 bl m68k_comm_check 314 ldmfd sp!, {r0, lr} 315 ldrh r0, [r0] 316 mov r1, r0, lsr #8 317 and r0, r0, #0xff 318 orr r0, r1, r0, lsl #8 319 bx lr 320 321 322@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 323 324 325PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged 326 mov r12,#0x0c0000 327 b 0f 328 329PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged 330 mov r12,#0x0e0000 3310: 332 mov r3, r1 333 cell_map 334 PIC_LDR(r2, r1, Pico) 335 add r0, r0, r12 336 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd 337 ldr r2, [r2] 338 eor r0, r0, #1 339 strb r3, [r2, r0] 340 bx lr 341 342 343PicoWrite8_mcd_io: 344 and r2, r0, #0xff00 345 cmp r2, #0x2000 @ a120xx? 346 beq m68k_reg_write8 347 b PicoWrite8_io 348 349 350@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 351 352 353PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged 354 mov r12, #0x0c0000 355 b 0f 356 357PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged 358 mov r12, #0x0e0000 3590: 360 mov r3, r1 361 cell_map 362 PIC_LDR(r1, r2, Pico) 363 add r0, r0, r12 364 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd 365 bic r0, r0, #1 366 strh r3, [r1, r0] 367 bx lr 368 369 370PicoWrite16_mcd_io: 371 and r2, r0, #0xff00 372 cmp r2, #0x2000 @ a120xx? 373 bne PicoWrite16_io 374 375m_m68k_write16_regs: 376 and r0, r0, #0x3e 377 cmp r0, #0x0e 378 beq m_m68k_write16_regs_spec 379 and r3, r1, #0xff 380 add r2, r0, #1 381 stmfd sp!,{r2,r3,lr} 382 mov r1, r1, lsr #8 383 bl m68k_reg_write8 384 ldmfd sp!,{r0,r1,lr} 385 b m68k_reg_write8 386 387m_m68k_write16_regs_spec: @ special case 388 mov r1, r1, lsr #8 389 b m68k_reg_write8 390 391 392@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 393@ Sub 68k 394@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 395 396 397PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff 398 mov r3, #0x080000 @ + ^ / 2 399 b 0f 400 401PicoReadS68k8_dec1: 402 mov r3, #0x0a0000 @ + ^ / 2 4030: 404 PIC_LDR(r2, r1, Pico) 405 eor r0, r0, #2 406 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd 407 movs r0, r0, lsr #1 @ +4-6 <<16 408 add r2, r2, r3 @ map to our address 409 ldrb r0, [r2, r0] 410 movcc r0, r0, lsr #4 411 andcs r0, r0, #0xf 412 bx lr 413 414 415PicoReadS68k8_pr: 416 and r2, r0, #0xfe00 417 cmp r2, #0x8000 418 bne m_s68k_read8_pcm 419 420m_s68k_read8_regs: 421 bic r0, r0, #0xff0000 422 bic r0, r0, #0x008000 423 sub r2, r0, #0x0e 424 cmp r2, #(0x30-0x0e) 425 blo m_s68k_read8_comm 426 stmfd sp!,{r0,lr} 427 bic r0, r0, #1 428 bl s68k_reg_read16 429 ldmfd sp!,{r1,lr} 430 tst r1, #1 431 moveq r0, r0, lsr #8 432 and r0, r0, #0xff 433 bx lr 434 435m_s68k_read8_comm: 436 PIC_LDR(r1, r2, Pico) 437 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd 438 add r1, r1, #0x110000 439 ldrb r1, [r1, r0] 440 bic r0, r0, #1 441 b s68k_poll_detect 442 443 444m_s68k_read8_pcm: 445 tst r0, #0x8000 446 bne m_read_null 447 448 @ must not trash r3 and r12 449 PIC_LDR(r1, r2, Pico) 450 bic r0, r0, #0xff0000 451 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd 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 movge r0, r0, lsr #1 458 bge pcd_pcm_read 459 mov r0, #0 460 bx lr 461 462m_s68k_read8_pcm_ram: 463 orr r2, r2, #0x40 464 ldr r2, [r1, r2] 465 add r1, r1, #0x100000 @ pcm_ram 466 and r2, r2, #0x0f000000 @ bank 467 add r1, r1, r2, lsr #12 468 bic r0, r0, #0x00e000 469 mov r0, r0, lsr #1 470 ldrb r0, [r1, r0] 471 bx lr 472 473 474@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 475 476 477PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff 478 mov r3, #0x080000 @ + ^ / 2 479 b 0f 480 481PicoReadS68k16_dec1: 482 mov r3, #0x0a0000 @ + ^ / 2 4830: 484 PIC_LDR(r2, r1, Pico) 485 eor r0, r0, #2 486 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd 487 mov r0, r0, lsr #1 @ +4-6 <<16 488 add r2, r2, r3 @ map to our address 489 ldrb r0, [r2, r0] 490 orr r0, r0, r0, lsl #4 491 bic r0, r0, #0xf0 492 bx lr 493 494 495PicoReadS68k16_pr: 496 and r2, r0, #0xfe00 497 cmp r2, #0x8000 498 @ pcm is on 8-bit bus, would this be same as byte access? 499 bne m_s68k_read8_pcm 500 501m_s68k_read16_regs: 502 bic r0, r0, #0xff0000 503 bic r0, r0, #0x008000 504 bic r0, r0, #0x000001 505 cmp r0, #8 506 bne s68k_reg_read16 507 mov r0, #1 508 b cdc_host_r 509 510@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 511 512 513.macro m_s68k_write8_2M_decode 514 PIC_LDR(r2, ip, Pico) 515 eor r0, r0, #2 516 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd 517 movs r0, r0, lsr #1 @ +4-6 <<16 518 add r2, r2, r3 @ map to our address 519.endm 520 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 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 543 strneb r3, [r2] 544 bx lr 545 546PicoWriteS68k8_dec_m1b0: @ underwrite 547 mov r3, #0x080000 548 b 0f 549 550PicoWriteS68k8_dec_m1b1: 551 mov r3, #0x0a0000 5520: 553 ands r1, r1, #0x0f 554 bxeq lr 555 m_s68k_write8_2M_decode 556 ldrb r0, [r2, r0]! 557 movcc r1, r1, lsl #4 558 andcc r3, r0, #0x0f 559 andcs r3, r0, #0xf0 560 teq r3, r0 561 bxne lr 562 orr r3, r3, r1 563 strneb r3, [r2] 564 bx lr 565 566 567PicoWriteS68k8_pr: 568 and r2, r0, #0xfe00 569 cmp r2, #0x8000 570 bne m_s68k_write8_pcm 571 572m_s68k_write8_regs: 573 bic r0, r0, #0xff0000 574 bic r0, r0, #0x008000 575 tst r0, #0x7e00 576 movne r0, #0 577 bxne lr 578 sub r2, r0, #0x59 579 cmp r2, #0x0f 580 bhs s68k_reg_write8 581 bic r0, r0, #1 582 orr r1, r1, r1, lsl #8 583 b s68k_reg_write16 584 585 586m_s68k_write8_pcm: 587 tst r0, #0x8000 588 bxne lr 589 bic r0, r0, #0xff0000 590 cmp r0, #0x12 591 movlt r0, r0, lsr #1 592 blt pcd_pcm_write 593 594 cmp r0, #0x2000 595 bxlt lr 596 597m_s68k_write8_pcm_ram: 598 PIC_LDR(r3, r2, Pico) 599 bic r0, r0, #0x00e000 600 ldr r3, [r3, #OFS_Pico_rom] @ Pico.mcd 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@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 613 614 615.macro m_s68k_write16_2M_decode 616 PIC_LDR(r2, ip, Pico) 617 eor r0, r0, #2 618 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd 619 mov r0, r0, lsr #1 @ +4-6 <<16 620 add r2, r2, r3 @ map to our address 621.endm 622 623PicoWriteS68k16_dec_m0b0: 624 mov r3, #0x080000 625 b 0f 626 627PicoWriteS68k16_dec_m0b1: 628 mov r3, #0x0a0000 6290: 630 m_s68k_write16_2M_decode 631 bic r1, r1, #0xf0 632 orr r1, r1, r1, lsr #4 633 strb r1, [r2, r0] 634 bx lr 635 636PicoWriteS68k16_dec_m1b0: @ underwrite 637 mov r3, #0x080000 638 b 0f 639 640PicoWriteS68k16_dec_m1b1: 641 mov r3, #0x0a0000 6420: 643 bics r1, r1, #0xf000 644 bicnes r1, r1, #0x00f0 645 bxeq lr 646 orr r1, r1, r1, lsr #4 647 m_s68k_write16_2M_decode 648 ldrb r0, [r2, r0]! 649 and r3, r1, #0x0f 650 and r1, r1, #0xf0 651 tst r0, #0x0f 652 orreq r0, r0, r3 653 tst r0, #0xf0 654 orreq r0, r0, r1 655 strb r0, [r2] 656 bx lr 657 658PicoWriteS68k16_dec_m2b0: @ overwrite 659 mov r3, #0x080000 660 b 0f 661 662PicoWriteS68k16_dec_m2b1: 663 mov r3, #0x0a0000 6640: 665 bics r1, r1, #0xf000 666 bicnes r1, r1, #0x00f0 667 bxeq lr 668 orr r1, r1, r1, lsr #4 669 m_s68k_write16_2M_decode 670 ldrb r0, [r2, r0]! 671 ands r3, r1, #0x0f 672 andne r0, r0, #0xf0 673 orrne r0, r0, r3 674 ands r1, r1, #0xf0 675 andne r0, r0, #0x0f 676 orrne r0, r0, r1 677 strb r0, [r2] 678 bx lr 679 680 681PicoWriteS68k16_pr: 682 and r2, r0, #0xfe00 683 cmp r2, #0x8000 684 bne m_s68k_write8_pcm 685 686m_s68k_write16_regs: 687 bic r0, r0, #0xff0000 688 bic r0, r0, #0x008000 689 bic r0, r0, #1 690 tst r0, #0x7e00 691 movne r0, #0 692 bxne lr 693 cmp r0, #0x0e 694 bne s68k_reg_write16 695 696m_s68k_write16_regs_spec: @ special case 697 PIC_LDR(r2, r0, Pico) 698 mov r0, #0x110000 699 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd 700 add r0, r0, #0x00000f 701 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d; 702 bx lr 703 704.global s68k_read8 705.global s68k_read16 706.global s68k_read32 707.global s68k_write8 708.global s68k_write16 709.global s68k_write32 710 711s68k_read8: 712 PIC_LDR(r3, r2, s68k_read8_map) 713 bic r0, r0, #0xff000000 714 mov r2, r0, lsr #16 715 ldr r3, [r3, r2, lsl #2] 716 eor r2, r0, #1 717 movs r3, r3, lsl #1 718 ldrccb r0, [r3, r2] 719 bxcc lr 720 bx r3 721 722s68k_read16: 723 PIC_LDR(r3, r2, s68k_read16_map) 724 bic r0, r0, #0xff000000 725 mov r2, r0, lsr #16 726 ldr r3, [r3, r2, lsl #2] 727 bic r0, r0, #1 728 movs r3, r3, lsl #1 729 ldrcch r0, [r3, r0] 730 bxcc lr 731 bx r3 732 733s68k_read32: 734 PIC_LDR(r3, r2, s68k_read16_map) 735 bic r0, r0, #0xff000000 736 mov r2, r0, lsr #16 737 ldr r3, [r3, r2, lsl #2] 738 bic r0, r0, #1 739 movs r3, r3, lsl #1 740 ldrcch r1, [r3, r0]! 741 ldrcch r0, [r3, #2] 742 orrcc r0, r0, r1, lsl #16 743 bxcc lr 744 745 stmfd sp!, {r0, r3, r4, lr} 746 mov lr, pc 747 bx r3 748 ldmfd sp!, {r1, r3} 749 str r0, [sp] 750 add r0, r1, #2 751 mov lr, pc 752 bx r3 753 ldmfd sp!, {r1, lr} 754 mov r0, r0, lsl #16 755 mov r1, r1, lsl #16 756 orr r0, r1, r0, lsr #16 757 bx lr 758 759s68k_write8: 760 PIC_LDR(r3, r2, s68k_write8_map) 761 bic r0, r0, #0xff000000 762 mov r2, r0, lsr #16 763 ldr r3, [r3, r2, lsl #2] 764 eor r2, r0, #1 765 movs r3, r3, lsl #1 766 strccb r1, [r3, r2] 767 bxcc lr 768 bx r3 769 770s68k_write16: 771 PIC_LDR(r3, r2, s68k_write16_map) 772 bic r0, r0, #0xff000000 773 mov r2, r0, lsr #16 774 ldr r3, [r3, r2, lsl #2] 775 bic r0, r0, #1 776 movs r3, r3, lsl #1 777 strcch r1, [r3, r0] 778 bxcc lr 779 bx r3 780 781s68k_write32: 782 PIC_LDR(r3, r2, s68k_write16_map) 783 bic r0, r0, #0xff000000 784 mov r2, r0, lsr #16 785 ldr r3, [r3, r2, lsl #2] 786 bic r0, r0, #1 787 movs r3, r3, lsl #1 788 movcc r2, r1, lsr #16 789 strcch r2, [r3, r0]! 790 strcch r1, [r3, #2] 791 bxcc lr 792 793 stmfd sp!, {r0, r1, r3, lr} 794 mov r1, r1, lsr #16 795 mov lr, pc 796 bx r3 797 ldmfd sp!, {r0, r1, r3, lr} 798 add r0, r0, #2 799 bx r3 800 801.pool 802 803@ vim:filetype=armasm 804