bus/bbc/rom: Added support for the Gemini DataGem ROM carrier board.

This commit is contained in:
Nigel Barnes 2020-10-19 19:35:05 +01:00
parent b2a2942e3f
commit 382e6fea50
5 changed files with 153 additions and 0 deletions

View File

@ -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",

View File

@ -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];
}
}

View File

@ -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

View File

@ -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);

View File

@ -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);