diff options
author | 2019-03-28 01:13:33 +0100 | |
---|---|---|
committer | 2019-03-28 01:13:33 +0100 | |
commit | 542fb45cfc19df5d4335aa43719a4cdd28dcff78 (patch) | |
tree | a67e0754c856e52d2dced48ce27b368815514f53 | |
parent | 8bebefc645784559aef5f509012b102ff9c6db23 (diff) |
Funworld.cpp improvements: Change game description from Joker Card
(Epoxy brick CPU) to Joker Card / Multi Card (Epoxy brick CPU).
Added documentation and hardware notes about the behaviour and
how the scheme works. Added a default NVRAM. [Roberto Fresca, Grull Osgo]
Added PLDs to pool10e set. [unknown...]
-rw-r--r-- | src/mame/drivers/funworld.cpp | 85 | ||||
-rw-r--r-- | src/mame/includes/funworld.h | 2 |
2 files changed, 68 insertions, 19 deletions
diff --git a/src/mame/drivers/funworld.cpp b/src/mame/drivers/funworld.cpp index 78001b20c88..a93eb91767e 100644 --- a/src/mame/drivers/funworld.cpp +++ b/src/mame/drivers/funworld.cpp @@ -101,7 +101,7 @@ * Unknown Fun World A7-11 game 1, Fun World, 1985. * Unknown Fun World A7-11 game 2, Fun World, 1985. * Unknown Fun World A0-1 game, Fun World, 1991. - * Joker Card (Epoxy brick CPU), Fun World, 1991. + * Joker Card / Multi Card (Epoxy brick CPU), Fun World, 1991. ***************************************************************************************** @@ -472,6 +472,17 @@ The only visible changes are in the NVRAM, where the $0000 offset hasn't the JMP $C210 instruction injected at the start... + + * Joker Card / Multi Card (Epoxy brick CPU) + + These series are running in a derivative hardware with epoxy CPU brick. + CPU is RP65C02A, with 2x Toshiba TC5565APL-10 RAMs. 1x Intel D27128A ROM. + and 1x PAL16L8B. + + The main program is inside the battery backed RAM, and need to be dumped. + See more notes below in the ROM loading. + + ***************************************************************************************** Memory Map (generic) @@ -1259,7 +1270,7 @@ void funworld_state::intergames_map(address_map &map) map(0x8000, 0xffff).rom(); } -void funworld_state::fw_a7_11_map(address_map &map) +void funworld_state::fw_brick_map(address_map &map) { map(0x0000, 0x07ff).ram().share("nvram"); map(0x0800, 0x0803).rw("pia0", FUNC(pia6821_device::read), FUNC(pia6821_device::write)); @@ -1270,12 +1281,11 @@ void funworld_state::fw_a7_11_map(address_map &map) map(0x0e01, 0x0e01).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); map(0x2000, 0x2fff).ram().w(FUNC(funworld_state::funworld_videoram_w)).share("videoram"); map(0x3000, 0x3fff).ram().w(FUNC(funworld_state::funworld_colorram_w)).share("colorram"); - map(0x4000, 0x4000).nopr(); - map(0x8000, 0xbfff).ram(); + map(0x4000, 0x7fff).nopr(); // check for the brick RAM programming ROM. + map(0x8000, 0xbfff).ram().share("nvram1"); map(0xc000, 0xffff).rom(); } - /************************* * Input ports * *************************/ @@ -2936,6 +2946,13 @@ static INPUT_PORTS_START( royal ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END +static INPUT_PORTS_START( fw_brick1 ) + PORT_INCLUDE( novoplay ) + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x20, 0x00, "Game Type" ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x20, "Multi Card (without Jokers)" ) + PORT_DIPSETTING( 0x00, "Joker Card (with Jokers)" ) +INPUT_PORTS_END /************************* * Graphics Layouts * @@ -3228,7 +3245,8 @@ void funworld_state::fw_brick_1(machine_config &config) { fw1stpal(config); R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::fw_a7_11_map); + m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::fw_brick_map); + NVRAM(config, "nvram1", nvram_device::DEFAULT_ALL_0); // m_gfxdecode->set_info(gfx_fw2ndpal); } @@ -3237,7 +3255,8 @@ void funworld_state::fw_brick_2(machine_config &config) { fw2ndpal(config); R65C02(config.replace(), m_maincpu, CPU_CLOCK); /* 2MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::fw_a7_11_map); + m_maincpu->set_addrmap(AS_PROGRAM, &funworld_state::fw_brick_map); + NVRAM(config, "nvram1", nvram_device::DEFAULT_ALL_0); // m_gfxdecode->set_info(gfx_fw2ndpal); } @@ -4973,9 +4992,9 @@ ROM_START( pool10e ) ROM_LOAD( "am27s29.u25", 0x0000, 0x0200, CRC(2c315cbf) SHA1(f3f91329f2b8388decf26a050f8fb7da38694218) ) ROM_REGION( 0x3000, "plds", 0 ) - ROM_LOAD( "palce16v8h.u5", 0x0000, 0x0892, NO_DUMP ) /* read protected */ - ROM_LOAD( "palce20v8h.u22", 0x1000, 0x0a92, NO_DUMP ) /* read protected */ - ROM_LOAD( "palce20v8h.u23", 0x2000, 0x0a92, NO_DUMP ) /* read protected */ + ROM_LOAD( "palce16v8h.u5", 0x0000, 0x0892, BAD_DUMP CRC(123d539a) SHA1(cccf0cbae3175b091a998eedf4aa44a55b679400) ) /* read protected */ + ROM_LOAD( "palce20v8h.u22", 0x1000, 0x0a92, BAD_DUMP CRC(ba2a021f) SHA1(e9c5970f80c7446c91282d53cfe97c92353dce7d) ) /* read protected */ + ROM_LOAD( "palce20v8h.u23", 0x2000, 0x0a92, BAD_DUMP CRC(ba2a021f) SHA1(e9c5970f80c7446c91282d53cfe97c92353dce7d) ) /* read protected */ ROM_END @@ -7024,9 +7043,32 @@ ROM_START( fw_a0_1 ) ROM_END /* - Joker Card + Joker Card / Multi Card Funworld. + This game is running in a derivative hardware with epoxy CPU brick. + CPU is a 65C02, with two 5565 RAMs and one 27128 ROM. + Also there are present some PLD and logic. (see above). + + The main program is inside the battery backed RAM, and need to be dumped. + These RAMs are connected to the mainboard battery, so once the Brick is unplugged, + the battery stops to feed the RAM and the program just vanish. + + From factory, they used the central connector to plug a module with the game program, + and then the code inside the ROM check for offset $4000 onward if the module is + present through some sort of checksum. If the module is present, the code will + copy the range 4000-7fff (the game program inside the external module) to the + 8000-bfff location, where is the battery backed RAM inside the brick. + + We need to find a new working board and reverse the central connector, to construct + some interface that allows us to dump the content of the internal battery backed RAM. + + For debug purposes, we plugged an external game code from another similar game, that + matches all calls from the original ROM code. We suspect is the same code with different + language (English instead German). With this external code the game is completely playable. + + ---- + CPU epoxy brick marked "76AF". Epoxy Brick contents: @@ -7039,6 +7081,7 @@ ROM_END - LOGIC: 1x HD74HC241P. 1x M74LS245P. 1x SN74LS139N. + */ ROM_START( jokcrdep ) ROM_REGION( 0x10000, "maincpu", 0 ) @@ -7048,6 +7091,12 @@ ROM_START( jokcrdep ) ROM_LOAD( "200_zg_2.bin", 0x0000, 0x8000, CRC(ba994fc3) SHA1(95d2a802c38d7249f10eb2bbe46edfb9b14b6faa) ) ROM_LOAD( "200_zg_1.bin", 0x8000, 0x8000, CRC(367db105) SHA1(400b82dc9e0be4c17a02add009aab3c43dd901f8) ) + ROM_REGION( 0x0800, "nvram", 0 ) + ROM_LOAD( "joker_nvram.bin", 0x0000, 0x0800, CRC(92019972) SHA1(E6D1E231CD2CE27E718ED9482DBE9DDC8612EB67) ) // Default NVRAM. + + ROM_REGION( 0x4000, "nvram1", 0 ) + ROM_LOAD( "e-0.bin", 0x0000, 0x4000, BAD_DUMP CRC(8FD42F3B) SHA1(208209761DE046189070B88AD4340C8D7FF55F1F) ) // Internal suicide program. Taken from Novo Play. + ROM_REGION( 0x0200, "proms", 0 ) ROM_LOAD( "sn82s147n.bin", 0x0000, 0x0200, CRC(f990a9ae) SHA1(f7133798b5f20dd5b8dbe5d1a6876341710d93a8) ) ROM_END @@ -7766,13 +7815,13 @@ GAME( 199?, mongolnw, 0, royalcd1, royalcrd, funworld_state, init_mong GAME( 199?, soccernw, 0, royalcd1, royalcrd, funworld_state, init_soccernw, ROT0, "<unknown>", "Soccer New (Italian)", MACHINE_UNEMULATED_PROTECTION ) // Other games... -GAME( 198?, funquiz, 0, funquiz, funquiz, funworld_state, empty_init, ROT0, "Fun World", "Fun World Quiz (Austrian)", 0 ) -GAMEL( 1986, novoplay, 0, fw2ndpal, novoplay, funworld_state, empty_init, ROT0, "Admiral/Novomatic","Novo Play Multi Card / Club Card", 0, layout_novoplay ) -GAME( 1991, intrgmes, 0, intrgmes, funworld, funworld_state, empty_init, ROT0, "Inter Games", "unknown Inter Games poker", MACHINE_NOT_WORKING ) -GAMEL( 1985, fw_a7_11, 0, fw_brick_2, funworld, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A7-11 game 1", MACHINE_NOT_WORKING, layout_jollycrd ) -GAMEL( 1985, fw_a7_11a, fw_a7_11, fw_brick_1, funworld, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A7-11 game 2", MACHINE_NOT_WORKING, layout_jollycrd ) -GAMEL( 1991, fw_a0_1, 0, fw_brick_2, funworld, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A0-1 game", MACHINE_NOT_WORKING, layout_jollycrd ) -GAMEL( 1991, jokcrdep, 0, fw_brick_2, funworld, funworld_state, empty_init, ROT0, "Fun World", "Joker Card (Epoxy brick CPU)" , MACHINE_NOT_WORKING, layout_jollycrd ) +GAME( 198?, funquiz, 0, funquiz, funquiz, funworld_state, empty_init, ROT0, "Fun World", "Fun World Quiz (Austrian)", 0 ) +GAMEL( 1986, novoplay, 0, fw2ndpal, novoplay, funworld_state, empty_init, ROT0, "Admiral/Novomatic","Novo Play Multi Card / Club Card", 0, layout_novoplay ) +GAME( 1991, intrgmes, 0, intrgmes, funworld, funworld_state, empty_init, ROT0, "Inter Games", "unknown Inter Games poker", MACHINE_NOT_WORKING ) +GAMEL( 1985, fw_a7_11, 0, fw_brick_2, fw_brick1, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A7-11 game 1", MACHINE_NOT_WORKING, layout_jollycrd ) +GAMEL( 1985, fw_a7_11a, fw_a7_11, fw_brick_2, fw_brick1, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A7-11 game 2", MACHINE_NOT_WORKING, layout_jollycrd ) +GAMEL( 1991, fw_a0_1, 0, fw_brick_2, fw_brick1, funworld_state, empty_init, ROT0, "Fun World", "unknown Fun World A0-1 game", MACHINE_NOT_WORKING, layout_jollycrd ) +GAMEL( 1991, jokcrdep, 0, fw_brick_2, fw_brick1, funworld_state, empty_init, ROT0, "Fun World", "Joker Card / Multi Card (Epoxy brick CPU)", MACHINE_NOT_WORKING, layout_jollycrd ) // These are 2-in-1 stealth boards, they can run the Poker game, or, using completely separate hardware on the same PCB, a NES / MSX Multigames! GAMEL( 1991, royalcrd_nes, royalcrd, royalcd2, royalcrd, funworld_state, empty_init, ROT0, "bootleg", "Royal Card (stealth with NES multigame)", MACHINE_NOT_WORKING, layout_jollycrd ) diff --git a/src/mame/includes/funworld.h b/src/mame/includes/funworld.h index aef6b4fb31b..08ac00ad0b5 100644 --- a/src/mame/includes/funworld.h +++ b/src/mame/includes/funworld.h @@ -67,7 +67,7 @@ private: void cuoreuno_map(address_map &map); void funquiz_map(address_map &map); void funworld_map(address_map &map); - void fw_a7_11_map(address_map &map); + void fw_brick_map(address_map &map); void intergames_map(address_map &map); void saloon_map(address_map &map); void witchryl_map(address_map &map); |