diff --git a/hash/dragon_cart.xml b/hash/dragon_cart.xml index db170d7f2e8..900b6298ac5 100644 --- a/hash/dragon_cart.xml +++ b/hash/dragon_cart.xml @@ -25,6 +25,19 @@ Compiled by K1W1 and Cowering (from GoodCoCo) + + AMTOR/AX25 + 1990 + Grosvenor Software + + + + + + + + + Doodle Bug 1982 diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index d77fe8c5d63..a023daf950a 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -3019,6 +3019,8 @@ if (BUSES["COCO"]~=null) then MAME_DIR .. "src/devices/bus/coco/coco_dwsock.h", MAME_DIR .. "src/devices/bus/coco/coco_t4426.cpp", MAME_DIR .. "src/devices/bus/coco/coco_t4426.h", + MAME_DIR .. "src/devices/bus/coco/dragon_amtor.cpp", + MAME_DIR .. "src/devices/bus/coco/dragon_amtor.h", MAME_DIR .. "src/devices/bus/coco/dragon_fdc.cpp", MAME_DIR .. "src/devices/bus/coco/dragon_fdc.h", MAME_DIR .. "src/devices/bus/coco/dragon_jcbsnd.cpp", diff --git a/src/devices/bus/coco/dragon_amtor.cpp b/src/devices/bus/coco/dragon_amtor.cpp new file mode 100644 index 00000000000..9805d408c1f --- /dev/null +++ b/src/devices/bus/coco/dragon_amtor.cpp @@ -0,0 +1,119 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/*************************************************************************** + + BMKAX25/AMTOR for G6WHK + + (c) 1990 Grosvenor Software + + Left: AX25 EXEC 49152 + Right: AMTOR EXEC 49152 + + Cartridge contains a single 32K ROM and a switch to select either AX25 + or AMTOR, each taking 16K. + +***************************************************************************/ + +#include "emu.h" +#include "dragon_amtor.h" + + +//------------------------------------------------- +// ROM( amtor ) +//------------------------------------------------- + +ROM_START( amtor ) + ROM_REGION(0x8000, "eprom", ROMREGION_ERASE00) + // this region is filled by cococart_slot_device::call_load() +ROM_END + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +DEFINE_DEVICE_TYPE(DRAGON_AMTOR, dragon_amtor_device, "dragon_amtor", "Dragon Amtor Cartridge") + +//------------------------------------------------- +// INPUT_PORTS( amtor ) +//------------------------------------------------- + +static INPUT_PORTS_START( amtor ) + PORT_START("SWITCH") + PORT_CONFNAME( 0x01, 0x00, "Switch" ) + PORT_CONFSETTING( 0x00, "AMTOR") + PORT_CONFSETTING( 0x01, "AX25") +INPUT_PORTS_END + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// dragon_amtor_device - constructor +//------------------------------------------------- + +dragon_amtor_device::dragon_amtor_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, DRAGON_AMTOR, tag, owner, clock) + , device_cococart_interface(mconfig, *this) + , m_eprom(*this, "eprom") + , m_switch(*this, "SWITCH") +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void dragon_amtor_device::device_start() +{ +} + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor dragon_amtor_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( amtor ); +} + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const tiny_rom_entry *dragon_amtor_device::device_rom_region() const +{ + return ROM_NAME( amtor ); +} + + +//------------------------------------------------- +// dragon_amtor_device::get_cart_base +//------------------------------------------------- + +uint8_t* dragon_amtor_device::get_cart_base() +{ + return m_eprom->base(); +} + +//------------------------------------------------- +// dragon_amtor_device::get_cart_memregion +//------------------------------------------------- + +memory_region* dragon_amtor_device::get_cart_memregion() +{ + return m_eprom; +} + +//------------------------------------------------- +// cts_read +//------------------------------------------------- + +READ8_MEMBER(dragon_amtor_device::cts_read) +{ + offset = bitswap<16>(offset, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, 1); + + return bitswap<8>(m_eprom->base()[(m_switch->read() << 14) | offset], 3, 2, 1, 0, 7, 6, 5, 4 ); +} diff --git a/src/devices/bus/coco/dragon_amtor.h b/src/devices/bus/coco/dragon_amtor.h new file mode 100644 index 00000000000..34cea662110 --- /dev/null +++ b/src/devices/bus/coco/dragon_amtor.h @@ -0,0 +1,45 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +#ifndef MAME_BUS_COCO_DRAGON_AMTOR_H +#define MAME_BUS_COCO_DRAGON_AMTOR_H + +#pragma once + +#include "cococart.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> dragon_amtor_device + +class dragon_amtor_device : + public device_t, + public device_cococart_interface +{ +public: + // construction/destruction + dragon_amtor_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + // optional information overrides + virtual const tiny_rom_entry *device_rom_region() const override; + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual uint8_t* get_cart_base() override; + virtual memory_region* get_cart_memregion() override; + + virtual DECLARE_READ8_MEMBER(cts_read) override; + +private: + required_memory_region m_eprom; + required_ioport m_switch; +}; + + +// device type definitions +DECLARE_DEVICE_TYPE(DRAGON_AMTOR, dragon_amtor_device) + +#endif // MAME_BUS_COCO_DRAGON_AMTOR_H diff --git a/src/mame/drivers/dragon.cpp b/src/mame/drivers/dragon.cpp index 10ec098e75b..eb7298cd1cd 100644 --- a/src/mame/drivers/dragon.cpp +++ b/src/mame/drivers/dragon.cpp @@ -20,6 +20,7 @@ #include "formats/sdf_dsk.h" #include "imagedev/floppy.h" +#include "bus/coco/dragon_amtor.h" #include "bus/coco/dragon_fdc.h" #include "bus/coco/dragon_jcbsnd.h" #include "bus/coco/dragon_sprites.h" @@ -176,6 +177,7 @@ void dragon_cart(device_slot_interface &device) device.option_add("orch90", COCO_ORCH90); device.option_add("gmc", COCO_PAK_GMC); device.option_add("pak", COCO_PAK); + device.option_add_internal("amtor", DRAGON_AMTOR); } FLOPPY_FORMATS_MEMBER( dragon_alpha_state::dragon_formats )