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