3

画面内の単一の文字を移動する emu8086 で記述された単純な EXE コードがあります (今のところ):

プレビュー

あの黄色い「*」は矢印キーで動きます。

問題は、エミュレータが 16 個のキーを押すことです。つまり、キーをすばやく押す (またはキーを押したままにする) と、キーの押下がスタックに保持され、それらに基づいて「*」が移動します。例えば:

組立キープレス

上の写真では、「*」は、前に押したキーに基づいて 14 回移動します。

キープレスをスタックに保持したくありません。スタックではなく、最後に押されたキーに基づいてリアルタイムの反応を得るにはどうすればよいですか?

PS: これは、ユーザーからキーを押して、現在の場所に空の文字を出力し、「*」を新しい場所に移動する部分です。

check_for_key:
    ; === check for player commands:
    mov     ah, 01h
    int     16h
    jz      no_key

    mov     ah, 00h
    int     16h

    mov     cur_dir, ah

    ; print ' ' at the location:
    mov     al, ' '
    mov     ah, 09h
    mov     bl, 0eh ; attribute.
    mov     cx, 1   ; single char.
    int     10h

    call    move_star
4

1 に答える 1

6

BIOS は、常にバッファ内のキーボード入力を処理します。独自の割り込みハンドラをインストールすることでこれを回避できますが、それはおそらくやり過ぎです。

また、ルーチンがキーの繰り返しの遅延よりも速いことを確認することもできます。

ただし、簡単な修正として、次のように入力チェックを変更できます。

check_for_key:
    ; === check for player commands:
    mov     ah, 01h
    int     16h
    jz      no_key

check_for_more_keys:
    mov     ah, 00h
    int     16h

    push    ax
    mov     ah, 01h
    int     16h
    jz      no_more_keys
    pop     ax
    jmp     check_for_more_keys

no_more_keys:
    pop     ax

    mov     cur_dir, ah

これにより、キーが必要になるたびにコードがバッファ全体を読み取るようになるため、実際には、キーをチェックするときに最後に入力されたキーに対してのみ機能します。

于 2015-12-22T16:40:10.633 に答える