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

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2017 [email protected]
        !             4: //
        !             5: 
        !             6: #pragma once
        !             7: 
        !             8: #include "device.h"
        !             9: 
        !            10: struct RTC
        !            11: {
        !            12:        // 内部カウンタ
        !            13:        //
        !            14:        // 1/32秒ごとに増加する内部カウンタ。これが 32 になると1秒ということ。
        !            15:        // ただしタイマー停止中でも1秒の繰り上がり1回は記憶できるそうなので、
        !            16:        // 実際にはこれを 6ビットのカウンタ (63まで) として使用し、
        !            17:        // 32 になったら秒繰り上がりではなく、タイマー動作状態で 32 以上だったら
        !            18:        // 32 を引いてから秒繰り上がり処理になると思う。
        !            19:        uint cnt;
        !            20: 
        !            21:        int sec;                // 秒(0-59)
        !            22:        int min;                // 分(0-59)
        !            23:        int hour;               // 時(0-23)
        !            24:        int wday;               // 曜日(0-6; 0が日曜)
        !            25:        int mday;               // 日(1-31)
        !            26:        int mon;                // 月(1-12)
        !            27:        int year;               // 年(西暦)
        !            28: 
        !            29:        bool enable_sec;        // 秒へのカウントアップを行うなら true
        !            30: };
        !            31: 
        !            32: // 汎用のリアルタイムクロック
        !            33: // RP5C15 と MK48T02 の共通部分。
        !            34: // 本来、これは IODevice である必要はないけど、C++ の制約というか多重継承は
        !            35: // あまりやりたくないので、これを IODevice 派生クラスとしておく。
        !            36: class RTCDevice : public IODevice
        !            37: {
        !            38:        typedef IODevice inherited;
        !            39: 
        !            40:  public:
        !            41:        RTCDevice();
        !            42:        virtual ~RTCDevice();
        !            43: 
        !            44:        // 初期化
        !            45:        // VM の RTC に仮想時刻(の初期値)をセットする。
        !            46:        virtual bool InitRTC() = 0;
        !            47: 
        !            48:        // 32Hz クロック入力。
        !            49:        //
        !            50:        // 32Hz ごとに呼ばれて、これが RTC の時計を進める処理をするところ。
        !            51:        // RTC を実時間に同期して進めるモードなら実時間を計るスケジューラから、
        !            52:        // RTC を仮想時間に同期して進めるモードなら VM スケジューラから呼ばれる。
        !            53:        // 派生クラス側で用意。
        !            54:        virtual void ClockIn() = 0;
        !            55: 
        !            56:  protected:
        !            57:        // ホストの現在時刻を rtc に取得
        !            58:        void LoadHostRTC(bool use_localtime);
        !            59: 
        !            60:        // どの位が更新されたか(繰り上がったか)を示すフラグ。
        !            61:        static const uint32 UPDATE_SEC  = (1U << 0);
        !            62:        static const uint32 UPDATE_MIN  = (1U << 1);
        !            63:        static const uint32 UPDATE_HOUR = (1U << 2);
        !            64:        static const uint32 UPDATE_DAY  = (1U << 3);
        !            65:        static const uint32 UPDATE_MON  = (1U << 4);
        !            66:        static const uint32 UPDATE_YEAR = (1U << 5);
        !            67: 
        !            68:        static const uint32 UPDATE_ALL  = 0xffffffffU;
        !            69: 
        !            70:        uint32 CountUp();                       // 1/32 秒カウンタの更新
        !            71:        uint32 CarrySec(uint32);        // 秒への繰り上がり
        !            72:        uint32 CarryMin(uint32);        // 分への繰り上がり
        !            73:        uint32 CarryHour(uint32);       // 時への繰り上がり
        !            74:        uint32 CarryDay(uint32);        // 日への繰り上がり
        !            75:        uint32 CarryMon(uint32);        // 月への繰り上がり
        !            76:        uint32 CarryYear(uint32);       // 年への繰り上がり
        !            77:        bool IsLeapMon() const;         // 閏月かどうか
        !            78: 
        !            79:        RTC rtc {};                                     // 内部状態
        !            80: 
        !            81:        static const char * const wdays[7];     // 曜日文字列 (0 = "Sun", ...)
        !            82: };
        !            83: 
        !            84: 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.