IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Появился Брезенхейм на Vesa 320*200 16 Mil Color
сообщение
Сообщение #1


Lonely_Raven
****

Группа: Пользователи
Сообщений: 640
Пол: Мужской

Репутация: -  1  +


кидаю пока что есть
не все до конца раелизовано и оптимизированно
-=-=
.MODEL small
.STACK 100H
.DATA

E dw 0 ; дескриптор отклонения если Е>=0 то у+1 и х+1
; если Е<0 то Х+1, а У остается неизменным
windows db 0 ; декриптор перемещений окна
xx dw 10 ; координаты для алгоритма Брезехейма
yy dw 1 ; начальые
x dw 0 ; для расчета под ока и
y dw 0 ; вывода на экран
color dd 0ffffffffh ; цвет
x2 dw 19 ; конец
y2 dw 199 ; линии
Px dw 0 ; прирост по X
Py dw 0 ; прирост по Y
i dw 0 ; кол-во цикла т.е. длина линии

;PxPy dw 0 ; сверка на прирост

.CODE
START:
.386 ; подключаем функции 386 процессора
mov ax,4f02h ; функция VESA
mov bx,10fh ; режим 320*200 16-милионов цветов
int 10h ; BIOS video interrupt
;
mov ax,0a000h ; video memory adress
mov es,ax ; init es for video memory
mov ax,@data ; segm data adress
mov ds,ax ; init DS for seg memory data

;----------------------------------------------------
mov ax,x2 ; вычисляем прирост
sub ax,[xx] ; для
mov [Px],ax ; X
mov ax,[y2] ; прирост для
sub ax,[yy] ; Y

;--=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-
mov [Py],ax ; загоняем прирост в регистры
mov ax,[Py] ; сравниваем на большесть числа не знаковые
; cmp ax,0 ; проверка на отрицательный прирост
; jl BresRUp1
; jmp dal2
;BresRUp1:
; mov bx,[Px] ;
; cmp bx,0 ; проверка на отрицательный прирост
; jl BresLUp1
;
;dal2:
mov bx,[Px] ;
cmp bx,0 ; проверка на отрицательный прирост
jl BresLD1
jmp dal1
BresLD1:
; cmp ax,bx ; сравниваем на большесть числа не знаковые
; ja BrLD_N ; если больше то на новый алгоритм
; jmp dal ; если нет то на обычный
;BrLD_N:

call invert
mov ax,[Px] ; тут именно в этих местах может быть небольшой BUG
; на правильность отклонения линии не надо путать формулу
; первоначалього дескриптора
mov [i],ax ;
mov ax,[Py] ; Вычислеам дескриптор отклонения по
shl ax,1 ; формуле
sub ax,[Px] ; E=2*Py-Px
mov [E],ax ;
mov cx,[i] ; количество пикселей
call BresLD ; movenay to algoritm Paint Line Procedure

dal1:

cmp ax,bx ; сравниваем на большесть числа не знаковые
ja BrRD_N ; если больше то на новый алгоритм
jmp dal ; если нет то на обычный
BrRD_N:

mov ax,[Py] ; то длина линии будет получаться из
mov [i],ax ; Py
mov ax,[Px] ; Вычисляем дескриптор отклонения по
shl ax,1 ; формуле
sub ax,[Py] ; E=2*Px-Py
mov [E],ax ;
call BresRDN ; movenay to algoritm Paint Line Procedure

dal:
mov ax,[Px]
mov [i],ax
mov ax,[Py] ; Вычисляем дескриптор отклонения по
shl ax,1 ; формуле
sub ax,[Px] ; E=2*Py-Px
mov [E],ax ;

mov cx,[i] ; количество пикселей
call BresRD

;-----------------------------
BresLD proc near ; влево вниз

mov cx,[i]
brezen2:
cmp [E],0 ; Если Е
jge deskrip_on2 ; больше или ранво 0 то jump
jmp deskrip_off2 ; меньше 0 то jump
deskrip_on2: ;
dec [xx] ; увеличиваем на +1
inc [yy] ; увеличиваем на +1
mov ax,[Py] ; далее модифицируем дескриптор отклонения
mov bx,[Px] ; в зависимости от старого
sub ax,bx ; по формуле
shl ax,1 ; E=E+2*(Py-Px)
add [E],ax ;
jmp Ou_Pix2 ; выводим пиксел

deskrip_off2: ;
dec [xx] ; увеличиваем только Х+1 а У отстается еизмеым

shl [Py],1 ; модифицируем дескриптор взависимости от старого
mov ax,[e] ; по формуле
add ax,[Py] ; E=E+2*Py
mov [E],ax ;
sar [Py],1 ; восстанавливаем Py обратно
jmp Ou_Pix2 ; выводим пиксел
ret_o2: ;
loop brezen2 ; конец цикла
jmp exits ; выход из программы
Ou_Pix2: ;
mov ax,[xx] ; модифицируем координаты
mov [x],ax ; для вывода на экран
mov bx,[yy] ;
mov [y],bx ;

call OutPixel ; выводим пиксел
jmp ret_o2 ; обратно на Брезехейм

BresLD endp

;BresLDN proc near
;BresLDN endp
;
;BresLUp proc near ; влево вверх
; ret
;BresLUp endp
;
;BresRUp proc near ; вправо вверх
; ret
;BresRUp endp


