自作OSで時間を使いたい

この記事は 自作OS Advent Calendar 2020 の3日目です。
Advent Calendar初めてですがよろしくお願いします。 

なぜ今RTCなのか

現在時刻を取る方法として、UEFIとかそういうのを今は使うのでしょうか
私は最新、今時な方法がとても危ういため、最もわかりやすいであろうレガシーなRTCを使っていきます。せっかくだし誰か今どきな方法教えて

早速使ってみよう

 まず割り込み不許可の状態で、初期化を行います

io_out8(0x70, 0x0b); // Status Register Aを初期化する NMIを無効化
char prev = io_in8(0x71) | 0x10; // IRQ8に割り込ませるための設定っぽい?
io_out8(0x71, prev);


RTCの割り込みは8番です
(今回の例ははりぼて準拠なので28番です)

set_gatedesc(idt + 0x28, (int)asm_inthandler28, 2 * 8, AR_INTGATE);

 

 そうすると1秒ごとに割り込みが来るようになります
ここで一つ注意があります
割り込みの最後にRTCにデータを送ったりしなくてはいけません

 

io_out8(0x70, 0x0c);
io_in8(0x71);

 
こうしないと割り込みが再度行われないらしいです

さて
時刻が変わったとのことなので時刻を取って表示してみましょう!

初めに時刻がもうすぐ更新されないか調べます

io_out8(0x70, 0x0a);
if(io_in8(0x71) & 0x80) == 0)

これで1(true)になったら更新はしばらく来ないのでデータを読み取っていきます

時刻の取り方はいたってシンプル(?)

io_out8(0x70, addr);
int data = io_in8(0x71);

これだけなのですがaddrにはとりたいデータを指定します
0x00: 秒 0x02:分 0x04:時
0x07:日 0x08:月 0x09:年 下2桁 0x32:年 上2桁

昔のハードウェアっぽい付け足し感が垣間見えますね(笑)

これで終わりです!お疲れ様でした!


最後に 

私が作ったOSを少し宣伝させてください
はりぼてOSを改造したOSになっています
上で上げたRTCを使う実装が組み込んでありますので
参考にしてみてください!

github.com


ありがとうございました!