Почему правая клавиша не собирается выходить, а остальные клавиши идут? Тасм Турбо Ассемблер - PullRequest
1 голос
/ 12 апреля 2020

Кто-то знает, почему RightKeyUp не собирается выходить, а другие ключи собираются?
в Tasm Turbo Assembler

Когда я очищаю буфер (mov ah, 0ch mov al, 07h int 21h)

По какой-то причине я не получаю освобождение ключа

Например, этот код (RightUp никогда не принимается):

  IDEAL
    MODEL large
    STACK 256
RightUP          equ 11001101b
RightDown        equ 77
LeftDown         equ 75
EscKey           equ 1
    DATASEG
    CODESEG   
    Start:

    mov ax, @data
    mov ds, ax

    mov ax, 0013h
    int 10h

    lop:
    mov ah,0ch
    mov al,07h
    int 21h 

    in ax,060h
    ;push ax   

    cmp al,RightUP
    je lbl1

    cmp al,RightDown
    je lbl2

    cmp al,EscKey
    je lbl1
    cmp al,LeftDown
    je lbl1

    jmp lop

    lbl1:
    jmp exit

    lbl2:
    jmp lop

    Exit:
    mov ah,00h
    mov al,03h
    int 10h
    mov ax,04c00h
    int 21h

    End Start

я выбрал дополнительную опцию и Я понял, что эти две команды (mov ah, 0, int 16h) делают то же самое, но также не получают освобождение ключа, мне действительно нужна помощь:)

Больше кода, который более осязаем:

    IDEAL

MODEL large

STACK 256

    RightUP          equ 11001101b
    RightDown        equ 77
    EscKey           equ 1

DATASEG

    CanClick db 1

CODESEG   

Start:

        mov ax, @data
        mov ds, ax

        mov ah,00h
        mov al,03h
        int 10h

lbl1:
    mov [CanClick],1
lop:
        ;mov ah,0ch
        ;mov al,07h
        ;int 21h    
        ;in al,060h
        mov ah,0
        int 16h

        cmp ah,RightDown
        je lbl2

        cmp ah,RightUP
        je lbl1

        cmp ah,EscKey
        je lbl1
jmp lop

lbl2:
    cmp [CanClick],1
    jne lop

    mov ah,0eh
    mov al,97
    mov BH,0
    mov BL,0
    int 10h
    mov [CanClick],0
jmp lop

Exit:
        mov ax,04c00h
        int 21h

End Start

1 Ответ

2 голосов
/ 12 апреля 2020
mov ah,0ch
mov al,07h
int 21h 
in ax,060h

При использовании вышеуказанного кода при нажатии Вправо DOS сначала возвращает ноль в регистре AL и ожидает, что вы выполните еще один вызов функции 07h в порядке чтобы получить фактический код сканирования, который будет 4Dh или 77 в десятичном виде. Использование вами порта чтения 60h можно считать вторым вызовом, но он никогда не вернет какой-либо код разблокировки клавиатуры, такой как 11001101b, который вы ожидаете.

 mov ah,0
 int 16h

B IOS Функция .WaitKeystroke во второй программе также никогда не вернет коды разблокировки клавиатуры.

Пример использования порта 60h, который может помочь вам увидеть Более быстрое обнаружение кода сканирования клавиатуры в сборке 8086

...