Yabu.log

ITなどの雑記

30日OS自作本23日目

23日目の内容です。

アプリケーションのメモリ管理の導入とGUI周りのAPIの強化をやります。

f:id:yuyubu:20180621215939p:plain

アプリケーションもメモリ管理(malloc)をする

気になったことがあります。winhelo2.hrbが7.6KBもあることです。 (略)なんでかなーと思ってwinhelo2.hrbをバイナリエディタでのぞいてみたら00がいっぱいです。 (略)ソースに戻って調べてみたところ、原因はwinhelo2.cのchar buf[150*50]でした。 (略)アセンブラでいうとRESB 7500ってとこです。

とのことですので調べてみました。

49                                          [SECTION .data]
50 00000013 00 00 00 00 00 00 00 00 00 00       ALIGNB  16
     0000001D 00 00 00
51 00000020                                 _buf:
52 00000020 00 00 00 00 00 00 00 00 00 00       RESB    7500
     0000002A 00 00 00 00 00 00 00 00 00 00
...ずっと0なので略...
     00001D62 00 00 00 00 00 00 00 00 00 00

メモリ管理をしないとこんな風にデータセクションに値が確保されて7500KBも増えるということですね。 アプリケーションから利用できるメモリ確保APIを使って実行ファイルの容量を減らしています。

char *buf;
int win;

api_initmalloc();
buf = api_malloc(150 * 50); //新規

約7500KB程度減っています。

$ ls -alt winhelo*.hrb
-rw-r--r--  1   staff   387  6 20 13:26 winhelo3.hrb
-rw-r--r--  1   staff  7888  6 20 13:26 winhelo2.hrb

一般的に配列を宣言すれば、そのサイズ分実行ファイルに含まれるということでしょうか。

画像系のAPI

ウインドウに点を打つ
EDX=11
EBX=ウインドウの番号
ESI=表示位置のx座標
EDI=表示いちのy座標
EAX=色番号

f:id:yuyubu:20180621215005p:plain

画面の任意の座標にドットを書くAPIです。VRAMの番地を直接指定するのではなく、シート(ウインドウ)上の1ドットを変えています。

星座

この乱数は結局は計算で作っているものであって、PCの中にサイコロがあるわけではないので、もう一度アプリを起動しても結果はいつも同じになります。

rand()の有名な特性ですね。大学の頃のアルゴリズムの授業で、ソートプログラム用のデータを作ったら幾つ作っても同じデータになるんだけど???みたいな学生が大量に発生した思い出があります。

さて今回もシードを設定していないので毎度同じ位置にドットがきてしまいます。書籍中の画像と全く同じ配置になっていますね。

f:id:yuyubu:20180621215546p:plain

もう一度アプリを起動しても、結果はいつも同じになります。だから、筆者が「make run」して眺めた夜空と全く同じものを、読者の皆さんも眺めることになります。

srand((unsigned int) time(null));こんな感じで時間を与えて初期化できるのですがtime()の入っているtime.hがinclude出来ない。

../../z_tools/gocc1 -I../../z_tools/haribote/ -Os -Wall -quiet -o stars.gas stars.c
stars.c:2:18: time.h: No such file or directory

多分ztools配下のhariboteに追加すればいいんだろうけど。

$ls ../../z_tools/haribote/
errno.h     golibc.lib  harilibc.lib    math.h      stdarg.h    stdio.h     string.h
float.h     haribote.rul    limits.h    setjmp.h    stddef.h    stdlib.h

とりあえずsrand(20)を実行して著者と違う並びで星座を表示してみました。

f:id:yuyubu:20180621215739p:plain

GUI

  • 線を引くプログラム
  • RPG風の画面キー入力で動く*のウインドウ
  • 強制終了じに画面が消えない事象の修正

などを行いました。 この辺はAPI追加したりドット表示の延長上の話なのであまりOSが関係ないので流し読み。

感想

  • 例のアルゴリズムの授業ですが、最終テストが筆記だったのでsrand(time(null))は暗記して臨んだ思い出があります。
  • Xボタンを押してウインドウを消したい、みたいな流れにならないのがちょっとモヤモヤする。