Annotation of nono/vm/rtc.h, revision 1.1.1.9

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.9 ! root        7: //
        !             8: // RTC の共通部分
        !             9: //
        !            10: 
1.1       root       11: #pragma once
                     12: 
                     13: #include "device.h"
1.1.1.9 ! root       14: #include "event.h"
        !            15: #include <sys/time.h>
1.1       root       16: 
1.1.1.7   root       17: // これ自体が IODevice である必要はないが派生側が IODevice を必要とするため。
1.1       root       18: class RTCDevice : public IODevice
                     19: {
1.1.1.3   root       20:        using inherited = IODevice;
1.1       root       21: 
                     22:  public:
1.1.1.6   root       23:        RTCDevice(const std::string& objname_);
1.1.1.4   root       24:        virtual ~RTCDevice() override;
1.1       root       25: 
1.1.1.7   root       26:        bool Init() override;
1.1       root       27: 
1.1.1.9 ! root       28:        virtual void StartTime();
        !            29: 
        !            30:        // clock-sync が実時間同期なら true を返す
        !            31:        bool GetSyncRealtime() const { return sync_rt; }
        !            32: 
        !            33:        // 電源 OFF 時の実時間でのクロック入力。
        !            34:        // 次回のクロック発生までの時間間隔を返す。
        !            35:        uint64 ClockIn_PowerOff();
1.1.1.7   root       36: 
                     37:        // 現在の日付時刻を返す。
                     38:        // ここで取得できる値は機種によらず共通のフォーマットだが、
                     39:        // 値は範囲外の状態になる可能性が常にあることに注意。
                     40:        //
                     41:        // RP5C15 の場合、1つのレジスタが10進数一桁ごとを扱っているため、特に
                     42:        // ゲストプログラムが月の更新するしようとするときに一時的に範囲外の
                     43:        // 状態になることが避けられない。
                     44:        // 例えば、もともと12月31日だったものを9月30日に変更する場合、
                     45:        // 上の桁から更新したら(M10,M1,D10,D1)
                     46:        //  12/31 -> 02/31 -> 09/31 -> 09/31 -> 09/30
                     47:        // 下の桁から更新したら(D1,D10,M1,M10)
                     48:        //  12/31 -> 12/30 -> 12/30 -> 19/30 -> 09/30
                     49:        // このように、2/31, 9/31, 19/30 などが中間状態として発生する。
                     50:        virtual uint GetSec() const = 0;        // 秒(0-59)
                     51:        virtual uint GetMin() const = 0;        // 分(0-59)
                     52:        virtual uint GetHour() const = 0;       // 時(0-23)
                     53:        virtual uint GetWday() const = 0;       // 曜日(0-6、0が日曜)
                     54:        virtual uint GetMday() const = 0;       // 日(1-31)
                     55:        virtual uint GetMon() const = 0;        // 月(1-12)
                     56:        virtual uint GetYear() const = 0;       // 年(西暦)
                     57:        virtual uint GetLeap() const = 0;       // うるう年カウンタ(0-3、0がうるう年)
1.1       root       58: 
                     59:  protected:
1.1.1.9 ! root       60:        // 32Hz クロック入力。
        !            61:        // clock-sync の設定に応じて、実時間または仮想時間で
        !            62:        // 32Hz ごとに呼ばれて、これが RTC の時計を進める処理をするところ。
        !            63:        void ClockIn();
        !            64: 
1.1.1.7   root       65:        // 仮想 RTC のクロック出力
1.1       root       66: 
1.1.1.7   root       67:        // 継承クラス向けに 32Hz で呼び出される。
1.1.1.9 ! root       68:        virtual void Tick32Hz();
1.1       root       69: 
1.1.1.7   root       70:        // 継承クラス向けに 2Hz で呼び出される。
                     71:        // タイミングは、0/32秒目と 16/32秒目。
1.1.1.9 ! root       72:        virtual void Tick2Hz();
1.1.1.7   root       73: 
                     74:        // 継承クラス向けに 1Hz で呼び出される。
                     75:        // タイミングは、0/32秒目。
                     76:        // この関数から秒カウンタ更新をすること。
1.1.1.9 ! root       77:        virtual void Tick1Hz();
1.1.1.7   root       78: 
                     79:        // 秒をカウントアップし、秒以上の繰り上がりを処理する。
                     80:        void CountUpSec();
                     81:        // 分をカウントアップし、分以上の繰り上がりを処理する。
                     82:        // RP5C15 の ADJUST 機能を実現するために秒と分離。
                     83:        void CountUpMin();
                     84: 
                     85:        virtual void SetSec(uint v) = 0;
                     86:        virtual void SetMin(uint v) = 0;
                     87:        virtual void SetHour(uint v) = 0;
                     88:        virtual void SetWday(uint v) = 0;
                     89:        virtual void SetMday(uint v) = 0;
                     90:        virtual void SetMon(uint v) = 0;
                     91:        virtual void SetYear(uint v) = 0;
                     92:        virtual void SetLeap(uint v) = 0;
                     93: 
                     94:        // 32Hz でカウントアップする内部カウンタ
                     95:        uint64 cnt {};
                     96: 
                     97:        // 年エポック。システムに依存。
                     98:        uint year_epoch {};
                     99: 
                    100:        // 時刻設定時に localtime を使う場合は true
                    101:        bool use_localtime {};
                    102: 
                    103:        // レジスタとして読める値を定数にすることで、仮想マシン状態を
                    104:        // 常に同じ状態にするためのパフォーマンス測定用フラグ。
                    105:        // なお NVRAM 部分は影響されない。
                    106:        bool force_fixed {};
                    107: 
1.1.1.9 ! root      108:        // RTC の入力クロックが実時間の場合は true
        !           109:        // 仮想時間の場合は false
        !           110:        bool sync_rt {};
        !           111: 
        !           112:        // 設定で指定された日付時刻
        !           113:        struct tm rtc_tm {};
        !           114: 
1.1.1.7   root      115:        // 曜日文字列 (0 = "Sun", ...)
                    116:        // MK48T02 の誤運用にも対応するため 0..7 の範囲をとる。
                    117:        static const char * const wdays[8];
                    118: 
                    119:  private:
                    120:        // デバッグオプションの日付時刻文字列を解析する。
                    121:        bool ParseDate(const std::string& str, int *y, int *m, int *d, int *w);
                    122:        bool ParseTime(const std::string& str, int *h, int *m, int *s);
1.1       root      123: 
1.1.1.7   root      124:        // 現在の月の最終日を返す (月の繰り上がり処理用)
                    125:        int GetLastMday() const;
1.1.1.9 ! root      126: 
        !           127:        // イベントコールバック
        !           128:        void Callback(Event& ev);
        !           129: 
        !           130:        // イベント間隔
        !           131:        const uint period = 31.25_msec;
        !           132: 
        !           133:        // システムクロックが刻んでいる時刻
        !           134:        uint64 stime {};
        !           135: 
        !           136:        // RTC クロック入力
        !           137:        Event event { this };
1.1       root      138: };
                    139: 
1.1.1.9 ! root      140: extern RTCDevice *gRTC;

unix.superglobalmegacorp.com

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