Annotation of nono/vm/sysclk.cpp, revision 1.1.1.7

1.1       root        1: //
                      2: // nono
1.1.1.4   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
                      7: #include "sysclk.h"
1.1.1.6   root        8: #include "config.h"
                      9: #include "interrupt.h"
                     10: 
                     11: std::unique_ptr<SysClkDevice> gSysClk;
1.1       root       12: 
                     13: SysClkDevice::SysClkDevice()
                     14: {
                     15:        logname = "sysclk";
                     16:        devname = "SystemClock";
                     17:        devaddr = 0x63000000;
                     18: 
                     19:        event.dev = this;
                     20:        event.func = (DeviceCallback_t)&SysClkDevice::Callback;
                     21:        event.code = 0;
1.1.1.2   root       22:        event.SetName("System Clock");
1.1       root       23: }
                     24: 
                     25: SysClkDevice::~SysClkDevice()
                     26: {
                     27: }
                     28: 
                     29: bool
1.1.1.4   root       30: SysClkDevice::Init()
                     31: {
                     32:        // クロックは機種ごとに異なる
                     33:        const ConfigItem& item = gConfig->Find("!sysclk-period");
                     34:        event.time = item.AsInt();
                     35:        return true;
                     36: }
                     37: 
                     38: bool
1.1       root       39: SysClkDevice::PowerOn()
                     40: {
                     41:        // 電源オンですぐ起動
1.1.1.3   root       42:        event.Start();
1.1       root       43:        return true;
                     44: }
                     45: 
                     46: uint64
1.1.1.7 ! root       47: SysClkDevice::Read(uint32 offset)
1.1       root       48: {
1.1.1.3   root       49:        // 1 ポートしかない
                     50:        return GetInt();
                     51: }
1.1       root       52: 
1.1.1.3   root       53: uint64
1.1.1.7 ! root       54: SysClkDevice::Write(uint32 offset, uint32 data)
1.1.1.3   root       55: {
                     56:        // 何か書き込まれたら、フラグをクリア
                     57:        putlog(1, "システムクロック割り込みクリア");
1.1.1.6   root       58:        sysint = false;
                     59:        gInterrupt->NegateINT(this);
1.1.1.3   root       60:        return 0;
1.1       root       61: }
                     62: 
                     63: uint64
1.1.1.7 ! root       64: SysClkDevice::Peek(uint32 offset)
1.1       root       65: {
1.1.1.3   root       66:        return GetInt();
                     67: }
                     68: 
                     69: // 割り込み状態を取得(?)
                     70: uint8
                     71: SysClkDevice::GetInt() const
                     72: {
                     73:        uint8 data = 0;
1.1       root       74: 
1.1.1.3   root       75:        if (sysint) {
                     76:                data |= 0x80;
1.1       root       77:        }
1.1.1.3   root       78:        return data;
1.1       root       79: }
                     80: 
                     81: // イベントハンドラ
                     82: void
1.1.1.5   root       83: SysClkDevice::Callback(Event& ev)
1.1       root       84: {
                     85:        putlog(3, "システムクロック割り込み発生");
                     86:        sysint = true;
1.1.1.6   root       87:        gInterrupt->AssertINT(this);
1.1.1.5   root       88:        ev.Start();
1.1       root       89: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.