その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 対応に着手しようかな。