From 2dfb819208fa4365fadc33bc271b811521e78aa2 Mon Sep 17 00:00:00 2001 From: tim lindner Date: Fri, 8 May 2020 03:32:30 -0700 Subject: [PATCH] CoCo: Added Disto RAM cartridge (#6664) * adding disto ram cart * logging update * minor change stil no worky * DSTOTEST.BIN passed tests. --- scripts/src/bus.lua | 2 + src/devices/bus/coco/coco_multi.cpp | 3 + src/devices/bus/coco/coco_ram.cpp | 183 ++++++++++++++++++++++++++++ src/devices/bus/coco/coco_ram.h | 14 +++ src/mame/drivers/coco12.cpp | 2 + src/mame/drivers/dragon.cpp | 2 + 6 files changed, 206 insertions(+) create mode 100644 src/devices/bus/coco/coco_ram.cpp create mode 100644 src/devices/bus/coco/coco_ram.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 14e6b6187f6..11b8e4ea7b8 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -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", diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp index a6705a7b751..1ffa00e3078 100644 --- a/src/devices/bus/coco/coco_multi.cpp +++ b/src/devices/bus/coco/coco_multi.cpp @@ -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); diff --git a/src/devices/bus/coco/coco_ram.cpp b/src/devices/bus/coco/coco_ram.cpp new file mode 100644 index 00000000000..46a2b8bfd4e --- /dev/null +++ b/src/devices/bus/coco/coco_ram.cpp @@ -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 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; +} diff --git a/src/devices/bus/coco/coco_ram.h b/src/devices/bus/coco/coco_ram.h new file mode 100644 index 00000000000..a88874cc959 --- /dev/null +++ b/src/devices/bus/coco/coco_ram.h @@ -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 + diff --git a/src/mame/drivers/coco12.cpp b/src/mame/drivers/coco12.cpp index 020638330ba..83f06dd04a9 100644 --- a/src/mame/drivers/coco12.cpp +++ b/src/mame/drivers/coco12.cpp @@ -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); diff --git a/src/mame/drivers/dragon.cpp b/src/mame/drivers/dragon.cpp index 4c59f4df2cc..677d2bd64a4 100644 --- a/src/mame/drivers/dragon.cpp +++ b/src/mame/drivers/dragon.cpp @@ -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);