.model small
.stack 100h
.data
;---------------------------------------------------
dex dw 0
dy dw 0
x_add dw 0
y_add dw 0
maxd dw 0
act_dx dw 0
act_dy dw 0
x1 dw 0
y1 dw 0
x2 dw 0
y2 dw 0
color db 15
;---------------------------------------------------
.code
start: mov ax,@data
mov ds,ax
mov ah,0h
mov al,13h
int 10h
mov al, 10
push ax
mov al, 10
push ax
mov al, 20
push ax
mov al, 20
push ax
mov color, 15
call line
;---------------------------------------------------
lpx: mov ah, 01h
int 16h
jz lpx
mov ah,0
mov al,3
int 10h
mov ah,4ch
int 21h
;---------------------------------------------------
; Bresenham Line Algo
;---------------------------------------------------
;
; Newsgroups: comp.lang.asm.x86
; Von: fl...@usa.net (Flag)
; Datum: 1998/11/07
; Betreff: Re: Bresenham-algorithm
;
; ...
;
;this is the bresenham-algo in c:
;
; dx=abs(x2-x1);
; dy=abs(y2-y1);
;
; if(x1>x2) x_add=-1;
; else x_add=1;
;
; if(y1>y2) y_add=-1;
; else y_add=1;
;
; x=x1;
; y=y1;
;
; if (dy>dx) maxd=dy;
; else maxd=dx;
;
; act_dx=act_dy=0;
;
; for(c=0;c<maxd;c++)
; {
; act_dy+=dy;
; if(act_dy>=maxd)
; {
; act_dy-=maxd;
; y+=y_add;
; }
;
; act_dx+=dx;
; if(act_dx>=maxd)
; {
; act_dx-=maxd;
; x+=x_add;
; }
; ;plot here!!!
; }
;
; this is the asm source(NASM):
;
; ...
;
; nischt is, es folgt die tasm version ;)
; mit schnellem plotter ohne Systemroutinen
line: push bp
mov bp,sp
mov ax,[bp+4]
mov [y2],ax
mov ax,[bp+6]
mov [x2],ax
mov ax,[bp+8]
mov [y1],ax
mov ax,[bp+10]
mov [x1],ax
mov ax,[x2]
sub ax,[x1]
cmp ax,0
jnl abs1
neg ax
abs1: mov [dex],ax
;-------------------------------------dex=abs(x2-x1)
mov ax,[y2]
sub ax,[y1]
cmp ax,0
jnl abs2
neg ax
abs2: mov [dy],ax
;-------------------------------------dy=abs(y2-y1)
mov ax,[x1]
cmp ax,[x2]
jl min
mov [x_add], -1
jmp ende
min: mov [x_add], 1
ende: ;----------------------------------------if (x1>x2)
mov ax,[y1]
cmp ax,[y2]
jl min2
mov [y_add], -1
jmp end2
min2: mov [y_add], 1
end2: ;----------------------------------------if (y1>y2)
mov ax,[dy]
cmp ax,[dex]
jl min3
mov ax,[dy]
mov [maxd],ax
jmp end3
min3: mov ax,[dex]
mov [maxd],ax
end3: mov cx,[maxd]
here: mov ax,[dy]
add [act_dy],ax
mov ax,[act_dy]
cmp ax,[maxd]
jl next
mov ax,[maxd]
sub [act_dy],ax
mov ax,[y_add]
add [y1],ax
next: mov ax,[dex]
add [act_dx],ax
mov ax,[act_dx]
cmp ax,[maxd]
jl next2
mov ax,[maxd]
sub [act_dx],ax
mov ax,[x_add]
add [x1],ax
next2: call putpixel
loop here
mov sp,bp
pop bp
ret 8
;---------------------------------------plot_0a000h
putpixel:
push ax
push bx
push cx
push dx
mov ax,0a000h
mov es,ax
xor ax,ax
mov al,byte ptr y1 ;Offset: 320*Y+X=256*Y+64*Y+X
shl ax,6 ;64*Y
add ah,byte ptr y1 ;+256*Y
add ax,[x1] ;+X
mov di,ax
mov al,color
mov es:[di],al
pop dx
pop cx
pop bx
pop ax
ret
;----------------------------------wait for retrace
vwait: mov dx, 3dah
ll1: in al, dx
and al, 08h
jnz ll1
ll2: in al, dx
and al, 08h
jz ll2
ret
;----------------------------------clearscreen_fast
clrscr: mov ax,0A000h
mov es,ax
db 66h
xor ax,ax
xor di,di
mov cx,16000
db 66h
rep stosw
ret
;---------------------------------------------------
end start