spectrum/beta.cpp add centronics port and joystick to clones with such features

This commit is contained in:
MetalliC 2020-06-28 21:44:11 +03:00
parent 7016f2a641
commit a96ee06484
2 changed files with 142 additions and 4 deletions

View File

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

View File

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