capcom/exedexes.cpp, capcom/higemaru.cpp, capcom/sonson.cpp, capcom/srumbler.cpp, capcom/vulgus.cpp: consolidated drivers in single files

This commit is contained in:
Ivan Vangelista 2022-11-08 18:02:45 +01:00
parent aed62c2c43
commit c09e88ad1d
16 changed files with 1554 additions and 1607 deletions

View File

@ -1,8 +1,10 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders: Richard Davies // copyright-holders: Richard Davies
/*************************************************************************** /***************************************************************************
Exed Exes Exed Exes
Capcom 84110-A-1 + 84110-B-1 PCBs
Notes: Notes:
- Flip screen is not supported, but doesn't seem to be used (no flip screen - Flip screen is not supported, but doesn't seem to be used (no flip screen
@ -12,29 +14,314 @@
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "exedexes.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "machine/gen_latch.h" #include "machine/gen_latch.h"
#include "machine/timer.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/sn76496.h" #include "sound/sn76496.h"
#include "video/bufsprite.h"
#include "emupal.h"
#include "screen.h" #include "screen.h"
#include "speaker.h" #include "speaker.h"
#include "tilemap.h"
TIMER_DEVICE_CALLBACK_MEMBER(exedexes_state::scanline) namespace {
class exedexes_state : public driver_device
{ {
int scanline = param; public:
exedexes_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_spriteram(*this, "spriteram"),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_nbg_yscroll(*this, "nbg_yscroll"),
m_nbg_xscroll(*this, "nbg_xscroll"),
m_bg_scroll(*this, "bg_scroll"),
m_tilerom(*this, "tilerom")
{ }
if (scanline == 240) // vblank-out irq void exedexes(machine_config &config);
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); /* Z80 - RST 10h - vblank */
if (scanline == 0) // unknown irq event protected:
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); /* Z80 - RST 08h */ virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
// devices
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<buffered_spriteram8_device> m_spriteram;
// memory pointers
required_shared_ptr<u8> m_videoram;
required_shared_ptr<u8> m_colorram;
required_shared_ptr<u8> m_nbg_yscroll;
required_shared_ptr<u8> m_nbg_xscroll;
required_shared_ptr<u8> m_bg_scroll;
required_region_ptr<u8> m_tilerom;
// video-related
tilemap_t *m_bg_tilemap = nullptr;
tilemap_t *m_fg_tilemap = nullptr;
tilemap_t *m_tx_tilemap = nullptr;
uint8_t m_chon = 0;
uint8_t m_objon = 0;
uint8_t m_sc1on = 0;
uint8_t m_sc2on = 0;
void videoram_w(offs_t offset, u8 data);
void colorram_w(offs_t offset, u8 data);
void c804_w(u8 data);
void gfxctrl_w(u8 data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
TILEMAP_MAPPER_MEMBER(bg_tilemap_scan);
TILEMAP_MAPPER_MEMBER(fg_tilemap_scan);
void palette(palette_device &palette) const;
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
void sound_map(address_map &map);
};
// video
/***************************************************************************
Convert the color PROMs into a more useable format.
Exed Exes has three 256x4 palette PROMs (one per gun), three 256x4 lookup
table PROMs (one for characters, one for sprites, one for background tiles)
and one 256x4 sprite palette bank selector PROM.
The palette PROMs are connected to the RGB output this way:
bit 3 -- 220 ohm resistor -- RED/GREEN/BLUE
-- 470 ohm resistor -- RED/GREEN/BLUE
-- 1 kohm resistor -- RED/GREEN/BLUE
bit 0 -- 2.2kohm resistor -- RED/GREEN/BLUE
***************************************************************************/
void exedexes_state::palette(palette_device &palette) const
{
const u8 *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x100; i++)
{
const int r = pal4bit(color_prom[i + 0x000]);
const int g = pal4bit(color_prom[i + 0x100]);
const int b = pal4bit(color_prom[i + 0x200]);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x300;
// characters use colors 0xc0-0xcf
for (int i = 0; i < 0x100; i++)
{
const u8 ctabentry = color_prom[i] | 0xc0;
palette.set_pen_indirect(i, ctabentry);
}
// 32x32 tiles use colors 0-0x0f
for (int i = 0x100; i < 0x200; i++)
{
const u8 ctabentry = color_prom[i];
palette.set_pen_indirect(i, ctabentry);
}
// 16x16 tiles use colors 0x40-0x4f
for (int i = 0x200; i < 0x300; i++)
{
const u8 ctabentry = color_prom[i] | 0x40;
palette.set_pen_indirect(i, ctabentry);
}
// sprites use colors 0x80-0xbf in four banks
for (int i = 0x300; i < 0x400; i++)
{
const u8 ctabentry = color_prom[i] | (color_prom[i + 0x100] << 4) | 0x80;
palette.set_pen_indirect(i, ctabentry);
}
}
void exedexes_state::videoram_w(offs_t offset, u8 data)
{
m_videoram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset);
}
void exedexes_state::colorram_w(offs_t offset, u8 data)
{
m_colorram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset);
}
void exedexes_state::c804_w(u8 data)
{
// bits 0 and 1 are coin counters
machine().bookkeeping().coin_counter_w(0, data & 0x01);
machine().bookkeeping().coin_counter_w(1, data & 0x02);
machine().bookkeeping().coin_lockout_w(0, data & 0x04);
machine().bookkeeping().coin_lockout_w(1, data & 0x08);
// bit 7 is text enable
m_chon = data & 0x80;
// other bits seem to be unused
}
void exedexes_state::gfxctrl_w(u8 data)
{
// bit 4 is bg enable
m_sc2on = data & 0x10;
// bit 5 is fg enable
m_sc1on = data & 0x20;
// bit 6 is sprite enable
m_objon = data & 0x40;
// other bits seem to be unused
} }
void exedexes_state::exedexes_map(address_map &map) TILE_GET_INFO_MEMBER(exedexes_state::get_bg_tile_info)
{
const u8 attr = m_tilerom[tile_index];
const u8 code = attr & 0x3f;
const u8 color = m_tilerom[tile_index + (8 * 8)];
const int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0);
tileinfo.set(1, code, color, flags);
}
TILE_GET_INFO_MEMBER(exedexes_state::get_fg_tile_info)
{
const u8 code = m_tilerom[tile_index];
tileinfo.set(2, code, 0, 0);
}
TILE_GET_INFO_MEMBER(exedexes_state::get_tx_tile_info)
{
const u32 code = m_videoram[tile_index] + 2 * (m_colorram[tile_index] & 0x80);
const u8 color = m_colorram[tile_index] & 0x3f;
tileinfo.group = color;
tileinfo.set(0, code, color, 0);
}
TILEMAP_MAPPER_MEMBER(exedexes_state::bg_tilemap_scan)
{
// logical (col,row) -> memory offset
return ((col * 32 & 0xe0) >> 5) + ((row * 32 & 0xe0) >> 2) + ((col * 32 & 0x3f00) >> 1) + 0x4000;
}
TILEMAP_MAPPER_MEMBER(exedexes_state::fg_tilemap_scan)
{
// logical (col,row) -> memory offset
return ((col * 16 & 0xf0) >> 4) + (row * 16 & 0xf0) + (col * 16 & 0x700) + ((row * 16 & 0x700) << 3);
}
void exedexes_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(exedexes_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(exedexes_state::bg_tilemap_scan)), 32, 32, 64, 64);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(exedexes_state::get_fg_tile_info)), tilemap_mapper_delegate(*this, FUNC(exedexes_state::fg_tilemap_scan)), 16, 16, 128, 128);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(exedexes_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_fg_tilemap->set_transparent_pen(0);
m_tx_tilemap->configure_groups(*m_gfxdecode->gfx(0), 0xcf);
}
void exedexes_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const u8 *buffered_spriteram = m_spriteram->buffer();
if (!m_objon)
return;
for (int offs = 0; offs < m_spriteram->bytes(); offs += 32)
{
u32 primask = 0;
if (buffered_spriteram[offs + 1] & 0x40)
primask |= GFX_PMASK_2;
const u32 code = buffered_spriteram[offs];
const u32 color = buffered_spriteram[offs + 1] & 0x0f;
const bool flipx = buffered_spriteram[offs + 1] & 0x10;
const bool flipy = buffered_spriteram[offs + 1] & 0x20;
const int sx = buffered_spriteram[offs + 3] - ((buffered_spriteram[offs + 1] & 0x80) << 1);
const int sy = buffered_spriteram[offs + 2];
m_gfxdecode->gfx(3)->prio_transpen(bitmap, cliprect,
code,
color,
flipx, flipy,
sx, sy, screen.priority(), primask, 0);
}
}
u32 exedexes_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
if (m_sc2on)
{
m_bg_tilemap->set_scrollx(0, ((m_bg_scroll[1]) << 8) + m_bg_scroll[0]);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 1);
}
else
bitmap.fill(0, cliprect);
if (m_sc1on)
{
m_fg_tilemap->set_scrollx(0, ((m_nbg_yscroll[1]) << 8) + m_nbg_yscroll[0]);
m_fg_tilemap->set_scrolly(0, ((m_nbg_xscroll[1]) << 8) + m_nbg_xscroll[0]);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 2);
}
draw_sprites(screen, bitmap, cliprect);
if (m_chon)
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
// machine
TIMER_DEVICE_CALLBACK_MEMBER(exedexes_state::scanline)
{
const int scanline = param;
if (scanline == 240) // vblank-out irq
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 - RST 10h - vblank
if (scanline == 0) // unknown irq event
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); // Z80 - RST 08h
}
void exedexes_state::main_map(address_map &map)
{ {
map(0x0000, 0xbfff).rom(); map(0x0000, 0xbfff).rom();
map(0xc000, 0xc000).portr("SYSTEM"); map(0xc000, 0xc000).portr("SYSTEM");
@ -43,16 +330,16 @@ void exedexes_state::exedexes_map(address_map &map)
map(0xc003, 0xc003).portr("DSW0"); map(0xc003, 0xc003).portr("DSW0");
map(0xc004, 0xc004).portr("DSW1"); map(0xc004, 0xc004).portr("DSW1");
map(0xc800, 0xc800).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0xc800, 0xc800).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0xc804, 0xc804).w(FUNC(exedexes_state::c804_w)); /* coin counters + text layer enable */ map(0xc804, 0xc804).w(FUNC(exedexes_state::c804_w)); // coin counters + text layer enable
map(0xc806, 0xc806).nopw(); /* Watchdog ?? */ map(0xc806, 0xc806).nopw(); // watchdog ??
map(0xd000, 0xd3ff).ram().w(FUNC(exedexes_state::videoram_w)).share("videoram"); /* Video RAM */ map(0xd000, 0xd3ff).ram().w(FUNC(exedexes_state::videoram_w)).share(m_videoram);
map(0xd400, 0xd7ff).ram().w(FUNC(exedexes_state::colorram_w)).share("colorram"); /* Color RAM */ map(0xd400, 0xd7ff).ram().w(FUNC(exedexes_state::colorram_w)).share(m_colorram);
map(0xd800, 0xd801).writeonly().share("nbg_yscroll"); map(0xd800, 0xd801).writeonly().share(m_nbg_yscroll);
map(0xd802, 0xd803).writeonly().share("nbg_xscroll"); map(0xd802, 0xd803).writeonly().share(m_nbg_xscroll);
map(0xd804, 0xd805).writeonly().share("bg_scroll"); map(0xd804, 0xd805).writeonly().share(m_bg_scroll);
map(0xd807, 0xd807).w(FUNC(exedexes_state::gfxctrl_w)); /* layer enables */ map(0xd807, 0xd807).w(FUNC(exedexes_state::gfxctrl_w)); // layer enables
map(0xe000, 0xefff).ram(); /* Work RAM */ map(0xe000, 0xefff).ram(); // work RAM
map(0xf000, 0xffff).ram().share("spriteram"); /* Sprite RAM */ map(0xf000, 0xffff).ram().share("spriteram");
} }
@ -71,9 +358,9 @@ static INPUT_PORTS_START( exedexes )
PORT_START("SYSTEM") PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_IMPULSE(8) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_IMPULSE(8)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
@ -85,8 +372,8 @@ static INPUT_PORTS_START( exedexes )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_START("P2") PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
@ -95,8 +382,8 @@ static INPUT_PORTS_START( exedexes )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_START("DSW0") PORT_START("DSW0")
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) )
@ -150,44 +437,44 @@ INPUT_PORTS_END
static const gfx_layout charlayout = static const gfx_layout charlayout =
{ {
8,8, /* 8*8 characters */ 8,8, // 8*8 characters
RGN_FRAC(1,1), /* 512 characters */ RGN_FRAC(1,1), // 512 characters
2, /* 2 bits per pixel */ 2, // 2 bits per pixel
{ 4, 0 }, { 4, 0 },
{ STEP4(0,1), STEP4(4*2,1) }, { STEP4(0,1), STEP4(4*2,1) },
{ STEP8(0,4*2*2) }, { STEP8(0,4*2*2) },
16*8 /* every char takes 16 consecutive bytes */ 16*8 // every char takes 16 consecutive bytes
}; };
static const gfx_layout spritelayout = static const gfx_layout spritelayout =
{ {
16,16, /* 16*16 sprites */ 16,16, // 16*16 sprites
RGN_FRAC(1,2), /* 256 sprites */ RGN_FRAC(1,2), // 256 sprites
4, /* 4 bits per pixel */ 4, // 4 bits per pixel
{ RGN_FRAC(1,2)+4, RGN_FRAC(1,2)+0, 4, 0 }, { RGN_FRAC(1,2)+4, RGN_FRAC(1,2)+0, 4, 0 },
{ STEP4(0,1), STEP4(4*2,1), STEP4(4*2*2*16,1), STEP4(4*2*2*16+4*2,1) }, { STEP4(0,1), STEP4(4*2,1), STEP4(4*2*2*16,1), STEP4(4*2*2*16+4*2,1) },
{ STEP16(0,4*2*2) }, { STEP16(0,4*2*2) },
64*8 /* every sprite takes 64 consecutive bytes */ 64*8 // every sprite takes 64 consecutive bytes
}; };
static const gfx_layout tilelayout = static const gfx_layout tilelayout =
{ {
32,32, /* 32*32 tiles */ 32,32, // 32*32 tiles
RGN_FRAC(1,1), /* 64 tiles */ RGN_FRAC(1,1), // 64 tiles
2, /* 2 bits per pixel */ 2, // 2 bits per pixel
{ 4, 0 }, { 4, 0 },
{ STEP4(0,1), STEP4(4*2,1), STEP4(4*2*2*32,1), STEP4(4*2*2*32+4*2,1), { STEP4(0,1), STEP4(4*2,1), STEP4(4*2*2*32,1), STEP4(4*2*2*32+4*2,1),
STEP4(4*2*2*64,1), STEP4(4*2*2*64+4*2,1), STEP4(4*2*2*96,1), STEP4(4*2*2*96+4*2,1) }, STEP4(4*2*2*64,1), STEP4(4*2*2*64+4*2,1), STEP4(4*2*2*96,1), STEP4(4*2*2*96+4*2,1) },
{ STEP32(0,4*2*2) }, { STEP32(0,4*2*2) },
256*8 /* every tile takes 256 consecutive bytes */ 256*8 // every tile takes 256 consecutive bytes
}; };
static GFXDECODE_START( gfx_exedexes ) static GFXDECODE_START( gfx_exedexes )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64 ) GFXDECODE_ENTRY( "chars", 0, charlayout, 0, 64 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 64*4, 64 ) /* 32x32 Tiles */ GFXDECODE_ENTRY( "32x32tiles", 0, tilelayout, 64*4, 64 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 2*64*4, 16 ) /* 16x16 Tiles */ GFXDECODE_ENTRY( "16x16tiles", 0, spritelayout, 2*64*4, 16 )
GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 2*64*4+16*16, 16 ) /* Sprites */ GFXDECODE_ENTRY( "sprites", 0, spritelayout, 2*64*4+16*16, 16 )
GFXDECODE_END GFXDECODE_END
@ -209,16 +496,16 @@ void exedexes_state::machine_reset()
void exedexes_state::exedexes(machine_config &config) void exedexes_state::exedexes(machine_config &config)
{ {
/* basic machine hardware */ // basic machine hardware
Z80(config, m_maincpu, 12_MHz_XTAL / 4); // 3 MHz, verified on PCB Z80(config, m_maincpu, 12_MHz_XTAL / 4); // 3 MHz, verified on PCB
m_maincpu->set_addrmap(AS_PROGRAM, &exedexes_state::exedexes_map); m_maincpu->set_addrmap(AS_PROGRAM, &exedexes_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(exedexes_state::scanline), "screen", 0, 1); TIMER(config, "scantimer").configure_scanline(FUNC(exedexes_state::scanline), "screen", 0, 1);
z80_device &audiocpu(Z80(config, "audiocpu", 12_MHz_XTAL / 4)); // 3 MHz, verified on PCB z80_device &audiocpu(Z80(config, "audiocpu", 12_MHz_XTAL / 4)); // 3 MHz, verified on PCB
audiocpu.set_addrmap(AS_PROGRAM, &exedexes_state::sound_map); audiocpu.set_addrmap(AS_PROGRAM, &exedexes_state::sound_map);
audiocpu.set_periodic_int(FUNC(exedexes_state::irq0_line_hold), attotime::from_hz(4*60)); audiocpu.set_periodic_int(FUNC(exedexes_state::irq0_line_hold), attotime::from_hz(4*60));
/* video hardware */ // video hardware
BUFFERED_SPRITERAM8(config, m_spriteram); BUFFERED_SPRITERAM8(config, m_spriteram);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@ -232,9 +519,9 @@ void exedexes_state::exedexes(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_exedexes); GFXDECODE(config, m_gfxdecode, m_palette, gfx_exedexes);
PALETTE(config, m_palette, FUNC(exedexes_state::exedexes_palette), 64*4+64*4+16*16+16*16, 256); PALETTE(config, m_palette, FUNC(exedexes_state::palette), 64*4+64*4+16*16+16*16, 256);
/* sound hardware */ // sound hardware
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch"); GENERIC_LATCH_8(config, "soundlatch");
@ -256,37 +543,37 @@ ROM_START( exedexes )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "11e_ee01.bin", 0x00000, 0x4000, CRC(73cdf3b2) SHA1(c9f2c91011bdeecec8fa76a42d95f3a5ec77cec9) ) ROM_LOAD( "11e_ee01.bin", 0x00000, 0x4000, CRC(73cdf3b2) SHA1(c9f2c91011bdeecec8fa76a42d95f3a5ec77cec9) )
ROM_REGION( 0x02000, "gfx1", 0 ) ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "05c_ee00.bin", 0x00000, 0x2000, CRC(cadb75bd) SHA1(2086be5e295e5d870bcb35f116cc925f811b7583) ) /* Characters */ ROM_LOAD( "05c_ee00.bin", 0x00000, 0x2000, CRC(cadb75bd) SHA1(2086be5e295e5d870bcb35f116cc925f811b7583) )
ROM_REGION( 0x04000, "gfx2", 0 ) ROM_REGION( 0x04000, "32x32tiles", 0 )
ROM_LOAD( "h01_ee08.bin", 0x00000, 0x4000, CRC(96a65c1d) SHA1(3b49c64b32f01ec72cf2d943bfe3aa575d62a765) ) /* 32x32 tiles planes 0-1 */ ROM_LOAD( "h01_ee08.bin", 0x00000, 0x4000, CRC(96a65c1d) SHA1(3b49c64b32f01ec72cf2d943bfe3aa575d62a765) ) // planes 0-1
ROM_REGION( 0x08000, "gfx3", 0 ) ROM_REGION( 0x08000, "16x16tiles", 0 )
ROM_LOAD( "a03_ee06.bin", 0x00000, 0x4000, CRC(6039bdd1) SHA1(01156e02ed59e6c1e55204729e515cd4419568fb) ) /* 16x16 tiles planes 0-1 */ ROM_LOAD( "a03_ee06.bin", 0x00000, 0x4000, CRC(6039bdd1) SHA1(01156e02ed59e6c1e55204729e515cd4419568fb) ) // planes 0-1
ROM_LOAD( "a02_ee05.bin", 0x04000, 0x4000, CRC(b32d8252) SHA1(738225146ba38f2a9216fda278838e7ebb29a0bb) ) /* 16x16 tiles planes 2-3 */ ROM_LOAD( "a02_ee05.bin", 0x04000, 0x4000, CRC(b32d8252) SHA1(738225146ba38f2a9216fda278838e7ebb29a0bb) ) // planes 2-3
ROM_REGION( 0x08000, "gfx4", 0 ) ROM_REGION( 0x08000, "sprites", 0 )
ROM_LOAD( "j11_ee10.bin", 0x00000, 0x4000, CRC(bc83e265) SHA1(ac9b4cce9e539c560414abf2fc239910f2bfbb2d) ) /* Sprites planes 0-1 */ ROM_LOAD( "j11_ee10.bin", 0x00000, 0x4000, CRC(bc83e265) SHA1(ac9b4cce9e539c560414abf2fc239910f2bfbb2d) ) // planes 0-1
ROM_LOAD( "j12_ee11.bin", 0x04000, 0x4000, CRC(0e0f300d) SHA1(2f973748e459b16673115abf7de8615219e39fa4) ) /* Sprites planes 2-3 */ ROM_LOAD( "j12_ee11.bin", 0x04000, 0x4000, CRC(0e0f300d) SHA1(2f973748e459b16673115abf7de8615219e39fa4) ) // planes 2-3
ROM_REGION( 0x6000, "tilerom", 0 ) /* background tilemaps */ ROM_REGION( 0x6000, "tilerom", 0 ) // background tilemaps
ROM_LOAD( "c01_ee07.bin", 0x0000, 0x4000, CRC(3625a68d) SHA1(83010ca356385b713bafe03a502c566f6a9a8365) ) /* Front Tile Map */ ROM_LOAD( "c01_ee07.bin", 0x0000, 0x4000, CRC(3625a68d) SHA1(83010ca356385b713bafe03a502c566f6a9a8365) ) // Front Tile Map
ROM_LOAD( "h04_ee09.bin", 0x4000, 0x2000, CRC(6057c907) SHA1(886790641b84b8cd659d2eb5fd1adbabdd7dad3d) ) /* Back Tile map */ ROM_LOAD( "h04_ee09.bin", 0x4000, 0x2000, CRC(6057c907) SHA1(886790641b84b8cd659d2eb5fd1adbabdd7dad3d) ) // Back Tile map
ROM_REGION( 0x0b20, "proms", 0 ) ROM_REGION( 0x0b20, "proms", 0 )
ROM_LOAD( "02d_e-02.bin", 0x0000, 0x0100, CRC(8d0d5935) SHA1(a0ab827ff3b641965ef851893c399e3988fde55e) ) /* red component */ ROM_LOAD( "02d_e-02.bin", 0x0000, 0x0100, CRC(8d0d5935) SHA1(a0ab827ff3b641965ef851893c399e3988fde55e) ) // red component
ROM_LOAD( "03d_e-03.bin", 0x0100, 0x0100, CRC(d3c17efc) SHA1(af88340287bd732c91bc5c75970f9de0431b4304) ) /* green component */ ROM_LOAD( "03d_e-03.bin", 0x0100, 0x0100, CRC(d3c17efc) SHA1(af88340287bd732c91bc5c75970f9de0431b4304) ) // green component
ROM_LOAD( "04d_e-04.bin", 0x0200, 0x0100, CRC(58ba964c) SHA1(1f98f8e484a0462f1a9fadef9e57612a32652599) ) /* blue component */ ROM_LOAD( "04d_e-04.bin", 0x0200, 0x0100, CRC(58ba964c) SHA1(1f98f8e484a0462f1a9fadef9e57612a32652599) ) // blue component
ROM_LOAD( "06f_e-05.bin", 0x0300, 0x0100, CRC(35a03579) SHA1(1f1b8c777622a1f5564409c5f3ce69cc68199dae) ) /* char lookup table */ ROM_LOAD( "06f_e-05.bin", 0x0300, 0x0100, CRC(35a03579) SHA1(1f1b8c777622a1f5564409c5f3ce69cc68199dae) ) // char lookup table
ROM_LOAD( "l04_e-10.bin", 0x0400, 0x0100, CRC(1dfad87a) SHA1(684844c24e630f46525df97ed67e2e63f7e66d0f) ) /* 32x32 tile lookup table */ ROM_LOAD( "l04_e-10.bin", 0x0400, 0x0100, CRC(1dfad87a) SHA1(684844c24e630f46525df97ed67e2e63f7e66d0f) ) // 32x32 tile lookup table
ROM_LOAD( "c04_e-07.bin", 0x0500, 0x0100, CRC(850064e0) SHA1(3884485e91bd82539d0d33f46b7abac60f4c3b1c) ) /* 16x16 tile lookup table */ ROM_LOAD( "c04_e-07.bin", 0x0500, 0x0100, CRC(850064e0) SHA1(3884485e91bd82539d0d33f46b7abac60f4c3b1c) ) // 16x16 tile lookup table
ROM_LOAD( "l09_e-11.bin", 0x0600, 0x0100, CRC(2bb68710) SHA1(cfb375316245cb8751e765f163e6acf071dda9ca) ) /* sprite lookup table */ ROM_LOAD( "l09_e-11.bin", 0x0600, 0x0100, CRC(2bb68710) SHA1(cfb375316245cb8751e765f163e6acf071dda9ca) ) // sprite lookup table
ROM_LOAD( "l10_e-12.bin", 0x0700, 0x0100, CRC(173184ef) SHA1(f91ecbdc67af1eed6757f660cac8a0e6866c1822) ) /* sprite palette bank */ ROM_LOAD( "l10_e-12.bin", 0x0700, 0x0100, CRC(173184ef) SHA1(f91ecbdc67af1eed6757f660cac8a0e6866c1822) ) // sprite palette bank
ROM_LOAD( "06l_e-06.bin", 0x0800, 0x0100, CRC(712ac508) SHA1(5349d722ab6733afdda65f6e0a98322f0d515e86) ) /* interrupt timing (not used) */ ROM_LOAD( "06l_e-06.bin", 0x0800, 0x0100, CRC(712ac508) SHA1(5349d722ab6733afdda65f6e0a98322f0d515e86) ) // interrupt timing (not used)
ROM_LOAD( "k06_e-08.bin", 0x0900, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* video timing (not used) */ ROM_LOAD( "k06_e-08.bin", 0x0900, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // video timing (not used)
ROM_LOAD( "l03_e-09.bin", 0x0a00, 0x0100, CRC(0d968558) SHA1(b376885ac8452b6cbf9ced81b1080bfd570d9b91) ) /* unknown (all 0) */ ROM_LOAD( "l03_e-09.bin", 0x0a00, 0x0100, CRC(0d968558) SHA1(b376885ac8452b6cbf9ced81b1080bfd570d9b91) ) // unknown (all 0)
ROM_LOAD( "03e_e-01.bin", 0x0b00, 0x0020, CRC(1acee376) SHA1(367094d924f8e0ec36d8310fada4d8143358f697) ) /* unknown (priority?) */ ROM_LOAD( "03e_e-01.bin", 0x0b00, 0x0020, CRC(1acee376) SHA1(367094d924f8e0ec36d8310fada4d8143358f697) ) // unknown (priority?)
ROM_END ROM_END
ROM_START( savgbees ) ROM_START( savgbees )
@ -298,39 +585,41 @@ ROM_START( savgbees )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "ee01e.11e", 0x00000, 0x4000, CRC(93d3f952) SHA1(5c86d1ddf03083ac2787efb7a29c09b2f46ec3fa) ) ROM_LOAD( "ee01e.11e", 0x00000, 0x4000, CRC(93d3f952) SHA1(5c86d1ddf03083ac2787efb7a29c09b2f46ec3fa) )
ROM_REGION( 0x02000, "gfx1", 0 ) ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "ee00e.5c", 0x00000, 0x2000, CRC(5972f95f) SHA1(7b90ceca37dba773f72a80da6272b00061526348) ) /* Characters */ ROM_LOAD( "ee00e.5c", 0x00000, 0x2000, CRC(5972f95f) SHA1(7b90ceca37dba773f72a80da6272b00061526348) )
ROM_REGION( 0x04000, "gfx2", 0 ) ROM_REGION( 0x04000, "32x32tiles", 0 )
ROM_LOAD( "h01_ee08.bin", 0x00000, 0x4000, CRC(96a65c1d) SHA1(3b49c64b32f01ec72cf2d943bfe3aa575d62a765) ) /* 32x32 tiles planes 0-1 */ ROM_LOAD( "h01_ee08.bin", 0x00000, 0x4000, CRC(96a65c1d) SHA1(3b49c64b32f01ec72cf2d943bfe3aa575d62a765) ) // planes 0-1
ROM_REGION( 0x08000, "gfx3", 0 ) ROM_REGION( 0x08000, "16x16tiles", 0 )
ROM_LOAD( "a03_ee06.bin", 0x00000, 0x4000, CRC(6039bdd1) SHA1(01156e02ed59e6c1e55204729e515cd4419568fb) ) /* 16x16 tiles planes 0-1 */ ROM_LOAD( "a03_ee06.bin", 0x00000, 0x4000, CRC(6039bdd1) SHA1(01156e02ed59e6c1e55204729e515cd4419568fb) ) // planes 0-1
ROM_LOAD( "a02_ee05.bin", 0x04000, 0x4000, CRC(b32d8252) SHA1(738225146ba38f2a9216fda278838e7ebb29a0bb) ) /* 16x16 tiles planes 2-3 */ ROM_LOAD( "a02_ee05.bin", 0x04000, 0x4000, CRC(b32d8252) SHA1(738225146ba38f2a9216fda278838e7ebb29a0bb) ) // planes 2-3
ROM_REGION( 0x08000, "gfx4", 0 ) ROM_REGION( 0x08000, "sprites", 0 )
ROM_LOAD( "j11_ee10.bin", 0x00000, 0x4000, CRC(bc83e265) SHA1(ac9b4cce9e539c560414abf2fc239910f2bfbb2d) ) /* Sprites planes 0-1 */ ROM_LOAD( "j11_ee10.bin", 0x00000, 0x4000, CRC(bc83e265) SHA1(ac9b4cce9e539c560414abf2fc239910f2bfbb2d) ) // planes 0-1
ROM_LOAD( "j12_ee11.bin", 0x04000, 0x4000, CRC(0e0f300d) SHA1(2f973748e459b16673115abf7de8615219e39fa4) ) /* Sprites planes 2-3 */ ROM_LOAD( "j12_ee11.bin", 0x04000, 0x4000, CRC(0e0f300d) SHA1(2f973748e459b16673115abf7de8615219e39fa4) ) // planes 2-3
ROM_REGION( 0x6000, "tilerom", 0 ) /* background tilemaps */ ROM_REGION( 0x6000, "tilerom", 0 ) // background tilemaps
ROM_LOAD( "c01_ee07.bin", 0x0000, 0x4000, CRC(3625a68d) SHA1(83010ca356385b713bafe03a502c566f6a9a8365) ) /* Front Tile Map */ ROM_LOAD( "c01_ee07.bin", 0x0000, 0x4000, CRC(3625a68d) SHA1(83010ca356385b713bafe03a502c566f6a9a8365) ) // Front Tile Map
ROM_LOAD( "h04_ee09.bin", 0x4000, 0x2000, CRC(6057c907) SHA1(886790641b84b8cd659d2eb5fd1adbabdd7dad3d) ) /* Back Tile map */ ROM_LOAD( "h04_ee09.bin", 0x4000, 0x2000, CRC(6057c907) SHA1(886790641b84b8cd659d2eb5fd1adbabdd7dad3d) ) // Back Tile map
ROM_REGION( 0x0b20, "proms", 0 ) ROM_REGION( 0x0b20, "proms", 0 )
ROM_LOAD( "02d_e-02.bin", 0x0000, 0x0100, CRC(8d0d5935) SHA1(a0ab827ff3b641965ef851893c399e3988fde55e) ) /* red component */ ROM_LOAD( "02d_e-02.bin", 0x0000, 0x0100, CRC(8d0d5935) SHA1(a0ab827ff3b641965ef851893c399e3988fde55e) ) // red component
ROM_LOAD( "03d_e-03.bin", 0x0100, 0x0100, CRC(d3c17efc) SHA1(af88340287bd732c91bc5c75970f9de0431b4304) ) /* green component */ ROM_LOAD( "03d_e-03.bin", 0x0100, 0x0100, CRC(d3c17efc) SHA1(af88340287bd732c91bc5c75970f9de0431b4304) ) // green component
ROM_LOAD( "04d_e-04.bin", 0x0200, 0x0100, CRC(58ba964c) SHA1(1f98f8e484a0462f1a9fadef9e57612a32652599) ) /* blue component */ ROM_LOAD( "04d_e-04.bin", 0x0200, 0x0100, CRC(58ba964c) SHA1(1f98f8e484a0462f1a9fadef9e57612a32652599) ) // blue component
ROM_LOAD( "06f_e-05.bin", 0x0300, 0x0100, CRC(35a03579) SHA1(1f1b8c777622a1f5564409c5f3ce69cc68199dae) ) /* char lookup table */ ROM_LOAD( "06f_e-05.bin", 0x0300, 0x0100, CRC(35a03579) SHA1(1f1b8c777622a1f5564409c5f3ce69cc68199dae) ) // char lookup table
ROM_LOAD( "l04_e-10.bin", 0x0400, 0x0100, CRC(1dfad87a) SHA1(684844c24e630f46525df97ed67e2e63f7e66d0f) ) /* 32x32 tile lookup table */ ROM_LOAD( "l04_e-10.bin", 0x0400, 0x0100, CRC(1dfad87a) SHA1(684844c24e630f46525df97ed67e2e63f7e66d0f) ) // 32x32 tile lookup table
ROM_LOAD( "c04_e-07.bin", 0x0500, 0x0100, CRC(850064e0) SHA1(3884485e91bd82539d0d33f46b7abac60f4c3b1c) ) /* 16x16 tile lookup table */ ROM_LOAD( "c04_e-07.bin", 0x0500, 0x0100, CRC(850064e0) SHA1(3884485e91bd82539d0d33f46b7abac60f4c3b1c) ) // 16x16 tile lookup table
ROM_LOAD( "l09_e-11.bin", 0x0600, 0x0100, CRC(2bb68710) SHA1(cfb375316245cb8751e765f163e6acf071dda9ca) ) /* sprite lookup table */ ROM_LOAD( "l09_e-11.bin", 0x0600, 0x0100, CRC(2bb68710) SHA1(cfb375316245cb8751e765f163e6acf071dda9ca) ) // sprite lookup table
ROM_LOAD( "l10_e-12.bin", 0x0700, 0x0100, CRC(173184ef) SHA1(f91ecbdc67af1eed6757f660cac8a0e6866c1822) ) /* sprite palette bank */ ROM_LOAD( "l10_e-12.bin", 0x0700, 0x0100, CRC(173184ef) SHA1(f91ecbdc67af1eed6757f660cac8a0e6866c1822) ) // sprite palette bank
ROM_LOAD( "06l_e-06.bin", 0x0800, 0x0100, CRC(712ac508) SHA1(5349d722ab6733afdda65f6e0a98322f0d515e86) ) /* interrupt timing (not used) */ ROM_LOAD( "06l_e-06.bin", 0x0800, 0x0100, CRC(712ac508) SHA1(5349d722ab6733afdda65f6e0a98322f0d515e86) ) // interrupt timing (not used)
ROM_LOAD( "k06_e-08.bin", 0x0900, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* video timing (not used) */ ROM_LOAD( "k06_e-08.bin", 0x0900, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) // video timing (not used)
ROM_LOAD( "l03_e-09.bin", 0x0a00, 0x0100, CRC(0d968558) SHA1(b376885ac8452b6cbf9ced81b1080bfd570d9b91) ) /* unknown (all 0) */ ROM_LOAD( "l03_e-09.bin", 0x0a00, 0x0100, CRC(0d968558) SHA1(b376885ac8452b6cbf9ced81b1080bfd570d9b91) ) // unknown (all 0)
ROM_LOAD( "03e_e-01.bin", 0x0b00, 0x0020, CRC(1acee376) SHA1(367094d924f8e0ec36d8310fada4d8143358f697) ) /* unknown (priority?) */ ROM_LOAD( "03e_e-01.bin", 0x0b00, 0x0020, CRC(1acee376) SHA1(367094d924f8e0ec36d8310fada4d8143358f697) ) // unknown (priority?)
ROM_END ROM_END
} // anonymous namespace
GAME( 1985, exedexes, 0, exedexes, exedexes, exedexes_state, empty_init, ROT270, "Capcom", "Exed Exes", MACHINE_SUPPORTS_SAVE ) GAME( 1985, exedexes, 0, exedexes, exedexes, exedexes_state, empty_init, ROT270, "Capcom", "Exed Exes", MACHINE_SUPPORTS_SAVE )
GAME( 1985, savgbees, exedexes, exedexes, exedexes, exedexes_state, empty_init, ROT270, "Capcom (Memetron license)", "Savage Bees", MACHINE_SUPPORTS_SAVE ) GAME( 1985, savgbees, exedexes, exedexes, exedexes, exedexes_state, empty_init, ROT270, "Capcom (Memetron license)", "Savage Bees", MACHINE_SUPPORTS_SAVE )

