diff options
-rw-r--r-- | src/devices/bus/spectrum/beta.cpp | 127 | ||||
-rw-r--r-- | src/devices/bus/spectrum/beta.h | 19 |
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 ¢_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 |