diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index cb3284e2fa4..5d132dd500b 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -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", diff --git a/src/mame/drivers/kangaroo.cpp b/src/mame/drivers/kangaroo.cpp index c4013c0175b..df09dfbbc55 100644 --- a/src/mame/drivers/kangaroo.cpp +++ b/src/mame/drivers/kangaroo.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 m_video_control; + memory_share_creator m_videoram; + required_memory_bank m_blitbank; + required_region_ptr m_blitrom; + + // devices + required_device m_maincpu; + required_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("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 ) diff --git a/src/mame/drivers/shisen.cpp b/src/mame/drivers/shisen.cpp index 0d39df17f11..43f56f65e85 100644 --- a/src/mame/drivers/shisen.cpp +++ b/src/mame/drivers/shisen.cpp @@ -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 m_maincpu; + required_device m_audio; + required_device m_gfxdecode; + required_device m_palette; + + required_shared_ptr m_paletteram; + required_shared_ptr 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 ) diff --git a/src/mame/drivers/skykid.cpp b/src/mame/drivers/skykid.cpp index 328095a3713..be24e4205a5 100644 --- a/src/mame/drivers/skykid.cpp +++ b/src/mame/drivers/skykid.cpp @@ -10,21 +10,359 @@ Driver by Manuel Abadia 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 m_videoram; + required_shared_ptr m_textram; + required_shared_ptr m_spriteram; + required_memory_bank m_rombank; + + required_device m_maincpu; + required_device m_mcu; + required_device m_cus30; + required_device m_gfxdecode; + required_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 diff --git a/src/mame/drivers/spdodgeb.cpp b/src/mame/drivers/spdodgeb.cpp index ea59b2e2436..3ce6f0c87de 100644 --- a/src/mame/drivers/spdodgeb.cpp +++ b/src/mame/drivers/spdodgeb.cpp @@ -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 m_maincpu; + required_device m_audiocpu; + required_device m_mcu; + required_device_array m_msm; + required_device m_gfxdecode; + required_device m_screen; + required_device m_palette; + required_device m_soundlatch; + + required_shared_ptr m_videoram; + required_shared_ptr m_spriteram; + required_memory_bank m_mainbank; + required_region_ptr 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 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 +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 ) diff --git a/src/mame/includes/kangaroo.h b/src/mame/includes/kangaroo.h deleted file mode 100644 index a967ba16e30..00000000000 --- a/src/mame/includes/kangaroo.h +++ /dev/null @@ -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 m_video_control; - - /* video-related */ - std::unique_ptr 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 m_maincpu; - required_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); -}; diff --git a/src/mame/includes/shisen.h b/src/mame/includes/shisen.h deleted file mode 100644 index 64efeba6f52..00000000000 --- a/src/mame/includes/shisen.h +++ /dev/null @@ -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 m_maincpu; - required_device m_audio; - required_device m_gfxdecode; - required_device m_palette; - - required_shared_ptr m_paletteram; - required_shared_ptr 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 diff --git a/src/mame/includes/skykid.h b/src/mame/includes/skykid.h deleted file mode 100644 index fd9c873a85c..00000000000 --- a/src/mame/includes/skykid.h +++ /dev/null @@ -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 m_videoram; - required_shared_ptr m_textram; - required_shared_ptr m_spriteram; - required_device m_maincpu; - required_device m_mcu; - required_device m_cus30; - required_device m_gfxdecode; - required_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 diff --git a/src/mame/includes/spdodgeb.h b/src/mame/includes/spdodgeb.h deleted file mode 100644 index 72eb04a8cfb..00000000000 --- a/src/mame/includes/spdodgeb.h +++ /dev/null @@ -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 m_maincpu; - required_device m_audiocpu; - required_device m_mcu; - required_device m_msm1; - required_device m_msm2; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; - required_device m_soundlatch; - - required_shared_ptr m_videoram; - required_shared_ptr 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 diff --git a/src/mame/video/kangaroo.cpp b/src/mame/video/kangaroo.cpp deleted file mode 100644 index bd40a7141a5..00000000000 --- a/src/mame/video/kangaroo.cpp +++ /dev/null @@ -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(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; -} diff --git a/src/mame/video/shisen.cpp b/src/mame/video/shisen.cpp deleted file mode 100644 index f5bfca49097..00000000000 --- a/src/mame/video/shisen.cpp +++ /dev/null @@ -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; -} diff --git a/src/mame/video/skykid.cpp b/src/mame/video/skykid.cpp deleted file mode 100644 index 60c0c307f8c..00000000000 --- a/src/mame/video/skykid.cpp +++ /dev/null @@ -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; -} diff --git a/src/mame/video/spdodgeb.cpp b/src/mame/video/spdodgeb.cpp deleted file mode 100644 index 45f4bf7bc26..00000000000 --- a/src/mame/video/spdodgeb.cpp +++ /dev/null @@ -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; -}