X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fcd%2Fmemory.c;h=1d844dad03b8e7d5fad0c6dfaf02095fb99df1c0;hb=fa8fb7544593a0ed43f3354cc5f41150464b55bf;hp=1064b91c9aa20643c1d8cfc1cf5f942c0976e01f;hpb=4fb435550b3f51abbfc8bb9ff25e0c110c7d7fa2;p=picodrive.git diff --git a/pico/cd/memory.c b/pico/cd/memory.c index 1064b91..1d844da 100644 --- a/pico/cd/memory.c +++ b/pico/cd/memory.c @@ -28,11 +28,6 @@ MAKE_68K_WRITE32(s68k_write32, s68k_write16_map) // provided by ASM code: #ifdef _ASM_CD_MEMORY_C -u32 PicoReadM68k8_io(u32 a); -u32 PicoReadM68k16_io(u32 a); -void PicoWriteM68k8_io(u32 a, u32 d); -void PicoWriteM68k16_io(u32 a, u32 d); - u32 PicoReadS68k8_pr(u32 a); u32 PicoReadS68k16_pr(u32 a); void PicoWriteS68k8_pr(u32 a, u32 d); @@ -70,18 +65,18 @@ static void remap_word_ram(u32 r3); // poller detection #define POLL_LIMIT 16 -#define POLL_CYCLES 124 +#define POLL_CYCLES 64 -u32 m68k_comm_check(u32 a, u32 d) +void m68k_comm_check(u32 a) { pcd_sync_s68k(SekCyclesDone(), 0); - if (a != Pico_mcd->m.m68k_poll_a) { + if (SekNotPolling || a != Pico_mcd->m.m68k_poll_a) { Pico_mcd->m.m68k_poll_a = a; Pico_mcd->m.m68k_poll_cnt = 0; - return d; + SekNotPolling = 0; + return; } Pico_mcd->m.m68k_poll_cnt++; - return d; } #ifndef _ASM_CD_MEMORY_C @@ -97,9 +92,10 @@ static u32 m68k_reg_read16(u32 a) | Pico_mcd->m.busreq; goto end; case 2: + m68k_comm_check(a); d = (Pico_mcd->s68k_regs[a]<<8) | (Pico_mcd->s68k_regs[a+1]&0xc7); elprintf(EL_CDREG3, "m68k_regs r3: %02x @%06x", (u8)d, SekPc); - goto end_comm; + goto end; case 4: d = Pico_mcd->s68k_regs[4]<<8; goto end; @@ -123,17 +119,15 @@ static u32 m68k_reg_read16(u32 a) if (a < 0x30) { // comm flag/cmd/status (0xE-0x2F) + m68k_comm_check(a); d = (Pico_mcd->s68k_regs[a]<<8) | Pico_mcd->s68k_regs[a+1]; - goto end_comm; + goto end; } elprintf(EL_UIO, "m68k_regs FIXME invalid read @ %02x", a); end: return d; - -end_comm: - return m68k_comm_check(a, d); } #endif @@ -145,9 +139,6 @@ void m68k_reg_write8(u32 a, u32 d) u32 dold; a &= 0x3f; - Pico_mcd->m.m68k_poll_a = - Pico_mcd->m.m68k_poll_cnt = 0; - switch (a) { case 0: d &= 1; @@ -232,18 +223,17 @@ write_comm: if (d == Pico_mcd->s68k_regs[a]) return; - Pico_mcd->s68k_regs[a] = d; pcd_sync_s68k(SekCyclesDone(), 0); - if (Pico_mcd->m.s68k_poll_a == a && Pico_mcd->m.s68k_poll_cnt > POLL_LIMIT) { + Pico_mcd->s68k_regs[a] = d; + if (Pico_mcd->m.s68k_poll_a == (a & ~1) + && Pico_mcd->m.s68k_poll_cnt > POLL_LIMIT) + { SekSetStopS68k(0); Pico_mcd->m.s68k_poll_a = 0; elprintf(EL_CDPOLL, "s68k poll release, a=%02x", a); } } -#ifndef _ASM_CD_MEMORY_C -static -#endif u32 s68k_poll_detect(u32 a, u32 d) { #ifdef USE_POLL_DETECT @@ -252,14 +242,14 @@ u32 s68k_poll_detect(u32 a, u32 d) return d; cycles = SekCyclesDoneS68k(); - if (a == Pico_mcd->m.s68k_poll_a) { + if (!SekNotPolling && a == Pico_mcd->m.s68k_poll_a) { u32 clkdiff = cycles - Pico_mcd->m.s68k_poll_clk; if (clkdiff <= POLL_CYCLES) { cnt = Pico_mcd->m.s68k_poll_cnt + 1; //printf("-- diff: %u, cnt = %i\n", clkdiff, cnt); if (Pico_mcd->m.s68k_poll_cnt > POLL_LIMIT) { SekSetStopS68k(1); - elprintf(EL_CDPOLL, "s68k poll detected @ %06x, a=%02x", + elprintf(EL_CDPOLL, "s68k poll detected @%06x, a=%02x", SekPcS68k, a); } } @@ -267,6 +257,7 @@ u32 s68k_poll_detect(u32 a, u32 d) Pico_mcd->m.s68k_poll_a = a; Pico_mcd->m.s68k_poll_clk = cycles; Pico_mcd->m.s68k_poll_cnt = cnt; + SekNotPollingS68k = 0; #endif return d; } @@ -557,18 +548,20 @@ static void PicoWriteM68k8_ramc(u32 a, u32 d) return; } - elprintf(EL_UIO, "m68k unmapped w8 [%06x] %02x @%06x", a, d & 0xff, SekPc); + elprintf(EL_UIO, "m68k unmapped w8 [%06x] %02x @%06x", + a, d & 0xff, SekPc); } static void PicoWriteM68k16_ramc(u32 a, u32 d) { - elprintf(EL_ANOMALY, "ramcart w16: [%06x] %04x @%06x", a, d, SekPcS68k); + elprintf(EL_ANOMALY, "ramcart w16: [%06x] %04x @%06x", + a, d, SekPcS68k); PicoWriteM68k8_ramc(a + 1, d); } // IO/control/cd registers (a10000 - ...) #ifndef _ASM_CD_MEMORY_C -static u32 PicoReadM68k8_io(u32 a) +u32 PicoRead8_mcd_io(u32 a) { u32 d; if ((a & 0xff00) == 0x2000) { // a12000 - a120ff @@ -576,7 +569,8 @@ static u32 PicoReadM68k8_io(u32 a) if (!(a & 1)) d >>= 8; d &= 0xff; - elprintf(EL_CDREGS, "m68k_regs r8: [%02x] %02x @%06x", a & 0x3f, d, SekPc); + elprintf(EL_CDREGS, "m68k_regs r8: [%02x] %02x @%06x", + a & 0x3f, d, SekPc); return d; } @@ -584,22 +578,24 @@ static u32 PicoReadM68k8_io(u32 a) return PicoRead8_io(a); } -static u32 PicoReadM68k16_io(u32 a) +u32 PicoRead16_mcd_io(u32 a) { u32 d; if ((a & 0xff00) == 0x2000) { d = m68k_reg_read16(a); - elprintf(EL_CDREGS, "m68k_regs r16: [%02x] %04x @%06x", a & 0x3f, d, SekPc); + elprintf(EL_CDREGS, "m68k_regs r16: [%02x] %04x @%06x", + a & 0x3f, d, SekPc); return d; } return PicoRead16_io(a); } -static void PicoWriteM68k8_io(u32 a, u32 d) +void PicoWrite8_mcd_io(u32 a, u32 d) { if ((a & 0xff00) == 0x2000) { // a12000 - a120ff - elprintf(EL_CDREGS, "m68k_regs w8: [%02x] %02x @%06x", a&0x3f, d, SekPc); + elprintf(EL_CDREGS, "m68k_regs w8: [%02x] %02x @%06x", + a & 0x3f, d, SekPc); m68k_reg_write8(a, d); return; } @@ -607,10 +603,11 @@ static void PicoWriteM68k8_io(u32 a, u32 d) PicoWrite16_io(a, d); } -static void PicoWriteM68k16_io(u32 a, u32 d) +void PicoWrite16_mcd_io(u32 a, u32 d) { if ((a & 0xff00) == 0x2000) { // a12000 - a120ff - elprintf(EL_CDREGS, "m68k_regs w16: [%02x] %04x @%06x", a&0x3f, d, SekPc); + elprintf(EL_CDREGS, "m68k_regs w16: [%02x] %04x @%06x", + a & 0x3f, d, SekPc); m68k_reg_write8(a, d >> 8); if ((a & 0x3e) != 0x0e) // special case @@ -640,12 +637,14 @@ static u32 s68k_unmapped_read16(u32 a) static void s68k_unmapped_write8(u32 a, u32 d) { - elprintf(EL_UIO, "s68k unmapped w8 [%06x] %02x @%06x", a, d & 0xff, SekPc); + elprintf(EL_UIO, "s68k unmapped w8 [%06x] %02x @%06x", + a, d & 0xff, SekPc); } static void s68k_unmapped_write16(u32 a, u32 d) { - elprintf(EL_UIO, "s68k unmapped w16 [%06x] %04x @%06x", a, d & 0xffff, SekPc); + elprintf(EL_UIO, "s68k unmapped w16 [%06x] %04x @%06x", + a, d & 0xffff, SekPc); } // PRG RAM protected range (000000 - 01fdff)? @@ -809,7 +808,7 @@ static u32 PicoReadS68k8_pr(u32 a) a &= 0x1ff; if (a >= 0x0e && a < 0x30) { d = Pico_mcd->s68k_regs[a]; - s68k_poll_detect(a, d); + s68k_poll_detect(a & ~1, d); goto regs_done; } else if (a >= 0x58 && a < 0x68) @@ -820,7 +819,7 @@ static u32 PicoReadS68k8_pr(u32 a) regs_done: d &= 0xff; - elprintf(EL_CDREGS, "s68k_regs r8: [%02x] %02x @ %06x", + elprintf(EL_CDREGS, "s68k_regs r8: [%02x] %02x @%06x", a, d, SekPcS68k); return d; } @@ -854,7 +853,7 @@ static u32 PicoReadS68k16_pr(u32 a) d = gfx_cd_read(a); else d = s68k_reg_read16(a); - elprintf(EL_CDREGS, "s68k_regs r16: [%02x] %04x @ %06x", + elprintf(EL_CDREGS, "s68k_regs r16: [%02x] %04x @%06x", a, d, SekPcS68k); return d; } @@ -882,7 +881,7 @@ static void PicoWriteS68k8_pr(u32 a, u32 d) // regs if ((a & 0xfe00) == 0x8000) { a &= 0x1ff; - elprintf(EL_CDREGS, "s68k_regs w8: [%02x] %02x @ %06x", a, d, SekPcS68k); + elprintf(EL_CDREGS, "s68k_regs w8: [%02x] %02x @%06x", a, d, SekPcS68k); if (0x58 <= a && a < 0x68) gfx_cd_write16(a&~1, (d<<8)|d); else s68k_reg_write8(a,d); @@ -907,7 +906,7 @@ static void PicoWriteS68k16_pr(u32 a, u32 d) // regs if ((a & 0xfe00) == 0x8000) { a &= 0x1fe; - elprintf(EL_CDREGS, "s68k_regs w16: [%02x] %04x @ %06x", a, d, SekPcS68k); + elprintf(EL_CDREGS, "s68k_regs w16: [%02x] %04x @%06x", a, d, SekPcS68k); if (a >= 0x58 && a < 0x68) gfx_cd_write16(a, d); else { @@ -1053,10 +1052,10 @@ PICO_INTERNAL void PicoMemSetupCD(void) } // registers/IO: - cpu68k_map_set(m68k_read8_map, 0xa10000, 0xa1ffff, PicoReadM68k8_io, 1); - cpu68k_map_set(m68k_read16_map, 0xa10000, 0xa1ffff, PicoReadM68k16_io, 1); - cpu68k_map_set(m68k_write8_map, 0xa10000, 0xa1ffff, PicoWriteM68k8_io, 1); - cpu68k_map_set(m68k_write16_map, 0xa10000, 0xa1ffff, PicoWriteM68k16_io, 1); + cpu68k_map_set(m68k_read8_map, 0xa10000, 0xa1ffff, PicoRead8_mcd_io, 1); + cpu68k_map_set(m68k_read16_map, 0xa10000, 0xa1ffff, PicoRead16_mcd_io, 1); + cpu68k_map_set(m68k_write8_map, 0xa10000, 0xa1ffff, PicoWrite8_mcd_io, 1); + cpu68k_map_set(m68k_write16_map, 0xa10000, 0xa1ffff, PicoWrite16_mcd_io, 1); // sub68k map cpu68k_map_set(s68k_read8_map, 0x000000, 0xffffff, s68k_unmapped_read8, 1);