421 lines
6.3 KiB
NASM
421 lines
6.3 KiB
NASM
;borders - can be found in asm.asm at the tmp work area (size 8K = 1024 rows)
|
|
|
|
ALIGN 4
|
|
polysides dw 0
|
|
polyxy dw 16 dup(0,0);
|
|
|
|
poly PROC NEAR
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov ax,cs:starvram
|
|
mov es,ax
|
|
jmp polyf
|
|
poly ENDP
|
|
|
|
;*** POLYF / POLYFT
|
|
|
|
ALIGN 4
|
|
borders dw 4096 dup(0)
|
|
|
|
feax dd 0
|
|
fedx dd 0
|
|
|
|
fleftaddl dd 0 ;+0
|
|
fleftaddh dw 0 ;+4
|
|
fleftrown dw 0 ;+6
|
|
fleftzb dd 0 ;+8
|
|
fleftze dd 0 ;+12
|
|
flefttx0 dw 0 ;+16
|
|
fleftty0 dw 0 ;+18
|
|
flefttxa dw 0 ;+20
|
|
flefttya dw 0 ;+22
|
|
fleftcnt dw 0 ;+24
|
|
fleftcnta dw 0 ;+26
|
|
fleftd3a dw 0 ;+28
|
|
|
|
frightaddl dd 0 ;+0
|
|
frightaddh dw 0 ;+4
|
|
frightrown dw 0 ;+6
|
|
frightzb dd 0 ;+8
|
|
frightze dd 0 ;+12
|
|
frighttx0 dw 0 ;+16
|
|
frightty0 dw 0 ;+18
|
|
frighttxa dw 0 ;+20
|
|
frighttya dw 0 ;+22
|
|
frightcnt dw 0 ;+24
|
|
frightcnta dw 0 ;+26
|
|
frightd3a dw 0 ;+28
|
|
|
|
finfolen dw 0
|
|
finfo0 dw 0
|
|
finfo1 dw 0
|
|
fwmaxy1 dw 0
|
|
|
|
wminx dw 0
|
|
wmaxx dw 319
|
|
wminy dw 0+100h
|
|
wmaxy dw 399+100h
|
|
|
|
finfo dw 32 dup(0,0,0,0,0,0,0,0)
|
|
;x,y,zlo,zhi,tx,ty,0,0
|
|
|
|
polyf PROC NEAR ;ONLY CONVEX POLYGONS - FAST?
|
|
;input: polysides/polyxy
|
|
;requirements:
|
|
;es=vram
|
|
;cpolysides>=4 (not checked)
|
|
;color=set
|
|
;**COPY/SEEK UPPERMOST**
|
|
mov ax,cs
|
|
mov gs,ax
|
|
mov ds,ax
|
|
mov cx,ds:polysides
|
|
mov ax,cx
|
|
shl ax,4 ;*16
|
|
mov ds:finfolen,ax
|
|
add ax,OFFSET finfo
|
|
mov ds:finfo1,ax
|
|
mov ax,gs:wmaxy
|
|
inc ax
|
|
mov ds:fwmaxy1,ax
|
|
mov edx,077770000h
|
|
xor bx,bx
|
|
mov si,OFFSET polyxy
|
|
mov di,OFFSET finfo
|
|
mov ds:finfo0,di
|
|
pfn1: mov eax,dword ptr ds:[si]
|
|
cmp eax,edx
|
|
jg pfn2
|
|
mov edx,eax
|
|
mov bx,di
|
|
pfn2: mov dword ptr ds:[di],eax
|
|
add si,4
|
|
add di,16
|
|
loop pfn1
|
|
;[bx]=uppermost
|
|
;**SETUP REGS**
|
|
mov ds:fleftrown,-32767
|
|
mov ds:frightrown,-32767
|
|
mov si,bx
|
|
mov di,bx
|
|
mov bp,ds:[si+2]
|
|
mov bx,OFFSET borders
|
|
mov ax,bp
|
|
cmp ax,gs:wminy
|
|
jge pfn35
|
|
mov ax,gs:wminy
|
|
pfn35: mov gs:[bx],ax
|
|
add bx,2
|
|
mov cx,16 ;max tmp count to avoid hanging on illegal polygons
|
|
;eax=left
|
|
;bx=pointer to borders[]
|
|
;cx=count
|
|
;edx=right
|
|
;si=left
|
|
;di=right
|
|
;bp=y
|
|
pfn63: push cx
|
|
push bx
|
|
|
|
cmp bp,ds:fleftrown
|
|
jl pfn42
|
|
push edx
|
|
push di
|
|
mov di,si
|
|
sub di,16
|
|
cmp di,ds:finfo0
|
|
jae pfn41
|
|
add di,ds:finfolen
|
|
pfn41: mov bx,OFFSET fleftaddl
|
|
call polyfcalc
|
|
add cx,bp
|
|
mov ds:fleftrown,cx
|
|
movzx eax,word ptr ds:[si+0]
|
|
mov ebx,ds:fleftaddl
|
|
mov dx,ds:fleftaddh
|
|
sar dx,1
|
|
rcr ebx,1
|
|
xor bx,bx
|
|
sub eax,ebx
|
|
sbb ax,dx
|
|
mov si,di
|
|
pop di
|
|
pop edx
|
|
pfn42:
|
|
cmp bp,ds:frightrown
|
|
jl pfn52
|
|
push eax
|
|
push si
|
|
mov si,di
|
|
add di,16
|
|
cmp di,ds:finfo1
|
|
jb pfn51
|
|
sub di,ds:finfolen
|
|
pfn51: mov bx,OFFSET frightaddl
|
|
call polyfcalc
|
|
add cx,bp
|
|
mov ds:frightrown,cx
|
|
movzx edx,word ptr ds:[si+0]
|
|
mov ebx,ds:frightaddl
|
|
mov ax,ds:frightaddh
|
|
sar ax,1
|
|
rcr ebx,1
|
|
xor bx,bx
|
|
sub edx,ebx
|
|
sbb dx,ax
|
|
pop si
|
|
pop eax
|
|
|
|
pfn52: mov bx,ds:fleftrown
|
|
mov cx,ds:frightrown
|
|
cmp cx,bx
|
|
jl pfn61
|
|
mov cx,bx
|
|
pfn61: sub cx,bp
|
|
pop bx
|
|
cmp cx,0
|
|
jg pfn71
|
|
pfn6: pop cx
|
|
cmp bp,ds:fwmaxy1
|
|
jg pfn64
|
|
cmp si,di
|
|
je pfn64
|
|
dec cx
|
|
jz pfn64
|
|
jmp pfn63
|
|
pfn64: mov word ptr gs:[bx],-32767
|
|
mov si,OFFSET borders
|
|
call polyn_disp
|
|
ret
|
|
pfn65: ;above screen
|
|
;entering screen, cut.
|
|
add bp,cx
|
|
push bp
|
|
push cx
|
|
cmp bp,gs:wminy
|
|
jl pfn66
|
|
sub bp,cx
|
|
mov cx,gs:wminy
|
|
sub cx,bp
|
|
pfn66: ;
|
|
movsx ecx,cx
|
|
ror eax,16
|
|
mov ds:feax,eax
|
|
ror edx,16
|
|
mov ds:fedx,edx
|
|
;
|
|
mov ax,ds:fleftaddh
|
|
shl eax,16
|
|
mov ax,word ptr ds:fleftaddl[2]
|
|
imul ecx
|
|
add ds:feax,eax
|
|
;
|
|
mov ax,ds:frightaddh
|
|
shl eax,16
|
|
mov ax,word ptr ds:frightaddl[2]
|
|
imul ecx
|
|
add ds:fedx,eax
|
|
;
|
|
mov eax,ds:feax
|
|
ror eax,16
|
|
mov edx,ds:fedx
|
|
ror edx,16
|
|
mov bp,cx
|
|
pop cx
|
|
sub cx,bp
|
|
pop bp
|
|
cmp cx,0
|
|
jne pfn6b
|
|
jmp pfn6
|
|
pfn6b: mov bp,gs:wminy
|
|
pfn71: ;process segment
|
|
cmp bp,gs:wminy
|
|
jl pfn65 ;above screen still
|
|
add bp,cx
|
|
;clip max to maxy
|
|
cmp bp,ds:fwmaxy1
|
|
jle pfn72
|
|
sub bp,cx
|
|
mov cx,ds:fwmaxy1
|
|
sub cx,bp
|
|
mov bp,ds:fwmaxy1
|
|
pfn72: cmp cx,0
|
|
jle pfn6
|
|
push si
|
|
push di
|
|
push bp
|
|
ror ebx,16
|
|
neg cx
|
|
mov bx,cx
|
|
ror ebx,16
|
|
mov esi,ds:fleftaddl
|
|
mov edi,ds:frightaddl
|
|
mov bp,ds:fleftaddh
|
|
mov cx,ds:frightaddh
|
|
pfn7: add eax,esi
|
|
adc ax,bp
|
|
add edx,edi
|
|
adc dx,cx
|
|
mov gs:[bx],ax
|
|
mov gs:[bx+2],dx
|
|
add ebx,10004h
|
|
jnc pfn7
|
|
pop bp
|
|
pop di
|
|
pop si
|
|
jmp pfn6
|
|
polyfcalc: ;**** subroutine ****
|
|
;calc slope for line [SI]->[DI] to [BX], returns CX=len
|
|
mov cx,ds:[di+2]
|
|
sub cx,bp ;ds:[si+2]
|
|
jle pfc1
|
|
mov ax,ds:[di+0]
|
|
sub ax,ds:[si+0]
|
|
jl pfc2
|
|
xor dx,dx
|
|
div cx
|
|
mov ds:[bx+4],ax
|
|
xor ax,ax
|
|
div cx
|
|
mov ds:[bx+2],ax
|
|
;dec cx
|
|
ret
|
|
pfc1: xor cx,cx
|
|
ret
|
|
pfc2: neg ax
|
|
xor dx,dx
|
|
div cx
|
|
push ax
|
|
xor ax,ax
|
|
div cx
|
|
pop dx
|
|
neg ax
|
|
adc dx,0
|
|
neg dx
|
|
mov ds:[bx+4],dx
|
|
mov ds:[bx+2],ax
|
|
;dec cx
|
|
ret
|
|
polyf ENDP
|
|
|
|
polyn_disp PROC NEAR
|
|
;calc/load regs
|
|
mov si,OFFSET borders
|
|
mov bx,ds:[si]
|
|
add si,2
|
|
plnd3: ;draw hlines
|
|
push cx
|
|
push bx
|
|
mov ax,ds:[si]
|
|
cmp ax,-32767
|
|
je polyn_dispx
|
|
mov dx,ds:[si+2]
|
|
call hline1 ;must not change DS:SI!
|
|
pop bx
|
|
pop cx
|
|
inc bx
|
|
add si,8
|
|
jmp plnd3
|
|
polyn_dispx:
|
|
pop bx
|
|
pop cx
|
|
mov dx,3ceh
|
|
mov ax,0ff08h
|
|
out dx,ax
|
|
ret
|
|
polyn_disp ENDP
|
|
|
|
ALIGN 4
|
|
leftside db 11111111b,01111111b,00111111b,00011111b,00001111b,00000111b,00000011b,00000001b
|
|
rightside db 10000000b,11000000b,11100000b,11110000b,11111000b,11111100b,11111110b,11111111b
|
|
|
|
ALIGN 4
|
|
hline1 PROC NEAR
|
|
;DS:SI must be preserved!
|
|
;(ax,bx)-(dx,bx)
|
|
sub bx,256
|
|
cmp bx,199
|
|
ja hlixx
|
|
|
|
cmp ax,dx
|
|
jl hli1
|
|
xchg ax,dx
|
|
hli1: inc dx
|
|
|
|
dec dx
|
|
cmp dx,ax
|
|
jg hli21
|
|
hlixx: ret
|
|
|
|
hli21: cmp ax,0
|
|
jnl hli2
|
|
cmp dx,0
|
|
jl hli0
|
|
xor ax,ax
|
|
hli2: cmp dx,cs:wmaxx
|
|
jng hliok
|
|
cmp ax,cs:wmaxx
|
|
jg hli0
|
|
mov dx,cs:wmaxx
|
|
|
|
hliok: mov di,ax
|
|
sar di,3
|
|
mov cx,dx
|
|
sar cx,3
|
|
sub cx,di
|
|
shl bx,1
|
|
add di,ds:rows[bx]
|
|
|
|
mov bp,7
|
|
and bp,ax
|
|
mov bl,ds:leftside[bp]
|
|
mov bp,7
|
|
and bp,dx
|
|
mov bh,ds:rightside[bp]
|
|
|
|
cmp cx,0
|
|
je hli30
|
|
|
|
mov dx,3ceh
|
|
mov al,8
|
|
mov ah,bl
|
|
out dx,ax
|
|
|
|
mov ah,es:[di]
|
|
mov byte ptr es:[di],255
|
|
inc di
|
|
|
|
dec cx
|
|
jcxz hli33
|
|
|
|
mov ah,0ffh
|
|
out dx,ax
|
|
mov ax,0ffffh
|
|
test di,1
|
|
jz hli32
|
|
mov es:[di],al
|
|
inc di
|
|
dec cx
|
|
hli32: shr cx,1
|
|
rep stosw
|
|
adc cx,cx
|
|
rep stosb
|
|
|
|
hli33: mov dx,3ceh
|
|
mov al,8
|
|
mov ah,bh
|
|
out dx,ax
|
|
mov ah,es:[di]
|
|
mov byte ptr es:[di],255
|
|
|
|
hli0: ret
|
|
hli30: ;end and beg in same byte
|
|
mov dx,3ceh
|
|
mov al,8
|
|
mov ah,bh
|
|
and ah,bl
|
|
out dx,ax
|
|
mov al,es:[di]
|
|
mov byte ptr es:[di],255
|
|
ret
|
|
hline1 ENDP
|