|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2018 [email protected]
4: //
5:
6: #pragma once
7:
8: #include "device.h"
9: #include "rtc.h"
10:
11: // MK48T02 の時計部分のレジスタと内部状態
12: struct MK48T02Clock
13: {
14: // コントロールレジスタは以下の3つを保持。
15: uint8 ctrl;
16: static const uint8 WRITE = 0x80; // WRITE BIT
17: static const uint8 READ = 0x40; // READ BIT
18: static const uint8 SIGN = 0x20; // SIGN BIT (?)
19:
20: // 秒カウンタ(BCD)
21: uint8 sec;
22: // 秒カウンタの bit7 が STOP ビット
23: static const uint8 STOP = 0x80;
24: // STOP 状態を保持
25: bool stop;
26:
27: // 分カウンタ(BCD)
28: uint8 min;
29:
30: // 時カウンタ(BCD)
31: uint8 hour;
32: // 時カウンタの bit7 が KICKSTART ビット
33: static const uint8 KICKSTART = 0x80;
34: // KICKSTART 状態を保持
35: bool kickstart;
36:
37: // 曜日カウンタ
38: uint8 wday;
39: static const uint8 FREQTEST = 0x40; // Frequency Test (未実装)
40:
41: // 日カウンタ
42: uint8 mday;
43: // 月カウンタ
44: uint8 mon;
45: // 年カウンタ (0 が 1970年)
46: uint8 year;
47: static const int YEAR_EPOCH = 1970;
48: };
49:
50: class MK48T02Device : public RTCDevice
51: {
52: typedef RTCDevice inherited;
53: public:
54: MK48T02Device();
55: virtual ~MK48T02Device();
56:
57: virtual bool Init();
58: virtual bool InitRTC();
59:
60: virtual uint64 Read8(uint32 addr);
61: virtual uint64 Read16(uint32 addr);
62: virtual uint64 Read32(uint32 addr);
63: virtual uint64 Write8(uint32 addr, uint32 data);
64: virtual uint64 Write16(uint32 addr, uint32 data);
65: virtual uint64 Write32(uint32 addr, uint32 data);
66: virtual uint64 Peek8(uint32 addr);
67:
68: virtual bool MonitorUpdate();
69:
70: virtual void ClockIn();
71:
72: private:
73: // バイナリ <-> BCD 変換
74: static inline uint8 num2BCD(uint8);
75: static inline uint8 BCD2num(uint8);
76:
77: // コントロールレジスタへの書き込み
78: void WriteCtrl(uint32 data);
79:
80: std::string filename {};
81: int fd = 0;
82:
83: // バイト順はファイルイメージそのままで、2040バイト。
84: uint8 *mem = NULL;
85:
86: // mmap する長さ
87: int memlen = 0;
88:
89: // 時計
90: MK48T02Clock reg {};
91:
92: // レジスタとして読める値を定数にすることで、仮想マシン状態を
93: // 常に同じ状態にするためのパフォーマンス測定用フラグ。
94: // なお NVRAM 部分は影響されない。
95: bool force_fixed = false;
96: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.