Помогите с анимацией

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Kaktys1991
Сообщения: 3
Зарегистрирован: 17 ноя 2009, 16:11

Вот есть код, который выводит надпись "Олег" на экран:
.model tiny, C

.code
org 100h
.186

start: mov ax,11h ;640х480
int 10h

;o
call line, 295, 270, 0, -1, 30
call line, 270, 270, 0, -1, 30
call line, 295, 240, -1, 0, 25
call line, 295, 270, -1, 0, 25

call line, 300, 270, 1, -1, 30
call line, 330, 270, 0, -1, 30
;e
call line, 332, 270, 0, -1, 30
call line, 332, 255, 1, 0, 20
call line, 332, 240, 1, 0, 20
call line, 332, 270, 1, 0, 20
;r
call line, 354, 270, 0, -1, 30
call line, 354, 240, 1, 0, 20


mov ah,0 ;ждем любую клавишу
int 16h ;для выхода

mov ax,3 ;установим текстовый режим
int 10h

mov ax, 4c00h
int 21h ;выход в ДОС

;Рисуем линию от точки (x, y) c направлением (deltax, deltay),
;и состоящую из count точек
line proc x:word, y:word, deltax:word, deltay:word, count:word
uses cx, dx, si

mov si, count
mov cx, x
mov dx, y
line_loop: ; начало цикла
call SetPixel, cx, dx, 1

add cx, deltax
add dx, deltay
dec si ;счетчик точек
jnz line_loop

ret
line endp

; Name: PixelAddr
; Function: Определяет позицию пикселя в буфере VGA в режиме 640x480
;
; Caller: AX = y-координата 0-479
; BX = x-координата 0-639
;
; Returns: AH = битовая маска
; BX = смещение байта в видеобуфере
; CL = число сдвигов для сдвига маски влево
; ES = сегмент видеобуфера

BytesPerLine EQU 80 ; число байт в одной гор.линии
VideoBufferSeg EQU 0A000h

PixelAddr PROC near
mov cl,bl ; CL := младший байт x

push dx ; сохраним DX

mov dx,BytesPerLine ; AX := y * BytesPerLine
mul dx

pop dx
shr bx,1
shr bx,1
shr bx,1 ; BX := x/8
add bx,ax ; BX := y*BytesPerLine + x/8
; BX - смещение байта в видеобуфере

mov ax,VideoBufferSeg
mov es,ax ; ES:BX := адрес байта пикселя

and cl,7 ; CL := x & 7
xor cl,7 ; CL := число сдвигов для сдвига маски влево
mov ah,1 ; AH := несдвинутая маска
ret

PixelAddr ENDP

; Name: SetPixel
;
; Function: Устанавливает значение пикселя в режиме 640x480
;
; void SetPixel(x,y,n);
;
; int x,y; /* координаты пикселя */
;
; int n; /* цвет пикселя */

RMWbits EQU 0 ; read-modify-write bits

SetPixel PROC ARGx:word, ARGy:word, ARGn:word
uses cx, dx, bx, es

mov ax,ARGy ; AX := y
mov bx,ARGx ; BX := x
call PixelAddr ; AH := битовая маска
; ES:BX -> буфер
; CL := число сдвигов

; установка регистра битовой маски графического контроллера (GC)

shl ah,cl ; AH := битовая маска в соответствующей позиции
mov dx,3CEh ; порт регистра адреса GC
mov al,8 ; AL := номер регистра битовой маски
out dx,ax

; установка регистра режима GC

mov ax,0005h ; AL := номер регистра режима
; AH := режим записи 0 (биты 0,1)
; режим чтения 0 (бит 3)
out dx,ax

; установка регистра выбора вращения/функции

mov ah,RMWbits ; AH := биты Read-Modify-Write (=0)
mov al,3 ; AL := регистр выбора Data Rotate/Function
out dx,ax

; установка регистров установки/сброса и разрешения установки/сброса

mov ah,byte ptr ARGn; AH := цвет пикселя
mov al,0 ; AL := регистр установки/сброса
out dx,ax

mov ax,0F01h ; AH := разрешаем все цветовые слои
; AL := регистр разрешения установки/сброса
out dx,ax

; установка значения пикселя

or es:[bx],al ; загрузка в защелки во время чтения
; и установка во время записи

; восстановим значения по-умолчанию

mov ax,0FF08h ; маска битов
out dx,ax

mov ax,0005 ; регистр режима
out dx,ax

mov ax,0003 ; выбор функции
out dx,ax

mov ax,0001 ; разрешение установки/сброса
out dx,ax

ret
SetPixel ENDP

end start

Мне нужно что бы расстояние между буквами увеличивалось каждую секунду по чуть-чуть. Пожалуйста помогите кто чем может!
Ответить