mirror of
https://github.com/holub/mame
synced 2025-07-03 17:08:39 +03:00
bbcmaiv: Added internal modem port, with Acorn AIV SCSI Host Adaptor.
This commit is contained in:
parent
79221dd5f9
commit
417176a102
@ -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
|
||||
|
@ -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
|
||||
|
102
src/devices/bus/bbc/modem/modem.cpp
Normal file
102
src/devices/bus/bbc/modem/modem.cpp
Normal 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 */
|
||||
}
|
105
src/devices/bus/bbc/modem/modem.h
Normal file
105
src/devices/bus/bbc/modem/modem.h
Normal 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
|
142
src/devices/bus/bbc/modem/scsiaiv.cpp
Normal file
142
src/devices/bus/bbc/modem/scsiaiv.cpp
Normal 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);
|
||||
}
|
71
src/devices/bus/bbc/modem/scsiaiv.h
Normal file
71
src/devices/bus/bbc/modem/scsiaiv.h
Normal 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 */
|
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user