bus/centronics: Added a skeleton Epson RX-80 printer device to allow the CPU ROM to be debugged. (#13391)

This commit is contained in:
goldnchild 2025-02-22 07:44:16 -08:00 committed by GitHub
parent 93b81fed4b
commit 72daadc756
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 194 additions and 0 deletions

View File

@ -3304,6 +3304,8 @@ if (BUSES["CENTRONICS"]~=null) then
MAME_DIR .. "src/devices/bus/centronics/epson_lx800.h",
MAME_DIR .. "src/devices/bus/centronics/epson_lx810l.cpp",
MAME_DIR .. "src/devices/bus/centronics/epson_lx810l.h",
MAME_DIR .. "src/devices/bus/centronics/epson_rx80.cpp",
MAME_DIR .. "src/devices/bus/centronics/epson_rx80.h",
MAME_DIR .. "src/devices/bus/centronics/nec_p72.cpp",
MAME_DIR .. "src/devices/bus/centronics/nec_p72.h",
MAME_DIR .. "src/devices/bus/centronics/nlq401.cpp",

View File

@ -122,6 +122,7 @@ device_centronics_peripheral_interface::~device_centronics_peripheral_interface(
#include "epson_ex800.h"
#include "epson_lx800.h"
#include "epson_lx810l.h"
#include "epson_rx80.h"
#include "nec_p72.h"
#include "printer.h"
#include "digiblst.h"
@ -139,6 +140,7 @@ void centronics_devices(device_slot_interface &device)
device.option_add("lx800", EPSON_LX800);
device.option_add("lx810l", EPSON_LX810L);
device.option_add("ap2000", EPSON_AP2000);
device.option_add("rx80", EPSON_RX80);
device.option_add("p72", NEC_P72);
device.option_add("printer", CENTRONICS_PRINTER);
device.option_add("digiblst", CENTRONICS_DIGIBLASTER);

View File

@ -0,0 +1,171 @@
// license:BSD-3-Clause
// copyright-holders:Golden Child
/***************************************************************************
Epson RX-80 Dot Matrix printer (skeleton)
Main CPU is a UPD7810 running at 11 MHz.
8K of mask ROM (marked EPSON M64200CA)
uses 256 bytes of ram inside upd7810, no external ram chips
has a limited line buffer of 137 bytes maximum from ff00 to ff88,
used for character buffer as well as during graphic print operation.
137 bytes is approximate maximum line length during condensed print.
*****************************************************************************/
#include "emu.h"
#include "epson_rx80.h"
#include "cpu/upd7810/upd7810.h"
namespace {
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class epson_rx80_device : public device_t, public device_centronics_peripheral_interface
{
public:
// construction/destruction
epson_rx80_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
static constexpr feature_type unemulated_features() { return feature::PRINTER; }
/* Centronics stuff */
virtual void input_init(int state) override;
virtual void input_strobe(int state) override;
virtual void input_data0(int state) override { if (state) m_centronics_data |= 0x01; else m_centronics_data &= ~0x01; }
virtual void input_data1(int state) override { if (state) m_centronics_data |= 0x02; else m_centronics_data &= ~0x02; }
virtual void input_data2(int state) override { if (state) m_centronics_data |= 0x04; else m_centronics_data &= ~0x04; }
virtual void input_data3(int state) override { if (state) m_centronics_data |= 0x08; else m_centronics_data &= ~0x08; }
virtual void input_data4(int state) override { if (state) m_centronics_data |= 0x10; else m_centronics_data &= ~0x10; }
virtual void input_data5(int state) override { if (state) m_centronics_data |= 0x20; else m_centronics_data &= ~0x20; }
virtual void input_data6(int state) override { if (state) m_centronics_data |= 0x40; else m_centronics_data &= ~0x40; }
virtual void input_data7(int state) override { if (state) m_centronics_data |= 0x80; else m_centronics_data &= ~0x80; }
protected:
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual bool supports_pin35_5v() override { return true; }
private:
uint8_t centronics_data_r(offs_t offset) { return m_centronics_data; };
void epson_rx80_mem(address_map &map) ATTR_COLD;
required_device<upd7810_device> m_maincpu;
uint8_t m_centronics_data;
};
//-------------------------------------------------
// ROM( epson_rx80 )
//-------------------------------------------------
ROM_START( epson_rx80 )
ROM_REGION(0x2000, "maincpu", 0) // 8K rom for upd7810
ROM_LOAD("rx80_2764.bin", 0x0000, 0x2000, CRC(5206104a) SHA1(3e304f5331181aedb321d3db23a9387e3cfacf0c))
ROM_END
//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
const tiny_rom_entry *epson_rx80_device::device_rom_region() const
{
return ROM_NAME( epson_rx80 );
}
//-------------------------------------------------
// ADDRESS_MAP( epson_rx80_mem )
//-------------------------------------------------
void epson_rx80_device::epson_rx80_mem(address_map &map)
{
map(0x0000, 0x1fff).rom().region("maincpu", 0);
map(0xd800, 0xd800).r(FUNC(epson_rx80_device::centronics_data_r));
}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void epson_rx80_device::device_add_mconfig(machine_config &config)
{
upd7810_device &upd(UPD7810(config, m_maincpu, 11000000)); // 11 Mhz
upd.set_addrmap(AS_PROGRAM, &epson_rx80_device::epson_rx80_mem);
}
//-------------------------------------------------
// INPUT_PORTS( epson_rx80 )
//-------------------------------------------------
INPUT_PORTS_START( epson_rx80 )
INPUT_PORTS_END
//-------------------------------------------------
// input_ports - device-specific input ports
//-------------------------------------------------
ioport_constructor epson_rx80_device::device_input_ports() const
{
return INPUT_PORTS_NAME( epson_rx80 );
}
//-------------------------------------------------
// epson_rx80_device - constructor
//-------------------------------------------------
epson_rx80_device::epson_rx80_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, EPSON_RX80, tag, owner, clock),
device_centronics_peripheral_interface(mconfig, *this),
m_maincpu(*this, "maincpu")
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void epson_rx80_device::device_start()
{
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void epson_rx80_device::device_reset()
{
}
/***************************************************************************
Centronics
***************************************************************************/
void epson_rx80_device::input_strobe(int state)
{
}
void epson_rx80_device::input_init(int state)
{
}
} // anonymous namespace
// GLOBAL
DEFINE_DEVICE_TYPE_PRIVATE(EPSON_RX80, device_centronics_peripheral_interface, epson_rx80_device, "epson_rx80", "Epson RX-80")

View File

@ -0,0 +1,19 @@
// license:BSD-3-Clause
// copyright-holders:Golden Child
/**********************************************************************
Epson RX-80 dot matrix printer emulation (skeleton)
**********************************************************************/
#ifndef MAME_BUS_CENTRONICS_EPSON_RX80_H
#define MAME_BUS_CENTRONICS_EPSON_RX80_H
#pragma once
#include "ctronics.h"
// device type declaration
DECLARE_DEVICE_TYPE(EPSON_RX80, device_centronics_peripheral_interface)
#endif // MAME_BUS_CENTRONICS_EPSON_RX80_H