New games added or promoted from NOT_WORKING status

Kyuukoukabakugekitai - Dive Bomber Squad [Andy Welburn, ShouTime, Smitdogg, Haze, Imhotep, Ryan Holtz, hap, Zhivko Dimitrov, spogghi, ANY, Arjen Hoekman, Arcade Addict, krick, Dullaron, Eddie, f205v, rtw, Rod_Wod, Fabien Marsaud, InsertMoreCoins, Jan Stuhler, trap15, Macaw, Team Japump, Brandon Munger, Juan Manuel Gutierrez, abelardator2, Jordi Bosch Creus, haynor666, Nestor Acebo Jimenez, Carl Perry, Jeremy McElroy, Steven Boswell, JJaVMeTaL, Steven LeMaire, Matthew Shultz, Mark Riley has no toaster, Carlos Gutierrez, Bjorn Stahl, Aldo Vittorio De Luca, Bruno Celsi, Philip Zumbrun, cornishdavey, Stefano De Dionigi, motoschifo, Mamesick, Daniel Hitchcock, Patrick Wheeler, bisus, desodeso, Swos, Don Zaucker, Tox Nox Fox, Zak0077, giuppo, Moket, Frankie, robindan77, biasini, Dr_Zero, motoschifo, Mameremember, John Wilke, Sean Sutton, Renato Mucciarelli, Berlioux Julien, Lior Aouate, The Dumping Union]
This commit is contained in:
Phil Bennett 2016-06-16 20:05:21 -07:00
parent 59f1eeb2e8
commit 9d31bd76d3
6 changed files with 938 additions and 0 deletions

View File

