158 lines
2.7 KiB
Text
158 lines
2.7 KiB
Text
PUBLIC _docol,_docolset
|
|
|
|
PUBLIC _docol_mapc,_docol_maph,_docol_ycd
|
|
PUBLIC _docol_hig,_docol_higr,_docol_higrr,_docol_higrrr
|
|
PUBLIC _docol_bailout,_docol_debug
|
|
PUBLIC _docol_avg
|
|
|
|
BAILOUT equ 256
|
|
|
|
ALIGN 16
|
|
_docol_hig dd 256 dup(0)
|
|
_docol_higr dd 256 dup(0)
|
|
_docol_higrr dd 256 dup(0)
|
|
_docol_higrrr dd 256 dup(0)
|
|
_docol_ycd dd 200 dup(0)
|
|
_docol_bailout dw BAILOUT
|
|
_docol_mapc dw 0,0
|
|
_docol_maph dw 0,0
|
|
_docol_avg dw 0,0
|
|
_docol_debug dd 0
|
|
|
|
_docolset PROC FAR
|
|
CBEG
|
|
movpar ax,0
|
|
mov cx,(slf1-slf0)/BAILOUT
|
|
mul cx
|
|
add ax,OFFSET slf0
|
|
mov bx,ax
|
|
movpar ax,1
|
|
movpar dx,2
|
|
mov cs:[bx+10+2],ax
|
|
mov cs:[bx+10+4],dx
|
|
CEND
|
|
_docolset ENDP
|
|
|
|
public _doavg
|
|
_doavg PROC FAR
|
|
CBEG
|
|
mov ax,SEG _vbuf
|
|
mov es,ax
|
|
mov ds,cs:_docol_avg[2]
|
|
movpar di,0
|
|
|
|
add di,80*320
|
|
mov cx,200-80
|
|
@@1: mov bl,es:[di]
|
|
diadd=2
|
|
REPT 159
|
|
mov bh,es:[di+diadd]
|
|
mov al,ds:[bx]
|
|
mov bl,bh
|
|
mov es:[di+diadd-1],al
|
|
diadd=diadd+2
|
|
ENDM
|
|
add di,320
|
|
dec cx
|
|
jz @@2
|
|
jmp @@1
|
|
@@2:
|
|
CEND
|
|
_doavg ENDP
|
|
|
|
_docol PROC FAR
|
|
CBEG
|
|
mov ax,cs
|
|
mov ds,ax
|
|
|
|
push bp ;store C parameter start
|
|
|
|
mov fs,ds:_docol_maph[2]
|
|
mov gs,ds:_docol_mapc[2]
|
|
|
|
movpar ax,1
|
|
shl ax,7
|
|
movpar si,0
|
|
movzx esi,si
|
|
add si,ax ;basepos
|
|
|
|
xor ebx,ebx
|
|
;movpar ax,3 ;screen pos
|
|
;and ax,3
|
|
;mov bh,al ;scatterer
|
|
|
|
movpar dx,2
|
|
movsx edx,dx
|
|
shl edx,7
|
|
rol edx,16
|
|
mov bp,dx
|
|
add bp,-128 ;baseadd
|
|
xor dx,dx
|
|
|
|
;selfmod: vram/pos, docol_ycd/pos
|
|
;eax - -
|
|
;ebx indexer-tmp (+scatterpos)
|
|
;ecx - -
|
|
;edx xaddl 0
|
|
;esi xl x
|
|
;edi - -
|
|
;ebp - xaddh
|
|
;ds code
|
|
;es -
|
|
;fs maph
|
|
;gs mapc
|
|
diadd=OFFSET slf0
|
|
REPT BAILOUT
|
|
and si,16383
|
|
mov bl,fs:[si]
|
|
mov eax,ds:_docol_hig[ebx*4]
|
|
mov dword ptr ds:[diadd+0+2],eax ;set compare
|
|
add esi,edx
|
|
mov al,gs:[si]
|
|
mov byte ptr ds:[diadd+8+1],al ;set color
|
|
adc si,bp
|
|
diadd=diadd+(slf1-slf0)/BAILOUT
|
|
ENDM
|
|
|
|
jmp @@flsh
|
|
@@flsh: pop bp ;restore C parameter start
|
|
|
|
mov ax,SEG _vbuf
|
|
mov es,ax
|
|
movpar ax,3
|
|
mov bp,ax
|
|
mov di,OFFSET _docol_ycd+199*4
|
|
mov ecx,ds:[di]
|
|
xor eax,eax
|
|
|
|
;selfmod: vram/pos, docol_ycd/pos
|
|
;eax yc ycl
|
|
;ebx - -
|
|
;ecx ycaddh ycaddl
|
|
;edx - -
|
|
;esi - -
|
|
;edi - offset to ycd
|
|
;ebp - offset to vram
|
|
;ds code
|
|
;es vram
|
|
|
|
int 3
|
|
|
|
slf0: siadd=0
|
|
REPT BAILOUT
|
|
local l1,l2,l3
|
|
l3: cmp eax,12345678h ;@0 compare ray / scene
|
|
jge short l1 ;@6 hit?
|
|
mov cl,12h ;@8 load color
|
|
l2: sub eax,12345678h ;@10 adjust next ray pos
|
|
mov es:[bp+0],cl ; store color
|
|
sub di,4 ; adjust raytable pointer
|
|
sub bp,320 ; next screen pos
|
|
cmp dword ptr ds:l3[2],eax ; next ray hits too?
|
|
jge short l2 ; yup.
|
|
mov ecx,ds:[di] ; next ray direction
|
|
l1: add eax,ecx ; on we go in Z
|
|
siadd=siadd+4
|
|
ENDM
|
|
slf1: CEND
|
|
_docol ENDP
|