From 7c7bab4dd0f7aecac4934b46fba18dd6c67d195f Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Wed, 16 Mar 2022 18:02:37 +0100 Subject: [PATCH] fastlane.cpp, flkatck.cpp: used finders and arrays where applicable, other minor cleanups --- scripts/target/mame/arcade.lua | 4 - src/mame/drivers/fastlane.cpp | 332 +++++++++++++++++++++------- src/mame/drivers/flkatck.cpp | 393 ++++++++++++++++++++++++++------- src/mame/includes/fastlane.h | 84 ------- src/mame/includes/flkatck.h | 78 ------- src/mame/video/fastlane.cpp | 148 ------------- src/mame/video/flkatck.cpp | 160 -------------- 7 files changed, 562 insertions(+), 637 deletions(-) delete mode 100644 src/mame/includes/fastlane.h delete mode 100644 src/mame/includes/flkatck.h delete mode 100644 src/mame/video/fastlane.cpp delete mode 100644 src/mame/video/flkatck.cpp diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index c16d53b9587..4444d667af3 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -2464,8 +2464,6 @@ files { MAME_DIR .. "src/mame/includes/fastfred.h", MAME_DIR .. "src/mame/video/fastfred.cpp", MAME_DIR .. "src/mame/drivers/fastlane.cpp", - MAME_DIR .. "src/mame/includes/fastlane.h", - MAME_DIR .. "src/mame/video/fastlane.cpp", MAME_DIR .. "src/mame/drivers/finalizr.cpp", MAME_DIR .. "src/mame/includes/finalizr.h", MAME_DIR .. "src/mame/video/finalizr.cpp", @@ -2473,8 +2471,6 @@ files { MAME_DIR .. "src/mame/machine/midikbd.cpp", MAME_DIR .. "src/mame/machine/midikbd.h", MAME_DIR .. "src/mame/drivers/flkatck.cpp", - MAME_DIR .. "src/mame/includes/flkatck.h", - MAME_DIR .. "src/mame/video/flkatck.cpp", MAME_DIR .. "src/mame/drivers/gberet.cpp", MAME_DIR .. "src/mame/includes/gberet.h", MAME_DIR .. "src/mame/video/gberet.cpp", diff --git a/src/mame/drivers/fastlane.cpp b/src/mame/drivers/fastlane.cpp index 65c24328932..e85f3f3cc5b 100644 --- a/src/mame/drivers/fastlane.cpp +++ b/src/mame/drivers/fastlane.cpp @@ -12,22 +12,203 @@ ***************************************************************************/ #include "emu.h" -#include "includes/fastlane.h" + #include "includes/konamipt.h" +#include "video/k007121.h" +#include "video/k051733.h" #include "cpu/m6809/hd6309.h" +#include "machine/timer.h" #include "machine/watchdog.h" +#include "sound/k007232.h" +#include "emupal.h" +#include "screen.h" #include "speaker.h" +#include "tilemap.h" -TIMER_DEVICE_CALLBACK_MEMBER(fastlane_state::fastlane_scanline) +namespace { + +class fastlane_state : public driver_device +{ +public: + fastlane_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_k007121_regs(*this, "k007121_regs"), + m_videoram(*this, "videoram%u", 1U), + m_spriteram(*this, "spriteram"), + m_prgbank(*this, "prgbank"), + m_k007232(*this, "k007232_%u", 1U), + m_k007121(*this, "k007121"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_palette(*this, "palette") + { } + + void fastlane(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void video_start() override; + +private: + required_device m_maincpu; + + // memory pointers + required_shared_ptr m_k007121_regs; + required_shared_ptr_array m_videoram; + required_shared_ptr m_spriteram; + required_memory_bank m_prgbank; + + // video-related + tilemap_t *m_layer[2]; + rectangle m_clip[2]; + + // devices + required_device_array m_k007232; + required_device m_k007121; + required_device m_gfxdecode; + required_device m_screen; + required_device m_palette; + + void k007121_registers_w(offs_t offset, uint8_t data); + void bankswitch_w(uint8_t data); + template void vram_w(offs_t offset, uint8_t data); + template uint8_t k007232_r(offs_t offset); + template void k007232_w(offs_t offset, uint8_t data); + template TILE_GET_INFO_MEMBER(get_tile_info); + void palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + TIMER_DEVICE_CALLBACK_MEMBER(scanline); + template void volume_callback(uint8_t data); + void prg_map(address_map &map); +}; + + +// video + +void fastlane_state::palette(palette_device &palette) const +{ + uint8_t const *const color_prom = memregion("proms")->base(); + for (int pal = 0; pal < 0x10; pal++) + { + for (int i = 0; i < 0x400; i++) + { + uint8_t const ctabentry = (i & 0x3f0) | color_prom[(pal << 4) | (i & 0x0f)]; + palette.set_pen_indirect((pal << 10) | i, ctabentry); + } + } +} + + +/*************************************************************************** + + Callbacks for the TileMap code + +***************************************************************************/ + +template +TILE_GET_INFO_MEMBER(fastlane_state::get_tile_info) +{ + uint8_t ctrl_3 = m_k007121->ctrlram_r(3); + uint8_t ctrl_4 = m_k007121->ctrlram_r(4); + uint8_t ctrl_5 = m_k007121->ctrlram_r(5); + int attr = m_videoram[Which][tile_index]; + int code = m_videoram[Which][tile_index + 0x400]; + int bit0 = (ctrl_5 >> 0) & 0x03; + int bit1 = (ctrl_5 >> 2) & 0x03; + int bit2 = (ctrl_5 >> 4) & 0x03; + int bit3 = (ctrl_5 >> 6) & 0x03; + int bank = ((attr & 0x80) >> 7) | + ((attr >> (bit0 + 2)) & 0x02) | + ((attr >> (bit1 + 1)) & 0x04) | + ((attr >> (bit2 )) & 0x08) | + ((attr >> (bit3 - 1)) & 0x10) | + ((ctrl_3 & 0x01) << 5); + int mask = (ctrl_4 & 0xf0) >> 4; + + bank = (bank & ~(mask << 1)) | ((ctrl_4 & mask) << 1); + + tileinfo.set(0, + code + bank * 256, + 1 + 64 * (attr & 0x0f), + 0); +} + + +/*************************************************************************** + + Start the video hardware emulation. + +***************************************************************************/ + +void fastlane_state::video_start() +{ + m_layer[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fastlane_state::get_tile_info<0>)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + m_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fastlane_state::get_tile_info<1>)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + + m_layer[0]->set_scroll_rows(32); + + m_clip[0] = m_screen->visible_area(); + m_clip[0].min_x += 40; + + m_clip[1] = m_screen->visible_area(); + m_clip[1].max_x = 39; + m_clip[1].min_x = 0; +} + +/*************************************************************************** + + Memory Handlers + +***************************************************************************/ + +template +void fastlane_state::vram_w(offs_t offset, uint8_t data) +{ + m_videoram[Which][offset] = data; + m_layer[Which]->mark_tile_dirty(offset & 0x3ff); +} + + +/*************************************************************************** + + Screen Refresh + +***************************************************************************/ + +uint32_t fastlane_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + rectangle finalclip0 = m_clip[0], finalclip1 = m_clip[1]; + + finalclip0 &= cliprect; + finalclip1 &= cliprect; + + // set scroll registers + int xoffs = m_k007121->ctrlram_r(0); + for (int i = 0; i < 32; i++) + m_layer[0]->set_scrollx(i, m_k007121_regs[0x20 + i] + xoffs - 40); + + m_layer[0]->set_scrolly(0, m_k007121->ctrlram_r(2)); + + m_layer[0]->draw(screen, bitmap, finalclip0, 0, 0); + m_k007121->sprites_draw(bitmap, cliprect, m_gfxdecode->gfx(0), *m_palette, m_spriteram, 0, 40, 0, screen.priority(), (uint32_t)- 1); + m_layer[1]->draw(screen, bitmap, finalclip1, 0, 0); + return 0; +} + + +// machine + +TIMER_DEVICE_CALLBACK_MEMBER(fastlane_state::scanline) { int scanline = param; - if(scanline == 240 && m_k007121->ctrlram_r(7) & 0x02) // vblank irq + if (scanline == 240 && m_k007121->ctrlram_r(7) & 0x02) // vblank irq m_maincpu->set_input_line(HD6309_IRQ_LINE, HOLD_LINE); - else if(((scanline % 32) == 0) && m_k007121->ctrlram_r(7) & 0x01) // timer irq + else if (((scanline % 32) == 0) && m_k007121->ctrlram_r(7) & 0x01) // timer irq m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); } @@ -36,50 +217,42 @@ void fastlane_state::k007121_registers_w(offs_t offset, uint8_t data) { if (offset < 8) m_k007121->ctrl_w(offset, data); - else /* scroll registers */ + else // scroll registers m_k007121_regs[offset] = data; } -void fastlane_state::fastlane_bankswitch_w(uint8_t data) +void fastlane_state::bankswitch_w(uint8_t data) { - /* bits 0 & 1 coin counters */ - machine().bookkeeping().coin_counter_w(0,data & 0x01); - machine().bookkeeping().coin_counter_w(1,data & 0x02); + // bits 0 & 1 coin counters + machine().bookkeeping().coin_counter_w(0, data & 0x01); + machine().bookkeeping().coin_counter_w(1, data & 0x02); - /* bits 2 & 3 = bank number */ - membank("bank1")->set_entry((data & 0x0c) >> 2); + // bits 2 & 3 = bank number + m_prgbank->set_entry((data & 0x0c) >> 2); - /* bit 4: bank # for the 007232 (chip 2) */ - m_k007232_2->set_bank(0 + ((data & 0x10) >> 4), 2 + ((data & 0x10) >> 4)); + // bit 4: bank # for the 007232 (chip 2) + m_k007232[1]->set_bank(0 + ((data & 0x10) >> 4), 2 + ((data & 0x10) >> 4)); - /* other bits seems to be unused */ + // other bits seems to be unused } -/* Read and write handlers for one K007232 chip: - even and odd register are mapped swapped */ +// Read and write handlers for one K007232 chip: even and odd register are mapped swapped -uint8_t fastlane_state::fastlane_k1_k007232_r(offs_t offset) +template +uint8_t fastlane_state::k007232_r(offs_t offset) { - return m_k007232_1->read(offset ^ 1); + return m_k007232[Which]->read(offset ^ 1); } -void fastlane_state::fastlane_k1_k007232_w(offs_t offset, uint8_t data) +template +void fastlane_state::k007232_w(offs_t offset, uint8_t data) { - m_k007232_1->write(offset ^ 1, data); + m_k007232[Which]->write(offset ^ 1, data); } -uint8_t fastlane_state::fastlane_k2_k007232_r(offs_t offset) +void fastlane_state::prg_map(address_map &map) { - return m_k007232_2->read(offset ^ 1); -} - -void fastlane_state::fastlane_k2_k007232_w(offs_t offset, uint8_t data) -{ - m_k007232_2->write(offset ^ 1, data); -} -void fastlane_state::fastlane_map(address_map &map) -{ - map(0x0000, 0x005f).ram().w(FUNC(fastlane_state::k007121_registers_w)).share("k007121_regs"); /* 007121 registers */ + map(0x0000, 0x005f).ram().w(FUNC(fastlane_state::k007121_registers_w)).share(m_k007121_regs); map(0x0800, 0x0800).portr("DSW3"); map(0x0801, 0x0801).portr("P2"); map(0x0802, 0x0802).portr("P1"); @@ -87,17 +260,17 @@ void fastlane_state::fastlane_map(address_map &map) map(0x0900, 0x0900).portr("DSW1"); map(0x0901, 0x0901).portr("DSW2"); map(0x0b00, 0x0b00).w("watchdog", FUNC(watchdog_timer_device::reset_w)); - map(0x0c00, 0x0c00).w(FUNC(fastlane_state::fastlane_bankswitch_w)); /* bankswitch control */ - map(0x0d00, 0x0d0d).rw(FUNC(fastlane_state::fastlane_k1_k007232_r), FUNC(fastlane_state::fastlane_k1_k007232_w)); /* 007232 registers (chip 1) */ - map(0x0e00, 0x0e0d).rw(FUNC(fastlane_state::fastlane_k2_k007232_r), FUNC(fastlane_state::fastlane_k2_k007232_w)); /* 007232 registers (chip 2) */ - map(0x0f00, 0x0f1f).rw("k051733", FUNC(k051733_device::read), FUNC(k051733_device::write)); /* 051733 (protection) */ + map(0x0c00, 0x0c00).w(FUNC(fastlane_state::bankswitch_w)); + map(0x0d00, 0x0d0d).rw(FUNC(fastlane_state::k007232_r<0>), FUNC(fastlane_state::k007232_w<0>)); + map(0x0e00, 0x0e0d).rw(FUNC(fastlane_state::k007232_r<1>), FUNC(fastlane_state::k007232_w<1>)); + map(0x0f00, 0x0f1f).rw("k051733", FUNC(k051733_device::read), FUNC(k051733_device::write)); // protection map(0x1000, 0x17ff).ram().w(m_palette, FUNC(palette_device::write_indirect)).share("palette"); - map(0x1800, 0x1fff).ram(); /* Work RAM */ - map(0x2000, 0x27ff).ram().w(FUNC(fastlane_state::fastlane_vram1_w)).share("videoram1"); /* Video RAM (chip 1) */ - map(0x2800, 0x2fff).ram().w(FUNC(fastlane_state::fastlane_vram2_w)).share("videoram2"); /* Video RAM (chip 2) */ - map(0x3000, 0x3fff).ram().share("spriteram"); /* Sprite RAM */ - map(0x4000, 0x7fff).bankr("bank1"); /* banked ROM */ - map(0x8000, 0xffff).rom(); /* ROM */ + map(0x1800, 0x1fff).ram(); // Work RAM + map(0x2000, 0x27ff).ram().w(FUNC(fastlane_state::vram_w<0>)).share(m_videoram[0]); + map(0x2800, 0x2fff).ram().w(FUNC(fastlane_state::vram_w<1>)).share(m_videoram[1]); + map(0x3000, 0x3fff).ram().share(m_spriteram); + map(0x4000, 0x7fff).bankr(m_prgbank); + map(0x8000, 0xffff).rom().region("maincpu", 0); } /*************************************************************************** @@ -106,11 +279,11 @@ void fastlane_state::fastlane_map(address_map &map) ***************************************************************************/ -/* verified from HD6309 code */ +// verified from HD6309 code static INPUT_PORTS_START( fastlane ) PORT_START("DSW1") KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) - /* "No Coin B" = coins produce sound, but no effect on coin counter */ + // "No Coin B" = coins produce sound, but no effect on coin counter PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") @@ -121,7 +294,7 @@ static INPUT_PORTS_START( fastlane ) PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - /* The bonus life affects the starting high score too, 20000 or 30000 */ + // The bonus life affects the starting high score too, 20000 or 30000 PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x18, "20k 100k 200k 400k 800k" ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x10, "30k 150k 300k 600k" ) @@ -132,7 +305,7 @@ static INPUT_PORTS_START( fastlane ) PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") // seems it doesn't work (same on pcb) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") // seems it doesn't work (same on PCB) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -171,7 +344,7 @@ static const gfx_layout gfxlayout = }; static GFXDECODE_START( gfx_fastlane ) - GFXDECODE_ENTRY( "gfx1", 0, gfxlayout, 0, 64*16 ) + GFXDECODE_ENTRY( "gfx", 0, gfxlayout, 0, 64*16 ) GFXDECODE_END /*************************************************************************** @@ -180,63 +353,58 @@ GFXDECODE_END ***************************************************************************/ -void fastlane_state::volume_callback0(uint8_t data) +template +void fastlane_state::volume_callback(uint8_t data) { - m_k007232_1->set_volume(0, (data >> 4) * 0x11, 0); - m_k007232_1->set_volume(1, 0, (data & 0x0f) * 0x11); -} - -void fastlane_state::volume_callback1(uint8_t data) -{ - m_k007232_2->set_volume(0, (data >> 4) * 0x11, 0); - m_k007232_2->set_volume(1, 0, (data & 0x0f) * 0x11); + m_k007232[Which]->set_volume(0, (data >> 4) * 0x11, 0); + m_k007232[Which]->set_volume(1, 0, (data & 0x0f) * 0x11); } void fastlane_state::machine_start() { uint8_t *ROM = memregion("maincpu")->base(); - membank("bank1")->configure_entries(0, 4, &ROM[0x10000], 0x4000); + m_prgbank->configure_entries(0, 4, &ROM[0x8000], 0x4000); } void fastlane_state::fastlane(machine_config &config) { - /* basic machine hardware */ - HD6309(config, m_maincpu, XTAL(24'000'000)/2); // 3MHz(XTAL(24'000'000)/8) internally - m_maincpu->set_addrmap(AS_PROGRAM, &fastlane_state::fastlane_map); - TIMER(config, "scantimer").configure_scanline(FUNC(fastlane_state::fastlane_scanline), "screen", 0, 1); + // basic machine hardware + HD6309(config, m_maincpu, XTAL(24'000'000) / 2); // 3 MHz(XTAL(24'000'000) / 8) internally + m_maincpu->set_addrmap(AS_PROGRAM, &fastlane_state::prg_map); + TIMER(config, "scantimer").configure_scanline(FUNC(fastlane_state::scanline), "screen", 0, 1); WATCHDOG_TIMER(config, "watchdog"); - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(59.17); // measured m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); m_screen->set_size(37*8, 32*8); m_screen->set_visarea(0*8, 35*8-1, 2*8, 30*8-1); - m_screen->set_screen_update(FUNC(fastlane_state::screen_update_fastlane)); + m_screen->set_screen_update(FUNC(fastlane_state::screen_update)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_fastlane); - PALETTE(config, m_palette, FUNC(fastlane_state::fastlane_palette)).set_format(palette_device::xBGR_555, 1024*16, 0x400); + PALETTE(config, m_palette, FUNC(fastlane_state::palette)).set_format(palette_device::xBGR_555, 1024*16, 0x400); K007121(config, m_k007121, 0); m_k007121->set_palette_tag(m_palette); K051733(config, "k051733", 0); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); - K007232(config, m_k007232_1, XTAL(3'579'545)); - m_k007232_1->port_write().set(FUNC(fastlane_state::volume_callback0)); - m_k007232_1->add_route(0, "mono", 0.50); - m_k007232_1->add_route(1, "mono", 0.50); + K007232(config, m_k007232[0], XTAL(3'579'545)); + m_k007232[0]->port_write().set(FUNC(fastlane_state::volume_callback<0>)); + m_k007232[0]->add_route(0, "mono", 0.50); + m_k007232[0]->add_route(1, "mono", 0.50); - K007232(config, m_k007232_2, XTAL(3'579'545)); - m_k007232_2->port_write().set(FUNC(fastlane_state::volume_callback1)); - m_k007232_2->add_route(0, "mono", 0.50); - m_k007232_2->add_route(1, "mono", 0.50); + K007232(config, m_k007232[1], XTAL(3'579'545)); + m_k007232[1]->port_write().set(FUNC(fastlane_state::volume_callback<1>)); + m_k007232[1]->add_route(0, "mono", 0.50); + m_k007232[1]->add_route(1, "mono", 0.50); } @@ -247,22 +415,24 @@ void fastlane_state::fastlane(machine_config &config) ***************************************************************************/ ROM_START( fastlane ) - ROM_REGION( 0x21000, "maincpu", 0 ) /* code + banked roms */ - ROM_LOAD( "752_m02.9h", 0x08000, 0x08000, CRC(e1004489) SHA1(615b608d22abc3611f1620503cd6a8c9a6218db8) ) /* fixed ROM */ - ROM_LOAD( "752_e01.10h", 0x10000, 0x10000, CRC(ff4d6029) SHA1(b5c5d8654ce728300d268628bd3dd878570ba7b8) ) /* banked ROM */ + ROM_REGION( 0x18000, "maincpu", 0 ) // code + banked ROMs + ROM_LOAD( "752_m02.9h", 0x00000, 0x08000, CRC(e1004489) SHA1(615b608d22abc3611f1620503cd6a8c9a6218db8) ) // fixed ROM + ROM_LOAD( "752_e01.10h", 0x08000, 0x10000, CRC(ff4d6029) SHA1(b5c5d8654ce728300d268628bd3dd878570ba7b8) ) // banked ROM - ROM_REGION( 0x80000, "gfx1", 0 ) - ROM_LOAD( "752e04.2i", 0x00000, 0x80000, CRC(a126e82d) SHA1(6663230c2c36dec563969bccad8c62e3d454d240) ) /* tiles + sprites */ + ROM_REGION( 0x80000, "gfx", 0 ) + ROM_LOAD( "752e04.2i", 0x00000, 0x80000, CRC(a126e82d) SHA1(6663230c2c36dec563969bccad8c62e3d454d240) ) // tiles + sprites ROM_REGION( 0x0100, "proms", 0 ) ROM_LOAD( "752e03.6h", 0x0000, 0x0100, CRC(44300aeb) SHA1(580c6e88cbb3b6d8156ea0b9103834f199ec2747) ) - ROM_REGION( 0x20000, "k007232_1", 0 ) /* 007232 data */ - ROM_LOAD( "752e06.4c", 0x00000, 0x20000, CRC(85d691ed) SHA1(7f8d05562a68c75672141fc80ce7e7acb80588b9) ) /* chip 1 */ + ROM_REGION( 0x20000, "k007232_1", 0 ) + ROM_LOAD( "752e06.4c", 0x00000, 0x20000, CRC(85d691ed) SHA1(7f8d05562a68c75672141fc80ce7e7acb80588b9) ) - ROM_REGION( 0x80000, "k007232_2", 0 ) /* 007232 data */ - ROM_LOAD( "752e05.12b", 0x00000, 0x80000, CRC(119e9cbf) SHA1(21e3def9ab10b210632df11b6df4699140c473db) ) /* chip 2 */ + ROM_REGION( 0x80000, "k007232_2", 0 ) + ROM_LOAD( "752e05.12b", 0x00000, 0x80000, CRC(119e9cbf) SHA1(21e3def9ab10b210632df11b6df4699140c473db) ) ROM_END +} // anonymous namespace + GAME( 1987, fastlane, 0, fastlane, fastlane, fastlane_state, empty_init, ROT90, "Konami", "Fast Lane", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/flkatck.cpp b/src/mame/drivers/flkatck.cpp index e3a8d7ba083..41561d1d77a 100644 --- a/src/mame/drivers/flkatck.cpp +++ b/src/mame/drivers/flkatck.cpp @@ -7,42 +7,270 @@ Driver by: Manuel Abadia -NOTE: There is known to exist a USA version of Flak Attack - currently not dumped +NOTE: A USA version of Flak Attack is known to exist - currently not dumped 24MHz & 3.579545MHz OSCs ***************************************************************************/ #include "emu.h" -#include "includes/flkatck.h" -#include "includes/konamipt.h" -#include "cpu/z80/z80.h" -#include "cpu/m6809/hd6309.h" +#include "includes/konamipt.h" #include "machine/k007452.h" +#include "video/k007121.h" + +#include "cpu/m6809/hd6309.h" +#include "cpu/z80/z80.h" +#include "machine/gen_latch.h" +#include "machine/watchdog.h" +#include "sound/k007232.h" #include "sound/ymopm.h" + #include "screen.h" #include "speaker.h" +#include "tilemap.h" -INTERRUPT_GEN_MEMBER(flkatck_state::flkatck_interrupt) +namespace { + +class flkatck_state : public driver_device +{ +public: + flkatck_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_vram(*this, "vram"), + m_spriteram(*this, "spriteram"), + m_mainbank(*this, "mainbank"), + m_coin(*this, "COIN"), + m_pl(*this, "P%u", 1U), + m_dsw(*this, "DSW%u", 1U), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_k007121(*this, "k007121"), + m_k007232(*this, "k007232"), + m_watchdog(*this, "watchdog"), + m_gfxdecode(*this, "gfxdecode"), + m_soundlatch(*this, "soundlatch") + { } + + void flkatck(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + +private: + // memory pointers + required_shared_ptr m_vram; + required_shared_ptr m_spriteram; + required_memory_bank m_mainbank; + + // video-related + tilemap_t *m_k007121_tilemap[2]; + uint8_t m_flipscreen; + + // misc + required_ioport m_coin; + required_ioport_array<2> m_pl; + required_ioport_array<3> m_dsw; + uint8_t m_irq_enabled; + + // devices + required_device m_maincpu; + required_device m_audiocpu; + required_device m_k007121; + required_device m_k007232; + required_device m_watchdog; + required_device m_gfxdecode; + required_device m_soundlatch; + + void bankswitch_w(uint8_t data); + uint8_t ls138_r(offs_t offset); + void ls138_w(offs_t offset, uint8_t data); + void vram_w(offs_t offset, uint8_t data); + void k007121_regs_w(offs_t offset, uint8_t data); + TILE_GET_INFO_MEMBER(get_tile_info_a); + TILE_GET_INFO_MEMBER(get_tile_info_b); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(interrupt); + void volume_callback(uint8_t data); + void main_map(address_map &map); + void sound_map(address_map &map); +}; + + +// video + +/*************************************************************************** + + Callbacks for the K007121 + +***************************************************************************/ + +TILE_GET_INFO_MEMBER(flkatck_state::get_tile_info_a) +{ + uint8_t ctrl_0 = m_k007121->ctrlram_r(0); + uint8_t ctrl_2 = m_k007121->ctrlram_r(2); + uint8_t ctrl_3 = m_k007121->ctrlram_r(3); + uint8_t ctrl_4 = m_k007121->ctrlram_r(4); + uint8_t ctrl_5 = m_k007121->ctrlram_r(5); + int attr = m_vram[tile_index]; + int code = m_vram[tile_index + 0x400]; + int bit0 = (ctrl_5 >> 0) & 0x03; + int bit1 = (ctrl_5 >> 2) & 0x03; + int bit2 = (ctrl_5 >> 4) & 0x03; + int bit3 = (ctrl_5 >> 6) & 0x03; + int bank = ((attr & 0x80) >> 7) | + ((attr >> (bit0 + 2)) & 0x02) | + ((attr >> (bit1 + 1)) & 0x04) | + ((attr >> (bit2 )) & 0x08) | + ((attr >> (bit3 - 1)) & 0x10) | + ((ctrl_3 & 0x01) << 5); + int mask = (ctrl_4 & 0xf0) >> 4; + + bank = (bank & ~(mask << 1)) | ((ctrl_4 & mask) << 1); + + if ((attr == 0x0d) && (!ctrl_0) && (!ctrl_2)) + bank = 0; /* this allows the game to print text + in all banks selected by the k007121 */ + + tileinfo.set(0, + code + 256 * bank, + (attr & 0x0f) + 16, + (attr & 0x20) ? TILE_FLIPY : 0); +} + +TILE_GET_INFO_MEMBER(flkatck_state::get_tile_info_b) +{ + int attr = m_vram[tile_index + 0x800]; + int code = m_vram[tile_index + 0xc00]; + + tileinfo.set(0, + code, + (attr & 0x0f) + 16, + 0); +} + + +/*************************************************************************** + + Start the video hardware emulation. + +***************************************************************************/ + +void flkatck_state::video_start() +{ + m_k007121_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(flkatck_state::get_tile_info_a)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + m_k007121_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(flkatck_state::get_tile_info_b)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); +} + + +/*************************************************************************** + + Memory handlers + +***************************************************************************/ + +void flkatck_state::vram_w(offs_t offset, uint8_t data) +{ + m_vram[offset] = data; + if (offset & 0x800) // score + m_k007121_tilemap[1]->mark_tile_dirty(offset & 0x3ff); + else + m_k007121_tilemap[0]->mark_tile_dirty(offset & 0x3ff); +} + +void flkatck_state::k007121_regs_w(offs_t offset, uint8_t data) +{ + switch (offset) + { + case 0x04: // ROM bank select + if (data != m_k007121->ctrlram_r(4)) + machine().tilemap().mark_all_dirty(); + break; + + case 0x07: // flip screen + IRQ control + m_flipscreen = data & 0x08; + machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + m_irq_enabled = data & 0x02; + break; + } + + m_k007121->ctrl_w(offset, data); +} + + +/*************************************************************************** + + Display Refresh + +***************************************************************************/ + +uint32_t flkatck_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + rectangle clip[2]; + const rectangle &visarea = screen.visible_area(); + // TODO: reversed polarity? Hard to say, FWIW Combat School uses this in reverse ... + uint16_t sprite_buffer = (m_k007121->ctrlram_r(3) & 8) * 0x100; + + if (m_flipscreen) + { + clip[0] = visarea; + clip[0].max_x -= 40; + + clip[1] = visarea; + clip[1].min_x = clip[1].max_x - 40; + + m_k007121_tilemap[0]->set_scrollx(0, m_k007121->ctrlram_r(0) - 56 ); + m_k007121_tilemap[0]->set_scrolly(0, m_k007121->ctrlram_r(2)); + m_k007121_tilemap[1]->set_scrollx(0, -16); + } + else + { + clip[0] = visarea; + clip[0].min_x += 40; + + clip[1] = visarea; + clip[1].max_x = 39; + clip[1].min_x = 0; + + m_k007121_tilemap[0]->set_scrollx(0, m_k007121->ctrlram_r(0) - 40 ); + m_k007121_tilemap[0]->set_scrolly(0, m_k007121->ctrlram_r(2)); + m_k007121_tilemap[1]->set_scrollx(0, 0); + } + + // compute clipping + clip[0] &= cliprect; + clip[1] &= cliprect; + + // draw the graphics + m_k007121_tilemap[0]->draw(screen, bitmap, clip[0], 0, 0); + m_k007121->sprites_draw(bitmap, cliprect, m_gfxdecode->gfx(0), m_gfxdecode->palette(), &m_spriteram[sprite_buffer], 0, 40, 0, screen.priority(), (uint32_t)-1, true); + m_k007121_tilemap[1]->draw(screen, bitmap, clip[1], 0, 0); + return 0; +} + + +// machine +INTERRUPT_GEN_MEMBER(flkatck_state::interrupt) { if (m_irq_enabled) device.execute().set_input_line(HD6309_IRQ_LINE, HOLD_LINE); } -void flkatck_state::flkatck_bankswitch_w(uint8_t data) +void flkatck_state::bankswitch_w(uint8_t data) { - /* bits 3-4: coin counters */ + // bits 3-4: coin counters machine().bookkeeping().coin_counter_w(0, data & 0x08); machine().bookkeeping().coin_counter_w(1, data & 0x10); - /* bits 0-1: bank # */ - if ((data & 0x03) != 0x03) /* for safety */ - membank("bank1")->set_entry(data & 0x03); + // bits 0-1: bank # + if ((data & 0x03) != 0x03) // for safety + m_mainbank->set_entry(data & 0x03); } -uint8_t flkatck_state::flkatck_ls138_r(offs_t offset) +uint8_t flkatck_state::ls138_r(offs_t offset) { int data = 0; @@ -50,66 +278,66 @@ uint8_t flkatck_state::flkatck_ls138_r(offs_t offset) { case 0x00: if (offset & 0x02) - data = ioport((offset & 0x01) ? "COIN" : "DSW3")->read(); + data = (offset & 0x01) ? m_coin->read() : m_dsw[2]->read(); else - data = ioport((offset & 0x01) ? "P2" : "P1")->read(); + data = (offset & 0x01) ? m_pl[1]->read() : m_pl[0]->read(); break; case 0x01: if (offset & 0x02) - data = ioport((offset & 0x01) ? "DSW1" : "DSW2")->read(); + data = (offset & 0x01) ? m_dsw[0]->read() : m_dsw[1]->read(); break; } return data; } -void flkatck_state::flkatck_ls138_w(offs_t offset, uint8_t data) +void flkatck_state::ls138_w(offs_t offset, uint8_t data) { switch ((offset & 0x1c) >> 2) { - case 0x04: /* bankswitch */ - flkatck_bankswitch_w(data); + case 0x04: // bankswitch + bankswitch_w(data); break; - case 0x05: /* sound code number */ + case 0x05: // sound code number m_soundlatch->write(data); break; - case 0x06: /* Cause interrupt on audio CPU */ + case 0x06: // cause interrupt on audio CPU m_audiocpu->set_input_line(0, HOLD_LINE); break; - case 0x07: /* watchdog reset */ + case 0x07: // watchdog reset m_watchdog->watchdog_reset(); break; } } -void flkatck_state::flkatck_map(address_map &map) +void flkatck_state::main_map(address_map &map) { - map(0x0000, 0x0007).ram().w(FUNC(flkatck_state::flkatck_k007121_regs_w)); /* 007121 registers */ - map(0x0008, 0x03ff).ram(); /* RAM */ - map(0x0400, 0x041f).rw(FUNC(flkatck_state::flkatck_ls138_r), FUNC(flkatck_state::flkatck_ls138_w)); /* inputs, DIPS, bankswitch, counters, sound command */ - map(0x0800, 0x0bff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); /* palette */ - map(0x1000, 0x1fff).ram().share("spriteram"); /* RAM */ - map(0x2000, 0x2fff).ram().w(FUNC(flkatck_state::vram_w)).share("vram"); /* Video RAM (007121) */ + map(0x0000, 0x0007).ram().w(FUNC(flkatck_state::k007121_regs_w)); + map(0x0008, 0x03ff).ram(); + map(0x0400, 0x041f).rw(FUNC(flkatck_state::ls138_r), FUNC(flkatck_state::ls138_w)); // inputs, DIPS, bankswitch, counters, sound command + map(0x0800, 0x0bff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); + map(0x1000, 0x1fff).ram().share(m_spriteram); + map(0x2000, 0x2fff).ram().w(FUNC(flkatck_state::vram_w)).share(m_vram); // 007121 map(0x3000, 0x3fff).ram(); - map(0x4000, 0x5fff).bankr("bank1"); /* banked ROM */ - map(0x6000, 0xffff).rom(); /* ROM */ + map(0x4000, 0x5fff).bankr(m_mainbank); + map(0x6000, 0xffff).rom().region("maincpu", 0x6000); } -void flkatck_state::flkatck_sound_map(address_map &map) +void flkatck_state::sound_map(address_map &map) { - map(0x0000, 0x7fff).rom(); /* ROM */ - map(0x8000, 0x87ff).ram(); /* RAM */ + map(0x0000, 0x7fff).rom(); + map(0x8000, 0x87ff).ram(); map(0x9000, 0x9007).rw("k007452", FUNC(k007452_device::read), FUNC(k007452_device::write)); // Protection (see wecleman, but unused here?) map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); - map(0xb000, 0xb00d).rw(m_k007232, FUNC(k007232_device::read), FUNC(k007232_device::write)); /* 007232 registers */ - map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); /* YM2151 */ + map(0xb000, 0xb00d).rw(m_k007232, FUNC(k007232_device::read), FUNC(k007232_device::write)); + map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); } static INPUT_PORTS_START( flkatck ) PORT_START("DSW1") KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) - /* "Invalid" = both coin slots disabled */ + // "Invalid" = both coin slots disabled PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") @@ -142,7 +370,7 @@ static INPUT_PORTS_START( flkatck ) PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) - PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" ) /* Listed as "Unused" */ + PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" ) // Listed as "Unused" PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("COIN") @@ -167,7 +395,7 @@ static const gfx_layout gfxlayout = }; static GFXDECODE_START( gfx_flkatck ) - GFXDECODE_ENTRY( "gfx1", 0, gfxlayout, 0, 32 ) + GFXDECODE_ENTRY( "gfx", 0, gfxlayout, 0, 32 ) GFXDECODE_END void flkatck_state::volume_callback(uint8_t data) @@ -180,7 +408,7 @@ void flkatck_state::machine_start() { uint8_t *ROM = memregion("maincpu")->base(); - membank("bank1")->configure_entries(0, 3, &ROM[0x10000], 0x2000); + m_mainbank->configure_entries(0, 3, &ROM[0x0000], 0x2000); save_item(NAME(m_irq_enabled)); save_item(NAME(m_flipscreen)); @@ -196,13 +424,13 @@ void flkatck_state::machine_reset() void flkatck_state::flkatck(machine_config &config) { - /* basic machine hardware */ - HD6309E(config, m_maincpu, 24_MHz_XTAL / 8); /* HD63C09EP, 3MHz (24MHz/8) */ - m_maincpu->set_addrmap(AS_PROGRAM, &flkatck_state::flkatck_map); - m_maincpu->set_vblank_int("screen", FUNC(flkatck_state::flkatck_interrupt)); + // basic machine hardware + HD6309E(config, m_maincpu, 24_MHz_XTAL / 8); // HD63C09EP, 3MHz + m_maincpu->set_addrmap(AS_PROGRAM, &flkatck_state::main_map); + m_maincpu->set_vblank_int("screen", FUNC(flkatck_state::interrupt)); - Z80(config, m_audiocpu, 3.579545_MHz_XTAL); /* NEC D780C-1, 3.579545MHz */ - m_audiocpu->set_addrmap(AS_PROGRAM, &flkatck_state::flkatck_sound_map); + Z80(config, m_audiocpu, 3.579545_MHz_XTAL); // NEC D780C-1 + m_audiocpu->set_addrmap(AS_PROGRAM, &flkatck_state::sound_map); config.set_maximum_quantum(attotime::from_hz(600)); @@ -210,13 +438,13 @@ void flkatck_state::flkatck(machine_config &config) KONAMI_007452_MATH(config, "k007452"); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(37*8, 32*8); screen.set_visarea(0*8, 35*8-1, 2*8, 30*8-1); - screen.set_screen_update(FUNC(flkatck_state::screen_update_flkatck)); + screen.set_screen_update(FUNC(flkatck_state::screen_update)); screen.set_palette("palette"); GFXDECODE(config, m_gfxdecode, "palette", gfx_flkatck); @@ -225,7 +453,7 @@ void flkatck_state::flkatck(machine_config &config) K007121(config, m_k007121, 0); m_k007121->set_palette_tag("palette"); - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -244,58 +472,59 @@ void flkatck_state::flkatck(machine_config &config) ROM_START( mx5000 ) - ROM_REGION( 0x18000, "maincpu", 0 ) /* 6309 code */ - ROM_LOAD( "669_r01.16c", 0x010000, 0x006000, CRC(79b226fc) SHA1(3bc4d93717230fecd54bd08a0c3eeedc1c8f571d) ) /* banked ROM */ - ROM_CONTINUE( 0x006000, 0x00a000 ) /* fixed ROM */ + ROM_REGION( 0x10000, "maincpu", 0 ) // 6309 code + ROM_LOAD( "669_r01.16c", 0x00000, 0x10000, CRC(79b226fc) SHA1(3bc4d93717230fecd54bd08a0c3eeedc1c8f571d) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the SOUND CPU */ - ROM_LOAD( "669_m02.16b", 0x000000, 0x008000, CRC(7e11e6b9) SHA1(7a7d65a458b15842a6345388007c8f682aec20a7) ) - ROM_REGION( 0x080000, "gfx1", 0 ) /* tiles + sprites */ - ROM_LOAD( "gx669f03.5e", 0x000000, 0x080000, CRC(ff1d718b) SHA1(d44fe3ed5a3ba1b3036264e37f9cd3500b706635) ) /* MASK4M */ + ROM_REGION( 0x8000, "audiocpu", 0 ) + ROM_LOAD( "669_m02.16b", 0x0000, 0x8000, CRC(7e11e6b9) SHA1(7a7d65a458b15842a6345388007c8f682aec20a7) ) - ROM_REGION( 0x040000, "k007232", 0 ) /* 007232 data (chip 1) */ - ROM_LOAD( "gx669f04.11a", 0x000000, 0x040000, CRC(6d1ea61c) SHA1(9e6eb9ac61838df6e1f74e74bb72f3edf1274aed) ) /* MASK2M */ + ROM_REGION( 0x80000, "gfx", 0 ) // tiles + sprites + ROM_LOAD( "gx669f03.5e", 0x00000, 0x80000, CRC(ff1d718b) SHA1(d44fe3ed5a3ba1b3036264e37f9cd3500b706635) ) // MASK4M + + ROM_REGION( 0x40000, "k007232", 0 ) + ROM_LOAD( "gx669f04.11a", 0x00000, 0x40000, CRC(6d1ea61c) SHA1(9e6eb9ac61838df6e1f74e74bb72f3edf1274aed) ) // MASK2M ROM_END ROM_START( flkatck ) - ROM_REGION( 0x18000, "maincpu", 0 ) /* 6309 code */ - ROM_LOAD( "669_p01.16c", 0x010000, 0x006000, CRC(c5cd2807) SHA1(22ddd911a23954ff2d52552e07323f5f0ddaeead) ) /* banked ROM */ - ROM_CONTINUE( 0x006000, 0x00a000 ) /* fixed ROM */ + ROM_REGION( 0x10000, "maincpu", 0 ) // 6309 code + ROM_LOAD( "669_p01.16c", 0x00000, 0x10000, CRC(c5cd2807) SHA1(22ddd911a23954ff2d52552e07323f5f0ddaeead) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the SOUND CPU */ - ROM_LOAD( "669_m02.16b", 0x000000, 0x008000, CRC(7e11e6b9) SHA1(7a7d65a458b15842a6345388007c8f682aec20a7) ) + ROM_REGION( 0x8000, "audiocpu", 0 ) + ROM_LOAD( "669_m02.16b", 0x0000, 0x8000, CRC(7e11e6b9) SHA1(7a7d65a458b15842a6345388007c8f682aec20a7) ) - ROM_REGION( 0x080000, "gfx1", 0 ) /* tiles + sprites */ - ROM_LOAD( "gx669f03.5e", 0x000000, 0x080000, CRC(ff1d718b) SHA1(d44fe3ed5a3ba1b3036264e37f9cd3500b706635) ) /* MASK4M */ + ROM_REGION( 0x80000, "gfx", 0 ) // tiles + sprites + ROM_LOAD( "gx669f03.5e", 0x00000, 0x80000, CRC(ff1d718b) SHA1(d44fe3ed5a3ba1b3036264e37f9cd3500b706635) ) // MASK4M - ROM_REGION( 0x040000, "k007232", 0 ) /* 007232 data (chip 1) */ - ROM_LOAD( "gx669f04.11a", 0x000000, 0x040000, CRC(6d1ea61c) SHA1(9e6eb9ac61838df6e1f74e74bb72f3edf1274aed) ) /* MASK2M */ + ROM_REGION( 0x40000, "k007232", 0 ) + ROM_LOAD( "gx669f04.11a", 0x00000, 0x40000, CRC(6d1ea61c) SHA1(9e6eb9ac61838df6e1f74e74bb72f3edf1274aed) ) // MASK2M ROM_END // identical to flkatck except for the board / ROM type configuration ROM_START( flkatcka ) - ROM_REGION( 0x18000, "maincpu", 0 ) /* 6309 code */ - ROM_LOAD( "669_p01.16c", 0x010000, 0x006000, CRC(c5cd2807) SHA1(22ddd911a23954ff2d52552e07323f5f0ddaeead) ) /* banked ROM */ - ROM_CONTINUE( 0x006000, 0x00a000 ) /* fixed ROM */ + ROM_REGION( 0x10000, "maincpu", 0 ) // 6309 code + ROM_LOAD( "669_p01.16c", 0x00000, 0x10000, CRC(c5cd2807) SHA1(22ddd911a23954ff2d52552e07323f5f0ddaeead) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the SOUND CPU */ - ROM_LOAD( "669_m02.16b", 0x000000, 0x008000, CRC(7e11e6b9) SHA1(7a7d65a458b15842a6345388007c8f682aec20a7) ) + ROM_REGION( 0x8000, "audiocpu", 0 ) + ROM_LOAD( "669_m02.16b", 0x0000, 0x8000, CRC(7e11e6b9) SHA1(7a7d65a458b15842a6345388007c8f682aec20a7) ) - ROM_REGION( 0x080000, "gfx1", 0 ) /* tiles + sprites */ // same data as above set, on PWB 450593 sub-board instead. - ROM_LOAD16_BYTE( "669_f03a.4b", 0x000001, 0x010000, CRC(f0ed4c1e) SHA1(58efe3cd81054d22de54a7d195aa3b865bde4a01) ) - ROM_LOAD16_BYTE( "669_f03e.4d", 0x000000, 0x010000, CRC(95a57a26) SHA1(c8aa30c2c734c0740630b1b04ae43c69931cc7c1) ) - ROM_LOAD16_BYTE( "669_f03b.5b", 0x020001, 0x010000, CRC(e2593f3c) SHA1(aa0f6d04015650eaef17c4a39f228eaccf9a2948) ) - ROM_LOAD16_BYTE( "669_f03f.5d", 0x020000, 0x010000, CRC(c6c9903e) SHA1(432ad6d03992499cc533273226944a666b40fa58) ) - ROM_LOAD16_BYTE( "669_f03c.6b", 0x040001, 0x010000, CRC(47be92dd) SHA1(9ccc62d7d42fccbd5ad60e35e3a0478a04405cf1) ) - ROM_LOAD16_BYTE( "669_f03g.6d", 0x040000, 0x010000, CRC(70d35fbd) SHA1(21384f738684c5da4a7a84a1c9aa173fffddf47a) ) - ROM_LOAD16_BYTE( "669_f03d.7b", 0x060001, 0x010000, CRC(18d48f9e) SHA1(b95e38aa813e0f3a0dc6bd45fdb4bf71f7e2066c) ) - ROM_LOAD16_BYTE( "669_f03h.7d", 0x060000, 0x010000, CRC(abfe76e7) SHA1(f8661f189308e83056ec442fa6c936efff67ba0a) ) + ROM_REGION( 0x80000, "gfx", 0 ) // tiles + sprites, same data as above set, on PWB 450593 sub-board instead. + ROM_LOAD16_BYTE( "669_f03a.4b", 0x00001, 0x10000, CRC(f0ed4c1e) SHA1(58efe3cd81054d22de54a7d195aa3b865bde4a01) ) + ROM_LOAD16_BYTE( "669_f03e.4d", 0x00000, 0x10000, CRC(95a57a26) SHA1(c8aa30c2c734c0740630b1b04ae43c69931cc7c1) ) + ROM_LOAD16_BYTE( "669_f03b.5b", 0x20001, 0x10000, CRC(e2593f3c) SHA1(aa0f6d04015650eaef17c4a39f228eaccf9a2948) ) + ROM_LOAD16_BYTE( "669_f03f.5d", 0x20000, 0x10000, CRC(c6c9903e) SHA1(432ad6d03992499cc533273226944a666b40fa58) ) + ROM_LOAD16_BYTE( "669_f03c.6b", 0x40001, 0x10000, CRC(47be92dd) SHA1(9ccc62d7d42fccbd5ad60e35e3a0478a04405cf1) ) + ROM_LOAD16_BYTE( "669_f03g.6d", 0x40000, 0x10000, CRC(70d35fbd) SHA1(21384f738684c5da4a7a84a1c9aa173fffddf47a) ) + ROM_LOAD16_BYTE( "669_f03d.7b", 0x60001, 0x10000, CRC(18d48f9e) SHA1(b95e38aa813e0f3a0dc6bd45fdb4bf71f7e2066c) ) + ROM_LOAD16_BYTE( "669_f03h.7d", 0x60000, 0x10000, CRC(abfe76e7) SHA1(f8661f189308e83056ec442fa6c936efff67ba0a) ) - ROM_REGION( 0x040000, "k007232", 0 ) /* 007232 data (chip 1) */ - ROM_LOAD( "gx669f04.11a", 0x000000, 0x040000, CRC(6d1ea61c) SHA1(9e6eb9ac61838df6e1f74e74bb72f3edf1274aed) ) /* MASK2M */ + ROM_REGION( 0x40000, "k007232", 0 ) + ROM_LOAD( "gx669f04.11a", 0x00000, 0x40000, CRC(6d1ea61c) SHA1(9e6eb9ac61838df6e1f74e74bb72f3edf1274aed) ) // MASK2M ROM_END +} // anonymous namespace + + GAME( 1987, mx5000, 0, flkatck, flkatck, flkatck_state, empty_init, ROT90, "Konami", "MX5000", MACHINE_SUPPORTS_SAVE ) GAME( 1987, flkatck, mx5000, flkatck, flkatck, flkatck_state, empty_init, ROT90, "Konami", "Flak Attack (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, flkatcka, mx5000, flkatck, flkatck, flkatck_state, empty_init, ROT90, "Konami", "Flak Attack (Japan, PWB 450593 sub-board)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/fastlane.h b/src/mame/includes/fastlane.h deleted file mode 100644 index e7b8d9ad2ce..00000000000 --- a/src/mame/includes/fastlane.h +++ /dev/null @@ -1,84 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Manuel Abadia -/************************************************************************* - - Fast Lane - -*************************************************************************/ -#ifndef MAME_INCLUDES_FASTLANE_H -#define MAME_INCLUDES_FASTLANE_H - -#pragma once - -#include "machine/timer.h" -#include "sound/k007232.h" -#include "video/k007121.h" -#include "video/k051733.h" -#include "emupal.h" -#include "screen.h" -#include "tilemap.h" - -class fastlane_state : public driver_device -{ -public: - fastlane_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this,"maincpu"), - m_k007121_regs(*this, "k007121_regs"), - m_videoram1(*this, "videoram1"), - m_videoram2(*this, "videoram2"), - m_spriteram(*this, "spriteram"), - m_k007232_1(*this, "k007232_1"), - m_k007232_2(*this, "k007232_2"), - m_k007121(*this, "k007121"), - m_gfxdecode(*this, "gfxdecode"), - m_screen(*this, "screen"), - m_palette(*this, "palette") - { } - - void fastlane(machine_config &config); - -private: - required_device m_maincpu; - - /* memory pointers */ - required_shared_ptr m_k007121_regs; - required_shared_ptr m_videoram1; - required_shared_ptr m_videoram2; - required_shared_ptr m_spriteram; - - /* video-related */ - tilemap_t *m_layer0; - tilemap_t *m_layer1; - rectangle m_clip0; - rectangle m_clip1; - - /* devices */ - required_device m_k007232_1; - required_device m_k007232_2; - required_device m_k007121; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; - - void k007121_registers_w(offs_t offset, uint8_t data); - void fastlane_bankswitch_w(uint8_t data); - void fastlane_vram1_w(offs_t offset, uint8_t data); - void fastlane_vram2_w(offs_t offset, uint8_t data); - uint8_t fastlane_k1_k007232_r(offs_t offset); - void fastlane_k1_k007232_w(offs_t offset, uint8_t data); - uint8_t fastlane_k2_k007232_r(offs_t offset); - void fastlane_k2_k007232_w(offs_t offset, uint8_t data); - TILE_GET_INFO_MEMBER(get_tile_info0); - TILE_GET_INFO_MEMBER(get_tile_info1); - virtual void machine_start() override; - virtual void video_start() override; - void fastlane_palette(palette_device &palette) const; - uint32_t screen_update_fastlane(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_DEVICE_CALLBACK_MEMBER(fastlane_scanline); - void volume_callback0(uint8_t data); - void volume_callback1(uint8_t data); - void fastlane_map(address_map &map); -}; - -#endif // MAME_INCLUDES_FASTLANE_H diff --git a/src/mame/includes/flkatck.h b/src/mame/includes/flkatck.h deleted file mode 100644 index 4f2d01a8516..00000000000 --- a/src/mame/includes/flkatck.h +++ /dev/null @@ -1,78 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Manuel Abadia -/************************************************************************* - - Flak Attack / MX5000 - -*************************************************************************/ -#ifndef MAME_INCLUDES_FLKATCK_H -#define MAME_INCLUDES_FLKATCK_H - -#pragma once - -#include "machine/gen_latch.h" -#include "machine/watchdog.h" -#include "machine/k007452.h" -#include "sound/k007232.h" -#include "video/k007121.h" -#include "tilemap.h" - -class flkatck_state : public driver_device -{ -public: - flkatck_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_vram(*this, "vram"), - m_spriteram(*this, "spriteram"), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_k007121(*this, "k007121"), - m_k007232(*this, "k007232"), - m_k007452(*this, "k007452"), - m_watchdog(*this, "watchdog"), - m_gfxdecode(*this, "gfxdecode"), - m_soundlatch(*this, "soundlatch") - { } - - void flkatck(machine_config &config); - -private: - /* memory pointers */ - required_shared_ptr m_vram; - required_shared_ptr m_spriteram; - - /* video-related */ - tilemap_t *m_k007121_tilemap[2]; - int m_flipscreen; - - /* misc */ - int m_irq_enabled; - - /* devices */ - required_device m_maincpu; - required_device m_audiocpu; - required_device m_k007121; - required_device m_k007232; - required_device m_k007452; - required_device m_watchdog; - required_device m_gfxdecode; - required_device m_soundlatch; - - void flkatck_bankswitch_w(uint8_t data); - uint8_t flkatck_ls138_r(offs_t offset); - void flkatck_ls138_w(offs_t offset, uint8_t data); - void vram_w(offs_t offset, uint8_t data); - void flkatck_k007121_regs_w(offs_t offset, uint8_t data); - TILE_GET_INFO_MEMBER(get_tile_info_A); - TILE_GET_INFO_MEMBER(get_tile_info_B); - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void video_start() override; - uint32_t screen_update_flkatck(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(flkatck_interrupt); - void volume_callback(uint8_t data); - void flkatck_map(address_map &map); - void flkatck_sound_map(address_map &map); -}; - -#endif // MAME_INCLUDES_FLKATCK_H diff --git a/src/mame/video/fastlane.cpp b/src/mame/video/fastlane.cpp deleted file mode 100644 index a59fbfbd18c..00000000000 --- a/src/mame/video/fastlane.cpp +++ /dev/null @@ -1,148 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Manuel Abadia -#include "emu.h" -#include "includes/fastlane.h" - - -void fastlane_state::fastlane_palette(palette_device &palette) const -{ - uint8_t const *const color_prom = memregion("proms")->base(); - for (int pal = 0; pal < 0x10; pal++) - { - for (int i = 0; i < 0x400; i++) - { - uint8_t const ctabentry = (i & 0x3f0) | color_prom[(pal << 4) | (i & 0x0f)]; - palette.set_pen_indirect((pal << 10) | i, ctabentry); - } - } -} - - - -/*************************************************************************** - - Callbacks for the TileMap code - -***************************************************************************/ - -TILE_GET_INFO_MEMBER(fastlane_state::get_tile_info0) -{ - uint8_t ctrl_3 = m_k007121->ctrlram_r(3); - uint8_t ctrl_4 = m_k007121->ctrlram_r(4); - uint8_t ctrl_5 = m_k007121->ctrlram_r(5); - int attr = m_videoram1[tile_index]; - int code = m_videoram1[tile_index + 0x400]; - int bit0 = (ctrl_5 >> 0) & 0x03; - int bit1 = (ctrl_5 >> 2) & 0x03; - int bit2 = (ctrl_5 >> 4) & 0x03; - int bit3 = (ctrl_5 >> 6) & 0x03; - int bank = ((attr & 0x80) >> 7) | - ((attr >> (bit0+2)) & 0x02) | - ((attr >> (bit1+1)) & 0x04) | - ((attr >> (bit2 )) & 0x08) | - ((attr >> (bit3-1)) & 0x10) | - ((ctrl_3 & 0x01) << 5); - int mask = (ctrl_4 & 0xf0) >> 4; - - bank = (bank & ~(mask << 1)) | ((ctrl_4 & mask) << 1); - - tileinfo.set(0, - code+bank*256, - 1 + 64 * (attr & 0x0f), - 0); -} - -TILE_GET_INFO_MEMBER(fastlane_state::get_tile_info1) -{ - uint8_t ctrl_3 = m_k007121->ctrlram_r(3); - uint8_t ctrl_4 = m_k007121->ctrlram_r(4); - uint8_t ctrl_5 = m_k007121->ctrlram_r(5); - int attr = m_videoram2[tile_index]; - int code = m_videoram2[tile_index + 0x400]; - int bit0 = (ctrl_5 >> 0) & 0x03; - int bit1 = (ctrl_5 >> 2) & 0x03; - int bit2 = (ctrl_5 >> 4) & 0x03; - int bit3 = (ctrl_5 >> 6) & 0x03; - int bank = ((attr & 0x80) >> 7) | - ((attr >> (bit0+2)) & 0x02) | - ((attr >> (bit1+1)) & 0x04) | - ((attr >> (bit2 )) & 0x08) | - ((attr >> (bit3-1)) & 0x10) | - ((ctrl_3 & 0x01) << 5); - int mask = (ctrl_4 & 0xf0) >> 4; - - bank = (bank & ~(mask << 1)) | ((ctrl_4 & mask) << 1); - - tileinfo.set(0, - code+bank*256, - 1 + 64 * (attr & 0x0f), - 0); -} - -/*************************************************************************** - - Start the video hardware emulation. - -***************************************************************************/ - -void fastlane_state::video_start() -{ - m_layer0 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fastlane_state::get_tile_info0)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_layer1 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fastlane_state::get_tile_info1)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - - m_layer0->set_scroll_rows(32); - - m_clip0 = m_screen->visible_area(); - m_clip0.min_x += 40; - - m_clip1 = m_screen->visible_area(); - m_clip1.max_x = 39; - m_clip1.min_x = 0; -} - -/*************************************************************************** - - Memory Handlers - -***************************************************************************/ - -void fastlane_state::fastlane_vram1_w(offs_t offset, uint8_t data) -{ - m_videoram1[offset] = data; - m_layer0->mark_tile_dirty(offset & 0x3ff); -} - -void fastlane_state::fastlane_vram2_w(offs_t offset, uint8_t data) -{ - m_videoram2[offset] = data; - m_layer1->mark_tile_dirty(offset & 0x3ff); -} - - - -/*************************************************************************** - - Screen Refresh - -***************************************************************************/ - -uint32_t fastlane_state::screen_update_fastlane(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - rectangle finalclip0 = m_clip0, finalclip1 = m_clip1; - int i, xoffs; - - finalclip0 &= cliprect; - finalclip1 &= cliprect; - - /* set scroll registers */ - xoffs = m_k007121->ctrlram_r(0); - for (i = 0; i < 32; i++) - m_layer0->set_scrollx(i, m_k007121_regs[0x20 + i] + xoffs - 40); - - m_layer0->set_scrolly(0, m_k007121->ctrlram_r(2)); - - m_layer0->draw(screen, bitmap, finalclip0, 0, 0); - m_k007121->sprites_draw(bitmap, cliprect, m_gfxdecode->gfx(0), *m_palette, m_spriteram, 0, 40, 0, screen.priority(), (uint32_t)-1); - m_layer1->draw(screen, bitmap, finalclip1, 0, 0); - return 0; -} diff --git a/src/mame/video/flkatck.cpp b/src/mame/video/flkatck.cpp deleted file mode 100644 index 4a9227b68e0..00000000000 --- a/src/mame/video/flkatck.cpp +++ /dev/null @@ -1,160 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Manuel Abadia -/*************************************************************************** - - Functions to emulate the video hardware of the machine. - -***************************************************************************/ - -#include "emu.h" -#include "includes/flkatck.h" -#include "screen.h" - -/*************************************************************************** - - Callbacks for the K007121 - -***************************************************************************/ - -TILE_GET_INFO_MEMBER(flkatck_state::get_tile_info_A) -{ - uint8_t ctrl_0 = m_k007121->ctrlram_r(0); - uint8_t ctrl_2 = m_k007121->ctrlram_r(2); - uint8_t ctrl_3 = m_k007121->ctrlram_r(3); - uint8_t ctrl_4 = m_k007121->ctrlram_r(4); - uint8_t ctrl_5 = m_k007121->ctrlram_r(5); - int attr = m_vram[tile_index]; - int code = m_vram[tile_index + 0x400]; - int bit0 = (ctrl_5 >> 0) & 0x03; - int bit1 = (ctrl_5 >> 2) & 0x03; - int bit2 = (ctrl_5 >> 4) & 0x03; - int bit3 = (ctrl_5 >> 6) & 0x03; - int bank = ((attr & 0x80) >> 7) | - ((attr >> (bit0 + 2)) & 0x02) | - ((attr >> (bit1 + 1)) & 0x04) | - ((attr >> (bit2 )) & 0x08) | - ((attr >> (bit3 - 1)) & 0x10) | - ((ctrl_3 & 0x01) << 5); - int mask = (ctrl_4 & 0xf0) >> 4; - - bank = (bank & ~(mask << 1)) | ((ctrl_4 & mask) << 1); - - if ((attr == 0x0d) && (!ctrl_0) && (!ctrl_2)) - bank = 0; /* this allows the game to print text - in all banks selected by the k007121 */ - - tileinfo.set(0, - code + 256*bank, - (attr & 0x0f) + 16, - (attr & 0x20) ? TILE_FLIPY : 0); -} - -TILE_GET_INFO_MEMBER(flkatck_state::get_tile_info_B) -{ - int attr = m_vram[tile_index + 0x800]; - int code = m_vram[tile_index + 0xc00]; - - tileinfo.set(0, - code, - (attr & 0x0f) + 16, - 0); -} - - -/*************************************************************************** - - Start the video hardware emulation. - -***************************************************************************/ - -void flkatck_state::video_start() -{ - m_k007121_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(flkatck_state::get_tile_info_A)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_k007121_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(flkatck_state::get_tile_info_B)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); -} - - -/*************************************************************************** - - Memory handlers - -***************************************************************************/ - -void flkatck_state::vram_w(offs_t offset, uint8_t data) -{ - m_vram[offset] = data; - if (offset & 0x800) /* score */ - m_k007121_tilemap[1]->mark_tile_dirty(offset & 0x3ff); - else - m_k007121_tilemap[0]->mark_tile_dirty(offset & 0x3ff); -} - -void flkatck_state::flkatck_k007121_regs_w(offs_t offset, uint8_t data) -{ - switch (offset) - { - case 0x04: /* ROM bank select */ - if (data != m_k007121->ctrlram_r(4)) - machine().tilemap().mark_all_dirty(); - break; - - case 0x07: /* flip screen + IRQ control */ - m_flipscreen = data & 0x08; - machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - m_irq_enabled = data & 0x02; - break; - } - - m_k007121->ctrl_w(offset, data); -} - - -/*************************************************************************** - - Display Refresh - -***************************************************************************/ - -uint32_t flkatck_state::screen_update_flkatck(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - rectangle clip[2]; - const rectangle &visarea = screen.visible_area(); - // TODO: reversed polarity? Hard to say, fwiw Combat School uses this in reverse ... - uint16_t sprite_buffer = (m_k007121->ctrlram_r(3) & 8) * 0x100; - - if (m_flipscreen) - { - clip[0] = visarea; - clip[0].max_x -= 40; - - clip[1] = visarea; - clip[1].min_x = clip[1].max_x - 40; - - m_k007121_tilemap[0]->set_scrollx(0, m_k007121->ctrlram_r(0) - 56 ); - m_k007121_tilemap[0]->set_scrolly(0, m_k007121->ctrlram_r(2)); - m_k007121_tilemap[1]->set_scrollx(0, -16); - } - else - { - clip[0] = visarea; - clip[0].min_x += 40; - - clip[1] = visarea; - clip[1].max_x = 39; - clip[1].min_x = 0; - - m_k007121_tilemap[0]->set_scrollx(0, m_k007121->ctrlram_r(0) - 40 ); - m_k007121_tilemap[0]->set_scrolly(0, m_k007121->ctrlram_r(2)); - m_k007121_tilemap[1]->set_scrollx(0, 0); - } - - /* compute clipping */ - clip[0] &= cliprect; - clip[1] &= cliprect; - - /* draw the graphics */ - m_k007121_tilemap[0]->draw(screen, bitmap, clip[0], 0, 0); - m_k007121->sprites_draw(bitmap, cliprect, m_gfxdecode->gfx(0), m_gfxdecode->palette(), &m_spriteram[sprite_buffer], 0, 40, 0, screen.priority(), (uint32_t)-1, true); - m_k007121_tilemap[1]->draw(screen, bitmap, clip[1], 0, 0); - return 0; -}