kangaroo.cpp, shisen.cpp, skykid.cpp, spdodgeb.cpp: finders and other small cleanups

This commit is contained in:
Ivan Vangelista 2022-04-13 16:45:53 +02:00
parent 232c10aef1
commit c3a817660d
13 changed files with 1351 additions and 1443 deletions

View File

@ -2228,8 +2228,6 @@ files {
MAME_DIR .. "src/mame/audio/redalert.h",
MAME_DIR .. "src/mame/video/redalert.cpp",
MAME_DIR .. "src/mame/drivers/shisen.cpp",
MAME_DIR .. "src/mame/includes/shisen.h",
MAME_DIR .. "src/mame/video/shisen.cpp",
MAME_DIR .. "src/mame/drivers/travrusa.cpp",
MAME_DIR .. "src/mame/includes/travrusa.h",
MAME_DIR .. "src/mame/video/travrusa.cpp",
@ -3001,8 +2999,6 @@ files {
MAME_DIR .. "src/mame/drivers/rbowlorama.cpp",
MAME_DIR .. "src/mame/drivers/shootaway2.cpp",
MAME_DIR .. "src/mame/drivers/skykid.cpp",
MAME_DIR .. "src/mame/includes/skykid.h",
MAME_DIR .. "src/mame/video/skykid.cpp",
MAME_DIR .. "src/mame/drivers/sweetland.cpp",
MAME_DIR .. "src/mame/audio/nl_tankbatt.h",
MAME_DIR .. "src/mame/audio/nl_tankbatt.cpp",
@ -3932,8 +3928,6 @@ files {
MAME_DIR .. "src/mame/includes/ikki.h",
MAME_DIR .. "src/mame/video/ikki.cpp",
MAME_DIR .. "src/mame/drivers/kangaroo.cpp",
MAME_DIR .. "src/mame/includes/kangaroo.h",
MAME_DIR .. "src/mame/video/kangaroo.cpp",
MAME_DIR .. "src/mame/drivers/markham.cpp",
MAME_DIR .. "src/mame/includes/markham.h",
MAME_DIR .. "src/mame/video/markham.cpp",
@ -4276,8 +4270,6 @@ files {
MAME_DIR .. "src/mame/includes/shadfrce.h",
MAME_DIR .. "src/mame/video/shadfrce.cpp",
MAME_DIR .. "src/mame/drivers/spdodgeb.cpp",
MAME_DIR .. "src/mame/includes/spdodgeb.h",
MAME_DIR .. "src/mame/video/spdodgeb.cpp",
MAME_DIR .. "src/mame/drivers/ssozumo.cpp",
MAME_DIR .. "src/mame/includes/ssozumo.h",
MAME_DIR .. "src/mame/video/ssozumo.cpp",

View File

@ -156,19 +156,249 @@
***************************************************************************/
#include "emu.h"
#include "includes/kangaroo.h"
#include "cpu/mb88xx/mb88xx.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "sound/ay8910.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#define MASTER_CLOCK (10_MHz_XTAL)
namespace {
class kangaroo_state : public driver_device
{
public:
kangaroo_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_video_control(*this, "video_control"),
m_videoram(*this, "videoram", 256 * 64 * 4, ENDIANNESS_LITTLE), // video RAM is accessed 32 bits at a time (two planes, 4bpp each, 4 pixels)
m_blitbank(*this, "blitbank"),
m_blitrom(*this, "blitter"),
m_maincpu(*this, "maincpu"),
m_palette(*this, "palette") { }
void nomcu(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
void main_map(address_map &map);
private:
// memory pointers
required_shared_ptr<uint8_t> m_video_control;
memory_share_creator<uint32_t> m_videoram;
required_memory_bank m_blitbank;
required_region_ptr<uint8_t> m_blitrom;
// devices
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
// misc
void coin_counter_w(uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
void video_control_w(offs_t offset, uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void videoram_write(uint16_t offset, uint8_t data, uint8_t mask);
void blitter_execute();
void sound_map(address_map &map);
void sound_portmap(address_map &map);
};
class kangaroo_mcu_state : public kangaroo_state
{
public:
kangaroo_mcu_state(const machine_config &mconfig, device_type type, const char *tag)
: kangaroo_state(mconfig, type, tag) { }
void mcu(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
// MCU simulation (for now)
uint8_t m_mcu_clock = 0U;
uint8_t mcu_sim_r();
void mcu_sim_w(uint8_t data);
void main_map(address_map &map);
};
// video
/*************************************
*
* Video RAM accesses
*
*************************************/
void kangaroo_state::videoram_write(uint16_t offset, uint8_t data, uint8_t mask)
{
// data contains 4 2-bit values packed as DCBADCBA; expand these into 4 8-bit values
uint32_t expdata = 0;
if (data & 0x01) expdata |= 0x00000055;
if (data & 0x10) expdata |= 0x000000aa;
if (data & 0x02) expdata |= 0x00005500;
if (data & 0x20) expdata |= 0x0000aa00;
if (data & 0x04) expdata |= 0x00550000;
if (data & 0x40) expdata |= 0x00aa0000;
if (data & 0x08) expdata |= 0x55000000;
if (data & 0x80) expdata |= 0xaa000000;
// determine which layers are enabled
uint32_t layermask = 0;
if (mask & 0x08) layermask |= 0x30303030;
if (mask & 0x04) layermask |= 0xc0c0c0c0;
if (mask & 0x02) layermask |= 0x03030303;
if (mask & 0x01) layermask |= 0x0c0c0c0c;
// update layers
m_videoram[offset] = (m_videoram[offset] & ~layermask) | (expdata & layermask);
}
void kangaroo_state::videoram_w(offs_t offset, uint8_t data)
{
videoram_write(offset, data, m_video_control[8]);
}
/*************************************
*
* Video control writes
*
*************************************/
void kangaroo_state::video_control_w(offs_t offset, uint8_t data)
{
m_video_control[offset] = data;
switch (offset)
{
case 5: // blitter start
blitter_execute();
break;
case 8: // bank select
m_blitbank->set_entry((data & 0x05) ? 0 : 1);
break;
}
}
/*************************************
*
* DMA blitter
*
*************************************/
void kangaroo_state::blitter_execute()
{
uint32_t gfxhalfsize = m_blitrom.bytes() / 2;
uint16_t src = m_video_control[0] + 256 * m_video_control[1];
uint16_t dst = m_video_control[2] + 256 * m_video_control[3];
uint8_t height = m_video_control[5];
uint8_t width = m_video_control[4];
uint8_t mask = m_video_control[8];
// during DMA operations, the top 2 bits are ORed together, as well as the bottom 2 bits
// adjust the mask to account for this
if (mask & 0x0c) mask |= 0x0c;
if (mask & 0x03) mask |= 0x03;
// loop over height, then width
for (int y = 0; y <= height; y++, dst += 256)
for (int x = 0; x <= width; x++)
{
uint16_t effdst = (dst + x) & 0x3fff;
uint16_t effsrc = src++ & (gfxhalfsize - 1);
videoram_write(effdst, m_blitrom[0 * gfxhalfsize + effsrc], mask & 0x05);
videoram_write(effdst, m_blitrom[1 * gfxhalfsize + effsrc], mask & 0x0a);
}
}
/*************************************
*
* Video updater
*
*************************************/
uint32_t kangaroo_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t scrolly = m_video_control[6];
uint8_t scrollx = m_video_control[7];
uint8_t maska = (m_video_control[10] & 0x28) >> 3;
uint8_t maskb = (m_video_control[10] & 0x07) >> 0;
uint8_t xora = (m_video_control[9] & 0x20) ? 0xff : 0x00;
uint8_t xorb = (m_video_control[9] & 0x10) ? 0xff : 0x00;
uint8_t enaa = (m_video_control[9] & 0x08);
uint8_t enab = (m_video_control[9] & 0x04);
uint8_t pria = (~m_video_control[9] & 0x02);
uint8_t prib = (~m_video_control[9] & 0x01);
// iterate over pixels
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
uint32_t *const dest = &bitmap.pix(y);
for (int x = cliprect.min_x; x <= cliprect.max_x; x += 2)
{
uint8_t effxa = scrollx + ((x / 2) ^ xora);
uint8_t effya = scrolly + (y ^ xora);
uint8_t effxb = (x / 2) ^ xorb;
uint8_t effyb = y ^ xorb;
uint8_t pixa = (m_videoram[effya + 256 * (effxa / 4)] >> (8 * (effxa % 4) + 0)) & 0x0f;
uint8_t pixb = (m_videoram[effyb + 256 * (effxb / 4)] >> (8 * (effxb % 4) + 4)) & 0x0f;
// for each layer, contribute bits if (a) enabled, and (b) either has priority or the opposite plane is 0
uint8_t finalpens = 0;
if (enaa && (pria || pixb == 0))
finalpens |= pixa;
if (enab && (prib || pixa == 0))
finalpens |= pixb;
// store the first of two pixels, which is always full brightness
dest[x + 0] = m_palette->pen_color(finalpens & 7);
// KOS1 alternates at 5MHz, offset from the pixel clock by 1/2 clock
// when 0, it enables the color mask for pixels with Z = 0
finalpens = 0;
if (enaa && (pria || pixb == 0))
{
if (!(pixa & 0x08)) pixa &= maska;
finalpens |= pixa;
}
if (enab && (prib || pixa == 0))
{
if (!(pixb & 0x08)) pixb &= maskb;
finalpens |= pixb;
}
// store the second of two pixels, which is affected by KOS1 and the A/B masks
dest[x + 1] = m_palette->pen_color(finalpens & 7);
}
}
return 0;
}
// machine
/*************************************
*
@ -178,54 +408,55 @@
void kangaroo_state::machine_start()
{
membank("bank1")->configure_entries(0, 2, memregion("gfx1")->base(), 0x2000);
m_blitbank->configure_entries(0, 2, memregion("blitter")->base(), 0x2000);
}
MACHINE_START_MEMBER(kangaroo_state,kangaroo_mcu)
void kangaroo_mcu_state::machine_start()
{
kangaroo_state::machine_start();
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xef00, 0xefff, read8smo_delegate(*this, FUNC(kangaroo_state::mcu_sim_r)), write8smo_delegate(*this, FUNC(kangaroo_state::mcu_sim_w)));
save_item(NAME(m_mcu_clock));
}
void kangaroo_state::machine_reset()
{
/* I think there is a bug in the startup checks of the game. At the very */
/* beginning, during the RAM check, it goes one byte too far, and ends up */
/* trying to write, and re-read, location dfff. To the best of my knowledge, */
/* that is a ROM address, so the test fails and the code keeps jumping back */
/* at 0000. */
/* However, a NMI causes a successful reset. Maybe the hardware generates a */
/* NMI short after power on, therefore masking the bug? The NMI is generated */
/* by the MB8841 custom microcontroller, so this could be a way to disguise */
/* the copy protection. */
/* Anyway, what I do here is just immediately generate the NMI, so the game */
/* properly starts. */
/* I think there is a bug in the startup checks of the game. At the very
beginning, during the RAM check, it goes one byte too far, and ends up
trying to write, and re-read, location dfff. To the best of my knowledge,
that is a ROM address, so the test fails and the code keeps jumping back
at 0000.
However, a NMI causes a successful reset. Maybe the hardware generates a
NMI short after power on, therefore masking the bug? The NMI is generated
by the MB8841 custom microcontroller, so this could be a way to disguise
the copy protection.
Anyway, what I do here is just immediately generate the NMI, so the game
properly starts. */
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
void kangaroo_mcu_state::machine_reset()
{
kangaroo_state::machine_reset();
m_mcu_clock = 0;
}
/*************************************
*
* Custom CPU RAM snooping
*
*************************************/
/* The security chip is a MB8841 with 2K internal rom. Currently it's unknown what it really does,
this just seems to do the trick -V-
*/
// The security chip is a MB8841 with 2K internal ROM. Currently it's unknown what it really does, this just seems to do the trick -V-
uint8_t kangaroo_state::mcu_sim_r()
uint8_t kangaroo_mcu_state::mcu_sim_r()
{
return ++m_mcu_clock & 0x0f;
}
void kangaroo_state::mcu_sim_w(uint8_t data)
void kangaroo_mcu_state::mcu_sim_w(uint8_t data)
{
}
@ -237,7 +468,7 @@ void kangaroo_state::mcu_sim_w(uint8_t data)
*
*************************************/
void kangaroo_state::kangaroo_coin_counter_w(uint8_t data)
void kangaroo_state::coin_counter_w(uint8_t data)
{
machine().bookkeeping().coin_counter_w(0, data & 1);
machine().bookkeeping().coin_counter_w(1, data & 2);
@ -254,16 +485,22 @@ void kangaroo_state::kangaroo_coin_counter_w(uint8_t data)
void kangaroo_state::main_map(address_map &map)
{
map(0x0000, 0x5fff).rom();
map(0x8000, 0xbfff).w(FUNC(kangaroo_state::kangaroo_videoram_w));
map(0xc000, 0xdfff).bankr("bank1");
map(0x8000, 0xbfff).w(FUNC(kangaroo_state::videoram_w));
map(0xc000, 0xdfff).bankr(m_blitbank);
map(0xe000, 0xe3ff).ram();
map(0xe400, 0xe400).mirror(0x03ff).portr("DSW0");
map(0xe800, 0xe80a).mirror(0x03f0).w(FUNC(kangaroo_state::kangaroo_video_control_w)).share("video_control");
map(0xe800, 0xe80a).mirror(0x03f0).w(FUNC(kangaroo_state::video_control_w)).share(m_video_control);
map(0xec00, 0xec00).mirror(0x00ff).portr("IN0").w("soundlatch", FUNC(generic_latch_8_device::write));
map(0xed00, 0xed00).mirror(0x00ff).portr("IN1").w(FUNC(kangaroo_state::kangaroo_coin_counter_w));
map(0xed00, 0xed00).mirror(0x00ff).portr("IN1").w(FUNC(kangaroo_state::coin_counter_w));
map(0xee00, 0xee00).mirror(0x00ff).portr("IN2");
}
void kangaroo_mcu_state::main_map(address_map &map)
{
kangaroo_state::main_map(map);
map(0xef00, 0xefff).rw(FUNC(kangaroo_mcu_state::mcu_sim_r), FUNC(kangaroo_mcu_state::mcu_sim_w));
}
/*************************************
@ -406,7 +643,7 @@ static INPUT_PORTS_START( kangaroo )
PORT_DIPSETTING( 0xb0, "A 1C/2C B 1C/10C" )
PORT_DIPSETTING( 0xc0, "A 1C/2C B 1C/11C" )
PORT_DIPSETTING( 0xd0, "A 1C/2C B 1C/12C" )
/* 0xe0 gives A 1/2 B 1/6 */
// 0xe0 gives A 1/2 B 1/6
PORT_DIPSETTING( 0xf0, DEF_STR( Free_Play ) )
INPUT_PORTS_END
@ -418,43 +655,45 @@ INPUT_PORTS_END
*
*************************************/
static constexpr XTAL MASTER_CLOCK = 10_MHz_XTAL;
void kangaroo_state::nomcu(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, MASTER_CLOCK/4);
// basic machine hardware
Z80(config, m_maincpu, MASTER_CLOCK / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &kangaroo_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(kangaroo_state::irq0_line_hold));
z80_device &audiocpu(Z80(config, "audiocpu", MASTER_CLOCK/8));
z80_device &audiocpu(Z80(config, "audiocpu", MASTER_CLOCK / 8));
audiocpu.set_addrmap(AS_PROGRAM, &kangaroo_state::sound_map);
audiocpu.set_addrmap(AS_IO, &kangaroo_state::sound_map); // yes, this is identical
audiocpu.set_vblank_int("screen", FUNC(kangaroo_state::irq0_line_hold));
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_video_attributes(VIDEO_UPDATE_SCANLINE);
screen.set_raw(MASTER_CLOCK, 320*2, 0*2, 256*2, 260, 8, 248);
screen.set_screen_update(FUNC(kangaroo_state::screen_update_kangaroo));
screen.set_screen_update(FUNC(kangaroo_state::screen_update));
PALETTE(config, m_palette, palette_device::BGR_3BIT);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch");
AY8910(config, "aysnd", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 0.50);
AY8910(config, "aysnd", MASTER_CLOCK / 8).add_route(ALL_OUTPUTS, "mono", 0.50);
}
void kangaroo_state::mcu(machine_config &config)
void kangaroo_mcu_state::mcu(machine_config &config)
{
nomcu(config);
MCFG_MACHINE_START_OVERRIDE(kangaroo_state,kangaroo_mcu)
subdevice<cpu_device>("maincpu")->set_addrmap(AS_PROGRAM, &kangaroo_mcu_state::main_map);
MB8841(config, "mcu", MASTER_CLOCK/4/2).set_disable();
MB8841(config, "mcu", MASTER_CLOCK / 4 / 2).set_disable(); // not dumped
}
@ -466,17 +705,17 @@ void kangaroo_state::mcu(machine_config &config)
*************************************/
ROM_START( fnkyfish )
ROM_REGION( 0x14000, "maincpu", 0 )
ROM_REGION( 0x6000, "maincpu", 0 )
ROM_LOAD( "tvg_64.0", 0x0000, 0x1000, CRC(af728803) SHA1(1cbbf863f0eb4c759d6037ef9d9d0f4586b7b570) )
ROM_LOAD( "tvg_65.1", 0x1000, 0x1000, CRC(71959e6b) SHA1(7336cbf3eefd081cd657a56fb6a8fbdac1b51c2c) )
ROM_LOAD( "tvg_66.2", 0x2000, 0x1000, CRC(5ccf68d4) SHA1(c885df8b2b1bcb578ceab6615caf633dac02a5b2) )
ROM_LOAD( "tvg_67.3", 0x3000, 0x1000, CRC(938ff36f) SHA1(bf660217ff82d5850ab97238ed2e32199d04f8c9) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_REGION( 0x1000, "audiocpu", 0 )
ROM_LOAD( "tvg_68.8", 0x0000, 0x1000, CRC(d36bb2be) SHA1(330160161857407fda62f16e7f43b8833744fd34) )
ROM_REGION( 0x4000, "gfx1", 0 )
ROM_LOAD( "tvg_69.v0", 0x0000, 0x1000, CRC(cd532d0b) SHA1(7a64f8bab1a0feafd53a4b81ac3b624a7c1bd26a) ) /* graphics ROMs */
ROM_REGION( 0x4000, "blitter", 0 )
ROM_LOAD( "tvg_69.v0", 0x0000, 0x1000, CRC(cd532d0b) SHA1(7a64f8bab1a0feafd53a4b81ac3b624a7c1bd26a) )
ROM_LOAD( "tvg_71.v2", 0x1000, 0x1000, CRC(a59c9713) SHA1(60dafa3d5a70b7e727b7c4688f8f3125735c31ec) )
ROM_LOAD( "tvg_70.v1", 0x2000, 0x1000, CRC(fd308ef1) SHA1(d07f964cab875b0e47f3469fa5211684a5725dfe) )
ROM_LOAD( "tvg_72.v3", 0x3000, 0x1000, CRC(6ae9b584) SHA1(408d26f4cdcd2abf0667fdc9c6eae58c9052981d) )
@ -484,33 +723,33 @@ ROM_END
ROM_START( kangaroo )
ROM_REGION( 0x14000, "maincpu", 0 ) /* On TVG-1-CPU-B board */
ROM_LOAD( "tvg_75.0", 0x0000, 0x1000, CRC(0d18c581) SHA1(0e0f89d644b79e887c53e5294783843ca7e875ba) ) /* IC7 */
ROM_LOAD( "tvg_76.1", 0x1000, 0x1000, CRC(5978d37a) SHA1(684c1092de4a0927a03752903c86c3bbe99e868a) ) /* IC8 */
ROM_LOAD( "tvg_77.2", 0x2000, 0x1000, CRC(522d1097) SHA1(09fe627a46d32df2e098d9fad7757f9d61bef41f) ) /* IC9 */
ROM_LOAD( "tvg_78.3", 0x3000, 0x1000, CRC(063da970) SHA1(582ff21dd46c651f07a4846e0f8a7544a5891988) ) /* IC10 */
ROM_LOAD( "tvg_79.4", 0x4000, 0x1000, CRC(9e5cf8ca) SHA1(015387f038c5670f88c9b22453d074bd9b2a129d) ) /* IC16 */
ROM_LOAD( "tvg_80.5", 0x5000, 0x1000, CRC(2fc18049) SHA1(31fcac8eb660739a1672346136a1581a5ef20325) ) /* IC17 */
ROM_REGION( 0x6000, "maincpu", 0 ) // On TVG-1-CPU-B board
ROM_LOAD( "tvg_75.0", 0x0000, 0x1000, CRC(0d18c581) SHA1(0e0f89d644b79e887c53e5294783843ca7e875ba) ) // IC7
ROM_LOAD( "tvg_76.1", 0x1000, 0x1000, CRC(5978d37a) SHA1(684c1092de4a0927a03752903c86c3bbe99e868a) ) // IC8
ROM_LOAD( "tvg_77.2", 0x2000, 0x1000, CRC(522d1097) SHA1(09fe627a46d32df2e098d9fad7757f9d61bef41f) ) // IC9
ROM_LOAD( "tvg_78.3", 0x3000, 0x1000, CRC(063da970) SHA1(582ff21dd46c651f07a4846e0f8a7544a5891988) ) // IC10
ROM_LOAD( "tvg_79.4", 0x4000, 0x1000, CRC(9e5cf8ca) SHA1(015387f038c5670f88c9b22453d074bd9b2a129d) ) // IC16
ROM_LOAD( "tvg_80.5", 0x5000, 0x1000, CRC(2fc18049) SHA1(31fcac8eb660739a1672346136a1581a5ef20325) ) // IC17
ROM_REGION( 0x10000, "audiocpu", 0 ) /* On TVG-1-CPU-B board */
ROM_LOAD( "tvg_81.8", 0x0000, 0x1000, CRC(fb449bfd) SHA1(f593a0339f47e121736a927587132aeb52704557) ) /* IC24 */
ROM_REGION( 0x1000, "audiocpu", 0 ) // On TVG-1-CPU-B board
ROM_LOAD( "tvg_81.8", 0x0000, 0x1000, CRC(fb449bfd) SHA1(f593a0339f47e121736a927587132aeb52704557) ) // IC24
ROM_REGION( 0x0800, "mcu", 0 ) /* internal ROM from the 8841 custom MCU */
ROM_REGION( 0x0800, "mcu", 0 ) // internal ROM from the 8841 custom MCU
ROM_LOAD( "mb8841.ic29", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x0800, "user1", 0 ) /* data for the 8841 custom MCU */
ROM_LOAD( "tvg_82.12", 0x0000, 0x0800, CRC(57766f69) SHA1(94a7a557d8325799523d5e1a88653a9a3fbe34f9) ) /* IC28 */
ROM_REGION( 0x0800, "user1", 0 ) // data for the 8841 custom MCU
ROM_LOAD( "tvg_82.12", 0x0000, 0x0800, CRC(57766f69) SHA1(94a7a557d8325799523d5e1a88653a9a3fbe34f9) ) // IC28
ROM_REGION( 0x4000, "gfx1", 0 ) /* On TVG-1-VIDEO-B board */
ROM_LOAD( "tvg_83.v0", 0x0000, 0x1000, CRC(c0446ca6) SHA1(fca6ba565051337c0198c93b7b8477632e0dd0b6) ) /* IC76 */
ROM_LOAD( "tvg_85.v2", 0x1000, 0x1000, CRC(72c52695) SHA1(87f4715fbb7d509bd9cc4e71e2afb0d475bbac13) ) /* IC77 */
ROM_LOAD( "tvg_84.v1", 0x2000, 0x1000, CRC(e4cb26c2) SHA1(5016db9d48fdcfb757618659d063b90862eb0e90) ) /* IC52 */
ROM_LOAD( "tvg_86.v3", 0x3000, 0x1000, CRC(9e6a599f) SHA1(76b4eddb4efcd8189d8cc5962d8497e82885f212) ) /* IC53 */
ROM_REGION( 0x4000, "blitter", 0 ) // On TVG-1-VIDEO-B board
ROM_LOAD( "tvg_83.v0", 0x0000, 0x1000, CRC(c0446ca6) SHA1(fca6ba565051337c0198c93b7b8477632e0dd0b6) ) // IC76
ROM_LOAD( "tvg_85.v2", 0x1000, 0x1000, CRC(72c52695) SHA1(87f4715fbb7d509bd9cc4e71e2afb0d475bbac13) ) // IC77
ROM_LOAD( "tvg_84.v1", 0x2000, 0x1000, CRC(e4cb26c2) SHA1(5016db9d48fdcfb757618659d063b90862eb0e90) ) // IC52
ROM_LOAD( "tvg_86.v3", 0x3000, 0x1000, CRC(9e6a599f) SHA1(76b4eddb4efcd8189d8cc5962d8497e82885f212) ) // IC53
ROM_END
ROM_START( kangarooa )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_REGION( 0x6000, "maincpu", 0 )
ROM_LOAD( "136008-101.ic7", 0x0000, 0x1000, CRC(0d18c581) SHA1(0e0f89d644b79e887c53e5294783843ca7e875ba) )
ROM_LOAD( "136008-102.ic8", 0x1000, 0x1000, CRC(5978d37a) SHA1(684c1092de4a0927a03752903c86c3bbe99e868a) )
ROM_LOAD( "136008-103.ic9", 0x2000, 0x1000, CRC(522d1097) SHA1(09fe627a46d32df2e098d9fad7757f9d61bef41f) )
@ -518,16 +757,16 @@ ROM_START( kangarooa )
ROM_LOAD( "136008-105.ic16", 0x4000, 0x1000, CRC(82a26c7d) SHA1(09087552dbe4d27df79396072c0f9b916f78f89b) )
ROM_LOAD( "136008-106.ic17", 0x5000, 0x1000, CRC(3dead542) SHA1(0b5d329b1ebbacc650d06289b4e080304e728ea7) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_REGION( 0x1000, "audiocpu", 0 )
ROM_LOAD( "136008-107.ic24", 0x0000, 0x1000, CRC(fb449bfd) SHA1(f593a0339f47e121736a927587132aeb52704557) )
ROM_REGION( 0x0800, "mcu", 0 ) /* internal ROM from the 8841 custom MCU */
ROM_REGION( 0x0800, "mcu", 0 ) // internal ROM from the 8841 custom MCU
ROM_LOAD( "mb8841.ic29", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x0800, "user1", 0 ) /* data for the 8841 custom MCU */
ROM_REGION( 0x0800, "user1", 0 ) // data for the 8841 custom MCU
ROM_LOAD( "136008-112.ic28", 0x0000, 0x0800, CRC(57766f69) SHA1(94a7a557d8325799523d5e1a88653a9a3fbe34f9) )
ROM_REGION( 0x4000, "gfx1", 0 )
ROM_REGION( 0x4000, "blitter", 0 )
ROM_LOAD( "136008-108.ic76", 0x0000, 0x1000, CRC(c0446ca6) SHA1(fca6ba565051337c0198c93b7b8477632e0dd0b6) )
ROM_LOAD( "136008-110.ic77", 0x1000, 0x1000, CRC(72c52695) SHA1(87f4715fbb7d509bd9cc4e71e2afb0d475bbac13) )
ROM_LOAD( "136008-109.ic52", 0x2000, 0x1000, CRC(e4cb26c2) SHA1(5016db9d48fdcfb757618659d063b90862eb0e90) )
@ -536,7 +775,7 @@ ROM_END
ROM_START( kangaroob )
ROM_REGION( 0x14000, "maincpu", 0 )
ROM_REGION( 0x6000, "maincpu", 0 )
ROM_LOAD( "k1.ic7", 0x0000, 0x1000, CRC(0d18c581) SHA1(0e0f89d644b79e887c53e5294783843ca7e875ba) )
ROM_LOAD( "k2.ic8", 0x1000, 0x1000, CRC(5978d37a) SHA1(684c1092de4a0927a03752903c86c3bbe99e868a) )
ROM_LOAD( "k3.ic9", 0x2000, 0x1000, CRC(522d1097) SHA1(09fe627a46d32df2e098d9fad7757f9d61bef41f) )
@ -549,7 +788,7 @@ ROM_START( kangaroob )
// MB8841 at IC29 and 2716 at IC28 not populated
ROM_REGION( 0x4000, "gfx1", 0 )
ROM_REGION( 0x4000, "blitter", 0 )
ROM_LOAD( "k10.ic76", 0x0000, 0x1000, CRC(c0446ca6) SHA1(fca6ba565051337c0198c93b7b8477632e0dd0b6) )
ROM_LOAD( "k11.ic77", 0x1000, 0x1000, CRC(72c52695) SHA1(87f4715fbb7d509bd9cc4e71e2afb0d475bbac13) )
ROM_LOAD( "k8.ic52", 0x2000, 0x1000, CRC(e4cb26c2) SHA1(5016db9d48fdcfb757618659d063b90862eb0e90) )
@ -558,7 +797,7 @@ ROM_END
ROM_START( kangarool ) // runs on earlier revision TVG-1-CPU-A + TVG-1-VIDEO-A PCBs
ROM_REGION( 0x14000, "maincpu", 0 ) // only ic17 differs from the parent
ROM_REGION( 0x6000, "maincpu", 0 ) // only ic17 differs from the parent
ROM_LOAD( "tvg_75.ic7", 0x0000, 0x1000, CRC(0d18c581) SHA1(0e0f89d644b79e887c53e5294783843ca7e875ba) )
ROM_LOAD( "tvg_76.ic8", 0x1000, 0x1000, CRC(5978d37a) SHA1(684c1092de4a0927a03752903c86c3bbe99e868a) )
ROM_LOAD( "tvg_77.ic9", 0x2000, 0x1000, CRC(522d1097) SHA1(09fe627a46d32df2e098d9fad7757f9d61bef41f) )
@ -566,7 +805,7 @@ ROM_START( kangarool ) // runs on earlier revision TVG-1-CPU-A + TVG-1-VIDEO-A P
ROM_LOAD( "tvg_79.ic16", 0x4000, 0x1000, CRC(9e5cf8ca) SHA1(015387f038c5670f88c9b22453d074bd9b2a129d) )
ROM_LOAD( "tvg_80.ic17", 0x5000, 0x1000, CRC(62df0271) SHA1(4043d90d33ff04729077be7956d30bf82add103c) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_REGION( 0x1000, "audiocpu", 0 )
ROM_LOAD( "tvg_81.ic24", 0x0000, 0x1000, CRC(fb449bfd) SHA1(f593a0339f47e121736a927587132aeb52704557) )
ROM_REGION( 0x0800, "mcu", 0 ) // internal ROM from the 8841 custom MCU
@ -575,13 +814,15 @@ ROM_START( kangarool ) // runs on earlier revision TVG-1-CPU-A + TVG-1-VIDEO-A P
ROM_REGION( 0x0800, "user1", 0 ) // data for the 8841 custom MCU
ROM_LOAD( "tvg_82.ic28", 0x0000, 0x0800, CRC(57766f69) SHA1(94a7a557d8325799523d5e1a88653a9a3fbe34f9) )
ROM_REGION( 0x4000, "gfx1", 0 )
ROM_REGION( 0x4000, "blitter", 0 )
ROM_LOAD( "tvg_83.ic76", 0x0000, 0x1000, CRC(c0446ca6) SHA1(fca6ba565051337c0198c93b7b8477632e0dd0b6) )
ROM_LOAD( "tvg_85.ic77", 0x1000, 0x1000, CRC(72c52695) SHA1(87f4715fbb7d509bd9cc4e71e2afb0d475bbac13) )
ROM_LOAD( "tvg_84.ic52", 0x2000, 0x1000, CRC(e4cb26c2) SHA1(5016db9d48fdcfb757618659d063b90862eb0e90) )
ROM_LOAD( "tvg_86.ic53", 0x3000, 0x1000, CRC(9e6a599f) SHA1(76b4eddb4efcd8189d8cc5962d8497e82885f212) )
ROM_END
} // anonymous namespace
/*************************************
*
@ -589,8 +830,8 @@ ROM_END
*
*************************************/
GAME( 1981, fnkyfish, 0, nomcu, fnkyfish, kangaroo_state, empty_init, ROT90, "Sun Electronics", "Funky Fish", MACHINE_SUPPORTS_SAVE )
GAME( 1982, kangaroo, 0, mcu, kangaroo, kangaroo_state, empty_init, ROT90, "Sun Electronics", "Kangaroo", MACHINE_SUPPORTS_SAVE )
GAME( 1982, kangarooa, kangaroo, mcu, kangaroo, kangaroo_state, empty_init, ROT90, "Sun Electronics (Atari license)", "Kangaroo (Atari)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, kangaroob, kangaroo, nomcu, kangaroo, kangaroo_state, empty_init, ROT90, "bootleg", "Kangaroo (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, kangarool, kangaroo, mcu, kangaroo, kangaroo_state, empty_init, ROT90, "Sun Electronics (Loewen-Automaten license)", "Kangaroo (Loewen-Automaten)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, fnkyfish, 0, nomcu, fnkyfish, kangaroo_state, empty_init, ROT90, "Sun Electronics", "Funky Fish", MACHINE_SUPPORTS_SAVE )
GAME( 1982, kangaroo, 0, mcu, kangaroo, kangaroo_mcu_state, empty_init, ROT90, "Sun Electronics", "Kangaroo", MACHINE_SUPPORTS_SAVE )
GAME( 1982, kangarooa, kangaroo, mcu, kangaroo, kangaroo_mcu_state, empty_init, ROT90, "Sun Electronics (Atari license)", "Kangaroo (Atari)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, kangaroob, kangaroo, nomcu, kangaroo, kangaroo_state, empty_init, ROT90, "bootleg", "Kangaroo (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, kangarool, kangaroo, mcu, kangaroo, kangaroo_mcu_state, empty_init, ROT90, "Sun Electronics (Loewen-Automaten license)", "Kangaroo (Loewen-Automaten)", MACHINE_SUPPORTS_SAVE )

View File

@ -9,22 +9,147 @@ driver by Nicola Salmoria
***************************************************************************/
#include "emu.h"
#include "includes/shisen.h"
#include "audio/m72.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "machine/rstbuf.h"
#include "sound/ymopm.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
void shisen_state::shisen_map(address_map &map)
namespace {
class shisen_state : public driver_device
{
public:
shisen_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audio(*this, "m72"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_paletteram(*this, "paletteram"),
m_videoram(*this, "videoram"),
m_mainbank(*this, "mainbank"),
m_dsw2(*this, "DSW2")
{ }
void shisen(machine_config &config);
protected:
virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<m72_audio_device> m_audio;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_paletteram;
required_shared_ptr<uint8_t> m_videoram;
required_memory_bank m_mainbank;
required_ioport m_dsw2;
uint8_t m_gfxbank = 0;
tilemap_t *m_bg_tilemap = nullptr;
void coin_w(uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
void bankswitch_w(uint8_t data);
void paletteram_w(offs_t offset, uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_io_map(address_map &map);
void main_prg_map(address_map &map);
void sound_io_map(address_map &map);
void sound_prg_map(address_map &map);
};
// video
void shisen_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
void shisen_state::bankswitch_w(uint8_t data)
{
if (data & 0xc0) logerror("bank switch %02x\n", data);
// bits 0-2 select ROM bank
m_mainbank->set_entry(data & 0x07);
// bits 3-5 select gfx bank
int bank = (data & 0x38) >> 3;
if (m_gfxbank != bank)
{
m_gfxbank = bank;
machine().tilemap().mark_all_dirty();
}
// bits 6-7 unknown
}
void shisen_state::paletteram_w(offs_t offset, uint8_t data)
{
m_paletteram[offset] = data;
offset &= 0xff;
m_palette->set_pen_color(offset, pal5bit(m_paletteram[offset + 0x000]), pal5bit(m_paletteram[offset + 0x100]), pal5bit(m_paletteram[offset + 0x200]));
}
TILE_GET_INFO_MEMBER(shisen_state::get_bg_tile_info)
{
int offs = tile_index * 2;
int code = m_videoram[offs] + ((m_videoram[offs + 1] & 0x0f) << 8) + (m_gfxbank << 12);
int color = (m_videoram[offs + 1] & 0xf0) >> 4;
tileinfo.set(0, code, color, 0);
}
void shisen_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(shisen_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_mainbank->configure_entries(0, 8, memregion("maincpu")->base(), 0x4000);
save_item(NAME(m_gfxbank));
}
uint32_t shisen_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// on Irem boards, screen flip is handled in both hardware and software.
// this game doesn't have cocktail mode so if there's software control we don't know where it is mapped.
flip_screen_set(~m_dsw2->read() & 1);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
// machine
void shisen_state::main_prg_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("bank1");
map(0xc800, 0xcaff).ram().w(FUNC(shisen_state::paletteram_w)).share("paletteram");
map(0xd000, 0xdfff).ram().w(FUNC(shisen_state::videoram_w)).share("videoram");
map(0x8000, 0xbfff).bankr(m_mainbank);
map(0xc800, 0xcaff).ram().w(FUNC(shisen_state::paletteram_w)).share(m_paletteram);
map(0xd000, 0xdfff).ram().w(FUNC(shisen_state::videoram_w)).share(m_videoram);
map(0xe000, 0xffff).ram();
}
@ -37,7 +162,7 @@ void shisen_state::coin_w(uint8_t data)
machine().bookkeeping().coin_counter_w(1, data & 0x04);
}
void shisen_state::shisen_io_map(address_map &map)
void shisen_state::main_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).portr("DSW1").w(FUNC(shisen_state::coin_w));
@ -48,13 +173,13 @@ void shisen_state::shisen_io_map(address_map &map)
}
void shisen_state::shisen_sound_map(address_map &map)
void shisen_state::sound_prg_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0xfd00, 0xffff).ram();
}
void shisen_state::shisen_sound_io_map(address_map &map)
void shisen_state::sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x01).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
@ -152,7 +277,7 @@ static INPUT_PORTS_START( shisen )
PORT_DIPNAME( 0x10, 0x10, "Women Select" ) PORT_DIPLOCATION("SW2:5")
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
/* In stop mode, press 2 to stop and 1 to restart */
// In stop mode, press 2 to stop and 1 to restart
PORT_DIPNAME( 0x20, 0x20, "Stop Mode (Cheat)") PORT_DIPLOCATION("SW2:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@ -188,27 +313,27 @@ static const gfx_layout charlayout =
static GFXDECODE_START( gfx_shisen )
GFXDECODE_ENTRY( "gfx1", 0x00000, charlayout, 0, 16 )
GFXDECODE_ENTRY( "tiles", 0x00000, charlayout, 0, 16 )
GFXDECODE_END
void shisen_state::shisen(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 3.579545_MHz_XTAL ); /* Verified on PCB */
m_maincpu->set_addrmap(AS_PROGRAM, &shisen_state::shisen_map);
m_maincpu->set_addrmap(AS_IO, &shisen_state::shisen_io_map);
// basic machine hardware
Z80(config, m_maincpu, 3.579545_MHz_XTAL ); // Verified on PCB
m_maincpu->set_addrmap(AS_PROGRAM, &shisen_state::main_prg_map);
m_maincpu->set_addrmap(AS_IO, &shisen_state::main_io_map);
m_maincpu->set_vblank_int("screen", FUNC(shisen_state::irq0_line_hold));
z80_device &soundcpu(Z80(config, "soundcpu", 3.579545_MHz_XTAL )); /* Verified on PCB */
soundcpu.set_addrmap(AS_PROGRAM, &shisen_state::shisen_sound_map);
soundcpu.set_addrmap(AS_IO, &shisen_state::shisen_sound_io_map);
soundcpu.set_periodic_int(FUNC(shisen_state::nmi_line_pulse), attotime::from_hz(128*55)); /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
z80_device &soundcpu(Z80(config, "soundcpu", 3.579545_MHz_XTAL )); // Verified on PCB
soundcpu.set_addrmap(AS_PROGRAM, &shisen_state::sound_prg_map);
soundcpu.set_addrmap(AS_IO, &shisen_state::sound_io_map);
soundcpu.set_periodic_int(FUNC(shisen_state::nmi_line_pulse), attotime::from_hz(128*55)); // clocked by V1? (Vigilante)
// IRQs are generated by main Z80 and YM2151
soundcpu.set_irq_acknowledge_callback("soundirq", FUNC(rst_neg_buffer_device::inta_cb));
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(55);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@ -220,7 +345,7 @@ void shisen_state::shisen(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_shisen);
PALETTE(config, m_palette).set_entries(256);
/* sound hardware */
// sound hardware
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@ -233,7 +358,7 @@ void shisen_state::shisen(machine_config &config)
IREM_M72_AUDIO(config, m_audio);
m_audio->set_dac_tag("dac");
ym2151_device &ymsnd(YM2151(config, "ymsnd", 3.579545_MHz_XTAL )); /* Verified on PCB */
ym2151_device &ymsnd(YM2151(config, "ymsnd", 3.579545_MHz_XTAL )); // Verified on PCB
ymsnd.irq_handler().set("soundirq", FUNC(rst_neg_buffer_device::rst28_w));
ymsnd.add_route(0, "lspeaker", 0.5);
ymsnd.add_route(1, "rspeaker", 0.5);
@ -250,15 +375,14 @@ void shisen_state::shisen(machine_config &config)
***************************************************************************/
ROM_START( sichuan2 )
ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k+128k for main CPU */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "6.11d", 0x00000, 0x10000, CRC(98a2459b) SHA1(42102cf2921f80be7600b11aba63538e3b3858ec) )
ROM_RELOAD( 0x10000, 0x10000 )
ROM_LOAD( "7.11c", 0x20000, 0x10000, CRC(0350f6e2) SHA1(c683571969c0e4c66eb316a1bc580759db02bbfc) )
ROM_LOAD( "7.11c", 0x10000, 0x10000, CRC(0350f6e2) SHA1(c683571969c0e4c66eb316a1bc580759db02bbfc) )
ROM_REGION( 0x10000, "soundcpu", 0 )
ROM_LOAD( "1.2c", 0x00000, 0x10000, CRC(51b0a26c) SHA1(af2482cfe8d395848c8e1bf07bf1049ffc6ee69b) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD( "8.3j", 0x00000, 0x10000, CRC(1c0e221c) SHA1(87561f7dabf25309be784e797ac237aa3956ea1c) )
ROM_LOAD( "9.4j", 0x10000, 0x10000, CRC(8a7d8284) SHA1(56b5d352b506c5bfab24102b11c877dd28c8ad36) )
ROM_LOAD( "12.1l", 0x20000, 0x10000, CRC(48e1d043) SHA1(4fbd409aff593c0b27fc58c218a470adf48ee0b7) )
@ -276,7 +400,7 @@ ROM_START( sichuan2 )
ROM_LOAD( "11.6j", 0xe0000, 0x10000, CRC(473b349a) SHA1(9f5d08e07c8175bc7ec3854499177af2c398bd76) )
ROM_LOAD( "10.5j", 0xf0000, 0x10000, CRC(d9a60285) SHA1(f8ef211e022e9c8ea25f6d8fb16266867656a591) )
ROM_REGION( 0x40000, "m72", 0 ) /* samples */
ROM_REGION( 0x40000, "m72", 0 ) // samples
ROM_LOAD( "2.7b", 0x00000, 0x10000, CRC(92f0093d) SHA1(530b924aa991283045577d03524dfc7eacf1be49) )
ROM_LOAD( "3.6c", 0x10000, 0x10000, CRC(116a049c) SHA1(656c0d1d7f945c5f5637892721a58421b682fd01) )
ROM_LOAD( "4.7c", 0x20000, 0x10000, CRC(6840692b) SHA1(f6f7b063ecf7206e172843515be38376f8845b42) )
@ -289,15 +413,14 @@ ROM_START( sichuan2 )
ROM_END
ROM_START( sichuan2a )
ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k+128k for main CPU */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "sichuan.a6", 0x00000, 0x10000, CRC(f8ac05ef) SHA1(cd20e5239d73264f1323ba6b1e35934685852ba1) )
ROM_RELOAD( 0x10000, 0x10000 )
ROM_LOAD( "ic07.03", 0x20000, 0x10000, CRC(0350f6e2) SHA1(c683571969c0e4c66eb316a1bc580759db02bbfc) )
ROM_LOAD( "ic07.03", 0x10000, 0x10000, CRC(0350f6e2) SHA1(c683571969c0e4c66eb316a1bc580759db02bbfc) )
ROM_REGION( 0x10000, "soundcpu", 0 )
ROM_LOAD( "ic01.01", 0x00000, 0x10000, CRC(51b0a26c) SHA1(af2482cfe8d395848c8e1bf07bf1049ffc6ee69b) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD( "ic08.04", 0x00000, 0x10000, CRC(1c0e221c) SHA1(87561f7dabf25309be784e797ac237aa3956ea1c) )
ROM_LOAD( "ic09.05", 0x10000, 0x10000, CRC(8a7d8284) SHA1(56b5d352b506c5bfab24102b11c877dd28c8ad36) )
ROM_LOAD( "ic12.08", 0x20000, 0x10000, CRC(48e1d043) SHA1(4fbd409aff593c0b27fc58c218a470adf48ee0b7) )
@ -315,7 +438,7 @@ ROM_START( sichuan2a )
ROM_LOAD( "ic10.06", 0xe0000, 0x10000, CRC(473b349a) SHA1(9f5d08e07c8175bc7ec3854499177af2c398bd76) )
ROM_LOAD( "ic11.07", 0xf0000, 0x10000, CRC(d9a60285) SHA1(f8ef211e022e9c8ea25f6d8fb16266867656a591) )
ROM_REGION( 0x40000, "m72", 0 ) /* samples */
ROM_REGION( 0x40000, "m72", 0 ) // samples
ROM_LOAD( "ic02.02", 0x00000, 0x10000, CRC(92f0093d) SHA1(530b924aa991283045577d03524dfc7eacf1be49) )
ROM_LOAD( "ic03.03", 0x10000, 0x10000, CRC(116a049c) SHA1(656c0d1d7f945c5f5637892721a58421b682fd01) )
ROM_LOAD( "ic04.04", 0x20000, 0x10000, CRC(6840692b) SHA1(f6f7b063ecf7206e172843515be38376f8845b42) )
@ -323,14 +446,13 @@ ROM_START( sichuan2a )
ROM_END
ROM_START( shisen )
ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k+128k for main CPU */
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "a-27-a.rom", 0x00000, 0x20000, CRC(de2ecf05) SHA1(7256c5587f92db10a52c43001e3236f3be3df5df) )
ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x10000, "soundcpu", 0 )
ROM_LOAD( "ic01.01", 0x00000, 0x10000, CRC(51b0a26c) SHA1(af2482cfe8d395848c8e1bf07bf1049ffc6ee69b) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD( "ic08.04", 0x00000, 0x10000, CRC(1c0e221c) SHA1(87561f7dabf25309be784e797ac237aa3956ea1c) )
ROM_LOAD( "ic09.05", 0x10000, 0x10000, CRC(8a7d8284) SHA1(56b5d352b506c5bfab24102b11c877dd28c8ad36) )
ROM_LOAD( "ic12.08", 0x20000, 0x10000, CRC(48e1d043) SHA1(4fbd409aff593c0b27fc58c218a470adf48ee0b7) )
@ -348,7 +470,7 @@ ROM_START( shisen )
ROM_LOAD( "ic10.06", 0xe0000, 0x10000, CRC(473b349a) SHA1(9f5d08e07c8175bc7ec3854499177af2c398bd76) )
ROM_LOAD( "ic11.07", 0xf0000, 0x10000, CRC(d9a60285) SHA1(f8ef211e022e9c8ea25f6d8fb16266867656a591) )
ROM_REGION( 0x40000, "m72", 0 ) /* samples */
ROM_REGION( 0x40000, "m72", 0 ) // samples
ROM_LOAD( "ic02.02", 0x00000, 0x10000, CRC(92f0093d) SHA1(530b924aa991283045577d03524dfc7eacf1be49) )
ROM_LOAD( "ic03.03", 0x10000, 0x10000, CRC(116a049c) SHA1(656c0d1d7f945c5f5637892721a58421b682fd01) )
ROM_LOAD( "ic04.04", 0x20000, 0x10000, CRC(6840692b) SHA1(f6f7b063ecf7206e172843515be38376f8845b42) )
@ -395,15 +517,14 @@ ROMs : (All ROMs type 27C512)
*/
ROM_START( matchit )
ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k+128k for main CPU */
ROM_LOAD( "2.11d", 0x00000, 0x10000, CRC(299815f7) SHA1(dd25f69d3c825e12e5c2e24b5bbfda9c39400345) )
ROM_RELOAD( 0x10000, 0x10000 )
ROM_LOAD( "ic07.03", 0x20000, 0x10000, CRC(0350f6e2) SHA1(c683571969c0e4c66eb316a1bc580759db02bbfc) )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "2.11d", 0x00000, 0x10000, CRC(299815f7) SHA1(dd25f69d3c825e12e5c2e24b5bbfda9c39400345) )
ROM_LOAD( "ic07.03", 0x10000, 0x10000, CRC(0350f6e2) SHA1(c683571969c0e4c66eb316a1bc580759db02bbfc) )
ROM_REGION( 0x10000, "soundcpu", 0 )
ROM_LOAD( "ic01.01", 0x00000, 0x10000, CRC(51b0a26c) SHA1(af2482cfe8d395848c8e1bf07bf1049ffc6ee69b) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD( "ic08.04", 0x00000, 0x10000, CRC(1c0e221c) SHA1(87561f7dabf25309be784e797ac237aa3956ea1c) )
ROM_LOAD( "ic09.05", 0x10000, 0x10000, CRC(8a7d8284) SHA1(56b5d352b506c5bfab24102b11c877dd28c8ad36) )
ROM_LOAD( "ic12.08", 0x20000, 0x10000, CRC(48e1d043) SHA1(4fbd409aff593c0b27fc58c218a470adf48ee0b7) )
@ -421,10 +542,13 @@ ROM_START( matchit )
ROM_LOAD( "ic10.06", 0xe0000, 0x10000, CRC(473b349a) SHA1(9f5d08e07c8175bc7ec3854499177af2c398bd76) )
ROM_LOAD( "ic11.07", 0xf0000, 0x10000, CRC(d9a60285) SHA1(f8ef211e022e9c8ea25f6d8fb16266867656a591) )
ROM_REGION( 0x40000, "m72", ROMREGION_ERASE00 ) /* samples */
/* no samples on this board */
ROM_REGION( 0x40000, "m72", ROMREGION_ERASE00 ) // samples
// no samples on this board
ROM_END
} // anonymous namespace
GAME( 1989, matchit, 0, shisen, matchit, shisen_state, empty_init, ROT0, "Tamtex", "Match It", MACHINE_SUPPORTS_SAVE )
GAME( 1989, shisen, matchit, shisen, shisen, shisen_state, empty_init, ROT0, "Tamtex", "Shisensho - Joshiryo-Hen (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, sichuan2, matchit, shisen, shisen, shisen_state, empty_init, ROT0, "hack", "Sichuan II (hack, set 1)", MACHINE_SUPPORTS_SAVE )

View File

@ -10,21 +10,359 @@ Driver by Manuel Abadia <emumanu+mame@gmail.com>
Notes:
-----
- Sky Kid sets:
There are 2 basic versions, one with CUS63 and rom prefix "SK2" and
the other which uses CUS60 and has the rom prefix "SK1"
There are 2 basic versions, one with CUS63 and ROM prefix "SK2" and
the other which uses CUS60 and has the ROM prefix "SK1"
***************************************************************************/
#include "emu.h"
#include "includes/skykid.h"
#include "cpu/m6800/m6801.h"
#include "cpu/m6809/m6809.h"
#include "machine/watchdog.h"
#include "sound/namco.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class skykid_state : public driver_device
{
public:
skykid_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_videoram(*this, "videoram")
, m_textram(*this, "textram")
, m_spriteram(*this, "spriteram")
, m_rombank(*this, "rombank")
, m_maincpu(*this, "maincpu")
, m_mcu(*this, "mcu")
, m_cus30(*this, "namco")
, m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette")
, m_dsw(*this, { "DSWA", "DSWB" })
, m_pl(*this, "P%u", 1U)
, m_button2(*this, "BUTTON2")
, m_system(*this, "SYSTEM")
, m_leds(*this, "led%u", 0U)
{ }
void skykid(machine_config &config);
void init_skykid();
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_textram;
required_shared_ptr<uint8_t> m_spriteram;
required_memory_bank m_rombank;
required_device<cpu_device> m_maincpu;
required_device<hd63701v0_cpu_device> m_mcu;
required_device<namco_cus30_device> m_cus30;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_ioport_array<2> m_dsw;
required_ioport_array<2> m_pl;
required_ioport m_button2;
required_ioport m_system;
output_finder<2> m_leds;
tilemap_t *m_bg_tilemap = nullptr;
tilemap_t *m_tx_tilemap = nullptr;
uint8_t m_priority = 0;
uint16_t m_scroll_x = 0;
uint16_t m_scroll_y = 0;
uint8_t m_main_irq_mask = 0;
uint8_t m_mcu_irq_mask = 0;
uint8_t m_inputport_selected = 0;
void inputport_select_w(uint8_t data);
uint8_t inputport_r();
void led_w(uint8_t data);
void subreset_w(offs_t offset, uint8_t data);
void bankswitch_w(offs_t offset, uint8_t data);
void irq_1_ctrl_w(offs_t offset, uint8_t data);
void irq_2_ctrl_w(offs_t offset, uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
void textram_w(offs_t offset, uint8_t data);
void scroll_x_w(offs_t offset, uint8_t data);
void scroll_y_w(offs_t offset, uint8_t data);
void flipscreen_priority_w(offs_t offset, uint8_t data);
TILEMAP_MAPPER_MEMBER(tx_tilemap_scan);
TILE_GET_INFO_MEMBER(tx_get_tile_info);
TILE_GET_INFO_MEMBER(bg_get_tile_info);
void palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
void mcu_map(address_map &map);
void main_map(address_map &map);
};
// video
/***************************************************************************
Convert the color PROMs.
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 skykid_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 < 0x100; i++)
{
int const r = pal4bit(color_prom[i + 0x000]);
int const g = pal4bit(color_prom[i + 0x100]);
int const 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;
// text palette
for (int i = 0; i < 0x100; i++)
palette.set_pen_indirect(i, i);
// tiles/sprites
for (int i = 0x100; i < 0x500; i++)
{
uint8_t const ctabentry = color_prom[i - 0x100];
palette.set_pen_indirect(i, ctabentry);
}
}
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
// convert from 32x32 to 36x28
TILEMAP_MAPPER_MEMBER(skykid_state::tx_tilemap_scan)
{
int offs;
row += 2;
col -= 2;
if (col & 0x20)
offs = row + ((col & 0x1f) << 5);
else
offs = col + (row << 5);
return offs;
}
TILE_GET_INFO_MEMBER(skykid_state::tx_get_tile_info)
{
int code = m_textram[tile_index];
int attr = m_textram[tile_index + 0x400];
tileinfo.category = code >> 4 & 0xf;
/* the hardware has two character sets, one normal and one flipped. When
screen is flipped, character flip is done by selecting the 2nd character set.
We reproduce this here, but since the tilemap system automatically flips
characters when screen is flipped, we have to flip them back. */
tileinfo.set(0,
code | (flip_screen() ? 0x100 : 0),
attr & 0x3f,
flip_screen() ? (TILE_FLIPY | TILE_FLIPX) : 0);
}
TILE_GET_INFO_MEMBER(skykid_state::bg_get_tile_info)
{
int code = m_videoram[tile_index];
int attr = m_videoram[tile_index + 0x800];
tileinfo.set(1,
code + ((attr & 0x01) << 8),
((attr & 0x7e) >> 1) | ((attr & 0x01) << 6),
0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void skykid_state::video_start()
{
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(skykid_state::tx_get_tile_info)), tilemap_mapper_delegate(*this, FUNC(skykid_state::tx_tilemap_scan)), 8,8, 36,28);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(skykid_state::bg_get_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 64,32);
m_tx_tilemap->set_transparent_pen(0);
save_item(NAME(m_priority));
save_item(NAME(m_scroll_x));
save_item(NAME(m_scroll_y));
}
/***************************************************************************
Memory handlers
***************************************************************************/
void skykid_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
void skykid_state::textram_w(offs_t offset, uint8_t data)
{
m_textram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset & 0x3ff);
}
void skykid_state::scroll_x_w(offs_t offset, uint8_t data)
{
m_scroll_x = offset;
}
void skykid_state::scroll_y_w(offs_t offset, uint8_t data)
{
m_scroll_y = offset;
}
void skykid_state::flipscreen_priority_w(offs_t offset, uint8_t data)
{
m_priority = data;
flip_screen_set(offset & 1);
}
/***************************************************************************
Display Refresh
***************************************************************************/
// the sprite generator IC is the same as Mappy
void skykid_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
{
uint8_t *spriteram = m_spriteram + 0x780;
uint8_t *spriteram_2 = spriteram + 0x0800;
uint8_t *spriteram_3 = spriteram_2 + 0x0800;
for (int offs = 0; offs < 0x80; offs += 2)
{
static const int gfx_offs[2][2] =
{
{ 0, 1 },
{ 2, 3 }
};
int sprite = spriteram[offs] + ((spriteram_3[offs] & 0x80) << 1);
int color = (spriteram[offs + 1] & 0x3f);
int sx = (spriteram_2[offs + 1]) + 0x100 * (spriteram_3[offs + 1] & 1) - 71;
int sy = 256 - spriteram_2[offs] - 7;
int flipx = (spriteram_3[offs] & 0x01);
int flipy = (spriteram_3[offs] & 0x02) >> 1;
int sizex = (spriteram_3[offs] & 0x04) >> 2;
int sizey = (spriteram_3[offs] & 0x08) >> 3;
sprite &= ~sizex;
sprite &= ~(sizey << 1);
if (flip_screen())
{
flipx ^= 1;
flipy ^= 1;
}
sy -= 16 * sizey;
sy = (sy & 0xff) - 32; // fix wraparound
for (int y = 0; y <= sizey; y++)
{
for (int x = 0; x <= sizex; x++)
{
m_gfxdecode->gfx(2)->transmask(bitmap, cliprect,
sprite + gfx_offs[y ^ (sizey * flipy)][x ^ (sizex * flipx)],
color,
flipx, flipy,
sx + 16 * x, sy + 16 * y,
m_palette->transpen_mask(*m_gfxdecode->gfx(2), color, 0xff));
}
}
}
}
uint32_t skykid_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
if (flip_screen())
{
m_bg_tilemap->set_scrollx(0, 189 - (m_scroll_x ^ 1));
m_bg_tilemap->set_scrolly(0, 7 - m_scroll_y);
}
else
{
m_bg_tilemap->set_scrollx(0, m_scroll_x + 35);
m_bg_tilemap->set_scrolly(0, m_scroll_y + 25);
}
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
if (m_priority & 0x04)
{
// textlayer priority enabled?
int pri = m_priority >> 4;
// draw low priority tiles
m_tx_tilemap->draw(screen, bitmap, cliprect, pri, 0);
draw_sprites(bitmap, cliprect);
// draw the other tiles
for (int cat = 0; cat < 0x10; cat++)
if (cat != pri) m_tx_tilemap->draw(screen, bitmap, cliprect, cat, 0);
}
else
{
draw_sprites(bitmap, cliprect);
m_tx_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_ALL_CATEGORIES, 0);
}
return 0;
}
// machine
void skykid_state::inputport_select_w(uint8_t data)
{
if ((data & 0xe0) == 0x60)
@ -32,8 +370,8 @@ void skykid_state::inputport_select_w(uint8_t data)
else if ((data & 0xe0) == 0xc0)
{
machine().bookkeeping().coin_lockout_global_w(~data & 1);
machine().bookkeeping().coin_counter_w(0,data & 2);
machine().bookkeeping().coin_counter_w(1,data & 4);
machine().bookkeeping().coin_counter_w(0, data & 2);
machine().bookkeeping().coin_counter_w(1, data & 4);
}
}
@ -41,53 +379,53 @@ uint8_t skykid_state::inputport_r()
{
switch (m_inputport_selected)
{
case 0x00: /* DSW B (bits 0-4) */
return (ioport("DSWB")->read() & 0xf8) >> 3;
case 0x01: /* DSW B (bits 5-7), DSW A (bits 0-1) */
return ((ioport("DSWB")->read() & 0x07) << 2) | ((ioport("DSWA")->read() & 0xc0) >> 6);
case 0x02: /* DSW A (bits 2-6) */
return (ioport("DSWA")->read() & 0x3e) >> 1;
case 0x03: /* DSW A (bit 7), DSW C (bits 0-3) */
return ((ioport("DSWA")->read() & 0x01) << 4) | (ioport("BUTTON2")->read() & 0x0f);
case 0x04: /* coins, start */
return ioport("SYSTEM")->read();
case 0x05: /* 2P controls */
return ioport("P2")->read();
case 0x06: /* 1P controls */
return ioport("P1")->read();
case 0x00: // DSW B (bits 0-4)
return (m_dsw[1]->read() & 0xf8) >> 3;
case 0x01: // DSW B (bits 5-7), DSW A (bits 0-1)
return ((m_dsw[1]->read() & 0x07) << 2) | ((m_dsw[0]->read() & 0xc0) >> 6);
case 0x02: // DSW A (bits 2-6)
return (m_dsw[0]->read() & 0x3e) >> 1;
case 0x03: // DSW A (bit 7), DSW C (bits 0-3)
return ((m_dsw[0]->read() & 0x01) << 4) | (m_button2->read() & 0x0f);
case 0x04: // coins, start
return m_system->read();
case 0x05: // 2P controls
return m_pl[1]->read();
case 0x06: // 1P controls
return m_pl[0]->read();
default:
return 0xff;
}
}
void skykid_state::skykid_led_w(uint8_t data)
void skykid_state::led_w(uint8_t data)
{
m_leds[0] = BIT(data, 3);
m_leds[1] = BIT(data, 4);
}
void skykid_state::skykid_subreset_w(offs_t offset, uint8_t data)
void skykid_state::subreset_w(offs_t offset, uint8_t data)
{
int bit = !BIT(offset,11);
int bit = !BIT(offset, 11);
m_mcu->set_input_line(INPUT_LINE_RESET, bit ? CLEAR_LINE : ASSERT_LINE);
}
void skykid_state::skykid_bankswitch_w(offs_t offset, uint8_t data)
void skykid_state::bankswitch_w(offs_t offset, uint8_t data)
{
membank("bank1")->set_entry(!BIT(offset,11));
m_rombank->set_entry(!BIT(offset, 11));
}
void skykid_state::skykid_irq_1_ctrl_w(offs_t offset, uint8_t data)
void skykid_state::irq_1_ctrl_w(offs_t offset, uint8_t data)
{
int bit = !BIT(offset,11);
int bit = !BIT(offset, 11);
m_main_irq_mask = bit;
if (!bit)
m_maincpu->set_input_line(0, CLEAR_LINE);
}
void skykid_state::skykid_irq_2_ctrl_w(offs_t offset, uint8_t data)
void skykid_state::irq_2_ctrl_w(offs_t offset, uint8_t data)
{
int bit = !BIT(offset,13);
int bit = !BIT(offset, 13);
m_mcu_irq_mask = bit;
if (!bit)
m_mcu->set_input_line(0, CLEAR_LINE);
@ -97,38 +435,38 @@ void skykid_state::machine_start()
{
m_leds.resolve();
/* configure the banks */
membank("bank1")->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x2000);
// configure the banks
m_rombank->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x2000);
save_item(NAME(m_inputport_selected));
}
void skykid_state::skykid_map(address_map &map)
void skykid_state::main_map(address_map &map)
{
map(0x0000, 0x1fff).bankr("bank1"); /* banked ROM */
map(0x2000, 0x2fff).rw(FUNC(skykid_state::skykid_videoram_r), FUNC(skykid_state::skykid_videoram_w)).share("videoram");/* Video RAM (background) */
map(0x4000, 0x47ff).rw(FUNC(skykid_state::skykid_textram_r), FUNC(skykid_state::skykid_textram_w)).share("textram"); /* video RAM (text layer) */
map(0x4800, 0x5fff).ram().share("spriteram"); /* RAM + Sprite RAM */
map(0x6000, 0x60ff).w(FUNC(skykid_state::skykid_scroll_y_w)); /* Y scroll register map */
map(0x6200, 0x63ff).w(FUNC(skykid_state::skykid_scroll_x_w)); /* X scroll register map */
map(0x6800, 0x6bff).rw(m_cus30, FUNC(namco_cus30_device::namcos1_cus30_r), FUNC(namco_cus30_device::namcos1_cus30_w)); /* PSG device, shared RAM */
map(0x7000, 0x7fff).w(FUNC(skykid_state::skykid_irq_1_ctrl_w)); /* IRQ control */
map(0x0000, 0x1fff).bankr(m_rombank);
map(0x2000, 0x2fff).ram().w(FUNC(skykid_state::videoram_w)).share(m_videoram); // background
map(0x4000, 0x47ff).ram().w(FUNC(skykid_state::textram_w)).share(m_textram);
map(0x4800, 0x5fff).ram().share(m_spriteram);
map(0x6000, 0x60ff).w(FUNC(skykid_state::scroll_y_w));
map(0x6200, 0x63ff).w(FUNC(skykid_state::scroll_x_w));
map(0x6800, 0x6bff).rw(m_cus30, FUNC(namco_cus30_device::namcos1_cus30_r), FUNC(namco_cus30_device::namcos1_cus30_w)); // PSG device, shared RAM
map(0x7000, 0x7fff).w(FUNC(skykid_state::irq_1_ctrl_w));
map(0x7800, 0x7fff).r("watchdog", FUNC(watchdog_timer_device::reset_r));
map(0x8000, 0xffff).rom(); /* ROM */
map(0x8000, 0x8fff).w(FUNC(skykid_state::skykid_subreset_w)); /* MCU control */
map(0x9000, 0x9fff).w(FUNC(skykid_state::skykid_bankswitch_w)); /* Bankswitch control */
map(0xa000, 0xa001).w(FUNC(skykid_state::skykid_flipscreen_priority_w)); /* flip screen & priority */
map(0x8000, 0xffff).rom();
map(0x8000, 0x8fff).w(FUNC(skykid_state::subreset_w));
map(0x9000, 0x9fff).w(FUNC(skykid_state::bankswitch_w));
map(0xa000, 0xa001).w(FUNC(skykid_state::flipscreen_priority_w));
}
void skykid_state::mcu_map(address_map &map)
{
map(0x0000, 0x001f).m(m_mcu, FUNC(hd63701v0_cpu_device::m6801_io));
map(0x0080, 0x00ff).ram();
map(0x1000, 0x13ff).rw(m_cus30, FUNC(namco_cus30_device::namcos1_cus30_r), FUNC(namco_cus30_device::namcos1_cus30_w)); /* PSG device, shared RAM */
map(0x2000, 0x3fff).w("watchdog", FUNC(watchdog_timer_device::reset_w)); /* watchdog? */
map(0x4000, 0x7fff).w(FUNC(skykid_state::skykid_irq_2_ctrl_w));
map(0x1000, 0x13ff).rw(m_cus30, FUNC(namco_cus30_device::namcos1_cus30_r), FUNC(namco_cus30_device::namcos1_cus30_w)); // PSG device, shared RAM/
map(0x2000, 0x3fff).w("watchdog", FUNC(watchdog_timer_device::reset_w)); // ?
map(0x4000, 0x7fff).w(FUNC(skykid_state::irq_2_ctrl_w));
map(0x8000, 0xbfff).rom();
map(0xc000, 0xc7ff).ram();
map(0xf000, 0xffff).rom();
@ -137,7 +475,7 @@ void skykid_state::mcu_map(address_map &map)
static INPUT_PORTS_START( skykid )
PORT_START("DSWA") /* DSW A */
PORT_START("DSWA") // DSW A
PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:3,2")
PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
@ -159,7 +497,7 @@ static INPUT_PORTS_START( skykid )
PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
PORT_START("DSWB") /* DSW B */
PORT_START("DSWB") // DSW B
PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWB:2,1")
PORT_DIPSETTING( 0x80, "1" )
PORT_DIPSETTING( 0x40, "2" )
@ -186,7 +524,7 @@ static INPUT_PORTS_START( skykid )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("SYSTEM") /* IN 0 */
PORT_START("SYSTEM") // IN 0
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 )
@ -194,7 +532,7 @@ static INPUT_PORTS_START( skykid )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("P1") /* IN 1 */
PORT_START("P1") // IN 1
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
@ -202,7 +540,7 @@ static INPUT_PORTS_START( skykid )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("P2") /* IN 2 */
PORT_START("P2") // IN 2
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
@ -212,82 +550,23 @@ static INPUT_PORTS_START( skykid )
INPUT_PORTS_END
static INPUT_PORTS_START( skykids )
PORT_START("DSWA") /* DSW A */
PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:3,2")
PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x60, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:4")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_INCLUDE( skykid )
PORT_MODIFY("DSWA") // DSW A
PORT_DIPNAME( 0x08, 0x08, "Round Select" ) PORT_DIPLOCATION("SWA:5")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "Freeze" ) PORT_DIPLOCATION("SWA:6")
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:8,7")
PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
PORT_START("DSWB") /* DSW B */
PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWB:2,1")
PORT_DIPSETTING( 0x80, "1" )
PORT_DIPSETTING( 0x40, "2" )
PORT_DIPSETTING( 0xc0, "3" )
PORT_DIPSETTING( 0x00, "5" )
PORT_MODIFY("DSWB") // DSW B
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SWB:4,3")
PORT_DIPSETTING( 0x00, "30k every 80k" )
PORT_DIPSETTING( 0x10, "30k and 80k" )
PORT_DIPSETTING( 0x20, "40k every 90k" )
PORT_DIPSETTING( 0x30, "40k and 90k" )
PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SWB:5" )
PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SWB:6" )
PORT_DIPNAME( 0x02, 0x02, "Allow Buy In" ) PORT_DIPLOCATION("SWB:7")
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x02, DEF_STR( Yes ) )
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWB:8")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("BUTTON2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("SYSTEM") /* IN 0 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("P1") /* IN 1 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("P2") /* IN 2 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) 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( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
static INPUT_PORTS_START( drgnbstr )
PORT_START("DSWA") /* DSW A */
PORT_START("DSWA") // DSW A
PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" )
PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:3,2")
PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
@ -309,7 +588,7 @@ static INPUT_PORTS_START( drgnbstr )
PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
PORT_START("DSWB") /* DSW B */
PORT_START("DSWB") // DSW B
PORT_DIPNAME( 0x80, 0x80, "Spurt Time" ) PORT_DIPLOCATION("SWB:1")
PORT_DIPSETTING( 0x80, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x00, DEF_STR( Difficult ) )
@ -342,7 +621,7 @@ static INPUT_PORTS_START( drgnbstr )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("SYSTEM") /* IN 0 */
PORT_START("SYSTEM") // IN 0
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 )
@ -350,7 +629,7 @@ static INPUT_PORTS_START( drgnbstr )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("P1") /* IN 1 */
PORT_START("P1") // IN 1
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
@ -358,7 +637,7 @@ static INPUT_PORTS_START( drgnbstr )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("P2") /* IN 2 */
PORT_START("P2") // IN 2
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL
@ -405,9 +684,9 @@ static const gfx_layout sprite_layout =
};
static GFXDECODE_START( gfx_skykid )
GFXDECODE_ENTRY( "gfx1", 0, text_layout, 0, 64 )
GFXDECODE_ENTRY( "gfx2", 0, tile_layout, 64*4, 128 )
GFXDECODE_ENTRY( "gfx3", 0, sprite_layout, 64*4+128*4, 64 )
GFXDECODE_ENTRY( "chars", 0, text_layout, 0, 64 )
GFXDECODE_ENTRY( "tiles", 0, tile_layout, 64*4, 128 )
GFXDECODE_ENTRY( "sprites", 0, sprite_layout, 64*4+128*4, 64 )
GFXDECODE_END
@ -423,200 +702,200 @@ WRITE_LINE_MEMBER(skykid_state::vblank_irq)
void skykid_state::skykid(machine_config &config)
{
/* basic machine hardware */
MC6809E(config, m_maincpu, XTAL(49'152'000)/32);
m_maincpu->set_addrmap(AS_PROGRAM, &skykid_state::skykid_map);
// basic machine hardware
MC6809E(config, m_maincpu, XTAL(49'152'000) / 32);
m_maincpu->set_addrmap(AS_PROGRAM, &skykid_state::main_map);
HD63701V0(config, m_mcu, XTAL(49'152'000)/8); /* or compatible 6808 with extra instructions */
HD63701V0(config, m_mcu, XTAL(49'152'000) / 8); // or compatible 6808 with extra instructions
m_mcu->set_addrmap(AS_PROGRAM, &skykid_state::mcu_map);
m_mcu->in_p1_cb().set(FUNC(skykid_state::inputport_r)); /* input ports read */
m_mcu->out_p1_cb().set(FUNC(skykid_state::inputport_select_w)); /* input port select */
m_mcu->in_p2_cb().set_constant(0xff); /* leds won't work otherwise */
m_mcu->out_p2_cb().set(FUNC(skykid_state::skykid_led_w)); /* lamps */
m_mcu->in_p1_cb().set(FUNC(skykid_state::inputport_r));
m_mcu->out_p1_cb().set(FUNC(skykid_state::inputport_select_w));
m_mcu->in_p2_cb().set_constant(0xff); // leds won't work otherwise
m_mcu->out_p2_cb().set(FUNC(skykid_state::led_w));
config.set_maximum_quantum(attotime::from_hz(6000)); /* we need heavy synch */
config.set_maximum_quantum(attotime::from_hz(6000)); // we need heavy synch
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60.606060);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(36*8, 28*8);
screen.set_visarea(0*8, 36*8-1, 0*8, 28*8-1);
screen.set_screen_update(FUNC(skykid_state::screen_update_skykid));
screen.set_screen_update(FUNC(skykid_state::screen_update));
screen.set_palette(m_palette);
screen.screen_vblank().set(FUNC(skykid_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_skykid);
PALETTE(config, m_palette, FUNC(skykid_state::skykid_palette), 64*4 + 128*4 + 64*8, 256);
PALETTE(config, m_palette, FUNC(skykid_state::palette), 64*4 + 128*4 + 64*8, 256);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
NAMCO_CUS30(config, m_cus30, 49152000/2048);
NAMCO_CUS30(config, m_cus30, 49152000 / 2048);
m_cus30->set_voices(8);
m_cus30->add_route(ALL_OUTPUTS, "mono", 1.0);
}
ROM_START( skykid ) // a PCB was found with ROM 4 and 6 labeled sk1, but hashes match the sk2 listed here and in other sets, while they differ from the sk1 ROMs in set skykidd?
ROM_REGION( 0x14000, "maincpu", 0 ) /* 6809 code */
ROM_REGION( 0x14000, "maincpu", 0 ) // 6809 code
ROM_LOAD( "sk2_2.6c", 0x08000, 0x4000, CRC(ea8a5822) SHA1(5b13133410bcb7d647e662b476dbfd2edab8aac0) )
ROM_LOAD( "sk1-1c.6b", 0x0c000, 0x4000, CRC(7abe6c6c) SHA1(7d2631cc6149fa3e02b1355cb899de5474ff5d0a) )
ROM_LOAD( "sk1_3.6d", 0x10000, 0x4000, CRC(314b8765) SHA1(d90a8a853ce672fe5ee190f07bcb33262c73df3b) ) /* banked ROM */
ROM_LOAD( "sk1_3.6d", 0x10000, 0x4000, CRC(314b8765) SHA1(d90a8a853ce672fe5ee190f07bcb33262c73df3b) ) // banked ROM
ROM_REGION( 0x10000, "mcu", 0 ) /* MCU code */
ROM_LOAD( "sk2_4.3c", 0x8000, 0x2000, CRC(a460d0e0) SHA1(7124ffeb3b84b282940dcbf9421ae4934bcce1c8) ) /* subprogram for the MCU */
ROM_LOAD( "cus63-63a1.mcu", 0xf000, 0x1000, CRC(6ef08fb3) SHA1(4842590d60035a0059b0899eb2d5f58ae72c2529) ) /* MCU internal code */
ROM_REGION( 0x10000, "mcu", 0 )
ROM_LOAD( "sk2_4.3c", 0x8000, 0x2000, CRC(a460d0e0) SHA1(7124ffeb3b84b282940dcbf9421ae4934bcce1c8) ) // subprogram for the MCU
ROM_LOAD( "cus63-63a1.mcu", 0xf000, 0x1000, CRC(6ef08fb3) SHA1(4842590d60035a0059b0899eb2d5f58ae72c2529) ) // MCU internal code
ROM_REGION( 0x02000, "gfx1", 0 )
ROM_LOAD( "sk1_6.6l", 0x0000, 0x2000, CRC(58b731b9) SHA1(40f7be85914833ce02a734c20d68c0db8b77911d) ) /* chars */
ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "sk1_6.6l", 0x0000, 0x2000, CRC(58b731b9) SHA1(40f7be85914833ce02a734c20d68c0db8b77911d) )
ROM_REGION( 0x02000, "gfx2", 0 )
ROM_REGION( 0x02000, "tiles", 0 )
ROM_LOAD( "sk1_5.7e", 0x0000, 0x2000, CRC(c33a498e) SHA1(9f89a514888418a9bebbca341a8cc66e41b58acb) )
ROM_REGION( 0x10000, "gfx3", 0 )
ROM_LOAD( "sk1_8.10n", 0x0000, 0x4000, CRC(44bb7375) SHA1(5b2fa6782671150bab5f3c3ac46b47bc23f3d7e0) ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "sk1_8.10n", 0x0000, 0x4000, CRC(44bb7375) SHA1(5b2fa6782671150bab5f3c3ac46b47bc23f3d7e0) )
ROM_LOAD( "sk1_7.10m", 0x4000, 0x4000, CRC(3454671d) SHA1(723b26a0f208addc2a22736457cb4be6ab6c69cc) )
/* 0x8000-0xbfff will be unpacked from 0x4000-0x5fff */
// 0x8000-0xbfff will be unpacked from 0x4000-0x5fff
ROM_FILL( 0xc000, 0x4000, 0x00 ) // part of the gfx is 2bpp decoded as 3bpp
ROM_REGION( 0x0700, "proms", 0 )
ROM_LOAD( "sk1-1.2n", 0x0000, 0x0100, CRC(0218e726) SHA1(8b766162a4783c058d9a1ecf8741673d7ef955fb) ) /* red component */
ROM_LOAD( "sk1-2.2p", 0x0100, 0x0100, CRC(fc0d5b85) SHA1(d1b13e42e735b24594cf0b840dee8110de23369e) ) /* green component */
ROM_LOAD( "sk1-3.2r", 0x0200, 0x0100, CRC(d06b620b) SHA1(968a2d62c65e201d521e9efa8fcf6ad15898e4b3) ) /* blue component */
ROM_LOAD( "sk1-4.5n", 0x0300, 0x0200, CRC(c697ac72) SHA1(3b79755e6cbb22c14fc4affdbd3f4521da1d90e8) ) /* tiles lookup table */
ROM_LOAD( "sk1-5.6n", 0x0500, 0x0200, CRC(161514a4) SHA1(4488ce60d12be6586e4a1ddbbfd06bf4e7dfaceb) ) /* sprites lookup table */
ROM_LOAD( "sk1-1.2n", 0x0000, 0x0100, CRC(0218e726) SHA1(8b766162a4783c058d9a1ecf8741673d7ef955fb) ) // red component
ROM_LOAD( "sk1-2.2p", 0x0100, 0x0100, CRC(fc0d5b85) SHA1(d1b13e42e735b24594cf0b840dee8110de23369e) ) // green component
ROM_LOAD( "sk1-3.2r", 0x0200, 0x0100, CRC(d06b620b) SHA1(968a2d62c65e201d521e9efa8fcf6ad15898e4b3) ) // blue component
ROM_LOAD( "sk1-4.5n", 0x0300, 0x0200, CRC(c697ac72) SHA1(3b79755e6cbb22c14fc4affdbd3f4521da1d90e8) ) // tiles lookup table
ROM_LOAD( "sk1-5.6n", 0x0500, 0x0200, CRC(161514a4) SHA1(4488ce60d12be6586e4a1ddbbfd06bf4e7dfaceb) ) // sprites lookup table
ROM_END
ROM_START( skykido )
ROM_REGION( 0x14000, "maincpu", 0 ) /* 6809 code */
ROM_REGION( 0x14000, "maincpu", 0 ) // 6809 code
ROM_LOAD( "sk2_2.6c", 0x08000, 0x4000, CRC(ea8a5822) SHA1(5b13133410bcb7d647e662b476dbfd2edab8aac0) )
ROM_LOAD( "sk1_1.6b", 0x0c000, 0x4000, CRC(070a49d4) SHA1(4b994bde3e34b574bd927843804d2fb1a08d1bdf) )
ROM_LOAD( "sk1_3.6d", 0x10000, 0x4000, CRC(314b8765) SHA1(d90a8a853ce672fe5ee190f07bcb33262c73df3b) ) /* banked ROM */
ROM_LOAD( "sk1_3.6d", 0x10000, 0x4000, CRC(314b8765) SHA1(d90a8a853ce672fe5ee190f07bcb33262c73df3b) ) // banked ROM
ROM_REGION( 0x10000, "mcu", 0 ) /* MCU code */
ROM_LOAD( "sk2_4.3c", 0x8000, 0x2000, CRC(a460d0e0) SHA1(7124ffeb3b84b282940dcbf9421ae4934bcce1c8) ) /* subprogram for the MCU */
ROM_LOAD( "cus63-63a1.mcu", 0xf000, 0x1000, CRC(6ef08fb3) SHA1(4842590d60035a0059b0899eb2d5f58ae72c2529) ) /* MCU internal code */
ROM_REGION( 0x10000, "mcu", 0 )
ROM_LOAD( "sk2_4.3c", 0x8000, 0x2000, CRC(a460d0e0) SHA1(7124ffeb3b84b282940dcbf9421ae4934bcce1c8) ) // subprogram for the MCU
ROM_LOAD( "cus63-63a1.mcu", 0xf000, 0x1000, CRC(6ef08fb3) SHA1(4842590d60035a0059b0899eb2d5f58ae72c2529) ) // MCU internal code
ROM_REGION( 0x02000, "gfx1", 0 )
ROM_LOAD( "sk1_6.6l", 0x0000, 0x2000, CRC(58b731b9) SHA1(40f7be85914833ce02a734c20d68c0db8b77911d) ) /* chars */
ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "sk1_6.6l", 0x0000, 0x2000, CRC(58b731b9) SHA1(40f7be85914833ce02a734c20d68c0db8b77911d) )
ROM_REGION( 0x02000, "gfx2", 0 )
ROM_REGION( 0x02000, "tiles", 0 )
ROM_LOAD( "sk1_5.7e", 0x0000, 0x2000, CRC(c33a498e) SHA1(9f89a514888418a9bebbca341a8cc66e41b58acb) )
ROM_REGION( 0x10000, "gfx3", 0 )
ROM_LOAD( "sk1_8.10n", 0x0000, 0x4000, CRC(44bb7375) SHA1(5b2fa6782671150bab5f3c3ac46b47bc23f3d7e0) ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "sk1_8.10n", 0x0000, 0x4000, CRC(44bb7375) SHA1(5b2fa6782671150bab5f3c3ac46b47bc23f3d7e0) )
ROM_LOAD( "sk1_7.10m", 0x4000, 0x4000, CRC(3454671d) SHA1(723b26a0f208addc2a22736457cb4be6ab6c69cc) )
/* 0x8000-0xbfff will be unpacked from 0x4000-0x5fff */
// 0x8000-0xbfff will be unpacked from 0x4000-0x5fff
ROM_FILL( 0xc000, 0x4000, 0x00 ) // part of the gfx is 2bpp decoded as 3bpp
ROM_REGION( 0x0700, "proms", 0 )
ROM_LOAD( "sk1-1.2n", 0x0000, 0x0100, CRC(0218e726) SHA1(8b766162a4783c058d9a1ecf8741673d7ef955fb) ) /* red component */
ROM_LOAD( "sk1-2.2p", 0x0100, 0x0100, CRC(fc0d5b85) SHA1(d1b13e42e735b24594cf0b840dee8110de23369e) ) /* green component */
ROM_LOAD( "sk1-3.2r", 0x0200, 0x0100, CRC(d06b620b) SHA1(968a2d62c65e201d521e9efa8fcf6ad15898e4b3) ) /* blue component */
ROM_LOAD( "sk1-4.5n", 0x0300, 0x0200, CRC(c697ac72) SHA1(3b79755e6cbb22c14fc4affdbd3f4521da1d90e8) ) /* tiles lookup table */
ROM_LOAD( "sk1-5.6n", 0x0500, 0x0200, CRC(161514a4) SHA1(4488ce60d12be6586e4a1ddbbfd06bf4e7dfaceb) ) /* sprites lookup table */
ROM_LOAD( "sk1-1.2n", 0x0000, 0x0100, CRC(0218e726) SHA1(8b766162a4783c058d9a1ecf8741673d7ef955fb) ) // red component
ROM_LOAD( "sk1-2.2p", 0x0100, 0x0100, CRC(fc0d5b85) SHA1(d1b13e42e735b24594cf0b840dee8110de23369e) ) // green component
ROM_LOAD( "sk1-3.2r", 0x0200, 0x0100, CRC(d06b620b) SHA1(968a2d62c65e201d521e9efa8fcf6ad15898e4b3) ) // blue component
ROM_LOAD( "sk1-4.5n", 0x0300, 0x0200, CRC(c697ac72) SHA1(3b79755e6cbb22c14fc4affdbd3f4521da1d90e8) ) // tiles lookup table
ROM_LOAD( "sk1-5.6n", 0x0500, 0x0200, CRC(161514a4) SHA1(4488ce60d12be6586e4a1ddbbfd06bf4e7dfaceb) ) // sprites lookup table
ROM_END
ROM_START( skykidd )
ROM_REGION( 0x14000, "maincpu", 0 ) /* 6809 code */
ROM_REGION( 0x14000, "maincpu", 0 ) // 6809 code
ROM_LOAD( "sk1_2.6c", 0x08000, 0x4000, CRC(8370671a) SHA1(7038f952ebfc4482440b73ee4027fa908561d122) )
ROM_LOAD( "sk1_1.6b", 0x0c000, 0x4000, CRC(070a49d4) SHA1(4b994bde3e34b574bd927843804d2fb1a08d1bdf) )
ROM_LOAD( "sk1_3.6d", 0x10000, 0x4000, CRC(314b8765) SHA1(d90a8a853ce672fe5ee190f07bcb33262c73df3b) ) /* banked ROM */
ROM_LOAD( "sk1_3.6d", 0x10000, 0x4000, CRC(314b8765) SHA1(d90a8a853ce672fe5ee190f07bcb33262c73df3b) ) // banked ROM
ROM_REGION( 0x10000, "mcu", 0 ) /* MCU code */
ROM_LOAD( "sk1_4.3c", 0x8000, 0x2000, CRC(887137cc) SHA1(dd0f66afb78833c4da73539b692854346f448c0d) ) /* subprogram for the MCU */
ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
ROM_REGION( 0x10000, "mcu", 0 )
ROM_LOAD( "sk1_4.3c", 0x8000, 0x2000, CRC(887137cc) SHA1(dd0f66afb78833c4da73539b692854346f448c0d) ) // subprogram for the MCU
ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x1000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) // MCU internal code
ROM_REGION( 0x02000, "gfx1", 0 )
ROM_LOAD( "sk1_6.6l", 0x0000, 0x2000, CRC(58b731b9) SHA1(40f7be85914833ce02a734c20d68c0db8b77911d) ) /* chars */
ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "sk1_6.6l", 0x0000, 0x2000, CRC(58b731b9) SHA1(40f7be85914833ce02a734c20d68c0db8b77911d) )
ROM_REGION( 0x02000, "gfx2", 0 )
ROM_REGION( 0x02000, "tiles", 0 )
ROM_LOAD( "sk1_5.7e", 0x0000, 0x2000, CRC(c33a498e) SHA1(9f89a514888418a9bebbca341a8cc66e41b58acb) )
ROM_REGION( 0x10000, "gfx3", 0 )
ROM_LOAD( "sk1_8.10n", 0x0000, 0x4000, CRC(44bb7375) SHA1(5b2fa6782671150bab5f3c3ac46b47bc23f3d7e0) ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "sk1_8.10n", 0x0000, 0x4000, CRC(44bb7375) SHA1(5b2fa6782671150bab5f3c3ac46b47bc23f3d7e0) )
ROM_LOAD( "sk1_7.10m", 0x4000, 0x4000, CRC(3454671d) SHA1(723b26a0f208addc2a22736457cb4be6ab6c69cc) )
/* 0x8000-0xbfff will be unpacked from 0x4000-0x5fff */
// 0x8000-0xbfff will be unpacked from 0x4000-0x5fff
ROM_FILL( 0xc000, 0x4000, 0x00 ) // part of the gfx is 2bpp decoded as 3bpp
ROM_REGION( 0x0700, "proms", 0 )
ROM_LOAD( "sk1-1.2n", 0x0000, 0x0100, CRC(0218e726) SHA1(8b766162a4783c058d9a1ecf8741673d7ef955fb) ) /* red component */
ROM_LOAD( "sk1-2.2p", 0x0100, 0x0100, CRC(fc0d5b85) SHA1(d1b13e42e735b24594cf0b840dee8110de23369e) ) /* green component */
ROM_LOAD( "sk1-3.2r", 0x0200, 0x0100, CRC(d06b620b) SHA1(968a2d62c65e201d521e9efa8fcf6ad15898e4b3) ) /* blue component */
ROM_LOAD( "sk1-4.5n", 0x0300, 0x0200, CRC(c697ac72) SHA1(3b79755e6cbb22c14fc4affdbd3f4521da1d90e8) ) /* tiles lookup table */
ROM_LOAD( "sk1-5.6n", 0x0500, 0x0200, CRC(161514a4) SHA1(4488ce60d12be6586e4a1ddbbfd06bf4e7dfaceb) ) /* sprites lookup table */
ROM_LOAD( "sk1-1.2n", 0x0000, 0x0100, CRC(0218e726) SHA1(8b766162a4783c058d9a1ecf8741673d7ef955fb) ) // red component
ROM_LOAD( "sk1-2.2p", 0x0100, 0x0100, CRC(fc0d5b85) SHA1(d1b13e42e735b24594cf0b840dee8110de23369e) ) // green component
ROM_LOAD( "sk1-3.2r", 0x0200, 0x0100, CRC(d06b620b) SHA1(968a2d62c65e201d521e9efa8fcf6ad15898e4b3) ) // blue component
ROM_LOAD( "sk1-4.5n", 0x0300, 0x0200, CRC(c697ac72) SHA1(3b79755e6cbb22c14fc4affdbd3f4521da1d90e8) ) // tiles lookup table
ROM_LOAD( "sk1-5.6n", 0x0500, 0x0200, CRC(161514a4) SHA1(4488ce60d12be6586e4a1ddbbfd06bf4e7dfaceb) ) // sprites lookup table
ROM_END
ROM_START( skykids )
ROM_REGION( 0x14000, "maincpu", 0 ) /* 6809 code */
ROM_REGION( 0x14000, "maincpu", 0 ) // 6809 code
ROM_LOAD( "sk2a.6c", 0x08000, 0x4000, CRC(68492672) SHA1(3dbe5ec930de5c526d3ef65513993c10f2153a36) )
ROM_LOAD( "sk1a.6b", 0x0c000, 0x4000, CRC(e16abe25) SHA1(78e0d30b15fb62c4399d847784ddc61f6819feba) )
ROM_LOAD( "sk1_3.6d", 0x10000, 0x4000, CRC(314b8765) SHA1(d90a8a853ce672fe5ee190f07bcb33262c73df3b) ) /* banked ROM */
ROM_LOAD( "sk1_3.6d", 0x10000, 0x4000, CRC(314b8765) SHA1(d90a8a853ce672fe5ee190f07bcb33262c73df3b) ) // banked ROM
ROM_REGION( 0x10000, "mcu", 0 ) /* MCU code */
ROM_LOAD( "sk2_4.3c", 0x8000, 0x2000, CRC(a460d0e0) SHA1(7124ffeb3b84b282940dcbf9421ae4934bcce1c8) ) /* subprogram for the MCU */
ROM_LOAD( "cus63-63a1.mcu", 0xf000, 0x1000, CRC(6ef08fb3) SHA1(4842590d60035a0059b0899eb2d5f58ae72c2529) ) /* MCU internal code */
ROM_REGION( 0x10000, "mcu", 0 )
ROM_LOAD( "sk2_4.3c", 0x8000, 0x2000, CRC(a460d0e0) SHA1(7124ffeb3b84b282940dcbf9421ae4934bcce1c8) ) // subprogram for the MCU
ROM_LOAD( "cus63-63a1.mcu", 0xf000, 0x1000, CRC(6ef08fb3) SHA1(4842590d60035a0059b0899eb2d5f58ae72c2529) ) // MCU internal code
ROM_REGION( 0x02000, "gfx1", 0 )
ROM_LOAD( "sk1_6.6l", 0x0000, 0x2000, CRC(58b731b9) SHA1(40f7be85914833ce02a734c20d68c0db8b77911d) ) /* chars */
ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "sk1_6.6l", 0x0000, 0x2000, CRC(58b731b9) SHA1(40f7be85914833ce02a734c20d68c0db8b77911d) )
ROM_REGION( 0x02000, "gfx2", 0 )
ROM_REGION( 0x02000, "tiles", 0 )
ROM_LOAD( "sk1_5.7e", 0x0000, 0x2000, CRC(c33a498e) SHA1(9f89a514888418a9bebbca341a8cc66e41b58acb) )
ROM_REGION( 0x10000, "gfx3", 0 )
ROM_LOAD( "sk1_8.10n", 0x0000, 0x4000, CRC(44bb7375) SHA1(5b2fa6782671150bab5f3c3ac46b47bc23f3d7e0) ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "sk1_8.10n", 0x0000, 0x4000, CRC(44bb7375) SHA1(5b2fa6782671150bab5f3c3ac46b47bc23f3d7e0) )
ROM_LOAD( "sk1_7.10m", 0x4000, 0x4000, CRC(3454671d) SHA1(723b26a0f208addc2a22736457cb4be6ab6c69cc) )
/* 0x8000-0xbfff will be unpacked from 0x4000-0x5fff */
// 0x8000-0xbfff will be unpacked from 0x4000-0x5fff
ROM_FILL( 0xc000, 0x4000, 0x00 ) // part of the gfx is 2bpp decoded as 3bpp
ROM_REGION( 0x0700, "proms", 0 )
ROM_LOAD( "sk1-1.2n", 0x0000, 0x0100, CRC(0218e726) SHA1(8b766162a4783c058d9a1ecf8741673d7ef955fb) ) /* red component */
ROM_LOAD( "sk1-2.2p", 0x0100, 0x0100, CRC(fc0d5b85) SHA1(d1b13e42e735b24594cf0b840dee8110de23369e) ) /* green component */
ROM_LOAD( "sk1-3.2r", 0x0200, 0x0100, CRC(d06b620b) SHA1(968a2d62c65e201d521e9efa8fcf6ad15898e4b3) ) /* blue component */
ROM_LOAD( "sk1-4.5n", 0x0300, 0x0200, CRC(c697ac72) SHA1(3b79755e6cbb22c14fc4affdbd3f4521da1d90e8) ) /* tiles lookup table */
ROM_LOAD( "sk1-5.6n", 0x0500, 0x0200, CRC(161514a4) SHA1(4488ce60d12be6586e4a1ddbbfd06bf4e7dfaceb) ) /* sprites lookup table */
ROM_LOAD( "sk1-1.2n", 0x0000, 0x0100, CRC(0218e726) SHA1(8b766162a4783c058d9a1ecf8741673d7ef955fb) ) // red component
ROM_LOAD( "sk1-2.2p", 0x0100, 0x0100, CRC(fc0d5b85) SHA1(d1b13e42e735b24594cf0b840dee8110de23369e) ) // green component
ROM_LOAD( "sk1-3.2r", 0x0200, 0x0100, CRC(d06b620b) SHA1(968a2d62c65e201d521e9efa8fcf6ad15898e4b3) ) // blue component
ROM_LOAD( "sk1-4.5n", 0x0300, 0x0200, CRC(c697ac72) SHA1(3b79755e6cbb22c14fc4affdbd3f4521da1d90e8) ) // tiles lookup table
ROM_LOAD( "sk1-5.6n", 0x0500, 0x0200, CRC(161514a4) SHA1(4488ce60d12be6586e4a1ddbbfd06bf4e7dfaceb) ) // sprites lookup table
ROM_END
ROM_START( drgnbstr )
ROM_REGION( 0x14000, "maincpu", 0 ) /* 6809 code */
ROM_REGION( 0x14000, "maincpu", 0 ) // 6809 code
ROM_LOAD( "db1_2b.6c", 0x08000, 0x04000, CRC(0f11cd17) SHA1(691d853f4f08898ecf4bccfb70a568de309329f1) )
ROM_LOAD( "db1_1.6b", 0x0c000, 0x04000, CRC(1c7c1821) SHA1(8b6111afc42e2996bdc2fc276be0c40556cd431e) )
ROM_LOAD( "db1_3.6d", 0x10000, 0x04000, CRC(6da169ae) SHA1(235211c26562fef0660e3fde1e87f2e52626d119) ) /* banked ROM */
ROM_LOAD( "db1_3.6d", 0x10000, 0x04000, CRC(6da169ae) SHA1(235211c26562fef0660e3fde1e87f2e52626d119) ) // banked ROM
ROM_REGION( 0x10000, "mcu", 0 ) /* MCU code */
ROM_LOAD( "db1_4.3c", 0x8000, 0x02000, CRC(8a0b1fc1) SHA1(c2861d0da63e2d17f2d1ad46dccf753ecd902ce3) ) /* subprogram for the MCU */
ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x01000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) /* MCU internal code */
ROM_REGION( 0x10000, "mcu", 0 )
ROM_LOAD( "db1_4.3c", 0x8000, 0x02000, CRC(8a0b1fc1) SHA1(c2861d0da63e2d17f2d1ad46dccf753ecd902ce3) ) // subprogram for the MCU
ROM_LOAD( "cus60-60a1.mcu", 0xf000, 0x01000, CRC(076ea82a) SHA1(22b5e62e26390d7d5cacc0503c7aa5ed524204df) ) // MCU internal code
ROM_REGION( 0x02000, "gfx1", 0 )
ROM_LOAD( "db1_6.6l", 0x0000, 0x2000, CRC(c080b66c) SHA1(05dcd45274d0bd12ef8ae7fd10c8719e679b3e7b) ) /* tiles */
ROM_REGION( 0x02000, "chars", 0 )
ROM_LOAD( "db1_6.6l", 0x0000, 0x2000, CRC(c080b66c) SHA1(05dcd45274d0bd12ef8ae7fd10c8719e679b3e7b) )
ROM_REGION( 0x02000, "gfx2", 0 )
ROM_REGION( 0x02000, "tiles", 0 )
ROM_LOAD( "db1_5.7e", 0x0000, 0x2000, CRC(28129aed) SHA1(d7f52e871d97179ec88c142a1c70eb6ad09e534a) )
ROM_REGION( 0x10000, "gfx3", 0 )
ROM_LOAD( "db1_8.10n", 0x0000, 0x4000, CRC(11942c61) SHA1(0f065cb82cf83967e90b3c7326b36956f4fa9a52) ) /* sprites */
ROM_REGION( 0x10000, "sprites", 0 )
ROM_LOAD( "db1_8.10n", 0x0000, 0x4000, CRC(11942c61) SHA1(0f065cb82cf83967e90b3c7326b36956f4fa9a52) )
ROM_LOAD( "db1_7.10m", 0x4000, 0x4000, CRC(cc130fe2) SHA1(4f5d4f21152b3b4e523a6d17dd5ff5cef52447f2) )
/* 0x8000-0xbfff will be unpacked from 0x4000-0x5fff */
// 0x8000-0xbfff will be unpacked from 0x4000-0x5fff
ROM_FILL( 0xc000, 0x4000, 0x00 ) // part of the gfx is 2bpp decoded as 3bpp
ROM_REGION( 0x0700, "proms", 0 )
ROM_LOAD( "db1-1.2n", 0x0000, 0x0100, CRC(3f8cce97) SHA1(027b3fb0f322a9d68b434b207a40b31799a8a8d6) ) /* red component */
ROM_LOAD( "db1-2.2p", 0x0100, 0x0100, CRC(afe32436) SHA1(e405787f7f2aa992edd63078e3944334d8acddb1) ) /* green component */
ROM_LOAD( "db1-3.2r", 0x0200, 0x0100, CRC(c95ff576) SHA1(861a7340d29e6a6a0d5ead93abd3f73cc3df0cc7) ) /* blue component */
ROM_LOAD( "db1-4.5n", 0x0300, 0x0200, CRC(b2180c21) SHA1(a5d14c31d54f04494ea99c3d94bd1b5e072b612e) ) /* tiles lookup table */
ROM_LOAD( "db1-5.6n", 0x0500, 0x0200, CRC(5e2b3f74) SHA1(ef58661fa12a52bc358e81179254d37de7551b38) ) /* sprites lookup table */
ROM_LOAD( "db1-1.2n", 0x0000, 0x0100, CRC(3f8cce97) SHA1(027b3fb0f322a9d68b434b207a40b31799a8a8d6) ) // red component
ROM_LOAD( "db1-2.2p", 0x0100, 0x0100, CRC(afe32436) SHA1(e405787f7f2aa992edd63078e3944334d8acddb1) ) // green component
ROM_LOAD( "db1-3.2r", 0x0200, 0x0100, CRC(c95ff576) SHA1(861a7340d29e6a6a0d5ead93abd3f73cc3df0cc7) ) // blue component
ROM_LOAD( "db1-4.5n", 0x0300, 0x0200, CRC(b2180c21) SHA1(a5d14c31d54f04494ea99c3d94bd1b5e072b612e) ) // tiles lookup table
ROM_LOAD( "db1-5.6n", 0x0500, 0x0200, CRC(5e2b3f74) SHA1(ef58661fa12a52bc358e81179254d37de7551b38) ) // sprites lookup table
ROM_END
void skykid_state::init_skykid()
{
/* unpack the third sprite ROM */
uint8_t *rom = memregion("gfx3")->base() + 0x4000;
for (int i = 0;i < 0x2000;i++)
// unpack the third sprite ROM
uint8_t *rom = memregion("sprites")->base() + 0x4000;
for (int i = 0; i < 0x2000; i++)
{
rom[i + 0x4000] = rom[i]; // sprite set #1, plane 3
rom[i + 0x6000] = rom[i] >> 4; // sprite set #2, plane 3
@ -625,11 +904,14 @@ void skykid_state::init_skykid()
}
}
} // anonymous namespace
GAME( 1984, drgnbstr, 0, skykid, drgnbstr, skykid_state, init_skykid, ROT0, "Namco", "Dragon Buster", MACHINE_SUPPORTS_SAVE )
GAME( 1985, skykid, 0, skykid, skykid, skykid_state, init_skykid, ROT180, "Namco", "Sky Kid (new version)", MACHINE_SUPPORTS_SAVE ) /* Uses CUS63 aka 63a1 */
GAME( 1985, skykido, skykid, skykid, skykid, skykid_state, init_skykid, ROT180, "Namco", "Sky Kid (old version)", MACHINE_SUPPORTS_SAVE ) /* Uses CUS63 aka 63a1 */
GAME( 1985, skykidd, skykid, skykid, skykid, skykid_state, init_skykid, ROT180, "Namco", "Sky Kid (CUS60 version)", MACHINE_SUPPORTS_SAVE ) /* Uses CUS60 aka 60a1 */
GAME( 1985, skykid, 0, skykid, skykid, skykid_state, init_skykid, ROT180, "Namco", "Sky Kid (new version)", MACHINE_SUPPORTS_SAVE ) // Uses CUS63 aka 63a1
GAME( 1985, skykido, skykid, skykid, skykid, skykid_state, init_skykid, ROT180, "Namco", "Sky Kid (old version)", MACHINE_SUPPORTS_SAVE ) // Uses CUS63 aka 63a1
GAME( 1985, skykidd, skykid, skykid, skykid, skykid_state, init_skykid, ROT180, "Namco", "Sky Kid (CUS60 version)", MACHINE_SUPPORTS_SAVE ) // Uses CUS60 aka 60a1
// no license text is displayed but the PCB was licensed by Namco for production by Sipem (formerly Sidam) with Namco supplying the Custom chips (MCU etc.)
// the level select is handled in a much more user-friendly way in this set and the dip for it is inverted (although this is displayed incorrectly in the test mode)
GAME( 1985, skykids, skykid, skykid, skykids, skykid_state, init_skykid, ROT180, "Namco (Sipem license)", "Sky Kid (Sipem)", MACHINE_SUPPORTS_SAVE ) /* Uses CUS63 aka 63a1 */
GAME( 1985, skykids, skykid, skykid, skykids, skykid_state, init_skykid, ROT180, "Namco (Sipem license)", "Sky Kid (Sipem)", MACHINE_SUPPORTS_SAVE ) // Uses CUS63 aka 63a1

