bus/a2bus: Added Orange Micro Grappler+ Printer Interface. [Vas Crabb, Golden Child, archive.org]

This commit is contained in:
Vas Crabb 2020-10-23 17:03:09 +11:00
parent dc2e44c7be
commit 515e85ba80
6 changed files with 585 additions and 150 deletions

View File

@ -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/a2cffa.cpp",
MAME_DIR .. "src/devices/bus/a2bus/a2cffa.h",
MAME_DIR .. "src/devices/bus/a2bus/a2memexp.cpp",
MAME_DIR .. "src/devices/bus/a2bus/a2memexp.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/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/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/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/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/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/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/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/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/a2softcard.cpp",
MAME_DIR .. "src/devices/bus/a2bus/a2softcard.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/a2themill.cpp",
MAME_DIR .. "src/devices/bus/a2bus/a2themill.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/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/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/ssbapple.cpp",
MAME_DIR .. "src/devices/bus/a2bus/ssbapple.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/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/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/uthernet.cpp",
MAME_DIR .. "src/devices/bus/a2bus/uthernet.h",
}
end

View File

@ -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()));
}
}

View File

@ -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

View File

@ -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)

View File

@ -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/a2memexp.h"
#include "bus/a2bus/a2scsi.h"
#include "bus/a2bus/cmsscsi.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/a2thunderclock.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/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/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/ssbapple.h"
#include "bus/a2bus/transwarp.h"
#include "bus/a2bus/a2videoterm.h"
#include "bus/a2bus/a2vulcan.h"
#include "bus/a2bus/4play.h"
#include "bus/a2bus/computereyes2.h"
#include "bus/a2bus/a2zipdrive.h"
#include "bus/a2bus/byte8251.h"
#include "bus/a2bus/a2iwm.h"
#include "bus/a2bus/uthernet.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/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/uthernet.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)

View File

@ -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/a2memexp.h"
#include "bus/a2bus/a2scsi.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/cmsscsi.h"
#include "bus/a2bus/a2thunderclock.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/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)