From 24cb27c366bbeb4cf4f5e84cb0ecea784032c6b9 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 26 Nov 2024 04:07:18 +0100 Subject: source org: rename mr to modelracing --- src/mame/mame.lst | 28 +- src/mame/modelracing/dribling.cpp | 635 +++++++++++++++++++++++++++++++++++ src/mame/modelracing/nl_dribling.cpp | 622 ++++++++++++++++++++++++++++++++++ src/mame/modelracing/nl_dribling.h | 10 + src/mame/modelracing/sshot.cpp | 438 ++++++++++++++++++++++++ src/mame/modelracing/subhuntr.cpp | 388 +++++++++++++++++++++ src/mame/mr/dribling.cpp | 635 ----------------------------------- src/mame/mr/nl_dribling.cpp | 622 ---------------------------------- src/mame/mr/nl_dribling.h | 10 - src/mame/mr/sshot.cpp | 438 ------------------------ src/mame/mr/subhuntr.cpp | 388 --------------------- src/mame/nl.flt | 2 +- 12 files changed, 2108 insertions(+), 2108 deletions(-) create mode 100644 src/mame/modelracing/dribling.cpp create mode 100644 src/mame/modelracing/nl_dribling.cpp create mode 100644 src/mame/modelracing/nl_dribling.h create mode 100644 src/mame/modelracing/sshot.cpp create mode 100644 src/mame/modelracing/subhuntr.cpp delete mode 100644 src/mame/mr/dribling.cpp delete mode 100644 src/mame/mr/nl_dribling.cpp delete mode 100644 src/mame/mr/nl_dribling.h delete mode 100644 src/mame/mr/sshot.cpp delete mode 100644 src/mame/mr/subhuntr.cpp diff --git a/src/mame/mame.lst b/src/mame/mame.lst index d7955d65016..0d54a14296b 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -32599,6 +32599,20 @@ multi16 // @source:mitsubishi/trium.cpp triumec // +@source:modelracing/dribling.cpp +dribling // (c) 1983 Model Racing +driblinga // (c) 1983 Model Racing +driblingam // bootleg (Automave) +driblingo // (c) 1983 Olympia +driblingvm // bootleg (Videomac) + +@source:modelracing/sshot.cpp +gunchamps // (c) 1980 Model Racing (sshot.cpp) +sshot // (c) 1979 Model Racing + +@source:modelracing/subhuntr.cpp +subhuntr // 1979 Model Racing + @source:morrow/microdec.cpp md2 // md3 // @@ -32660,20 +32674,6 @@ sys1121 // (c) 1984 Motorola @source:motorola/uchroma68.cpp uchroma68 // 1980 Motorola evaluation board for the MC6847 -@source:mr/dribling.cpp -dribling // (c) 1983 Model Racing -driblinga // (c) 1983 Model Racing -driblingam // bootleg (Automave) -driblingo // (c) 1983 Olympia -driblingvm // bootleg (Videomac) - -@source:mr/sshot.cpp -gunchamps // (c) 1980 Model Racing (sshot.cpp) -sshot // (c) 1979 Model Racing - -@source:mr/subhuntr.cpp -subhuntr // 1979 Model Racing - @source:msx/big10.cpp big10 // big10a // (c) 1986 System Make diff --git a/src/mame/modelracing/dribling.cpp b/src/mame/modelracing/dribling.cpp new file mode 100644 index 00000000000..bd070476f64 --- /dev/null +++ b/src/mame/modelracing/dribling.cpp @@ -0,0 +1,635 @@ +// license:BSD-3-Clause +// copyright-holders: Aaron Giles, Enzo Lombardi +/*************************************************************************** + + Model Racing Dribbling hardware + MEF00284 main board + MEF00277 'counter drive' board + CS283 player control + + driver by Aaron Giles + + Games supported: + * Dribbling + + TODO: + * Implement the 2 banks of 8 DIP switches which determine coinage for the 2 players + * Actual game duration doesn't match the time reported in the manual + +**************************************************************************** + + Memory map + +**************************************************************************** + + ======================================================================== + CPU #1 + ======================================================================== + tbd + ======================================================================== + Interrupts: + NMI not connected + IRQ generated by VBLANK + ======================================================================== + +***************************************************************************/ + +#include "emu.h" + +#include "nl_dribling.h" + +#include "cpu/z80/z80.h" +#include "machine/i8255.h" +#include "machine/netlist.h" +#include "machine/watchdog.h" + +#include "emupal.h" +#include "screen.h" +#include "speaker.h" + + +// configurable logging +#define LOG_MISC (1U << 1) +#define LOG_SOUND (1U << 2) + +//#define VERBOSE (LOG_GENERAL | LOG_MISC | LOG_SOUND) + +#include "logmacro.h" + +#define LOGMISC(...) LOGMASKED(LOG_MISC, __VA_ARGS__) +#define LOGSOUND(...) LOGMASKED(LOG_SOUND, __VA_ARGS__) + + +namespace { + +class dribling_state : public driver_device +{ +public: + dribling_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_watchdog(*this, "watchdog"), + m_ppi8255(*this, "ppi8255%d", 0), + m_videoram(*this, "videoram"), + m_colorram(*this, "colorram"), + m_matrix(*this, "MUX%u", 0), + m_proms(*this, "proms"), + m_gfxroms(*this, "gfx"), + m_i_pb(*this, "snd_nl:pb%u", 0U), + m_i_folla_b(*this, "snd_nl:folla_b"), + m_i_folla_m(*this, "snd_nl:folla_m"), + m_i_folla_a(*this, "snd_nl:folla_a"), + m_i_calcio_b(*this, "snd_nl:calcio_b"), + m_i_fischio(*this, "snd_nl:fischio"), + m_i_calcio_a(*this, "snd_nl:calcio_a"), + m_i_contrasto(*this, "snd_nl:contrasto"), + m_i_stop_palla(*this, "snd_nl:stop_palla"), + m_i_parata(*this, "snd_nl:parata"), + m_i_enable(*this, "snd_nl:enable") + { } + + void dribling(machine_config &config); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + +private: + // devices + required_device m_maincpu; + required_device m_watchdog; + required_device_array m_ppi8255; + + // memory pointers + required_shared_ptr m_videoram; + required_shared_ptr m_colorram; + required_ioport_array<3> m_matrix; + required_region_ptr m_proms; + required_region_ptr m_gfxroms; + + // sound + required_device_array m_i_pb; + required_device m_i_folla_b; + required_device m_i_folla_m; + required_device m_i_folla_a; + required_device m_i_calcio_b; + required_device m_i_fischio; + required_device m_i_calcio_a; + required_device m_i_contrasto; + required_device m_i_stop_palla; + required_device m_i_parata; + required_device m_i_enable; + + // misc + uint8_t m_abca = 0U; + uint8_t m_dr = 0U; + uint8_t m_ds = 0U; + uint8_t m_sh = 0U; + uint8_t m_input_sel = 0U; + uint8_t m_di = 0U; + + 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_matrix_read(); + 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) ATTR_COLD; + void io_map(address_map &map) ATTR_COLD; +}; + + +/************************************* + * + * Convert the palette PROM into + * a real palette + * + *************************************/ + +void dribling_state::palette(palette_device &palette) const +{ + uint8_t const *const prom = memregion("proms")->base() + 0x400; + + for (int i = 0; i < 256; i++) + { + int r = (~prom[i] >> 0) & 1; // 220 + int g = (~prom[i] >> 1) & 3; // 820 + 560 (332 max) + int b = (~prom[i] >> 3) & 1; // 220 + + r *= 0xff; + g *= 0x55; + b *= 0xff; + + palette.set_pen_color(i, rgb_t(r, g, b)); + } +} + + + +/************************************* + * + * Color control writes + * + *************************************/ + +void dribling_state::colorram_w(offs_t offset, uint8_t data) +{ + // it is very important that we mask off the two bits here + m_colorram[offset & 0x1f9f] = data; +} + + + +/************************************* + * + * Video update routine + * + *************************************/ + +uint32_t dribling_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + // loop over rows + for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + { + uint16_t *const dst = &bitmap.pix(y); + + // loop over columns + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + { + int const b7 = BIT(m_proms[(x >> 3) | ((y >> 3) << 5)], 0); + int const b6 = m_abca; + int const b5 = BIT(x, 3); + int const b4 = BIT(m_gfxroms[(x >> 3) | (y << 5)], x & 7); + int const b3 = BIT(m_videoram[(x >> 3) | (y << 5)], x & 7); + int const b2_0 = m_colorram[(x >> 3) | ((y >> 2) << 7)] & 7; + + // assemble the various bits into a palette PROM index + dst[x] = (b7 << 7) | (b6 << 6) | (b5 << 5) | (b4 << 4) | (b3 << 3) | b2_0; + } + } + return 0; +} + + + +/************************************* + * + * Interrupt generation + * + *************************************/ + +INTERRUPT_GEN_MEMBER(dribling_state::irq_gen) +{ + if (m_di) + device.execute().set_input_line(0, ASSERT_LINE); +} + + + +/************************************* + * + * PPI inputs + * + *************************************/ + +uint8_t dribling_state::dsr_r() +{ + // return DSR0-7 + return (m_ds << m_sh) | (m_dr >> (8 - m_sh)); +} + + +uint8_t dribling_state::input_matrix_read() +{ + // low value in the given bit selects + u8 result = 0xff; + if (!BIT(m_input_sel, 0)) + result &= m_matrix[0]->read(); + if (!BIT(m_input_sel, 1)) + result &= m_matrix[1]->read(); + if (!BIT(m_input_sel, 2)) + result &= m_matrix[2]->read(); + return result; +} + + + +/************************************* + * + * PPI outputs + * + *************************************/ + +void dribling_state::misc_w(uint8_t data) +{ + LOGMISC("%s:misc_w(%02X)\n", machine().describe_context(), data); + + // bit 7 = di + m_di = BIT(data, 7); + if (!m_di) + m_maincpu->set_input_line(0, CLEAR_LINE); + + // bit 6 = parata (save by goalkeeper) + m_i_parata->write_line(BIT(data, 6)); + + // bit 5 = ab. campo (field enable) + m_abca = BIT(data, 5); + + // bit 4 = ab. a.b.f. + m_i_enable->write_line(BIT(data, 4)); + + // bit 3 = n/c + // bit 2 = (9) = PC2 + // bit 1 = (10) = PC1 + // bit 0 = (32) = PC0 + m_input_sel = data & 7; +} + + +void dribling_state::sound_w(uint8_t data) +{ + LOGSOUND("%s:sound_w(%02X)\n", machine().describe_context(), data); + + m_i_stop_palla->write_line(BIT(data, 7)); // stop palla (ball stop) + m_i_contrasto->write_line(BIT(data, 6)); // contrasto (tackle) + m_i_calcio_a->write_line(BIT(data, 5)); // calcio a (kick a) + m_i_fischio->write_line(BIT(data, 4)); // fischio (whistle) + m_i_calcio_b->write_line(BIT(data, 3)); // calcio b (kick b) + m_i_folla_a->write_line(BIT(data, 2)); // folla a (crowd a) + m_i_folla_m->write_line(BIT(data, 1)); // folla m (crowd m) + m_i_folla_b->write_line(BIT(data, 0)); // folla b (crowd b) +} + + +void dribling_state::pb_w(uint8_t data) +{ + LOGSOUND("%s:pb_w(%02X)\n", machine().describe_context(), data); + + for (int i = 0; i < 8; i++) + { + m_i_pb[i]->write_line(BIT(data, i)); + } +} + + +void dribling_state::shr_w(uint8_t data) +{ + // bit 3 = watchdog + m_watchdog->reset_line_w(BIT(~data, 3)); + + // bit 2-0 = SH0-2 + m_sh = data & 0x07; +} + + + +/************************************* + * + * PPI accessors + * + *************************************/ + +uint8_t dribling_state::ioread(offs_t offset) +{ + if (offset & 0x08) + return m_ppi8255[0]->read(offset & 3); + else if (offset & 0x10) + return m_ppi8255[1]->read(offset & 3); + return 0xff; +} + + +void dribling_state::iowrite(offs_t offset, uint8_t data) +{ + if (offset & 0x08) + m_ppi8255[0]->write(offset & 3, data); + else if (offset & 0x10) + m_ppi8255[1]->write(offset & 3, data); + else if (offset & 0x40) + { + m_dr = m_ds; + m_ds = data; + } +} + + +/************************************* + * + * Main CPU memory handlers + * + *************************************/ + +void dribling_state::prg_map(address_map &map) +{ + map(0x0000, 0x1fff).rom(); + map(0x2000, 0x3fff).ram().share(m_videoram); + map(0x4000, 0x7fff).rom(); + map(0xc000, 0xdfff).ram().w(FUNC(dribling_state::colorram_w)).share(m_colorram); +} + + +void dribling_state::io_map(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0xff).rw(FUNC(dribling_state::ioread), FUNC(dribling_state::iowrite)); +} + + + +/************************************* + * + * Port definitions + * + *************************************/ + +static INPUT_PORTS_START( dribling ) + PORT_START("MUX0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(1) + + PORT_START("MUX1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(2) + + PORT_START("MUX2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN0") + 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, "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 + + + +/************************************* + * + * Machine driver + * + *************************************/ + +void dribling_state::machine_start() +{ + save_item(NAME(m_abca)); + save_item(NAME(m_di)); + save_item(NAME(m_dr)); + save_item(NAME(m_ds)); + save_item(NAME(m_sh)); + save_item(NAME(m_input_sel)); +} + +void dribling_state::machine_reset() +{ + m_abca = 0; + m_di = 0; + m_dr = 0; + m_ds = 0; + m_sh = 0; + m_input_sel = 0; +} + + +void dribling_state::dribling(machine_config &config) +{ + // basic machine hardware + Z80(config, m_maincpu, 20_MHz_XTAL / 4); // XTAL and divider verified + 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::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_matrix_read)); + 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)); + + WATCHDOG_TIMER(config, m_watchdog); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + screen.set_raw(20_MHz_XTAL / 4, 320, 0, 256, 262, 40, 256); + screen.set_screen_update(FUNC(dribling_state::screen_update)); + screen.set_palette("palette"); + + PALETTE(config, "palette", FUNC(dribling_state::palette), 256); + + // sound hardware + SPEAKER(config, "mono").front_center(); + + NETLIST_SOUND(config, "snd_nl", 48000) + .set_source(NETLIST_NAME(dribling)) + .add_route(ALL_OUTPUTS, "mono", 1.0); + + NETLIST_LOGIC_INPUT(config, m_i_pb[0], "I_PB0.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[1], "I_PB1.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[2], "I_PB2.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[3], "I_PB3.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[4], "I_PB4.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[5], "I_PB5.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[6], "I_PB6.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_pb[7], "I_PB7.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_folla_b, "I_FOLLA_B.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_folla_m, "I_FOLLA_M.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_folla_a, "I_FOLLA_A.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_calcio_a, "I_CALCIO_A.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_fischio, "I_FISCHIO.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_calcio_b, "I_CALCIO_B.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_contrasto, "I_CONTRASTO.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_stop_palla, "I_STOP_PALLA.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_parata, "I_PARATA.IN", 0); + NETLIST_LOGIC_INPUT(config, m_i_enable, "ENABLE_SOUND.IN", 0); + NETLIST_STREAM_OUTPUT(config, "snd_nl:cout0", 0, "OUTPUT").set_mult_offset(1.0, 0); +} + + +/************************************* + * + * ROM definitions + * + *************************************/ + +ROM_START( dribling ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "5p.bin", 0x0000, 0x1000, CRC(0e791947) SHA1(57bc4f4e9e1fe3fbac1017601c9c75029b2601a4) ) + ROM_LOAD( "5n.bin", 0x1000, 0x1000, CRC(bd0f223a) SHA1(f9fbc5670a8723c091d61012e545774d315eb18f) ) + ROM_LOAD( "5l.bin", 0x4000, 0x1000, CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) + ROM_LOAD( "5k.bin", 0x5000, 0x1000, CRC(737628c4) SHA1(301fda413388c26da5b5150aec2cefc971801749) ) + ROM_LOAD( "5h.bin", 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( "93453-d9.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) + ROM_LOAD( "63s140-d8.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) + 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 ) + ROM_LOAD( "5p.bin", 0x0000, 0x1000, CRC(0e791947) SHA1(57bc4f4e9e1fe3fbac1017601c9c75029b2601a4) ) + ROM_LOAD( "dribblng.5n", 0x1000, 0x1000, CRC(5271e620) SHA1(ebed8e31057bb8492840a6e3b8bc453f7cb67243) ) + ROM_LOAD( "5l.bin", 0x4000, 0x1000, CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) + ROM_LOAD( "dribblng.5j", 0x5000, 0x1000, CRC(e535ac5b) SHA1(ba13298378f1e5b2b40634874097ad29c402fdea) ) + ROM_LOAD( "dribblng.5h", 0x6000, 0x1000, CRC(e6af7264) SHA1(a015120d85461e599c4bb9626ebea296386a31bb) ) + + 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( "93453-d9.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) + ROM_LOAD( "63s140-d8.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) + ROM_LOAD( "tbp24s10.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) +ROM_END + +// Original Model Racing PCB (EF00284) +ROM_START( driblingam ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "2532.5p", 0x0000, 0x1000, CRC(35d97f4f) SHA1(c82b1d2a91e25cf3e3f049e0127d300572f0f54c) ) + ROM_LOAD( "2532.5n", 0x1000, 0x1000, CRC(bd0f223a) SHA1(f9fbc5670a8723c091d61012e545774d315eb18f) ) + ROM_LOAD( "2532.5l", 0x4000, 0x1000, CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) + ROM_LOAD( "2532.5k", 0x5000, 0x1000, CRC(737628c4) SHA1(301fda413388c26da5b5150aec2cefc971801749) ) + ROM_LOAD( "2532.5h", 0x6000, 0x1000, CRC(f1d6925e) SHA1(858fd13aad2c684a73b7458f18a759923b1defae) ) + + ROM_REGION( 0x2000, "gfx", 0 ) + ROM_LOAD( "2532.3p", 0x0000, 0x1000, CRC(208971b8) SHA1(f91f3ea04d75beb58a61c844472b4dba53d84c0f) ) + ROM_LOAD( "2532.3n", 0x1000, 0x1000, CRC(356c9803) SHA1(8e2ce52f32b33886f4747dadf3aeb78148538173) ) + + ROM_REGION( 0x600, "proms", 0 ) + ROM_LOAD( "74s476.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) + ROM_LOAD( "93427.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) + ROM_LOAD( "93427.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) +ROM_END + +ROM_START( driblingvm ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1", 0x0000, 0x1000, CRC(35d97f4f) SHA1(c82b1d2a91e25cf3e3f049e0127d300572f0f54c) ) + ROM_LOAD( "2", 0x1000, 0x1000, CRC(bd0f223a) SHA1(f9fbc5670a8723c091d61012e545774d315eb18f) ) + ROM_LOAD( "3", 0x4000, 0x1000, CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) + ROM_LOAD( "4", 0x5000, 0x1000, CRC(3ed4073a) SHA1(dec36e9dda07ea5f50163b98051955783131773d) ) + ROM_LOAD( "5", 0x6000, 0x1000, CRC(c21a1d32) SHA1(6e919f1416e6c4df133d3140f7331f65f65d4942) ) + + ROM_REGION( 0x2000, "gfx", 0 ) + ROM_LOAD( "6", 0x0000, 0x1000, CRC(208971b8) SHA1(f91f3ea04d75beb58a61c844472b4dba53d84c0f) ) + ROM_LOAD( "7", 0x1000, 0x1000, CRC(356c9803) SHA1(8e2ce52f32b33886f4747dadf3aeb78148538173) ) + + ROM_REGION( 0x600, "proms", 0 ) + ROM_LOAD( "93453-d9.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) + ROM_LOAD( "63s140-d8.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) + ROM_LOAD( "tbp24s10.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) +ROM_END + +} // anonymous namespace + + +/************************************* + * + * Game drivers + * + *************************************/ + +GAME( 1983, dribling, 0, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 1)", MACHINE_SUPPORTS_SAVE) +GAME( 1983, driblinga, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 2)", MACHINE_SUPPORTS_SAVE) +GAME( 1983, driblingo, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", MACHINE_SUPPORTS_SAVE) +GAME( 1983, driblingam, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Automave license)", "Dribbling (Automave)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, driblingvm, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "bootleg (Videomac)", "Dribbling (Videomac bootleg, Brazil)", MACHINE_SUPPORTS_SAVE) diff --git a/src/mame/modelracing/nl_dribling.cpp b/src/mame/modelracing/nl_dribling.cpp new file mode 100644 index 00000000000..563eb3e040c --- /dev/null +++ b/src/mame/modelracing/nl_dribling.cpp @@ -0,0 +1,622 @@ +// license:CC0-1.0 +// copyright-holders: Enzo Lombardi + +// Netlist for Model Racing Dribbling: derived from the schematics in the Dribbling manual, located here: +// https://archive.org/details/ArcadeGameManualDribbling + +#include "netlist/devices/net_lib.h" + +#define TTL_74LS86_DIP TTL_7486_DIP +#define TTL_74LS107_DIP TTL_74107_DIP +#define TTL_74LS161_DIP TTL_74161_DIP +#define TTL_74LS164_DIP TTL_74164_DIP +#define ATTENUATE_FOLLA 200 +#define USE_SIMPLIFIED_LM339 +// By using FRONTIER, the second JFET is not necessary, but we need to drop the voltage by ~1.5V +// using two diodes. Performance increase is 60% with an undistinguishable difference in the output. +// Two JFETs is accurate to the hardware, while one JFET plut two diodes still generates correct sound and runs faster. +#define REPLACE_PARATA_JFET_WITH_DIODES + +// The schematic incorrectly labels two JFETS in the PARATA circuit as 2N3812. They're actually 2N3819. +// JFET transistors not supported, but this should do the trick; but not for this game. +#define Q_2N3819(name) MOSFET(name, "NMOS(VTO=-3 KP=0.001 CAPMOD=0)") + +#ifdef USE_SIMPLIFIED_LM339 +// Simplified LM339 model - uses high-level simulation of differential input stage. +static NETLIST_START(LM339) +{ + // * CONNECTIONS: NON-INVERTING INPUT + // * | INVERTING INPUT + // * | | POSITIVE POWER SUPPLY + // * | | | NEGATIVE POWER SUPPLY + // * | | | | OPEN COLLECTOR OUTPUT + // * | | | | | + // * 1 2 3 4 5 + NET_MODEL("LM339_QO NPN(BF=200)") + + AFUNC(CMP, 2, "min(max(A1 - A0, 0), 1e-6)") + VCCS(QB, 80) + QBJT_EB(QO, "LM339_QO") + ANALOG_INPUT(XGND, 0) + RES(RDUMMY, RES_M(1000)) + + NET_C(CMP.Q, QB.IP) + NET_C(QB.OP, QO.B) + NET_C(XGND, QB.IN) + NET_C(QB.ON, QO.E, RDUMMY.2) + + ALIAS(1, CMP.A0) + ALIAS(2, CMP.A1) + ALIAS(3, RDUMMY.1) + ALIAS(4, QO.E) + ALIAS(5, QO.C) +} +#else // USE_SIMPLIFIED_LM339 +// LM339 model adapted from here: https://github.com/evenator/LTSpice-Libraries/blob/master/sub/LM339.sub +// It's too slow for the circuits emulated in this netlist, but might be useful in the future. +static NETLIST_START(LM339) +{ + // * CONNECTIONS: NON-INVERTING INPUT + // * | INVERTING INPUT + // * | | POSITIVE POWER SUPPLY + // * | | | NEGATIVE POWER SUPPLY + // * | | | | OPEN COLLECTOR OUTPUT + // * | | | | | + // * 1 2 3 4 5 + NET_MODEL("LM339A_TI_QIN PNP(IS=800.0E-18 BF=2.000E3)") + NET_MODEL("LM339A_TI_QMI NPN(IS=800.0E-18 BF=1002)") + NET_MODEL("LM339A_TI_QMO NPN(IS=800.0E-18 BF=1000 CJC=1E-15 TR=807.4E-9)") + NET_MODEL("LM339A_TI_QOC NPN(IS=800.0E-18 BF=20.29E3 CJC=1E-15 TF=942.6E-12 TR=543.8E-9)") + NET_MODEL("LM339A_TI_DX D(IS=800.0E-18)") + ALIAS(1, VI1.2) + ALIAS(2, VI2.2) + ALIAS(3, F10.ON) + ALIAS(4, Q3.E) + ALIAS(5, Q5.C) + DIODE(DP, "LM339A_TI_DX") + VCVS(E1, 1) + CCCS(F10, 1) + CS(IEE, 0.0001) + QBJT_EB(Q1, "LM339A_TI_QIN") + QBJT_EB(Q2, "LM339A_TI_QIN") + QBJT_EB(Q3, "LM339A_TI_QMO") + QBJT_EB(Q4, "LM339A_TI_QMI") + QBJT_EB(Q5, "LM339A_TI_QOC") + RES(RP, 46.300000) + VS(V1, 0) + VS(VI1, 0.75) + VS(VI2, 0.75) + NET_C(E1.OP, F10.IP) + NET_C(Q2.C, Q3.B, Q4.C, Q4.B) + NET_C(VI1.1, Q1.B) + NET_C(VI2.1, Q2.B) + NET_C(IEE.2, Q1.E, Q2.E) + NET_C(F10.IN, V1.1) + NET_C(F10.ON, IEE.1, DP.K, RP.1) + NET_C(F10.OP, Q1.C, Q3.C, E1.IP) + NET_C(V1.2, Q5.B) + NET_C(Q3.E, Q4.E, E1.ON, E1.IN, Q5.E, DP.A, RP.2) +} +#endif // USE_SIMPLIFIED_LM339 + +// CALCIO_A and CALCIO_B differ only for the parameters of 3 capacitors. +static NETLIST_START(calcio) +{ + ANALOG_INPUT(I_V5, 5) + ANALOG_INPUT(GND, 0) + DEFPARAM(CAP1, 33) + DEFPARAM(CAP2, 68) + + QBJT_EB(Q8, "BC239C") + QBJT_EB(Q9, "BC239C") + ALIAS(INPUT, R45.2) + RES(R45, 420) + RES(R46, RES_K(8.2)) + RES(R48, RES_K(220)) + RES(R49, RES_K(56)) + RES(R50, RES_K(56)) + RES(R51, RES_M(1)) + RES(R52, RES_K(68)) + RES(R53, RES_K(82)) + RES(R54, RES_K(1.9)) // WAS POT + RES(R55, RES_K(10)) + RES(R56, RES_K(100)) + RES(R57, RES_K(10)) + RES(R58, RES_K(3.9)) + CAP(C29, CAP_U(4.2)) + CAP(C30, CAP_N($(@.CAP2))) + CAP(C31, CAP_N(150)) + CAP(C32, CAP_U(4.7)) + CAP(C33, CAP_N($(@.CAP1))) + CAP(C34, CAP_N($(@.CAP1))) + NET_C(INPUT, R46.1) + NET_C(GND, R45.1) + NET_C(R46.2, C33.2, C34.1) + NET_C(C33.1, R49.1, C29.1) + NET_C(C34.2, R50.2, R51.1, Q8.B) + NET_C(R49.2, C30.2, R50.1) + NET_C(C30.1, GND) + NET_C(C29.2, R52.1, R51.2, R53.1, Q8.C) + NET_C(R52.2, I_V5) + NET_C(Q8.E, R54.2) + NET_C(R54.1, GND) + NET_C(R53.2, C31.1) + NET_C(C31.2, R48.1, R56.2, Q9.B) + NET_C(R48.2, I_V5) + NET_C(R56.1, GND) + NET_C(Q9.C, R55.1) + NET_C(R55.2, I_V5) + NET_C(Q9.E, R57.2, C32.2) + NET_C(R57.1, GND) + NET_C(C32.1, R58.2) + NET_C(R58.1, GND) + RES(R0, 1) + NET_C(R0.1, Q9.C) + ALIAS(OUTPUT, R0.2) + + OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) +} + +static NETLIST_START(stop_palla) +{ + ANALOG_INPUT(I_V5, 5) + ANALOG_INPUT(GND, 0) + + QBJT_EB(Q1, "BC309") + RES(R5, RES_K(1)) + RES(R6, RES_K(160)) + RES(R7, RES_K(150)) + RES(R8, RES_K(10)) + RES(R9, RES_K(2.2)) + CAP(C5, CAP_U(1)) + CAP(C6, CAP_U(1)) + DIODE(D1, "1N914") + SUBMODEL(LM339, IC_B9) + NET_C(GND, IC_B9.4) + ALIAS(INPUT, R5.1) + NET_C(R5.2, Q1.B) + NET_C(Q1.E, I_V5) + NET_C(Q1.C, C5.2, R7.2, R6.1) + NET_C(C5.1, GND) + NET_C(R7.1, GND) + NET_C(R6.2, IC_B9.1, D1.A) + NET_C(D1.K, R9.1, IC_B9.5, R8.2) + NET_C(IC_B9.2, C6.2, R8.1) + NET_C(C6.1, GND) + NET_C(R9.2, I_V5) + NET_C(IC_B9.3, I_V5) + RES(R0, 1) + NET_C(R0.1, IC_B9.5) + ALIAS(OUTPUT, R0.2) + + OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) +} + +static NETLIST_START(parata) +{ + ANALOG_INPUT(I_V5, 5) + ANALOG_INPUT(GND, 0) + + QBJT_EB(Q1, "BC309") + Q_2N3819(Q2) + RES(R5, RES_K(1)) + RES(R6, RES_K(150)) + RES(R7, RES_K(220)) + RES(R9, RES_K(2.2)) + CAP(C5, CAP_U(2.2)) + CAP(C6, CAP_U(1)) + DIODE(D1, "1N914") + DIODE(D2, "1N914") + DIODE(D3, "1N914") + + SUBMODEL(LM339, IC_B9) + NET_C(GND, IC_B9.4) + ALIAS(INPUT, R5.1) + NET_C(R5.2, Q1.B) + NET_C(Q1.E, I_V5) + NET_C(Q1.C, C5.2, R7.2, R6.1) + NET_C(C5.1, GND) + NET_C(R7.1, GND) + NET_C(R6.2, IC_B9.1, D1.A) + NET_C(D1.K, R9.1, IC_B9.5, Q2.G, Q2.S) + NET_C(IC_B9.2, C6.2, Q2.D) + NET_C(C6.1, GND) + NET_C(R9.2, I_V5) + NET_C(IC_B9.3, I_V5) + NET_C(D2.A, Q2.G) + NET_C(D2.K, Q2.S) + +#ifdef REPLACE_PARATA_JFET_WITH_DIODES + DIODE(D4, "1N914") + NET_C(Q2.D, D3.A) + NET_C(D3.K, D4.A) + RES(R0, 1) + NET_C(R0.1, D4.K) + ALIAS(OUTPUT, R0.2) + + OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) +#elif + NET_C(Q2.D, Q3.G) + NET_C(Q3.D, I_V5) + NET_C(D3.A, Q3.G) + NET_C(D3.K, Q3.S) + ALIAS(OUTPUT, Q3.S) + + OPTIMIZE_FRONTIER(Q3.S, RES_K(100), 1) +#endif + +} + +// Sallen-Key approximation of a third-order Butterworth filter with 15KHz cutoff frequency. +// Values computed using http://sim.okawa-denshi.jp/en/Sallen3tool.php . +// This is because the tone generator outputs a 40KHz square wave at idle, and this is to avoid aliasing when outputing at 48KHz. +// Cutoff frequence is set to 12Khz because cleaning the output more by using FRONTIER shows there is a bit of noise left. +static NETLIST_START(output_filter) +{ + ANALOG_INPUT(VPLUS, 12) + ANALOG_INPUT(VMINUS, -12) + ANALOG_INPUT(GND, 0) + + OPAMP(AMP, "OPAMP(TYPE=1 FPF=5 RI=1M RO=50 UGF=1M SLEW=1M VLH=0.5 VLL=0.03 DAB=0.0015)") + RES(R1, RES_K(9.1)) + RES(R2, RES_K(91)) + RES(R3, RES_K(27)) + CAP(C1, CAP_U(0.0015)) + CAP(C2, CAP_P(680)) + CAP(C3, CAP_P(100)) + + NET_C(VPLUS, AMP.VCC) + NET_C(VMINUS, AMP.GND) + ALIAS(INPUT, R1.1) + ALIAS(OUTPUT, AMP.OUT) + NET_C(GND, C1.2) + + NET_C(GND, C3.2) + NET_C(R1.2, R2.1, C1.1) + NET_C(R2.2, R3.1, C2.1) + NET_C(R3.2, C3.1, AMP.PLUS) + NET_C(OUTPUT, C2.2, AMP.MINUS) +} + +static NETLIST_START(inverter) +{ + ANALOG_INPUT(I_V5, 5) + ANALOG_INPUT(GND, 0) + + TTL_7414_DIP(IC_L9) + + NET_C(GND, IC_L9.7) + NET_C(IC_L9.14, I_V5) + ALIAS(INPUT,IC_L9.1) + ALIAS(OUTPUT,IC_L9.2) + NET_C(IC_L9.4, GND) + NET_C(IC_L9.6, GND) + NET_C(IC_L9.8, GND) + NET_C(IC_L9.10, GND) + NET_C(IC_L9.12, GND) +} + +static NETLIST_START(fischio) +{ + ANALOG_INPUT(I_V5, 5) + ANALOG_INPUT(GND, 0) + + LOCAL_SOURCE(inverter) + SUBMODEL(NE556_DIP, IC_N9) + SUBMODEL(inverter, INV) + + TTL_74393_DIP(IC_M9) + + NET_C(IC_M9.7, GND) + NET_C(IC_M9.14, I_V5) + NET_C(IC_N9.7, GND) + NET_C(IC_N9.14, I_V5) + RES(R1, RES_K(6.8)) + RES(R2, RES_K(39)) + RES(R3, RES_K(100)) + RES(R4, RES_K(47)) + CAP(C42, CAP_U(4.2)) + CAP(C2, CAP_N(2.2)) + NET_C(IC_M9.6, INV.INPUT) + NET_C(IC_N9.4, INV.OUTPUT) + NET_C(IC_N9.10, INV.OUTPUT) + NET_C(I_V5, R1.1) + NET_C(I_V5, R2.1) + NET_C(R1.2, IC_N9.1, R3.1, IC_N9.2, IC_N9.6, C42.1) + NET_C(C42.2, GND) + NET_C(R3.2, R4.2, IC_N9.8, IC_N9.12, C2.1) + NET_C(R4.1, R2.2, IC_N9.13) + NET_C(C2.2, GND) + NET_C(IC_N9.5, IC_M9.1) // Counter tick + ALIAS(INPUT, IC_M9.2) // Counter CLEAR + NET_C(INPUT, IC_M9.12) + + NET_C(IC_M9.6, IC_M9.13) + HINT(IC_M9.3, NC) + HINT(IC_M9.4, NC) + HINT(IC_M9.5, NC) + HINT(IC_M9.8, NC) + HINT(IC_M9.9, NC) + HINT(IC_M9.10, NC) + HINT(IC_M9.11, NC) + // ALIAS(OUTPUT, IC_N9.9) + + RES(R0, 1) + NET_C(R0.1, IC_N9.9) + ALIAS(OUTPUT, R0.2) + + OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) +} + +static NETLIST_START(folla) +{ + ANALOG_INPUT(I_V5, 5) + ANALOG_INPUT(I_V12, 12) + ANALOG_INPUT(GND, 0) + + NET_C(GND, IC_E8.5, IC_C8.9, IC_C8.6, IC_C8.2, IC_C8.3, IC_8B.12, IC_8B.5, IC_8B.9, IC_7B.12, IC_7B.10, IC_7B.2, IC_7B.8) + NET_C(GND, IC_8B.4, IC_C8.5, IC_7B.8, IC_8B.10, IC_8B.13, IC_C8.10, IC_E8.4) + TTL_74LS164_DIP(IC_7A) + TTL_7414_DIP(IC_7B) + TTL_74LS164_DIP(IC_8A) + TTL_74LS86_DIP(IC_8B) + LM324_DIP(IC_C8) + TTL_7408_DIP(IC_E8) + NET_C(I_V5, IC_7A.14, IC_7B.14, IC_8A.14, IC_8B.14, IC_E8.14) + NET_C(I_V12, IC_C8.4) + NET_C(GND, IC_7A.7, IC_7B.7, IC_8A.7, IC_8B.7, IC_E8.7, IC_C8.11) + RES(R32, RES_K(1)) + RES(R33, RES_K(220 + ATTENUATE_FOLLA)) + RES(R34, RES_K(100 + ATTENUATE_FOLLA)) + RES(R35, RES_K(1)) + RES(R36, RES_K(56 + ATTENUATE_FOLLA)) + RES(R37, RES_K(10)) + RES(R47, RES_K(330)) + CAP(C20, CAP_N(100)) + CAP(C21, CAP_N(10)) + CAP(C22, CAP_N(22)) + CAP(C24, CAP_U(10)) + NET_C(IC_8B.1, IC_7B.4) + NET_C(IC_8B.2, IC_8A.3) + NET_C(IC_8B.3, IC_8A.1, IC_8A.2) + NET_C(IC_8A.9, IC_7A.9, I_V5) + NET_C(IC_8A.8, IC_7A.8, R32.1, IC_7B.6) + NET_C(IC_8A.13, IC_7A.1, IC_7A.2) + NET_C(IC_7A.12, IC_7B.3) + NET_C(R32.2, IC_7B.5, C20.2) + NET_C(C20.1, GND) + ALIAS(NOISE, IC_7A.13) + ALIAS(C_IN, IC_8A.8) + ALIAS(FOLLA_B, IC_E8.10) + ALIAS(FOLLA_M, IC_E8.12) + ALIAS(FOLLA_A, IC_E8.1) + NET_C(IC_E8.9, IC_E8.13, IC_E8.2, NOISE) + NET_C(IC_E8.8, R33.1) + NET_C(IC_E8.11, R34.1) + NET_C(IC_E8.3, R36.1) + NET_C(R35.1, GND) + NET_C(R33.2, R34.2, R35.2, R36.2, C22.1, C21.1) + NET_C(C21.2, R47.2, IC_C8.14) + + NET_C(R37.2, I_V5) + NET_C(C22.2, R47.1, IC_C8.13) + NET_C(R37.1, C24.2, IC_C8.12) + NET_C(C24.1, GND) + + // CONTRASTO + SUBMODEL(NE556_DIP, IC_Q9) + NET_C(IC_Q9.7, GND) + NET_C(IC_Q9.14, I_V5) + RES(R38, RES_M(1)) + RES(R39, RES_K(100)) + CAP(C23, CAP_U(0.1)) + CAP(C25, CAP_U(0.1)) + CAP(C26, CAP_U(0.47)) + NET_C(R38.1, I_V5) + NET_C(R39.1, I_V5) + NET_C(R38.2, IC_Q9.1, IC_Q9.2, C25.1) + NET_C(C25.2, C26.2, GND) + NET_C(R39.2, IC_Q9.13, IC_Q9.12, IC_Q9.8, C26.1) + NET_C(IC_Q9.5, IC_Q9.10) + NET_C(IC_Q9.9, C23.1) + NET_C(IC_Q9.4, I_V5) + ALIAS(CONTRASTO, IC_Q9.6) + ALIAS(CONT_OUT, C23.2) + NET_C(C23.2, R36.2) + + RES(R0, 1) + NET_C(R0.1, IC_C8.14) + ALIAS(OUTPUT, R0.2) + + OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) +} + +NETLIST_START(dribling) +{ + NET_MODEL("BC239C NPN(IS=1.5813E-15 ISE=4.637E-14 ISC=8.0864E-18 XTI=3 BF=113.32 BR=86.718 IKF=1.4907 IKR=0.03360 XTB=0 VAF=12.331 VAR=31.901 VJE=0.71518 VJC=1.1381 RE=0.22081 RC=0.01636 RB=1.0078 CJE=3.3904E-14 CJC=2.9774E-12 XCJC=0.02899 FC=0.99886 NF=1.0653 NR=1.8047 NE=1.4254 NC=1.8821 MJE=0.36824 MJC=0.31461 TF=2.0691E-11 TR=1.0033E-09 EG=1.11 IRB=0.00083992 RBM=0 XTF=0.31338 VTF=0.10174 ITF=0.0045579 PTF=0 CJS=0 MJS=0 VJS=0.75)") // )") + NET_MODEL("BC309 PNP(IS=1.0366E-15 ISE=1.6295E-14 ISC=9.4971E-17 XTI=3 BF=80 BR=16.116 IKF=0.47497 IKR=0.012081 XTB=0 VAF=8.486 VAR=9.5149 VJE=0.84456 VJC=1.0282 RE=1.9597 RC=1.1393 RB=3.2133 CJE=2.0636E-14 CJC=2.6904E-12 XCJC=0.075977 FC=0.54298 NF=1.03136 NR=1.2907 NE=1.3702 NC=1.038 MJE=0.68352 MJC=0.5401 TF=5.4303E-11 TR=3.4233E-10 EG=1.11 IRB=0.00046855 RBM=2.0822 XTF=0.27447 VTF=0.19311 ITF=0.0030573 PTF=0 CJS=0 VJS=0.75 MJS=0)") + + SOLVER(Solver, 1000) + PARAM(Solver.DYNAMIC_TS, 1) + PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5) + PARAM(Solver.NR_LOOPS, 300) + PARAM(Solver.GS_LOOPS, 10) + PARAM(Solver.PARALLEL, 2) // More does not help + + ANALOG_INPUT(I_V5, 5) + ANALOG_INPUT(I_V6, 6) + ANALOG_INPUT(I_V12, 12) + + + LOCAL_SOURCE(LM339) + LOCAL_SOURCE(calcio) + LOCAL_SOURCE(stop_palla) + LOCAL_SOURCE(parata) + LOCAL_SOURCE(output_filter) + LOCAL_SOURCE(fischio) + LOCAL_SOURCE(folla) + + // TOS Section + TTL_INPUT(I_PB0, 0) + TTL_INPUT(I_PB1, 0) + TTL_INPUT(I_PB2, 0) + TTL_INPUT(I_PB3, 0) + TTL_INPUT(I_PB4, 0) + TTL_INPUT(I_PB5, 0) + TTL_INPUT(I_PB6, 0) + TTL_INPUT(I_PB7, 0) + NET_C(GND, I_PB0.GND, I_PB1.GND, I_PB2.GND, I_PB3.GND, I_PB4.GND, I_PB5.GND, I_PB6.GND, I_PB7.GND) + NET_C(I_V5, I_PB0.VCC, I_PB1.VCC, I_PB2.VCC, I_PB3.VCC, I_PB4.VCC, I_PB5.VCC, I_PB6.VCC, I_PB7.VCC) + + LOCAL_SOURCE(inverter) + CLOCK(clk, 40000) // 40KHz + + NET_C(clk.VCC, I_V5) + NET_C(clk.GND, GND) + + SUBMODEL(inverter, INV1) + SUBMODEL(inverter, INV2) + SUBMODEL(inverter, INV3) + + CAP(C7_1, CAP_P(330)) + CAP(C7_2, CAP_P(330)) + TTL_74161_DIP(IC_D7) // 4 bit counter + TTL_74161_DIP(IC_E7) // same + TTL_74LS107_DIP(IC_C7) // dual JK flip flop + NET_C(GND, IC_C7.7, IC_D7.8, IC_E7.8, C7_1.2) + NET_C(I_V5, IC_C7.14, IC_D7.16, IC_E7.16) + NET_C(I_PB0, IC_D7.3) + NET_C(I_PB1, IC_D7.4) + NET_C(I_PB2, IC_D7.5) + NET_C(I_PB3, IC_D7.6) + NET_C(I_PB4, IC_E7.3) + NET_C(I_PB5, IC_E7.4) + NET_C(I_PB6, IC_E7.5) + NET_C(I_PB7, IC_E7.6) + NET_C(IC_E7.1, IC_D7.1, I_V5) // CLEAR FLAG + NET_C(IC_D7.7, IC_D7.10, I_V5) + NET_C(IC_E7.9, IC_D7.9, C7_1.1, INV1.OUTPUT) + NET_C(IC_D7.15, IC_E7.7, IC_E7.10) + NET_C(IC_E7.15, INV1.INPUT) + NET_C(INV2.OUTPUT, IC_E7.2, IC_D7.2) + NET_C(INV2.INPUT, C7_2.1, IC_C7.9, INV3.OUTPUT) + NET_C(GND, C7_2.2) + NET_C(INV3.INPUT, clk) + NET_C(IC_C7.10, I_V5) + NET_C(IC_C7.1, IC_C7.13, IC_C7.4, IC_C7.12, GND.Q) + NET_C(IC_C7.8, IC_E7.15) // FLIP-FLOP + NET_C(IC_C7.11, IC_E7.15) + ALIAS(TOS_OUTPUT, IC_C7.5) + + // FISCHIO + TTL_INPUT(I_FISCHIO, 0) + NET_C(GND, I_FISCHIO.GND) + NET_C(I_V5, I_FISCHIO.VCC) + SUBMODEL(fischio, FISCHIO) + NET_C(I_FISCHIO, FISCHIO.INPUT) + + // STOP_PALLA + TTL_INPUT(I_STOP_PALLA, 0) + NET_C(GND, I_STOP_PALLA.GND) + NET_C(I_V6, I_STOP_PALLA.VCC) + SUBMODEL(stop_palla, STOP_PALLA) + NET_C(STOP_PALLA.INPUT, I_STOP_PALLA) + + // PARATA + TTL_INPUT(I_PARATA, 0) + NET_C(GND, I_PARATA.GND) + NET_C(I_V6, I_PARATA.VCC) + SUBMODEL(parata, PARATA) + NET_C(PARATA.INPUT, I_PARATA) + + // CALCIO_A and CALCIO_B + TTL_INPUT(I_CALCIO_A, 0) + NET_C(GND, I_CALCIO_A.GND) + NET_C(I_V5, I_CALCIO_A.VCC) + TTL_INPUT(I_CALCIO_B, 0) + NET_C(GND, I_CALCIO_B.GND) + NET_C(I_V5, I_CALCIO_B.VCC) + SUBMODEL(calcio, CALCIO_A) + PARAM(CALCIO_A.CAP1, 22) + PARAM(CALCIO_A.CAP1, 47) + NET_C(I_CALCIO_A, CALCIO_A.INPUT) + SUBMODEL(calcio, CALCIO_B) + PARAM(CALCIO_B.CAP1, 33) + PARAM(CALCIO_B.CAP1, 68) + NET_C(I_CALCIO_B, CALCIO_B.INPUT) + + // FOLLA A, M, B + TTL_INPUT(I_FOLLA_A, 0) + TTL_INPUT(I_FOLLA_M, 0) + TTL_INPUT(I_FOLLA_B, 0) + TTL_INPUT(I_CONTRASTO, 0) + NET_C(GND, I_FOLLA_A.GND, I_FOLLA_M.GND, I_FOLLA_B.GND, I_CONTRASTO.GND) + NET_C(I_V5, I_FOLLA_A.VCC, I_FOLLA_M.VCC, I_FOLLA_B.VCC, I_CONTRASTO.VCC) + SUBMODEL(folla, FOLLA) + NET_C(FOLLA.FOLLA_A, I_FOLLA_A) + NET_C(FOLLA.FOLLA_M, I_FOLLA_M) + NET_C(FOLLA.FOLLA_B, I_FOLLA_B) + NET_C(FOLLA.CONTRASTO, I_CONTRASTO) + + // OUTPUT SECTION ---------------------- + // TOS + CAP(C_TOS, CAP_N(100)) + RES(R_TOS, RES_K(220)) + NET_C(TOS_OUTPUT, C_TOS.1) + NET_C(R_TOS.1, C_TOS.2) + + // FISCHIO + CAP(C_FISCHIO, CAP_N(1000)) + RES(R_FISCHIO, RES_K(220)) + NET_C(FISCHIO.OUTPUT, C_FISCHIO.1) + NET_C(R_FISCHIO.1, C_FISCHIO.2) + + // FOLLA + CAP(C_FOLLA, CAP_N(10)) + RES(R_FOLLA, RES_K(100)) + NET_C(FOLLA.OUTPUT, C_FOLLA.1) + NET_C(C_FOLLA.2, R_FOLLA.1) + + // CALCIO_A + CAP(C_CALCIO_A, CAP_U(1)) + RES(R_CALCIO_A, RES_K(10)) + NET_C(CALCIO_A.OUTPUT, C_CALCIO_A.1) + NET_C(C_CALCIO_A.2, R_CALCIO_A.1) + + // CALCIO_B + CAP(C_CALCIO_B, CAP_U(1)) + RES(R_CALCIO_B, RES_K(10)) + NET_C(CALCIO_B.OUTPUT, C_CALCIO_B.1) + NET_C(C_CALCIO_B.2, R_CALCIO_B.1) + + // STOP_PALLA + CAP(C_STOP_PALLA, CAP_U(1)) + RES(R_STOP_PALLA, RES_K(100)) + NET_C(STOP_PALLA.OUTPUT, C_STOP_PALLA.1) + NET_C(C_STOP_PALLA.2, R_STOP_PALLA.1) + + // PARATA + CAP(C_PARATA, CAP_U(1)) + RES(R_PARATA, RES_K(100)) + NET_C(PARATA.OUTPUT, C_PARATA.1) + NET_C(C_PARATA.2, R_PARATA.1) + + + + // FINAL MIX, DISABLE CIRCUITRY AND OUTPUT FILTER + TTL_INPUT(ENABLE_SOUND, 0) + NET_C(ENABLE_SOUND.VCC, I_V5) + NET_C(ENABLE_SOUND.GND, GND) + QBJT_EB(Q_OUT, "BC239C") + RES(R_OUT, RES_K(2.2)) + RES(R_PU_OUT, RES_K(10)) + NET_C(R_PU_OUT.1, I_V5) + NET_C(ENABLE_SOUND, R_OUT.1, R_PU_OUT.2) + NET_C(Q_OUT.B, R_OUT.2) + NET_C(Q_OUT.C, R_TOS.2, R_FISCHIO.2, R_FOLLA.2, R_CALCIO_A.2, R_CALCIO_B.2, R_STOP_PALLA.2, R_PARATA.2) + NET_C(Q_OUT.E, GND) + SUBMODEL(output_filter, OUTPUT_FILTER) + NET_C(OUTPUT_FILTER.INPUT, Q_OUT.C) + + ALIAS(OUTPUT, OUTPUT_FILTER.OUTPUT) +} diff --git a/src/mame/modelracing/nl_dribling.h b/src/mame/modelracing/nl_dribling.h new file mode 100644 index 00000000000..9799006b0f7 --- /dev/null +++ b/src/mame/modelracing/nl_dribling.h @@ -0,0 +1,10 @@ +// license:BSD-3-Clause +// copyright-holders: Enzo Lombardi +#ifndef MAME_MODELRACING_NL_DRIBLING_H +#define MAME_MODELRACING_NL_DRIBLING_H + +#include "netlist/nl_setup.h" + +NETLIST_EXTERNAL(dribling) + +#endif // MAME_MODELRACING_NL_DRIBLING_H diff --git a/src/mame/modelracing/sshot.cpp b/src/mame/modelracing/sshot.cpp new file mode 100644 index 00000000000..05c4f29a28d --- /dev/null +++ b/src/mame/modelracing/sshot.cpp @@ -0,0 +1,438 @@ +// license:BSD-3-Clause +// copyright-holders:Mariusz Wojcieszek +/* + +* Model Racing's Super Shot +* Model Racing's Gun Champ on Super Shot hardware + +Driver by Mariusz Wojcieszek + +TODO: +- Discrete sound + + +SUPER SHOT +Mainboard: + __________________________________________________________________________________________________________________________ +| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | +| _ _ _ _ _ ____ ____ ____ ____ ____ ____ ____ ____ | +| | | | | | | | | | | | | | | | | | | | | | | | | | | | +|A |R| | | | | |C| |C| | | | | | | | | | | | | | | | | | +| | | |B| |B| | | | | | | | | | | | | | | | | | | | | | +| |_| | | | | |_| |_| |TMS | |TMS | |TMS | |TMS | |TMS | |TMS | |TMS | |TMS | | +| |_| |_| |2708| |2708| |2708| |2708| |2708| |2708| |2708| |2708| | +| |____| |____| |____| |____| |____| |____| |____| |____| | +| | +| | +| _ _____ _| +| | | |/853 | |_ +| |S| | | _ _ _| +| | | |INS80| | | | | _ _ _ ____ ____ _ _ _ _ _ -| +| |_| |60N | | | | | | | | | | | |SS | |SS | | | | | | | | | | | -| +|B | | |B| |B| |D| | | | | | A | | B | |E| | | | | |A| |A| -| +| |ISP-8| | | | | | | |B| |B| | | | | | | |B| |B| | | | | -| +| |A/600| |_| |_| |_| | | | | |TMS | |TMS | |_| | | | | |_| |_| -| +| |N | |_| |_| |2708| |2708| |_| |_| -| +| | | |____| |____| -| +| | | -| +| |_____| -| +| -| +| __________________ -| +| | | _ _ _ _ -| +| | | _ _ _ _ _ _ _ | | | | | | | | -| +| | EPOXY BLOCK | | | | | | | | | | | | | | | | | | | | | | | -| +| | | |Q| |J| |H| |K| |I| |H| |H| |F| |F| |F| |F| -| +|C| | | | | | | | | | | | | | | | | | | | | | | | -| +| |__________________| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ +| | +| | +| | +| _ _ | +| _ _ _ _ _ _ _ __ | | | | _ _ | +| | | | | | | | | | | | | _ _ | | | | | | | | | | | | | +| |M| |H| |N| |O| |P| |G| |L| |L| |D| |SW| |B| |B| |S| |S| | +|D | | | | | | | | | | | | |_| |_| | | | 1| | | | | | | | | | +| |_| |_| |_| |_| |_| |_| |_| |__| |_| |_| |_| |_| | +| | +| | +| | +|E CS 233 | +| | +| | +|__________________________________________________________________________________________________________________________| + + +A = MM2114N-3 L = NE555P +B = DM81LS97N M = DM7404N +C = 7921 2111A-2 N = DM7400N +D = DM74LS138N / NS82LS05N O = DM74LS32N +E = DM74166N P = DM80LS97N / DM74LS367N +F = SN74LS374N Q = DM74LS02N +G = DM74LS20N R = DM74LS175N +H = SN74LS161AN S = DM74LS14N +I = DM74LS04N +J = F7474PC +K = 74LS112PC + + + +EPOXY-BLOCK: +Component-Side: Solder Side: + _____________________ _____________________ +| _ _ _ _ | | D3918 | +| | | | | | | | | | | 5686 | +| | | | | | | | | | | | +| | | | | | | | | | | | +| |_| |_| |_| |_| | | | +|_____________________| |_____________________| + + +SW1: + _________________ +| DST08 ON | +|-----------------| +|| |#|#|#|#|#| | || +|-----------------| +||#| | | | | |#|#|| +|-----------------| +| 1 2 3 4 5 6 7 8 | +|_________________| + + +Soundboard: + ____________________________________________________________ +| | +| 7 6 5 4 3 2 1 | +| _ _ _ _ _ | A = SN7442AN +| | | | | | | | | | | | B = F-7404PC +| |F| |P| |A| |C| |Q| A | C = SN7405N +| | | | | | | | | | | | D = F 74132PC +| |_| |_| |_| |_| |_| | E = SN74393N +| | F = LM3900N +| _ _ _ _ _ | G = LM324N +| | | | | | | | | | | | H = SN7432N +| |G| |E| |B| |D| |O| B | I = NE 556N +| | | | | | | | | | | | J = SN7474N +| |_| |_| |_| |_| |_| | K = SN7400N +| | L = UA339PC +| _ _ _ _ | M = SN7410N +| | | | | | | | | | N = CA810Q +| |J| |I| |H| |E| C | O = 6331 +| | | | | | | | | | P = 6301 +| |_| |_| |_| |_| | Q = S50240 +| | +| _ _ _ _ | +| ______ | | | | | | | | | +| | N | |C| |B| |K| |I| D | +| |______| | | | | | | | | | +| |_| |_| |_| |_| | +| | +| _ _ _ | +| | | | | | | | +| |L| |M| |K| E | +| | | | | | | | +|MR model |_| |_| |_| | +| racing CS229 | +| __ __ | +|______________| |_|_|_|_|_|_|_|_|_|_|_|_|_| |_____________| + 1 22 + + + __________________I N S T R U C T I O N S _________________ +| | +| INSERT COIN(S) AND PRESS START BUTTON | +| | +| 1) THREE SPIRALLING BALLS SCORE FROM ... 100 TO 10 POINTS | +| 2) THE SEQUENCE OF GLASSES ................... 420 POINTS | +| 3) THE SEQUENCE OF LAMPS ..................... 440 POINTS | +| THE LAMPS AT THE CENTRE SCORE HIGHEST | +| 4) THE THREE FAST SPIRALLING BALLS SCORE ...... 80 POINTS | +| HITTING THE FIRST BALL SCORES 500 POINTS AND | +| GIVES THE GLASSES AND BOTTLE SEQUENCE. | +| HITTING THE SECOND BALL SCORES 240 POINTS AND | +| GIVES THE GLASS SEQUENCE AT INCREASED SPEED. | +|___________________________________________________________| + + +GUN CHAMP +Same PCB as Super Shot, but with gun hardware as 8080bw Gun Champ, no xy pots +Mainboard: CS249 +Soundboard: CS240 +Given CS numbers, this is released after the other Gun Champ + +*/ + +#include "emu.h" +#include "cpu/scmp/scmp.h" +#include "emupal.h" +#include "screen.h" +#include "tilemap.h" + +#include "gunchamps.lh" + + +namespace { + +class sshot_state : public driver_device +{ +public: + sshot_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_videoram(*this, "videoram") + { } + + void sshot(machine_config &config); + +private: + required_device m_maincpu; + required_device m_gfxdecode; + required_device m_screen; + + required_shared_ptr m_videoram; + tilemap_t *m_tilemap = nullptr; + + void sshot_vidram_w(offs_t offset, uint8_t data); + void sshot_output0_w(uint8_t data); + void sshot_output1_w(uint8_t data); + + TILE_GET_INFO_MEMBER(get_sshot_text_tile_info); + virtual void video_start() override ATTR_COLD; + uint32_t screen_update_sshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void sshot_map(address_map &map) ATTR_COLD; +}; + + +/************************************* + * + * Video + * + *************************************/ + +TILE_GET_INFO_MEMBER(sshot_state::get_sshot_text_tile_info) +{ + uint8_t code = m_videoram[tile_index]; + tileinfo.set(0, code, 0, 0); +} + +void sshot_state::video_start() +{ + m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sshot_state::get_sshot_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); +} + +uint32_t sshot_state::screen_update_sshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_tilemap->draw(screen, bitmap, cliprect, 0, 0); + return 0; +} + +void sshot_state::sshot_vidram_w(offs_t offset, uint8_t data) +{ + m_videoram[offset] = data; + m_tilemap->mark_tile_dirty(offset); +} + + +/************************************* + * + * Outputs + * + *************************************/ + +void sshot_state::sshot_output0_w(uint8_t data) +{ + /* + bit signal description + + 0 12 EXPLOSIONE LAMP. DX + 1 13 RIMBALZO PALLINA (BALL BOUNCE) + 2 14 CONSENSO GIOCO (CONSENT GAME) + 3 16 VINCITA EXT. PLAY (WIN EXT. PLAY) + 4 n.c. + 5 n.c. + 6 n.c. + 7 H n.c. + */ +} + +void sshot_state::sshot_output1_w(uint8_t data) +{ + /* + bit signal description + + 0 5 ESPL. BICCHIERI E BOTTIGLIE (EXPLOSION GLASSES AND BOTTLES) + 1 F n.c. + 2 E APPARIZIONE BOTTIGLIE (APPEARANCE BOTTLES) + 3 4 MUSICA FINE GIOCO (END OF GAME MUSIC) + 4 S EXPANSIONE CERCHIO (EXPANSION CIRCLE) + 5 n.c. + 6 N EXPLOSIONE CERCHIO (CIRCLE EXPLOSION) + 7 11 SIBILO SPIRALE (PATHY SPIRAL) + */ +} + + +/************************************* + * + * Memory map + * + *************************************/ + +void sshot_state::sshot_map(address_map &map) +{ + map(0x0000, 0x1fff).rom(); + map(0x2000, 0x23ff).ram().w(FUNC(sshot_state::sshot_vidram_w)).share("videoram"); + map(0x4100, 0x41ff).ram(); + map(0x4200, 0x4200).portr("GUNX"); + map(0x4201, 0x4201).portr("GUNY"); + map(0x4202, 0x4202).portr("IN0"); + map(0x4203, 0x4203).portr("DSW"); + map(0x4206, 0x4206).w(FUNC(sshot_state::sshot_output0_w)); + map(0x4207, 0x4207).w(FUNC(sshot_state::sshot_output1_w)); +} + + +/************************************* + * + * Inputs + * + *************************************/ + +static INPUT_PORTS_START( sshot ) + PORT_START("GUNX") + PORT_BIT( 0xff, 0x7c, IPT_LIGHTGUN_X ) PORT_MINMAX(0x00, 0xf7) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_PLAYER(1) + + PORT_START("GUNY") + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10) PORT_PLAYER(1) + + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0xf4, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("DSW") + PORT_DIPUNUSED( 0x01, 0x00 ) + PORT_DIPUNUSED( 0x04, 0x00 ) + PORT_DIPNAME( 0x18, 0x10, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x00, "Invalid" ) + PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x18, DEF_STR( 1C_2C ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Service_Mode ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPUNUSED( 0x40, 0x00 ) + PORT_DIPNAME( 0x82, 0x82, "Bonus Game" ) + PORT_DIPSETTING( 0x00, "Invalid" ) + PORT_DIPSETTING( 0x02, "910-1190" ) + PORT_DIPSETTING( 0x80, "1210-1590" ) + PORT_DIPSETTING( 0x82, "1510-1790" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( gunchamp ) + PORT_INCLUDE( sshot ) + + PORT_MODIFY("GUNX") // offset by 24 pixels + PORT_BIT( 0xfff, 0x94, IPT_LIGHTGUN_X ) PORT_MINMAX(0x18, 0x10f) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_PLAYER(1) + + PORT_MODIFY("DSW") + PORT_DIPUNUSED( 0x01, 0x00 ) + PORT_DIPUNUSED( 0x04, 0x00 ) + PORT_DIPNAME( 0x38, 0x08, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x38, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x30, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) ) +// PORT_DIPSETTING( 0x28, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x18, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) ) + PORT_DIPNAME( 0x42, 0x00, "High Score" ) + PORT_DIPSETTING( 0x00, "5000" ) + PORT_DIPSETTING( 0x40, "6000" ) + PORT_DIPSETTING( 0x02, "7000" ) + PORT_DIPSETTING( 0x42, "8000" ) + PORT_DIPNAME( 0x80, 0x00, "Enter Initials" ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x80, DEF_STR( No ) ) +INPUT_PORTS_END + + +/************************************* + * + * Machine + * + *************************************/ + +static GFXDECODE_START( gfx_sshot ) + GFXDECODE_ENTRY( "gfx", 0, gfx_8x8x1, 0, 1 ) +GFXDECODE_END + +void sshot_state::sshot(machine_config &config) +{ + // basic machine hardware + INS8060(config, m_maincpu, 11.289_MHz_XTAL/8); + m_maincpu->set_addrmap(AS_PROGRAM, &sshot_state::sshot_map); + m_maincpu->sense_a().set(m_screen, FUNC(screen_device::vblank)); + + // video hardware + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(50); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); + m_screen->set_size(32*8, 32*8); + m_screen->set_visarea(0*8, 31*8-1, 0*8, 32*8-1); + m_screen->set_screen_update(FUNC(sshot_state::screen_update_sshot)); + m_screen->set_palette("palette"); + + GFXDECODE(config, m_gfxdecode, "palette", gfx_sshot); + PALETTE(config, "palette", palette_device::MONOCHROME); + + // sound hardware + //... +} + + +ROM_START( sshot ) + ROM_REGION( 0x2000, "maincpu", 0 ) + ROM_LOAD( "ss_1m.a6", 0x0000, 0x0400, CRC(9f1625db) SHA1(734156d9858d696ac1f00706ba7716e5f818a3c5) ) + ROM_LOAD( "ss_2m.a7", 0x0400, 0x0400, CRC(09f0295d) SHA1(7b4f996e9200fd178e295b1613aad8d10b19bc78) ) + ROM_LOAD( "ss_3m.a9", 0x0800, 0x0400, CRC(88b54d54) SHA1(4f6e792276f2615d4df1867fcdb0d18f55f72b3a) ) + ROM_LOAD( "ss_4m.a10", 0x0c00, 0x0400, CRC(14199f00) SHA1(2696a42f362b39b92c8e07e2a005e0d8e00f539d) ) + ROM_LOAD( "ss_5m.a11", 0x1000, 0x0400, CRC(e70eca76) SHA1(771ae15fd4b2663090386a4ec49575895c5bfed7) ) + ROM_LOAD( "ss_6m.a12", 0x1400, 0x0400, CRC(27683d93) SHA1(5e127186a215f4bdf1912ff9d85574165c2dcc93) ) + ROM_LOAD( "ss_7m.a13", 0x1800, 0x0400, CRC(650dada4) SHA1(8a4274792952b33b87ef7d160e1a1e038041761b) ) + ROM_LOAD( "ss_8m.a15", 0x1c00, 0x0400, CRC(32bc8424) SHA1(a7b75b2c0fe6ff80148e2ba62ac2ff59ed03e09a) ) + + ROM_REGION( 0x0800, "gfx", 0 ) + ROM_LOAD( "ss_a.b9", 0x0000, 0x0400, CRC(ad3413e0) SHA1(ea4c2728755fe52a00fdceddca0b641965045005) ) + ROM_LOAD( "ss_b.b10", 0x0400, 0x0400, CRC(ba70e619) SHA1(df39512de881df26ccc7fa74f6bae82d92cd9008) ) +ROM_END + +ROM_START( gunchamps ) + ROM_REGION( 0x2000, "maincpu", 0 ) + ROM_LOAD( "gc-1.a6", 0x0000, 0x0400, CRC(dcafc54b) SHA1(a83adbee5fc6125f90078e233af258120ae14a4d) ) + ROM_LOAD( "gc-2.a7", 0x0400, 0x0400, CRC(8b087128) SHA1(c49934dc29d24d94dda0a2b9d425abf1580a5038) ) + ROM_LOAD( "gc-3.a9", 0x0800, 0x0400, CRC(ca517d50) SHA1(ccb18b66070d02082a367ca78f9095395e997bdd) ) + ROM_LOAD( "gc-4.a10", 0x0c00, 0x0400, CRC(6a5b258c) SHA1(6a8349f4d785517877531100b3c30e02a54b98e2) ) + ROM_LOAD( "gc-5.a11", 0x1000, 0x0400, CRC(3f25c50d) SHA1(718687f421bf3ac2471b9cae7ff4514344912ef5) ) + ROM_LOAD( "gc-6.a12", 0x1400, 0x0400, CRC(85a62b89) SHA1(0a5dc97820f49a9100c99c129b4eebc649391a07) ) + ROM_LOAD( "gc-7.a13", 0x1800, 0x0400, CRC(0a6fde47) SHA1(cc596dd8c85701e1df0f513527125b006a7e1bd7) ) + + ROM_REGION( 0x0800, "gfx", 0 ) + ROM_LOAD( "gc-a.b9", 0x0000, 0x0400, CRC(c07f290e) SHA1(760ce12f4f5cadbd846d361c615f5026356a6fe2) ) + ROM_LOAD( "gc-b.b10", 0x0400, 0x0400, CRC(10ce709b) SHA1(e6f194aa26cd0e01ba0de3909948cc8595031d4d) ) + + ROM_REGION( 0x0120, "proms", 0 ) // proms on the sound board + ROM_LOAD( "snd82s129.a5", 0x0000, 0x0100, CRC(1d74dc30) SHA1(b956d8c6564cc3cc1b5f5f55b05ad4aa13f247e6) ) + ROM_LOAD( "snd82s23.b7", 0x0100, 0x0020, CRC(f4fa91d4) SHA1(0e0903532c8609c2d42491c2013647a42d13749a) ) +ROM_END + +} // anonymous namespace + + +GAME( 1979, sshot, 0, sshot, sshot, sshot_state, empty_init, ROT0, "Model Racing", "Super Shot", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +GAMEL(1980, gunchamps, gunchamp, sshot, gunchamp, sshot_state, empty_init, ROT0, "Model Racing", "Gun Champ (newer, Super Shot hardware)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_gunchamps ) diff --git a/src/mame/modelracing/subhuntr.cpp b/src/mame/modelracing/subhuntr.cpp new file mode 100644 index 00000000000..ea4aad5bc36 --- /dev/null +++ b/src/mame/modelracing/subhuntr.cpp @@ -0,0 +1,388 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/* + +QTY Type clock position function +1x 2621 B8 Universal Sync Generator (PAL) +3x 2636 H5,L5,N5 Programmable Video Interface +1x 2650 OSC/2 = 1.7897725 MHz 8-bit Microprocessor - main +1x oscillator 3.579545 MHz + +ROMs +QTY Type position status +4x 2708 F7,H7,L7,N7 dumped +1x N82S115 B2 dumped + +RAMs +QTY Type position +4x 2112-2 G8,G9,H8,H9,L8,L9,M8,M9 +2x 2101-1 B4,C4 + +Video uses approximate PAL timings derived from a 3.579MHz crystal +using a 2621 USG (227 clocks per line, 43-clock HBLANK, 312 lines, +43-line VBLANK). This gives a resolution of 184*269, which is used for +the 2636 PVIs. The clock is doubled to 7.15MHz for the text layer, +giving a resolution of 368*269. Screen raw parameters are derived by +considering pixel/line zero to be the first period after the end of the +horizontal/vertical sync pulse. + +*/ + +#include "emu.h" + +#include "cpu/s2650/s2650.h" +#include "machine/s2636.h" + +#include "emupal.h" +#include "screen.h" +#include "speaker.h" +#include "tilemap.h" + + +namespace { + +class subhuntr_state : public driver_device +{ +public: + subhuntr_state(machine_config const &mconfig, device_type type, char const *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_screen(*this, "screen") + , m_pvi1_h5(*this, "pvi1") + , m_pvi2_l5(*this, "pvi2") + , m_pvi3_n5(*this, "pvi3") + , m_gfx(*this, "gfxdecode") + , m_txtram(*this, "txtram") + , m_intreq_cnf(*this, "JMP_1_7") + { + } + + void subhuntr(machine_config &config); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + +private: + void txtram_w(offs_t offset, u8 data); + u8 intack_r(); + + void pvi1_intreq_w(int state); + void pvi2_intreq_w(int state); + void pvi3_intreq_w(int state); + + void palette_init(palette_device &palette) const; + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, rectangle const &cliprect); + TILE_GET_INFO_MEMBER(tile_info); + TIMER_CALLBACK_MEMBER(video_callback); + + void set_intreq(unsigned bit, u8 mask); + void clr_intreq(unsigned bit); + + void subhuntr_map(address_map &map) ATTR_COLD; + + required_device m_maincpu; + required_device m_screen; + required_device m_pvi1_h5; + required_device m_pvi2_l5; + required_device m_pvi3_n5; + required_device m_gfx; + required_shared_ptr m_txtram; + + required_ioport m_intreq_cnf; + + u8 m_intreqs = 0; + + bitmap_ind16 m_bitmap; + emu_timer *m_video_timer = nullptr; + tilemap_t *m_tilemap = nullptr; +}; + + +/*************************************************************************** + + Machine implementation + +***************************************************************************/ + +void subhuntr_state::machine_start() +{ + m_video_timer = timer_alloc(FUNC(subhuntr_state::video_callback), this); + m_tilemap = &machine().tilemap().create(*m_gfx, tilemap_get_info_delegate(*this, FUNC(subhuntr_state::tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 8); + m_tilemap->set_transparent_pen(0); + + save_item(NAME(m_intreqs)); + + m_screen->register_screen_bitmap(m_bitmap); + + m_video_timer->adjust(m_screen->time_until_pos(1, 0)); +} + +void subhuntr_state::machine_reset() +{ +} + +void subhuntr_state::txtram_w(offs_t offset, u8 data) +{ + if (m_txtram[offset] != data) + { + m_txtram[offset] = data; + m_tilemap->mark_tile_dirty(offset); + } +} + +u8 subhuntr_state::intack_r() +{ + unsigned const source = count_leading_zeros_32(m_intreqs) - 24; + u8 const vector = ((m_intreq_cnf->read() & 0x01) ? 0x91 : 0x11) | (source << 1); + switch (source) + { + case 1: + m_pvi1_h5->write_intack(ASSERT_LINE); + m_pvi1_h5->write_intack(CLEAR_LINE); + break; + case 2: + m_pvi2_l5->write_intack(ASSERT_LINE); + m_pvi2_l5->write_intack(CLEAR_LINE); + break; + case 4: + m_pvi3_n5->write_intack(ASSERT_LINE); + m_pvi3_n5->write_intack(CLEAR_LINE); + break; + case 3: + case 5: + case 6: + clr_intreq(7 - source); + break; + } + return vector; +} + +void subhuntr_state::pvi1_intreq_w(int state) +{ + if (state) set_intreq(6, 0x02); + else clr_intreq(6); +} + +void subhuntr_state::pvi2_intreq_w(int state) +{ + if (state) set_intreq(5, 0x04); + else clr_intreq(5); +} + +void subhuntr_state::pvi3_intreq_w(int state) +{ + if (state) set_intreq(3, 0x08); + else clr_intreq(3); +} + +void subhuntr_state::palette_init(palette_device &palette) const +{ + palette.set_pen_color(0, 0x00, 0x00, 0x00); + palette.set_pen_color(1, 0x00, 0xff, 0x00); + palette.set_pen_color(2, 0x00, 0x00, 0x00); + palette.set_pen_color(3, 0x00, 0xff, 0xff); + palette.set_pen_color(4, 0x00, 0x00, 0x00); + palette.set_pen_color(5, 0xff, 0xff, 0x00); + palette.set_pen_color(6, 0x00, 0x00, 0x00); + palette.set_pen_color(7, 0xff, 0xff, 0xff); +} + +u32 subhuntr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, rectangle const &cliprect) +{ + copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); + return 0; +} + +TILE_GET_INFO_MEMBER(subhuntr_state::tile_info) +{ + u8 const tile = m_txtram[tile_index]; + u8 const code = tile & 0x3f; + u8 const colour = (tile >> 6) & 0x03; + tileinfo.set(0, code, colour, 0); +} + +TIMER_CALLBACK_MEMBER(subhuntr_state::video_callback) +{ + int const y = m_screen->vpos(); + + if (!y) + { + m_pvi1_h5->start_new_frame(); + m_pvi2_l5->start_new_frame(); + m_pvi3_n5->start_new_frame(); + } + m_pvi1_h5->render_next_line(); + m_pvi2_l5->render_next_line(); + m_pvi3_n5->render_next_line(); + + u16 const *src1 = &m_pvi1_h5->bitmap().pix(y); + u16 const *src2 = &m_pvi2_l5->bitmap().pix(y); + u16 const *src3 = &m_pvi3_n5->bitmap().pix(y); + u16 *dst = &m_bitmap.pix(y); + for (unsigned x = 0; x < m_bitmap.width(); x++, src1++, src2++, src3++, dst++) + { + u16 const pvi_val = S2636_PIXEL_COLOR(*src1 | *src2 | *src3); + *dst = pvi_val; + if (S2636_IS_PIXEL_DRAWN(*src1) && S2636_IS_PIXEL_DRAWN(*src2)) set_intreq(4, 0x10); + if (S2636_IS_PIXEL_DRAWN(*src1) && S2636_IS_PIXEL_DRAWN(*src3)) set_intreq(2, 0x20); + if (S2636_IS_PIXEL_DRAWN(*src2) && S2636_IS_PIXEL_DRAWN(*src3)) set_intreq(1, 0x40); + } + + m_video_timer->adjust(m_screen->time_until_pos(y + 1, 0)); +} + +void subhuntr_state::set_intreq(unsigned bit, u8 mask) +{ + u8 const shifted = ((m_intreq_cnf->read() & mask) ? 1U : 0U) << bit; + if (shifted & ~m_intreqs) + { + if (!m_intreqs) + m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); + m_intreqs |= shifted; + } +} + +void subhuntr_state::clr_intreq(unsigned bit) +{ + u8 const shifted = 1U << bit; + if (shifted & m_intreqs) + { + m_intreqs &= ~shifted; + if (!m_intreqs) + m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); + } +} + + +/*************************************************************************** + + Memory Maps, I/O + +***************************************************************************/ + +void subhuntr_state::subhuntr_map(address_map &map) +{ + map.global_mask(0x1fff); + map.unmap_value_high(); + + map(0x0000, 0x0fff).rom(); + map(0x1000, 0x10ff).mirror(0x0100).ram(); // G8/G9 + map(0x1200, 0x12ff).mirror(0x0100).ram(); // H8/H9 + map(0x1400, 0x14ff).mirror(0x0100).ram(); // L8/L9 + map(0x1600, 0x16ff).mirror(0x0100).ram(); // M8/M9 + map(0x1800, 0x18ff).mirror(0x0100).w(FUNC(subhuntr_state::txtram_w)).share(m_txtram); // B4/C4 + map(0x1b00, 0x1bff).rw(m_pvi3_n5, FUNC(s2636_device::read_data), FUNC(s2636_device::write_data)); + map(0x1d00, 0x1dff).rw(m_pvi2_l5, FUNC(s2636_device::read_data), FUNC(s2636_device::write_data)); + // Some kind of I/O at 1e00-1eff (enabled by PVI1 CE2) + map(0x1f00, 0x1fff).rw(m_pvi1_h5, FUNC(s2636_device::read_data), FUNC(s2636_device::write_data)); +} + + +/*************************************************************************** + + Inputs + +***************************************************************************/ + +static INPUT_PORTS_START( subhuntr ) + + // Factory jumpers controlling interrupt masking + PORT_START("JMP_1_7") + PORT_CONFNAME(0x01, 0x00, "JMP1") // interrupt vector MSB select (indirect bit) + PORT_CONFSETTING(0x00, DEF_STR(Off)) + PORT_CONFSETTING(0x01, DEF_STR(On)) + PORT_CONFNAME(0x02, 0x02, "JMP2") // PVI1 VBLANK/completion interrupt enable + PORT_CONFSETTING(0x00, DEF_STR(Off)) + PORT_CONFSETTING(0x02, DEF_STR(On)) + PORT_CONFNAME(0x04, 0x04, "JMP3") // PVI2 VBLANK/completion interrupt enable + PORT_CONFSETTING(0x00, DEF_STR(Off)) + PORT_CONFSETTING(0x04, DEF_STR(On)) + PORT_CONFNAME(0x08, 0x08, "JMP4") // PVI3 VBLANK/completion interrupt enable + PORT_CONFSETTING(0x00, DEF_STR(Off)) + PORT_CONFSETTING(0x08, DEF_STR(On)) + PORT_CONFNAME(0x10, 0x10, "JMP5") // PVI1/PVI2 collision interrupt enable + PORT_CONFSETTING(0x00, DEF_STR(Off)) + PORT_CONFSETTING(0x10, DEF_STR(On)) + PORT_CONFNAME(0x20, 0x20, "JMP6") // PVI1/PVI3 collision interrupt enable + PORT_CONFSETTING(0x00, DEF_STR(Off)) + PORT_CONFSETTING(0x20, DEF_STR(On)) + PORT_CONFNAME(0x40, 0x40, "JMP7") // PVI2/PVI3 collision interrupt enable + PORT_CONFSETTING(0x00, DEF_STR(Off)); + PORT_CONFSETTING(0x40, DEF_STR(On)); + +INPUT_PORTS_END + + +/*************************************************************************** + + Machine Config/Interface + +***************************************************************************/ + +static const gfx_layout tiles8x8_layout = +{ + 8,8, + RGN_FRAC(1,1), + 1, + { 0 }, + { 7, 6, 5, 4, 3, 2, 1, 0 }, + { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8 }, + 8*8 +}; + +static GFXDECODE_START( gfx_subhuntr ) + GFXDECODE_ENTRY("gfx1", 0, tiles8x8_layout, 0, 4) +GFXDECODE_END + + +void subhuntr_state::subhuntr(machine_config &config) +{ + S2650(config, m_maincpu, 3.579545_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &subhuntr_state::subhuntr_map); + m_maincpu->sense_handler().set(m_screen, FUNC(screen_device::vblank)); + m_maincpu->intack_handler().set(FUNC(subhuntr_state::intack_r)); + + S2636(config, m_pvi1_h5, 3.579545_MHz_XTAL); + m_pvi1_h5->set_divider(2); + m_pvi1_h5->intreq_cb().set(FUNC(subhuntr_state::pvi1_intreq_w)); + + S2636(config, m_pvi2_l5, 3.579545_MHz_XTAL); + m_pvi2_l5->set_divider(2); + m_pvi2_l5->intreq_cb().set(FUNC(subhuntr_state::pvi2_intreq_w)); + + S2636(config, m_pvi3_n5, 3.579545_MHz_XTAL); + m_pvi3_n5->set_divider(2); + m_pvi3_n5->intreq_cb().set(FUNC(subhuntr_state::pvi3_intreq_w)); + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(3.579545_MHz_XTAL*2, 227*2, 21*2, 205*2, 312, 29, 298); + m_screen->set_palette("palette"); + m_screen->set_screen_update(FUNC(subhuntr_state::screen_update)); + + GFXDECODE(config, m_gfx, "txtpal", gfx_subhuntr); + + PALETTE(config, "palette", palette_device::RGB_3BIT); + PALETTE(config, "txtpal", FUNC(subhuntr_state::palette_init), 8); + + SPEAKER(config, "mono").front_center(); +} + + + +/******************************************************************************/ + +ROM_START( subhuntr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mr21.f7", 0x0000, 0x0400, CRC(27847939) SHA1(e6b41b511fefac1e1e207eff2dac8c2963d47c5c) ) + ROM_LOAD( "mr22.g7", 0x0400, 0x0400, CRC(e9af1ee8) SHA1(451e88407a120444377a58b06b65152c57503533) ) + ROM_LOAD( "mr25.l7", 0x0800, 0x0400, CRC(8271c975) SHA1(c7192658b50d781ab1b94c2e8cb75c5be3539820) ) + ROM_LOAD( "mr24.n7", 0x0c00, 0x0400, CRC(385c4944) SHA1(84050b0356c9a3a36528dba768f2684e28c6c7c4) ) + + ROM_REGION( 0x0200, "gfx1", 0 ) + ROM_LOAD( "82s115.b2", 0x0000, 0x0200, CRC(6946c9de) SHA1(956b4bebe6960a73609deb75e1493c4127fd7f77) ) +ROM_END + +} // anonymous namespace + +GAME(1979, subhuntr, 0, subhuntr, subhuntr, subhuntr_state, empty_init, ROT0, "Model Racing", "Sub Hunter (Model Racing)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff --git a/src/mame/mr/dribling.cpp b/src/mame/mr/dribling.cpp deleted file mode 100644 index bd070476f64..00000000000 --- a/src/mame/mr/dribling.cpp +++ /dev/null @@ -1,635 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders: Aaron Giles, Enzo Lombardi -/*************************************************************************** - - Model Racing Dribbling hardware - MEF00284 main board + MEF00277 'counter drive' board + CS283 player control - - driver by Aaron Giles - - Games supported: - * Dribbling - - TODO: - * Implement the 2 banks of 8 DIP switches which determine coinage for the 2 players - * Actual game duration doesn't match the time reported in the manual - -**************************************************************************** - - Memory map - -**************************************************************************** - - ======================================================================== - CPU #1 - ======================================================================== - tbd - ======================================================================== - Interrupts: - NMI not connected - IRQ generated by VBLANK - ======================================================================== - -***************************************************************************/ - -#include "emu.h" - -#include "nl_dribling.h" - -#include "cpu/z80/z80.h" -#include "machine/i8255.h" -#include "machine/netlist.h" -#include "machine/watchdog.h" - -#include "emupal.h" -#include "screen.h" -#include "speaker.h" - - -// configurable logging -#define LOG_MISC (1U << 1) -#define LOG_SOUND (1U << 2) - -//#define VERBOSE (LOG_GENERAL | LOG_MISC | LOG_SOUND) - -#include "logmacro.h" - -#define LOGMISC(...) LOGMASKED(LOG_MISC, __VA_ARGS__) -#define LOGSOUND(...) LOGMASKED(LOG_SOUND, __VA_ARGS__) - - -namespace { - -class dribling_state : public driver_device -{ -public: - dribling_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_watchdog(*this, "watchdog"), - m_ppi8255(*this, "ppi8255%d", 0), - m_videoram(*this, "videoram"), - m_colorram(*this, "colorram"), - m_matrix(*this, "MUX%u", 0), - m_proms(*this, "proms"), - m_gfxroms(*this, "gfx"), - m_i_pb(*this, "snd_nl:pb%u", 0U), - m_i_folla_b(*this, "snd_nl:folla_b"), - m_i_folla_m(*this, "snd_nl:folla_m"), - m_i_folla_a(*this, "snd_nl:folla_a"), - m_i_calcio_b(*this, "snd_nl:calcio_b"), - m_i_fischio(*this, "snd_nl:fischio"), - m_i_calcio_a(*this, "snd_nl:calcio_a"), - m_i_contrasto(*this, "snd_nl:contrasto"), - m_i_stop_palla(*this, "snd_nl:stop_palla"), - m_i_parata(*this, "snd_nl:parata"), - m_i_enable(*this, "snd_nl:enable") - { } - - void dribling(machine_config &config); - -protected: - virtual void machine_start() override ATTR_COLD; - virtual void machine_reset() override ATTR_COLD; - -private: - // devices - required_device m_maincpu; - required_device m_watchdog; - required_device_array m_ppi8255; - - // memory pointers - required_shared_ptr m_videoram; - required_shared_ptr m_colorram; - required_ioport_array<3> m_matrix; - required_region_ptr m_proms; - required_region_ptr m_gfxroms; - - // sound - required_device_array m_i_pb; - required_device m_i_folla_b; - required_device m_i_folla_m; - required_device m_i_folla_a; - required_device m_i_calcio_b; - required_device m_i_fischio; - required_device m_i_calcio_a; - required_device m_i_contrasto; - required_device m_i_stop_palla; - required_device m_i_parata; - required_device m_i_enable; - - // misc - uint8_t m_abca = 0U; - uint8_t m_dr = 0U; - uint8_t m_ds = 0U; - uint8_t m_sh = 0U; - uint8_t m_input_sel = 0U; - uint8_t m_di = 0U; - - 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_matrix_read(); - 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) ATTR_COLD; - void io_map(address_map &map) ATTR_COLD; -}; - - -/************************************* - * - * Convert the palette PROM into - * a real palette - * - *************************************/ - -void dribling_state::palette(palette_device &palette) const -{ - uint8_t const *const prom = memregion("proms")->base() + 0x400; - - for (int i = 0; i < 256; i++) - { - int r = (~prom[i] >> 0) & 1; // 220 - int g = (~prom[i] >> 1) & 3; // 820 + 560 (332 max) - int b = (~prom[i] >> 3) & 1; // 220 - - r *= 0xff; - g *= 0x55; - b *= 0xff; - - palette.set_pen_color(i, rgb_t(r, g, b)); - } -} - - - -/************************************* - * - * Color control writes - * - *************************************/ - -void dribling_state::colorram_w(offs_t offset, uint8_t data) -{ - // it is very important that we mask off the two bits here - m_colorram[offset & 0x1f9f] = data; -} - - - -/************************************* - * - * Video update routine - * - *************************************/ - -uint32_t dribling_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - // loop over rows - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) - { - uint16_t *const dst = &bitmap.pix(y); - - // loop over columns - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) - { - int const b7 = BIT(m_proms[(x >> 3) | ((y >> 3) << 5)], 0); - int const b6 = m_abca; - int const b5 = BIT(x, 3); - int const b4 = BIT(m_gfxroms[(x >> 3) | (y << 5)], x & 7); - int const b3 = BIT(m_videoram[(x >> 3) | (y << 5)], x & 7); - int const b2_0 = m_colorram[(x >> 3) | ((y >> 2) << 7)] & 7; - - // assemble the various bits into a palette PROM index - dst[x] = (b7 << 7) | (b6 << 6) | (b5 << 5) | (b4 << 4) | (b3 << 3) | b2_0; - } - } - return 0; -} - - - -/************************************* - * - * Interrupt generation - * - *************************************/ - -INTERRUPT_GEN_MEMBER(dribling_state::irq_gen) -{ - if (m_di) - device.execute().set_input_line(0, ASSERT_LINE); -} - - - -/************************************* - * - * PPI inputs - * - *************************************/ - -uint8_t dribling_state::dsr_r() -{ - // return DSR0-7 - return (m_ds << m_sh) | (m_dr >> (8 - m_sh)); -} - - -uint8_t dribling_state::input_matrix_read() -{ - // low value in the given bit selects - u8 result = 0xff; - if (!BIT(m_input_sel, 0)) - result &= m_matrix[0]->read(); - if (!BIT(m_input_sel, 1)) - result &= m_matrix[1]->read(); - if (!BIT(m_input_sel, 2)) - result &= m_matrix[2]->read(); - return result; -} - - - -/************************************* - * - * PPI outputs - * - *************************************/ - -void dribling_state::misc_w(uint8_t data) -{ - LOGMISC("%s:misc_w(%02X)\n", machine().describe_context(), data); - - // bit 7 = di - m_di = BIT(data, 7); - if (!m_di) - m_maincpu->set_input_line(0, CLEAR_LINE); - - // bit 6 = parata (save by goalkeeper) - m_i_parata->write_line(BIT(data, 6)); - - // bit 5 = ab. campo (field enable) - m_abca = BIT(data, 5); - - // bit 4 = ab. a.b.f. - m_i_enable->write_line(BIT(data, 4)); - - // bit 3 = n/c - // bit 2 = (9) = PC2 - // bit 1 = (10) = PC1 - // bit 0 = (32) = PC0 - m_input_sel = data & 7; -} - - -void dribling_state::sound_w(uint8_t data) -{ - LOGSOUND("%s:sound_w(%02X)\n", machine().describe_context(), data); - - m_i_stop_palla->write_line(BIT(data, 7)); // stop palla (ball stop) - m_i_contrasto->write_line(BIT(data, 6)); // contrasto (tackle) - m_i_calcio_a->write_line(BIT(data, 5)); // calcio a (kick a) - m_i_fischio->write_line(BIT(data, 4)); // fischio (whistle) - m_i_calcio_b->write_line(BIT(data, 3)); // calcio b (kick b) - m_i_folla_a->write_line(BIT(data, 2)); // folla a (crowd a) - m_i_folla_m->write_line(BIT(data, 1)); // folla m (crowd m) - m_i_folla_b->write_line(BIT(data, 0)); // folla b (crowd b) -} - - -void dribling_state::pb_w(uint8_t data) -{ - LOGSOUND("%s:pb_w(%02X)\n", machine().describe_context(), data); - - for (int i = 0; i < 8; i++) - { - m_i_pb[i]->write_line(BIT(data, i)); - } -} - - -void dribling_state::shr_w(uint8_t data) -{ - // bit 3 = watchdog - m_watchdog->reset_line_w(BIT(~data, 3)); - - // bit 2-0 = SH0-2 - m_sh = data & 0x07; -} - - - -/************************************* - * - * PPI accessors - * - *************************************/ - -uint8_t dribling_state::ioread(offs_t offset) -{ - if (offset & 0x08) - return m_ppi8255[0]->read(offset & 3); - else if (offset & 0x10) - return m_ppi8255[1]->read(offset & 3); - return 0xff; -} - - -void dribling_state::iowrite(offs_t offset, uint8_t data) -{ - if (offset & 0x08) - m_ppi8255[0]->write(offset & 3, data); - else if (offset & 0x10) - m_ppi8255[1]->write(offset & 3, data); - else if (offset & 0x40) - { - m_dr = m_ds; - m_ds = data; - } -} - - -/************************************* - * - * Main CPU memory handlers - * - *************************************/ - -void dribling_state::prg_map(address_map &map) -{ - map(0x0000, 0x1fff).rom(); - map(0x2000, 0x3fff).ram().share(m_videoram); - map(0x4000, 0x7fff).rom(); - map(0xc000, 0xdfff).ram().w(FUNC(dribling_state::colorram_w)).share(m_colorram); -} - - -void dribling_state::io_map(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0xff).rw(FUNC(dribling_state::ioread), FUNC(dribling_state::iowrite)); -} - - - -/************************************* - * - * Port definitions - * - *************************************/ - -static INPUT_PORTS_START( dribling ) - PORT_START("MUX0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(1) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(1) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT ) PORT_PLAYER(1) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT ) PORT_PLAYER(1) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(1) - - PORT_START("MUX1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(2) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(2) - - PORT_START("MUX2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN0") - 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, "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 - - - -/************************************* - * - * Machine driver - * - *************************************/ - -void dribling_state::machine_start() -{ - save_item(NAME(m_abca)); - save_item(NAME(m_di)); - save_item(NAME(m_dr)); - save_item(NAME(m_ds)); - save_item(NAME(m_sh)); - save_item(NAME(m_input_sel)); -} - -void dribling_state::machine_reset() -{ - m_abca = 0; - m_di = 0; - m_dr = 0; - m_ds = 0; - m_sh = 0; - m_input_sel = 0; -} - - -void dribling_state::dribling(machine_config &config) -{ - // basic machine hardware - Z80(config, m_maincpu, 20_MHz_XTAL / 4); // XTAL and divider verified - 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::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_matrix_read)); - 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)); - - WATCHDOG_TIMER(config, m_watchdog); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); - screen.set_raw(20_MHz_XTAL / 4, 320, 0, 256, 262, 40, 256); - screen.set_screen_update(FUNC(dribling_state::screen_update)); - screen.set_palette("palette"); - - PALETTE(config, "palette", FUNC(dribling_state::palette), 256); - - // sound hardware - SPEAKER(config, "mono").front_center(); - - NETLIST_SOUND(config, "snd_nl", 48000) - .set_source(NETLIST_NAME(dribling)) - .add_route(ALL_OUTPUTS, "mono", 1.0); - - NETLIST_LOGIC_INPUT(config, m_i_pb[0], "I_PB0.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_pb[1], "I_PB1.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_pb[2], "I_PB2.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_pb[3], "I_PB3.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_pb[4], "I_PB4.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_pb[5], "I_PB5.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_pb[6], "I_PB6.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_pb[7], "I_PB7.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_folla_b, "I_FOLLA_B.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_folla_m, "I_FOLLA_M.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_folla_a, "I_FOLLA_A.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_calcio_a, "I_CALCIO_A.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_fischio, "I_FISCHIO.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_calcio_b, "I_CALCIO_B.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_contrasto, "I_CONTRASTO.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_stop_palla, "I_STOP_PALLA.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_parata, "I_PARATA.IN", 0); - NETLIST_LOGIC_INPUT(config, m_i_enable, "ENABLE_SOUND.IN", 0); - NETLIST_STREAM_OUTPUT(config, "snd_nl:cout0", 0, "OUTPUT").set_mult_offset(1.0, 0); -} - - -/************************************* - * - * ROM definitions - * - *************************************/ - -ROM_START( dribling ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "5p.bin", 0x0000, 0x1000, CRC(0e791947) SHA1(57bc4f4e9e1fe3fbac1017601c9c75029b2601a4) ) - ROM_LOAD( "5n.bin", 0x1000, 0x1000, CRC(bd0f223a) SHA1(f9fbc5670a8723c091d61012e545774d315eb18f) ) - ROM_LOAD( "5l.bin", 0x4000, 0x1000, CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) - ROM_LOAD( "5k.bin", 0x5000, 0x1000, CRC(737628c4) SHA1(301fda413388c26da5b5150aec2cefc971801749) ) - ROM_LOAD( "5h.bin", 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( "93453-d9.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) - ROM_LOAD( "63s140-d8.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) - 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 ) - ROM_LOAD( "5p.bin", 0x0000, 0x1000, CRC(0e791947) SHA1(57bc4f4e9e1fe3fbac1017601c9c75029b2601a4) ) - ROM_LOAD( "dribblng.5n", 0x1000, 0x1000, CRC(5271e620) SHA1(ebed8e31057bb8492840a6e3b8bc453f7cb67243) ) - ROM_LOAD( "5l.bin", 0x4000, 0x1000, CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) - ROM_LOAD( "dribblng.5j", 0x5000, 0x1000, CRC(e535ac5b) SHA1(ba13298378f1e5b2b40634874097ad29c402fdea) ) - ROM_LOAD( "dribblng.5h", 0x6000, 0x1000, CRC(e6af7264) SHA1(a015120d85461e599c4bb9626ebea296386a31bb) ) - - 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( "93453-d9.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) - ROM_LOAD( "63s140-d8.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) - ROM_LOAD( "tbp24s10.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) -ROM_END - -// Original Model Racing PCB (EF00284) -ROM_START( driblingam ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "2532.5p", 0x0000, 0x1000, CRC(35d97f4f) SHA1(c82b1d2a91e25cf3e3f049e0127d300572f0f54c) ) - ROM_LOAD( "2532.5n", 0x1000, 0x1000, CRC(bd0f223a) SHA1(f9fbc5670a8723c091d61012e545774d315eb18f) ) - ROM_LOAD( "2532.5l", 0x4000, 0x1000, CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) - ROM_LOAD( "2532.5k", 0x5000, 0x1000, CRC(737628c4) SHA1(301fda413388c26da5b5150aec2cefc971801749) ) - ROM_LOAD( "2532.5h", 0x6000, 0x1000, CRC(f1d6925e) SHA1(858fd13aad2c684a73b7458f18a759923b1defae) ) - - ROM_REGION( 0x2000, "gfx", 0 ) - ROM_LOAD( "2532.3p", 0x0000, 0x1000, CRC(208971b8) SHA1(f91f3ea04d75beb58a61c844472b4dba53d84c0f) ) - ROM_LOAD( "2532.3n", 0x1000, 0x1000, CRC(356c9803) SHA1(8e2ce52f32b33886f4747dadf3aeb78148538173) ) - - ROM_REGION( 0x600, "proms", 0 ) - ROM_LOAD( "74s476.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) - ROM_LOAD( "93427.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) - ROM_LOAD( "93427.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) -ROM_END - -ROM_START( driblingvm ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "1", 0x0000, 0x1000, CRC(35d97f4f) SHA1(c82b1d2a91e25cf3e3f049e0127d300572f0f54c) ) - ROM_LOAD( "2", 0x1000, 0x1000, CRC(bd0f223a) SHA1(f9fbc5670a8723c091d61012e545774d315eb18f) ) - ROM_LOAD( "3", 0x4000, 0x1000, CRC(1fccfc85) SHA1(c0365ad54144414218f52209173b858b927c9626) ) - ROM_LOAD( "4", 0x5000, 0x1000, CRC(3ed4073a) SHA1(dec36e9dda07ea5f50163b98051955783131773d) ) - ROM_LOAD( "5", 0x6000, 0x1000, CRC(c21a1d32) SHA1(6e919f1416e6c4df133d3140f7331f65f65d4942) ) - - ROM_REGION( 0x2000, "gfx", 0 ) - ROM_LOAD( "6", 0x0000, 0x1000, CRC(208971b8) SHA1(f91f3ea04d75beb58a61c844472b4dba53d84c0f) ) - ROM_LOAD( "7", 0x1000, 0x1000, CRC(356c9803) SHA1(8e2ce52f32b33886f4747dadf3aeb78148538173) ) - - ROM_REGION( 0x600, "proms", 0 ) - ROM_LOAD( "93453-d9.3c", 0x0000, 0x0400, CRC(b045d005) SHA1(7e3ac10a99aa37f6348b3a57a747116b7025103e) ) - ROM_LOAD( "63s140-d8.3e", 0x0400, 0x0100, CRC(8f1a9908) SHA1(12c513c589757f1282e9979d3589f9b49d30ec0f) ) - ROM_LOAD( "tbp24s10.2d", 0x0500, 0x0100, CRC(a17d6956) SHA1(81724daf2e2d319f55cc34cc881b6a9a4e64e7ac) ) -ROM_END - -} // anonymous namespace - - -/************************************* - * - * Game drivers - * - *************************************/ - -GAME( 1983, dribling, 0, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 1)", MACHINE_SUPPORTS_SAVE) -GAME( 1983, driblinga, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing", "Dribbling (set 2)", MACHINE_SUPPORTS_SAVE) -GAME( 1983, driblingo, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", MACHINE_SUPPORTS_SAVE) -GAME( 1983, driblingam, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "Model Racing (Automave license)", "Dribbling (Automave)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, driblingvm, dribling, dribling, dribling, dribling_state, empty_init, ROT0, "bootleg (Videomac)", "Dribbling (Videomac bootleg, Brazil)", MACHINE_SUPPORTS_SAVE) diff --git a/src/mame/mr/nl_dribling.cpp b/src/mame/mr/nl_dribling.cpp deleted file mode 100644 index 563eb3e040c..00000000000 --- a/src/mame/mr/nl_dribling.cpp +++ /dev/null @@ -1,622 +0,0 @@ -// license:CC0-1.0 -// copyright-holders: Enzo Lombardi - -// Netlist for Model Racing Dribbling: derived from the schematics in the Dribbling manual, located here: -// https://archive.org/details/ArcadeGameManualDribbling - -#include "netlist/devices/net_lib.h" - -#define TTL_74LS86_DIP TTL_7486_DIP -#define TTL_74LS107_DIP TTL_74107_DIP -#define TTL_74LS161_DIP TTL_74161_DIP -#define TTL_74LS164_DIP TTL_74164_DIP -#define ATTENUATE_FOLLA 200 -#define USE_SIMPLIFIED_LM339 -// By using FRONTIER, the second JFET is not necessary, but we need to drop the voltage by ~1.5V -// using two diodes. Performance increase is 60% with an undistinguishable difference in the output. -// Two JFETs is accurate to the hardware, while one JFET plut two diodes still generates correct sound and runs faster. -#define REPLACE_PARATA_JFET_WITH_DIODES - -// The schematic incorrectly labels two JFETS in the PARATA circuit as 2N3812. They're actually 2N3819. -// JFET transistors not supported, but this should do the trick; but not for this game. -#define Q_2N3819(name) MOSFET(name, "NMOS(VTO=-3 KP=0.001 CAPMOD=0)") - -#ifdef USE_SIMPLIFIED_LM339 -// Simplified LM339 model - uses high-level simulation of differential input stage. -static NETLIST_START(LM339) -{ - // * CONNECTIONS: NON-INVERTING INPUT - // * | INVERTING INPUT - // * | | POSITIVE POWER SUPPLY - // * | | | NEGATIVE POWER SUPPLY - // * | | | | OPEN COLLECTOR OUTPUT - // * | | | | | - // * 1 2 3 4 5 - NET_MODEL("LM339_QO NPN(BF=200)") - - AFUNC(CMP, 2, "min(max(A1 - A0, 0), 1e-6)") - VCCS(QB, 80) - QBJT_EB(QO, "LM339_QO") - ANALOG_INPUT(XGND, 0) - RES(RDUMMY, RES_M(1000)) - - NET_C(CMP.Q, QB.IP) - NET_C(QB.OP, QO.B) - NET_C(XGND, QB.IN) - NET_C(QB.ON, QO.E, RDUMMY.2) - - ALIAS(1, CMP.A0) - ALIAS(2, CMP.A1) - ALIAS(3, RDUMMY.1) - ALIAS(4, QO.E) - ALIAS(5, QO.C) -} -#else // USE_SIMPLIFIED_LM339 -// LM339 model adapted from here: https://github.com/evenator/LTSpice-Libraries/blob/master/sub/LM339.sub -// It's too slow for the circuits emulated in this netlist, but might be useful in the future. -static NETLIST_START(LM339) -{ - // * CONNECTIONS: NON-INVERTING INPUT - // * | INVERTING INPUT - // * | | POSITIVE POWER SUPPLY - // * | | | NEGATIVE POWER SUPPLY - // * | | | | OPEN COLLECTOR OUTPUT - // * | | | | | - // * 1 2 3 4 5 - NET_MODEL("LM339A_TI_QIN PNP(IS=800.0E-18 BF=2.000E3)") - NET_MODEL("LM339A_TI_QMI NPN(IS=800.0E-18 BF=1002)") - NET_MODEL("LM339A_TI_QMO NPN(IS=800.0E-18 BF=1000 CJC=1E-15 TR=807.4E-9)") - NET_MODEL("LM339A_TI_QOC NPN(IS=800.0E-18 BF=20.29E3 CJC=1E-15 TF=942.6E-12 TR=543.8E-9)") - NET_MODEL("LM339A_TI_DX D(IS=800.0E-18)") - ALIAS(1, VI1.2) - ALIAS(2, VI2.2) - ALIAS(3, F10.ON) - ALIAS(4, Q3.E) - ALIAS(5, Q5.C) - DIODE(DP, "LM339A_TI_DX") - VCVS(E1, 1) - CCCS(F10, 1) - CS(IEE, 0.0001) - QBJT_EB(Q1, "LM339A_TI_QIN") - QBJT_EB(Q2, "LM339A_TI_QIN") - QBJT_EB(Q3, "LM339A_TI_QMO") - QBJT_EB(Q4, "LM339A_TI_QMI") - QBJT_EB(Q5, "LM339A_TI_QOC") - RES(RP, 46.300000) - VS(V1, 0) - VS(VI1, 0.75) - VS(VI2, 0.75) - NET_C(E1.OP, F10.IP) - NET_C(Q2.C, Q3.B, Q4.C, Q4.B) - NET_C(VI1.1, Q1.B) - NET_C(VI2.1, Q2.B) - NET_C(IEE.2, Q1.E, Q2.E) - NET_C(F10.IN, V1.1) - NET_C(F10.ON, IEE.1, DP.K, RP.1) - NET_C(F10.OP, Q1.C, Q3.C, E1.IP) - NET_C(V1.2, Q5.B) - NET_C(Q3.E, Q4.E, E1.ON, E1.IN, Q5.E, DP.A, RP.2) -} -#endif // USE_SIMPLIFIED_LM339 - -// CALCIO_A and CALCIO_B differ only for the parameters of 3 capacitors. -static NETLIST_START(calcio) -{ - ANALOG_INPUT(I_V5, 5) - ANALOG_INPUT(GND, 0) - DEFPARAM(CAP1, 33) - DEFPARAM(CAP2, 68) - - QBJT_EB(Q8, "BC239C") - QBJT_EB(Q9, "BC239C") - ALIAS(INPUT, R45.2) - RES(R45, 420) - RES(R46, RES_K(8.2)) - RES(R48, RES_K(220)) - RES(R49, RES_K(56)) - RES(R50, RES_K(56)) - RES(R51, RES_M(1)) - RES(R52, RES_K(68)) - RES(R53, RES_K(82)) - RES(R54, RES_K(1.9)) // WAS POT - RES(R55, RES_K(10)) - RES(R56, RES_K(100)) - RES(R57, RES_K(10)) - RES(R58, RES_K(3.9)) - CAP(C29, CAP_U(4.2)) - CAP(C30, CAP_N($(@.CAP2))) - CAP(C31, CAP_N(150)) - CAP(C32, CAP_U(4.7)) - CAP(C33, CAP_N($(@.CAP1))) - CAP(C34, CAP_N($(@.CAP1))) - NET_C(INPUT, R46.1) - NET_C(GND, R45.1) - NET_C(R46.2, C33.2, C34.1) - NET_C(C33.1, R49.1, C29.1) - NET_C(C34.2, R50.2, R51.1, Q8.B) - NET_C(R49.2, C30.2, R50.1) - NET_C(C30.1, GND) - NET_C(C29.2, R52.1, R51.2, R53.1, Q8.C) - NET_C(R52.2, I_V5) - NET_C(Q8.E, R54.2) - NET_C(R54.1, GND) - NET_C(R53.2, C31.1) - NET_C(C31.2, R48.1, R56.2, Q9.B) - NET_C(R48.2, I_V5) - NET_C(R56.1, GND) - NET_C(Q9.C, R55.1) - NET_C(R55.2, I_V5) - NET_C(Q9.E, R57.2, C32.2) - NET_C(R57.1, GND) - NET_C(C32.1, R58.2) - NET_C(R58.1, GND) - RES(R0, 1) - NET_C(R0.1, Q9.C) - ALIAS(OUTPUT, R0.2) - - OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) -} - -static NETLIST_START(stop_palla) -{ - ANALOG_INPUT(I_V5, 5) - ANALOG_INPUT(GND, 0) - - QBJT_EB(Q1, "BC309") - RES(R5, RES_K(1)) - RES(R6, RES_K(160)) - RES(R7, RES_K(150)) - RES(R8, RES_K(10)) - RES(R9, RES_K(2.2)) - CAP(C5, CAP_U(1)) - CAP(C6, CAP_U(1)) - DIODE(D1, "1N914") - SUBMODEL(LM339, IC_B9) - NET_C(GND, IC_B9.4) - ALIAS(INPUT, R5.1) - NET_C(R5.2, Q1.B) - NET_C(Q1.E, I_V5) - NET_C(Q1.C, C5.2, R7.2, R6.1) - NET_C(C5.1, GND) - NET_C(R7.1, GND) - NET_C(R6.2, IC_B9.1, D1.A) - NET_C(D1.K, R9.1, IC_B9.5, R8.2) - NET_C(IC_B9.2, C6.2, R8.1) - NET_C(C6.1, GND) - NET_C(R9.2, I_V5) - NET_C(IC_B9.3, I_V5) - RES(R0, 1) - NET_C(R0.1, IC_B9.5) - ALIAS(OUTPUT, R0.2) - - OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) -} - -static NETLIST_START(parata) -{ - ANALOG_INPUT(I_V5, 5) - ANALOG_INPUT(GND, 0) - - QBJT_EB(Q1, "BC309") - Q_2N3819(Q2) - RES(R5, RES_K(1)) - RES(R6, RES_K(150)) - RES(R7, RES_K(220)) - RES(R9, RES_K(2.2)) - CAP(C5, CAP_U(2.2)) - CAP(C6, CAP_U(1)) - DIODE(D1, "1N914") - DIODE(D2, "1N914") - DIODE(D3, "1N914") - - SUBMODEL(LM339, IC_B9) - NET_C(GND, IC_B9.4) - ALIAS(INPUT, R5.1) - NET_C(R5.2, Q1.B) - NET_C(Q1.E, I_V5) - NET_C(Q1.C, C5.2, R7.2, R6.1) - NET_C(C5.1, GND) - NET_C(R7.1, GND) - NET_C(R6.2, IC_B9.1, D1.A) - NET_C(D1.K, R9.1, IC_B9.5, Q2.G, Q2.S) - NET_C(IC_B9.2, C6.2, Q2.D) - NET_C(C6.1, GND) - NET_C(R9.2, I_V5) - NET_C(IC_B9.3, I_V5) - NET_C(D2.A, Q2.G) - NET_C(D2.K, Q2.S) - -#ifdef REPLACE_PARATA_JFET_WITH_DIODES - DIODE(D4, "1N914") - NET_C(Q2.D, D3.A) - NET_C(D3.K, D4.A) - RES(R0, 1) - NET_C(R0.1, D4.K) - ALIAS(OUTPUT, R0.2) - - OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) -#elif - NET_C(Q2.D, Q3.G) - NET_C(Q3.D, I_V5) - NET_C(D3.A, Q3.G) - NET_C(D3.K, Q3.S) - ALIAS(OUTPUT, Q3.S) - - OPTIMIZE_FRONTIER(Q3.S, RES_K(100), 1) -#endif - -} - -// Sallen-Key approximation of a third-order Butterworth filter with 15KHz cutoff frequency. -// Values computed using http://sim.okawa-denshi.jp/en/Sallen3tool.php . -// This is because the tone generator outputs a 40KHz square wave at idle, and this is to avoid aliasing when outputing at 48KHz. -// Cutoff frequence is set to 12Khz because cleaning the output more by using FRONTIER shows there is a bit of noise left. -static NETLIST_START(output_filter) -{ - ANALOG_INPUT(VPLUS, 12) - ANALOG_INPUT(VMINUS, -12) - ANALOG_INPUT(GND, 0) - - OPAMP(AMP, "OPAMP(TYPE=1 FPF=5 RI=1M RO=50 UGF=1M SLEW=1M VLH=0.5 VLL=0.03 DAB=0.0015)") - RES(R1, RES_K(9.1)) - RES(R2, RES_K(91)) - RES(R3, RES_K(27)) - CAP(C1, CAP_U(0.0015)) - CAP(C2, CAP_P(680)) - CAP(C3, CAP_P(100)) - - NET_C(VPLUS, AMP.VCC) - NET_C(VMINUS, AMP.GND) - ALIAS(INPUT, R1.1) - ALIAS(OUTPUT, AMP.OUT) - NET_C(GND, C1.2) - - NET_C(GND, C3.2) - NET_C(R1.2, R2.1, C1.1) - NET_C(R2.2, R3.1, C2.1) - NET_C(R3.2, C3.1, AMP.PLUS) - NET_C(OUTPUT, C2.2, AMP.MINUS) -} - -static NETLIST_START(inverter) -{ - ANALOG_INPUT(I_V5, 5) - ANALOG_INPUT(GND, 0) - - TTL_7414_DIP(IC_L9) - - NET_C(GND, IC_L9.7) - NET_C(IC_L9.14, I_V5) - ALIAS(INPUT,IC_L9.1) - ALIAS(OUTPUT,IC_L9.2) - NET_C(IC_L9.4, GND) - NET_C(IC_L9.6, GND) - NET_C(IC_L9.8, GND) - NET_C(IC_L9.10, GND) - NET_C(IC_L9.12, GND) -} - -static NETLIST_START(fischio) -{ - ANALOG_INPUT(I_V5, 5) - ANALOG_INPUT(GND, 0) - - LOCAL_SOURCE(inverter) - SUBMODEL(NE556_DIP, IC_N9) - SUBMODEL(inverter, INV) - - TTL_74393_DIP(IC_M9) - - NET_C(IC_M9.7, GND) - NET_C(IC_M9.14, I_V5) - NET_C(IC_N9.7, GND) - NET_C(IC_N9.14, I_V5) - RES(R1, RES_K(6.8)) - RES(R2, RES_K(39)) - RES(R3, RES_K(100)) - RES(R4, RES_K(47)) - CAP(C42, CAP_U(4.2)) - CAP(C2, CAP_N(2.2)) - NET_C(IC_M9.6, INV.INPUT) - NET_C(IC_N9.4, INV.OUTPUT) - NET_C(IC_N9.10, INV.OUTPUT) - NET_C(I_V5, R1.1) - NET_C(I_V5, R2.1) - NET_C(R1.2, IC_N9.1, R3.1, IC_N9.2, IC_N9.6, C42.1) - NET_C(C42.2, GND) - NET_C(R3.2, R4.2, IC_N9.8, IC_N9.12, C2.1) - NET_C(R4.1, R2.2, IC_N9.13) - NET_C(C2.2, GND) - NET_C(IC_N9.5, IC_M9.1) // Counter tick - ALIAS(INPUT, IC_M9.2) // Counter CLEAR - NET_C(INPUT, IC_M9.12) - - NET_C(IC_M9.6, IC_M9.13) - HINT(IC_M9.3, NC) - HINT(IC_M9.4, NC) - HINT(IC_M9.5, NC) - HINT(IC_M9.8, NC) - HINT(IC_M9.9, NC) - HINT(IC_M9.10, NC) - HINT(IC_M9.11, NC) - // ALIAS(OUTPUT, IC_N9.9) - - RES(R0, 1) - NET_C(R0.1, IC_N9.9) - ALIAS(OUTPUT, R0.2) - - OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) -} - -static NETLIST_START(folla) -{ - ANALOG_INPUT(I_V5, 5) - ANALOG_INPUT(I_V12, 12) - ANALOG_INPUT(GND, 0) - - NET_C(GND, IC_E8.5, IC_C8.9, IC_C8.6, IC_C8.2, IC_C8.3, IC_8B.12, IC_8B.5, IC_8B.9, IC_7B.12, IC_7B.10, IC_7B.2, IC_7B.8) - NET_C(GND, IC_8B.4, IC_C8.5, IC_7B.8, IC_8B.10, IC_8B.13, IC_C8.10, IC_E8.4) - TTL_74LS164_DIP(IC_7A) - TTL_7414_DIP(IC_7B) - TTL_74LS164_DIP(IC_8A) - TTL_74LS86_DIP(IC_8B) - LM324_DIP(IC_C8) - TTL_7408_DIP(IC_E8) - NET_C(I_V5, IC_7A.14, IC_7B.14, IC_8A.14, IC_8B.14, IC_E8.14) - NET_C(I_V12, IC_C8.4) - NET_C(GND, IC_7A.7, IC_7B.7, IC_8A.7, IC_8B.7, IC_E8.7, IC_C8.11) - RES(R32, RES_K(1)) - RES(R33, RES_K(220 + ATTENUATE_FOLLA)) - RES(R34, RES_K(100 + ATTENUATE_FOLLA)) - RES(R35, RES_K(1)) - RES(R36, RES_K(56 + ATTENUATE_FOLLA)) - RES(R37, RES_K(10)) - RES(R47, RES_K(330)) - CAP(C20, CAP_N(100)) - CAP(C21, CAP_N(10)) - CAP(C22, CAP_N(22)) - CAP(C24, CAP_U(10)) - NET_C(IC_8B.1, IC_7B.4) - NET_C(IC_8B.2, IC_8A.3) - NET_C(IC_8B.3, IC_8A.1, IC_8A.2) - NET_C(IC_8A.9, IC_7A.9, I_V5) - NET_C(IC_8A.8, IC_7A.8, R32.1, IC_7B.6) - NET_C(IC_8A.13, IC_7A.1, IC_7A.2) - NET_C(IC_7A.12, IC_7B.3) - NET_C(R32.2, IC_7B.5, C20.2) - NET_C(C20.1, GND) - ALIAS(NOISE, IC_7A.13) - ALIAS(C_IN, IC_8A.8) - ALIAS(FOLLA_B, IC_E8.10) - ALIAS(FOLLA_M, IC_E8.12) - ALIAS(FOLLA_A, IC_E8.1) - NET_C(IC_E8.9, IC_E8.13, IC_E8.2, NOISE) - NET_C(IC_E8.8, R33.1) - NET_C(IC_E8.11, R34.1) - NET_C(IC_E8.3, R36.1) - NET_C(R35.1, GND) - NET_C(R33.2, R34.2, R35.2, R36.2, C22.1, C21.1) - NET_C(C21.2, R47.2, IC_C8.14) - - NET_C(R37.2, I_V5) - NET_C(C22.2, R47.1, IC_C8.13) - NET_C(R37.1, C24.2, IC_C8.12) - NET_C(C24.1, GND) - - // CONTRASTO - SUBMODEL(NE556_DIP, IC_Q9) - NET_C(IC_Q9.7, GND) - NET_C(IC_Q9.14, I_V5) - RES(R38, RES_M(1)) - RES(R39, RES_K(100)) - CAP(C23, CAP_U(0.1)) - CAP(C25, CAP_U(0.1)) - CAP(C26, CAP_U(0.47)) - NET_C(R38.1, I_V5) - NET_C(R39.1, I_V5) - NET_C(R38.2, IC_Q9.1, IC_Q9.2, C25.1) - NET_C(C25.2, C26.2, GND) - NET_C(R39.2, IC_Q9.13, IC_Q9.12, IC_Q9.8, C26.1) - NET_C(IC_Q9.5, IC_Q9.10) - NET_C(IC_Q9.9, C23.1) - NET_C(IC_Q9.4, I_V5) - ALIAS(CONTRASTO, IC_Q9.6) - ALIAS(CONT_OUT, C23.2) - NET_C(C23.2, R36.2) - - RES(R0, 1) - NET_C(R0.1, IC_C8.14) - ALIAS(OUTPUT, R0.2) - - OPTIMIZE_FRONTIER(R0.1, RES_M(100), 1) -} - -NETLIST_START(dribling) -{ - NET_MODEL("BC239C NPN(IS=1.5813E-15 ISE=4.637E-14 ISC=8.0864E-18 XTI=3 BF=113.32 BR=86.718 IKF=1.4907 IKR=0.03360 XTB=0 VAF=12.331 VAR=31.901 VJE=0.71518 VJC=1.1381 RE=0.22081 RC=0.01636 RB=1.0078 CJE=3.3904E-14 CJC=2.9774E-12 XCJC=0.02899 FC=0.99886 NF=1.0653 NR=1.8047 NE=1.4254 NC=1.8821 MJE=0.36824 MJC=0.31461 TF=2.0691E-11 TR=1.0033E-09 EG=1.11 IRB=0.00083992 RBM=0 XTF=0.31338 VTF=0.10174 ITF=0.0045579 PTF=0 CJS=0 MJS=0 VJS=0.75)") // )") - NET_MODEL("BC309 PNP(IS=1.0366E-15 ISE=1.6295E-14 ISC=9.4971E-17 XTI=3 BF=80 BR=16.116 IKF=0.47497 IKR=0.012081 XTB=0 VAF=8.486 VAR=9.5149 VJE=0.84456 VJC=1.0282 RE=1.9597 RC=1.1393 RB=3.2133 CJE=2.0636E-14 CJC=2.6904E-12 XCJC=0.075977 FC=0.54298 NF=1.03136 NR=1.2907 NE=1.3702 NC=1.038 MJE=0.68352 MJC=0.5401 TF=5.4303E-11 TR=3.4233E-10 EG=1.11 IRB=0.00046855 RBM=2.0822 XTF=0.27447 VTF=0.19311 ITF=0.0030573 PTF=0 CJS=0 VJS=0.75 MJS=0)") - - SOLVER(Solver, 1000) - PARAM(Solver.DYNAMIC_TS, 1) - PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 2e-5) - PARAM(Solver.NR_LOOPS, 300) - PARAM(Solver.GS_LOOPS, 10) - PARAM(Solver.PARALLEL, 2) // More does not help - - ANALOG_INPUT(I_V5, 5) - ANALOG_INPUT(I_V6, 6) - ANALOG_INPUT(I_V12, 12) - - - LOCAL_SOURCE(LM339) - LOCAL_SOURCE(calcio) - LOCAL_SOURCE(stop_palla) - LOCAL_SOURCE(parata) - LOCAL_SOURCE(output_filter) - LOCAL_SOURCE(fischio) - LOCAL_SOURCE(folla) - - // TOS Section - TTL_INPUT(I_PB0, 0) - TTL_INPUT(I_PB1, 0) - TTL_INPUT(I_PB2, 0) - TTL_INPUT(I_PB3, 0) - TTL_INPUT(I_PB4, 0) - TTL_INPUT(I_PB5, 0) - TTL_INPUT(I_PB6, 0) - TTL_INPUT(I_PB7, 0) - NET_C(GND, I_PB0.GND, I_PB1.GND, I_PB2.GND, I_PB3.GND, I_PB4.GND, I_PB5.GND, I_PB6.GND, I_PB7.GND) - NET_C(I_V5, I_PB0.VCC, I_PB1.VCC, I_PB2.VCC, I_PB3.VCC, I_PB4.VCC, I_PB5.VCC, I_PB6.VCC, I_PB7.VCC) - - LOCAL_SOURCE(inverter) - CLOCK(clk, 40000) // 40KHz - - NET_C(clk.VCC, I_V5) - NET_C(clk.GND, GND) - - SUBMODEL(inverter, INV1) - SUBMODEL(inverter, INV2) - SUBMODEL(inverter, INV3) - - CAP(C7_1, CAP_P(330)) - CAP(C7_2, CAP_P(330)) - TTL_74161_DIP(IC_D7) // 4 bit counter - TTL_74161_DIP(IC_E7) // same - TTL_74LS107_DIP(IC_C7) // dual JK flip flop - NET_C(GND, IC_C7.7, IC_D7.8, IC_E7.8, C7_1.2) - NET_C(I_V5, IC_C7.14, IC_D7.16, IC_E7.16) - NET_C(I_PB0, IC_D7.3) - NET_C(I_PB1, IC_D7.4) - NET_C(I_PB2, IC_D7.5) - NET_C(I_PB3, IC_D7.6) - NET_C(I_PB4, IC_E7.3) - NET_C(I_PB5, IC_E7.4) - NET_C(I_PB6, IC_E7.5) - NET_C(I_PB7, IC_E7.6) - NET_C(IC_E7.1, IC_D7.1, I_V5) // CLEAR FLAG - NET_C(IC_D7.7, IC_D7.10, I_V5) - NET_C(IC_E7.9, IC_D7.9, C7_1.1, INV1.OUTPUT) - NET_C(IC_D7.15, IC_E7.7, IC_E7.10) - NET_C(IC_E7.15, INV1.INPUT) - NET_C(INV2.OUTPUT, IC_E7.2, IC_D7.2) - NET_C(INV2.INPUT, C7_2.1, IC_C7.9, INV3.OUTPUT) - NET_C(GND, C7_2.2) - NET_C(INV3.INPUT, clk) - NET_C(IC_C7.10, I_V5) - NET_C(IC_C7.1, IC_C7.13, IC_C7.4, IC_C7.12, GND.Q) - NET_C(IC_C7.8, IC_E7.15) // FLIP-FLOP - NET_C(IC_C7.11, IC_E7.15) - ALIAS(TOS_OUTPUT, IC_C7.5) - - // FISCHIO - TTL_INPUT(I_FISCHIO, 0) - NET_C(GND, I_FISCHIO.GND) - NET_C(I_V5, I_FISCHIO.VCC) - SUBMODEL(fischio, FISCHIO) - NET_C(I_FISCHIO, FISCHIO.INPUT) - - // STOP_PALLA - TTL_INPUT(I_STOP_PALLA, 0) - NET_C(GND, I_STOP_PALLA.GND) - NET_C(I_V6, I_STOP_PALLA.VCC) - SUBMODEL(stop_palla, STOP_PALLA) - NET_C(STOP_PALLA.INPUT, I_STOP_PALLA) - - // PARATA - TTL_INPUT(I_PARATA, 0) - NET_C(GND, I_PARATA.GND) - NET_C(I_V6, I_PARATA.VCC) - SUBMODEL(parata, PARATA) - NET_C(PARATA.INPUT, I_PARATA) - - // CALCIO_A and CALCIO_B - TTL_INPUT(I_CALCIO_A, 0) - NET_C(GND, I_CALCIO_A.GND) - NET_C(I_V5, I_CALCIO_A.VCC) - TTL_INPUT(I_CALCIO_B, 0) - NET_C(GND, I_CALCIO_B.GND) - NET_C(I_V5, I_CALCIO_B.VCC) - SUBMODEL(calcio, CALCIO_A) - PARAM(CALCIO_A.CAP1, 22) - PARAM(CALCIO_A.CAP1, 47) - NET_C(I_CALCIO_A, CALCIO_A.INPUT) - SUBMODEL(calcio, CALCIO_B) - PARAM(CALCIO_B.CAP1, 33) - PARAM(CALCIO_B.CAP1, 68) - NET_C(I_CALCIO_B, CALCIO_B.INPUT) - - // FOLLA A, M, B - TTL_INPUT(I_FOLLA_A, 0) - TTL_INPUT(I_FOLLA_M, 0) - TTL_INPUT(I_FOLLA_B, 0) - TTL_INPUT(I_CONTRASTO, 0) - NET_C(GND, I_FOLLA_A.GND, I_FOLLA_M.GND, I_FOLLA_B.GND, I_CONTRASTO.GND) - NET_C(I_V5, I_FOLLA_A.VCC, I_FOLLA_M.VCC, I_FOLLA_B.VCC, I_CONTRASTO.VCC) - SUBMODEL(folla, FOLLA) - NET_C(FOLLA.FOLLA_A, I_FOLLA_A) - NET_C(FOLLA.FOLLA_M, I_FOLLA_M) - NET_C(FOLLA.FOLLA_B, I_FOLLA_B) - NET_C(FOLLA.CONTRASTO, I_CONTRASTO) - - // OUTPUT SECTION ---------------------- - // TOS - CAP(C_TOS, CAP_N(100)) - RES(R_TOS, RES_K(220)) - NET_C(TOS_OUTPUT, C_TOS.1) - NET_C(R_TOS.1, C_TOS.2) - - // FISCHIO - CAP(C_FISCHIO, CAP_N(1000)) - RES(R_FISCHIO, RES_K(220)) - NET_C(FISCHIO.OUTPUT, C_FISCHIO.1) - NET_C(R_FISCHIO.1, C_FISCHIO.2) - - // FOLLA - CAP(C_FOLLA, CAP_N(10)) - RES(R_FOLLA, RES_K(100)) - NET_C(FOLLA.OUTPUT, C_FOLLA.1) - NET_C(C_FOLLA.2, R_FOLLA.1) - - // CALCIO_A - CAP(C_CALCIO_A, CAP_U(1)) - RES(R_CALCIO_A, RES_K(10)) - NET_C(CALCIO_A.OUTPUT, C_CALCIO_A.1) - NET_C(C_CALCIO_A.2, R_CALCIO_A.1) - - // CALCIO_B - CAP(C_CALCIO_B, CAP_U(1)) - RES(R_CALCIO_B, RES_K(10)) - NET_C(CALCIO_B.OUTPUT, C_CALCIO_B.1) - NET_C(C_CALCIO_B.2, R_CALCIO_B.1) - - // STOP_PALLA - CAP(C_STOP_PALLA, CAP_U(1)) - RES(R_STOP_PALLA, RES_K(100)) - NET_C(STOP_PALLA.OUTPUT, C_STOP_PALLA.1) - NET_C(C_STOP_PALLA.2, R_STOP_PALLA.1) - - // PARATA - CAP(C_PARATA, CAP_U(1)) - RES(R_PARATA, RES_K(100)) - NET_C(PARATA.OUTPUT, C_PARATA.1) - NET_C(C_PARATA.2, R_PARATA.1) - - - - // FINAL MIX, DISABLE CIRCUITRY AND OUTPUT FILTER - TTL_INPUT(ENABLE_SOUND, 0) - NET_C(ENABLE_SOUND.VCC, I_V5) - NET_C(ENABLE_SOUND.GND, GND) - QBJT_EB(Q_OUT, "BC239C") - RES(R_OUT, RES_K(2.2)) - RES(R_PU_OUT, RES_K(10)) - NET_C(R_PU_OUT.1, I_V5) - NET_C(ENABLE_SOUND, R_OUT.1, R_PU_OUT.2) - NET_C(Q_OUT.B, R_OUT.2) - NET_C(Q_OUT.C, R_TOS.2, R_FISCHIO.2, R_FOLLA.2, R_CALCIO_A.2, R_CALCIO_B.2, R_STOP_PALLA.2, R_PARATA.2) - NET_C(Q_OUT.E, GND) - SUBMODEL(output_filter, OUTPUT_FILTER) - NET_C(OUTPUT_FILTER.INPUT, Q_OUT.C) - - ALIAS(OUTPUT, OUTPUT_FILTER.OUTPUT) -} diff --git a/src/mame/mr/nl_dribling.h b/src/mame/mr/nl_dribling.h deleted file mode 100644 index bf48dde146c..00000000000 --- a/src/mame/mr/nl_dribling.h +++ /dev/null @@ -1,10 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders: Enzo Lombardi -#ifndef MAME_MR_NL_DRIBLING_H -#define MAME_MR_NL_DRIBLING_H - -#include "netlist/nl_setup.h" - -NETLIST_EXTERNAL(dribling) - -#endif // MAME_MR_NL_DRIBLING_H diff --git a/src/mame/mr/sshot.cpp b/src/mame/mr/sshot.cpp deleted file mode 100644 index 05c4f29a28d..00000000000 --- a/src/mame/mr/sshot.cpp +++ /dev/null @@ -1,438 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Mariusz Wojcieszek -/* - -* Model Racing's Super Shot -* Model Racing's Gun Champ on Super Shot hardware - -Driver by Mariusz Wojcieszek - -TODO: -- Discrete sound - - -SUPER SHOT -Mainboard: - __________________________________________________________________________________________________________________________ -| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -| _ _ _ _ _ ____ ____ ____ ____ ____ ____ ____ ____ | -| | | | | | | | | | | | | | | | | | | | | | | | | | | | -|A |R| | | | | |C| |C| | | | | | | | | | | | | | | | | | -| | | |B| |B| | | | | | | | | | | | | | | | | | | | | | -| |_| | | | | |_| |_| |TMS | |TMS | |TMS | |TMS | |TMS | |TMS | |TMS | |TMS | | -| |_| |_| |2708| |2708| |2708| |2708| |2708| |2708| |2708| |2708| | -| |____| |____| |____| |____| |____| |____| |____| |____| | -| | -| | -| _ _____ _| -| | | |/853 | |_ -| |S| | | _ _ _| -| | | |INS80| | | | | _ _ _ ____ ____ _ _ _ _ _ -| -| |_| |60N | | | | | | | | | | | |SS | |SS | | | | | | | | | | | -| -|B | | |B| |B| |D| | | | | | A | | B | |E| | | | | |A| |A| -| -| |ISP-8| | | | | | | |B| |B| | | | | | | |B| |B| | | | | -| -| |A/600| |_| |_| |_| | | | | |TMS | |TMS | |_| | | | | |_| |_| -| -| |N | |_| |_| |2708| |2708| |_| |_| -| -| | | |____| |____| -| -| | | -| -| |_____| -| -| -| -| __________________ -| -| | | _ _ _ _ -| -| | | _ _ _ _ _ _ _ | | | | | | | | -| -| | EPOXY BLOCK | | | | | | | | | | | | | | | | | | | | | | | -| -| | | |Q| |J| |H| |K| |I| |H| |H| |F| |F| |F| |F| -| -|C| | | | | | | | | | | | | | | | | | | | | | | | -| -| |__________________| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ -| | -| | -| | -| _ _ | -| _ _ _ _ _ _ _ __ | | | | _ _ | -| | | | | | | | | | | | | _ _ | | | | | | | | | | | | | -| |M| |H| |N| |O| |P| |G| |L| |L| |D| |SW| |B| |B| |S| |S| | -|D | | | | | | | | | | | | |_| |_| | | | 1| | | | | | | | | | -| |_| |_| |_| |_| |_| |_| |_| |__| |_| |_| |_| |_| | -| | -| | -| | -|E CS 233 | -| | -| | -|__________________________________________________________________________________________________________________________| - - -A = MM2114N-3 L = NE555P -B = DM81LS97N M = DM7404N -C = 7921 2111A-2 N = DM7400N -D = DM74LS138N / NS82LS05N O = DM74LS32N -E = DM74166N P = DM80LS97N / DM74LS367N -F = SN74LS374N Q = DM74LS02N -G = DM74LS20N R = DM74LS175N -H = SN74LS161AN S = DM74LS14N -I = DM74LS04N -J = F7474PC -K = 74LS112PC - - - -EPOXY-BLOCK: -Component-Side: Solder Side: - _____________________ _____________________ -| _ _ _ _ | | D3918 | -| | | | | | | | | | | 5686 | -| | | | | | | | | | | | -| | | | | | | | | | | | -| |_| |_| |_| |_| | | | -|_____________________| |_____________________| - - -SW1: - _________________ -| DST08 ON | -|-----------------| -|| |#|#|#|#|#| | || -|-----------------| -||#| | | | | |#|#|| -|-----------------| -| 1 2 3 4 5 6 7 8 | -|_________________| - - -Soundboard: - ____________________________________________________________ -| | -| 7 6 5 4 3 2 1 | -| _ _ _ _ _ | A = SN7442AN -| | | | | | | | | | | | B = F-7404PC -| |F| |P| |A| |C| |Q| A | C = SN7405N -| | | | | | | | | | | | D = F 74132PC -| |_| |_| |_| |_| |_| | E = SN74393N -| | F = LM3900N -| _ _ _ _ _ | G = LM324N -| | | | | | | | | | | | H = SN7432N -| |G| |E| |B| |D| |O| B | I = NE 556N -| | | | | | | | | | | | J = SN7474N -| |_| |_| |_| |_| |_| | K = SN7400N -| | L = UA339PC -| _ _ _ _ | M = SN7410N -| | | | | | | | | | N = CA810Q -| |J| |I| |H| |E| C | O = 6331 -| | | | | | | | | | P = 6301 -| |_| |_| |_| |_| | Q = S50240 -| | -| _ _ _ _ | -| ______ | | | | | | | | | -| | N | |C| |B| |K| |I| D | -| |______| | | | | | | | | | -| |_| |_| |_| |_| | -| | -| _ _ _ | -| | | | | | | | -| |L| |M| |K| E | -| | | | | | | | -|MR model |_| |_| |_| | -| racing CS229 | -| __ __ | -|______________| |_|_|_|_|_|_|_|_|_|_|_|_|_| |_____________| - 1 22 - - - __________________I N S T R U C T I O N S _________________ -| | -| INSERT COIN(S) AND PRESS START BUTTON | -| | -| 1) THREE SPIRALLING BALLS SCORE FROM ... 100 TO 10 POINTS | -| 2) THE SEQUENCE OF GLASSES ................... 420 POINTS | -| 3) THE SEQUENCE OF LAMPS ..................... 440 POINTS | -| THE LAMPS AT THE CENTRE SCORE HIGHEST | -| 4) THE THREE FAST SPIRALLING BALLS SCORE ...... 80 POINTS | -| HITTING THE FIRST BALL SCORES 500 POINTS AND | -| GIVES THE GLASSES AND BOTTLE SEQUENCE. | -| HITTING THE SECOND BALL SCORES 240 POINTS AND | -| GIVES THE GLASS SEQUENCE AT INCREASED SPEED. | -|___________________________________________________________| - - -GUN CHAMP -Same PCB as Super Shot, but with gun hardware as 8080bw Gun Champ, no xy pots -Mainboard: CS249 -Soundboard: CS240 -Given CS numbers, this is released after the other Gun Champ - -*/ - -#include "emu.h" -#include "cpu/scmp/scmp.h" -#include "emupal.h" -#include "screen.h" -#include "tilemap.h" - -#include "gunchamps.lh" - - -namespace { - -class sshot_state : public driver_device -{ -public: - sshot_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_gfxdecode(*this, "gfxdecode"), - m_screen(*this, "screen"), - m_videoram(*this, "videoram") - { } - - void sshot(machine_config &config); - -private: - required_device m_maincpu; - required_device m_gfxdecode; - required_device m_screen; - - required_shared_ptr m_videoram; - tilemap_t *m_tilemap = nullptr; - - void sshot_vidram_w(offs_t offset, uint8_t data); - void sshot_output0_w(uint8_t data); - void sshot_output1_w(uint8_t data); - - TILE_GET_INFO_MEMBER(get_sshot_text_tile_info); - virtual void video_start() override ATTR_COLD; - uint32_t screen_update_sshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - - void sshot_map(address_map &map) ATTR_COLD; -}; - - -/************************************* - * - * Video - * - *************************************/ - -TILE_GET_INFO_MEMBER(sshot_state::get_sshot_text_tile_info) -{ - uint8_t code = m_videoram[tile_index]; - tileinfo.set(0, code, 0, 0); -} - -void sshot_state::video_start() -{ - m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sshot_state::get_sshot_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); -} - -uint32_t sshot_state::screen_update_sshot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_tilemap->draw(screen, bitmap, cliprect, 0, 0); - return 0; -} - -void sshot_state::sshot_vidram_w(offs_t offset, uint8_t data) -{ - m_videoram[offset] = data; - m_tilemap->mark_tile_dirty(offset); -} - - -/************************************* - * - * Outputs - * - *************************************/ - -void sshot_state::sshot_output0_w(uint8_t data) -{ - /* - bit signal description - - 0 12 EXPLOSIONE LAMP. DX - 1 13 RIMBALZO PALLINA (BALL BOUNCE) - 2 14 CONSENSO GIOCO (CONSENT GAME) - 3 16 VINCITA EXT. PLAY (WIN EXT. PLAY) - 4 n.c. - 5 n.c. - 6 n.c. - 7 H n.c. - */ -} - -void sshot_state::sshot_output1_w(uint8_t data) -{ - /* - bit signal description - - 0 5 ESPL. BICCHIERI E BOTTIGLIE (EXPLOSION GLASSES AND BOTTLES) - 1 F n.c. - 2 E APPARIZIONE BOTTIGLIE (APPEARANCE BOTTLES) - 3 4 MUSICA FINE GIOCO (END OF GAME MUSIC) - 4 S EXPANSIONE CERCHIO (EXPANSION CIRCLE) - 5 n.c. - 6 N EXPLOSIONE CERCHIO (CIRCLE EXPLOSION) - 7 11 SIBILO SPIRALE (PATHY SPIRAL) - */ -} - - -/************************************* - * - * Memory map - * - *************************************/ - -void sshot_state::sshot_map(address_map &map) -{ - map(0x0000, 0x1fff).rom(); - map(0x2000, 0x23ff).ram().w(FUNC(sshot_state::sshot_vidram_w)).share("videoram"); - map(0x4100, 0x41ff).ram(); - map(0x4200, 0x4200).portr("GUNX"); - map(0x4201, 0x4201).portr("GUNY"); - map(0x4202, 0x4202).portr("IN0"); - map(0x4203, 0x4203).portr("DSW"); - map(0x4206, 0x4206).w(FUNC(sshot_state::sshot_output0_w)); - map(0x4207, 0x4207).w(FUNC(sshot_state::sshot_output1_w)); -} - - -/************************************* - * - * Inputs - * - *************************************/ - -static INPUT_PORTS_START( sshot ) - PORT_START("GUNX") - PORT_BIT( 0xff, 0x7c, IPT_LIGHTGUN_X ) PORT_MINMAX(0x00, 0xf7) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_PLAYER(1) - - PORT_START("GUNY") - PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10) PORT_PLAYER(1) - - PORT_START("IN0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0xf4, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("DSW") - PORT_DIPUNUSED( 0x01, 0x00 ) - PORT_DIPUNUSED( 0x04, 0x00 ) - PORT_DIPNAME( 0x18, 0x10, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x00, "Invalid" ) - PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x10, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x18, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x20, 0x00, DEF_STR( Service_Mode ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPUNUSED( 0x40, 0x00 ) - PORT_DIPNAME( 0x82, 0x82, "Bonus Game" ) - PORT_DIPSETTING( 0x00, "Invalid" ) - PORT_DIPSETTING( 0x02, "910-1190" ) - PORT_DIPSETTING( 0x80, "1210-1590" ) - PORT_DIPSETTING( 0x82, "1510-1790" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( gunchamp ) - PORT_INCLUDE( sshot ) - - PORT_MODIFY("GUNX") // offset by 24 pixels - PORT_BIT( 0xfff, 0x94, IPT_LIGHTGUN_X ) PORT_MINMAX(0x18, 0x10f) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_PLAYER(1) - - PORT_MODIFY("DSW") - PORT_DIPUNUSED( 0x01, 0x00 ) - PORT_DIPUNUSED( 0x04, 0x00 ) - PORT_DIPNAME( 0x38, 0x08, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x38, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x30, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) ) -// PORT_DIPSETTING( 0x28, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x18, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) ) - PORT_DIPNAME( 0x42, 0x00, "High Score" ) - PORT_DIPSETTING( 0x00, "5000" ) - PORT_DIPSETTING( 0x40, "6000" ) - PORT_DIPSETTING( 0x02, "7000" ) - PORT_DIPSETTING( 0x42, "8000" ) - PORT_DIPNAME( 0x80, 0x00, "Enter Initials" ) - PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPSETTING( 0x80, DEF_STR( No ) ) -INPUT_PORTS_END - - -/************************************* - * - * Machine - * - *************************************/ - -static GFXDECODE_START( gfx_sshot ) - GFXDECODE_ENTRY( "gfx", 0, gfx_8x8x1, 0, 1 ) -GFXDECODE_END - -void sshot_state::sshot(machine_config &config) -{ - // basic machine hardware - INS8060(config, m_maincpu, 11.289_MHz_XTAL/8); - m_maincpu->set_addrmap(AS_PROGRAM, &sshot_state::sshot_map); - m_maincpu->sense_a().set(m_screen, FUNC(screen_device::vblank)); - - // video hardware - SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_refresh_hz(50); - m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); - m_screen->set_size(32*8, 32*8); - m_screen->set_visarea(0*8, 31*8-1, 0*8, 32*8-1); - m_screen->set_screen_update(FUNC(sshot_state::screen_update_sshot)); - m_screen->set_palette("palette"); - - GFXDECODE(config, m_gfxdecode, "palette", gfx_sshot); - PALETTE(config, "palette", palette_device::MONOCHROME); - - // sound hardware - //... -} - - -ROM_START( sshot ) - ROM_REGION( 0x2000, "maincpu", 0 ) - ROM_LOAD( "ss_1m.a6", 0x0000, 0x0400, CRC(9f1625db) SHA1(734156d9858d696ac1f00706ba7716e5f818a3c5) ) - ROM_LOAD( "ss_2m.a7", 0x0400, 0x0400, CRC(09f0295d) SHA1(7b4f996e9200fd178e295b1613aad8d10b19bc78) ) - ROM_LOAD( "ss_3m.a9", 0x0800, 0x0400, CRC(88b54d54) SHA1(4f6e792276f2615d4df1867fcdb0d18f55f72b3a) ) - ROM_LOAD( "ss_4m.a10", 0x0c00, 0x0400, CRC(14199f00) SHA1(2696a42f362b39b92c8e07e2a005e0d8e00f539d) ) - ROM_LOAD( "ss_5m.a11", 0x1000, 0x0400, CRC(e70eca76) SHA1(771ae15fd4b2663090386a4ec49575895c5bfed7) ) - ROM_LOAD( "ss_6m.a12", 0x1400, 0x0400, CRC(27683d93) SHA1(5e127186a215f4bdf1912ff9d85574165c2dcc93) ) - ROM_LOAD( "ss_7m.a13", 0x1800, 0x0400, CRC(650dada4) SHA1(8a4274792952b33b87ef7d160e1a1e038041761b) ) - ROM_LOAD( "ss_8m.a15", 0x1c00, 0x0400, CRC(32bc8424) SHA1(a7b75b2c0fe6ff80148e2ba62ac2ff59ed03e09a) ) - - ROM_REGION( 0x0800, "gfx", 0 ) - ROM_LOAD( "ss_a.b9", 0x0000, 0x0400, CRC(ad3413e0) SHA1(ea4c2728755fe52a00fdceddca0b641965045005) ) - ROM_LOAD( "ss_b.b10", 0x0400, 0x0400, CRC(ba70e619) SHA1(df39512de881df26ccc7fa74f6bae82d92cd9008) ) -ROM_END - -ROM_START( gunchamps ) - ROM_REGION( 0x2000, "maincpu", 0 ) - ROM_LOAD( "gc-1.a6", 0x0000, 0x0400, CRC(dcafc54b) SHA1(a83adbee5fc6125f90078e233af258120ae14a4d) ) - ROM_LOAD( "gc-2.a7", 0x0400, 0x0400, CRC(8b087128) SHA1(c49934dc29d24d94dda0a2b9d425abf1580a5038) ) - ROM_LOAD( "gc-3.a9", 0x0800, 0x0400, CRC(ca517d50) SHA1(ccb18b66070d02082a367ca78f9095395e997bdd) ) - ROM_LOAD( "gc-4.a10", 0x0c00, 0x0400, CRC(6a5b258c) SHA1(6a8349f4d785517877531100b3c30e02a54b98e2) ) - ROM_LOAD( "gc-5.a11", 0x1000, 0x0400, CRC(3f25c50d) SHA1(718687f421bf3ac2471b9cae7ff4514344912ef5) ) - ROM_LOAD( "gc-6.a12", 0x1400, 0x0400, CRC(85a62b89) SHA1(0a5dc97820f49a9100c99c129b4eebc649391a07) ) - ROM_LOAD( "gc-7.a13", 0x1800, 0x0400, CRC(0a6fde47) SHA1(cc596dd8c85701e1df0f513527125b006a7e1bd7) ) - - ROM_REGION( 0x0800, "gfx", 0 ) - ROM_LOAD( "gc-a.b9", 0x0000, 0x0400, CRC(c07f290e) SHA1(760ce12f4f5cadbd846d361c615f5026356a6fe2) ) - ROM_LOAD( "gc-b.b10", 0x0400, 0x0400, CRC(10ce709b) SHA1(e6f194aa26cd0e01ba0de3909948cc8595031d4d) ) - - ROM_REGION( 0x0120, "proms", 0 ) // proms on the sound board - ROM_LOAD( "snd82s129.a5", 0x0000, 0x0100, CRC(1d74dc30) SHA1(b956d8c6564cc3cc1b5f5f55b05ad4aa13f247e6) ) - ROM_LOAD( "snd82s23.b7", 0x0100, 0x0020, CRC(f4fa91d4) SHA1(0e0903532c8609c2d42491c2013647a42d13749a) ) -ROM_END - -} // anonymous namespace - - -GAME( 1979, sshot, 0, sshot, sshot, sshot_state, empty_init, ROT0, "Model Racing", "Super Shot", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) -GAMEL(1980, gunchamps, gunchamp, sshot, gunchamp, sshot_state, empty_init, ROT0, "Model Racing", "Gun Champ (newer, Super Shot hardware)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_gunchamps ) diff --git a/src/mame/mr/subhuntr.cpp b/src/mame/mr/subhuntr.cpp deleted file mode 100644 index ea4aad5bc36..00000000000 --- a/src/mame/mr/subhuntr.cpp +++ /dev/null @@ -1,388 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Vas Crabb -/* - -QTY Type clock position function -1x 2621 B8 Universal Sync Generator (PAL) -3x 2636 H5,L5,N5 Programmable Video Interface -1x 2650 OSC/2 = 1.7897725 MHz 8-bit Microprocessor - main -1x oscillator 3.579545 MHz - -ROMs -QTY Type position status -4x 2708 F7,H7,L7,N7 dumped -1x N82S115 B2 dumped - -RAMs -QTY Type position -4x 2112-2 G8,G9,H8,H9,L8,L9,M8,M9 -2x 2101-1 B4,C4 - -Video uses approximate PAL timings derived from a 3.579MHz crystal -using a 2621 USG (227 clocks per line, 43-clock HBLANK, 312 lines, -43-line VBLANK). This gives a resolution of 184*269, which is used for -the 2636 PVIs. The clock is doubled to 7.15MHz for the text layer, -giving a resolution of 368*269. Screen raw parameters are derived by -considering pixel/line zero to be the first period after the end of the -horizontal/vertical sync pulse. - -*/ - -#include "emu.h" - -#include "cpu/s2650/s2650.h" -#include "machine/s2636.h" - -#include "emupal.h" -#include "screen.h" -#include "speaker.h" -#include "tilemap.h" - - -namespace { - -class subhuntr_state : public driver_device -{ -public: - subhuntr_state(machine_config const &mconfig, device_type type, char const *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_screen(*this, "screen") - , m_pvi1_h5(*this, "pvi1") - , m_pvi2_l5(*this, "pvi2") - , m_pvi3_n5(*this, "pvi3") - , m_gfx(*this, "gfxdecode") - , m_txtram(*this, "txtram") - , m_intreq_cnf(*this, "JMP_1_7") - { - } - - void subhuntr(machine_config &config); - -protected: - virtual void machine_start() override ATTR_COLD; - virtual void machine_reset() override ATTR_COLD; - -private: - void txtram_w(offs_t offset, u8 data); - u8 intack_r(); - - void pvi1_intreq_w(int state); - void pvi2_intreq_w(int state); - void pvi3_intreq_w(int state); - - void palette_init(palette_device &palette) const; - u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, rectangle const &cliprect); - TILE_GET_INFO_MEMBER(tile_info); - TIMER_CALLBACK_MEMBER(video_callback); - - void set_intreq(unsigned bit, u8 mask); - void clr_intreq(unsigned bit); - - void subhuntr_map(address_map &map) ATTR_COLD; - - required_device m_maincpu; - required_device m_screen; - required_device m_pvi1_h5; - required_device m_pvi2_l5; - required_device m_pvi3_n5; - required_device m_gfx; - required_shared_ptr m_txtram; - - required_ioport m_intreq_cnf; - - u8 m_intreqs = 0; - - bitmap_ind16 m_bitmap; - emu_timer *m_video_timer = nullptr; - tilemap_t *m_tilemap = nullptr; -}; - - -/*************************************************************************** - - Machine implementation - -***************************************************************************/ - -void subhuntr_state::machine_start() -{ - m_video_timer = timer_alloc(FUNC(subhuntr_state::video_callback), this); - m_tilemap = &machine().tilemap().create(*m_gfx, tilemap_get_info_delegate(*this, FUNC(subhuntr_state::tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 8); - m_tilemap->set_transparent_pen(0); - - save_item(NAME(m_intreqs)); - - m_screen->register_screen_bitmap(m_bitmap); - - m_video_timer->adjust(m_screen->time_until_pos(1, 0)); -} - -void subhuntr_state::machine_reset() -{ -} - -void subhuntr_state::txtram_w(offs_t offset, u8 data) -{ - if (m_txtram[offset] != data) - { - m_txtram[offset] = data; - m_tilemap->mark_tile_dirty(offset); - } -} - -u8 subhuntr_state::intack_r() -{ - unsigned const source = count_leading_zeros_32(m_intreqs) - 24; - u8 const vector = ((m_intreq_cnf->read() & 0x01) ? 0x91 : 0x11) | (source << 1); - switch (source) - { - case 1: - m_pvi1_h5->write_intack(ASSERT_LINE); - m_pvi1_h5->write_intack(CLEAR_LINE); - break; - case 2: - m_pvi2_l5->write_intack(ASSERT_LINE); - m_pvi2_l5->write_intack(CLEAR_LINE); - break; - case 4: - m_pvi3_n5->write_intack(ASSERT_LINE); - m_pvi3_n5->write_intack(CLEAR_LINE); - break; - case 3: - case 5: - case 6: - clr_intreq(7 - source); - break; - } - return vector; -} - -void subhuntr_state::pvi1_intreq_w(int state) -{ - if (state) set_intreq(6, 0x02); - else clr_intreq(6); -} - -void subhuntr_state::pvi2_intreq_w(int state) -{ - if (state) set_intreq(5, 0x04); - else clr_intreq(5); -} - -void subhuntr_state::pvi3_intreq_w(int state) -{ - if (state) set_intreq(3, 0x08); - else clr_intreq(3); -} - -void subhuntr_state::palette_init(palette_device &palette) const -{ - palette.set_pen_color(0, 0x00, 0x00, 0x00); - palette.set_pen_color(1, 0x00, 0xff, 0x00); - palette.set_pen_color(2, 0x00, 0x00, 0x00); - palette.set_pen_color(3, 0x00, 0xff, 0xff); - palette.set_pen_color(4, 0x00, 0x00, 0x00); - palette.set_pen_color(5, 0xff, 0xff, 0x00); - palette.set_pen_color(6, 0x00, 0x00, 0x00); - palette.set_pen_color(7, 0xff, 0xff, 0xff); -} - -u32 subhuntr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, rectangle const &cliprect) -{ - copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); - return 0; -} - -TILE_GET_INFO_MEMBER(subhuntr_state::tile_info) -{ - u8 const tile = m_txtram[tile_index]; - u8 const code = tile & 0x3f; - u8 const colour = (tile >> 6) & 0x03; - tileinfo.set(0, code, colour, 0); -} - -TIMER_CALLBACK_MEMBER(subhuntr_state::video_callback) -{ - int const y = m_screen->vpos(); - - if (!y) - { - m_pvi1_h5->start_new_frame(); - m_pvi2_l5->start_new_frame(); - m_pvi3_n5->start_new_frame(); - } - m_pvi1_h5->render_next_line(); - m_pvi2_l5->render_next_line(); - m_pvi3_n5->render_next_line(); - - u16 const *src1 = &m_pvi1_h5->bitmap().pix(y); - u16 const *src2 = &m_pvi2_l5->bitmap().pix(y); - u16 const *src3 = &m_pvi3_n5->bitmap().pix(y); - u16 *dst = &m_bitmap.pix(y); - for (unsigned x = 0; x < m_bitmap.width(); x++, src1++, src2++, src3++, dst++) - { - u16 const pvi_val = S2636_PIXEL_COLOR(*src1 | *src2 | *src3); - *dst = pvi_val; - if (S2636_IS_PIXEL_DRAWN(*src1) && S2636_IS_PIXEL_DRAWN(*src2)) set_intreq(4, 0x10); - if (S2636_IS_PIXEL_DRAWN(*src1) && S2636_IS_PIXEL_DRAWN(*src3)) set_intreq(2, 0x20); - if (S2636_IS_PIXEL_DRAWN(*src2) && S2636_IS_PIXEL_DRAWN(*src3)) set_intreq(1, 0x40); - } - - m_video_timer->adjust(m_screen->time_until_pos(y + 1, 0)); -} - -void subhuntr_state::set_intreq(unsigned bit, u8 mask) -{ - u8 const shifted = ((m_intreq_cnf->read() & mask) ? 1U : 0U) << bit; - if (shifted & ~m_intreqs) - { - if (!m_intreqs) - m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); - m_intreqs |= shifted; - } -} - -void subhuntr_state::clr_intreq(unsigned bit) -{ - u8 const shifted = 1U << bit; - if (shifted & m_intreqs) - { - m_intreqs &= ~shifted; - if (!m_intreqs) - m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); - } -} - - -/*************************************************************************** - - Memory Maps, I/O - -***************************************************************************/ - -void subhuntr_state::subhuntr_map(address_map &map) -{ - map.global_mask(0x1fff); - map.unmap_value_high(); - - map(0x0000, 0x0fff).rom(); - map(0x1000, 0x10ff).mirror(0x0100).ram(); // G8/G9 - map(0x1200, 0x12ff).mirror(0x0100).ram(); // H8/H9 - map(0x1400, 0x14ff).mirror(0x0100).ram(); // L8/L9 - map(0x1600, 0x16ff).mirror(0x0100).ram(); // M8/M9 - map(0x1800, 0x18ff).mirror(0x0100).w(FUNC(subhuntr_state::txtram_w)).share(m_txtram); // B4/C4 - map(0x1b00, 0x1bff).rw(m_pvi3_n5, FUNC(s2636_device::read_data), FUNC(s2636_device::write_data)); - map(0x1d00, 0x1dff).rw(m_pvi2_l5, FUNC(s2636_device::read_data), FUNC(s2636_device::write_data)); - // Some kind of I/O at 1e00-1eff (enabled by PVI1 CE2) - map(0x1f00, 0x1fff).rw(m_pvi1_h5, FUNC(s2636_device::read_data), FUNC(s2636_device::write_data)); -} - - -/*************************************************************************** - - Inputs - -***************************************************************************/ - -static INPUT_PORTS_START( subhuntr ) - - // Factory jumpers controlling interrupt masking - PORT_START("JMP_1_7") - PORT_CONFNAME(0x01, 0x00, "JMP1") // interrupt vector MSB select (indirect bit) - PORT_CONFSETTING(0x00, DEF_STR(Off)) - PORT_CONFSETTING(0x01, DEF_STR(On)) - PORT_CONFNAME(0x02, 0x02, "JMP2") // PVI1 VBLANK/completion interrupt enable - PORT_CONFSETTING(0x00, DEF_STR(Off)) - PORT_CONFSETTING(0x02, DEF_STR(On)) - PORT_CONFNAME(0x04, 0x04, "JMP3") // PVI2 VBLANK/completion interrupt enable - PORT_CONFSETTING(0x00, DEF_STR(Off)) - PORT_CONFSETTING(0x04, DEF_STR(On)) - PORT_CONFNAME(0x08, 0x08, "JMP4") // PVI3 VBLANK/completion interrupt enable - PORT_CONFSETTING(0x00, DEF_STR(Off)) - PORT_CONFSETTING(0x08, DEF_STR(On)) - PORT_CONFNAME(0x10, 0x10, "JMP5") // PVI1/PVI2 collision interrupt enable - PORT_CONFSETTING(0x00, DEF_STR(Off)) - PORT_CONFSETTING(0x10, DEF_STR(On)) - PORT_CONFNAME(0x20, 0x20, "JMP6") // PVI1/PVI3 collision interrupt enable - PORT_CONFSETTING(0x00, DEF_STR(Off)) - PORT_CONFSETTING(0x20, DEF_STR(On)) - PORT_CONFNAME(0x40, 0x40, "JMP7") // PVI2/PVI3 collision interrupt enable - PORT_CONFSETTING(0x00, DEF_STR(Off)); - PORT_CONFSETTING(0x40, DEF_STR(On)); - -INPUT_PORTS_END - - -/*************************************************************************** - - Machine Config/Interface - -***************************************************************************/ - -static const gfx_layout tiles8x8_layout = -{ - 8,8, - RGN_FRAC(1,1), - 1, - { 0 }, - { 7, 6, 5, 4, 3, 2, 1, 0 }, - { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8 }, - 8*8 -}; - -static GFXDECODE_START( gfx_subhuntr ) - GFXDECODE_ENTRY("gfx1", 0, tiles8x8_layout, 0, 4) -GFXDECODE_END - - -void subhuntr_state::subhuntr(machine_config &config) -{ - S2650(config, m_maincpu, 3.579545_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &subhuntr_state::subhuntr_map); - m_maincpu->sense_handler().set(m_screen, FUNC(screen_device::vblank)); - m_maincpu->intack_handler().set(FUNC(subhuntr_state::intack_r)); - - S2636(config, m_pvi1_h5, 3.579545_MHz_XTAL); - m_pvi1_h5->set_divider(2); - m_pvi1_h5->intreq_cb().set(FUNC(subhuntr_state::pvi1_intreq_w)); - - S2636(config, m_pvi2_l5, 3.579545_MHz_XTAL); - m_pvi2_l5->set_divider(2); - m_pvi2_l5->intreq_cb().set(FUNC(subhuntr_state::pvi2_intreq_w)); - - S2636(config, m_pvi3_n5, 3.579545_MHz_XTAL); - m_pvi3_n5->set_divider(2); - m_pvi3_n5->intreq_cb().set(FUNC(subhuntr_state::pvi3_intreq_w)); - - SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_raw(3.579545_MHz_XTAL*2, 227*2, 21*2, 205*2, 312, 29, 298); - m_screen->set_palette("palette"); - m_screen->set_screen_update(FUNC(subhuntr_state::screen_update)); - - GFXDECODE(config, m_gfx, "txtpal", gfx_subhuntr); - - PALETTE(config, "palette", palette_device::RGB_3BIT); - PALETTE(config, "txtpal", FUNC(subhuntr_state::palette_init), 8); - - SPEAKER(config, "mono").front_center(); -} - - - -/******************************************************************************/ - -ROM_START( subhuntr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mr21.f7", 0x0000, 0x0400, CRC(27847939) SHA1(e6b41b511fefac1e1e207eff2dac8c2963d47c5c) ) - ROM_LOAD( "mr22.g7", 0x0400, 0x0400, CRC(e9af1ee8) SHA1(451e88407a120444377a58b06b65152c57503533) ) - ROM_LOAD( "mr25.l7", 0x0800, 0x0400, CRC(8271c975) SHA1(c7192658b50d781ab1b94c2e8cb75c5be3539820) ) - ROM_LOAD( "mr24.n7", 0x0c00, 0x0400, CRC(385c4944) SHA1(84050b0356c9a3a36528dba768f2684e28c6c7c4) ) - - ROM_REGION( 0x0200, "gfx1", 0 ) - ROM_LOAD( "82s115.b2", 0x0000, 0x0200, CRC(6946c9de) SHA1(956b4bebe6960a73609deb75e1493c4127fd7f77) ) -ROM_END - -} // anonymous namespace - -GAME(1979, subhuntr, 0, subhuntr, subhuntr, subhuntr_state, empty_init, ROT0, "Model Racing", "Sub Hunter (Model Racing)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff --git a/src/mame/nl.flt b/src/mame/nl.flt index 0ac39331a85..726985cbe67 100644 --- a/src/mame/nl.flt +++ b/src/mame/nl.flt @@ -11,7 +11,7 @@ irem/m62.cpp jpm/jpmsru.cpp midway/sspeedr.cpp misc/cocoloco.cpp -mr/dribling.cpp +modelracing/dribling.cpp nintendo/mario.cpp nintendo/popeye.cpp ramtek/starcrus.cpp -- cgit v1.2.3