ねこめもmkII(マークツー)

本家ねこめも (http://nekomemo2.site)の補助用。 主に勉強ネタ。

19日目(アプリ起動まで)

また間が空いたため、18日目を読み返しながら進めている。
感覚的には、実際の自分の理解度は5日目辺りで止まっているので、なかなか進まない。

前回はimgファイルの中身を見る前に他のファイルを追加しなかったので、ファイルリストを出力してもHaribote OSしか出てこなかった。
他のファイルを出すための方法は、いつも参照させていただいているブログにあった。

まず普通のテキストファイルを作る。
 $ echo abcde >> text.txt
として、abcdeとしか書いてないtext.txtを新規作成。
もう一つ、本書に記載されているhlt.hrbを準備してみる。3日目に作成した方法と同じ。
 $ nasm hlt.nas -o hlt.hrb
これらをharib16aのimgファイルに書き込む。
自分の環境では以下。
 $ make -r haribote.img
 $ mcopy -i haribote.img hlt.hrb ::
 $ mcopy -i haribote.img text.txt ::
できたharibote.imgを起動して、結果を確認。
 $ qemu-system-i386 -m 32 -fda haribote.img -enable-kvm

コンソールでファイルリストを出力すると、
HARIBOTE.SYS
HLT.HRB
TEXT.TXT
が出力される。成功。
harib16eのときに、Makefikeに「mcopy -i haribote.img hlt.hrb ::」を追加して、hlt.hrbの動作(フリーズするだけ)も確認できた。

最初はtypeコマンドでtext.txtを見ると、abcdeの最後に怪しい改行コード(?)が出てしまう。
これを踏まえてharibo16b以降を続ける。
ここで出てくるstrncmp関数も無かったため、同じブログに記載されているコードをそのまま使わせていただきました。
ただし自分の場合は別ファイルにせず、bootpack.cのstrcmp同様、更に追記。
haribo16bの修正で、謎の改行コードは消える。
(strcmpとstrncmp関数は最終的にconsole.cに入る)

気になるのは、
 $ hexdump -C haribote.img
とすると、最後の行に

00009a70 00 00 00 63 6f 6e 73 6f 6c 65 00 74 61 73 6b 5f |...console.task_|
00009a80 61 00 20 00 3e 00 6d 65 6d 00 74 6f 74 61 6c 20 |a. .>.mem.total |
00009a90 20 20 25 64 4d 42 00 66 72 65 65 20 25 64 4b 42 | %dMB.free %dKB|
00009aa0 00 63 6c 73 00 6c 73 00 66 69 6c 65 6e 61 6d 65 |.cls.ls.filename|
00009ab0 2e 65 78 74 20 20 20 25 64 00 74 79 70 65 20 00 |.ext %d.type .|
00009ac0 46 69 6c 65 20 6e 6f 74 20 66 6f 75 6e 64 2e 00 |File not found..|
00009ad0 42 61 64 20 63 6f 6d 6d 61 6e 64 2e 00 00 00 00 |Bad command.....|
00009ae0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00168000

と、謎のデータがくっついている。これが気になる。
harib16dのbootpack.cファイルの分割で見直しを行ったが、まだ解決していない。

あとは個人的にどうしても構造体のFILEINFOについて納得できず、検索しまくった。
18日目に出てきたとき、以前保存した情報を今になって取り出したということで納得したが、19日目でもやはり気になってしかたがない。
なのでここでも、とにかくそういう風に作られているため、と考えて先進める。
(でも今後も参考になると思うブログを集めて、いつも通りリンクさせていただいています)

FAT12フォーマットについては、まだ自分は完全には理解ができてないのでもう一度見直す必要がある。
それより前からFATの領域がなぜ二つあるのかずっと引っ掛かっていたが、この章の中で「大切な内容だからバックアップのため」とさらっと書かれていて拍子抜けした。
後からこんな感じでいろいろわかってきたりするので、続けることに意味があると思う。

 


今回参照させて頂いたサイト:
http://bttb.s1.valueserver.jp/wordpress/blog/2018/02/16/makeos-19
https://no000.hateblo.jp/entry/2020/02/03/180959
https://yn0014.hatenablog.com/entry/2019/04/02/232944
https://yuyubu.hatenablog.com/entry/2018/06/09/30日OS自作本18日目
https://github.com/HobbyOSs/opennask/wiki/%EF%BC%93%E6%97%A5%E7%9B%AE---%E3%83%AA%E3%83%B3%E3%82%AF%E5%BE%8C%E3%81%AEimg%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%AF%94%E8%BC%83

18日目(前日の修正、カーソル、コマンド)

また間が空いたので、17日目を読み返しながら編集。

現時点でbootpack.cのワーニングがいくつか出ていて、動作しつつも気になっていた。
一応起動はできてるが、確認したところやはりbootpack.hの修正ができてなかった。
また、ちょっとしたタイプミスでよけいなワーニングが出ていた。
他にも気になるワーニングがあるが(例のsprintf)、明らかなタイプミス以外は保留して続ける。

harib15a、harib15b、harib15c、harib15d、harib15eまではだいたい前にやったことの繰り返しと言うか、おさらい的な話になる。
特に関数なども増えないので、ここまではbootpack.cのみの編集。
それでもあいかわらずタイプミスや、console_taskで「int x,y;」を忘れただけでかなり悩んだ。
とにかく自分には大変だったので、ここのプログラムもちゃんと読めるように改めて復習したい。

harib15fのclsコマンドで使用するstrcmpという関数は、sprintf同様この環境では使えなかった。
検索したところ、以前から参照させていただいているブログにコードが書かれていたので、それをそのままbootpack.c内に追記した。
(別ファイルにするとまたMakefileがめんどくさいので)

それにharib15gも大変だった。
何がというと、情報量。ここしばらくbootpack.cの編集のみで楽をしていたため、頭の中を戻すのに苦労した。
本書に書かれている通り、いったん3日目に戻って読み直しをした。
(あまり思い出せなかったが…)

3日目にシリンダから読み込んで保存した内容を、今になって表示できるように引っ張り出した、ということで良いだろうか。

それと久々にバイナリデータを確認。1日目以来だと思う。
一応make imgして現在のimgファイルを作り、
 ghex haribote.img
でGhexを起動、2600あたりを確認。
HARIBOTE.SYSについては本書のようになっているはず。ipl10.nasなどを追加してなければ他は違うが、とにかくアドレスは同じはず。

あとは、自分の環境はlinuxなので、dirコマンドはlsに修正した。
それとメモリの数字の表示を%dにすること。
環境の違いはともかくできるだけ本書に沿った方法で作業しているが、この程度の変更なら問題なく先に進められると思う。

 


今回参照させて頂いたサイト:
https://wisteria0410ss.hatenablog.com/entry/2019/02/21/151455
http://bttb.s1.valueserver.jp/wordpress/blog/2018/02/12/makeos-18/

17日目(キーボードからの入力)

今回はやっていることが過去のおさらいのような感じで、比較的わかりやすい。
しかしC言語はあいかわらずよくわかってないので、やったことと引っかかったことを書いておく。

今回でカウンタを消去、さらにtask_bにさよならして、console_taskに書き換え。
harib14bでwin_bなどをconsにするのに気づかず、かなりエラーを出した。
ほぼbootpack.cの編集ばかりだが、書き換えたり書き加えたりするところがかなり長くなってるので、タイプミスが辛い。

ちなみにbarib14dで8以外の数字でもいいというので、試しに16にしてみたりしたが、特に大きな変化がなかったので戻した。
(余計なところまで変えてしまって、task_aの入力が一文字置きになったりもしたが、コンソールのほうはそのままだった。理由不明)

harib14fのCaps Lockは、自分のPCでは効かなかった。普通にシフトキーで大文字が出るだけ。
ちなみにコラムにあるような、左右のシフトキーに差は出なかった。
とりあえず先に進めて、harib14gでは正しく動いた。LEDのランプも実機でなくても普通に点灯する。

キーボードのハード的な部分との絡みが出てきて、やっていて楽しい。
が、ウィンドウや文字コードの変換のところの入力はきつかった。
タイプミスのエラーを潰していくのは時間の無駄なので、だめだったら素直にコピペするほうが良さそうだ。

別件だが、QEMUで実行する際の解像度は上げたままなので、それに比較するとコンソールに限らず各窓がかなり小さい。
ここでいろんな人がサイズをカスタムすることが多い理由がよくわかった。
この章は内容が自分でもわかりやすかったのでいじってみたくなるが、あまり差異を増やすとちょっとのことでもわからなくなるので、このまま本書通りに続ける。