Annotation of nono/vm/mk48t02.h, revision 1.1.1.10

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: 
                      7: #pragma once
                      8: 
                      9: #include "device.h"
1.1.1.3   root       10: #include "mappedfile.h"
1.1.1.9   root       11: #include "monitor.h"
1.1       root       12: #include "rtc.h"
                     13: 
                     14: // MK48T02 の時計部分のレジスタと内部状態
                     15: struct MK48T02Clock
                     16: {
1.1.1.10! root       17:        //       b7   b6   b5   b4   b3   b2   b1   b0
        !            18:        //     +----+----+----+----+----+----+----+----+
        !            19:        // 7ff |              YEAR (4+4bit)            |  (YEAR: 00..99)
        !            20:        //     +----+----+----+----+----+----+----+----+
        !            21:        // 7fe |  0    0    0 |      MONTH (1+4bit)    |  (MONTH: 01..12)
        !            22:        //     +----+----+----+----+----+----+----+----+
        !            23:        // 7fd | XX |  0 |         DATE (2+4bit)       |  (DATE: 01..31)
        !            24:        //     +----+----+----+----+----+----+----+----+
        !            25:        // 7fc | XX | FT | XX   XX |  0 |WEEKDAY (3bit)|  (WEEKDAY: 1..7)
        !            26:        //     +----+----+----+----+----+----+----+----+
        !            27:        // 7fb | KS |  0 |         HOUR (2+4bit)       |  (HOURS: 00..23)
        !            28:        //     +----+----+----+----+----+----+----+----+
        !            29:        // 7fa |  0 |           MINUTES (3+4bit)       |  (MINUTES: 00..59)
        !            30:        //     +----+----+----+----+----+----+----+----+
        !            31:        // 7f9 | ST |           SECONDS (3+4bit)       |  (SECONDS: 00..59)
        !            32:        //     +----+----+----+----+----+----+----+----+
        !            33:        // 7f8 |  W |  R |        CALIBRATION          |  (CONTROL)
        !            34:        //     +----+----+----+----+----+----+----+----+
        !            35:        //
        !            36:        // '0' はデータシートでは '0' で、実際書き込んでも '0' になる。
        !            37:        // 'XX' はデータシートでは '0' だが '1' が書き込める。
        !            38: 
        !            39:        // コントロールレジスタは全ビットを保持。
        !            40:        // ただし b5-b0 のキャリブレーションは未実装。
1.1       root       41:        uint8 ctrl;
                     42:        static const uint8 WRITE        = 0x80; // WRITE BIT
                     43:        static const uint8 READ         = 0x40; // READ BIT
                     44: 
1.1.1.10! root       45:        // 内部のカウンタと毎秒ラッチされるレジスタの2ステージ構成になっている
        !            46:        // ここには制御ビット部分は含まない。
        !            47:        struct calendar {
        !            48:                uint8 sec;              // BCD 秒(00-59)
        !            49:                uint8 min;              // BCD 分(00-59)
        !            50:                uint8 hour;             // BCD 時(00-23)
        !            51:                uint8 wday;             // 曜日(1-7; 7=日曜)
        !            52:                uint8 mday;             // BCD 日(01-31)
        !            53:                uint8 mon;              // BCD 月(01-12)
        !            54:                uint8 year;             // BCD 年(00-99; 西暦年の下二桁)
        !            55:        };
        !            56:        calendar in {}; // 内部カウンタ
        !            57:        calendar ex {}; // 外部レジスタ
        !            58: 
1.1       root       59:        // 秒カウンタの bit7 が STOP ビット
1.1.1.10! root       60:        static const uint8 STOP = 0x80;
1.1       root       61:        // STOP 状態を保持
1.1.1.10! root       62:        uint8 stop {};
1.1       root       63: 
                     64:        // 時カウンタの bit7 が KICKSTART ビット
1.1.1.10! root       65:        // KICKSTART は内部発振器のスタートに使用するが、改良版である
        !            66:        //  M48T02 (K なし)では廃止された。動作は実装しない。
        !            67:        static const uint8 KICKSTART = 0x80;
1.1       root       68:        // KICKSTART 状態を保持
1.1.1.10! root       69:        uint8 kickstart {};
1.1       root       70: 
1.1.1.10! root       71:        // 曜日カウンタの bit6 が Frequency Test ビット
        !            72:        // 動作は実装しない。
        !            73:        static const uint8 FREQTEST = 0x40;
        !            74:        // FreqTest 状態を保持
        !            75:        uint8 freqtest {};
1.1       root       76: };
                     77: 
                     78: class MK48T02Device : public RTCDevice
                     79: {
1.1.1.3   root       80:        using inherited = RTCDevice;
1.1       root       81:  public:
                     82:        MK48T02Device();
1.1.1.6   root       83:        virtual ~MK48T02Device() override;
1.1       root       84: 
1.1.1.3   root       85:        bool Init() override;
1.1       root       86: 
1.1.1.2   root       87:        // 指定したアドレスからの文字列を読み出す (内蔵 ROM からのアクセス用)
                     88:        std::string PeekString(uint32 addr) const;
                     89:        // 指定したアドレスに文字列を書き込む (内蔵 ROM からのアクセス用)
                     90:        bool WriteString(uint32 addr, const std::string& data);
1.1.1.9   root       91:        // 全域をゼロクリアする (内蔵 ROM からのアクセス用)
                     92:        void ClearAll();
1.1.1.2   root       93: 
                     94:        // BusIO インタフェース
                     95:        // (内蔵 ROM からのアクセス用に特別に public にしてある)
1.1.1.7   root       96:        uint64 Read(uint32 offset);
                     97:        uint64 Write(uint32 offset, uint32 data);
                     98:        uint64 Peek(uint32 offset);
                     99: 
1.1.1.10! root      100:        // 内蔵カウンタへのアクセス。
        !           101:        // ラッチカウンタではないことに注意。
        !           102:        uint GetSec() const override;   // 秒(0-59)
        !           103:        uint GetMin() const override;   // 分(0-59)
        !           104:        uint GetHour() const override;  // 時(0-23)
        !           105:        uint GetWday() const override;  // 曜日(0が日曜)
        !           106:        uint GetMday() const override;  // 日(1-31)
        !           107:        uint GetMon() const override;   // 月(1-12)
        !           108:        uint GetYear() const override;  // 年(西暦)
        !           109:        uint GetLeap() const override;  // うるう年カウンタ(0..3)
        !           110: 
1.1.1.2   root      111:  protected:
                    112:        // BusIO インタフェース
                    113:        static const uint32 NPORT = 2048;
                    114: 
1.1.1.10! root      115:        // 仮想RTCからのクロック
        !           116:        void Tick1Hz() override;
        !           117: 
        !           118:        // 内蔵カウンタへのアクセス。
        !           119:        void SetSec(uint v) override;
        !           120:        void SetMin(uint v) override;
        !           121:        void SetHour(uint v) override;
        !           122:        void SetWday(uint v) override;
        !           123:        void SetMday(uint v) override;
        !           124:        void SetMon(uint v) override;
        !           125:        void SetYear(uint v) override;
        !           126:        void SetLeap(uint v) override;
        !           127: 
1.1       root      128:  private:
                    129:        // バイナリ <-> BCD 変換
                    130:        static inline uint8 num2BCD(uint8);
                    131:        static inline uint8 BCD2num(uint8);
                    132: 
1.1.1.10! root      133:        // 年のデコード。
        !           134:        uint DecodeYear(uint bcd_year) const;
        !           135: 
1.1       root      136:        // コントロールレジスタへの書き込み
                    137:        void WriteCtrl(uint32 data);
                    138: 
1.1.1.9   root      139:        DECLARE_MONITOR_CALLBACK(MonitorUpdate);
                    140: 
1.1.1.3   root      141:        // ファイル
1.1       root      142:        std::string filename {};
1.1.1.3   root      143:        MappedFile file {};
                    144:        uint8 *mem {};
1.1       root      145: 
                    146:        // 時計
                    147:        MK48T02Clock reg {};
                    148: 
1.1.1.10! root      149:        // うるう年補正量
        !           150:        uint adjust_leap {};
        !           151: 
        !           152:        // 外部レジスタをホールド(更新停止)しているときは true
        !           153:        bool hold {};
1.1.1.9   root      154: 
                    155:        Monitor monitor { this };
1.1       root      156: };

unix.superglobalmegacorp.com

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