summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--src/devices/bus/bbc/rom/datagem.cpp96
-rw-r--r--src/devices/bus/bbc/rom/datagem.h48
-rw-r--r--src/devices/bus/bbc/rom/slot.cpp4
-rw-r--r--src/devices/bus/bbc/rom/slot.h3
5 files changed, 153 insertions, 0 deletions
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);