diff options
author | 2020-03-05 20:55:34 +0100 | |
---|---|---|
committer | 2020-03-05 20:55:34 +0100 | |
commit | 1f7f099376b44836abfd420e4098fd727350b7cc (patch) | |
tree | 58f79d6b2550613c8734cb956f74ab6c6c7bb67e | |
parent | 1955f0b999762b2f6dec0372f6df1de9008d4fc9 (diff) |
New working clones
------------------
Dribbling (set 2) [f205v]
-rw-r--r-- | src/mame/drivers/dribling.cpp | 165 | ||||
-rw-r--r-- | src/mame/includes/dribling.h | 46 | ||||
-rw-r--r-- | src/mame/mame.lst | 1 | ||||
-rw-r--r-- | src/mame/video/dribling.cpp | 26 |
4 files changed, 135 insertions, 103 deletions
diff --git a/src/mame/drivers/dribling.cpp b/src/mame/drivers/dribling.cpp index 107dedfec10..4a6aa01201e 100644 --- a/src/mame/drivers/dribling.cpp +++ b/src/mame/drivers/dribling.cpp @@ -3,12 +3,18 @@ /*************************************************************************** Model Racing Dribbling hardware + MEF00284 main board + MEF00277 'counter drive' board + CS283 player control driver by Aaron Giles Games supported: * Dribbling + TODO: + * Audio (discrete components, schematics available) + * Implement the 2 banks of 8 dips which determine coinage for the 2 players + * Actual game duration doesn't match the time reported in the manual + **************************************************************************** Memory map @@ -42,7 +48,7 @@ * *************************************/ -INTERRUPT_GEN_MEMBER(dribling_state::dribling_irq_gen) +INTERRUPT_GEN_MEMBER(dribling_state::irq_gen) { if (m_di) device.execute().set_input_line(0, ASSERT_LINE); @@ -56,22 +62,22 @@ INTERRUPT_GEN_MEMBER(dribling_state::dribling_irq_gen) * *************************************/ -READ8_MEMBER(dribling_state::dsr_r) +uint8_t dribling_state::dsr_r() { - /* return DSR0-7 */ + // return DSR0-7 return (m_ds << m_sh) | (m_dr >> (8 - m_sh)); } -READ8_MEMBER(dribling_state::input_mux0_r) +uint8_t dribling_state::input_mux0_r() { - /* low value in the given bit selects */ + // low value in the given bit selects if (!(m_input_mux & 0x01)) - return ioport("MUX0")->read(); + return m_mux[0]->read(); else if (!(m_input_mux & 0x02)) - return ioport("MUX1")->read(); + return m_mux[1]->read(); else if (!(m_input_mux & 0x04)) - return ioport("MUX2")->read(); + return m_mux[2]->read(); return 0xff; } @@ -83,57 +89,57 @@ READ8_MEMBER(dribling_state::input_mux0_r) * *************************************/ -WRITE8_MEMBER(dribling_state::misc_w) +void dribling_state::misc_w(uint8_t data) { - /* bit 7 = di */ + // bit 7 = di m_di = (data >> 7) & 1; if (!m_di) m_maincpu->set_input_line(0, CLEAR_LINE); - /* bit 6 = parata */ + // bit 6 = parata (save by goalkeeper) - /* bit 5 = ab. campo */ + // bit 5 = ab. campo (field enable) m_abca = (data >> 5) & 1; - /* bit 4 = ab. a.b.f. */ - /* bit 3 = n/c */ + // bit 4 = ab. a.b.f. + // bit 3 = n/c - /* bit 2 = (9) = PC2 */ - /* bit 1 = (10) = PC1 */ - /* bit 0 = (32) = PC0 */ + // bit 2 = (9) = PC2 + // bit 1 = (10) = PC1 + // bit 0 = (32) = PC0 m_input_mux = data & 7; logerror("%s:misc_w(%02X)\n", machine().describe_context(), data); } -WRITE8_MEMBER(dribling_state::sound_w) +void dribling_state::sound_w(uint8_t data) { - /* bit 7 = stop palla */ - /* bit 6 = contrasto */ - /* bit 5 = calcio a */ - /* bit 4 = fischio */ - /* bit 3 = calcio b */ - /* bit 2 = folla a */ - /* bit 1 = folla m */ - /* bit 0 = folla b */ + // bit 7 = stop palla (ball stop) + // bit 6 = contrasto (tackle) + // bit 5 = calcio a (kick a) + // bit 4 = fischio (whistle) + // bit 3 = calcio b (kick b) + // bit 2 = folla a (crowd a) + // bit 1 = folla m (crowd m) + // bit 0 = folla b (crowd b) logerror("%s:sound_w(%02X)\n", machine().describe_context(), data); } -WRITE8_MEMBER(dribling_state::pb_w) +void dribling_state::pb_w(uint8_t data) { - /* write PB0-7 */ + // write PB0-7 logerror("%s:pb_w(%02X)\n", machine().describe_context(), data); } -WRITE8_MEMBER(dribling_state::shr_w) +void dribling_state::shr_w(uint8_t data) { - /* bit 3 = watchdog */ + // bit 3 = watchdog if (data & 0x08) m_watchdog->watchdog_reset(); - /* bit 2-0 = SH0-2 */ + // bit 2-0 = SH0-2 m_sh = data & 0x07; } @@ -145,22 +151,22 @@ WRITE8_MEMBER(dribling_state::shr_w) * *************************************/ -READ8_MEMBER(dribling_state::ioread) +uint8_t dribling_state::ioread(offs_t offset) { if (offset & 0x08) - return m_ppi8255_0->read(offset & 3); + return m_ppi8255[0]->read(offset & 3); else if (offset & 0x10) - return m_ppi8255_1->read(offset & 3); + return m_ppi8255[1]->read(offset & 3); return 0xff; } -WRITE8_MEMBER(dribling_state::iowrite) +void dribling_state::iowrite(offs_t offset, uint8_t data) { if (offset & 0x08) - m_ppi8255_0->write(offset & 3, data); + m_ppi8255[0]->write(offset & 3, data); else if (offset & 0x10) - m_ppi8255_1->write(offset & 3, data); + m_ppi8255[1]->write(offset & 3, data); else if (offset & 0x40) { m_dr = m_ds; @@ -175,12 +181,12 @@ WRITE8_MEMBER(dribling_state::iowrite) * *************************************/ -void dribling_state::dribling_map(address_map &map) +void dribling_state::prg_map(address_map &map) { map(0x0000, 0x1fff).rom(); - map(0x2000, 0x3fff).ram().share("videoram"); + map(0x2000, 0x3fff).ram().share(m_videoram); map(0x4000, 0x7fff).rom(); - map(0xc000, 0xdfff).ram().w(FUNC(dribling_state::dribling_colorram_w)).share("colorram"); + map(0xc000, 0xdfff).ram().w(FUNC(dribling_state::colorram_w)).share(m_colorram); } @@ -231,12 +237,12 @@ static INPUT_PORTS_START( dribling ) PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "Game Duration" ) PORT_DIPLOCATION( "SW:2" ) // timer always starts at 90, but decrements quicker / slower depending on dip setting + PORT_DIPSETTING( 0x00, "1:50" ) // actually circa 1:25 emulated. Bug? + PORT_DIPSETTING( 0x40, "2:30" ) // actually circa 1:40 emulated. Bug? + PORT_DIPNAME( 0x80, 0x80, "New game with one coin" ) PORT_DIPLOCATION( "SW:1" ) // according to the manual, for this to work both (unimplemented) coinage dip banks must be set to 1 coin 1 play + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) INPUT_PORTS_END @@ -270,38 +276,38 @@ void dribling_state::machine_reset() void dribling_state::dribling(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware Z80(config, m_maincpu, 20_MHz_XTAL / 4); // XTAL verified, divider not - m_maincpu->set_addrmap(AS_PROGRAM, &dribling_state::dribling_map); + m_maincpu->set_addrmap(AS_PROGRAM, &dribling_state::prg_map); m_maincpu->set_addrmap(AS_IO, &dribling_state::io_map); - m_maincpu->set_vblank_int("screen", FUNC(dribling_state::dribling_irq_gen)); + m_maincpu->set_vblank_int("screen", FUNC(dribling_state::irq_gen)); - I8255A(config, m_ppi8255_0); - m_ppi8255_0->in_pa_callback().set(FUNC(dribling_state::dsr_r)); - m_ppi8255_0->in_pb_callback().set(FUNC(dribling_state::input_mux0_r)); - m_ppi8255_0->out_pc_callback().set(FUNC(dribling_state::misc_w)); + I8255A(config, m_ppi8255[0]); + m_ppi8255[0]->in_pa_callback().set(FUNC(dribling_state::dsr_r)); + m_ppi8255[0]->in_pb_callback().set(FUNC(dribling_state::input_mux0_r)); + m_ppi8255[0]->out_pc_callback().set(FUNC(dribling_state::misc_w)); - I8255A(config, m_ppi8255_1); - m_ppi8255_1->out_pa_callback().set(FUNC(dribling_state::sound_w)); - m_ppi8255_1->out_pb_callback().set(FUNC(dribling_state::pb_w)); - m_ppi8255_1->in_pc_callback().set_ioport("IN0"); - m_ppi8255_1->out_pc_callback().set(FUNC(dribling_state::shr_w)); + I8255A(config, m_ppi8255[1]); + m_ppi8255[1]->out_pa_callback().set(FUNC(dribling_state::sound_w)); + m_ppi8255[1]->out_pb_callback().set(FUNC(dribling_state::pb_w)); + m_ppi8255[1]->in_pc_callback().set_ioport("IN0"); + m_ppi8255[1]->out_pc_callback().set(FUNC(dribling_state::shr_w)); WATCHDOG_TIMER(config, m_watchdog); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_size(256, 256); screen.set_visarea(0, 255, 40, 255); - screen.set_screen_update(FUNC(dribling_state::screen_update_dribling)); + screen.set_screen_update(FUNC(dribling_state::screen_update)); screen.set_palette("palette"); - PALETTE(config, "palette", FUNC(dribling_state::dribling_palette), 256); + PALETTE(config, "palette", FUNC(dribling_state::palette), 256); - /* sound hardware */ + // sound hardware } @@ -320,7 +326,7 @@ ROM_START( dribling ) ROM_LOAD( "5k.bin", 0x5000, 0x1000, CRC(737628c4) SHA1(301fda413388c26da5b5150aec2cefc971801749) ) // ROM_LOAD( "5h.bin", 0x6000, 0x1000, CRC(30d0957f) SHA1(52135e12094ee1c8828a48c355bdd565aa5895de) ) // - ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_REGION( 0x2000, "gfx", 0 ) ROM_LOAD( "3p.bin", 0x0000, 0x1000, CRC(208971b8) SHA1(f91f3ea04d75beb58a61c844472b4dba53d84c0f) ) ROM_LOAD( "3n.bin", 0x1000, 0x1000, CRC(356c9803) SHA1(8e2ce52f32b33886f4747dadf3aeb78148538173) ) @@ -330,6 +336,30 @@ ROM_START( dribling ) ROM_LOAD( "tbp24s10.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) ROM_END +// the only difference from the parent is the following routine has been removed: +// 1FCF: 3A 0A 23 ld a,($230A) +// 1FD2: A7 and a +// 1FD3: C2 68 1F jp nz,$1F68 +// 1FD6: C3 6E 1F jp $1F6E +// the code directly jumps to $1F6E instead +ROM_START( driblinga ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "dribling-type01-mem.n.1.5p", 0x0000, 0x1000, CRC(0e791947) SHA1(57bc4f4e9e1fe3fbac1017601c9c75029b2601a4) ) + ROM_LOAD( "dribling-type01-mem.n.2.5n", 0x1000, 0x1000, CRC(2ad86cca) SHA1(e71bf46b8d7f1a93f8288a5c81493de9413f3d5d) ) // only different ROM + ROM_LOAD( "dribling-type01-mem.n.3.5l", 0x4000, 0x1000, CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) + ROM_LOAD( "dribling-type01-mem.n.4.5k", 0x5000, 0x1000, CRC(737628c4) SHA1(301fda413388c26da5b5150aec2cefc971801749) ) + ROM_LOAD( "dribling-type01-mem.n.5.5h", 0x6000, 0x1000, CRC(30d0957f) SHA1(52135e12094ee1c8828a48c355bdd565aa5895de) ) + + ROM_REGION( 0x2000, "gfx", 0 ) + ROM_LOAD( "3p.bin", 0x0000, 0x1000, CRC(208971b8) SHA1(f91f3ea04d75beb58a61c844472b4dba53d84c0f) ) + ROM_LOAD( "3n.bin", 0x1000, 0x1000, CRC(356c9803) SHA1(8e2ce52f32b33886f4747dadf3aeb78148538173) ) + + ROM_REGION( 0x600, "proms", 0 ) + ROM_LOAD( "93453pc-d9.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) + ROM_LOAD( "63s140n-d8.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) + ROM_LOAD( "tbp24s10n.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) +ROM_END + ROM_START( driblingo ) ROM_REGION( 0x10000, "maincpu", 0 ) @@ -339,7 +369,7 @@ ROM_START( driblingo ) ROM_LOAD( "dribblng.5j", 0x5000, 0x1000, CRC(e535ac5b) SHA1(ba13298378f1e5b2b40634874097ad29c402fdea) ) ROM_LOAD( "dribblng.5h", 0x6000, 0x1000, CRC(e6af7264) SHA1(a015120d85461e599c4bb9626ebea296386a31bb) ) - ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_REGION( 0x2000, "gfx", 0 ) ROM_LOAD( "3p.bin", 0x0000, 0x1000, CRC(208971b8) SHA1(f91f3ea04d75beb58a61c844472b4dba53d84c0f) ) ROM_LOAD( "3n.bin", 0x1000, 0x1000, CRC(356c9803) SHA1(8e2ce52f32b33886f4747dadf3aeb78148538173) ) @@ -357,7 +387,7 @@ ROM_START( driblingbr ) ROM_LOAD( "4", 0x5000, 0x1000, CRC(3ed4073a) SHA1(dec36e9dda07ea5f50163b98051955783131773d) ) ROM_LOAD( "5", 0x6000, 0x1000, CRC(c21a1d32) SHA1(6e919f1416e6c4df133d3140f7331f65f65d4942) ) - ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_REGION( 0x2000, "gfx", 0 ) ROM_LOAD( "6", 0x0000, 0x1000, CRC(208971b8) SHA1(f91f3ea04d75beb58a61c844472b4dba53d84c0f) ) ROM_LOAD( "7", 0x1000, 0x1000, CRC(356c9803) SHA1(8e2ce52f32b33886f4747dadf3aeb78148538173) ) @@ -374,6 +404,7 @@ ROM_END * *************************************/ -GAME( 1983, dribling, 0, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1983, dribling, 0, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 1)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1983, driblinga, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 2)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1983, driblingo, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1983, driblingbr, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "bootleg (Videomac)", "Dribbling (bootleg, Brazil)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/dribling.h b/src/mame/includes/dribling.h index 0e0c5b1bfd4..dd91eed7043 100644 --- a/src/mame/includes/dribling.h +++ b/src/mame/includes/dribling.h @@ -21,10 +21,12 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_watchdog(*this, "watchdog"), - m_ppi8255_0(*this, "ppi8255_0"), - m_ppi8255_1(*this, "ppi8255_1"), + m_ppi8255(*this, "ppi8255%d", 0), m_videoram(*this, "videoram"), - m_colorram(*this, "colorram") + m_colorram(*this, "colorram"), + m_mux(*this, "MUX%u", 0), + m_proms(*this, "proms"), + m_gfxroms(*this, "gfx") { } void dribling(machine_config &config); @@ -34,16 +36,18 @@ protected: virtual void machine_reset() override; private: - /* devices */ + // devices required_device<cpu_device> m_maincpu; required_device<watchdog_timer_device> m_watchdog; - optional_device<i8255_device> m_ppi8255_0; - optional_device<i8255_device> m_ppi8255_1; - /* memory pointers */ + required_device_array<i8255_device, 2> m_ppi8255; + // memory pointers required_shared_ptr<uint8_t> m_videoram; required_shared_ptr<uint8_t> m_colorram; + required_ioport_array<3> m_mux; + required_region_ptr<uint8_t> m_proms; + required_region_ptr<uint8_t> m_gfxroms; - /* misc */ + // misc uint8_t m_abca; uint8_t m_dr; uint8_t m_ds; @@ -51,19 +55,19 @@ private: uint8_t m_input_mux; uint8_t m_di; - DECLARE_READ8_MEMBER(ioread); - DECLARE_WRITE8_MEMBER(iowrite); - DECLARE_WRITE8_MEMBER(dribling_colorram_w); - DECLARE_READ8_MEMBER(dsr_r); - DECLARE_READ8_MEMBER(input_mux0_r); - DECLARE_WRITE8_MEMBER(misc_w); - DECLARE_WRITE8_MEMBER(sound_w); - DECLARE_WRITE8_MEMBER(pb_w); - DECLARE_WRITE8_MEMBER(shr_w); - void dribling_palette(palette_device &palette) const; - uint32_t screen_update_dribling(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(dribling_irq_gen); - void dribling_map(address_map &map); + uint8_t ioread(offs_t offset); + void iowrite(offs_t offset, uint8_t data); + void colorram_w(offs_t offset, uint8_t data); + uint8_t dsr_r(); + uint8_t input_mux0_r(); + void misc_w(uint8_t data); + void sound_w(uint8_t data); + void pb_w(uint8_t data); + void shr_w(uint8_t data); + void palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(irq_gen); + void prg_map(address_map &map); void io_map(address_map &map); }; diff --git a/src/mame/mame.lst b/src/mame/mame.lst index f076c49e77e..750fc4ae562 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -12287,6 +12287,7 @@ drgnmst2 // (c) 1994 @source:dribling.cpp dribling // (c) 1983 Model Racing +driblinga // (c) 1983 Model Racing driblingbr // bootleg driblingo // (c) 1983 Olympia diff --git a/src/mame/video/dribling.cpp b/src/mame/video/dribling.cpp index 80305f182ac..a8e40930674 100644 --- a/src/mame/video/dribling.cpp +++ b/src/mame/video/dribling.cpp @@ -17,7 +17,7 @@ * *************************************/ -void dribling_state::dribling_palette(palette_device &palette) const +void dribling_state::palette(palette_device &palette) const { uint8_t const *const prom = memregion("proms")->base() + 0x400; @@ -43,9 +43,9 @@ void dribling_state::dribling_palette(palette_device &palette) const * *************************************/ -WRITE8_MEMBER(dribling_state::dribling_colorram_w) +void dribling_state::colorram_w(offs_t offset, uint8_t data) { - /* it is very important that we mask off the two bits here */ + // it is very important that we mask off the two bits here m_colorram[offset & 0x1f9f] = data; } @@ -57,28 +57,24 @@ WRITE8_MEMBER(dribling_state::dribling_colorram_w) * *************************************/ -uint32_t dribling_state::screen_update_dribling(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t dribling_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - uint8_t *prombase = memregion("proms")->base(); - uint8_t *gfxbase = memregion("gfx1")->base(); - int x, y; - - /* loop over rows */ - for (y = cliprect.min_y; y <= cliprect.max_y; y++) + // loop over rows + for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { uint16_t *dst = &bitmap.pix16(y); - /* loop over columns */ - for (x = cliprect.min_x; x <= cliprect.max_x; x++) + // loop over columns + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { - int b7 = prombase[(x >> 3) | ((y >> 3) << 5)] & 1; + int b7 = m_proms[(x >> 3) | ((y >> 3) << 5)] & 1; int b6 = m_abca; int b5 = (x >> 3) & 1; - int b4 = (gfxbase[(x >> 3) | (y << 5)] >> (x & 7)) & 1; + int b4 = (m_gfxroms[(x >> 3) | (y << 5)] >> (x & 7)) & 1; int b3 = (m_videoram[(x >> 3) | (y << 5)] >> (x & 7)) & 1; int b2_0 = m_colorram[(x >> 3) | ((y >> 2) << 7)] & 7; - /* assemble the various bits into a palette PROM index */ + // assemble the various bits into a palette PROM index dst[x] = (b7 << 7) | (b6 << 6) | (b5 << 5) | (b4 << 4) | (b3 << 3) | b2_0; } } |