From e8e072d53445e12c31600bb758234279aab525c9 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 23 Oct 2017 15:50:22 +0200 Subject: zexall: get rid of unrealistic overclock, get rid of logerroring exactly what's already on the video terminal, add savestates, small cleanups (nw) --- src/mame/drivers/zexall.cpp | 107 ++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 54 deletions(-) diff --git a/src/mame/drivers/zexall.cpp b/src/mame/drivers/zexall.cpp index 1e246f7d7d7..cf73c2982c3 100644 --- a/src/mame/drivers/zexall.cpp +++ b/src/mame/drivers/zexall.cpp @@ -12,22 +12,19 @@ Ram 0000-FFFF (preloaded with binary) Special calls take place for three ram values (this interface was designed by kevtris): FFFD - 'ack' - shared ram with output device; z80 reads from here and considers the byte at FFFF read if this value incremented -FFFE - 'req' - shared ram with output device; z80 writes an incrementing value to FFFE to indicate that there is a byte waiting at FFFF and hence requesting the output device on the other end do something about it, until FFFD is incremented by the output device to acknowledge receipt +FFFE - 'req' - shared ram with output device; z80 writes an incrementing value to FFFE to indicate that there is a byte waiting at FFFF + and hence requesting the output device on the other end do something about it, until FFFD is incremented by the + output device to acknowledge receipt FFFF - 'data' - shared ram with output device; z80 writes the data to be sent to output device here One i/o port is used: 0001 - bit 0 controls whether interrupt timer is enabled (1) or not (0), this is a holdover from a project of kevtris' and can be ignored. ******************************************************************************/ -/* Core includes */ #include "emu.h" #include "cpu/z80/z80.h" #include "machine/terminal.h" -#include - - -#define TERMINAL_TAG "terminal" class zexall_state : public driver_device { @@ -35,18 +32,18 @@ public: zexall_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_terminal(*this, TERMINAL_TAG), + m_terminal(*this, "terminal"), m_main_ram(*this, "main_ram") { } - DECLARE_READ8_MEMBER( zexall_output_ack_r ); - DECLARE_READ8_MEMBER( zexall_output_req_r ); - DECLARE_READ8_MEMBER( zexall_output_data_r ); - DECLARE_WRITE8_MEMBER( zexall_output_ack_w ); - DECLARE_WRITE8_MEMBER( zexall_output_req_w ); - DECLARE_WRITE8_MEMBER( zexall_output_data_w ); - DECLARE_DRIVER_INIT(zexall); + DECLARE_READ8_MEMBER( output_ack_r ); + DECLARE_READ8_MEMBER( output_req_r ); + DECLARE_READ8_MEMBER( output_data_r ); + DECLARE_WRITE8_MEMBER( output_ack_w ); + DECLARE_WRITE8_MEMBER( output_req_w ); + DECLARE_WRITE8_MEMBER( output_data_w ); + private: required_device m_maincpu; required_device m_terminal; @@ -55,73 +52,82 @@ private: uint8_t m_out_req; // byte written to 0xFFFE uint8_t m_out_req_last; // old value at 0xFFFE before the most recent write uint8_t m_out_ack; // byte written to 0xFFFC + + virtual void machine_start() override; virtual void machine_reset() override; - std::ostringstream m_outstring; }; -DRIVER_INIT_MEMBER(zexall_state,zexall) + +/****************************************************************************** + Machine Start/Reset +******************************************************************************/ + +void zexall_state::machine_start() { + // register for savestates + save_item(NAME(m_out_ack)); + save_item(NAME(m_out_req)); + save_item(NAME(m_out_req_last)); + save_item(NAME(m_out_data)); +} + +void zexall_state::machine_reset() +{ + // zerofill m_out_ack = 0; m_out_req = 0; m_out_req_last = 0; m_out_data = 0; -} -void zexall_state::machine_reset() -{ -// rom is self-modifying, so need to refresh it on each run + // program is self-modifying, so need to refresh it on each run uint8_t *rom = memregion("romcode")->base(); - uint8_t *ram = m_main_ram; - /* fill main ram with zexall code */ - memcpy(ram, rom, 0x228a); - m_outstring.str(""); + memcpy(m_main_ram, rom, 0x228a); } -READ8_MEMBER( zexall_state::zexall_output_ack_r ) + +/****************************************************************************** + I/O Handlers +******************************************************************************/ + +READ8_MEMBER( zexall_state::output_ack_r ) { -// spit out the byte in out_byte if out_req is not equal to out_req_last + // spit out the byte in out_byte if out_req is not equal to out_req_last if (m_out_req != m_out_req_last) { - m_terminal->write(space,0,m_out_data); - // turn text into a string for logerror - m_outstring.put(char(m_out_data)); - if (m_out_data == 0x0a) - { - logerror("%s", m_outstring.str()); - m_outstring.str(""); - } + m_terminal->write(space, 0, m_out_data); m_out_req_last = m_out_req; m_out_ack++; } return m_out_ack; } -WRITE8_MEMBER( zexall_state::zexall_output_ack_w ) +WRITE8_MEMBER( zexall_state::output_ack_w ) { m_out_ack = data; } -READ8_MEMBER( zexall_state::zexall_output_req_r ) +READ8_MEMBER( zexall_state::output_req_r ) { return m_out_req; } -WRITE8_MEMBER( zexall_state::zexall_output_req_w ) +WRITE8_MEMBER( zexall_state::output_req_w ) { m_out_req_last = m_out_req; m_out_req = data; } -READ8_MEMBER( zexall_state::zexall_output_data_r ) +READ8_MEMBER( zexall_state::output_data_r ) { return m_out_data; } -WRITE8_MEMBER( zexall_state::zexall_output_data_w ) +WRITE8_MEMBER( zexall_state::output_data_w ) { m_out_data = data; } + /****************************************************************************** Address Maps ******************************************************************************/ @@ -129,40 +135,34 @@ WRITE8_MEMBER( zexall_state::zexall_output_data_w ) static ADDRESS_MAP_START(z80_mem, AS_PROGRAM, 8, zexall_state) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0xfffc) AM_RAM AM_SHARE("main_ram") - AM_RANGE(0xfffd, 0xfffd) AM_READWRITE(zexall_output_ack_r,zexall_output_ack_w) - AM_RANGE(0xfffe, 0xfffe) AM_READWRITE(zexall_output_req_r,zexall_output_req_w) - AM_RANGE(0xffff, 0xffff) AM_READWRITE(zexall_output_data_r,zexall_output_data_w) -ADDRESS_MAP_END - -static ADDRESS_MAP_START(z80_io, AS_IO, 8, zexall_state) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0001, 0x0001) AM_NOP // really a disable/enable for some sort of interrupt timer on kev's hardware, which is completely irrelevant for the zexall test + AM_RANGE(0xfffd, 0xfffd) AM_READWRITE(output_ack_r,output_ack_w) + AM_RANGE(0xfffe, 0xfffe) AM_READWRITE(output_req_r,output_req_w) + AM_RANGE(0xffff, 0xffff) AM_READWRITE(output_data_r,output_data_w) ADDRESS_MAP_END /****************************************************************************** Input Ports ******************************************************************************/ + static INPUT_PORTS_START( zexall ) INPUT_PORTS_END + /****************************************************************************** Machine Drivers ******************************************************************************/ static MACHINE_CONFIG_START( zexall ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, XTAL_3_579545MHz*10) + MCFG_CPU_ADD("maincpu", Z80, XTAL_3_579545MHz) MCFG_CPU_PROGRAM_MAP(z80_mem) - MCFG_CPU_IO_MAP(z80_io) - MCFG_QUANTUM_TIME(attotime::from_hz(60)) /* video hardware */ - MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0) + MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) MACHINE_CONFIG_END - /****************************************************************************** ROM Definitions ******************************************************************************/ @@ -173,10 +173,9 @@ ROM_START(zexall) ROM_END - /****************************************************************************** Drivers ******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS -COMP( 2009, zexall, 0, 0, zexall, zexall, zexall_state, zexall, "Frank Cringle & MESSDEV", "ZEXALL Z80 instruction set exerciser (modified for MESS)", MACHINE_NO_SOUND_HW ) +COMP( 2009, zexall, 0, 0, zexall, zexall, zexall_state, 0, "Frank Cringle & MESSDEV", "ZEXALL Z80 instruction set exerciser (modified for MESS)", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) -- cgit v1.2.3