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


Lonely_Raven
****

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

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


ето поака сырой из сырцов
-=-=
прямо вода капает но вроде работает
-=-=
на VESA 16 mil 320 * 200


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


Профи
****

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

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


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


Lonely_Raven
****

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

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


да блин делаю по кусочкам работа блин


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


Профи
****

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

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


А что творить-то собираешься??
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Lonely_Raven
****

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

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


ню потом GETIMAGE PUTIMAGE и.т.д


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


Lonely_Raven
****

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

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


.MODEL small
.STACK 100H
.DATA
E dw 0 ; дескриптор отклонения если Е>=0 то у+1 и х+1
; если Е<0 то Х+1, У остается неизменным
windows db 0 ; декриптор перемещения окна
xx dw 1 ; кординаты для алгоритма Брезенхейма
yy dw 1 ; начальные
x dw 1 ; для расчета под окна и
y dw 0 ; вывода на экран
color dd 0000ff000h ; цвет(ярко зеленый)
x2 dw 319 ; конец
y2 dw 199 ; линии
Px dw 0 ; прирост по Х
Py dw 0 ; прирост по У
i 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 ; Х
mov ax,[y2] ; прирост для
sub ax,[yy] ; У
mov [Py],ax ; загоняем прирост в регистры
;---------------------------------------------------

; mov ax,[Py] ;
mov bx,[Px] ;
;===============================================================

cmp bx,0 ; проверка на отрицательный прирост
jl BresLD1 ; если меньше чем ноль 0 то переход на др. алгоритм
;-------------------------------------

cmp ax,0
jl BresRUp1
jmp dalll
BresRUp1:
call invertPy
cmp ax,bx
ja RUp_N1
jmp No_RUp_N1
RUp_N1:
call DDLineYC
call BresRUp_N
No_RUp_N1:
call DDLineXC
call BresRUp ; movenay to algoritm Paint Line Procedure
dalll:
jmp dal1 ; если нет то на обычный RD
BresLD1:
;==============================================================

