--- nono/vm/sio.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/sio.cpp 2026/04/29 17:04:36 1.1.1.4 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "sio.h" @@ -16,7 +17,7 @@ // SIODevice SCCDevice // (LUNA, uPD7201) (X68030, Z8530) -SIODevice *gSIO; +std::unique_ptr gSIO; SIODevice::SIODevice() { @@ -41,23 +42,19 @@ SIODevice::ResetHard() } uint64 -SIODevice::Read8(uint32 addr) +SIODevice::Read(uint32 addr) { uint32 data; - // アドレスは8バイト単位でミラーのようだ。 - uint32 an = addr & 7; - - // 奇数バイトは偶数バイトのミラーが見えるようだ。 - switch (an / 2) { + switch (addr) { case 0: - data = ReadData(0); + data = ReadData(&cr.chan[0]); break; case 1: data = ReadCtrl(&cr.chan[0]); break; case 2: - data = ReadData(1); + data = ReadData(&cr.chan[1]); break; case 3: data = ReadCtrl(&cr.chan[1]); @@ -69,23 +66,9 @@ SIODevice::Read8(uint32 addr) } uint64 -SIODevice::Read16(uint32 addr) +SIODevice::Write(uint32 addr, uint32 data) { - uint32 data = Read8(addr); - - // 奇数バイトは偶数バイトのミラーが見えるようだ。 - return (data << 8) | data; -} - -uint64 -SIODevice::Write8(uint32 addr, uint32 data) -{ - // アドレスは8バイト単位でミラーのようだ。 - uint32 an = addr & 7; - - // 奇数バイトは偶数バイトのミラーが見えるようだ。 - // XXX 書き込み側は確認してないけど - switch (an / 2) { + switch (addr) { case 0: WriteData(&cr.chan[0], data); return 0; @@ -106,18 +89,22 @@ SIODevice::Write8(uint32 addr, uint32 da } uint64 -SIODevice::Write16(uint32 addr, uint32 data) +SIODevice::Peek(uint32 addr) { - // バイト書き込み1回だけになるはず? - return Write8(addr, data); -} + switch (addr) { + case 0: + return PeekData(&cr.chan[0]); -// キー入力コールバック -// LunaKeyboard で登録される。 -void -SIODevice::RxCh1(int arg) -{ - Rx(1, arg); + case 1: + return PeekCtrl(&cr.chan[0]); + + case 2: + return PeekData(&cr.chan[1]); + + case 3: + return PeekCtrl(&cr.chan[1]); + } + __unreachable(); } // 割り込みを上げる @@ -125,5 +112,5 @@ void SIODevice::Interrupt() { putlog(2, "Interrupt"); - gMPU->Interrupt(6); + gMPU->Interrupt(this, 6); }