bbcmaiv: Added internal modem port, with Acorn AIV SCSI Host Adaptor.

This commit is contained in:
Nigel Barnes 2020-01-22 18:08:46 +00:00
parent 79221dd5f9
commit 417176a102
8 changed files with 449 additions and 2 deletions

View File

@ -456,6 +456,21 @@ if (BUSES["BBC_JOYPORT"]~=null) then
end
---------------------------------------------------
--
--@src/devices/bus/bbc/modem/modem.h,BUSES["BBC_MODEM"] = true
---------------------------------------------------
if (BUSES["BBC_MODEM"]~=null) then
files {
MAME_DIR .. "src/devices/bus/bbc/modem/modem.cpp",
MAME_DIR .. "src/devices/bus/bbc/modem/modem.h",
MAME_DIR .. "src/devices/bus/bbc/modem/scsiaiv.cpp",
MAME_DIR .. "src/devices/bus/bbc/modem/scsiaiv.h",
}
end
---------------------------------------------------
--
--@src/devices/bus/bbc/1mhzbus/1mhzbus.h,BUSES["BBC_1MHZBUS"] = true

View File

@ -768,6 +768,7 @@ BUSES["BBC_CART"] = true
BUSES["BBC_EXP"] = true
BUSES["BBC_INTERNAL"] = true
BUSES["BBC_JOYPORT"] = true
BUSES["BBC_MODEM"] = true
BUSES["BBC_1MHZBUS"] = true
BUSES["BBC_TUBE"] = true
BUSES["BBC_USERPORT"] = true

View File

@ -0,0 +1,102 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
BBC Master Internal Modem port
**********************************************************************/
#include "emu.h"
#include "modem.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_MODEM_SLOT, bbc_modem_slot_device, "bbc_modem_slot", "BBC Master Internal Modem port")
//**************************************************************************
// DEVICE BBC_MODEM PORT INTERFACE
//**************************************************************************
//-------------------------------------------------
// device_bbc_modem_interface - constructor
//-------------------------------------------------
device_bbc_modem_interface::device_bbc_modem_interface(const machine_config &mconfig, device_t &device) :
device_interface(device, "bbcmodem")
{
m_slot = dynamic_cast<bbc_modem_slot_device *>(device.owner());
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_modem_slot_device - constructor
//-------------------------------------------------
bbc_modem_slot_device::bbc_modem_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_MODEM_SLOT, tag, owner, clock)
, device_single_card_slot_interface<device_bbc_modem_interface>(mconfig, *this)
, m_card(nullptr)
, m_irq_handler(*this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void bbc_modem_slot_device::device_start()
{
m_card = get_card_device();
// resolve callbacks
m_irq_handler.resolve_safe();
}
//-------------------------------------------------
// read
//-------------------------------------------------
uint8_t bbc_modem_slot_device::read(offs_t offset)
{
if (m_card)
return m_card->read(offset & 0x0f);
else
return 0xfe;
}
//-------------------------------------------------
// write
//-------------------------------------------------
void bbc_modem_slot_device::write(offs_t offset, uint8_t data)
{
if (m_card)
m_card->write(offset & 0x0f, data);
}
//-------------------------------------------------
// SLOT_INTERFACE( bbcm_modem_devices )
//-------------------------------------------------
// slot devices
#include "scsiaiv.h"
void bbcm_modem_devices(device_slot_interface &device)
{
//device.option_add("modem", BBC_MODEM); /* Beebug Master Modem */
device.option_add("scsiaiv", BBC_SCSIAIV); /* Acorn AIV SCSI Host Adaptor */
//device.option_add("vp415", BBC_VP415); /* Philips VP415 */
}

View File

@ -0,0 +1,105 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
BBC Master Internal Modem port
**********************************************************************
Pinout:
1 NIRQ
2 NRST
3 BD0
4 BD1
5 BD2
6 BD3
7 BD4
8 BD5
9 BD6
10 BD7
11 MODEM
12 A0
13 A1
14 A2
15 A3
16 1MHzE
17 R/W
18 +5V
19 -5V
20 0V
**********************************************************************/
#ifndef MAME_BUS_BBC_MODEM_MODEM_H
#define MAME_BUS_BBC_MODEM_MODEM_H
#pragma once
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_modem_slot_device
class device_bbc_modem_interface;
class bbc_modem_slot_device : public device_t, public device_single_card_slot_interface<device_bbc_modem_interface>
{
public:
// construction/destruction
template <typename T>
bbc_modem_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&slot_options, const char *default_option)
: bbc_modem_slot_device(mconfig, tag, owner, clock)
{
option_reset();
slot_options(*this);
set_default_option(default_option);
set_fixed(false);
}
bbc_modem_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
// callbacks
auto irq_handler() { return m_irq_handler.bind(); }
virtual uint8_t read(offs_t offset);
virtual void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
protected:
// device-level overrides
virtual void device_start() override;
device_bbc_modem_interface *m_card;
private:
devcb_write_line m_irq_handler;
};
// ======================> device_bbc_modem_interface
class device_bbc_modem_interface : public device_interface
{
public:
virtual uint8_t read(offs_t offset) { return 0xff; }
virtual void write(offs_t offset, uint8_t data) { }
protected:
device_bbc_modem_interface(const machine_config &mconfig, device_t &device);
bbc_modem_slot_device *m_slot;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_MODEM_SLOT, bbc_modem_slot_device)
void bbcm_modem_devices(device_slot_interface &device);
#endif // MAME_BUS_BBC_MODEM_MODEM_H

