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がぶん回ります。
恐らく、実機でも、ぶん回ると思いますが、環境に優しくなさそうなので、やめておきました。
入力チェックを、ビジーウェイトでチェックしているのかな?