diff options
Diffstat (limited to 'src/mame/comad/zerozone.cpp')
-rw-r--r-- | src/mame/comad/zerozone.cpp | 154 |
1 files changed, 131 insertions, 23 deletions
diff --git a/src/mame/comad/zerozone.cpp b/src/mame/comad/zerozone.cpp index 2afcc9556e5..d9f9031df6c 100644 --- a/src/mame/comad/zerozone.cpp +++ b/src/mame/comad/zerozone.cpp @@ -1,5 +1,6 @@ // license:BSD-3-Clause -// copyright-holders:Brad Oliver +// copyright-holders: Brad Oliver + /********************************************************************************* Zero Zone memory map @@ -26,18 +27,135 @@ TODO: * adpcm samples don't seem to be playing at the proper tempo - too fast? +EDIT00 ++-------------------------------+ +|AMP PAL 1 Z80A 6 | +| M6295 GM76C28 | +| 2 A1020B | +| 3 GM76C28 | +|J GM76C28 GM76C28 | +|A GM76C28 | +|M 16MHz| +|M DSW1 62256 4 | +|A 62256 5 | +| DSW2 MC68000P10 10MHz | ++-------------------------------+ + + CPU: Motorola MC68000P10 +Sound: GoldStar Z8400A + M6295 branded as AR17961 + TDA1033 AMP +Video: Actel A1020B PL84C + OSC: 16MHz & 10MHz + RAM: Hyundia HY62256ALP1-10 32Kx8bit CMOS SRAM (x2) + GoldStar GM76C28K-10 2Kx8bit CMOS SRAM (x5) + GAL: Lattice GAL16V10B-25LP + DSW: Two 8 switch dipswitches *********************************************************************************/ #include "emu.h" -#include "zerozone.h" #include "cpu/m68000/m68000.h" +#include "cpu/z80/z80.h" +#include "machine/gen_latch.h" #include "sound/okim6295.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" + + +namespace { + +class zerozone_state : public driver_device +{ +public: + zerozone_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_soundlatch(*this, "soundlatch") + , m_gfxdecode(*this, "gfxdecode") + , m_vram(*this, "videoram") + { } + + void zerozone(machine_config &config); + +protected: + // driver_device overrides + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + +private: + // devices + required_device<cpu_device> m_maincpu; + required_device<z80_device> m_audiocpu; + required_device<generic_latch_8_device> m_soundlatch; + required_device<gfxdecode_device> m_gfxdecode; + + // shared pointers + required_shared_ptr<uint16_t> m_vram; + + // video-related + uint8_t m_tilebank = 0; + tilemap_t *m_tilemap = nullptr; + + void sound_w(uint8_t data); + void vblank_w(int state); + + void tilemap_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void tilebank_w(uint8_t data); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void main_map(address_map &map); + void sound_map(address_map &map); + + TILE_GET_INFO_MEMBER(get_tile_info); +}; + + +void zerozone_state::tilemap_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_vram[offset]); + m_tilemap->mark_tile_dirty(offset); +} + + +void zerozone_state::tilebank_w(uint8_t data) +{ + m_tilebank = data & 0x07; + m_tilemap->mark_all_dirty(); +} + +TILE_GET_INFO_MEMBER(zerozone_state::get_tile_info) +{ + int tileno = m_vram[tile_index] & 0x07ff; + int const colour = m_vram[tile_index] & 0xf000; + + if (m_vram[tile_index] & 0x0800) + tileno += m_tilebank * 0x800; + + tileinfo.set(0, tileno, colour >> 12, 0); +} + +void zerozone_state::video_start() +{ + // I'm not 100% sure it should be opaque, pink title screen looks strange in Las Vegas Girls + // but if it's transparent other things look incorrect + m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(zerozone_state::get_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64, 32); +} + +uint32_t zerozone_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_tilemap->draw(screen, bitmap, cliprect); + return 0; +} + void zerozone_state::sound_w(uint8_t data) @@ -141,20 +259,8 @@ static INPUT_PORTS_START( zerozone ) INPUT_PORTS_END -static const gfx_layout charlayout = -{ - 8,8, // 8*8 characters - RGN_FRAC(1,1), // 4096 characters - 4, // 4 bits per pixel - { 0, 1, 2, 3 }, - { 0, 4, 8+0, 8+4, 16+0, 16+4, 24+0, 24+4 }, - { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, - 32*8 // every sprite takes 32 consecutive bytes -}; - - static GFXDECODE_START( gfx_zerozone ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 256 ) // sprites & playfield + GFXDECODE_ENTRY( "gfx", 0, gfx_8x8x4_packed_msb, 0, 256 ) // sprites & playfield GFXDECODE_END @@ -168,7 +274,7 @@ void zerozone_state::machine_reset() m_tilebank = 0; } -WRITE_LINE_MEMBER(zerozone_state::vblank_w) +void zerozone_state::vblank_w(int state) { // TODO: Not accurate, find vblank acknowledge if (state) @@ -181,7 +287,7 @@ void zerozone_state::zerozone(machine_config &config) M68000(config, m_maincpu, 10_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &zerozone_state::main_map); - Z80(config, m_audiocpu, 16_MHz_XTAL / 16); // divisor not verified, 1 MHz ??? + Z80(config, m_audiocpu, 16_MHz_XTAL / 4); // Z80A clocked at either 2.5MHz (10MH/4) or 4MHz (16MHz/4) - not verified m_audiocpu->set_addrmap(AS_PROGRAM, &zerozone_state::sound_map); config.set_maximum_quantum(attotime::from_hz(600)); @@ -205,7 +311,7 @@ void zerozone_state::zerozone(machine_config &config) GENERIC_LATCH_8(config, m_soundlatch); - okim6295_device &oki(OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH)); // clock frequency & pin 7 not verified + okim6295_device &oki(OKIM6295(config, "oki", 16_MHz_XTAL / 16, okim6295_device::PIN7_HIGH)); // 1MHz - clock frequency & pin 7 not verified oki.add_route(ALL_OUTPUTS, "mono", 1.0); } @@ -218,14 +324,14 @@ void zerozone_state::zerozone(machine_config &config) ***************************************************************************/ ROM_START( zerozone ) // PCB 'COMAD MADE IN KOREA 93 EDIT00', sticker 'COMAD-078' - ROM_REGION( 0x20000, "maincpu", 0 ) // 128k for 68000 code + ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "zz-4.rom", 0x0000, 0x10000, CRC(83718b9b) SHA1(b3fc6da5816142b9c92a7b8615eb5bcb2c78ea46) ) ROM_LOAD16_BYTE( "zz-5.rom", 0x0001, 0x10000, CRC(18557f41) SHA1(6ef908732b7775c1ea2b33f799635075db5756de) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "zz-1.rom", 0x00000, 0x08000, CRC(223ccce5) SHA1(3aa25ca914960b929dc853d07a958ed874e42fee) ) - ROM_REGION( 0x080000, "gfx1", 0 ) + ROM_REGION( 0x080000, "gfx", 0 ) ROM_LOAD( "zz-6.rom", 0x00000, 0x80000, CRC(c8b906b9) SHA1(1775d69df6397d6772b20c65751d44556d76c033) ) ROM_REGION( 0x40000, "oki", 0 ) // ADPCM samples @@ -234,14 +340,14 @@ ROM_START( zerozone ) // PCB 'COMAD MADE IN KOREA 93 EDIT00', sticker 'COMAD-078 ROM_END ROM_START( lvgirl94 ) // PCB 'COMAD MADE IN KOREA 93 EDIT00', sticker 'COMAD-078' - ROM_REGION( 0x20000, "maincpu", 0 ) // 128k for 68000 code + ROM_REGION( 0x20000, "maincpu", 0 ) // 68000 ROM_LOAD16_BYTE( "rom4", 0x0000, 0x10000, CRC(c4fb449e) SHA1(dd1c567ba2cf951267dd622e2e9af265e742f246) ) ROM_LOAD16_BYTE( "rom5", 0x0001, 0x10000, CRC(5d446a1a) SHA1(2d7ea25e5b86e7cf4eb7f10daa1eaaaed6830a53) ) - ROM_REGION( 0x080000, "gfx1", 0 ) + ROM_REGION( 0x080000, "gfx", 0 ) ROM_LOAD( "rom6", 0x00000, 0x40000, CRC(eeeb94ba) SHA1(9da09312c090ef2d40f596247d9a7decf3724e54) ) - // sound roms are the same as zerozone + // sound ROMs are the same as zerozone ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "rom1", 0x00000, 0x08000, CRC(223ccce5) SHA1(3aa25ca914960b929dc853d07a958ed874e42fee) ) @@ -250,6 +356,8 @@ ROM_START( lvgirl94 ) // PCB 'COMAD MADE IN KOREA 93 EDIT00', sticker 'COMAD-078 ROM_LOAD( "rom3", 0x20000, 0x20000, CRC(e348ff5e) SHA1(6d2755d9b31366f4c2ddd296790234deb8f821c8) ) ROM_END +} // anonymous namespace + GAME( 1993, zerozone, 0, zerozone, zerozone, zerozone_state, empty_init, ROT0, "Comad", "Zero Zone", MACHINE_SUPPORTS_SAVE ) GAME( 1994, lvgirl94, 0, zerozone, zerozone, zerozone_state, empty_init, ROT0, "Comad", "Las Vegas Girl (Girl '94)", MACHINE_SUPPORTS_SAVE ) |