30日OS自作入門28日目(Win10)

はじめに

今回の開発でOS自体の開発は終わりになるようです。長ったけどなんか悲しい気分ですね。(まだアプリケーションもあるので、終わったわけではないですが…)

目次

ファイルと日本語表示

alloca(1)

手始めに、素数のを表示するプログラムを作るようです。

その過程で、sosu2.cを作るときに出る。

Warning : can't link __alloca

なんだこいつ…
こいつのせいでビルドも通らないよ…的な状況になってしまします。

なにやらsosu2君がなかなかコンパイルを通してくれないので、著者の.hrbを利用させてもらってごり押ししました。

実行すると

allocaというのは、ページング方式等で4KB以上を扱う場合に利用する関数のようですね。

alloca(2)(harib25b)

実際にalloca関数を作るようです。

alloca関数がお願いされていることというのは、EAXに入っている数値分のバイトをスタックに追加してほしいということになります。しかし、スタック領域にはJMPする先の番地も記録しているので、そこを注意してやるといった感じですね。

これにより、スタック領域で大きい変数を使えるようになったので、WinheloとWinhelo2を変更して実行してみると

ファイルAPI(harib25c)

・構造体TASKにファイルハンドラを含めたのは、hrb_apiからも使えるようにするため

・cmd_appの処理は、アプリがクローズしないで終了したファイルハンドラが迷子にならないように

・app_make.txtに一部変化があるので注意

実行すると

コマンドラインAPI(harib25d)

コマンドラインに入力した文字を取得することができるAPI
これがあれば、CLIアプリケーションの幅が大幅に広がりますね。

修正内容はかなり単純なので、コードを見たほうがわかりやすいと感じます。

実行すると

日本語表示(1)(harib25e)

ついに来たぁ!nihonngo!日本語!

・構造体TASKに、管理用変数を入れることによりコンソールごとに変更が可能になる

・日本語ファイルを読み込めたかの判定は、01区01点が0x00であるかで判定

実行すると

日本語表示(2)(harib25f)

全角文字は半角文字より複雑で、以下のようないろいろな要素を使って扱うようです。

・1バイト目が区で、2バイト目が点

・task->langbyte1は全角の1バイト目を暗記しておくのに使う

・改行の際には、1バイト目が干渉しないようにその分を進めておく

・シフトJSなので、組み込むipl10.nasはシフトJSにエンコードしておく

注)このipl10.nasを読み込む際は、Shift-JSでないと読み取れない

実行すると

日本語表示(3)(harib25g)

前回の漢字コードが一部欠損していた原因は、ipl10.nasによって読み込まれる大きさを超えていたからのようです。
なので、CYLSを20に変更すればいいようですね。

あとは、当時Linuxで使われていた日本語EUCを実装するそうで、langmodeが2として入るようです。

実行すると

メモ

・バイナリデータでファイルの種類の判別をするのは見にくいから、ファイルの先頭に指定の文字形式で記載できるようにする?(ただの思い付き)

最後に

次のharib26aでOS自体は完成のようですね。あと少しだけど、マイペースにやっていきまーす!