--- nono/vm/sysport.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/sysport.cpp 2026/04/29 17:04:42 1.1.1.4 @@ -1,9 +1,13 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "sysport.h" +#include "mfp.h" +#include "ram.h" +#include "romimg_x68k.h" #include "sram.h" SysportDevice::SysportDevice() @@ -18,17 +22,19 @@ SysportDevice::~SysportDevice() { } +void +SysportDevice::ResetHard() +{ + sysport.ram_wait = 0; + sysport.rom_wait = 0; +} + uint64 -SysportDevice::Read8(uint32 addr) +SysportDevice::Read(uint32 addr) { uint32 data; - if ((addr % 2) == 0) { - return 0xff; - } - - int n = (addr - baseaddr) / 2; - switch (n) { + switch (addr) { case SYSPORT::CONTRAST: data = 0xf0 | sysport.contrast; break; @@ -39,8 +45,8 @@ SysportDevice::Read8(uint32 addr) data = 0xff; break; case SYSPORT::KEY: - // キーボードは接続されていない - data = 0x00; + // キーボードは接続されてることにする + data = 0x08; break; case SYSPORT::WAIT: data = 0xff; @@ -51,28 +57,20 @@ SysportDevice::Read8(uint32 addr) case SYSPORT::SRAMWP: data = 0xff; break; + case SYSPORT::POWEROFF: + data = 0xff; + break; default: - return (uint64)-1; + __unreachable(); } putlog(1, "$%06X -> $%02x", addr, data); return data; } uint64 -SysportDevice::Read16(uint32 addr) -{ - return (0xff00 | Read8(addr + 1)); -} - -uint64 -SysportDevice::Write8(uint32 addr, uint32 data) +SysportDevice::Write(uint32 addr, uint32 data) { - if ((addr % 2) == 0) { - return (uint64)-1; - } - - int n = (addr - baseaddr) / 2; - switch (n) { + switch (addr) { case SYSPORT::CONTRAST: sysport.contrast = data & 15; break; @@ -82,14 +80,32 @@ 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: + { // 設定値で保持 sysport.rom_wait = data >> 4; sysport.ram_wait = data; + + // ROM に指示。常に設定値 + 2 でよい + gIPLROM1->SetWait(sysport.rom_wait + 2); + gIPLROM2->SetWait(sysport.rom_wait + 2); + gCGROM->SetWait(sysport.rom_wait + 2); + // RAM に指示。InsideOut p.124 + int wait = sysport.ram_wait; + if (wait > 0) + wait += 2; + gRAM->SetWait(wait); break; + } case SYSPORT::MPU: break; @@ -107,28 +123,17 @@ SysportDevice::Write8(uint32 addr, uint3 break; default: - return (uint64)-1; + __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; - if ((addr % 2) == 0) { - return 0xff; - } - - int n = (addr - baseaddr) / 2; - switch (n) { + switch (addr) { case SYSPORT::CONTRAST: data = 0xf0 | sysport.contrast; break; @@ -150,9 +155,11 @@ SysportDevice::Peek8(uint32 addr) case SYSPORT::SRAMWP: data = 0xff; break; - default: + case SYSPORT::POWEROFF: data = 0xff; break; + default: + __unreachable(); } return data; }