From dbb9974476f1063b0f9bc8f3154a16ccd90e5053 Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 30 Oct 2024 20:54:02 +0100 Subject: quickpick5: split classes, fix sprite priority --- src/mame/konami/quickpick5.cpp | 286 +++++++++++++++++++++++------------------ src/mame/namco/namcos23.cpp | 4 +- 2 files changed, 162 insertions(+), 128 deletions(-) diff --git a/src/mame/konami/quickpick5.cpp b/src/mame/konami/quickpick5.cpp index c2e7369b5d3..aa26064f8d9 100644 --- a/src/mame/konami/quickpick5.cpp +++ b/src/mame/konami/quickpick5.cpp @@ -42,42 +42,37 @@ namespace { -class quickpick5_state : public driver_device +class waijockey_state : public driver_device { public: - quickpick5_state(const machine_config &mconfig, device_type type, const char *tag) : + waijockey_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_palette(*this, "palette"), - m_k053245(*this, "k053245"), - m_k051649(*this, "k051649"), - m_k053252(*this, "k053252"), m_bank(*this, "bank"), m_vram_view(*this, "vram_view"), m_vram(*this, "vram"), m_ttlrom(*this, "ttl"), + m_hopper(*this, "hopper"), + m_k053245(*this, "k053245"), + m_k051649(*this, "k051649"), + m_k053252(*this, "k053252"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), m_gfxdecode(*this, "gfxdecode"), - m_oki(*this, "oki"), - m_outport(*this, "OUT"), - m_sio_ports(*this, "SIO%u", 1U), - m_ttlrom_offset(0) + m_oki(*this, "oki") { } - void quickpick5(machine_config &config); void waijockey(machine_config &config); - int serial_io_r(); - protected: virtual void machine_start() override ATTR_COLD; virtual void machine_reset() override ATTR_COLD; virtual void video_start() override ATTR_COLD; -private: - u32 screen_update_quickpick5(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - K05324X_CB_MEMBER(sprite_callback); - TILE_GET_INFO_MEMBER(ttl_get_tile_info); + K05324X_CB_MEMBER(sprite_callback) { *priority = ~*color >> 4 & 2; } + virtual TILE_GET_INFO_MEMBER(ttl_get_tile_info); void ccu_int_time_w(u8 data); TIMER_DEVICE_CALLBACK_MEMBER(scanline); @@ -93,39 +88,66 @@ private: void control_w(u8 data); u8 ttlrom_r(offs_t offset); void vram_w(offs_t offset, u8 data); + template void scrollx_w(u8 data); - void serial_io_w(u8 data); - void out_w(u8 data); + virtual void out_w(u8 data); void common_map(address_map &map) ATTR_COLD; - void quickpick5_main(address_map &map) ATTR_COLD; void waijockey_main(address_map &map) ATTR_COLD; required_device m_maincpu; - required_device m_palette; - required_device m_k053245; - required_device m_k051649; - required_device m_k053252; - optional_memory_bank m_bank; + required_memory_bank m_bank; memory_view m_vram_view; required_shared_ptr m_vram; required_region_ptr m_ttlrom; + required_device m_hopper; + required_device m_k053245; + required_device m_k051649; + required_device m_k053252; + required_device m_screen; + required_device m_palette; required_device m_gfxdecode; required_device m_oki; - required_ioport m_outport; - optional_ioport_array<3> m_sio_ports; - int m_ttl_gfx_index; - tilemap_t *m_ttl_tilemap; - u8 m_control; - int m_ttlrom_offset; - bool m_title_hack; - int m_ccu_int_time, m_ccu_int_time_count; + int m_ttl_gfx_index = 0; + tilemap_t *m_ttl_tilemap; + u8 m_control = 0; + u16 m_scrollx = 0; + int m_ttlrom_offset = 0; + int m_ccu_int_time = 0; + int m_ccu_int_time_count = 0; +}; - u16 m_sio_out, m_sio_in0, m_sio_in1; - u8 m_sio_prev; +class quickpick5_state : public waijockey_state +{ +public: + quickpick5_state(const machine_config &mconfig, device_type type, const char *tag) : + waijockey_state(mconfig, type, tag), + m_sio_ports(*this, "SIO%u", 1U) + { } + + int serial_io_r() { return BIT(m_sio_out, 0); } + + void quickpick5(machine_config &config); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + + virtual TILE_GET_INFO_MEMBER(ttl_get_tile_info) override; + virtual void out_w(u8 data) override; + +private: + void quickpick5_main(address_map &map) ATTR_COLD; + + void serial_io_w(u8 data); + + optional_ioport_array<3> m_sio_ports; + u16 m_sio_out = 0, m_sio_in0 = 0, m_sio_in1 = 0; + u8 m_sio_prev = 0; }; + void quickpick5_state::serial_io_w(u8 data) { // bit 7 - coin counter OUT @@ -160,39 +182,36 @@ void quickpick5_state::serial_io_w(u8 data) m_sio_prev = data; } -int quickpick5_state::serial_io_r() +void waijockey_state::out_w(u8 data) { - return BIT(m_sio_out, 0); + /* + bit 6 - ??? (toggle all the time) + Bit 3 - coin counter In + Bit 2 - lock medal + Bit 1 - ??? + Bit 0 - hopper + */ + m_hopper->motor_w(BIT(data, 0)); } void quickpick5_state::out_w(u8 data) { /* - quickpick5: bit 7 - patlite? bit 1 - hopper bit 0 - ~coin blocker - - waijokey: - bit 6 - ??? (toggle all the time) - Bit 3 - coin counter In - Bit 2 - lock medal - Bit 1 - ??? - Bit 0 - hopper - - should be split into 2 handlers later */ - m_outport->write(data); + m_hopper->motor_w(BIT(data, 1)); } -void quickpick5_state::ccu_int_time_w(u8 data) +void waijockey_state::ccu_int_time_w(u8 data) { if (m_ccu_int_time != data) logerror("ccu_int_time rewritten with value of %02x\n", data); m_ccu_int_time = data; } -void quickpick5_state::control_w(u8 data) +void waijockey_state::control_w(u8 data) { m_bank->set_entry(data & 0x1); if (((m_control & 0x60) != 0x60) && ((data & 0x60) == 0x60)) @@ -209,7 +228,7 @@ void quickpick5_state::control_w(u8 data) m_vram_view.select(0); // VRAM } -u8 quickpick5_state::ttlrom_r(offs_t offset) +u8 waijockey_state::ttlrom_r(offs_t offset) { u8 ret = m_ttlrom[m_ttlrom_offset]; @@ -219,13 +238,22 @@ u8 quickpick5_state::ttlrom_r(offs_t offset) return ret; } -void quickpick5_state::vram_w(offs_t offset, u8 data) +void waijockey_state::vram_w(offs_t offset, u8 data) { m_vram[offset] = data; m_ttl_tilemap->mark_tile_dirty(offset >> 1); } -void quickpick5_state::video_start() +template +void waijockey_state::scrollx_w(u8 data) +{ + const u8 shift = N * 8; + m_scrollx = (m_scrollx & ~(0xff << shift)) | (data << shift); + + m_ttl_tilemap->set_scrollx(m_scrollx + 104); +} + +void waijockey_state::video_start() { static const gfx_layout charlayout = { @@ -251,9 +279,8 @@ void quickpick5_state::video_start() m_gfxdecode->set_gfx(gfx_index, std::make_unique(m_palette, charlayout, memregion("ttl")->base(), 0, m_palette->entries() / 16, 0)); m_ttl_gfx_index = gfx_index; - m_ttl_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(quickpick5_state::ttl_get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_ttl_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(waijockey_state::ttl_get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); m_ttl_tilemap->set_transparent_pen(0); - m_ttl_tilemap->set_scrollx(80); m_ttl_tilemap->set_scrolly(28); m_ttlrom_offset = 0; @@ -261,47 +288,40 @@ void quickpick5_state::video_start() m_ccu_int_time = 20; } +TILE_GET_INFO_MEMBER(waijockey_state::ttl_get_tile_info) +{ + int attr = m_vram[tile_index << 1 | 1]; + int code = m_vram[tile_index << 1] | (attr & 0xf) << 8; + int color = attr >> 4 & 0xf; + + tileinfo.set(m_ttl_gfx_index, code, color, 0); +} + TILE_GET_INFO_MEMBER(quickpick5_state::ttl_get_tile_info) { - int attr = m_vram[BYTE_XOR_LE((tile_index << 1) + 1)]; - int code = m_vram[BYTE_XOR_LE((tile_index << 1))] | ((attr & 0xf) << 8); - attr = attr >> 3 & ~1; + int attr = m_vram[tile_index << 1 | 1]; + int code = m_vram[tile_index << 1] | (attr & 0xf) << 8; + int color = attr >> 3 & 0x1e; - tileinfo.set(m_ttl_gfx_index, code, attr, 0); + tileinfo.set(m_ttl_gfx_index, code, color, 0); } -u32 quickpick5_state::screen_update_quickpick5(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 waijockey_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { bitmap.fill(0, cliprect); screen.priority().fill(0, cliprect); - m_title_hack = false; + m_ttl_tilemap->draw(screen, bitmap, cliprect, 0, 1); m_k053245->sprites_draw(bitmap, cliprect, screen.priority()); - if (!m_title_hack) - { - m_ttl_tilemap->draw(screen, bitmap, cliprect, 0, 0xff); - } - return 0; } -K05324X_CB_MEMBER(quickpick5_state::sprite_callback) -{ - *code = (*code & 0x7ff); - *color = (*color & 0x003f); - - if (*code == 0x520) - { - m_title_hack = true; - } -} - -TIMER_DEVICE_CALLBACK_MEMBER(quickpick5_state::scanline) +TIMER_DEVICE_CALLBACK_MEMBER(waijockey_state::scanline) { int scanline = param; // z80 /IRQ is connected to the IRQ1(vblank) pin of k053252 CCU - if(scanline == 255) + if (scanline == 255) { m_maincpu->set_input_line(0, ASSERT_LINE); } @@ -317,45 +337,45 @@ TIMER_DEVICE_CALLBACK_MEMBER(quickpick5_state::scanline) } } -void quickpick5_state::common_map(address_map &map) +void waijockey_state::common_map(address_map &map) { map(0x0000, 0x7fff).rom().region("maincpu", 0); map(0x8000, 0xbfff).bankr(m_bank); map(0xc000, 0xdbff).ram().share("nvram"); map(0xdc00, 0xdc0f).rw(m_k053252, FUNC(k053252_device::read), FUNC(k053252_device::write)); - map(0xdc40, 0xdc4f).rw(FUNC(quickpick5_state::k244_r), FUNC(quickpick5_state::k244_w)); + map(0xdc40, 0xdc4f).rw(FUNC(waijockey_state::k244_r), FUNC(waijockey_state::k244_w)); map(0xdc80, 0xdc80).portr("DSW1"); map(0xdc81, 0xdc81).portr("DSW2"); map(0xdcc0, 0xdcc0).portr("IN1"); map(0xdcc1, 0xdcc1).portr("IN2"); map(0xdd00, 0xdd00).nopw(); map(0xdd40, 0xdd40).portr("IN3"); - map(0xdd80, 0xdd80).w(FUNC(quickpick5_state::control_w)); + map(0xdd80, 0xdd80).w(FUNC(waijockey_state::control_w)); + map(0xde00, 0xde00).w(FUNC(waijockey_state::out_w)); map(0xde40, 0xde40).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0xe000, 0xefff).view(m_vram_view); - m_vram_view[0](0xe000, 0xefff).ram().w(FUNC(quickpick5_state::vram_w)).share(m_vram); + m_vram_view[0](0xe000, 0xefff).ram().w(FUNC(waijockey_state::vram_w)).share(m_vram); m_vram_view[1](0xe000, 0xe0ff).mirror(0x0f00).m(m_k051649, FUNC(k051649_device::scc_map)); - m_vram_view[2](0xe000, 0xe000).mirror(0x0fff).r(FUNC(quickpick5_state::ttlrom_r)); + m_vram_view[2](0xe000, 0xe000).mirror(0x0fff).r(FUNC(waijockey_state::ttlrom_r)); map(0xf000, 0xf7ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette"); - map(0xf800, 0xffff).rw(FUNC(quickpick5_state::k245_r), FUNC(quickpick5_state::k245_w)); + map(0xf800, 0xffff).rw(FUNC(waijockey_state::k245_r), FUNC(waijockey_state::k245_w)); } void quickpick5_state::quickpick5_main(address_map &map) { common_map(map); map(0xddc0, 0xddc0).w(FUNC(quickpick5_state::serial_io_w)); - map(0xde00, 0xde00).w(FUNC(quickpick5_state::out_w)); } -void quickpick5_state::waijockey_main(address_map &map) +void waijockey_state::waijockey_main(address_map &map) { common_map(map); map(0xdd41, 0xdd41).nopr(); // DSW3? map(0xddc0, 0xddc0).nopw(); // bit 6 - coin counter OUT - map(0xde00, 0xde00).w(FUNC(quickpick5_state::out_w)); - //map(0xde80, 0xdfff).nopw(); + map(0xde80, 0xde80).w(FUNC(waijockey_state::scrollx_w<0>)); + map(0xdec0, 0xdec0).w(FUNC(waijockey_state::scrollx_w<1>)); } static INPUT_PORTS_START( quickpick5 ) @@ -463,9 +483,6 @@ static INPUT_PORTS_START( quickpick5 ) PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_GAMBLE_D_UP) PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_START1) PORT_BIT(0x500, IP_ACTIVE_HIGH, IPT_UNKNOWN) - - PORT_START("OUT") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::motor_w)) INPUT_PORTS_END // Control panel buttons layout: @@ -530,25 +547,29 @@ static INPUT_PORTS_START( waijockey ) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x60, IP_ACTIVE_LOW, IPT_UNUSED) // battery sensor PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen") // guess - - PORT_START("OUT") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::motor_w)) INPUT_PORTS_END -void quickpick5_state::machine_start() +void waijockey_state::machine_start() { m_bank->configure_entries(0, 0x2, memregion("maincpu")->base()+0x8000, 0x4000); save_item(NAME(m_control)); + save_item(NAME(m_scrollx)); save_item(NAME(m_ccu_int_time)); save_item(NAME(m_ccu_int_time_count)); +} + +void quickpick5_state::machine_start() +{ + waijockey_state::machine_start(); + save_item(NAME(m_sio_out)); save_item(NAME(m_sio_in0)); save_item(NAME(m_sio_in1)); save_item(NAME(m_sio_prev)); } -void quickpick5_state::machine_reset() +void waijockey_state::machine_reset() { m_bank->set_entry(0); m_vram_view.select(0); @@ -556,45 +577,55 @@ void quickpick5_state::machine_reset() m_control = 0; m_ccu_int_time = 0; m_ccu_int_time_count = 0; +} + +void quickpick5_state::machine_reset() +{ + waijockey_state::machine_reset(); + m_sio_out = m_sio_in0 = m_sio_in1 = 0; m_sio_prev = 0; + + m_ttl_tilemap->set_scrollx(80); } -void quickpick5_state::quickpick5(machine_config &config) +void waijockey_state::waijockey(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware Z80(config, m_maincpu, XTAL(32'000'000)/4); // z84c0008pec 8mhz part, 32Mhz xtal verified on PCB, divisor unknown - m_maincpu->set_addrmap(AS_PROGRAM, &quickpick5_state::quickpick5_main); - TIMER(config, "scantimer").configure_scanline(FUNC(quickpick5_state::scanline), "screen", 0, 1); - HOPPER(config, "hopper", attotime::from_msec(100)); - - K053252(config, m_k053252, XTAL(32'000'000)/4); /* K053252, xtal verified, divider not verified */ - m_k053252->int1_ack().set(FUNC(quickpick5_state::vbl_ack_w)); - m_k053252->int2_ack().set(FUNC(quickpick5_state::nmi_ack_w)); - m_k053252->int_time().set(FUNC(quickpick5_state::ccu_int_time_w)); - - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(59.62); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(20)); - screen.set_size(64*8, 33*8); - screen.set_visarea(88, 456-1, 28, 256-1); - screen.set_screen_update(FUNC(quickpick5_state::screen_update_quickpick5)); - screen.set_palette(m_palette); + m_maincpu->set_addrmap(AS_PROGRAM, &waijockey_state::waijockey_main); + TIMER(config, "scantimer").configure_scanline(FUNC(waijockey_state::scanline), "screen", 0, 1); + + K053252(config, m_k053252, XTAL(32'000'000)/4); // K053252, xtal verified, divider not verified + m_k053252->int1_ack().set(FUNC(waijockey_state::vbl_ack_w)); + m_k053252->int2_ack().set(FUNC(waijockey_state::nmi_ack_w)); + m_k053252->int_time().set(FUNC(waijockey_state::ccu_int_time_w)); + + HOPPER(config, m_hopper, attotime::from_msec(100)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + // video hardware + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(61.04); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(20)); + m_screen->set_size(64*8, 33*8); + m_screen->set_visarea(0, 400-1, 0, 226-1); + m_screen->set_visarea_full(); + m_screen->set_screen_update(FUNC(waijockey_state::screen_update)); + m_screen->set_palette(m_palette); PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 1024); m_palette->enable_shadows(); K053245(config, m_k053245, 0); m_k053245->set_palette(m_palette); - m_k053245->set_offsets(-(44+80), 20); - m_k053245->set_sprite_callback(FUNC(quickpick5_state::sprite_callback)); + m_k053245->set_offsets(-96, 16); + m_k053245->set_sprite_callback(FUNC(waijockey_state::sprite_callback)); GFXDECODE(config, m_gfxdecode, m_palette, gfxdecode_device::empty); - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); K051649(config, m_k051649, XTAL(32'000'000)/9); // xtal is verified, divider is not m_k051649->add_route(ALL_OUTPUTS, "mono", 0.45); @@ -603,10 +634,13 @@ void quickpick5_state::quickpick5(machine_config &config) m_oki->add_route(ALL_OUTPUTS, "mono", 1.0); } -void quickpick5_state::waijockey(machine_config &config) +void quickpick5_state::quickpick5(machine_config &config) { - quickpick5(config); - m_maincpu->set_addrmap(AS_PROGRAM, &quickpick5_state::waijockey_main); + waijockey(config); + m_maincpu->set_addrmap(AS_PROGRAM, &quickpick5_state::quickpick5_main); + + m_k053245->set_offsets(-(44+80), 20); + m_screen->set_visarea(0, 384-1, 0, 232-1); } @@ -653,5 +687,5 @@ ROM_END } // anonymous namespace -GAME( 1991, quickp5, 0, quickpick5, quickpick5, quickpick5_state, empty_init, ROT0, "Konami", "Quick Pick 5", MACHINE_IMPERFECT_GRAPHICS) -GAME( 1993, waijockey, 0, waijockey, waijockey, quickpick5_state, empty_init, ROT0, "Konami", "Wai Wai Jockey", MACHINE_NOT_WORKING) // works but not playable due to bad gfx +GAME( 1991, quickp5, 0, quickpick5, quickpick5, quickpick5_state, empty_init, ROT0, "Konami", "Quick Pick 5", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS) +GAME( 1993, waijockey, 0, waijockey, waijockey, waijockey_state, empty_init, ROT0, "Konami", "Wai Wai Jockey", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING) // problem with nvram diff --git a/src/mame/namco/namcos23.cpp b/src/mame/namco/namcos23.cpp index b795689824b..afea5a47b74 100644 --- a/src/mame/namco/namcos23.cpp +++ b/src/mame/namco/namcos23.cpp @@ -1328,11 +1328,11 @@ namespace #define C352DIV (288) #define PIXEL_CLOCK (51.2_MHz_XTAL/4*2) - + #define HTOTAL (814) #define HBEND (0) #define HBSTART (640) - + #define VTOTAL (525) #define VBEND (0) #define VBSTART (480) -- cgit v1.2.3