View File

@ -0,0 +1,142 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
Acorn AIV SCSI Host Adaptor
**********************************************************************/
#include "emu.h"
#include "scsiaiv.h"
#include "machine/nscsi_bus.h"
#include "bus/nscsi/devices.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_SCSIAIV, bbc_scsiaiv_device, "bbc_scsiaiv", "Acorn AIV SCSI Host Adaptor");
//DEFINE_DEVICE_TYPE(BBC_VP415, bbc_vp415_device, "bbc_vp415", "BBC Philips VP415");
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void bbc_scsiaiv_device::device_add_mconfig(machine_config& config)
{
NSCSI_BUS(config, "scsi");
NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr);
NSCSI_CONNECTOR(config, "scsi:7", default_scsi_devices, "scsicb", true)
.option_add_internal("scsicb", NSCSI_CB)
.machine_config([this](device_t* device) {
downcast<nscsi_callback_device&>(*device).bsy_callback().set(*this, FUNC(bbc_scsiaiv_device::bsy_w));
downcast<nscsi_callback_device&>(*device).req_callback().set(*this, FUNC(bbc_scsiaiv_device::req_w));
});
}
//void bbc_vp415_device::device_add_mconfig(machine_config& config)
//{
// bbc_scsiaiv_device::device_add_mconfig(config);
//
// /* Philips VP415 */
// subdevice<nscsi_connector>("scsi:0")->set_default_option("vp415");
// subdevice<nscsi_connector>("scsi:0")->set_fixed(true);
//}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_scsiaiv_device - constructor
//-------------------------------------------------
bbc_scsiaiv_device::bbc_scsiaiv_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
, device_bbc_modem_interface(mconfig, *this)
, m_scsi(*this, "scsi:7:scsicb")
{
}
bbc_scsiaiv_device::bbc_scsiaiv_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock)
: bbc_scsiaiv_device(mconfig, BBC_SCSIAIV, tag, owner, clock)
{
}
//bbc_vp415_device::bbc_vp415_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock)
// : bbc_scsiaiv_device(mconfig, BBC_VP415, tag, owner, clock)
//{
//}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void bbc_scsiaiv_device::device_start()
{
/* register for save states */
save_item(NAME(m_irq_enable));
save_item(NAME(m_irq_state));
}
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
uint8_t bbc_scsiaiv_device::read(offs_t offset)
{
uint8_t data = 0xff;
switch (offset & 0x07)
{
case 0x00:
data = m_scsi->read();
m_scsi->ack_w(1);
break;
case 0x01:
data = (m_scsi->msg_r() << 0)
| (m_scsi->bsy_r() << 1)
| (m_scsi->rst_r() << 2)
| (!m_irq_state << 4)
| (m_scsi->req_r() << 5)
| (m_scsi->io_r() << 6)
| (m_scsi->cd_r() << 7);
break;
}
return data;
}
void bbc_scsiaiv_device::write(offs_t offset, uint8_t data)
{
switch (offset & 0x07)
{
case 0x00:
m_scsi->write(~data);
m_scsi->ack_w(1);
break;
case 0x02:
m_scsi->sel_w(1);
break;
case 0x03:
m_irq_enable = BIT(data, 0);
break;
}
}
WRITE_LINE_MEMBER(bbc_scsiaiv_device::bsy_w)
{
m_scsi->sel_w(0);
}
WRITE_LINE_MEMBER(bbc_scsiaiv_device::req_w)
{
m_scsi->ack_w(0);
m_irq_state = (m_irq_enable && !state) ? 0 : 1;
m_slot->irq_w(m_irq_state ? CLEAR_LINE : ASSERT_LINE);
}

View File

