mirror of
https://github.com/holub/mame
synced 2025-04-16 05:24:54 +03:00
kangaroo.cpp, shisen.cpp, skykid.cpp, spdodgeb.cpp: finders and other small cleanups
This commit is contained in:
parent
232c10aef1
commit
c3a817660d
@ -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",
|
||||
|
@ -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 )
|
||||
|
@ -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 )
|
||||
|
@ -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
|
||||
|
@ -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 )
|
||||
|
@ -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);
|
||||
};
|
@ -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
|
@ -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
|
@ -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
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user