.model tiny
.386
.code
.startup ; точка входа
mov ax,0013h ;vga 320x200x256
int 10h
mov ax, 0a000h
mov es, ax ;es - сегмент видео
cld
MainLoop:
call DrawMovingImage
WaitKey:
mov ah,1
int 16h
jz MainLoop
mov ah, 0 ;проверяем на код клавиши
int 16h
cmp ah, 1 ;по Esc выходим
je Exit
call GetStep ;по клавише Shift определим шаг 1 или 10
cmp ah, 4bh ;стрелка влево
je left
cmp ah, 4dh ;стрелка вправо
jne WaitKey ;все остальное игнорируем
right:
mov ax, StringLength;проверим правый край
sub ax, ImageL
sub ax, bx ;ax - самая правая позиция, при которой
; при добавлении шага не выйдем за правый край
cmp ax, ImageC ;сравним с текущей
jbe WaitKey
call ClearImage ;ичищаем старое
add ImageC, bx ;добавляем шаг
jmp MainLoop ;и на прорисовку
left: mov ax, ImageC ;проверим, можем ли сдвинуться влево
sub ax, bx
jl WaitKey
call ClearImage ;вытираем старое
sub ImageC, bx ;уменьшаем шаг
jmp MainLoop ;перерисовываем
Exit:
mov ax, 0003h ;назад в текстовый режим
int 10h
mov ax, 4c00h
int 21h
DrawMovingImage proc
pusha
; Вычислить адрес начальной точки для вывода маски
; Умножить длину строки на номер строки(Y)
mov AX,StringLength
mov DX,[ImageS]
mul DX
; Прибавить длину колонки (X)
add AX,[ImageC]
mov DI,AX ;результат - в индексный регистр
; Записать адрес маски в индексный регистр
lea SI,[Flm] ;указатель на маску объекта
; Вывести изображение
mov DX,ImageH ;высота маски
M0: ;Вывести очередную строку маски
mov CX,ImageL ;ширина маски
M1: ; Проверить точку маски
lodsb
and AL,AL ;код цвета равен нулю?
jz M2 ;пропустить точку
mov ES:[DI],AL ;вывести точку
M2: ; Перейти к следующей точке
inc DI
loop M1
; Перейти на следующую строку
add DI,StringLength
sub DI,ImageL
dec DX
jnz M0
popa
ret
DrawMovingImage endp
ClearImage proc
pusha
; Вычислить адрес начальной точки для вывода маски
; Умножить длину строки на номер строки(Y)
mov AX,StringLength
mov DX,[ImageS]
mul DX
; Прибавить длину колонки (X)
add AX,[ImageC]
mov DI,AX ;результат - в индексный регистр
; Записать адрес маски в индексный регистр
lea SI,[Flm] ;указатель на маску объекта
; Вывести изображение
mov DX,ImageH ;высота маски
M3: ;Вывести очередную строку маски
mov CX,ImageL ;ширина маски
mov al, 0
rep stosb ;cx раз прописываем 0 - вот и все вытирание :)
; Перейти на следующую строку
add DI,StringLength
sub DI,ImageL
dec DX
jnz M3
popa
ret
ClearImage endp
;возвращаем в bx шаг для перемещений
GetStep proc
push ax
mov ah, 2 ;читаем флаги клавиатуры
int 16h
mov bx, 1 ;шаг = 1, если нет нажатия на shift
and al, 3 ;левый/правый
jz GSRet
mov bx, 10 ;шаг = 10, если есть нажатие на shift
GSRet:
pop ax
ret
GetStep endp
.data
; Маска
Flm DB 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,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,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
StringLength dw 320 ;длина строки
; Позиция маски изображения на экране
ImageS dw 100 ;строка
ImageC dw 160 ;колонка
; Размеры маски изображения
ImageL equ 16 ;ширина маски
ImageH equ 16 ;высота маски
END
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.