|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
1.1.1.8 root 7: //
8: // LUNA システムクロック
9: //
10:
1.1 root 11: #pragma once
12:
1.1.1.9 root 13: #include "device.h"
1.1 root 14:
1.1.1.9 root 15: class InterruptDevice;
1.1.1.13! root 16: class Syncer;
1.1.1.9 root 17:
1.1.1.7 root 18: class SysClkDevice : public IODevice
1.1 root 19: {
1.1.1.3 root 20: using inherited = IODevice;
1.1 root 21: public:
22: SysClkDevice();
1.1.1.10 root 23: ~SysClkDevice() override;
1.1 root 24:
1.1.1.3 root 25: bool Init() override;
1.1.1.8 root 26: void ResetHard(bool poweron) override;
1.1 root 27:
1.1.1.11 root 28: uint GetFreq() const { return freq; }
1.1.1.10 root 29:
1.1.1.2 root 30: protected:
31: // BusIO インタフェース
32: static const uint32 NPORT = 1;
1.1.1.11 root 33: busdata ReadPort(uint32 offset);
34: busdata WritePort(uint32 offset, uint32 data);
35: busdata PeekPort(uint32 offset);
36: bool PokePort(uint32 offset, uint32 data);
1.1 root 37:
38: private:
39: // イベントコールバック
1.1.1.13! root 40: void Callback(Event *ev);
1.1.1.7 root 41:
42: DECLARE_MONITOR_CALLBACK(MonitorUpdate);
1.1 root 43:
1.1.1.2 root 44: // 割り込み状態をレジスタイメージにして返す
45: uint8 GetInt() const;
46:
1.1.1.10 root 47: // 割り込み信号線の状態を変える。
48: void ChangeInterrupt();
49:
1.1 root 50: // システムクロック割り込み有りなら true。
1.1.1.4 root 51: bool sysint {};
1.1 root 52:
53: // 割り込みイベント
1.1.1.13! root 54: Event *event {};
1.1.1.7 root 55:
1.1.1.10 root 56: // システムクロック周波数 [Hz]
57: uint freq {};
58:
1.1.1.7 root 59: // 本来のイベント間隔。機種によって異なる。
1.1.1.10 root 60: uint64 period {};
1.1.1.7 root 61:
62: // システムクロックが刻んでいる時刻
63: uint64 stime {};
64:
1.1.1.13! root 65: // 実時間との差 (表示用)
! 66: int64 delta {};
! 67:
1.1.1.7 root 68: // システムクロックを実時間に同期する場合 true
69: bool sync_rt {};
70:
1.1.1.9 root 71: InterruptDevice *interrupt {};
1.1.1.13! root 72: Syncer *syncer {};
1.1.1.9 root 73:
1.1.1.12 root 74: Monitor *monitor {};
1.1 root 75: };
1.1.1.5 root 76:
1.1.1.9 root 77: static inline SysClkDevice *GetSysClkDevice() {
78: return Object::GetObject<SysClkDevice>(OBJ_SYSCLK);
79: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.