--- nono/vm/scc.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/scc.cpp 2026/04/29 17:04:45 1.1.1.5 @@ -1,9 +1,11 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "scc.h" +#include "interrupt.h" #include "mpu.h" // IODevice @@ -16,12 +18,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() @@ -38,79 +45,72 @@ SCCDevice::ResetHard() } uint64 -SCCDevice::Read8(uint32 addr) +SCCDevice::Read(uint32 addr) { - uint32 an = addr - devaddr; + gMPU->AddCycle(41); // InsideOut p.135 - switch (an) { - case 1: // $E98001 + switch (addr) { + case 0: // $E98001 return ReadCtrl(&cr.chan[1]); - case 3: // $E98003 + case 1: // $E98003 // マウス非接続は 0x00 ? putlog(0, "ChB データレジスタ読み込み (未実装)"); return 0x00; - case 5: // $E98005 + case 2: // $E98005 return ReadCtrl(&cr.chan[0]); - case 7: // $E98007 + case 3: // $E98007 putlog(0, "ChA データレジスタ読み込み (未実装)"); - return ReadData(0); - - default: - break; + return ReadData(&cr.chan[0]); } - putlog(0, "未実装レジスタ読み込み"); - return (uint64)-1; -} - -uint64 -SCCDevice::Read16(uint32 addr) -{ - return 0xff00 | Read8(addr + 1); + __unreachable(); } uint64 -SCCDevice::Write8(uint32 addr, uint32 data) +SCCDevice::Write(uint32 addr, uint32 data) { - uint32 an = addr - devaddr; + gMPU->AddCycle(49); // InsideOut p.135 - switch (an) { - case 1: // $E98001 + switch (addr) { + case 0: // $E98001 WriteCtrl(&cr.chan[1], data); return 0; - case 3: // $E98003 + case 1: // $E98003 WriteData(&cr.chan[1], data); return 0; - case 5: // $E98005 + case 2: // $E98005 WriteCtrl(&cr.chan[0], data); return 0; - case 7: // $E98007 + case 3: // $E98007 WriteData(&cr.chan[0], data); return 0; - - default: - break; } - putlog(0, "未実装レジスタ書き込み"); - return (uint64)-1; + __unreachable(); } uint64 -SCCDevice::Write16(uint32 addr, uint32 data) +SCCDevice::Peek(uint32 addr) { - return Write8(addr + 1, data); -} + switch (addr) { + case 0: // $E98001 + return PeekCtrl(&cr.chan[1]); -uint64 -SCCDevice::Peek8(uint32 addr) -{ - // XXX - return 0xff; + case 1: // $E98003 + // マウス非接続は 0x00 ? + return 0x00; + + case 2: // $E98005 + return PeekCtrl(&cr.chan[0]); + + case 3: // $E98007 + return PeekData(&cr.chan[0]); + } + __unreachable(); } // Z8530 制御ポート読み込み @@ -201,6 +201,13 @@ SCCDevice::WriteCtrl(struct SIO::channel chan->ptr = 0; break; + case 10: // WR10 + putlog(2, "WR%d%s <- $%02x (未実装)", chan->ptr, chan->name, data); + chan->wr10 = data; + // アクセス後は WR0 へ戻す + chan->ptr = 0; + break; + case 11: // WR11 putlog(2, "WR%d%s <- $%02x (未実装)", chan->ptr, chan->name, data); chan->wr11 = data; @@ -248,5 +255,12 @@ void SCCDevice::Interrupt() { putlog(0, "割り込み(未実装)"); - gMPU->Interrupt(5, 0x50/*XXX*/); +// gInterrupt->Raise(this); +} + +// 割り込みアクノリッジ +int +SCCDevice::InterruptAcknowledge() +{ + return 0x50; /* XXX 実際は WR2 とか要因で変わる */ }