Tôi đã x86 lắp ráp như một sở thích vào tháng trước để tôi có thể chơi game trên các máy tính cũ 8086 như PCj và Tandy 1000, nhưng những cuốn sách tôi tìm thấy không chính xác dạy nhiều về chủ đề cụ thể đó. Trong khi một số dos và bios làm gián đoạn loại công việc, họ đang ở xa hoàn hảo.Làm cách nào để kiểm tra trạng thái khóa trong lắp ráp x86?
Vấn đề chính của tôi là đọc trạng thái bàn phím cho các phím nhấn mà không làm gián đoạn chương trình. Tôi tìm thấy một vài phương pháp, nhưng chúng rất hạn chế. INT 21h, AH 0Ch đọc phím bấm cuối cùng, nhưng theo kiểu ấn bản. Nó không chỉ đọc duy nhất một khóa tại một thời điểm, mà việc phát hiện hit giống như notepad khiến nó không thể biết được chìa khóa đã được giữ trong bao lâu. Tôi cũng đã thấy các tham chiếu đến các cổng 60h đến 64h trong khi Google di chuyển, nhưng đó chỉ là các tham chiếu. Các giải thích thực tế và mã làm việc hầu như không tồn tại. Hoặc có lẽ tôi chỉ là xấu khi sử dụng các công cụ tìm kiếm.
Điều tôi cần biết là liệu khóa có được giữ hay không. Giải pháp tốt nhất là có một bộ đệm/mảng của tất cả các phím bàn phím và đọc trạng thái của nó; 1 có nghĩa là nó xuống, 0 có nghĩa là nó không phải. Hoặc chỉ có quyền truy cập vào danh sách các phím cuối cùng đã bị tấn công và phát hành sẽ tốt đẹp (với một cách để xóa bộ đệm đó, tất nhiên). ai đó có thể chỉ cho tôi phương hướng đúng không?
Chỉnh sửa: Trước hết, tôi nên đề cập rằng tôi sử dụng Borland TASM. Bây giờ tôi đã biên soạn mã của bạn và nó hoạt động tốt và tất cả, mặc dù tôi gần như nhút nhát thừa nhận tôi không hiểu một nửa số đó. Tôi đã cố gắng để làm cho nó tương thích với TASM nhưng tất cả nó làm là tạo ra rác trên màn hình và đóng băng.
Đây là những gì tôi đã đưa ra;
.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
Tôi không chắc chắn liệu tôi đã mã hóa quyền ngắt hay chưa. Và heck nếu tôi biết làm thế nào các cổng 060h - 064h làm việc.
vấn đề chính của bạn là bạn đang làm một chương trình .EXE trong khi mã được cho là được biên dịch thành một chương trình .COM. Xem câu trả lời được cập nhật. –
Làm việc với hệ điều hành Tetris thực hiện những gì bạn muốn: https://github.com/programble/tetrasm –