CoCo: Added Disto RAM cartridge (#6664)

* adding disto ram cart

* logging update

* minor change stil no worky

* DSTOTEST.BIN passed tests.
This commit is contained in:
tim lindner 2020-05-08 03:32:30 -07:00 committed by GitHub
parent df9f867b6b
commit 2dfb819208
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 206 additions and 0 deletions

View File

@ -3306,6 +3306,8 @@ if (BUSES["COCO"]~=null) then
MAME_DIR .. "src/devices/bus/coco/coco_dcmodem.h",
MAME_DIR .. "src/devices/bus/coco/coco_orch90.cpp",
MAME_DIR .. "src/devices/bus/coco/coco_orch90.h",
MAME_DIR .. "src/devices/bus/coco/coco_ram.cpp",
MAME_DIR .. "src/devices/bus/coco/coco_ram.h",
MAME_DIR .. "src/devices/bus/coco/coco_ssc.cpp",
MAME_DIR .. "src/devices/bus/coco/coco_ssc.h",
MAME_DIR .. "src/devices/bus/coco/coco_pak.cpp",

View File

@ -64,6 +64,7 @@
#include "coco_pak.h"
#include "coco_rs232.h"
#include "coco_ssc.h"
#include "coco_ram.h"
#define SLOT1_TAG "slot1"
#define SLOT2_TAG "slot2"
@ -164,6 +165,7 @@ static void coco_cart_slot1_3(device_slot_interface &device)
device.option_add("dcmodem", COCO_DCMODEM);
device.option_add("orch90", COCO_ORCH90);
device.option_add("ssc", COCO_SSC);
device.option_add("ram", COCO_PAK_RAM);
device.option_add("games_master", COCO_PAK_GMC);
device.option_add("banked_16k", COCO_PAK_BANKED);
device.option_add("pak", COCO_PAK);
@ -177,6 +179,7 @@ static void coco_cart_slot4(device_slot_interface &device)
device.option_add("dcmodem", COCO_DCMODEM);
device.option_add("orch90", COCO_ORCH90);
device.option_add("ssc", COCO_SSC);
device.option_add("ram", COCO_PAK_RAM);
device.option_add("games_master", COCO_PAK_GMC);
device.option_add("banked_16k", COCO_PAK_BANKED);
device.option_add("pak", COCO_PAK);

View File

@ -0,0 +1,183 @@
// license:BSD-3-Clause
// copyright-holders:tim lindner
/***************************************************************************
coco_ram.cpp
Code for emulating the Disto RAM cartridge
This cartridge came in several forms: 256K, 512K, 768K, and 1024K.
***************************************************************************/
#include "emu.h"
#include "coco_ram.h"
#include "cococart.h"
#include "machine/ram.h"
#define STATICRAM_TAG "static_ram"
// #define VERBOSE (LOG_GENERAL )
#include "logmacro.h"
#define RAM_SIZE_IN_K 1024
#define BUFFER_SIZE (RAM_SIZE_IN_K * 1024)
#define STRINGIZE_HELPER(expr) #expr
#define STRINGIZE(expr) STRINGIZE_HELPER(expr)
//**************************************************************************
// TYPE DECLARATIONS
//**************************************************************************
namespace
{
// ======================> coco_pak_device
class coco_pak_ram_device :
public device_t,
public device_cococart_interface
{
public:
// construction/destruction
coco_pak_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual void device_add_mconfig(machine_config &config) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual DECLARE_WRITE8_MEMBER(scs_write) override;
virtual DECLARE_READ8_MEMBER(scs_read) override;
private:
required_device<ram_device> m_staticram;
int m_offset;
};
};
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
DEFINE_DEVICE_TYPE_PRIVATE(COCO_PAK_RAM, device_cococart_interface, coco_pak_ram_device, "cocopakram", "Disto " STRINGIZE(RAM_SIZE_IN_K) "K RAM Cartridge")
//-------------------------------------------------
// coco_pak_device - constructor
//-------------------------------------------------
coco_pak_ram_device::coco_pak_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, COCO_PAK_RAM, tag, owner, clock)
, device_cococart_interface(mconfig, *this)
, m_staticram(*this, STATICRAM_TAG)
, m_offset(0)
{
}
//**************************************************************************
// MACHINE FRAGMENTS AND ADDRESS MAPS
//**************************************************************************
void coco_pak_ram_device::device_add_mconfig(machine_config &config)
{
RAM(config, STATICRAM_TAG).set_default_size(STRINGIZE(RAM_SIZE_IN_K) "K").set_default_value(0);
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void coco_pak_ram_device::device_start()
{
// initial state
m_offset = 0;
// save state
save_item(NAME(m_offset));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void coco_pak_ram_device::device_reset()
{
m_offset = 0;
}
//-------------------------------------------------
// scs_write
//-------------------------------------------------
WRITE8_MEMBER(coco_pak_ram_device::scs_write)
{
// int idata = data;
switch(offset)
{
case 0:
m_offset = ((m_offset & 0xffff00) + data);
break;
case 1:
m_offset = ((m_offset & 0xff00ff) + (data << 8));
break;
case 2:
m_offset = ((m_offset & 0x00ffff) + (data << 16));
break;
case 3:
if( m_offset < BUFFER_SIZE )
{
m_staticram->write(m_offset, data);
}
break;
}
LOG("scs_write: %s: %06x, %02x, %02x\n", machine().describe_context(), m_offset, offset, data);
}
//-------------------------------------------------
// scs_read
//-------------------------------------------------
READ8_MEMBER(coco_pak_ram_device::scs_read)
{
uint8_t data = 0x00;
switch (offset)
{
case 0:
data = (m_offset) & 0xff;
break;
case 1:
data = (m_offset & 0xff00ff) >> 8;
break;
case 2:
data = (m_offset & 0xff0000) >> 16;
break;
case 3:
if( m_offset < BUFFER_SIZE )
{
data = m_staticram->read(m_offset);
}
break;
}
LOG("scs_read: %s: %06x, %02x, %02x\n", machine().describe_context(), m_offset, offset, data);
return data;
}

View File

@ -0,0 +1,14 @@
// license:BSD-3-Clause
// copyright-holders:tim lindner
#ifndef MAME_BUS_COCO_COCO_RAM_H
#define MAME_BUS_COCO_COCO_RAM_H
#pragma once
#include "cococart.h"
// device type definition
DECLARE_DEVICE_TYPE(COCO_PAK_RAM, device_cococart_interface)
#endif // MAME_BUS_COCO_COCO_RAM_H

View File

@ -36,6 +36,7 @@
#include "bus/coco/coco_psg.h"
#include "bus/coco/coco_rs232.h"
#include "bus/coco/coco_ssc.h"
#include "bus/coco/coco_ram.h"
#include "bus/coco/coco_t4426.h"
#include "cpu/m6809/m6809.h"
@ -415,6 +416,7 @@ void coco_cart(device_slot_interface &device)
device.option_add("dcmodem", COCO_DCMODEM);
device.option_add("orch90", COCO_ORCH90);
device.option_add("ssc", COCO_SSC);
device.option_add("ram", COCO_PAK_RAM);
device.option_add("games_master", COCO_PAK_GMC);
device.option_add("banked_16k", COCO_PAK_BANKED);
device.option_add("pak", COCO_PAK);

View File

@ -27,6 +27,7 @@
#include "bus/coco/dragon_sprites.h"
#include "bus/coco/coco_pak.h"
#include "bus/coco/coco_ssc.h"
#include "bus/coco/coco_ram.h"
#include "bus/coco/coco_orch90.h"
#include "bus/coco/coco_gmc.h"
#include "bus/coco/coco_psg.h"
@ -207,6 +208,7 @@ void dragon_cart(device_slot_interface &device)
device.option_add("jcbspch", DRAGON_JCBSPCH);
device.option_add("sprites", DRAGON_SPRITES);
device.option_add("ssc", COCO_SSC);
device.option_add("ram", COCO_PAK_RAM);
device.option_add("orch90", COCO_ORCH90);
device.option_add("gmc", COCO_PAK_GMC);
device.option_add("pak", COCO_PAK);