- 追加された行はこの色です。
- 削除された行はこの色です。
*IPL改造
OSが起動するとき、「Loading OS......」とか「Booting......」のような文字が流れたりするものがありますよね。とてもカッコイイなぁとおいらは思うのですが、OS自作入門では川合さんの「そんなの表示する時間とクロックと電気代がもったいない」と言う考えで省かれてしまっています。
しかし、自分流に改造しまくっていいのがOS自作入門です。起動中の文字をバッチリ表示させましょう!
**文字を用意する
まずは文字を用意しましょう。場所は、msg_errの下に書くことにします。
msg_loading:
DB "Booting OSAkkie "
DB 0
**putloopをサブルーチンにしてしまう
メッセージを表示するために、エラー表示に使っていたputloopを使うことにします。しかし、ループが終わるとfinに飛んでHLTループになってしまいますので、この部分をどうにかします。
putloop:
(中略)
JE ret ; ココ
(中略)
JMP putloop
error: ; putloopの下にまるごと移動させる
MOV AX,0
MOV ES,AX
MOV SI,msg
CALL putloop ; ココ
;文字表示が終わったらココに戻ってきて、そのままfinに進む
fin:
HLT
JMP fin
putloopで書き換えたジャンプ先のretラベルはローカルラベルになっているので、「.」をとります。
(最後の方)
.ret: ; この行は消す
ret:
RET
**文字を表示させる
さて、いよいよ文字を表示させます。まずは"Booting OSAkkie "の文字を表示させるサブルーチンを作ります。
loading:
MOV SI,msg_loading
CALL putloop
RET
次に、表示させたいところでCALLします。場所は、entryラベルの一番最後にしました。
MOV AX,0 ; レジスタ初期化
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
CALL loading ; ココ
これでめでたく起動時に"Booting OSAkkie "の文字が表示されるようになります。
**読み込むごとにドットを表示する。
文字が出たのはいいのですが、"Booting OSAkkie "の文字が出ただけではさみしいです。そこで、フロッピーの読み込みが進むごとにドットが表示されるようにします。
(msg_loadingの下に追加)
msg_loadingdot:
DB "."
DB 0
(loadingの下に追加)
loadingdot:
MOV SI,msg_loadingdot
CALL putloop
RET
ココまでは先ほどと同じです。ただし、文字表示は少し工夫する必要があって、文字表示の前と後でレジスタの値が変わらないように、PUSH/POPするようにします。文字表示ではAXとBXしか使わないので、この2つをPUSH/POPします。
(中略)
JB readfast ; DH < 2 だったらreadloopへ
PUSH AX ;ココから
PUSH BX
CALL loadingdot ; 画面にdotを一個増やす
POP BX
POP AX ;ココまで
これで、シリンダが変わるごとにドットが増えるようになります。この文字表示を1つ前の判定の直前に置いたりすると、表示されるドットの数が変わるので、お好みで表示場所を変えてみてください。