485 lines
6.8 KiB
NASM
485 lines
6.8 KiB
NASM
;256 color normal routines
|
|
|
|
;routines ending in "1" are vector drawers:
|
|
; DS:SI preserved
|
|
; OUT 3C4,02h required
|
|
; DS=CS & ES=vram required
|
|
|
|
ALIGN 4
|
|
nrpset PROC FAR
|
|
;requires: OUT 3C4,2
|
|
;DS:SI preserved, CX preserved!
|
|
shl bx,1
|
|
mov di,ds:rows[bx]
|
|
mov bx,3
|
|
and bx,dx
|
|
sar dx,2
|
|
add di,dx
|
|
mov al,ds:middledot[bx]
|
|
mov dx,3c5h
|
|
out dx,al
|
|
mov al,ds:color1
|
|
mov es:[di],al
|
|
ret
|
|
nrpset ENDP
|
|
|
|
nrhline PROC FAR
|
|
;requires: OUT 3C4,2
|
|
;DS:SI must be preserved!
|
|
;(ax,bx)-(dx,bx)
|
|
cmp ax,dx
|
|
jl nrhi1
|
|
xchg ax,dx
|
|
nrhi1:
|
|
cmp ax,0
|
|
jnl nrhi2
|
|
cmp dx,0
|
|
jl nrhi0
|
|
xor ax,ax
|
|
nrhi2: cmp dx,ds:wmaxx
|
|
jng nrhi21
|
|
cmp ax,ds:wmaxx
|
|
jg nrhi0
|
|
mov dx,ds:wmaxx
|
|
|
|
nrhi21: mov di,ax
|
|
sar di,2
|
|
mov cx,dx
|
|
sar cx,2
|
|
sub cx,di
|
|
shl bx,1
|
|
add di,ds:rows[bx]
|
|
|
|
mov bp,3
|
|
and bp,ax
|
|
mov bh,ds:leftside[bp]
|
|
mov bp,3
|
|
and bp,dx
|
|
mov bl,ds:rightside[bp]
|
|
mov dx,3c5h
|
|
|
|
;(di..si,bx)
|
|
cmp cx,0
|
|
je nrhi30
|
|
;left side
|
|
mov al,bh
|
|
out dx,al
|
|
mov al,ds:color1
|
|
stosb
|
|
dec cx
|
|
mov ah,al
|
|
;middle
|
|
jcxz nrhi33
|
|
mov al,0fh
|
|
out dx,al
|
|
mov al,ah
|
|
test di,1
|
|
jz nrhi32
|
|
stosb
|
|
dec cx
|
|
nrhi32: shr cx,1
|
|
rep stosw
|
|
adc cx,cx
|
|
rep stosb
|
|
nrhi33: ;right side
|
|
mov al,bl
|
|
out dx,al
|
|
mov al,ah
|
|
mov es:[di],al
|
|
nrhi0: ret
|
|
nrhi30: ;end and beg in same byte
|
|
mov al,bl
|
|
and al,bh
|
|
out dx,al
|
|
mov al,ds:color1
|
|
mov es:[di],al
|
|
ret
|
|
nrhline ENDP
|
|
|
|
;line variables - shared - also in vidtwe.asm
|
|
;xdif dw 0
|
|
;ydif dw 0
|
|
;xabs dw 0
|
|
;yabs dw 0
|
|
;xsgn dw 0
|
|
;ysgn dw 0
|
|
;xtmp dw 0
|
|
;ytmp dw 0
|
|
;tmplnx dw 0
|
|
;tmplny dw 0
|
|
|
|
nrpsetc PROC NEAR
|
|
;(dx,bx)=(color), es must be 0a000h
|
|
;uses nothing
|
|
push ax
|
|
push bx
|
|
push cx
|
|
push dx
|
|
mov ch,al
|
|
mov cl,dl
|
|
shl bx,1
|
|
mov bx,cs:rows[bx]
|
|
sar dx,1
|
|
sar dx,1
|
|
add bx,dx
|
|
and cl,3
|
|
mov ax,102h
|
|
mov dx,03c4h
|
|
shl ah,cl
|
|
out dx,ax
|
|
mov al,cs:color1
|
|
mov es:[bx],al
|
|
pop dx
|
|
pop cx
|
|
pop bx
|
|
pop ax
|
|
ret
|
|
nrpsetc ENDP
|
|
|
|
nrlineto PROC FAR
|
|
;draw line from (cx,ax) to (dx,bx) with color (color)
|
|
;requires ds=cs, es=vram, changes: ax
|
|
push cx
|
|
push si
|
|
push di
|
|
push bp
|
|
push dx
|
|
push bx
|
|
|
|
mov ds:tmplnx,cx
|
|
mov ds:tmplny,ax
|
|
|
|
;set insider point as begin of line
|
|
cmp dx,ds:wmaxx
|
|
ja nrlt4
|
|
cmp bx,wmaxy
|
|
ja nrlt4
|
|
jmp nrlt5 ;dx,bx is inside, no changes
|
|
nrlt4: ;dx,bx outside, swap
|
|
xchg bx,ds:tmplny
|
|
xchg dx,ds:tmplnx
|
|
;check with new bx,dx
|
|
cmp dx,ds:wmaxx
|
|
ja nrlt6
|
|
cmp bx,wmaxy
|
|
ja nrlt6
|
|
jmp nrlt5 ;dx,bx is inside
|
|
|
|
nrlt6: ;both ends outside! Cut 'em here, not ready yet
|
|
|
|
nrlt5: mov ds:xtmp,dx
|
|
mov ds:ytmp,bx
|
|
;calc differencies xdif,ydif (+-) & abs difs, xabs,yabs (+)
|
|
;and signs xsgn,ysgn (-1/0/1)
|
|
xor cx,cx
|
|
mov ax,ds:tmplnx
|
|
sub ax,dx
|
|
mov ds:xdif,ax
|
|
or ax,ax
|
|
je nrlt1
|
|
inc cx
|
|
test ax,32768
|
|
jz nrlt1
|
|
neg ax
|
|
dec cx
|
|
dec cx
|
|
nrlt1: mov ds:xabs,ax
|
|
mov ds:xsgn,cx
|
|
|
|
xor cx,cx
|
|
mov ax,ds:tmplny
|
|
sub ax,bx
|
|
mov ds:ydif,ax
|
|
or ax,ax
|
|
je nrlt2
|
|
inc cx
|
|
test ax,32768
|
|
jz nrlt2
|
|
neg ax
|
|
dec cx
|
|
dec cx
|
|
nrlt2: mov ds:yabs,ax
|
|
mov ds:ysgn,cx
|
|
|
|
;which is bigger?
|
|
cmp ax,ds:xabs
|
|
ja nrlt3
|
|
|
|
;xbigger
|
|
|
|
;calc addl/h (si,di)
|
|
jne nrlt9
|
|
;1/1 addition, 45 degree curve
|
|
cmp ax,0
|
|
jne nrlt15
|
|
mov dx,cs:tmplnx
|
|
mov bx,ds:tmplny
|
|
call nrpsetc
|
|
jmp nrlt10
|
|
nrlt15: mov di,ds:ysgn
|
|
mov si,65535
|
|
jmp nrlt10
|
|
nrlt9: mov dx,ax ;dx=yabs
|
|
xor ax,ax
|
|
div ds:xabs ;ax=lowadd
|
|
mov si,ax
|
|
mov di,ds:ysgn
|
|
|
|
nrlt10: mov ax,32767
|
|
mov bp,ds:xsgn
|
|
mov cx,ds:xabs
|
|
inc cx
|
|
mov dx,ds:xtmp
|
|
mov bx,ds:ytmp
|
|
nrlt7: call nrpsetc
|
|
add dx,bp ;xsgn
|
|
add ax,si ;yaddl
|
|
jnc nrlt8
|
|
add bx,di ;ysgn
|
|
nrlt8: loop nrlt7
|
|
|
|
jmp nrlt0
|
|
|
|
|
|
nrlt3: ;ybigger
|
|
|
|
mov dx,ds:xabs
|
|
xor ax,ax
|
|
div ds:yabs ;ax=lowadd
|
|
mov si,ax
|
|
mov di,ds:xsgn
|
|
|
|
nrlt12: mov ax,32767
|
|
mov bp,ds:ysgn
|
|
mov cx,ds:yabs
|
|
inc cx
|
|
mov dx,ds:xtmp
|
|
mov bx,ds:ytmp
|
|
nrlt13: call nrpsetc
|
|
add bx,bp ;ysgn
|
|
add ax,si ;xaddl
|
|
jnc nrlt14
|
|
add dx,di ;xsgn
|
|
nrlt14: loop nrlt13
|
|
|
|
nrlt0: pop bx
|
|
pop dx
|
|
mov ds:tmplnx,dx
|
|
mov ds:tmplny,bx
|
|
pop bp
|
|
pop di
|
|
pop si
|
|
pop cx
|
|
ret
|
|
nrlineto ENDP
|
|
|
|
nrhlinegroup PROC FAR
|
|
;requires: OUT 3C4,2
|
|
mov dx,3c4h
|
|
mov al,2
|
|
out dx,al
|
|
|
|
mov bx,gs:[si]
|
|
add si,2
|
|
dec bx
|
|
push bx
|
|
|
|
nrhg92: pop bx
|
|
inc bx
|
|
push bx
|
|
mov ax,gs:[si]
|
|
add si,2
|
|
cmp ax,-32767
|
|
jne nrhg91
|
|
pop bx
|
|
ret
|
|
nrhg91: mov dx,ax
|
|
mov ax,gs:[si]
|
|
add si,2
|
|
|
|
cmp ax,dx
|
|
jl nrhg1
|
|
xchg ax,dx
|
|
nrhg1:
|
|
cmp ax,ds:wminx
|
|
jnl nrhg2
|
|
cmp dx,ds:wminx
|
|
jl nrhg92
|
|
mov ax,ds:wminx
|
|
nrhg2: cmp dx,ds:wmaxx
|
|
jng nrhg21
|
|
cmp ax,ds:wmaxx
|
|
jg nrhg92
|
|
mov dx,ds:wmaxx
|
|
|
|
nrhg21: mov di,ax
|
|
mov cx,dx
|
|
sub cx,ax
|
|
shl bx,1
|
|
add di,ds:rows[bx]
|
|
mov al,cs:color1
|
|
mov ah,al
|
|
|
|
cmp cx,8
|
|
jl nrhg22
|
|
|
|
mov dx,ax
|
|
shl eax,16
|
|
mov ax,dx
|
|
|
|
mov dx,cx
|
|
mov cx,4
|
|
sub cx,di
|
|
and cx,3
|
|
sub dx,cx
|
|
rep stosb
|
|
mov cx,dx
|
|
shr cx,2
|
|
rep stosd
|
|
mov cx,dx
|
|
and cx,3
|
|
rep stosb
|
|
jmp nrhg92
|
|
|
|
nrhg22: shr cx,1
|
|
rep stosw
|
|
adc cx,cx
|
|
rep stosb
|
|
jmp nrhg92
|
|
nrhlinegroup ENDP
|
|
|
|
ALIGN 2
|
|
bpmultable LABEL WORD
|
|
dw 0
|
|
cc=1
|
|
REPT 255
|
|
dw (16383)/cc
|
|
cc=cc+1
|
|
ENDM
|
|
|
|
public _dimtable
|
|
_dimtable db 256 dup(1)
|
|
ALIGN 2
|
|
tmpax dw 0
|
|
|
|
nrthlinegroup PROC NEAR
|
|
;requires: OUT 3C4,2
|
|
mov dx,3c4h
|
|
mov al,2
|
|
out dx,al
|
|
|
|
mov bx,gs:[si]
|
|
add si,2
|
|
dec bx
|
|
jmp tnrg93
|
|
tnrg92: pop bx
|
|
add si,8
|
|
tnrg93: inc bx
|
|
push bx
|
|
mov dx,gs:[si] ;left
|
|
cmp dx,-32767
|
|
jne tnrg91
|
|
pop bx
|
|
ret
|
|
tnrg91: mov ax,gs:[si+2] ;right
|
|
|
|
cmp ax,dx
|
|
jl tnrg1
|
|
xchg ax,dx
|
|
mov cx,gs:[si+4]
|
|
xchg cx,gs:[si+6]
|
|
mov gs:[si+4],cx
|
|
tnrg1:
|
|
cmp ax,ds:wminx
|
|
jnl tnrg2
|
|
cmp dx,ds:wminx
|
|
jl tnrg92
|
|
mov ax,ds:wminx
|
|
tnrg2: cmp dx,ds:wmaxx
|
|
jng tnrg21
|
|
cmp ax,ds:wmaxx
|
|
jg tnrg92
|
|
mov dx,ds:wmaxx
|
|
|
|
tnrg21: mov ds:tmpax,ax
|
|
mov cx,dx
|
|
sub cx,ax
|
|
jcxz tnrg92
|
|
shl bx,1
|
|
mov di,ds:rows[bx]
|
|
|
|
mov bp,cx ;count
|
|
|
|
shl bp,1
|
|
mov bx,word ptr cs:bpmultable[bp]
|
|
shr bp,1
|
|
|
|
mov ah,gs:[si+4] ;endx
|
|
sub ah,gs:[si+6] ;startx
|
|
xor al,al
|
|
imul bx
|
|
shld dx,ax,2
|
|
;dx=y, eaxh=x
|
|
mov cl,dh
|
|
mov ah,dl
|
|
xor al,al
|
|
rol eax,16 ;xadd
|
|
|
|
mov ah,gs:[si+5] ;endy
|
|
sub ah,gs:[si+7] ;starty
|
|
xor al,al
|
|
imul bx
|
|
shld dx,ax,2
|
|
mov ch,dh
|
|
mov dh,dl ;yadd
|
|
xor dl,dl
|
|
rol edx,16
|
|
mov dx,cx
|
|
cmp dl,80h
|
|
adc dh,-1 ;x/yaddhi
|
|
|
|
push si
|
|
push ds
|
|
mov ax,fs
|
|
mov ds,ax
|
|
|
|
shl bp,4
|
|
mov bx,cs:tmpax
|
|
shl bx,4
|
|
add bx,OFFSET bas256
|
|
add bp,bx
|
|
mov ax,bx
|
|
mov byte ptr cs:[bp],0c3h ;ret
|
|
push bp
|
|
movzx ebx,word ptr gs:[si+6] ;startxy/zero ylow
|
|
xor ecx,ecx ;zero xlow
|
|
call ax
|
|
pop bx
|
|
mov byte ptr cs:[bx],066h ;start of add ecx,eax
|
|
|
|
pop ds
|
|
pop si
|
|
jmp tnrg92
|
|
|
|
;....Exx..H....L....
|
|
;ax xadd - tmp
|
|
;bx ylow y x
|
|
;cx xlow - -
|
|
;dx yadd yah xah
|
|
;si - - -
|
|
;di - distbase
|
|
;bp - - -
|
|
|
|
ALIGN 16
|
|
bas256: cc=0
|
|
REPT 256
|
|
add ecx,eax ;@0
|
|
mov al,ds:[bx] ;@3
|
|
adc ebx,edx ;@5
|
|
adc bh,0 ;@8
|
|
db 26h,88h,85h ;@B ;mov es:[di+XXX],al
|
|
dw cc ;@E ;XXX
|
|
cc=cc+1 ;@10
|
|
ENDM
|
|
add ecx,eax
|
|
nrthlinegroup ENDP
|