मैं एक शौक के रूप x86 विधानसभा ले लिया यह पिछले जनवरी तो मैं खेल है कि PCj और Tandy 1000, लेकिन किताबें मैं बिल्कुल कि विशिष्ट विषय पर ज्यादा नहीं सिखाया पाया जैसे पुराने 8086 संचालित कंप्यूटर पर काम करते हैं बना सकता है। जबकि कुछ डॉस और बायोस नौकरी करने में बाधा डालते हैं, वे बिल्कुल सही नहीं हैं।x86 असेंबली में कुंजी की स्थिति कैसे जांचें?
मेरे मुख्य मुद्दा कार्यक्रम को रोकने के बिना दबाया चाबी के लिए कुंजीपटल स्थिति पढ़ रहा है। मुझे कुछ विधियां मिलीं, लेकिन वे बहुत सीमित हैं। INT 21h, एएच 0Ch अंतिम दबाए गए कुंजी को पढ़ता है, लेकिन टेक्स्ट-संस्करण फैशन में। न केवल एक समय में यह केवल एक कुंजी पढ़ता है, लेकिन नोटपैड की तरह हिट डिटेक्शन यह जानना असंभव बनाता है कि कुंजी कितनी देर तक आयोजित की गई है। मैंने अपनी Google यात्रा के दौरान 60h से 64h बंदरगाहों के संदर्भ भी देखे हैं, लेकिन यह केवल यही है, संदर्भ। वास्तविक स्पष्टीकरण और कार्य कोड लगभग मौजूद नहीं है। या शायद मैं खोज इंजन का उपयोग करने में बस इतना बुरा हूँ।
क्या मुझे पता है की जरूरत है एक महत्वपूर्ण नहीं के दबे या जाए या नहीं। सबसे अच्छा समाधान सभी कुंजीपटल कुंजियों का बफर/सरणी होना चाहिए और इसकी स्थिति पढ़ना होगा; 1 का मतलब है कि यह नीचे है, 0 का मतलब है कि यह नहीं है। या केवल हिट और रिलीज़ होने वाली अंतिम कुंजियों की एक सूची तक पहुंच अच्छी होगी (निश्चित रूप से उस बफर को साफ़ करने के तरीके के साथ)। क्या कोई मुझे सही दिशा दिखा सकता है?
संपादित करें: सबसे पहले, मुझे यह उल्लेख करना चाहिए था कि मैं बोर्लैंड टीएएसएम का उपयोग करता हूं। अब मैंने आपका कोड संकलित किया है और यह बहुत अच्छा काम करता है, भले ही मैं स्वीकार करने के लिए लगभग शर्मिंदा हूं, मुझे इसका आधा समझ में नहीं आता है। मैंने इसे टीएएसएम के साथ संगत बनाने की कोशिश की लेकिन यह सब स्क्रीन पर कचरा बना रहा है और फ्रीज है।
यहां मैं क्या आया;
.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
मुझे यकीन है कि अगर मैं भी बाधा सही कोडित नहीं हूँ। और अगर मुझे पता है कि बंदरगाह 060h - 064h कैसे काम करते हैं।
आपका मुख्य समस्या यह है कि आप एक .EXE कार्यक्रम जबकि बना रहे है कोड को .COM प्रोग्राम में संकलित किया जाना चाहिए। अद्यतन उत्तर देखें। –
कार्य टेट्रिस ओएस करता है कि आप क्या चाहते हैं: https://github.com/programble/tetrasm –