Вопрос
Хочется узнать, как правильно работать из ассемблера с клавиатурой. Задача такого плана: реализовать программу, которая бы выводила в центре экрана 6 кружочков (в текстовом режиме) серого цвета. При нажатии на клавишу [Q] — самый левый кружочек становится зеленым, при отпускании клавиши — опять серым. Тоже самое происходит с остальными кружочками при нажатии клавиш клавиатуры [W], [E], [R], [T], [Y]. При нажатии на нижерасположенные клавиши [A], [S], [D], [F], [G], [H] происходит все тоже самое, только цвет — красный. По клавише Escape — выход из программы. Вопрос: как реализовать обработку сразу нескольких клавишь т.е. при нажатии Q+S+E+F+T+H должно быть: G R G R G R * G-зеленый R-красный.
Ответ
; программа выводит 3 круга и по QWE раскрашивает их в синий-зеленый-красный.
; здесь — основы, до кондиции доводите самостоятельно
.286
StSeg SEGMENT WORD STACK 'STACK'
DB 400h DUP (?)
StSeg ENDS
SEGMENT DSeg WORD
strOutput DB 'O',07h,'O',07h,'O',07h
intOutputLen EQU $-strOutput
blnExit DB 0
ENDS
SEGMENT Code WORD
ASSUME CS:Code, DS:DSeg
; Обработчик клавиного прерывания
Handle09h PROC FAR
pusha
push ds
mov ax,DSeg
mov ds,ax
in al,60h
; метки — буква (Q/W/E) + действие (up/down)
cmp al,01h
je @ESC
cmp al,10h
je @Qd
cmp al,11h
je @Wd
cmp al,12h
je @Ed
cmp al,90h
je @Qu
cmp al,91h
je @Wu
cmp al,92h
je @Eu
jmp @H9NoTask
@ESC:
mov byte ptr blnExit,1
jmp @H9NoTask
@Qd:
mov al,1
mov strOutput+1,al
jmp @H9NoTask
@Wd:
mov al,2
mov strOutput+3,al
jmp @H9NoTask
@Ed:
mov al,4
mov strOutput+5,al
jmp @H9NoTask
@Qu:
mov al,7
mov strOutput+1,al
jmp @H9NoTask
@Wu:
mov al,7
mov strOutput+3,al
jmp @H9NoTask
@Eu:
mov al,7
mov strOutput+5,al
jmp @H9NoTask
@H9NoTask:
pop ds
popa
DB 0EAh ; JMP FAR
Old9Handle DW OFFSET @H9Lir
DW SEG @H9Lir
@H9Lir:
IRet
Handle09h ENDP
; Начало проги
Main:
; ставим обработчик
xor ax,ax
mov ds,ax
mov bx,ds:[9*4]
mov cx,ds:[9*4+2]
mov ax,dseg
mov ds,ax
mov word ptr old9handle,bx
mov word ptr old9handle+2,cx ; gethandle
mov cx,cs
mov bx,offset Handle09h
xor ax,ax
mov ds,ax
cli
mov ds:[9*4],bx
mov ds:[9*4+2],cx
sti
mov ax,dseg
mov ds,ax ; sethandle
; основной цикл
mov ax,DSeg
mov ds,ax
mov ax,0B800h ; для ч/б мониторов будет др. цифра
mov es,ax
MainLoop:
mov DI,1676
mov SI,OFFSET strOutput
mov CX,intOutputLen
rep movsb
mov ah,01h
int 16h
jz NoKey
xor ax,ax
int 16h
NoKey:
mov al,blnExit
or al,al
jz MainLoop
; убираем обработчик
mov bx,word ptr old9handle
mov cx,word ptr old9handle+2
xor ax,ax
mov ds,ax
cli
mov ds:[9*4],bx
mov ds:[9*4+2],cx
sti
mov ax,dseg
mov ds,ax ; sethandle
mov ax,4C00h
int '!'
ENDS
END Main
Copyright 2000-2004 Сообщество Чайников
Контактная информация