СообЧа > База Знаний > Программирование > Assembler

Вопрос

Хочется узнать, как правильно работать из ассемблера с клавиатурой. Задача такого плана: реализовать программу, которая бы выводила в центре экрана 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 Сообщество Чайников
Контактная информация