From 382e6fea50d2c6a84875354fc85290879bbf822b Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Mon, 19 Oct 2020 19:35:05 +0100 Subject: [PATCH] bus/bbc/rom: Added support for the Gemini DataGem ROM carrier board. --- scripts/src/bus.lua | 2 + src/devices/bus/bbc/rom/datagem.cpp | 96 +++++++++++++++++++++++++++++ src/devices/bus/bbc/rom/datagem.h | 48 +++++++++++++++ src/devices/bus/bbc/rom/slot.cpp | 4 ++ src/devices/bus/bbc/rom/slot.h | 3 + 5 files changed, 153 insertions(+) create mode 100644 src/devices/bus/bbc/rom/datagem.cpp create mode 100644 src/devices/bus/bbc/rom/datagem.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index eb1784a9c67..00b37942b3d 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -543,6 +543,8 @@ if (BUSES["BBC_ROM"]~=null) then 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/datagem.cpp", + MAME_DIR .. "src/devices/bus/bbc/rom/datagem.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/src/devices/bus/bbc/rom/datagem.cpp b/src/devices/bus/bbc/rom/datagem.cpp new file mode 100644 index 00000000000..11f2cfdb631 --- /dev/null +++ b/src/devices/bus/bbc/rom/datagem.cpp @@ -0,0 +1,96 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/*************************************************************************** + + Gemini DataGem ROM Carrier + +***************************************************************************/ + +#include "emu.h" +#include "datagem.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(BBC_DATAGEM, bbc_datagem_device, "bbc_datagem", "Gemini DataGem ROM Carrier") + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bbc_datagem_device - constructor +//------------------------------------------------- + +bbc_datagem_device::bbc_datagem_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, BBC_DATAGEM, tag, owner, clock) + , device_bbc_rom_interface(mconfig, *this) + , m_bank(0) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bbc_datagem_device::device_start() +{ + /* register for save states */ + save_item(NAME(m_bank)); +} + +//------------------------------------------------- +// decrypt_rom +//------------------------------------------------- + +void bbc_datagem_device::decrypt_rom() +{ + uint8_t *rom = get_rom_base(); + + for (int i = 0x0000; i < 0x6000; i++) + { + /* decrypt 16K and 8K ROM data lines */ + switch (rom[i] & 0x07) + { + case 0x01: case 0x06: rom[i] = bitswap<8>(rom[i], 7, 6, 5, 4, 3, 0, 1, 2); break; + case 0x02: case 0x05: rom[i] = bitswap<8>(rom[i], 7, 6, 5, 4, 3, 2, 0, 1); break; + case 0x03: case 0x04: rom[i] = bitswap<8>(rom[i], 7, 6, 5, 4, 3, 1, 2, 0); break; + } + + /* decrypt additional 8K ROM data lines */ + if (i & 0x4000) + { + rom[i] = bitswap<8>(rom[i], 3, 6, 5, 4, 7, 2, 1, 0); + } + } +} + +//------------------------------------------------- +// read +//------------------------------------------------- + +uint8_t bbc_datagem_device::read(offs_t offset) +{ + if (!machine().side_effects_disabled()) + { + /* switching zones for DataGem */ + switch (offset & 0x3fff) + { + case 0x1ffe: m_bank = 1; break; + case 0x1fff: m_bank = 0; break; + } + } + + if (offset & 0x2000) + { + return get_rom_base()[(offset & 0x3fff) + (m_bank << 13)]; + } + else + { + return get_rom_base()[offset & 0x3fff]; + } +} diff --git a/src/devices/bus/bbc/rom/datagem.h b/src/devices/bus/bbc/rom/datagem.h new file mode 100644 index 00000000000..0d78f754e44 --- /dev/null +++ b/src/devices/bus/bbc/rom/datagem.h @@ -0,0 +1,48 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/*************************************************************************** + + Gemini DataGem ROM Carrier + +***************************************************************************/ + +#ifndef MAME_BUS_BBC_ROM_DATAGEM_H +#define MAME_BUS_BBC_ROM_DATAGEM_H + +#pragma once + +#include "slot.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> bbc_datagem_device + +class bbc_datagem_device : public device_t, + public device_bbc_rom_interface +{ +public: + // construction/destruction + bbc_datagem_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 uint32_t get_rom_size() override { return 0x4000; } + virtual uint8_t read(offs_t offset) override; + virtual void decrypt_rom() override; + +private: + uint8_t m_bank; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(BBC_DATAGEM, bbc_datagem_device) + + +#endif // MAME_BUS_BBC_ROM_DATAGEM_H diff --git a/src/devices/bus/bbc/rom/slot.cpp b/src/devices/bus/bbc/rom/slot.cpp index 9434a186e81..8a315e12234 100644 --- a/src/devices/bus/bbc/rom/slot.cpp +++ b/src/devices/bus/bbc/rom/slot.cpp @@ -133,6 +133,8 @@ image_init_result bbc_romslot_device::call_load() else memcpy(m_cart->get_rom_base(), get_software_region("rom"), size); + m_cart->decrypt_rom(); + if (get_software_region("ram")) m_cart->ram_alloc(get_software_region_length("ram")); @@ -208,6 +210,7 @@ void bbc_romslot_device::write(offs_t offset, uint8_t data) #include "rom.h" #include "ram.h" #include "nvram.h" +#include "datagem.h" #include "dfs.h" #include "genie.h" #include "pal.h" @@ -229,6 +232,7 @@ void bbc_rom_devices(device_slot_interface &device) device.option_add_internal("palabep", BBC_PALABEP); device.option_add_internal("palabe", BBC_PALABE); device.option_add_internal("palmo2", BBC_PALMO2); + device.option_add_internal("datagem", BBC_DATAGEM); device.option_add_internal("genie", BBC_PMSGENIE); device.option_add_internal("dfse00", BBC_DFSE00); //device.option_add_internal("ramagic", BBC_RAMAGIC); diff --git a/src/devices/bus/bbc/rom/slot.h b/src/devices/bus/bbc/rom/slot.h index 8d92dbf3950..4b43024d555 100644 --- a/src/devices/bus/bbc/rom/slot.h +++ b/src/devices/bus/bbc/rom/slot.h @@ -138,6 +138,9 @@ public: uint8_t* get_nvram_base() { return &m_nvram[0]; } uint32_t get_nvram_size() { return m_nvram.size(); } + // decrypt data lines + virtual void decrypt_rom() { }; + protected: device_bbc_rom_interface(const machine_config &mconfig, device_t &device);