Wie um zu überprüfen, Tasten-status in x86 Assembler?

Ich nahm x86 assembly als hobby im letzten Januar, also könnte ich damit die Spiele, die funktionieren würde, auf alten 8086-powered-Computer wie der PCj und Tandy 1000, aber die Bücher fand ich gar nicht so unterrichten, viel über die spezifische Thema. Während einige dos-und bios-interrupts Art von den job zu erledigen, Sie sind weit entfernt von perfekt.

Mein Hauptproblem ist das Lesen der Tastatur-status der gedrückten Tasten ohne Unterbrechung des Programms. Ich fand ein paar Methoden, aber Sie sind sehr begrenzt. INT 21h, AH, 0Ch liest die zuletzt gedrückte Taste, sondern in einer text-edition der Mode. Nicht nur, dass es liest nur eine Taste gleichzeitig, aber die Editor-wie hit-Erkennung macht es unmöglich zu wissen, wie lange die Taste gehalten worden. Ich habe auch gesehen, die Referenzen der ports zu 60h 64h während meiner Google-Reise, aber es ist nur so, dass, Referenzen. Tatsächliche Erklärungen und funktionierenden code ist praktisch nicht existent. Oder vielleicht bin ich nur schlecht mit Suchmaschinen.

Was ich wissen muss ist, ob eine Taste gedrückt ist oder nicht. Die beste Lösung wäre es, einen Puffer/array für alle Tasten der Tastatur und Lesen Sie seinen Zustand; 1 bedeutet, dass es unten ist, 0 bedeutet, es ist nicht. Oder einfach Zugriff auf die Liste der letzten keys wurden getroffen und veröffentlicht, wäre nett (mit ein Weg, um klar, dass Puffer natürlich). Kann jemand mich in die richtige Richtung?

Edit: First off, ich sollte erwähnt haben, dass ich die Verwendung von Borland TASM. Jetzt habe ich kompiliert den code und es funktioniert auch Prima, obwohl ich fast schüchtern zugeben, ich verstehe nicht die Hälfte. Ich habe versucht, um es kompatibel mit TASM aber alle es tut, ist erstellen, Müll auf dem Bildschirm und einfrieren.

Hier ist, was ich kam mit;

.MODEL TINY
.STACK 256

.DATA
kbdbuf DB 128 DUP (0)

msg1 db "Press and hold ESC", 13, 10, "$"
msg2 db "ESC pressed, release ESC", 13, 10, "$"
msg3 db "ESC released", 13, 10, "$"

.CODE
main PROC
    org 0100h
    mov ax, @data
    mov ds, ax

    xor     ax, ax
    mov     es, ax

    cli                         ; update ISR address w/ints disabled
    push    word [es:9*4+2]     ; preserve ISR address
    push    word [es:9*4]
    lea si, irq1isr
    mov     word [es:9*4], si   ; requires a register
    mov     [es:9*4+2],cs
    sti

        mov     ah, 9
        lea     dx, msg1
        int     021h                ; print "Press and hold ESC"

    test1:
        mov     al, [kbdbuf + 1]    ; check Escape key state (Esc scan code = 1)
        or      al, al
        jz      test1               ; wait until it's nonzero (pressed/held)

        lea     dx, msg2
        int     021h                ; print "ESC pressed, release ESC"

    test2:
        mov     al, [kbdbuf + 1]    ; check Escape key state (Esc scan code = 1)
        or      al, al
        jnz     test2               ; wait until it's zero (released/not pressed)

        lea     dx, msg3            ; print "ESC released"
        int     021h

    cli                         ; update ISR address w/ints disabled
    pop     word [es:9*4]       ; restore ISR address
    pop     word [es:9*4+2]
    sti

    ret

    irq1isr:
    push    ax bx

    ; read keyboard scan code
    in      al, 060h

    ; update keyboard state
    xor     bh, bh
    mov     bl, al
    and     bl, 07Fh            ; bx = scan code
    shr     al, 7               ; al = 0 if pressed, 1 if released
    xor     al, 1               ; al = 1 if pressed, 0 if released
    mov     [cs:bx+kbdbuf], al

    ; send EOI to XT keyboard
    in      al, 061h
    mov     ah, al
    or      al, 080h
    out     061h, al
    mov     al, ah
    out     061h, al

    ; send EOI to master PIC
    mov     al, 020h
    out     020h, al

    pop     bx ax
    iret
main ENDP

END main

Ich bin mir nicht sicher, ob ich auch codierte interrupt-Recht. Und verdammt, wenn ich weiß, wie ich die ports 060h - 064h Arbeit.

  • Ihr Hauptproblem ist, dass du machst eine .EXE-Programm, während der code soll zusammengestellt werden, um eine .COM-Programm. Siehe die aktualisierte Antwort.
  • Arbeiten Tetris OS das tut, was Sie will: github.com/programble/tetrasm
InformationsquelleAutor DieJay | 2012-05-09
Schreibe einen Kommentar