What's new

Metro Board Conversion

Mageta the Lion

Professional
Joined
May 26, 2023
Messages
240
Reaction score
212
Location
Germany
Can some provide info regarding doing a conversion for a Metro Board? To be concrete i never done a conversion but would like to try my hand on a "Chatan Yarakuu Shanku – The Karate Tournament".
Is any board a suitable donor? Only the once with the same Video chip, Sub CPU & Sound chip? Or just the once with the same VG460-(A) Pcb? (Also Feel free to offer me a nicely priced suitable donor PCB 😉)
 
I have a detailed "how to convert" guide on how to approach game conversions here: https://www.arcade-projects.com/thr...hien-to-gun-frontier-taito-f2-hardware.12882/

It covers the process I used for a Taito F2 conversion, but it's the approach you can use for any arcade hardware platform.

Just like that guide the first thing you want to do is look at the driver: https://github.com/mamedev/mame/blob/master/src/mame/metro/metro.cpp

There are 3 things you need to compare against your target game with suitable
1. the "Address Map" aka "Memory Map. For Karate Tournament it looks like this:

Code:
void metro_upd7810_state::karatour_map(address_map &map)
{
	map(0x000000, 0x07ffff).rom();                                             // ROM
	map(0x400001, 0x400001).rw(FUNC(metro_upd7810_state::soundstatus_r), FUNC(metro_upd7810_state::soundstatus_w)); // From Sound CPU
	map(0x400002, 0x400003).portr("IN0");                                // Inputs
	map(0x400003, 0x400003).w(FUNC(metro_upd7810_state::coin_lockout_1word_w));               // Coin Lockout
	map(0x400004, 0x400005).portr("IN1");                                //
	map(0x400006, 0x400007).portr("DSW0");                               //
	map(0x40000a, 0x40000b).portr("DSW1");                               //
	map(0x40000c, 0x40000d).portr("IN2");                                //
	map(0x800000, 0x87ffff).m(m_vdp, FUNC(imagetek_i4100_device::map));
	map(0x8788a9, 0x8788a9).w(FUNC(metro_upd7810_state::sound_data_w));                       // To Sound CPU
	map(0xf00000, 0xf0ffff).ram().mirror(0x0f0000);                         // RAM (mirrored)
}

^ Compare that to the address map for your potential donors. This tells you the "where" all of the major components are located virtually on the hardware. so for instance the ROM data is at 0x000000 and the RAM is at 0xF00000 If your donor isn't mapped the same way then the game code will be all messed up trying to access say the sound data and get inputs instead. you want to make sure at least the STARTING addresses (the first number of each "map" line) is the same for each device with your donor

If the address map is different it may be possible to "fix it", often this is done by changing PLDs (PALs and GALs) especially if it's the same exact PCB but with a different address map, chances are the PALs are what is causing it to be mapped differently.

2. The ROM area. If the address map is the same you'll want to make sure the donor actually had enough "space" available to fit the game code. So the donor's sound ROMs need to support the same or more space, the graphics roms need to support the same or more space and the program ROMs need to support the same or more space.

The ROM area for Karate Tournament looks like this:
Code:
ROM_START( karatour )
	ROM_REGION( 0x080000, "maincpu", 0 )        // 68000 Code
	ROM_LOAD16_BYTE( "2.2fab.8g",  0x000000, 0x040000, CRC(199a28d4) SHA1(ae880b5d5a1703c54e0ef27015039c7bb05eb185) )  // Hand-written label "(2) 2FAB"
	ROM_LOAD16_BYTE( "3.0560.10g", 0x000001, 0x040000, CRC(b054e683) SHA1(51e28a99f87684f3e56c7a168523f94717903d79) )  // Hand-written label "(3) 0560"

	ROM_REGION( 0x20000, "audiocpu", 0 )       // NEC78C10 Code
	ROM_LOAD( "kt001.1i", 0x000000, 0x020000, CRC(1dd2008c) SHA1(488b6f5d15bdbc069ee2cd6d7a0980a228d2f790) )    // 11xxxxxxxxxxxxxxx = 0xFF

	ROM_REGION( 0x400000, "vdp", 0 )   // Gfx + Data (Addressable by CPU & Blitter)
	ROM_LOAD64_WORD( "361a04.15f", 0x000000, 0x100000, CRC(f6bf20a5) SHA1(cb4cb249eb1c106fe7ef0ace735c0cc3106f1ab7) )
	ROM_LOAD64_WORD( "361a07.17d", 0x000002, 0x100000, CRC(794cc1c0) SHA1(ecfdec5874a95846c0fb7966fdd1da625d85531f) )
	ROM_LOAD64_WORD( "361a05.17f", 0x000004, 0x100000, CRC(ea9c11fc) SHA1(176c4419cfe13ff019654a93cd7b0befa238bbc3) )
	ROM_LOAD64_WORD( "361a06.15d", 0x000006, 0x100000, CRC(7e15f058) SHA1(267f0a5acb874d4fff3556ffa405e24724174667) )

	ROM_REGION( 0x040000, "oki", 0 )    // Samples
	ROM_LOAD( "8.4a06.1d", 0x000000, 0x040000, CRC(8d208179) SHA1(54a27ef155828435bc5eba60790a8584274c8b4a) )  // Hand-written label "(8) 4A06"
