From 06d430fbcb4dc5e52dd65f8b340895649ec0f5b2 Mon Sep 17 00:00:00 2001 From: tim lindner Date: Sat, 13 May 2017 13:29:53 -0700 Subject: [PATCH] Emulation of Games Master Cartridge --- scripts/src/bus.lua | 2 + src/devices/bus/coco/coco_gmc.cpp | 73 +++++++++++++++++++++++++++++ src/devices/bus/coco/coco_gmc.h | 31 ++++++++++++ src/devices/bus/coco/coco_multi.cpp | 3 ++ src/mame/drivers/coco12.cpp | 2 + src/mame/drivers/dragon.cpp | 1 + 6 files changed, 112 insertions(+) create mode 100644 src/devices/bus/coco/coco_gmc.cpp create mode 100644 src/devices/bus/coco/coco_gmc.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 289a4417ee8..3f8e9616e3f 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -2496,6 +2496,8 @@ if (BUSES["COCO"]~=null) then MAME_DIR .. "src/devices/bus/coco/coco_pak.h", MAME_DIR .. "src/devices/bus/coco/coco_fdc.cpp", MAME_DIR .. "src/devices/bus/coco/coco_fdc.h", + MAME_DIR .. "src/devices/bus/coco/coco_gmc.cpp", + MAME_DIR .. "src/devices/bus/coco/coco_gmc.h", MAME_DIR .. "src/devices/bus/coco/coco_multi.cpp", MAME_DIR .. "src/devices/bus/coco/coco_multi.h", MAME_DIR .. "src/devices/bus/coco/coco_dwsock.cpp", diff --git a/src/devices/bus/coco/coco_gmc.cpp b/src/devices/bus/coco/coco_gmc.cpp new file mode 100644 index 00000000000..23731deaf73 --- /dev/null +++ b/src/devices/bus/coco/coco_gmc.cpp @@ -0,0 +1,73 @@ +// license:BSD-3-Clause +// copyright-holders:tim lindner +/*************************************************************************** + + coco_gmc.c + + Code for emulating the Games Master Cartridge. A banked switched ROM + cartridge with a SN76489AN programmable sound generator. + + The ROM bank switching is exactly like the circuit developed for RoboCop + and Predator. + + The SN76489AN is tied to address $FF41. + + Cartridge by John Linville. + +***************************************************************************/ + +#include "emu.h" +#include "coco_gmc.h" +#include "speaker.h" + +#define SN76489AN_TAG "gmc_psg" + +static MACHINE_CONFIG_FRAGMENT(cocopak_gmc) + MCFG_SPEAKER_STANDARD_MONO("gmc_speaker") + MCFG_SOUND_ADD(SN76489AN_TAG, SN76489A, XTAL_4MHz) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "gmc_speaker", 1.0) +MACHINE_CONFIG_END + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +const device_type COCO_PAK_GMC = device_creator; + +//------------------------------------------------- +// coco_pak_device - constructor +//------------------------------------------------- + +coco_pak_gmc_device::coco_pak_gmc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : coco_pak_banked_device(mconfig, tag, owner, clock), + m_psg(*this, SN76489AN_TAG) +{ +} + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor coco_pak_gmc_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( cocopak_gmc ); +} + +/*------------------------------------------------- + write +-------------------------------------------------*/ + +WRITE8_MEMBER(coco_pak_gmc_device::write) +{ + switch(offset) + { + case 0: + /* set the bank */ + coco_pak_banked_device::write(space,offset,data,mem_mask); + break; + case 1: + m_psg->write(data); + break; + } +} diff --git a/src/devices/bus/coco/coco_gmc.h b/src/devices/bus/coco/coco_gmc.h new file mode 100644 index 00000000000..ceb0652f490 --- /dev/null +++ b/src/devices/bus/coco/coco_gmc.h @@ -0,0 +1,31 @@ +// license:BSD-3-Clause +// copyright-holders:tim lindner +#pragma once + +#ifndef __COCO_GMC_H__ +#define __COCO_GMC_H__ + +#include "coco_pak.h" +#include "sound/sn76496.h" + +// ======================> coco_pak_banked_device + +class coco_pak_gmc_device : + public coco_pak_banked_device +{ +public: + // construction/destruction + coco_pak_gmc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + virtual machine_config_constructor device_mconfig_additions() const override; + +protected: + // device-level overrides + virtual DECLARE_WRITE8_MEMBER(write) override; +private: + required_device m_psg; +}; + + +// device type definition +extern const device_type COCO_PAK_GMC; +#endif /* __COCO_GMC_H__ */ diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp index 5e1737d7347..c752b5c5de1 100644 --- a/src/devices/bus/coco/coco_multi.cpp +++ b/src/devices/bus/coco/coco_multi.cpp @@ -57,6 +57,7 @@ #include "coco_multi.h" #include "coco_232.h" #include "coco_orch90.h" +#include "coco_gmc.h" #include "coco_pak.h" #include "coco_fdc.h" @@ -74,6 +75,7 @@ static SLOT_INTERFACE_START(coco_cart_slot1_3) SLOT_INTERFACE("rs232", COCO_232) SLOT_INTERFACE("orch90", COCO_ORCH90) + SLOT_INTERFACE("games_master", COCO_PAK_GMC) SLOT_INTERFACE("banked_16k", COCO_PAK_BANKED) SLOT_INTERFACE("pak", COCO_PAK) SLOT_INTERFACE_END @@ -82,6 +84,7 @@ static SLOT_INTERFACE_START(coco_cart_slot4) SLOT_INTERFACE("fdcv11", COCO_FDC_V11) SLOT_INTERFACE("rs232", COCO_232) SLOT_INTERFACE("orch90", COCO_ORCH90) + SLOT_INTERFACE("games_master", COCO_PAK_GMC) SLOT_INTERFACE("banked_16k", COCO_PAK_BANKED) SLOT_INTERFACE("pak", COCO_PAK) SLOT_INTERFACE_END diff --git a/src/mame/drivers/coco12.cpp b/src/mame/drivers/coco12.cpp index 208bb6ad7d6..fbf764d16b2 100644 --- a/src/mame/drivers/coco12.cpp +++ b/src/mame/drivers/coco12.cpp @@ -31,6 +31,7 @@ #include "bus/coco/coco_fdc.h" #include "bus/coco/coco_multi.h" #include "bus/coco/coco_orch90.h" +#include "bus/coco/coco_gmc.h" #include "bus/coco/coco_pak.h" #include "bus/coco/coco_t4426.h" @@ -252,6 +253,7 @@ SLOT_INTERFACE_START( coco_cart ) SLOT_INTERFACE("cp400_fdc", CP400_FDC) SLOT_INTERFACE("rs232", COCO_232) SLOT_INTERFACE("orch90", COCO_ORCH90) + SLOT_INTERFACE("games_master", COCO_PAK_GMC) SLOT_INTERFACE("banked_16k", COCO_PAK_BANKED) SLOT_INTERFACE("pak", COCO_PAK) SLOT_INTERFACE("multi", COCO_MULTIPAK) MCFG_SLOT_OPTION_CLOCK("multi", DERIVED_CLOCK(1, 1)) diff --git a/src/mame/drivers/dragon.cpp b/src/mame/drivers/dragon.cpp index d749aa17156..46e7005e06e 100644 --- a/src/mame/drivers/dragon.cpp +++ b/src/mame/drivers/dragon.cpp @@ -16,6 +16,7 @@ #include "cpu/m6809/m6809.h" #include "bus/coco/coco_232.h" #include "bus/coco/coco_orch90.h" +#include "bus/coco/coco_gmc.h" #include "bus/coco/coco_pak.h" #include "bus/coco/coco_fdc.h" #include "bus/coco/coco_multi.h"