--- nono/vm/scc.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/scc.cpp 2026/04/29 17:04:32 1.1.1.2 @@ -16,12 +16,17 @@ // SIODevice SCCDevice // (LUNA, uPD7201) (X68030, Z8530) +std::unique_ptr gSCC; + SCCDevice::SCCDevice() { logname = "scc"; devname = "SCC"; devaddr = baseaddr; devlen = 0x2000; + + cr.chan[0].desc = "Serial Port"; + cr.chan[1].desc = "Mouse"; } SCCDevice::~SCCDevice() @@ -37,12 +42,18 @@ SCCDevice::ResetHard() Reset(); } +// アドレスデコーダ +inline uint64 +SCCDevice::Decoder(uint32 addr) const +{ + // 折り返しは? + return addr - devaddr; +} + uint64 SCCDevice::Read8(uint32 addr) { - uint32 an = addr - devaddr; - - switch (an) { + switch (Decoder(addr)) { case 1: // $E98001 return ReadCtrl(&cr.chan[1]); @@ -56,7 +67,7 @@ SCCDevice::Read8(uint32 addr) case 7: // $E98007 putlog(0, "ChA データレジスタ読み込み (未実装)"); - return ReadData(0); + return ReadData(&cr.chan[0]); default: break; @@ -74,9 +85,7 @@ SCCDevice::Read16(uint32 addr) uint64 SCCDevice::Write8(uint32 addr, uint32 data) { - uint32 an = addr - devaddr; - - switch (an) { + switch (Decoder(addr)) { case 1: // $E98001 WriteCtrl(&cr.chan[1], data); return 0; @@ -109,8 +118,24 @@ SCCDevice::Write16(uint32 addr, uint32 d uint64 SCCDevice::Peek8(uint32 addr) { - // XXX - return 0xff; + switch (Decoder(addr)) { + case 1: // $E98001 + return PeekCtrl(&cr.chan[1]); + + case 3: // $E98003 + // マウス非接続は 0x00 ? + return 0x00; + + case 5: // $E98005 + return PeekCtrl(&cr.chan[0]); + + case 7: // $E98007 + return PeekData(&cr.chan[0]); + + default: + // 未調査 + return 0xff; + } } // Z8530 制御ポート読み込み @@ -248,5 +273,5 @@ void SCCDevice::Interrupt() { putlog(0, "割り込み(未実装)"); - gMPU->Interrupt(5, 0x50/*XXX*/); + gMPU680x0->Interrupt(5, 0x50/*XXX*/); }