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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, wie Sie es tun können:
Läuft es unter DOS/Win9x/NT/2K/XP/32-bit/Vista /7 und DosBox.
UPDATE: TASM-version:
In der Regel für die alten Systeme wie diese Menschen mit der BIOS ein bisschen wie eine vorab bereitgestellte Reihe von library-Funktionen, wo Dinge wie Tastatur-Funktionen werden nur verwendet, wenn Sie schon bequem. In Ihrem Fall die BIOS-Tastatur-services nicht bequem, so dass Sie nicht verwenden Sie.
Statt, Sie möchten, ersetzen Sie den BIOS-Tastatur-interrupt-handler mit Ihrer eigenen Tastatur-interrupt-handler und implementieren Sie Ihre eigenen Tastatur-Treiber. Die Tastatur benutzt IRQ1, die interrupt-9. Die interrupt-Vektor-Tabelle beginnt bei 0x0000:0x0000, so würden Sie wollen, um die 4 bytes 0x0000:9*4 = 0x0000:0x0024 und speichern Sie Sie irgendwo (so können Sie die Dinge zurück zu normal, wenn Sie Ihre software-exits) und setzen Sie die Adresse (offset, dann segment) von Ihrer eigenen Tastatur-IRQ-handler statt.
Schreiben Sie Ihre eigenen Tastatur-Treiber, die Sie wollen, um zu beginnen durch das Verständnis, dass es 2 Teile der hardware beteiligt. Es ist der Tastatur-controller-chip (oder "PS/2-controller") in den computer, der spricht (via. serielle Kommunikation) auf einem chip im inneren der Tastatur selbst.
Informationen über den Tastatur-controller-chip, etwas sehen, wie http://wiki.osdev.org/%228042%22_PS/2_Controller
Informationen auf dem chip im inneren der Tastatur selbst, etwas sehen, wie http://wiki.osdev.org/PS/2_Keyboard
Beispiel für die Abfrage der Tastatur über den port 60h und den port 64h: