--- nono/vm/scc.cpp 2026/04/29 17:04:50 1.1.1.6 +++ nono/vm/scc.cpp 2026/04/29 17:04:59 1.1.1.8 @@ -5,7 +5,9 @@ // #include "scc.h" +#include "bitops.h" #include "interrupt.h" +#include "keyboard.h" #include "mpu.h" // IODevice @@ -21,14 +23,16 @@ std::unique_ptr gSCC; SCCDevice::SCCDevice() + : inherited("SCC") { - logname = "scc"; - devname = "SCC"; devaddr = baseaddr; devlen = 0x2000; cr.chan[0].desc = "Serial Port"; cr.chan[1].desc = "Mouse"; + + // X680x0 では SCC と呼ぶほうが通りがいい。 + monitor.Regist(ID_MONITOR_SCC); } SCCDevice::~SCCDevice() @@ -49,9 +53,7 @@ SCCDevice::Read(uint32 offset) return ReadCtrl(&cr.chan[1]); case 1: // $E98003 - // マウス非接続は 0x00 ? - putlog(0, "ChB データレジスタ読み込み (未実装)"); - return 0x00; + return ReadData(&cr.chan[1]); case 2: // $E98005 return ReadCtrl(&cr.chan[0]); @@ -96,8 +98,7 @@ SCCDevice::Peek(uint32 offset) return PeekCtrl(&cr.chan[1]); case 1: // $E98003 - // マウス非接続は 0x00 ? - return 0x00; + return PeekData(&cr.chan[1]); case 2: // $E98005 return PeekCtrl(&cr.chan[0]); @@ -245,6 +246,18 @@ SCCDevice::WriteCtrl(struct SIO::channel } } +void +SCCDevice::WriteCR5(struct SIO::channel *chan, uint32 data) +{ + bool rts = bit_falling(chan->cr5, data, SIO::CR5_RTS); + + inherited::WriteCR5(chan, data); + + if (chan->id == 1 && rts) { + gKeyboard->MouseSendStart(); + } +} + // 割り込みを上げる void SCCDevice::Interrupt()