Листинг 7.4. Код программы
Data segment
DIRECT db 1 ; направление перемещения
EXIT db 0 ; признак завершения программы (не 0)
SYM db "@" ; символ, выводимый на экран
ATRIBUT1 db 14 ; атрибут символа (жёлтый)
ATRIBUT2 db 10 ; атрибут символа (зелёный)
POS dw 3840 ; позиция начального вывода символа
OLD_CS dw ? ; адрес сегмента старого вектора 1Сh
OLD_IP dw ? ; адрес смещения старого вектора 1Сh
Data ends
Code segment
Assume cs:code, ds:data
; Подпрограмма обработки прерывания 1Сh
NEW_1C proc far
Push ax ; сохранить все регистры
Push bx
Push cx
Push dx
Push ds
Push es
Mov ax, DATA ; установить ds на сегмент данных
Mov ds, ax ; основной программы
Mov ax, 40h ; установить es на
Mov es, ax ; сегмент данных bios
mov ax, es:[1ch]
mov bx, es:[1ah]
Cmp bx , ax
Jne m5
Jmp back
m5: mov al, es:[bx]
mov es:[1ch], bx
Cmp al, 30h
Jnz m1
Mov EXIT, 1
Jmp back
M1: cmp al, 35h
Jne m6
Mov dl, ATRIBUT1
Mov dh, ATRIBUT2
Mov ATRIBUT1, dh
Mov ATRIBUT2, dl
Jmp back
M6: cmp al, 38h ; стрелка вверх
Jz m2
Cmp al, 32h ; стрелка вниз
Jz m3
Cmp al, 34h ; стрелка влево
Jz m4
Cmp al, 36h ; стрелка вправо
Jnz back ; неиспользуемая клавиша
Mov DIRECT, 3
Jmp back
M2: mov DIRECT, 1
Jmp back
M3: mov DIRECT, 4
Jmp back
M4: mov DIRECT, 2
Back: pop es
Pop ds
Pop dx
Pop cx
Pop bx
Pop ax
Iret
NEW_1C endp
; Подпрограмма очистки экрана
CLS proc near
Push cx
Push ax
Push si
Xor si, si
Mov ah, 7
mov dl, ' '
Mov cx, 2000
CL1: mov es:[si], ax
Inc si
Inc si
Loop CL1
Pop si
Pop ax
Pop cx
Ret