View File

@ -10,7 +10,7 @@ TODO:
- sprite lag (the real game has quite a bit of lag too)
Notes:
- there's probably a 63701 on the board, used for protection. It is checked
- there's a 63701 on the board, used for protection. It is checked
on startup and then just used to read the input ports. It doesn't return
the ports verbatim, it adds further processing, setting flags when the
player double-taps in one direction to run.(updated to edge-triggering)
@ -23,25 +23,321 @@ Notes:
***************************************************************************/
#include "emu.h"
#include "includes/spdodgeb.h"
#include "cpu/m6502/m6502.h"
#include "cpu/m6800/m6801.h"
#include "cpu/m6809/m6809.h"
#include "machine/gen_latch.h"
#include "machine/timer.h"
#include "sound/msm5205.h"
#include "sound/ymopl.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
void spdodgeb_state::spd_adpcm_w(offs_t offset, uint8_t data)
namespace {
class spdodgeb_state : public driver_device
{
public:
spdodgeb_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_mcu(*this, "mcu"),
m_msm(*this, "msm%u", 1U),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
m_mainbank(*this, "mainbank"),
m_adpcm_rom(*this, "adpcm")
{ }
void spdodgeb(machine_config &config);
DECLARE_READ_LINE_MEMBER(mcu_busy_r);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_mcu;
required_device_array<msm5205_device, 2> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
required_memory_bank m_mainbank;
required_region_ptr<uint8_t> m_adpcm_rom;
uint32_t m_adpcm_pos[2]{};
uint16_t m_adpcm_end[2]{};
uint8_t m_adpcm_idle[2]{};
int16_t m_adpcm_data[2]{};
uint8_t m_mcu_status = 0;
uint8_t m_inputs[5]{};
uint8_t m_tile_palbank = 0;
uint8_t m_sprite_palbank = 0;
tilemap_t *m_bg_tilemap = nullptr;
uint16_t m_lastscroll = 0;
template <uint8_t Which> DECLARE_WRITE_LINE_MEMBER(adpcm_int);
void adpcm_w(offs_t offset, uint8_t data);
uint8_t mcu63701_r(offs_t offset);
void mcu_data_w(offs_t offset, uint8_t data);
void mcu_status_w(uint8_t data);
void mcu_nmi_w(uint8_t data);
void scrollx_lo_w(uint8_t data);
void ctrl_w(uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
TILEMAP_MAPPER_MEMBER(background_scan);
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);
TIMER_DEVICE_CALLBACK_MEMBER(interrupt);
void main_map(address_map &map);
void sound_map(address_map &map);
void mcu_map(address_map &map);
};
// video
void spdodgeb_state::palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
for (int i = 0;i < palette.entries();i++)
{
// red component
int bit0 = BIT(color_prom[0], 0);
int bit1 = BIT(color_prom[0], 1);
int bit2 = BIT(color_prom[0], 2);
int bit3 = BIT(color_prom[0], 3);
int const r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
// green component
bit0 = BIT(color_prom[0], 4);
bit1 = BIT(color_prom[0], 5);
bit2 = BIT(color_prom[0], 6);
bit3 = BIT(color_prom[0], 7);
int const g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
// blue component
bit0 = BIT(color_prom[palette.entries()], 0);
bit1 = BIT(color_prom[palette.entries()], 1);
bit2 = BIT(color_prom[palette.entries()], 2);
bit3 = BIT(color_prom[palette.entries()], 3);
int const b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
palette.set_pen_color(i, rgb_t(r, g, b));
color_prom++;
}
}
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILEMAP_MAPPER_MEMBER(spdodgeb_state::background_scan)
{
// logical (col,row) -> memory offset
return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x20) << 5);
}
TILE_GET_INFO_MEMBER(spdodgeb_state::get_bg_tile_info)
{
uint8_t code = m_videoram[tile_index];
uint8_t attr = m_videoram[tile_index + 0x800];
tileinfo.set(0,
code + ((attr & 0x1f) << 8),
((attr & 0xe0) >> 5) + 8 * m_tile_palbank,
0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void spdodgeb_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(spdodgeb_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(spdodgeb_state::background_scan)), 8,8, 64,32);
m_mainbank->configure_entries(0, 2, memregion("maincpu")->base(), 0x4000);
save_item(NAME(m_tile_palbank));
save_item(NAME(m_sprite_palbank));
save_item(NAME(m_lastscroll));
}
/***************************************************************************
Memory handlers
***************************************************************************/
TIMER_DEVICE_CALLBACK_MEMBER(spdodgeb_state::interrupt)
{
int scanline = param;
if (scanline == 256)
{
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
m_screen->update_partial(256);
}
else if ((scanline % 8) == 0)
{
m_maincpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE);
m_screen->update_partial(scanline + 16); // TODO: pretty off ...
}
}
void spdodgeb_state::scrollx_lo_w(uint8_t data)
{
m_lastscroll = (m_lastscroll & 0x100) | data;
}
void spdodgeb_state::ctrl_w(uint8_t data)
{
// bit 0 = flip screen
flip_screen_set(data & 0x01);
// bit 1 = ROM bank switch
m_mainbank->set_entry((~data & 0x02) >> 1);
// bit 2 = scroll high bit
m_lastscroll = (m_lastscroll & 0x0ff) | ((data & 0x04) << 6);
// bit 3 = to mcu??
// bits 4-7 = palette bank select
if (m_tile_palbank != ((data & 0x30) >> 4))
{
m_tile_palbank = ((data & 0x30) >> 4);
m_bg_tilemap->mark_all_dirty();
}
m_sprite_palbank = (data & 0xc0) >> 6;
}
void spdodgeb_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
/***************************************************************************
Display refresh
***************************************************************************/
#define DRAW_SPRITE( order, sx, sy ) gfx->transpen(bitmap,\
cliprect, \
(which + order), color + 8 * m_sprite_palbank, flipx, flipy, sx, sy, 0);
void spdodgeb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element *gfx = m_gfxdecode->gfx(1);
/* 240-SY Z|F|CLR|WCH WHICH SX
xxxxxxxx x|x|xxx|xxx xxxxxxxx xxxxxxxx
*/
for (int i = 0; i < m_spriteram.bytes(); i += 4)
{
int attr = m_spriteram[i + 1];
int which = m_spriteram[i + 2] + ((attr & 0x07) << 8);
int sx = m_spriteram[i + 3];
int sy = 240 - m_spriteram[i];
int size = (attr & 0x80) >> 7;
int color = (attr & 0x38) >> 3;
int flipx = ~attr & 0x40;
int flipy = 0;
int dy = -16;
int cy;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
dy = -dy;
}
if (sx < -8) sx += 256; else if (sx > 248) sx -= 256;
switch (size)
{
case 0: // normal
if (sy < -8) sy += 256; else if (sy > 248) sy -= 256;
DRAW_SPRITE(0, sx, sy);
break;
case 1: // double y
if (flip_screen()) { if (sy > 240) sy -= 256; } else { if (sy < 0) sy += 256; }
cy = sy + dy;
which &= ~1;
DRAW_SPRITE(0, sx, cy);
DRAW_SPRITE(1, sx, sy);
break;
}
}
}
#undef DRAW_SPRITE
uint32_t spdodgeb_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0, m_lastscroll + 5);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}
// machine
void spdodgeb_state::adpcm_w(offs_t offset, uint8_t data)
{
int chip = offset & 1;
msm5205_device *adpcm = chip ? m_msm2 : m_msm1;
switch (offset/2)
{
case 3:
m_adpcm_idle[chip] = 1;
adpcm->reset_w(1);
m_msm[chip]->reset_w(1);
break;
case 2:
@ -54,42 +350,33 @@ void spdodgeb_state::spd_adpcm_w(offs_t offset, uint8_t data)
case 0:
m_adpcm_idle[chip] = 0;
adpcm->reset_w(0);
m_msm[chip]->reset_w(0);
break;
}
}
void spdodgeb_state::spd_adpcm_int( msm5205_device *device, int chip )
template <uint8_t Which>
WRITE_LINE_MEMBER(spdodgeb_state::adpcm_int)
{
if (m_adpcm_pos[chip] >= m_adpcm_end[chip] || m_adpcm_pos[chip] >= 0x10000)
if (m_adpcm_pos[Which] >= m_adpcm_end[Which] || m_adpcm_pos[Which] >= 0x10000)
{
m_adpcm_idle[chip] = 1;
device->reset_w(1);
m_adpcm_idle[Which] = 1;
m_msm[Which]->reset_w(1);
}
else if (m_adpcm_data[chip] != -1)
else if (m_adpcm_data[Which] != -1)
{
device->data_w(m_adpcm_data[chip] & 0x0f);
m_adpcm_data[chip] = -1;
m_msm[Which]->data_w(m_adpcm_data[Which] & 0x0f);
m_adpcm_data[Which] = -1;
}
else
{
uint8_t *ROM = memregion("adpcm")->base() + 0x10000 * chip;
uint8_t *rom = &m_adpcm_rom[0x10000 * Which];
m_adpcm_data[chip] = ROM[m_adpcm_pos[chip]++];
device->data_w(m_adpcm_data[chip] >> 4);
m_adpcm_data[Which] = rom[m_adpcm_pos[Which]++];
m_msm[Which]->data_w(m_adpcm_data[Which] >> 4);
}
}
WRITE_LINE_MEMBER(spdodgeb_state::spd_adpcm_int_1)
{
spd_adpcm_int(m_msm1, 0);
}
WRITE_LINE_MEMBER(spdodgeb_state::spd_adpcm_int_2)
{
spd_adpcm_int(m_msm2, 1);
}
uint8_t spdodgeb_state::mcu63701_r(offs_t offset)
{
// logerror("CPU #0 PC %04x: read from port %02x of 63701 data address 3801\n",m_maincpu->pc(),offset);
@ -114,30 +401,30 @@ void spdodgeb_state::mcu_nmi_w(uint8_t data)
void spdodgeb_state::spdodgeb_map(address_map &map)
void spdodgeb_state::main_map(address_map &map)
{
map(0x0000, 0x0fff).ram();
map(0x1000, 0x10ff).writeonly().share("spriteram");
map(0x2000, 0x2fff).ram().w(FUNC(spdodgeb_state::videoram_w)).share("videoram");
map(0x1000, 0x10ff).writeonly().share(m_spriteram);
map(0x2000, 0x2fff).ram().w(FUNC(spdodgeb_state::videoram_w)).share(m_videoram);
map(0x3000, 0x3000).portr("IN0"); //.nopw();
map(0x3001, 0x3001).portr("DSW"); //.nopw();
map(0x3002, 0x3002).w(m_soundlatch, FUNC(generic_latch_8_device::write));
// map(0x3003, 0x3003).nopw();
map(0x3004, 0x3004).w(FUNC(spdodgeb_state::scrollx_lo_w));
map(0x3005, 0x3005).w(FUNC(spdodgeb_state::mcu_nmi_w));
map(0x3006, 0x3006).w(FUNC(spdodgeb_state::ctrl_w)); /* scroll hi, flip screen, bank switch, palette select */
map(0x3006, 0x3006).w(FUNC(spdodgeb_state::ctrl_w)); // scroll hi, flip screen, bank switch, palette select
map(0x3800, 0x3800).w("mculatch", FUNC(generic_latch_8_device::write));
map(0x3801, 0x3805).r(FUNC(spdodgeb_state::mcu63701_r));
map(0x4000, 0x7fff).bankr("mainbank");
map(0x4000, 0x7fff).bankr(m_mainbank);
map(0x8000, 0xffff).rom();
}
void spdodgeb_state::spdodgeb_sound_map(address_map &map)
void spdodgeb_state::sound_map(address_map &map)
{
map(0x0000, 0x0fff).ram();
map(0x1000, 0x1000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0x2800, 0x2801).w("ymsnd", FUNC(ym3812_device::write));
map(0x3800, 0x3807).w(FUNC(spdodgeb_state::spd_adpcm_w));
map(0x3800, 0x3807).w(FUNC(spdodgeb_state::adpcm_w));
map(0x8000, 0xffff).rom().region("audiocpu", 0);
}
@ -256,8 +543,8 @@ static const gfx_layout spritelayout =
};
static GFXDECODE_START( gfx_spdodgeb )
GFXDECODE_ENTRY( "text", 0, charlayout, 0x000, 32 ) /* colors 0x000-0x1ff */
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 0x200, 32 ) /* colors 0x200-0x3ff */
GFXDECODE_ENTRY( "text", 0, charlayout, 0x000, 32 ) // colors 0x000-0x1ff
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 0x200, 32 ) // colors 0x200-0x3ff
GFXDECODE_END
@ -283,13 +570,13 @@ void spdodgeb_state::machine_reset()
void spdodgeb_state::spdodgeb(machine_config &config)
{
/* basic machine hardware */
M6502(config, m_maincpu, XTAL(12'000'000)/6); /* 2MHz ? */
m_maincpu->set_addrmap(AS_PROGRAM, &spdodgeb_state::spdodgeb_map);
TIMER(config, "scantimer").configure_scanline(FUNC(spdodgeb_state::interrupt), "screen", 0, 1); /* 1 IRQ every 8 visible scanlines, plus NMI for vblank */
// basic machine hardware
M6502(config, m_maincpu, XTAL(12'000'000) / 6); // 2MHz ?
m_maincpu->set_addrmap(AS_PROGRAM, &spdodgeb_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(spdodgeb_state::interrupt), "screen", 0, 1); // 1 IRQ every 8 visible scanlines, plus NMI for vblank
MC6809(config, m_audiocpu, XTAL(12'000'000)/2); // HD68A09P (1.5MHz internally)
m_audiocpu->set_addrmap(AS_PROGRAM, &spdodgeb_state::spdodgeb_sound_map);
MC6809(config, m_audiocpu, XTAL(12'000'000) / 2); // HD68A09P (1.5MHz internally)
m_audiocpu->set_addrmap(AS_PROGRAM, &spdodgeb_state::sound_map);
hd63701y0_cpu_device &mcu(HD63701Y0(config, m_mcu, 4'000'000)); // unknown clock
mcu.set_addrmap(AS_PROGRAM, &spdodgeb_state::mcu_map);
@ -300,53 +587,53 @@ void spdodgeb_state::spdodgeb(machine_config &config)
GENERIC_LATCH_8(config, "mculatch");
/* video hardware */
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(XTAL(12'000'000)/2, 384, 0, 256, 272, 0, 240);
m_screen->set_raw(XTAL(12'000'000) / 2, 384, 0, 256, 272, 0, 240);
m_screen->set_screen_update(FUNC(spdodgeb_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_spdodgeb);
PALETTE(config, m_palette, FUNC(spdodgeb_state::spdodgeb_palette), 1024);
PALETTE(config, m_palette, FUNC(spdodgeb_state::palette), 1024);
/* sound hardware */
// sound hardware
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, M6809_IRQ_LINE);
ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(12'000'000)/4));
ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(12'000'000) / 4));
ymsnd.irq_handler().set_inputline(m_audiocpu, M6809_FIRQ_LINE);
ymsnd.add_route(ALL_OUTPUTS, "lspeaker", 1.0);
ymsnd.add_route(ALL_OUTPUTS, "rspeaker", 1.0);
MSM5205(config, m_msm1, 384000);
m_msm1->vck_legacy_callback().set(FUNC(spdodgeb_state::spd_adpcm_int_1)); /* interrupt function */
m_msm1->set_prescaler_selector(msm5205_device::S48_4B); /* 8kHz? */
m_msm1->add_route(ALL_OUTPUTS, "lspeaker", 0.50);
m_msm1->add_route(ALL_OUTPUTS, "rspeaker", 0.50);
MSM5205(config, m_msm[0], 384000);
m_msm[0]->vck_legacy_callback().set(FUNC(spdodgeb_state::adpcm_int<0>)); // interrupt function
m_msm[0]->set_prescaler_selector(msm5205_device::S48_4B); // 8kHz?
m_msm[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.50);
m_msm[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.50);
MSM5205(config, m_msm2, 384000);
m_msm2->vck_legacy_callback().set(FUNC(spdodgeb_state::spd_adpcm_int_2)); /* interrupt function */
m_msm2->set_prescaler_selector(msm5205_device::S48_4B); /* 8kHz? */
m_msm2->add_route(ALL_OUTPUTS, "lspeaker", 0.50);
m_msm2->add_route(ALL_OUTPUTS, "rspeaker", 0.50);
MSM5205(config, m_msm[1], 384000);
m_msm[1]->vck_legacy_callback().set(FUNC(spdodgeb_state::adpcm_int<1>)); // interrupt function
m_msm[1]->set_prescaler_selector(msm5205_device::S48_4B); // 8kHz?
m_msm[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.50);
m_msm[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.50);
}
ROM_START( spdodgeb )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "22a-04.139", 0x00000, 0x10000, CRC(66071fda) SHA1(4a239295900e6234a2a693321ca821671747a58e) ) /* First 0x8000: Two banks, second 0x8000: Static */
ROM_LOAD( "22a-04.139", 0x00000, 0x10000, CRC(66071fda) SHA1(4a239295900e6234a2a693321ca821671747a58e) ) // First 0x8000: Two banks, second 0x8000: Static
ROM_REGION( 0x08000, "audiocpu", 0 ) /* audio cpu */
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "22j5-0.33", 0x00000, 0x08000, CRC(c31e264e) SHA1(0828a2094122e3934b784ec9ad7c2b89d91a83bb) )
ROM_REGION( 0x04000, "mcu", 0 ) /* I/O mcu */
ROM_REGION( 0x04000, "mcu", 0 ) // I/O
ROM_LOAD( "22ja-0.162", 0x00000, 0x04000, CRC(7162a97b) SHA1(d6d4ee025e73a340428345f08711cd32f9169a8c) )
ROM_REGION( 0x40000, "text", 0 ) /* text */
ROM_REGION( 0x40000, "text", 0 )
ROM_LOAD( "22a-4.121", 0x00000, 0x20000, CRC(acc26051) SHA1(445224238cce420990894824d95447e3f63a9ef0) )
ROM_LOAD( "22a-3.107", 0x20000, 0x20000, CRC(10bb800d) SHA1(265a3d67669034d17713b505ef55cd1c90f8d205) )
@ -354,11 +641,11 @@ ROM_START( spdodgeb )
ROM_LOAD( "22a-1.2", 0x00000, 0x20000, CRC(3bd1c3ec) SHA1(40f61552ea6f7a81915fe3e13f75dc1dc69da33e) )
ROM_LOAD( "22a-2.35", 0x20000, 0x20000, CRC(409e1be1) SHA1(35a77fc8fe6fc212734e2f452dbde9b8cf696f61) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x20000, "adpcm", 0 )
ROM_LOAD( "22j6-0.83", 0x00000, 0x10000, CRC(744a26e3) SHA1(519f22f1e5cc417cb8f9ced97e959d23c711283b) )
ROM_LOAD( "22j7-0.82", 0x10000, 0x10000, CRC(2fa1de21) SHA1(e8c7af6057b64ecadd3473b82abd8e9f873082fd) )
ROM_REGION( 0x0800, "proms", 0 ) /* color PROMs */
ROM_REGION( 0x0800, "proms", 0 ) // colors
ROM_LOAD( "mb7132e.158", 0x0000, 0x0400, CRC(7e623722) SHA1(e1fe60533237bd0aba5c8de9775df620ed5227c0) )
ROM_LOAD( "mb7122e.159", 0x0400, 0x0400, CRC(69706e8d) SHA1(778ee88ff566aa38c80e0e61bb3fe8458f0e9450) )
ROM_END
@ -396,15 +683,15 @@ TJ22J2-0.35 /
ROM_START( nkdodge )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "22j4-0.139", 0x00000, 0x10000, CRC(aa674fd8) SHA1(4e8d3e07b54d23b221cb39cf10389bc7a56c4021) ) /* First 0x8000: Two banks, second 0x8000: Static */
ROM_LOAD( "22j4-0.139", 0x00000, 0x10000, CRC(aa674fd8) SHA1(4e8d3e07b54d23b221cb39cf10389bc7a56c4021) ) // First 0x8000: Two banks, second 0x8000: Static
ROM_REGION( 0x08000, "audiocpu", 0 ) /* audio cpu */
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "22j5-0.33", 0x00000, 0x08000, CRC(c31e264e) SHA1(0828a2094122e3934b784ec9ad7c2b89d91a83bb) )
ROM_REGION( 0x04000, "mcu", 0 ) /* I/O mcu */
ROM_REGION( 0x04000, "mcu", 0 ) // I/O
ROM_LOAD( "22ja-0.162", 0x00000, 0x04000, CRC(7162a97b) SHA1(d6d4ee025e73a340428345f08711cd32f9169a8c) )
ROM_REGION( 0x40000, "text", 0 ) /* text */
ROM_REGION( 0x40000, "text", 0 )
ROM_LOAD( "tj22j4-0.121", 0x00000, 0x20000, CRC(d2922b3f) SHA1(30ad37f8355c732b545017c2fc56879256b650be) )
ROM_LOAD( "tj22j3-0.107", 0x20000, 0x20000, CRC(79cd1315) SHA1(2d7a877e59f704b10b5f609e60fa565c68f5fdb0) )
@ -412,28 +699,28 @@ ROM_START( nkdodge )
ROM_LOAD( "tj22j1-0.2", 0x00000, 0x20000, CRC(9ed27a8d) SHA1(d80d275bbe91f3e1bd0495a2d7a3be0280a7cda1) )
ROM_LOAD( "tj22j2-0.35", 0x20000, 0x20000, CRC(768934f9) SHA1(922f3154dcfb29c2e5c1bebc53247136160f1229) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x20000, "adpcm", 0 )
ROM_LOAD( "22j6-0.83", 0x00000, 0x10000, CRC(744a26e3) SHA1(519f22f1e5cc417cb8f9ced97e959d23c711283b) )
ROM_LOAD( "22j7-0.82", 0x10000, 0x10000, CRC(2fa1de21) SHA1(e8c7af6057b64ecadd3473b82abd8e9f873082fd) )
ROM_REGION( 0x0800, "proms", 0 ) /* color PROMs */
ROM_REGION( 0x0800, "proms", 0 ) // colors
ROM_LOAD( "22j8-0.158", 0x0000, 0x0400, CRC(c368440f) SHA1(39762d102a42211f24db16bc721b01230df1c4d6) )
ROM_LOAD( "22j9-0.159", 0x0400, 0x0400, CRC(6059f401) SHA1(280b1bda3a55f2d8c2fd4552c4dcec7100f0170f) )
ROM_END
/* the bootleg just seems to have the gfx roms in a different format, program is identical */
// the bootleg just seems to have the gfx ROMs in a different format, program is identical
ROM_START( nkdodgeb )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "12.bin", 0x00000, 0x10000, CRC(aa674fd8) SHA1(4e8d3e07b54d23b221cb39cf10389bc7a56c4021) ) /* First 0x8000: Two banks, second 0x8000: Static */
ROM_LOAD( "12.bin", 0x00000, 0x10000, CRC(aa674fd8) SHA1(4e8d3e07b54d23b221cb39cf10389bc7a56c4021) ) // First 0x8000: Two banks, second 0x8000: Static
ROM_REGION( 0x08000, "audiocpu", 0 ) /* audio cpu */
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "22j5-0.33", 0x00000, 0x08000, CRC(c31e264e) SHA1(0828a2094122e3934b784ec9ad7c2b89d91a83bb) )
ROM_REGION( 0x04000, "mcu", 0 ) /* I/O mcu */
ROM_REGION( 0x04000, "mcu", 0 ) // I/O
ROM_LOAD( "hd63701y0p.n12", 0x0000, 0x4000, CRC(7162a97b) SHA1(d6d4ee025e73a340428345f08711cd32f9169a8c) BAD_DUMP ) // missing from dump, but probably also identical
ROM_REGION( 0x40000, "text", 0 ) /* text */
ROM_REGION( 0x40000, "text", 0 )
ROM_LOAD( "10.bin", 0x00000, 0x10000, CRC(442326fd) SHA1(e0e9e1dfdca3edd6e2522f55c191b40b81b8eaff) )
ROM_LOAD( "11.bin", 0x10000, 0x10000, CRC(2140b070) SHA1(7a9d89eb6130b1dd21236fefaeb09a29c7f0d208) )
ROM_LOAD( "9.bin", 0x20000, 0x10000, CRC(18660ac1) SHA1(be6a47eea9649d7b9ff8b30a4de643522c9869e6) )
@ -445,15 +732,16 @@ ROM_START( nkdodgeb )
ROM_LOAD( "4.bin", 0x20000, 0x10000, CRC(f5022822) SHA1(fa67b1f70da80365f14776b712df6f656e603fb0) )
ROM_LOAD( "3.bin", 0x30000, 0x10000, CRC(05a71179) SHA1(7e5ed81b37ac458d7a40e89f83f1efb742e797a8) )
ROM_REGION( 0x20000, "adpcm", 0 ) /* adpcm samples */
ROM_REGION( 0x20000, "adpcm", 0 )
ROM_LOAD( "22j6-0.83", 0x00000, 0x10000, CRC(744a26e3) SHA1(519f22f1e5cc417cb8f9ced97e959d23c711283b) )
ROM_LOAD( "22j7-0.82", 0x10000, 0x10000, CRC(2fa1de21) SHA1(e8c7af6057b64ecadd3473b82abd8e9f873082fd) )
ROM_REGION( 0x0800, "proms", 0 ) /* color PROMs */
ROM_REGION( 0x0800, "proms", 0 ) // colors
ROM_LOAD( "27s191.bin", 0x0000, 0x0800, CRC(317e42ea) SHA1(59caacc02fb7fb11604bd177f790fd68830ca7c1) )
ROM_LOAD( "82s137.bin", 0x0400, 0x0400, CRC(6059f401) SHA1(280b1bda3a55f2d8c2fd4552c4dcec7100f0170f) )
ROM_END
} // anonymous namespace
GAME( 1987, spdodgeb, 0, spdodgeb, spdodgeb, spdodgeb_state, empty_init, ROT0, "Technos Japan", "Super Dodge Ball (US)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,49 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ville Laitinen, Aaron Giles
/***************************************************************************
Sun Electronics Kangaroo hardware
driver by Ville Laitinen
***************************************************************************/
#include "emupal.h"
class kangaroo_state : public driver_device
{
public:
kangaroo_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_video_control(*this, "video_control"),
m_maincpu(*this, "maincpu"),
m_palette(*this, "palette") { }
/* memory pointers */
required_shared_ptr<uint8_t> m_video_control;
/* video-related */
std::unique_ptr<uint32_t[]> m_videoram{};
/* misc */
uint8_t m_mcu_clock = 0U;
uint8_t mcu_sim_r();
void mcu_sim_w(uint8_t data);
void kangaroo_coin_counter_w(uint8_t data);
void kangaroo_videoram_w(offs_t offset, uint8_t data);
void kangaroo_video_control_w(offs_t offset, uint8_t data);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
DECLARE_MACHINE_START(kangaroo_mcu);
uint32_t screen_update_kangaroo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void videoram_write( uint16_t offset, uint8_t data, uint8_t mask );
void blitter_execute( );
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
void nomcu(machine_config &config);
void mcu(machine_config &config);
void main_map(address_map &map);
void sound_map(address_map &map);
void sound_portmap(address_map &map);
};

View File

@ -1,56 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
#ifndef MAME_INCLUDES_SHISEN_H
#define MAME_INCLUDES_SHISEN_H
#pragma once
#include "audio/m72.h"
#include "emupal.h"
#include "tilemap.h"
class shisen_state : public driver_device
{
public:
shisen_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audio(*this, "m72"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_paletteram(*this, "paletteram"),
m_videoram(*this, "videoram")
{ }
void shisen(machine_config &config);
private:
required_device<cpu_device> m_maincpu;
required_device<m72_audio_device> m_audio;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_paletteram;
required_shared_ptr<uint8_t> m_videoram;
int m_gfxbank = 0;
tilemap_t *m_bg_tilemap = nullptr;
void coin_w(uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
void bankswitch_w(uint8_t data);
void paletteram_w(offs_t offset, uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void video_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void shisen_io_map(address_map &map);
void shisen_map(address_map &map);
void shisen_sound_io_map(address_map &map);
void shisen_sound_map(address_map &map);
};
#endif // MAME_INCLUDES_SHISEN_H

View File

@ -1,80 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
#ifndef MAME_INCLUDES_SKYKID_H
#define MAME_INCLUDES_SKYKID_H
#pragma once
#include "cpu/m6800/m6801.h"
#include "sound/namco.h"
#include "emupal.h"
#include "tilemap.h"
class skykid_state : public driver_device
{
public:
skykid_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_videoram(*this, "videoram")
, m_textram(*this, "textram")
, m_spriteram(*this, "spriteram")
, m_maincpu(*this, "maincpu")
, m_mcu(*this, "mcu")
, m_cus30(*this, "namco")
, m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette")
, m_leds(*this, "led%u", 0U)
{ }
void skykid(machine_config &config);
void init_skykid();
private:
void inputport_select_w(uint8_t data);
uint8_t inputport_r();
void skykid_led_w(uint8_t data);
void skykid_subreset_w(offs_t offset, uint8_t data);
void skykid_bankswitch_w(offs_t offset, uint8_t data);
void skykid_irq_1_ctrl_w(offs_t offset, uint8_t data);
void skykid_irq_2_ctrl_w(offs_t offset, uint8_t data);
uint8_t skykid_videoram_r(offs_t offset);
void skykid_videoram_w(offs_t offset, uint8_t data);
uint8_t skykid_textram_r(offs_t offset);
void skykid_textram_w(offs_t offset, uint8_t data);
void skykid_scroll_x_w(offs_t offset, uint8_t data);
void skykid_scroll_y_w(offs_t offset, uint8_t data);
void skykid_flipscreen_priority_w(offs_t offset, uint8_t data);
TILEMAP_MAPPER_MEMBER(tx_tilemap_scan);
TILE_GET_INFO_MEMBER(tx_get_tile_info);
TILE_GET_INFO_MEMBER(bg_get_tile_info);
void skykid_palette(palette_device &palette) const;
uint32_t screen_update_skykid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
void mcu_map(address_map &map);
void skykid_map(address_map &map);
virtual void machine_start() override;
virtual void video_start() override;
uint8_t m_inputport_selected = 0;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_textram;
required_shared_ptr<uint8_t> m_spriteram;
required_device<cpu_device> m_maincpu;
required_device<hd63701v0_cpu_device> m_mcu;
required_device<namco_cus30_device> m_cus30;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
output_finder<2> m_leds;
tilemap_t *m_bg_tilemap = nullptr;
tilemap_t *m_tx_tilemap = nullptr;
uint8_t m_priority = 0;
uint16_t m_scroll_x = 0;
uint16_t m_scroll_y = 0;
uint8_t m_main_irq_mask = 0;
uint8_t m_mcu_irq_mask = 0;
};
#endif // MAME_INCLUDES_SKYKID_H

View File

@ -1,101 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Paul Hampson, Nicola Salmoria
/*************************************************************************
Super Dodge Ball hardware
*************************************************************************/
#ifndef MAME_INCLUDES_SPDODGEB_H
#define MAME_INCLUDES_SPDODGEB_H
#pragma once
#include "machine/gen_latch.h"
#include "machine/timer.h"
#include "sound/msm5205.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
class spdodgeb_state : public driver_device
{
public:
spdodgeb_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_mcu(*this, "mcu"),
m_msm1(*this, "msm1"),
m_msm2(*this, "msm2"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram")
{ }
void spdodgeb(machine_config &config);
DECLARE_READ_LINE_MEMBER(mcu_busy_r);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_mcu;
required_device<msm5205_device> m_msm1;
required_device<msm5205_device> m_msm2;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
int m_adpcm_pos[2]{};
int m_adpcm_end[2]{};
int m_adpcm_idle[2]{};
int m_adpcm_data[2]{};
uint8_t m_mcu_status = 0;
uint8_t m_inputs[5]{};
int m_tile_palbank = 0;
int m_sprite_palbank = 0;
tilemap_t *m_bg_tilemap = nullptr;
int m_lastscroll = 0;
void spd_adpcm_w(offs_t offset, uint8_t data);
uint8_t mcu63701_r(offs_t offset);
void mcu_data_w(offs_t offset, uint8_t data);
void mcu_status_w(uint8_t data);
void mcu_nmi_w(uint8_t data);
void scrollx_lo_w(uint8_t data);
void ctrl_w(uint8_t data);
void videoram_w(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER(spd_adpcm_int_1);
DECLARE_WRITE_LINE_MEMBER(spd_adpcm_int_2);
TILEMAP_MAPPER_MEMBER(background_scan);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
void spdodgeb_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 );
TIMER_DEVICE_CALLBACK_MEMBER(interrupt);
void spd_adpcm_int(msm5205_device *device, int chip);
void spdodgeb_map(address_map &map);
void spdodgeb_sound_map(address_map &map);
void mcu_map(address_map &map);
};
#endif // MAME_INCLUDES_SPDODGEB_H

View File

@ -1,190 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ville Laitinen, Aaron Giles
/***************************************************************************
Sun Electronics Kangaroo hardware
***************************************************************************/
#include "emu.h"
#include "includes/kangaroo.h"
/*************************************
*
* Video setup
*
*************************************/
void kangaroo_state::video_start()
{
/* video RAM is accessed 32 bits at a time (two planes, 4bpp each, 4 pixels) */
m_videoram = std::make_unique<uint32_t[]>(256 * 64);
save_pointer(NAME(m_videoram), 256 * 64);
}
/*************************************
*
* Video RAM accesses
*
*************************************/
void kangaroo_state::videoram_write( uint16_t offset, uint8_t data, uint8_t mask )
{
uint32_t expdata, layermask;
/* data contains 4 2-bit values packed as DCBADCBA; expand these into 4 8-bit values */
expdata = 0;
if (data & 0x01) expdata |= 0x00000055;
if (data & 0x10) expdata |= 0x000000aa;
if (data & 0x02) expdata |= 0x00005500;
if (data & 0x20) expdata |= 0x0000aa00;
if (data & 0x04) expdata |= 0x00550000;
if (data & 0x40) expdata |= 0x00aa0000;
if (data & 0x08) expdata |= 0x55000000;
if (data & 0x80) expdata |= 0xaa000000;
/* determine which layers are enabled */
layermask = 0;
if (mask & 0x08) layermask |= 0x30303030;
if (mask & 0x04) layermask |= 0xc0c0c0c0;
if (mask & 0x02) layermask |= 0x03030303;
if (mask & 0x01) layermask |= 0x0c0c0c0c;
/* update layers */
m_videoram[offset] = (m_videoram[offset] & ~layermask) | (expdata & layermask);
}
void kangaroo_state::kangaroo_videoram_w(offs_t offset, uint8_t data)
{
videoram_write(offset, data, m_video_control[8]);
}
/*************************************
*
* Video control writes
*
*************************************/
void kangaroo_state::kangaroo_video_control_w(offs_t offset, uint8_t data)
{
m_video_control[offset] = data;
switch (offset)
{
case 5: /* blitter start */
blitter_execute();
break;
case 8: /* bank select */
membank("bank1")->set_entry((data & 0x05) ? 0 : 1);
break;
}
}
/*************************************
*
* DMA blitter
*
*************************************/
void kangaroo_state::blitter_execute( )
{
uint32_t gfxhalfsize = memregion("gfx1")->bytes() / 2;
const uint8_t *gfxbase = memregion("gfx1")->base();
uint16_t src = m_video_control[0] + 256 * m_video_control[1];
uint16_t dst = m_video_control[2] + 256 * m_video_control[3];
uint8_t height = m_video_control[5];
uint8_t width = m_video_control[4];
uint8_t mask = m_video_control[8];
int x, y;
/* during DMA operations, the top 2 bits are ORed together, as well as the bottom 2 bits */
/* adjust the mask to account for this */
if (mask & 0x0c) mask |= 0x0c;
if (mask & 0x03) mask |= 0x03;
/* loop over height, then width */
for (y = 0; y <= height; y++, dst += 256)
for (x = 0; x <= width; x++)
{
uint16_t effdst = (dst + x) & 0x3fff;
uint16_t effsrc = src++ & (gfxhalfsize - 1);
videoram_write(effdst, gfxbase[0 * gfxhalfsize + effsrc], mask & 0x05);
videoram_write(effdst, gfxbase[1 * gfxhalfsize + effsrc], mask & 0x0a);
}
}
/*************************************
*
* Video updater
*
*************************************/
uint32_t kangaroo_state::screen_update_kangaroo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t scrolly = m_video_control[6];
uint8_t scrollx = m_video_control[7];
uint8_t maska = (m_video_control[10] & 0x28) >> 3;
uint8_t maskb = (m_video_control[10] & 0x07) >> 0;
uint8_t xora = (m_video_control[9] & 0x20) ? 0xff : 0x00;
uint8_t xorb = (m_video_control[9] & 0x10) ? 0xff : 0x00;
uint8_t enaa = (m_video_control[9] & 0x08);
uint8_t enab = (m_video_control[9] & 0x04);
uint8_t pria = (~m_video_control[9] & 0x02);
uint8_t prib = (~m_video_control[9] & 0x01);
/* iterate over pixels */
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
uint32_t *const dest = &bitmap.pix(y);
for (int x = cliprect.min_x; x <= cliprect.max_x; x += 2)
{
uint8_t effxa = scrollx + ((x / 2) ^ xora);
uint8_t effya = scrolly + (y ^ xora);
uint8_t effxb = (x / 2) ^ xorb;
uint8_t effyb = y ^ xorb;
uint8_t pixa = (m_videoram[effya + 256 * (effxa / 4)] >> (8 * (effxa % 4) + 0)) & 0x0f;
uint8_t pixb = (m_videoram[effyb + 256 * (effxb / 4)] >> (8 * (effxb % 4) + 4)) & 0x0f;
uint8_t finalpens;
/* for each layer, contribute bits if (a) enabled, and (b) either has priority or the opposite plane is 0 */
finalpens = 0;
if (enaa && (pria || pixb == 0))
finalpens |= pixa;
if (enab && (prib || pixa == 0))
finalpens |= pixb;
/* store the first of two pixels, which is always full brightness */
dest[x + 0] = m_palette->pen_color(finalpens & 7);
/* KOS1 alternates at 5MHz, offset from the pixel clock by 1/2 clock */
/* when 0, it enables the color mask for pixels with Z = 0 */
finalpens = 0;
if (enaa && (pria || pixb == 0))
{
if (!(pixa & 0x08)) pixa &= maska;
finalpens |= pixa;
}
if (enab && (prib || pixa == 0))
{
if (!(pixb & 0x08)) pixb &= maskb;
finalpens |= pixb;
}
/* store the second of two pixels, which is affected by KOS1 and the A/B masks */
dest[x + 1] = m_palette->pen_color(finalpens & 7);
}
}
return 0;
}

View File

@ -1,70 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
#include "emu.h"
#include "includes/shisen.h"
void shisen_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
void shisen_state::bankswitch_w(uint8_t data)
{
if (data & 0xc0) logerror("bank switch %02x\n",data);
/* bits 0-2 select ROM bank */
membank("bank1")->set_entry(data & 0x07);
/* bits 3-5 select gfx bank */
int bank = (data & 0x38) >> 3;
if (m_gfxbank != bank)
{
m_gfxbank = bank;
machine().tilemap().mark_all_dirty();
}
/* bits 6-7 unknown */
}
void shisen_state::paletteram_w(offs_t offset, uint8_t data)
{
m_paletteram[offset] = data;
offset &= 0xff;
m_palette->set_pen_color(offset, pal5bit(m_paletteram[offset + 0x000]), pal5bit(m_paletteram[offset + 0x100]), pal5bit(m_paletteram[offset + 0x200]));
}
TILE_GET_INFO_MEMBER(shisen_state::get_bg_tile_info)
{
int offs = tile_index * 2;
int code = m_videoram[offs] + ((m_videoram[offs + 1] & 0x0f) << 8) + (m_gfxbank << 12);
int color = (m_videoram[offs + 1] & 0xf0) >> 4;
tileinfo.set(0, code, color, 0);
}
void shisen_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(
*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(shisen_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS,
8, 8, 64, 32);
membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000);
save_item(NAME(m_gfxbank));
}
uint32_t shisen_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// on Irem boards, screen flip is handled in both hardware and software.
// this game doesn't have cocktail mode so if there's software control we don't
// know where it is mapped.
flip_screen_set(~ioport("DSW2")->read() & 1);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}

View File

@ -1,263 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
#include "emu.h"
#include "includes/skykid.h"
/***************************************************************************
Convert the color PROMs.
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 skykid_state::skykid_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 < 0x100; i++)
{
int const r = pal4bit(color_prom[i + 0x000]);
int const g = pal4bit(color_prom[i + 0x100]);
int const 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;
// text palette
for (int i = 0; i < 0x100; i++)
palette.set_pen_indirect(i, i);
// tiles/sprites
for (int i = 0x100; i < 0x500; i++)
{
uint8_t const ctabentry = color_prom[i - 0x100];
palette.set_pen_indirect(i, ctabentry);
}
}
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
/* convert from 32x32 to 36x28 */
TILEMAP_MAPPER_MEMBER(skykid_state::tx_tilemap_scan)
{
int offs;
row += 2;
col -= 2;
if (col & 0x20)
offs = row + ((col & 0x1f) << 5);
else
offs = col + (row << 5);
return offs;
}
TILE_GET_INFO_MEMBER(skykid_state::tx_get_tile_info)
{
int code = m_textram[tile_index];
int attr = m_textram[tile_index + 0x400];
tileinfo.category = code >> 4 & 0xf;
/* the hardware has two character sets, one normal and one flipped. When
screen is flipped, character flip is done by selecting the 2nd character set.
We reproduce this here, but since the tilemap system automatically flips
characters when screen is flipped, we have to flip them back. */
tileinfo.set(0,
code | (flip_screen() ? 0x100 : 0),
attr & 0x3f,
flip_screen() ? (TILE_FLIPY | TILE_FLIPX) : 0);
}
TILE_GET_INFO_MEMBER(skykid_state::bg_get_tile_info)
{
int code = m_videoram[tile_index];
int attr = m_videoram[tile_index+0x800];
tileinfo.set(1,
code + ((attr & 0x01) << 8),
((attr & 0x7e) >> 1) | ((attr & 0x01) << 6),
0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void skykid_state::video_start()
{
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(skykid_state::tx_get_tile_info)), tilemap_mapper_delegate(*this, FUNC(skykid_state::tx_tilemap_scan)), 8,8, 36,28);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(skykid_state::bg_get_tile_info)), TILEMAP_SCAN_ROWS, 8,8, 64,32);
m_tx_tilemap->set_transparent_pen(0);
save_item(NAME(m_priority));
save_item(NAME(m_scroll_x));
save_item(NAME(m_scroll_y));
}
/***************************************************************************
Memory handlers
***************************************************************************/
uint8_t skykid_state::skykid_videoram_r(offs_t offset)
{
return m_videoram[offset];
}
void skykid_state::skykid_videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
uint8_t skykid_state::skykid_textram_r(offs_t offset)
{
return m_textram[offset];
}
void skykid_state::skykid_textram_w(offs_t offset, uint8_t data)
{
m_textram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset & 0x3ff);
}
void skykid_state::skykid_scroll_x_w(offs_t offset, uint8_t data)
{
m_scroll_x = offset;
}
void skykid_state::skykid_scroll_y_w(offs_t offset, uint8_t data)
{
m_scroll_y = offset;
}
void skykid_state::skykid_flipscreen_priority_w(offs_t offset, uint8_t data)
{
m_priority = data;
flip_screen_set(offset & 1);
}
/***************************************************************************
Display Refresh
***************************************************************************/
/* the sprite generator IC is the same as Mappy */
void skykid_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
{
uint8_t *spriteram = m_spriteram + 0x780;
uint8_t *spriteram_2 = spriteram + 0x0800;
uint8_t *spriteram_3 = spriteram_2 + 0x0800;
int offs;
for (offs = 0;offs < 0x80;offs += 2)
{
static const int gfx_offs[2][2] =
{
{ 0, 1 },
{ 2, 3 }
};
int sprite = spriteram[offs] + ((spriteram_3[offs] & 0x80) << 1);
int color = (spriteram[offs+1] & 0x3f);
int sx = (spriteram_2[offs+1]) + 0x100*(spriteram_3[offs+1] & 1) - 71;
int sy = 256 - spriteram_2[offs] - 7;
int flipx = (spriteram_3[offs] & 0x01);
int flipy = (spriteram_3[offs] & 0x02) >> 1;
int sizex = (spriteram_3[offs] & 0x04) >> 2;
int sizey = (spriteram_3[offs] & 0x08) >> 3;
int x,y;
sprite &= ~sizex;
sprite &= ~(sizey << 1);
if (flip_screen())
{
flipx ^= 1;
flipy ^= 1;
}
sy -= 16 * sizey;
sy = (sy & 0xff) - 32; // fix wraparound
for (y = 0;y <= sizey;y++)
{
for (x = 0;x <= sizex;x++)
{
m_gfxdecode->gfx(2)->transmask(bitmap,cliprect,
sprite + gfx_offs[y ^ (sizey * flipy)][x ^ (sizex * flipx)],
color,
flipx,flipy,
sx + 16*x,sy + 16*y,
m_palette->transpen_mask(*m_gfxdecode->gfx(2), color, 0xff));
}
}
}
}
uint32_t skykid_state::screen_update_skykid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
if (flip_screen())
{
m_bg_tilemap->set_scrollx(0, 189 - (m_scroll_x ^ 1));
m_bg_tilemap->set_scrolly(0, 7 - m_scroll_y);
}
else
{
m_bg_tilemap->set_scrollx(0, m_scroll_x + 35);
m_bg_tilemap->set_scrolly(0, m_scroll_y + 25);
}
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0);
if (m_priority & 0x04)
{
// textlayer priority enabled?
int cat, pri = m_priority >> 4;
// draw low priority tiles
m_tx_tilemap->draw(screen, bitmap, cliprect, pri, 0);
draw_sprites(bitmap, cliprect);
// draw the other tiles
for (cat = 0; cat < 0x10; cat++)
if (cat != pri) m_tx_tilemap->draw(screen, bitmap, cliprect, cat, 0);
}
else
{
draw_sprites(bitmap, cliprect);
m_tx_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_ALL_CATEGORIES, 0);
}
return 0;
}

