summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/devices/bus/spectrum/beta.cpp127
-rw-r--r--src/devices/bus/spectrum/beta.h19
2 files changed, 142 insertions, 4 deletions
diff --git a/src/devices/bus/spectrum/beta.cpp b/src/devices/bus/spectrum/beta.cpp
index f6f6ba84596..d99f6e19e5c 100644
--- a/src/devices/bus/spectrum/beta.cpp
+++ b/src/devices/bus/spectrum/beta.cpp
@@ -85,6 +85,7 @@
V3-V4: D7 BDI ROM_latch (0=enable, 1=disble), D6 - FDC DDEN, D4 - SIDE, D3 - FDC HLT, D2 - FDC /MR (reset), D0-1 - floppy drive select (binary value).
CBI clones: D5 - printer port /STROBE
IO read port 0b1xxxx111 <- D7 - FDC INTRQ, D6 - FDC DRQ
+ CBI clones: D5 - printer port BUSY
IO read/write ports 0b0YYxx111 - access FDC ports YY
So mostly the same as beta128, except for new BDI ROM_latch bit
@@ -114,6 +115,9 @@ DEFINE_DEVICE_TYPE(SPECTRUM_GAMMA, spectrum_gamma_device, "spectrum_gamma"
static void beta_floppies(device_slot_interface &device)
{
device.option_add("525qd", FLOPPY_525_QD);
+ device.option_add("525dd", FLOPPY_525_DD);
+ device.option_add("35dd", FLOPPY_35_DD);
+ device.option_add("3dsdd", FLOPPY_3_DSDD);
}
//-------------------------------------------------
@@ -279,6 +283,9 @@ void spectrum_betacbi_device::device_add_mconfig(machine_config& config)
m_fdc->hld_wr_callback().set(FUNC(spectrum_betacbi_device::fdc_hld_w));
device_add_mconfig_base(config);
+
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set([this](u8 data) { m_centronics_busy = data; });
}
void spectrum_gamma_device::device_add_mconfig(machine_config& config)
@@ -289,7 +296,15 @@ void spectrum_gamma_device::device_add_mconfig(machine_config& config)
device_add_mconfig_base(config);
I8255(config, m_ppi);
- // TODO hook joystick and printer ports
+ m_ppi->in_pa_callback().set_ioport("JOY");
+ m_ppi->out_pb_callback().set("cent_data_out", FUNC(output_latch_device::write));
+ m_ppi->out_pc_callback().set([this](u8 data) { m_centronics->write_strobe(BIT(data, 7)); });
+
+ output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set([this](u8 data) { m_centronics_busy = data; });
+ m_centronics->set_output_latch(cent_data_out);
+
ACIA6850(config, m_acia, 0); // schematics missing, wiring unknown
}
@@ -380,6 +395,8 @@ spectrum_betaclone_device::spectrum_betaclone_device(const machine_config &mconf
spectrum_betacbi_device::spectrum_betacbi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: spectrum_betaclone_device(mconfig, type, tag, owner, clock)
+ , m_centronics(*this, "centronics")
+ , m_centronics_busy(0)
{
}
@@ -392,6 +409,8 @@ spectrum_gamma_device::spectrum_gamma_device(const machine_config &mconfig, devi
: spectrum_betaplus_device(mconfig, type, tag, owner, clock)
, m_ppi(*this, "PPI")
, m_acia(*this, "ACIA")
+ , m_centronics(*this, "centronics")
+ , m_centronics_busy(0)
{
}
@@ -422,6 +441,18 @@ void spectrum_betav2_device::device_start()
#endif
}
+void spectrum_betacbi_device::device_start()
+{
+ spectrum_betav2_device::device_start();
+ save_item(NAME(m_centronics_busy));
+}
+
+void spectrum_gamma_device::device_start()
+{
+ spectrum_betav2_device::device_start();
+ save_item(NAME(m_centronics_busy));
+}
+
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
@@ -586,6 +617,81 @@ void spectrum_betav3_device::iorq_w(offs_t offset, uint8_t data)
m_exp->iorq_w(offset, data);
}
+uint8_t spectrum_betacbi_device::iorq_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ if (!(m_masterdisable & 0x80))
+ {
+ switch (offset & 0x87)
+ {
+ case 0x07:
+ data = m_fdc->read((offset >> 5) & 0x03);
+ break;
+
+ case 0x87:
+ data &= 0x0f; // actually open bus
+ data |= 0x10; // some switch, unk purpose
+ data |= m_centronics_busy ? 0x20: 0;
+ data |= m_fdc->drq_r() ? 0x40 : 0;
+ data |= m_fdc->intrq_r() ? 0x80 : 0;
+ break;
+ }
+ }
+ else
+ data = m_exp->iorq_r(offset);
+
+ return data;
+}
+
+void spectrum_betacbi_device::iorq_w(offs_t offset, uint8_t data)
+{
+ if ((offset & 3) == 0)
+ m_masterdisable = data;
+
+ if (!BIT(offset, 2))
+ {
+ m_centronics->write_data0(BIT(data, 0));
+ m_centronics->write_data1(BIT(data, 1));
+ m_centronics->write_data2(BIT(data, 2));
+ m_centronics->write_data3(BIT(data, 3));
+ m_centronics->write_data4(BIT(data, 4));
+ m_centronics->write_data5(BIT(data, 5));
+ m_centronics->write_data6(BIT(data, 6));
+ m_centronics->write_data7(BIT(data, 7));
+ }
+
+ if (!(m_masterdisable & 0x80))
+ {
+ switch (offset & 0x87)
+ {
+ case 0x07:
+ m_fdc->write((offset >> 5) & 0x03, data);
+ break;
+
+ case 0x87:
+ m_control = data;
+
+ floppy_image_device* floppy = m_floppy[data & 3]->get_device();
+
+ m_fdc->set_floppy(floppy);
+ if (floppy)
+ floppy->ss_w(BIT(data, 4) ? 0 : 1);
+ m_fdc->dden_w(BIT(data, 6));
+
+ m_fdc->hlt_w(BIT(data, 3));
+
+ m_fdc->mr_w(BIT(data, 2));
+ motors_control();
+
+ m_centronics->write_strobe(!BIT(data, 5));
+ break;
+ }
+ }
+ else
+ m_exp->iorq_w(offset, data);
+}
+
uint8_t spectrum_gamma_device::iorq_r(offs_t offset)
{
uint8_t data = 0xff;
@@ -759,11 +865,30 @@ INPUT_PORTS_START(betaplus)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Magic Button") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_betaplus_device, magic_button, 0)
INPUT_PORTS_END
+INPUT_PORTS_START(gamma)
+ PORT_INCLUDE(betaplus)
+
+ PORT_START("JOY")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_8WAY
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_8WAY
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_8WAY
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_8WAY
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1)
+ PORT_BIT(0x60, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_CUSTOM_MEMBER(spectrum_gamma_device, busy_r)
+INPUT_PORTS_END
+
+
ioport_constructor spectrum_betaplus_device::device_input_ports() const
{
return INPUT_PORTS_NAME(betaplus);
}
+ioport_constructor spectrum_gamma_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(gamma);
+}
+
INPUT_CHANGED_MEMBER(spectrum_betaplus_device::magic_button)
{
if (newval && !oldval)
diff --git a/src/devices/bus/spectrum/beta.h b/src/devices/bus/spectrum/beta.h
index 82600ab9206..60bfc440d3e 100644
--- a/src/devices/bus/spectrum/beta.h
+++ b/src/devices/bus/spectrum/beta.h
@@ -11,6 +11,7 @@
#include "exp.h"
#include "softlist.h"
#include "imagedev/floppy.h"
+#include "bus/centronics/ctronics.h"
#include "machine/wd_fdc.h"
#include "machine/i8255.h"
#include "machine/6850acia.h"
@@ -120,10 +121,16 @@ public:
spectrum_betacbi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
+ virtual void device_start() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual void fetch(offs_t offset) override;
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ required_device<centronics_device> m_centronics;
+
+ int m_centronics_busy;
};
class spectrum_gamma_device :
@@ -134,16 +141,22 @@ public:
spectrum_gamma_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
spectrum_gamma_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ DECLARE_CUSTOM_INPUT_MEMBER(busy_r) { return !m_centronics_busy; }
protected:
- required_device<i8255_device> m_ppi;
- required_device<acia6850_device> m_acia;
-
+ virtual void device_start() override;
virtual void device_add_mconfig(machine_config &config) override;
+ virtual ioport_constructor device_input_ports() const override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual const tiny_rom_entry *device_rom_region() const override;
virtual uint8_t iorq_r(offs_t offset) override;
virtual void iorq_w(offs_t offset, uint8_t data) override;
virtual DECLARE_READ_LINE_MEMBER(romcs) override { return 1; };
+
+ required_device<i8255_device> m_ppi;
+ required_device<acia6850_device> m_acia;
+ required_device<centronics_device> m_centronics;
+
+ int m_centronics_busy;
};
// device type definition