mirror of
https://github.com/holub/mame
synced 2025-07-03 17:08:39 +03:00
spectrum/beta.cpp add centronics port and joystick to clones with such features
This commit is contained in:
parent
7016f2a641
commit
a96ee06484
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user