X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2FMemory.s;h=d10f1a514a00311228e6afb89a76da69546f4ea0;hb=3d48f1437fc5e2c556ed900ae25fd4a255d52922;hp=ecfc7ec25725e68bbc1da6cc204b21384adbd13f;hpb=5c69a605aeaa09798db62a4cfcce7bba4f9dc2b6;p=picodrive.git diff --git a/Pico/cd/Memory.s b/Pico/cd/Memory.s index ecfc7ec..d10f1a5 100644 --- a/Pico/cd/Memory.s +++ b/Pico/cd/Memory.s @@ -7,6 +7,7 @@ .equiv PCM_STEP_SHIFT, 11 +.equiv POLL_LIMIT, 16 @ jump tables .data @@ -62,7 +63,7 @@ .endm -@ the jumptables themselves +@ the jumptables themselves. m_m68k_read8_table: mk_m68k_jump_table read 8 m_m68k_read16_table: mk_m68k_jump_table read 16 m_m68k_read32_table: mk_m68k_jump_table read 32 @@ -77,6 +78,26 @@ m_s68k_write8_table: mk_s68k_jump_table write 8 m_s68k_write16_table: mk_s68k_jump_table write 16 m_s68k_write32_table: mk_s68k_jump_table write 32 +m_s68k_decode_write_table: + .long m_s68k_write8_2M_decode_b0_m0 + .long m_s68k_write16_2M_decode_b0_m0 + .long m_s68k_write32_2M_decode_b0_m0 + .long m_s68k_write8_2M_decode_b0_m1 + .long m_s68k_write16_2M_decode_b0_m1 + .long m_s68k_write32_2M_decode_b0_m1 + .long m_s68k_write8_2M_decode_b0_m2 + .long m_s68k_write16_2M_decode_b0_m2 + .long m_s68k_write32_2M_decode_b0_m2 + .long m_s68k_write8_2M_decode_b1_m0 + .long m_s68k_write16_2M_decode_b1_m0 + .long m_s68k_write32_2M_decode_b1_m0 + .long m_s68k_write8_2M_decode_b1_m1 + .long m_s68k_write16_2M_decode_b1_m1 + .long m_s68k_write32_2M_decode_b1_m1 + .long m_s68k_write8_2M_decode_b1_m2 + .long m_s68k_write16_2M_decode_b1_m2 + .long m_s68k_write32_2M_decode_b1_m2 + @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -84,6 +105,7 @@ m_s68k_write32_table: mk_s68k_jump_table write 32 .align 4 .global PicoMemResetCD +.global PicoMemResetCDdecode .global PicoReadM68k8 .global PicoReadM68k16 .global PicoReadM68k32 @@ -111,6 +133,8 @@ m_s68k_write32_table: mk_s68k_jump_table write 32 .extern SRam .extern gfx_cd_write16 .extern s68k_reg_write8 +.extern s68k_poll_adclk +.extern PicoCpuS68k @ r0=reg3, r1-r3=temp @@ -141,10 +165,12 @@ m_s68k_write32_table: mk_s68k_jump_table write 32 ldr r3, =m_m68k_&\on&\sz&_wordram1_1M_b0 str r2, [r1, #16*4] str r3, [r1, #17*4] - ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b1 ldr r3, =m_s68k_&\on&\sz&_wordram_1M_b1 +.ifeqs "\on", "read" + ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b1 str r2, [r12,#4*4] str r2, [r12,#5*4] +.endif str r3, [r12,#6*4] b 9f @ pmr_8_done @@ -153,10 +179,12 @@ m_s68k_write32_table: mk_s68k_jump_table write 32 ldr r3, =m_m68k_&\on&\sz&_wordram1_1M_b1 str r2, [r1, #16*4] str r3, [r1, #17*4] - ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b0 ldr r3, =m_s68k_&\on&\sz&_wordram_1M_b0 +.ifeqs "\on", "read" + ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b0 str r2, [r12,#4*4] str r2, [r12,#5*4] +.endif str r3, [r12,#6*4] 9: @ pmr_8_done: @@ -173,6 +201,29 @@ PicoMemResetCD: @ r3 bx lr +PicoMemResetCDdecode: @reg3 + tst r0, #4 + bxeq lr @ we should not be called in 2M mode + ldr r1, =m_s68k_write8_table + ldr r3, =m_s68k_decode_write_table + and r2, r0, #0x18 + mov r2, r2, lsr #3 + cmp r2, #3 + moveq r2, #2 @ mode3 is same as mode2? + tst r0, #1 + addeq r2, r2, #3 @ bank1 (r2=0..5) + add r2, r2, r2, lsl #1 @ *= 3 + add r2, r3, r2, lsl #2 + ldmia r2, {r0,r3,r12} + str r0, [r1, #4*4] + str r0, [r1, #5*4] + str r3, [r1, #4*4+8*4] + str r3, [r1, #5*4+8*4] + str r12,[r1, #4*4+8*4*2] + str r12,[r1, #5*4+8*4*2] + bx lr + + .pool @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -290,7 +341,7 @@ PicoWriteS68k32: @ u32 a, u32 d .endm -@ r0=prt1, r1=ptr2 +@ r0=prt1, r1=ptr2; unaligned ptr MUST be r0 .macro m_read32_gen tst r0, #2 ldrneh r0, [r1, r0]! @@ -301,7 +352,7 @@ PicoWriteS68k32: @ u32 a, u32 d .endm -@ r0=prt1, r1=data, r2=ptr2 +@ r0=prt1, r1=data, r2=ptr2; unaligned ptr MUST be r0 .macro m_write32_gen tst r0, #2 mov r1, r1, ror #16 @@ -422,7 +473,7 @@ m_m68k_read8_system_io: .long m_m68k_read8_r0d m_m68k_read8_r00: add r1, r1, #0x110000 - ldr r0, [r1, #30] + ldr r0, [r1, #0x30] and r0, r0, #0x04000000 @ we need irq2 mask state mov r0, r0, lsr #19 bx lr @@ -438,7 +489,13 @@ m_m68k_read8_r02: m_m68k_read8_r03: add r1, r1, #0x110000 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 @@ -617,7 +674,7 @@ m_m68k_read16_m68k_regs: .long m_m68k_read16_r0c m_m68k_read16_r00: add r1, r1, #0x110000 - ldr r0, [r1, #30] + ldr r0, [r1, #0x30] add r1, r1, #0x002200 ldrb r1, [r1, #2] @ Pico_mcd->m.busreq and r0, r0, #0x04000000 @ we need irq2 mask state @@ -626,9 +683,15 @@ m_m68k_read16_r00: m_m68k_read16_r02: add r1, r1, #0x110000 ldrb r0, [r1, #2] - ldrb r1, [r1, #3] - and r1, r1, #0xc7 - orr r0, r1, r0, lsl #8 + ldrb r2, [r1, #3] + add r1, r1, #0x002200 + ldr r1, [r1, #4] + 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 @@ -796,11 +859,12 @@ m_m68k_read32_system_io: movge r0, #0 bxge lr @ I have seen the range 0x0e-0x2f accessed quite frequently with long i/o, so here is some code for that - ldr r0, =(Pico+0x22200) + mov r0, r1 + ldr r1, =(Pico+0x22200) mov r2, #0xff - ldr r0, [r0] + ldr r1, [r1] orr r2, r2, r2, lsl #16 - add r0, r0, #0x110000 + add r1, r1, #0x110000 m_read32_gen and r1, r2, r0 @ data is big-endian read as little, have to byteswap and r0, r2, r0, lsr #8 @@ -1024,6 +1088,9 @@ m_m68k_write16_system_io: bne OtherWrite16 m_m68k_write16_m68k_regs: + and r0, r0, #0x3e + cmp r0, #0x0e + beq m_m68k_write16_regs_spec and r3, r1, #0xff add r2, r0, #1 stmfd sp!,{r2,r3,lr} @@ -1032,6 +1099,24 @@ m_m68k_write16_m68k_regs: ldmfd sp!,{r0,r1,lr} 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, =PicoCpuS68k + str r1, [r0, #0x58] @ push s68k out of stopped state + str r1, [r3] + bx lr + m_m68k_write16_vdp: tst r0, #0x70000 @@ -1405,7 +1490,10 @@ m_s68k_read16_regs: sub r2, r0, #0x58 cmp r2, #0x10 blo gfx_cd_read - b s68k_reg_read16 + cmp r0, #8 + bne s68k_reg_read16 + mov r0, #1 + b Read_CDC_Host @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -1529,6 +1617,50 @@ m_s68k_read32_regs_gfx: bx lr .endm +.macro m_s68k_write8_2M_decode map_addr + ldr r2, =(Pico+0x22200) + eor r0, r0, #2 + ldr r2, [r2] + movs r0, r0, lsr #1 @ +4-6 <<16 + add r2, r2, #\map_addr @ map to our address +.endm + +.macro m_s68k_write8_2M_decode_m0 map_addr @ mode off + m_s68k_write8_2M_decode \map_addr + ldrb r0, [r2, r0]! + and r1, r1, #0x0f + movcc r1, r1, lsl #4 + andcc r3, r0, #0x0f + andcs r3, r0, #0xf0 + orr r3, r3, r1 + cmp r0, r3 @ avoid writing if result is same + strneb r3, [r2] + bx lr +.endm + +.macro m_s68k_write8_2M_decode_m1 map_addr @ mode underwrite + ands r1, r1, #0x0f + bxeq lr + m_s68k_write8_2M_decode \map_addr + ldrb r0, [r2, r0]! + movcc r1, r1, lsl #4 + andcc r3, r0, #0x0f + andcs r3, r0, #0xf0 + tst r3, r3 + bxeq lr + orr r3, r3, r1 + cmp r0, r3 + strneb r3, [r2] + bx lr +.endm + +.macro m_s68k_write8_2M_decode_m2 map_addr @ mode overwrite + ands r1, r1, #0x0f + bxeq lr + m_s68k_write8_2M_decode_m0 \map_addr @ same as in off mode +.endm + + m_s68k_write8_prg: @ 0x000000 - 0x07ffff m_s68k_write8_wordram_2M: @ 0x080000 - 0x0bffff @@ -1536,9 +1668,23 @@ m_s68k_write8_wordram_1M_b1: @ 0x0c0000 - 0x0dffff, maps to 0x0e0000 m_s68k_write8_ram 0x020000 -m_s68k_write8_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff -m_s68k_write8_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff - bx lr @ TODO +m_s68k_write8_2M_decode_b0_m0: @ 0x080000 - 0x0bffff + m_s68k_write8_2M_decode_m0 0x080000 + +m_s68k_write8_2M_decode_b0_m1: + m_s68k_write8_2M_decode_m1 0x080000 + +m_s68k_write8_2M_decode_b0_m2: + m_s68k_write8_2M_decode_m2 0x080000 + +m_s68k_write8_2M_decode_b1_m0: + m_s68k_write8_2M_decode_m0 0x0a0000 + +m_s68k_write8_2M_decode_b1_m1: + m_s68k_write8_2M_decode_m1 0x0a0000 + +m_s68k_write8_2M_decode_b1_m2: + m_s68k_write8_2M_decode_m2 0x0a0000 m_s68k_write8_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :) @@ -1557,7 +1703,7 @@ m_s68k_write8_backup: @ 0xfe0000 - 0xfe3fff (repeated?) strb r1, [r2, r0] ldr r1, =SRam mov r0, #1 - str r0, [r1, #0x0e] @ SRam.changed = 1 + strb r0, [r1, #0x0e] @ SRam.changed = 1 bx lr @@ -1614,6 +1760,57 @@ m_s68k_write8_regs: bx lr .endm +.macro m_s68k_write16_2M_decode map_addr + ldr r2, =(Pico+0x22200) + eor r0, r0, #2 + ldr r2, [r2] + mov r0, r0, lsr #1 @ +4-6 <<16 + add r2, r2, #\map_addr @ map to our address +.endm + +.macro m_s68k_write16_2M_decode_m0 map_addr @ mode off + m_s68k_write16_2M_decode \map_addr + bic r1, r1, #0xf0 + orr r1, r1, r1, lsr #4 + strb r1, [r2, r0] + bx lr +.endm + +.macro m_s68k_write16_2M_decode_m1 map_addr @ mode underwrite + bics r1, r1, #0xf000 + bicnes r1, r1, #0x00f0 + bxeq lr + orr r1, r1, r1, lsr #4 + m_s68k_write16_2M_decode \map_addr + ldrb r0, [r2, r0]! + and r3, r1, #0x0f + and r1, r1, #0xf0 + tst r0, #0x0f + orreq r0, r0, r3 + tst r0, #0xf0 + orreq r0, r0, r1 + strb r0, [r2] + bx lr +.endm + +.macro m_s68k_write16_2M_decode_m2 map_addr @ mode overwrite + bics r1, r1, #0xf000 + bicnes r1, r1, #0x00f0 + bxeq lr + orr r1, r1, r1, lsr #4 + m_s68k_write16_2M_decode \map_addr + ldrb r0, [r2, r0]! + ands r3, r1, #0x0f + andne r0, r0, #0xf0 + orrne r0, r0, r3 + ands r1, r1, #0xf0 + andne r0, r0, #0x0f + orrne r0, r0, r1 + strb r0, [r2] + bx lr +.endm + + m_s68k_write16_prg: @ 0x000000 - 0x07ffff m_s68k_write16_wordram_2M: @ 0x080000 - 0x0bffff @@ -1621,9 +1818,23 @@ m_s68k_write16_wordram_1M_b1: @ 0x0c0000 - 0x0dffff, maps to 0x0e0000 m_s68k_write16_ram 0x020000 -m_s68k_write16_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff -m_s68k_write16_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff - bx lr @ TODO +m_s68k_write16_2M_decode_b0_m0: @ 0x080000 - 0x0bffff + m_s68k_write16_2M_decode_m0 0x080000 + +m_s68k_write16_2M_decode_b0_m1: + m_s68k_write16_2M_decode_m1 0x080000 + +m_s68k_write16_2M_decode_b0_m2: + m_s68k_write16_2M_decode_m2 0x080000 + +m_s68k_write16_2M_decode_b1_m0: + m_s68k_write16_2M_decode_m0 0x0a0000 + +m_s68k_write16_2M_decode_b1_m1: + m_s68k_write16_2M_decode_m1 0x0a0000 + +m_s68k_write16_2M_decode_b1_m2: + m_s68k_write16_2M_decode_m2 0x0a0000 m_s68k_write16_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :) @@ -1664,7 +1875,7 @@ m_s68k_write16_regs_spec: @ special case ldr r2, [r2] add r0, r0, #0x00000f strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d; - bxeq lr + bx lr @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -1681,6 +1892,98 @@ m_s68k_write16_regs_spec: @ special case bx lr .endm +.macro m_s68k_write32_2M_decode map_addr + ldr r2, =(Pico+0x22200) + eor r0, r0, #2 + ldr r2, [r2] + mov r0, r0, lsr #1 @ +4-6 <<16 + add r2, r2, #\map_addr @ map to our address +.endm + +.macro m_s68k_write32_2M_decode_m0 map_addr @ mode off + m_s68k_write32_2M_decode \map_addr + bic r1, r1, #0x000000f0 + bic r1, r1, #0x00f00000 + orr r1, r1, r1, lsr #4 + mov r3, r1, lsr #16 + strb r3, [r2, r0]! + tst r0, #1 + strneb r1, [r2, #-1] + streqb r1, [r2, #3] + bx lr +.endm + +.macro m_s68k_write32_2M_decode_m1 map_addr @ mode underwrite + bics r1, r1, #0x000000f0 + bicnes r1, r1, #0x0000f000 + bicnes r1, r1, #0x00f00000 + bicnes r1, r1, #0xf0000000 + bxeq lr + orr r1, r1, r1, lsr #4 + m_s68k_write32_2M_decode \map_addr + ldrb r3, [r2, r0]! + tst r0, #1 + ldrneb r0, [r2, #-1] + ldreqb r0, [r2, #3] + and r12,r1, #0x0000000f + orr r0, r0, r3, lsl #16 + orrne r0, r0, #0x80000000 @ remember addr lsb bit + tst r0, #0x0000000f + orreq r0, r0, r12 + tst r0, #0x000000f0 + andeq r12,r1, #0x000000f0 + orreq r0, r0, r12 + tst r0, #0x000f0000 + andeq r12,r1, #0x000f0000 + orreq r0, r0, r12 + tst r0, #0x00f00000 + andeq r12,r1, #0x00f00000 + orreq r0, r0, r12 + tst r0, #0x80000000 + strneb r0, [r2, #-1] + streqb r0, [r2, #3] + mov r0, r0, lsr #16 + strb r0, [r2] + bx lr +.endm + +.macro m_s68k_write32_2M_decode_m2 map_addr @ mode overwrite + bics r1, r1, #0x000000f0 + bicnes r1, r1, #0x0000f000 + bicnes r1, r1, #0x00f00000 + bicnes r1, r1, #0xf0000000 + bxeq lr + orr r1, r1, r1, lsr #4 + m_s68k_write32_2M_decode \map_addr + ldrb r3, [r2, r0]! + tst r0, #1 + ldrneb r0, [r2, #-1] + ldreqb r0, [r2, #3] + orrne r1, r1, #0x80000000 @ remember addr lsb bit + orr r0, r0, r3, lsl #16 + tst r1, #0x0000000f + andeq r12,r0, #0x0000000f + orreq r1, r1, r12 + tst r1, #0x000000f0 + andeq r12,r0, #0x000000f0 + orreq r1, r1, r12 + tst r1, #0x000f0000 + andeq r12,r0, #0x000f0000 + orreq r1, r1, r12 + tst r1, #0x00f00000 + andeq r12,r0, #0x00f00000 + orreq r1, r1, r12 + cmp r0, r1 + bxeq lr + tst r1, #0x80000000 + strneb r1, [r2, #-1] + streqb r1, [r2, #3] + mov r1, r1, lsr #16 + strb r1, [r2] + bx lr +.endm + + m_s68k_write32_prg: @ 0x000000 - 0x07ffff m_s68k_write32_wordram_2M: @ 0x080000 - 0x0bffff @@ -1688,9 +1991,23 @@ m_s68k_write32_wordram_1M_b1: @ 0x0c0000 - 0x0dffff, maps to 0x0e0000 m_s68k_write32_ram 0x020000 -m_s68k_write32_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff -m_s68k_write32_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff - bx lr @ TODO +m_s68k_write32_2M_decode_b0_m0: @ 0x080000 - 0x0bffff + m_s68k_write32_2M_decode_m0 0x080000 + +m_s68k_write32_2M_decode_b0_m1: + m_s68k_write32_2M_decode_m1 0x080000 + +m_s68k_write32_2M_decode_b0_m2: + m_s68k_write32_2M_decode_m2 0x080000 + +m_s68k_write32_2M_decode_b1_m0: + m_s68k_write32_2M_decode_m0 0x0a0000 + +m_s68k_write32_2M_decode_b1_m1: + m_s68k_write32_2M_decode_m1 0x0a0000 + +m_s68k_write32_2M_decode_b1_m2: + m_s68k_write32_2M_decode_m2 0x0a0000 m_s68k_write32_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :)