よもぎのメモ帳

備忘録的な感じで技術的なことをストックしていきます。

よもぎのOS自作入門 14日目/30日

はじめに

これは2020年夏休み企画「30日でOS自作してみよう!」14日目の記事です。

企画についてはこちら

y0m0g1.hatenablog.com

昨日やったことを書いていきます。

昨日の進捗

f:id:y0m0g1:20200901174218p:plain

f:id:y0m0g1:20200901174237p:plain
動くウィンドウ

画面をより高い解像度にするためのあれこれを整えて、キーボードからの入力を翻訳して文字入力ができるようにし、 マウスの左クリックにあわせてウインドウが動くようになりました。

昨日やったこと

高解像度にするために、VBEを用いることにしました。

もともと、IBMが1987年に発表した表示回路企画であるVGA*1を利用していましたが、640x480までしか表現できません。*2 それじゃ足りなくなってきて、各メーカーが独自の拡張規格を使うようになってきましたが、不便だということでVESAという業界団体で統一規格として出したのがVESA BIOS extentionつまりVBEとなっています。*3 このVBEだと1280x1024までしか表現できないみたい*4なので、たぶんいまは別のものを利用していると思うのですが…… わからないUEFIだといい感じにしてくれるんですか?

ちなみにQEMUは1280x1024に対応していないらしい

;VGA 320x200 8bit-color mode
MOV AL,0x13
MOV AH,0x00
INT 0x10

;VBE 640x480 8bit-color mode
MOV BX,0x4101
MOV AX,0x4f02
INT 0x10

f:id:y0m0g1:20200901225224p:plain
640x480

f:id:y0m0g1:20200901225241p:plain
1024x768

高解像度になると当然文字とかも小さくなって粗が目立ちにくくなりました。

せっかく高解像度にしたのでこれ以降は640x480でやっていく予定です。*5

次にやったことはキー入力に対応することです。キーボードに入力があると割り込みが発生し、キーの値が送られてくるわけですが、ASCIIコード表と違って直感的ではないです。

  • 0x01:ESC key
  • 0x02:0
  • 0x03:1
  • 0x10:Q
  • 0x11:W
  • 0x1C:Enter

一例を出すとこんな感じですが、キーボードの配置に近い形になっています。 ここで本ではJISキーボード(フルサイズ)を利用していることを想定していて、例えば0x1A=@となっているのですが、 私はUSキーボード(80%サイズ)*6を使っているので0x1A=[となっていてちょっと違っています。

そのあたりは注意して自分の使ってる環境に合わせます。

キー入力の値からchar型static配列への射影を考えて実装すれば、文字入力はできました。

f:id:y0m0g1:20200901230027p:plain

あとは、文字が入力されるたびに右にカーソルを移動させ、BackSpaceが入力されたら一文字をスペースで上書き(背景色で塗りつぶし)して左にカーソルを移動する、 みたいなことで、テキストボックスみたいなことが出来上がりました。

f:id:y0m0g1:20200901230229p:plain
テキストボックス

ウインドウの移動は、マウスを左クリックしたら、マウスカーソルから決められた相対位置にウインドウを移動させるということでできました。 ウインドウの移動は進捗のところにあります。

今日も一日頑張るぞい!

*1:Wikipediaより

*2:参考

*3:Wikipediaより

*4:version2.0以降だと1600x1200は表せそう参考

*5:本では「小さくて見にくくなるから」320x200に戻しています

*6:テンキーレス