📄 tmap.nas
字号:
;; we need at least 200 lines for the sky.;;;; NOTE: the sky should never wrap, so it could use a faster method.;; for the moment, we'll still use a wrapping method...;;;; IT S JUST A QUICK CUT N PASTE, WAS NOT OPTIMISED AS IT SHOULD BE !!!;;;;----------------------------------------------------------------------cglobal R_DrawSkyColumn_8; align 16R_DrawSkyColumn_8: push ebp push esi push edi push ebx;;;; dest = ylookup[dc_yl] + columnofs[dc_x];;; mov ebp,[dc_yl] mov ebx,ebp mov edi,[ylookup+ebx*4] mov ebx,[dc_x] add edi,[columnofs+ebx*4] ;; edi = dest;;;; pixelcount = yh - yl + 1;; mov eax,[dc_yh] inc eax sub eax,ebp ;; pixel count mov [pixelcount],eax ;; save for final pixel jle near vskydone ;; nothing to scale;;;; frac = dc_texturemid - (centery-dc_yl)*fracstep;;; mov ecx,[dc_iscale] ;; fracstep mov eax,[centery] sub eax,ebp imul eax,ecx mov edx,[dc_texturemid] sub edx,eax mov ebx,edx shr ebx,16 ;; frac int. and ebx,0xff shl edx,16 ;; y frac up mov ebp,ecx shl ebp,16 ;; fracstep f. up shr ecx,16 ;; fracstep i. ->cl mov esi,[dc_source];;;; lets rock :) !;; mov eax,[pixelcount] mov dh,al shr eax,0x2 mov ch,al ;; quad count mov eax,[dc_colormap] test dh,0x3 je vskyquadloop;;;; do un-even pixel;; test dh,0x1 je f2 mov al,[esi+ebx] ;; prep un-even loops add edx,ebp ;; ypos f += ystep f adc bl,cl ;; ypos i += ystep i mov dl,[eax] ;; colormap texel mov [edi],dl ;; output pixelp8: add edi,0x12345678;;;; do two non-quad-aligned pixels;;f2: test dh,0x2 je skyf3 mov al,[esi+ebx] ;; fetch source texel add edx,ebp ;; ypos f += ystep f adc bl,cl ;; ypos i += ystep i mov dl,[eax] ;; colormap texel mov [edi],dl ;; output pixel mov al,[esi+ebx] ;; fetch source texel add edx,ebp ;; ypos f += ystep f adc bl,cl ;; ypos i += ystep i mov dl,[eax] ;; colormap texelp9: add edi,0x12345678 mov [edi],dl ;; output pixelpa: add edi,0x12345678;;;; test if there was at least 4 pixels;;skyf3: test ch,0xff ;; test quad count je vskydone;;;; ebp : ystep frac. upper 24 bits;; edx : y frac. upper 24 bits;; ebx : y i. lower 7 bits, masked for index;; ecx : ch = counter, cl = y step i.;; eax : colormap aligned 256;; esi : source texture column;; edi : dest screen;;align 4vskyquadloop: mov al,[esi+ebx] ;; prep loop add edx,ebp ;; ypos f += ystep f mov dl,[eax] ;; colormap texel adc bl,cl ;; ypos i += ystep i mov [edi],dl ;; output pixel mov al,[esi+ebx] ;; fetch source texel add edx,ebp adc bl,clpb: add edi,0x12345678 mov dl,[eax] mov [edi],dl mov al,[esi+ebx] ;; fetch source texel add edx,ebp adc bl,clpc: add edi,0x12345678 mov dl,[eax] mov [edi],dl mov al,[esi+ebx] ;; fetch source texel add edx,ebp adc bl,clpd: add edi,0x12345678 mov dl,[eax] mov [edi],dlpe: add edi,0x12345678 dec ch jne vskyquadloopvskydone: pop ebx pop edi pop esi pop ebp ret;;----------------------------------------------------------------------;; R_DrawTranslucentColumn_8;;;; Vertical column texture drawer, with transparency. Replaces Doom2's;; 'fuzz' effect, which was not so beautiful.;; Transparency is always impressive in some way, don't know why...;;----------------------------------------------------------------------cglobal R_DrawTranslucentColumn_8R_DrawTranslucentColumn_8: push ebp ;; preserve caller's stack frame pointer push esi ;; preserve register variables push edi push ebx;;;; dest = ylookup[dc_yl] + columnofs[dc_x];;; mov ebp,[dc_yl] mov ebx,ebp mov edi,[ylookup+ebx*4] mov ebx,[dc_x] add edi,[columnofs+ebx*4] ;; edi = dest;;;; pixelcount = yh - yl + 1;; mov eax,[dc_yh] inc eax sub eax,ebp ;; pixel count mov [pixelcount],eax ;; save for final pixel jle near vtdone ;; nothing to scale;;;; frac = dc_texturemid - (centery-dc_yl)*fracstep;;; mov ecx,[dc_iscale] ;; fracstep mov eax,[centery] sub eax,ebp imul eax,ecx mov edx,[dc_texturemid] sub edx,eax mov ebx,edx shr ebx,16 ;; frac int. and ebx,0x7f shl edx,16 ;; y frac up mov ebp,ecx shl ebp,16 ;; fracstep f. up shr ecx,16 ;; fracstep i. ->cl and cl,0x7f push cx mov ecx,edx pop cx mov edx,[dc_colormap] mov esi,[dc_source];;;; lets rock :) !;; mov eax,[pixelcount] shr eax,0x2 test byte [pixelcount],0x3 mov ch,al ;; quad count mov eax,[dc_transmap] je vt4quadloop;;;; do un-even pixel;; test byte [pixelcount],0x1 je trf2 mov ah,[esi+ebx] ;; fetch texel : colormap number add ecx,ebp adc bl,cl mov al,[edi] ;; fetch dest : index into colormap and bl,0x7f mov dl,[eax] mov dl,[edx] mov [edi],dlpf: add edi,0x12345678;;;; do two non-quad-aligned pixels;;trf2: test byte [pixelcount],0x2 je trf3 mov ah,[esi+ebx] ;; fetch texel : colormap number add ecx,ebp adc bl,cl mov al,[edi] ;; fetch dest : index into colormap and bl,0x7f mov dl,[eax] mov dl,[edx] mov [edi],dlpg: add edi,0x12345678 mov ah,[esi+ebx] ;; fetch texel : colormap number add ecx,ebp adc bl,cl mov al,[edi] ;; fetch dest : index into colormap and bl,0x7f mov dl,[eax] mov dl,[edx] mov [edi],dlph: add edi,0x12345678;;;; test if there was at least 4 pixels;;trf3: test ch,0xff ;; test quad count je near vtdone;;;; ebp : ystep frac. upper 24 bits;; edx : y frac. upper 24 bits;; ebx : y i. lower 7 bits, masked for index;; ecx : ch = counter, cl = y step i.;; eax : colormap aligned 256;; esi : source texture column;; edi : dest screen;;vt4quadloop: mov ah,[esi+ebx] ;; fetch texel : colormap number mov [tystep],ebppi: add edi,0x12345678 mov al,[edi] ;; fetch dest : index into colormappj: sub edi,0x12345678 mov ebp,edipk: sub edi,0x12345678 jmp short inloopalign 4vtquadloop: add ecx,[tystep] adc bl,clq1: add ebp,0x23456789 and bl,0x7f mov dl,[eax] mov ah,[esi+ebx] ;; fetch texel : colormap number mov dl,[edx] mov [edi],dl mov al,[ebp] ;; fetch dest : index into colormapinloop: add ecx,[tystep] adc bl,clq2: add edi,0x23456789 and bl,0x7f mov dl,[eax] mov ah,[esi+ebx] ;; fetch texel : colormap number mov dl,[edx] mov [ebp+0x0],dl mov al,[edi] ;; fetch dest : index into colormap add ecx,[tystep] adc bl,clq3: add ebp,0x23456789 and bl,0x7f mov dl,[eax] mov ah,[esi+ebx] ;; fetch texel : colormap number mov dl,[edx] mov [edi],dl mov al,[ebp] ;; fetch dest : index into colormap add ecx,[tystep] adc bl,clq4: add edi,0x23456789 and bl,0x7f mov dl,[eax] mov ah,[esi+ebx] ;; fetch texel : colormap number mov dl,[edx] mov [ebp],dl mov al,[edi] ;; fetch dest : index into colormap dec ch jne vtquadloopvtdone: pop ebx pop edi pop esi pop ebp ret;;----------------------------------------------------------------------;; R_DrawShadeColumn;;;; for smoke..etc.. test.;;----------------------------------------------------------------------cglobal R_DrawShadeColumn_8R_DrawShadeColumn_8: push ebp ;; preserve caller's stack frame pointer push esi ;; preserve register variables push edi push ebx;;;; dest = ylookup[dc_yl] + columnofs[dc_x];;; mov ebp,[dc_yl] mov ebx,ebp mov edi,[ylookup+ebx*4] mov ebx,[dc_x] add edi,[columnofs+ebx*4] ;; edi = dest;;;; pixelcount = yh - yl + 1;; mov eax,[dc_yh] inc eax sub eax,ebp ;; pixel count mov [pixelcount],eax ;; save for final pixel jle near shdone ;; nothing to scale;;;; frac = dc_texturemid - (centery-dc_yl)*fracstep;;; mov ecx,[dc_iscale] ;; fracstep mov eax,[centery] sub eax,ebp imul eax,ecx mov edx,[dc_texturemid] sub edx,eax mov ebx,edx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -