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 )