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