View File

@ -1,79 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Richard Davies
/*************************************************************************
Exed Exes
*************************************************************************/
#ifndef MAME_INCLUDES_EXEDEXES_H
#define MAME_INCLUDES_EXEDEXES_H
#pragma once
#include "machine/timer.h"
#include "video/bufsprite.h"
#include "emupal.h"
#include "tilemap.h"
class exedexes_state : public driver_device
{
public:
exedexes_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_spriteram(*this, "spriteram"),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_nbg_yscroll(*this, "nbg_yscroll"),
m_nbg_xscroll(*this, "nbg_xscroll"),
m_bg_scroll(*this, "bg_scroll"),
m_tilerom(*this, "tilerom"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void exedexes(machine_config &config);
private:
/* memory pointers */
required_device<buffered_spriteram8_device> m_spriteram;
required_shared_ptr<u8> m_videoram;
required_shared_ptr<u8> m_colorram;
required_shared_ptr<u8> m_nbg_yscroll;
required_shared_ptr<u8> m_nbg_xscroll;
required_shared_ptr<u8> m_bg_scroll;
required_region_ptr<u8> m_tilerom;
/* video-related */
tilemap_t *m_bg_tilemap = nullptr;
tilemap_t *m_fg_tilemap = nullptr;
tilemap_t *m_tx_tilemap = nullptr;
int m_chon = 0;
int m_objon = 0;
int m_sc1on = 0;
int m_sc2on = 0;
void videoram_w(offs_t offset, u8 data);
void colorram_w(offs_t offset, u8 data);
void c804_w(u8 data);
void gfxctrl_w(u8 data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
TILEMAP_MAPPER_MEMBER(bg_tilemap_scan);
TILEMAP_MAPPER_MEMBER(fg_tilemap_scan);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
void exedexes_palette(palette_device &palette) const;
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
void exedexes_map(address_map &map);
void sound_map(address_map &map);
};
#endif // MAME_INCLUDES_EXEDEXES_H

View File

@ -1,221 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Richard Davies
/***************************************************************************
video.c
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "exedexes.h"
#include "screen.h"
/***************************************************************************
Convert the color PROMs into a more useable format.
Exed Exes has three 256x4 palette PROMs (one per gun), three 256x4 lookup
table PROMs (one for characters, one for sprites, one for background tiles)
and one 256x4 sprite palette bank selector PROM.
The palette PROMs are connected to the RGB output this way:
bit 3 -- 220 ohm resistor -- RED/GREEN/BLUE
-- 470 ohm resistor -- RED/GREEN/BLUE
-- 1 kohm resistor -- RED/GREEN/BLUE
bit 0 -- 2.2kohm resistor -- RED/GREEN/BLUE
***************************************************************************/
void exedexes_state::exedexes_palette(palette_device &palette) const
{
const u8 *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x100; i++)
{
const int r = pal4bit(color_prom[i + 0x000]);
const int g = pal4bit(color_prom[i + 0x100]);
const int b = pal4bit(color_prom[i + 0x200]);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x300;
// characters use colors 0xc0-0xcf
for (int i = 0; i < 0x100; i++)
{
const u8 ctabentry = color_prom[i] | 0xc0;
palette.set_pen_indirect(i, ctabentry);
}
// 32x32 tiles use colors 0-0x0f
for (int i = 0x100; i < 0x200; i++)
{
const u8 ctabentry = color_prom[i];
palette.set_pen_indirect(i, ctabentry);
}
// 16x16 tiles use colors 0x40-0x4f
for (int i = 0x200; i < 0x300; i++)
{
const u8 ctabentry = color_prom[i] | 0x40;
palette.set_pen_indirect(i, ctabentry);
}
// sprites use colors 0x80-0xbf in four banks
for (int i = 0x300; i < 0x400; i++)
{
const u8 ctabentry = color_prom[i] | (color_prom[i + 0x100] << 4) | 0x80;
palette.set_pen_indirect(i, ctabentry);
}
}
void exedexes_state::videoram_w(offs_t offset, u8 data)
{
m_videoram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset);
}
void exedexes_state::colorram_w(offs_t offset, u8 data)
{
m_colorram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset);
}
void exedexes_state::c804_w(u8 data)
{
/* bits 0 and 1 are coin counters */
machine().bookkeeping().coin_counter_w(0, data & 0x01);
machine().bookkeeping().coin_counter_w(1, data & 0x02);
machine().bookkeeping().coin_lockout_w(0, data & 0x04);
machine().bookkeeping().coin_lockout_w(1, data & 0x08);
/* bit 7 is text enable */
m_chon = data & 0x80;
/* other bits seem to be unused */
}
void exedexes_state::gfxctrl_w(u8 data)
{
/* bit 4 is bg enable */
m_sc2on = data & 0x10;
/* bit 5 is fg enable */
m_sc1on = data & 0x20;
/* bit 6 is sprite enable */
m_objon = data & 0x40;
/* other bits seem to be unused */
}
TILE_GET_INFO_MEMBER(exedexes_state::get_bg_tile_info)
{
const u8 attr = m_tilerom[tile_index];
const u8 code = attr & 0x3f;
const u8 color = m_tilerom[tile_index + (8 * 8)];
const int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0);
tileinfo.set(1, code, color, flags);
}
TILE_GET_INFO_MEMBER(exedexes_state::get_fg_tile_info)
{
const u8 code = m_tilerom[tile_index];
tileinfo.set(2, code, 0, 0);
}
TILE_GET_INFO_MEMBER(exedexes_state::get_tx_tile_info)
{
const u32 code = m_videoram[tile_index] + 2 * (m_colorram[tile_index] & 0x80);
const u8 color = m_colorram[tile_index] & 0x3f;
tileinfo.group = color;
tileinfo.set(0, code, color, 0);
}
TILEMAP_MAPPER_MEMBER(exedexes_state::bg_tilemap_scan)
{
/* logical (col,row) -> memory offset */
return ((col * 32 & 0xe0) >> 5) + ((row * 32 & 0xe0) >> 2) + ((col * 32 & 0x3f00) >> 1) + 0x4000;
}
TILEMAP_MAPPER_MEMBER(exedexes_state::fg_tilemap_scan)
{
/* logical (col,row) -> memory offset */
return ((col * 16 & 0xf0) >> 4) + (row * 16 & 0xf0) + (col * 16 & 0x700) + ((row * 16 & 0x700) << 3);
}
void exedexes_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(exedexes_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(exedexes_state::bg_tilemap_scan)), 32, 32, 64, 64);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(exedexes_state::get_fg_tile_info)), tilemap_mapper_delegate(*this, FUNC(exedexes_state::fg_tilemap_scan)), 16, 16, 128, 128);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(exedexes_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_fg_tilemap->set_transparent_pen(0);
m_tx_tilemap->configure_groups(*m_gfxdecode->gfx(0), 0xcf);
}
void exedexes_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const u8 *buffered_spriteram = m_spriteram->buffer();
if (!m_objon)
return;
for (int offs = 0; offs < m_spriteram->bytes(); offs += 32)
{
u32 primask = 0;
if (buffered_spriteram[offs + 1] & 0x40)
primask |= GFX_PMASK_2;
const u32 code = buffered_spriteram[offs];
const u32 color = buffered_spriteram[offs + 1] & 0x0f;
const bool flipx = buffered_spriteram[offs + 1] & 0x10;
const bool flipy = buffered_spriteram[offs + 1] & 0x20;
const int sx = buffered_spriteram[offs + 3] - ((buffered_spriteram[offs + 1] & 0x80) << 1);
const int sy = buffered_spriteram[offs + 2];
m_gfxdecode->gfx(3)->prio_transpen(bitmap,cliprect,
code,
color,
flipx,flipy,
sx,sy,screen.priority(),primask,0);
}
}
u32 exedexes_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
if (m_sc2on)
{
m_bg_tilemap->set_scrollx(0, ((m_bg_scroll[1]) << 8) + m_bg_scroll[0]);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 1);
}
else
bitmap.fill(0, cliprect);
if (m_sc1on)
{
m_fg_tilemap->set_scrollx(0, ((m_nbg_yscroll[1]) << 8) + m_nbg_yscroll[0]);
m_fg_tilemap->set_scrolly(0, ((m_nbg_xscroll[1]) << 8) + m_nbg_xscroll[0]);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 2);
}
draw_sprites(screen, bitmap, cliprect);
if (m_chon)
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}

View File

