Помощь - Поиск - Пользователи - Календарь
Полная версия: Появился Брезенхейм на Vesa 320*200 16 Mil Color
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
Shadow
кидаю пока что есть
не все до конца раелизовано и оптимизированно
-=-=
.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

Shadow
ето поака сырой из сырцов
-=-=
прямо вода капает но вроде работает
-=-=
на VESA 16 mil 320 * 200
GLuk
Ну работает вроде  :D
И, к слову, Shadow, ты б сначала доделал, а потом анонсировал... ;)
Shadow
да блин делаю по кусочкам работа блин
GLuk
А что творить-то собираешься??
Shadow
ню потом GETIMAGE PUTIMAGE и.т.д
Shadow
.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

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

-=-=-=-=-=-=-=-=-
AlaRic
Впечатляет!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.