SecondReality/TWIST/ASM
2017-09-24 01:45:36 +02:00

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