OSが起動するとき、「Loading OS......」とか「Booting......」のような文字が流れたりするものがありますよね。とてもカッコイイなぁとおいらは思うのですが、OS自作入門では川合さんの「そんなの表示する時間とクロックと電気代がもったいない」と言う考えで省かれてしまっています。
しかし、自分流に改造しまくっていいのがOS自作入門です。起動中の文字をバッチリ表示させましょう!
まずは文字を用意しましょう。場所は、msg_errの下に書くことにします。
msg_loading: DB "Booting OSAkkie " DB 0
メッセージを表示するために、エラー表示に使っていた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つ前の判定の直前に置いたりすると、表示されるドットの数が変わるので、お好みで表示場所を変えてみてください。