; установим сегментный регистр на сегмент таблицы прерываний
xor ax, ax
mov es, ax
; читаем старый обработчик
mov ax, es:[4*9]
mov old09o, ax
mov ax, es:[4*9+2]
mov old09s, ax
; ставим новый обработчик (запрет прерываний - обязательно!)
cli
mov word ptr es:[4*9], offset new09
mov es:[4*9+2], cs
sti
mov bx,ax
and bx,0FFh
shl bx,2
xor ax,ax
mov es,ax
cli
mov es:[bx],dx
mov es:[bx+2],ds
sti
.model tiny
.386
.code
.startup
mov ax,0013h ;320x200x256
int 10h
;читаем старый обработчик
mov ax,3509h
int 21h
mov old09o,bx
mov old09s,es
;ставим новый обработчик
; mov ax,2509h
xor ax,ax
mov es,ax
mov dx,offset new09
push cs
pop ax
cli
mov es:[36],dx
mov es:[38],ax
sti
; int 21h
;настраиваемся на видео буфер
mov ax,0A000h
mov es, ax
cld
keyESC equ 01h
keyUp equ 48h
keyDown equ 50h
keyLeft equ 4Bh
keyRight equ 4Dh
MainLoop:
;считаем адрес
call CalcAdr
;рисуем рисунок
call DrawMovingImage
;задержка
mov cx,5000
MM1: push cx
mov cx,5000
MM2: loop MM2
pop cx
loop MM1
;изменяем координаты
xor dx,dx
xor bx,bx
;изменяем приращение
add bl,DataKey[keyDown]
add dl,DataKey[keyRight]
sub bl,DataKey[keyUp]
sub dl,DataKey[keyLeft]
;контроль
;вертикальная координата
mov ax,bx
cbw
add ax,ImageS
jz IgnoreV
js IgnoreV
push ax
add ax,ImageH
cmp ax,StringHeigth
pop ax
jae IgnoreV
mov imageS,ax
IgnoreV:
;контроль
;горизонтальная координата
mov ax,dx
cbw
add ax,ImageC
jz IgnoreH
js IgnoreH
push ax
add ax,ImageL
cmp ax,StringLength
pop ax
jae IgnoreH
mov imageC,ax
;прячем рисунок
IgnoreH: call ClearImage
;проверяем ESC
cmp byte ptr DataKey[keyESC],1
jnz MainLoop
;востанавливаем старый обработчик
mov ax,2509h
mov dx,old09o
mov ds,old09s
int 21h
;завершение программы
mov ax, 4c00h
int 21h
;старый обработчик
old09o dw ?
old09s dw ?
;наш обработчик
new09: pusha
;читаем порт
in al,60h
;заполняем массив
xor bx,bx
mov bl,al
mov al,1
mov cs:DataKey[bx],al
xor bl,80h
xor al,al
mov cs:DataKey[bx],al
;стандартное завершение прерывания
in al,61h
push ax
or al,80h
out 61h,al
pop ax
out 61h,al
mov al,20h
out 20h,al
popa
iret
;
DrawMovingImage proc
pusha
; Записать адрес маски в индексный регистр
mov SI,offset Flm;указатель на маску объекта
; Вывести изображение
mov cx,ImageH ;высота маски
M0: ;Вывести очередную строку маски
push cx
mov CX,ImageL;ширина маски
push di
rep movsb
pop di
;Перейти на следующую строку
add DI,StringLength
pop cx
loop M0
popa
ret
DrawMovingImage endp
ClearImage proc
pusha
; Вывести изображение
mov cx,ImageH ;высота маски
M3: ;Вывести очередную строку маски
push cx
mov CX,ImageL ;ширина маски
mov al, 0
push di
rep stosb
pop di
; Перейти на следующую строку
add DI,StringLength
pop cx
loop M3
popa
ret
ClearImage endp
CalcAdr proc
; Вычислить адрес начальной точки для вывода маски
; Умножить длину строки на номер строки
mov AX,StringLength
mul ImageS
; Прибавить длину колонки
add AX,ImageC
mov DI,AX
ret
CalcAdr endp
.data
DataKey db 256 dup(0)
; Маска
Flm DB 15,15,15,15 ,15,15,15,15 ,15,15,15,15 ,15,15,15,15
ImageL equ $ - Flm; 16 ;ширина маски
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,12,12,12 ,12,12,12,12 ,12,12,12,12 ,12,12,12,15
DB 15,15,15,15 ,15,15,15,15 ,15,15,15,15 ,15,15,15,15
ImageH equ ($ - Flm) / ImageL;16 ;высота маски
StringLength dw 320 ;длина строки
StringHeigth dw 200 ;количество строк
; Позиция маски изображения на экране
ImageS dw 90 ;строка
ImageC dw 150 ;колонка
; Размеры маски изображения
END
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.