95#if COMPONENT_LASERDISC
99using std::make_unique;
103[[nodiscard]]
static std::unique_ptr<MSXDevice> createWD2793BasedFDC(
const DeviceConfig& conf)
105 const auto* styleEl = conf.findChild(
"connectionstyle");
108 conf.getCliComm().printWarning(
109 "WD2793 as FDC type without a connectionstyle is "
110 "deprecated, please update your config file to use "
111 "WD2793 with connectionstyle Philips!");
114 type = styleEl->getData();
116 if (type ==
one_of(
"Philips",
"Sony")) {
117 return make_unique<PhilipsFDC>(conf);
118 }
else if (type ==
"Microsol") {
119 return make_unique<MicrosolFDC>(conf);
120 }
else if (type ==
"AVT") {
121 return make_unique<AVTFDC>(conf);
122 }
else if (type ==
"National") {
123 return make_unique<NationalFDC>(conf);
124 }
else if (type ==
"Sanyo") {
125 return make_unique<SanyoFDC>(conf);
126 }
else if (type ==
"Toshiba") {
127 return make_unique<ToshibaFDC>(conf);
128 }
else if (type ==
"Canon") {
129 return make_unique<CanonFDC>(conf);
130 }
else if (type ==
"Spectravideo") {
131 return make_unique<SpectravideoFDC>(conf);
132 }
else if (type ==
"Victor") {
133 return make_unique<VictorFDC>(conf);
134 }
else if (type ==
"Yamaha") {
135 return make_unique<YamahaFDC>(conf);
137 throw MSXException(
"Unknown WD2793 FDC connection style ", type);
142 std::unique_ptr<MSXDevice> result;
145 result = make_unique<MSXPPI>(conf);
146 }
else if (type ==
"SVIPPI") {
147 result = make_unique<SVIPPI>(conf);
148 }
else if (type ==
"RAM") {
149 result = make_unique<MSXRam>(conf);
150 }
else if (type ==
"VDP") {
151 result = make_unique<VDP>(conf);
152 }
else if (type ==
"E6Timer") {
153 result = make_unique<MSXE6Timer>(conf);
154 }
else if (type ==
"HiResTimer") {
155 result = make_unique<MSXHiResTimer>(conf);
156 }
else if (type ==
one_of(
"ResetStatusRegister",
"F4Device")) {
157 result = make_unique<MSXResetStatusRegister>(conf);
158 }
else if (type ==
"TurboRPause") {
159 result = make_unique<MSXTurboRPause>(conf);
160 }
else if (type ==
"TurboRPCM") {
161 result = make_unique<MSXTurboRPCM>(conf);
162 }
else if (type ==
"S1985") {
163 result = make_unique<MSXS1985>(conf);
164 }
else if (type ==
"S1990") {
165 result = make_unique<MSXS1990>(conf);
166 }
else if (type ==
"ColecoJoystick") {
167 result = make_unique<ColecoJoystickIO>(conf);
168 }
else if (type ==
"SuperGameModule") {
169 result = make_unique<ColecoSuperGameModule>(conf);
170 }
else if (type ==
"SG1000Joystick") {
171 result = make_unique<SG1000JoystickIO>(conf);
172 }
else if (type ==
"SG1000Pause") {
173 result = make_unique<SG1000Pause>(conf);
174 }
else if (type ==
"SC3000PPI") {
175 result = make_unique<SC3000PPI>(conf);
176 }
else if (type ==
"PSG") {
177 result = make_unique<MSXPSG>(conf);
178 }
else if (type ==
"SVIPSG") {
179 result = make_unique<SVIPSG>(conf);
180 }
else if (type ==
"SNPSG") {
181 result = make_unique<SNPSG>(conf);
182 }
else if (type ==
"MSX-MUSIC") {
183 result = make_unique<MSXMusic>(conf);
184 }
else if (type ==
"MSX-MUSIC-WX") {
185 result = make_unique<MSXMusicWX>(conf);
186 }
else if (type ==
"FMPAC") {
187 result = make_unique<MSXFmPac>(conf);
188 }
else if (type ==
"MSX-AUDIO") {
189 result = make_unique<MSXAudio>(conf);
190 }
else if (type ==
"MusicModuleMIDI") {
191 result = make_unique<MusicModuleMIDI>(conf);
192 }
else if (type ==
"JVCMSXMIDI") {
193 result = make_unique<JVCMSXMIDI>(conf);
194 }
else if (type ==
"FACMIDIInterface") {
195 result = make_unique<MSXFacMidiInterface>(conf);
196 }
else if (type ==
"YamahaSFG") {
197 result = make_unique<MSXYamahaSFG>(conf);
198 }
else if (type ==
"MoonSound") {
199 result = make_unique<MSXMoonSound>(conf);
200 }
else if (type ==
"OPL3Cartridge") {
201 result = make_unique<MSXOPL3Cartridge>(conf);
202 }
else if (type ==
"Kanji") {
203 result = make_unique<MSXKanji>(conf);
204 }
else if (type ==
"Bunsetsu") {
205 result = make_unique<MSXBunsetsu>(conf);
206 }
else if (type ==
"MemoryMapper") {
207 result = make_unique<MSXMemoryMapper>(conf);
208 }
else if (type ==
"PanasonicRAM") {
209 result = make_unique<PanasonicRam>(conf);
210 }
else if (type ==
"RTC") {
211 result = make_unique<MSXRTC>(conf);
212 }
else if (type ==
"PasswordCart") {
213 result = make_unique<PasswordCart>(conf);
214 }
else if (type ==
"ROM") {
216 }
else if (type ==
"PrinterPort") {
217 result = make_unique<MSXPrinterPort>(conf);
218 }
else if (type ==
"SVIPrinterPort") {
219 result = make_unique<SVIPrinterPort>(conf);
220 }
else if (type ==
"SCCplus") {
221 result = make_unique<MSXSCCPlusCart>(conf);
222 }
else if (type ==
one_of(
"WD2793",
"WD1770")) {
223 result = createWD2793BasedFDC(conf);
224 }
else if (type ==
"Microsol") {
226 "Microsol as FDC type is deprecated, please update "
227 "your config file to use WD2793 with connectionstyle "
229 result = make_unique<MicrosolFDC>(conf);
230 }
else if (type ==
"MB8877A") {
232 "MB8877A as FDC type is deprecated, please update your "
233 "config file to use WD2793 with connectionstyle National!");
234 result = make_unique<NationalFDC>(conf);
235 }
else if (type ==
"TC8566AF") {
236 result = make_unique<TurboRFDC>(conf);
237 }
else if (type ==
"TDC600") {
238 result = make_unique<TalentTDC600>(conf);
239 }
else if (type ==
"ToshibaTCX-200x") {
240 result = make_unique<MSXToshibaTcx200x>(conf);
241 }
else if (type ==
"SVIFDC") {
242 result = make_unique<SVIFDC>(conf);
243 }
else if (type ==
"BeerIDE") {
244 result = make_unique<BeerIDE>(conf);
245 }
else if (type ==
"SunriseIDE") {
246 result = make_unique<SunriseIDE>(conf);
247 }
else if (type ==
"GoudaSCSI") {
248 result = make_unique<GoudaSCSI>(conf);
249 }
else if (type ==
"MegaSCSI") {
250 result = make_unique<MegaSCSI>(conf);
251 }
else if (type ==
"ESERAM") {
252 result = make_unique<ESE_RAM>(conf);
253 }
else if (type ==
"WaveSCSI") {
254 result = make_unique<ESE_SCC>(conf,
true);
255 }
else if (type ==
"ESESCC") {
256 result = make_unique<ESE_SCC>(conf,
false);
257 }
else if (type ==
"Matsushita") {
258 result = make_unique<MSXMatsushita>(conf);
259 }
else if (type ==
"VictorHC9xSystemControl") {
260 result = make_unique<MSXVictorHC9xSystemControl>(conf);
261 }
else if (type ==
"CielTurbo") {
262 result = make_unique<MSXCielTurbo>(conf);
263 }
else if (type ==
"Kanji12") {
264 result = make_unique<MSXKanji12>(conf);
265 }
else if (type ==
"MSX-MIDI") {
266 result = make_unique<MSXMidi>(conf);
267 }
else if (type ==
"MSX-RS232") {
268 result = make_unique<MSXRS232>(conf);
269 }
else if (type ==
"MegaRam") {
270 result = make_unique<MSXMegaRam>(conf);
271 }
else if (type ==
"PAC") {
272 result = make_unique<MSXPac>(conf);
273 }
else if (type ==
"HBI55") {
274 result = make_unique<MSXHBI55>(conf);
275 }
else if (type ==
"DebugDevice") {
276 result = make_unique<DebugDevice>(conf);
277 }
else if (type ==
"V9990") {
278 result = make_unique<V9990>(conf);
279 }
else if (type ==
"Video9000") {
280 result = make_unique<Video9000>(conf);
281 }
else if (type ==
"ADVram") {
282 result = make_unique<ADVram>(conf);
283 }
else if (type ==
"PioneerLDControl") {
284#if COMPONENT_LASERDISC
285 result = make_unique<PioneerLDControl>(conf);
287 throw MSXException(
"Laserdisc component not compiled in");
289 }
else if (type ==
"Nowind") {
290 result = make_unique<NowindInterface>(conf);
291 }
else if (type ==
"Mirror") {
292 result = make_unique<MSXMirrorDevice>(conf);
293 }
else if (type ==
"SensorKid") {
294 result = make_unique<SensorKid>(conf);
295 }
else if (type ==
"FraelSwitchableROM") {
296 result = make_unique<FraelSwitchableROM>(conf);
297 }
else if (type ==
"ChakkariCopy") {
298 result = make_unique<ChakkariCopy>(conf);
299 }
else if (type ==
"CanonWordProcessor") {
300 result = make_unique<CanonWordProcessor>(conf);
301 }
else if (type ==
"MegaFlashRomSCCPlusSD") {
302 result = make_unique<MegaFlashRomSCCPlusSD>(conf);
303 }
else if (type ==
"MusicalMemoryMapper") {
304 result = make_unique<MusicalMemoryMapper>(conf);
305 }
else if (type ==
"Carnivore2") {
306 result = make_unique<Carnivore2>(conf);
307 }
else if (type ==
"YamahaSKW01") {
308 result = make_unique<YamahaSKW01>(conf);
309 }
else if (type ==
one_of(
"T7775",
"T7937",
"T9763",
"T9769")) {
313 "\" specified in configuration");
315 if (result) result->init();
319[[nodiscard]]
static XMLElement& createConfig(
const char* name,
const char*
id)
322 auto* config = doc.allocateElement(name);
323 config->setFirstAttribute(doc.allocateAttribute(
"id",
id));
330 static const XMLElement& xml(createConfig(
"Dummy",
""));
331 return make_unique<DummyDevice>(
DeviceConfig(hwConf, xml));
337 static const XMLElement& xml(createConfig(
"DeviceSwitch",
"DeviceSwitch"));
338 return make_unique<MSXDeviceSwitch>(
DeviceConfig(hwConf, xml));
344 static const XMLElement& xml(createConfig(
"MapperIO",
"MapperIO"));
345 return make_unique<MSXMapperIO>(
DeviceConfig(hwConf, xml));
351 static const XMLElement& xml(createConfig(
"VDPIODelay",
"VDPIODelay"));
352 return make_unique<VDPIODelay>(
DeviceConfig(hwConf, xml), cpuInterface);
void printWarning(std::string_view message)
MSXCliComm & getCliComm() const
const XMLElement * getXML() const
static std::unique_ptr< MSXDevice > create(const DeviceConfig &conf)
static std::unique_ptr< DummyDevice > createDummyDevice(const HardwareConfig &hwConf)
static std::unique_ptr< MSXDeviceSwitch > createDeviceSwitch(const HardwareConfig &hwConf)
static std::unique_ptr< VDPIODelay > createVDPIODelay(const HardwareConfig &hwConf, MSXCPUInterface &cpuInterface)
static std::unique_ptr< MSXMapperIO > createMapperIO(const HardwareConfig &hwConf)
static XMLDocument & getStaticDocument()
std::string_view getName() const
std::unique_ptr< MSXDevice > create(const DeviceConfig &config)
This file implemented 3 utility functions: