📄 tmap.nas
字号:
;;-----------------------------------------------------------------------------;;;; $Id: tmap.nas,v 1.10 2001/02/24 13:35:21 bpereira Exp $;;;; Copyright (C) 1998-2000 by DooM Legacy Team.;;;; This program is free software; you can redistribute it and/or;; modify it under the terms of the GNU General Public License;; as published by the Free Software Foundation; either version 2;; of the License, or (at your option) any later version.;;;; This program is distributed in the hope that it will be useful,;; but WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the;; GNU General Public License for more details.;;;;;; $Log: tmap.nas,v $;; Revision 1.10 2001/02/24 13:35:21 bpereira;; no message;;;; Revision 1.9 2001/02/10 15:24:19 hurdler;; Apply Rob's patch for Linux version;;;; Revision 1.8 2000/11/12 09:48:15 bpereira;; no message;;;; Revision 1.7 2000/11/06 20:52:16 bpereira;; no message;;;; Revision 1.6 2000/11/03 11:48:40 hurdler;; Fix compiling problem under win32 with 3D-Floors and FragglScript (to verify!);;;; Revision 1.5 2000/11/03 03:27:17 stroggonmeth;; Again with the bug fixing...;;;; Revision 1.4 2000/11/02 17:50:10 stroggonmeth;; Big 3Dfloors & FraggleScript commit!!;;;; Revision 1.3 2000/04/24 20:24:38 bpereira;; no message;;;; Revision 1.2 2000/02/27 00:42:11 hurdler;; fix CR+LF problem;;;; Revision 1.1.1.1 2000/02/22 20:32:32 hurdler;; Initial import into CVS (v1.29 pr3);;;;;; DESCRIPTION:;; assembler optimised rendering code for software mode;; draw floor spans, and wall columns.;;;;-----------------------------------------------------------------------------[BITS 32]%ifdef LINUX%macro cextern 1[extern %1]%endmacro%macro cglobal 1[global %1]%endmacro%define CODE_SEG .data%else%macro cextern 1%define %1 _%1[extern %1]%endmacro%macro cglobal 1%define %1 _%1[global %1]%endmacro%define CODE_SEG .text %endif;; externs;; columnscextern dc_xcextern dc_ylcextern dc_yhcextern ylookupcextern columnofscextern dc_sourcecextern dc_texturemidcextern dc_iscalecextern centerycextern dc_colormapcextern dc_transmapcextern colormaps;; spanscextern ds_x1cextern ds_x2cextern ds_ycextern ds_xfraccextern ds_yfraccextern ds_xstepcextern ds_ystepcextern ds_sourcecextern ds_colormap;cextern ds_textureheight; polygon edge rasterizercextern prastertab;;----------------------------------------------------------------------;;;; R_DrawColumn;;;; New optimised version 10-01-1998 by D.Fabrice and P.Boris;; TO DO: optimise it much farther... should take at most 3 cycles/pix;; once it's fixed, add code to patch the offsets so that it;; works in every screen width.;;;;----------------------------------------------------------------------[SECTION .data];;.align 4loopcount dd 0pixelcount dd 0tystep dd 0[SECTION CODE_SEG write];----------------------------------------------------------------------------;fixed_t FixedMul (fixed_t a, fixed_t b);----------------------------------------------------------------------------cglobal FixedMul; align 16FixedMul: mov eax,[esp+4] imul dword [esp+8] shrd eax,edx,16 ret;----------------------------------------------------------------------------;fixed_t FixedDiv2 (fixed_t a, fixed_t b);;----------------------------------------------------------------------------cglobal FixedDiv2; align 16FixedDiv2: mov eax,[esp+4] mov edx,eax ;; these two instructions allow the next sar edx,31 ;; two to pair, on the Pentium processor. shld edx,eax,16 sal eax,16 idiv dword [esp+8] ret;----------------------------------------------------------------------------; void ASM_PatchRowBytes (int rowbytes);;----------------------------------------------------------------------------cglobal ASM_PatchRowBytes; align 16ASM_PatchRowBytes: mov eax,[esp+4] mov [p1+2],eax mov [p2+2],eax mov [p3+2],eax mov [p4+2],eax mov [p5+2],eax mov [p6+2],eax mov [p7+2],eax mov [p8+2],eax mov [p9+2],eax mov [pa+2],eax mov [pb+2],eax mov [pc+2],eax mov [pd+2],eax mov [pe+2],eax mov [pf+2],eax mov [pg+2],eax mov [ph+2],eax mov [pi+2],eax mov [pj+2],eax mov [pk+2],eax mov [pl+2],eax mov [pm+2],eax mov [pn+2],eax mov [po+2],eax mov [pp+2],eax mov [pq+2],eax add eax,eax mov [q1+2],eax mov [q2+2],eax mov [q3+2],eax mov [q4+2],eax mov [q5+2],eax mov [q6+2],eax mov [q7+2],eax mov [q8+2],eax ret;----------------------------------------------------------------------------; 8bpp column drawer;----------------------------------------------------------------------------cglobal R_DrawColumn_8; align 16R_DrawColumn_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 vdone ;; 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 mov esi,[dc_source];;;; lets rock :) !;; mov eax,[pixelcount] mov dh,al shr eax,2 mov ch,al ;; quad count mov eax,[dc_colormap] test dh,0x3 je near v4quadloop;;;; do un-even pixel;; test dh,0x1 je two_uneven 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 and bl,0x7f ;; mask 0-127 texture index mov [edi],dl ;; output pixelp1: add edi,0x12345678;;;; do two non-quad-aligned pixels;;two_uneven: test dh,0x2 je f3 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 and bl,0x7f ;; mask 0-127 texture index mov [edi],dl ;; output pixel mov al,[esi+ebx] add edx,ebp ;; fetch source texel adc bl,cl ;; ypos f += ystep f mov dl,[eax] ;; ypos i += ystep i and bl,0x7f ;; colormap texelp2: add edi,0x12345678 ;; mask 0-127 texture index mov [edi],dlp3: add edi,0x12345678 ;; output pixel;;;; test if there was at least 4 pixels;;f3: test ch,0xff ;; test quad count je near vdone;;;; ebp : ystep frac. upper 16 bits;; edx : y frac. upper 16 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;;v4quadloop: mov dh,0x7f ;; prep maskalign 4vquadloop: mov al,[esi+ebx] ;; prep loop add edx,ebp ;; ypos f += ystep f adc bl,cl ;; ypos i += ystep i mov dl,[eax] ;; colormap texel mov [edi],dl ;; output pixel and bl,0x7f ;; mask 0-127 texture index mov al,[esi+ebx] ;; fetch source texel add edx,ebp adc bl,clp4: add edi,0x12345678 mov dl,[eax] and bl,0x7f mov [edi],dl mov al,[esi+ebx] ;; fetch source texel add edx,ebp adc bl,clp5: add edi,0x12345678 mov dl,[eax] and bl,0x7f mov [edi],dl mov al,[esi+ebx] ;; fetch source texel add edx,ebp adc bl,clp6: add edi,0x12345678 mov dl,[eax] and bl,0x7f mov [edi],dlp7: add edi,0x12345678 dec ch jne vquadloopvdone: pop ebx ;; restore register variables pop edi pop esi pop ebp ;; restore caller's stack frame pointer ret;;----------------------------------------------------------------------;;13-02-98:;; R_DrawSkyColumn : same as R_DrawColumn but:;;;; - wrap around 256 instead of 127.;; this is needed because we have a higher texture for mouselook,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -