--- nono/vm/sysclk.cpp 2026/04/29 17:04:32 1.1.1.3 +++ nono/vm/sysclk.cpp 2026/04/29 17:04:45 1.1.1.6 @@ -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,7 +19,6 @@ SysClkDevice::SysClkDevice() event.dev = this; event.func = (DeviceCallback_t)&SysClkDevice::Callback; event.code = 0; - event.time = 16.666667_msec; event.SetName("System Clock"); } @@ -24,6 +27,15 @@ SysClkDevice::~SysClkDevice() } bool +SysClkDevice::Init() +{ + // クロックは機種ごとに異なる + const ConfigItem& item = gConfig->Find("!sysclk-period"); + event.time = item.AsInt(); + return true; +} + +bool SysClkDevice::PowerOn() { // 電源オンですぐ起動 @@ -42,8 +54,9 @@ uint64 SysClkDevice::Write(uint32 addr, uint32 data) { // 何か書き込まれたら、フラグをクリア - sysint = false; putlog(1, "システムクロック割り込みクリア"); + sysint = false; + gInterrupt->NegateINT(this); return 0; } @@ -67,10 +80,10 @@ SysClkDevice::GetInt() const // イベントハンドラ void -SysClkDevice::Callback(int arg) +SysClkDevice::Callback(Event& ev) { putlog(3, "システムクロック割り込み発生"); sysint = true; - gMPU->Interrupt(5); - event.Start(); + gInterrupt->AssertINT(this); + ev.Start(); }