// license:BSD-3-Clause
// copyright-holders:David Haywood, Phil Bennett
/***************************************************************************
Kyuukoukabakugekitai - Dive Bomber Squad
(C) Konami 1989
****************************************************************************
PCB Layout
----------
GX840 PWB35165
|--------------------------------------------------------------------------|
| |
| U15 Z80B Z80B DSW1 |
| DSW2 |
| HM6116AP-15 DSW3 |
| U16 U21 DSW4 |
| MN53060KGB 8464A-15L U20 |
| U17 (QFP148) 8464A-15L |
| |
| J |
| A |
| M |
| U18 24.0MHz 051316 Z80B M |
| A |
| U83 U34 U19 |
| MB81C86-55 MB81C86-55 U82 U33 8464A-15L |
| MB81C86-55 MB81C86-55 U81 U22 |
| |
| 051316 |
| |
| CN1 CN2 SN76489 |
| SN76489 |
| SN76489 |
| SN76489 |
| HM6116AP-15 U23 SN76489 |
| U22 SN76489 VR |
| |
|--------------------------------------------------------------------------|
Notes:
There are numerous wire modificationss connecting pins of U15-U18 to
various other components on the PCB
MB81C86 - 64kx4 SRAM
HM6116AP - 2kx8 SRAM
8464A - 8kx8 SRAM
MN53060KGB - Panasonic CMOS gate array (6016 gates)
051316 - Konami PSAC
CN1/CN2 - ROM board connectors
ROM Board
---------
GX840 PWB451716
|--------------------------|
| |
| U8 |
| |
| U3 U7 U10 |
| |
| U2 U6 U10 |
| |
| U41 U5 U9 |
| |
|--------------------------|
Notes:
All ROMs are 27512 EPROMs
To do:
* Verify layer alignment
* Deduce unknown DIP switch settings
To verify against original HW:
* Game has no sprites when you reach level 4 and becomes unplayable
* Game often hangs (sprites no longer animate, screen scrolls/rotates endlessly) due to a communication breakdown
Data sent from one CPU to another is occasionally overwritten before the recipient can read the first value
* Game hangs if you die from hitting a regular enemy at the same time a boss dies
* Bosses can't kill you directly
* Cocktail mode is broken
* UFOs that appear during the boss battle wrap around when leaving the right side of the screen
* Sometimes a stray, bad explosion sprite appears in the top left corner after you respawn
* Lives counter is corrupt for > 4 lives
****************************************************************************/
#include "emu.h"
#include "includes/divebomb.h"
#include "screen.h"
#include "speaker.h"
/*************************************
*
* Main CPU
*
*************************************/
void divebomb_state::divebomb_fgcpu_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0xc000, 0xc7ff).ram().w(this, FUNC(divebomb_state::fgram_w)).share("fgram");
map(0xe000, 0xffff).ram();
}
void divebomb_state::divebomb_fgcpu_iomap(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).w("sn0", FUNC(sn76489_device::write));
map(0x01, 0x01).w("sn1", FUNC(sn76489_device::write));
map(0x02, 0x02).w("sn2", FUNC(sn76489_device::write));
map(0x03, 0x03).w("sn3", FUNC(sn76489_device::write));
map(0x04, 0x04).w("sn4", FUNC(sn76489_device::write));
map(0x05, 0x05).w("sn5", FUNC(sn76489_device::write));
map(0x10, 0x10).r(m_roz2fg_latch, FUNC(generic_latch_8_device::read)).w("fg2roz", FUNC(generic_latch_8_device::write));
map(0x20, 0x20).r(m_spr2fg_latch, FUNC(generic_latch_8_device::read)).w("fg2spr", FUNC(generic_latch_8_device::write));
map(0x30, 0x30).portr("IN0");
map(0x31, 0x31).portr("IN1");
map(0x32, 0x32).portr("DSW1");
map(0x33, 0x33).portr("DSW2");
// 34/35 aren't read but PCB has 4 banks of dips populated, so logically they would map here even if unused
map(0x34, 0x34).portr("DSW3");
map(0x35, 0x35).portr("DSW4");
map(0x36, 0x36).portr("SYSTEM");
map(0x37, 0x37).r(this, FUNC(divebomb_state::fgcpu_comm_flags_r));
}
READ8_MEMBER(divebomb_state::fgcpu_comm_flags_r)
{
uint8_t result = 0;
if (m_roz2fg_latch->pending_r())
result |= 1;
if (m_spr2fg_latch->pending_r())
result |= 2;
return result;
}
/*************************************
*
* Sprite CPU
*
*************************************/
void divebomb_state::divebomb_spritecpu_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0xc000, 0xc7ff).ram().share("spriteram");
map(0xc800, 0xdfff).nopw();
map(0xe000, 0xffff).ram();
}
void divebomb_state::divebomb_spritecpu_iomap(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).w(this, FUNC(divebomb_state::spritecpu_port00_w));
map(0x80, 0x80).r("fg2spr", FUNC(generic_latch_8_device::read)).w(m_spr2fg_latch, FUNC(generic_latch_8_device::write));
}
WRITE8_MEMBER(divebomb_state::spritecpu_port00_w)
{
// Written with 0x00 on reset
// Written with 0x34 7 times in succession on occasion (see PC:0x00E3)
}
/*************************************
*
* ROZ CPU
*
*************************************/
template<int Chip>
WRITE8_MEMBER(divebomb_state::rozcpu_wrap_enable_w)
{
m_k051316[Chip]->wraparound_enable(!(data & 1));
}
template<int Chip>
WRITE8_MEMBER(divebomb_state::rozcpu_enable_w)
{
m_roz_enable[Chip] = !(data & 1);
}
void divebomb_state::divebomb_rozcpu_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("rozbank");
map(0xc000, 0xc7ff).ram().rw(m_k051316[0], FUNC(k051316_device::read), FUNC(k051316_device::write));
map(0xd000, 0xd7ff).ram().rw(m_k051316[1], FUNC(k051316_device::read), FUNC(k051316_device::write));
map(0xe000, 0xffff).ram();
}
void divebomb_state::divebomb_rozcpu_iomap(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).w(this, FUNC(divebomb_state::rozcpu_bank_w));
map(0x10, 0x10).w(this, FUNC(divebomb_state::rozcpu_wrap_enable_w<1>));
map(0x12, 0x12).w(this, FUNC(divebomb_state::rozcpu_enable_w<0>));
map(0x13, 0x13).w(this, FUNC(divebomb_state::rozcpu_enable_w<1>));
map(0x14, 0x14).w(this, FUNC(divebomb_state::rozcpu_wrap_enable_w<0>));
map(0x20, 0x2f).w(m_k051316[0], FUNC(k051316_device::ctrl_w));
map(0x30, 0x3f).w(m_k051316[1], FUNC(k051316_device::ctrl_w));
map(0x40, 0x40).r("fg2roz", FUNC(generic_latch_8_device::read)).w(m_roz2fg_latch, FUNC(generic_latch_8_device::write));
map(0x50, 0x50).w(this, FUNC(divebomb_state::rozcpu_pal_w));
}
WRITE8_MEMBER(divebomb_state::rozcpu_bank_w)
{
uint32_t bank = bitswap<8>(data, 4, 5, 6, 7, 3, 2, 1, 0) >> 4;
m_rozbank->set_entry(bank);
if (data & 0x0f)
logerror("rozcpu_bank_w %02x\n", data);
}
/*************************************
*
* Port definitions
*
*************************************/
static INPUT_PORTS_START( divebomb )
PORT_START("DSW1") // If the first 4 are on it engages freeplay
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3")
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSW2")
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x03, "3" )
PORT_DIPSETTING( 0x02, "5" )
PORT_DIPSETTING( 0x01, "7" )
PORT_DIPSETTING( 0x00, "9" )
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) )
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSW3")
PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW3:1" )
PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW3:2" )
PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW3:3" )
PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" )
PORT_DIPUNUSED_DIPLOC( 0x10, 0x10, "SW3:5" )
PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW3:6" )
PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW3:7" )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW3:8" )
PORT_START("DSW4")
PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW4:1" )
PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW4:2" )
PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "SW4:3" )
PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW4:4" )
PORT_DIPUNUSED_DIPLOC( 0x10, 0x10, "SW4:5" )
PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW4:6" )
PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW4:7" )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW4:8" )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
/*************************************
*
* Graphics definitions
*
*************************************/
static const gfx_layout tiles8x8_layout =
{
8,8,
RGN_FRAC(1,1),
2,
{ 8,0 },
{ STEP8(0,1) },
{ STEP8(0,8*2) },
8*8*2
};
static const gfx_layout tiles16x16_layout =
{
16,16,
RGN_FRAC(1,1),
4,
{ 24,16,8,0 },
{ STEP8(0,1), STEP8(4*8,1) },
{ STEP16(0,4*16) },
16*16*4
};
static GFXDECODE_START( gfx_divebomb )
GFXDECODE_ENTRY( "fgrom", 0, tiles8x8_layout, 0x400+0x400, 16 )
GFXDECODE_ENTRY( "sprites", 0, tiles16x16_layout, 0x400+0x400+0x400, 16 )
GFXDECODE_END
/*************************************
*
* Machine driver
*
*************************************/
MACHINE_CONFIG_START(divebomb_state::divebomb)
MCFG_DEVICE_ADD("fgcpu", Z80,XTAL1/4) // ?
MCFG_DEVICE_PROGRAM_MAP(divebomb_fgcpu_map)
MCFG_DEVICE_IO_MAP(divebomb_fgcpu_iomap)
MCFG_DEVICE_ADD("spritecpu", Z80,XTAL1/4) // ?
MCFG_DEVICE_PROGRAM_MAP(divebomb_spritecpu_map)
MCFG_DEVICE_IO_MAP(divebomb_spritecpu_iomap)
MCFG_DEVICE_ADD("rozcpu", Z80,XTAL1/4) // ?
MCFG_DEVICE_PROGRAM_MAP(divebomb_rozcpu_map)
MCFG_DEVICE_IO_MAP(divebomb_rozcpu_iomap)
MCFG_QUANTUM_PERFECT_CPU("fgcpu")
MCFG_INPUT_MERGER_ANY_HIGH("fgcpu_irq")
MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("fgcpu", INPUT_LINE_IRQ0))
MCFG_GENERIC_LATCH_8_ADD("fg2spr")
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("spritecpu", INPUT_LINE_IRQ0))
MCFG_GENERIC_LATCH_8_ADD("fg2roz")
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("rozcpu", INPUT_LINE_IRQ0))
MCFG_GENERIC_LATCH_8_ADD("spr2fg")
MCFG_GENERIC_LATCH_DATA_PENDING_CB(WRITELINE("fgcpu_irq", input_merger_any_high_device, in_w<0>))
MCFG_GENERIC_LATCH_8_ADD("roz2fg")
MCFG_GENERIC_LATCH_DATA_PENDING_CB(WRITELINE("fgcpu_irq", input_merger_any_high_device, in_w<1>))
MCFG_DEVICE_ADD("k051316_1", K051316, 0)
MCFG_GFX_PALETTE("palette")
MCFG_K051316_BPP(8)
MCFG_K051316_WRAP(0)
MCFG_K051316_OFFSETS(-88, -16)
MCFG_K051316_CB(divebomb_state, zoom_callback_1)
MCFG_DEVICE_ADD("k051316_2", K051316, 0)
MCFG_GFX_PALETTE("palette")
MCFG_K051316_BPP(8)
MCFG_K051316_WRAP(0)
MCFG_K051316_OFFSETS(-88, -16)
MCFG_K051316_CB(divebomb_state, zoom_callback_2)
MCFG_MACHINE_START_OVERRIDE(divebomb_state, divebomb)
MCFG_MACHINE_RESET_OVERRIDE(divebomb_state, divebomb)
MCFG_VIDEO_START_OVERRIDE(divebomb_state, divebomb)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(256, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1-32)
MCFG_SCREEN_UPDATE_DRIVER(divebomb_state, screen_update_divebomb)
MCFG_SCREEN_PALETTE("palette")
MCFG_SCREEN_VBLANK_CALLBACK(INPUTLINE("fgcpu", INPUT_LINE_NMI))
MCFG_DEVCB_CHAIN_OUTPUT(INPUTLINE("spritecpu", INPUT_LINE_NMI))
MCFG_DEVCB_CHAIN_OUTPUT(INPUTLINE("rozcpu", INPUT_LINE_NMI))
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_divebomb)
MCFG_PALETTE_ADD("palette", 0x400+0x400+0x400+0x100)
MCFG_PALETTE_INIT_OWNER(divebomb_state, divebomb)
/* sound hardware */
SPEAKER(config, "mono").front_center();
// All frequencies unverified
MCFG_DEVICE_ADD("sn0", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_DEVICE_ADD("sn1", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_DEVICE_ADD("sn2", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_DEVICE_ADD("sn3", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_DEVICE_ADD("sn4", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_DEVICE_ADD("sn5", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MACHINE_CONFIG_END
/*************************************
*
* Driver initialization
*
*************************************/
ROM_START( divebomb )
ROM_REGION( 0x08000, "fgcpu", 0 )
ROM_LOAD( "u20.27256", 0x00000, 0x08000, CRC(89a30c82) SHA1(ecb3dcc00192b9646dab55ec6c102ab1d2e403e8) )
ROM_REGION( 0x08000, "spritecpu", 0 )
ROM_LOAD( "u21.27256", 0x00000, 0x08000, CRC(3896d3f6) SHA1(86d10c907bf00977656d8fa426b2f1ac211acdb3) )
ROM_REGION( 0x08000, "rozcpu", 0 )
ROM_LOAD( "u19.27256", 0x00000, 0x08000, CRC(16e26fb9) SHA1(9602c79f947f5267e5f4f4f8dedc4697861a519b) )
ROM_REGION( 0x40000, "rozcpudata", 0 ) // on sub-board
ROM_LOAD( "u9.27512", 0x00000, 0x10000, CRC(c842f831) SHA1(badb38908a285e54b85e369342fd6ecb8fd68bbb) )
ROM_LOAD( "u10.27512", 0x10000, 0x10000, CRC(c77f3574) SHA1(06b7576d5949906ee3209c011cd30e7066bb20cc) )
ROM_LOAD( "u11.27512", 0x20000, 0x10000, CRC(8d46be7d) SHA1(7751df1f39b208169f04a5b904cb63e9fb53bba8) )
// u12 not populated
ROM_REGION( 0x10000, "fgrom", 0 )
ROM_LOAD16_BYTE( "u22.27256", 0x00000, 0x08000, CRC(f816f9c5) SHA1(b8e136463a1b4c81960c6b7350472d82af0fb1fb) )
ROM_LOAD16_BYTE( "u23.27256", 0x00001, 0x08000, CRC(d2600570) SHA1(a7f7e182670e7b95321c4ec8278ce915bbe2b5ca) )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD32_BYTE( "u15.27c100", 0x00000, 0x20000, CRC(ccba7fa0) SHA1(5eb4c1e458e7810e0f9db92946474d6da65f1a1b) )
ROM_LOAD32_BYTE( "u16.27c100", 0x00001, 0x20000, CRC(16891fef) SHA1(a4723958509bccc73138306e58c355325ec342a3) )
ROM_LOAD32_BYTE( "u17.27c100", 0x00002, 0x20000, CRC(f4cbc97f) SHA1(1e13bc18db128575ca8e6998e9dd6f7dc37a99b8) )
ROM_LOAD32_BYTE( "u18.27c100", 0x00003, 0x20000, CRC(91ab9d89) SHA1(98454df4638bb831babb1796b095169851e6cf40) )
ROM_REGION( 0x30000, "k051316_1", ROMREGION_INVERT ) // on sub-board
ROM_LOAD( "u1.27512", 0x00000, 0x10000, CRC(99af1e18) SHA1(5d63130313fdd85c58e1d6b59e42b75a15328a6b) )
ROM_LOAD( "u2.27512", 0x10000, 0x10000, CRC(99c8d516) SHA1(6205907bd526181542f4d58d442667595aec9730) )
ROM_LOAD( "u3.27512", 0x20000, 0x10000, CRC(5ab4af3c) SHA1(ab8632e37a42f2f0db9b22c8577c4f09718ccc7c) )
// u4 not populated
ROM_REGION( 0x40000, "k051316_2", ROMREGION_INVERT ) // on sub-board
ROM_LOAD( "u5.27512", 0x00000, 0x10000, CRC(6726d022) SHA1(314fcec87f3bf335356b24224158233d91012675) )
ROM_LOAD( "u6.27512", 0x10000, 0x10000, CRC(756b8a12) SHA1(2869c18ef1592d00dbc340facac2002d21adf6bc) )
ROM_LOAD( "u7.27512", 0x20000, 0x10000, CRC(01c07d84) SHA1(45e05f15e94a32adbd488a4f77a9619e7e6b63f3) )
ROM_LOAD( "u8.27512", 0x30000, 0x10000, CRC(5b9e7caa) SHA1(85510c0b861bad6a1411afc1d628bc7c448c9fef) )
// there are 12 PROMs, 4x banks of 3
ROM_REGION( 0xc00, "fg_proms", 0 ) // text layer palette
ROM_LOAD( "u35.mb7122.bin", 0x800, 0x400, CRC(e890259d) SHA1(f96e00da6de3b868e50f2347b83f8e5727b85d9b) )
ROM_LOAD( "u36.mb7122.bin", 0x400, 0x400, CRC(0c1ecdb5) SHA1(4ba9e283c747d6a760fe2e0a8b2bfdfcc55a3969) )
ROM_LOAD( "u37.mb7122.bin", 0x000, 0x400, CRC(55c17465) SHA1(153e99a09604467ddd8c641d60c5f1b8d9a205b4) )
ROM_REGION( 0xc00, "k051316_1_pr", 0 ) // front roz ( k051316_1 )
// looks like banks 0,1,2 are valid
ROM_LOAD( "u29.mb7122.bin", 0x000, 0x400, CRC(8b3d60d2) SHA1(a9ac4d3dd5e72522717dd18c32d3f88b75bb077c) ) // the last 0x100 block is invalid (copy of data in u33)
ROM_LOAD( "u30.mb7122.bin", 0x400, 0x400, CRC(0aeb1a88) SHA1(7b00e85ced210a5f7dfc100c15baa9e1735c7c80) ) // the last 0x100 block is empty
ROM_LOAD( "u31.mb7122.bin", 0x800, 0x400, CRC(75cf5f3d) SHA1(ec02b99ab65e561596b773918569b28313f21835) ) // the last 0x100 block is invalid (copy of data in u33)
ROM_REGION( 0xc00, "k051316_2_pr", 0 ) // back roz ( k051316_2 )
// 4 valid palettes but our code is only using 1
ROM_LOAD( "u34.mb7122.bin", 0x000, 0x400, CRC(e0e2d93b) SHA1(9043929520abde15727e9333c153cf97104c9003) )
ROM_LOAD( "u33.mb7122.bin", 0x400, 0x400, CRC(4df75f4f) SHA1(0157d6e268cdd797622c712648eb2e88214b12d9) )
ROM_LOAD( "u32.mb7122.bin", 0x800, 0x400, CRC(e2e4b443) SHA1(e97a4e2988e29f992c5dec6f817a783b14535742) )
ROM_REGION( 0x300, "spr_proms", 0 ) // sprite layer palette
ROM_LOAD( "u83.mb7114.bin", 0x000, 0x100, CRC(d216110d) SHA1(3de935dbf876f82864b8b69049c8681101619411) )
ROM_LOAD( "u82.mb7114.bin", 0x100, 0x100, CRC(52637774) SHA1(919727e337a716dbd18b51e26e45025b82aeba79) )
ROM_LOAD( "u81.mb7114.bin", 0x200, 0x100, CRC(c59b0857) SHA1(aea4cb8d1ab59b54f90edb96d4ac42b1dd6bdcbe) )
ROM_END
/*************************************
*
* Driver initialization
*
*************************************/
MACHINE_START_MEMBER(divebomb_state, divebomb)
{
m_rozbank->configure_entries(0, 16, memregion("rozcpudata")->base(), 0x4000);
save_item(NAME(m_roz_enable));
save_item(NAME(m_roz_pal));
}
MACHINE_RESET_MEMBER(divebomb_state, divebomb)
{
for (int chip = 0; chip < 2; chip++)
{
m_roz_enable[chip] = false;
m_k051316[chip]->wraparound_enable(false);
}
m_fgcpu_irq->in_w<0>(CLEAR_LINE);
m_fgcpu_irq->in_w<1>(CLEAR_LINE);
}
/*************************************
*
* Game driver(s)
*
*************************************/
// According to a flyer, the world release was to be called 'Gaia'. The Gaia title graphics are present in the ROMs.
GAME( 1989, divebomb, 0, divebomb, divebomb, divebomb_state, empty_init, ROT270, "Konami", "Kyuukoukabakugekitai - Dive Bomber Squad (Japan, prototype)", MACHINE_IS_INCOMPLETE | MACHINE_SUPPORTS_SAVE )