From: Wouter V. <m97...@us...> - 2004-05-31 18:37:50
|
Update of /cvsroot/openmsx/openMSX/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30386/src Modified Files: DeviceFactory.cc MSXIODevice.cc Log Message: Moved IO port registration from DeviceFactor to hardwareconfig.xml Index: DeviceFactory.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/DeviceFactory.cc,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- DeviceFactory.cc 20 May 2004 14:26:57 -0000 1.42 +++ DeviceFactory.cc 31 May 2004 18:37:41 -0000 1.43 @@ -60,148 +60,57 @@ MSXDevice *DeviceFactory::create(Config* conf, const EmuTime& time) { const string type = conf->getType(); - MSXCPUInterface& cpuInterface = MSXCPUInterface::instance(); - if (type == "CPU") { - return NULL; // TODO remove it from machine specs? - } - if (type == "MapperIO") { - return NULL; // TODO remove it from machine specs? - } if (type == "PPI") { - MSXPPI *ppi = new MSXPPI(conf, time); - cpuInterface.register_IO_Out(0xA8, ppi); - cpuInterface.register_IO_Out(0xA9, ppi); - cpuInterface.register_IO_Out(0xAA, ppi); - cpuInterface.register_IO_Out(0xAB, ppi); - cpuInterface.register_IO_In(0xA8, ppi); - cpuInterface.register_IO_In(0xA9, ppi); - cpuInterface.register_IO_In(0xAA, ppi); - cpuInterface.register_IO_In(0xAB, ppi); - return ppi; + return new MSXPPI(conf, time); } if (type == "RAM") { return new MSXRam(conf, time); } if (type == "VDP") { - VDP *vdp = new VDP(conf, time); - cpuInterface.register_IO_Out(0x98, vdp); - cpuInterface.register_IO_Out(0x99, vdp); - if (!vdp->isMSX1VDP()) { - cpuInterface.register_IO_Out(0x9A, vdp); - cpuInterface.register_IO_Out(0x9B, vdp); - } - cpuInterface.register_IO_In(0x98, vdp); - cpuInterface.register_IO_In(0x99, vdp); - return vdp; + return new VDP(conf, time); } if (type == "E6Timer") { - MSXE6Timer *timer = new MSXE6Timer(conf, time); - cpuInterface.register_IO_Out(0xE6, timer); - cpuInterface.register_IO_In(0xE6, timer); - cpuInterface.register_IO_In(0xE7, timer); - return timer; + return new MSXE6Timer(conf, time); } if (type == "F4Device") { - MSXF4Device *f4Device = new MSXF4Device(conf, time); - cpuInterface.register_IO_Out(0xF4, f4Device); - cpuInterface.register_IO_In(0xF4, f4Device); - return f4Device; + return new MSXF4Device(conf, time); } if (type == "TurboRLeds") { - MSXTurboRLeds *leds = new MSXTurboRLeds(conf, time); - cpuInterface.register_IO_Out(0xA7, leds); - return leds; + return new MSXTurboRLeds(conf, time); } if (type == "TurboRPause") { - MSXTurboRPause *pause = new MSXTurboRPause(conf, time); - cpuInterface.register_IO_In(0xA7, pause); - return pause; + return new MSXTurboRPause(conf, time); } if (type == "TurboRPCM") { - MSXTurboRPCM *pcm = new MSXTurboRPCM(conf, time); - cpuInterface.register_IO_Out(0xA4, pcm); - cpuInterface.register_IO_Out(0xA5, pcm); - cpuInterface.register_IO_In(0xA4, pcm); - cpuInterface.register_IO_In(0xA5, pcm); - return pcm; + return new MSXTurboRPCM(conf, time); } if (type == "S1985") { createDeviceSwitch(); return new MSXS1985(conf, time); } if (type == "S1990") { - MSXS1990 *engine = new MSXS1990(conf, time); - cpuInterface.register_IO_Out(0xE4, engine); - cpuInterface.register_IO_Out(0xE5, engine); - cpuInterface.register_IO_In(0xE4, engine); - cpuInterface.register_IO_In(0xE5, engine); - return engine; + return new MSXS1990(conf, time); } if (type == "PSG") { - MSXPSG *psg = new MSXPSG(conf, time); - cpuInterface.register_IO_Out(0xA0, psg); - cpuInterface.register_IO_Out(0xA1, psg); - cpuInterface.register_IO_In(0xA2, psg); - return psg; + return new MSXPSG(conf, time); } if (type == "Music") { - MSXMusic *music = new MSXMusic(conf, time); - cpuInterface.register_IO_Out(0x7C, music); - cpuInterface.register_IO_Out(0x7D, music); - return music; + return new MSXMusic(conf, time); } if (type == "FM-PAC") { // TODO change to FMPAC when XML format changes - MSXFmPac *fmpac = new MSXFmPac(conf, time); - cpuInterface.register_IO_Out(0x7C, fmpac); - cpuInterface.register_IO_Out(0x7D, fmpac); - return fmpac; + return new MSXFmPac(conf, time); } if (type == "Audio") { - MSXAudio *audio = new MSXAudio(conf, time); - byte base = conf->hasParameter("number") - && conf->getParameter("number") == "2" - ? 0xC2 : 0xC0; - cpuInterface.register_IO_Out(base + 0, audio); - cpuInterface.register_IO_Out(base + 1, audio); - cpuInterface.register_IO_In(base + 0, audio); - cpuInterface.register_IO_In(base + 1, audio); - return audio; + return new MSXAudio(conf, time); } if (type == "Audio-Midi") { - MC6850 *midi = new MC6850(conf, time); - cpuInterface.register_IO_Out(0x00, midi); - cpuInterface.register_IO_Out(0x01, midi); - cpuInterface.register_IO_In(0x04, midi); - cpuInterface.register_IO_In(0x05, midi); - return midi; + return new MC6850(conf, time); } if (type == "MoonSound") { - MSXMoonSound *moonsound = new MSXMoonSound(conf, time); - cpuInterface.register_IO_In(0x7E, moonsound); - cpuInterface.register_IO_In(0x7F, moonsound); - cpuInterface.register_IO_Out(0x7E, moonsound); - cpuInterface.register_IO_Out(0x7F, moonsound); - cpuInterface.register_IO_In(0xC4, moonsound); - cpuInterface.register_IO_In(0xC5, moonsound); - cpuInterface.register_IO_In(0xC6, moonsound); - cpuInterface.register_IO_In(0xC7, moonsound); - cpuInterface.register_IO_Out(0xC4, moonsound); - cpuInterface.register_IO_Out(0xC5, moonsound); - cpuInterface.register_IO_Out(0xC6, moonsound); - cpuInterface.register_IO_Out(0xC7, moonsound); - return moonsound; + return new MSXMoonSound(conf, time); } if (type == "Kanji") { - MSXKanji *kanji = new MSXKanji(conf, time); - cpuInterface.register_IO_Out(0xD8, kanji); - cpuInterface.register_IO_Out(0xD9, kanji); - cpuInterface.register_IO_In(0xD9, kanji); - // TODO: In the machine description, port mapping should only assign - // these on a 256K Kanji ROM. - cpuInterface.register_IO_Out(0xDA, kanji); - cpuInterface.register_IO_Out(0xDB, kanji); - cpuInterface.register_IO_In(0xDB, kanji); - return kanji; + return new MSXKanji(conf, time); } if (type == "Bunsetsu") { return new MSXBunsetsu(conf, time); @@ -216,21 +125,13 @@ return new PanasonicRom(conf, time); } if (type == "RTC") { - MSXRTC *rtc = new MSXRTC(conf, time); - cpuInterface.register_IO_Out(0xB4, rtc); - cpuInterface.register_IO_Out(0xB5, rtc); - cpuInterface.register_IO_In(0xB5, rtc); - return rtc; + return new MSXRTC(conf, time); } if (type == "Rom") { return RomFactory::create(conf, time); } if (type == "PrinterPort") { - MSXPrinterPort *printerPort = new MSXPrinterPort(conf, time); - cpuInterface.register_IO_Out(0x90, printerPort); - cpuInterface.register_IO_Out(0x91, printerPort); - cpuInterface.register_IO_In(0x90, printerPort); - return printerPort; + return new MSXPrinterPort(conf, time); } if (type == "SCCPlusCart") { return new MSXSCCPlusCart(conf, time); @@ -250,60 +151,26 @@ return new MSXKanji12(conf, time); } if (type == "MSX-Midi") { - MSXMidi *msxmidi = new MSXMidi(conf, time); - for (byte port = 0xE8; port <= 0xEF; port++) { - cpuInterface.register_IO_In (port, msxmidi); - cpuInterface.register_IO_Out(port, msxmidi); - } - return msxmidi; + return new MSXMidi(conf, time); } if (type == "MSX-RS232") { - MSXRS232 *rs232 = new MSXRS232(conf, time); - for (byte port = 0x80; port <= 0x87; ++port) { - cpuInterface.register_IO_In (port, rs232); - cpuInterface.register_IO_Out(port, rs232); - } - return rs232; + return new MSXRS232(conf, time); } if (type == "MegaRam") { - MSXMegaRam *megaram = new MSXMegaRam(conf, time); - cpuInterface.register_IO_In (0x8E, megaram); - cpuInterface.register_IO_Out(0x8E, megaram); - return megaram; + return new MSXMegaRam(conf, time); } if (type == "PAC") { return new MSXPac(conf, time); } if (type == "HBI55") { - MSXHBI55 *hbi55 = new MSXHBI55(conf, time); - cpuInterface.register_IO_Out(0xB0, hbi55); - cpuInterface.register_IO_Out(0xB1, hbi55); - cpuInterface.register_IO_Out(0xB2, hbi55); - cpuInterface.register_IO_Out(0xB3, hbi55); - cpuInterface.register_IO_In (0xB0, hbi55); - cpuInterface.register_IO_In (0xB1, hbi55); - cpuInterface.register_IO_In (0xB2, hbi55); - cpuInterface.register_IO_In (0xB3, hbi55); - return hbi55; + return new MSXHBI55(conf, time); } - if (type == "DebugDevice") { - DebugDevice * debugDevice = new DebugDevice(conf, time); - cpuInterface.register_IO_Out(0x2E, debugDevice); - cpuInterface.register_IO_Out(0x2F, debugDevice); - return debugDevice; + return new DebugDevice(conf, time); } - if (type == "V9990") { - V9990 *gfx9000 = new V9990(conf, time); - - for (byte port = 0x60; port < 0x70; port++) { - cpuInterface.register_IO_In (port, gfx9000); - cpuInterface.register_IO_Out(port, gfx9000); - } - return gfx9000; + return new V9990(conf, time); } - throw FatalError("Unknown device \"" + type + "\" specified in configuration"); } Index: MSXIODevice.cc =================================================================== RCS file: /cvsroot/openmsx/openMSX/src/MSXIODevice.cc,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- MSXIODevice.cc 13 Mar 2004 15:13:36 -0000 1.14 +++ MSXIODevice.cc 31 May 2004 18:37:41 -0000 1.15 @@ -1,13 +1,39 @@ // $Id$ #include "MSXIODevice.hh" +#include "MSXCPUInterface.hh" +#include "Config.hh" +#include "StringOp.hh" namespace openmsx { MSXIODevice::MSXIODevice(Config* config, const EmuTime& time) : MSXDevice(config, time) { - // TODO registerIO(); + XMLElement::Children ios; + config->getChildren("io", ios); + for (XMLElement::Children::const_iterator it = ios.begin(); + it != ios.end(); ++it) { + unsigned base = StringOp::stringToInt((*it)->getAttribute("base")); + unsigned num = StringOp::stringToInt((*it)->getAttribute("num")); + string type = (*it)->getAttribute("type"); + if (type.empty()) { + type = "IO"; + } + if (((base + num) > 256) || (num == 0) || + ((type != "I") && (type != "O") && (type != "IO"))) { + throw FatalError("Invalid IO port specification"); + } + MSXCPUInterface& cpuInterface = MSXCPUInterface::instance(); + for (unsigned i = 0; i < num; ++i) { + if ((type == "I") || (type == "IO")) { + cpuInterface.register_IO_In(base + i, this); + } + if ((type == "O") || (type == "IO")) { + cpuInterface.register_IO_Out(base + i, this); + } + } + } } MSXIODevice::~MSXIODevice() |