--- nono/vm/sysclk.cpp 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/sysclk.cpp 2026/04/29 17:04:50 1.1.1.7 @@ -1,10 +1,14 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "sysclk.h" -#include "mpu.h" +#include "config.h" +#include "interrupt.h" + +std::unique_ptr gSysClk; SysClkDevice::SysClkDevice() { @@ -15,8 +19,7 @@ SysClkDevice::SysClkDevice() event.dev = this; event.func = (DeviceCallback_t)&SysClkDevice::Callback; event.code = 0; - event.time = 16.666667_msec; - event.name = "System Clock"; + event.SetName("System Clock"); } SysClkDevice::~SysClkDevice() @@ -24,51 +27,63 @@ SysClkDevice::~SysClkDevice() } bool +SysClkDevice::Init() +{ + // クロックは機種ごとに異なる + const ConfigItem& item = gConfig->Find("!sysclk-period"); + event.time = item.AsInt(); + return true; +} + +bool SysClkDevice::PowerOn() { // 電源オンですぐ起動 - gScheduler->AddEvent(&event); + event.Start(); return true; } uint64 -SysClkDevice::Read8(uint32 addr) +SysClkDevice::Read(uint32 offset) { - uint32 an = addr - devaddr; + // 1 ポートしかない + return GetInt(); +} - if (an == 0) { - uint8 data = 0; - if (sysint) { - data |= 0x80; - } - return data; - } else { - // それ以外のポートがどう見えるかとか未調査 - return 0xff; - } +uint64 +SysClkDevice::Write(uint32 offset, uint32 data) +{ + // 何か書き込まれたら、フラグをクリア + putlog(1, "システムクロック割り込みクリア"); + sysint = false; + gInterrupt->NegateINT(this); + return 0; } uint64 -SysClkDevice::Write8(uint32 addr, uint32 data) +SysClkDevice::Peek(uint32 offset) { - uint32 an = addr - devaddr; + return GetInt(); +} - if (an == 0) { - // 何か書き込まれたら、フラグをクリア - sysint = false; - putlog(1, "システムクロック割り込みクリア"); - } else { - // それ以外 (特に +1, +2, +3) で何が起きるかは未調査 +// 割り込み状態を取得(?) +uint8 +SysClkDevice::GetInt() const +{ + uint8 data = 0; + + if (sysint) { + data |= 0x80; } - return 0; + return data; } // イベントハンドラ void -SysClkDevice::Callback(int arg) +SysClkDevice::Callback(Event& ev) { putlog(3, "システムクロック割り込み発生"); sysint = true; - gMPU->Interrupt(5); - gScheduler->AddEvent(&event); + gInterrupt->AssertINT(this); + ev.Start(); }