@ -2117,6 +2117,9 @@ files {
MAME_DIR .. "src/mame/drivers/ddribble.cpp",
MAME_DIR .. "src/mame/includes/ddribble.h",
MAME_DIR .. "src/mame/video/ddribble.cpp",
MAME_DIR .. "src/mame/drivers/divebomb.cpp",
MAME_DIR .. "src/mame/includes/divebomb.h",
MAME_DIR .. "src/mame/video/divebomb.cpp",
MAME_DIR .. "src/mame/drivers/djmain.cpp",
MAME_DIR .. "src/mame/includes/djmain.h",
MAME_DIR .. "src/mame/video/djmain.cpp",

View File

@ -301,6 +301,7 @@ dfruit.cpp
dgpix.cpp
dietgo.cpp
discoboy.cpp
divebomb.cpp
diverboy.cpp
djboy.cpp
djmain.cpp

631
src/mame/drivers/divebomb.cpp Executable file
View File

@ -0,0 +1,631 @@
// 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"
/*************************************
*
* Main CPU
*
*************************************/
static ADDRESS_MAP_START( divebomb_fgcpu_map, AS_PROGRAM, 8, divebomb_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(fgram_w) AM_SHARE("fgram")
AM_RANGE(0xe000, 0xffff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( divebomb_fgcpu_iomap, AS_IO, 8, divebomb_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x00) AM_DEVWRITE("sn0", sn76489_device, write)
AM_RANGE(0x01, 0x01) AM_DEVWRITE("sn1", sn76489_device, write)
AM_RANGE(0x02, 0x02) AM_DEVWRITE("sn2", sn76489_device, write)
AM_RANGE(0x03, 0x03) AM_DEVWRITE("sn3", sn76489_device, write)
AM_RANGE(0x04, 0x04) AM_DEVWRITE("sn4", sn76489_device, write)
AM_RANGE(0x05, 0x05) AM_DEVWRITE("sn5", sn76489_device, write)
AM_RANGE(0x10, 0x10) AM_READWRITE(fgcpu_roz_comm_r, fgcpu_roz_comm_w)
AM_RANGE(0x20, 0x20) AM_READWRITE(fgcpu_spr_comm_r, fgcpu_spr_comm_w)
AM_RANGE(0x30, 0x30) AM_READ_PORT("IN0")
AM_RANGE(0x31, 0x31) AM_READ_PORT("IN1")
AM_RANGE(0x32, 0x32) AM_READ_PORT("DSW1")
AM_RANGE(0x33, 0x33) AM_READ_PORT("DSW2")
// 34/35 aren't read but PCB has 4 banks of dips populated, so logically they would map here even if unused
AM_RANGE(0x34, 0x34) AM_READ_PORT("DSW3")
AM_RANGE(0x35, 0x35) AM_READ_PORT("DSW4")
AM_RANGE(0x36, 0x36) AM_READ_PORT("SYSTEM")
AM_RANGE(0x37, 0x37) AM_READ(fgcpu_comm_flags_r)
ADDRESS_MAP_END
READ8_MEMBER(divebomb_state::fgcpu_spr_comm_r)
{
has_fromsprite = false;
update_irqs();
return from_sprite;
}
WRITE8_MEMBER(divebomb_state::fgcpu_spr_comm_w)
{
m_spritecpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
to_spritecpu = data;
}
READ8_MEMBER(divebomb_state::fgcpu_roz_comm_r)
{
has_fromroz = false;
update_irqs();
return from_roz;
}
WRITE8_MEMBER(divebomb_state::fgcpu_roz_comm_w)
{
m_rozcpucpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
to_rozcpu = data;
}
READ8_MEMBER(divebomb_state::fgcpu_comm_flags_r)
{
UINT8 result = 0;
if (has_fromroz)
result |= 1;
if (has_fromsprite)
result |= 2;
return result;
}
/*************************************
*
* Sprite CPU
*
*************************************/
static ADDRESS_MAP_START( divebomb_spritecpu_map, AS_PROGRAM, 8, divebomb_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0xc800, 0xdfff) AM_WRITENOP
AM_RANGE(0xe000, 0xffff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( divebomb_spritecpu_iomap, AS_IO, 8, divebomb_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x00) AM_WRITE(spritecpu_port00_w)
AM_RANGE(0x80, 0x80) AM_READWRITE(spritecpu_comm_r, spritecpu_comm_w)
ADDRESS_MAP_END
READ8_MEMBER(divebomb_state::spritecpu_comm_r)
{
m_spritecpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
return to_spritecpu;
}
WRITE8_MEMBER(divebomb_state::spritecpu_comm_w)
{
from_sprite = data;
has_fromsprite = true;
update_irqs();
}
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
*
*************************************/
static ADDRESS_MAP_START( divebomb_rozcpu_map, AS_PROGRAM, 8, divebomb_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1")
AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_DEVREADWRITE("k051316_1", k051316_device, read, write)
AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_DEVREADWRITE("k051316_2", k051316_device, read, write)
AM_RANGE(0xe000, 0xffff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( divebomb_rozcpu_iomap, AS_IO, 8, divebomb_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x00) AM_WRITE(rozcpu_bank_w)
AM_RANGE(0x10, 0x10) AM_WRITE(rozcpu_wrap2_enable_w)
AM_RANGE(0x12, 0x12) AM_WRITE(rozcpu_enable1_w)
AM_RANGE(0x13, 0x13) AM_WRITE(rozcpu_enable2_w)
AM_RANGE(0x14, 0x14) AM_WRITE(rozcpu_wrap1_enable_w)
AM_RANGE(0x20, 0x2f) AM_DEVWRITE("k051316_1", k051316_device, ctrl_w)
AM_RANGE(0x30, 0x3f) AM_DEVWRITE("k051316_2", k051316_device, ctrl_w)
AM_RANGE(0x40, 0x40) AM_READWRITE(rozcpu_comm_r, rozcpu_comm_w)
AM_RANGE(0x50, 0x50) AM_WRITE(rozcpu_pal_w)
ADDRESS_MAP_END
WRITE8_MEMBER(divebomb_state::rozcpu_bank_w)
{
UINT32 bank = BITSWAP8(data, 4, 5, 6, 7, 3, 2, 1, 0) >> 4;
m_bank1->set_entry(bank);
if (data & 0x0f)
logerror("rozcpu_bank_w %02x\n", data);
}
READ8_MEMBER(divebomb_state::rozcpu_comm_r)
{
m_rozcpucpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
return to_rozcpu;
}
WRITE8_MEMBER(divebomb_state::rozcpu_comm_w)
{
from_roz = data;
has_fromroz = true;
update_irqs();
}
/*************************************
*
* IRQs
*
*************************************/
void divebomb_state::update_irqs()
{
if (has_fromsprite || has_fromroz)
m_fgcpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
else
m_fgcpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
}
/*************************************
*
* 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 },
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
16*8
};
static const gfx_layout tiles16x16_layout =
{
16,16,
RGN_FRAC(1,1),
4,
{ 24,16,8,0 },
{ 0, 1, 2, 3, 4, 5, 6, 7, 32,33,34,35,36,37,38,39 },
{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64,9*64,10*64,11*64,12*64,13*64,14*64,15*64 },
64*16
};
static GFXDECODE_START( divebomb )
GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0x400+0x400, 16 )
GFXDECODE_ENTRY( "gfx2", 0, tiles16x16_layout, 0x400+0x400+0x400, 16 )
GFXDECODE_END
/*************************************
*
* Machine driver
*
*************************************/
static MACHINE_CONFIG_START( divebomb, divebomb_state )
MCFG_CPU_ADD("fgcpu", Z80,XTAL1/4) // ?
MCFG_CPU_PROGRAM_MAP(divebomb_fgcpu_map)
MCFG_CPU_IO_MAP(divebomb_fgcpu_iomap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", divebomb_state, nmi_line_pulse)
MCFG_CPU_ADD("spritecpu", Z80,XTAL1/4) // ?
MCFG_CPU_PROGRAM_MAP(divebomb_spritecpu_map)
MCFG_CPU_IO_MAP(divebomb_spritecpu_iomap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", divebomb_state, nmi_line_pulse)
MCFG_CPU_ADD("rozcpu", Z80,XTAL1/4) // ?
MCFG_CPU_PROGRAM_MAP(divebomb_rozcpu_map)
MCFG_CPU_IO_MAP(divebomb_rozcpu_iomap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", divebomb_state, nmi_line_pulse)
MCFG_QUANTUM_PERFECT_CPU("fgcpu")
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_GFXDECODE_ADD("gfxdecode", "palette", divebomb)
MCFG_PALETTE_ADD("palette", 0x400+0x400+0x400+0x100)
MCFG_PALETTE_INIT_OWNER(divebomb_state, divebomb)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
// All frequencies unverified
MCFG_SOUND_ADD("sn0", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_SOUND_ADD("sn1", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_SOUND_ADD("sn2", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_SOUND_ADD("sn3", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_SOUND_ADD("sn4", SN76489, XTAL1/8)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
MCFG_SOUND_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, "gfx1", 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, "gfx2", 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_bank1->configure_entries(0, 16, memregion("rozcpudata")->base(), 0x4000);
save_item(NAME(roz1_enable));
save_item(NAME(roz2_enable));
save_item(NAME(roz1_wrap));
save_item(NAME(roz2_wrap));
save_item(NAME(to_spritecpu));
save_item(NAME(to_rozcpu));
save_item(NAME(has_fromsprite));
save_item(NAME(has_fromroz));
save_item(NAME(from_sprite));
save_item(NAME(from_roz));
save_item(NAME(roz_pal));
}
MACHINE_RESET_MEMBER(divebomb_state, divebomb)
{
roz1_enable = false;
roz2_enable = false;
roz1_wrap = false;
roz2_wrap = false;
has_fromsprite = false;
has_fromroz = false;
}
/*************************************
*
* 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, driver_device, 0, ROT270, "Konami", "Kyuukoukabakugekitai - Dive Bomber Squad (Japan, prototype)", MACHINE_IS_INCOMPLETE | MACHINE_SUPPORTS_SAVE )

View File

@ -0,0 +1,91 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood, Phil Bennett
/*************************************************************************
Kyuukoukabakugekitai - Dive Bomber Squad
*************************************************************************/
#include "cpu/z80/z80.h"
#include "sound/sn76496.h"
#include "video/k051316.h"
#define XTAL1 XTAL_24MHz
class divebomb_state : public driver_device
{
public:
divebomb_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_spritecpu(*this, "spritecpu"),
m_fgcpu(*this, "fgcpu"),
m_rozcpucpu(*this, "rozcpu"),
m_bank1(*this, "bank1"),
m_fgram(*this, "fgram"),
m_spriteram(*this, "spriteram"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_k051316_1(*this, "k051316_1"),
m_k051316_2(*this, "k051316_2")
{ }
required_device<cpu_device> m_spritecpu;
required_device<cpu_device> m_fgcpu;
required_device<cpu_device> m_rozcpucpu;
required_memory_bank m_bank1;
required_shared_ptr<UINT8> m_fgram;
required_shared_ptr<UINT8> m_spriteram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<k051316_device> m_k051316_1;
required_device<k051316_device> m_k051316_2;
tilemap_t *m_fg_tilemap;
UINT8 to_spritecpu;
UINT8 to_rozcpu;
UINT8 from_sprite;
UINT8 from_roz;
bool has_fromsprite;
bool has_fromroz;
UINT8 roz_pal;
bool roz1_enable;
bool roz2_enable;
bool roz1_wrap;
bool roz2_wrap;
DECLARE_MACHINE_RESET(divebomb);
DECLARE_MACHINE_START(divebomb);
DECLARE_VIDEO_START(divebomb);
DECLARE_PALETTE_INIT(divebomb);
void update_irqs();
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void decode_proms(const UINT8* rgn, int size, int index, bool inv);
UINT32 screen_update_divebomb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
K051316_CB_MEMBER(zoom_callback_1);
K051316_CB_MEMBER(zoom_callback_2);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
DECLARE_READ8_MEMBER(fgcpu_roz_comm_r);
DECLARE_WRITE8_MEMBER(fgcpu_roz_comm_w);
DECLARE_READ8_MEMBER(fgcpu_spr_comm_r);
DECLARE_WRITE8_MEMBER(fgcpu_spr_comm_w);
DECLARE_READ8_MEMBER(fgcpu_comm_flags_r);
DECLARE_WRITE8_MEMBER(fgram_w);
DECLARE_WRITE8_MEMBER(spritecpu_port00_w);
DECLARE_READ8_MEMBER(spritecpu_comm_r);
DECLARE_WRITE8_MEMBER(spritecpu_comm_w);
DECLARE_WRITE8_MEMBER(rozcpu_bank_w);
DECLARE_WRITE8_MEMBER(rozcpu_wrap1_enable_w);
DECLARE_WRITE8_MEMBER(rozcpu_enable1_w);
DECLARE_WRITE8_MEMBER(rozcpu_enable2_w);
DECLARE_WRITE8_MEMBER(rozcpu_wrap2_enable_w);
DECLARE_READ8_MEMBER(rozcpu_comm_r);
DECLARE_WRITE8_MEMBER(rozcpu_comm_w);
DECLARE_WRITE8_MEMBER(rozcpu_pal_w);
};

View File

@ -10920,6 +10920,9 @@ dim68k //
discoboy // (c) 1993 Soft Art Co.
discoboyp // (c) 1993 Soft Art Co. (Promat license?)
@source:divebomb.cpp
divebomb // GX840 (c) 1989 (Japan)
@source:diverboy.cpp
diverboy // (c) 1992 Electronic Devices

209
src/mame/video/divebomb.cpp Normal file
View File

@ -0,0 +1,209 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood, Phil Bennett
/*************************************************************************
Kyuukoukabakugekitai - Dive Bomber Squad
*************************************************************************/
#include "emu.h"
#include "includes/divebomb.h"
#include "video/resnet.h"
/*************************************
*
* Tilemap callbacks
*
*************************************/
TILE_GET_INFO_MEMBER(divebomb_state::get_fg_tile_info)
{
UINT32 code = m_fgram[tile_index + 0x000];
UINT32 attr = m_fgram[tile_index + 0x400];
UINT32 colour = attr >> 4;
code |= (attr & 0x3) << 8;
SET_TILE_INFO_MEMBER(0, code, colour, 0);
}
/*************************************
*
* K051316 callbacks
*
*************************************/
K051316_CB_MEMBER(divebomb_state::zoom_callback_1)
{
*code |= (*color & 0x03) << 8;
*color = 0 + (roz_pal >> 4) & 3;
}
K051316_CB_MEMBER(divebomb_state::zoom_callback_2)
{
*code |= (*color & 0x03) << 8;
*color = 4 + (roz_pal & 3);
}
/*************************************
*
* Video hardware handlers
*
*************************************/
WRITE8_MEMBER(divebomb_state::fgram_w)
{
m_fgram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset & 0x3ff);
}
WRITE8_MEMBER(divebomb_state::rozcpu_wrap1_enable_w)
{
roz1_wrap = !(data & 1);
}
WRITE8_MEMBER(divebomb_state::rozcpu_enable1_w)
{
roz1_enable = !(data & 1);
}
WRITE8_MEMBER(divebomb_state::rozcpu_enable2_w)
{
roz2_enable = !(data & 1);
}
WRITE8_MEMBER(divebomb_state::rozcpu_wrap2_enable_w)
{
roz2_wrap = !(data & 1);
}
WRITE8_MEMBER(divebomb_state::rozcpu_pal_w)
{
//.... ..xx K051316 1 palette select
//..xx .... K051316 2 palette select
roz_pal = data;
m_k051316_2->mark_tmap_dirty();
m_k051316_1->mark_tmap_dirty();
if (data & 0xcc)
logerror("rozcpu_port50_w %02x\n", data);
}
/*************************************
*
* Video hardware init
*
*************************************/
void divebomb_state::decode_proms(const UINT8 * rgn, int size, int index, bool inv)
{
static const int resistances[4] = { 2000, 1000, 470, 220 };
double rweights[4], gweights[4], bweights[4];
/* compute the color output resistor weights */
compute_resistor_weights(0, 255, -1.0,
4, resistances, rweights, 0, 0,
4, resistances, gweights, 0, 0,
4, resistances, bweights, 0, 0);
/* create a lookup table for the palette */
for (UINT32 i = 0; i < size; ++i)
{
UINT32 rdata = rgn[i + size*2] & 0x0f;
UINT32 r = combine_4_weights(rweights, BIT(rdata, 0), BIT(rdata, 1), BIT(rdata, 2), BIT(rdata, 3));
UINT32 gdata = rgn[i + size] & 0x0f;
UINT32 g = combine_4_weights(gweights, BIT(gdata, 0), BIT(gdata, 1), BIT(gdata, 2), BIT(gdata, 3));
UINT32 bdata = rgn[i] & 0x0f;
UINT32 b = combine_4_weights(bweights, BIT(bdata, 0), BIT(bdata, 1), BIT(bdata, 2), BIT(bdata, 3));
if (!inv)
m_palette->set_pen_color(index + i, rgb_t(r, g, b));
else
m_palette->set_pen_color(index + (i ^ 0xff), rgb_t(r, g, b));
}
}
PALETTE_INIT_MEMBER(divebomb_state, divebomb)
{
decode_proms(memregion("spr_proms")->base(), 0x100, 0x400 + 0x400 + 0x400, false);
decode_proms(memregion("fg_proms")->base(), 0x400, 0x400 + 0x400, false);
decode_proms(memregion("k051316_1_pr")->base(), 0x400, 0, true);
decode_proms(memregion("k051316_2_pr")->base(), 0x400, 0x400, true);
}
VIDEO_START_MEMBER(divebomb_state,divebomb)
{
m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(divebomb_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_fg_tilemap->set_transparent_pen(0);
m_fg_tilemap->set_scrolly(0, 16);
}
/*************************************
*
* Main update
*
*************************************/
void divebomb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const UINT8 *spriteram = m_spriteram;
for (UINT32 i = 0; i < m_spriteram.bytes(); i += 4)
{
UINT32 sy = spriteram[i + 3];
UINT32 sx = spriteram[i + 0];
UINT32 code = spriteram[i + 2];
UINT32 attr = spriteram[i + 1];
code += (attr & 0x0f) << 8;
UINT32 colour = attr >> 4;
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, code, colour, 0, 0, sx, sy, 0);
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, code, colour, 0, 0, sx, sy-256, 0);
}
}
UINT32 divebomb_state::screen_update_divebomb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_k051316_1->wraparound_enable(roz1_wrap);
m_k051316_2->wraparound_enable(roz2_wrap);
bitmap.fill(m_palette->black_pen(), cliprect);
if (roz2_enable)
m_k051316_2->zoom_draw(screen, bitmap, cliprect, 0, 0);
if (roz1_enable)
m_k051316_1->zoom_draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}