その1で動いた!!
昨日の方法で、ROSe に ^C の機能を実装してみた。
実際は、試行錯誤の末、なんとか動いたって感じだけれど、
とりあえず、考えた通りに動いてくれたので、嬉しいぞっと!!
まず、SPレジスタの内容の保存先は、とりあえず、0x0500番地とした。
0x0400番地から、BIOS DATA AREA となっているので、その後の領域に配置してみた。
まぁ、これは、適当だ。
SPSAVEADDR EQU 0x0500
次に、コマンド待ちに入る直前に、このアドレスに、SPレジスタの内容を保存する。
; SPレジスタの内容を保存 MOV [SPSAVEADDR], SP key_read: ; プロンプト表示 MOV SI, promptmsg CALL puts
最後に、キー入力取得ルーチンで、^C のチェックを行う。
チェック部分は、こんな感じ。
getkey_read: ; キーボード入力データ読み込み MOV AX, 0x1000 ; 拡張キーボード入力データ読み込み INT 0x16 ; BIOSコール(キーボードサービス) CMP AL, 0x03 JNE getkey_end getkey_ctrl_c: MOV SI, CTRL_C CALL puts MOV SP, [SPSAVEADDR] PUSH key_read getkey_end: RET CTRL_C: DB "^C", 0x0A, 0x0D, 0x00
ここでのポイントは、読み込んだキー入力データのアスキーコードを、
即値:0x03と比較しているところ。
全ての BIOS が、このように変換しているかどうかは、ちょっと分からないが、
QEMU のソースを追うと、コントロールキーと同時に押された場合は、
'C'なり'c'のコードではなく、'C'-0x40 のコードを返してくる。
始めは、INT 16h AH=12h でシフトステータスを取得し、
コントロールキーが押されているか判断してから、
'C'なり'c'のコードが入力されたか判断してみたのだが、
全く思ったように動いてくれなかったので、QEMU のソースを追ってみたわけだ。
やはり、実際にやってみないと気が付かない事って、結構あるんだなぁ。
また、一つ、勉強になりました。
まだ、QEMU 上での確認しか出来ていないので、
明日は、実機上で動作確認をしてみよう。
うまく動いたら、いよいよ、FAT 対応に着手しようかな。