View File

@ -1,210 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Paul Hampson, Nicola Salmoria
#include "emu.h"
#include "includes/spdodgeb.h"
#include "cpu/m6502/m6502.h"
void spdodgeb_state::spdodgeb_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
for (int i = 0;i < palette.entries();i++)
{
int bit0, bit1, bit2, bit3;
// red component
bit0 = BIT(color_prom[0], 0);
bit1 = BIT(color_prom[0], 1);
bit2 = BIT(color_prom[0], 2);
bit3 = BIT(color_prom[0], 3);
int const r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
// green component
bit0 = BIT(color_prom[0], 4);
bit1 = BIT(color_prom[0], 5);
bit2 = BIT(color_prom[0], 6);
bit3 = BIT(color_prom[0], 7);
int const g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
// blue component
bit0 = BIT(color_prom[palette.entries()], 0);
bit1 = BIT(color_prom[palette.entries()], 1);
bit2 = BIT(color_prom[palette.entries()], 2);
bit3 = BIT(color_prom[palette.entries()], 3);
int const b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
palette.set_pen_color(i,rgb_t(r,g,b));
color_prom++;
}
}
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILEMAP_MAPPER_MEMBER(spdodgeb_state::background_scan)
{
/* logical (col,row) -> memory offset */
return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x20) << 5);
}
TILE_GET_INFO_MEMBER(spdodgeb_state::get_bg_tile_info)
{
uint8_t code = m_videoram[tile_index];
uint8_t attr = m_videoram[tile_index + 0x800];
tileinfo.set(0,
code + ((attr & 0x1f) << 8),
((attr & 0xe0) >> 5) + 8 * m_tile_palbank,
0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void spdodgeb_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(spdodgeb_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(spdodgeb_state::background_scan)), 8,8, 64,32);
membank("mainbank")->configure_entries(0, 2, memregion("maincpu")->base(), 0x4000);
save_item(NAME(m_tile_palbank));
save_item(NAME(m_sprite_palbank));
save_item(NAME(m_lastscroll));
}
/***************************************************************************
Memory handlers
***************************************************************************/
TIMER_DEVICE_CALLBACK_MEMBER(spdodgeb_state::interrupt)
{
int scanline = param;
if (scanline == 256)
{
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
m_screen->update_partial(256);
}
else if ((scanline % 8) == 0)
{
m_maincpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE);
m_screen->update_partial(scanline+16); /* TODO: pretty off ... */
}
}
void spdodgeb_state::scrollx_lo_w(uint8_t data)
{
m_lastscroll = (m_lastscroll & 0x100) | data;
}
void spdodgeb_state::ctrl_w(uint8_t data)
{
/* bit 0 = flip screen */
flip_screen_set(data & 0x01);
/* bit 1 = ROM bank switch */
membank("mainbank")->set_entry((~data & 0x02) >> 1);
/* bit 2 = scroll high bit */
m_lastscroll = (m_lastscroll & 0x0ff) | ((data & 0x04) << 6);
/* bit 3 = to mcu?? */
/* bits 4-7 = palette bank select */
if (m_tile_palbank != ((data & 0x30) >> 4))
{
m_tile_palbank = ((data & 0x30) >> 4);
m_bg_tilemap->mark_all_dirty();
}
m_sprite_palbank = (data & 0xc0) >> 6;
}
void spdodgeb_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
/***************************************************************************
Display refresh
***************************************************************************/
#define DRAW_SPRITE( order, sx, sy ) gfx->transpen(bitmap,\
cliprect, \
(which+order),color+ 8 * m_sprite_palbank,flipx,flipy,sx,sy,0);
void spdodgeb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect )
{
gfx_element *gfx = m_gfxdecode->gfx(1);
/* 240-SY Z|F|CLR|WCH WHICH SX
xxxxxxxx x|x|xxx|xxx xxxxxxxx xxxxxxxx
*/
for (int i = 0;i < m_spriteram.bytes();i += 4)
{
int attr = m_spriteram[i+1];
int which = m_spriteram[i+2]+((attr & 0x07)<<8);
int sx = m_spriteram[i+3];
int sy = 240 - m_spriteram[i];
int size = (attr & 0x80) >> 7;
int color = (attr & 0x38) >> 3;
int flipx = ~attr & 0x40;
int flipy = 0;
int dy = -16;
int cy;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
dy = -dy;
}
if (sx < -8) sx += 256; else if (sx > 248) sx -= 256;
switch (size)
{
case 0: /* normal */
if (sy < -8) sy += 256; else if (sy > 248) sy -= 256;
DRAW_SPRITE(0,sx,sy);
break;
case 1: /* double y */
if (flip_screen()) { if (sy > 240) sy -= 256; } else { if (sy < 0) sy += 256; }
cy = sy + dy;
which &= ~1;
DRAW_SPRITE(0,sx,cy);
DRAW_SPRITE(1,sx,sy);
break;
}
}
}
#undef DRAW_SPRITE
uint32_t spdodgeb_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0,m_lastscroll+5);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);
draw_sprites(bitmap,cliprect);
return 0;
}