@ -1,8 +1,10 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders: Mirko Buffoni // copyright-holders: Mirko Buffoni
/**************************************************************************** /****************************************************************************
Higemaru Pirate Ship Higemaru
Capcom 84603-1 PCB
driver by Mirko Buffoni driver by Mirko Buffoni
@ -13,27 +15,226 @@ Use Player 1 joystick and button, then press START1 to go to next screen.
****************************************************************************/ ****************************************************************************/
#include "emu.h" #include "emu.h"
#include "higemaru.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "machine/timer.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "emupal.h"
#include "screen.h" #include "screen.h"
#include "speaker.h" #include "speaker.h"
#include "tilemap.h"
TIMER_DEVICE_CALLBACK_MEMBER(higemaru_state::higemaru_scanline) // configurable logging
#define LOG_C800 (1U << 1)
//#define VERBOSE (LOG_GENERAL | LOG_C800)
#include "logmacro.h"
#define LOGC800(...) LOGMASKED(LOG_C800, __VA_ARGS__)
namespace {
class higemaru_state : public driver_device
{
public:
higemaru_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void higemaru(machine_config &config);
protected:
virtual void video_start() override;
private:
// memory pointers
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
required_shared_ptr<uint8_t> m_spriteram;
// devices
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
// video-related
tilemap_t *m_bg_tilemap = nullptr;
void videoram_w(offs_t offset, uint8_t data);
void colorram_w(offs_t offset, uint8_t data);
void c800_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_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);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void program_map(address_map &map);
};
// video
void higemaru_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void higemaru_state::colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
/***************************************************************************
Convert the color PROMs into a more useable format.
***************************************************************************/
void higemaru_state::palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = (color_prom[i] >> 3) & 0x01;
bit1 = (color_prom[i] >> 4) & 0x01;
bit2 = (color_prom[i] >> 5) & 0x01;
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = 0;
bit1 = (color_prom[i] >> 6) & 0x01;
bit2 = (color_prom[i] >> 7) & 0x01;
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x20;
// characters use colors 0-15
for (int i = 0; i < 0x80; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
// sprites use colors 16-31
for (int i = 0x80; i < 0x180; i++)
{
uint8_t const ctabentry = (color_prom[i + 0x80] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
}
void higemaru_state::c800_w(uint8_t data)
{
if (data & 0x7c)
LOGC800("c800 = %02x\n", data);
// bits 0 and 1 are coin counters
machine().bookkeeping().coin_counter_w(0, data & 2);
machine().bookkeeping().coin_counter_w(1, data & 1);
// bit 7 flips screen
if (flip_screen() != (data & 0x80))
{
flip_screen_set(data & 0x80);
m_bg_tilemap->mark_all_dirty();
}
}
TILE_GET_INFO_MEMBER(higemaru_state::get_bg_tile_info)
{
int const code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x80) << 1);
int const color = m_colorram[tile_index] & 0x1f;
tileinfo.set(0, code, color, 0);
}
void higemaru_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(higemaru_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
}
void higemaru_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int offs = m_spriteram.bytes() - 16; offs >= 0; offs -= 16)
{
int const code = m_spriteram[offs] & 0x7f;
int col = m_spriteram[offs + 4] & 0x0f;
int sx = m_spriteram[offs + 12];
int sy = m_spriteram[offs + 8];
int flipx = m_spriteram[offs + 4] & 0x10;
int flipy = m_spriteram[offs + 4] & 0x20;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect,
code,
col,
flipx, flipy,
sx, sy, 15);
// draw again with wraparound
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect,
code,
col,
flipx, flipy,
sx - 256, sy, 15);
}
}
uint32_t higemaru_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}
// machine
TIMER_DEVICE_CALLBACK_MEMBER(higemaru_state::scanline)
{ {
int scanline = param; int scanline = param;
if(scanline == 240) // vblank-out irq if(scanline == 240) // vblank-out irq
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); /* Z80 - RST 08h - vblank */ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); // Z80 - RST 08h - vblank
if(scanline == 0) // unknown irq event, does various stuff like copying the spriteram if(scanline == 0) // unknown irq event, does various stuff like copying the spriteram
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); /* Z80 - RST 10h */ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 - RST 10h
} }
void higemaru_state::higemaru_map(address_map &map) void higemaru_state::program_map(address_map &map)
{ {
map(0x0000, 0x7fff).rom(); map(0x0000, 0x7fff).rom();
map(0xc000, 0xc000).portr("P1"); map(0xc000, 0xc000).portr("P1");
@ -41,12 +242,12 @@ void higemaru_state::higemaru_map(address_map &map)
map(0xc002, 0xc002).portr("SYSTEM"); map(0xc002, 0xc002).portr("SYSTEM");
map(0xc003, 0xc003).portr("DSW1"); map(0xc003, 0xc003).portr("DSW1");
map(0xc004, 0xc004).portr("DSW2"); map(0xc004, 0xc004).portr("DSW2");
map(0xc800, 0xc800).w(FUNC(higemaru_state::higemaru_c800_w)); map(0xc800, 0xc800).w(FUNC(higemaru_state::c800_w));
map(0xc801, 0xc802).w("ay1", FUNC(ay8910_device::address_data_w)); map(0xc801, 0xc802).w("ay1", FUNC(ay8910_device::address_data_w));
map(0xc803, 0xc804).w("ay2", FUNC(ay8910_device::address_data_w)); map(0xc803, 0xc804).w("ay2", FUNC(ay8910_device::address_data_w));
map(0xd000, 0xd3ff).ram().w(FUNC(higemaru_state::higemaru_videoram_w)).share("videoram"); map(0xd000, 0xd3ff).ram().w(FUNC(higemaru_state::videoram_w)).share(m_videoram);
map(0xd400, 0xd7ff).ram().w(FUNC(higemaru_state::higemaru_colorram_w)).share("colorram"); map(0xd400, 0xd7ff).ram().w(FUNC(higemaru_state::colorram_w)).share(m_colorram);
map(0xd880, 0xd9ff).ram().share("spriteram"); map(0xd880, 0xd9ff).ram().share(m_spriteram);
map(0xe000, 0xefff).ram(); map(0xe000, 0xefff).ram();
} }
@ -75,7 +276,7 @@ static INPUT_PORTS_START( higemaru )
PORT_START("SYSTEM") PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Freeze") PORT_CODE(KEYCODE_F1) PORT_TOGGLE /* code at 0x0252 */ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Freeze") PORT_CODE(KEYCODE_F1) PORT_TOGGLE // code at 0x0252
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
@ -111,7 +312,7 @@ static INPUT_PORTS_START( higemaru )
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) )
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) ) PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) )
PORT_DIPNAME( 0x0e, 0x0e, DEF_STR( Bonus_Life ) ) /* table at 0x0148 */ PORT_DIPNAME( 0x0e, 0x0e, DEF_STR( Bonus_Life ) ) // table at 0x0148
PORT_DIPSETTING( 0x0e, "10k 50k 50k+" ) PORT_DIPSETTING( 0x0e, "10k 50k 50k+" )
PORT_DIPSETTING( 0x0c, "10k 60k 60k+" ) PORT_DIPSETTING( 0x0c, "10k 60k 60k+" )
PORT_DIPSETTING( 0x0a, "20k 60k 60k+" ) PORT_DIPSETTING( 0x0a, "20k 60k 60k+" )
@ -120,10 +321,10 @@ static INPUT_PORTS_START( higemaru )
PORT_DIPSETTING( 0x04, "30k 80k 80k+" ) PORT_DIPSETTING( 0x04, "30k 80k 80k+" )
PORT_DIPSETTING( 0x02, "40k 100k 100k+" ) PORT_DIPSETTING( 0x02, "40k 100k 100k+" )
PORT_DIPSETTING( 0x00, DEF_STR( None ) ) PORT_DIPSETTING( 0x00, DEF_STR( None ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) ) /* code at 0x6234 */ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) ) // code at 0x6234
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) ) PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "Demo Music" ) /* code at 0x6226 - when is it called ? */ PORT_DIPNAME( 0x20, 0x20, "Demo Music" ) // code at 0x6226 - when is it called ?
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
@ -158,32 +359,32 @@ static const gfx_layout spritelayout =
}; };
static GFXDECODE_START( gfx_higemaru ) static GFXDECODE_START( gfx_higemaru )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 32 ) GFXDECODE_ENTRY( "chars", 0, charlayout, 0, 32 )
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 32*4, 16 ) GFXDECODE_ENTRY( "sprites", 0, spritelayout, 32*4, 16 )
GFXDECODE_END GFXDECODE_END
void higemaru_state::higemaru(machine_config &config) void higemaru_state::higemaru(machine_config &config)
{ {
/* basic machine hardware */ // basic machine hardware
Z80(config, m_maincpu, XTAL(12'000'000)/4); /* 3 MHz Sharp LH0080A Z80A-CPU-D */ Z80(config, m_maincpu, XTAL(12'000'000) / 4); // 3 MHz Sharp LH0080A Z80A-CPU-D
m_maincpu->set_addrmap(AS_PROGRAM, &higemaru_state::higemaru_map); m_maincpu->set_addrmap(AS_PROGRAM, &higemaru_state::program_map);
TIMER(config, "scantimer").configure_scanline(FUNC(higemaru_state::higemaru_scanline), "screen", 0, 1); TIMER(config, "scantimer").configure_scanline(FUNC(higemaru_state::scanline), "screen", 0, 1);
/* video hardware */ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60); screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8); screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1); screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
screen.set_screen_update(FUNC(higemaru_state::screen_update_higemaru)); screen.set_screen_update(FUNC(higemaru_state::screen_update));
screen.set_palette(m_palette); screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_higemaru); GFXDECODE(config, m_gfxdecode, m_palette, gfx_higemaru);
PALETTE(config, m_palette, FUNC(higemaru_state::higemaru_palette), 32*4+16*16, 32); PALETTE(config, m_palette, FUNC(higemaru_state::palette), 32*4+16*16, 32);
/* sound hardware */ // sound hardware
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
AY8910(config, "ay1", XTAL(12'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.25); AY8910(config, "ay1", XTAL(12'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -204,20 +405,22 @@ ROM_START( higemaru )
ROM_LOAD( "hg6.p11", 0x4000, 0x2000, CRC(5f5296aa) SHA1(410ee1df63492e488b3578b9c4cfbfbd2f41c888) ) ROM_LOAD( "hg6.p11", 0x4000, 0x2000, CRC(5f5296aa) SHA1(410ee1df63492e488b3578b9c4cfbfbd2f41c888) )
ROM_LOAD( "hg7.m11", 0x6000, 0x2000, CRC(dc5d455d) SHA1(7d253d6680d35943792746da11d91d7be57367cc) ) ROM_LOAD( "hg7.m11", 0x6000, 0x2000, CRC(dc5d455d) SHA1(7d253d6680d35943792746da11d91d7be57367cc) )
ROM_REGION( 0x2000, "gfx1", 0 ) ROM_REGION( 0x2000, "chars", 0 )
ROM_LOAD( "hg3.m1", 0x0000, 0x2000, CRC(b37b88c8) SHA1(7933270969806154f0774d31fda75a5352cf26ad) ) /* characters */ ROM_LOAD( "hg3.m1", 0x0000, 0x2000, CRC(b37b88c8) SHA1(7933270969806154f0774d31fda75a5352cf26ad) )
ROM_REGION( 0x4000, "gfx2", 0 ) ROM_REGION( 0x4000, "sprites", 0 )
ROM_LOAD( "hg1.c14", 0x0000, 0x2000, CRC(ef4c2f5d) SHA1(247ce819cdc4ed4ec99c25c9006bac1911354bc8) ) /* tiles */ ROM_LOAD( "hg1.c14", 0x0000, 0x2000, CRC(ef4c2f5d) SHA1(247ce819cdc4ed4ec99c25c9006bac1911354bc8) )
ROM_LOAD( "hg2.e14", 0x2000, 0x2000, CRC(9133f804) SHA1(93661c028709a7134537321e52da85e3c0f917ba) ) ROM_LOAD( "hg2.e14", 0x2000, 0x2000, CRC(9133f804) SHA1(93661c028709a7134537321e52da85e3c0f917ba) )
ROM_REGION( 0x0420, "proms", 0 ) ROM_REGION( 0x0420, "proms", 0 )
ROM_LOAD( "hgb3.l6", 0x0000, 0x0020, CRC(629cebd8) SHA1(c28cd0f341f4f1c7be97f4d8c289860db8ac0857) ) /* palette */ ROM_LOAD( "hgb3.l6", 0x0000, 0x0020, CRC(629cebd8) SHA1(c28cd0f341f4f1c7be97f4d8c289860db8ac0857) ) // palette
ROM_LOAD( "hgb5.m4", 0x0020, 0x0100, CRC(dbaa4443) SHA1(cca2f9b187abd735f2309b38570edcd745042b3e) ) /* char lookup table */ ROM_LOAD( "hgb5.m4", 0x0020, 0x0100, CRC(dbaa4443) SHA1(cca2f9b187abd735f2309b38570edcd745042b3e) ) // char lookup table
ROM_LOAD( "hgb1.h7", 0x0120, 0x0100, CRC(07c607ce) SHA1(c048602d62f47129152bbc7ccd38627d78a4392f) ) /* sprite lookup table */ ROM_LOAD( "hgb1.h7", 0x0120, 0x0100, CRC(07c607ce) SHA1(c048602d62f47129152bbc7ccd38627d78a4392f) ) // sprite lookup table
ROM_LOAD( "hgb4.l9", 0x0220, 0x0100, CRC(712ac508) SHA1(5349d722ab6733afdda65f6e0a98322f0d515e86) ) /* interrupt timing (not used) */ ROM_LOAD( "hgb4.l9", 0x0220, 0x0100, CRC(712ac508) SHA1(5349d722ab6733afdda65f6e0a98322f0d515e86) ) // interrupt timing (not used)
ROM_LOAD( "hgb2.k7", 0x0320, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) /* video timing? (not used) */ ROM_LOAD( "hgb2.k7", 0x0320, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) // video timing? (not used)
ROM_END ROM_END
} // anonymous namespace
GAME( 1984, higemaru, 0, higemaru, higemaru, higemaru_state, empty_init, ROT0, "Capcom", "Pirate Ship Higemaru", MACHINE_SUPPORTS_SAVE ) GAME( 1984, higemaru, 0, higemaru, higemaru, higemaru_state, empty_init, ROT0, "Capcom", "Pirate Ship Higemaru", MACHINE_SUPPORTS_SAVE )

View File

@ -1,55 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Mirko Buffoni
/*************************************************************************
Pirate Ship Higemaru
*************************************************************************/
#ifndef MAME_INCLUDES_HIGEMARU_H
#define MAME_INCLUDES_HIGEMARU_H
#pragma once
#include "machine/timer.h"
#include "emupal.h"
#include "tilemap.h"
class higemaru_state : public driver_device
{
public:
higemaru_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void higemaru(machine_config &config);
private:
/* memory pointers */
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
required_shared_ptr<uint8_t> m_spriteram;
/* video-related */
tilemap_t *m_bg_tilemap = nullptr;
void higemaru_videoram_w(offs_t offset, uint8_t data);
void higemaru_colorram_w(offs_t offset, uint8_t data);
void higemaru_c800_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void video_start() override;
void higemaru_palette(palette_device &palette) const;
uint32_t screen_update_higemaru(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(higemaru_scanline);
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
void higemaru_map(address_map &map);
};
#endif // MAME_INCLUDES_HIGEMARU_H

View File

@ -1,142 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Mirko Buffoni
#include "emu.h"
#include "higemaru.h"
void higemaru_state::higemaru_videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void higemaru_state::higemaru_colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
/***************************************************************************
Convert the color PROMs into a more useable format.
***************************************************************************/
void higemaru_state::higemaru_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = (color_prom[i] >> 3) & 0x01;
bit1 = (color_prom[i] >> 4) & 0x01;
bit2 = (color_prom[i] >> 5) & 0x01;
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = 0;
bit1 = (color_prom[i] >> 6) & 0x01;
bit2 = (color_prom[i] >> 7) & 0x01;
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x20;
// characters use colors 0-15
for (int i = 0; i < 0x80; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
// sprites use colors 16-31
for (int i = 0x80; i < 0x180; i++)
{
uint8_t const ctabentry = (color_prom[i + 0x80] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
}
void higemaru_state::higemaru_c800_w(uint8_t data)
{
if (data & 0x7c)
logerror("c800 = %02x\n",data);
/* bits 0 and 1 are coin counters */
machine().bookkeeping().coin_counter_w(0,data & 2);
machine().bookkeeping().coin_counter_w(1,data & 1);
/* bit 7 flips screen */
if (flip_screen() != (data & 0x80))
{
flip_screen_set(data & 0x80);
m_bg_tilemap->mark_all_dirty();
}
}
TILE_GET_INFO_MEMBER(higemaru_state::get_bg_tile_info)
{
int code = m_videoram[tile_index] + ((m_colorram[tile_index] & 0x80) << 1);
int color = m_colorram[tile_index] & 0x1f;
tileinfo.set(0, code, color, 0);
}
void higemaru_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(higemaru_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
}
void higemaru_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *spriteram = m_spriteram;
for (int offs = m_spriteram.bytes() - 16; offs >= 0; offs -= 16)
{
int const code = spriteram[offs] & 0x7f;
int col = spriteram[offs + 4] & 0x0f;
int sx = spriteram[offs + 12];
int sy = spriteram[offs + 8];
int flipx = spriteram[offs + 4] & 0x10;
int flipy = spriteram[offs + 4] & 0x20;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
code,
col,
flipx,flipy,
sx,sy,15);
/* draw again with wraparound */
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
code,
col,
flipx,flipy,
sx - 256,sy,15);
}
}
uint32_t higemaru_state::screen_update_higemaru(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}

View File

@ -1,8 +1,10 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders: Mirko Buffoni // copyright-holders: Mirko Buffoni
/*************************************************************************** /***************************************************************************
Son Son memory map (preliminary) Son Son memory map (preliminary)
Capcom 84601-A + 84601-B PCBs
driver by Mirko Buffoni driver by Mirko Buffoni
@ -51,16 +53,226 @@ TODO:
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "sonson.h"
#include "cpu/m6809/m6809.h" #include "cpu/m6809/m6809.h"
#include "machine/74259.h" #include "machine/74259.h"
#include "machine/gen_latch.h" #include "machine/gen_latch.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "emupal.h"
#include "screen.h" #include "screen.h"
#include "speaker.h" #include "speaker.h"
#include "tilemap.h"
namespace {
class sonson_state : public driver_device
{
public:
sonson_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void sonson(machine_config &config);
protected:
virtual void video_start() override;
private:
// memory pointers
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
required_shared_ptr<uint8_t> m_spriteram;
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
// video-related
tilemap_t *m_bg_tilemap = nullptr;
DECLARE_WRITE_LINE_MEMBER(sh_irqtrigger_w);
void videoram_w(offs_t offset, uint8_t data);
void colorram_w(offs_t offset, uint8_t data);
void scrollx_w(uint8_t data);
template<uint8_t Which> WRITE_LINE_MEMBER(coin_counter_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
void palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
void sound_map(address_map &map);
};
// video
/***************************************************************************
Convert the color PROMs into a more useable format.
Son Son has two 32x8 palette PROMs and two 256x4 lookup table PROMs (one
for characters, one for sprites).
The palette PROMs are connected to the RGB output this way:
I don't know the exact values of the resistors between the PROMs and the
RGB output. I assumed these values (the same as Commando)
bit 7 -- 220 ohm resistor -- GREEN
-- 470 ohm resistor -- GREEN
-- 1 kohm resistor -- GREEN
-- 2.2kohm resistor -- GREEN
-- 220 ohm resistor -- BLUE
-- 470 ohm resistor -- BLUE
-- 1 kohm resistor -- BLUE
bit 0 -- 2.2kohm resistor -- BLUE
bit 7 -- unused
-- unused
-- unused
-- unused
-- 220 ohm resistor -- RED
-- 470 ohm resistor -- RED
-- 1 kohm resistor -- RED
bit 0 -- 2.2kohm resistor -- RED
***************************************************************************/
void sonson_state::palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2, bit3;
// red component
bit0 = (color_prom[i + 0x20] >> 0) & 0x01;
bit1 = (color_prom[i + 0x20] >> 1) & 0x01;
bit2 = (color_prom[i + 0x20] >> 2) & 0x01;
bit3 = (color_prom[i + 0x20] >> 3) & 0x01;
int const r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
// green component
bit0 = (color_prom[i + 0x00] >> 4) & 0x01;
bit1 = (color_prom[i + 0x00] >> 5) & 0x01;
bit2 = (color_prom[i + 0x00] >> 6) & 0x01;
bit3 = (color_prom[i + 0x00] >> 7) & 0x01;
int const g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
// blue component
bit0 = (color_prom[i + 0x00] >> 0) & 0x01;
bit1 = (color_prom[i + 0x00] >> 1) & 0x01;
bit2 = (color_prom[i + 0x00] >> 2) & 0x01;
bit3 = (color_prom[i + 0x00] >> 3) & 0x01;
int const b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x40;
// characters use colors 0-0x0f
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
// sprites use colors 0x10-0x1f
for (int i = 0x100; i < 0x200; i++)
{
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
}
void sonson_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void sonson_state::colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void sonson_state::scrollx_w(uint8_t data)
{
for (int row = 5; row < 32; row++)
m_bg_tilemap->set_scrollx(row, data);
}
TILE_GET_INFO_MEMBER(sonson_state::get_bg_tile_info)
{
int const attr = m_colorram[tile_index];
int const code = m_videoram[tile_index] + 256 * (attr & 0x03);
int const color = attr >> 2;
tileinfo.set(0, code, color, 0);
}
void sonson_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sonson_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap->set_scroll_rows(32);
}
void sonson_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
int const code = m_spriteram[offs + 2] + ((m_spriteram[offs + 1] & 0x20) << 3);
int const color = m_spriteram[offs + 1] & 0x1f;
int flipx = ~m_spriteram[offs + 1] & 0x40;
int flipy = ~m_spriteram[offs + 1] & 0x80;
int sx = m_spriteram[offs + 3];
int sy = m_spriteram[offs + 0];
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect,
code, color,
flipx, flipy,
sx, sy, 0);
// wrap-around
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx - 256, sy, 0);
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx, sy - 256, 0);
}
}
uint32_t sonson_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}
// machine
WRITE_LINE_MEMBER(sonson_state::sh_irqtrigger_w) WRITE_LINE_MEMBER(sonson_state::sh_irqtrigger_w)
{ {
// setting bit 0 low then high triggers IRQ on the sound CPU // setting bit 0 low then high triggers IRQ on the sound CPU
@ -68,23 +280,19 @@ WRITE_LINE_MEMBER(sonson_state::sh_irqtrigger_w)
m_audiocpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE); m_audiocpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
} }
WRITE_LINE_MEMBER(sonson_state::coin1_counter_w) template <uint8_t Which>
WRITE_LINE_MEMBER(sonson_state::coin_counter_w)
{ {
machine().bookkeeping().coin_counter_w(0, state); machine().bookkeeping().coin_counter_w(Which, state);
}
WRITE_LINE_MEMBER(sonson_state::coin2_counter_w)
{
machine().bookkeeping().coin_counter_w(1, state);
} }
void sonson_state::main_map(address_map &map) void sonson_state::main_map(address_map &map)
{ {
map(0x0000, 0x0fff).ram(); map(0x0000, 0x0fff).ram();
map(0x1000, 0x13ff).ram().w(FUNC(sonson_state::sonson_videoram_w)).share("videoram"); map(0x1000, 0x13ff).ram().w(FUNC(sonson_state::videoram_w)).share(m_videoram);
map(0x1400, 0x17ff).ram().w(FUNC(sonson_state::sonson_colorram_w)).share("colorram"); map(0x1400, 0x17ff).ram().w(FUNC(sonson_state::colorram_w)).share(m_colorram);
map(0x2020, 0x207f).ram().share("spriteram"); map(0x2020, 0x207f).ram().share(m_spriteram);
map(0x3000, 0x3000).w(FUNC(sonson_state::sonson_scrollx_w)); map(0x3000, 0x3000).w(FUNC(sonson_state::scrollx_w));
map(0x3002, 0x3002).portr("P1"); map(0x3002, 0x3002).portr("P1");
map(0x3003, 0x3003).portr("P2"); map(0x3003, 0x3003).portr("P2");
map(0x3004, 0x3004).portr("SYSTEM"); map(0x3004, 0x3004).portr("SYSTEM");
@ -110,33 +318,33 @@ void sonson_state::sound_map(address_map &map)
static INPUT_PORTS_START( sonson ) static INPUT_PORTS_START( sonson )
PORT_START("P1") PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_START("P2") PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_START("SYSTEM") PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_START("DSW1") PORT_START("DSW1")
PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2,3,4") PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2,3,4")
@ -156,7 +364,7 @@ static INPUT_PORTS_START( sonson )
PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) )
PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) )
PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
PORT_DIPNAME( 0x10, 0x10, "Coinage affects" ) PORT_DIPLOCATION("SW1:5") /* Not documented in manual */ PORT_DIPNAME( 0x10, 0x10, "Coinage affects" ) PORT_DIPLOCATION("SW1:5") // Not documented in manual
PORT_DIPSETTING( 0x10, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x10, DEF_STR( Coin_A ) )
PORT_DIPSETTING( 0x00, DEF_STR( Coin_B ) ) PORT_DIPSETTING( 0x00, DEF_STR( Coin_B ) )
PORT_DIPNAME( 0x20, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:6") PORT_DIPNAME( 0x20, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:6")
@ -173,7 +381,7 @@ static INPUT_PORTS_START( sonson )
PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x02, "4" )
PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x01, "5" )
PORT_DIPSETTING( 0x00, "7" ) PORT_DIPSETTING( 0x00, "7" )
PORT_DIPNAME( 0x04, 0x00, "2 Players Game" ) PORT_DIPLOCATION("SW2:3") /* Not documented in manual */ PORT_DIPNAME( 0x04, 0x00, "2 Players Game" ) PORT_DIPLOCATION("SW2:3") // Not documented in manual
PORT_DIPSETTING( 0x04, "1 Credit" ) PORT_DIPSETTING( 0x04, "1 Credit" )
PORT_DIPSETTING( 0x00, "2 Credits" ) PORT_DIPSETTING( 0x00, "2 Credits" )
PORT_DIPNAME( 0x18, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPNAME( 0x18, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5")
@ -206,8 +414,8 @@ static const gfx_layout spritelayout =
}; };
static GFXDECODE_START( gfx_sonson ) static GFXDECODE_START( gfx_sonson )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x2_planar, 0, 64 ) GFXDECODE_ENTRY( "chars", 0, gfx_8x8x2_planar, 0, 64 )
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 64*4, 32 ) GFXDECODE_ENTRY( "sprites", 0, spritelayout, 64*4, 32 )
GFXDECODE_END GFXDECODE_END
@ -215,41 +423,41 @@ GFXDECODE_END
void sonson_state::sonson(machine_config &config) void sonson_state::sonson(machine_config &config)
{ {
/* basic machine hardware */ // basic machine hardware
MC6809(config, m_maincpu, XTAL(12'000'000) / 2); // HD68B09P (/4 internally) MC6809(config, m_maincpu, XTAL(12'000'000) / 2); // HD68B09P (/4 internally)
m_maincpu->set_addrmap(AS_PROGRAM, &sonson_state::main_map); m_maincpu->set_addrmap(AS_PROGRAM, &sonson_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(sonson_state::irq0_line_hold)); m_maincpu->set_vblank_int("screen", FUNC(sonson_state::irq0_line_hold));
MC6809(config, m_audiocpu, XTAL(12'000'000) / 2); // HD68B09P (/4 internally) MC6809(config, m_audiocpu, XTAL(12'000'000) / 2); // HD68B09P (/4 internally)
m_audiocpu->set_addrmap(AS_PROGRAM, &sonson_state::sound_map); m_audiocpu->set_addrmap(AS_PROGRAM, &sonson_state::sound_map);
m_audiocpu->set_periodic_int(FUNC(sonson_state::irq0_line_hold), attotime::from_hz(4*60)); /* FIRQs are triggered by the main CPU */ m_audiocpu->set_periodic_int(FUNC(sonson_state::irq0_line_hold), attotime::from_hz(4 * 60)); // FIRQs are triggered by the main CPU
ls259_device &mainlatch(LS259(config, "mainlatch")); // A9 ls259_device &mainlatch(LS259(config, "mainlatch")); // A9
mainlatch.q_out_cb<0>().set(FUNC(sonson_state::flipscreen_w)); mainlatch.q_out_cb<0>().set(FUNC(sonson_state::flip_screen_set)).invert();
mainlatch.q_out_cb<1>().set(FUNC(sonson_state::sh_irqtrigger_w)); mainlatch.q_out_cb<1>().set(FUNC(sonson_state::sh_irqtrigger_w));
mainlatch.q_out_cb<6>().set(FUNC(sonson_state::coin2_counter_w)); mainlatch.q_out_cb<6>().set(FUNC(sonson_state::coin_counter_w<1>));
mainlatch.q_out_cb<7>().set(FUNC(sonson_state::coin1_counter_w)); mainlatch.q_out_cb<7>().set(FUNC(sonson_state::coin_counter_w<0>));
/* video hardware */ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(57.37); screen.set_refresh_hz(57.37);
screen.set_size(32*8, 32*8); screen.set_size(32*8, 32*8);
screen.set_visarea(1*8, 31*8-1, 1*8, 31*8-1); screen.set_visarea(1*8, 31*8-1, 1*8, 31*8-1);
screen.set_screen_update(FUNC(sonson_state::screen_update_sonson)); screen.set_screen_update(FUNC(sonson_state::screen_update));
screen.set_palette(m_palette); screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_sonson); GFXDECODE(config, m_gfxdecode, m_palette, gfx_sonson);
PALETTE(config, m_palette, FUNC(sonson_state::sonson_palette), 64*4 + 32*8, 32); PALETTE(config, m_palette, FUNC(sonson_state::palette), 64*4 + 32*8, 32);
/* sound hardware */ // sound hardware
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch"); GENERIC_LATCH_8(config, "soundlatch");
AY8910(config, "ay1", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.30); /* 1.5 MHz */ AY8910(config, "ay1", XTAL(12'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.30); // 1.5 MHz
AY8910(config, "ay2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.30); /* 1.5 MHz */ AY8910(config, "ay2", XTAL(12'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.30); // 1.5 MHz
} }
@ -261,7 +469,7 @@ void sonson_state::sonson(machine_config &config)
***************************************************************************/ ***************************************************************************/
ROM_START( sonson ) ROM_START( sonson )
ROM_REGION( 0x10000, "maincpu", 0 ) /* 64k for code + 3*16k for the banked ROMs images */ ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "ss.01e", 0x4000, 0x4000, CRC(cd40cc54) SHA1(4269586099638d31dd30381e94538701982e9f5a) ) ROM_LOAD( "ss.01e", 0x4000, 0x4000, CRC(cd40cc54) SHA1(4269586099638d31dd30381e94538701982e9f5a) )
ROM_LOAD( "ss.02e", 0x8000, 0x4000, CRC(c3476527) SHA1(499b879a12b55443ec833e5a2819e9da20e3b033) ) ROM_LOAD( "ss.02e", 0x8000, 0x4000, CRC(c3476527) SHA1(499b879a12b55443ec833e5a2819e9da20e3b033) )
ROM_LOAD( "ss.03e", 0xc000, 0x4000, CRC(1fd0e729) SHA1(e04215b0c3d11ce844ab250ff3e1a845dd0b6c3e) ) ROM_LOAD( "ss.03e", 0xc000, 0x4000, CRC(1fd0e729) SHA1(e04215b0c3d11ce844ab250ff3e1a845dd0b6c3e) )
@ -269,12 +477,12 @@ ROM_START( sonson )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "ss_6.c11", 0xe000, 0x2000, CRC(1135c48a) SHA1(bfc10363fc42fb589088675a6e8e3d1668d8a6b8) ) ROM_LOAD( "ss_6.c11", 0xe000, 0x2000, CRC(1135c48a) SHA1(bfc10363fc42fb589088675a6e8e3d1668d8a6b8) )
ROM_REGION( 0x04000, "gfx1", 0 ) ROM_REGION( 0x04000, "chars", 0 )
ROM_LOAD( "ss_7.b6", 0x00000, 0x2000, CRC(990890b1) SHA1(0ae5da75e8ff013d32f2a6e3a015d5e1623fbb19) ) /* characters */ ROM_LOAD( "ss_7.b6", 0x00000, 0x2000, CRC(990890b1) SHA1(0ae5da75e8ff013d32f2a6e3a015d5e1623fbb19) )
ROM_LOAD( "ss_8.b5", 0x02000, 0x2000, CRC(9388ff82) SHA1(31ff5e61d062262754bbf6763d094495c1d2e838) ) ROM_LOAD( "ss_8.b5", 0x02000, 0x2000, CRC(9388ff82) SHA1(31ff5e61d062262754bbf6763d094495c1d2e838) )
ROM_REGION( 0x0c000, "gfx2", 0 ) ROM_REGION( 0x0c000, "sprites", 0 )
ROM_LOAD( "ss_9.m5", 0x00000, 0x2000, CRC(8cb1cacf) SHA1(41b479dae84176ceb4eacb30b4dad58b7767606e) ) /* sprites */ ROM_LOAD( "ss_9.m5", 0x00000, 0x2000, CRC(8cb1cacf) SHA1(41b479dae84176ceb4eacb30b4dad58b7767606e) )
ROM_LOAD( "ss_10.m6", 0x02000, 0x2000, CRC(f802815e) SHA1(968145680483620cb0c9e7c00b4927aeace99e0c) ) ROM_LOAD( "ss_10.m6", 0x02000, 0x2000, CRC(f802815e) SHA1(968145680483620cb0c9e7c00b4927aeace99e0c) )
ROM_LOAD( "ss_11.m3", 0x04000, 0x2000, CRC(4dbad88a) SHA1(721612555714e116564d2b301cfa04980d21ad3b) ) ROM_LOAD( "ss_11.m3", 0x04000, 0x2000, CRC(4dbad88a) SHA1(721612555714e116564d2b301cfa04980d21ad3b) )
ROM_LOAD( "ss_12.m4", 0x06000, 0x2000, CRC(aa05e687) SHA1(4988d540e3deb9107f0448cd8ef47fa73ec926fe) ) ROM_LOAD( "ss_12.m4", 0x06000, 0x2000, CRC(aa05e687) SHA1(4988d540e3deb9107f0448cd8ef47fa73ec926fe) )
@ -282,15 +490,15 @@ ROM_START( sonson )
ROM_LOAD( "ss_14.m2", 0x0a000, 0x2000, CRC(e14ef54e) SHA1(69ab42defff2cb91c6e07ea8805f64868a028630) ) ROM_LOAD( "ss_14.m2", 0x0a000, 0x2000, CRC(e14ef54e) SHA1(69ab42defff2cb91c6e07ea8805f64868a028630) )
ROM_REGION( 0x0340, "proms", 0 ) ROM_REGION( 0x0340, "proms", 0 )
ROM_LOAD( "ssb4.b2", 0x0000, 0x0020, CRC(c8eaf234) SHA1(d39dfab6dcad6b0a719c466b5290d2d081e4b58d) ) /* red/green component */ ROM_LOAD( "ssb4.b2", 0x0000, 0x0020, CRC(c8eaf234) SHA1(d39dfab6dcad6b0a719c466b5290d2d081e4b58d) ) // red/green component
ROM_LOAD( "ssb5.b1", 0x0020, 0x0020, CRC(0e434add) SHA1(238c281813d6079b9ae877bd0ced33abbbe39442) ) /* blue component */ ROM_LOAD( "ssb5.b1", 0x0020, 0x0020, CRC(0e434add) SHA1(238c281813d6079b9ae877bd0ced33abbbe39442) ) // blue component
ROM_LOAD( "ssb2.c4", 0x0040, 0x0100, CRC(c53321c6) SHA1(439d98a98cdf2118b887c725a7759a98e2c377d9) ) /* character lookup table */ ROM_LOAD( "ssb2.c4", 0x0040, 0x0100, CRC(c53321c6) SHA1(439d98a98cdf2118b887c725a7759a98e2c377d9) ) // character lookup table
ROM_LOAD( "ssb3.h7", 0x0140, 0x0100, CRC(7d2c324a) SHA1(3dcf09bd3f58bddb9760183d2c1b0fe5d77536ea) ) /* sprite lookup table */ ROM_LOAD( "ssb3.h7", 0x0140, 0x0100, CRC(7d2c324a) SHA1(3dcf09bd3f58bddb9760183d2c1b0fe5d77536ea) ) // sprite lookup table
ROM_LOAD( "ssb1.k11", 0x0240, 0x0100, CRC(a04b0cfe) SHA1(89ab33c6b0aa313ebda2f11516cea667a9951a81) ) /* unknown (not used) */ ROM_LOAD( "ssb1.k11", 0x0240, 0x0100, CRC(a04b0cfe) SHA1(89ab33c6b0aa313ebda2f11516cea667a9951a81) ) // unknown (not used)
ROM_END ROM_END
ROM_START( sonsonj ) ROM_START( sonsonj )
ROM_REGION( 0x10000, "maincpu", 0 ) /* 64k for code + 3*16k for the banked ROMs images */ ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "ss_0.l9", 0x4000, 0x2000, CRC(705c168f) SHA1(28d3b186cd0b927d96664051fb759b64ecc18908) ) ROM_LOAD( "ss_0.l9", 0x4000, 0x2000, CRC(705c168f) SHA1(28d3b186cd0b927d96664051fb759b64ecc18908) )
ROM_LOAD( "ss_1.j9", 0x6000, 0x2000, CRC(0f03b57d) SHA1(7d14a88f43952d5c4df2951a5b62e399ba5ef37b) ) ROM_LOAD( "ss_1.j9", 0x6000, 0x2000, CRC(0f03b57d) SHA1(7d14a88f43952d5c4df2951a5b62e399ba5ef37b) )
ROM_LOAD( "ss_2.l8", 0x8000, 0x2000, CRC(a243a15d) SHA1(a736a163fbb20fa0e318f53ccf29d155b6f77781) ) ROM_LOAD( "ss_2.l8", 0x8000, 0x2000, CRC(a243a15d) SHA1(a736a163fbb20fa0e318f53ccf29d155b6f77781) )
@ -301,12 +509,12 @@ ROM_START( sonsonj )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "ss_6.c11", 0xe000, 0x2000, CRC(1135c48a) SHA1(bfc10363fc42fb589088675a6e8e3d1668d8a6b8) ) ROM_LOAD( "ss_6.c11", 0xe000, 0x2000, CRC(1135c48a) SHA1(bfc10363fc42fb589088675a6e8e3d1668d8a6b8) )
ROM_REGION( 0x04000, "gfx1", 0 ) ROM_REGION( 0x04000, "chars", 0 )
ROM_LOAD( "ss_7.b6", 0x00000, 0x2000, CRC(990890b1) SHA1(0ae5da75e8ff013d32f2a6e3a015d5e1623fbb19) ) /* characters */ ROM_LOAD( "ss_7.b6", 0x00000, 0x2000, CRC(990890b1) SHA1(0ae5da75e8ff013d32f2a6e3a015d5e1623fbb19) )
ROM_LOAD( "ss_8.b5", 0x02000, 0x2000, CRC(9388ff82) SHA1(31ff5e61d062262754bbf6763d094495c1d2e838) ) ROM_LOAD( "ss_8.b5", 0x02000, 0x2000, CRC(9388ff82) SHA1(31ff5e61d062262754bbf6763d094495c1d2e838) )
ROM_REGION( 0x0c000, "gfx2", 0 ) ROM_REGION( 0x0c000, "sprites", 0 )
ROM_LOAD( "ss_9.m5", 0x00000, 0x2000, CRC(8cb1cacf) SHA1(41b479dae84176ceb4eacb30b4dad58b7767606e) ) /* sprites */ ROM_LOAD( "ss_9.m5", 0x00000, 0x2000, CRC(8cb1cacf) SHA1(41b479dae84176ceb4eacb30b4dad58b7767606e) )
ROM_LOAD( "ss_10.m6", 0x02000, 0x2000, CRC(f802815e) SHA1(968145680483620cb0c9e7c00b4927aeace99e0c) ) ROM_LOAD( "ss_10.m6", 0x02000, 0x2000, CRC(f802815e) SHA1(968145680483620cb0c9e7c00b4927aeace99e0c) )
ROM_LOAD( "ss_11.m3", 0x04000, 0x2000, CRC(4dbad88a) SHA1(721612555714e116564d2b301cfa04980d21ad3b) ) ROM_LOAD( "ss_11.m3", 0x04000, 0x2000, CRC(4dbad88a) SHA1(721612555714e116564d2b301cfa04980d21ad3b) )
ROM_LOAD( "ss_12.m4", 0x06000, 0x2000, CRC(aa05e687) SHA1(4988d540e3deb9107f0448cd8ef47fa73ec926fe) ) ROM_LOAD( "ss_12.m4", 0x06000, 0x2000, CRC(aa05e687) SHA1(4988d540e3deb9107f0448cd8ef47fa73ec926fe) )
@ -314,13 +522,15 @@ ROM_START( sonsonj )
ROM_LOAD( "ss_14.m2", 0x0a000, 0x2000, CRC(e14ef54e) SHA1(69ab42defff2cb91c6e07ea8805f64868a028630) ) ROM_LOAD( "ss_14.m2", 0x0a000, 0x2000, CRC(e14ef54e) SHA1(69ab42defff2cb91c6e07ea8805f64868a028630) )
ROM_REGION( 0x0340, "proms", 0 ) ROM_REGION( 0x0340, "proms", 0 )
ROM_LOAD( "ssb4.b2", 0x0000, 0x0020, CRC(c8eaf234) SHA1(d39dfab6dcad6b0a719c466b5290d2d081e4b58d) ) /* red/green component */ ROM_LOAD( "ssb4.b2", 0x0000, 0x0020, CRC(c8eaf234) SHA1(d39dfab6dcad6b0a719c466b5290d2d081e4b58d) ) // red/green component
ROM_LOAD( "ssb5.b1", 0x0020, 0x0020, CRC(0e434add) SHA1(238c281813d6079b9ae877bd0ced33abbbe39442) ) /* blue component */ ROM_LOAD( "ssb5.b1", 0x0020, 0x0020, CRC(0e434add) SHA1(238c281813d6079b9ae877bd0ced33abbbe39442) ) // blue component
ROM_LOAD( "ssb2.c4", 0x0040, 0x0100, CRC(c53321c6) SHA1(439d98a98cdf2118b887c725a7759a98e2c377d9) ) /* character lookup table */ ROM_LOAD( "ssb2.c4", 0x0040, 0x0100, CRC(c53321c6) SHA1(439d98a98cdf2118b887c725a7759a98e2c377d9) ) // character lookup table
ROM_LOAD( "ssb3.h7", 0x0140, 0x0100, CRC(7d2c324a) SHA1(3dcf09bd3f58bddb9760183d2c1b0fe5d77536ea) ) /* sprite lookup table */ ROM_LOAD( "ssb3.h7", 0x0140, 0x0100, CRC(7d2c324a) SHA1(3dcf09bd3f58bddb9760183d2c1b0fe5d77536ea) ) // sprite lookup table
ROM_LOAD( "ssb1.k11", 0x0240, 0x0100, CRC(a04b0cfe) SHA1(89ab33c6b0aa313ebda2f11516cea667a9951a81) ) /* unknown (not used) */ ROM_LOAD( "ssb1.k11", 0x0240, 0x0100, CRC(a04b0cfe) SHA1(89ab33c6b0aa313ebda2f11516cea667a9951a81) ) // unknown (not used)
ROM_END ROM_END
} // anonymous namespace
GAME( 1984, sonson, 0, sonson, sonson, sonson_state, empty_init, ROT0, "Capcom", "Son Son", MACHINE_SUPPORTS_SAVE ) GAME( 1984, sonson, 0, sonson, sonson, sonson_state, empty_init, ROT0, "Capcom", "Son Son", MACHINE_SUPPORTS_SAVE )
GAME( 1984, sonsonj, sonson, sonson, sonson, sonson_state, empty_init, ROT0, "Capcom", "Son Son (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, sonsonj, sonson, sonson, sonson, sonson_state, empty_init, ROT0, "Capcom", "Son Son (Japan)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,63 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Mirko Buffoni
/*************************************************************************
Son Son
*************************************************************************/
#ifndef MAME_INCLUDES_SONSON_H
#define MAME_INCLUDES_SONSON_H
#pragma once
#include "emupal.h"
#include "tilemap.h"
class sonson_state : public driver_device
{
public:
sonson_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_spriteram(*this, "spriteram"),
m_audiocpu(*this, "audiocpu"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void sonson(machine_config &config);
private:
/* memory pointers */
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
required_shared_ptr<uint8_t> m_spriteram;
/* video-related */
tilemap_t *m_bg_tilemap = nullptr;
/* devices */
required_device<cpu_device> m_audiocpu;
DECLARE_WRITE_LINE_MEMBER(sh_irqtrigger_w);
DECLARE_WRITE_LINE_MEMBER(coin1_counter_w);
DECLARE_WRITE_LINE_MEMBER(coin2_counter_w);
void sonson_videoram_w(offs_t offset, uint8_t data);
void sonson_colorram_w(offs_t offset, uint8_t data);
void sonson_scrollx_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void video_start() override;
void sonson_palette(palette_device &palette) const;
uint32_t screen_update_sonson(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
void main_map(address_map &map);
void sound_map(address_map &map);
};
#endif // MAME_INCLUDES_SONSON_H

View File

@ -1,172 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Mirko Buffoni
/***************************************************************************
video.c
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "sonson.h"
/***************************************************************************
Convert the color PROMs into a more useable format.
Son Son has two 32x8 palette PROMs and two 256x4 lookup table PROMs (one
for characters, one for sprites).
The palette PROMs are connected to the RGB output this way:
I don't know the exact values of the resistors between the PROMs and the
RGB output. I assumed these values (the same as Commando)
bit 7 -- 220 ohm resistor -- GREEN
-- 470 ohm resistor -- GREEN
-- 1 kohm resistor -- GREEN
-- 2.2kohm resistor -- GREEN
-- 220 ohm resistor -- BLUE
-- 470 ohm resistor -- BLUE
-- 1 kohm resistor -- BLUE
bit 0 -- 2.2kohm resistor -- BLUE
bit 7 -- unused
-- unused
-- unused
-- unused
-- 220 ohm resistor -- RED
-- 470 ohm resistor -- RED
-- 1 kohm resistor -- RED
bit 0 -- 2.2kohm resistor -- RED
***************************************************************************/
void sonson_state::sonson_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x20; i++)
{
int bit0, bit1, bit2, bit3;
// red component
bit0 = (color_prom[i + 0x20] >> 0) & 0x01;
bit1 = (color_prom[i + 0x20] >> 1) & 0x01;
bit2 = (color_prom[i + 0x20] >> 2) & 0x01;
bit3 = (color_prom[i + 0x20] >> 3) & 0x01;
int const r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
// green component
bit0 = (color_prom[i + 0x00] >> 4) & 0x01;
bit1 = (color_prom[i + 0x00] >> 5) & 0x01;
bit2 = (color_prom[i + 0x00] >> 6) & 0x01;
bit3 = (color_prom[i + 0x00] >> 7) & 0x01;
int const g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
// blue component
bit0 = (color_prom[i + 0x00] >> 0) & 0x01;
bit1 = (color_prom[i + 0x00] >> 1) & 0x01;
bit2 = (color_prom[i + 0x00] >> 2) & 0x01;
bit3 = (color_prom[i + 0x00] >> 3) & 0x01;
int const b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x40;
// characters use colors 0-0x0f
for (int i = 0; i < 0x100; i++)
{
uint8_t const ctabentry = color_prom[i] & 0x0f;
palette.set_pen_indirect(i, ctabentry);
}
// sprites use colors 0x10-0x1f
for (int i = 0x100; i < 0x200; i++)
{
uint8_t const ctabentry = (color_prom[i] & 0x0f) | 0x10;
palette.set_pen_indirect(i, ctabentry);
}
}
void sonson_state::sonson_videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void sonson_state::sonson_colorram_w(offs_t offset, uint8_t data)
{
m_colorram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
void sonson_state::sonson_scrollx_w(uint8_t data)
{
for (int row = 5; row < 32; row++)
m_bg_tilemap->set_scrollx(row, data);
}
WRITE_LINE_MEMBER(sonson_state::flipscreen_w)
{
flip_screen_set(!state);
}
TILE_GET_INFO_MEMBER(sonson_state::get_bg_tile_info)
{
int attr = m_colorram[tile_index];
int code = m_videoram[tile_index] + 256 * (attr & 0x03);
int color = attr >> 2;
tileinfo.set(0, code, color, 0);
}
void sonson_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sonson_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap->set_scroll_rows(32);
}
void sonson_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
uint8_t *spriteram = m_spriteram;
int offs;
for (offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
int code = spriteram[offs + 2] + ((spriteram[offs + 1] & 0x20) << 3);
int color = spriteram[offs + 1] & 0x1f;
int flipx = ~spriteram[offs + 1] & 0x40;
int flipy = ~spriteram[offs + 1] & 0x80;
int sx = spriteram[offs + 3];
int sy = spriteram[offs + 0];
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
code, color,
flipx, flipy,
sx, sy, 0);
/* wrap-around */
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx - 256, sy, 0);
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx, sy - 256, 0);
}
}
uint32_t sonson_state::screen_update_sonson(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}

