trunk/src/mess/drivers/snes.c
| r21818 | r21819 | |
| 1616 | 1616 | else if (m_slotcart->get_type() == SNES_CX4 |
| 1617 | 1617 | && (offset < 0x400000 && (offset & 0xffff) >= 0x6000 && (offset & 0xffff) < 0x8000)) // hack until we emulate the real CPU |
| 1618 | 1618 | return CX4_read((offset & 0xffff) - 0x6000); |
| 1619 | | |
| 1619 | else if (m_slotcart->get_type() == SNES_BANANA |
| 1620 | && (offset & 0x78000) == 0x8000) |
| 1621 | { |
| 1622 | return m_slotcart->m_cart->chip_read(space, offset); |
| 1623 | } |
| 1624 | else if (m_slotcart->get_type() == SNES_BUGS |
| 1625 | && (offset & 0x7f000) == 0xf000) |
| 1626 | { |
| 1627 | printf("read hi addr %X\n", offset); |
| 1628 | // return m_slotcart->m_cart->chip_read(space, offset); |
| 1629 | } |
| 1630 | |
| 1620 | 1631 | if (offset < 0x400000) |
| 1621 | 1632 | { |
| 1622 | 1633 | if (address < 0x2000) |
| r21818 | r21819 | |
| 1676 | 1687 | else if (m_type == SNES_SUFAMITURBO |
| 1677 | 1688 | && address >= 0x8000 && ((offset >= 0x600000 && offset < 0x640000) || (offset >= 0x700000 && offset < 0x740000))) |
| 1678 | 1689 | { m_slotcart->m_cart->write_h(space, offset, data); return; } |
| 1679 | | |
| 1690 | // else if (m_slotcart->get_type() == SNES_BANANA |
| 1691 | // && (offset & 0x8000) == 0x8000) |
| 1692 | // { |
| 1693 | // printf("write addr hi %X data %X\n", offset, data); |
| 1694 | // m_slotcart->m_cart->chip_write(space, offset, data); |
| 1695 | // return; |
| 1696 | // } |
| 1697 | else if (m_slotcart->get_type() == SNES_BUGS |
| 1698 | && (offset & 0x7f000) == 0xf000) |
| 1699 | { |
| 1700 | // printf("write hi addr %X data %X\n", offset, data); |
| 1701 | } |
| 1702 | |
| 1703 | |
| 1680 | 1704 | if (offset < 0x400000) |
| 1681 | 1705 | { |
| 1682 | 1706 | if (address < 0x2000) |
| r21818 | r21819 | |
| 1711 | 1735 | else if (m_slotcart->get_type() == SNES_CX4 |
| 1712 | 1736 | && (offset < 0x400000 && (offset & 0xffff) >= 0x6000 && (offset & 0xffff) < 0x8000)) // hack until we emulate the real CPU |
| 1713 | 1737 | return CX4_read((offset & 0xffff) - 0x6000); |
| 1714 | | |
| 1738 | else if (m_slotcart->get_type() == SNES_BUGS |
| 1739 | && (offset & 0x78000) == 0x8000) |
| 1740 | { |
| 1741 | // printf("read lo addr %X\n", offset); |
| 1742 | // return m_slotcart->m_cart->chip_read(space, offset); |
| 1743 | } |
| 1744 | |
| 1745 | |
| 1715 | 1746 | if (offset < 0x400000) |
| 1716 | 1747 | { |
| 1717 | 1748 | if (address < 0x2000) |
| r21818 | r21819 | |
| 1759 | 1790 | if (m_type == SNES_SUFAMITURBO |
| 1760 | 1791 | && (offset & 0xffff) >= 0x8000 && ((offset >= 0x600000 && offset < 0x640000) || (offset >= 0x700000 && offset < 0x740000))) |
| 1761 | 1792 | { m_slotcart->m_cart->write_l(space, offset, data); return; } |
| 1793 | else if (m_slotcart->get_type() == SNES_20COL |
| 1794 | && offset >= 0x8000 && offset < 0x9000) |
| 1795 | { m_slotcart->m_cart->chip_write(space, offset, data); return; } |
| 1762 | 1796 | else if (m_slotcart->get_type() == SNES_BANANA |
| 1763 | | && (offset & 0x78000) == 0x8000) |
| 1797 | && (offset & 0x8000) == 0x8000) |
| 1764 | 1798 | { |
| 1765 | | // printf("lo write %x\n", offset); |
| 1799 | printf("write addr lo %X data %X\n", offset, data); |
| 1766 | 1800 | m_slotcart->m_cart->chip_write(space, offset, data); |
| 1767 | 1801 | return; |
| 1768 | 1802 | } |
| 1769 | | |
| 1803 | else if (m_slotcart->get_type() == SNES_BUGS |
| 1804 | && (offset & 0x78000) == 0x8000) |
| 1805 | { |
| 1806 | // printf("write lo addr %X data %X\n", offset, data); |
| 1807 | } |
| 1808 | |
| 1770 | 1809 | // other add-on writes matches the hi handler |
| 1771 | 1810 | snes20_hi_w(space, offset, data, 0xff); |
| 1772 | 1811 | } |
| r21818 | r21819 | |
| 2280 | 2319 | SLOT_INTERFACE_INTERNAL("bsxrom", SNS_ROM_BSX) // BS-X base cart - partial support only |
| 2281 | 2320 | // pirate carts |
| 2282 | 2321 | SLOT_INTERFACE_INTERNAL("lorom_poke", SNS_LOROM_POKEMON) |
| 2322 | SLOT_INTERFACE_INTERNAL("lorom_tekken2", SNS_LOROM_TEKKEN2) |
| 2323 | SLOT_INTERFACE_INTERNAL("lorom_sbld", SNS_LOROM_SOULBLAD) |
| 2324 | SLOT_INTERFACE_INTERNAL("lorom_mcpir1", SNS_LOROM_MCPIR1) |
| 2325 | SLOT_INTERFACE_INTERNAL("lorom_mcpir2", SNS_LOROM_MCPIR2) |
| 2326 | SLOT_INTERFACE_INTERNAL("lorom_20col", SNS_LOROM_20COL) |
| 2327 | SLOT_INTERFACE_INTERNAL("lorom_pija", SNS_LOROM_BANANA) // not working yet |
| 2328 | SLOT_INTERFACE_INTERNAL("lorom_bugs", SNS_LOROM_BUGSLIFE) // not working yet |
| 2283 | 2329 | SLOT_INTERFACE_END |
| 2284 | 2330 | |
| 2285 | 2331 | |
| r21818 | r21819 | |
| 2294 | 2340 | // in progress... |
| 2295 | 2341 | switch (state->m_type) |
| 2296 | 2342 | { |
| 2343 | // LoROM & LoROM + addons |
| 2297 | 2344 | case SNES_MODE20: |
| 2298 | 2345 | case SNES_BSXLO: |
| 2299 | 2346 | case SNES_SUFAMITURBO: |
| 2300 | | case SNES_BANANA: |
| 2301 | 2347 | case SNES_CX4: // this still uses the old simulation instead of emulating the CPU |
| 2302 | 2348 | case SNES_ST010: // this requires two diff kinds of chip access, so we handle it in snes20_lo/hi_r/w |
| 2303 | 2349 | case SNES_ST011: // this requires two diff kinds of chip access, so we handle it in snes20_lo/hi_r/w |
| 2304 | 2350 | break; |
| 2305 | | case SNES_POKEMON: |
| 2306 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x800000, 0x80ffff, 0, 0x780000, read8_delegate(FUNC(device_sns_cart_interface::chip_read),state->m_slotcart->m_cart)); |
| 2307 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x800000, 0x80ffff, 0, 0x780000, write8_delegate(FUNC(device_sns_cart_interface::chip_write),state->m_slotcart->m_cart)); |
| 2308 | | // set_5a22_map(*state->m_maincpu); |
| 2309 | | break; |
| 2310 | 2351 | case SNES_DSP: |
| 2311 | 2352 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x208000, 0x20ffff, 0, 0x9f0000, read8_delegate(FUNC(device_sns_cart_interface::chip_read),state->m_slotcart->m_cart)); |
| 2312 | 2353 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x208000, 0x20ffff, 0, 0x9f0000, write8_delegate(FUNC(device_sns_cart_interface::chip_write),state->m_slotcart->m_cart)); |
| r21818 | r21819 | |
| 2323 | 2364 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0xbf0000, read8_delegate(FUNC(device_sns_cart_interface::chip_read),state->m_slotcart->m_cart)); |
| 2324 | 2365 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0xbf0000, write8_delegate(FUNC(device_sns_cart_interface::chip_write),state->m_slotcart->m_cart)); |
| 2325 | 2366 | break; |
| 2367 | case SNES_SFX: |
| 2368 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snsnew_state::snessfx_lo_r),state), write8_delegate(FUNC(snsnew_state::snessfx_lo_w),state)); |
| 2369 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snsnew_state::snessfx_hi_r),state), write8_delegate(FUNC(snsnew_state::snessfx_hi_w),state)); |
| 2370 | set_5a22_map(*state->m_maincpu); |
| 2371 | break; |
| 2372 | case SNES_SDD1: |
| 2373 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snsnew_state::snessdd1_lo_r),state), write8_delegate(FUNC(snsnew_state::snessdd1_lo_w),state)); |
| 2374 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snsnew_state::snessdd1_hi_r),state), write8_delegate(FUNC(snsnew_state::snessdd1_hi_w),state)); |
| 2375 | set_5a22_map(*state->m_maincpu); |
| 2376 | break; |
| 2377 | case SNES_BSX: |
| 2378 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snsnew_state::snesbsx_lo_r),state), write8_delegate(FUNC(snsnew_state::snesbsx_lo_w),state)); |
| 2379 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snsnew_state::snesbsx_hi_r),state), write8_delegate(FUNC(snsnew_state::snesbsx_hi_w),state)); |
| 2380 | set_5a22_map(*state->m_maincpu); |
| 2381 | break; |
| 2382 | // HiROM & HiROM + addons |
| 2326 | 2383 | case SNES_MODE21: |
| 2327 | 2384 | case SNES_BSXHI: |
| 2328 | 2385 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snsnew_state::snes21_lo_r),state), write8_delegate(FUNC(snsnew_state::snes21_lo_w),state)); |
| r21818 | r21819 | |
| 2343 | 2400 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x002801, 0x002801, 0, 0xbf0000, write8_delegate(FUNC(device_sns_cart_interface::chip_write),state->m_slotcart->m_cart)); |
| 2344 | 2401 | set_5a22_map(*state->m_maincpu); |
| 2345 | 2402 | break; |
| 2346 | | case SNES_SFX: |
| 2347 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snsnew_state::snessfx_lo_r),state), write8_delegate(FUNC(snsnew_state::snessfx_lo_w),state)); |
| 2348 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snsnew_state::snessfx_hi_r),state), write8_delegate(FUNC(snsnew_state::snessfx_hi_w),state)); |
| 2349 | | set_5a22_map(*state->m_maincpu); |
| 2350 | | break; |
| 2351 | 2403 | case SNES_SPC7110: |
| 2352 | 2404 | case SNES_SPC7110_RTC: |
| 2353 | 2405 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snsnew_state::snes7110_lo_r),state), write8_delegate(FUNC(snsnew_state::snes7110_lo_w),state)); |
| 2354 | 2406 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snsnew_state::snes7110_hi_r),state), write8_delegate(FUNC(snsnew_state::snes7110_hi_w),state)); |
| 2355 | 2407 | set_5a22_map(*state->m_maincpu); |
| 2356 | 2408 | break; |
| 2357 | | case SNES_SDD1: |
| 2358 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snsnew_state::snessdd1_lo_r),state), write8_delegate(FUNC(snsnew_state::snessdd1_lo_w),state)); |
| 2359 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snsnew_state::snessdd1_hi_r),state), write8_delegate(FUNC(snsnew_state::snessdd1_hi_w),state)); |
| 2360 | | set_5a22_map(*state->m_maincpu); |
| 2409 | // pirate 'mappers' |
| 2410 | case SNES_POKEMON: |
| 2411 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x800000, 0x80ffff, 0, 0x780000, read8_delegate(FUNC(device_sns_cart_interface::chip_read),state->m_slotcart->m_cart)); |
| 2412 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x800000, 0x80ffff, 0, 0x780000, write8_delegate(FUNC(device_sns_cart_interface::chip_write),state->m_slotcart->m_cart)); |
| 2361 | 2413 | break; |
| 2362 | | case SNES_BSX: |
| 2363 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snsnew_state::snesbsx_lo_r),state), write8_delegate(FUNC(snsnew_state::snesbsx_lo_w),state)); |
| 2364 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snsnew_state::snesbsx_hi_r),state), write8_delegate(FUNC(snsnew_state::snesbsx_hi_w),state)); |
| 2365 | | set_5a22_map(*state->m_maincpu); |
| 2414 | case SNES_TEKKEN2: |
| 2415 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x808000, 0x8087ff, 0, 0x3f0000, read8_delegate(FUNC(device_sns_cart_interface::chip_read),state->m_slotcart->m_cart)); |
| 2416 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x808000, 0x8087ff, 0, 0x3f0000, write8_delegate(FUNC(device_sns_cart_interface::chip_write),state->m_slotcart->m_cart)); |
| 2366 | 2417 | break; |
| 2418 | case SNES_MCPIR1: |
| 2419 | case SNES_MCPIR2: |
| 2420 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0xffff00, 0xffffff, write8_delegate(FUNC(device_sns_cart_interface::chip_write),state->m_slotcart->m_cart)); |
| 2421 | break; |
| 2422 | case SNES_20COL: |
| 2423 | // why is this not working? investigate... |
| 2424 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x008000, 0x008fff, write8_delegate(FUNC(device_sns_cart_interface::chip_write),state->m_slotcart->m_cart)); |
| 2425 | break; |
| 2426 | case SNES_SOULBLAD: |
| 2427 | // reads from xxx0-xxx3in range [80-bf] return a fixed sequence of 4bits; reads in range [c0-ff] return open bus |
| 2428 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x808000, 0x808003, 0, 0x3f7ff0, read8_delegate(FUNC(device_sns_cart_interface::chip_read),state->m_slotcart->m_cart)); |
| 2429 | machine.device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0xc00000, 0xffffff, FUNC(snes_open_bus_r)); |
| 2430 | break; |
| 2431 | case SNES_BUGS: |
| 2432 | case SNES_BANANA: |
| 2433 | // machine.device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x808000, 0x80ffff, 0, 0x780000, read8_delegate(FUNC(device_sns_cart_interface::chip_read),state->m_slotcart->m_cart)); |
| 2434 | // machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x808000, 0x80ffff, 0, 0x780000, write8_delegate(FUNC(device_sns_cart_interface::chip_write),state->m_slotcart->m_cart)); |
| 2435 | // set_5a22_map(*state->m_maincpu); |
| 2436 | break; |
| 2367 | 2437 | } |
| 2368 | 2438 | } |
| 2369 | 2439 | |
trunk/src/mess/machine/sns_rom.c
| r21818 | r21819 | |
| 20 | 20 | const device_type SNS_LOROM_OBC1 = &device_creator<sns_rom_obc1_device>; |
| 21 | 21 | // LoROM pirate carts with protection |
| 22 | 22 | const device_type SNS_LOROM_POKEMON = &device_creator<sns_rom_pokemon_device>; |
| 23 | const device_type SNS_LOROM_TEKKEN2 = &device_creator<sns_rom_tekken2_device>; |
| 24 | const device_type SNS_LOROM_SOULBLAD = &device_creator<sns_rom_soulblad_device>; |
| 25 | const device_type SNS_LOROM_BANANA = &device_creator<sns_rom_banana_device>; |
| 26 | const device_type SNS_LOROM_BUGSLIFE = &device_creator<sns_rom_bugs_device>; |
| 27 | // LoROM pirate multicarts |
| 28 | const device_type SNS_LOROM_MCPIR1 = &device_creator<sns_rom_mcpirate1_device>; |
| 29 | const device_type SNS_LOROM_MCPIR2 = &device_creator<sns_rom_mcpirate2_device>; |
| 30 | const device_type SNS_LOROM_20COL = &device_creator<sns_rom_20col_device>; |
| 23 | 31 | |
| 24 | 32 | |
| 25 | 33 | sns_rom_device::sns_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) |
| r21818 | r21819 | |
| 34 | 42 | { |
| 35 | 43 | } |
| 36 | 44 | |
| 45 | sns_rom_obc1_device::sns_rom_obc1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 46 | : sns_rom_device(mconfig, SNS_LOROM_OBC1, "SNES Cart (LoROM) + OBC-1", tag, owner, clock) |
| 47 | { |
| 48 | } |
| 49 | |
| 50 | |
| 51 | |
| 52 | // Pirate LoROM 'mappers' |
| 37 | 53 | sns_rom_pokemon_device::sns_rom_pokemon_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 38 | 54 | : sns_rom_device(mconfig, SNS_LOROM_POKEMON, "SNES Pirate Carts with Protection", tag, owner, clock) |
| 39 | 55 | { |
| 40 | 56 | } |
| 41 | 57 | |
| 42 | | sns_rom_obc1_device::sns_rom_obc1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 43 | | : sns_rom_device(mconfig, SNS_LOROM_OBC1, "SNES Cart (LoROM) + OBC-1", tag, owner, clock) |
| 58 | sns_rom_tekken2_device::sns_rom_tekken2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 59 | : sns_rom_device(mconfig, SNS_LOROM_TEKKEN2, "SNES Pirate Carts with Protection", tag, owner, clock) |
| 44 | 60 | { |
| 45 | 61 | } |
| 46 | 62 | |
| 63 | sns_rom_soulblad_device::sns_rom_soulblad_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 64 | : sns_rom_device(mconfig, SNS_LOROM_SOULBLAD, "SNES Pirate Carts with Protection", tag, owner, clock) |
| 65 | { |
| 66 | } |
| 47 | 67 | |
| 48 | | void sns_rom_device::device_start() |
| 68 | sns_rom_banana_device::sns_rom_banana_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 69 | : sns_rom_device(mconfig, SNS_LOROM_BANANA, "SNES Pirate Carts with Protection", tag, owner, clock) |
| 49 | 70 | { |
| 50 | 71 | } |
| 51 | 72 | |
| 52 | | void sns_rom_pokemon_device::device_start() |
| 73 | sns_rom_bugs_device::sns_rom_bugs_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 74 | : sns_rom_device(mconfig, SNS_LOROM_BUGSLIFE, "SNES Pirate Carts with Protection", tag, owner, clock) |
| 53 | 75 | { |
| 54 | | save_item(NAME(m_latch)); |
| 55 | 76 | } |
| 56 | 77 | |
| 57 | | void sns_rom_pokemon_device::device_reset() |
| 78 | // Multigame LoROM 'mappers' |
| 79 | sns_rom_mcpirate1_device::sns_rom_mcpirate1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 80 | : sns_rom_device(mconfig, SNS_LOROM_MCPIR1, "SNES Pirate Multigame Carts Type 1", tag, owner, clock) |
| 58 | 81 | { |
| 59 | | m_latch = 0; |
| 60 | 82 | } |
| 61 | 83 | |
| 84 | sns_rom_mcpirate2_device::sns_rom_mcpirate2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 85 | : sns_rom_device(mconfig, SNS_LOROM_MCPIR2, "SNES Pirate Multigame Carts Type 2", tag, owner, clock) |
| 86 | { |
| 87 | } |
| 88 | |
| 89 | sns_rom_20col_device::sns_rom_20col_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 90 | : sns_rom_device(mconfig, SNS_LOROM_20COL, "SNES Super 20 Collection", tag, owner, clock) |
| 91 | { |
| 92 | } |
| 93 | |
| 94 | |
| 95 | void sns_rom_device::device_start() |
| 96 | { |
| 97 | } |
| 98 | |
| 62 | 99 | void sns_rom_obc1_device::device_start() |
| 63 | 100 | { |
| 64 | 101 | save_item(NAME(m_ram)); |
| r21818 | r21819 | |
| 77 | 114 | } |
| 78 | 115 | |
| 79 | 116 | |
| 117 | void sns_rom_pokemon_device::device_start() |
| 118 | { |
| 119 | save_item(NAME(m_latch)); |
| 120 | } |
| 121 | |
| 122 | void sns_rom_pokemon_device::device_reset() |
| 123 | { |
| 124 | m_latch = 0; |
| 125 | } |
| 126 | |
| 127 | void sns_rom_tekken2_device::device_start() |
| 128 | { |
| 129 | save_item(NAME(m_prot)); |
| 130 | } |
| 131 | |
| 132 | void sns_rom_tekken2_device::device_reset() |
| 133 | { |
| 134 | m_prot = 0; |
| 135 | } |
| 136 | |
| 137 | void sns_rom_bugs_device::device_start() |
| 138 | { |
| 139 | save_item(NAME(m_latch)); |
| 140 | } |
| 141 | |
| 142 | void sns_rom_bugs_device::device_reset() |
| 143 | { |
| 144 | memset(m_latch, 0, sizeof(m_latch)); |
| 145 | } |
| 146 | |
| 147 | |
| 148 | |
| 149 | void sns_rom_mcpirate1_device::device_start() |
| 150 | { |
| 151 | save_item(NAME(m_base_bank)); |
| 152 | } |
| 153 | |
| 154 | void sns_rom_mcpirate1_device::device_reset() |
| 155 | { |
| 156 | m_base_bank = 0; |
| 157 | } |
| 158 | |
| 159 | void sns_rom_mcpirate2_device::device_start() |
| 160 | { |
| 161 | save_item(NAME(m_base_bank)); |
| 162 | } |
| 163 | |
| 164 | void sns_rom_mcpirate2_device::device_reset() |
| 165 | { |
| 166 | m_base_bank = 0; |
| 167 | } |
| 168 | |
| 169 | void sns_rom_20col_device::device_start() |
| 170 | { |
| 171 | m_base_bank = 4; |
| 172 | save_item(NAME(m_base_bank)); |
| 173 | } |
| 174 | |
| 175 | |
| 80 | 176 | /*------------------------------------------------- |
| 81 | 177 | mapper specific handlers |
| 82 | 178 | -------------------------------------------------*/ |
| r21818 | r21819 | |
| 94 | 190 | |
| 95 | 191 | |
| 96 | 192 | |
| 97 | | // Lo-ROM + Protection device |
| 98 | | |
| 99 | | READ8_MEMBER( sns_rom_pokemon_device::chip_read ) |
| 100 | | { |
| 101 | | return BITSWAP8(m_latch,0,6,7,1,2,3,4,5); |
| 102 | | } |
| 103 | | |
| 104 | | WRITE8_MEMBER( sns_rom_pokemon_device::chip_write ) |
| 105 | | { |
| 106 | | m_latch = data; |
| 107 | | } |
| 108 | | |
| 109 | | |
| 110 | 193 | // Lo-ROM + OBC-1 (used by Metal Combat - Falcon's Revenge) |
| 111 | 194 | // same as above but additional read/write handling for the add-on chip |
| 112 | 195 | |
| r21818 | r21819 | |
| 207 | 290 | break; |
| 208 | 291 | } |
| 209 | 292 | } |
| 293 | |
| 294 | |
| 295 | |
| 296 | // Lo-ROM + Protection devices used in pirate carts |
| 297 | |
| 298 | |
| 299 | // Pokemon (and many others): a byte is written and a permutation of its bits must be returned. |
| 300 | // Address range for read/write depends on the game (check snes.xml) |
| 301 | READ8_MEMBER( sns_rom_pokemon_device::chip_read ) |
| 302 | { |
| 303 | return BITSWAP8(m_latch,0,6,7,1,2,3,4,5); |
| 304 | } |
| 305 | |
| 306 | WRITE8_MEMBER( sns_rom_pokemon_device::chip_write ) |
| 307 | { |
| 308 | m_latch = data; |
| 309 | } |
| 310 | |
| 311 | |
| 312 | // Tekken 2: It accesses the protection in a very strange way, always reading/writing the same data $f0 times, |
| 313 | // because each access must be repeated a couple of times to be registered (typically around 7-30 times) |
| 314 | // They probably used a microcontroller here. |
| 315 | // The protection itself is accessed in banks $80-$bf. Accessing (read/write, doesn't matter) adress lines |
| 316 | // A8,A9,A10 in these banks in a certain sequence makes the mc return a 4bit value. [d4s] |
| 317 | // Details on a possible algorythm behind the sequence of accesses were provided by nocash. Thanks! |
| 318 | void sns_rom_tekken2_device::update_prot(UINT32 offset) |
| 319 | { |
| 320 | // accesses to [80-bf][8000-87ff] ranges update the protection value |
| 321 | offset &= 0x7ff; |
| 322 | |
| 323 | switch (offset & 0x700) |
| 324 | { |
| 325 | case 0x000: |
| 326 | m_prot = 0; |
| 327 | break; |
| 328 | case 0x100: |
| 329 | // used for read access |
| 330 | break; |
| 331 | case 0x200: // BIT 0 |
| 332 | m_prot |= 1; |
| 333 | break; |
| 334 | case 0x300: // BIT 1 |
| 335 | m_prot |= 2; |
| 336 | break; |
| 337 | case 0x400: // BIT 2 |
| 338 | m_prot |= 4; |
| 339 | break; |
| 340 | case 0x500: // BIT 3 |
| 341 | m_prot |= 8; |
| 342 | break; |
| 343 | case 0x600: // DIRECTION |
| 344 | m_prot |= 0x10; |
| 345 | break; |
| 346 | case 0x700: // FUNCTION |
| 347 | m_prot |= 0x20; |
| 348 | break; |
| 349 | } |
| 350 | } |
| 351 | |
| 352 | READ8_MEMBER( sns_rom_tekken2_device::chip_read ) |
| 353 | { |
| 354 | update_prot(offset); |
| 355 | |
| 356 | if ((offset & 0x700) == 0x100) |
| 357 | { |
| 358 | if (BIT(m_prot, 5)) // FUNCTION = 1 means Shift |
| 359 | { |
| 360 | if (BIT(m_prot, 4)) // DIRECTION = 1 means Right |
| 361 | return (m_prot & 0x0f) >> 1; |
| 362 | else // DIRECTION = 0 means Left |
| 363 | return (m_prot & 0x0f) << 1; |
| 364 | } |
| 365 | else // FUNCTION = 0 means Add/Sub |
| 366 | { |
| 367 | if (BIT(m_prot, 4)) // DIRECTION = 1 means Minus |
| 368 | return (m_prot & 0x0f) - 1; |
| 369 | else // DIRECTION = 0 means Plus |
| 370 | return (m_prot & 0x0f) + 1; |
| 371 | } |
| 372 | } |
| 373 | |
| 374 | return 0xff; // should be open_bus |
| 375 | } |
| 376 | |
| 377 | WRITE8_MEMBER( sns_rom_tekken2_device::chip_write ) |
| 378 | { |
| 379 | update_prot(offset); |
| 380 | } |
| 381 | |
| 382 | |
| 383 | // Soul Blade: Adresses $xxx0-$xxx3 in banks $80-$bf always read $55, $0f, $aa, $f0. |
| 384 | // Banks $c0-$ff return open bus. |
| 385 | READ8_MEMBER( sns_rom_soulblad_device::chip_read ) |
| 386 | { |
| 387 | UINT8 value = 0; |
| 388 | offset &= 3; |
| 389 | switch (offset) |
| 390 | { |
| 391 | case 0: |
| 392 | default: |
| 393 | value = 0x55; |
| 394 | break; |
| 395 | case 1: |
| 396 | value = 0x0f; |
| 397 | break; |
| 398 | case 2: |
| 399 | value = 0xaa; |
| 400 | break; |
| 401 | case 3: |
| 402 | value = 0xf0; |
| 403 | break; |
| 404 | } |
| 405 | return value; |
| 406 | } |
| 407 | |
| 408 | // Multicart pirate banking emulation |
| 409 | // LoROM games, writes to [ff][ff00-ffff] control bankswitch |
| 410 | // The actual banks depends on the last 8bits of the address accessed. |
| 411 | |
| 412 | // Type 1: bits0-4 of the address are used as base bank (256KB chunks) |
| 413 | READ8_MEMBER(sns_rom_mcpirate1_device::read_l) |
| 414 | { |
| 415 | return read_h(space, offset); |
| 416 | } |
| 417 | |
| 418 | READ8_MEMBER(sns_rom_mcpirate1_device::read_h) |
| 419 | { |
| 420 | int bank = (offset / 0x10000) + (m_base_bank * 8); |
| 421 | return m_rom[rom_bank_map[bank] * 0x8000 + (offset & 0x7fff)]; |
| 422 | } |
| 423 | |
| 424 | WRITE8_MEMBER( sns_rom_mcpirate1_device::chip_write ) |
| 425 | { |
| 426 | m_base_bank = offset & 0x1f; |
| 427 | // printf("offset %X data %X bank %X\n", offset, data, m_base_bank); |
| 428 | } |
| 429 | |
| 430 | // Type 2: bits0-3 & bit5 of the address are used as base bank (256KB chunks) |
| 431 | READ8_MEMBER(sns_rom_mcpirate2_device::read_l) |
| 432 | { |
| 433 | return read_h(space, offset); |
| 434 | } |
| 435 | |
| 436 | READ8_MEMBER(sns_rom_mcpirate2_device::read_h) |
| 437 | { |
| 438 | int bank = (offset / 0x10000) + (m_base_bank * 8); |
| 439 | return m_rom[rom_bank_map[bank] * 0x8000 + (offset & 0x7fff)]; |
| 440 | } |
| 441 | |
| 442 | WRITE8_MEMBER( sns_rom_mcpirate2_device::chip_write ) |
| 443 | { |
| 444 | m_base_bank = (offset & 0x0f) | ((offset & 0x20) >> 1); |
| 445 | // printf("offset %X data %X bank %X\n", offset, data, m_base_bank); |
| 446 | } |
| 447 | |
| 448 | // Korean 20 in 1 collection with NES games |
| 449 | // base bank is selected (in 32KB chunks) by bits 0-4 of data written at 0x808000 |
| 450 | READ8_MEMBER(sns_rom_20col_device::read_l) |
| 451 | { |
| 452 | return read_h(space, offset); |
| 453 | } |
| 454 | |
| 455 | READ8_MEMBER(sns_rom_20col_device::read_h) |
| 456 | { |
| 457 | int bank = (offset / 0x10000); |
| 458 | return m_rom[(rom_bank_map[bank] + m_base_bank) * 0x8000 + (offset & 0x7fff)]; |
| 459 | } |
| 460 | |
| 461 | WRITE8_MEMBER( sns_rom_20col_device::chip_write ) |
| 462 | { |
| 463 | // [#] game - written bank value |
| 464 | // [01] spartan x - c6 |
| 465 | // [02] smb - c8 |
| 466 | // [03] antarcitc adv - 8e |
| 467 | // [04] twinbee - ca |
| 468 | // [05] battle city - 8f |
| 469 | // [06] circus charlie - 90 |
| 470 | // [07] galaga - 91 |
| 471 | // [08] yie ar kungfu - 92 |
| 472 | // [09] star force - 93 |
| 473 | // [10] road fighter - 94 |
| 474 | // [11] pinball - 95 |
| 475 | // [12] bomberman - 96 |
| 476 | // [13] new tetris?? - 0 |
| 477 | // [14] arkanoid - cc |
| 478 | // [15] balloon fight - 97 |
| 479 | // [16] donkey kong - 98 |
| 480 | // [17] donkey kong 3 - 99 |
| 481 | // [18] donkey kong jr - 9a |
| 482 | // [19] mario bros - 9b |
| 483 | // [20] popeye - 9c |
| 484 | m_base_bank = data & 0x1f; |
| 485 | // printf("offset %X data %X bank %X\n", offset, data, m_base_bank); |
| 486 | } |
| 487 | |
| 488 | |
| 489 | |
| 490 | // Work in progress (probably very wrong) |
| 491 | |
| 492 | READ8_MEMBER( sns_rom_banana_device::chip_read ) |
| 493 | { |
| 494 | return BITSWAP8(m_latch[0xf],0,6,7,1,2,3,4,5); |
| 495 | } |
| 496 | |
| 497 | WRITE8_MEMBER( sns_rom_banana_device::chip_write ) |
| 498 | { |
| 499 | // printf("write addr %X data %X\n", offset, data); |
| 500 | m_latch[0xf] = data; |
| 501 | } |
| 502 | |
| 503 | READ8_MEMBER( sns_rom_bugs_device::chip_read ) |
| 504 | { |
| 505 | return BITSWAP8(m_latch[offset & 0xff],0,6,7,1,2,3,4,5); |
| 506 | } |
| 507 | |
| 508 | WRITE8_MEMBER( sns_rom_bugs_device::chip_write ) |
| 509 | { |
| 510 | m_latch[offset & 0xff] = data; |
| 511 | } |
| 512 | |
| 513 | |
trunk/src/mess/machine/sns_rom.h
| r21818 | r21819 | |
| 23 | 23 | virtual DECLARE_READ8_MEMBER(read_h); |
| 24 | 24 | }; |
| 25 | 25 | |
| 26 | // ======================> sns_rom_obc1_device |
| 27 | |
| 28 | class sns_rom_obc1_device : public sns_rom_device |
| 29 | { |
| 30 | public: |
| 31 | // construction/destruction |
| 32 | sns_rom_obc1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 33 | |
| 34 | // device-level overrides |
| 35 | virtual void device_start(); |
| 36 | virtual void device_reset(); |
| 37 | virtual void device_config_complete() { m_shortname = "sns_rom_obc1"; } |
| 38 | |
| 39 | // additional reading and writing |
| 40 | virtual DECLARE_READ8_MEMBER(chip_read); |
| 41 | virtual DECLARE_WRITE8_MEMBER(chip_write); |
| 42 | |
| 43 | int m_address; |
| 44 | int m_offset; |
| 45 | int m_shift; |
| 46 | UINT8 m_ram[0x2000]; |
| 47 | }; |
| 48 | |
| 49 | |
| 50 | |
| 26 | 51 | // ======================> sns_rom_pokemon_device |
| 27 | 52 | |
| 28 | 53 | class sns_rom_pokemon_device : public sns_rom_device |
| r21818 | r21819 | |
| 42 | 67 | UINT8 m_latch; |
| 43 | 68 | }; |
| 44 | 69 | |
| 45 | | // ======================> sns_rom_obc1_device |
| 70 | // ======================> sns_rom_tekken2_device |
| 46 | 71 | |
| 47 | | class sns_rom_obc1_device : public sns_rom_device |
| 72 | class sns_rom_tekken2_device : public sns_rom_device |
| 48 | 73 | { |
| 49 | 74 | public: |
| 50 | 75 | // construction/destruction |
| 51 | | sns_rom_obc1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 76 | sns_rom_tekken2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 77 | |
| 78 | // device-level overrides |
| 79 | virtual void device_start(); |
| 80 | virtual void device_reset(); |
| 81 | virtual void device_config_complete() { m_shortname = "sns_rom_tekken2"; } |
| 82 | |
| 83 | // reading and writing |
| 84 | virtual DECLARE_READ8_MEMBER(chip_read); // protection device |
| 85 | virtual DECLARE_WRITE8_MEMBER(chip_write); // protection device |
| 52 | 86 | |
| 87 | void update_prot(UINT32 offset); |
| 88 | |
| 89 | // bit0-3 prot value, bit4 direction, bit5 function |
| 90 | // reads must return (prot value) +1/-1/<<1/>>1 depending on bit4 & bit5 |
| 91 | UINT8 m_prot; |
| 92 | }; |
| 93 | |
| 94 | // ======================> sns_rom_soulblad_device |
| 95 | |
| 96 | class sns_rom_soulblad_device : public sns_rom_device |
| 97 | { |
| 98 | public: |
| 99 | // construction/destruction |
| 100 | sns_rom_soulblad_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 101 | |
| 53 | 102 | // device-level overrides |
| 103 | virtual void device_config_complete() { m_shortname = "sns_rom_soulblad"; } |
| 104 | |
| 105 | // reading and writing |
| 106 | virtual DECLARE_READ8_MEMBER(chip_read); // protection device |
| 107 | }; |
| 108 | |
| 109 | // ======================> sns_rom_mcpirate1_device |
| 110 | |
| 111 | class sns_rom_mcpirate1_device : public sns_rom_device |
| 112 | { |
| 113 | public: |
| 114 | // construction/destruction |
| 115 | sns_rom_mcpirate1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 116 | |
| 117 | // device-level overrides |
| 54 | 118 | virtual void device_start(); |
| 55 | 119 | virtual void device_reset(); |
| 56 | | virtual void device_config_complete() { m_shortname = "sns_rom_obc1"; } |
| 120 | virtual void device_config_complete() { m_shortname = "sns_rom_mcpirate1"; } |
| 121 | |
| 122 | // reading and writing |
| 123 | virtual DECLARE_READ8_MEMBER(read_l); |
| 124 | virtual DECLARE_READ8_MEMBER(read_h); |
| 125 | virtual DECLARE_WRITE8_MEMBER(chip_write); // bankswitch device |
| 126 | UINT8 m_base_bank; |
| 127 | }; |
| 57 | 128 | |
| 58 | | // additional reading and writing |
| 59 | | virtual DECLARE_READ8_MEMBER(chip_read); |
| 60 | | virtual DECLARE_WRITE8_MEMBER(chip_write); |
| 129 | // ======================> sns_rom_mcpirate2_device |
| 61 | 130 | |
| 62 | | int m_address; |
| 63 | | int m_offset; |
| 64 | | int m_shift; |
| 65 | | UINT8 m_ram[0x2000]; |
| 131 | class sns_rom_mcpirate2_device : public sns_rom_device |
| 132 | { |
| 133 | public: |
| 134 | // construction/destruction |
| 135 | sns_rom_mcpirate2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 136 | |
| 137 | // device-level overrides |
| 138 | virtual void device_start(); |
| 139 | virtual void device_reset(); |
| 140 | virtual void device_config_complete() { m_shortname = "sns_rom_mcpirate2"; } |
| 141 | |
| 142 | // reading and writing |
| 143 | virtual DECLARE_READ8_MEMBER(read_l); |
| 144 | virtual DECLARE_READ8_MEMBER(read_h); |
| 145 | virtual DECLARE_WRITE8_MEMBER(chip_write); // bankswitch device |
| 146 | UINT8 m_base_bank; |
| 66 | 147 | }; |
| 67 | 148 | |
| 149 | // ======================> sns_rom_20col_device |
| 68 | 150 | |
| 151 | class sns_rom_20col_device : public sns_rom_device |
| 152 | { |
| 153 | public: |
| 154 | // construction/destruction |
| 155 | sns_rom_20col_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 156 | |
| 157 | // device-level overrides |
| 158 | virtual void device_start(); |
| 159 | virtual void device_config_complete() { m_shortname = "sns_rom_20col"; } |
| 160 | |
| 161 | // reading and writing |
| 162 | virtual DECLARE_READ8_MEMBER(read_l); |
| 163 | virtual DECLARE_READ8_MEMBER(read_h); |
| 164 | virtual DECLARE_WRITE8_MEMBER(chip_write); // bankswitch device |
| 165 | UINT8 m_base_bank; |
| 166 | }; |
| 167 | |
| 168 | // ======================> sns_rom_banana_device |
| 169 | |
| 170 | class sns_rom_banana_device : public sns_rom_device |
| 171 | { |
| 172 | public: |
| 173 | // construction/destruction |
| 174 | sns_rom_banana_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 175 | |
| 176 | // device-level overrides |
| 177 | // virtual void device_start(); |
| 178 | // virtual void device_reset(); |
| 179 | virtual void device_config_complete() { m_shortname = "sns_rom_banana"; } |
| 180 | |
| 181 | // reading and writing |
| 182 | virtual DECLARE_READ8_MEMBER(chip_read); // protection device |
| 183 | virtual DECLARE_WRITE8_MEMBER(chip_write); // protection device |
| 184 | UINT8 m_latch[16]; |
| 185 | }; |
| 186 | |
| 187 | // ======================> sns_rom_bugs_device |
| 188 | |
| 189 | class sns_rom_bugs_device : public sns_rom_device |
| 190 | { |
| 191 | public: |
| 192 | // construction/destruction |
| 193 | sns_rom_bugs_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 194 | |
| 195 | // device-level overrides |
| 196 | virtual void device_start(); |
| 197 | virtual void device_reset(); |
| 198 | virtual void device_config_complete() { m_shortname = "sns_rom_bugslife"; } |
| 199 | |
| 200 | // reading and writing |
| 201 | virtual DECLARE_READ8_MEMBER(chip_read); // protection device |
| 202 | virtual DECLARE_WRITE8_MEMBER(chip_write); // protection device |
| 203 | UINT8 m_latch[0x800]; |
| 204 | }; |
| 205 | |
| 206 | |
| 69 | 207 | // device type definition |
| 70 | 208 | extern const device_type SNS_LOROM; |
| 71 | 209 | extern const device_type SNS_LOROM_OBC1; |
| 72 | 210 | extern const device_type SNS_LOROM_POKEMON; |
| 211 | extern const device_type SNS_LOROM_TEKKEN2; |
| 212 | extern const device_type SNS_LOROM_SOULBLAD; |
| 213 | extern const device_type SNS_LOROM_MCPIR1; |
| 214 | extern const device_type SNS_LOROM_MCPIR2; |
| 215 | extern const device_type SNS_LOROM_20COL; |
| 216 | extern const device_type SNS_LOROM_BANANA; |
| 217 | extern const device_type SNS_LOROM_BUGSLIFE; |
| 73 | 218 | |
| 74 | 219 | #endif |
trunk/hash/snes.xml
| r21818 | r21819 | |
| 3918 | 3918 | </part> |
| 3919 | 3919 | </software> |
| 3920 | 3920 | |
| 3921 | <!-- |
| 3922 | protection actually seems more similar to tekken 2 than to pokemon |
| 3923 | the game writes (low) a lot of time to [ff00-ffff] range and reads (high) to ffcc/ffcd/ffce |
| 3924 | more investigation needed... |
| 3925 | --> |
| 3921 | 3926 | <software name="banpija" cloneof="chester" supported="no"> |
| 3922 | 3927 | <!-- single cartridge source: d4s --> |
| 3923 | 3928 | <description>Bananas de Pijamas (Asia)</description> |
| r21818 | r21819 | |
| 3925 | 3930 | <publisher><unlicensed></publisher> |
| 3926 | 3931 | <part name="cart" interface="snes_cart"> |
| 3927 | 3932 | |
| 3928 | | <feature name="slot" value="lorom" /> |
| 3933 | <feature name="slot" value="lorom_pija" /> |
| 3929 | 3934 | <dataarea name="rom" size="1048576"> |
| 3930 | 3935 | <rom name="bananas de pijamas (unl) [!].sfc" size="1048576" crc="52b0d84b" sha1="149e916dfd4058f8de97d7bc8f74d5e630853ffb" offset="0x000000" /> |
| 3931 | 3936 | </dataarea> |
| r21818 | r21819 | |
| 3946 | 3951 | </part> |
| 3947 | 3952 | </software> |
| 3948 | 3953 | |
| 3949 | | <software name="abugslif" supported="no"> |
| 3954 | <!-- |
| 3955 | protection actually seems more similar to tekken 2 than to pokemon |
| 3956 | the game writes (high) a lot of time to [ff00-ffff] range, but it does not seem to read back (possibly it reads from the same range where it reads rom from...) |
| 3957 | more investigation needed... |
| 3958 | --> |
| 3959 | <software name="bugslife" supported="no"> |
| 3950 | 3960 | <!-- single cartridge source: d4s --> |
| 3951 | 3961 | <!-- Notes: highly similar to the game boy color version, this could be based on a prototype --> |
| 3952 | 3962 | <description>A Bug's Life (Bra)</description> |
| r21818 | r21819 | |
| 3956 | 3966 | <feature name="pcb" value="890409C" /> <!-- epoxy board --> |
| 3957 | 3967 | <feature name="cart_model" value="SNS-006" /> |
| 3958 | 3968 | |
| 3959 | | <feature name="slot" value="lorom" /> |
| 3969 | <feature name="slot" value="lorom_bugs" /> |
| 3960 | 3970 | <dataarea name="rom" size="2097152"> |
| 3961 | 3971 | <rom name="u2" size="2097152" crc="014f0fcf" sha1="930ab53fded53a65824690b394d6e8c6565c083b" offset="0x000000" /> |
| 3962 | 3972 | </dataarea> |
| r21818 | r21819 | |
| 3964 | 3974 | </software> |
| 3965 | 3975 | |
| 3966 | 3976 | <!--Notes: this is temporarily included for reference, until we fix emulation of the good dump --> |
| 3967 | | <software name="abugslifh" cloneof="abugslif"> |
| 3977 | <software name="bugslifeh" cloneof="bugslife"> |
| 3968 | 3978 | <description>A Bug's Life (Bra, Cracked)</description> |
| 3969 | 3979 | <year>199?</year> |
| 3970 | 3980 | <publisher><unlicensed></publisher> |
| r21818 | r21819 | |
| 4199 | 4209 | </part> |
| 4200 | 4210 | </software> |
| 4201 | 4211 | |
| 4202 | | <software name="soulblad" supported="no"> |
| 4212 | <software name="soulblad" supported="partial"> |
| 4203 | 4213 | <!-- single cartridge source: d4s --> |
| 4204 | 4214 | <description>Soul Blade (Asia)</description> |
| 4205 | 4215 | <year>199?</year> |
| r21818 | r21819 | |
| 4210 | 4220 | <feature name="cart_model" value="SNS-006" /> |
| 4211 | 4221 | <feature name="cart_back_label" value="n/a" /> |
| 4212 | 4222 | |
| 4213 | | <feature name="slot" value="lorom" /> |
| 4223 | <feature name="slot" value="lorom_sbld" /> |
| 4214 | 4224 | <dataarea name="rom" size="3145728"> |
| 4215 | 4225 | <rom name="soul blade (world) (unl).sfc" size="3145728" crc="c97d1d7b" sha1="f7501045b5326255f3bde0543eb0a541b62588a9" offset="0x000000" /> |
| 4216 | 4226 | </dataarea> |
| r21818 | r21819 | |
| 4259 | 4269 | </part> |
| 4260 | 4270 | </software> |
| 4261 | 4271 | |
| 4262 | | <software name="sfex" supported="no"> |
| 4272 | <software name="sfex"> |
| 4263 | 4273 | <!-- single cartridge source: d4s --> |
| 4264 | 4274 | <description>Street Fighter EX Plus α (Asia)</description> |
| 4265 | 4275 | <year>199?</year> |
| 4266 | 4276 | <publisher><unlicensed></publisher> |
| 4267 | 4277 | <part name="cart" interface="snes_cart"> |
| 4268 | 4278 | |
| 4269 | | <feature name="slot" value="lorom_poke" /> |
| 4279 | <feature name="slot" value="lorom_tekken2" /> |
| 4270 | 4280 | <dataarea name="rom" size="2097152"> |
| 4271 | 4281 | <rom name="street fighter ex plus alpha (world) (unl).sfc" size="2097152" crc="dad59b9f" sha1="22f864b4a8728f08513b979d2a960eb3083b2c83" offset="0x000000" /> |
| 4272 | 4282 | </dataarea> |
| r21818 | r21819 | |
| 4322 | 4332 | </part> |
| 4323 | 4333 | </software> |
| 4324 | 4334 | |
| 4325 | | <software name="super20m" supported="no"> <!-- not working probably due to custom bankswitching --> |
| 4335 | <!-- The image should be 8MB, while this is only 4MB. Half of game data is missing (only games 1 & 2 are present). Redump needed! --> |
| 4336 | <software name="sup5in1" supported="partial"> |
| 4337 | <description>Super 5 in 1 (Bad Dump)</description> |
| 4338 | <year>199?</year> |
| 4339 | <publisher><unlicensed></publisher> |
| 4340 | <info name="alt_title" value="슈퍼20합" /> |
| 4341 | <part name="cart" interface="snes_cart"> |
| 4342 | |
| 4343 | <feature name="slot" value="lorom_mcpir1" /> |
| 4344 | <dataarea name="rom" size="4194304"> |
| 4345 | <rom name="super 5-in-1 [p1].sfc" size="4194304" crc="41975d1b" sha1="16778a78cadc54b54ba41fbed4aac8beca25d5d2" offset="0x000000" /> |
| 4346 | </dataarea> |
| 4347 | </part> |
| 4348 | </software> |
| 4349 | |
| 4350 | <software name="sup6in1"> |
| 4351 | <description>Super 6 in 1</description> |
| 4352 | <year>199?</year> |
| 4353 | <publisher><unlicensed></publisher> |
| 4354 | <info name="alt_title" value="슈퍼20합" /> |
| 4355 | <part name="cart" interface="snes_cart"> |
| 4356 | |
| 4357 | <feature name="slot" value="lorom_mcpir1" /> |
| 4358 | <dataarea name="rom" size="4194304"> |
| 4359 | <rom name="super 6-in-1 [p1].sfc" size="4194304" crc="2f9169cb" sha1="9f6c4ba3a1035ca97a77eff92690bf873d0eca09" offset="0x000000" /> |
| 4360 | </dataarea> |
| 4361 | </part> |
| 4362 | </software> |
| 4363 | |
| 4364 | <!-- The image should be 8MB, while this is only 2MB. Most of game data is missing (only games 2 & 6 are present). Redump needed! --> |
| 4365 | <software name="new7in1" supported="partial"> |
| 4366 | <description>1997 New 7 in 1 (Bad Dump)</description> |
| 4367 | <year>199?</year> |
| 4368 | <publisher><unlicensed></publisher> |
| 4369 | <info name="alt_title" value="슈퍼20합" /> |
| 4370 | <part name="cart" interface="snes_cart"> |
| 4371 | |
| 4372 | <feature name="slot" value="lorom_mcpir2" /> |
| 4373 | <dataarea name="rom" size="2097152"> |
| 4374 | <rom name="super 11-in-1 [p1].sfc" size="2097152" crc="8a8f8d96" sha1="c8cde5ee5f4dafc450e12bebb0f3f74480dde739" offset="0x000000" /> |
| 4375 | </dataarea> |
| 4376 | </part> |
| 4377 | </software> |
| 4378 | |
| 4379 | <!-- This actually uses a different bankswitch mechanism, and it uses bit6 to select HiROM access, not sure how to emulate it, yet... --> |
| 4380 | <software name="sup7in1" supported="no"> |
| 4381 | <description>Super 7-in-1 1997 (Bad Dump)</description> |
| 4382 | <year>199?</year> |
| 4383 | <publisher><unlicensed></publisher> |
| 4384 | <info name="alt_title" value="슈퍼20합" /> |
| 4385 | <part name="cart" interface="snes_cart"> |
| 4386 | |
| 4387 | <feature name="slot" value="lorom_mcpir1" /> |
| 4388 | <dataarea name="rom" size="4194304"> |
| 4389 | <rom name="super 7-in-1 1997 [p1].sfc" size="4194304" crc="fc5036b2" sha1="04907f8b963bc1f0012f1594cbf244b05416ce58" offset="0x000000" /> |
| 4390 | </dataarea> |
| 4391 | </part> |
| 4392 | </software> |
| 4393 | |
| 4394 | <!-- The image should be 8MB, while this is only 4MB. Half of game data is missing (only games 2, 3, 4 & 5 are present). Redump needed! --> |
| 4395 | <software name="sup9in1" supported="partial"> |
| 4396 | <description>8 in 1 and 10 in 1 (Bad Dump)</description> |
| 4397 | <year>199?</year> |
| 4398 | <publisher><unlicensed></publisher> |
| 4399 | <info name="alt_title" value="슈퍼20합" /> |
| 4400 | <part name="cart" interface="snes_cart"> |
| 4401 | |
| 4402 | <feature name="slot" value="lorom_mcpir1" /> |
| 4403 | <dataarea name="rom" size="4194304"> |
| 4404 | <rom name="super 9-in-1 [p1].sfc" size="4194304" crc="213d6d24" sha1="80f5eb1c55292fd4d47275a13dea21e8cb0c2f91" offset="0x000000" /> |
| 4405 | </dataarea> |
| 4406 | </part> |
| 4407 | </software> |
| 4408 | |
| 4409 | <!-- The image should be ~8MB, while this is only 1MB. Most of game data is missing. Redump needed! --> |
| 4410 | <software name="sup11in1" supported="partial"> |
| 4411 | <description>Super 11 in 1 (Bad Dump)</description> |
| 4412 | <year>199?</year> |
| 4413 | <publisher><unlicensed></publisher> |
| 4414 | <info name="alt_title" value="슈퍼20합" /> |
| 4415 | <part name="cart" interface="snes_cart"> |
| 4416 | |
| 4417 | <feature name="slot" value="lorom_mcpir1" /> |
| 4418 | <dataarea name="rom" size="1048576"> |
| 4419 | <rom name="super 11-in-1 [p1].sfc" size="1048576" crc="81747ee1" sha1="1c0ddb21cde72d4738a56e6618f81b82092c01bd" offset="0x000000" /> |
| 4420 | </dataarea> |
| 4421 | </part> |
| 4422 | </software> |
| 4423 | |
| 4424 | <software name="super20m" supported="partial"> |
| 4326 | 4425 | <!-- single cartridge source: d4s --> |
| 4327 | 4426 | <description>Super 20 Collection (Kor)</description> |
| 4328 | 4427 | <year>199?</year> |
| r21818 | r21819 | |
| 4330 | 4429 | <info name="alt_title" value="슈퍼20합" /> |
| 4331 | 4430 | <part name="cart" interface="snes_cart"> |
| 4332 | 4431 | |
| 4333 | | <feature name="slot" value="lorom" /> |
| 4432 | <feature name="slot" value="lorom_20col" /> |
| 4334 | 4433 | <dataarea name="rom" size="1048576"> |
| 4335 | 4434 | <rom name="c20h.u1" size="1048576" crc="ac19b8f4" sha1="3a64c817ff3fc3819f2fd726868b6f27eb4523df" offset="0x000000" /> |
| 4336 | 4435 | </dataarea> |
| 4337 | 4436 | </part> |
| 4338 | 4437 | </software> |
| 4339 | 4438 | |
| 4340 | | <software name="tekken2" supported="no"> |
| 4439 | <software name="tekken2"> |
| 4341 | 4440 | <!-- single cartridge source: d4s --> |
| 4342 | 4441 | <description>Tekken 2 (Asia)</description> |
| 4343 | 4442 | <year>199?</year> |
| 4344 | 4443 | <publisher><unlicensed></publisher> |
| 4345 | 4444 | <part name="cart" interface="snes_cart"> |
| 4346 | 4445 | |
| 4347 | | <feature name="slot" value="lorom" /> |
| 4446 | <feature name="slot" value="lorom_tekken2" /> |
| 4348 | 4447 | <dataarea name="rom" size="2097152"> |
| 4349 | 4448 | <rom name="tekken 2 (world) (unl).sfc" size="2097152" crc="066687ca" sha1="8aa2ee03fe40f289e30723a1c8cd4564481bdfdf" offset="0x000000" /> |
| 4350 | 4449 | </dataarea> |