1 // license: GPL-2.0+
2 // copyright-holders: Dirk Best
3 /***************************************************************************
4 
5     Internal floppy drive for SAM Coupe
6 
7 ***************************************************************************/
8 
9 #include "emu.h"
10 #include "floppy.h"
11 #include "formats/coupedsk.h"
12 
13 
14 //**************************************************************************
15 //  DEVICE DEFINITIONS
16 //**************************************************************************
17 
18 DEFINE_DEVICE_TYPE(SAM_FLOPPY, sam_floppy_device, "sam_floppy", "SAM Coupe Internal Floppy")
19 
FLOPPY_FORMATS_MEMBER(sam_floppy_device::floppy_formats)20 FLOPPY_FORMATS_MEMBER( sam_floppy_device::floppy_formats )
21 	FLOPPY_MGT_FORMAT
22 FLOPPY_FORMATS_END
23 
24 static void samcoupe_floppies(device_slot_interface &device)
25 {
26 	device.option_add("35dd", FLOPPY_35_DD);
27 }
28 
29 //-------------------------------------------------
30 //  device_add_mconfig - add device configuration
31 //-------------------------------------------------
32 
device_add_mconfig(machine_config & config)33 void sam_floppy_device::device_add_mconfig(machine_config &config)
34 {
35 	WD1772(config, m_fdc, 24_MHz_XTAL / 3);
36 	FLOPPY_CONNECTOR(config, "fdc:0", samcoupe_floppies, "35dd", sam_floppy_device::floppy_formats);
37 }
38 
39 
40 //**************************************************************************
41 //  LIVE DEVICE
42 //**************************************************************************
43 
44 //-------------------------------------------------
45 //  sam_floppy_device - constructor
46 //-------------------------------------------------
47 
sam_floppy_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)48 sam_floppy_device::sam_floppy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
49 	device_t(mconfig, SAM_FLOPPY, tag, owner, clock),
50 	device_samcoupe_drive_interface(mconfig, *this),
51 	m_fdc(*this, "fdc"),
52 	m_drive(*this, "fdc:0")
53 {
54 }
55 
56 //-------------------------------------------------
57 //  device_start - device-specific startup
58 //-------------------------------------------------
59 
device_start()60 void sam_floppy_device::device_start()
61 {
62 }
63 
64 
65 //**************************************************************************
66 //  IMPLEMENTATION
67 //**************************************************************************
68 
read(offs_t offset)69 uint8_t sam_floppy_device::read(offs_t offset)
70 {
71 	floppy_image_device *floppy = m_drive->get_device();
72 
73 	if (floppy)
74 		floppy->ss_w(BIT(offset, 2));
75 
76 	m_fdc->set_floppy(floppy);
77 
78 	return m_fdc->read(offset & 0x03);
79 }
80 
write(offs_t offset,uint8_t data)81 void sam_floppy_device::write(offs_t offset, uint8_t data)
82 {
83 	floppy_image_device *floppy = m_drive->get_device();
84 
85 	if (floppy)
86 		floppy->ss_w(BIT(offset, 2));
87 
88 	m_fdc->set_floppy(floppy);
89 
90 	m_fdc->write(offset & 0x03, data);
91 }
92