mirror of
https://github.com/holub/mame
synced 2025-10-06 17:08:28 +03:00
zexall: get rid of unrealistic overclock, get rid of logerroring exactly what's already on the video terminal, add savestates, small cleanups (nw)
This commit is contained in:
parent
1af9a994e6
commit
e8e072d534
@ -12,22 +12,19 @@
|
|||||||
Ram 0000-FFFF (preloaded with binary)
|
Ram 0000-FFFF (preloaded with binary)
|
||||||
Special calls take place for three ram values (this interface was designed by kevtris):
|
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
|
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
|
FFFF - 'data' - shared ram with output device; z80 writes the data to be sent to output device here
|
||||||
One i/o port is used:
|
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.
|
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 "emu.h"
|
||||||
#include "cpu/z80/z80.h"
|
#include "cpu/z80/z80.h"
|
||||||
#include "machine/terminal.h"
|
#include "machine/terminal.h"
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
|
|
||||||
#define TERMINAL_TAG "terminal"
|
|
||||||
|
|
||||||
class zexall_state : public driver_device
|
class zexall_state : public driver_device
|
||||||
{
|
{
|
||||||
@ -35,18 +32,18 @@ public:
|
|||||||
zexall_state(const machine_config &mconfig, device_type type, const char *tag)
|
zexall_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
: driver_device(mconfig, type, tag),
|
: driver_device(mconfig, type, tag),
|
||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
m_terminal(*this, TERMINAL_TAG),
|
m_terminal(*this, "terminal"),
|
||||||
m_main_ram(*this, "main_ram")
|
m_main_ram(*this, "main_ram")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_READ8_MEMBER( zexall_output_ack_r );
|
DECLARE_READ8_MEMBER( output_ack_r );
|
||||||
DECLARE_READ8_MEMBER( zexall_output_req_r );
|
DECLARE_READ8_MEMBER( output_req_r );
|
||||||
DECLARE_READ8_MEMBER( zexall_output_data_r );
|
DECLARE_READ8_MEMBER( output_data_r );
|
||||||
DECLARE_WRITE8_MEMBER( zexall_output_ack_w );
|
DECLARE_WRITE8_MEMBER( output_ack_w );
|
||||||
DECLARE_WRITE8_MEMBER( zexall_output_req_w );
|
DECLARE_WRITE8_MEMBER( output_req_w );
|
||||||
DECLARE_WRITE8_MEMBER( zexall_output_data_w );
|
DECLARE_WRITE8_MEMBER( output_data_w );
|
||||||
DECLARE_DRIVER_INIT(zexall);
|
|
||||||
private:
|
private:
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<generic_terminal_device> m_terminal;
|
required_device<generic_terminal_device> m_terminal;
|
||||||
@ -55,73 +52,82 @@ private:
|
|||||||
uint8_t m_out_req; // byte written to 0xFFFE
|
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_req_last; // old value at 0xFFFE before the most recent write
|
||||||
uint8_t m_out_ack; // byte written to 0xFFFC
|
uint8_t m_out_ack; // byte written to 0xFFFC
|
||||||
|
|
||||||
|
virtual void machine_start() override;
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
std::ostringstream m_outstring;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(zexall_state,zexall)
|
|
||||||
|
/******************************************************************************
|
||||||
|
Machine Start/Reset
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
void zexall_state::machine_start()
|
||||||
{
|
{
|
||||||
m_out_ack = 0;
|
// register for savestates
|
||||||
m_out_req = 0;
|
save_item(NAME(m_out_ack));
|
||||||
m_out_req_last = 0;
|
save_item(NAME(m_out_req));
|
||||||
m_out_data = 0;
|
save_item(NAME(m_out_req_last));
|
||||||
|
save_item(NAME(m_out_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
void zexall_state::machine_reset()
|
void zexall_state::machine_reset()
|
||||||
{
|
{
|
||||||
// rom is self-modifying, so need to refresh it on each run
|
// zerofill
|
||||||
|
m_out_ack = 0;
|
||||||
|
m_out_req = 0;
|
||||||
|
m_out_req_last = 0;
|
||||||
|
m_out_data = 0;
|
||||||
|
|
||||||
|
// program is self-modifying, so need to refresh it on each run
|
||||||
uint8_t *rom = memregion("romcode")->base();
|
uint8_t *rom = memregion("romcode")->base();
|
||||||
uint8_t *ram = m_main_ram;
|
memcpy(m_main_ram, rom, 0x228a);
|
||||||
/* fill main ram with zexall code */
|
|
||||||
memcpy(ram, rom, 0x228a);
|
|
||||||
m_outstring.str("");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
if (m_out_req != m_out_req_last)
|
||||||
{
|
{
|
||||||
m_terminal->write(space,0,m_out_data);
|
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_out_req_last = m_out_req;
|
m_out_req_last = m_out_req;
|
||||||
m_out_ack++;
|
m_out_ack++;
|
||||||
}
|
}
|
||||||
return 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;
|
m_out_ack = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
READ8_MEMBER( zexall_state::zexall_output_req_r )
|
READ8_MEMBER( zexall_state::output_req_r )
|
||||||
{
|
{
|
||||||
return m_out_req;
|
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_last = m_out_req;
|
||||||
m_out_req = data;
|
m_out_req = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
READ8_MEMBER( zexall_state::zexall_output_data_r )
|
READ8_MEMBER( zexall_state::output_data_r )
|
||||||
{
|
{
|
||||||
return m_out_data;
|
return m_out_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER( zexall_state::zexall_output_data_w )
|
WRITE8_MEMBER( zexall_state::output_data_w )
|
||||||
{
|
{
|
||||||
m_out_data = data;
|
m_out_data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
Address Maps
|
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)
|
static ADDRESS_MAP_START(z80_mem, AS_PROGRAM, 8, zexall_state)
|
||||||
ADDRESS_MAP_UNMAP_HIGH
|
ADDRESS_MAP_UNMAP_HIGH
|
||||||
AM_RANGE(0x0000, 0xfffc) AM_RAM AM_SHARE("main_ram")
|
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(0xfffd, 0xfffd) AM_READWRITE(output_ack_r,output_ack_w)
|
||||||
AM_RANGE(0xfffe, 0xfffe) AM_READWRITE(zexall_output_req_r,zexall_output_req_w)
|
AM_RANGE(0xfffe, 0xfffe) AM_READWRITE(output_req_r,output_req_w)
|
||||||
AM_RANGE(0xffff, 0xffff) AM_READWRITE(zexall_output_data_r,zexall_output_data_w)
|
AM_RANGE(0xffff, 0xffff) AM_READWRITE(output_data_r,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
|
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
Input Ports
|
Input Ports
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
static INPUT_PORTS_START( zexall )
|
static INPUT_PORTS_START( zexall )
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
Machine Drivers
|
Machine Drivers
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
static MACHINE_CONFIG_START( zexall )
|
static MACHINE_CONFIG_START( zexall )
|
||||||
/* basic machine hardware */
|
/* 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_PROGRAM_MAP(z80_mem)
|
||||||
MCFG_CPU_IO_MAP(z80_io)
|
|
||||||
MCFG_QUANTUM_TIME(attotime::from_hz(60))
|
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0)
|
MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
ROM Definitions
|
ROM Definitions
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@ -173,10 +173,9 @@ ROM_START(zexall)
|
|||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
Drivers
|
Drivers
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
|
// 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 )
|
||||||
|
Loading…
Reference in New Issue
Block a user