X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fcd%2Fmemory_arm.s;h=f3a1372a8123e35325d4bcc57b4791cfedead096;hb=eb7ce29e8dcfe0835a0b0193e99ca76f4ed6dcd1;hp=74315e446dcd4f800d13a2f6295d125bb5099a0e;hpb=0ace9b9aac5de8f1ee5bf181132f98a1f81f4a1d;p=picodrive.git diff --git a/pico/cd/memory_arm.s b/pico/cd/memory_arm.s index 74315e4..f3a1372 100644 --- a/pico/cd/memory_arm.s +++ b/pico/cd/memory_arm.s @@ -1,18 +1,20 @@ -@ vim:filetype=armasm - -@ Memory I/O handlers for Sega/Mega CD emulation -@ (c) Copyright 2007-2009, Grazvydas "notaz" Ignotas - +@* +@* Memory I/O handlers for Sega/Mega CD emulation +@* (C) notaz, 2007-2009 +@* +@* This work is licensed under the terms of MAME license. +@* See COPYING file in the top-level directory. +@* .equiv PCM_STEP_SHIFT, 11 .text .align 2 -.global PicoReadM68k8_io -.global PicoReadM68k16_io -.global PicoWriteM68k8_io -.global PicoWriteM68k16_io +.global PicoRead8_mcd_io +.global PicoRead16_mcd_io +.global PicoWrite8_mcd_io +.global PicoWrite16_mcd_io .global PicoReadS68k8_pr .global PicoReadS68k16_pr @@ -47,19 +49,20 @@ @ externs, just for reference .extern Pico -.extern Read_CDC_Host +.extern cdc_host_r .extern m68k_reg_write8 .extern s68k_reg_read16 .extern s68k_reg_write8 -.extern s68k_poll_adclk +.extern s68k_reg_write16 .extern s68k_poll_detect -.extern gfx_cd_read -.extern gfx_cd_write16 +.extern pcd_pcm_write +.extern pcd_pcm_read .extern PicoCpuCS68k .extern PicoRead8_io .extern PicoRead16_io .extern PicoWrite8_io .extern PicoWrite16_io +.extern m68k_comm_check @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -132,7 +135,7 @@ PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged bx lr -PicoReadM68k8_io: +PicoRead8_mcd_io: and r1, r0, #0xff00 cmp r1, #0x2000 @ a120xx? bne PicoRead8_io @@ -174,14 +177,11 @@ m_m68k_read8_r02: bx lr m_m68k_read8_r03: add r1, r1, #0x110000 + push {r1, lr} + bl m68k_comm_check + pop {r1, lr} ldrb r0, [r1, #3] - add r1, r1, #0x002200 - ldr r1, [r1, #4] and r0, r0, #0xc7 - tst r1, #2 @ DMNA pending? - bxeq lr - bic r0, r0, #1 - orr r0, r0, #2 bx lr m_m68k_read8_r04: add r1, r1, #0x110000 @@ -195,12 +195,12 @@ m_m68k_read8_r07: bx lr m_m68k_read8_r08: mov r0, #0 - bl Read_CDC_Host @ TODO: make it local + bl cdc_host_r mov r0, r0, lsr #8 bx lr m_m68k_read8_r09: mov r0, #0 - b Read_CDC_Host + b cdc_host_r m_m68k_read8_r0c: add r1, r1, #0x110000 add r1, r1, #0x002200 @@ -215,10 +215,14 @@ m_m68k_read8_r0d: bx lr m_m68k_read8_hi: cmp r0, #0x30 - movge r0, #0 - bxeq lr add r1, r1, #0x110000 - ldrb r0, [r1, r0] + movge r0, #0 + bxge lr + add r1, r0 + push {r1, lr} + bl m68k_comm_check + pop {r1, lr} + ldrb r0, [r1] bx lr @@ -241,7 +245,7 @@ PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged bx lr -PicoReadM68k16_io: +PicoRead16_mcd_io: and r1, r0, #0xff00 cmp r1, #0x2000 @ a120xx bne PicoRead16_io @@ -270,16 +274,13 @@ m_m68k_read16_r00: bx lr m_m68k_read16_r02: add r1, r1, #0x110000 - ldrb r0, [r1, #2] + push {r1, lr} + bl m68k_comm_check + pop {r1, lr} ldrb r2, [r1, #3] - add r1, r1, #0x002200 - ldr r1, [r1, #4] + ldrb r0, [r1, #2] and r2, r2, #0xc7 orr r0, r2, r0, lsl #8 - tst r1, #2 @ DMNA pending? - bxeq lr - bic r0, r0, #1 - orr r0, r0, #2 bx lr m_m68k_read16_r04: add r1, r1, #0x110000 @@ -291,7 +292,7 @@ m_m68k_read16_r06: bx lr m_m68k_read16_r08: mov r0, #0 - b Read_CDC_Host + b cdc_host_r m_m68k_read16_r0c: add r1, r1, #0x110000 add r1, r1, #0x002200 @@ -300,13 +301,18 @@ m_m68k_read16_r0c: bx lr m_m68k_read16_hi: cmp r0, #0x30 - addlt r1, r1, #0x110000 - ldrlth r1, [r1, r0] + add r1, r1, #0x110000 movge r0, #0 bxge lr - mov r0, r1, lsr #8 - and r1, r1, #0xff - orr r0, r0, r1, lsl #8 + + add r1, r0, r1 + push {r1, lr} + bl m68k_comm_check + pop {r0, lr} + ldrh r0, [r0] + mov r1, r0, lsr #8 + and r0, r0, #0xff + orr r0, r1, r0, lsl #8 bx lr @@ -330,7 +336,7 @@ PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged bx lr -PicoWriteM68k8_io: +PicoWrite8_mcd_io: and r2, r0, #0xff00 cmp r2, #0x2000 @ a120xx? beq m68k_reg_write8 @@ -357,7 +363,7 @@ PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged bx lr -PicoWriteM68k16_io: +PicoWrite16_mcd_io: and r2, r0, #0xff00 cmp r2, #0x2000 @ a120xx? bne PicoWrite16_io @@ -375,22 +381,8 @@ m_m68k_write16_regs: b m68k_reg_write8 m_m68k_write16_regs_spec: @ special case - ldr r2, =(Pico+0x22200) - ldr r3, =s68k_poll_adclk - mov r0, #0x110000 - ldr r2, [r2] - add r0, r0, #0x00000e mov r1, r1, lsr #8 - strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0x0e] = d >> 8; - ldr r2, [r3] - mov r1, #0 - and r2, r2, #0xfe - cmp r2, #0x0e - bxne lr - ldr r0, =PicoCpuCS68k - str r1, [r0, #0x58] @ push s68k out of stopped state - str r1, [r3] - bx lr + b m68k_reg_write8 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -427,14 +419,9 @@ m_s68k_read8_regs: sub r2, r0, #0x0e cmp r2, #(0x30-0x0e) blo m_s68k_read8_comm - sub r2, r0, #0x58 - cmp r2, #0x10 - ldrlo r2, =gfx_cd_read - ldrhs r2, =s68k_reg_read16 stmfd sp!,{r0,lr} bic r0, r0, #1 - mov lr, pc - bx r2 + bl s68k_reg_read16 ldmfd sp!,{r1,lr} tst r1, #1 moveq r0, r0, lsr #8 @@ -446,6 +433,7 @@ m_s68k_read8_comm: ldr r1, [r1] add r1, r1, #0x110000 ldrb r1, [r1, r0] + bic r0, r0, #1 b s68k_poll_detect @@ -456,23 +444,15 @@ m_s68k_read8_pcm: @ must not trash r3 and r12 ldr r1, =(Pico+0x22200) bic r0, r0, #0xff0000 -@ bic r0, r0, #0x008000 ldr r1, [r1] mov r2, #0x110000 orr r2, r2, #0x002200 cmp r0, #0x2000 bge m_s68k_read8_pcm_ram cmp r0, #0x20 - movlt r0, #0 - bxlt lr - orr r2, r2, #(0x48+8) @ pcm.ch + addr_offset - add r1, r1, r2 - and r2, r0, #0x1c - ldr r1, [r1, r2, lsl #2] - tst r0, #2 - moveq r0, r1, lsr #PCM_STEP_SHIFT - movne r0, r1, lsr #(PCM_STEP_SHIFT+8) - and r0, r0, #0xff + movge r0, r0, lsr #1 + bge pcd_pcm_read + mov r0, #0 bx lr m_s68k_read8_pcm_ram: @@ -518,13 +498,10 @@ m_s68k_read16_regs: bic r0, r0, #0xff0000 bic r0, r0, #0x008000 bic r0, r0, #0x000001 - sub r2, r0, #0x58 - cmp r2, #0x10 - blo gfx_cd_read cmp r0, #8 bne s68k_reg_read16 mov r0, #1 - b Read_CDC_Host + b cdc_host_r @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -595,12 +572,12 @@ m_s68k_write8_regs: tst r0, #0x7e00 movne r0, #0 bxne lr - sub r2, r0, #0x58 - cmp r2, #0x10 + sub r2, r0, #0x59 + cmp r2, #0x0f bhs s68k_reg_write8 bic r0, r0, #1 orr r1, r1, r1, lsl #8 - b gfx_cd_write16 + b s68k_reg_write16 m_s68k_write8_pcm: @@ -609,7 +586,7 @@ m_s68k_write8_pcm: bic r0, r0, #0xff0000 cmp r0, #0x12 movlt r0, r0, lsr #1 - blt pcm_write + blt pcd_pcm_write cmp r0, #0x2000 bxlt lr @@ -712,17 +689,7 @@ m_s68k_write16_regs: movne r0, #0 bxne lr cmp r0, #0x0e - beq m_s68k_write16_regs_spec - sub r2, r0, #0x58 - cmp r2, #0x10 - blo gfx_cd_write16 - and r3, r1, #0xff - add r2, r0, #1 - stmfd sp!,{r2,r3,lr} - mov r1, r1, lsr #8 - bl s68k_reg_write8 - ldmfd sp!,{r0,r1,lr} - b s68k_reg_write8 + bne s68k_reg_write16 m_s68k_write16_regs_spec: @ special case ldr r2, =(Pico+0x22200) @@ -734,3 +701,4 @@ m_s68k_write16_regs_spec: @ special case .pool +@ vim:filetype=armasm