.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