1 // license:BSD-3-Clause
2 // copyright-holders:Nigel Barnes
3 /**********************************************************************
4 
5     AMS 3" Microdrive Disc System
6 
7 **********************************************************************/
8 
9 
10 #include "emu.h"
11 #include "ams.h"
12 
13 
14 //**************************************************************************
15 //  DEVICE DEFINITIONS
16 //**************************************************************************
17 
18 DEFINE_DEVICE_TYPE(BBC_AMS3, bbc_ams3_device, "bbc_ams3", "AMS 3\" Microdrive Disc System")
19 
20 
21 //-------------------------------------------------
22 //  FLOPPY_FORMATS( ams3 )
23 //-------------------------------------------------
24 
FLOPPY_FORMATS_MEMBER(bbc_ams3_device::floppy_formats)25 FLOPPY_FORMATS_MEMBER( bbc_ams3_device::floppy_formats )
26 	FLOPPY_ACORN_SSD_FORMAT
27 FLOPPY_FORMATS_END
28 
29 
30 //-------------------------------------------------
31 //  ROM( ams3 )
32 //-------------------------------------------------
33 
34 ROM_START( ams3 )
35 	ROM_REGION(0x8000, "dfs_rom", 0)
36 	ROM_LOAD("dfs098.rom",  0x0000, 0x2000, CRC(90852e7d) SHA1(6df3552d5426f3a4625b9a0c7829bdba03f05e84))
37 	ROM_RELOAD(             0x2000, 0x2000)
38 	ROM_LOAD("amsdisc.rom", 0x4000, 0x1000, CRC(93876595) SHA1(a9d9123667e65334b28b8588b09642478653e356))
39 	ROM_RELOAD(             0x5000, 0x1000)
40 	ROM_RELOAD(             0x6000, 0x1000)
41 	ROM_RELOAD(             0x7000, 0x1000)
42 ROM_END
43 
44 
45 //-------------------------------------------------
46 //  device_add_mconfig - add device configuration
47 //-------------------------------------------------
48 
49 void bbc_ams3_device::device_add_mconfig(machine_config &config)
50 {
51 	I8271(config, m_fdc, DERIVED_CLOCK(1, 2));
52 	m_fdc->intrq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::intrq_w));
53 	m_fdc->hdl_wr_callback().set(FUNC(bbc_ams3_device::motor_w));
54 	m_fdc->opt_wr_callback().set(FUNC(bbc_ams3_device::side_w));
55 	// Hitachi HFD 305S
56 	FLOPPY_CONNECTOR(config, m_floppy0, "3dsdd", FLOPPY_3_DSDD, true, bbc_ams3_device::floppy_formats).enable_sound(true);
57 	FLOPPY_CONNECTOR(config, m_floppy1, "3dsdd", FLOPPY_3_DSDD, false, bbc_ams3_device::floppy_formats).enable_sound(true);
58 }
59 
60 
device_rom_region() const61 const tiny_rom_entry *bbc_ams3_device::device_rom_region() const
62 {
63 	return ROM_NAME( ams3 );
64 }
65 
66 //**************************************************************************
67 //  LIVE DEVICE
68 //**************************************************************************
69 
70 //-------------------------------------------------
71 //  bbc_ams3_device - constructor
72 //-------------------------------------------------
73 
bbc_ams3_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)74 bbc_ams3_device::bbc_ams3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
75 	: device_t(mconfig, BBC_AMS3, tag, owner, clock)
76 	, device_bbc_fdc_interface(mconfig, *this)
77 	, m_fdc(*this, "i8271")
78 	, m_floppy0(*this, "i8271:0")
79 	, m_floppy1(*this, "i8271:1")
80 {
81 }
82 
83 
84 //-------------------------------------------------
85 //  device_start - device-specific startup
86 //-------------------------------------------------
87 
device_start()88 void bbc_ams3_device::device_start()
89 {
90 }
91 
92 
93 //**************************************************************************
94 //  IMPLEMENTATION
95 //**************************************************************************
96 
read(offs_t offset)97 uint8_t bbc_ams3_device::read(offs_t offset)
98 {
99 	uint8_t data;
100 
101 	if (offset & 0x04)
102 	{
103 		data = m_fdc->data_r();
104 	}
105 	else
106 	{
107 		data = m_fdc->read(offset & 0x03);
108 	}
109 	return data;
110 }
111 
write(offs_t offset,uint8_t data)112 void bbc_ams3_device::write(offs_t offset, uint8_t data)
113 {
114 	if (offset & 0x04)
115 	{
116 		m_fdc->data_w(data);
117 	}
118 	else
119 	{
120 		m_fdc->write(offset & 0x03, data);
121 	}
122 }
123 
WRITE_LINE_MEMBER(bbc_ams3_device::motor_w)124 WRITE_LINE_MEMBER(bbc_ams3_device::motor_w)
125 {
126 	if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
127 	if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
128 	m_fdc->ready_w(!state);
129 }
130 
WRITE_LINE_MEMBER(bbc_ams3_device::side_w)131 WRITE_LINE_MEMBER(bbc_ams3_device::side_w)
132 {
133 	if (m_floppy0->get_device()) m_floppy0->get_device()->ss_w(state);
134 	if (m_floppy1->get_device()) m_floppy1->get_device()->ss_w(state);
135 }
136