INT 16h (AH=00)

キーボード入力読み込みです。
戻り値は、AH = SCAN CODE、AL = ASCII CODE のようになります。
なので、まぁ、ざっと書いてみると、こんな感じになります。

	; スタートアップメッセージ表示
	MOV	SI, startupmsg
	CALL	puts

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

	CALL	putchar
	CALL	putscancode

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

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

INT 16h (AH=00)では、キー入力があるまで、ブロックします。
キーが入力されると、復帰して、一文字出力。
ESCキーが入力された場合は、処理を終了。
それ以外の入力の場合は、再度、入力待ちへ戻ります。
一文字出力用のルーチン(putchar)は、こんな感じ。

;
; 一文字出力
;   AL=出力する文字
;
putchar:
	PUSH	AX		; AXレジスタ退避
	PUSH	BX		; BXレジスタ退避

	MOV	AH, 0x0E	; 文字表示サービス
	MOV	BX, 00FFh	; BH=表示ページ, BL=カラーコード
	INT	10h		; ビデオBIOSサービスコール

	POP	BX		; BXレジスタ復元
	POP	AX		; AXレジスタ復元

	RET

INT 16h (AH=00)の戻り値 AL の値を、そのまま、INT 10h (AH=0E)に渡している感じですね。
putscancodeの方は、戻り値 AX の値を、画面右隅に表示する為の物で、確認用です。


実験してみると分かりますが、Qemuだと、CPUがぶん回ります。
恐らく、実機でも、ぶん回ると思いますが、環境に優しくなさそうなので、やめておきました。
入力チェックを、ビジーウェイトでチェックしているのかな?