BresRD proc near ; вправо вниз
brezen:
cmp [E],0 ; если Е
jge deskrip_on ; больше или равно 0 то jump
jmp deskrip_off ; меньше 0 то jump
deskrip_on: ;
inc [xx] ; меньше 0 то jump
inc [yy] ; меньше 0 то jump
mov ax,[Py] ; далее модифицируем дескриптор отклонения
mov bx,[Px] ; в зависимости от старого
sub ax,bx ; по формуле
shl ax,1 ; E=E+2*(Py-Px)
add [E],ax ;
jmp Ou_Pix ;по формуле

deskrip_off: ;
inc [xx] ; увеличиваем только Х+1 а У отстается неизменным

shl [Py],1 ; модифицируем дескриптор взависимости от старого
mov ax,[e] ; по формуле
add ax,[Py] ; E=E+2*Py
mov [E],ax ;
sar [Py],1 ; востаавливаем Py обрато
jmp Ou_Pix ; выводим пиксел
ret_o: ;
loop brezen ; конец цикла
jmp exits ; выход из программы
Ou_Pix: ;
mov ax,[xx] ; модифицируем координаты
mov [x],ax ; для вывода на экран
mov bx,[yy] ;
mov [y],bx ;

call OutPixel ; выводим пиксел
jmp ret_o ; обратно на Брезехейм

BresRD endp
;------------------------------------------------------------
;--- дополительный алгоритм преобразования линии на Px<Py ---
;------------------------------------------------------------

BresRDN proc near ; вправо вниз при Py>Px
mov cx,[i]
brezen1:
cmp [E],0 ; если Е
jg deskrip_on1 ; больше или равно 0 то jump
jmp deskrip_off1 ; меньше 0 то jump
deskrip_on1: ;
inc [xx] ; увеличиваем на +1
inc [yy] ; увеличиваем на +1
mov ax,[Px] ; далее модифицируем дескриптор отклонения
mov bx,[Py] ; в зависимости от старого
sub ax,bx ; по формуле
shl ax,1 ; E=E+2*(Py-Px) немного модифицируем формулу
; в связи с новым алгоритмом
add [E],ax ;
jmp Ou_Pix1 ; выводим пиксел
deskrip_off1: ;
inc [yy] ; тут наоборот y координаты прирост больше
shl [Px],1 ; модифицируем дескриптор взависимости от старого
mov ax,[E] ; по формуле
add ax,[Px] ; E=E+2*Px
mov [E],ax ;
sar [Px],1 ; востанавливаем Pх обратно
jmp Ou_Pix1 ; выводим пиксел
ret_o1: ;
loop brezen1 ; конец цикла
jmp exits ; выход из программы
Ou_Pix1: ;
mov ax,[xx] ; модифицируем коордиаты
mov [x],ax ; для вывода на экран
mov bx,[yy] ; для алгоритма вывода точки
mov [y],bx ;

call OutPixel ; выводим пиксел
jmp ret_o1 ; обратно на Брезехейм

BresRDN endp

;--------------------------------------------------------
OutPixel proc near ;
mov ax,1280 ; 1280 количество точек по X
mul y ; умножаем на У
jc corect ; если переполнение то корректируем
;============================================
shl x,2 ; сдвиг влево корректир. т.к. 4 байта на точку
add ax,x ; конечный результат сумма
adc dx,0
jc corect1 ; если переполнение то на корректировку
cmp dx,1
je corect1
mov si,ax ; теперь адресуем видео память
; на полученый результат
out:

mov ebx,color ; цвет
mov es:[si],ebx ; ставим точку
shr x,2 ; так как мы изменили Х то возвращаем его назад
jmp ex_t ; выходим
corect:

shl x,2 ; сдвиг на 2 уможаем на 4
add ax,x ; в ax конечный результат
adc dx,0
corect1:
mov si,ax ; в si ax
cmp dx,2
je corect2
cmp dx,3
je corect2
not_cor:

call mov_w1 ; двигаем окно на 1 шаг
jmp out ; на вывод точки
corect2:
cmp dx,3
jz corect3
call mov_w2
jmp out
corect3:
call mov_w3
jmp out
ex_t:
ret ; выход из процедуры вывода точки
; обратно в Брезехейм
OutPixel endp

exits:
mov ah,0 ; ждем клавишу
int 16h ; Interrupt
;

mov ah,4ch ;|
mov al,0 ;| -EXIT to DOS;
int 21h ;|

mov_w0 proc near ; movenay to window
mov ah,4fh ; in step zero
mov al,05 ; 62454
mov bh,0 ; ---------
mov bl,0 ; ---------
mov dx,0 ; переносим окно на один шаг
int 10h
mov windows,0
ret
mov_w0 endp

mov_w1 proc near
mov ah,4fh ;
mov al,05 ; 62454
mov bh,0 ; ---------
mov bl,0 ; ---------
mov dx,1 ; переносим окно на один шаг
int 10h
mov windows,1
ret
mov_w1 endp

mov_w2 proc near
mov ah,4fh ;
mov al,05 ; 62454
mov bh,0 ; ---------
mov bl,0 ; ---------
mov dx,2 ; переносим окно на один шаг
int 10h
mov windows,2
ret
mov_w2 endp

mov_w3 proc near
mov ah,4fh ;
mov al,05 ; 62454
mov bh,0 ; ---------
mov bl,0 ; ---------
mov dx,3 ; переносим окно на один шаг
int 10h
mov windows,3
ret
mov_w3 endp

invert proc near
mov ax,[Px]
not ax
add ax,01h
mov [Px],ax
ret
invert endp

END START



--------------------
Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ
---------------------
RTFM - Read the fucking manual
---------------------
http://www.livejournal.com/users/lonley_raven/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Ну работает вроде  :D
И, к слову, Shadow, ты б сначала доделал, а потом анонсировал... ;)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 15:18
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name