fastlane.cpp, flkatck.cpp: used finders and arrays where applicable, other minor cleanups

This commit is contained in:
Ivan Vangelista 2022-03-16 18:02:37 +01:00
parent 151f3caaad
commit 7c7bab4dd0
7 changed files with 562 additions and 637 deletions

View File

@ -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",

View File

@ -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<cpu_device> m_maincpu;
// memory pointers
required_shared_ptr<uint8_t> m_k007121_regs;
required_shared_ptr_array<uint8_t, 2> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
required_memory_bank m_prgbank;
// video-related
tilemap_t *m_layer[2];
rectangle m_clip[2];
// devices
required_device_array<k007232_device, 2> m_k007232;
required_device<k007121_device> m_k007121;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
void k007121_registers_w(offs_t offset, uint8_t data);
void bankswitch_w(uint8_t data);
template <uint8_t Which> void vram_w(offs_t offset, uint8_t data);
template <uint8_t Which> uint8_t k007232_r(offs_t offset);
template <uint8_t Which> void k007232_w(offs_t offset, uint8_t data);
template <uint8_t Which> 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 <uint8_t Which> 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 <uint8_t Which>
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 <uint8_t Which>
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 Which>
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 <uint8_t Which>
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 <uint8_t Which>
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 )

View File

@ -7,42 +7,270 @@
Driver by:
Manuel Abadia <emumanu+mame@gmail.com>
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<uint8_t> m_vram;
required_shared_ptr<uint8_t> 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<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<k007121_device> m_k007121;
required_device<k007232_device> m_k007232;
required_device<watchdog_timer_device> m_watchdog;
required_device<gfxdecode_device> m_gfxdecode;
required_device<generic_latch_8_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 )

View File

@ -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<cpu_device> m_maincpu;
/* memory pointers */
required_shared_ptr<uint8_t> m_k007121_regs;
required_shared_ptr<uint8_t> m_videoram1;
required_shared_ptr<uint8_t> m_videoram2;
required_shared_ptr<uint8_t> m_spriteram;
/* video-related */
tilemap_t *m_layer0;
tilemap_t *m_layer1;
rectangle m_clip0;
rectangle m_clip1;
/* devices */
required_device<k007232_device> m_k007232_1;
required_device<k007232_device> m_k007232_2;
required_device<k007121_device> m_k007121;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_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

View File

@ -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<uint8_t> m_vram;
required_shared_ptr<uint8_t> m_spriteram;
/* video-related */
tilemap_t *m_k007121_tilemap[2];
int m_flipscreen;
/* misc */
int m_irq_enabled;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<k007121_device> m_k007121;
required_device<k007232_device> m_k007232;
required_device<k007452_device> m_k007452;
required_device<watchdog_timer_device> m_watchdog;
required_device<gfxdecode_device> m_gfxdecode;
required_device<generic_latch_8_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

View File

@ -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;
}

View File

@ -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;
}