From f936d35b586b78da5fdebdca4eeb1479c8f1c741 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Thu, 15 Jul 2021 19:08:33 +0200 Subject: shtzone.cpp: made the timer side show something. Needs emulation of the SMS side and of the comms --- src/mame/drivers/shtzone.cpp | 177 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 153 insertions(+), 24 deletions(-) diff --git a/src/mame/drivers/shtzone.cpp b/src/mame/drivers/shtzone.cpp index c4f01def3cc..fd9d71820ed 100644 --- a/src/mame/drivers/shtzone.cpp +++ b/src/mame/drivers/shtzone.cpp @@ -19,21 +19,20 @@ CPU(s) : D780C (x2) Xtal : 10.7380 Mhz RAMS(s) : D4168C (x3) - : MB8464-12L + : MB8464-12L Eprom : Epr10894A.20 PAL : 315-5287 Customs IC's : 315-5216 (x2) - - 315-5124 + 315-5124 GAMES for this system : Black Belt (mpr10150.ic1) -Shooting Gallery +Shooting Gallery(2) Gangster Town @@ -45,14 +44,26 @@ Fantasy Zone(1) Notes: (1) apparently.... seems a bit odd, because it's not a gun game +(2) an auction has been observed with Out Run instead of this +Stuck at 'set cartridge', currently only the VDP and basic inputs for the timer CPU are hooked up. +It's possible to enter test mode. +TODO: +- hook up SMS CPU and carts reading, SMS-side inputs; +- outputs (test mode lists LED lamp, gun solenoid and buzzer); */ #include "emu.h" #include "cpu/z80/z80.h" +#include "machine/nvram.h" +#include "video/315_5124.h" #include "emupal.h" #include "screen.h" +#include "speaker.h" + + +namespace { class shtzone_state : public driver_device { @@ -62,22 +73,134 @@ public: void shtzone(machine_config &config); -private: +protected: virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; - uint32_t screen_update_shtzone(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void shtzone_map(address_map &map); + +private: + void prg_map(address_map &map); + void io_map(address_map &map); }; -void shtzone_state::shtzone_map(address_map &map) +void shtzone_state::prg_map(address_map &map) { map(0x0000, 0x3fff).rom(); - map(0x4000, 0x5fff).ram(); + map(0x4000, 0x4fff).ram(); + map(0x5000, 0x5fff).ram().share("nvram"); + map(0x8000, 0x8000).portr("DSW2"); + map(0x8001, 0x8001).portr("DSW1"); + // TODO: everything below + map(0x7ff0, 0x7ff0).nopr(); // checks for cart here? + map(0x8000, 0x8000).nopw(); + map(0xa000, 0xa000).nopw(); + map(0xc000, 0xc000).nopw(); // bits 4-6 slot selection? + map(0xc400, 0xc400).nopw(); + // end of TODO + map(0xd800, 0xd800).portr("IN0"); + map(0xdc00, 0xdc00).portr("IN1"); +} + +void shtzone_state::io_map(address_map &map) +{ + map.global_mask(0xff); + + map(0x3e, 0x3f).nopw(); // TODO + map(0x7e, 0x7e).r("vdp", FUNC(sega315_5124_device::vcount_read)); + map(0x7e, 0x7f).w("vdp", FUNC(sega315_5124_device::psg_w)); + map(0xbe, 0xbe).rw("vdp", FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write)); + map(0xbf, 0xbf).rw("vdp", FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write)); + map(0xc0, 0xc0).nopr(); // TODO } static INPUT_PORTS_START( shtzone ) + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // called Select button 1 in test mode + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) // " 2 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) // " 3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) // " 4 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) // " 5 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_SERVICE_NO_TOGGLE(0x80, IP_ACTIVE_LOW) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) // does nothing in test mode + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) // " + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // " + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON6 ) // called gun 1 in test mode + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON7 ) // " 2 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // does nothing in test mode + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // active high or nothing on screen (?) + + PORT_START("DSW1") + PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("DSW1:8,7,6,5") + PORT_DIPSETTING( 0x0f, DEF_STR (1C_1C) ) + PORT_DIPSETTING( 0x0e, DEF_STR (1C_2C) ) + PORT_DIPSETTING( 0x0d, DEF_STR (1C_3C) ) + PORT_DIPSETTING( 0x0c, DEF_STR (1C_4C) ) + PORT_DIPSETTING( 0x0b, DEF_STR (1C_5C) ) + PORT_DIPSETTING( 0x0a, DEF_STR (1C_6C) ) + PORT_DIPSETTING( 0x09, DEF_STR (2C_1C) ) + PORT_DIPSETTING( 0x08, DEF_STR (3C_1C) ) + PORT_DIPSETTING( 0x07, DEF_STR (4C_1C) ) + PORT_DIPSETTING( 0x06, DEF_STR (5C_1C) ) + PORT_DIPSETTING( 0x05, DEF_STR (6C_1C) ) + PORT_DIPSETTING( 0x04, DEF_STR (3C_2C) ) + PORT_DIPSETTING( 0x03, DEF_STR (4C_3C) ) + PORT_DIPSETTING( 0x02, DEF_STR (5C_3C) ) + PORT_DIPSETTING( 0x01, DEF_STR (2C_3C) ) + PORT_DIPSETTING( 0x00, DEF_STR (4C_5C) ) + PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("DSW1:4,3,2,1") + PORT_DIPSETTING( 0xf0, DEF_STR (1C_1C) ) + PORT_DIPSETTING( 0xe0, DEF_STR (1C_2C) ) + PORT_DIPSETTING( 0xd0, DEF_STR (1C_3C) ) + PORT_DIPSETTING( 0xc0, DEF_STR (1C_4C) ) + PORT_DIPSETTING( 0xb0, DEF_STR (1C_5C) ) + PORT_DIPSETTING( 0xa0, DEF_STR (1C_6C) ) + PORT_DIPSETTING( 0x90, DEF_STR (2C_1C) ) + PORT_DIPSETTING( 0x80, DEF_STR (3C_1C) ) + PORT_DIPSETTING( 0x70, DEF_STR (4C_1C) ) + PORT_DIPSETTING( 0x60, DEF_STR (5C_1C) ) + PORT_DIPSETTING( 0x50, DEF_STR (6C_1C) ) + PORT_DIPSETTING( 0x40, DEF_STR (3C_2C) ) + PORT_DIPSETTING( 0x30, DEF_STR (4C_3C) ) + PORT_DIPSETTING( 0x20, DEF_STR (5C_3C) ) + PORT_DIPSETTING( 0x10, DEF_STR (2C_3C) ) + PORT_DIPSETTING( 0x00, DEF_STR (4C_5C) ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") // no use shown in test mode + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:7") // no use shown in test mode + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") // no use shown in test mode + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:5") // no use shown in test mode + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Game_Time ) ) PORT_DIPLOCATION("DSW2:4,3,2,1") + PORT_DIPSETTING( 0xf0, "0:30" ) + PORT_DIPSETTING( 0xe0, "1:00" ) + PORT_DIPSETTING( 0xd0, "1:30" ) + PORT_DIPSETTING( 0xc0, "2:00" ) + PORT_DIPSETTING( 0xb0, "2:30" ) + PORT_DIPSETTING( 0xa0, "3:00" ) + PORT_DIPSETTING( 0x90, "3:30" ) + PORT_DIPSETTING( 0x80, "4:00" ) + PORT_DIPSETTING( 0x70, "4:30" ) + PORT_DIPSETTING( 0x60, "5:00" ) + PORT_DIPSETTING( 0x50, "5:30" ) + PORT_DIPSETTING( 0x40, "6:00" ) + PORT_DIPSETTING( 0x30, "6:30" ) + PORT_DIPSETTING( 0x20, "7:00" ) + PORT_DIPSETTING( 0x10, "7:30" ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) INPUT_PORTS_END @@ -93,32 +216,35 @@ void shtzone_state::video_start() { } - -uint32_t shtzone_state::screen_update_shtzone(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - return 0; -} - - void shtzone_state::shtzone(machine_config &config) { /* basic machine hardware */ - z80_device &timercpu(Z80(config, "timercpu", 10738000/4)); - timercpu.set_addrmap(AS_PROGRAM, &shtzone_state::shtzone_map); + z80_device &timercpu(Z80(config, "timercpu", 10.738_MHz_XTAL / 4)); + timercpu.set_addrmap(AS_PROGRAM, &shtzone_state::prg_map); + timercpu.set_addrmap(AS_IO, &shtzone_state::io_map); /* + SMS CPU */ + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(256, 256); - screen.set_visarea(0, 256-1, 0, 256-1); - screen.set_screen_update(FUNC(shtzone_state::screen_update_shtzone)); - screen.set_palette("palette"); + screen.set_raw(10.738_MHz_XTAL / 2, + sega315_5124_device::WIDTH , sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 256, + sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_192_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_192_TBORDER_HEIGHT + 192); + screen.set_screen_update("vdp", FUNC(sega315_5124_device::screen_update)); PALETTE(config, "palette").set_entries(0x100); + + sega315_5124_device &vdp(SEGA315_5124(config, "vdp", 10.738_MHz_XTAL)); + vdp.set_screen("screen"); + vdp.set_is_pal(false); + vdp.n_int().set_inputline("timercpu", 0); + vdp.n_nmi().set_inputline("timercpu", INPUT_LINE_NMI); + vdp.add_route(ALL_OUTPUTS, "mono", 1.00); + + SPEAKER(config, "mono").front_center(); } @@ -127,4 +253,7 @@ ROM_START( shtzone ) ROM_LOAD( "epr10894a.20", 0x00000, 0x04000, CRC(ea8901d9) SHA1(43fd8bfc395e3b2e3fbe9645d692a5eb04783d9c) ) ROM_END +} // Anonymous namespace + + GAME( 1987, shtzone, 0, shtzone, shtzone, shtzone_state, empty_init, ROT0, "Sega", "Shooting Zone System BIOS", MACHINE_IS_SKELETON | MACHINE_IS_BIOS_ROOT ) -- cgit v1.2.3