INT 16h (AH=01)

キーボードステータス読み込み。
これは、読み込みと違い、ブロックしません。
また、入力があった場合、入力値を破棄しません。
入力が無い場合は、ゼロフラグが立ちます。
つまり、入力の有無を調べる為に使えるわけです。
そういうわけで、読み込みサービスとうまく組み合わせれば、
ちょっとだけ、環境に優しい処理が出来そうです。
やってみましょう。

readloop:
	; キーボードステータス読み込み
	MOV	AX, 0100h
	INT	16h

	JNZ	readkey		; 入力文字があれば、読み込む
	HLT			; ちょっと休憩
	JMP	readloop	; 繰り返し

readkey:
	; キーボード一文字読み込み
	MOV	AX, 0000h
	INT	16h

	CALL	putscancode	; 戻り値を出力
	CALL	putchar		; 文字出力

	CMP	AL, 1Bh		; ESCコード
	JNZ	readloop

fin:
	MOV	SI, shutdownmsg
	CALL	puts
finloop:
	HLT			; 何かあるまでCPUを停止させる
	JMP	finloop		; 無限ループ

キーボードから一文字読み込む前に、入力があるかどうか、確認します。
無ければ、少し休憩です。
HLTは、完全に停止するわけではなく、何らかの割り込み等があれば、ちゃんと起きてくれます。
入力があるのを確認してから、読み込みを行っているので、
前回のように、CPUがぶん回るような事は、どうやら避けられたようです。


いや〜、めでたし、めでたし。