Как прочитать ключ не дожидаясь его, сборка 8086

Делаю космических захватчиков на сборке 8086, для тестирования использую DOSBox. Позвольте мне показать вам мой код:

;--------------------
;Update hero
;--------------------
update:
call vsync
call update_hero ; method to read keyboard
call set_video
call clear_screen
call draw_hero
jmp update

Теперь процедура update_hero такова:

update_hero proc
     mov ah, 01h
     int 16h
     cmp al, 97
     je left_pressed
     cmp al, 100
     jne none_pressed
     inc hero_x
     left_pressed:
          dec hero_x
     none_pressed:
     ret
update_hero endp

Как видите, я пытаюсь прочитать «а» или «d» для движения, но это не работает, можете ли вы помочь мне понять, почему?

То, что я пытаюсь сделать, это прочитать с клавиатуры, не дожидаясь этого, поэтому я использую подфункцию ah, 01h.

Ваше здоровье.

Изменить

Я проверил прерывания здесь, изменил код, и теперь он работает:

update_hero proc
    mov ah, 01h ; checks if a key is pressed
    int 16h
    jz end_pressed ; zero = no pressed

    mov ah, 00h ; get the keystroke
    int 16h

    begin_pressed:
        cmp al, 65
        je left_pressed
        cmp al, 97
        je left_pressed
        cmp al, 68
        je right_pressed
        cmp al, 100
        je right_pressed
        cmp al, 81
        je quit_pressed
        cmp al, 113
        je quit_pressed
        jmp end_pressed
        left_pressed:
            sub hero_x, 2
            jmp end_pressed
        right_pressed:
            add hero_x, 2
            jmp end_pressed
        quit_pressed:
            jmp exit
    end_pressed:

    ret
update_hero endp

person Daniel Rivas    schedule 30.10.2012    source источник


Ответы (2)


Вы просто проверяете, есть ли доступный символ, но на самом деле не читаете символ из буфера. Так что в следующий раз, когда вы проверите, он все еще там.

С этой страницы о функциях BIOS http://webpages.charter.net/danrollins/techhelp/0230.HTM

Целое 16 ч, Ач=1

Info: Checks to see if a key is available in the keyboard buffer, and
      if so, returns its keycode in AX.  It DOES NOT remove the
      keystroke from the buffer.
person Bo Persson    schedule 30.10.2012

проверить ключ:

mov     ah, 1

int     16h

jz      .ret 

mov     cx, 0

xor     cl, ch

mov     ah, 0

int     16h

.new.key:

"al" - это новая клавиша presh

.ret:

 ret
person JaiCraB    schedule 12.07.2013