View File

@ -1,8 +1,10 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders: Paul Leaman // copyright-holders: Paul Leaman
/*************************************************************************** /***************************************************************************
Speed Rumbler Speed Rumbler
86610-A-1 + 86610-B-1 PCBs
Driver provided by Paul Leaman Driver provided by Paul Leaman
@ -11,7 +13,6 @@
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "srumbler.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "cpu/m6809/m6809.h" #include "cpu/m6809/m6809.h"
@ -21,6 +22,223 @@
#include "speaker.h" #include "speaker.h"
#include "machine/timer.h"
#include "video/bufsprite.h"
#include "emupal.h"
#include "tilemap.h"
namespace {
class srumbler_state : public driver_device
{
public:
srumbler_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this,"maincpu"),
m_spriteram(*this,"spriteram"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_backgroundram(*this, "backgroundram"),
m_foregroundram(*this, "foregroundram"),
m_proms(*this, "proms"),
m_rombank(*this, "%01x000", 5U)
{ }
void srumbler(machine_config &config);
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<buffered_spriteram8_device> m_spriteram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_backgroundram;
required_shared_ptr<uint8_t> m_foregroundram;
required_region_ptr<uint8_t> m_proms;
required_memory_bank_array<11> m_rombank;
tilemap_t *m_bg_tilemap = nullptr;
tilemap_t *m_fg_tilemap = nullptr;
uint8_t m_scroll[4]{};
void bankswitch_w(uint8_t data);
void foreground_w(offs_t offset, uint8_t data);
void background_w(offs_t offset, uint8_t data);
void _4009_w(uint8_t data);
void scroll_w(offs_t offset, uint8_t data);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(interrupt);
void main_map(address_map &map);
void sound_map(address_map &map);
};
// video
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(srumbler_state::get_fg_tile_info)
{
uint8_t const attr = m_foregroundram[2 * tile_index];
tileinfo.set(0,
m_foregroundram[2 * tile_index + 1] + ((attr & 0x03) << 8),
(attr & 0x3c) >> 2,
(attr & 0x40) ? TILE_FORCE_LAYER0 : 0);
}
TILE_GET_INFO_MEMBER(srumbler_state::get_bg_tile_info)
{
uint8_t const attr = m_backgroundram[2 * tile_index];
tileinfo.set(1,
m_backgroundram[2 * tile_index + 1] + ((attr & 0x07) << 8),
(attr & 0xe0) >> 5,
((attr & 0x08) ? TILE_FLIPY : 0));
tileinfo.group = (attr & 0x10) >> 4;
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void srumbler_state::video_start()
{
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(srumbler_state::get_fg_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64,32);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(srumbler_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16,16, 64,64);
m_fg_tilemap->set_transparent_pen(3);
m_bg_tilemap->set_transmask(0, 0xffff, 0x0000); // split type 0 is totally transparent in front half
m_bg_tilemap->set_transmask(1, 0x07ff, 0xf800); // split type 1 has pens 0-10 transparent in front half
save_item(NAME(m_scroll));
}
/***************************************************************************
Memory handlers
***************************************************************************/
void srumbler_state::foreground_w(offs_t offset, uint8_t data)
{
m_foregroundram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset / 2);
}
void srumbler_state::background_w(offs_t offset, uint8_t data)
{
m_backgroundram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
void srumbler_state::_4009_w(uint8_t data)
{
// bit 0 flips screen
flip_screen_set(data & 1);
// bits 4-5 used during attract mode, unknown
// bits 6-7 coin counters
machine().bookkeeping().coin_counter_w(0, data & 0x40);
machine().bookkeeping().coin_counter_w(1, data & 0x80);
}
void srumbler_state::scroll_w(offs_t offset, uint8_t data)
{
m_scroll[offset] = data;
m_bg_tilemap->set_scrollx(0, m_scroll[0] | (m_scroll[1] << 8));
m_bg_tilemap->set_scrolly(0, m_scroll[2] | (m_scroll[3] << 8));
}
/***************************************************************************
Display refresh
***************************************************************************/
void srumbler_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *buffered_spriteram = m_spriteram->buffer();
// Draw the sprites.
for (int offs = m_spriteram->bytes() - 4; offs >= 0; offs -= 4)
{
/* SPRITES
=====
Attribute
0x80 Code MSB
0x40 Code MSB
0x20 Code MSB
0x10 Colour
0x08 Colour
0x04 Colour
0x02 y Flip
0x01 X MSB
*/
int const attr = buffered_spriteram[offs + 1];
int code = buffered_spriteram[offs];
code += ((attr & 0xe0) << 3);
int const colour = (attr & 0x1c) >> 2;
int sy = buffered_spriteram[offs + 2];
int sx = buffered_spriteram[offs + 3] + 0x100 * (attr & 0x01);
int flipy = attr & 0x02;
if (flip_screen())
{
sx = 496 - sx;
sy = 240 - sy;
flipy = !flipy;
}
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect,
code,
colour,
flip_screen(), flipy,
sx, sy, 15);
}
}
uint32_t srumbler_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(bitmap, cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
// machine
void srumbler_state::bankswitch_w(uint8_t data) void srumbler_state::bankswitch_w(uint8_t data)
{ {
/* /*
@ -31,36 +249,30 @@ void srumbler_state::bankswitch_w(uint8_t data)
Note that 5000-8fff can be either ROM or RAM, so we should handle Note that 5000-8fff can be either ROM or RAM, so we should handle
that as well to be 100% accurate. that as well to be 100% accurate.
*/ */
uint8_t *prom1 = memregion("proms")->base() + (data & 0xf0); uint8_t const *prom1 = &m_proms[data & 0xf0];
uint8_t *prom2 = memregion("proms")->base() + 0x100 + ((data & 0x0f) << 4); uint8_t const *prom2 = &m_proms[0x100 + ((data & 0x0f) << 4)];
for (int i = 0x05; i < 0x10; i++) for (int i = 0x05; i < 0x10; i++)
{ {
/* bit 2 of prom1 selects ROM or RAM - not supported */ // bit 2 of prom1 selects ROM or RAM - not supported
int bank = ((prom1[i] & 0x03) << 4) | (prom2[i] & 0x0f); int const bank = ((prom1[i] & 0x03) << 4) | (prom2[i] & 0x0f);
char bankname[10]; m_rombank[i - 5]->set_entry(bank);
sprintf(bankname, "%04x", i*0x1000);
membank(bankname)->set_entry(bank);
} }
} }
void srumbler_state::machine_start() void srumbler_state::machine_start()
{ {
for (int i = 0x05; i < 0x10; i++) for (int i = 0x00; i < 0x0b; i++)
{ m_rombank[i]->configure_entries(0, 64, memregion("maincpu")->base(), 0x1000);
char bankname[10];
sprintf(bankname, "%04x", i*0x1000);
membank(bankname)->configure_entries(0, 64, memregion("user1")->base(), 0x1000);
}
/* initialize banked ROM pointers */ // initialize banked ROM pointers
bankswitch_w(0); bankswitch_w(0);
} }
TIMER_DEVICE_CALLBACK_MEMBER(srumbler_state::interrupt) TIMER_DEVICE_CALLBACK_MEMBER(srumbler_state::interrupt)
{ {
int scanline = param; int const scanline = param;
if (scanline == 248) if (scanline == 248)
m_maincpu->set_input_line(0, HOLD_LINE); m_maincpu->set_input_line(0, HOLD_LINE);
@ -79,11 +291,11 @@ to the page register.
Ignore the warnings about writing to unmapped memory. Ignore the warnings about writing to unmapped memory.
*/ */
void srumbler_state::srumbler_map(address_map &map) void srumbler_state::main_map(address_map &map)
{ {
map(0x0000, 0x1dff).ram(); /* RAM (of 1 sort or another) */ map(0x0000, 0x1dff).ram(); // RAM (of 1 sort or another)
map(0x1e00, 0x1fff).ram().share("spriteram"); map(0x1e00, 0x1fff).ram().share("spriteram");
map(0x2000, 0x3fff).ram().w(FUNC(srumbler_state::background_w)).share("backgroundram"); map(0x2000, 0x3fff).ram().w(FUNC(srumbler_state::background_w)).share(m_backgroundram);
map(0x4008, 0x4008).portr("SYSTEM").w(FUNC(srumbler_state::bankswitch_w)); map(0x4008, 0x4008).portr("SYSTEM").w(FUNC(srumbler_state::bankswitch_w));
map(0x4009, 0x4009).portr("P1").w(FUNC(srumbler_state::_4009_w)); map(0x4009, 0x4009).portr("P1").w(FUNC(srumbler_state::_4009_w));
map(0x400a, 0x400a).portr("P2"); map(0x400a, 0x400a).portr("P2");
@ -91,22 +303,22 @@ void srumbler_state::srumbler_map(address_map &map)
map(0x400c, 0x400c).portr("DSW2"); map(0x400c, 0x400c).portr("DSW2");
map(0x400a, 0x400d).w(FUNC(srumbler_state::scroll_w)); map(0x400a, 0x400d).w(FUNC(srumbler_state::scroll_w));
map(0x400e, 0x400e).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x400e, 0x400e).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0x5000, 0x5fff).bankr("5000").w(FUNC(srumbler_state::foreground_w)).share("foregroundram"); /* Banked ROM */ map(0x5000, 0x5fff).bankr(m_rombank[0]).w(FUNC(srumbler_state::foreground_w)).share(m_foregroundram);
map(0x6000, 0x6fff).bankr("6000"); /* Banked ROM */ map(0x6000, 0x6fff).bankr(m_rombank[1]);
map(0x6000, 0x6fff).nopw(); /* Video RAM 2 ??? (not used) */ map(0x6000, 0x6fff).nopw(); // Video RAM 2 ??? (not used)
map(0x7000, 0x7fff).bankr("7000"); /* Banked ROM */ map(0x7000, 0x7fff).bankr(m_rombank[2]);
map(0x7000, 0x73ff).w(m_palette, FUNC(palette_device::write8)).share("palette"); map(0x7000, 0x73ff).w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0x8000, 0x8fff).bankr("8000"); /* Banked ROM */ map(0x8000, 0x8fff).bankr(m_rombank[3]);
map(0x9000, 0x9fff).bankr("9000"); /* Banked ROM */ map(0x9000, 0x9fff).bankr(m_rombank[4]);
map(0xa000, 0xafff).bankr("a000"); /* Banked ROM */ map(0xa000, 0xafff).bankr(m_rombank[5]);
map(0xb000, 0xbfff).bankr("b000"); /* Banked ROM */ map(0xb000, 0xbfff).bankr(m_rombank[6]);
map(0xc000, 0xcfff).bankr("c000"); /* Banked ROM */ map(0xc000, 0xcfff).bankr(m_rombank[7]);
map(0xd000, 0xdfff).bankr("d000"); /* Banked ROM */ map(0xd000, 0xdfff).bankr(m_rombank[8]);
map(0xe000, 0xefff).bankr("e000"); /* Banked ROM */ map(0xe000, 0xefff).bankr(m_rombank[9]);
map(0xf000, 0xffff).bankr("f000"); /* Banked ROM */ map(0xf000, 0xffff).bankr(m_rombank[10]);
} }
void srumbler_state::srumbler_sound_map(address_map &map) void srumbler_state::sound_map(address_map &map)
{ {
map(0x0000, 0x7fff).rom(); map(0x0000, 0x7fff).rom();
map(0x8000, 0x8001).w("ym1", FUNC(ym2203_device::write)); map(0x8000, 0x8001).w("ym1", FUNC(ym2203_device::write));
@ -236,24 +448,24 @@ static const gfx_layout spritelayout =
static GFXDECODE_START( gfx_srumbler ) static GFXDECODE_START( gfx_srumbler )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 448, 16 ) /* colors 448 - 511 */ GFXDECODE_ENTRY( "chars", 0, charlayout, 448, 16 ) // colors 448 - 511
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 128, 8 ) /* colors 128 - 255 */ GFXDECODE_ENTRY( "tiles", 0, tilelayout, 128, 8 ) // colors 128 - 255
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 256, 8 ) /* colors 256 - 383 */ GFXDECODE_ENTRY( "sprites", 0, spritelayout, 256, 8 ) // colors 256 - 383
GFXDECODE_END GFXDECODE_END
void srumbler_state::srumbler(machine_config &config) void srumbler_state::srumbler(machine_config &config)
{ {
/* basic machine hardware */ // basic machine hardware
MC6809(config, m_maincpu, 16_MHz_XTAL / 2); // HD68B09P MC6809(config, m_maincpu, 16_MHz_XTAL / 2); // HD68B09P
m_maincpu->set_addrmap(AS_PROGRAM, &srumbler_state::srumbler_map); m_maincpu->set_addrmap(AS_PROGRAM, &srumbler_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(srumbler_state::interrupt), "screen", 0, 1); TIMER(config, "scantimer").configure_scanline(FUNC(srumbler_state::interrupt), "screen", 0, 1);
z80_device &audiocpu(Z80(config, "audiocpu", 16_MHz_XTAL / 4)); z80_device &audiocpu(Z80(config, "audiocpu", 16_MHz_XTAL / 4));
audiocpu.set_addrmap(AS_PROGRAM, &srumbler_state::srumbler_sound_map); audiocpu.set_addrmap(AS_PROGRAM, &srumbler_state::sound_map);
/* video hardware */ // video hardware
BUFFERED_SPRITERAM8(config, m_spriteram); BUFFERED_SPRITERAM8(config, m_spriteram);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@ -269,7 +481,7 @@ void srumbler_state::srumbler(machine_config &config)
PALETTE(config, m_palette).set_format(palette_device::RGBx_444, 512); PALETTE(config, m_palette).set_format(palette_device::RGBx_444, 512);
/* sound hardware */ // sound hardware
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch"); GENERIC_LATCH_8(config, "soundlatch");
@ -297,7 +509,7 @@ void srumbler_state::srumbler(machine_config &config)
***************************************************************************/ ***************************************************************************/
ROM_START( srumbler ) ROM_START( srumbler )
ROM_REGION( 0x40000, "user1", 0 ) /* Paged ROMs */ ROM_REGION( 0x40000, "maincpu", 0 ) // Paged ROMs
ROM_LOAD( "rc04.14e", 0x00000, 0x08000, CRC(a68ce89c) SHA1(cb5dd8c47c24f9d8ac9a6135c0b7942d16002d25) ) ROM_LOAD( "rc04.14e", 0x00000, 0x08000, CRC(a68ce89c) SHA1(cb5dd8c47c24f9d8ac9a6135c0b7942d16002d25) )
ROM_LOAD( "rc03.13e", 0x08000, 0x08000, CRC(87bda812) SHA1(f46dcce21d78c8525a2578b73e05b7cd8a2d8745) ) // sldh ROM_LOAD( "rc03.13e", 0x08000, 0x08000, CRC(87bda812) SHA1(f46dcce21d78c8525a2578b73e05b7cd8a2d8745) ) // sldh
ROM_LOAD( "rc02.12e", 0x10000, 0x08000, CRC(d8609cca) SHA1(893f1f1ac0aef5d31e75228252c14c4b522bff16) ) // sldh ROM_LOAD( "rc02.12e", 0x10000, 0x08000, CRC(d8609cca) SHA1(893f1f1ac0aef5d31e75228252c14c4b522bff16) ) // sldh
@ -310,11 +522,11 @@ ROM_START( srumbler )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "rc05.2f", 0x00000, 0x08000, CRC(0177cebe) SHA1(0fa94d2057f509a6fe1de210bf513efc82f1ffe7) ) // sldh ROM_LOAD( "rc05.2f", 0x00000, 0x08000, CRC(0177cebe) SHA1(0fa94d2057f509a6fe1de210bf513efc82f1ffe7) ) // sldh
ROM_REGION( 0x04000, "gfx1", 0 ) ROM_REGION( 0x04000, "chars", 0 )
ROM_LOAD( "rc10.6g", 0x00000, 0x04000, CRC(adabe271) SHA1(256d6823dcda404375825103272213e1442c3320) ) /* characters */ ROM_LOAD( "rc10.6g", 0x00000, 0x04000, CRC(adabe271) SHA1(256d6823dcda404375825103272213e1442c3320) )
ROM_REGION( 0x40000, "gfx2", 0 ) ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "rc11.11a", 0x00000, 0x08000, CRC(5fa042ba) SHA1(9e03eaf22286330826501619a7b74181dc42a5fa) ) /* tiles */ ROM_LOAD( "rc11.11a", 0x00000, 0x08000, CRC(5fa042ba) SHA1(9e03eaf22286330826501619a7b74181dc42a5fa) )
ROM_LOAD( "rc12.13a", 0x08000, 0x08000, CRC(a2db64af) SHA1(35ab93397ee8172813e69edd085b36a5b98ba082) ) ROM_LOAD( "rc12.13a", 0x08000, 0x08000, CRC(a2db64af) SHA1(35ab93397ee8172813e69edd085b36a5b98ba082) )
ROM_LOAD( "rc13.14a", 0x10000, 0x08000, CRC(f1df5499) SHA1(b1c47b35c00bc05825353474ad2b33d9669b879e) ) ROM_LOAD( "rc13.14a", 0x10000, 0x08000, CRC(f1df5499) SHA1(b1c47b35c00bc05825353474ad2b33d9669b879e) )
ROM_LOAD( "rc14.15a", 0x18000, 0x08000, CRC(b22b31b3) SHA1(7aa1a042bccf6a1117c983bb36e88ace7712e867) ) ROM_LOAD( "rc14.15a", 0x18000, 0x08000, CRC(b22b31b3) SHA1(7aa1a042bccf6a1117c983bb36e88ace7712e867) )
@ -323,8 +535,8 @@ ROM_START( srumbler )
ROM_LOAD( "rc17.14c", 0x30000, 0x08000, CRC(aa80aaab) SHA1(37a8e57e4d8ed8372bc1d7c94cf5a087a01d79ad) ) ROM_LOAD( "rc17.14c", 0x30000, 0x08000, CRC(aa80aaab) SHA1(37a8e57e4d8ed8372bc1d7c94cf5a087a01d79ad) )
ROM_LOAD( "rc18.15c", 0x38000, 0x08000, CRC(ce67868e) SHA1(867d6bc65119fdb7a9788f7d92e6be0326756776) ) ROM_LOAD( "rc18.15c", 0x38000, 0x08000, CRC(ce67868e) SHA1(867d6bc65119fdb7a9788f7d92e6be0326756776) )
ROM_REGION( 0x40000, "gfx3", 0 ) ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "rc20.15e", 0x00000, 0x08000, CRC(3924c861) SHA1(e31e0ea50823a910f87eefc969de53f1ad738629) ) /* sprites */ ROM_LOAD( "rc20.15e", 0x00000, 0x08000, CRC(3924c861) SHA1(e31e0ea50823a910f87eefc969de53f1ad738629) )
ROM_LOAD( "rc19.14e", 0x08000, 0x08000, CRC(ff8f9129) SHA1(8402236e297c3b03984a22b727198cc54e0c8117) ) ROM_LOAD( "rc19.14e", 0x08000, 0x08000, CRC(ff8f9129) SHA1(8402236e297c3b03984a22b727198cc54e0c8117) )
ROM_LOAD( "rc22.15f", 0x10000, 0x08000, CRC(ab64161c) SHA1(4d8b01ba4c85a732df38db7663bd765a49c671de) ) ROM_LOAD( "rc22.15f", 0x10000, 0x08000, CRC(ab64161c) SHA1(4d8b01ba4c85a732df38db7663bd765a49c671de) )
ROM_LOAD( "rc21.14f", 0x18000, 0x08000, CRC(fd64bcd1) SHA1(4bb6c0e0027387284de1dc1320887de3231252e9) ) ROM_LOAD( "rc21.14f", 0x18000, 0x08000, CRC(fd64bcd1) SHA1(4bb6c0e0027387284de1dc1320887de3231252e9) )
@ -334,13 +546,13 @@ ROM_START( srumbler )
ROM_LOAD( "rc25.14j", 0x38000, 0x08000, CRC(d2a4ea4f) SHA1(365e534bf56e08b1e727ea7bfdfb537fa274448b) ) ROM_LOAD( "rc25.14j", 0x38000, 0x08000, CRC(d2a4ea4f) SHA1(365e534bf56e08b1e727ea7bfdfb537fa274448b) )
ROM_REGION( 0x0300, "proms", 0 ) ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "63s141.12a", 0x0000, 0x0100, CRC(8421786f) SHA1(7ffe9f3cd081842d9ee38bd67421cb8836e3f7ed) ) /* ROM banking */ ROM_LOAD( "63s141.12a", 0x0000, 0x0100, CRC(8421786f) SHA1(7ffe9f3cd081842d9ee38bd67421cb8836e3f7ed) ) // ROM banking
ROM_LOAD( "63s141.13a", 0x0100, 0x0100, CRC(6048583f) SHA1(a0b0f560e7f52978a1bf59417da13cc852617eff) ) /* ROM banking */ ROM_LOAD( "63s141.13a", 0x0100, 0x0100, CRC(6048583f) SHA1(a0b0f560e7f52978a1bf59417da13cc852617eff) ) // ROM banking
ROM_LOAD( "63s141.8j", 0x0200, 0x0100, CRC(1a89a7ff) SHA1(437160ad5d61a257b7deaf5f5e8b3d4cf56a9663) ) /* priority (not used) */ ROM_LOAD( "63s141.8j", 0x0200, 0x0100, CRC(1a89a7ff) SHA1(437160ad5d61a257b7deaf5f5e8b3d4cf56a9663) ) // priority (not used)
ROM_END ROM_END
ROM_START( srumbler2 ) ROM_START( srumbler2 )
ROM_REGION( 0x40000, "user1", 0 ) /* Paged ROMs */ ROM_REGION( 0x40000, "maincpu", 0 ) // Paged ROMs
ROM_LOAD( "rc04.14e", 0x00000, 0x08000, CRC(a68ce89c) SHA1(cb5dd8c47c24f9d8ac9a6135c0b7942d16002d25) ) ROM_LOAD( "rc04.14e", 0x00000, 0x08000, CRC(a68ce89c) SHA1(cb5dd8c47c24f9d8ac9a6135c0b7942d16002d25) )
ROM_LOAD( "rc03.13e", 0x08000, 0x08000, CRC(e82f78d4) SHA1(39cb5d9c18e7635d48aa29221ae99e6a500e2841) ) // sldh ROM_LOAD( "rc03.13e", 0x08000, 0x08000, CRC(e82f78d4) SHA1(39cb5d9c18e7635d48aa29221ae99e6a500e2841) ) // sldh
ROM_LOAD( "rc02.12e", 0x10000, 0x08000, CRC(009a62d8) SHA1(72b52b34186304d70214f56acdb0f3af5bed9503) ) ROM_LOAD( "rc02.12e", 0x10000, 0x08000, CRC(009a62d8) SHA1(72b52b34186304d70214f56acdb0f3af5bed9503) )
@ -353,11 +565,11 @@ ROM_START( srumbler2 )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "rc05.2f", 0x00000, 0x08000, CRC(ea04fa07) SHA1(e29bfc3ed9e6606206ee41c90aaaeddffa26c1b4) ) ROM_LOAD( "rc05.2f", 0x00000, 0x08000, CRC(ea04fa07) SHA1(e29bfc3ed9e6606206ee41c90aaaeddffa26c1b4) )
ROM_REGION( 0x04000, "gfx1", 0 ) ROM_REGION( 0x04000, "chars", 0 )
ROM_LOAD( "rc10.6g", 0x00000, 0x04000, CRC(adabe271) SHA1(256d6823dcda404375825103272213e1442c3320) ) /* characters */ ROM_LOAD( "rc10.6g", 0x00000, 0x04000, CRC(adabe271) SHA1(256d6823dcda404375825103272213e1442c3320) )
ROM_REGION( 0x40000, "gfx2", 0 ) ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "rc11.11a", 0x00000, 0x08000, CRC(5fa042ba) SHA1(9e03eaf22286330826501619a7b74181dc42a5fa) ) /* tiles */ ROM_LOAD( "rc11.11a", 0x00000, 0x08000, CRC(5fa042ba) SHA1(9e03eaf22286330826501619a7b74181dc42a5fa) )
ROM_LOAD( "rc12.13a", 0x08000, 0x08000, CRC(a2db64af) SHA1(35ab93397ee8172813e69edd085b36a5b98ba082) ) ROM_LOAD( "rc12.13a", 0x08000, 0x08000, CRC(a2db64af) SHA1(35ab93397ee8172813e69edd085b36a5b98ba082) )
ROM_LOAD( "rc13.14a", 0x10000, 0x08000, CRC(f1df5499) SHA1(b1c47b35c00bc05825353474ad2b33d9669b879e) ) ROM_LOAD( "rc13.14a", 0x10000, 0x08000, CRC(f1df5499) SHA1(b1c47b35c00bc05825353474ad2b33d9669b879e) )
ROM_LOAD( "rc14.15a", 0x18000, 0x08000, CRC(b22b31b3) SHA1(7aa1a042bccf6a1117c983bb36e88ace7712e867) ) ROM_LOAD( "rc14.15a", 0x18000, 0x08000, CRC(b22b31b3) SHA1(7aa1a042bccf6a1117c983bb36e88ace7712e867) )
@ -366,8 +578,8 @@ ROM_START( srumbler2 )
ROM_LOAD( "rc17.14c", 0x30000, 0x08000, CRC(aa80aaab) SHA1(37a8e57e4d8ed8372bc1d7c94cf5a087a01d79ad) ) ROM_LOAD( "rc17.14c", 0x30000, 0x08000, CRC(aa80aaab) SHA1(37a8e57e4d8ed8372bc1d7c94cf5a087a01d79ad) )
ROM_LOAD( "rc18.15c", 0x38000, 0x08000, CRC(ce67868e) SHA1(867d6bc65119fdb7a9788f7d92e6be0326756776) ) ROM_LOAD( "rc18.15c", 0x38000, 0x08000, CRC(ce67868e) SHA1(867d6bc65119fdb7a9788f7d92e6be0326756776) )
ROM_REGION( 0x40000, "gfx3", 0 ) ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "rc20.15e", 0x00000, 0x08000, CRC(3924c861) SHA1(e31e0ea50823a910f87eefc969de53f1ad738629) ) /* sprites */ ROM_LOAD( "rc20.15e", 0x00000, 0x08000, CRC(3924c861) SHA1(e31e0ea50823a910f87eefc969de53f1ad738629) )
ROM_LOAD( "rc19.14e", 0x08000, 0x08000, CRC(ff8f9129) SHA1(8402236e297c3b03984a22b727198cc54e0c8117) ) ROM_LOAD( "rc19.14e", 0x08000, 0x08000, CRC(ff8f9129) SHA1(8402236e297c3b03984a22b727198cc54e0c8117) )
ROM_LOAD( "rc22.15f", 0x10000, 0x08000, CRC(ab64161c) SHA1(4d8b01ba4c85a732df38db7663bd765a49c671de) ) ROM_LOAD( "rc22.15f", 0x10000, 0x08000, CRC(ab64161c) SHA1(4d8b01ba4c85a732df38db7663bd765a49c671de) )
ROM_LOAD( "rc21.14f", 0x18000, 0x08000, CRC(fd64bcd1) SHA1(4bb6c0e0027387284de1dc1320887de3231252e9) ) ROM_LOAD( "rc21.14f", 0x18000, 0x08000, CRC(fd64bcd1) SHA1(4bb6c0e0027387284de1dc1320887de3231252e9) )
@ -377,13 +589,13 @@ ROM_START( srumbler2 )
ROM_LOAD( "rc25.14j", 0x38000, 0x08000, CRC(d2a4ea4f) SHA1(365e534bf56e08b1e727ea7bfdfb537fa274448b) ) ROM_LOAD( "rc25.14j", 0x38000, 0x08000, CRC(d2a4ea4f) SHA1(365e534bf56e08b1e727ea7bfdfb537fa274448b) )
ROM_REGION( 0x0300, "proms", 0 ) ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "63s141.12a", 0x0000, 0x0100, CRC(8421786f) SHA1(7ffe9f3cd081842d9ee38bd67421cb8836e3f7ed) ) /* ROM banking */ ROM_LOAD( "63s141.12a", 0x0000, 0x0100, CRC(8421786f) SHA1(7ffe9f3cd081842d9ee38bd67421cb8836e3f7ed) ) // ROM banking
ROM_LOAD( "63s141.13a", 0x0100, 0x0100, CRC(6048583f) SHA1(a0b0f560e7f52978a1bf59417da13cc852617eff) ) /* ROM banking */ ROM_LOAD( "63s141.13a", 0x0100, 0x0100, CRC(6048583f) SHA1(a0b0f560e7f52978a1bf59417da13cc852617eff) ) // ROM banking
ROM_LOAD( "63s141.8j", 0x0200, 0x0100, CRC(1a89a7ff) SHA1(437160ad5d61a257b7deaf5f5e8b3d4cf56a9663) ) /* priority (not used) */ ROM_LOAD( "63s141.8j", 0x0200, 0x0100, CRC(1a89a7ff) SHA1(437160ad5d61a257b7deaf5f5e8b3d4cf56a9663) ) // priority (not used)
ROM_END ROM_END
ROM_START( srumbler3 ) ROM_START( srumbler3 )
ROM_REGION( 0x40000, "user1", 0 ) /* Paged ROMs */ ROM_REGION( 0x40000, "maincpu", 0 ) // Paged ROMs
ROM_LOAD( "rc04.14e", 0x00000, 0x08000, CRC(a68ce89c) SHA1(cb5dd8c47c24f9d8ac9a6135c0b7942d16002d25) ) ROM_LOAD( "rc04.14e", 0x00000, 0x08000, CRC(a68ce89c) SHA1(cb5dd8c47c24f9d8ac9a6135c0b7942d16002d25) )
ROM_LOAD( "rc03.13e", 0x08000, 0x08000, CRC(0a21992b) SHA1(6096313210ae729b1c2a27a581473b06c60f5611) ) // sldh ROM_LOAD( "rc03.13e", 0x08000, 0x08000, CRC(0a21992b) SHA1(6096313210ae729b1c2a27a581473b06c60f5611) ) // sldh
ROM_LOAD( "rc02.12e", 0x10000, 0x08000, CRC(009a62d8) SHA1(72b52b34186304d70214f56acdb0f3af5bed9503) ) ROM_LOAD( "rc02.12e", 0x10000, 0x08000, CRC(009a62d8) SHA1(72b52b34186304d70214f56acdb0f3af5bed9503) )
@ -396,11 +608,11 @@ ROM_START( srumbler3 )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "rc05.2f", 0x00000, 0x08000, CRC(ea04fa07) SHA1(e29bfc3ed9e6606206ee41c90aaaeddffa26c1b4) ) ROM_LOAD( "rc05.2f", 0x00000, 0x08000, CRC(ea04fa07) SHA1(e29bfc3ed9e6606206ee41c90aaaeddffa26c1b4) )
ROM_REGION( 0x04000, "gfx1", 0 ) ROM_REGION( 0x04000, "chars", 0 )
ROM_LOAD( "rc10.6g", 0x00000, 0x04000, CRC(adabe271) SHA1(256d6823dcda404375825103272213e1442c3320) ) /* characters */ ROM_LOAD( "rc10.6g", 0x00000, 0x04000, CRC(adabe271) SHA1(256d6823dcda404375825103272213e1442c3320) )
ROM_REGION( 0x40000, "gfx2", 0 ) ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "rc11.11a", 0x00000, 0x08000, CRC(5fa042ba) SHA1(9e03eaf22286330826501619a7b74181dc42a5fa) ) /* tiles */ ROM_LOAD( "rc11.11a", 0x00000, 0x08000, CRC(5fa042ba) SHA1(9e03eaf22286330826501619a7b74181dc42a5fa) )
ROM_LOAD( "rc12.13a", 0x08000, 0x08000, CRC(a2db64af) SHA1(35ab93397ee8172813e69edd085b36a5b98ba082) ) ROM_LOAD( "rc12.13a", 0x08000, 0x08000, CRC(a2db64af) SHA1(35ab93397ee8172813e69edd085b36a5b98ba082) )
ROM_LOAD( "rc13.14a", 0x10000, 0x08000, CRC(f1df5499) SHA1(b1c47b35c00bc05825353474ad2b33d9669b879e) ) ROM_LOAD( "rc13.14a", 0x10000, 0x08000, CRC(f1df5499) SHA1(b1c47b35c00bc05825353474ad2b33d9669b879e) )
ROM_LOAD( "rc14.15a", 0x18000, 0x08000, CRC(b22b31b3) SHA1(7aa1a042bccf6a1117c983bb36e88ace7712e867) ) ROM_LOAD( "rc14.15a", 0x18000, 0x08000, CRC(b22b31b3) SHA1(7aa1a042bccf6a1117c983bb36e88ace7712e867) )
@ -409,8 +621,8 @@ ROM_START( srumbler3 )
ROM_LOAD( "rc17.14c", 0x30000, 0x08000, CRC(aa80aaab) SHA1(37a8e57e4d8ed8372bc1d7c94cf5a087a01d79ad) ) ROM_LOAD( "rc17.14c", 0x30000, 0x08000, CRC(aa80aaab) SHA1(37a8e57e4d8ed8372bc1d7c94cf5a087a01d79ad) )
ROM_LOAD( "rc18.15c", 0x38000, 0x08000, CRC(ce67868e) SHA1(867d6bc65119fdb7a9788f7d92e6be0326756776) ) ROM_LOAD( "rc18.15c", 0x38000, 0x08000, CRC(ce67868e) SHA1(867d6bc65119fdb7a9788f7d92e6be0326756776) )
ROM_REGION( 0x40000, "gfx3", 0 ) ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "rc20.15e", 0x00000, 0x08000, CRC(3924c861) SHA1(e31e0ea50823a910f87eefc969de53f1ad738629) ) /* sprites */ ROM_LOAD( "rc20.15e", 0x00000, 0x08000, CRC(3924c861) SHA1(e31e0ea50823a910f87eefc969de53f1ad738629) )
ROM_LOAD( "rc19.14e", 0x08000, 0x08000, CRC(ff8f9129) SHA1(8402236e297c3b03984a22b727198cc54e0c8117) ) ROM_LOAD( "rc19.14e", 0x08000, 0x08000, CRC(ff8f9129) SHA1(8402236e297c3b03984a22b727198cc54e0c8117) )
ROM_LOAD( "rc22.15f", 0x10000, 0x08000, CRC(ab64161c) SHA1(4d8b01ba4c85a732df38db7663bd765a49c671de) ) ROM_LOAD( "rc22.15f", 0x10000, 0x08000, CRC(ab64161c) SHA1(4d8b01ba4c85a732df38db7663bd765a49c671de) )
ROM_LOAD( "rc21.14f", 0x18000, 0x08000, CRC(fd64bcd1) SHA1(4bb6c0e0027387284de1dc1320887de3231252e9) ) ROM_LOAD( "rc21.14f", 0x18000, 0x08000, CRC(fd64bcd1) SHA1(4bb6c0e0027387284de1dc1320887de3231252e9) )
@ -420,13 +632,13 @@ ROM_START( srumbler3 )
ROM_LOAD( "rc25.14j", 0x38000, 0x08000, CRC(d2a4ea4f) SHA1(365e534bf56e08b1e727ea7bfdfb537fa274448b) ) ROM_LOAD( "rc25.14j", 0x38000, 0x08000, CRC(d2a4ea4f) SHA1(365e534bf56e08b1e727ea7bfdfb537fa274448b) )
ROM_REGION( 0x0300, "proms", 0 ) ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "63s141.12a", 0x0000, 0x0100, CRC(8421786f) SHA1(7ffe9f3cd081842d9ee38bd67421cb8836e3f7ed) ) /* ROM banking */ ROM_LOAD( "63s141.12a", 0x0000, 0x0100, CRC(8421786f) SHA1(7ffe9f3cd081842d9ee38bd67421cb8836e3f7ed) ) // ROM banking
ROM_LOAD( "63s141.13a", 0x0100, 0x0100, CRC(6048583f) SHA1(a0b0f560e7f52978a1bf59417da13cc852617eff) ) /* ROM banking */ ROM_LOAD( "63s141.13a", 0x0100, 0x0100, CRC(6048583f) SHA1(a0b0f560e7f52978a1bf59417da13cc852617eff) ) // ROM banking
ROM_LOAD( "63s141.8j", 0x0200, 0x0100, CRC(1a89a7ff) SHA1(437160ad5d61a257b7deaf5f5e8b3d4cf56a9663) ) /* priority (not used) */ ROM_LOAD( "63s141.8j", 0x0200, 0x0100, CRC(1a89a7ff) SHA1(437160ad5d61a257b7deaf5f5e8b3d4cf56a9663) ) // priority (not used)
ROM_END ROM_END
ROM_START( rushcrsh ) ROM_START( rushcrsh )
ROM_REGION( 0x40000, "user1", 0 ) /* Paged ROMs */ ROM_REGION( 0x40000, "maincpu", 0 ) // Paged ROMs
ROM_LOAD( "rc04.14e", 0x00000, 0x08000, CRC(a68ce89c) SHA1(cb5dd8c47c24f9d8ac9a6135c0b7942d16002d25) ) ROM_LOAD( "rc04.14e", 0x00000, 0x08000, CRC(a68ce89c) SHA1(cb5dd8c47c24f9d8ac9a6135c0b7942d16002d25) )
ROM_LOAD( "rc03.13e", 0x08000, 0x08000, CRC(a49c9be0) SHA1(9aa385063a289e71fef4c2846c8c960a8adafcc0) ) ROM_LOAD( "rc03.13e", 0x08000, 0x08000, CRC(a49c9be0) SHA1(9aa385063a289e71fef4c2846c8c960a8adafcc0) )
ROM_LOAD( "rc02.12e", 0x10000, 0x08000, CRC(009a62d8) SHA1(72b52b34186304d70214f56acdb0f3af5bed9503) ) ROM_LOAD( "rc02.12e", 0x10000, 0x08000, CRC(009a62d8) SHA1(72b52b34186304d70214f56acdb0f3af5bed9503) )
@ -439,11 +651,11 @@ ROM_START( rushcrsh )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "rc05.2f", 0x00000, 0x08000, CRC(ea04fa07) SHA1(e29bfc3ed9e6606206ee41c90aaaeddffa26c1b4) ) ROM_LOAD( "rc05.2f", 0x00000, 0x08000, CRC(ea04fa07) SHA1(e29bfc3ed9e6606206ee41c90aaaeddffa26c1b4) )
ROM_REGION( 0x04000, "gfx1", 0 ) ROM_REGION( 0x04000, "chars", 0 )
ROM_LOAD( "rc10.6g", 0x00000, 0x04000, CRC(0a3c0b0d) SHA1(63f4daaea852c077f0ddd04d4bb4cd6333a8de7c) ) /* characters */ // sldh ROM_LOAD( "rc10.6g", 0x00000, 0x04000, CRC(0a3c0b0d) SHA1(63f4daaea852c077f0ddd04d4bb4cd6333a8de7c) ) // sldh
ROM_REGION( 0x40000, "gfx2", 0 ) ROM_REGION( 0x40000, "tiles", 0 )
ROM_LOAD( "rc11.11a", 0x00000, 0x08000, CRC(5fa042ba) SHA1(9e03eaf22286330826501619a7b74181dc42a5fa) ) /* tiles */ ROM_LOAD( "rc11.11a", 0x00000, 0x08000, CRC(5fa042ba) SHA1(9e03eaf22286330826501619a7b74181dc42a5fa) )
ROM_LOAD( "rc12.13a", 0x08000, 0x08000, CRC(a2db64af) SHA1(35ab93397ee8172813e69edd085b36a5b98ba082) ) ROM_LOAD( "rc12.13a", 0x08000, 0x08000, CRC(a2db64af) SHA1(35ab93397ee8172813e69edd085b36a5b98ba082) )
ROM_LOAD( "rc13.14a", 0x10000, 0x08000, CRC(f1df5499) SHA1(b1c47b35c00bc05825353474ad2b33d9669b879e) ) ROM_LOAD( "rc13.14a", 0x10000, 0x08000, CRC(f1df5499) SHA1(b1c47b35c00bc05825353474ad2b33d9669b879e) )
ROM_LOAD( "rc14.15a", 0x18000, 0x08000, CRC(b22b31b3) SHA1(7aa1a042bccf6a1117c983bb36e88ace7712e867) ) ROM_LOAD( "rc14.15a", 0x18000, 0x08000, CRC(b22b31b3) SHA1(7aa1a042bccf6a1117c983bb36e88ace7712e867) )
@ -452,8 +664,8 @@ ROM_START( rushcrsh )
ROM_LOAD( "rc17.14c", 0x30000, 0x08000, CRC(aa80aaab) SHA1(37a8e57e4d8ed8372bc1d7c94cf5a087a01d79ad) ) ROM_LOAD( "rc17.14c", 0x30000, 0x08000, CRC(aa80aaab) SHA1(37a8e57e4d8ed8372bc1d7c94cf5a087a01d79ad) )
ROM_LOAD( "rc18.15c", 0x38000, 0x08000, CRC(ce67868e) SHA1(867d6bc65119fdb7a9788f7d92e6be0326756776) ) ROM_LOAD( "rc18.15c", 0x38000, 0x08000, CRC(ce67868e) SHA1(867d6bc65119fdb7a9788f7d92e6be0326756776) )
ROM_REGION( 0x40000, "gfx3", 0 ) ROM_REGION( 0x40000, "sprites", 0 )
ROM_LOAD( "rc20.15e", 0x00000, 0x08000, CRC(3924c861) SHA1(e31e0ea50823a910f87eefc969de53f1ad738629) ) /* sprites */ ROM_LOAD( "rc20.15e", 0x00000, 0x08000, CRC(3924c861) SHA1(e31e0ea50823a910f87eefc969de53f1ad738629) )
ROM_LOAD( "rc19.14e", 0x08000, 0x08000, CRC(ff8f9129) SHA1(8402236e297c3b03984a22b727198cc54e0c8117) ) ROM_LOAD( "rc19.14e", 0x08000, 0x08000, CRC(ff8f9129) SHA1(8402236e297c3b03984a22b727198cc54e0c8117) )
ROM_LOAD( "rc22.15f", 0x10000, 0x08000, CRC(ab64161c) SHA1(4d8b01ba4c85a732df38db7663bd765a49c671de) ) ROM_LOAD( "rc22.15f", 0x10000, 0x08000, CRC(ab64161c) SHA1(4d8b01ba4c85a732df38db7663bd765a49c671de) )
ROM_LOAD( "rc21.14f", 0x18000, 0x08000, CRC(fd64bcd1) SHA1(4bb6c0e0027387284de1dc1320887de3231252e9) ) ROM_LOAD( "rc21.14f", 0x18000, 0x08000, CRC(fd64bcd1) SHA1(4bb6c0e0027387284de1dc1320887de3231252e9) )
@ -463,11 +675,12 @@ ROM_START( rushcrsh )
ROM_LOAD( "rc25.14j", 0x38000, 0x08000, CRC(d2a4ea4f) SHA1(365e534bf56e08b1e727ea7bfdfb537fa274448b) ) ROM_LOAD( "rc25.14j", 0x38000, 0x08000, CRC(d2a4ea4f) SHA1(365e534bf56e08b1e727ea7bfdfb537fa274448b) )
ROM_REGION( 0x0300, "proms", 0 ) ROM_REGION( 0x0300, "proms", 0 )
ROM_LOAD( "63s141.12a", 0x0000, 0x0100, CRC(8421786f) SHA1(7ffe9f3cd081842d9ee38bd67421cb8836e3f7ed) ) /* ROM banking */ ROM_LOAD( "63s141.12a", 0x0000, 0x0100, CRC(8421786f) SHA1(7ffe9f3cd081842d9ee38bd67421cb8836e3f7ed) ) // ROM banking
ROM_LOAD( "63s141.13a", 0x0100, 0x0100, CRC(6048583f) SHA1(a0b0f560e7f52978a1bf59417da13cc852617eff) ) /* ROM banking */ ROM_LOAD( "63s141.13a", 0x0100, 0x0100, CRC(6048583f) SHA1(a0b0f560e7f52978a1bf59417da13cc852617eff) ) // ROM banking
ROM_LOAD( "63s141.8j", 0x0200, 0x0100, CRC(1a89a7ff) SHA1(437160ad5d61a257b7deaf5f5e8b3d4cf56a9663) ) /* priority (not used) */ ROM_LOAD( "63s141.8j", 0x0200, 0x0100, CRC(1a89a7ff) SHA1(437160ad5d61a257b7deaf5f5e8b3d4cf56a9663) ) // priority (not used)
ROM_END ROM_END
} // anonymous namespace
GAME( 1986, srumbler, 0, srumbler, srumbler, srumbler_state, empty_init, ROT270, "Capcom", "The Speed Rumbler (set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, srumbler, 0, srumbler, srumbler, srumbler_state, empty_init, ROT270, "Capcom", "The Speed Rumbler (set 1)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,54 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Paul Leaman
#include "machine/timer.h"
#include "video/bufsprite.h"
#include "emupal.h"
#include "tilemap.h"
class srumbler_state : public driver_device
{
public:
srumbler_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this,"maincpu"),
m_spriteram(*this,"spriteram"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_backgroundram(*this, "backgroundram"),
m_foregroundram(*this, "foregroundram") { }
void srumbler(machine_config &config);
private:
required_device<cpu_device> m_maincpu;
required_device<buffered_spriteram8_device> m_spriteram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_backgroundram;
required_shared_ptr<uint8_t> m_foregroundram;
tilemap_t *m_bg_tilemap = nullptr;
tilemap_t *m_fg_tilemap = nullptr;
int m_scroll[4]{};
void bankswitch_w(uint8_t data);
void foreground_w(offs_t offset, uint8_t data);
void background_w(offs_t offset, uint8_t data);
void _4009_w(uint8_t data);
void scroll_w(offs_t offset, uint8_t data);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void machine_start() override;
virtual void video_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(interrupt);
void srumbler_map(address_map &map);
void srumbler_sound_map(address_map &map);
};

View File

@ -1,165 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Paul Leaman
/***************************************************************************
srumbler.c
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "srumbler.h"
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(srumbler_state::get_fg_tile_info)
{
uint8_t attr = m_foregroundram[2*tile_index];
tileinfo.set(0,
m_foregroundram[2*tile_index + 1] + ((attr & 0x03) << 8),
(attr & 0x3c) >> 2,
(attr & 0x40) ? TILE_FORCE_LAYER0 : 0);
}
TILE_GET_INFO_MEMBER(srumbler_state::get_bg_tile_info)
{
uint8_t attr = m_backgroundram[2*tile_index];
tileinfo.set(1,
m_backgroundram[2*tile_index + 1] + ((attr & 0x07) << 8),
(attr & 0xe0) >> 5,
((attr & 0x08) ? TILE_FLIPY : 0));
tileinfo.group = (attr & 0x10) >> 4;
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void srumbler_state::video_start()
{
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(srumbler_state::get_fg_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64,32);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(srumbler_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16,16, 64,64);
m_fg_tilemap->set_transparent_pen(3);
m_bg_tilemap->set_transmask(0,0xffff,0x0000); // split type 0 is totally transparent in front half
m_bg_tilemap->set_transmask(1,0x07ff,0xf800); // split type 1 has pens 0-10 transparent in front half
save_item(NAME(m_scroll));
}
/***************************************************************************
Memory handlers
***************************************************************************/
void srumbler_state::foreground_w(offs_t offset, uint8_t data)
{
m_foregroundram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset/2);
}
void srumbler_state::background_w(offs_t offset, uint8_t data)
{
m_backgroundram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset/2);
}
void srumbler_state::_4009_w(uint8_t data)
{
/* bit 0 flips screen */
flip_screen_set(data & 1);
/* bits 4-5 used during attract mode, unknown */
/* bits 6-7 coin counters */
machine().bookkeeping().coin_counter_w(0,data & 0x40);
machine().bookkeeping().coin_counter_w(1,data & 0x80);
}
void srumbler_state::scroll_w(offs_t offset, uint8_t data)
{
m_scroll[offset] = data;
m_bg_tilemap->set_scrollx(0,m_scroll[0] | (m_scroll[1] << 8));
m_bg_tilemap->set_scrolly(0,m_scroll[2] | (m_scroll[3] << 8));
}
/***************************************************************************
Display refresh
***************************************************************************/
void srumbler_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *buffered_spriteram = m_spriteram->buffer();
int offs;
/* Draw the sprites. */
for (offs = m_spriteram->bytes()-4; offs>=0;offs -= 4)
{
/* SPRITES
=====
Attribute
0x80 Code MSB
0x40 Code MSB
0x20 Code MSB
0x10 Colour
0x08 Colour
0x04 Colour
0x02 y Flip
0x01 X MSB
*/
int code,colour,sx,sy,flipy;
int attr = buffered_spriteram[offs+1];
code = buffered_spriteram[offs];
code += ( (attr&0xe0) << 3 );
colour = (attr & 0x1c)>>2;
sy = buffered_spriteram[offs + 2];
sx = buffered_spriteram[offs + 3] + 0x100 * ( attr & 0x01);
flipy = attr & 0x02;
if (flip_screen())
{
sx = 496 - sx;
sy = 240 - sy;
flipy = !flipy;
}
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code,
colour,
flip_screen(),flipy,
sx, sy,15);
}
}
uint32_t srumbler_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1,0);
draw_sprites(bitmap,cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0,0);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0,0);
return 0;
}

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders: Mirko Buffoni // copyright-holders: Mirko Buffoni
/*************************************************************************** /***************************************************************************
Vulgus memory map (preliminary) Vulgus memory map (preliminary)
@ -44,18 +45,281 @@ All Clocks and Vsync verified by Corrado Tomaselli (August 2012)
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "vulgus.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "machine/gen_latch.h" #include "machine/gen_latch.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "emupal.h"
#include "screen.h" #include "screen.h"
#include "speaker.h" #include "speaker.h"
#include "tilemap.h"
namespace {
class vulgus_state : public driver_device
{
public:
vulgus_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_scroll_low(*this, "scroll_low"),
m_scroll_high(*this, "scroll_high"),
m_spriteram(*this, "spriteram"),
m_fgvideoram(*this, "fgvideoram"),
m_bgvideoram(*this, "bgvideoram")
{ }
void vulgus(machine_config &config);
protected:
virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_scroll_low;
required_shared_ptr<uint8_t> m_scroll_high;
required_shared_ptr<uint8_t> m_spriteram;
required_shared_ptr<uint8_t> m_fgvideoram;
required_shared_ptr<uint8_t> m_bgvideoram;
uint8_t m_palette_bank = 0;
tilemap_t *m_fg_tilemap = nullptr;
tilemap_t *m_bg_tilemap = nullptr;
void fgvideoram_w(offs_t offset, uint8_t data);
void bgvideoram_w(offs_t offset, uint8_t data);
void c804_w(uint8_t data);
void palette_bank_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
void palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(vblank_irq);
void main_map(address_map &map);
void sound_map(address_map &map);
};
// video
/***************************************************************************
Convert the color PROMs into a more useable format.
***************************************************************************/
void vulgus_state::palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
for (int i = 0; i < 256; i++)
{
int bit0, bit1, bit2, bit3;
bit0 = (color_prom[0] >> 0) & 0x01;
bit1 = (color_prom[0] >> 1) & 0x01;
bit2 = (color_prom[0] >> 2) & 0x01;
bit3 = (color_prom[0] >> 3) & 0x01;
int const r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
bit0 = (color_prom[256] >> 0) & 0x01;
bit1 = (color_prom[256] >> 1) & 0x01;
bit2 = (color_prom[256] >> 2) & 0x01;
bit3 = (color_prom[256] >> 3) & 0x01;
int const g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
bit0 = (color_prom[2*256] >> 0) & 0x01;
bit1 = (color_prom[2*256] >> 1) & 0x01;
bit2 = (color_prom[2*256] >> 2) & 0x01;
bit3 = (color_prom[2*256] >> 3) & 0x01;
int const b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
palette.set_indirect_color(i, rgb_t(r, g, b));
color_prom++;
}
color_prom += 2 * 256;
// color_prom now points to the beginning of the lookup table
// characters use colors 32-47 (?)
for (int i = 0; i < m_gfxdecode->gfx(0)->colors() * m_gfxdecode->gfx(0)->granularity(); i++)
palette.set_pen_indirect(m_gfxdecode->gfx(0)->colorbase() + i, 32 + *color_prom++);
// sprites use colors 16-31
for (int i = 0; i < m_gfxdecode->gfx(2)->colors() * m_gfxdecode->gfx(2)->granularity(); i++)
palette.set_pen_indirect(m_gfxdecode->gfx(2)->colorbase() + i, 16 + *color_prom++);
// background tiles use colors 0-15, 64-79, 128-143, 192-207 in four banks
for (int i = 0; i < m_gfxdecode->gfx(1)->colors() * m_gfxdecode->gfx(1)->granularity() / 4; i++)
{
palette.set_pen_indirect(m_gfxdecode->gfx(1)->colorbase() + 0 * 32 * 8 + i, *color_prom);
palette.set_pen_indirect(m_gfxdecode->gfx(1)->colorbase() + 1 * 32 * 8 + i, *color_prom + 64);
palette.set_pen_indirect(m_gfxdecode->gfx(1)->colorbase() + 2 * 32 * 8 + i, *color_prom + 128);
palette.set_pen_indirect(m_gfxdecode->gfx(1)->colorbase() + 3 * 32 * 8 + i, *color_prom + 192);
color_prom++;
}
}
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(vulgus_state::get_fg_tile_info)
{
int const code = m_fgvideoram[tile_index];
int const color = m_fgvideoram[tile_index + 0x400];
tileinfo.set(0,
code + ((color & 0x80) << 1),
color & 0x3f,
0);
tileinfo.group = color & 0x3f;
}
TILE_GET_INFO_MEMBER(vulgus_state::get_bg_tile_info)
{
int const code = m_bgvideoram[tile_index];
int const color = m_bgvideoram[tile_index + 0x400];
tileinfo.set(1,
code + ((color & 0x80) << 1),
(color & 0x1f) + (0x20 * m_palette_bank),
TILE_FLIPYX((color & 0x60) >> 5));
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void vulgus_state::video_start()
{
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(vulgus_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(vulgus_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16, 16, 32, 32);
m_fg_tilemap->configure_groups(*m_gfxdecode->gfx(0), 47);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy(6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy(6, 6);
save_item(NAME(m_palette_bank));
}
/***************************************************************************
Memory handlers
***************************************************************************/
void vulgus_state::fgvideoram_w(offs_t offset, uint8_t data)
{
m_fgvideoram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset & 0x3ff);
}
void vulgus_state::bgvideoram_w(offs_t offset, uint8_t data)
{
m_bgvideoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x3ff);
}
void vulgus_state::c804_w(uint8_t data)
{
// bits 0 and 1 are coin counters
machine().bookkeeping().coin_counter_w(0, data & 0x01);
machine().bookkeeping().coin_counter_w(1, data & 0x02);
// bit 7 flips screen
flip_screen_set(data & 0x80);
}
void vulgus_state::palette_bank_w(uint8_t data)
{
if (m_palette_bank != (data & 3))
{
m_palette_bank = data & 3;
m_bg_tilemap->mark_all_dirty();
}
}
/***************************************************************************
Display refresh
***************************************************************************/
void vulgus_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element *gfx = m_gfxdecode->gfx(2);
for (int offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
int const code = m_spriteram[offs];
int const color = m_spriteram[offs + 1] & 0x0f;
int sy = m_spriteram[offs + 2];
int sx = m_spriteram[offs + 3];
bool const flip = flip_screen() ? true : false;
int dir = 1;
if (sy == 0)
continue;
if (flip)
{
sx = 240 - sx;
sy = 240 - sy;
dir = -1;
}
// draw sprite rows (16*16, 16*32, or 16*64)
int row = (m_spriteram[offs + 1] & 0xc0) >> 6;
if (row == 2) row = 3;
for (; row >= 0; row--)
gfx->transpen(bitmap, cliprect, code + row, color, flip, flip, sx + 128, sy + 6 + 16 * row * dir, 15);
}
}
uint32_t vulgus_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0, m_scroll_low[1] + 256 * m_scroll_high[1]);
m_bg_tilemap->set_scrolly(0, m_scroll_low[0] + 256 * m_scroll_high[0]);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
// machine
INTERRUPT_GEN_MEMBER(vulgus_state::vblank_irq) INTERRUPT_GEN_MEMBER(vulgus_state::vblank_irq)
{ {
device.execute().set_input_line_and_vector(0, HOLD_LINE, 0xd7); /* Z80 - RST 10h - vblank */ device.execute().set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 - RST 10h - vblank
} }
void vulgus_state::main_map(address_map &map) void vulgus_state::main_map(address_map &map)
@ -68,13 +332,13 @@ void vulgus_state::main_map(address_map &map)
map(0xc004, 0xc004).portr("DSW2"); map(0xc004, 0xc004).portr("DSW2");
map(0xc800, 0xc800).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0xc800, 0xc800).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0xc801, 0xc801).nopw(); // ? map(0xc801, 0xc801).nopw(); // ?
map(0xc802, 0xc803).ram().share("scroll_low"); map(0xc802, 0xc803).ram().share(m_scroll_low);
map(0xc804, 0xc804).w(FUNC(vulgus_state::c804_w)); map(0xc804, 0xc804).w(FUNC(vulgus_state::c804_w));
map(0xc805, 0xc805).w(FUNC(vulgus_state::palette_bank_w)); map(0xc805, 0xc805).w(FUNC(vulgus_state::palette_bank_w));
map(0xc902, 0xc903).ram().share("scroll_high"); map(0xc902, 0xc903).ram().share(m_scroll_high);
map(0xcc00, 0xcc7f).ram().share("spriteram"); map(0xcc00, 0xcc7f).ram().share(m_spriteram);
map(0xd000, 0xd7ff).ram().w(FUNC(vulgus_state::fgvideoram_w)).share("fgvideoram"); map(0xd000, 0xd7ff).ram().w(FUNC(vulgus_state::fgvideoram_w)).share(m_fgvideoram);
map(0xd800, 0xdfff).ram().w(FUNC(vulgus_state::bgvideoram_w)).share("bgvideoram"); map(0xd800, 0xdfff).ram().w(FUNC(vulgus_state::bgvideoram_w)).share(m_bgvideoram);
map(0xe000, 0xefff).ram(); map(0xe000, 0xefff).ram();
} }
@ -92,10 +356,10 @@ static INPUT_PORTS_START( vulgus )
PORT_START("SYSTEM") PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* probably unused */ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
@ -125,7 +389,7 @@ static INPUT_PORTS_START( vulgus )
PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x02, "2" )
PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x03, "3" )
PORT_DIPSETTING( 0x00, "5" ) PORT_DIPSETTING( 0x00, "5" )
/* Only the parent set seems to use/see the second coin slot even if set to Cocktail mode */ // Only the parent set seems to use/see the second coin slot even if set to Cocktail mode
PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:6,5,4") PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:6,5,4")
PORT_DIPSETTING( 0x10, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 5C_1C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 4C_1C ) )
@ -134,7 +398,7 @@ static INPUT_PORTS_START( vulgus )
PORT_DIPSETTING( 0x1c, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x1c, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x0c, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x14, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x14, DEF_STR( 1C_3C ) )
/* PORT_DIPSETTING( 0x00, "Invalid" ) disables both coins */ PORT_DIPSETTING( 0x00, "Invalid" ) // disables both coins
PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:3,2,1") PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:3,2,1")
PORT_DIPSETTING( 0x80, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 5C_1C ) )
PORT_DIPSETTING( 0x40, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 4C_1C ) )
@ -146,8 +410,8 @@ static INPUT_PORTS_START( vulgus )
PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
PORT_START("DSW2") PORT_START("DSW2")
PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW2:8" ) /* Shown as "Unused" in the manual, are 7 & 8 undocutmented Difficulty?? */ PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW2:8" ) // Shown as "Unused" in the manual, are 7 & 8 undocumented Difficulty??
PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW2:7" ) /* Shown as "Unused" in the manual, Code performs a read then (& 0x03) */ PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW2:7" ) // Shown as "Unused" in the manual, Code performs a read then (& 0x03)
PORT_DIPNAME( 0x04, 0x04, "Demo Music" ) PORT_DIPLOCATION("SW2:6") PORT_DIPNAME( 0x04, 0x04, "Demo Music" ) PORT_DIPLOCATION("SW2:6")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) ) PORT_DIPSETTING( 0x04, DEF_STR( On ) )
@ -208,9 +472,9 @@ static const gfx_layout spritelayout =
static GFXDECODE_START( gfx_vulgus ) static GFXDECODE_START( gfx_vulgus )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64 ) GFXDECODE_ENTRY( "chars", 0, charlayout, 0, 64 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 64*4+16*16, 32*4 ) GFXDECODE_ENTRY( "tiles", 0, tilelayout, 64*4+16*16, 32*4 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 64*4, 16 ) GFXDECODE_ENTRY( "sprites", 0, spritelayout, 64*4, 16 )
GFXDECODE_END GFXDECODE_END
@ -218,16 +482,16 @@ GFXDECODE_END
void vulgus_state::vulgus(machine_config &config) void vulgus_state::vulgus(machine_config &config)
{ {
/* basic machine hardware */ // basic machine hardware
Z80(config, m_maincpu, XTAL(12'000'000)/4); /* 3 MHz */ Z80(config, m_maincpu, XTAL(12'000'000) / 4); // 3 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &vulgus_state::main_map); m_maincpu->set_addrmap(AS_PROGRAM, &vulgus_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(vulgus_state::vblank_irq)); m_maincpu->set_vblank_int("screen", FUNC(vulgus_state::vblank_irq));
Z80(config, m_audiocpu, XTAL(12'000'000)/4); /* 3 MHz */ Z80(config, m_audiocpu, XTAL(12'000'000) / 4); // 3 MHz
m_audiocpu->set_addrmap(AS_PROGRAM, &vulgus_state::sound_map); m_audiocpu->set_addrmap(AS_PROGRAM, &vulgus_state::sound_map);
m_audiocpu->set_periodic_int(FUNC(vulgus_state::irq0_line_hold), attotime::from_hz(8*60)); m_audiocpu->set_periodic_int(FUNC(vulgus_state::irq0_line_hold), attotime::from_hz(8*60));
/* video hardware */ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(XTAL(12'000'000) / 2, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259 screen.set_raw(XTAL(12'000'000) / 2, 384, 128, 0, 262, 22, 246); // hsync is 50..77, vsync is 257..259
screen.set_screen_update(FUNC(vulgus_state::screen_update)); screen.set_screen_update(FUNC(vulgus_state::screen_update));
@ -235,16 +499,16 @@ void vulgus_state::vulgus(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_vulgus); GFXDECODE(config, m_gfxdecode, m_palette, gfx_vulgus);
PALETTE(config, m_palette, FUNC(vulgus_state::vulgus_palette), 64*4+16*16+4*32*8, 256); PALETTE(config, m_palette, FUNC(vulgus_state::palette), 64*4+16*16+4*32*8, 256);
/* sound hardware */ // sound hardware
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch"); GENERIC_LATCH_8(config, "soundlatch");
AY8910(config, "ay1", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25); /* 1.5 MHz */ AY8910(config, "ay1", XTAL(12'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.25); // 1.5 MHz
AY8910(config, "ay2", XTAL(12'000'000)/8).add_route(ALL_OUTPUTS, "mono", 0.25); /* 1.5 MHz */ AY8910(config, "ay2", XTAL(12'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 0.25); // 1.5 MHz
} }
@ -255,7 +519,7 @@ void vulgus_state::vulgus(machine_config &config)
***************************************************************************/ ***************************************************************************/
ROM_START( vulgus ) /* Board ID# 84602-01A-1 */ ROM_START( vulgus ) // Board ID# 84602-01A-1
ROM_REGION( 0x1c000, "maincpu", 0 ) ROM_REGION( 0x1c000, "maincpu", 0 )
ROM_LOAD( "vulgus.002", 0x0000, 0x2000, CRC(e49d6c5d) SHA1(48072aaa1f2603b6301d7542cc3df10ead2847bb) ) ROM_LOAD( "vulgus.002", 0x0000, 0x2000, CRC(e49d6c5d) SHA1(48072aaa1f2603b6301d7542cc3df10ead2847bb) )
ROM_LOAD( "vulgus.003", 0x2000, 0x2000, CRC(51acef76) SHA1(14dda82b90f9c3a309561a73c300cb54b5fca77d) ) ROM_LOAD( "vulgus.003", 0x2000, 0x2000, CRC(51acef76) SHA1(14dda82b90f9c3a309561a73c300cb54b5fca77d) )
@ -266,32 +530,32 @@ ROM_START( vulgus ) /* Board ID# 84602-01A-1 */
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "1-11c.bin", 0x0000, 0x2000, CRC(3bd2acf4) SHA1(b58fb1ea7e30018102ee420d52a1597615412eb1) ) ROM_LOAD( "1-11c.bin", 0x0000, 0x2000, CRC(3bd2acf4) SHA1(b58fb1ea7e30018102ee420d52a1597615412eb1) )
ROM_REGION( 0x02000, "gfx1", 0 ) ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "1-3d.bin", 0x00000, 0x2000, CRC(8bc5d7a5) SHA1(c572b4a26f12013f5f6463b79ba9cbee4c474bbe) ) /* characters */ ROM_LOAD( "1-3d.bin", 0x00000, 0x2000, CRC(8bc5d7a5) SHA1(c572b4a26f12013f5f6463b79ba9cbee4c474bbe) )
ROM_REGION( 0x0c000, "gfx2", 0 ) ROM_REGION( 0x0c000, "tiles", 0 )
ROM_LOAD( "2-2a.bin", 0x00000, 0x2000, CRC(e10aaca1) SHA1(f9f0d05475ae4c554552a71bc2f60e02b1442eb1) ) /* tiles */ ROM_LOAD( "2-2a.bin", 0x00000, 0x2000, CRC(e10aaca1) SHA1(f9f0d05475ae4c554552a71bc2f60e02b1442eb1) )
ROM_LOAD( "2-3a.bin", 0x02000, 0x2000, CRC(8da520da) SHA1(c4c633a909526308de4ad83e8ca449fa71eb3cb5) ) ROM_LOAD( "2-3a.bin", 0x02000, 0x2000, CRC(8da520da) SHA1(c4c633a909526308de4ad83e8ca449fa71eb3cb5) )
ROM_LOAD( "2-4a.bin", 0x04000, 0x2000, CRC(206a13f1) SHA1(645666895127aededfa7872b20b7725948a9c462) ) ROM_LOAD( "2-4a.bin", 0x04000, 0x2000, CRC(206a13f1) SHA1(645666895127aededfa7872b20b7725948a9c462) )
ROM_LOAD( "2-5a.bin", 0x06000, 0x2000, CRC(b6d81984) SHA1(c935176f8a9bce0f74ff466e10c23ff6557f85ec) ) ROM_LOAD( "2-5a.bin", 0x06000, 0x2000, CRC(b6d81984) SHA1(c935176f8a9bce0f74ff466e10c23ff6557f85ec) )
ROM_LOAD( "2-6a.bin", 0x08000, 0x2000, CRC(5a26b38f) SHA1(987a4844c4568a088932f43a3aff847e6d6b4860) ) ROM_LOAD( "2-6a.bin", 0x08000, 0x2000, CRC(5a26b38f) SHA1(987a4844c4568a088932f43a3aff847e6d6b4860) )
ROM_LOAD( "2-7a.bin", 0x0a000, 0x2000, CRC(1e1ca773) SHA1(dbced07d4a886ed9ad3302aaa37bc02c599ee132) ) ROM_LOAD( "2-7a.bin", 0x0a000, 0x2000, CRC(1e1ca773) SHA1(dbced07d4a886ed9ad3302aaa37bc02c599ee132) )
ROM_REGION( 0x08000, "gfx3", 0 ) ROM_REGION( 0x08000, "sprites", 0 )
ROM_LOAD( "2-2n.bin", 0x00000, 0x2000, CRC(6db1b10d) SHA1(85bf67ce4d60b260767ba5fe9b9777f857937fe3) ) /* sprites */ ROM_LOAD( "2-2n.bin", 0x00000, 0x2000, CRC(6db1b10d) SHA1(85bf67ce4d60b260767ba5fe9b9777f857937fe3) )
ROM_LOAD( "2-3n.bin", 0x02000, 0x2000, CRC(5d8c34ec) SHA1(7b7df89398bf83ace1a8c216ca8526beae90972d) ) ROM_LOAD( "2-3n.bin", 0x02000, 0x2000, CRC(5d8c34ec) SHA1(7b7df89398bf83ace1a8c216ca8526beae90972d) )
ROM_LOAD( "2-4n.bin", 0x04000, 0x2000, CRC(0071a2e3) SHA1(3f7bb4658d2126576a0f8f46f2c947eec1cd231a) ) ROM_LOAD( "2-4n.bin", 0x04000, 0x2000, CRC(0071a2e3) SHA1(3f7bb4658d2126576a0f8f46f2c947eec1cd231a) )
ROM_LOAD( "2-5n.bin", 0x06000, 0x2000, CRC(4023a1ec) SHA1(8b69b9cd6db37db94a00da8712413055a631186a) ) ROM_LOAD( "2-5n.bin", 0x06000, 0x2000, CRC(4023a1ec) SHA1(8b69b9cd6db37db94a00da8712413055a631186a) )
ROM_REGION( 0x0800, "proms", 0 ) ROM_REGION( 0x0800, "proms", 0 )
ROM_LOAD( "e8.bin", 0x0000, 0x0100, CRC(06a83606) SHA1(218c1b404b4b5b06f06e04143872f6758f83f266) ) /* red component */ ROM_LOAD( "e8.bin", 0x0000, 0x0100, CRC(06a83606) SHA1(218c1b404b4b5b06f06e04143872f6758f83f266) ) // red component
ROM_LOAD( "e9.bin", 0x0100, 0x0100, CRC(beacf13c) SHA1(d597097afc53fef752b2530d2de04e5aabb664b4) ) /* green component */ ROM_LOAD( "e9.bin", 0x0100, 0x0100, CRC(beacf13c) SHA1(d597097afc53fef752b2530d2de04e5aabb664b4) ) // green component
ROM_LOAD( "e10.bin", 0x0200, 0x0100, CRC(de1fb621) SHA1(c719892f0c6d8c82ee2ff41bfe74b67648f5b4f5) ) /* blue component */ ROM_LOAD( "e10.bin", 0x0200, 0x0100, CRC(de1fb621) SHA1(c719892f0c6d8c82ee2ff41bfe74b67648f5b4f5) ) // blue component
ROM_LOAD( "d1.bin", 0x0300, 0x0100, CRC(7179080d) SHA1(6c1e8572a4c7b4825b89fc9549265be7c8f17788) ) /* char lookup table */ ROM_LOAD( "d1.bin", 0x0300, 0x0100, CRC(7179080d) SHA1(6c1e8572a4c7b4825b89fc9549265be7c8f17788) ) // char lookup table
ROM_LOAD( "j2.bin", 0x0400, 0x0100, CRC(d0842029) SHA1(7d76e1ff75466e190bc2e07ff3ffb45034f838cd) ) /* sprite lookup table */ ROM_LOAD( "j2.bin", 0x0400, 0x0100, CRC(d0842029) SHA1(7d76e1ff75466e190bc2e07ff3ffb45034f838cd) ) // sprite lookup table
ROM_LOAD( "c9.bin", 0x0500, 0x0100, CRC(7a1f0bd6) SHA1(5a2110e97e82c087999ee4e5adf32d7fa06a3dfb) ) /* tile lookup table */ ROM_LOAD( "c9.bin", 0x0500, 0x0100, CRC(7a1f0bd6) SHA1(5a2110e97e82c087999ee4e5adf32d7fa06a3dfb) ) // tile lookup table
ROM_LOAD( "82s126.9k", 0x0600, 0x0100, CRC(32b10521) SHA1(10b258e32813cfa3a853cbd146657b11c08cb770) ) /* interrupt timing? (not used) */ ROM_LOAD( "82s126.9k", 0x0600, 0x0100, CRC(32b10521) SHA1(10b258e32813cfa3a853cbd146657b11c08cb770) ) // interrupt timing? (not used)
ROM_LOAD( "82s129.8n", 0x0700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) /* video timing? (not used) */ ROM_LOAD( "82s129.8n", 0x0700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) // video timing? (not used)
ROM_END ROM_END
ROM_START( vulgusa ) ROM_START( vulgusa )
@ -305,32 +569,32 @@ ROM_START( vulgusa )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "1-11c.bin", 0x0000, 0x2000, CRC(3bd2acf4) SHA1(b58fb1ea7e30018102ee420d52a1597615412eb1) ) ROM_LOAD( "1-11c.bin", 0x0000, 0x2000, CRC(3bd2acf4) SHA1(b58fb1ea7e30018102ee420d52a1597615412eb1) )
ROM_REGION( 0x02000, "gfx1", 0 ) ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "1-3d.bin", 0x00000, 0x2000, CRC(8bc5d7a5) SHA1(c572b4a26f12013f5f6463b79ba9cbee4c474bbe) ) /* characters */ ROM_LOAD( "1-3d.bin", 0x00000, 0x2000, CRC(8bc5d7a5) SHA1(c572b4a26f12013f5f6463b79ba9cbee4c474bbe) )
ROM_REGION( 0x0c000, "gfx2", 0 ) ROM_REGION( 0x0c000, "tiles", 0 )
ROM_LOAD( "2-2a.bin", 0x00000, 0x2000, CRC(e10aaca1) SHA1(f9f0d05475ae4c554552a71bc2f60e02b1442eb1) ) /* tiles */ ROM_LOAD( "2-2a.bin", 0x00000, 0x2000, CRC(e10aaca1) SHA1(f9f0d05475ae4c554552a71bc2f60e02b1442eb1) )
ROM_LOAD( "2-3a.bin", 0x02000, 0x2000, CRC(8da520da) SHA1(c4c633a909526308de4ad83e8ca449fa71eb3cb5) ) ROM_LOAD( "2-3a.bin", 0x02000, 0x2000, CRC(8da520da) SHA1(c4c633a909526308de4ad83e8ca449fa71eb3cb5) )
ROM_LOAD( "2-4a.bin", 0x04000, 0x2000, CRC(206a13f1) SHA1(645666895127aededfa7872b20b7725948a9c462) ) ROM_LOAD( "2-4a.bin", 0x04000, 0x2000, CRC(206a13f1) SHA1(645666895127aededfa7872b20b7725948a9c462) )
ROM_LOAD( "2-5a.bin", 0x06000, 0x2000, CRC(b6d81984) SHA1(c935176f8a9bce0f74ff466e10c23ff6557f85ec) ) ROM_LOAD( "2-5a.bin", 0x06000, 0x2000, CRC(b6d81984) SHA1(c935176f8a9bce0f74ff466e10c23ff6557f85ec) )
ROM_LOAD( "2-6a.bin", 0x08000, 0x2000, CRC(5a26b38f) SHA1(987a4844c4568a088932f43a3aff847e6d6b4860) ) ROM_LOAD( "2-6a.bin", 0x08000, 0x2000, CRC(5a26b38f) SHA1(987a4844c4568a088932f43a3aff847e6d6b4860) )
ROM_LOAD( "2-7a.bin", 0x0a000, 0x2000, CRC(1e1ca773) SHA1(dbced07d4a886ed9ad3302aaa37bc02c599ee132) ) ROM_LOAD( "2-7a.bin", 0x0a000, 0x2000, CRC(1e1ca773) SHA1(dbced07d4a886ed9ad3302aaa37bc02c599ee132) )
ROM_REGION( 0x08000, "gfx3", 0 ) ROM_REGION( 0x08000, "sprites", 0 )
ROM_LOAD( "2-2n.bin", 0x00000, 0x2000, CRC(6db1b10d) SHA1(85bf67ce4d60b260767ba5fe9b9777f857937fe3) ) /* sprites */ ROM_LOAD( "2-2n.bin", 0x00000, 0x2000, CRC(6db1b10d) SHA1(85bf67ce4d60b260767ba5fe9b9777f857937fe3) )
ROM_LOAD( "2-3n.bin", 0x02000, 0x2000, CRC(5d8c34ec) SHA1(7b7df89398bf83ace1a8c216ca8526beae90972d) ) ROM_LOAD( "2-3n.bin", 0x02000, 0x2000, CRC(5d8c34ec) SHA1(7b7df89398bf83ace1a8c216ca8526beae90972d) )
ROM_LOAD( "2-4n.bin", 0x04000, 0x2000, CRC(0071a2e3) SHA1(3f7bb4658d2126576a0f8f46f2c947eec1cd231a) ) ROM_LOAD( "2-4n.bin", 0x04000, 0x2000, CRC(0071a2e3) SHA1(3f7bb4658d2126576a0f8f46f2c947eec1cd231a) )
ROM_LOAD( "2-5n.bin", 0x06000, 0x2000, CRC(4023a1ec) SHA1(8b69b9cd6db37db94a00da8712413055a631186a) ) ROM_LOAD( "2-5n.bin", 0x06000, 0x2000, CRC(4023a1ec) SHA1(8b69b9cd6db37db94a00da8712413055a631186a) )
ROM_REGION( 0x0800, "proms", 0 ) ROM_REGION( 0x0800, "proms", 0 )
ROM_LOAD( "e8.bin", 0x0000, 0x0100, CRC(06a83606) SHA1(218c1b404b4b5b06f06e04143872f6758f83f266) ) /* red component */ ROM_LOAD( "e8.bin", 0x0000, 0x0100, CRC(06a83606) SHA1(218c1b404b4b5b06f06e04143872f6758f83f266) ) // red component
ROM_LOAD( "e9.bin", 0x0100, 0x0100, CRC(beacf13c) SHA1(d597097afc53fef752b2530d2de04e5aabb664b4) ) /* green component */ ROM_LOAD( "e9.bin", 0x0100, 0x0100, CRC(beacf13c) SHA1(d597097afc53fef752b2530d2de04e5aabb664b4) ) // green component
ROM_LOAD( "e10.bin", 0x0200, 0x0100, CRC(de1fb621) SHA1(c719892f0c6d8c82ee2ff41bfe74b67648f5b4f5) ) /* blue component */ ROM_LOAD( "e10.bin", 0x0200, 0x0100, CRC(de1fb621) SHA1(c719892f0c6d8c82ee2ff41bfe74b67648f5b4f5) ) // blue component
ROM_LOAD( "d1.bin", 0x0300, 0x0100, CRC(7179080d) SHA1(6c1e8572a4c7b4825b89fc9549265be7c8f17788) ) /* char lookup table */ ROM_LOAD( "d1.bin", 0x0300, 0x0100, CRC(7179080d) SHA1(6c1e8572a4c7b4825b89fc9549265be7c8f17788) ) // char lookup table
ROM_LOAD( "j2.bin", 0x0400, 0x0100, CRC(d0842029) SHA1(7d76e1ff75466e190bc2e07ff3ffb45034f838cd) ) /* sprite lookup table */ ROM_LOAD( "j2.bin", 0x0400, 0x0100, CRC(d0842029) SHA1(7d76e1ff75466e190bc2e07ff3ffb45034f838cd) ) // sprite lookup table
ROM_LOAD( "c9.bin", 0x0500, 0x0100, CRC(7a1f0bd6) SHA1(5a2110e97e82c087999ee4e5adf32d7fa06a3dfb) ) /* tile lookup table */ ROM_LOAD( "c9.bin", 0x0500, 0x0100, CRC(7a1f0bd6) SHA1(5a2110e97e82c087999ee4e5adf32d7fa06a3dfb) ) // tile lookup table
ROM_LOAD( "82s126.9k", 0x0600, 0x0100, CRC(32b10521) SHA1(10b258e32813cfa3a853cbd146657b11c08cb770) ) /* interrupt timing? (not used) */ ROM_LOAD( "82s126.9k", 0x0600, 0x0100, CRC(32b10521) SHA1(10b258e32813cfa3a853cbd146657b11c08cb770) ) // interrupt timing? (not used)
ROM_LOAD( "82s129.8n", 0x0700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) /* video timing? (not used) */ ROM_LOAD( "82s129.8n", 0x0700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) // video timing? (not used)
ROM_END ROM_END
ROM_START( vulgusj ) ROM_START( vulgusj )
@ -344,32 +608,32 @@ ROM_START( vulgusj )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "1-11c.bin", 0x0000, 0x2000, CRC(3bd2acf4) SHA1(b58fb1ea7e30018102ee420d52a1597615412eb1) ) ROM_LOAD( "1-11c.bin", 0x0000, 0x2000, CRC(3bd2acf4) SHA1(b58fb1ea7e30018102ee420d52a1597615412eb1) )
ROM_REGION( 0x02000, "gfx1", 0 ) ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "1-3d.bin", 0x00000, 0x2000, CRC(8bc5d7a5) SHA1(c572b4a26f12013f5f6463b79ba9cbee4c474bbe) ) /* characters */ ROM_LOAD( "1-3d.bin", 0x00000, 0x2000, CRC(8bc5d7a5) SHA1(c572b4a26f12013f5f6463b79ba9cbee4c474bbe) )
ROM_REGION( 0x0c000, "gfx2", 0 ) ROM_REGION( 0x0c000, "tiles", 0 )
ROM_LOAD( "2-2a.bin", 0x00000, 0x2000, CRC(e10aaca1) SHA1(f9f0d05475ae4c554552a71bc2f60e02b1442eb1) ) /* tiles */ ROM_LOAD( "2-2a.bin", 0x00000, 0x2000, CRC(e10aaca1) SHA1(f9f0d05475ae4c554552a71bc2f60e02b1442eb1) )
ROM_LOAD( "2-3a.bin", 0x02000, 0x2000, CRC(8da520da) SHA1(c4c633a909526308de4ad83e8ca449fa71eb3cb5) ) ROM_LOAD( "2-3a.bin", 0x02000, 0x2000, CRC(8da520da) SHA1(c4c633a909526308de4ad83e8ca449fa71eb3cb5) )
ROM_LOAD( "2-4a.bin", 0x04000, 0x2000, CRC(206a13f1) SHA1(645666895127aededfa7872b20b7725948a9c462) ) ROM_LOAD( "2-4a.bin", 0x04000, 0x2000, CRC(206a13f1) SHA1(645666895127aededfa7872b20b7725948a9c462) )
ROM_LOAD( "2-5a.bin", 0x06000, 0x2000, CRC(b6d81984) SHA1(c935176f8a9bce0f74ff466e10c23ff6557f85ec) ) ROM_LOAD( "2-5a.bin", 0x06000, 0x2000, CRC(b6d81984) SHA1(c935176f8a9bce0f74ff466e10c23ff6557f85ec) )
ROM_LOAD( "2-6a.bin", 0x08000, 0x2000, CRC(5a26b38f) SHA1(987a4844c4568a088932f43a3aff847e6d6b4860) ) ROM_LOAD( "2-6a.bin", 0x08000, 0x2000, CRC(5a26b38f) SHA1(987a4844c4568a088932f43a3aff847e6d6b4860) )
ROM_LOAD( "2-7a.bin", 0x0a000, 0x2000, CRC(1e1ca773) SHA1(dbced07d4a886ed9ad3302aaa37bc02c599ee132) ) ROM_LOAD( "2-7a.bin", 0x0a000, 0x2000, CRC(1e1ca773) SHA1(dbced07d4a886ed9ad3302aaa37bc02c599ee132) )
ROM_REGION( 0x08000, "gfx3", 0 ) ROM_REGION( 0x08000, "sprites", 0 )
ROM_LOAD( "2-2n.bin", 0x00000, 0x2000, CRC(6db1b10d) SHA1(85bf67ce4d60b260767ba5fe9b9777f857937fe3) ) /* sprites */ ROM_LOAD( "2-2n.bin", 0x00000, 0x2000, CRC(6db1b10d) SHA1(85bf67ce4d60b260767ba5fe9b9777f857937fe3) )
ROM_LOAD( "2-3n.bin", 0x02000, 0x2000, CRC(5d8c34ec) SHA1(7b7df89398bf83ace1a8c216ca8526beae90972d) ) ROM_LOAD( "2-3n.bin", 0x02000, 0x2000, CRC(5d8c34ec) SHA1(7b7df89398bf83ace1a8c216ca8526beae90972d) )
ROM_LOAD( "2-4n.bin", 0x04000, 0x2000, CRC(0071a2e3) SHA1(3f7bb4658d2126576a0f8f46f2c947eec1cd231a) ) ROM_LOAD( "2-4n.bin", 0x04000, 0x2000, CRC(0071a2e3) SHA1(3f7bb4658d2126576a0f8f46f2c947eec1cd231a) )
ROM_LOAD( "2-5n.bin", 0x06000, 0x2000, CRC(4023a1ec) SHA1(8b69b9cd6db37db94a00da8712413055a631186a) ) ROM_LOAD( "2-5n.bin", 0x06000, 0x2000, CRC(4023a1ec) SHA1(8b69b9cd6db37db94a00da8712413055a631186a) )
ROM_REGION( 0x0800, "proms", 0 ) ROM_REGION( 0x0800, "proms", 0 )
ROM_LOAD( "e8.bin", 0x0000, 0x0100, CRC(06a83606) SHA1(218c1b404b4b5b06f06e04143872f6758f83f266) ) /* red component */ ROM_LOAD( "e8.bin", 0x0000, 0x0100, CRC(06a83606) SHA1(218c1b404b4b5b06f06e04143872f6758f83f266) ) // red component
ROM_LOAD( "e9.bin", 0x0100, 0x0100, CRC(beacf13c) SHA1(d597097afc53fef752b2530d2de04e5aabb664b4) ) /* green component */ ROM_LOAD( "e9.bin", 0x0100, 0x0100, CRC(beacf13c) SHA1(d597097afc53fef752b2530d2de04e5aabb664b4) ) // green component
ROM_LOAD( "e10.bin", 0x0200, 0x0100, CRC(de1fb621) SHA1(c719892f0c6d8c82ee2ff41bfe74b67648f5b4f5) ) /* blue component */ ROM_LOAD( "e10.bin", 0x0200, 0x0100, CRC(de1fb621) SHA1(c719892f0c6d8c82ee2ff41bfe74b67648f5b4f5) ) // blue component
ROM_LOAD( "d1.bin", 0x0300, 0x0100, CRC(7179080d) SHA1(6c1e8572a4c7b4825b89fc9549265be7c8f17788) ) /* char lookup table */ ROM_LOAD( "d1.bin", 0x0300, 0x0100, CRC(7179080d) SHA1(6c1e8572a4c7b4825b89fc9549265be7c8f17788) ) // char lookup table
ROM_LOAD( "j2.bin", 0x0400, 0x0100, CRC(d0842029) SHA1(7d76e1ff75466e190bc2e07ff3ffb45034f838cd) ) /* sprite lookup table */ ROM_LOAD( "j2.bin", 0x0400, 0x0100, CRC(d0842029) SHA1(7d76e1ff75466e190bc2e07ff3ffb45034f838cd) ) // sprite lookup table
ROM_LOAD( "c9.bin", 0x0500, 0x0100, CRC(7a1f0bd6) SHA1(5a2110e97e82c087999ee4e5adf32d7fa06a3dfb) ) /* tile lookup table */ ROM_LOAD( "c9.bin", 0x0500, 0x0100, CRC(7a1f0bd6) SHA1(5a2110e97e82c087999ee4e5adf32d7fa06a3dfb) ) // tile lookup table
ROM_LOAD( "82s126.9k", 0x0600, 0x0100, CRC(32b10521) SHA1(10b258e32813cfa3a853cbd146657b11c08cb770) ) /* interrupt timing? (not used) */ ROM_LOAD( "82s126.9k", 0x0600, 0x0100, CRC(32b10521) SHA1(10b258e32813cfa3a853cbd146657b11c08cb770) ) // interrupt timing? (not used)
ROM_LOAD( "82s129.8n", 0x0700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) /* video timing? (not used) */ ROM_LOAD( "82s129.8n", 0x0700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) // video timing? (not used)
ROM_END ROM_END
ROM_START( mach9 ) ROM_START( mach9 )
@ -383,34 +647,37 @@ ROM_START( mach9 )
ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "07_11c.bin", 0x0000, 0x2000, CRC(3bd2acf4) SHA1(b58fb1ea7e30018102ee420d52a1597615412eb1) ) ROM_LOAD( "07_11c.bin", 0x0000, 0x2000, CRC(3bd2acf4) SHA1(b58fb1ea7e30018102ee420d52a1597615412eb1) )
ROM_REGION( 0x02000, "gfx1", 0 ) ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "01_3d.bin", 0x00000, 0x2000, CRC(be556775) SHA1(16a4e746ea2462689b7a0e9f01c88d7edf06092d) ) /* characters */ ROM_LOAD( "01_3d.bin", 0x00000, 0x2000, CRC(be556775) SHA1(16a4e746ea2462689b7a0e9f01c88d7edf06092d) )
ROM_REGION( 0x0c000, "gfx2", 0 ) ROM_REGION( 0x0c000, "tiles", 0 )
ROM_LOAD( "08_2a.bin", 0x00000, 0x2000, CRC(e10aaca1) SHA1(f9f0d05475ae4c554552a71bc2f60e02b1442eb1) ) /* tiles */ ROM_LOAD( "08_2a.bin", 0x00000, 0x2000, CRC(e10aaca1) SHA1(f9f0d05475ae4c554552a71bc2f60e02b1442eb1) )
ROM_LOAD( "09_3a.bin", 0x02000, 0x2000, CRC(9193f2f1) SHA1(de1ee725627baeabec6823f6ecc4e7f6df152ce3) ) ROM_LOAD( "09_3a.bin", 0x02000, 0x2000, CRC(9193f2f1) SHA1(de1ee725627baeabec6823f6ecc4e7f6df152ce3) )
ROM_LOAD( "10_4a.bin", 0x04000, 0x2000, CRC(206a13f1) SHA1(645666895127aededfa7872b20b7725948a9c462) ) ROM_LOAD( "10_4a.bin", 0x04000, 0x2000, CRC(206a13f1) SHA1(645666895127aededfa7872b20b7725948a9c462) )
ROM_LOAD( "11_5a.bin", 0x06000, 0x2000, CRC(d729b5b7) SHA1(e9af9bc7f627e313ec070dc9e41ce6f2cddc5b38) ) ROM_LOAD( "11_5a.bin", 0x06000, 0x2000, CRC(d729b5b7) SHA1(e9af9bc7f627e313ec070dc9e41ce6f2cddc5b38) )
ROM_LOAD( "12_6a.bin", 0x08000, 0x2000, CRC(5a26b38f) SHA1(987a4844c4568a088932f43a3aff847e6d6b4860) ) ROM_LOAD( "12_6a.bin", 0x08000, 0x2000, CRC(5a26b38f) SHA1(987a4844c4568a088932f43a3aff847e6d6b4860) )
ROM_LOAD( "13_7a.bin", 0x0a000, 0x2000, CRC(8033cd4f) SHA1(5eb2e5931e44ca6bf64117dd34e9b6072e6b0ffc) ) ROM_LOAD( "13_7a.bin", 0x0a000, 0x2000, CRC(8033cd4f) SHA1(5eb2e5931e44ca6bf64117dd34e9b6072e6b0ffc) )
ROM_REGION( 0x08000, "gfx3", 0 ) ROM_REGION( 0x08000, "sprites", 0 )
ROM_LOAD( "14_2n.bin", 0x00000, 0x2000, CRC(6db1b10d) SHA1(85bf67ce4d60b260767ba5fe9b9777f857937fe3) ) /* sprites */ ROM_LOAD( "14_2n.bin", 0x00000, 0x2000, CRC(6db1b10d) SHA1(85bf67ce4d60b260767ba5fe9b9777f857937fe3) )
ROM_LOAD( "15_3n.bin", 0x02000, 0x2000, CRC(5d8c34ec) SHA1(7b7df89398bf83ace1a8c216ca8526beae90972d) ) ROM_LOAD( "15_3n.bin", 0x02000, 0x2000, CRC(5d8c34ec) SHA1(7b7df89398bf83ace1a8c216ca8526beae90972d) )
ROM_LOAD( "16_4n.bin", 0x04000, 0x2000, CRC(0071a2e3) SHA1(3f7bb4658d2126576a0f8f46f2c947eec1cd231a) ) ROM_LOAD( "16_4n.bin", 0x04000, 0x2000, CRC(0071a2e3) SHA1(3f7bb4658d2126576a0f8f46f2c947eec1cd231a) )
ROM_LOAD( "17_5n.bin", 0x06000, 0x2000, CRC(4023a1ec) SHA1(8b69b9cd6db37db94a00da8712413055a631186a) ) ROM_LOAD( "17_5n.bin", 0x06000, 0x2000, CRC(4023a1ec) SHA1(8b69b9cd6db37db94a00da8712413055a631186a) )
ROM_REGION( 0x0800, "proms", 0 ) ROM_REGION( 0x0800, "proms", 0 )
ROM_LOAD( "82s129_8e.bin", 0x0000, 0x0100, CRC(06a83606) SHA1(218c1b404b4b5b06f06e04143872f6758f83f266) ) /* red component */ ROM_LOAD( "82s129_8e.bin", 0x0000, 0x0100, CRC(06a83606) SHA1(218c1b404b4b5b06f06e04143872f6758f83f266) ) // red component
ROM_LOAD( "82s129_9e.bin", 0x0100, 0x0100, CRC(beacf13c) SHA1(d597097afc53fef752b2530d2de04e5aabb664b4) ) /* green component */ ROM_LOAD( "82s129_9e.bin", 0x0100, 0x0100, CRC(beacf13c) SHA1(d597097afc53fef752b2530d2de04e5aabb664b4) ) // green component
ROM_LOAD( "82s129_10e.bin", 0x0200, 0x0100, CRC(8404067c) SHA1(6e8826f56267007e2adf02dc03dd96bd40e64935) ) /* blue component, only PROM slightly different from original? */ ROM_LOAD( "82s129_10e.bin", 0x0200, 0x0100, CRC(8404067c) SHA1(6e8826f56267007e2adf02dc03dd96bd40e64935) ) // blue component, only PROM slightly different from original?
ROM_LOAD( "82s129_1d.bin", 0x0300, 0x0100, CRC(7179080d) SHA1(6c1e8572a4c7b4825b89fc9549265be7c8f17788) ) /* char lookup table */ ROM_LOAD( "82s129_1d.bin", 0x0300, 0x0100, CRC(7179080d) SHA1(6c1e8572a4c7b4825b89fc9549265be7c8f17788) ) // char lookup table
ROM_LOAD( "82s129_2j.bin", 0x0400, 0x0100, CRC(d0842029) SHA1(7d76e1ff75466e190bc2e07ff3ffb45034f838cd) ) /* sprite lookup table */ ROM_LOAD( "82s129_2j.bin", 0x0400, 0x0100, CRC(d0842029) SHA1(7d76e1ff75466e190bc2e07ff3ffb45034f838cd) ) // sprite lookup table
ROM_LOAD( "82s129_9c.bin", 0x0500, 0x0100, CRC(7a1f0bd6) SHA1(5a2110e97e82c087999ee4e5adf32d7fa06a3dfb) ) /* tile lookup table */ ROM_LOAD( "82s129_9c.bin", 0x0500, 0x0100, CRC(7a1f0bd6) SHA1(5a2110e97e82c087999ee4e5adf32d7fa06a3dfb) ) // tile lookup table
ROM_LOAD( "82s129_9k.bin", 0x0600, 0x0100, CRC(32b10521) SHA1(10b258e32813cfa3a853cbd146657b11c08cb770) ) /* interrupt timing? (not used) */ ROM_LOAD( "82s129_9k.bin", 0x0600, 0x0100, CRC(32b10521) SHA1(10b258e32813cfa3a853cbd146657b11c08cb770) ) // interrupt timing? (not used)
ROM_LOAD( "82s129_8n.bin", 0x0700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) /* video timing? (not used) */ ROM_LOAD( "82s129_8n.bin", 0x0700, 0x0100, CRC(4921635c) SHA1(aee37d6cdc36acf0f11ff5f93e7b16e4b12f6c39) ) // video timing? (not used)
ROM_END ROM_END
} // anonymous namespace
GAME( 1984, vulgus, 0, vulgus, vulgus, vulgus_state, empty_init, ROT270, "Capcom", "Vulgus (set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, vulgus, 0, vulgus, vulgus, vulgus_state, empty_init, ROT270, "Capcom", "Vulgus (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, vulgusa, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT90, "Capcom", "Vulgus (set 2)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, vulgusa, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT90, "Capcom", "Vulgus (set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, vulgusj, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT270, "Capcom", "Vulgus (Japan?)", MACHINE_SUPPORTS_SAVE ) GAME( 1984, vulgusj, vulgus, vulgus, vulgus, vulgus_state, empty_init, ROT270, "Capcom", "Vulgus (Japan?)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,70 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Mirko Buffoni
/***************************************************************************
Capcom Vulgus hardware
***************************************************************************/
#ifndef MAME_INCLUDES_VULGUS_H
#define MAME_INCLUDES_VULGUS_H
#pragma once
#include "emupal.h"
#include "tilemap.h"
class vulgus_state : public driver_device
{
public:
vulgus_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_scroll_low(*this, "scroll_low"),
m_scroll_high(*this, "scroll_high"),
m_spriteram(*this, "spriteram"),
m_fgvideoram(*this, "fgvideoram"),
m_bgvideoram(*this, "bgvideoram")
{ }
void vulgus(machine_config &config);
private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_scroll_low;
required_shared_ptr<uint8_t> m_scroll_high;
required_shared_ptr<uint8_t> m_spriteram;
required_shared_ptr<uint8_t> m_fgvideoram;
required_shared_ptr<uint8_t> m_bgvideoram;
int m_palette_bank = 0;
tilemap_t *m_fg_tilemap = nullptr;
tilemap_t *m_bg_tilemap = nullptr;
void fgvideoram_w(offs_t offset, uint8_t data);
void bgvideoram_w(offs_t offset, uint8_t data);
void c804_w(uint8_t data);
void palette_bank_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void video_start() override;
void vulgus_palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(vblank_irq);
void main_map(address_map &map);
void sound_map(address_map &map);
};
#endif // MAME_INCLUDES_VULGUS_H

View File

@ -1,214 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Mirko Buffoni
/***************************************************************************
Capcom Vulgus hardware
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "vulgus.h"
/***************************************************************************
Convert the color PROMs into a more useable format.
***************************************************************************/
void vulgus_state::vulgus_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
for (int i = 0; i < 256; i++)
{
int bit0,bit1,bit2,bit3;
bit0 = (color_prom[0] >> 0) & 0x01;
bit1 = (color_prom[0] >> 1) & 0x01;
bit2 = (color_prom[0] >> 2) & 0x01;
bit3 = (color_prom[0] >> 3) & 0x01;
int const r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
bit0 = (color_prom[256] >> 0) & 0x01;
bit1 = (color_prom[256] >> 1) & 0x01;
bit2 = (color_prom[256] >> 2) & 0x01;
bit3 = (color_prom[256] >> 3) & 0x01;
int const g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
bit0 = (color_prom[2*256] >> 0) & 0x01;
bit1 = (color_prom[2*256] >> 1) & 0x01;
bit2 = (color_prom[2*256] >> 2) & 0x01;
bit3 = (color_prom[2*256] >> 3) & 0x01;
int const b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
palette.set_indirect_color(i, rgb_t(r, g, b));
color_prom++;
}
color_prom += 2*256;
// color_prom now points to the beginning of the lookup table
// characters use colors 32-47 (?)
for (int i = 0; i < m_gfxdecode->gfx(0)->colors() * m_gfxdecode->gfx(0)->granularity(); i++)
palette.set_pen_indirect(m_gfxdecode->gfx(0)->colorbase() + i, 32 + *color_prom++);
// sprites use colors 16-31
for (int i = 0; i < m_gfxdecode->gfx(2)->colors() * m_gfxdecode->gfx(2)->granularity(); i++)
palette.set_pen_indirect(m_gfxdecode->gfx(2)->colorbase() + i, 16 + *color_prom++);
// background tiles use colors 0-15, 64-79, 128-143, 192-207 in four banks
for (int i = 0; i < m_gfxdecode->gfx(1)->colors() * m_gfxdecode->gfx(1)->granularity() / 4; i++)
{
palette.set_pen_indirect(m_gfxdecode->gfx(1)->colorbase() + 0*32*8 + i, *color_prom);
palette.set_pen_indirect(m_gfxdecode->gfx(1)->colorbase() + 1*32*8 + i, *color_prom + 64);
palette.set_pen_indirect(m_gfxdecode->gfx(1)->colorbase() + 2*32*8 + i, *color_prom + 128);
palette.set_pen_indirect(m_gfxdecode->gfx(1)->colorbase() + 3*32*8 + i, *color_prom + 192);
color_prom++;
}
}
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(vulgus_state::get_fg_tile_info)
{
int code, color;
code = m_fgvideoram[tile_index];
color = m_fgvideoram[tile_index + 0x400];
tileinfo.set(0,
code + ((color & 0x80) << 1),
color & 0x3f,
0);
tileinfo.group = color & 0x3f;
}
TILE_GET_INFO_MEMBER(vulgus_state::get_bg_tile_info)
{
int code, color;
code = m_bgvideoram[tile_index];
color = m_bgvideoram[tile_index + 0x400];
tileinfo.set(1,
code + ((color & 0x80) << 1),
(color & 0x1f) + (0x20 * m_palette_bank),
TILE_FLIPYX((color & 0x60) >> 5));
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void vulgus_state::video_start()
{
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(vulgus_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32,32);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(vulgus_state::get_bg_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32);
m_fg_tilemap->configure_groups(*m_gfxdecode->gfx(0), 47);
m_bg_tilemap->set_scrolldx(128, 128);
m_bg_tilemap->set_scrolldy( 6, 6);
m_fg_tilemap->set_scrolldx(128, 128);
m_fg_tilemap->set_scrolldy( 6, 6);
save_item(NAME(m_palette_bank));
}
/***************************************************************************
Memory handlers
***************************************************************************/
void vulgus_state::fgvideoram_w(offs_t offset, uint8_t data)
{
m_fgvideoram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset & 0x3ff);
}
void vulgus_state::bgvideoram_w(offs_t offset, uint8_t data)
{
m_bgvideoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x3ff);
}
void vulgus_state::c804_w(uint8_t data)
{
/* bits 0 and 1 are coin counters */
machine().bookkeeping().coin_counter_w(0, data & 0x01);
machine().bookkeeping().coin_counter_w(1, data & 0x02);
/* bit 7 flips screen */
flip_screen_set(data & 0x80);
}
void vulgus_state::palette_bank_w(uint8_t data)
{
if (m_palette_bank != (data & 3))
{
m_palette_bank = data & 3;
m_bg_tilemap->mark_all_dirty();
}
}
/***************************************************************************
Display refresh
***************************************************************************/
void vulgus_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element *gfx = m_gfxdecode->gfx(2);
for (int offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
int code = m_spriteram[offs];
int color = m_spriteram[offs + 1] & 0x0f;
int sy = m_spriteram[offs + 2];
int sx = m_spriteram[offs + 3];
bool flip = flip_screen() ? true : false;
int dir = 1;
if (sy == 0)
continue;
if (flip)
{
sx = 240 - sx;
sy = 240 - sy;
dir = -1;
}
// draw sprite rows (16*16, 16*32, or 16*64)
int row = (m_spriteram[offs + 1] & 0xc0) >> 6;
if (row == 2) row = 3;
for (; row >= 0; row--)
gfx->transpen(bitmap, cliprect, code + row, color, flip, flip, sx+128, sy + 6 + 16 * row * dir, 15);
}
}
uint32_t vulgus_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0, m_scroll_low[1] + 256 * m_scroll_high[1]);
m_bg_tilemap->set_scrolly(0, m_scroll_low[0] + 256 * m_scroll_high[0]);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}

View File

@ -1,7 +1,7 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders:Wilbert Pol // copyright-holders:Wilbert Pol
/* /*
** msx.cpp : Enulation of the MSX family of machines ** msx.cpp : Emulation of the MSX family of machines
** **
** Special usage notes: ** Special usage notes:
** **