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