⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmap.nas

📁 一个免费的汇编语言编译器的源代码
💻 NAS
📖 第 1 页 / 共 3 页
字号:
;;

;;      - wrap around 256 instead of 127.

;;      this is needed because we have a higher texture for mouselook,

;;      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   16

R_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 pixel

p8:     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 texel

p9:     add     edi,0x12345678

        mov     [edi],dl                ;; output pixel



pa:     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 4

vskyquadloop:

        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,cl

pb:     add     edi,0x12345678

        mov     dl,[eax]

        mov     [edi],dl



        mov     al,[esi+ebx]            ;; fetch source texel

        add     edx,ebp

        adc     bl,cl

pc:     add     edi,0x12345678

        mov     dl,[eax]

        mov     [edi],dl



        mov     al,[esi+ebx]            ;; fetch source texel

        add     edx,ebp

        adc     bl,cl

pd:     add     edi,0x12345678

        mov     dl,[eax]

        mov     [edi],dl



pe:     add     edi,0x12345678



        dec     ch

        jne     vskyquadloop

vskydone:

        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_8

R_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],dl

pf:     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],dl

pg:     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],dl

ph:     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],ebp

pi:     add     edi,0x12345678

        mov     al,[edi]                ;; fetch dest  : index into colormap

pj:     sub     edi,0x12345678

        mov     ebp,edi

pk:     sub     edi,0x12345678

        jmp short inloop

align 4

vtquadloop:

        add     ecx,[tystep]

        adc     bl,cl

q1:     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

inloop:

        add     ecx,[tystep]

        adc     bl,cl

q2:     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,cl

q3:     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,cl

q4:     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     vtquadloop

vtdone:

        pop     ebx

        pop     edi

        pop     esi

        pop     ebp

        ret





;;----------------------------------------------------------------------

;; R_DrawShadeColumn

;;

;;   for smoke..etc.. test.

;;----------------------------------------------------------------------

cglobal R_DrawShadeColumn_8

R_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]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -