Previous 199869 Revisions Next

r21819 Wednesday 13th March, 2013 at 08:05:41 UTC by Fabio Priuli
(MESS) snes.c: misc work on pirate carts.  [Fabio Priuli]
              - added support for Korean Super 20 Collection multigame cart, even if a few games
              still have glitches.
              - added support for bankswitch mechanism used in a few pirate multigame carts.
              - added support for protection used by Tekken 2 and Street Fighter Alpha EX, based
              on notes by d4s and nocash.

(MESS) snes.xml: added a few pirate multigame carts. Most of these are incomplete dumps,
              so redumps are needed to promote them to working state, but their existence is now
              at least documented. [Fabio Priuli]


out of whatsnew: I also have fixed sram issue from fullpath in snesnew driver, due to a silly copy&paste mistake.
[hash]snes.xml
[src/mess/drivers]snes.c
[src/mess/machine]sns_rom.c sns_rom.h sns_slot.c sns_slot.h

trunk/src/mess/drivers/snes.c
r21818r21819
16161616   else if (m_slotcart->get_type() == SNES_CX4
16171617         && (offset < 0x400000 && (offset & 0xffff) >= 0x6000 && (offset & 0xffff) < 0x8000))    // hack until we emulate the real CPU
16181618      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   
16201631   if (offset < 0x400000)
16211632   {
16221633      if (address < 0x2000)
r21818r21819
16761687   else if (m_type == SNES_SUFAMITURBO
16771688         && address >= 0x8000 && ((offset >= 0x600000 && offset < 0x640000) || (offset >= 0x700000 && offset < 0x740000)))
16781689   { 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   
16801704   if (offset < 0x400000)
16811705   {
16821706      if (address < 0x2000)
r21818r21819
17111735   else if (m_slotcart->get_type() == SNES_CX4
17121736         && (offset < 0x400000 && (offset & 0xffff) >= 0x6000 && (offset & 0xffff) < 0x8000))    // hack until we emulate the real CPU
17131737      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   
17151746   if (offset < 0x400000)
17161747   {
17171748      if (address < 0x2000)
r21818r21819
17591790   if (m_type == SNES_SUFAMITURBO
17601791            && (offset & 0xffff) >= 0x8000 && ((offset >= 0x600000 && offset < 0x640000) || (offset >= 0x700000 && offset < 0x740000)))
17611792   { 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; }
17621796   else if (m_slotcart->get_type() == SNES_BANANA
1763            && (offset & 0x78000) == 0x8000)
1797            && (offset & 0x8000) == 0x8000)
17641798   {
1765//      printf("lo write %x\n", offset);
1799      printf("write addr lo %X data %X\n", offset, data);
17661800      m_slotcart->m_cart->chip_write(space, offset, data);
17671801      return;
17681802   }
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   
17701809   // other add-on writes matches the hi handler
17711810   snes20_hi_w(space, offset, data, 0xff);
17721811}
r21818r21819
22802319   SLOT_INTERFACE_INTERNAL("bsxrom",        SNS_ROM_BSX)   // BS-X base cart - partial support only
22812320   // pirate carts
22822321   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
22832329SLOT_INTERFACE_END
22842330
22852331
r21818r21819
22942340   // in progress...
22952341   switch (state->m_type)
22962342   {
2343      // LoROM & LoROM + addons
22972344      case SNES_MODE20:
22982345      case SNES_BSXLO:
22992346      case SNES_SUFAMITURBO:
2300      case SNES_BANANA:
23012347      case SNES_CX4:      // this still uses the old simulation instead of emulating the CPU
23022348      case SNES_ST010:    // this requires two diff kinds of chip access, so we handle it in snes20_lo/hi_r/w
23032349      case SNES_ST011:    // this requires two diff kinds of chip access, so we handle it in snes20_lo/hi_r/w
23042350         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;
23102351      case SNES_DSP:
23112352         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));
23122353         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));
r21818r21819
23232364         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));
23242365         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));
23252366         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
23262383      case SNES_MODE21:
23272384      case SNES_BSXHI:
23282385         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));
r21818r21819
23432400         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));
23442401         set_5a22_map(*state->m_maincpu);
23452402         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;
23512403      case SNES_SPC7110:
23522404      case SNES_SPC7110_RTC:
23532405         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));
23542406         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));
23552407         set_5a22_map(*state->m_maincpu);
23562408         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));
23612413         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));
23662417         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;
23672437   }
23682438}
23692439
trunk/src/mess/machine/sns_slot.c
r21818r21819
259259   { SNES_STROM,       "strom"},
260260   // pirate carts
261261   { SNES_POKEMON,     "lorom_poke"},
262   { SNES_BANANA,      "lorom_paja"},  // wip
263   { SNES_SOULBLAD,    "lorom_sbld"}   // wip
262   { SNES_TEKKEN2,     "lorom_tekken2"},
263   { SNES_SOULBLAD,    "lorom_sbld"},
264   { SNES_MCPIR1,      "lorom_mcpir1"},
265   { SNES_MCPIR2,      "lorom_mcpir2"},
266   { SNES_20COL,       "lorom_20col"},
267   { SNES_BANANA,      "lorom_pija"},  // wip
268   { SNES_BUGS,        "lorom_bugs"}  // wip
264269};
265270
266271static int sns_get_pcb_id(const char *slot)
r21818r21819
695700      if (sram_size)
696701      {
697702         UINT32 max = (hilo_mode == 0x007fc0) ? 0x80000 : 0x20000;   // MODE20 vs MODE21
698         size = 1024 << (ROM[0x00ffbd] & 0x07);
703         size = 1024 << sram_size;
699704         if (size > max)
700705            size = max;
701706      }
trunk/src/mess/machine/sns_slot.h
r21818r21819
3737   SNES_STROM,
3838   // pirate carts
3939   SNES_POKEMON,
40   SNES_TEKKEN2,
41   SNES_SOULBLAD,
42   SNES_MCPIR1,
43   SNES_MCPIR2,
44   SNES_20COL,
4045   SNES_BANANA,    // wip
41   SNES_SOULBLAD   // wip
46   SNES_BUGS   // wip
4247};
4348
4449
trunk/src/mess/machine/sns_rom.c
r21818r21819
2020const device_type SNS_LOROM_OBC1 = &device_creator<sns_rom_obc1_device>;
2121// LoROM pirate carts with protection
2222const device_type SNS_LOROM_POKEMON = &device_creator<sns_rom_pokemon_device>;
23const device_type SNS_LOROM_TEKKEN2 = &device_creator<sns_rom_tekken2_device>;
24const device_type SNS_LOROM_SOULBLAD = &device_creator<sns_rom_soulblad_device>;
25const device_type SNS_LOROM_BANANA = &device_creator<sns_rom_banana_device>;
26const device_type SNS_LOROM_BUGSLIFE = &device_creator<sns_rom_bugs_device>;
27// LoROM pirate multicarts
28const device_type SNS_LOROM_MCPIR1 = &device_creator<sns_rom_mcpirate1_device>;
29const device_type SNS_LOROM_MCPIR2 = &device_creator<sns_rom_mcpirate2_device>;
30const device_type SNS_LOROM_20COL = &device_creator<sns_rom_20col_device>;
2331
2432
2533sns_rom_device::sns_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock)
r21818r21819
3442{
3543}
3644
45sns_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'
3753sns_rom_pokemon_device::sns_rom_pokemon_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
3854               : sns_rom_device(mconfig, SNS_LOROM_POKEMON, "SNES Pirate Carts with Protection", tag, owner, clock)
3955{
4056}
4157
42sns_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)
58sns_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)
4460{
4561}
4662
63sns_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}
4767
48void sns_rom_device::device_start()
68sns_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)
4970{
5071}
5172
52void sns_rom_pokemon_device::device_start()
73sns_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)
5375{
54   save_item(NAME(m_latch));
5576}
5677
57void sns_rom_pokemon_device::device_reset()
78// Multigame LoROM 'mappers'
79sns_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)
5881{
59   m_latch = 0;
6082}
6183
84sns_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
89sns_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
95void sns_rom_device::device_start()
96{
97}
98
6299void sns_rom_obc1_device::device_start()
63100{
64101   save_item(NAME(m_ram));
r21818r21819
77114}
78115
79116
117void sns_rom_pokemon_device::device_start()
118{
119   save_item(NAME(m_latch));
120}
121
122void sns_rom_pokemon_device::device_reset()
123{
124   m_latch = 0;
125}
126
127void sns_rom_tekken2_device::device_start()
128{
129   save_item(NAME(m_prot));
130}
131
132void sns_rom_tekken2_device::device_reset()
133{
134   m_prot = 0;
135}
136
137void sns_rom_bugs_device::device_start()
138{
139   save_item(NAME(m_latch));
140}
141
142void sns_rom_bugs_device::device_reset()
143{
144   memset(m_latch, 0, sizeof(m_latch));
145}
146
147
148
149void sns_rom_mcpirate1_device::device_start()
150{
151   save_item(NAME(m_base_bank));
152}
153
154void sns_rom_mcpirate1_device::device_reset()
155{
156   m_base_bank = 0;
157}
158
159void sns_rom_mcpirate2_device::device_start()
160{
161   save_item(NAME(m_base_bank));
162}
163
164void sns_rom_mcpirate2_device::device_reset()
165{
166   m_base_bank = 0;
167}
168
169void sns_rom_20col_device::device_start()
170{
171   m_base_bank = 4;
172   save_item(NAME(m_base_bank));
173}
174
175
80176/*-------------------------------------------------
81177 mapper specific handlers
82178 -------------------------------------------------*/
r21818r21819
94190
95191
96192
97// Lo-ROM + Protection device
98
99READ8_MEMBER( sns_rom_pokemon_device::chip_read )
100{
101   return BITSWAP8(m_latch,0,6,7,1,2,3,4,5);
102}
103
104WRITE8_MEMBER( sns_rom_pokemon_device::chip_write )
105{
106   m_latch = data;
107}
108
109
110193// Lo-ROM + OBC-1 (used by Metal Combat - Falcon's Revenge)
111194// same as above but additional read/write handling for the add-on chip
112195
r21818r21819
207290         break;
208291   }
209292}
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)
301READ8_MEMBER( sns_rom_pokemon_device::chip_read )
302{
303   return BITSWAP8(m_latch,0,6,7,1,2,3,4,5);
304}
305
306WRITE8_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!
318void 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
352READ8_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
377WRITE8_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.
385READ8_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)
413READ8_MEMBER(sns_rom_mcpirate1_device::read_l)
414{
415   return read_h(space, offset);
416}
417
418READ8_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
424WRITE8_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)
431READ8_MEMBER(sns_rom_mcpirate2_device::read_l)
432{
433   return read_h(space, offset);
434}
435
436READ8_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
442WRITE8_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
450READ8_MEMBER(sns_rom_20col_device::read_l)
451{
452   return read_h(space, offset);
453}
454
455READ8_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
461WRITE8_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
492READ8_MEMBER( sns_rom_banana_device::chip_read )
493{
494   return BITSWAP8(m_latch[0xf],0,6,7,1,2,3,4,5);
495}
496
497WRITE8_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
503READ8_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
508WRITE8_MEMBER( sns_rom_bugs_device::chip_write )
509{
510   m_latch[offset & 0xff] = data;
511}
512
513
trunk/src/mess/machine/sns_rom.h
r21818r21819
2323   virtual DECLARE_READ8_MEMBER(read_h);
2424};
2525
26// ======================> sns_rom_obc1_device
27
28class sns_rom_obc1_device : public sns_rom_device
29{
30public:
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
2651// ======================> sns_rom_pokemon_device
2752
2853class sns_rom_pokemon_device : public sns_rom_device
r21818r21819
4267   UINT8 m_latch;
4368};
4469
45// ======================> sns_rom_obc1_device
70// ======================> sns_rom_tekken2_device
4671
47class sns_rom_obc1_device : public sns_rom_device
72class sns_rom_tekken2_device : public sns_rom_device
4873{
4974public:
5075   // 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
5286
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
96class sns_rom_soulblad_device : public sns_rom_device
97{
98public:
99   // construction/destruction
100   sns_rom_soulblad_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
101   
53102   // 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
111class sns_rom_mcpirate1_device : public sns_rom_device
112{
113public:
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
54118   virtual void device_start();
55119   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};
57128
58   // additional reading and writing
59   virtual DECLARE_READ8_MEMBER(chip_read);
60   virtual DECLARE_WRITE8_MEMBER(chip_write);
129// ======================> sns_rom_mcpirate2_device
61130
62   int m_address;
63   int m_offset;
64   int m_shift;
65   UINT8 m_ram[0x2000];
131class sns_rom_mcpirate2_device : public sns_rom_device
132{
133public:
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;
66147};
67148
149// ======================> sns_rom_20col_device
68150
151class sns_rom_20col_device : public sns_rom_device
152{
153public:
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
170class sns_rom_banana_device : public sns_rom_device
171{
172public:
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
189class sns_rom_bugs_device : public sns_rom_device
190{
191public:
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
69207// device type definition
70208extern const device_type SNS_LOROM;
71209extern const device_type SNS_LOROM_OBC1;
72210extern const device_type SNS_LOROM_POKEMON;
211extern const device_type SNS_LOROM_TEKKEN2;
212extern const device_type SNS_LOROM_SOULBLAD;
213extern const device_type SNS_LOROM_MCPIR1;
214extern const device_type SNS_LOROM_MCPIR2;
215extern const device_type SNS_LOROM_20COL;
216extern const device_type SNS_LOROM_BANANA;
217extern const device_type SNS_LOROM_BUGSLIFE;
73218
74219#endif
trunk/hash/snes.xml
r21818r21819
39183918      </part>
39193919   </software>
39203920
3921<!--
3922protection actually seems more similar to tekken 2 than to pokemon
3923the game writes (low) a lot of time to [ff00-ffff] range and reads (high) to ffcc/ffcd/ffce
3924more investigation needed...
3925-->
39213926   <software name="banpija" cloneof="chester" supported="no">
39223927      <!-- single cartridge source: d4s -->
39233928      <description>Bananas de Pijamas (Asia)</description>
r21818r21819
39253930      <publisher>&lt;unlicensed&gt;</publisher>
39263931      <part name="cart" interface="snes_cart">
39273932
3928         <feature name="slot" value="lorom" />
3933         <feature name="slot" value="lorom_pija" />
39293934         <dataarea name="rom" size="1048576">
39303935            <rom name="bananas de pijamas (unl) [!].sfc" size="1048576" crc="52b0d84b" sha1="149e916dfd4058f8de97d7bc8f74d5e630853ffb" offset="0x000000" />
39313936         </dataarea>
r21818r21819
39463951      </part>
39473952   </software>
39483953
3949   <software name="abugslif" supported="no">
3954<!--
3955protection actually seems more similar to tekken 2 than to pokemon
3956the 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...)
3957more investigation needed...
3958-->
3959   <software name="bugslife" supported="no">
39503960      <!-- single cartridge source: d4s -->
39513961      <!-- Notes: highly similar to the game boy color version, this could be based on a prototype -->
39523962      <description>A Bug's Life (Bra)</description>
r21818r21819
39563966         <feature name="pcb" value="890409C" /> <!-- epoxy board -->
39573967         <feature name="cart_model" value="SNS-006" />
39583968
3959         <feature name="slot" value="lorom" />
3969         <feature name="slot" value="lorom_bugs" />
39603970         <dataarea name="rom" size="2097152">
39613971            <rom name="u2" size="2097152" crc="014f0fcf" sha1="930ab53fded53a65824690b394d6e8c6565c083b" offset="0x000000" />
39623972         </dataarea>
r21818r21819
39643974   </software>
39653975
39663976   <!--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">
39683978      <description>A Bug's Life (Bra, Cracked)</description>
39693979      <year>199?</year>
39703980      <publisher>&lt;unlicensed&gt;</publisher>
r21818r21819
41994209      </part>
42004210   </software>
42014211
4202   <software name="soulblad" supported="no">
4212   <software name="soulblad" supported="partial">
42034213      <!-- single cartridge source: d4s -->
42044214      <description>Soul Blade (Asia)</description>
42054215      <year>199?</year>
r21818r21819
42104220         <feature name="cart_model" value="SNS-006" />
42114221         <feature name="cart_back_label" value="n/a" />
42124222
4213         <feature name="slot" value="lorom" />
4223         <feature name="slot" value="lorom_sbld" />
42144224         <dataarea name="rom" size="3145728">
42154225            <rom name="soul blade (world) (unl).sfc" size="3145728" crc="c97d1d7b" sha1="f7501045b5326255f3bde0543eb0a541b62588a9" offset="0x000000" />
42164226         </dataarea>
r21818r21819
42594269      </part>
42604270   </software>
42614271
4262   <software name="sfex" supported="no">
4272   <software name="sfex">
42634273      <!-- single cartridge source: d4s -->
42644274      <description>Street Fighter EX Plus α (Asia)</description>
42654275      <year>199?</year>
42664276      <publisher>&lt;unlicensed&gt;</publisher>
42674277      <part name="cart" interface="snes_cart">
42684278
4269         <feature name="slot" value="lorom_poke" />
4279         <feature name="slot" value="lorom_tekken2" />
42704280         <dataarea name="rom" size="2097152">
42714281            <rom name="street fighter ex plus alpha (world) (unl).sfc" size="2097152" crc="dad59b9f" sha1="22f864b4a8728f08513b979d2a960eb3083b2c83" offset="0x000000" />
42724282         </dataarea>
r21818r21819
43224332      </part>
43234333   </software>
43244334
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>&lt;unlicensed&gt;</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>&lt;unlicensed&gt;</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>&lt;unlicensed&gt;</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>&lt;unlicensed&gt;</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>&lt;unlicensed&gt;</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>&lt;unlicensed&gt;</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">
43264425      <!-- single cartridge source: d4s -->
43274426      <description>Super 20 Collection (Kor)</description>
43284427      <year>199?</year>
r21818r21819
43304429      <info name="alt_title" value="슈퍼20합" />
43314430      <part name="cart" interface="snes_cart">
43324431
4333         <feature name="slot" value="lorom" />
4432         <feature name="slot" value="lorom_20col" />
43344433         <dataarea name="rom" size="1048576">
43354434            <rom name="c20h.u1" size="1048576" crc="ac19b8f4" sha1="3a64c817ff3fc3819f2fd726868b6f27eb4523df" offset="0x000000" />
43364435         </dataarea>
43374436      </part>
43384437   </software>
43394438
4340   <software name="tekken2" supported="no">
4439   <software name="tekken2">
43414440      <!-- single cartridge source: d4s -->
43424441      <description>Tekken 2 (Asia)</description>
43434442      <year>199?</year>
43444443      <publisher>&lt;unlicensed&gt;</publisher>
43454444      <part name="cart" interface="snes_cart">
43464445
4347         <feature name="slot" value="lorom" />
4446         <feature name="slot" value="lorom_tekken2" />
43484447         <dataarea name="rom" size="2097152">
43494448            <rom name="tekken 2 (world) (unl).sfc" size="2097152" crc="066687ca" sha1="8aa2ee03fe40f289e30723a1c8cd4564481bdfdf" offset="0x000000" />
43504449         </dataarea>

Previous 199869 Revisions Next


© 1997-2024 The MAME Team