summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2019-11-05 21:11:05 +0000
committer Nigel Barnes <Pernod70@users.noreply.github.com>2019-11-06 11:49:38 +0000
commit9f5f84272ecec6486a998cff6e46fdad9b73ae61 (patch)
tree7ff2daa8d07a3c3a2410be5ba9d9542e63811815
parentae04921d528fbf294ae2645139503a372aec3129 (diff)
bbc.cpp: Replaced ROM/RAM memory banks with handlers to allow access from internal expansion boards.
- Added slot interface for internal expansion boards. - Added BBC Master cartridge slot interface to allow implementation of more complex cartridges, including Electron cartridge devices. - Removed Sideways RAM configuration option, to be re-implemented as internal boards. - Empty BBC Master cartridge sockets return video data on data bus.
-rw-r--r--scripts/src/bus.lua28
-rw-r--r--scripts/target/mame/mess.lua2
-rw-r--r--src/devices/bus/bbc/cart/slot.cpp71
-rw-r--r--src/devices/bus/bbc/cart/slot.h161
-rw-r--r--src/devices/bus/bbc/internal/internal.cpp168
-rw-r--r--src/devices/bus/bbc/internal/internal.h113
-rw-r--r--src/devices/bus/bbc/rom/nvram.cpp58
-rw-r--r--src/devices/bus/bbc/rom/nvram.h42
-rw-r--r--src/devices/bus/bbc/rom/ram.cpp1
-rw-r--r--src/devices/bus/bbc/rom/rom.cpp4
-rw-r--r--src/devices/bus/bbc/rom/slot.cpp5
-rw-r--r--src/devices/bus/bbc/rom/slot.h8
-rw-r--r--src/devices/bus/electron/cart/slot.cpp9
-rw-r--r--src/devices/bus/electron/cart/slot.h4
-rw-r--r--src/mame/drivers/bbc.cpp301
-rw-r--r--src/mame/includes/bbc.h50
-rw-r--r--src/mame/machine/bbc.cpp495
-rw-r--r--src/mame/video/bbc.cpp10
18 files changed, 1201 insertions, 329 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index f97b1b4fea5..52fc842ba16 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -360,6 +360,32 @@ end
---------------------------------------------------
--
+--@src/devices/bus/bbc/cart/slot.h,BUSES["BBC_CART"] = true
+---------------------------------------------------
+
+if (BUSES["BBC_CART"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/bus/bbc/cart/slot.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/cart/slot.h",
+ }
+end
+
+
+---------------------------------------------------
+--
+--@src/devices/bus/bbc/internal/internal.h,BUSES["BBC_INTERNAL"] = true
+---------------------------------------------------
+
+if (BUSES["BBC_INTERNAL"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/bus/bbc/internal/internal.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/internal/internal.h",
+ }
+end
+
+
+---------------------------------------------------
+--
--@src/devices/bus/bbc/exp/exp.h,BUSES["BBC_EXP"] = true
---------------------------------------------------
@@ -430,6 +456,8 @@ if (BUSES["BBC_ROM"]~=null) then
MAME_DIR .. "src/devices/bus/bbc/rom/rom.h",
MAME_DIR .. "src/devices/bus/bbc/rom/ram.cpp",
MAME_DIR .. "src/devices/bus/bbc/rom/ram.h",
+ MAME_DIR .. "src/devices/bus/bbc/rom/nvram.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/rom/nvram.h",
MAME_DIR .. "src/devices/bus/bbc/rom/dfs.cpp",
MAME_DIR .. "src/devices/bus/bbc/rom/dfs.h",
MAME_DIR .. "src/devices/bus/bbc/rom/genie.cpp",
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index ab0883acec4..dba04734d60 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -752,7 +752,9 @@ BUSES["ASTROCADE"] = true
BUSES["ATA"] = true
BUSES["BBC_FDC"] = true
BUSES["BBC_ANALOGUE"] = true
+BUSES["BBC_CART"] = true
BUSES["BBC_EXP"] = true
+BUSES["BBC_INTERNAL"] = true
BUSES["BBC_JOYPORT"] = true
BUSES["BBC_1MHZBUS"] = true
BUSES["BBC_TUBE"] = true
diff --git a/src/devices/bus/bbc/cart/slot.cpp b/src/devices/bus/bbc/cart/slot.cpp
new file mode 100644
index 00000000000..b39c0e9dc1e
--- /dev/null
+++ b/src/devices/bus/bbc/cart/slot.cpp
@@ -0,0 +1,71 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***********************************************************************************************************
+
+ BBC Master Cartridge slot emulation
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "slot.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBCM_CARTSLOT, bbc_cartslot_device, "bbc_cartslot", "BBC Master Cartridge Slot")
+
+
+//**************************************************************************
+// DEVICE ELECTRON_CARTSLOT CARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_bbc_cart_interface - constructor
+//-------------------------------------------------
+
+device_bbc_cart_interface::device_bbc_cart_interface(const machine_config &mconfig, device_t &device)
+ : device_electron_cart_interface(mconfig, device)
+{
+ m_slot = dynamic_cast<bbc_cartslot_device *>(device.owner());
+}
+
+
+//-------------------------------------------------
+// ~device_bbc_cart_interface - destructor
+//-------------------------------------------------
+
+device_bbc_cart_interface::~device_bbc_cart_interface()
+{
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_cartslot_device - constructor
+//-------------------------------------------------
+bbc_cartslot_device::bbc_cartslot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ electron_cartslot_device(mconfig, BBCM_CARTSLOT, tag, owner, clock)
+{
+}
+
+
+//-------------------------------------------------
+// SLOT_INTERFACE( bbcm_cart )
+//-------------------------------------------------
+
+#include "bus/electron/cart/std.h"
+#include "bus/electron/cart/abr.h"
+#include "bus/electron/cart/aqr.h"
+
+
+void bbcm_cart(device_slot_interface &device)
+{
+ device.option_add_internal("std", ELECTRON_STDCART);
+ device.option_add_internal("abr", ELECTRON_ABR);
+ device.option_add_internal("aqr", ELECTRON_AQR);
+}
diff --git a/src/devices/bus/bbc/cart/slot.h b/src/devices/bus/bbc/cart/slot.h
new file mode 100644
index 00000000000..b24a6fa1a8c
--- /dev/null
+++ b/src/devices/bus/bbc/cart/slot.h
@@ -0,0 +1,161 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ BBC Master Cartridge slot emulation
+
+**********************************************************************
+
+ Pinout:
+ A B
+ +5V 1 1 +5
+ nOE 2 2 A10
+ nRST 3 3 D3
+ CSRW 4 4 A11
+ A8 5 5 A9
+ A13 6 6 D7
+ A12 7 7 D6
+ PHI2 8 8 D5
+ -5V 9 9 D4
+CSYNC/MADET 10 10 LPSTB
+ R/W 11 11 BA7
+ nNMI 12 12 BA6
+ nIRQ 13 13 BA5
+ nINFC 14 14 BA4
+ nINFD 15 15 BA3
+ ROMQA 16 16 BA2
+ Clock 17 17 BA1
+ nCRTCRST 18 18 BA0
+ ADOUT 19 19 D0
+ AGND 20 20 D2
+ NC 21 21 D1
+ 0V 22 22 0V
+
+ Signal Definitions:
+
+ SIDE 'A'
+ 1 +5V - Power supply. This is the system logic supply rail.
+ 2 n0E - Output Enable : Input with CMOS levels. This is an active low signal during the PH12
+ period of the system clock.
+ 3 nRST - System Reset : Input with CMOS levels. This signal is active low during system reset.
+ 4 CSRW - Changes function according to the memory region that the CPU is addressing.
+ During accesses to &FC00 through &FEFF it is equivalent to the CPU Read/Write line
+ during nPH12. For all other accesses it is an Active High chip select for memory devices.
+ 5 A8 - Address line 8 : Input with TTL levels
+ 6 A13 - Address line 13 : Input with TTL levels
+ 7 A12 - Address line 12 : Input with TTL levels
+ 8 PH12 - CPU clock : Input with CMOS levels
+ This input is the host computer PH12out.
+ 9 -5V - The negative supply voltage.
+ 10 MADET - There are two functions dependent upon link 12 in the computer:
+ E/nB - the default function. It enables cartridges to know which machine they are plugged
+ into. It is connected to 0V in the Master.
+ CSYNC - Composite Sync. Input from TTL levels.
+ System Vertical & Horizontal sync is made available for Genlock use.
+ 11 R/W - Data Direction Control. Input from TTL levels
+ 12 nNMI - Non maskable interrupt : Open collector output
+ This signal is connected to the system NMI line. It is active low.
+ 13 nIRQ - Interrupt request : Open collector output
+ This signal is connected to the system IRQ line. It is active low.
+ 14 nINFC - Internal Page &FC : When bit IFJ in the Master ACCON register (via &FE34) is set, all accesses to
+ &FC00 through &FCFF will cause this select to become active. : TTL active low
+ 15 nINFD - Internal page &FD : When bit IFJ in the Master ACCON register (via &FE34) is set, all accesses to
+ &FD00 through &FDFF will cause this select to become active. : TTL active low
+ 16 ROMQA - Memory paging select : Input with TTL levels
+ This is the least significant bit of the ROM select latch located at &FE30 in the Master.
+ 17 Clock - Links on the computer select one of two functions:
+ a) 16Mhz Output to computer (Link DB only).
+ b) 8 Mhz Input to cartridge (Link CD in addition to AB).
+ 18 nCRTCRST - nCRTCRST is an Active Low Output signal of the system CRTC reset input. It is
+ provided for Genlock use.
+ 19 ADOUT - System audio output
+ 20 AGND - Audio Ground
+ 21 ADIN - Cartridge audio output
+ 22 0V - Zero volts
+
+ SIDE 'B'
+ 1 +5V - Power supply. This is the system logic supply rail.
+ 2 A10 - Address line 10 : Input with TTL levels
+ 3 D3 - Data bus line 3 : Input/Output with TTL levels
+ 4 A11 - Address line 11 : Input with TTL levels
+ 5 A9 - Address line 9 : Input with TTL levels
+ 6 D7 - Most significant data bus line : Input/Output with TTL levels
+ 7 D6 - Data bus line 6 : Input/Output with TTL levels
+ 8 D5 - Data bus line 5 : Input/Output with TTL levels
+ 9 D4 - Data bus line 4 : Input/Output with TTL levels
+ 10 LPSTB - With link 21 removed in the computer, this pin provides a connection between the
+ two cartridges. With the link in place, the pin forms a connection to a pull-up resistor in the
+ computer to +5V. The connection is also made to the CRTC Light-Pen Strobe and interrupt
+ structure
+ 11 BA7 - Buffered address line 7 : Input with TTL levels
+ 12 BA6 - Buffered address line 6 : Input with TTL levels
+ 13 BA5 - Buffered address line 5 : Input with TTL levels
+ 14 BA4 - Buffered address line 4 : Input with TTL levels
+ 15 BA3 - Buffered address line 3 : Input with TTL levels
+ 16 BA2 - Buffered address line 2 : Input with TTL levels
+ 17 BA1 - Buffered address line 1 : Input with TTL levels
+ 18 BA0 - Buffered address line 0 : Input with TTL levels
+ 19 D0 - Data bus line 0 : Input/Output with TTL levels
+ 20 D2 - Data bus line 2 : Input/Output with TTL levels
+ 21 D1 - Data bus line 1 : Input/Output with TTL levels
+ 22 0V - Zero volts.
+
+**********************************************************************/
+#ifndef MAME_BUS_BBC_CARTSLOT_H
+#define MAME_BUS_BBC_CARTSLOT_H
+
+#pragma once
+
+#include "bus/electron/cart/slot.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_cartslot_device
+
+class device_bbc_cart_interface;
+
+class bbc_cartslot_device : public electron_cartslot_device
+{
+public:
+ // construction/destruction
+ template <typename T>
+ bbc_cartslot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&slot_options, const char *default_option)
+ : electron_cartslot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_cartslot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual const char *image_interface() const override { return "bbcm_cart"; }
+ virtual const char *file_extensions() const override { return "rom,bin"; }
+};
+
+
+// ======================> device_bbc_cart_interface
+
+class device_bbc_cart_interface : public device_electron_cart_interface
+{
+public:
+ // construction/destruction
+ virtual ~device_bbc_cart_interface();
+
+protected:
+ device_bbc_cart_interface(const machine_config &mconfig, device_t &device);
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBCM_CARTSLOT, bbc_cartslot_device)
+
+void bbcm_cart(device_slot_interface &device);
+
+
+#endif // MAME_BUS_BBC_CARTSLOT_H
diff --git a/src/devices/bus/bbc/internal/internal.cpp b/src/devices/bus/bbc/internal/internal.cpp
new file mode 100644
index 00000000000..ca179bec25d
--- /dev/null
+++ b/src/devices/bus/bbc/internal/internal.cpp
@@ -0,0 +1,168 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ BBC Micro internal expansion boards
+
+ These boards usually add shadow RAM and/or additional ROM sockets.
+ They don't have a fixed interface, some use the 6502 socket and move
+ the CPU to the board, others will move other IC's to the board and
+ flying leads will be connected to various points to pick up control
+ lines and writes to latches.
+
+**********************************************************************/
+
+#include "emu.h"
+#include "internal.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_INTERNAL_SLOT, bbc_internal_slot_device, "bbc_internal_slot", "BBC Micro internal boards")
+
+
+
+//**************************************************************************
+// DEVICE BBC_INTERNAL PORT INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_bbc_internal_interface - constructor
+//-------------------------------------------------
+
+device_bbc_internal_interface::device_bbc_internal_interface(const machine_config &mconfig, device_t &device)
+ : device_interface(device, "bbcinternal")
+ , m_maincpu(*this, ":maincpu")
+ , m_mb_ram(*this, ":ram")
+ , m_mb_rom(*this, ":romslot%u", 0U)
+ , m_region_swr(*this, ":swr")
+ , m_region_mos(*this, ":mos")
+{
+ m_slot = dynamic_cast<bbc_internal_slot_device *>(device.owner());
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_internal_slot_device - constructor
+//-------------------------------------------------
+
+bbc_internal_slot_device::bbc_internal_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_INTERNAL_SLOT, tag, owner, clock)
+ , device_single_card_slot_interface<device_bbc_internal_interface>(mconfig, *this)
+ , m_irq_handler(*this)
+ , m_nmi_handler(*this)
+ , m_card(nullptr)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_internal_slot_device::device_start()
+{
+ m_card = get_card_device();
+
+ // resolve callbacks
+ m_irq_handler.resolve_safe();
+ m_nmi_handler.resolve_safe();
+}
+
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+uint8_t bbc_internal_slot_device::ram_r(offs_t offset)
+{
+ if (m_card)
+ return m_card->ram_r(offset);
+ else
+ return 0xff;
+}
+
+uint8_t bbc_internal_slot_device::romsel_r(offs_t offset)
+{
+ if (m_card)
+ return m_card->romsel_r(offset);
+ else
+ return 0xfe;
+}
+
+uint8_t bbc_internal_slot_device::paged_r(offs_t offset)
+{
+ if (m_card)
+ return m_card->paged_r(offset);
+ else
+ return 0xff;
+}
+
+uint8_t bbc_internal_slot_device::mos_r(offs_t offset)
+{
+ if (m_card)
+ return m_card->mos_r(offset);
+ else
+ return 0xff;
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+void bbc_internal_slot_device::ram_w(offs_t offset, uint8_t data)
+{
+ if (m_card)
+ m_card->ram_w(offset, data);
+}
+
+void bbc_internal_slot_device::romsel_w(offs_t offset, uint8_t data)
+{
+ if (m_card)
+ m_card->romsel_w(offset, data);
+}
+
+void bbc_internal_slot_device::paged_w(offs_t offset, uint8_t data)
+{
+ if (m_card)
+ m_card->paged_w(offset, data);
+}
+
+void bbc_internal_slot_device::mos_w(offs_t offset, uint8_t data)
+{
+ if (m_card)
+ m_card->mos_w(offset, data);
+}
+
+void bbc_internal_slot_device::latch_fe60_w(uint8_t data)
+{
+ if (m_card)
+ m_card->latch_fe60_w(data);
+}
+
+
+//-------------------------------------------------
+// SLOT_INTERFACE( bbc_internal_devices )
+//-------------------------------------------------
+
+
+// slot devices
+
+
+void bbcb_internal_devices(device_slot_interface &device)
+{
+}
+
+void bbcbp_internal_devices(device_slot_interface &device)
+{
+}
+
+void bbcm_internal_devices(device_slot_interface &device)
+{
+}
diff --git a/src/devices/bus/bbc/internal/internal.h b/src/devices/bus/bbc/internal/internal.h
new file mode 100644
index 00000000000..4adc7d2c615
--- /dev/null
+++ b/src/devices/bus/bbc/internal/internal.h
@@ -0,0 +1,113 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ BBC Micro internal expansion boards
+
+**********************************************************************/
+
+#ifndef MAME_BUS_BBC_INTERNAL_INTERNAL_H
+#define MAME_BUS_BBC_INTERNAL_INTERNAL_H
+
+#pragma once
+
+#include "machine/ram.h"
+#include "bus/bbc/rom/slot.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_internal_slot_device;
+
+// ======================> device_bbc_internal_interface
+
+class device_bbc_internal_interface : public device_interface
+{
+public:
+ virtual bool overrides_ram() { return false; }
+ virtual bool overrides_rom() { return false; }
+ virtual bool overrides_mos() { return false; }
+ virtual uint8_t ram_r(offs_t offset) { return 0xff; }
+ virtual void ram_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t romsel_r(offs_t offset) { return 0xfe; }
+ virtual void romsel_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t paged_r(offs_t offset) { return 0xff; }
+ virtual void paged_w(offs_t offset, uint8_t data) { }
+ virtual uint8_t mos_r(offs_t offset) { return 0xff; }
+ virtual void mos_w(offs_t offset, uint8_t data) { }
+ virtual void latch_fe60_w(uint8_t data) { }
+
+protected:
+ device_bbc_internal_interface(const machine_config &mconfig, device_t &device);
+
+ required_device<cpu_device> m_maincpu;
+ required_device<ram_device> m_mb_ram;
+ optional_device_array<bbc_romslot_device, 16> m_mb_rom;
+ required_memory_region m_region_swr;
+ required_memory_region m_region_mos;
+
+ bbc_internal_slot_device *m_slot;
+};
+
+// ======================> bbc_internal_slot_device
+
+class bbc_internal_slot_device : public device_t, public device_single_card_slot_interface<device_bbc_internal_interface>
+{
+public:
+ // construction/destruction
+ template <typename T>
+ bbc_internal_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&slot_options, const char *default_option)
+ : bbc_internal_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_internal_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // inline configuration
+ auto irq_handler() { return m_irq_handler.bind(); }
+ auto nmi_handler() { return m_nmi_handler.bind(); }
+
+ DECLARE_WRITE_LINE_MEMBER(irq_w) { m_irq_handler(state); }
+ DECLARE_WRITE_LINE_MEMBER(nmi_w) { m_nmi_handler(state); }
+
+ virtual bool overrides_ram() { return m_card ? m_card->overrides_ram() : false; }
+ virtual bool overrides_rom() { return m_card ? m_card->overrides_rom() : false; }
+ virtual bool overrides_mos() { return m_card ? m_card->overrides_mos() : false; }
+ virtual uint8_t ram_r(offs_t offset);
+ virtual void ram_w(offs_t offset, uint8_t data);
+ virtual uint8_t romsel_r(offs_t offset);
+ virtual void romsel_w(offs_t offset, uint8_t data);
+ virtual uint8_t paged_r(offs_t offset);
+ virtual void paged_w(offs_t offset, uint8_t data);
+ virtual uint8_t mos_r(offs_t offset);
+ virtual void mos_w(offs_t offset, uint8_t data);
+ virtual void latch_fe60_w(uint8_t data);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ devcb_write_line m_irq_handler;
+ devcb_write_line m_nmi_handler;
+
+ uint8_t m_romsel_fe30;
+ uint8_t m_romsel_fe62;
+
+ device_bbc_internal_interface *m_card;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_INTERNAL_SLOT, bbc_internal_slot_device)
+
+void bbcb_internal_devices(device_slot_interface &device);
+void bbcbp_internal_devices(device_slot_interface &device);
+void bbcm_internal_devices(device_slot_interface &device);
+
+
+#endif // MAME_BUS_BBC_INTERNAL_INTERNAL_H
diff --git a/src/devices/bus/bbc/rom/nvram.cpp b/src/devices/bus/bbc/rom/nvram.cpp
new file mode 100644
index 00000000000..0d24f30c8bd
--- /dev/null
+++ b/src/devices/bus/bbc/rom/nvram.cpp
@@ -0,0 +1,58 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro Sideways RAM (Battery Backup) emulation
+
+***************************************************************************/
+
+#include "emu.h"
+#include "nvram.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_NVRAM, bbc_nvram_device, "bbc_nvram", "BBC Micro Sideways RAM (Battery Backup)")
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_nvram_device - constructor
+//-------------------------------------------------
+
+bbc_nvram_device::bbc_nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_NVRAM, tag, owner, clock)
+ , device_bbc_rom_interface(mconfig, *this)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_nvram_device::device_start()
+{
+ nvram_alloc(0x4000);
+}
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+uint8_t bbc_nvram_device::read(offs_t offset)
+{
+ return get_nvram_base()[offset & (get_nvram_size() - 1)];
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+void bbc_nvram_device::write(offs_t offset, uint8_t data)
+{
+ get_nvram_base()[offset & (get_nvram_size() - 1)] = data;
+}
diff --git a/src/devices/bus/bbc/rom/nvram.h b/src/devices/bus/bbc/rom/nvram.h
new file mode 100644
index 00000000000..d10025c6acd
--- /dev/null
+++ b/src/devices/bus/bbc/rom/nvram.h
@@ -0,0 +1,42 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro Sideways RAM (Battery Backup) emulation
+
+***************************************************************************/
+
+#ifndef MAME_BUS_BBC_ROM_NVRAM_H
+#define MAME_BUS_BBC_ROM_NVRAM_H
+
+#pragma once
+
+#include "slot.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_nvram_device
+
+class bbc_nvram_device : public device_t,
+ public device_bbc_rom_interface
+{
+public:
+ // construction/destruction
+ bbc_nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_NVRAM, bbc_nvram_device)
+
+#endif // MAME_BUS_BBC_ROM_NVRAM_H
diff --git a/src/devices/bus/bbc/rom/ram.cpp b/src/devices/bus/bbc/rom/ram.cpp
index 0d626955812..bbe5d956006 100644
--- a/src/devices/bus/bbc/rom/ram.cpp
+++ b/src/devices/bus/bbc/rom/ram.cpp
@@ -36,6 +36,7 @@ bbc_ram_device::bbc_ram_device(const machine_config &mconfig, const char *tag, d
void bbc_ram_device::device_start()
{
+ ram_alloc(0x8000);
}
//-------------------------------------------------
diff --git a/src/devices/bus/bbc/rom/rom.cpp b/src/devices/bus/bbc/rom/rom.cpp
index f798de11c6a..f419998510b 100644
--- a/src/devices/bus/bbc/rom/rom.cpp
+++ b/src/devices/bus/bbc/rom/rom.cpp
@@ -44,7 +44,5 @@ void bbc_rom_device::device_start()
uint8_t bbc_rom_device::read(offs_t offset)
{
- uint32_t size = std::min((int32_t)get_rom_size(), 0x4000);
-
- return get_rom_base()[offset & (size - 1)];
+ return get_rom_base()[offset & (get_rom_size() - 1)];
}
diff --git a/src/devices/bus/bbc/rom/slot.cpp b/src/devices/bus/bbc/rom/slot.cpp
index 4a284661155..65b80730a18 100644
--- a/src/devices/bus/bbc/rom/slot.cpp
+++ b/src/devices/bus/bbc/rom/slot.cpp
@@ -72,6 +72,7 @@ void device_bbc_rom_interface::ram_alloc(uint32_t size)
void device_bbc_rom_interface::nvram_alloc(uint32_t size)
{
m_nvram.resize(size);
+ device().save_item(NAME(m_nvram));
}
//**************************************************************************
@@ -206,10 +207,10 @@ void bbc_romslot_device::write(offs_t offset, uint8_t data)
#include "rom.h"
#include "ram.h"
+#include "nvram.h"
#include "dfs.h"
#include "genie.h"
#include "pal.h"
-//#include "replay.h"
#include "rtc.h"
@@ -217,6 +218,7 @@ void bbc_rom_devices(device_slot_interface &device)
{
device.option_add_internal("rom", BBC_ROM);
device.option_add_internal("ram", BBC_RAM);
+ device.option_add_internal("nvram", BBC_NVRAM);
device.option_add_internal("cciword", BBC_CCIWORD);
device.option_add_internal("ccibase", BBC_CCIBASE);
device.option_add_internal("ccispell", BBC_CCISPELL);
@@ -228,7 +230,6 @@ void bbc_rom_devices(device_slot_interface &device)
device.option_add_internal("palmo2", BBC_PALMO2);
device.option_add_internal("genie", BBC_PMSGENIE);
device.option_add_internal("mrme00", BBC_MRME00);
- //device.option_add_internal("replay", BBC_REPLAY);
device.option_add_internal("stlrtc", BBC_STLRTC);
device.option_add_internal("pmsrtc", BBC_PMSRTC);
}
diff --git a/src/devices/bus/bbc/rom/slot.h b/src/devices/bus/bbc/rom/slot.h
index 0dfa2980a9e..7f33205327b 100644
--- a/src/devices/bus/bbc/rom/slot.h
+++ b/src/devices/bus/bbc/rom/slot.h
@@ -29,7 +29,7 @@ class bbc_romslot_device : public device_t,
public device_single_card_slot_interface<device_bbc_rom_interface>
{
public:
- // image-level overrides
+ // image-level overrides
virtual image_init_result call_load() override;
virtual void call_unload() override;
virtual const software_list_loader &get_software_list_loader() const override { return rom_software_list_loader::instance(); }
@@ -39,7 +39,7 @@ public:
virtual bool is_writeable() const override { return 0; }
virtual bool is_creatable() const override { return 0; }
virtual bool must_be_loaded() const override { return 0; }
- virtual bool is_reset_on_load() const override { return 1; }
+ virtual bool is_reset_on_load() const override { return 0; }
virtual const char *image_interface() const override { return "bbc_rom"; }
virtual const char *file_extensions() const override { return "rom,bin"; }
@@ -50,6 +50,10 @@ public:
uint8_t read(offs_t offset);
void write(offs_t offset, uint8_t data);
+ void set_fixed_ram(bool fixed) { this->set_fixed(fixed); this->set_user_loadable(!fixed); }
+
+ virtual bool present() { return is_loaded() || loaded_through_softlist() || !user_loadable(); }
+
uint32_t get_rom_size();
uint32_t get_slot_size() const { return m_slot_size; }
diff --git a/src/devices/bus/electron/cart/slot.cpp b/src/devices/bus/electron/cart/slot.cpp
index 5cc48bad238..dfb915db375 100644
--- a/src/devices/bus/electron/cart/slot.cpp
+++ b/src/devices/bus/electron/cart/slot.cpp
@@ -89,8 +89,8 @@ void device_electron_cart_interface::nvram_alloc(uint32_t size)
//-------------------------------------------------
// electron_cartslot_device - constructor
//-------------------------------------------------
-electron_cartslot_device::electron_cartslot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, ELECTRON_CARTSLOT, tag, owner, clock),
+electron_cartslot_device::electron_cartslot_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_image_interface(mconfig, *this),
device_single_card_slot_interface<device_electron_cart_interface>(mconfig, *this),
m_cart(nullptr),
@@ -99,6 +99,11 @@ electron_cartslot_device::electron_cartslot_device(const machine_config &mconfig
{
}
+electron_cartslot_device::electron_cartslot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ electron_cartslot_device(mconfig, ELECTRON_CARTSLOT, tag, owner, clock)
+{
+}
+
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
diff --git a/src/devices/bus/electron/cart/slot.h b/src/devices/bus/electron/cart/slot.h
index e0fc2666136..4cbf3d00ee0 100644
--- a/src/devices/bus/electron/cart/slot.h
+++ b/src/devices/bus/electron/cart/slot.h
@@ -157,6 +157,8 @@ public:
virtual uint8_t read(offs_t offset, int infc, int infd, int romqa, int oe, int oe2);
virtual void write(offs_t offset, uint8_t data, int infc, int infd, int romqa, int oe, int oe2);
+ virtual bool present() { return is_loaded() || loaded_through_softlist(); }
+
DECLARE_WRITE_LINE_MEMBER(irq_w) { m_irq_handler(state); }
DECLARE_WRITE_LINE_MEMBER(nmi_w) { m_nmi_handler(state); }
@@ -164,6 +166,8 @@ protected:
// device-level overrides
virtual void device_start() override;
+ electron_cartslot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
device_electron_cart_interface *m_cart;
private:
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index 9f9f270e524..dfa027a8ff5 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -76,7 +76,7 @@ M = BBC Master
| | | | |
| &5000 | | | |
| LYNNE | | |2 |2
-|3 &6000 |3 | | |
+| &6000 | | | |
| | | | |
| &7000 | | | |
| | | | |
@@ -127,12 +127,11 @@ read:
void bbc_state::bbca_mem(address_map &map)
{
map.unmap_value_high();
- map(0x0000, 0x3fff).bankrw("bank1"); // 0000-3fff Regular RAM
- map(0x4000, 0x7fff).bankrw("bank3"); // 4000-7fff Regular RAM mirrored
+ map(0x0000, 0x7fff).rw(FUNC(bbc_state::bbc_ram_r), FUNC(bbc_state::bbc_ram_w)); // 0000-7fff Regular RAM
map(0x8000, 0xbfff).rw(FUNC(bbc_state::bbc_paged_r), FUNC(bbc_state::bbc_paged_w)); // 8000-bfff Paged ROM/RAM
map(0xc000, 0xffff).rom().region("mos", 0); // c000-fbff OS ROM
map(0xfe00, 0xfeff).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page
- map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
+ map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
map(0xfe01, 0xfe01).mirror(0x06).rw(m_hd6845, FUNC(hd6845s_device::register_r), FUNC(hd6845s_device::register_w));
map(0xfe08, 0xfe0f).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller
map(0xfe10, 0xfe17).w(FUNC(bbc_state::serial_ula_w)); // fe10-fe17 Serial ULA Serial system chip
@@ -145,11 +144,11 @@ void bbc_state::bbca_mem(address_map &map)
void bbc_state::bbc_base(address_map &map)
{
map.unmap_value_high();
- map(0xc000, 0xffff).rom().region("mos", 0); // c000-fbff OS ROM
+ map(0xc000, 0xffff).rw(FUNC(bbc_state::bbc_mos_r), FUNC(bbc_state::bbc_mos_w)); // c000-fbff OS ROM
map(0xfc00, 0xfcff).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::fred_r), FUNC(bbc_1mhzbus_slot_device::fred_w)); // fc00-fcff FRED Address Page
map(0xfd00, 0xfdff).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::jim_r), FUNC(bbc_1mhzbus_slot_device::jim_w)); // fd00-fdff JIM Address Page
map(0xfe00, 0xfeff).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page
- map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
+ map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
map(0xfe01, 0xfe01).mirror(0x06).rw(m_hd6845, FUNC(hd6845s_device::register_r), FUNC(hd6845s_device::register_w));
map(0xfe08, 0xfe0f).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller
map(0xfe10, 0xfe17).w(FUNC(bbc_state::serial_ula_w)); // fe10-fe17 Serial ULA Serial system chip
@@ -166,10 +165,9 @@ void bbc_state::bbc_base(address_map &map)
void bbc_state::bbcb_mem(address_map &map)
{
bbc_base(map);
- map(0x0000, 0x3fff).bankrw("bank1"); // 0000-3fff Regular RAM
- map(0x4000, 0x7fff).bankrw("bank3"); // 4000-7fff Regular RAM
+ map(0x0000, 0x7fff).rw(FUNC(bbc_state::bbc_ram_r), FUNC(bbc_state::bbc_ram_w)); // 0000-7fff Regular RAM
map(0x8000, 0xbfff).rw(FUNC(bbc_state::bbc_paged_r), FUNC(bbc_state::bbc_paged_w)); // 8000-bfff Paged ROM/RAM
- map(0xfe30, 0xfe3f).w(FUNC(bbc_state::bbc_romsel_w)); // W: fe30-fe3f 84LS161 Paged ROM selector
+ map(0xfe30, 0xfe3f).rw(FUNC(bbc_state::bbc_romsel_r), FUNC(bbc_state::bbc_romsel_w)); // W: fe30-fe3f 84LS161 Paged ROM selector
map(0xfe80, 0xfe83).mirror(0x08).m(m_i8271, FUNC(i8271_device::map)); // fe80-fe83 8271 FDC Floppy disc controller
map(0xfe84, 0xfe87).mirror(0x08).rw(m_i8271, FUNC(i8271_device::data_r), FUNC(i8271_device::data_w)); // fe84-fe9f 8271 FDC Floppy disc controller
}
@@ -178,10 +176,9 @@ void bbc_state::bbcb_mem(address_map &map)
void bbc_state::bbcb_nofdc_mem(address_map &map)
{
bbc_base(map);
- map(0x0000, 0x3fff).bankrw("bank1"); // 0000-3fff Regular RAM
- map(0x4000, 0x7fff).bankrw("bank3"); // 4000-7fff Regular RAM
+ map(0x0000, 0x7fff).rw(FUNC(bbc_state::bbc_ram_r), FUNC(bbc_state::bbc_ram_w)); // 0000-7fff Regular RAM
map(0x8000, 0xbfff).rw(FUNC(bbc_state::bbc_paged_r), FUNC(bbc_state::bbc_paged_w)); // 8000-bfff Paged ROM/RAM
- map(0xfe30, 0xfe3f).w(FUNC(bbc_state::bbc_romsel_w)); // W: fe30-fe3f 84LS161 Paged ROM selector
+ map(0xfe30, 0xfe3f).rw(FUNC(bbc_state::bbc_romsel_r), FUNC(bbc_state::bbc_romsel_w)); // W: fe30-fe3f 84LS161 Paged ROM selector
map(0xfe80, 0xfe9f).rw(m_fdc, FUNC(bbc_fdc_slot_device::read), FUNC(bbc_fdc_slot_device::write)); // fe84-fe9f 8271 FDC Floppy disc controller
}
@@ -219,9 +216,9 @@ void bbcm_state::bbcm_mem(address_map &map)
map(0x0000, 0x2fff).bankrw("bank1"); // 0000-2fff Regular RAM
map(0x3000, 0x7fff).bankrw("bank2"); // 3000-7fff Video/Shadow RAM LYNNE
map(0x8000, 0xbfff).rw(FUNC(bbc_state::bbcm_paged_r), FUNC(bbc_state::bbcm_paged_w)); // 8000-8fff Paged ROM/RAM or 4K of RAM ANDY
- map(0xc000, 0xffff).rom().region("mos", 0); // c000-ffff OS ROM
+ map(0xc000, 0xffff).rw(FUNC(bbc_state::bbc_mos_r), FUNC(bbc_state::bbc_mos_w)); // c000-ffff OS ROM
map(0xc000, 0xdfff).rw(FUNC(bbc_state::bbcm_hazel_r), FUNC(bbc_state::bbcm_hazel_w)); // c000-dfff OS ROM or 8K of RAM HAZEL
- map(0xfc00, 0xffff).m(m_bankdev, FUNC(address_map_bank_device::amap8)); // fc00-ffff OS ROM or hardware IO
+ map(0xfc00, 0xfeff).m(m_bankdev, FUNC(address_map_bank_device::amap8)); // fc00-ffff OS ROM or hardware IO
}
@@ -235,11 +232,11 @@ void bbcm_state::bbcm_bankdev(address_map &map)
{
map.unmap_value_high();
/* ACCCON TST bit - normal state */
- map(0x0000, 0x03ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
- map(0x0000, 0x00ff).mirror(0x400).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::fred_r), FUNC(bbc_1mhzbus_slot_device::fred_w)); // fc00-fcff Master FRED Address Page
- map(0x0100, 0x01ff).mirror(0x400).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::jim_r), FUNC(bbc_1mhzbus_slot_device::jim_w)); // fd00-fdff Master JIM Address Page
+ map(0x0000, 0x02ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
+ map(0x0000, 0x00ff).mirror(0x400).rw(FUNC(bbc_state::bbc_fred_r), FUNC(bbc_state::bbc_fred_w)); // fc00-fcff Master FRED Address Page
+ map(0x0100, 0x01ff).mirror(0x400).rw(FUNC(bbc_state::bbc_jim_r), FUNC(bbc_state::bbc_jim_w)); // fd00-fdff Master JIM Address Page
map(0x0200, 0x02ff).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page
- map(0x0200, 0x0200).mirror(0x406).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
+ map(0x0200, 0x0200).mirror(0x406).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
map(0x0201, 0x0201).mirror(0x406).rw(m_hd6845, FUNC(hd6845s_device::register_r), FUNC(hd6845s_device::register_w));
map(0x0208, 0x020f).mirror(0x400).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller
map(0x0210, 0x0217).mirror(0x400).w(FUNC(bbc_state::serial_ula_w)); // fe10-fe17 Serial ULA Serial system chip
@@ -257,7 +254,7 @@ void bbcm_state::bbcm_bankdev(address_map &map)
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 */
- map(0x0400, 0x07ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
+ map(0x0400, 0x06ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
}
@@ -265,11 +262,11 @@ void bbcm_state::bbcmet_bankdev(address_map &map)
{
map.unmap_value_high();
/* ACCCON TST bit - normal state */
- map(0x0000, 0x03ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
+ map(0x0000, 0x02ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
map(0x0000, 0x00ff).mirror(0x400).unmaprw(); // fc00-fcff FRED Address Page
map(0x0100, 0x01ff).mirror(0x400).unmaprw(); // fd00-fdff JIM Address Page
map(0x0200, 0x02ff).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page
- map(0x0200, 0x0200).mirror(0x406).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
+ map(0x0200, 0x0200).mirror(0x406).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
map(0x0201, 0x0201).mirror(0x406).rw(m_hd6845, FUNC(hd6845s_device::register_r), FUNC(hd6845s_device::register_w));
map(0x0208, 0x020f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe08-fe0f 6850 ACIA Serial controller
map(0x0210, 0x0217).mirror(0x400).w(FUNC(bbc_state::serial_ula_w)); // fe10-fe17 Serial ULA Serial system chip
@@ -287,7 +284,18 @@ void bbcm_state::bbcmet_bankdev(address_map &map)
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 */
- map(0x0400, 0x07ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
+ map(0x0400, 0x06ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
+}
+
+
+void bbcm_state::bbcmc_mem(address_map &map)
+{
+ map(0x0000, 0x2fff).bankrw("bank1"); // 0000-2fff Regular RAM
+ map(0x3000, 0x7fff).bankrw("bank2"); // 3000-7fff Video/Shadow RAM LYNNE
+ map(0x8000, 0xbfff).rw(FUNC(bbc_state::bbcmc_paged_r), FUNC(bbc_state::bbcmc_paged_w)); // 8000-8fff Paged ROM/RAM or 4K of RAM ANDY
+ map(0xc000, 0xffff).rw(FUNC(bbc_state::bbc_mos_r), FUNC(bbc_state::bbc_mos_w)); // c000-ffff OS ROM
+ map(0xc000, 0xdfff).rw(FUNC(bbc_state::bbcm_hazel_r), FUNC(bbc_state::bbcm_hazel_w)); // c000-dfff OS ROM or 8K of RAM HAZEL
+ map(0xfc00, 0xfeff).m(m_bankdev, FUNC(address_map_bank_device::amap8)); // fc00-ffff OS ROM or hardware IO
}
@@ -295,11 +303,11 @@ void bbcm_state::bbcmc_bankdev(address_map &map)
{
map.unmap_value_high();
/* ACCCON TST bit - normal state */
- map(0x0000, 0x03ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
+ map(0x0000, 0x02ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
map(0x0000, 0x00ff).mirror(0x400).rw(m_exp, FUNC(bbc_exp_slot_device::fred_r), FUNC(bbc_exp_slot_device::fred_w)); // fc00-fcff Compact FRED Address Page
map(0x0100, 0x01ff).mirror(0x400).rw(m_exp, FUNC(bbc_exp_slot_device::jim_r), FUNC(bbc_exp_slot_device::jim_w)); // fd00-fdff Compact JIM Address Page
map(0x0200, 0x02ff).mirror(0x400).rw(m_exp, FUNC(bbc_exp_slot_device::sheila_r), FUNC(bbc_exp_slot_device::sheila_w)); // fd00-fdff Compact SHEILA Address Page
- map(0x0200, 0x0200).mirror(0x406).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
+ map(0x0200, 0x0200).mirror(0x406).rw(m_hd6845, FUNC(hd6845s_device::status_r), FUNC(hd6845s_device::address_w)); // fe00-fe07 6845 CRTC Video controller
map(0x0201, 0x0201).mirror(0x406).rw(m_hd6845, FUNC(hd6845s_device::register_r), FUNC(hd6845s_device::register_w));
map(0x0208, 0x020f).mirror(0x400).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller
map(0x0210, 0x0217).mirror(0x400).w(FUNC(bbc_state::serial_ula_w)); // fe10-fe17 Serial ULA Serial system chip
@@ -316,7 +324,7 @@ void bbcm_state::bbcmc_bankdev(address_map &map)
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).r(FUNC(bbc_state::bbc_fe_r)); // fee0-feff Tube ULA Tube system interface
/* ACCCON TST bit - hardware test */
- map(0x0400, 0x07ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
+ map(0x0400, 0x06ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued)
}
@@ -337,6 +345,7 @@ INPUT_CHANGED_MEMBER(bbc_state::trigger_reset)
if (m_tube) m_tube->reset();
if (m_intube) m_intube->reset();
if (m_extube) m_extube->reset();
+ if (m_internal) m_internal->reset();
}
}
@@ -456,6 +465,17 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_START("COL12")
PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ /* Keyboard columns 13 -> 14 are reserved for Torch */
+ PORT_START("COL13")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("COL14")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ /* Keyboard column 15 not known to be used */
+ PORT_START("COL15")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
@@ -723,11 +743,6 @@ static INPUT_PORTS_START(bbcb_config)
PORT_CONFNAME( 0x04, 0x00, "Econet fitted")
PORT_CONFSETTING( 0x00, DEF_STR( No ))
PORT_CONFSETTING( 0x04, DEF_STR( Yes ))
- PORT_CONFNAME( 0x38, 0x00, "Sideways RAM Board")
- PORT_CONFSETTING( 0x00, DEF_STR( None ) )
- //PORT_CONFSETTING( 0x08, "Solidisk 128K (fe62)" )
- PORT_CONFSETTING( 0x10, "Acorn 64K (fe30)" )
- PORT_CONFSETTING( 0x20, "Acorn 128K (fe30)" )
INPUT_PORTS_END
static INPUT_PORTS_START(bbca)
@@ -907,10 +922,10 @@ void bbc_state::bbca(machine_config &config)
m_via6522_0->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
/* eprom sockets */
- BBC_ROMSLOT16(config, m_rom[0x0c], bbc_rom_devices, nullptr); /* ic101 */
- BBC_ROMSLOT16(config, m_rom[0x0d], bbc_rom_devices, nullptr); /* ic100 */
- BBC_ROMSLOT16(config, m_rom[0x0e], bbc_rom_devices, nullptr); /* ic88 */
- BBC_ROMSLOT16(config, m_rom[0x0f], bbc_rom_devices, nullptr); /* ic52 */
+ BBC_ROMSLOT16(config, m_rom[0], bbc_rom_devices, nullptr); /* ic101 */
+ BBC_ROMSLOT16(config, m_rom[1], bbc_rom_devices, nullptr); /* ic100 */
+ BBC_ROMSLOT16(config, m_rom[2], bbc_rom_devices, nullptr); /* ic88 */
+ BBC_ROMSLOT16(config, m_rom[3], bbc_rom_devices, nullptr); /* ic52 */
/* software lists */
SOFTWARE_LIST(config, "cass_ls_a").set_original("bbca_cass");
@@ -942,6 +957,7 @@ void bbc_state::bbcb(machine_config &config)
m_via6522_1->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w));
m_via6522_1->readpb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_r));
m_via6522_1->writepb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_w));
+ m_via6522_1->writepb_handler().append(m_internal, FUNC(bbc_internal_slot_device::latch_fe60_w));
m_via6522_1->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe));
m_via6522_1->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<2>));
@@ -992,9 +1008,9 @@ void bbc_state::bbcb(machine_config &config)
m_userport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2));
/* internal expansion boards */
- //BBC_INTERNAL_SLOT(config, m_internal, bbc_internal_devices, nullptr);
- //m_internal->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<5>));
- //m_internal->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
+ BBC_INTERNAL_SLOT(config, m_internal, 16_MHz_XTAL, bbcb_internal_devices, nullptr);
+ m_internal->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<5>));
+ m_internal->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
/* software lists */
SOFTWARE_LIST(config, "cass_ls_b").set_original("bbcb_cass");
@@ -1055,7 +1071,7 @@ void bbc_state::bbcb_us(machine_config &config)
****************************************************************************/
-void bbc_state::torchf(machine_config &config)
+void torch_state::torchf(machine_config &config)
{
bbcb(config);
/* basic machine hardware */
@@ -1077,25 +1093,23 @@ void bbc_state::torchf(machine_config &config)
}
-void bbc_state::torchh10(machine_config &config)
+void torch_state::torchh10(machine_config &config)
{
torchf(config);
/* fdc */
m_i8271->subdevice<floppy_connector>("1")->set_default_option(nullptr);
/* 10MB HDD */
-
}
-void bbc_state::torchh21(machine_config &config)
+void torch_state::torchh21(machine_config &config)
{
torchf(config);
/* fdc */
m_i8271->subdevice<floppy_connector>("1")->set_default_option(nullptr);
/* 21MB HDD */
-
}
@@ -1126,16 +1140,23 @@ void bbcbp_state::bbcbp(machine_config &config)
FLOPPY_CONNECTOR(config, "wd1770:0", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true);
+ /* remove sockets not present in B+ */
+ config.device_remove("romslot0");
+ config.device_remove("romslot1");
+ config.device_remove("romslot2");
+ config.device_remove("romslot3");
+
/* eprom sockets */
- BBC_ROMSLOT32(config, m_rom[0x02], bbc_rom_devices, nullptr); /* ic35 */
- BBC_ROMSLOT32(config, m_rom[0x04], bbc_rom_devices, nullptr); /* ic44 */
- BBC_ROMSLOT32(config, m_rom[0x06], bbc_rom_devices, nullptr); /* ic57 */
- BBC_ROMSLOT32(config, m_rom[0x08], bbc_rom_devices, nullptr); /* ic62 */
- BBC_ROMSLOT32(config, m_rom[0x0a], bbc_rom_devices, nullptr); /* ic68 */
- config.device_remove("romslot12");
- config.device_remove("romslot13");
- config.device_remove("romslot14");
- config.device_remove("romslot15");
+ BBC_ROMSLOT32(config, m_rom[0x02], bbc_rom_devices, nullptr); /* ic35 32K socket */
+ BBC_ROMSLOT32(config, m_rom[0x04], bbc_rom_devices, nullptr); /* ic44 32K socket */
+ BBC_ROMSLOT32(config, m_rom[0x06], bbc_rom_devices, nullptr); /* ic57 32K socket */
+ BBC_ROMSLOT32(config, m_rom[0x08], bbc_rom_devices, nullptr); /* ic62 32K socket */
+ BBC_ROMSLOT32(config, m_rom[0x0a], bbc_rom_devices, nullptr); /* ic68 32K socket */
+
+ /* internal expansion boards */
+ BBC_INTERNAL_SLOT(config.replace(), m_internal, 16_MHz_XTAL, bbcbp_internal_devices, nullptr);
+ m_internal->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<5>));
+ m_internal->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
/* software lists */
subdevice<software_list_device>("rom_ls")->set_filter("B+");
@@ -1148,6 +1169,10 @@ void bbcbp_state::bbcbp128(machine_config &config)
/* internal ram */
m_ram->set_default_size("128K");
+
+ /* sideways RAM banks */
+ BBC_ROMSLOT32(config, m_rom[0x00], bbc_rom_devices, "ram").set_fixed_ram(true);
+ BBC_ROMSLOT32(config, m_rom[0x0c], bbc_rom_devices, "ram").set_fixed_ram(true);
}
@@ -1460,15 +1485,22 @@ void bbcm_state::bbcm(machine_config &config)
m_userport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2));
/* cartridge slots */
- GENERIC_CARTSLOT(config, m_cart[0], generic_linear_slot, "bbcm_cart", "bin,rom");
- m_cart[0]->set_device_load(FUNC(bbc_state::cart1_load));
- GENERIC_CARTSLOT(config, m_cart[1], generic_linear_slot, "bbcm_cart", "bin,rom");
- m_cart[1]->set_device_load(FUNC(bbc_state::cart2_load));
+ BBCM_CARTSLOT(config, m_cart[0], 16_MHz_XTAL, bbcm_cart, nullptr);
+ m_cart[0]->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<6>));
+ m_cart[0]->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
+ BBCM_CARTSLOT(config, m_cart[1], 16_MHz_XTAL, bbcm_cart, nullptr);
+ m_cart[1]->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<7>));
+ m_cart[1]->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
/* eprom sockets */
BBC_ROMSLOT16(config, m_rom[0x08], bbc_rom_devices, nullptr); /* ic27 */
- BBC_ROMSLOT32(config, m_rom[0x04], bbc_rom_devices, nullptr); /* ic41 */
- BBC_ROMSLOT32(config, m_rom[0x06], bbc_rom_devices, nullptr); /* ic37 */
+ BBC_ROMSLOT32(config, m_rom[0x04], bbc_rom_devices, "ram").set_fixed_ram(true); /* ic41 32K socket */
+ BBC_ROMSLOT32(config, m_rom[0x06], bbc_rom_devices, "ram").set_fixed_ram(true); /* ic37 32K socket */
+
+ /* internal expansion boards */
+ BBC_INTERNAL_SLOT(config, m_internal, 16_MHz_XTAL, bbcm_internal_devices, nullptr);
+ 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));
/* software lists */
SOFTWARE_LIST(config, "cass_ls_m").set_original("bbcm_cass");
@@ -1611,14 +1643,23 @@ void bbcm_state::cfa3000(machine_config &config)
m_wd1770->subdevice<floppy_connector>("0")->set_default_option(nullptr);
m_wd1770->subdevice<floppy_connector>("1")->set_default_option(nullptr);
+ /* lk18 and lk19 are set to enable rom, disabling ram */
+ m_rom[0x04]->set_default_option(nullptr);
+ m_rom[0x04]->set_fixed_ram(false);
+ m_rom[0x06]->set_default_option(nullptr);
+ m_rom[0x06]->set_fixed_ram(false);
+
/* keyboard */
m_userport->set_default_option("cfa3000kbd");
+ m_userport->set_fixed(true);
/* option board */
m_1mhzbus->set_default_option("cfa3000opt");
+ m_1mhzbus->set_fixed(true);
/* analogue dials/sensors */
m_analog->set_default_option("cfa3000a");
+ m_analog->set_fixed(true);
/* software lists */
config.device_remove("cass_ls_m");
@@ -1641,6 +1682,7 @@ void bbcm_state::bbcmc(machine_config &config)
{
bbcm(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbcm_state::bbcmc_mem);
m_bankdev->set_map(&bbcm_state::bbcmc_bankdev).set_options(ENDIANNESS_LITTLE, 8, 16, 0x0400);
/* cassette */
@@ -1670,8 +1712,6 @@ void bbcm_state::bbcmc(machine_config &config)
config.device_remove("cartslot2");
/* eprom sockets */
- config.device_remove("romslot4");
- config.device_remove("romslot6");
config.device_remove("romslot8");
BBC_ROMSLOT16(config, m_rom[0x03], bbc_rom_devices, nullptr); /* ic17 */
BBC_ROMSLOT16(config, m_rom[0x02], bbc_rom_devices, nullptr); /* ic23 */
@@ -1701,6 +1741,7 @@ void bbcm_state::bbcmc(machine_config &config)
config.device_remove("intube");
config.device_remove("extube");
config.device_remove("userport");
+ config.device_remove("internal");
}
@@ -1725,27 +1766,27 @@ void bbcm_state::autoc15(machine_config &config)
ROM_START(bbca)
ROM_REGION(0x44000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
- /* rom page 12 30000 IC52 SPARE SOCKET */
- /* rom page 13 34000 IC88 SPARE SOCKET */
- /* rom page 14 38000 IC100 SPARE SOCKET */
- /* rom page 15 3c000 IC101 BASIC */
+ /* rom page 0 00000 IC52 SPARE SOCKET */
+ /* rom page 1 04000 IC88 SPARE SOCKET */
+ /* rom page 2 08000 IC100 SPARE SOCKET */
+ /* rom page 3 0c000 IC101 BASIC */
ROM_DEFAULT_BIOS("os12")
ROM_SYSTEM_BIOS( 0, "os12", "OS 1.20" )
ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(0))
- ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0))
+ ROMX_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0))
ROM_SYSTEM_BIOS( 1, "os10", "OS 1.00" )
ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(1))
- ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1))
+ ROMX_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1))
ROM_SYSTEM_BIOS( 2, "os09", "OS 0.92")
ROMX_LOAD("os092.rom", 0x40000, 0x4000, CRC(59ef7eb8) SHA1(dca33995c0d008a527efe923d03333394b01022c), ROM_BIOS(2))
- ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(2))
+ ROMX_LOAD("basic1.rom", 0x0c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(2))
ROM_SYSTEM_BIOS( 3, "os01", "OS 0.10" )
ROMX_LOAD("os01.rom", 0x40000, 0x4000, CRC(45ee0980) SHA1(4b0ece6dc139d5d3f4fabd023716fb6f25149b80), ROM_BIOS(3))
/* OS0.1 does not support rom paging, load BASIC into all pages */
- ROMX_LOAD("basic1.rom", 0x30000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(3))
- ROM_RELOAD( 0x34000, 0x4000 )
- ROM_RELOAD( 0x38000, 0x4000 )
- ROM_RELOAD( 0x3c000, 0x4000 )
+ ROMX_LOAD("basic1.rom", 0x00000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(3))
+ ROM_RELOAD( 0x04000, 0x4000 )
+ ROM_RELOAD( 0x08000, 0x4000 )
+ ROM_RELOAD( 0x0c000, 0x4000 )
ROM_REGION(0x4000, "mos", 0)
ROM_COPY("swr", 0x40000, 0, 0x4000)
@@ -1754,20 +1795,20 @@ ROM_END
ROM_START(bbcb)
ROM_REGION(0x44000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
- /* rom page 12 30000 IC52 DFS */
- /* rom page 13 34000 IC88 SPARE SOCKET */
- /* rom page 14 38000 IC100 SPARE SOCKET */
- /* rom page 15 3c000 IC101 BASIC */
+ /* rom page 0 00000 IC52 DFS */
+ /* rom page 1 04000 IC88 SPARE SOCKET */
+ /* rom page 2 08000 IC100 SPARE SOCKET */
+ /* rom page 3 0c000 IC101 BASIC */
ROM_DEFAULT_BIOS("os12")
ROM_SYSTEM_BIOS( 0, "os12", "OS 1.20" )
ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(0))
- ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0))
+ ROMX_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0))
ROM_SYSTEM_BIOS( 1, "os10", "OS 1.00" )
ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(1))
- ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1))
+ ROMX_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1))
ROM_SYSTEM_BIOS( 2, "os09", "OS 0.92")
ROMX_LOAD("os092.rom", 0x40000, 0x4000, CRC(59ef7eb8) SHA1(dca33995c0d008a527efe923d03333394b01022c), ROM_BIOS(2))
- ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(2))
+ ROMX_LOAD("basic1.rom", 0x0c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(2))
ROM_SYSTEM_BIOS( 3, "os01", "OS 0.10" )
ROMX_LOAD("os01.rom", 0x40000, 0x4000, CRC(45ee0980) SHA1(4b0ece6dc139d5d3f4fabd023716fb6f25149b80), ROM_BIOS(3))
/* OS0.1 does not support rom paging, load BASIC into all pages */
@@ -1776,7 +1817,8 @@ ROM_START(bbcb)
ROM_RELOAD( 0x08000, 0x4000 )
ROM_RELOAD( 0x0c000, 0x4000 )
- ROM_LOAD("dnfs120-201666.rom", 0x30000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232))
+ /* appropriate DFS will be inserted by fdc device */
+ //ROM_LOAD("dnfs120-201666.rom", 0x00000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232))
ROM_REGION(0x4000, "mos", 0)
ROM_COPY("swr", 0x40000, 0, 0x4000)
@@ -1787,17 +1829,16 @@ ROM_END
ROM_START(bbcb_de)
- ROM_REGION(0x44000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
- /* rom page 12 30000 IC72 DFS */
- /* rom page 13 34000 IC73 SPARE SOCKET */
- /* rom page 14 38000 IC74 SPARE SOCKET */
- /* rom page 15 3c000 IC75 BASIC */
- ROM_LOAD("os_de.rom", 0x40000, 0x4000, CRC(b7262caf) SHA1(aadf90338ee9d1c85dfa73beba50e930c2a38f10))
- ROM_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281))
- ROM_LOAD("dfs10.rom", 0x30000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0))
+ ROM_REGION(0x40000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
+ /* rom page 0 00000 IC72 DFS */
+ /* rom page 1 04000 IC73 SPARE SOCKET */
+ /* rom page 2 08000 IC74 SPARE SOCKET */
+ /* rom page 3 0c000 IC75 BASIC */
+ ROM_LOAD("basic2.rom", 0xc000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281))
+ ROM_LOAD("dfs10.rom", 0x0000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0))
ROM_REGION(0x4000, "mos", 0)
- ROM_COPY("swr", 0x40000, 0, 0x4000)
+ ROM_LOAD("os_de.rom", 0x0000, 0x4000, CRC(b7262caf) SHA1(aadf90338ee9d1c85dfa73beba50e930c2a38f10))
ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6))
@@ -1805,18 +1846,17 @@ ROM_END
ROM_START(bbcb_us)
- ROM_REGION(0x44000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
- /* rom page 12 30000 IC72 VIEW2.1 */
- /* rom page 13 34000 IC73 US DNFS */
- /* rom page 14 38000 IC74 US BASIC */
- /* rom page 15 3c000 IC75 SPARE SOCKET */
- ROM_LOAD("usmos10.rom", 0x40000, 0x4000, CRC(c8e946a9) SHA1(83d91d089dca092d2c8b7c3650ff8143c9069b89))
- ROM_LOAD("usbasic3.rom", 0x38000, 0x4000, CRC(161b9539) SHA1(b39014610a968789afd7695aa04d1277d874405c))
- ROM_LOAD("viewa210.rom", 0x30000, 0x4000, CRC(4345359f) SHA1(88c93df1854f5fbe6cd6e5f0e29a8bf4ea3b5614))
- ROM_LOAD("usdnfs10.rom", 0x34000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0))
+ ROM_REGION(0x40000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
+ /* rom page 0 00000 IC72 VIEW2.1 */
+ /* rom page 1 04000 IC73 US DNFS */
+ /* rom page 2 08000 IC74 US BASIC */
+ /* rom page 3 0c000 IC75 SPARE SOCKET */
+ ROM_LOAD("usbasic3.rom", 0x8000, 0x4000, CRC(161b9539) SHA1(b39014610a968789afd7695aa04d1277d874405c))
+ ROM_LOAD("viewa210.rom", 0x0000, 0x4000, CRC(4345359f) SHA1(88c93df1854f5fbe6cd6e5f0e29a8bf4ea3b5614))
+ ROM_LOAD("usdnfs10.rom", 0x4000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0))
ROM_REGION(0x4000, "mos", 0)
- ROM_COPY("swr", 0x40000, 0, 0x4000)
+ ROM_LOAD("usmos10.rom", 0x0000, 0x4000, CRC(c8e946a9) SHA1(83d91d089dca092d2c8b7c3650ff8143c9069b89))
ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phrom_us.bin", 0x0000, 0x4000, CRC(bf4b3b64) SHA1(66876702d1d95eecc034d20f25047f893a27cde5))
@@ -1824,17 +1864,16 @@ ROM_END
ROM_START(torchf)
- ROM_REGION(0x44000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
- /* rom page 12 30000 IC52 BASIC */
- /* rom page 13 34000 IC88 DNFS */
- /* rom page 14 38000 IC100 CPN (inserted by device) */
- /* rom page 15 3c000 IC101 SPARE SOCKET */
- ROM_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d))
- ROM_LOAD("basic2.rom", 0x30000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281))
- ROM_LOAD("dnfs120-201666.rom", 0x34000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232))
+ ROM_REGION(0x40000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
+ /* rom page 0 00000 IC52 BASIC */
+ /* rom page 1 04000 IC88 DNFS */
+ /* rom page 2 08000 IC100 CPN (inserted by device) */
+ /* rom page 3 0c000 IC101 SPARE SOCKET */
+ ROM_LOAD("basic2.rom", 0x0000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281))
+ ROM_LOAD("dnfs120-201666.rom", 0x4000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232))
ROM_REGION(0x4000, "mos", 0)
- ROM_COPY("swr", 0x40000, 0, 0x4000)
+ ROM_LOAD("os12.rom", 0x0000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d))
ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phrom_us.bin", 0x0000, 0x4000, CRC(bf4b3b64) SHA1(66876702d1d95eecc034d20f25047f893a27cde5))
@@ -2161,7 +2200,7 @@ ROM_START(bbcmc)
ROM_REGION(0x44000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
ROM_DEFAULT_BIOS("mos510")
ROM_SYSTEM_BIOS( 0, "mos510", "Enhanced MOS 5.10" )
- ROMX_LOAD("mos510.ic49", 0x30000, 0x10000, BAD_DUMP CRC(9a2a6086) SHA1(094ab37b0b6437c4f1653eaa0602ef102737adb6), ROM_BIOS(0)) // Merged individual ROM bank dumps
+ ROMX_LOAD("mos510.ic49", 0x30000, 0x10000, CRC(9a2a6086) SHA1(094ab37b0b6437c4f1653eaa0602ef102737adb6), ROM_BIOS(0))
ROM_SYSTEM_BIOS( 1, "mos500", "Original MOS 5.00" )
ROMX_LOAD("mos500.ic49", 0x30000, 0x10000, CRC(f6170023) SHA1(140d002d2d9cd34b47197a2ba823505af2a84633), ROM_BIOS(1))
ROM_COPY("swr", 0x30000, 0x40000, 0x4000) // Move loaded roms into place
@@ -2192,7 +2231,7 @@ ROM_START(bbcmc_ar)
ROM_REGION(0x44000, "swr", ROMREGION_ERASEFF) /* Sideways ROMs */
ROM_DEFAULT_BIOS("mos511i")
ROM_SYSTEM_BIOS( 0, "mos511i", "International MOS 5.11i" )
- ROMX_LOAD("mos511.ic49", 0x30000, 0x10000, BAD_DUMP CRC(8708803c) SHA1(d2170c8b9b536f3ad84a4a603a7fe712500cc751), ROM_BIOS(0)) // Merged individual ROM bank dumps
+ ROMX_LOAD("mos511.ic49", 0x30000, 0x10000, CRC(8708803c) SHA1(d2170c8b9b536f3ad84a4a603a7fe712500cc751), ROM_BIOS(0))
ROM_COPY("swr", 0x30000, 0x40000, 0x4000) // Move loaded roms into place
ROM_FILL(0x30000, 0x4000, 0xff)
/* 00000 rom 0 IC38 or EXTERNAL */
@@ -2388,33 +2427,33 @@ ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, init_bbc, "Acorn", "BBC Micro Model B", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, init_bbc, "Acorn", "BBC Micro Model A", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, init_bbc, "Acorn Computers", "BBC Micro Model B", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, init_bbc, "Acorn Computers", "BBC Micro Model A", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1982, torchf, bbcb, 0, torchf, torch, torch_state, init_bbc, "Torch Computers", "Torch CF240", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1982, torchh10, bbcb, 0, torchh10, torch, torch_state, init_bbc, "Torch Computers", "Torch CH240/10", MACHINE_NOT_WORKING)
COMP ( 1982, torchh21, bbcb, 0, torchh21, torch, torch_state, init_bbc, "Torch Computers", "Torch CH240/21", MACHINE_NOT_WORKING)
-COMP ( 1982, bbcb_de, bbcb, 0, bbcb_de, bbcb, bbc_state, init_bbc, "Acorn", "BBC Micro Model B (German)", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1983, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, init_bbc, "Acorn", "BBC Micro Model B (US)", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcbp, bbcbp_state, init_bbc, "Acorn", "BBC Micro Model B+ 64K", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1985, bbcbp128, bbcbp, 0, bbcbp128, bbcbp, bbcbp_state, init_bbc, "Acorn", "BBC Micro Model B+ 128K", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1985, abc110, bbcbp, 0, abc110, abc, bbcbp_state, init_bbc, "Acorn", "ABC 110", MACHINE_NOT_WORKING)
-COMP ( 1985, acw443, bbcbp, 0, acw443, abc, bbcbp_state, init_bbc, "Acorn", "ABC 210/Cambridge Workstation", MACHINE_NOT_WORKING)
-COMP ( 1985, abc310, bbcbp, 0, abc310, abc, bbcbp_state, init_bbc, "Acorn", "ABC 310", MACHINE_NOT_WORKING)
+COMP ( 1982, bbcb_de, bbcb, 0, bbcb_de, bbcb, bbc_state, init_bbc, "Acorn Computers", "BBC Micro Model B (German)", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1983, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, init_bbc, "Acorn Computers", "BBC Micro Model B (US)", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcbp, bbcbp_state, init_bbc, "Acorn Computers", "BBC Micro Model B+ 64K", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1985, bbcbp128, bbcbp, 0, bbcbp128, bbcbp, bbcbp_state, init_bbc, "Acorn Computers", "BBC Micro Model B+ 128K", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1985, abc110, bbcbp, 0, abc110, abc, bbcbp_state, init_bbc, "Acorn Computers", "ABC 110", MACHINE_NOT_WORKING)
+COMP ( 1985, acw443, bbcbp, 0, acw443, abc, bbcbp_state, init_bbc, "Acorn Computers", "ABC 210/Cambridge Workstation", MACHINE_NOT_WORKING)
+COMP ( 1985, abc310, bbcbp, 0, abc310, abc, bbcbp_state, init_bbc, "Acorn Computers", "ABC 310", MACHINE_NOT_WORKING)
COMP ( 1985, ltmpbp, bbcbp, 0, bbcbp, ltmpbp, bbcbp_state, init_ltmp, "Lawrie T&M Ltd.", "LTM Portable (B+)", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1985, reutapm, bbcbp, 0, reutapm, bbcb, bbcbp_state, init_bbc, "Acorn", "Reuters APM", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING)
-COMP ( 1986, econx25, bbcbp, 0, econx25, bbcbp, bbcbp_state, init_bbc, "Acorn", "Econet X25 Gateway", MACHINE_NOT_WORKING)
-COMP ( 1986, bbcm, 0, bbcb, bbcm, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master 128", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master Turbo", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1986, bbcmaiv, bbcm, 0, bbcmaiv, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master AIV", MACHINE_NOT_WORKING)
-COMP ( 1986, bbcmet, bbcm, 0, bbcmet, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master ET", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1986, bbcm512, bbcm, 0, bbcm512, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master 512", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1986, bbcmarm, bbcm, 0, bbcmarm, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master (ARM Evaluation)", MACHINE_NOT_WORKING)
+COMP ( 1985, reutapm, bbcbp, 0, reutapm, bbcb, bbcbp_state, init_bbc, "Acorn Computers", "Reuters APM", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING)
+COMP ( 1986, econx25, bbcbp, 0, econx25, bbcbp, bbcbp_state, init_bbc, "Acorn Computers", "Econet X25 Gateway", MACHINE_NOT_WORKING)
+COMP ( 1986, bbcm, 0, bbcb, bbcm, bbcm, bbcm_state, init_bbc, "Acorn Computers", "BBC Master 128", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbcm_state, init_bbc, "Acorn Computers", "BBC Master Turbo", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1986, bbcmaiv, bbcm, 0, bbcmaiv, bbcm, bbcm_state, init_bbc, "Acorn Computers", "BBC Master AIV", MACHINE_NOT_WORKING)
+COMP ( 1986, bbcmet, bbcm, 0, bbcmet, bbcm, bbcm_state, init_bbc, "Acorn Computers", "BBC Master ET", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1986, bbcm512, bbcm, 0, bbcm512, bbcm, bbcm_state, init_bbc, "Acorn Computers", "BBC Master 512", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1986, bbcmarm, bbcm, 0, bbcmarm, bbcm, bbcm_state, init_bbc, "Acorn Computers", "BBC Master (ARM Evaluation)", MACHINE_NOT_WORKING)
COMP ( 1986, ltmpm, bbcm, 0, bbcm, ltmpm, bbcm_state, init_ltmp, "Lawrie T&M Ltd.", "LTM Portable (Master)", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1986, bbcmc, 0, bbcm, bbcmc, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master Compact", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1986, bbcmc_ar, bbcmc, 0, bbcmc, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master Compact (Arabic)", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1987, pro128s, bbcmc, 0, pro128s, bbcm, bbcm_state, init_bbcm, "Olivetti", "Prodest PC 128S", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1988, autoc15, bbcmc, 0, autoc15, bbcm, bbcm_state, init_bbcm, "Autocue", "Autocue 1500", MACHINE_NOT_WORKING)
-COMP ( 1988, discmon, bbcm, 0, discmon, bbcm, bbcm_state, init_bbcm, "Arbiter Leisure", "Arbiter Discmonitor A-01", MACHINE_NOT_WORKING)
-COMP ( 1988, discmate, bbcm, 0, discmate, bbcm, bbcm_state, init_bbcm, "Arbiter Leisure", "Arbiter Discmate A-02", MACHINE_NOT_WORKING)
+COMP ( 1986, bbcmc, 0, bbcm, bbcmc, bbcm, bbcm_state, init_bbc, "Acorn Computers", "BBC Master Compact", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1986, bbcmc_ar, bbcmc, 0, bbcmc, bbcm, bbcm_state, init_bbc, "Acorn Computers", "BBC Master Compact (Arabic)", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1987, pro128s, bbcmc, 0, pro128s, bbcm, bbcm_state, init_bbc, "Olivetti", "Prodest PC 128S", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1988, autoc15, bbcmc, 0, autoc15, bbcm, bbcm_state, init_bbc, "Autocue Ltd.", "Autocue 1500", MACHINE_NOT_WORKING)
+COMP ( 1988, discmon, bbcm, 0, discmon, bbcm, bbcm_state, init_bbc, "Arbiter Leisure", "Arbiter Discmonitor A-01", MACHINE_NOT_WORKING)
+COMP ( 1988, discmate, bbcm, 0, discmate, bbcm, bbcm_state, init_bbc, "Arbiter Leisure", "Arbiter Discmate A-02", MACHINE_NOT_WORKING)
//COMP ( 1988, discmast, bbcm, 0, discmast, bbcm, bbcm_state, init_bbc, "Arbiter Leisure", "Arbiter Discmaster A-03", MACHINE_NOT_WORKING)
COMP ( 1989, cfa3000, bbcm, 0, cfa3000, bbcm, bbcm_state, init_cfa, "Tinsley Medical Instruments", "Henson CFA 3000", MACHINE_NOT_WORKING)
diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h
index 519a60cc59f..8989474c3b2 100644
--- a/src/mame/includes/bbc.h
+++ b/src/mame/includes/bbc.h
@@ -42,14 +42,12 @@
#include "bus/bbc/fdc/fdc.h"
#include "bus/bbc/analogue/analogue.h"
#include "bus/bbc/1mhzbus/1mhzbus.h"
-//#include "bus/bbc/internal/internal.h"
+#include "bus/bbc/internal/internal.h"
#include "bus/bbc/tube/tube.h"
#include "bus/bbc/userport/userport.h"
#include "bus/bbc/exp/exp.h"
#include "bus/bbc/joyport/joyport.h"
-
-#include "bus/generic/slot.h"
-#include "bus/generic/carts.h"
+#include "bus/bbc/cart/slot.h"
#include "emupal.h"
#include "screen.h"
@@ -87,7 +85,7 @@ public:
, m_extube(*this, "extube")
, m_1mhzbus(*this, "1mhzbus")
, m_userport(*this, "userport")
-// , m_internal(*this, "internal")
+ , m_internal(*this, "internal")
, m_exp(*this, "exp")
, m_rtc(*this, "rtc")
, m_i2cmem(*this, "i2cmem")
@@ -101,7 +99,6 @@ public:
, m_region_swr(*this, "swr")
, m_bank1(*this, "bank1")
, m_bank2(*this, "bank2")
- , m_bank3(*this, "bank3")
, m_bankdev(*this, "bankdev")
, m_bbcconfig(*this, "BBCCONFIG")
{ }
@@ -116,9 +113,18 @@ public:
DECLARE_FLOPPY_FORMATS(floppy_formats);
+ DECLARE_READ8_MEMBER(bbc_ram_r);
+ DECLARE_WRITE8_MEMBER(bbc_ram_w);
+ DECLARE_READ8_MEMBER(bbc_romsel_r);
DECLARE_WRITE8_MEMBER(bbc_romsel_w);
DECLARE_READ8_MEMBER(bbc_paged_r);
DECLARE_WRITE8_MEMBER(bbc_paged_w);
+ DECLARE_READ8_MEMBER(bbc_mos_r);
+ DECLARE_WRITE8_MEMBER(bbc_mos_w);
+ DECLARE_READ8_MEMBER(bbc_fred_r);
+ DECLARE_WRITE8_MEMBER(bbc_fred_w);
+ DECLARE_READ8_MEMBER(bbc_jim_r);
+ DECLARE_WRITE8_MEMBER(bbc_jim_w);
DECLARE_READ8_MEMBER(bbcbp_fetch_r);
DECLARE_WRITE8_MEMBER(bbcbp_romsel_w);
DECLARE_READ8_MEMBER(bbcbp_paged_r);
@@ -133,6 +139,8 @@ public:
DECLARE_WRITE8_MEMBER(bbcm_hazel_w);
DECLARE_READ8_MEMBER(bbcm_tube_r);
DECLARE_WRITE8_MEMBER(bbcm_tube_w);
+ DECLARE_READ8_MEMBER(bbcmc_paged_r);
+ DECLARE_WRITE8_MEMBER(bbcmc_paged_w);
DECLARE_WRITE8_MEMBER(bbcbp_drive_control_w);
DECLARE_WRITE8_MEMBER(bbcm_drive_control_w);
DECLARE_WRITE8_MEMBER(bbcmc_drive_control_w);
@@ -187,19 +195,12 @@ public:
void insert_device_rom(memory_region *rom);
void setup_device_roms();
- image_init_result load_cart(device_image_interface &image, generic_slot_device *slot);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart1_load) { return load_cart(image, m_cart[0]); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart2_load) { return load_cart(image, m_cart[1]); }
-
MC6845_UPDATE_ROW(crtc_update_row);
void bbca(machine_config &config);
void bbcb(machine_config &config);
void bbcb_de(machine_config &config);
void bbcb_us(machine_config &config);
- void torchf(machine_config &config);
- void torchh21(machine_config &config);
- void torchh10(machine_config &config);
void bbca_mem(address_map &map);
void bbc_base(address_map &map);
@@ -207,7 +208,6 @@ public:
void bbcb_nofdc_mem(address_map &map);
void init_bbc();
- void init_bbcm();
void init_ltmp();
void init_cfa();
@@ -219,14 +219,14 @@ protected:
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
- required_device<hd6845s_device> m_hd6845;
+ required_device<mc6845_device> m_hd6845;
required_device<screen_device> m_screen;
required_device<input_merger_device> m_irqs;
required_device<palette_device> m_palette;
optional_device<mc6854_device> m_adlc;
optional_device<sn76489a_device> m_sn;
optional_device<samples_device> m_samples;
- required_ioport_array<13> m_keyboard;
+ required_ioport_array<16> m_keyboard;
optional_device<saa5050_device> m_trom;
optional_device<tms5220_device> m_tms;
optional_device<cassette_image_device> m_cassette;
@@ -244,7 +244,7 @@ protected:
optional_device<bbc_tube_slot_device> m_extube;
optional_device<bbc_1mhzbus_slot_device> m_1mhzbus;
optional_device<bbc_userport_slot_device> m_userport;
- //optional_device<bbc_internal_slot_device> m_internal;
+ optional_device<bbc_internal_slot_device> m_internal;
optional_device<bbc_exp_slot_device> m_exp;
optional_device<mc146818_device> m_rtc;
optional_device<i2cmem_device> m_i2cmem;
@@ -253,23 +253,19 @@ protected:
optional_device<wd1770_device> m_wd1770;
optional_device<wd1772_device> m_wd1772;
optional_device_array<bbc_romslot_device, 16> m_rom;
- optional_device_array<generic_slot_device, 2> m_cart;
+ optional_device_array<bbc_cartslot_device, 2> m_cart;
required_memory_region m_region_mos;
required_memory_region m_region_swr;
- required_memory_bank m_bank1; // bbca bbcb bbcbp bbcbp128 bbcm
+ optional_memory_bank m_bank1; // bbcbp bbcbp128 bbcm
optional_memory_bank m_bank2; // bbcbp bbcbp128 bbcm
- optional_memory_bank m_bank3; // bbca bbcb
optional_device<address_map_bank_device> m_bankdev; // bbcm
optional_ioport m_bbcconfig;
int m_monitortype; // monitor type (colour, green, amber)
- int m_swramtype; // this stores the setting for the SWRAM type being used
- int m_swrbank; // This is the latch that holds the sideways ROM bank to read
+ int m_romsel; // This is the latch that holds the sideways ROM bank to read
int m_paged_ram; // BBC B+ memory handling
int m_vdusel; // BBC B+ memory handling
- bool m_lk18_ic41_paged_rom; // BBC Master Paged ROM/RAM select IC41
- bool m_lk19_ic37_paged_rom; // BBC Master Paged ROM/RAM select IC37
/*
ACCCON
@@ -380,6 +376,7 @@ protected:
void setvideoshadow(int vdusel);
void set_pixel_lookup();
+ uint8_t bus_video_data();
int bbc_keyboard(int data);
void mc6850_receive_clock(int new_clock);
@@ -397,6 +394,10 @@ class torch_state : public bbc_state
public:
using bbc_state::bbc_state;
static constexpr feature_type imperfect_features() { return feature::KEYBOARD; }
+
+ void torchf(machine_config &config);
+ void torchh21(machine_config &config);
+ void torchh10(machine_config &config);
};
@@ -448,6 +449,7 @@ protected:
void bbcm_mem(address_map &map);
void bbcm_bankdev(address_map &map);
void bbcmet_bankdev(address_map &map);
+ void bbcmc_mem(address_map &map);
void bbcmc_bankdev(address_map &map);
void bbcm_fetch(address_map &map);
};
diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp
index c15e57f60b0..00a0e3051e1 100644
--- a/src/mame/machine/bbc.cpp
+++ b/src/mame/machine/bbc.cpp
@@ -31,32 +31,58 @@ TIMER_CALLBACK_MEMBER(bbc_state::reset_timer_cb)
BBC Model B memory handling functions
****************************************/
-WRITE8_MEMBER(bbc_state::bbc_romsel_w)
+READ8_MEMBER(bbc_state::bbc_ram_r)
{
- if (m_swramtype == 0)
- {
- /* no sideways expansion board fitted so address only the 4 on board ROM sockets */
- m_swrbank = (data & 0x03) | 0x0c;
- }
+ if (m_internal && m_internal->overrides_ram())
+ return m_internal->ram_r(offset);
else
- {
- /* expansion board fitted so address all 16 ROM sockets */
- m_swrbank = data & 0x0f;
- }
+ return m_ram->pointer()[offset & m_ram->mask()];
+}
+
+WRITE8_MEMBER(bbc_state::bbc_ram_w)
+{
+ if (m_internal && m_internal->overrides_ram())
+ m_internal->ram_w(offset, data);
+ else
+ m_ram->pointer()[offset & m_ram->mask()] = data;
+}
+
+READ8_MEMBER(bbc_state::bbc_romsel_r)
+{
+ if (m_internal && m_internal->overrides_rom())
+ return m_internal->romsel_r(offset);
+ else
+ return 0xfe;
+}
+
+WRITE8_MEMBER(bbc_state::bbc_romsel_w)
+{
+ /* no sideways expansion board fitted so address only the 4 on board ROM sockets */
+ m_romsel = data & 0x03;
+
+ /* pass romsel to internal expansion board */
+ if (m_internal && m_internal->overrides_rom())
+ m_internal->romsel_w(offset, data);
}
READ8_MEMBER(bbc_state::bbc_paged_r)
{
uint8_t data;
- std::string region_tag;
- if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
+ if (m_internal && m_internal->overrides_rom())
{
- data = m_rom[m_swrbank]->read(offset);
+ data = m_internal->paged_r(offset);
}
else
{
- data = m_region_swr->base()[offset + (m_swrbank << 14)];
+ if (m_rom[m_romsel] && m_rom[m_romsel]->present())
+ {
+ data = m_rom[m_romsel]->read(offset);
+ }
+ else
+ {
+ data = m_region_swr->base()[offset + (m_romsel << 14)];
+ }
}
return data;
@@ -64,25 +90,81 @@ READ8_MEMBER(bbc_state::bbc_paged_r)
WRITE8_MEMBER(bbc_state::bbc_paged_w)
{
- static const unsigned short swramtype[4][16] = {
- // TODO: move sideways ROM/RAM boards to slot devices
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, // 0: none
- { 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 }, // 1: 128K (bank 8 to 15) Solidisk sideways ram userport bank latch (not implemented)
- { 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0 }, // 2: 64K (banks 4 to 7) for Acorn sideways ram FE30 bank latch
- { 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 }, // 3: 128K (banks 8 to 15) for Acorn sideways ram FE30 bank latch
- };
- std::string region_tag;
-
- if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
+ if (m_internal && m_internal->overrides_rom())
{
- m_rom[m_swrbank]->write(offset, data);
+ m_internal->paged_w(offset, data);
}
- else if (swramtype[m_swramtype][m_swrbank])
+ else
{
- m_region_swr->base()[offset + (m_swrbank << 14)] = data;
+ if (m_rom[m_romsel])
+ {
+ m_rom[m_romsel]->write(offset, data);
+ }
}
}
+READ8_MEMBER(bbc_state::bbc_mos_r)
+{
+ if (m_internal && m_internal->overrides_mos())
+ return m_internal->mos_r(offset);
+ else
+ return m_region_mos->base()[offset];
+}
+
+WRITE8_MEMBER(bbc_state::bbc_mos_w)
+{
+ if (m_internal && m_internal->overrides_mos())
+ m_internal->mos_w(offset, data);
+}
+
+READ8_MEMBER(bbc_state::bbc_fred_r)
+{
+ uint8_t data = 0xff;
+
+ data &= m_1mhzbus->fred_r(offset);
+
+ if (m_cart[0])
+ data &= m_cart[0]->read(offset, 1, 0, m_romsel & 0x01, 0, 0);
+ if (m_cart[1])
+ data &= m_cart[1]->read(offset, 1, 0, m_romsel & 0x01, 0, 0);
+
+ return data;
+}
+
+WRITE8_MEMBER(bbc_state::bbc_fred_w)
+{
+ m_1mhzbus->fred_w(offset, data);
+
+ if (m_cart[0])
+ m_cart[0]->write(offset, data, 1, 0, m_romsel & 0x01, 0, 0);
+ if (m_cart[1])
+ m_cart[1]->write(offset, data, 1, 0, m_romsel & 0x01, 0, 0);
+}
+
+READ8_MEMBER(bbc_state::bbc_jim_r)
+{
+ uint8_t data = 0xff;
+
+ data &= m_1mhzbus->jim_r(offset);
+
+ if(m_cart[0])
+ data &= m_cart[0]->read(offset, 0, 1, m_romsel & 0x01, 0, 0);
+ if (m_cart[1])
+ data &= m_cart[1]->read(offset, 0, 1, m_romsel & 0x01, 0, 0);
+
+ return data;
+}
+
+WRITE8_MEMBER(bbc_state::bbc_jim_w)
+{
+ m_1mhzbus->jim_w(offset, data);
+
+ if (m_cart[0])
+ m_cart[0]->write(offset, data, 0, 1, m_romsel & 0x01, 0, 0);
+ if (m_cart[1])
+ m_cart[1]->write(offset, data, 0, 1, m_romsel & 0x01, 0, 0);
+}
+
/****************************************
BBC Model B+ memory handling functions
@@ -132,7 +214,7 @@ WRITE8_MEMBER(bbc_state::bbcbp_romsel_w)
case 0x00:
m_paged_ram = BIT(data, 7);
- m_swrbank = data & 0x0f;
+ m_romsel = data & 0x0f;
break;
case 0x04:
@@ -141,6 +223,10 @@ WRITE8_MEMBER(bbc_state::bbcbp_romsel_w)
setvideoshadow(m_vdusel);
break;
}
+
+ /* pass romsel to internal expansion board */
+ if (m_internal && m_internal->overrides_rom())
+ m_internal->romsel_w(offset, data);
}
READ8_MEMBER(bbc_state::bbcbp_paged_r)
@@ -154,13 +240,21 @@ READ8_MEMBER(bbc_state::bbcbp_paged_r)
}
else
{
- if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
+ if (m_internal && m_internal->overrides_rom())
{
- data = m_rom[m_swrbank]->read(offset);
+ data = m_internal->paged_r(offset);
}
else
{
- data = m_region_swr->base()[offset + (m_swrbank << 14)];
+ /* 32K sockets */
+ if (m_rom[m_romsel & 0x0e] && m_rom[m_romsel & 0x0e]->present())
+ {
+ data = m_rom[m_romsel & 0x0e]->read(offset | (m_romsel & 0x01) << 14);
+ }
+ else
+ {
+ data = m_region_swr->base()[offset + (m_romsel << 14)];
+ }
}
}
@@ -169,23 +263,23 @@ READ8_MEMBER(bbc_state::bbcbp_paged_r)
WRITE8_MEMBER(bbc_state::bbcbp_paged_w)
{
- /* the BBC Model B+ 128K has extra RAM mapped in replacing the ROM banks 0,1,c and d. */
- static const unsigned short swram_banks[16] = { 1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0 };
- std::string region_tag;
-
if (m_paged_ram && offset < 0x3000)
{
m_ram->pointer()[offset + 0x8000] = data;
}
else
{
- if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
+ if (m_internal && m_internal->overrides_rom())
{
- m_rom[m_swrbank]->write(offset, data);
+ m_internal->paged_w(offset, data);
}
- else if (m_ram->size() == 128 * 1024 && swram_banks[m_swrbank])
+ else
{
- m_region_swr->base()[offset + (m_swrbank << 14)] = data;
+ /* 32K sockets */
+ if (m_rom[m_romsel & 0x0e])
+ {
+ m_rom[m_romsel & 0x0e]->write(offset | (m_romsel & 0x01) << 14, data);
+ }
}
}
}
@@ -280,14 +374,17 @@ WRITE8_MEMBER(bbc_state::bbcm_acccon_w)
WRITE8_MEMBER(bbc_state::bbcm_romsel_w)
{
- m_paged_ram = (data & 0x80) >> 7;
- m_swrbank = data & 0x0f;
+ m_paged_ram = BIT(data, 7);
+ m_romsel = data & 0x0f;
+
+ /* pass romsel to internal expansion board */
+ if (m_internal && m_internal->overrides_rom())
+ m_internal->romsel_w(offset, data);
}
READ8_MEMBER(bbc_state::bbcm_paged_r)
{
- uint8_t data;
- std::string region_tag;
+ uint8_t data = 0xff;
if (m_paged_ram && offset < 0x1000)
{
@@ -295,36 +392,198 @@ READ8_MEMBER(bbc_state::bbcm_paged_r)
}
else
{
- if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
+ switch (m_romsel)
{
- data = m_rom[m_swrbank]->read(offset);
+ case 0: case 1:
+ if (m_cart[0] && m_cart[0]->present())
+ {
+ data = m_cart[0]->read(offset, 0, 0, m_romsel & 0x01, 1, 0);
+ }
+ else
+ {
+ data = bus_video_data();
+ }
+ break;
+ case 2: case 3:
+ if (m_cart[1] && m_cart[1]->present())
+ {
+ data = m_cart[1]->read(offset, 0, 0, m_romsel & 0x01, 1, 0);
+ }
+ else
+ {
+ data = bus_video_data();
+ }
+ break;
+ default:
+ if (m_internal && m_internal->overrides_rom())
+ {
+ data = m_internal->paged_r(offset);
+ }
+ else
+ {
+ switch (m_romsel)
+ {
+ case 4: case 5: case 6: case 7:
+ /* 32K sockets */
+ if (m_rom[m_romsel & 0x0e] && m_rom[m_romsel & 0x0e]->present())
+ {
+ data = m_rom[m_romsel & 0x0e]->read(offset | (m_romsel & 0x01) << 14);
+ }
+ else
+ {
+ data = m_region_swr->base()[offset + (m_romsel << 14)];
+ }
+ break;
+ default:
+ /* 16K sockets */
+ if (m_rom[m_romsel] && m_rom[m_romsel]->present())
+ {
+ data = m_rom[m_romsel]->read(offset);
+ }
+ else
+ {
+ data = m_region_swr->base()[offset + (m_romsel << 14)];
+ }
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ return data;
+}
+
+WRITE8_MEMBER(bbc_state::bbcm_paged_w)
+{
+ if (m_paged_ram && offset < 0x1000)
+ {
+ m_ram->pointer()[offset + 0x8000] = data;
+ }
+ else
+ {
+ switch (m_romsel)
+ {
+ case 0: case 1:
+ if (m_cart[0])
+ {
+ m_cart[0]->write(offset, data, 0, 0, m_romsel & 0x01, 1, 0);
+ }
+ break;
+ case 2: case 3:
+ if (m_cart[1])
+ {
+ m_cart[1]->write(offset, data, 0, 0, m_romsel & 0x01, 1, 0);
+ }
+ break;
+ default:
+ if (m_internal && m_internal->overrides_rom())
+ {
+ m_internal->paged_w(offset, data);
+ }
+ else
+ {
+ switch (m_romsel)
+ {
+ case 4: case 5: case 6: case 7:
+ /* 32K sockets */
+ if (m_rom[m_romsel & 0x0e])
+ {
+ m_rom[m_romsel & 0x0e]->write(offset | (m_romsel & 0x01) << 14, data);
+ }
+ break;
+ default:
+ /* 16K sockets */
+ if (m_rom[m_romsel])
+ {
+ m_rom[m_romsel]->write(offset, data);
+ }
+ break;
+ }
+ }
+ break;
+ }
+ }
+}
+
+READ8_MEMBER(bbc_state::bbcmc_paged_r)
+{
+ uint8_t data = 0xff;
+
+ if (m_paged_ram && offset < 0x1000)
+ {
+ data = m_ram->pointer()[offset + 0x8000];
+ }
+ else
+ {
+ if (m_internal && m_internal->overrides_rom())
+ {
+ data = m_internal->paged_r(offset);
}
else
{
- data = m_region_swr->base()[offset + (m_swrbank << 14)];
+ switch (m_romsel)
+ {
+ case 0: case 1: case 4: case 5: case 6: case 7:
+ /* 32K sockets */
+ if (m_rom[m_romsel & 0x0e] && m_rom[m_romsel & 0x0e]->present())
+ {
+ data = m_rom[m_romsel & 0x0e]->read(offset | (m_romsel & 0x01) << 14);
+ }
+ else
+ {
+ data = m_region_swr->base()[offset + (m_romsel << 14)];
+ }
+ break;
+ default:
+ /* 16K sockets */
+ if (m_rom[m_romsel] && m_rom[m_romsel]->present())
+ {
+ data = m_rom[m_romsel]->read(offset);
+ }
+ else
+ {
+ data = m_region_swr->base()[offset + (m_romsel << 14)];
+ }
+ break;
+ }
}
}
return data;
}
-WRITE8_MEMBER(bbc_state::bbcm_paged_w)
+WRITE8_MEMBER(bbc_state::bbcmc_paged_w)
{
- std::string region_tag;
-
if (m_paged_ram && offset < 0x1000)
{
m_ram->pointer()[offset + 0x8000] = data;
}
else
{
- if (m_rom[m_swrbank] && memregion(region_tag.assign(m_rom[m_swrbank]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
+ if (m_internal && m_internal->overrides_rom())
{
- m_rom[m_swrbank]->write(offset, data);
+ m_internal->paged_w(offset, data);
}
- else if ((!m_lk19_ic37_paged_rom && (m_swrbank == 4 || m_swrbank == 5)) || (!m_lk18_ic41_paged_rom && (m_swrbank == 6 || m_swrbank == 7)))
+ else
{
- m_region_swr->base()[offset + (m_swrbank << 14)] = data;
+ switch (m_romsel)
+ {
+ case 0: case 1: case 4: case 5: case 6: case 7:
+ /* 32K sockets */
+ if (m_rom[m_romsel & 0x0e])
+ {
+ m_rom[m_romsel & 0x0e]->write(offset | (m_romsel & 0x01) << 14, data);
+ }
+ break;
+ default:
+ /* 16K sockets */
+ if (m_rom[m_romsel])
+ {
+ m_rom[m_romsel]->write(offset, data);
+ }
+ break;
+ }
}
}
}
@@ -339,7 +598,10 @@ READ8_MEMBER(bbc_state::bbcm_hazel_r)
}
else
{
- data = m_region_mos->base()[offset];
+ if (m_internal && m_internal->overrides_mos())
+ data = m_internal->mos_r(offset);
+ else
+ data = m_region_mos->base()[offset];
}
return data;
@@ -500,19 +762,12 @@ INTERRUPT_GEN_MEMBER(bbc_state::bbcb_keyscan)
/* keyboard not enabled so increment counter */
m_column = (m_column + 1) % 16;
- if (m_column < 13)
+ /* KBD IC4 8 input NAND gate */
+ /* set the value of via_system ca2, by checking for any keys
+ being pressed on the selected m_column */
+ if ((m_keyboard[m_column]->read() | 0x01) != 0xff)
{
- /* KBD IC4 8 input NAND gate */
- /* set the value of via_system ca2, by checking for any keys
- being pressed on the selected m_column */
- if ((m_keyboard[m_column]->read() | 0x01) != 0xff)
- {
- m_via6522_0->write_ca2(1);
- }
- else
- {
- m_via6522_0->write_ca2(0);
- }
+ m_via6522_0->write_ca2(1);
}
else
{
@@ -533,14 +788,7 @@ int bbc_state::bbc_keyboard(int data)
bit = 0;
- if (m_column < 13)
- {
- res = m_keyboard[m_column]->read();
- }
- else
- {
- res = 0xff;
- }
+ res = m_keyboard[m_column]->read();
/* Normal keyboard result */
if ((res & (1<<row)) == 0)
@@ -1175,45 +1423,6 @@ WRITE8_MEMBER(bbc_state::bbcmc_drive_control_w)
m_wd1772->mr_w(BIT(data, 2));
}
-/**************************************
- BBC cartslot loading functions
-***************************************/
-
-image_init_result bbc_state::load_cart(device_image_interface &image, generic_slot_device *slot)
-{
- if (!image.loaded_through_softlist())
- {
- uint32_t filesize = image.length();
-
- if (filesize > 0x8000)
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Cartridge socket accepts 16K/32K only");
- return image_init_result::FAIL;
- }
-
- slot->rom_alloc(filesize, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
- image.fread(slot->get_rom_base(), filesize);
- return image_init_result::PASS;
- }
- else
- {
- uint32_t size_lo = image.get_software_region_length("lorom");
- uint32_t size_hi = image.get_software_region_length("uprom");
-
- if (size_lo + size_hi > 0x8000)
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
- return image_init_result::FAIL;
- }
-
- slot->rom_alloc(0x8000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
- memcpy(slot->get_rom_base() + 0x0000, image.get_software_region("lorom"), size_lo);
- memcpy(slot->get_rom_base() + 0x4000, image.get_software_region("uprom"), size_hi);
- }
-
- return image_init_result::PASS;
-}
-
/**************************************
Machine Initialisation functions
@@ -1235,7 +1444,6 @@ void bbc_state::init_bbc()
m_via6522_0->write_cb2(1);
m_monitortype = monitor_type_t::COLOUR;
- m_swramtype = 0;
}
void bbc_state::init_ltmp()
@@ -1246,42 +1454,10 @@ void bbc_state::init_ltmp()
m_monitortype = monitor_type_t::GREEN;
}
-void bbc_state::init_bbcm()
-{
- std::string region_tag;
-
- init_bbc();
-
- /* set links if ROM present, disabling RAM */
- if (m_rom[4] && memregion(region_tag.assign(m_rom[4]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
- {
- /* link for ROM in slots 4 and 5 */
- m_lk19_ic37_paged_rom = true;
- }
- else
- {
- m_lk18_ic41_paged_rom = false;
- }
- if (m_rom[6] && memregion(region_tag.assign(m_rom[6]->tag()).append(BBC_ROM_REGION_TAG).c_str()))
- {
- /* link for ROM in slots 6 and 7 */
- m_lk18_ic41_paged_rom = true;
- }
- else
- {
- m_lk18_ic41_paged_rom = false;
- }
-}
-
void bbc_state::init_cfa()
{
init_bbc();
- /* link for ROM in slots 4 and 5 */
- m_lk19_ic37_paged_rom = true;
- /* link for ROM in slots 6 and 7 */
- m_lk18_ic41_paged_rom = true;
-
m_monitortype = monitor_type_t::GREEN;
}
@@ -1365,12 +1541,18 @@ void bbc_state::setup_device_roms()
device_t* exp_device;
device_t* ext_device;
- /* insert ROM for FDC devices (BBC Model B only), always place into romslot 12 */
+ /* insert ROM(s) for internal expansion boards */
+ if (m_internal && (exp_device = dynamic_cast<device_t*>(m_internal->get_card_device())))
+ {
+ insert_device_rom(exp_device->memregion("exp_rom"));
+ }
+
+ /* insert ROM for FDC devices (BBC Model B only), always place into romslot 0 */
if (m_fdc && (exp_device = dynamic_cast<device_t*>(m_fdc->get_card_device())))
{
if (exp_device->memregion("dfs_rom"))
{
- memcpy(m_region_swr->base() + 0x30000, exp_device->memregion("dfs_rom")->base(), exp_device->memregion("dfs_rom")->bytes());
+ memcpy(m_region_swr->base(), exp_device->memregion("dfs_rom")->base(), exp_device->memregion("dfs_rom")->bytes());
}
}
@@ -1389,7 +1571,7 @@ void bbc_state::setup_device_roms()
/* configure cartslots */
for (int i = 0; i < 2; i++)
{
- if (m_cart[i] && (rom_region = memregion(region_tag.assign(m_cart[i]->tag()).append(GENERIC_ROM_REGION_TAG).c_str())))
+ if (m_cart[i] && (rom_region = memregion(region_tag.assign(m_cart[i]->tag()).append(ELECTRON_CART_ROM_REGION_TAG).c_str())))
{
memcpy(m_region_swr->base() + (i * 0x8000), rom_region->base(), rom_region->bytes());
}
@@ -1494,21 +1676,6 @@ void bbc_state::machine_start()
void bbc_state::machine_reset()
{
- m_swramtype = (m_bbcconfig.read_safe(0) & 0x38) >> 3;
- /* bank 1 regular lower RAM from 0000 to 3fff */
- m_bank1->set_base(m_ram->pointer());
- /* bank 3 regular higher RAM from 4000 to 7fff */
- if (m_ram->size() == 16 * 1024)
- {
- /* 16K just repeat the lower 16K*/
- m_bank3->set_base(m_ram->pointer());
- }
- else
- {
- /* 32K */
- m_bank3->set_base(m_ram->pointer() + 0x4000);
- }
-
/* install econet hardware */
if (m_bbcconfig.read_safe(0) & 0x04)
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xfea0, 0xfebf, read8sm_delegate(*m_adlc, FUNC(mc6854_device::read)), write8sm_delegate(*m_adlc, FUNC(mc6854_device::write)));
diff --git a/src/mame/video/bbc.cpp b/src/mame/video/bbc.cpp
index a8416517010..24d8d0f5a4b 100644
--- a/src/mame/video/bbc.cpp
+++ b/src/mame/video/bbc.cpp
@@ -150,7 +150,7 @@ WRITE8_MEMBER(bbc_state::video_ula_w)
else
m_screen->update_partial(vpos - 1);
- logerror("setting videoULA %.4x to:%.4x at :%d \n", data, offset, vpos);
+ //logerror("setting videoULA %.4x to:%.4x at :%d \n", data, offset, vpos);
switch (offset & 0x01)
{
@@ -280,6 +280,14 @@ WRITE_LINE_MEMBER(bbc_state::bbc_de_changed)
m_teletext_latch &= ~0x80;
}
+uint8_t bbc_state::bus_video_data()
+{
+ int hpos = m_screen->hpos();
+ int vpos = m_screen->vpos();
+
+ return m_video_ram[calculate_video_address(hpos, vpos)];
+}
+
/**** BBC B+/Master Shadow Ram change ****/
void bbc_state::setvideoshadow(int vdusel)