@ -0,0 +1,71 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
Acorn AIV SCSI Host Adaptor
**********************************************************************/
#ifndef MAME_BUS_BBC_1MHZBUS_SCSIAIV_H
#define MAME_BUS_BBC_1MHZBUS_SCSIAIV_H
#include "modem.h"
#include "machine/nscsi_cb.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class bbc_scsiaiv_device:
public device_t,
public device_bbc_modem_interface
{
public:
// construction/destruction
bbc_scsiaiv_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock);
DECLARE_WRITE_LINE_MEMBER(bsy_w);
DECLARE_WRITE_LINE_MEMBER(req_w);
protected:
bbc_scsiaiv_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock);
// device-level overrides
virtual void device_start() override;
// optional information overrides
virtual void device_add_mconfig(machine_config& config) override;
virtual uint8_t read(offs_t offset) override;
virtual void write(offs_t offset, uint8_t data) override;
private:
required_device<nscsi_callback_device> m_scsi;
int m_irq_enable;
int m_irq_state;
};
// ======================> bbc_vp415_device
//class bbc_vp415_device : public bbc_scsiaiv_device
//{
//public:
// // construction/destruction
// bbc_vp415_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock);
//
//protected:
// // optional information overrides
// virtual void device_add_mconfig(machine_config& config) override;
//};
// device type definition
DECLARE_DEVICE_TYPE(BBC_SCSIAIV, bbc_scsiaiv_device);
//DECLARE_DEVICE_TYPE(BBC_VP415, bbc_vp415_device);
#endif /* MAME_BUS_BBC_1MHZBUS_SCSIAIV_H */

View File

@ -250,7 +250,7 @@ void bbcm_state::bbcm_bankdev(address_map &map)
map(0x023c, 0x023f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe3c-fe3f INTON
map(0x0240, 0x025f).mirror(0x400).m(m_via6522_0, FUNC(via6522_device::map)); // fe40-fe5f 6522 VIA SYSTEM VIA
map(0x0260, 0x027f).mirror(0x400).m(m_via6522_1, FUNC(via6522_device::map)); // fe60-fe7f 6522 VIA USER VIA
map(0x0280, 0x029f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe80-fe9f Int. Modem Int. Modem
map(0x0280, 0x029f).mirror(0x400).rw(m_modem, FUNC(bbc_modem_slot_device::read), FUNC(bbc_modem_slot_device::write)); // fe80-fe9f Int. Modem Int. Modem
map(0x02a0, 0x02bf).mirror(0x400).rw(m_adlc, FUNC(mc6854_device::read), FUNC(mc6854_device::write)); // fea0-febf 68B54 ADLC ECONET controller
map(0x02e0, 0x02ff).mirror(0x400).rw(FUNC(bbc_state::bbcm_tube_r), FUNC(bbc_state::bbcm_tube_w)); // fee0-feff Tube ULA Tube system interface
/* ACCCON TST bit - hardware test */
@ -1510,6 +1510,10 @@ void bbcm_state::bbcm(machine_config &config)
m_internal->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<8>));
m_internal->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
/* internal modem port */
BBC_MODEM_SLOT(config, m_modem, 16_MHz_XTAL / 16, bbcm_modem_devices, nullptr);
m_modem->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<9>));
/* software lists */
SOFTWARE_LIST(config, "cass_ls_m").set_original("bbcm_cass");
SOFTWARE_LIST(config, "flop_ls_m").set_original("bbcm_flop");
@ -1538,7 +1542,9 @@ void bbcm_state::bbcmaiv(machine_config &config)
m_intube->set_default_option("65c102");
m_intube->set_fixed(true);
/* Add Philips VP415 Laserdisc player */
/* Philips VP415 Laserdisc player */
m_modem->set_default_option("scsiaiv");
m_modem->set_fixed(true);
/* Acorn Tracker Ball */
m_userport->set_default_option("tracker");
@ -1587,6 +1593,7 @@ void bbcm_state::bbcmet(machine_config &config)
config.device_remove("extube");
config.device_remove("1mhzbus");
config.device_remove("userport");
config.device_remove("modem");
}
@ -1765,6 +1772,7 @@ void bbcm_state::bbcmc(machine_config &config)
config.device_remove("extube");
config.device_remove("userport");
config.device_remove("internal");
config.device_remove("modem");
}

View File

@ -42,6 +42,7 @@
#include "bus/bbc/fdc/fdc.h"
#include "bus/bbc/analogue/analogue.h"
#include "bus/bbc/1mhzbus/1mhzbus.h"
#include "bus/bbc/modem/modem.h"
#include "bus/bbc/internal/internal.h"
#include "bus/bbc/tube/tube.h"
#include "bus/bbc/userport/userport.h"
@ -84,6 +85,7 @@ public:
, m_intube(*this, "intube")
, m_extube(*this, "extube")
, m_1mhzbus(*this, "1mhzbus")
, m_modem(*this, "modem")
, m_userport(*this, "userport")
, m_internal(*this, "internal")
, m_exp(*this, "exp")
@ -243,6 +245,7 @@ protected:
optional_device<bbc_tube_slot_device> m_intube;
optional_device<bbc_tube_slot_device> m_extube;
optional_device<bbc_1mhzbus_slot_device> m_1mhzbus;
optional_device<bbc_modem_slot_device> m_modem;
optional_device<bbc_userport_slot_device> m_userport;
optional_device<bbc_internal_slot_device> m_internal;
optional_device<bbc_exp_slot_device> m_exp;