cmp ax,0 ; т.к. теперь оба отрицательные
jl BresLUp1 ;
jmp No_BresLUp ;
BresLUp1:
call InvertPy ; инвертируем оба
call Invert ; значения прироста
cmp ax,bx ; на большесть
ja New_BresLUp ;
jmp off_N_BrLUp ;
New_BresLUp: ;
call DDLineYC
call BresLUp_N ;
;
off_N_BrLUp: ;
call DDLineXC
call BresLUp ;
No_BresLUp:
call invert ; убираем отрицательный знак
cmp ax,bx ; сравниваем на большесть числа не знаковые
;================================================================
ja BrLD1_N ; если больше то на новый алгоритм
jmp dal12 ; если нет то на обычный BrLD
BrLD1_N:
call DDLineYC
call BresLD_N
dal12:
call DDLineXC
call BresLD ; movenay to algoritm Paint Line Procedure
dal1:
cmp ax,bx ; сравниваем на большесть числа не знаковые
ja BrRD_N ; если больше то на новый алгоритм
jmp dal ; если нет то на обычный
BrRD_N:
call DDLineYC
call BresRDN ; movenay to algoritm Paint Line Procedure
dal:
call DDLineXC
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: ;
call OutPixelCoo
call OutPixel ; выводим пиксел
jmp ret_o2 ; обратно на Брезенхейм
BresLD endp
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
BresLD_N proc near
mov cx,[i]
brezen_LD_n:
cmp [E],0 ; если Е
jg deskrip_ld_n ; больше или равно 0 то jump
jmp deskrip_ld_off ; меньше 0 то jump
deskrip_ld_n: ;
dec [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_Pix_ld ; выводим пиксел
deskrip_ld_off: ;
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_Pix_ld ; выводим пиксел
ret_o_ld: ;
loop brezen_ld_n ; конец цикла
jmp exits ; выход из программы
Ou_Pix_ld: ;
call OutPixelCoo;
call OutPixel ; выводим пиксел
jmp ret_o_ld ; обратно на Брезенхейм
BresLD_N endp

;=================================================================
BresLUp proc near ; влево вверх
brezenLUp:
cmp [E],0 ; если Е
jge deskrip_onLUp ; больше или равно 0 то jump
jmp deskrip_offLUp ; меньше 0 то jump
deskrip_onLUp: ;
dec [xx] ; увеличиваем на +1
dec [yy] ; уменьшаем на -1;
mov ax,[Py] ; далее модифицируем дескриптор отклонения
mov bx,[Px] ; в зависимости от старого
sub ax,bx ; по формуле
shl ax,1 ; E=E+2*(Py-Px)
add [E],ax ;
jmp Ou_PixLUp ; выводим пиксел
deskrip_offLUp: ;
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_PixLUp ; выводим пиксел
ret_oLUp: ;
loop brezenLUp
; конец цикла
jmp exits ; выход из программы

Ou_PixLUp: ;
call OutPixelCoo
call OutPixel ; выводим пиксел
jmp ret_oLUp ; обратно на Брезенхейм
BresLUp endp ;
;
;===========================================
;===========================================
BresLUp_N proc near
mov cx,[i]
brezenLUp_N:
cmp [E],0 ; если Е
jg deskrip_on_LUp_N ; больше или равно 0 то jump
jmp deskrip_off_LUp_N ; меньше 0 то jump
deskrip_on_LUp_N: ;
dec [xx] ; увеличиваем на +1
dec [yy] ; уменьшаем на +1
mov ax,[Px] ; далее модифицируем дескриптор отклонения
mov bx,[Py] ; взависимости от старого
sub ax,bx ; по формуле
shl ax,1 ; E=E+2*(Py-Px) немного модифицируем формулу
; в связи с новым алгоритмом
add [E],ax ;
jmp Ou_Pix_LUp_N ; выводим пиксел
deskrip_off_LUp_N: ;
dec [yy] ; тут наоборот y координаты прирост больше
shl [Px],1 ; модифицируем дескриптор в зависимости от старого
mov ax,[E] ; по формуле
add ax,[Px] ; E=E+2*Px
mov [E],ax ;
sar [Px],1 ; востанавливаем Pх обратно
jmp Ou_Pix_LUp_N ; выводим пиксел
ret_o_LUp_N: ;
loop brezenLUp_N ; конец цикла
jmp exits ; выход из программы
Ou_Pix_LUp_N: ;
; mov ax,[xx] ; модифицируем координаты
; mov [x],ax ; для вывода на экран
; mov bx,[yy] ; для алгоритма вывода точки
; mov [y],bx ;
call OutPixelCoo;
call OutPixel ; выводим пиксел
jmp ret_o_LUp_N ; обратно на Брезенхейм
BresLUp_N endp ;
;=========================================

;=========================================
BresRUp proc near ; вправо вверх

brezenRUp:
cmp [E],0 ; если Е
jge deskrip_onRUp ; больше или равно 0 то jump
jmp deskrip_offRUp ; меньше 0 то jump
deskrip_onRUp: ;
inc [xx] ; увеличиваем на +1
dec [yy] ; уменьшаем на -1
mov ax,[Py] ; далее модифицируем дескриптор отклонения
mov bx,[Px] ; в зависимости от старого
sub ax,bx ; по формуле
shl ax,1 ; E=E+2*(Py-Px)
add [E],ax ;
jmp Ou_PixRUp ; выводим пиксел
deskrip_offRUp: ;
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_PixRUp ; выводим пиксел
ret_oRUp: ;
loop brezenRUp
; конец цикла
jmp exits ; выход из программы
Ou_PixRUp: ;
Call OutPixelCoo;
Call OutPixel ;выводим пиксел

jmp ret_oRUp ; обратно на Брезенхейм
BresRUp endp
;==========================================================

BresRUp_N proc near ;вправо вверх
mov cx,[i]
brezenRUp_N:
cmp [E],0 ;если Е
jg deskrip_on_RUp_N ; больше или равно 0 то jump
jmp deskrip_off_RUp_N ; меньше 0 то jump
deskrip_on_RUp_N: ;
inc [xx] ; увеличиваем на +1
dec [yy] ; уменьшаем на +1
mov ax,[Px] ; далее модифицируем дескриптор отклонения
mov bx,[Py] ; в зависимости от старого
sub ax,bx ; по формуле
shl ax,1 ; E=E+2*(Py-Px) немного модифицируем формулу
; в связи с новым алгоритмом
add [E],ax ;
jmp Ou_Pix_RUp_N ; выводим пиксел
deskrip_off_RUp_N: ;
dec [yy] ; тут наоборот y координаты прирост больше
shl [Px],1 ; модифицируем дескриптор в зависимости от старого
mov ax,[E] ; по формуле
add ax,[Px] ; E=E+2*Px
mov [E],ax ;
sar [Px],1 ; востанавливаем Pх обратно
jmp Ou_Pix_RUp_N ; выводим пиксел
ret_o_RUp_N: ;
loop brezenRUp_N ; конец цикл
jmp exits ; выход из программы
Ou_Pix_RUp_N: ;
call OutPixelCoo;
call OutPixel ; выводим пиксел
jmp ret_o_RUp_N ; обратно на Брезенхейм
BresRUp_N endp
;=============================================

BresRD proc near ; вправо вниз
brezen:
cmp [E],0 ; если Е
jge deskrip_on ; больше или равно 0 то jump
jmp deskrip_off ; меньше 0 то jump
deskrip_on: ;
inc [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_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: ;
call OutPixelCoo;
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: ;
call OutPixelCoo ;
call OutPixel ; выводим пиксел
jmp ret_o1 ; обратно на Брезенхейм

BresRDN endp

;--------------------------------------------------------
OutPixel proc near ;
call mov_w0
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 bx,[Px]
not bx
add bx,01h
mov [Px],bx
ret
invert endp

invertPy proc near
mov ax,[Py]
not ax
add ax,01h
mov [Py],ax
ret
invertPy endp
;-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
DDLineYC proc near
mov ax,[Py] ; то длинна линии будет получаться из
mov [i],ax ; Py
mov ax,[Px] ; Вычисляем дескриптор отклонения по
shl ax,1 ; формуле
sub ax,[Py] ; E=2*Px-Py
mov [E],ax ;
ret
DDLineYC endp
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

DDLineXC proc near
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] ; количество пикселей в линии
ret
DDLineXC endp

OutPixelCoo proc near
mov ax,[xx] ; модифицируем координаты
mov [x],ax ; для вывода на экран
mov bx,[yy] ;
mov [y],bx ;
ret
OutPixelCoo endp

END START



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


Lonely_Raven
****

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

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


ню вот вроде додедал:D
-=-=-=-
кто ни-будь станте БетаТестером если не лень
буду благодарен
-=-=-= :D :D
-=-=-=-=-
Эх никто и ничего и не сказал
вот оглядываю свои творения когдато
сидел парился с этими окнами
ностальгия блин

-=-=-=-=-=-=-=-=-


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


...
*****

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

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


Впечатляет!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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