--- nono/vm/sysport.cpp 2026/04/29 17:04:32 1.1.1.2 +++ nono/vm/sysport.cpp 2026/04/29 17:04:36 1.1.1.3 @@ -1,9 +1,11 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "sysport.h" +#include "mfp.h" #include "sram.h" SysportDevice::SysportDevice() @@ -18,29 +20,12 @@ SysportDevice::~SysportDevice() { } -// アドレスデコーダ -inline uint64 -SysportDevice::Decoder(uint32 addr) const -{ - // 折り返しは? - addr -= baseaddr; - - // 偶数アドレスはバスエラー? - if ((addr & 1) == 0) - return (uint64)-1; - - return addr >> 1; -} - uint64 -SysportDevice::Read8(uint32 addr) +SysportDevice::Read(uint32 addr) { uint32 data; - switch (Decoder(addr)) { - default: - return (uint64)-1; - + switch (addr) { case SYSPORT::CONTRAST: data = 0xf0 | sysport.contrast; break; @@ -63,24 +48,20 @@ SysportDevice::Read8(uint32 addr) case SYSPORT::SRAMWP: data = 0xff; break; + case SYSPORT::POWEROFF: + data = 0xff; + break; + default: + __unreachable(); } putlog(1, "$%06X -> $%02x", addr, data); return data; } uint64 -SysportDevice::Read16(uint32 addr) +SysportDevice::Write(uint32 addr, uint32 data) { - return (0xff00 | Read8(addr + 1)); -} - -uint64 -SysportDevice::Write8(uint32 addr, uint32 data) -{ - switch (Decoder(addr)) { - default: - return (uint64)-1; - + switch (addr) { case SYSPORT::CONTRAST: sysport.contrast = data & 15; break; @@ -90,7 +71,13 @@ SysportDevice::Write8(uint32 addr, uint3 break; case SYSPORT::KEY: - putlog(0, "$E8E007 未サポート書き込み %02x", data); + data &= 0x0e; + // bit1,2 + if ((data & 0x06)) { + putlog(0, "$E8E007 未サポート書き込み $%02x", data); + } + // bit3 KEY CTRL は MFP で管理する + gMFP->SetKeyCtrl(data & 0x08); break; case SYSPORT::WAIT: @@ -113,22 +100,19 @@ SysportDevice::Write8(uint32 addr, uint3 case SYSPORT::POWEROFF: putlog(0, "$E8E00F (POWEROFF) 未サポート書き込み %02x", data); break; + + default: + __unreachable(); } return 0; } uint64 -SysportDevice::Write16(uint32 addr, uint32 data) -{ - return Write8(addr + 1, data & 0xff); -} - -uint64 -SysportDevice::Peek8(uint32 addr) +SysportDevice::Peek(uint32 addr) { uint32 data; - switch (Decoder(addr)) { + switch (addr) { case SYSPORT::CONTRAST: data = 0xf0 | sysport.contrast; break; @@ -150,9 +134,11 @@ SysportDevice::Peek8(uint32 addr) case SYSPORT::SRAMWP: data = 0xff; break; - default: + case SYSPORT::POWEROFF: data = 0xff; break; + default: + __unreachable(); } return data; }