ROM_END
for each "ROM_REGION" you want to make sure your donor game is the same size or larger. Now sometimes the physical PCB can support more than what you see in MAME, but you wont be able to test the conversion in MAME without modifying MAME source if that's the case. If your donor is the same exact PCB then this is usually moot.

3. Finally the "Machine Config" area will tell you how the graphics, sound and other aspects of the PCB are configured for the game. Karate Tournament looks like this:
Code:
void metro_upd7810_state::karatour(machine_config &config)
{
	// basic machine hardware
	M68000(config, m_maincpu, 24_MHz_XTAL/2);
	m_maincpu->set_addrmap(AS_PROGRAM, &metro_upd7810_state::karatour_map);
	m_maincpu->set_periodic_int(FUNC(metro_upd7810_state::periodic_interrupt), attotime::from_hz(8*60)); // ?

	metro_upd7810_sound(config);

	// video hardware
	i4100_config(config);
	m_vdp->irq_cb().set_inputline(m_maincpu, M68K_IRQ_2);
	m_vdp->ext_ctrl_0_cb().set(FUNC(metro_upd7810_state::ext_irq5_enable_w));
	m_screen->screen_vblank().set(FUNC(metro_upd7810_state::karatour_vblank_irq));

	// sound hardware
	SPEAKER(config, "mono").front_center();

	OKIM6295(config, m_oki, 24_MHz_XTAL/20, okim6295_device::PIN7_HIGH); // was /128.. so pin 7 not verified
	m_oki->add_route(ALL_OUTPUTS, "mono", 0.10);

	ym2413_device &ymsnd(YM2413(config, m_ymsnd, 3.579545_MHz_XTAL));
	ymsnd.add_route(ALL_OUTPUTS, "mono", 0.90);
}

Sometimes differences are ok as the configuration may be set by jumpers or simply by the game code itself but you want to make sure that your target game and the donor are at least similar and are using the same devices but maybe configured slightly different. you'll also notice that this is the area where the address map is loaded, you can think of the address map as a sub-set of machine configuration. Again if your using the same exact PCB then the config is probably moot.

if all 3 of those areas match or are compatible, or can be made to match with code or PCB modifications then a conversion is possible.

As for the Metro hardware and Karate Tournament SPECIFICALLY. yes this conversion is possible, I've seen it, however if I recall despite PCBs being identical across a large number of games many of the address maps are different due to PLDs. These PLDs are "Registered" meaning they're difficult to dump or reverse. For this reason there are no dumps available for the Karate Tournament PLDs in the PLD Archive https://wiki.pldarchive.co.uk/index.php?title=Arcade

As such you'll need to find a donor with a completely matching address map, I know there is one (as I said I've seen this conversion), but I don't know which game it is... but I've given you all of the information you need in this post to discover it for yourself.

there is lots of more detailed information about how to do conversions in the first post in this thread.
 
Thanks a lot for the surplus an information.
I checked the metro.cpp file and sadly it seems there is in fact only one matching memory map, "Last Fortress German version", which is also the exact same "Board Version" VG460-(A).
The Rom area matches except for vdp ( Gfx + Data ) which is only half the size on "Last Fortress" but since it's the exact same pcb and there are know conversions i assume it's a non Issue.
The Machine Config matches except for one call to i4100_config_360x224() instead of i4100_config() which defaults to 320x240 on karatour. But again same Board and Conversions exist.

Some more questions:
If the Pal/Gals where dumped other donors would be possible as long as the Roms could fit ("Rom Area") and the Machine config is somewhat similar (trial and error?)?
Stupid Question: Does Mame not use the Pal/Gals since they aren't dumped? (No logic necessary since you can simply map to a Adresse?) [Yes i haven't read the other thread yet 🙃 ]
 
Stupid Question: Does Mame not use the Pal/Gals since they aren't dumped? (No logic necessary since you can simply map to a Adresse?)
Not a stupid question, and you got it exactly right. PALs aren't used by MAME because it's all part of the "glue logic" on the PCB and unnecessary in software emulation; it's essentially what the address map replaces.
 
Back
Top