summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/comad/zerozone.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/comad/zerozone.cpp')
-rw-r--r--src/mame/comad/zerozone.cpp154
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 )