X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=pico%2Fcarthw%2Fcarthw.c;h=2fed822024e73b41a7035db733f4e382c7bd7b49;hb=0a0073dc9fae7d867d737623d30917cc4b285b16;hp=a18e5a41c83b6094770135d4d18306974fef6ff7;hpb=88fd63ad10faa746ef9d7ad7d98a72e51fe2aa86;p=picodrive.git diff --git a/pico/carthw/carthw.c b/pico/carthw/carthw.c index a18e5a4..2fed822 100644 --- a/pico/carthw/carthw.c +++ b/pico/carthw/carthw.c @@ -21,63 +21,82 @@ static int have_bank(u32 base) return 1; } -/* The SSFII mapper */ -static unsigned char ssf2_banks[8]; +/* standard/ssf2 mapper */ +int carthw_ssf2_active; +unsigned char carthw_ssf2_banks[8]; static carthw_state_chunk carthw_ssf2_state[] = { - { CHUNK_CARTHW, sizeof(ssf2_banks), &ssf2_banks }, - { 0, 0, NULL } + { CHUNK_CARTHW, sizeof(carthw_ssf2_banks), &carthw_ssf2_banks }, + { 0, 0, NULL } }; -static void carthw_ssf2_write8(u32 a, u32 d) +void carthw_ssf2_write8(u32 a, u32 d) { - u32 target, base; + u32 target, base; - if ((a & 0xfffff0) != 0xa130f0) { - PicoWrite8_io(a, d); - return; - } + if ((a & ~0x0e) != 0xa130f1) { + PicoWrite8_io(a, d); + return; + } - a &= 0x0e; - if (a == 0) - return; + a &= 0x0e; + if (a == 0) + return; + if (carthw_ssf2_banks[a >> 1] == d) + return; - ssf2_banks[a >> 1] = d; - base = d << 19; - target = a << 18; - if (!have_bank(base)) - return; + base = d << 19; + target = a << 18; + if (!have_bank(base)) + return; + carthw_ssf2_banks[a >> 1] = d; - cpu68k_map_set(m68k_read8_map, target, target + 0x80000 - 1, Pico.rom + base, 0); - cpu68k_map_set(m68k_read16_map, target, target + 0x80000 - 1, Pico.rom + base, 0); + cpu68k_map_set(m68k_read8_map, target, target + 0x80000 - 1, Pico.rom + base, 0); + cpu68k_map_set(m68k_read16_map, target, target + 0x80000 - 1, Pico.rom + base, 0); +} + +void carthw_ssf2_write16(u32 a, u32 d) +{ + PicoWrite16_io(a, d); + if ((a & ~0x0f) == 0xa130f0) + carthw_ssf2_write8(a + 1, d); } static void carthw_ssf2_mem_setup(void) { - cpu68k_map_set(m68k_write8_map, 0xa10000, 0xa1ffff, carthw_ssf2_write8, 1); + cpu68k_map_set(m68k_write8_map, 0xa10000, 0xa1ffff, carthw_ssf2_write8, 1); + cpu68k_map_set(m68k_write16_map, 0xa10000, 0xa1ffff, carthw_ssf2_write16, 1); } static void carthw_ssf2_statef(void) { - int i; - for (i = 1; i < 8; i++) - carthw_ssf2_write8(0xa130f0 | (i << 1), ssf2_banks[i]); + int i; + for (i = 1; i < 8; i++) + carthw_ssf2_write8(0xa130f0 | (i << 1), carthw_ssf2_banks[i]); +} + +static void carthw_ssf2_unload(void) +{ + memset(carthw_ssf2_banks, 0, sizeof(carthw_ssf2_banks)); + carthw_ssf2_active = 0; } void carthw_ssf2_startup(void) { - int i; + int i; - elprintf(EL_STATUS, "SSF2 mapper startup"); + elprintf(EL_STATUS, "SSF2 mapper startup"); - // default map - for (i = 0; i < 8; i++) - ssf2_banks[i] = i; + // default map + for (i = 0; i < 8; i++) + carthw_ssf2_banks[i] = i; - PicoCartMemSetup = carthw_ssf2_mem_setup; - PicoLoadStateHook = carthw_ssf2_statef; - carthw_chunks = carthw_ssf2_state; + PicoCartMemSetup = carthw_ssf2_mem_setup; + PicoLoadStateHook = carthw_ssf2_statef; + PicoCartUnloadHook = carthw_ssf2_unload; + carthw_chunks = carthw_ssf2_state; + carthw_ssf2_active = 1; } @@ -423,7 +442,6 @@ static void carthw_pier_reset(void) { pier_regs[0] = 1; pier_regs[1] = pier_regs[2] = pier_regs[3] = 0; - pier_dump_prot = 3; carthw_pier_statef(); eeprom_spi_init(NULL); } @@ -443,6 +461,8 @@ void carthw_pier_startup(void) return; } + pier_dump_prot = 3; + // create dump protection bank for (i = 0; i < M68K_BANK_SIZE; i += 0x8000) memcpy(Pico.rom + Pico.romsize + i, Pico.rom, 0x8000);