diff options
author | 2020-10-23 17:03:09 +1100 | |
---|---|---|
committer | 2020-10-23 17:03:09 +1100 | |
commit | 515e85ba80a320981f5f4f2546f73ac06cd6db34 (patch) | |
tree | 95e30010ee1754e26868993af6c93e5bdd28b474 | |
parent | dc2e44c7be1f2dee81b068a2ff6b166f2edaf042 (diff) |
bus/a2bus: Added Orange Micro Grappler+ Printer Interface. [Vas Crabb, Golden Child, archive.org]
-rw-r--r-- | scripts/src/bus.lua | 154 | ||||
-rw-r--r-- | src/devices/bus/a2bus/grapplerplus.cpp | 336 | ||||
-rw-r--r-- | src/devices/bus/a2bus/grapplerplus.h | 91 | ||||
-rw-r--r-- | src/mame/drivers/apple2.cpp | 14 | ||||
-rw-r--r-- | src/mame/drivers/apple2e.cpp | 64 | ||||
-rw-r--r-- | src/mame/drivers/apple2gs.cpp | 52 |
6 files changed, 573 insertions, 138 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 00b37942b3d..1816a481432 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -2290,86 +2290,72 @@ if (BUSES["A2BUS"]~=null) then files { MAME_DIR .. "src/devices/bus/a2bus/a2bus.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2bus.h", - MAME_DIR .. "src/devices/bus/a2bus/a2diskii.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2diskii.h", - MAME_DIR .. "src/devices/bus/a2bus/a2mockingboard.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2mockingboard.h", + MAME_DIR .. "src/devices/bus/a2bus/a2eauxslot.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2eauxslot.h", + MAME_DIR .. "src/devices/bus/a2bus/4play.cpp", + MAME_DIR .. "src/devices/bus/a2bus/4play.h", + MAME_DIR .. "src/devices/bus/a2bus/a2alfam2.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2alfam2.h", + MAME_DIR .. "src/devices/bus/a2bus/a2applicard.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2applicard.h", + MAME_DIR .. "src/devices/bus/a2bus/a2arcadebd.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2arcadebd.h", MAME_DIR .. "src/devices/bus/a2bus/a2cffa.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2cffa.h", + MAME_DIR .. "src/devices/bus/a2bus/a2corvus.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2corvus.h", + MAME_DIR .. "src/devices/bus/a2bus/a2diskii.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2diskii.h", + MAME_DIR .. "src/devices/bus/a2bus/a2diskiing.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2diskiing.h", + MAME_DIR .. "src/devices/bus/a2bus/a2dx1.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2dx1.h", + MAME_DIR .. "src/devices/bus/a2bus/a2echoii.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2echoii.h", + MAME_DIR .. "src/devices/bus/a2bus/a2eext80col.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2eext80col.h", + MAME_DIR .. "src/devices/bus/a2bus/a2eramworks3.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2eramworks3.h", + MAME_DIR .. "src/devices/bus/a2bus/a2estd80col.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2estd80col.h", + MAME_DIR .. "src/devices/bus/a2bus/a2hsscsi.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2hsscsi.h", + MAME_DIR .. "src/devices/bus/a2bus/a2iwm.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2iwm.h", + MAME_DIR .. "src/devices/bus/a2bus/a2mcms.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2mcms.h", MAME_DIR .. "src/devices/bus/a2bus/a2memexp.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2memexp.h", + MAME_DIR .. "src/devices/bus/a2bus/a2midi.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2midi.h", + MAME_DIR .. "src/devices/bus/a2bus/a2mockingboard.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2mockingboard.h", + MAME_DIR .. "src/devices/bus/a2bus/a2pic.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2pic.h", + MAME_DIR .. "src/devices/bus/a2bus/a2sam.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2sam.h", MAME_DIR .. "src/devices/bus/a2bus/a2scsi.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2scsi.h", - MAME_DIR .. "src/devices/bus/a2bus/a2thunderclock.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2thunderclock.h", MAME_DIR .. "src/devices/bus/a2bus/a2softcard.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2softcard.h", - MAME_DIR .. "src/devices/bus/a2bus/a2videoterm.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2videoterm.h", MAME_DIR .. "src/devices/bus/a2bus/a2ssc.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2ssc.h", MAME_DIR .. "src/devices/bus/a2bus/a2swyft.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2swyft.h", - MAME_DIR .. "src/devices/bus/a2bus/a2eauxslot.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2eauxslot.h", MAME_DIR .. "src/devices/bus/a2bus/a2themill.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2themill.h", - MAME_DIR .. "src/devices/bus/a2bus/a2sam.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2sam.h", - MAME_DIR .. "src/devices/bus/a2bus/a2alfam2.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2alfam2.h", - MAME_DIR .. "src/devices/bus/a2bus/laser128.cpp", - MAME_DIR .. "src/devices/bus/a2bus/laser128.h", - MAME_DIR .. "src/devices/bus/a2bus/a2echoii.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2echoii.h", - MAME_DIR .. "src/devices/bus/a2bus/a2arcadebd.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2arcadebd.h", - MAME_DIR .. "src/devices/bus/a2bus/a2midi.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2midi.h", + MAME_DIR .. "src/devices/bus/a2bus/a2thunderclock.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2thunderclock.h", + MAME_DIR .. "src/devices/bus/a2bus/a2ultraterm.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2ultraterm.h", + MAME_DIR .. "src/devices/bus/a2bus/a2videoterm.cpp", + MAME_DIR .. "src/devices/bus/a2bus/a2videoterm.h", MAME_DIR .. "src/devices/bus/a2bus/a2vulcan.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2vulcan.h", MAME_DIR .. "src/devices/bus/a2bus/a2zipdrive.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2zipdrive.h", - MAME_DIR .. "src/devices/bus/a2bus/a2applicard.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2applicard.h", - MAME_DIR .. "src/devices/bus/a2bus/a2hsscsi.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2hsscsi.h", - MAME_DIR .. "src/devices/bus/a2bus/a2iwm.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2iwm.h", - MAME_DIR .. "src/devices/bus/a2bus/a2ultraterm.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2ultraterm.h", - MAME_DIR .. "src/devices/bus/a2bus/a2pic.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2pic.h", - MAME_DIR .. "src/devices/bus/a2bus/a2estd80col.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2estd80col.h", - MAME_DIR .. "src/devices/bus/a2bus/a2eext80col.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2eext80col.h", - MAME_DIR .. "src/devices/bus/a2bus/a2eramworks3.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2eramworks3.h", - MAME_DIR .. "src/devices/bus/a2bus/a2corvus.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2corvus.h", - MAME_DIR .. "src/devices/bus/a2bus/a2diskiing.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2diskiing.h", - MAME_DIR .. "src/devices/bus/a2bus/a2mcms.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2mcms.h", - MAME_DIR .. "src/devices/bus/a2bus/a2dx1.cpp", - MAME_DIR .. "src/devices/bus/a2bus/a2dx1.h", - MAME_DIR .. "src/devices/bus/a2bus/timemasterho.cpp", - MAME_DIR .. "src/devices/bus/a2bus/timemasterho.h", - MAME_DIR .. "src/devices/bus/a2bus/mouse.cpp", - MAME_DIR .. "src/devices/bus/a2bus/mouse.h", - MAME_DIR .. "src/devices/bus/a2bus/corvfdc01.cpp", - MAME_DIR .. "src/devices/bus/a2bus/corvfdc01.h", - MAME_DIR .. "src/devices/bus/a2bus/corvfdc02.cpp", - MAME_DIR .. "src/devices/bus/a2bus/corvfdc02.h", - MAME_DIR .. "src/devices/bus/a2bus/ramcard16k.cpp", - MAME_DIR .. "src/devices/bus/a2bus/ramcard16k.h", - MAME_DIR .. "src/devices/bus/a2bus/ramcard128k.cpp", - MAME_DIR .. "src/devices/bus/a2bus/ramcard128k.h", - MAME_DIR .. "src/devices/bus/a2bus/ezcgi.cpp", - MAME_DIR .. "src/devices/bus/a2bus/ezcgi.h", - MAME_DIR .. "src/devices/bus/a2bus/pc_xporter.cpp", - MAME_DIR .. "src/devices/bus/a2bus/pc_xporter.h", + MAME_DIR .. "src/devices/bus/a2bus/agat_fdc.cpp", + MAME_DIR .. "src/devices/bus/a2bus/agat_fdc.h", MAME_DIR .. "src/devices/bus/a2bus/agat7langcard.cpp", MAME_DIR .. "src/devices/bus/a2bus/agat7langcard.h", MAME_DIR .. "src/devices/bus/a2bus/agat7ports.cpp", @@ -2378,28 +2364,44 @@ if (BUSES["A2BUS"]~=null) then MAME_DIR .. "src/devices/bus/a2bus/agat7ram.h", MAME_DIR .. "src/devices/bus/a2bus/agat840k_hle.cpp", MAME_DIR .. "src/devices/bus/a2bus/agat840k_hle.h", - MAME_DIR .. "src/devices/bus/a2bus/agat_fdc.cpp", - MAME_DIR .. "src/devices/bus/a2bus/agat_fdc.h", + MAME_DIR .. "src/devices/bus/a2bus/byte8251.cpp", + MAME_DIR .. "src/devices/bus/a2bus/byte8251.h", + MAME_DIR .. "src/devices/bus/a2bus/cmsscsi.cpp", + MAME_DIR .. "src/devices/bus/a2bus/cmsscsi.h", + MAME_DIR .. "src/devices/bus/a2bus/computereyes2.cpp", + MAME_DIR .. "src/devices/bus/a2bus/computereyes2.h", + MAME_DIR .. "src/devices/bus/a2bus/corvfdc01.cpp", + MAME_DIR .. "src/devices/bus/a2bus/corvfdc01.h", + MAME_DIR .. "src/devices/bus/a2bus/corvfdc02.cpp", + MAME_DIR .. "src/devices/bus/a2bus/corvfdc02.h", + MAME_DIR .. "src/devices/bus/a2bus/ezcgi.cpp", + MAME_DIR .. "src/devices/bus/a2bus/ezcgi.h", + MAME_DIR .. "src/devices/bus/a2bus/grapplerplus.cpp", + MAME_DIR .. "src/devices/bus/a2bus/grapplerplus.h", + MAME_DIR .. "src/devices/bus/a2bus/laser128.cpp", + MAME_DIR .. "src/devices/bus/a2bus/laser128.h", + MAME_DIR .. "src/devices/bus/a2bus/mouse.cpp", + MAME_DIR .. "src/devices/bus/a2bus/mouse.h", MAME_DIR .. "src/devices/bus/a2bus/nippelclock.cpp", MAME_DIR .. "src/devices/bus/a2bus/nippelclock.h", - MAME_DIR .. "src/devices/bus/a2bus/ssprite.cpp", - MAME_DIR .. "src/devices/bus/a2bus/ssprite.h", + MAME_DIR .. "src/devices/bus/a2bus/pc_xporter.cpp", + MAME_DIR .. "src/devices/bus/a2bus/pc_xporter.h", + MAME_DIR .. "src/devices/bus/a2bus/ramcard128k.cpp", + MAME_DIR .. "src/devices/bus/a2bus/ramcard128k.h", + MAME_DIR .. "src/devices/bus/a2bus/ramcard16k.cpp", + MAME_DIR .. "src/devices/bus/a2bus/ramcard16k.h", + MAME_DIR .. "src/devices/bus/a2bus/sider.cpp", + MAME_DIR .. "src/devices/bus/a2bus/sider.h", MAME_DIR .. "src/devices/bus/a2bus/ssbapple.cpp", MAME_DIR .. "src/devices/bus/a2bus/ssbapple.h", + MAME_DIR .. "src/devices/bus/a2bus/ssprite.cpp", + MAME_DIR .. "src/devices/bus/a2bus/ssprite.h", + MAME_DIR .. "src/devices/bus/a2bus/timemasterho.cpp", + MAME_DIR .. "src/devices/bus/a2bus/timemasterho.h", MAME_DIR .. "src/devices/bus/a2bus/transwarp.cpp", MAME_DIR .. "src/devices/bus/a2bus/transwarp.h", - MAME_DIR .. "src/devices/bus/a2bus/4play.cpp", - MAME_DIR .. "src/devices/bus/a2bus/4play.h", - MAME_DIR .. "src/devices/bus/a2bus/computereyes2.cpp", - MAME_DIR .. "src/devices/bus/a2bus/computereyes2.h", - MAME_DIR .. "src/devices/bus/a2bus/byte8251.cpp", - MAME_DIR .. "src/devices/bus/a2bus/byte8251.h", - MAME_DIR .. "src/devices/bus/a2bus/cmsscsi.cpp", - MAME_DIR .. "src/devices/bus/a2bus/cmsscsi.h", MAME_DIR .. "src/devices/bus/a2bus/uthernet.cpp", MAME_DIR .. "src/devices/bus/a2bus/uthernet.h", - MAME_DIR .. "src/devices/bus/a2bus/sider.cpp", - MAME_DIR .. "src/devices/bus/a2bus/sider.h", } end diff --git a/src/devices/bus/a2bus/grapplerplus.cpp b/src/devices/bus/a2bus/grapplerplus.cpp new file mode 100644 index 00000000000..6523392f2f5 --- /dev/null +++ b/src/devices/bus/a2bus/grapplerplus.cpp @@ -0,0 +1,336 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +#include "emu.h" +#include "grapplerplus.h" + +//#define VERBOSE 1 +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +namespace { + +ROM_START(grapplerplus) + // TODO: add other revisions - 3.3 is known to exist + + ROM_DEFAULT_BIOS("v32") + ROM_SYSTEM_BIOS(0, "v30", "ROM 3.0") + ROM_SYSTEM_BIOS(1, "v32", "ROM 3.2") + + ROM_REGION(0x1000, "rom", 0) + ROMX_LOAD( "3.0.u9", 0x0000, 0x1000, CRC(17cf5e02) SHA1(9b01a9b1cf7752987e03f9b0285eb9329d63b777), ROM_BIOS(0) ) + ROMX_LOAD( "3.2.u9", 0x0000, 0x1000, CRC(6f88b70c) SHA1(433ae61a0553ee9c1628ea5b6376dac848c04cad), ROM_BIOS(1) ) +ROM_END + + +INPUT_PORTS_START(grapplerplus) + PORT_START("S1") + PORT_DIPNAME(0x07, 0x00, "Printer Type") PORT_DIPLOCATION("S1:4,3,2") + PORT_DIPSETTING( 0x00, "Epson Series") + PORT_DIPSETTING( 0x01, "NEC 8023/C. Itoh 8510/DMP 85") + PORT_DIPSETTING( 0x02, "Star Gemini") + PORT_DIPSETTING( 0x03, "Anadex Printers") + PORT_DIPSETTING( 0x04, "Okidata 82A, 83A, 92, 93, 84") + PORT_DIPSETTING( 0x06, "Okidata 84 w/o Step II Graphics") + PORT_DIPSETTING( 0x05, "Apple Dot Matrix") + PORT_DIPSETTING( 0x07, "invalid") + PORT_DIPNAME(0x08, 0x08, "Most Significant Bit") PORT_DIPLOCATION("S1:1") PORT_CHANGED_MEMBER(DEVICE_SELF, a2bus_grapplerplus_device, sw_msb, 0) + PORT_DIPSETTING( 0x08, "Software Control") + PORT_DIPSETTING( 0x00, "Not Transmitted") +INPUT_PORTS_END + +} // anonymous namespace + + + +DEFINE_DEVICE_TYPE(A2BUS_GRAPPLERPLUS, a2bus_grapplerplus_device, "a2grapplerplus", "Orange Micro Grappler+ Printer Interface") + + + +a2bus_grapplerplus_device::a2bus_grapplerplus_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) : + device_t(mconfig, A2BUS_GRAPPLERPLUS, tag, owner, clock), + device_a2bus_card_interface(mconfig, *this), + m_printer_conn(*this, "prn"), + m_printer_out(*this, "prn_out"), + m_s1(*this, "S1"), + m_rom(*this, "rom"), + m_strobe_timer(nullptr), + m_rom_bank(0x0000U), + m_data_latch(0xffU), + m_ack_latch(0x01U), + m_irq_disable(1U), + m_irq(0x00U), + m_next_strobe(1U), + m_ack_in(1U), + m_busy_in(0x8U), + m_pe_in(0x04U), + m_slct_in(0x02U) +{ +} + + + +//---------------------------------------------- +// DIP switch handlers +//---------------------------------------------- + +INPUT_CHANGED_MEMBER(a2bus_grapplerplus_device::sw_msb) +{ + if (BIT(m_data_latch, 7)) + m_printer_out->write(m_data_latch & ((BIT(m_s1->read(), 3) ? 0xffU : 0x7fU))); +} + + + +//---------------------------------------------- +// device_a2bus_card_interface implementation +//---------------------------------------------- + +u8 a2bus_grapplerplus_device::read_c0nx(u8 offset) +{ + return + m_irq | + ((m_s1->read() & 0x07U) << 4) | + m_busy_in | + m_pe_in | + m_slct_in | + m_ack_latch; +} + + +void a2bus_grapplerplus_device::write_c0nx(u8 offset, u8 data) +{ + LOG("Write C0n%01X=%02X\n", offset, data); + + if (!(offset & 0x03U)) // !A0 && !A1 - write data + { + // latch output data - remember MSB can be forced low by DIP switch + LOG("Latch data %02X\n", data); + m_data_latch = data; + m_printer_out->write(data & ((BIT(m_s1->read(), 3) ? 0xffU : 0x7fU))); + + // clearing the ACK latch will acknowledge an interrupt + if (m_ack_in) + { + if (m_ack_latch) + LOG("Clearing acknowledge latch\n"); + else + LOG("Previous data not acknowledged\n"); + m_ack_latch = 0x00U; + if (m_irq) + { + assert(!m_irq_disable); + LOG("Releasing slot IRQ\n"); + m_irq = 0x00U; + lower_slot_irq(); + } + } + else + { + LOG("/ACK asserted, not clearing acknowledge latch\n", data); + } + + // generate strobe pulse after one clock cycle + m_next_strobe = 0U; + if (!m_strobe_timer->enabled()) + { + LOG("Start strobe timer\n", m_next_strobe); + m_strobe_timer->adjust(attotime::from_ticks(1, clock())); + } + } + + if (BIT(offset, 0)) // A0 - select high ROM bank + { + if (!m_rom_bank) + LOG("Select high ROM bank\n"); + else + LOG("High ROM bank already selected\n"); + m_rom_bank = 0x0800U; + } + + if (BIT(offset, 1)) // A1 - disable interrupt + { + if (!m_irq_disable) + LOG("Disable interrupt request\n"); + else + LOG("Interrupt request already disabled\n"); + m_irq_disable = 1U; + if (m_irq) + { + LOG("Releasing slot IRQ\n"); + m_irq = 0x00U; + lower_slot_irq(); + } + } + else if (BIT(offset, 2)) // A2 - enable interrupt + { + if (m_irq_disable) + LOG("Enable interrupt request\n"); + else + LOG("Interrupt request already enabled\n"); + m_irq_disable = 0U; + if (m_ack_latch && !m_irq) + { + LOG("Asserting slot IRQ\n"); + m_irq = 0x80U; + raise_slot_irq(); + } + } +} + + +u8 a2bus_grapplerplus_device::read_cnxx(u8 offset) +{ + if (!machine().side_effects_disabled()) + { + if (m_rom_bank) + LOG("Select low ROM bank\n"); + m_rom_bank = 0x0000U; + } + return m_rom[(!m_ack_latch && BIT(offset, 7)) ? (offset & 0xbfU) : offset]; +} + + +u8 a2bus_grapplerplus_device::read_c800(u16 offset) +{ + return m_rom[(offset & 0x07ffU) | m_rom_bank]; +} + + + +//---------------------------------------------- +// device_t implementation +//---------------------------------------------- + +tiny_rom_entry const *a2bus_grapplerplus_device::device_rom_region() const +{ + return ROM_NAME(grapplerplus); +} + + +void a2bus_grapplerplus_device::device_add_mconfig(machine_config &config) +{ + CENTRONICS(config, m_printer_conn, centronics_devices, "printer"); + m_printer_conn->ack_handler().set(FUNC(a2bus_grapplerplus_device::ack_w)); + m_printer_conn->busy_handler().set(FUNC(a2bus_grapplerplus_device::busy_w)); + m_printer_conn->perror_handler().set(FUNC(a2bus_grapplerplus_device::pe_w)); + m_printer_conn->select_handler().set(FUNC(a2bus_grapplerplus_device::slct_w)); + + OUTPUT_LATCH(config, m_printer_out); + m_printer_conn->set_output_latch(*m_printer_out); +} + + +ioport_constructor a2bus_grapplerplus_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(grapplerplus); +} + + +void a2bus_grapplerplus_device::device_start() +{ + m_strobe_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(a2bus_grapplerplus_device::update_strobe), this)); + + m_next_strobe = 1U; + + save_item(NAME(m_rom_bank)); + save_item(NAME(m_data_latch)); + save_item(NAME(m_ack_latch)); + save_item(NAME(m_irq_disable)); + save_item(NAME(m_irq)); + save_item(NAME(m_next_strobe)); + save_item(NAME(m_ack_in)); + save_item(NAME(m_busy_in)); + save_item(NAME(m_pe_in)); + save_item(NAME(m_slct_in)); + + m_strobe_timer->adjust(attotime::from_ticks(1, clock())); +} + + +void a2bus_grapplerplus_device::device_reset() +{ + m_ack_latch = 0x01U; + m_irq_disable = 1U; + if (m_irq) + { + m_irq = 0x00U; + lower_slot_irq(); + } +} + + + +//---------------------------------------------- +// printer status inputs +//---------------------------------------------- + +WRITE_LINE_MEMBER(a2bus_grapplerplus_device::ack_w) +{ + if (bool(state) != bool(m_ack_in)) + { + LOG("/ACK=%d\n", state); + m_ack_in = state ? 1U : 0U; + if (!state) + { + if (!m_ack_latch) + LOG("Set acknowledge latch\n"); + else + LOG("No data written since previous acknowledge\n"); + m_ack_latch = 0x01U; + if (!m_irq_disable && !m_irq) + { + LOG("Asserting slot IRQ\n"); + m_irq = 0x80U; + raise_slot_irq(); + } + } + } +} + + +WRITE_LINE_MEMBER(a2bus_grapplerplus_device::busy_w) +{ + if (bool(state) != bool(m_busy_in)) + { + LOG("BUSY=%d\n", state); + m_busy_in = state ? 0x08U : 0x00U; + } +} + + +WRITE_LINE_MEMBER(a2bus_grapplerplus_device::pe_w) +{ + if (bool(state) != bool(m_pe_in)) + { + LOG("PAPER EMPTY=%d\n", state); + m_pe_in = state ? 0x04U : 0x00U; + } +} + + +WRITE_LINE_MEMBER(a2bus_grapplerplus_device::slct_w) +{ + if (bool(state) != bool(m_slct_in)) + { + LOG("SELECT=%d\n", state); + m_slct_in = state ? 0x02U : 0x00U; + } +} + + + +//---------------------------------------------- +// timer handlers +//---------------------------------------------- + +TIMER_CALLBACK_MEMBER(a2bus_grapplerplus_device::update_strobe) +{ + LOG("Output /STROBE=%u\n", m_next_strobe); + m_printer_conn->write_strobe(m_next_strobe); + if (!m_next_strobe) + { + LOG("Start strobe timer\n", m_next_strobe); + m_next_strobe = 1U; + m_strobe_timer->adjust(attotime::from_ticks(1, clock())); + } +} diff --git a/src/devices/bus/a2bus/grapplerplus.h b/src/devices/bus/a2bus/grapplerplus.h new file mode 100644 index 00000000000..ec8bd938492 --- /dev/null +++ b/src/devices/bus/a2bus/grapplerplus.h @@ -0,0 +1,91 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/*********************************************************************** + + Orange Micro Grappler+ Printer Interface + + With references to schematic from Grappler™+ Printer Interface + Series Operators Manual (© Orange Micro, Inc. 1982). This uses + the IC locations on the "long" version of the card. The newer + "short" version of the card has slightly different circuitry + and completely different IC locations. + + 26-pin two-row header to printer: + + STB 1 2 GND + D0 3 4 GND + D1 5 6 GND + D2 7 8 GND + D3 9 10 GND + D4 11 12 GND + D5 23 14 GND + D6 15 16 GND + D7 17 18 GND + ACK 19 20 GND + BUSY 21 22 GND + P.E. 23 24 GND + SLCT 25 26 GND + +***********************************************************************/ +#ifndef MAME_BUS_A2BUS_GRAPPLERPLUS_H +#define MAME_BUS_A2BUS_GRAPPLERPLUS_H + +#pragma once + +#include "a2bus.h" +#include "bus/centronics/ctronics.h" + +class a2bus_grapplerplus_device : public device_t, public device_a2bus_card_interface +{ +public: + a2bus_grapplerplus_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); + + // DIP switch handlers + DECLARE_INPUT_CHANGED_MEMBER(sw_msb); + + // device_a2bus_card_interface implementation + virtual u8 read_c0nx(u8 offset) override; + virtual void write_c0nx(u8 offset, u8 data) override; + virtual u8 read_cnxx(u8 offset) override; + virtual u8 read_c800(u16 offset) override; + +protected: + // device_t implementation + virtual tiny_rom_entry const *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + virtual ioport_constructor device_input_ports() const override; + virtual void device_start() override; + virtual void device_reset() override; + + // timer handlers + TIMER_CALLBACK_MEMBER(update_strobe); + +private: + // printer status inputs + DECLARE_WRITE_LINE_MEMBER(ack_w); + DECLARE_WRITE_LINE_MEMBER(busy_w); + DECLARE_WRITE_LINE_MEMBER(pe_w); + DECLARE_WRITE_LINE_MEMBER(slct_w); + + required_device<centronics_device> m_printer_conn; + required_device<output_latch_device> m_printer_out; + required_ioport m_s1; + required_region_ptr<u8> m_rom; + emu_timer * m_strobe_timer; + + u16 m_rom_bank; // U2D (pin 13) + u8 m_data_latch; // U10 + u8 m_ack_latch; // U2C (pin 9) + u8 m_irq_disable; // U2A (pin 4) + u8 m_irq; // U3D (pin 13) + u8 m_next_strobe; // U5A (pin 5) + u8 m_ack_in; // printer connector pin 19 + u8 m_busy_in; // printer connector pin 21 + u8 m_pe_in; // printer connector pin 23 + u8 m_slct_in; // printer connector pin 25 +}; + + +DECLARE_DEVICE_TYPE(A2BUS_GRAPPLERPLUS, a2bus_grapplerplus_device) + +#endif // MAME_BUS_A2BUS_GRAPPLERPLUS_H diff --git a/src/mame/drivers/apple2.cpp b/src/mame/drivers/apple2.cpp index 2f33aeece2c..763deb941bb 100644 --- a/src/mame/drivers/apple2.cpp +++ b/src/mame/drivers/apple2.cpp @@ -54,6 +54,7 @@ II Plus: RAM options reduced to 16/32/48 KB. #include "sound/spkrdev.h" +#include "bus/a2bus/4play.h" #include "bus/a2bus/a2alfam2.h" #include "bus/a2bus/a2applicard.h" #include "bus/a2bus/a2arcadebd.h" @@ -63,6 +64,7 @@ II Plus: RAM options reduced to 16/32/48 KB. #include "bus/a2bus/a2diskiing.h" #include "bus/a2bus/a2dx1.h" #include "bus/a2bus/a2echoii.h" +#include "bus/a2bus/a2iwm.h" #include "bus/a2bus/a2mcms.h" #include "bus/a2bus/a2memexp.h" #include "bus/a2bus/a2midi.h" @@ -78,19 +80,18 @@ II Plus: RAM options reduced to 16/32/48 KB. #include "bus/a2bus/a2ultraterm.h" #include "bus/a2bus/a2videoterm.h" #include "bus/a2bus/a2zipdrive.h" +#include "bus/a2bus/byte8251.h" +#include "bus/a2bus/computereyes2.h" #include "bus/a2bus/ezcgi.h" +#include "bus/a2bus/grapplerplus.h" #include "bus/a2bus/laser128.h" #include "bus/a2bus/mouse.h" #include "bus/a2bus/ramcard128k.h" #include "bus/a2bus/ramcard16k.h" -#include "bus/a2bus/timemasterho.h" -#include "bus/a2bus/ssprite.h" #include "bus/a2bus/ssbapple.h" -#include "bus/a2bus/4play.h" -#include "bus/a2bus/computereyes2.h" +#include "bus/a2bus/ssprite.h" +#include "bus/a2bus/timemasterho.h" #include "bus/a2bus/transwarp.h" -#include "bus/a2bus/byte8251.h" -#include "bus/a2bus/a2iwm.h" #include "bus/a2gameio/gameio.h" @@ -1325,6 +1326,7 @@ static void apple2_cards(device_slot_interface &device) device.option_add("applesurance", A2BUS_APPLESURANCE); /* Applesurance Diagnostic Controller */ // device.option_add("magicmusician", A2BUS_MAGICMUSICIAN); /* Magic Musician Card */ device.option_add("byte8251", A2BUS_BYTE8251); /* BYTE Magazine 8251 serial card */ + device.option_add("grapplerplus", A2BUS_GRAPPLERPLUS); /* Orange Micro Grappler+ Printer Interface card */ } void apple2_state::apple2_common(machine_config &config) diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp index 4a244d12f2f..838dd8c5237 100644 --- a/src/mame/drivers/apple2e.cpp +++ b/src/mame/drivers/apple2e.cpp @@ -131,52 +131,53 @@ MIG RAM page 2 $CE02 is the speaker/slot bitfield and $CE03 is the paddle/accele #include "machine/ds1315.h" #include "machine/apple2common.h" +#include "bus/a2bus/4play.h" +#include "bus/a2bus/a2alfam2.h" +#include "bus/a2bus/a2applicard.h" +#include "bus/a2bus/a2arcadebd.h" #include "bus/a2bus/a2bus.h" +#include "bus/a2bus/a2cffa.h" +#include "bus/a2bus/a2corvus.h" #include "bus/a2bus/a2diskii.h" #include "bus/a2bus/a2diskiing.h" -#include "bus/a2bus/a2mockingboard.h" -#include "bus/a2bus/a2cffa.h" +#include "bus/a2bus/a2dx1.h" +#include "bus/a2bus/a2eauxslot.h" +#include "bus/a2bus/a2echoii.h" +#include "bus/a2bus/a2eext80col.h" +#include "bus/a2bus/a2eramworks3.h" +#include "bus/a2bus/a2estd80col.h" +#include "bus/a2bus/a2hsscsi.h" +#include "bus/a2bus/a2iwm.h" +#include "bus/a2bus/a2mcms.h" #include "bus/a2bus/a2memexp.h" +#include "bus/a2bus/a2midi.h" +#include "bus/a2bus/a2mockingboard.h" +#include "bus/a2bus/a2pic.h" +#include "bus/a2bus/a2sam.h" #include "bus/a2bus/a2scsi.h" -#include "bus/a2bus/cmsscsi.h" -#include "bus/a2bus/a2hsscsi.h" -#include "bus/a2bus/a2thunderclock.h" #include "bus/a2bus/a2softcard.h" -#include "bus/a2bus/a2videoterm.h" #include "bus/a2bus/a2ssc.h" #include "bus/a2bus/a2swyft.h" #include "bus/a2bus/a2themill.h" -#include "bus/a2bus/a2sam.h" -#include "bus/a2bus/a2alfam2.h" -#include "bus/a2bus/laser128.h" -#include "bus/a2bus/a2echoii.h" -#include "bus/a2bus/a2arcadebd.h" -#include "bus/a2bus/a2midi.h" -#include "bus/a2bus/a2zipdrive.h" -#include "bus/a2bus/a2applicard.h" +#include "bus/a2bus/a2thunderclock.h" #include "bus/a2bus/a2ultraterm.h" -#include "bus/a2bus/a2pic.h" -#include "bus/a2bus/a2corvus.h" -#include "bus/a2bus/a2mcms.h" -#include "bus/a2bus/a2dx1.h" -#include "bus/a2bus/timemasterho.h" -#include "bus/a2bus/mouse.h" +#include "bus/a2bus/a2videoterm.h" +#include "bus/a2bus/a2vulcan.h" +#include "bus/a2bus/a2zipdrive.h" +#include "bus/a2bus/byte8251.h" +#include "bus/a2bus/cmsscsi.h" +#include "bus/a2bus/computereyes2.h" #include "bus/a2bus/ezcgi.h" +#include "bus/a2bus/grapplerplus.h" +#include "bus/a2bus/laser128.h" +#include "bus/a2bus/mouse.h" #include "bus/a2bus/pc_xporter.h" -#include "bus/a2bus/a2eauxslot.h" -#include "bus/a2bus/a2estd80col.h" -#include "bus/a2bus/a2eext80col.h" -#include "bus/a2bus/a2eramworks3.h" -#include "bus/a2bus/ssprite.h" +#include "bus/a2bus/sider.h" #include "bus/a2bus/ssbapple.h" +#include "bus/a2bus/ssprite.h" +#include "bus/a2bus/timemasterho.h" #include "bus/a2bus/transwarp.h" -#include "bus/a2bus/a2vulcan.h" -#include "bus/a2bus/4play.h" -#include "bus/a2bus/computereyes2.h" -#include "bus/a2bus/byte8251.h" -#include "bus/a2bus/a2iwm.h" #include "bus/a2bus/uthernet.h" -#include "bus/a2bus/sider.h" #include "bus/a2gameio/gameio.h" #include "bus/rs232/rs232.h" @@ -4528,6 +4529,7 @@ static void apple2_cards(device_slot_interface &device) device.option_add("uthernet", A2BUS_UTHERNET); /* A2RetroSystems Uthernet card */ device.option_add("sider2", A2BUS_SIDER2); /* Advanced Tech Systems / First Class Peripherals Sider 2 SASI card */ device.option_add("sider1", A2BUS_SIDER1); /* Advanced Tech Systems / First Class Peripherals Sider 1 SASI card */ + device.option_add("grapplerplus", A2BUS_GRAPPLERPLUS); /* Orange Micro Grappler+ Printer Interface card */ } static void apple2eaux_cards(device_slot_interface &device) diff --git a/src/mame/drivers/apple2gs.cpp b/src/mame/drivers/apple2gs.cpp index d21dfc9618b..72674c2bcab 100644 --- a/src/mame/drivers/apple2gs.cpp +++ b/src/mame/drivers/apple2gs.cpp @@ -71,45 +71,46 @@ #include "machine/apple2common.h" //#include "machine/apple2host.h" +#include "bus/a2bus/4play.h" +#include "bus/a2bus/a2alfam2.h" +#include "bus/a2bus/a2applicard.h" +#include "bus/a2bus/a2arcadebd.h" #include "bus/a2bus/a2bus.h" -#include "bus/a2bus/ramcard16k.h" -#include "bus/a2bus/a2diskiing.h" -#include "bus/a2bus/a2mockingboard.h" #include "bus/a2bus/a2cffa.h" +#include "bus/a2bus/a2corvus.h" +#include "bus/a2bus/a2diskiing.h" +#include "bus/a2bus/a2dx1.h" +#include "bus/a2bus/a2echoii.h" +#include "bus/a2bus/a2hsscsi.h" +#include "bus/a2bus/a2mcms.h" #include "bus/a2bus/a2memexp.h" +#include "bus/a2bus/a2midi.h" +#include "bus/a2bus/a2mockingboard.h" +#include "bus/a2bus/a2pic.h" +#include "bus/a2bus/a2sam.h" #include "bus/a2bus/a2scsi.h" -#include "bus/a2bus/a2hsscsi.h" -#include "bus/a2bus/cmsscsi.h" -#include "bus/a2bus/a2thunderclock.h" #include "bus/a2bus/a2softcard.h" -#include "bus/a2bus/a2videoterm.h" #include "bus/a2bus/a2ssc.h" #include "bus/a2bus/a2swyft.h" #include "bus/a2bus/a2themill.h" -#include "bus/a2bus/a2sam.h" -#include "bus/a2bus/a2alfam2.h" -#include "bus/a2bus/laser128.h" -#include "bus/a2bus/a2echoii.h" -#include "bus/a2bus/a2arcadebd.h" -#include "bus/a2bus/a2midi.h" -#include "bus/a2bus/a2zipdrive.h" -#include "bus/a2bus/a2applicard.h" +#include "bus/a2bus/a2thunderclock.h" #include "bus/a2bus/a2ultraterm.h" -#include "bus/a2bus/a2pic.h" -#include "bus/a2bus/a2corvus.h" -#include "bus/a2bus/a2mcms.h" -#include "bus/a2bus/a2dx1.h" -#include "bus/a2bus/timemasterho.h" -#include "bus/a2bus/mouse.h" -#include "bus/a2bus/ezcgi.h" +#include "bus/a2bus/a2videoterm.h" #include "bus/a2bus/a2vulcan.h" -#include "bus/a2bus/4play.h" -//#include "bus/a2bus/pc_xporter.h" +#include "bus/a2bus/a2zipdrive.h" #include "bus/a2bus/byte8251.h" +#include "bus/a2bus/cmsscsi.h" +#include "bus/a2bus/ezcgi.h" +#include "bus/a2bus/grapplerplus.h" //#include "bus/a2bus/hostram.h" +#include "bus/a2bus/laser128.h" +#include "bus/a2bus/mouse.h" +//#include "bus/a2bus/pc_xporter.h" +#include "bus/a2bus/ramcard16k.h" //#include "bus/a2bus/ramfast.h" -#include "bus/a2bus/uthernet.h" #include "bus/a2bus/sider.h" +#include "bus/a2bus/timemasterho.h" +#include "bus/a2bus/uthernet.h" #include "bus/a2gameio/gameio.h" @@ -4593,6 +4594,7 @@ static void apple2_cards(device_slot_interface &device) device.option_add("uthernet", A2BUS_UTHERNET); /* A2RetroSystems Uthernet card */ device.option_add("sider2", A2BUS_SIDER2); /* Advanced Tech Systems / First Class Peripherals Sider 2 SASI card */ device.option_add("sider1", A2BUS_SIDER1); /* Advanced Tech Systems / First Class Peripherals Sider 1 SASI card */ + device.option_add("grapplerplus", A2BUS_GRAPPLERPLUS); /* Orange Micro Grappler+ Printer Interface card */ } void apple2gs_state::apple2gs(machine_config &config) |