--- nono/vm/sysport.cpp 2026/04/29 17:04:42 1.1.1.4 +++ nono/vm/sysport.cpp 2026/04/29 17:05:09 1.1.1.8 @@ -4,37 +4,53 @@ // Licensed under nono-license.txt // +// +// システムポート +// + #include "sysport.h" -#include "mfp.h" +#include "keyboard.h" +#include "mpu.h" +#include "nmi.h" #include "ram.h" #include "romimg_x68k.h" #include "sram.h" +// グローバル参照用 +SysportDevice *gSysport; + +// コンストラクタ SysportDevice::SysportDevice() + : inherited("SystemPort") { - logname = "sysport"; - devname = "Sysport"; + AddAlias("SysPort"); + devaddr = baseaddr; devlen = 0x2000; } +// デストラクタ SysportDevice::~SysportDevice() { + gSysport = NULL; } +// リセット void -SysportDevice::ResetHard() +SysportDevice::ResetHard(bool poweron) { + sysport.contrast = 0; // XXX 未調査 sysport.ram_wait = 0; sysport.rom_wait = 0; + sysport.key_ctrl = false; } uint64 -SysportDevice::Read(uint32 addr) +SysportDevice::Read(uint32 offset) { uint32 data; - switch (addr) { + switch (offset) { case SYSPORT::CONTRAST: data = 0xf0 | sysport.contrast; break; @@ -45,8 +61,11 @@ SysportDevice::Read(uint32 addr) data = 0xff; break; case SYSPORT::KEY: - // キーボードは接続されてることにする - data = 0x08; + // XXX bit3 以外は要実機確認 + data = 0xf7; + if (gKeyboard->IsConnected()) { + data |= 0x08; + } break; case SYSPORT::WAIT: data = 0xff; @@ -63,14 +82,14 @@ SysportDevice::Read(uint32 addr) default: __unreachable(); } - putlog(1, "$%06X -> $%02x", addr, data); + putlog(1, "$%06X -> $%02x", gMPU->GetPaddr(), data); return data; } uint64 -SysportDevice::Write(uint32 addr, uint32 data) +SysportDevice::Write(uint32 offset, uint32 data) { - switch (addr) { + switch (offset) { case SYSPORT::CONTRAST: sysport.contrast = data & 15; break; @@ -81,12 +100,15 @@ SysportDevice::Write(uint32 addr, uint32 case SYSPORT::KEY: data &= 0x0e; - // bit1,2 - if ((data & 0x06)) { + // bit1 + if ((data & 0x02)) { putlog(0, "$E8E007 未サポート書き込み $%02x", data); } - // bit3 KEY CTRL は MFP で管理する - gMFP->SetKeyCtrl(data & 0x08); + // bit2: NMI リセット + if ((data & 0x04)) { + gNMI->NegateNMI(); + } + sysport.key_ctrl = (data & 0x08); break; case SYSPORT::WAIT: @@ -119,7 +141,7 @@ SysportDevice::Write(uint32 addr, uint32 break; case SYSPORT::POWEROFF: - putlog(0, "$E8E00F (POWEROFF) 未サポート書き込み %02x", data); + putlog(0, "$e8e00f (POWEROFF) 未サポート書き込み %02x", data); break; default: @@ -129,11 +151,11 @@ SysportDevice::Write(uint32 addr, uint32 } uint64 -SysportDevice::Peek(uint32 addr) +SysportDevice::Peek(uint32 offset) { uint32 data; - switch (addr) { + switch (offset) { case SYSPORT::CONTRAST: data = 0xf0 | sysport.contrast; break; @@ -144,7 +166,11 @@ SysportDevice::Peek(uint32 addr) data = 0xff; break; case SYSPORT::KEY: - data = 0xff; + // XXX bit3 以外は要実機確認 + data = 0xf7; + if (gKeyboard->IsConnected()) { + data |= 0x08; + } break; case SYSPORT::WAIT: data = 0xff;