From 9f5f84272ecec6486a998cff6e46fdad9b73ae61 Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Tue, 5 Nov 2019 21:11:05 +0000 Subject: 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. --- scripts/src/bus.lua | 28 ++ scripts/target/mame/mess.lua | 2 + src/devices/bus/bbc/cart/slot.cpp | 71 +++++ src/devices/bus/bbc/cart/slot.h | 161 ++++++++++ src/devices/bus/bbc/internal/internal.cpp | 168 ++++++++++ src/devices/bus/bbc/internal/internal.h | 113 +++++++ src/devices/bus/bbc/rom/nvram.cpp | 58 ++++ src/devices/bus/bbc/rom/nvram.h | 42 +++ src/devices/bus/bbc/rom/ram.cpp | 1 + src/devices/bus/bbc/rom/rom.cpp | 4 +- src/devices/bus/bbc/rom/slot.cpp | 5 +- src/devices/bus/bbc/rom/slot.h | 8 +- src/devices/bus/electron/cart/slot.cpp | 9 +- src/devices/bus/electron/cart/slot.h | 4 + src/mame/drivers/bbc.cpp | 301 ++++++++++-------- src/mame/includes/bbc.h | 50 +-- src/mame/machine/bbc.cpp | 495 ++++++++++++++++++++---------- src/mame/video/bbc.cpp | 10 +- 18 files changed, 1201 insertions(+), 329 deletions(-) create mode 100644 src/devices/bus/bbc/cart/slot.cpp create mode 100644 src/devices/bus/bbc/cart/slot.h create mode 100644 src/devices/bus/bbc/internal/internal.cpp create mode 100644 src/devices/bus/bbc/internal/internal.h create mode 100644 src/devices/bus/bbc/rom/nvram.cpp create mode 100644 src/devices/bus/bbc/rom/nvram.h 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 @@ -358,6 +358,32 @@ if (BUSES["BBC_ANALOGUE"]~=null) then 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(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 + 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(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(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 m_maincpu; + required_device m_mb_ram; + optional_device_array 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 +{ +public: + // construction/destruction + template + 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 { 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(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("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("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("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("0")->set_default_option(nullptr); m_wd1770->subdevice("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 m_maincpu; required_device m_ram; - required_device m_hd6845; + required_device m_hd6845; required_device m_screen; required_device m_irqs; required_device m_palette; optional_device m_adlc; optional_device m_sn; optional_device m_samples; - required_ioport_array<13> m_keyboard; + required_ioport_array<16> m_keyboard; optional_device m_trom; optional_device m_tms; optional_device m_cassette; @@ -244,7 +244,7 @@ protected: optional_device m_extube; optional_device m_1mhzbus; optional_device m_userport; - //optional_device m_internal; + optional_device m_internal; optional_device m_exp; optional_device m_rtc; optional_device m_i2cmem; @@ -253,23 +253,19 @@ protected: optional_device m_wd1770; optional_device m_wd1772; optional_device_array m_rom; - optional_device_array m_cart; + optional_device_array 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 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<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(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(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) -- cgit v1.2.3