1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
// CD 90-351 - Custom floppy drive controller (THMFC1)
//
// Handles up to two 3.5 dual-sided drives (DD 90-352)
// or up to two 2.8 dual-sided QDD drivers (QD 90-280)
#include "emu.h"
#include "cd90_351.h"
#include "imagedev/floppy.h"
#include "machine/thmfc1.h"
#include "formats/sap_dsk.h"
#include "formats/thom_dsk.h"
namespace {
class cd90_351_device : public device_t, public thomson_extension_interface
{
public:
cd90_351_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~cd90_351_device() = default;
virtual void rom_map(address_map &map) override ATTR_COLD;
virtual void io_map(address_map &map) override ATTR_COLD;
protected:
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
private:
required_memory_region m_rom;
memory_bank_creator m_rom_bank;
static void floppy_formats(format_registration &fr);
static void floppy_drives(device_slot_interface &device);
void bank_w(u8 data);
};
cd90_351_device::cd90_351_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, CD90_351, tag, owner, clock),
thomson_extension_interface(mconfig, *this),
m_rom(*this, "rom"),
m_rom_bank(*this, "rom_bank")
{
}
ROM_START(cd90_351)
// Rom has been dumped from the system, so the unaccessible ranges are
// missing (and probably totally unimportant)
ROM_REGION( 0x2000, "rom", 0 )
ROM_LOAD ( "cd-351-0.rom", 0x0000, 0x7c0, CRC(2c0159fd) SHA1(bab5395ed8bc7c06f9897897f836054e6546e8e8) )
ROM_LOAD ( "cd-351-1.rom", 0x0800, 0x7c0, CRC(8e58d159) SHA1(dcf992c96e7556b2faee6bacd3f744e56998e6ea) )
ROM_LOAD ( "cd-351-2.rom", 0x1000, 0x7c0, CRC(c9228b60) SHA1(179e10107d5be91e684069dee80f94847b83201f) )
ROM_LOAD ( "cd-351-3.rom", 0x1800, 0x7c0, CRC(3ca8e5dc) SHA1(7118636fb5c597c78c2fce17b02aed5e4ba38635) )
ROM_END
void cd90_351_device::rom_map(address_map &map)
{
map(0x000, 0x7bf).bankr(m_rom_bank);
}
void cd90_351_device::io_map(address_map &map)
{
map(0x10, 0x17).m("thmfc1", FUNC(thmfc1_device::map));
map(0x18, 0x18).w(FUNC(cd90_351_device::bank_w));
}
const tiny_rom_entry *cd90_351_device::device_rom_region() const
{
return ROM_NAME(cd90_351);
}
void cd90_351_device::floppy_drives(device_slot_interface &device)
{
device.option_add("dd90_352", FLOPPY_35_DD);
// device.option_add("qd90_280", FLOPPY_28_QDD);
}
void cd90_351_device::floppy_formats(format_registration &fr)
{
fr.add_pc_formats();
fr.add(FLOPPY_THOMSON_35_FORMAT);
fr.add(FLOPPY_SAP_FORMAT);
}
void cd90_351_device::device_add_mconfig(machine_config &config)
{
THMFC1(config, "thmfc1", 16000000);
FLOPPY_CONNECTOR(config, "thmfc1:0", floppy_drives, "dd90_352", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, "thmfc1:1", floppy_drives, nullptr, floppy_formats).enable_sound(true);
}
void cd90_351_device::device_start()
{
m_rom_bank->configure_entries(0, 4, m_rom->base(), 0x800);
}
void cd90_351_device::device_reset()
{
m_rom_bank->set_entry(0);
}
void cd90_351_device::bank_w(u8 data)
{
logerror("bank_w %d\n", data & 3);
m_rom_bank->set_entry(data & 3);
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(CD90_351, thomson_extension_interface, cd90_351_device, "cd90_351", "Thomson CD 90-351 Diskette Controller")
|