INT 16h AX = 00h or 10h で CPU がブン回る件

以前の記事(INT 16h (AH=00) - Slow Life & Slow Programming)で、
CPU がブン回る事象は確認済みでしたが、
ソースを追いかけた末、ようやく、裏付けが取れました。


INT 16 handler を追いかけていくと、AX = 00h or 10h の時だけ、別処理に流れます。
別処理の先頭で、キーの入力があるかどうかチェックを行っています。
具体的な方法は、BIOS DATA AREA に用意されている、
キーボードバッファ制御用ワード 0040:001A(head) と 0040:001C(tail) とを比較し、
2つの値が異なる値になるまで、グルグル繰り返し処理を行っています。
headは、入力データの先頭を指し示しており、
tailは、空きバッファの先頭を指し示しています。
head と tail が等しい場合は、有効な入力データが空である状態という事になります。
この状態で、何かしらキー入力が発生すると、
tailが一つ先に進み、head と tail が異なる値となります。
その後、バッファから有効な入力データを取り出すと、
headも1つ先に進み、head と tail が再び等しい値となります。
この比較処理の直前で、割り込みを禁止しているのは、
比較処理の途中で上位の割り込みが発生し、不整合が発生する事を防止しているようです。
キーボード割り込みは、INT 09h なので、なんとなく納得。


とりあえず、CPU がブン回る件については、すっきりしたけれども、
割り込み処理内部で、こういう処理は、ありなんだろうか?
結局、上位の割り込み(キーボード入力)がない限り、ループを抜けられないわけだから、
HLT で待っていても良いような気もするんだが...
割り込み処理内部で HLT を使うのも、まずいのかなぁ?


う〜む。