Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

x86span555.h File Reference

Go to the source code of this file.

Typedefs

typedef EdgeAsmTag EdgeAsm
typedef EdgeAsmFPUTag EdgeAsmFPU

Functions

void DrawScanLineGouraudNoZBufferZWrite_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudNoZBufferZWriteTrans_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudNoZBufferZWriteSolid_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudNoZ_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudNoZTrans_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudNoZSolid_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudNoZAlphaTex_Asm555X86FPU (EdgeAsm *pLeft, EdgeAsm *pRight)
void DrawScanLineGouraudNoZBufferZWriteAlphaTex_Asm555X86FPU (EdgeAsm *pLeft, EdgeAsm *pRight)
void DrawScanLineGouraudZBufferNoZWriteAlphaTex_Asm555X86FPU (EdgeAsm *pLeft, EdgeAsm *pRight)
void DrawScanLineGouraudZBufferAlphaTex_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudZBuffer_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudZBufferTrans_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudZBufferSolid_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudZBufferNoZWrite_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudZBufferNoZWriteTrans_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawScanLineGouraudZBufferNoZWriteSolid_Asm555X86FPU (EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
void DrawSpan16_AsmLit555X86FPU (int32 x1, int32 x2, int32 y)
void DrawSpan16_AsmLitZWrite555X86FPU (int32 x1, int32 x2, int32 y)
void DrawSpan16_AsmLitZBuffer555X86FPU (int32 x1, int32 x2, int32 y)
void DrawSpan16_AsmGouraud555X86FPU (int32 x1, int32 x2, int32 y, int32 r1, int32 g1, int32 b1, int32 r2, int32 g2, int32 b2)
void DrawSpan16_AsmGouraudZWrite555X86FPU (int32 x1, int32 x2, int32 y, int32 r1, int32 g1, int32 b1, int32 r2, int32 g2, int32 b2)
void DrawSpan16_AsmGouraudZBuffer555X86FPU (int32 x1, int32 x2, int32 y, int32 r1, int32 g1, int32 b1, int32 r2, int32 g2, int32 b2)
void DrawSpan16_AsmGouraudZBufferTrans555X86FPU (int32 x1, int32 x2, int32 y, int32 r1, int32 g1, int32 b1, int32 r2, int32 g2, int32 b2)


Typedef Documentation

typedef struct EdgeAsmTag EdgeAsm
 

Definition at line 22 of file x86span555.h.

typedef struct EdgeAsmFPUTag EdgeAsmFPU
 

Definition at line 23 of file x86span555.h.


Function Documentation

void DrawScanLineGouraudNoZ_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 47 of file x86span555.c.

References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, r, R, Real65536, Red, REDMASK2, TDest, Two, VShift, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderMiscTexturePoly().

00048 {
00049         TDest   =Dest;
00050         Red             =Green  =0;
00051         _asm
00052         {
00053                 push    ebx
00054                 push    ecx
00055                 push    esi
00056                 push    edi
00057 
00058                 mov             ebx,pLeft
00059                 mov     ecx,pRight
00060                 mov     eax,[ebx]EdgeAsmFPU.X
00061                 mov     edx,[ecx]EdgeAsmFPU.X
00062                 sub     edx,eax
00063                 jle             GouraudReturnNoZ
00064 
00065                 mov             esi,eax
00066                 inc             edx
00067                 shl             eax,1
00068                 add             TDest,eax
00069                 test    esi,1                                   //dword align left side
00070                 jz              NoSinglePixie
00071 
00072                 //odd sized spans write one pixel to dword align
00073                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
00074                 fmul    [Real65536]                                             ; UL16
00075                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
00076                 fmul    [Real65536]                                             ; VL16 UL16
00077                 fld             dword ptr [ebx]EdgeAsmFPU.r             ; RL   VL16 UL16
00078                 fld             dword ptr [ebx]EdgeAsmFPU.g             ; GL   RL   VL16 UL16
00079                 fld             dword ptr [ebx]EdgeAsmFPU.b             ; BL   GL   RL   VL16 UL16
00080                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
00081                 fistp   [u16]                                                   ; GL   RL   VL16 BL
00082                 fxch    st(2)                                                   ; VL16 RL   GL   BL
00083                 fistp   [v16]                                                   ; RL   GL   BL
00084 
00085                 mov     [widTemp],edx
00086 
00087                 mov             ecx,[VShift]
00088                 mov             ebx,[GHMaskShifted]
00089 
00090                 mov             esi,[GWMask]
00091                 mov             edi,[v16]
00092 
00093                 mov             edx,dword ptr[u16]
00094 
00095                 shr             edi,cl
00096 
00097                 shr             edx,16
00098                 xor             eax,eax
00099 
00100                 and             edi,ebx
00101                 and             edx,esi
00102 
00103                 add             edi,edx
00104 
00105                 add             edi,GBitPtrHalf
00106                 mov             ax,word ptr[edi*2]
00107 
00108                 mov             ebx,eax
00109                 and             eax,REDMASK2
00110 
00111                 mov             ecx,ebx
00112                 and             ebx,GREENMASK2
00113 
00114                 mov             dword ptr[Red],eax
00115                 and             ecx,BLUEMASK2
00116 
00117                 mov             dword ptr[Green],ebx
00118                 mov             dword ptr[Blue],ecx
00119 
00120                 fimul   dword ptr[Red]                                  ; R    GL   BL
00121                 fxch    st(1)                                                   ; GL   R    BL
00122                 fimul   dword ptr[Green]                                ; G    R    BL
00123                 fxch    st(1)                                                   ; R    G    BL
00124                 fadd    qword ptr[Magic]                                ; Rk   G    BL
00125                 fxch    st(2)                                                   ; BL   G    Rk
00126                 fimul   [Blue]                                                  ; B    G    Rk
00127                 fxch    st(1)                                                   ; G    B    Rk
00128                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
00129                 fxch    st(2)                                                   ; Rk   B    Gk
00130                 fstp    qword ptr[Bucket]                               ; B    Gk
00131                 fadd    qword ptr[Magic]                                ; Bk   Gk
00132                 fxch    st(1)                                                   ; Gk   Bk
00133                 fstp    qword ptr[Bucket2]                              ; Bk
00134 
00135                 mov             edx,dword ptr[Bucket]
00136                 mov             eax,dword ptr[Bucket2]
00137 
00138                 and             edx,REDMASK2
00139                 and             eax,GREENMASK2
00140 
00141                 fstp    qword ptr[Bucket]
00142 
00143                 mov             ecx,TDest
00144                 mov             ebx,dword ptr[Bucket]
00145 
00146                 and             ebx,BLUEMASK2
00147                 or              edx,eax
00148 
00149                 add             TDest,2
00150                 or              edx,ebx
00151 
00152                 mov             ebx,pLeft
00153                 mov             word ptr[ecx],dx
00154                 mov     edx,[widTemp]
00155                 mov     ecx,pRight
00156                 dec             edx
00157                 jz              GouraudReturnNoZ
00158                 mov             esi,edx
00159                 and             esi,1
00160                 sub             edx,esi
00161                 jz              GouraudReturnNoZ
00162 
00163 NoSinglePixie:
00164                 mov     [widTemp],edx                 ; just for a temp
00165                 shr             edx,1
00166 
00167                 ; try to keep fmul fxch pairs seperated to avoid stalling
00168                 ; calc this scanlines steps           ; FPU Stack
00169                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
00170                 fild    dword ptr [widTemp]           ; WID
00171 
00172                 mov     [widTemp],edx                 ; Color interps doubled
00173 
00174                 fld     dword ptr [ecx]EdgeAsmFPU.u      ; UR   WID
00175                 fld     dword ptr [ebx]EdgeAsmFPU.u      ; UL   UR   WID
00176                 fsub    st(1), st                     ; UL   UD   WID
00177                 fld     dword ptr [ecx]EdgeAsmFPU.v      ; VR   UL   UD   WID
00178                 fxch    st(1)                         ; UL   VR   UD   WID
00179                 fmul    [Real65536]                   ; UL16 VR   UD   WID
00180                 fld     dword ptr [ebx]EdgeAsmFPU.v      ; VL   UL16 VR   UD   WID
00181                 fsub    st(2), st                     ; VL   UL16 VD   UD   WID
00182                 fild    dword ptr [ecx]EdgeAsmFPU.R      ; RR   VL   UL16 VD   UD   WID
00183                 fxch    st(3)                         ; VD   VL   UL16 RR   UD   WID
00184                 fmul    [Real65536]                   ; VD16 VL   UL16 RR   UD   WID
00185                 fild    dword ptr [ebx]EdgeAsmFPU.R      ; RL   VD16 VL   UL16 RR   UD   WID
00186                 fsub    st(4),st                      ; RL   VD16 VL   UL16 RD   UD   WID
00187                 fxch    st(5)                         ; UD   VD16 VL   UL16 RD   RL   WID
00188                 fmul    [Real65536]                   ; UD16 VD16 VL   UL16 RD   RL   WID
00189                 fxch    st(2)                                             ; VL   VD16 UD16 UL16 RD   RL   WID
00190                 fmul    [Real65536]                   ; VL16 VD16 UD16 UL16 RD   RL   WID
00191                 fxch    st(3)                                                   ; UL16 VD16 UD16 VL16 RD   RL   WID
00192                 fistp   [u16]                                                   ; VD16 UD16 VL16 RD   RL   WID
00193                 fxch    st(2)                                                   ; VL16 UD16 VD16 RD   RL   WID
00194                 fistp   [v16]                                                   ; UD16 VD16 RD   RL   WID
00195                 fld1                                                                    ; 1    UD16 VD16 RD   RL   WID
00196                 fdivrp  st(5),st                                                ; UD16 VD16 RD   RL   DWID
00197 
00198                 //let that cook
00199 
00200                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
00201                 fild    [ecx]EdgeAsmFPU.G                                       ; RG   USTP VD16 RD   RL   DWID
00202                 fild    [ebx]EdgeAsmFPU.G                                       ; LG   RG   USTP VD16 RD   RL   DWID
00203                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
00204                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
00205                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
00206                 fild    [ecx]EdgeAsmFPU.B                                       ; RB   GD   LG   VD16 RD   RL   DWID
00207                 fild    [ebx]EdgeAsmFPU.B                                       ; LB   RB   GD   LG   VD16 RD   RL   DWID
00208                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
00209                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
00210                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
00211                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
00212                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
00213                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
00214                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
00215                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
00216                 frndint
00217                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
00218                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
00219                 frndint
00220                 fxch    st(7)                                                   ; DW2  BD   RI   LG   LB   VSTP RL   GI
00221                 fmulp   st(1),st                                                ; BI   RI   LG   LB   VSTP RL   GI
00222                 frndint
00223                 fxch    st(4)                                                   ; VSTP RI   LG   LB   BI   RL   GI
00224                 fistp   [VStep]                                                 ; RI   LG   LB   BI   RL   GI
00225 
00226                 push    ebp
00227 
00228 PixieLoop:
00229                 mov             ecx,[VShift]
00230                 mov             ebx,[GHMaskShifted]
00231 
00232                 mov             ebp,[GWMask]
00233                 mov             edi,[v16]
00234 
00235                 mov             edx,dword ptr[u16]
00236                 mov             esi,edi
00237 
00238                 mov             eax,edx
00239 
00240                 shr             edi,cl
00241                 add             esi,[VStep]
00242 
00243                 shr             edx,16
00244                 add             eax,[UStep]
00245 
00246                 and             edi,ebx
00247                 and             edx,ebp
00248 
00249                 add             edi,edx
00250                 mov             edx,eax
00251 
00252                 add             edi,GBitPtrHalf
00253                 add             eax,[UStep]
00254 
00255                 mov             [u16],eax
00256                 mov             ax,word ptr[edi*2]
00257 
00258                 mov             edi,esi
00259                 add             esi,[VStep]
00260 
00261                 shr             edx,16
00262                 mov             [v16],esi
00263 
00264                 shr             edi,cl
00265                 and             edx,ebp
00266 
00267                 mov             esi,GBitPtrHalf
00268                 and             edi,ebx
00269 
00270                 shl             eax,16
00271                 add             esi,edx
00272 
00273                 add             esi,edi
00274 
00275                 mov             ax,word ptr[esi*2]
00276 
00277                 mov             ebx,eax
00278                 and             eax,REDMASK2
00279 
00280                 mov             ecx,ebx
00281                 and             ebx,GREENMASK2
00282 
00283                 mov             dword ptr[Red],eax
00284                 and             ecx,BLUEMASK2
00285 
00286                 mov             dword ptr[Green],ebx
00287                 mov             dword ptr[Blue],ecx
00288 
00289                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
00290                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
00291                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
00292                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
00293                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
00294                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
00295                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
00296                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
00297                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
00298                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
00299                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
00300                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
00301                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
00302                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
00303                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
00304 
00305                 mov             edx,dword ptr[Bucket]
00306                 mov             eax,dword ptr[Bucket2]
00307 
00308                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
00309                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
00310                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
00311                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
00312                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
00313                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
00314 
00315                 and             edx,GREENMASK2
00316                 and             eax,REDMASK2
00317 
00318                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
00319                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
00320 
00321                 mov             edi,edx
00322                 mov             ebx,dword ptr[Bucket]
00323                 or              edi,eax
00324                 mov             ebp,TDest
00325                 and             ebx,BLUEMASK2
00326 
00327                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
00328                 or              edi,ebx
00329 
00330                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
00331 
00332                 rol             edi,16
00333                 add             TDest,4
00334 
00335                 mov             [ebp],edi
00336                 dec             [widTemp]
00337 
00338                 jnz             PixieLoop
00339 
00340                 pop             ebp
00341 
00342                 fstp    [u16]
00343                 fstp    [v16]
00344                 fstp    [u16]
00345                 fstp    [v16]
00346                 fstp    [u16]
00347                 fstp    [v16]
00348 
00349 GouraudReturnNoZ:
00350                 pop             edi
00351                 pop             esi
00352                 pop             ecx
00353                 pop             ebx
00354         }
00355 }

void DrawScanLineGouraudNoZAlphaTex_Asm555X86FPU EdgeAsm pLeft,
EdgeAsm pRight
 

void DrawScanLineGouraudNoZBufferZWrite_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 1381 of file x86span555.c.

References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, Two, VShift, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderMiscTexturePoly().

01382 {
01383         TDest   =Dest;
01384         Red             =Green  =0;
01385         _asm
01386         {
01387                 push    ebx
01388                 push    ecx
01389                 push    esi
01390                 push    edi
01391 
01392                 mov             ebx,pLeft
01393                 mov     ecx,pRight
01394                 mov     eax,[ebx]EdgeAsmFPU.X
01395                 mov     edx,[ecx]EdgeAsmFPU.X
01396                 sub     edx,eax
01397                 jle             GouraudReturnNoZ
01398 
01399                 mov             esi,eax
01400                 inc             edx
01401                 shl             eax,1
01402                 add             TDest,eax
01403                 add             pZBufferPtr,eax
01404                 test    esi,1           //dword align left
01405                 jz              NoSinglePixie
01406 
01407                 //odd sized spans write one pixel to dword align
01408                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
01409                 fmul    [Real65536]                                             ; UL16
01410                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
01411                 fmul    [Real65536]                                             ; VL16 UL16
01412                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
01413                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
01414                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
01415                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
01416                 fistp   [u16]                                                   ; GL   RL   VL16 BL
01417                 fxch    st(2)                                                   ; VL16 RL   GL   BL
01418                 fistp   [v16]                                                   ; RL   GL   BL
01419                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
01420                 fistp   [z16]                                                   ; RL   GL   BL
01421 
01422                 mov     [widTemp],edx
01423 
01424                 mov             ecx,[VShift]
01425                 mov             ebx,[GHMaskShifted]
01426 
01427                 mov             esi,[GWMask]
01428                 mov             edi,[v16]
01429 
01430                 mov             edx,dword ptr[u16]
01431 
01432                 shr             edi,cl
01433 
01434                 shr             edx,16
01435                 xor             eax,eax
01436 
01437                 and             edi,ebx
01438                 and             edx,esi
01439 
01440                 add             edi,edx
01441 
01442                 add             edi,GBitPtrHalf
01443                 mov             ax,word ptr[edi*2]
01444 
01445                 mov             ebx,eax
01446                 and             eax,REDMASK2
01447 
01448                 mov             ecx,ebx
01449                 and             ebx,GREENMASK2
01450 
01451                 mov             dword ptr[Red],eax
01452                 and             ecx,BLUEMASK2
01453 
01454                 mov             dword ptr[Green],ebx
01455                 mov             dword ptr[Blue],ecx
01456 
01457                 fimul   dword ptr[Red]                                  ; R    GL   BL
01458                 fxch    st(1)                                                   ; GL   R    BL
01459                 fimul   dword ptr[Green]                                ; G    R    BL
01460                 fxch    st(1)                                                   ; R    G    BL
01461                 fadd    qword ptr[Magic]                                ; Rk   G    BL
01462                 fxch    st(2)                                                   ; BL   G    Rk
01463                 fimul   [Blue]                                                  ; B    G    Rk
01464                 fxch    st(1)                                                   ; G    B    Rk
01465                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
01466                 fxch    st(2)                                                   ; Rk   B    Gk
01467                 fstp    qword ptr[Bucket]                               ; B    Gk
01468                 fadd    qword ptr[Magic]                                ; Bk   Gk
01469                 fxch    st(1)                                                   ; Gk   Bk
01470                 fstp    qword ptr[Bucket2]                              ; Bk
01471 
01472                 mov             edx,dword ptr[Bucket]
01473                 mov             eax,dword ptr[Bucket2]
01474 
01475                 and             edx,REDMASK2
01476                 and             eax,GREENMASK2
01477 
01478                 fstp    qword ptr[Bucket]
01479 
01480                 mov             ecx,TDest
01481                 mov             ebx,dword ptr[Bucket]
01482 
01483                 mov             esi,[z16]
01484                 and             ebx,BLUEMASK2
01485 
01486                 shr             esi,16
01487                 or              edx,eax
01488 
01489                 mov             eax,pZBufferPtr
01490                 add             TDest,2
01491 
01492                 or              edx,ebx
01493                 mov             word ptr[eax],si
01494 
01495                 mov             word ptr[ecx],dx
01496 
01497                 mov             ebx,pLeft
01498                 mov     edx,[widTemp]
01499                 add             pZBufferPtr,2
01500                 mov     ecx,pRight
01501                 dec             edx
01502                 jz              GouraudReturnNoZ
01503                 mov             esi,edx
01504                 and             esi,1
01505                 sub             edx,esi
01506                 jz              GouraudReturnNoZ
01507 
01508 NoSinglePixie:
01509                 mov     [widTemp],edx                 ; just for a temp
01510                 shr             edx,1
01511 
01512                 ; try to keep fmul fxch pairs seperated to avoid stalling
01513                 ; calc this scanlines steps           ; FPU Stack
01514                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
01515                 fild    dword ptr [widTemp]           ; WID
01516 
01517                 mov     [widTemp],edx                 ; Color interps doubled
01518 
01519                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
01520                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
01521                 fsub    st(1), st                   ; UL   UD   WID
01522                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
01523                 fxch    st(1)                       ; UL   VR   UD   WID
01524                 fmul    [Real65536]                 ; UL16 VR   UD   WID
01525                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
01526                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
01527                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
01528                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
01529                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
01530                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
01531                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
01532                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
01533                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
01534                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
01535                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
01536                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
01537                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
01538                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
01539                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
01540                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
01541                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
01542 
01543                 //let that cook
01544 
01545                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
01546                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
01547                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
01548                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
01549                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
01550                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
01551                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
01552                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
01553                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
01554                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
01555                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
01556                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
01557                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
01558                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
01559                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
01560                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
01561                 frndint
01562                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
01563                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
01564                 frndint
01565                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
01566                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
01567                 frndint
01568                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
01569                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
01570                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
01571                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
01572                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
01573                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
01574                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
01575                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
01576                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
01577                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
01578                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
01579 
01580                 push    ebp
01581 
01582 PixieLoop:
01583                 mov             ebx,[ZStep]
01584 
01585                 add             [z16],ebx
01586                 mov             ecx,[VShift]
01587 
01588                 mov             edi,[z16]
01589 
01590                 shr             edi,16
01591                 mov             ebx,[GHMaskShifted]
01592 
01593                 mov             ebp,[GWMask]
01594                 mov             edx,dword ptr[u16]
01595 
01596                 mov             word ptr[Z32],di
01597                 mov             eax,edx
01598 
01599                 shr             edx,16
01600                 mov             edi,[v16]
01601 
01602                 add             eax,[UStep]
01603                 mov             esi,edi
01604 
01605                 shr             edi,cl
01606                 add             esi,[VStep]
01607 
01608                 and             edi,ebx
01609                 and             edx,ebp
01610 
01611                 add             edi,edx
01612                 mov             edx,eax
01613 
01614                 add             edi,GBitPtrHalf
01615                 add             eax,[UStep]
01616 
01617                 mov             [u16],eax
01618                 mov             ax,word ptr[edi*2]
01619 
01620                 mov             edi,esi
01621                 add             esi,[VStep]
01622 
01623                 shr             edx,16
01624                 mov             [v16],esi
01625 
01626                 shr             edi,cl
01627                 and             edx,ebp
01628 
01629                 mov             esi,GBitPtrHalf
01630                 and             edi,ebx
01631 
01632                 shl             eax,16
01633                 add             esi,edx
01634 
01635                 add             esi,edi
01636 
01637                 mov             ax,word ptr[esi*2]
01638 
01639                 mov             ebx,eax
01640                 and             eax,REDMASK2
01641 
01642                 mov             ecx,ebx
01643                 and             ebx,GREENMASK2
01644 
01645                 mov             dword ptr[Red],eax
01646                 and             ecx,BLUEMASK2
01647 
01648                 mov             dword ptr[Green],ebx
01649                 mov             dword ptr[Blue],ecx
01650 
01651                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
01652                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
01653                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
01654                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
01655                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
01656                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
01657                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
01658                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
01659                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
01660                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
01661                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
01662                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
01663                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
01664                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
01665                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
01666 
01667                 mov             edx,dword ptr[Bucket]
01668                 mov             eax,dword ptr[Bucket2]
01669 
01670                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
01671                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
01672                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
01673                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
01674                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
01675                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
01676 
01677                 and             edx,GREENMASK2
01678                 and             eax,REDMASK2
01679 
01680                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
01681                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
01682 
01683                 mov             edi,edx
01684                 mov             ebx,dword ptr[Bucket]
01685                 or              edi,eax
01686                 mov             ebp,TDest
01687                 and             ebx,BLUEMASK2
01688 
01689                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
01690                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
01691 
01692                 mov             si,word ptr[Z32]
01693                 add             TDest,4
01694 
01695                 mov             ecx,pZBufferPtr
01696                 or              edi,ebx
01697 
01698                 mov             [ecx],si
01699                 rol             edi,16
01700 
01701                 mov             dword ptr[ebp],edi
01702                 mov             [ecx+2],si
01703 
01704                 add             pZBufferPtr,4
01705                 dec             [widTemp]
01706 
01707                 jnz             PixieLoop
01708 
01709                 pop             ebp
01710 
01711                 fstp    [u16]
01712                 fstp    [v16]
01713                 fstp    [u16]
01714                 fstp    [v16]
01715                 fstp    [u16]
01716                 fstp    [v16]
01717 
01718 GouraudReturnNoZ:
01719                 pop             edi
01720                 pop             esi
01721                 pop             ecx
01722                 pop             ebx
01723         }
01724 }

void DrawScanLineGouraudNoZBufferZWriteAlphaTex_Asm555X86FPU EdgeAsm pLeft,
EdgeAsm pRight
 

void DrawScanLineGouraudNoZBufferZWriteSolid_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 2970 of file x86span555.c.

References BlueMask, BLUEMASK2, Bucket, Bucket2, Dest, Green, GREENMASK2, GreenMask2, Magic, MiniRedMask2, or, pZBufferPtr, r, Red, RedMask2, REDMASK2, TDest, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderGouraudPoly().

02971 {
02972         TDest   =Dest;
02973         Red             =Green  =0;
02974         _asm
02975         {
02976                 push    ebx
02977                 push    ecx
02978                 push    esi
02979                 push    edi
02980 
02981                 mov             ebx,pLeft
02982                 mov     ecx,pRight
02983                 mov     eax,[ebx]EdgeAsmFPU.X
02984                 mov     edx,[ecx]EdgeAsmFPU.X
02985                 sub     edx,eax
02986                 jle             GouraudReturnNoZ
02987 
02988                 mov             esi,eax
02989                 inc             edx
02990                 shl             eax,1
02991                 add             TDest,eax
02992                 add             pZBufferPtr,eax
02993                 test    esi,1                                   //dword align left side
02994                 jz              NoSinglePixie
02995 
02996                 //odd sized spans write one pixel to dword align
02997                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
02998                 fmul    dword ptr[BlueMask]
02999                 fadd    qword ptr[Magic]                                ; Bk
03000                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
03001                 fmul    dword ptr[GreenMask2]
03002                 fadd    qword ptr[Magic]                                ; Gk   Bk
03003                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
03004                 fmul    dword ptr[MiniRedMask2]
03005                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
03006                 fxch    st(2)                                                   ; Bk   Gk   Rk
03007                 fstp    qword ptr[Bucket]                               ; Gk   Rk
03008                 fstp    qword ptr[Bucket2]                              ; Rk
03009                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z
03010                 fistp   [z16]                                                   ;
03011 
03012                 mov             esi,dword ptr[Bucket]
03013                 mov             eax,dword ptr[Bucket2]
03014 
03015                 and             esi,BLUEMASK2
03016                 and             eax,GREENMASK2
03017 
03018                 fstp    qword ptr[Bucket]
03019 
03020                 mov             ecx,TDest
03021                 mov             ebx,dword ptr[Bucket]
03022 
03023                 and             ebx,REDMASK2
03024                 or              esi,eax
03025 
03026                 mov             edi,[z16]
03027                 mov             eax,pZBufferPtr
03028 
03029                 add             TDest,2
03030                 or              esi,ebx
03031 
03032                 shr             edi,16
03033                 mov             ebx,pLeft
03034 
03035                 mov             word ptr[eax],di
03036                 mov             word ptr[ecx],si
03037 
03038                 mov             ecx,pRight
03039                 dec             edx
03040 
03041                 jz              GouraudReturnNoZ
03042                 mov             esi,edx
03043                 add             pZBufferPtr,2
03044                 and             esi,1
03045                 sub             edx,esi
03046                 jz              GouraudReturnNoZ
03047 
03048 NoSinglePixie:
03049                 shr             edx,1
03050                 fld1
03051                 mov     [widTemp],edx                 ; just for a temp
03052                 
03053 
03054                 ; try to keep fmul fxch pairs seperated to avoid stalling
03055                 ; calc this scanlines steps                             ; FPU Stack
03056                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
03057                 fidiv   dword ptr [widTemp]                             ; WID
03058                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
03059                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
03060                 fsub    st(1),st                                                ; RL   RD   WID
03061                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
03062                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
03063                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
03064                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
03065                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
03066                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
03067                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
03068                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
03069                 frndint
03070                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
03071                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
03072                 frndint
03073                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
03074                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
03075                 frndint
03076                 fld             qword ptr[RedMask2]                             ; rm   BI   GL   RI   RL   BL   GI
03077                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
03078                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
03079                 fld             dword ptr[GreenMask2]                   ; gm   BI   GL   RI   RL   BL   GI
03080                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
03081                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
03082                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
03083                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
03084                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
03085                 fld             [ecx]EdgeAsmFPU.z                               ; rz   BI   GL   RI   RL   BL   GI
03086                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   BI   GL   RI   RL   BL   GI
03087                 fld             [ebx]EdgeAsmFPU.z                               ; lz   zd   BI   GL   RI   RL   BL   GI
03088                 fistp   [z16]                                                   ; zd   BI   GL   RI   RL   BL   GI
03089                 fistp   [ZStep]                                                 ; BI   GL   RI   RL   BL   GI
03090 
03091 PixieLoop:
03092 
03093                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
03094                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
03095                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
03096                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
03097                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
03098                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
03099 
03100                 mov             edi,[z16]
03101                 mov             esi,pZBufferPtr
03102 
03103                 shr             edi,16
03104                 mov             ebx,[ZStep]
03105 
03106                 mov             word ptr[esi],di
03107                 add             [z16],ebx
03108 
03109                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
03110                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
03111                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
03112 
03113                 mov             word ptr[esi+2],di
03114 
03115                 mov             ecx,dword ptr[Bucket]
03116                 mov             eax,dword ptr[Bucket2]
03117 
03118                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
03119                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
03120 
03121                 and             ecx,REDMASK2
03122                 and             eax,GREENMASK2
03123 
03124                 mov             ebx,dword ptr[Bucket]
03125                 or              ecx,eax
03126 
03127                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
03128                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
03129                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
03130                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
03131                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
03132                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
03133 
03134                 and             ebx,BLUEMASK2
03135                 mov             edi,TDest
03136 
03137                 or              ecx,ebx
03138                 add             TDest,4
03139 
03140                 rol             ecx,16
03141 
03142                 mov             [edi],ecx
03143 
03144                 add             pZBufferPtr,4
03145 
03146                 dec             edx
03147 
03148                 jnz             PixieLoop
03149 
03150 
03151                 fstp    [u16]
03152                 fstp    [v16]
03153                 fstp    [u16]
03154                 fstp    [v16]
03155                 fstp    [u16]
03156                 fstp    [v16]
03157 
03158 GouraudReturnNoZ:
03159                 pop             edi
03160                 pop             esi
03161                 pop             ecx
03162                 pop             ebx
03163         }
03164 }

void DrawScanLineGouraudNoZBufferZWriteTrans_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 2448 of file x86span555.c.

References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, TempPix, Two, VShift, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderMiscTexturePoly().

02449 {
02450         TDest   =Dest;
02451         Red             =Green  =0;
02452         _asm
02453         {
02454                 push    ebx
02455                 push    ecx
02456                 push    esi
02457                 push    edi
02458 
02459                 mov             ebx,pLeft
02460                 mov     ecx,pRight
02461                 mov     eax,[ebx]EdgeAsmFPU.X
02462                 mov     edx,[ecx]EdgeAsmFPU.X
02463                 sub     edx,eax
02464                 jle             GouraudReturnNoZ
02465 
02466                 mov             esi,eax
02467                 inc             edx
02468                 shl             eax,1
02469                 add             TDest,eax
02470                 add             pZBufferPtr,eax
02471                 test    esi,1           //dword align left
02472                 jz              NoSinglePixie
02473 
02474                 //odd sized spans write one pixel to dword align
02475                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
02476                 fmul    [Real65536]                                             ; UL16
02477                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
02478                 fmul    [Real65536]                                             ; VL16 UL16
02479                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
02480                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
02481                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
02482                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
02483                 fistp   [u16]                                                   ; GL   RL   VL16 BL
02484                 fxch    st(2)                                                   ; VL16 RL   GL   BL
02485                 fistp   [v16]                                                   ; RL   GL   BL
02486                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
02487                 fistp   [z16]                                                   ; RL   GL   BL
02488 
02489                 mov     [widTemp],edx
02490 
02491                 mov             ecx,[VShift]
02492                 mov             ebx,[GHMaskShifted]
02493 
02494                 mov             esi,[GWMask]
02495                 mov             edi,[v16]
02496 
02497                 mov             edx,dword ptr[u16]
02498 
02499                 shr             edi,cl
02500 
02501                 shr             edx,16
02502                 xor             eax,eax
02503 
02504                 and             edi,ebx
02505                 and             edx,esi
02506 
02507                 add             edi,edx
02508 
02509                 add             edi,GBitPtrHalf
02510                 mov             ax,word ptr[edi*2]
02511 
02512                 mov             word ptr[TempPix],ax
02513 
02514                 mov             ebx,eax
02515                 and             eax,REDMASK2
02516 
02517                 mov             ecx,ebx
02518                 and             ebx,GREENMASK2
02519 
02520                 mov             dword ptr[Red],eax
02521                 and             ecx,BLUEMASK2
02522 
02523                 mov             dword ptr[Green],ebx
02524                 mov             dword ptr[Blue],ecx
02525 
02526                 fimul   dword ptr[Red]                                  ; R    GL   BL
02527                 fxch    st(1)                                                   ; GL   R    BL
02528                 fimul   dword ptr[Green]                                ; G    R    BL
02529                 fxch    st(1)                                                   ; R    G    BL
02530                 fadd    qword ptr[Magic]                                ; Rk   G    BL
02531                 fxch    st(2)                                                   ; BL   G    Rk
02532                 fimul   [Blue]                                                  ; B    G    Rk
02533                 fxch    st(1)                                                   ; G    B    Rk
02534                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
02535                 fxch    st(2)                                                   ; Rk   B    Gk
02536                 fstp    qword ptr[Bucket]                               ; B    Gk
02537                 fadd    qword ptr[Magic]                                ; Bk   Gk
02538                 fxch    st(1)                                                   ; Gk   Bk
02539                 fstp    qword ptr[Bucket2]                              ; Bk
02540 
02541                 mov             edx,dword ptr[Bucket]
02542                 mov             eax,dword ptr[Bucket2]
02543 
02544                 and             edx,REDMASK2
02545                 and             eax,GREENMASK2
02546 
02547                 fstp    qword ptr[Bucket]
02548 
02549                 mov             ecx,TDest
02550                 mov             ebx,dword ptr[Bucket]
02551 
02552                 mov             esi,[z16]
02553                 and             ebx,BLUEMASK2
02554 
02555                 shr             esi,16
02556                 or              edx,eax
02557 
02558                 mov             eax,pZBufferPtr
02559                 add             TDest,2
02560 
02561                 cmp             word ptr[TempPix],01h
02562                 je              SkipSinglePixie
02563 
02564                 or              edx,ebx
02565                 mov             word ptr[eax],si
02566 
02567                 mov             word ptr[ecx],dx
02568 
02569 SkipSinglePixie:
02570                 mov             ebx,pLeft
02571                 mov     edx,[widTemp]
02572                 add             pZBufferPtr,2
02573                 mov     ecx,pRight
02574                 dec             edx
02575                 jz              GouraudReturnNoZ
02576                 mov             esi,edx
02577                 and             esi,1
02578                 sub             edx,esi
02579                 jz              GouraudReturnNoZ
02580 
02581 NoSinglePixie:
02582                 mov     [widTemp],edx                 ; just for a temp
02583                 shr             edx,1
02584 
02585                 ; try to keep fmul fxch pairs seperated to avoid stalling
02586                 ; calc this scanlines steps           ; FPU Stack
02587                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
02588                 fild    dword ptr [widTemp]           ; WID
02589 
02590                 mov     [widTemp],edx                 ; Color interps doubled
02591 
02592                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
02593                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
02594                 fsub    st(1), st                   ; UL   UD   WID
02595                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
02596                 fxch    st(1)                       ; UL   VR   UD   WID
02597                 fmul    [Real65536]                 ; UL16 VR   UD   WID
02598                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
02599                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
02600                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
02601                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
02602                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
02603                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
02604                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
02605                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
02606                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
02607                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
02608                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
02609                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
02610                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
02611                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
02612                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
02613                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
02614                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
02615 
02616                 //let that cook
02617 
02618                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
02619                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
02620                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
02621                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
02622                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
02623                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
02624                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
02625                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
02626                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
02627                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
02628                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
02629                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
02630                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
02631                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
02632                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
02633                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
02634                 frndint
02635                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
02636                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
02637                 frndint
02638                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
02639                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
02640                 frndint
02641                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
02642                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
02643                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
02644                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
02645                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
02646                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
02647                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
02648                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
02649                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
02650                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
02651                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
02652 
02653                 push    ebp
02654 
02655 PixieLoop:
02656                 mov             ebx,[ZStep]
02657 
02658                 add             [z16],ebx
02659                 mov             ecx,[VShift]
02660 
02661                 mov             edi,[z16]
02662 
02663                 shr             edi,16
02664                 mov             ebx,[GHMaskShifted]
02665 
02666                 mov             ebp,[GWMask]
02667                 mov             edx,dword ptr[u16]
02668 
02669                 mov             word ptr[Z32],di
02670                 mov             eax,edx
02671 
02672                 shr             edx,16
02673                 mov             edi,[v16]
02674 
02675                 add             eax,[UStep]
02676                 mov             esi,edi
02677 
02678                 shr             edi,cl
02679                 add             esi,[VStep]
02680 
02681                 and             edi,ebx
02682                 and             edx,ebp
02683 
02684                 add             edi,edx
02685                 mov             edx,eax
02686 
02687                 add             edi,GBitPtrHalf
02688                 add             eax,[UStep]
02689 
02690                 mov             [u16],eax
02691                 mov             ax,word ptr[edi*2]
02692 
02693                 mov             edi,esi
02694                 add             esi,[VStep]
02695 
02696                 shr             edx,16
02697                 mov             [v16],esi
02698 
02699                 shr             edi,cl
02700                 and             edx,ebp
02701 
02702                 mov             esi,GBitPtrHalf
02703                 and             edi,ebx
02704 
02705                 shl             eax,16
02706                 add             esi,edx
02707 
02708                 add             esi,edi
02709 
02710                 mov             ax,word ptr[esi*2]
02711 
02712                 mov             [TempPix],eax
02713 
02714                 mov             ebx,eax
02715                 and             eax,REDMASK2
02716 
02717                 mov             ecx,ebx
02718                 and             ebx,GREENMASK2
02719 
02720                 mov             dword ptr[Red],eax
02721                 and             ecx,BLUEMASK2
02722 
02723                 mov             dword ptr[Green],ebx
02724                 mov             dword ptr[Blue],ecx
02725 
02726                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
02727                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
02728                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
02729                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
02730                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
02731                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
02732                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
02733                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
02734                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
02735                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
02736                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
02737                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
02738                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
02739                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
02740                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
02741 
02742                 mov             edx,dword ptr[Bucket]
02743                 mov             eax,dword ptr[Bucket2]
02744 
02745                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
02746                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
02747                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
02748                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
02749                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
02750                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
02751 
02752                 and             edx,GREENMASK2
02753                 and             eax,REDMASK2
02754 
02755                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
02756                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
02757 
02758                 mov             edi,edx
02759                 mov             ebx,dword ptr[Bucket]
02760                 or              edi,eax
02761                 mov             ebp,TDest
02762                 and             ebx,BLUEMASK2
02763 
02764                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
02765                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
02766 
02767                 mov             si,word ptr[Z32]
02768                 add             TDest,4
02769 
02770                 mov             ecx,pZBufferPtr
02771                 or              edi,ebx
02772 
02773                 cmp             [TempPix],010001h
02774                 je              SkipPixie
02775 
02776                 mov             [ecx],si
02777                 rol             edi,16
02778 
02779                 mov             dword ptr[ebp],edi
02780                 mov             [ecx+2],si
02781 SkipPixie:
02782                 add             pZBufferPtr,4
02783                 dec             [widTemp]
02784 
02785                 jnz             PixieLoop
02786 
02787                 pop             ebp
02788 
02789                 fstp    [u16]
02790                 fstp    [v16]
02791                 fstp    [u16]
02792                 fstp    [v16]
02793                 fstp    [u16]
02794                 fstp    [v16]
02795 
02796 GouraudReturnNoZ:
02797                 pop             edi
02798                 pop             esi
02799                 pop             ecx
02800                 pop             ebx
02801         }
02802 }

void DrawScanLineGouraudNoZSolid_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 2804 of file x86span555.c.

References BlueMask, BLUEMASK2, Bucket, Bucket2, Dest, Green, GREENMASK2, GreenMask2, Magic, MiniRedMask2, or, r, Red, RedMask2, REDMASK2, TDest, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderGouraudPoly().

02805 {
02806         TDest   =Dest;
02807         Red             =Green  =0;
02808         _asm
02809         {
02810                 push    ebx
02811                 push    ecx
02812                 push    esi
02813                 push    edi
02814 
02815                 mov             ebx,pLeft
02816                 mov     ecx,pRight
02817                 mov     eax,[ebx]EdgeAsmFPU.X
02818                 mov     edx,[ecx]EdgeAsmFPU.X
02819                 sub     edx,eax
02820                 jle             GouraudReturnNoZ
02821 
02822                 mov             esi,eax
02823                 inc             edx
02824                 shl             eax,1
02825                 add             TDest,eax
02826                 test    esi,1                                   //dword align left side
02827                 jz              NoSinglePixie
02828 
02829                 //odd sized spans write one pixel to dword align
02830                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
02831                 fmul    dword ptr[BlueMask]
02832                 fadd    qword ptr[Magic]                                ; Bk
02833                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
02834                 fmul    dword ptr[GreenMask2]
02835                 fadd    qword ptr[Magic]                                ; Gk   Bk
02836                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
02837                 fmul    dword ptr[MiniRedMask2]
02838                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
02839                 fxch    st(2)                                                   ; Bk   Gk   Rk
02840                 fstp    qword ptr[Bucket]                               ; Gk   Rk
02841                 fstp    qword ptr[Bucket2]                              ; Rk
02842 
02843                 mov             esi,dword ptr[Bucket]
02844                 mov             eax,dword ptr[Bucket2]
02845 
02846                 and             esi,BLUEMASK2
02847                 and             eax,GREENMASK2
02848 
02849                 fstp    qword ptr[Bucket]
02850 
02851                 mov             ecx,TDest
02852                 mov             ebx,dword ptr[Bucket]
02853 
02854                 and             ebx,REDMASK2
02855                 or              esi,eax
02856 
02857                 add             TDest,2
02858                 or              esi,ebx
02859 
02860                 mov             ebx,pLeft
02861                 mov             word ptr[ecx],si
02862 
02863                 mov             ecx,pRight
02864                 dec             edx
02865 
02866                 jz              GouraudReturnNoZ
02867                 mov             esi,edx
02868                 and             esi,1
02869                 sub             edx,esi
02870                 jz              GouraudReturnNoZ
02871 
02872 NoSinglePixie:
02873                 shr             edx,1
02874                 fld1
02875                 mov     [widTemp],edx                 ; just for a temp
02876                 
02877 
02878                 ; try to keep fmul fxch pairs seperated to avoid stalling
02879                 ; calc this scanlines steps                             ; FPU Stack
02880                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
02881                 fidiv   dword ptr [widTemp]                             ; WID
02882                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
02883                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
02884                 fsub    st(1),st                                                ; RL   RD   WID
02885                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
02886                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
02887                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
02888                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
02889                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
02890                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
02891                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
02892                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
02893                 frndint
02894                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
02895                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
02896                 frndint
02897                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
02898                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
02899                 frndint
02900                 fld             qword ptr[RedMask2]                             ; rm   BI   GL   RI   RL   BL   GI
02901                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
02902                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
02903                 fld             dword ptr[GreenMask2]                   ; gm   BI   GL   RI   RL   BL   GI
02904                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
02905                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
02906                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
02907                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
02908                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
02909 
02910 PixieLoop:
02911 
02912                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
02913                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
02914                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
02915                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
02916                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
02917                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
02918                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
02919                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
02920                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
02921 
02922                 mov             ecx,dword ptr[Bucket]
02923                 mov             eax,dword ptr[Bucket2]
02924 
02925                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
02926                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
02927 
02928                 and             ecx,REDMASK2
02929                 and             eax,GREENMASK2
02930 
02931                 mov             ebx,dword ptr[Bucket]
02932                 or              ecx,eax
02933 
02934                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
02935                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
02936                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
02937                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
02938                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
02939                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
02940 
02941                 and             ebx,BLUEMASK2
02942                 mov             edi,TDest
02943 
02944                 or              ecx,ebx
02945                 add             TDest,4
02946 
02947                 rol             ecx,16
02948 
02949                 mov             [edi],ecx
02950                 dec             edx
02951 
02952                 jnz             PixieLoop
02953 
02954 
02955                 fstp    [u16]
02956                 fstp    [v16]
02957                 fstp    [u16]
02958                 fstp    [v16]
02959                 fstp    [u16]
02960                 fstp    [v16]
02961 
02962 GouraudReturnNoZ:
02963                 pop             edi
02964                 pop             esi
02965                 pop             ecx
02966                 pop             ebx
02967         }
02968 }

void DrawScanLineGouraudNoZTrans_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 357 of file x86span555.c.

References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, r, R, Real65536, Red, REDMASK2, TDest, TempPix, Two, VShift, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderMiscTexturePoly().

00358 {
00359         TDest   =Dest;
00360         Red             =Green  =0;
00361         _asm
00362         {
00363                 push    ebx
00364                 push    ecx
00365                 push    esi
00366                 push    edi
00367 
00368                 mov             ebx,pLeft
00369                 mov     ecx,pRight
00370                 mov     eax,[ebx]EdgeAsmFPU.X
00371                 mov     edx,[ecx]EdgeAsmFPU.X
00372                 sub     edx,eax
00373                 jle             GouraudReturnNoZ
00374 
00375                 mov             esi,eax
00376                 inc             edx
00377                 shl             eax,1
00378                 add             TDest,eax
00379                 test    esi,1           //dword align left side
00380                 jz              NoSinglePixie
00381 
00382                 //odd sized spans write one pixel to dword align
00383                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
00384                 fmul    [Real65536]                                             ; UL16
00385                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
00386                 fmul    [Real65536]                                             ; VL16 UL16
00387                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
00388                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
00389                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
00390                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
00391                 fistp   [u16]                                                   ; GL   RL   VL16 BL
00392                 fxch    st(2)                                                   ; VL16 RL   GL   BL
00393                 fistp   [v16]                                                   ; RL   GL   BL
00394 
00395                 mov     [widTemp],edx
00396 
00397                 mov             ecx,[VShift]
00398                 mov             ebx,[GHMaskShifted]
00399 
00400                 mov             esi,[GWMask]
00401                 mov             edi,[v16]
00402 
00403                 mov             edx,dword ptr[u16]
00404 
00405                 shr             edi,cl
00406 
00407                 shr             edx,16
00408                 xor             eax,eax
00409 
00410                 and             edi,ebx
00411                 and             edx,esi
00412 
00413                 add             edi,edx
00414 
00415                 add             edi,GBitPtrHalf
00416                 mov             ax,word ptr[edi*2]
00417 
00418                 mov             word ptr[TempPix],ax
00419 
00420                 mov             ebx,eax
00421                 and             eax,REDMASK2
00422 
00423                 mov             ecx,ebx
00424                 and             ebx,GREENMASK2
00425 
00426                 mov             dword ptr[Red],eax
00427                 and             ecx,BLUEMASK2
00428 
00429                 mov             dword ptr[Green],ebx
00430                 mov             dword ptr[Blue],ecx
00431 
00432                 fimul   dword ptr[Red]                                  ; R    GL   BL
00433                 fxch    st(1)                                                   ; GL   R    BL
00434                 fimul   dword ptr[Green]                                ; G    R    BL
00435                 fxch    st(1)                                                   ; R    G    BL
00436                 fadd    qword ptr[Magic]                                ; Rk   G    BL
00437                 fxch    st(2)                                                   ; BL   G    Rk
00438                 fimul   [Blue]                                                  ; B    G    Rk
00439                 fxch    st(1)                                                   ; G    B    Rk
00440                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
00441                 fxch    st(2)                                                   ; Rk   B    Gk
00442                 fstp    qword ptr[Bucket]                               ; B    Gk
00443                 fadd    qword ptr[Magic]                                ; Bk   Gk
00444                 fxch    st(1)                                                   ; Gk   Bk
00445                 fstp    qword ptr[Bucket2]                              ; Bk
00446 
00447                 mov             edx,dword ptr[Bucket]
00448                 mov             eax,dword ptr[Bucket2]
00449 
00450                 and             edx,REDMASK2
00451                 and             eax,GREENMASK2
00452 
00453                 fstp    qword ptr[Bucket]
00454 
00455                 mov             ecx,TDest
00456                 mov             ebx,dword ptr[Bucket]
00457 
00458                 and             ebx,BLUEMASK2
00459                 or              edx,eax
00460 
00461                 add             TDest,2
00462                 or              edx,ebx
00463 
00464                 mov             ebx,pLeft
00465                 cmp             word ptr[TempPix],01h
00466                 je              SkipSinglePixie
00467 
00468                 mov             word ptr[ecx],dx
00469 
00470 SkipSinglePixie:
00471                 mov     edx,[widTemp]
00472                 mov     ecx,pRight
00473                 dec             edx
00474                 jz              GouraudReturnNoZ
00475                 mov             esi,edx
00476                 and             esi,1
00477                 sub             edx,esi
00478                 jz              GouraudReturnNoZ
00479 
00480 NoSinglePixie:
00481                 mov     [widTemp],edx                 ; just for a temp
00482                 shr             edx,1
00483 
00484                 ; try to keep fmul fxch pairs seperated to avoid stalling
00485                 ; calc this scanlines steps           ; FPU Stack
00486                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
00487                 fild    dword ptr [widTemp]           ; WID
00488 
00489                 mov     [widTemp],edx                 ; Color interps doubled
00490 
00491                 fld     dword ptr [ecx]EdgeAsmFPU.u      ; UR   WID
00492                 fld     dword ptr [ebx]EdgeAsmFPU.u      ; UL   UR   WID
00493                 fsub    st(1), st                     ; UL   UD   WID
00494                 fld     dword ptr [ecx]EdgeAsmFPU.v      ; VR   UL   UD   WID
00495                 fxch    st(1)                         ; UL   VR   UD   WID
00496                 fmul    [Real65536]                   ; UL16 VR   UD   WID
00497                 fld     dword ptr [ebx]EdgeAsmFPU.v      ; VL   UL16 VR   UD   WID
00498                 fsub    st(2), st                     ; VL   UL16 VD   UD   WID
00499                 fild    dword ptr [ecx]EdgeAsmFPU.R      ; RR   VL   UL16 VD   UD   WID
00500                 fxch    st(3)                         ; VD   VL   UL16 RR   UD   WID
00501                 fmul    [Real65536]                   ; VD16 VL   UL16 RR   UD   WID
00502                 fild    dword ptr [ebx]EdgeAsmFPU.R      ; RL   VD16 VL   UL16 RR   UD   WID
00503                 fsub    st(4),st                      ; RL   VD16 VL   UL16 RD   UD   WID
00504                 fxch    st(5)                         ; UD   VD16 VL   UL16 RD   RL   WID
00505                 fmul    [Real65536]                   ; UD16 VD16 VL   UL16 RD   RL   WID
00506                 fxch    st(2)                                             ; VL   VD16 UD16 UL16 RD   RL   WID
00507                 fmul    [Real65536]                   ; VL16 VD16 UD16 UL16 RD   RL   WID
00508                 fxch    st(3)                                                   ; UL16 VD16 UD16 VL16 RD   RL   WID
00509                 fistp   [u16]                                                   ; VD16 UD16 VL16 RD   RL   WID
00510                 fxch    st(2)                                                   ; VL16 UD16 VD16 RD   RL   WID
00511                 fistp   [v16]                                                   ; UD16 VD16 RD   RL   WID
00512                 fld1                                                                    ; 1    UD16 VD16 RD   RL   WID
00513                 fdivrp  st(5),st                                                ; UD16 VD16 RD   RL   DWID
00514 
00515                 //let that cook
00516 
00517                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
00518                 fild    [ecx]EdgeAsmFPU.G                                       ; RG   USTP VD16 RD   RL   DWID
00519                 fild    [ebx]EdgeAsmFPU.G                                       ; LG   RG   USTP VD16 RD   RL   DWID
00520                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
00521                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
00522                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
00523                 fild    [ecx]EdgeAsmFPU.B                                       ; RB   GD   LG   VD16 RD   RL   DWID
00524                 fild    [ebx]EdgeAsmFPU.B                                       ; LB   RB   GD   LG   VD16 RD   RL   DWID
00525                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
00526                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
00527                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
00528                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
00529                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
00530                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
00531                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
00532                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
00533                 frndint
00534                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
00535                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
00536                 frndint
00537                 fxch    st(7)                                                   ; DW2  BD   RI   LG   LB   VSTP RL   GI
00538                 fmulp   st(1),st                                                ; BI   RI   LG   LB   VSTP RL   GI
00539                 frndint
00540                 fxch    st(4)                                                   ; VSTP RI   LG   LB   BI   RL   GI
00541                 fistp   [VStep]                                                 ; RI   LG   LB   BI   RL   GI
00542 
00543                 push    ebp
00544 
00545 PixieLoop:
00546                 mov             ecx,[VShift]
00547                 mov             ebx,[GHMaskShifted]
00548 
00549                 mov             ebp,[GWMask]
00550                 mov             edi,[v16]
00551 
00552                 mov             edx,dword ptr[u16]
00553                 mov             esi,edi
00554 
00555                 mov             eax,edx
00556 
00557                 shr             edi,cl
00558                 add             esi,[VStep]
00559 
00560                 shr             edx,16
00561                 add             eax,[UStep]
00562 
00563                 and             edi,ebx
00564                 and             edx,ebp
00565 
00566                 add             edi,edx
00567                 mov             edx,eax
00568 
00569                 add             edi,GBitPtrHalf
00570                 add             eax,[UStep]
00571 
00572                 mov             [u16],eax
00573                 mov             ax,word ptr[edi*2]
00574 
00575                 mov             edi,esi
00576                 add             esi,[VStep]
00577 
00578                 shr             edx,16
00579                 mov             [v16],esi
00580 
00581                 shr             edi,cl
00582                 and             edx,ebp
00583 
00584                 mov             esi,GBitPtrHalf
00585                 and             edi,ebx
00586 
00587                 shl             eax,16
00588                 add             esi,edx
00589 
00590                 add             esi,edi
00591 
00592                 mov             ax,word ptr[esi*2]
00593 
00594                 mov             [TempPix],eax
00595 
00596                 mov             ebx,eax
00597                 and             eax,REDMASK2
00598 
00599                 mov             ecx,ebx
00600                 and             ebx,GREENMASK2
00601 
00602                 mov             dword ptr[Red],eax
00603                 and             ecx,BLUEMASK2
00604 
00605                 mov             dword ptr[Green],ebx
00606                 mov             dword ptr[Blue],ecx
00607 
00608                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
00609                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
00610                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
00611                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
00612                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
00613                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
00614                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
00615                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
00616                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
00617                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
00618                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
00619                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
00620                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
00621                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
00622                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
00623 
00624                 mov             edx,dword ptr[Bucket]
00625                 mov             eax,dword ptr[Bucket2]
00626 
00627                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
00628                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
00629                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
00630                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
00631                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
00632                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
00633 
00634                 and             edx,GREENMASK2
00635                 and             eax,REDMASK2
00636 
00637                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
00638                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
00639 
00640                 mov             edi,edx
00641                 mov             ebx,dword ptr[Bucket]
00642                 or              edi,eax
00643                 mov             ebp,TDest
00644                 and             ebx,BLUEMASK2
00645 
00646                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
00647                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
00648 
00649                 or              edi,ebx
00650                 add             TDest,4
00651 
00652                 cmp             [TempPix],010001h
00653                 je              SkipPixie
00654 
00655                 mov             [ebp],edi
00656 
00657 SkipPixie:
00658                 dec             [widTemp]
00659 
00660                 jnz             PixieLoop
00661 
00662                 pop             ebp
00663 
00664                 fstp    [u16]
00665                 fstp    [v16]
00666                 fstp    [u16]
00667                 fstp    [v16]
00668                 fstp    [u16]
00669                 fstp    [v16]
00670 
00671 GouraudReturnNoZ:
00672                 pop             edi
00673                 pop             esi
00674                 pop             ecx
00675                 pop             ebx
00676         }
00677 }

void DrawScanLineGouraudZBuffer_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

(DRV_RENDER_NO_ZMASK | DRV_RENDER_NO_ZWRITE)

Definition at line 679 of file x86span555.c.

References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, Two, VShift, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderMiscTexturePoly().

00680 {
00681         TDest   =Dest;
00682         Red             =Green  =0;
00683         _asm
00684         {
00685                 push    ebx
00686                 push    ecx
00687                 push    esi
00688                 push    edi
00689 
00690                 mov             ebx,pLeft
00691                 mov     ecx,pRight
00692                 mov     eax,[ebx]EdgeAsmFPU.X
00693                 mov     edx,[ecx]EdgeAsmFPU.X
00694                 sub     edx,eax
00695                 jle             GouraudReturnNoZ
00696 
00697                 mov             esi,eax
00698                 inc             edx
00699                 shl             eax,1
00700                 add             TDest,eax
00701                 add             pZBufferPtr,eax
00702                 test    esi,1           //dword align left
00703                 jz              NoSinglePixie
00704 
00705                 //odd sized spans write one pixel to dword align
00706                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
00707                 fmul    [Real65536]                                             ; UL16
00708                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
00709                 fmul    [Real65536]                                             ; VL16 UL16
00710                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
00711                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
00712                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
00713                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
00714                 fistp   [u16]                                                   ; GL   RL   VL16 BL
00715                 fxch    st(2)                                                   ; VL16 RL   GL   BL
00716                 fistp   [v16]                                                   ; RL   GL   BL
00717                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
00718                 fistp   [z16]                                                   ; RL   GL   BL
00719 
00720                 mov     [widTemp],edx
00721 
00722                 mov             ecx,[VShift]
00723                 mov             ebx,[GHMaskShifted]
00724 
00725                 mov             esi,[GWMask]
00726                 mov             edi,[v16]
00727 
00728                 mov             edx,dword ptr[u16]
00729 
00730                 shr             edi,cl
00731 
00732                 shr             edx,16
00733                 xor             eax,eax
00734 
00735                 and             edi,ebx
00736                 and             edx,esi
00737 
00738                 add             edi,edx
00739 
00740                 add             edi,GBitPtrHalf
00741                 mov             ax,word ptr[edi*2]
00742 
00743                 mov             ebx,eax
00744                 and             eax,REDMASK2
00745 
00746                 mov             ecx,ebx
00747                 and             ebx,GREENMASK2
00748 
00749                 mov             dword ptr[Red],eax
00750                 and             ecx,BLUEMASK2
00751 
00752                 mov             dword ptr[Green],ebx
00753                 mov             dword ptr[Blue],ecx
00754 
00755                 fimul   dword ptr[Red]                                  ; R    GL   BL
00756                 fxch    st(1)                                                   ; GL   R    BL
00757                 fimul   dword ptr[Green]                                ; G    R    BL
00758                 fxch    st(1)                                                   ; R    G    BL
00759                 fadd    qword ptr[Magic]                                ; Rk   G    BL
00760                 fxch    st(2)                                                   ; BL   G    Rk
00761                 fimul   [Blue]                                                  ; B    G    Rk
00762                 fxch    st(1)                                                   ; G    B    Rk
00763                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
00764                 fxch    st(2)                                                   ; Rk   B    Gk
00765                 fstp    qword ptr[Bucket]                               ; B    Gk
00766                 fadd    qword ptr[Magic]                                ; Bk   Gk
00767                 fxch    st(1)                                                   ; Gk   Bk
00768                 fstp    qword ptr[Bucket2]                              ; Bk
00769 
00770                 mov             edx,dword ptr[Bucket]
00771                 mov             eax,dword ptr[Bucket2]
00772 
00773                 and             edx,REDMASK2
00774                 and             eax,GREENMASK2
00775 
00776                 fstp    qword ptr[Bucket]
00777 
00778                 mov             ecx,TDest
00779                 mov             ebx,dword ptr[Bucket]
00780 
00781                 mov             esi,[z16]
00782                 and             ebx,BLUEMASK2
00783 
00784                 shr             esi,16
00785                 or              edx,eax
00786 
00787                 mov             eax,pZBufferPtr
00788                 add             TDest,2
00789 
00790                 cmp             word ptr[eax],si
00791                 jg              SkipSinglePixie
00792 
00793                 or              edx,ebx
00794                 mov             word ptr[eax],si
00795 
00796                 mov             word ptr[ecx],dx
00797 
00798 SkipSinglePixie:
00799                 mov             ebx,pLeft
00800                 mov     edx,[widTemp]
00801                 add             pZBufferPtr,2
00802                 mov     ecx,pRight
00803                 dec             edx
00804                 jz              GouraudReturnNoZ
00805                 mov             esi,edx
00806                 and             esi,1
00807                 sub             edx,esi
00808                 jz              GouraudReturnNoZ
00809 
00810 NoSinglePixie:
00811                 mov     [widTemp],edx                 ; just for a temp
00812                 shr             edx,1
00813 
00814                 ; try to keep fmul fxch pairs seperated to avoid stalling
00815                 ; calc this scanlines steps           ; FPU Stack
00816                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
00817                 fild    dword ptr [widTemp]           ; WID
00818 
00819                 mov     [widTemp],edx                 ; Color interps doubled
00820 
00821                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
00822                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
00823                 fsub    st(1), st                   ; UL   UD   WID
00824                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
00825                 fxch    st(1)                       ; UL   VR   UD   WID
00826                 fmul    [Real65536]                 ; UL16 VR   UD   WID
00827                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
00828                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
00829                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
00830                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
00831                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
00832                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
00833                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
00834                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
00835                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
00836                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
00837                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
00838                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
00839                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
00840                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
00841                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
00842                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
00843                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
00844 
00845                 //let that cook
00846 
00847                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
00848                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
00849                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
00850                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
00851                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
00852                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
00853                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
00854                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
00855                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
00856                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
00857                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
00858                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
00859                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
00860                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
00861                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
00862                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
00863                 frndint
00864                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
00865                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
00866                 frndint
00867                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
00868                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
00869                 frndint
00870                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
00871                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
00872                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
00873                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
00874                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
00875                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
00876                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
00877                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
00878                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
00879                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
00880                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
00881 
00882                 push    ebp
00883 
00884 PixieLoop:
00885                 mov             ebx,[ZStep]
00886 
00887                 add             [z16],ebx
00888                 mov             ecx,[VShift]
00889 
00890                 mov             edi,[z16]
00891 
00892                 shr             edi,16
00893                 mov             ebx,[GHMaskShifted]
00894 
00895                 mov             ebp,[GWMask]
00896                 mov             edx,dword ptr[u16]
00897 
00898                 mov             word ptr[Z32],di
00899                 mov             eax,edx
00900 
00901                 shr             edx,16
00902                 mov             edi,[v16]
00903 
00904                 add             eax,[UStep]
00905                 mov             esi,edi
00906 
00907                 shr             edi,cl
00908                 add             esi,[VStep]
00909 
00910                 and             edi,ebx
00911                 and             edx,ebp
00912 
00913                 add             edi,edx
00914                 mov             edx,eax
00915 
00916                 add             edi,GBitPtrHalf
00917                 add             eax,[UStep]
00918 
00919                 mov             [u16],eax
00920                 mov             ax,word ptr[edi*2]
00921 
00922                 mov             edi,esi
00923                 add             esi,[VStep]
00924 
00925                 shr             edx,16
00926                 mov             [v16],esi
00927 
00928                 shr             edi,cl
00929                 and             edx,ebp
00930 
00931                 mov             esi,GBitPtrHalf
00932                 and             edi,ebx
00933 
00934                 shl             eax,16
00935                 add             esi,edx
00936 
00937                 add             esi,edi
00938 
00939                 mov             ax,word ptr[esi*2]
00940 
00941                 mov             ebx,eax
00942                 and             eax,REDMASK2
00943 
00944                 mov             ecx,ebx
00945                 and             ebx,GREENMASK2
00946 
00947                 mov             dword ptr[Red],eax
00948                 and             ecx,BLUEMASK2
00949 
00950                 mov             dword ptr[Green],ebx
00951                 mov             dword ptr[Blue],ecx
00952 
00953                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
00954                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
00955                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
00956                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
00957                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
00958                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
00959                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
00960                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
00961                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
00962                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
00963                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
00964                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
00965                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
00966                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
00967                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
00968 
00969                 mov             edx,dword ptr[Bucket]
00970                 mov             eax,dword ptr[Bucket2]
00971 
00972                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
00973                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
00974                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
00975                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
00976                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
00977                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
00978 
00979                 and             edx,GREENMASK2
00980                 and             eax,REDMASK2
00981 
00982                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
00983                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
00984 
00985                 mov             edi,edx
00986                 mov             ebx,dword ptr[Bucket]
00987                 or              edi,eax
00988                 mov             ebp,TDest
00989                 and             ebx,BLUEMASK2
00990 
00991                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
00992                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
00993 
00994                 mov             si,word ptr[Z32]
00995                 add             TDest,4
00996 
00997                 mov             ecx,pZBufferPtr
00998                 or              edi,ebx
00999 
01000                 cmp             word ptr[ecx],si
01001                 jg              SkipPixie
01002 
01003                 rol             edi,16
01004 
01005                 mov             [ecx],si
01006                 mov             dword ptr[ebp],edi
01007                 mov             [ecx+2],si
01008 SkipPixie:
01009                 add             pZBufferPtr,4
01010                 dec             [widTemp]
01011 
01012                 jnz             PixieLoop
01013 //              mov             dword ptr[ebp],0ffffffffh
01014 
01015                 pop             ebp
01016 
01017                 fstp    [u16]
01018                 fstp    [v16]
01019                 fstp    [u16]
01020                 fstp    [v16]
01021                 fstp    [u16]
01022                 fstp    [v16]
01023 
01024 GouraudReturnNoZ:
01025                 pop             edi
01026                 pop             esi
01027                 pop             ecx
01028                 pop             ebx
01029         }
01030 }

void DrawScanLineGouraudZBufferAlphaTex_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

void DrawScanLineGouraudZBufferNoZWrite_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 1032 of file x86span555.c.

References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, Two, VShift, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderMiscTexturePoly().

01033 {
01034         TDest   =Dest;
01035         Red             =Green  =0;
01036         _asm
01037         {
01038                 push    ebx
01039                 push    ecx
01040                 push    esi
01041                 push    edi
01042 
01043                 mov             ebx,pLeft
01044                 mov     ecx,pRight
01045                 mov     eax,[ebx]EdgeAsmFPU.X
01046                 mov     edx,[ecx]EdgeAsmFPU.X
01047                 sub     edx,eax
01048                 jle             GouraudReturnNoZ
01049 
01050                 mov             esi,eax
01051                 inc             edx
01052                 shl             eax,1
01053                 add             TDest,eax
01054                 add             pZBufferPtr,eax
01055                 test    esi,1           //dword align left
01056                 jz              NoSinglePixie
01057 
01058                 //odd sized spans write one pixel to dword align
01059                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
01060                 fmul    [Real65536]                                             ; UL16
01061                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
01062                 fmul    [Real65536]                                             ; VL16 UL16
01063                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
01064                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
01065                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
01066                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
01067                 fistp   [u16]                                                   ; GL   RL   VL16 BL
01068                 fxch    st(2)                                                   ; VL16 RL   GL   BL
01069                 fistp   [v16]                                                   ; RL   GL   BL
01070                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
01071                 fistp   [z16]                                                   ; RL   GL   BL
01072 
01073                 mov     [widTemp],edx
01074 
01075                 mov             ecx,[VShift]
01076                 mov             ebx,[GHMaskShifted]
01077 
01078                 mov             esi,[GWMask]
01079                 mov             edi,[v16]
01080 
01081                 mov             edx,dword ptr[u16]
01082 
01083                 shr             edi,cl
01084 
01085                 shr             edx,16
01086                 xor             eax,eax
01087 
01088                 and             edi,ebx
01089                 and             edx,esi
01090 
01091                 add             edi,edx
01092 
01093                 add             edi,GBitPtrHalf
01094                 mov             ax,word ptr[edi*2]
01095 
01096                 mov             ebx,eax
01097                 and             eax,REDMASK2
01098 
01099                 mov             ecx,ebx
01100                 and             ebx,GREENMASK2
01101 
01102                 mov             dword ptr[Red],eax
01103                 and             ecx,BLUEMASK2
01104 
01105                 mov             dword ptr[Green],ebx
01106                 mov             dword ptr[Blue],ecx
01107 
01108                 fimul   dword ptr[Red]                                  ; R    GL   BL
01109                 fxch    st(1)                                                   ; GL   R    BL
01110                 fimul   dword ptr[Green]                                ; G    R    BL
01111                 fxch    st(1)                                                   ; R    G    BL
01112                 fadd    qword ptr[Magic]                                ; Rk   G    BL
01113                 fxch    st(2)                                                   ; BL   G    Rk
01114                 fimul   [Blue]                                                  ; B    G    Rk
01115                 fxch    st(1)                                                   ; G    B    Rk
01116                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
01117                 fxch    st(2)                                                   ; Rk   B    Gk
01118                 fstp    qword ptr[Bucket]                               ; B    Gk
01119                 fadd    qword ptr[Magic]                                ; Bk   Gk
01120                 fxch    st(1)                                                   ; Gk   Bk
01121                 fstp    qword ptr[Bucket2]                              ; Bk
01122 
01123                 mov             edx,dword ptr[Bucket]
01124                 mov             eax,dword ptr[Bucket2]
01125 
01126                 and             edx,REDMASK2
01127                 and             eax,GREENMASK2
01128 
01129                 fstp    qword ptr[Bucket]
01130 
01131                 mov             ecx,TDest
01132                 mov             ebx,dword ptr[Bucket]
01133 
01134                 mov             esi,[z16]
01135                 and             ebx,BLUEMASK2
01136 
01137                 shr             esi,16
01138                 or              edx,eax
01139 
01140                 mov             eax,pZBufferPtr
01141                 add             TDest,2
01142 
01143                 cmp             word ptr[eax],si
01144                 jg              SkipSinglePixie
01145 
01146                 or              edx,ebx
01147 
01148                 mov             word ptr[ecx],dx
01149 
01150 SkipSinglePixie:
01151                 mov             ebx,pLeft
01152                 mov     edx,[widTemp]
01153                 add             pZBufferPtr,2
01154                 mov     ecx,pRight
01155                 dec             edx
01156                 jz              GouraudReturnNoZ
01157                 mov             esi,edx
01158                 and             esi,1
01159                 sub             edx,esi
01160                 jz              GouraudReturnNoZ
01161 
01162 NoSinglePixie:
01163                 mov     [widTemp],edx                 ; just for a temp
01164                 shr             edx,1
01165 
01166                 ; try to keep fmul fxch pairs seperated to avoid stalling
01167                 ; calc this scanlines steps           ; FPU Stack
01168                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
01169                 fild    dword ptr [widTemp]           ; WID
01170 
01171                 mov     [widTemp],edx                 ; Color interps doubled
01172 
01173                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
01174                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
01175                 fsub    st(1), st                   ; UL   UD   WID
01176                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
01177                 fxch    st(1)                       ; UL   VR   UD   WID
01178                 fmul    [Real65536]                 ; UL16 VR   UD   WID
01179                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
01180                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
01181                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
01182                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
01183                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
01184                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
01185                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
01186                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
01187                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
01188                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
01189                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
01190                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
01191                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
01192                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
01193                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
01194                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
01195                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
01196 
01197                 //let that cook
01198 
01199                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
01200                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
01201                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
01202                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
01203                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
01204                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
01205                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
01206                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
01207                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
01208                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
01209                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
01210                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
01211                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
01212                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
01213                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
01214                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
01215                 frndint
01216                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
01217                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
01218                 frndint
01219                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
01220                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
01221                 frndint
01222                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
01223                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
01224                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
01225                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
01226                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
01227                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
01228                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
01229                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
01230                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
01231                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
01232                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
01233 
01234                 push    ebp
01235 
01236 PixieLoop:
01237                 mov             ebx,[ZStep]
01238 
01239                 add             [z16],ebx
01240                 mov             ecx,[VShift]
01241 
01242                 mov             edi,[z16]
01243 
01244                 shr             edi,16
01245                 mov             ebx,[GHMaskShifted]
01246 
01247                 mov             ebp,[GWMask]
01248                 mov             edx,dword ptr[u16]
01249 
01250                 mov             word ptr[Z32],di
01251                 mov             eax,edx
01252 
01253                 shr             edx,16
01254                 mov             edi,[v16]
01255 
01256                 add             eax,[UStep]
01257                 mov             esi,edi
01258 
01259                 shr             edi,cl
01260                 add             esi,[VStep]
01261 
01262                 and             edi,ebx
01263                 and             edx,ebp
01264 
01265                 add             edi,edx
01266                 mov             edx,eax
01267 
01268                 add             edi,GBitPtrHalf
01269                 add             eax,[UStep]
01270 
01271                 mov             [u16],eax
01272                 mov             ax,word ptr[edi*2]
01273 
01274                 mov             edi,esi
01275                 add             esi,[VStep]
01276 
01277                 shr             edx,16
01278                 mov             [v16],esi
01279 
01280                 shr             edi,cl
01281                 and             edx,ebp
01282 
01283                 mov             esi,GBitPtrHalf
01284                 and             edi,ebx
01285 
01286                 shl             eax,16
01287                 add             esi,edx
01288 
01289                 add             esi,edi
01290 
01291                 mov             ax,word ptr[esi*2]
01292 
01293                 mov             ebx,eax
01294                 and             eax,REDMASK2
01295 
01296                 mov             ecx,ebx
01297                 and             ebx,GREENMASK2
01298 
01299                 mov             dword ptr[Red],eax
01300                 and             ecx,BLUEMASK2
01301 
01302                 mov             dword ptr[Green],ebx
01303                 mov             dword ptr[Blue],ecx
01304 
01305                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
01306                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
01307                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
01308                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
01309                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
01310                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
01311                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
01312                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
01313                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
01314                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
01315                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
01316                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
01317                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
01318                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
01319                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
01320 
01321                 mov             edx,dword ptr[Bucket]
01322                 mov             eax,dword ptr[Bucket2]
01323 
01324                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
01325                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
01326                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
01327                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
01328                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
01329                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
01330 
01331                 and             edx,GREENMASK2
01332                 and             eax,REDMASK2
01333 
01334                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
01335                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
01336 
01337                 mov             edi,edx
01338                 mov             ebx,dword ptr[Bucket]
01339                 or              edi,eax
01340                 mov             ebp,TDest
01341                 and             ebx,BLUEMASK2
01342 
01343                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
01344                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
01345 
01346                 mov             si,word ptr[Z32]
01347                 add             TDest,4
01348 
01349                 mov             ecx,pZBufferPtr
01350                 or              edi,ebx
01351 
01352                 cmp             word ptr[ecx],si
01353                 jg              SkipPixie
01354 
01355                 rol             edi,16
01356 
01357                 mov             dword ptr[ebp],edi
01358 SkipPixie:
01359                 add             pZBufferPtr,4
01360                 dec             [widTemp]
01361 
01362                 jnz             PixieLoop
01363 
01364                 pop             ebp
01365 
01366                 fstp    [u16]
01367                 fstp    [v16]
01368                 fstp    [u16]
01369                 fstp    [v16]
01370                 fstp    [u16]
01371                 fstp    [v16]
01372 
01373 GouraudReturnNoZ:
01374                 pop             edi
01375                 pop             esi
01376                 pop             ecx
01377                 pop             ebx
01378         }
01379 }

void DrawScanLineGouraudZBufferNoZWriteAlphaTex_Asm555X86FPU EdgeAsm pLeft,
EdgeAsm pRight
 

void DrawScanLineGouraudZBufferNoZWriteSolid_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 3366 of file x86span555.c.

References BlueMask, BLUEMASK2, Bucket, Bucket2, Dest, Green, GREENMASK2, GreenMask2, Magic, MiniRedMask2, or, pZBufferPtr, r, Red, RedMask2, REDMASK2, TDest, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderGouraudPoly().

03367 {
03368         TDest   =Dest;
03369         Red             =Green  =0;
03370         _asm
03371         {
03372                 push    ebx
03373                 push    ecx
03374                 push    esi
03375                 push    edi
03376 
03377                 mov             ebx,pLeft
03378                 mov     ecx,pRight
03379                 mov     eax,[ebx]EdgeAsmFPU.X
03380                 mov     edx,[ecx]EdgeAsmFPU.X
03381                 sub     edx,eax
03382                 jle             GouraudReturnNoZ
03383 
03384                 mov             esi,eax
03385                 inc             edx
03386                 shl             eax,1
03387                 add             TDest,eax
03388                 add             pZBufferPtr,eax
03389                 test    esi,1                                   //dword align left side
03390                 jz              NoSinglePixie
03391 
03392                 //odd sized spans write one pixel to dword align
03393                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
03394                 fmul    dword ptr[BlueMask]
03395                 fadd    qword ptr[Magic]                                ; Bk
03396                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
03397                 fmul    dword ptr[GreenMask2]
03398                 fadd    qword ptr[Magic]                                ; Gk   Bk
03399                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
03400                 fmul    dword ptr[MiniRedMask2]
03401                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
03402                 fxch    st(2)                                                   ; Bk   Gk   Rk
03403                 fstp    qword ptr[Bucket]                               ; Gk   Rk
03404                 fstp    qword ptr[Bucket2]                              ; Rk
03405                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z
03406                 fistp   [z16]                                                   ;
03407 
03408                 mov             esi,dword ptr[Bucket]
03409                 mov             eax,dword ptr[Bucket2]
03410 
03411                 and             esi,BLUEMASK2
03412                 and             eax,GREENMASK2
03413 
03414                 fstp    qword ptr[Bucket]
03415 
03416                 mov             ecx,TDest
03417                 mov             ebx,dword ptr[Bucket]
03418 
03419                 and             ebx,REDMASK2
03420                 or              esi,eax
03421 
03422                 mov             edi,[z16]
03423                 mov             eax,pZBufferPtr
03424 
03425                 add             TDest,2
03426                 or              esi,ebx
03427 
03428                 shr             edi,16
03429                 mov             ebx,pLeft
03430 
03431                 cmp             word ptr[eax],di
03432                 jg              SkipSinglePixie
03433 
03434                 mov             word ptr[ecx],si
03435 
03436 SkipSinglePixie:
03437                 mov             ecx,pRight
03438                 add             pZBufferPtr,2
03439                 dec             edx
03440 
03441                 jz              GouraudReturnNoZ
03442                 mov             esi,edx
03443                 and             esi,1
03444                 sub             edx,esi
03445                 jz              GouraudReturnNoZ
03446 
03447 NoSinglePixie:
03448                 shr             edx,1
03449                 fld1
03450                 mov     [widTemp],edx                 ; just for a temp
03451                 
03452 
03453                 ; try to keep fmul fxch pairs seperated to avoid stalling
03454                 ; calc this scanlines steps                             ; FPU Stack
03455                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
03456                 fidiv   dword ptr [widTemp]                             ; WID
03457                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
03458                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
03459                 fsub    st(1),st                                                ; RL   RD   WID
03460                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
03461                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
03462                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
03463                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
03464                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
03465                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
03466                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
03467                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
03468                 frndint
03469                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
03470                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
03471                 frndint
03472                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
03473                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
03474                 frndint
03475                 fld             qword ptr[RedMask2]                             ; rm   BI   GL   RI   RL   BL   GI
03476                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
03477                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
03478                 fld             dword ptr[GreenMask2]                   ; gm   BI   GL   RI   RL   BL   GI
03479                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
03480                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
03481                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
03482                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
03483                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
03484                 fld             [ecx]EdgeAsmFPU.z                               ; rz   BI   GL   RI   RL   BL   GI
03485                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   BI   GL   RI   RL   BL   GI
03486                 fld             [ebx]EdgeAsmFPU.z                               ; lz   zd   BI   GL   RI   RL   BL   GI
03487                 fistp   [z16]                                                   ; zd   BI   GL   RI   RL   BL   GI
03488                 fistp   [ZStep]                                                 ; BI   GL   RI   RL   BL   GI
03489 
03490 PixieLoop:
03491 
03492                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
03493                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
03494                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
03495                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
03496                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
03497                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
03498                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
03499                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
03500                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
03501 
03502                 mov             ecx,dword ptr[Bucket]
03503                 mov             eax,dword ptr[Bucket2]
03504 
03505                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
03506                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
03507 
03508                 and             ecx,REDMASK2
03509                 and             eax,GREENMASK2
03510 
03511                 mov             ebx,dword ptr[Bucket]
03512                 or              ecx,eax
03513 
03514                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
03515                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
03516                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
03517                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
03518                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
03519                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
03520 
03521                 and             ebx,BLUEMASK2
03522                 mov             edi,TDest
03523 
03524                 or              ecx,ebx
03525                 add             TDest,4
03526 
03527                 mov             eax,[z16]
03528                 mov             esi,pZBufferPtr
03529 
03530                 shr             eax,16
03531                 mov             ebx,[ZStep]
03532 
03533                 cmp             word ptr[esi],ax
03534                 jg              SkipPixie
03535 
03536                 rol             ecx,16
03537                 add             [z16],ebx
03538 
03539                 mov             [edi],ecx
03540 SkipPixie:
03541                 add             pZBufferPtr,4
03542                 dec             edx
03543 
03544                 jnz             PixieLoop
03545 
03546 
03547                 fstp    [u16]
03548                 fstp    [v16]
03549                 fstp    [u16]
03550                 fstp    [v16]
03551                 fstp    [u16]
03552                 fstp    [v16]
03553 
03554 GouraudReturnNoZ:
03555                 pop             edi
03556                 pop             esi
03557                 pop             ecx
03558                 pop             ebx
03559         }
03560 }

void DrawScanLineGouraudZBufferNoZWriteTrans_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 2089 of file x86span555.c.

References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, TempPix, Two, VShift, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderMiscTexturePoly().

02090 {
02091         TDest   =Dest;
02092         Red             =Green  =0;
02093         _asm
02094         {
02095                 push    ebx
02096                 push    ecx
02097                 push    esi
02098                 push    edi
02099 
02100                 mov             ebx,pLeft
02101                 mov     ecx,pRight
02102                 mov     eax,[ebx]EdgeAsmFPU.X
02103                 mov     edx,[ecx]EdgeAsmFPU.X
02104                 sub     edx,eax
02105                 jle             GouraudReturnNoZ
02106 
02107                 mov             esi,eax
02108                 inc             edx
02109                 shl             eax,1
02110                 add             TDest,eax
02111                 add             pZBufferPtr,eax
02112                 test    esi,1           //dword align left
02113                 jz              NoSinglePixie
02114 
02115                 //odd sized spans write one pixel to dword align
02116                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
02117                 fmul    [Real65536]                                             ; UL16
02118                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
02119                 fmul    [Real65536]                                             ; VL16 UL16
02120                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
02121                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
02122                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
02123                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
02124                 fistp   [u16]                                                   ; GL   RL   VL16 BL
02125                 fxch    st(2)                                                   ; VL16 RL   GL   BL
02126                 fistp   [v16]                                                   ; RL   GL   BL
02127                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
02128                 fistp   [z16]                                                   ; RL   GL   BL
02129 
02130                 mov     [widTemp],edx
02131 
02132                 mov             ecx,[VShift]
02133                 mov             ebx,[GHMaskShifted]
02134 
02135                 mov             esi,[GWMask]
02136                 mov             edi,[v16]
02137 
02138                 mov             edx,dword ptr[u16]
02139 
02140                 shr             edi,cl
02141 
02142                 shr             edx,16
02143                 xor             eax,eax
02144 
02145                 and             edi,ebx
02146                 and             edx,esi
02147 
02148                 add             edi,edx
02149 
02150                 add             edi,GBitPtrHalf
02151                 mov             ax,word ptr[edi*2]
02152 
02153                 mov             word ptr[TempPix],ax
02154 
02155                 mov             ebx,eax
02156                 and             eax,REDMASK2
02157 
02158                 mov             ecx,ebx
02159                 and             ebx,GREENMASK2
02160 
02161                 mov             dword ptr[Red],eax
02162                 and             ecx,BLUEMASK2
02163 
02164                 mov             dword ptr[Green],ebx
02165                 mov             dword ptr[Blue],ecx
02166 
02167                 fimul   dword ptr[Red]                                  ; R    GL   BL
02168                 fxch    st(1)                                                   ; GL   R    BL
02169                 fimul   dword ptr[Green]                                ; G    R    BL
02170                 fxch    st(1)                                                   ; R    G    BL
02171                 fadd    qword ptr[Magic]                                ; Rk   G    BL
02172                 fxch    st(2)                                                   ; BL   G    Rk
02173                 fimul   [Blue]                                                  ; B    G    Rk
02174                 fxch    st(1)                                                   ; G    B    Rk
02175                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
02176                 fxch    st(2)                                                   ; Rk   B    Gk
02177                 fstp    qword ptr[Bucket]                               ; B    Gk
02178                 fadd    qword ptr[Magic]                                ; Bk   Gk
02179                 fxch    st(1)                                                   ; Gk   Bk
02180                 fstp    qword ptr[Bucket2]                              ; Bk
02181 
02182                 mov             edx,dword ptr[Bucket]
02183                 mov             eax,dword ptr[Bucket2]
02184 
02185                 and             edx,REDMASK2
02186                 and             eax,GREENMASK2
02187 
02188                 fstp    qword ptr[Bucket]
02189 
02190                 mov             ecx,TDest
02191                 mov             ebx,dword ptr[Bucket]
02192 
02193                 mov             esi,[z16]
02194                 and             ebx,BLUEMASK2
02195 
02196                 shr             esi,16
02197                 or              edx,eax
02198 
02199                 mov             eax,pZBufferPtr
02200                 add             TDest,2
02201 
02202                 cmp             word ptr[TempPix],01h
02203                 je              SkipSinglePixie
02204 
02205                 cmp             word ptr[eax],si
02206                 jg              SkipSinglePixie
02207 
02208                 or              edx,ebx
02209 
02210                 mov             word ptr[ecx],dx
02211 
02212 SkipSinglePixie:
02213                 mov             ebx,pLeft
02214                 mov     edx,[widTemp]
02215                 add             pZBufferPtr,2
02216                 mov     ecx,pRight
02217                 dec             edx
02218                 jz              GouraudReturnNoZ
02219                 mov             esi,edx
02220                 and             esi,1
02221                 sub             edx,esi
02222                 jz              GouraudReturnNoZ
02223 
02224 NoSinglePixie:
02225                 mov     [widTemp],edx                 ; just for a temp
02226                 shr             edx,1
02227 
02228                 ; try to keep fmul fxch pairs seperated to avoid stalling
02229                 ; calc this scanlines steps           ; FPU Stack
02230                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
02231                 fild    dword ptr [widTemp]           ; WID
02232 
02233                 mov     [widTemp],edx                 ; Color interps doubled
02234 
02235                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
02236                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
02237                 fsub    st(1), st                   ; UL   UD   WID
02238                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
02239                 fxch    st(1)                       ; UL   VR   UD   WID
02240                 fmul    [Real65536]                 ; UL16 VR   UD   WID
02241                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
02242                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
02243                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
02244                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
02245                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
02246                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
02247                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
02248                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
02249                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
02250                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
02251                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
02252                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
02253                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
02254                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
02255                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
02256                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
02257                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
02258 
02259                 //let that cook
02260 
02261                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
02262                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
02263                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
02264                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
02265                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
02266                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
02267                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
02268                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
02269                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
02270                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
02271                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
02272                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
02273                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
02274                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
02275                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
02276                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
02277                 frndint
02278                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
02279                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
02280                 frndint
02281                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
02282                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
02283                 frndint
02284                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
02285                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
02286                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
02287                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
02288                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
02289                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
02290                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
02291                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
02292                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
02293                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
02294                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
02295 
02296                 push    ebp
02297 
02298 PixieLoop:
02299                 mov             ebx,[ZStep]
02300 
02301                 add             [z16],ebx
02302                 mov             ecx,[VShift]
02303 
02304                 mov             edi,[z16]
02305 
02306                 shr             edi,16
02307                 mov             ebx,[GHMaskShifted]
02308 
02309                 mov             ebp,[GWMask]
02310                 mov             edx,dword ptr[u16]
02311 
02312                 mov             word ptr[Z32],di
02313                 mov             eax,edx
02314 
02315                 shr             edx,16
02316                 mov             edi,[v16]
02317 
02318                 add             eax,[UStep]
02319                 mov             esi,edi
02320 
02321                 shr             edi,cl
02322                 add             esi,[VStep]
02323 
02324                 and             edi,ebx
02325                 and             edx,ebp
02326 
02327                 add             edi,edx
02328                 mov             edx,eax
02329 
02330                 add             edi,GBitPtrHalf
02331                 add             eax,[UStep]
02332 
02333                 mov             [u16],eax
02334                 mov             ax,word ptr[edi*2]
02335 
02336                 mov             edi,esi
02337                 add             esi,[VStep]
02338 
02339                 shr             edx,16
02340                 mov             [v16],esi
02341 
02342                 shr             edi,cl
02343                 and             edx,ebp
02344 
02345                 mov             esi,GBitPtrHalf
02346                 and             edi,ebx
02347 
02348                 shl             eax,16
02349                 add             esi,edx
02350 
02351                 add             esi,edi
02352 
02353                 mov             ax,word ptr[esi*2]
02354 
02355                 mov             [TempPix],eax
02356 
02357                 mov             ebx,eax
02358                 and             eax,REDMASK2
02359 
02360                 mov             ecx,ebx
02361                 and             ebx,GREENMASK2
02362 
02363                 mov             dword ptr[Red],eax
02364                 and             ecx,BLUEMASK2
02365 
02366                 mov             dword ptr[Green],ebx
02367                 mov             dword ptr[Blue],ecx
02368 
02369                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
02370                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
02371                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
02372                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
02373                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
02374                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
02375                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
02376                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
02377                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
02378                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
02379                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
02380                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
02381                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
02382                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
02383                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
02384 
02385                 mov             edx,dword ptr[Bucket]
02386                 mov             eax,dword ptr[Bucket2]
02387 
02388                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
02389                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
02390                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
02391                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
02392                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
02393                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
02394 
02395                 and             edx,GREENMASK2
02396                 and             eax,REDMASK2
02397 
02398                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
02399                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
02400 
02401                 mov             edi,edx
02402                 mov             ebx,dword ptr[Bucket]
02403                 or              edi,eax
02404                 mov             ebp,TDest
02405                 and             ebx,BLUEMASK2
02406 
02407                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
02408                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
02409 
02410                 mov             si,word ptr[Z32]
02411                 add             TDest,4
02412 
02413                 mov             ecx,pZBufferPtr
02414                 or              edi,ebx
02415 
02416                 cmp             [TempPix],010001h
02417                 je              SkipPixie
02418 
02419                 rol             edi,16
02420 
02421                 cmp             word ptr[ecx],si
02422                 jg              SkipPixie
02423 
02424                 mov             dword ptr[ebp],edi
02425 SkipPixie:
02426                 add             pZBufferPtr,4
02427                 dec             [widTemp]
02428 
02429                 jnz             PixieLoop
02430 
02431                 pop             ebp
02432 
02433                 fstp    [u16]
02434                 fstp    [v16]
02435                 fstp    [u16]
02436                 fstp    [v16]
02437                 fstp    [u16]
02438                 fstp    [v16]
02439 
02440 GouraudReturnNoZ:
02441                 pop             edi
02442                 pop             esi
02443                 pop             ecx
02444                 pop             ebx
02445         }
02446 }

void DrawScanLineGouraudZBufferSolid_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 3166 of file x86span555.c.

References BlueMask, BLUEMASK2, Bucket, Bucket2, Dest, Green, GREENMASK2, GreenMask2, Magic, MiniRedMask2, or, pZBufferPtr, r, Red, RedMask2, REDMASK2, TDest, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderGouraudPoly().

03167 {
03168         TDest   =Dest;
03169         Red             =Green  =0;
03170         _asm
03171         {
03172                 push    ebx
03173                 push    ecx
03174                 push    esi
03175                 push    edi
03176 
03177                 mov             ebx,pLeft
03178                 mov     ecx,pRight
03179                 mov     eax,[ebx]EdgeAsmFPU.X
03180                 mov     edx,[ecx]EdgeAsmFPU.X
03181                 sub     edx,eax
03182                 jle             GouraudReturnNoZ
03183 
03184                 mov             esi,eax
03185                 inc             edx
03186                 shl             eax,1
03187                 add             TDest,eax
03188                 add             pZBufferPtr,eax
03189                 test    esi,1                                   //dword align left side
03190                 jz              NoSinglePixie
03191 
03192                 //odd sized spans write one pixel to dword align
03193                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
03194                 fmul    dword ptr[BlueMask]
03195                 fadd    qword ptr[Magic]                                ; Bk
03196                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
03197                 fmul    dword ptr[GreenMask2]
03198                 fadd    qword ptr[Magic]                                ; Gk   Bk
03199                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
03200                 fmul    dword ptr[MiniRedMask2]
03201                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
03202                 fxch    st(2)                                                   ; Bk   Gk   Rk
03203                 fstp    qword ptr[Bucket]                               ; Gk   Rk
03204                 fstp    qword ptr[Bucket2]                              ; Rk
03205                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z
03206                 fistp   [z16]                                                   ;
03207 
03208                 mov             esi,dword ptr[Bucket]
03209                 mov             eax,dword ptr[Bucket2]
03210 
03211                 and             esi,BLUEMASK2
03212                 and             eax,GREENMASK2
03213 
03214                 fstp    qword ptr[Bucket]
03215 
03216                 mov             ecx,TDest
03217                 mov             ebx,dword ptr[Bucket]
03218 
03219                 and             ebx,REDMASK2
03220                 or              esi,eax
03221 
03222                 mov             edi,[z16]
03223                 mov             eax,pZBufferPtr
03224 
03225                 add             TDest,2
03226                 or              esi,ebx
03227 
03228                 shr             edi,16
03229                 mov             ebx,pLeft
03230 
03231                 cmp             word ptr[eax],di
03232                 jg              SkipSinglePixie
03233 
03234                 mov             word ptr[eax],di
03235                 mov             word ptr[ecx],si
03236 
03237 SkipSinglePixie:
03238                 mov             ecx,pRight
03239                 add             pZBufferPtr,2
03240                 dec             edx
03241 
03242                 jz              GouraudReturnNoZ
03243                 mov             esi,edx
03244                 and             esi,1
03245                 sub             edx,esi
03246                 jz              GouraudReturnNoZ
03247 
03248 NoSinglePixie:
03249                 shr             edx,1
03250                 fld1
03251                 mov     [widTemp],edx                 ; just for a temp
03252                 
03253 
03254                 ; try to keep fmul fxch pairs seperated to avoid stalling
03255                 ; calc this scanlines steps                             ; FPU Stack
03256                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
03257                 fidiv   dword ptr [widTemp]                             ; WID
03258                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
03259                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
03260                 fsub    st(1),st                                                ; RL   RD   WID
03261                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
03262                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
03263                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
03264                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
03265                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
03266                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
03267                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
03268                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
03269                 frndint
03270                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
03271                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
03272                 frndint
03273                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
03274                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
03275                 frndint
03276                 fld             qword ptr[RedMask2]                             ; rm   BI   GL   RI   RL   BL   GI
03277                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
03278                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
03279                 fld             dword ptr[GreenMask2]                   ; gm   BI   GL   RI   RL   BL   GI
03280                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
03281                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
03282                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
03283                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
03284                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
03285                 fld             [ecx]EdgeAsmFPU.z                               ; rz   BI   GL   RI   RL   BL   GI
03286                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   BI   GL   RI   RL   BL   GI
03287                 fld             [ebx]EdgeAsmFPU.z                               ; lz   zd   BI   GL   RI   RL   BL   GI
03288                 fistp   [z16]                                                   ; zd   BI   GL   RI   RL   BL   GI
03289                 fistp   [ZStep]                                                 ; BI   GL   RI   RL   BL   GI
03290 
03291 PixieLoop:
03292 
03293                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
03294                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
03295                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
03296                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
03297                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
03298                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
03299                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
03300                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
03301                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
03302 
03303                 mov             ecx,dword ptr[Bucket]
03304                 mov             eax,dword ptr[Bucket2]
03305 
03306                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
03307                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
03308 
03309                 and             ecx,REDMASK2
03310                 and             eax,GREENMASK2
03311 
03312                 mov             ebx,dword ptr[Bucket]
03313                 or              ecx,eax
03314 
03315                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
03316                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
03317                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
03318                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
03319                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
03320                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
03321 
03322                 and             ebx,BLUEMASK2
03323                 mov             edi,TDest
03324 
03325                 or              ecx,ebx
03326                 add             TDest,4
03327 
03328                 mov             eax,[z16]
03329                 mov             esi,pZBufferPtr
03330 
03331                 shr             eax,16
03332                 mov             ebx,[ZStep]
03333 
03334                 cmp             word ptr[esi],ax
03335                 jg              SkipPixie
03336 
03337                 mov             word ptr[esi],ax
03338                 rol             ecx,16
03339 
03340                 add             [z16],ebx
03341                 mov             word ptr[esi+2],ax
03342 
03343                 mov             [edi],ecx
03344 SkipPixie:
03345                 add             pZBufferPtr,4
03346                 dec             edx
03347 
03348                 jnz             PixieLoop
03349 
03350 
03351                 fstp    [u16]
03352                 fstp    [v16]
03353                 fstp    [u16]
03354                 fstp    [v16]
03355                 fstp    [u16]
03356                 fstp    [v16]
03357 
03358 GouraudReturnNoZ:
03359                 pop             edi
03360                 pop             esi
03361                 pop             ecx
03362                 pop             ebx
03363         }
03364 }

void DrawScanLineGouraudZBufferTrans_Asm555X86FPU EdgeAsmFPU pLeft,
EdgeAsmFPU pRight
 

Definition at line 1726 of file x86span555.c.

References B, Blue, BLUEMASK2, Bucket, Bucket2, Dest, G, GBitPtrHalf, GHMaskShifted, Green, GREENMASK2, GWMask, Magic, or, pZBufferPtr, r, R, Real65536, Red, REDMASK2, TDest, TempPix, Two, VShift, widTemp, and EdgeAsmFPUTag::X.

Referenced by RenderMiscTexturePoly().

01727 {
01728         TDest   =Dest;
01729         Red             =Green  =0;
01730         _asm
01731         {
01732                 push    ebx
01733                 push    ecx
01734                 push    esi
01735                 push    edi
01736 
01737                 mov             ebx,pLeft
01738                 mov     ecx,pRight
01739                 mov     eax,[ebx]EdgeAsmFPU.X
01740                 mov     edx,[ecx]EdgeAsmFPU.X
01741                 sub     edx,eax
01742                 jle             GouraudReturnNoZ
01743 
01744                 mov             esi,eax
01745                 inc             edx
01746                 shl             eax,1
01747                 add             TDest,eax
01748                 add             pZBufferPtr,eax
01749                 test    esi,1           //dword align left
01750                 jz              NoSinglePixie
01751 
01752                 //odd sized spans write one pixel to dword align
01753                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
01754                 fmul    [Real65536]                                             ; UL16
01755                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
01756                 fmul    [Real65536]                                             ; VL16 UL16
01757                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
01758                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
01759                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
01760                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
01761                 fistp   [u16]                                                   ; GL   RL   VL16 BL
01762                 fxch    st(2)                                                   ; VL16 RL   GL   BL
01763                 fistp   [v16]                                                   ; RL   GL   BL
01764                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
01765                 fistp   [z16]                                                   ; RL   GL   BL
01766 
01767                 mov     [widTemp],edx
01768 
01769                 mov             ecx,[VShift]
01770                 mov             ebx,[GHMaskShifted]
01771 
01772                 mov             esi,[GWMask]
01773                 mov             edi,[v16]
01774 
01775                 mov             edx,dword ptr[u16]
01776 
01777                 shr             edi,cl
01778 
01779                 shr             edx,16
01780                 xor             eax,eax
01781 
01782                 and             edi,ebx
01783                 and             edx,esi
01784 
01785                 add             edi,edx
01786 
01787                 add             edi,GBitPtrHalf
01788                 mov             ax,word ptr[edi*2]
01789 
01790                 mov             word ptr[TempPix],ax
01791 
01792                 mov             ebx,eax
01793                 and             eax,REDMASK2
01794 
01795                 mov             ecx,ebx
01796                 and             ebx,GREENMASK2
01797 
01798                 mov             dword ptr[Red],eax
01799                 and             ecx,BLUEMASK2
01800 
01801                 mov             dword ptr[Green],ebx
01802                 mov             dword ptr[Blue],ecx
01803 
01804                 fimul   dword ptr[Red]                                  ; R    GL   BL
01805                 fxch    st(1)                                                   ; GL   R    BL
01806                 fimul   dword ptr[Green]                                ; G    R    BL
01807                 fxch    st(1)                                                   ; R    G    BL
01808                 fadd    qword ptr[Magic]                                ; Rk   G    BL
01809                 fxch    st(2)                                                   ; BL   G    Rk
01810                 fimul   [Blue]                                                  ; B    G    Rk
01811                 fxch    st(1)                                                   ; G    B    Rk
01812                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
01813                 fxch    st(2)                                                   ; Rk   B    Gk
01814                 fstp    qword ptr[Bucket]                               ; B    Gk
01815                 fadd    qword ptr[Magic]                                ; Bk   Gk
01816                 fxch    st(1)                                                   ; Gk   Bk
01817                 fstp    qword ptr[Bucket2]                              ; Bk
01818 
01819                 mov             edx,dword ptr[Bucket]
01820                 mov             eax,dword ptr[Bucket2]
01821 
01822                 and             edx,REDMASK2
01823                 and             eax,GREENMASK2
01824 
01825                 fstp    qword ptr[Bucket]
01826 
01827                 mov             ecx,TDest
01828                 mov             ebx,dword ptr[Bucket]
01829 
01830                 mov             esi,[z16]
01831                 and             ebx,BLUEMASK2
01832 
01833                 shr             esi,16
01834                 or              edx,eax
01835 
01836                 mov             eax,pZBufferPtr
01837                 add             TDest,2
01838 
01839                 cmp             word ptr[TempPix],01h
01840                 je              SkipSinglePixie
01841 
01842                 cmp             word ptr[eax],si
01843                 jg              SkipSinglePixie
01844 
01845                 or              edx,ebx
01846                 mov             word ptr[eax],si
01847 
01848                 mov             word ptr[ecx],dx
01849 
01850 SkipSinglePixie:
01851                 mov             ebx,pLeft
01852                 mov     edx,[widTemp]
01853                 add             pZBufferPtr,2
01854                 mov     ecx,pRight
01855                 dec             edx
01856                 jz              GouraudReturnNoZ
01857                 mov             esi,edx
01858                 and             esi,1
01859                 sub             edx,esi
01860                 jz              GouraudReturnNoZ
01861 
01862 NoSinglePixie:
01863                 mov     [widTemp],edx                 ; just for a temp
01864                 shr             edx,1
01865 
01866                 ; try to keep fmul fxch pairs seperated to avoid stalling
01867                 ; calc this scanlines steps           ; FPU Stack
01868                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
01869                 fild    dword ptr [widTemp]           ; WID
01870 
01871                 mov     [widTemp],edx                 ; Color interps doubled
01872 
01873                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
01874                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
01875                 fsub    st(1), st                   ; UL   UD   WID
01876                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
01877                 fxch    st(1)                       ; UL   VR   UD   WID
01878                 fmul    [Real65536]                 ; UL16 VR   UD   WID
01879                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
01880                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
01881                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
01882                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
01883                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
01884                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
01885                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
01886                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
01887                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
01888                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
01889                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
01890                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
01891                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
01892                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
01893                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
01894                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
01895                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
01896 
01897                 //let that cook
01898 
01899                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
01900                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
01901                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
01902                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
01903                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
01904                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
01905                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
01906                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
01907                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
01908                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
01909                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
01910                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
01911                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
01912                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
01913                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
01914                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
01915                 frndint
01916                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
01917                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
01918                 frndint
01919                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
01920                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
01921                 frndint
01922                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
01923                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
01924                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
01925                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
01926                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
01927                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
01928                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
01929                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
01930                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
01931                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
01932                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
01933 
01934                 push    ebp
01935 
01936 PixieLoop:
01937                 mov             ebx,[ZStep]
01938 
01939                 add             [z16],ebx
01940                 mov             ecx,[VShift]
01941 
01942                 mov             edi,[z16]
01943 
01944                 shr             edi,16
01945                 mov             ebx,[GHMaskShifted]
01946 
01947                 mov             ebp,[GWMask]
01948                 mov             edx,dword ptr[u16]
01949 
01950                 mov             word ptr[Z32],di
01951                 mov             eax,edx
01952 
01953                 shr             edx,16
01954                 mov             edi,[v16]
01955 
01956                 add             eax,[UStep]
01957                 mov             esi,edi
01958 
01959                 shr             edi,cl
01960                 add             esi,[VStep]
01961 
01962                 and             edi,ebx
01963                 and             edx,ebp
01964 
01965                 add             edi,edx
01966                 mov             edx,eax
01967 
01968                 add             edi,GBitPtrHalf
01969                 add             eax,[UStep]
01970 
01971                 mov             [u16],eax
01972                 mov             ax,word ptr[edi*2]
01973 
01974                 mov             edi,esi
01975                 add             esi,[VStep]
01976 
01977                 shr             edx,16
01978                 mov             [v16],esi
01979 
01980                 shr             edi,cl
01981                 and             edx,ebp
01982 
01983                 mov             esi,GBitPtrHalf
01984                 and             edi,ebx
01985 
01986                 shl             eax,16
01987                 add             esi,edx
01988 
01989                 add             esi,edi
01990 
01991                 mov             ax,word ptr[esi*2]
01992 
01993                 mov             [TempPix],eax
01994 
01995                 mov             ebx,eax
01996                 and             eax,REDMASK2
01997 
01998                 mov             ecx,ebx
01999                 and             ebx,GREENMASK2
02000 
02001                 mov             dword ptr[Red],eax
02002                 and             ecx,BLUEMASK2
02003 
02004                 mov             dword ptr[Green],ebx
02005                 mov             dword ptr[Blue],ecx
02006 
02007                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
02008                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
02009                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
02010                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
02011                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
02012                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
02013                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
02014                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
02015                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
02016                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
02017                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
02018                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
02019                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
02020                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
02021                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
02022 
02023                 mov             edx,dword ptr[Bucket]
02024                 mov             eax,dword ptr[Bucket2]
02025 
02026                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
02027                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
02028                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
02029                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
02030                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
02031                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
02032 
02033                 and             edx,GREENMASK2
02034                 and             eax,REDMASK2
02035 
02036                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
02037                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
02038 
02039                 mov             edi,edx
02040                 mov             ebx,dword ptr[Bucket]
02041                 or              edi,eax
02042                 mov             ebp,TDest
02043                 and             ebx,BLUEMASK2
02044 
02045                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
02046                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
02047 
02048                 mov             si,word ptr[Z32]
02049                 add             TDest,4
02050 
02051                 mov             ecx,pZBufferPtr
02052                 or              edi,ebx
02053 
02054                 cmp             [TempPix],010001h
02055                 je              SkipPixie
02056 
02057                 rol             edi,16
02058 
02059                 cmp             word ptr[ecx],si
02060                 jg              SkipPixie
02061 
02062                 mov             [ecx],si
02063                 mov             dword ptr[ebp],edi
02064                 mov             [ecx+2],si
02065 SkipPixie:
02066                 add             pZBufferPtr,4
02067                 dec             [widTemp]
02068 
02069                 jnz             PixieLoop
02070 //              mov             dword ptr[ebp],0ffffffffh
02071 
02072                 pop             ebp
02073 
02074                 fstp    [u16]
02075                 fstp    [v16]
02076                 fstp    [u16]
02077                 fstp    [v16]
02078                 fstp    [u16]
02079                 fstp    [v16]
02080 
02081 GouraudReturnNoZ:
02082                 pop             edi
02083                 pop             esi
02084                 pop             ecx
02085                 pop             ebx
02086         }
02087 }

void DrawSpan16_AsmGouraud555X86FPU int32  x1,
int32  x2,
int32  y,
int32  r1,
int32  g1,
int32  b1,
int32  r2,
int32  g2,
int32  b2
 

void DrawSpan16_AsmGouraudZBuffer555X86FPU int32  x1,
int32  x2,
int32  y,
int32  r1,
int32  g1,
int32  b1,
int32  r2,
int32  g2,
int32  b2
 

Definition at line 6731 of file x86span555.c.

References B, BB1, Blue, BlueDelta, BLUEMASK, Bucket, Bucket2, DeltaU, DeltaV, Dest, FloatTemp, FTemp0, FTemp1, FTemp2, FTemp3, FTemp4, FTemp5, G, GBitPtr16, GG1, GHMaskShifted16, GLMapMulU, GLMapMulV, Green, GreenDelta, GREENMASK2, GWMaskShifted, Magic, MaxU, MaxV, MipMagic, MipMagic2, NumASpans, or, pointer, pTex, pZBufferPtr, R, r, Red, RedDelta, REDMASK2, RemainingCount, RR1, TDest, Two, U1, UAdjust, UAdjust2, UAdjustL, UDivZ16StepX, UDivZOrigin, UDivZStepX, UDivZStepY, UFixed, V1, VAdjust, VAdjust2, VAdjustL, VDivZ16StepX, VDivZOrigin, VDivZStepX, VDivZStepY, VFixed, VShift, widTemp, y, ZBufferPrec, ZDelta, Zi, Zi16StepX, ZiOrigin, ZiStepX, ZiStepY, and ZVal.

Referenced by AddSpanDraw(), and RenderWorldPoly().

06732 {
06733         RR1     =r1;
06734         GG1     =g1;
06735         BB1     =b1;
06736         TDest   =Dest;
06737         _asm
06738         {
06739                 push    ebx
06740                 push    ecx
06741                 push    esi
06742                 push    edi
06743 
06744                 mov             eax,x1
06745                 mov             ecx,x2
06746                 sub             ecx,eax
06747                 jle             Return16
06748 
06749                 mov             edi,[GBitPtr16]
06750                 mov             pTex,edi
06751 
06752                 fild    [y]                                             ; y
06753                 mov             [widTemp],ecx
06754 
06755                 fild    [x1]                                            ; x    y
06756                 fild    [widTemp]
06757 
06758                 fld1
06759                 fdivrp  st(1),st
06760 
06761                 mov             esi,x1
06762                 mov             edi,[TDest]
06763 
06764                 shl             esi,1
06765                 mov             eax,ecx
06766 
06767                 add             edi,esi
06768                 add             pZBufferPtr,esi
06769 
06770                 mov             eax,ecx
06771                 shr             ecx,4
06772                 and             eax,15
06773                 _emit 75h
06774                 _emit 06h
06775                 dec             ecx
06776                 mov             eax,16
06777 
06778                 mov             [NumASpans],ecx
06779                 mov             [RemainingCount],eax
06780 
06781                 fild    [r2]
06782                 fisub   [r1]
06783                 fild    [g2]
06784                 fisub   [g1]
06785                 fild    [b2]
06786                 fisub   [b1]
06787                 fxch    st(2)
06788                 fmul    st,st(3)
06789                 fxch    st(1)
06790                 fmul    st,st(3)
06791                 fxch    st(2)
06792                 fmul    st,st(3)
06793                 frndint
06794                 fstp    qword ptr[BlueDelta]
06795                 frndint
06796                 fstp    qword ptr[RedDelta]
06797                 frndint
06798                 fstp    qword ptr[GreenDelta]
06799                 fstp    qword ptr[FTemp0]
06800 
06801 
06802                 //decoder won't keep up with these huge instructions
06803                 //need to find some int instructions to cram in here somewhere
06804                 fld             [UDivZStepY]                    ; UZdY x    y
06805                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
06806                 fmul    st,st(2)                                ; UZX  UZdY x    y
06807                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
06808                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
06809                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
06810                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
06811                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
06812                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
06813                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
06814                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
06815                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
06816                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
06817                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
06818                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
06819                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
06820                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
06821 
06822                 //zbuffer step action
06823                 fld             [ZiStepX]
06824                 fmul    dword ptr[ZBufferPrec]
06825                 fmul    dword ptr[Two]
06826                 fistp   dword ptr[ZDelta]
06827 
06828                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
06829                 faddp   st(1),st                                ; VZ   UZ   ZX   y
06830                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
06831                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
06832                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
06833                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
06834 
06835                 //room for two cycles of int instructions here
06836 
06837                 faddp   st(3),st                                ; UZ   VZ   Zi
06838                 fld1                                                    ; 1    UZ   VZ   Zi
06839                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
06840 
06841                 //room for 18 cycles of int instructions here
06842 
06843                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
06844                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
06845                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
06846 
06847                 //zbuffer action
06848                 fld             st
06849                 fmul    dword ptr[ZBufferPrec]
06850                 fistp   dword ptr[ZVal]
06851 
06852                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
06853                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
06854                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
06855                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
06856                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
06857                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
06858                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
06859                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
06860                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
06861 
06862                 //room for 18 cycles of int stuff here
06863 
06864                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
06865                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
06866                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
06867                 //fmul stall one cycle
06868                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
06869 
06870                 test    ecx,ecx
06871                 jz              HandleLeftoverPixels16
06872 
06873 SpanLoop16:
06874                 //need one more stack spot
06875                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
06876                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
06877                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
06878                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
06879                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
06880                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
06881                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
06882                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
06883                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
06884                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06885 
06886                 mov             ebx,dword ptr[Bucket]
06887                 mov             eax,dword ptr[Bucket2]
06888 
06889                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
06890                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
06891 
06892                 add             ebx,dword ptr[UAdjust]
06893                 add             eax,dword ptr[UAdjustL]
06894 
06895                 mov             [U1],ebx
06896                 mov             [UFixed],eax
06897 
06898                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
06899                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
06900                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
06901                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
06902                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
06903                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
06904                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06905                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
06906 
06907                 mov             ebx,dword ptr[Bucket]
06908                 mov             eax,dword ptr[Bucket2]
06909 
06910                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
06911 
06912                 add             ebx,dword ptr[VAdjust]
06913                 add             eax,dword ptr[VAdjustL]
06914 
06915                 mov             [V1],ebx
06916                 mov             [VFixed],eax
06917 
06918                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
06919                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
06920                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
06921                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
06922                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
06923                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
06924                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
06925                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
06926                 //gotta do this to get em lined back up right
06927                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
06928                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
06929 
06930                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
06931                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
06932                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
06933                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
06934                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
06935                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
06936                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
06937                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
06938                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
06939                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
06940 
06941                 // Clamp U/V
06942                 mov             ebx,[UFixed]
06943                 cmp             ebx,MaxU
06944                 jle             TryClampU016
06945                 mov             ecx,MaxU
06946                 mov             dword ptr[UFixed],ecx
06947                 jmp             NoClampU016
06948 
06949 TryClampU016:
06950                 cmp             ebx,0
06951                 jge             NoClampU016
06952                 mov             dword ptr[UFixed],0
06953 NoClampU016:
06954                 mov             eax,[VFixed]
06955                 cmp             eax,MaxV
06956                 jle             TryClampV016
06957                 mov             ecx,MaxV
06958                 mov             dword ptr[VFixed],ecx
06959                 jmp             NoClampV016
06960 
06961 TryClampV016:
06962                 cmp             eax,0
06963                 jge             NoClampV016
06964                 mov             dword ptr[VFixed],0
06965 
06966 NoClampV016:
06967 
06968                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
06969                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
06970                 fstp    [FTemp2]                                ; VZR  UL   VL
06971                 fstp    [FTemp3]                                ; UL   VL
06972                 fstp    [FTemp4]                                ; VL
06973                 fstp    [FTemp5]                                ; 
06974 
06975 
06976                 fild    [RR1]                                   ; LR
06977                 fild    [GG1]                                   ; LG   LR
06978                 fild    [BB1]                                   ; LB   LG   LR
06979                 
06980                 
06981                 mov             ebx,dword ptr[U1]
06982                 mov             eax,dword ptr[V1]
06983 
06984                 add             ebx,dword ptr[UAdjust2]
06985                 add             eax,dword ptr[VAdjust2]
06986 
06987                 mov             ecx,[VShift]
06988                 mov             dword ptr[Bucket],ebx
06989 
06990                 shl             eax,cl
06991 
06992                 push    ebp
06993 
06994                 mov             dword ptr[Bucket2],eax
06995                 mov             ebp,dword ptr[DeltaV]
06996 
06997                 and             eax,[GHMaskShifted16]
06998                 and             ebx,[GWMaskShifted]
06999 
07000                 shl             ebp,cl
07001                 add             eax,ebx
07002 
07003                 mov             edx,dword ptr[Bucket2]
07004                 mov             esi,pTex
07005 
07006                 shr             eax,16
07007                 mov             dword ptr[DeltaV],ebp
07008 
07009                 mov             ebx,dword ptr[Bucket]
07010 
07011                 mov             ax,word ptr[2*eax+esi]
07012                 add             edx,dword ptr[DeltaV]
07013 
07014                 xor             eax,0
07015                 mov             ecx,edx
07016 
07017                 add             ebx,dword ptr[DeltaU]
07018                 and             ecx,[GHMaskShifted16]
07019 
07020                 rol             eax,16
07021                 and             ebx,[GWMaskShifted]
07022 
07023                 xor             eax,0
07024                 add             ecx,ebx
07025 
07026                 add             edx,dword ptr[DeltaV]
07027                 mov             esi,pTex
07028 
07029                 shr             ecx,16
07030                 add             ebx,dword ptr[DeltaU]
07031 
07032                 mov             ax,word ptr[2*ecx+esi]
07033                 mov             ecx,edx
07034 
07035                 xor             eax,0
07036                 and             ecx,[GHMaskShifted16]
07037 
07038                 mov             esi,eax
07039                 mov             ebp,eax
07040 
07041                 and             esi,REDMASK2
07042                 and             ebp,GREENMASK2
07043 
07044                 mov             dword ptr[Red],esi
07045                 mov             dword ptr[Green],ebp
07046 
07047                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07048 
07049                 mov             ebp,eax
07050 
07051                 fmul    st,st(3)                                ; R    LB   LG   LR
07052                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07053 
07054                 and             ebp,BLUEMASK
07055                 and             ebx,[GWMaskShifted]
07056 
07057                 mov             dword ptr[Blue],ebp
07058 
07059                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07060                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07061                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07062                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07063                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07064                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07065                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07066                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07067                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07068                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07069                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07070                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07071 
07072                 mov             eax,dword ptr[Bucket]
07073                 mov             ebp,dword ptr[Bucket2]
07074 
07075                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07076                 fxch    st(1)
07077                 fadd    qword ptr[GreenDelta]
07078                 fxch    st(1)
07079                 fadd    qword ptr[BlueDelta]
07080                 fxch    st(2)
07081                 fadd    qword ptr[RedDelta]
07082                 fxch    st(2)
07083 
07084                 and             eax,REDMASK2
07085                 and             ebp,BLUEMASK
07086                 
07087                 mov             esi,dword ptr[Bucket]
07088                 or              ebp,eax
07089 
07090                 add             ecx,ebx
07091                 and             esi,GREENMASK2
07092 
07093                 shr             ecx,16
07094                 or              ebp,esi
07095 
07096                 xor             eax,0
07097                 mov             esi,pTex
07098 
07099                 rol             ebp,16
07100                 add             edx,dword ptr[DeltaV]
07101 
07102                 mov             ax,word ptr[2*ecx+esi]
07103                 mov             ecx,[ZVal]
07104 
07105                 mov             esi,[ZVal]
07106                 add             ecx,[ZDelta]
07107 
07108                 shr             esi,16
07109                 mov             [ZVal],ecx
07110 
07111                 mov             ecx,pZBufferPtr
07112 
07113                 cmp             si,word ptr[ecx+0]
07114                 jle             Skip0
07115 
07116                 mov             [edi+0],ebp
07117                 mov             word ptr[ecx+0],si
07118                 mov             word ptr[ecx+2],si
07119 
07120 Skip0:
07121                 mov             ecx,edx
07122                 mov             esi,pTex
07123 
07124                 add             ebx,dword ptr[DeltaU]
07125                 and             ecx,[GHMaskShifted16]
07126 
07127                 and             ebx,[GWMaskShifted]
07128                 xor             eax,0
07129 
07130                 add             ecx,ebx
07131 
07132                 rol             eax,16
07133                 add             edx,dword ptr[DeltaV]
07134 
07135                 shr             ecx,16
07136                 add             ebx,dword ptr[DeltaU]
07137 
07138                 mov             ax,word ptr[2*ecx+esi]
07139 
07140                 mov             ecx,edx
07141                 xor             eax,0
07142 
07143                 and             ecx,[GHMaskShifted16]
07144                 mov             esi,eax
07145 
07146                 mov             ebp,eax
07147                 and             esi,REDMASK2
07148 
07149                 and             ebp,GREENMASK2
07150                 mov             dword ptr[Red],esi
07151 
07152                 mov             dword ptr[Green],ebp
07154 
07155 
07156                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07157 
07158                 mov             ebp,eax
07159 
07160                 fmul    st,st(3)                                ; R    LB   LG   LR
07161                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07162 
07163                 and             ebp,BLUEMASK
07164                 and             ebx,[GWMaskShifted]
07165 
07166                 mov             dword ptr[Blue],ebp
07167 
07168                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07169                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07170                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07171                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07172                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07173                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07174                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07175                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07176                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07177                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07178                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07179                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07180 
07181                 mov             eax,dword ptr[Bucket]
07182                 mov             ebp,dword ptr[Bucket2]
07183 
07184                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07185                 fxch    st(1)
07186                 fadd    qword ptr[GreenDelta]
07187                 fxch    st(1)
07188                 fadd    qword ptr[BlueDelta]
07189                 fxch    st(2)
07190                 fadd    qword ptr[RedDelta]
07191                 fxch    st(2)
07192 
07193                 and             eax,REDMASK2
07194                 and             ebp,BLUEMASK
07195                 
07196                 mov             esi,dword ptr[Bucket]
07197                 or              ebp,eax
07198 
07199                 add             ecx,ebx
07200                 and             esi,GREENMASK2
07201 
07202                 shr             ecx,16
07203                 or              ebp,esi
07204 
07205                 xor             eax,0
07206                 mov             esi,pTex
07207 
07208                 rol             ebp,16
07209                 add             edx,dword ptr[DeltaV]
07210 
07211                 mov             ax,word ptr[2*ecx+esi]
07212                 mov             ecx,[ZVal]
07213 
07214                 mov             esi,[ZVal]
07215                 add             ecx,[ZDelta]
07216 
07217                 shr             esi,16
07218                 mov             [ZVal],ecx
07219 
07220                 mov             ecx,pZBufferPtr
07221 
07222                 cmp             si,word ptr[ecx+4]
07223                 jle             Skip1
07224 
07225                 mov             [edi+4],ebp
07226                 mov             word ptr[ecx+4],si
07227                 mov             word ptr[ecx+6],si
07228 
07229 Skip1:
07230                 mov             ecx,edx
07231                 mov             esi,pTex
07232 
07233                 add             ebx,dword ptr[DeltaU]
07234                 and             ecx,[GHMaskShifted16]
07235 
07236                 and             ebx,[GWMaskShifted]
07237                 xor             eax,0
07238 
07239                 add             ecx,ebx
07240 
07241                 rol             eax,16
07242                 add             edx,dword ptr[DeltaV]
07243 
07244                 shr             ecx,16
07245                 add             ebx,dword ptr[DeltaU]
07246 
07247                 mov             ax,word ptr[2*ecx+esi]
07248 
07249                 mov             ecx,edx
07250                 xor             eax,0
07251 
07252                 and             ecx,[GHMaskShifted16]
07253                 mov             esi,eax
07254 
07255                 mov             ebp,eax
07256                 and             esi,REDMASK2
07257 
07258                 and             ebp,GREENMASK2
07259                 mov             dword ptr[Red],esi
07260 
07261                 mov             dword ptr[Green],ebp
07263 
07264 
07265                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07266 
07267                 mov             ebp,eax
07268 
07269                 fmul    st,st(3)                                ; R    LB   LG   LR
07270                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07271 
07272                 and             ebp,BLUEMASK
07273                 and             ebx,[GWMaskShifted]
07274 
07275                 mov             dword ptr[Blue],ebp
07276 
07277                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07278                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07279                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07280                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07281                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07282                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07283                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07284                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07285                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07286                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07287                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07288                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07289 
07290                 mov             eax,dword ptr[Bucket]
07291                 mov             ebp,dword ptr[Bucket2]
07292 
07293                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07294                 fxch    st(1)
07295                 fadd    qword ptr[GreenDelta]
07296                 fxch    st(1)
07297                 fadd    qword ptr[BlueDelta]
07298                 fxch    st(2)
07299                 fadd    qword ptr[RedDelta]
07300                 fxch    st(2)
07301 
07302                 and             eax,REDMASK2
07303                 and             ebp,BLUEMASK
07304                 
07305                 mov             esi,dword ptr[Bucket]
07306                 or              ebp,eax
07307 
07308                 add             ecx,ebx
07309                 and             esi,GREENMASK2
07310 
07311                 shr             ecx,16
07312                 or              ebp,esi
07313 
07314                 xor             eax,0
07315                 mov             esi,pTex
07316 
07317                 rol             ebp,16
07318                 add             edx,dword ptr[DeltaV]
07319 
07320                 mov             ax,word ptr[2*ecx+esi]
07321                 mov             ecx,[ZVal]
07322 
07323                 mov             esi,[ZVal]
07324                 add             ecx,[ZDelta]
07325 
07326                 shr             esi,16
07327                 mov             [ZVal],ecx
07328 
07329                 mov             ecx,pZBufferPtr
07330 
07331                 cmp             si,word ptr[ecx+8]
07332                 jle             Skip2
07333 
07334                 mov             [edi+8],ebp
07335                 mov             word ptr[ecx+8],si
07336                 mov             word ptr[ecx+10],si
07337 
07338 Skip2:
07339                 mov             ecx,edx
07340                 mov             esi,pTex
07341 
07342                 add             ebx,dword ptr[DeltaU]
07343                 and             ecx,[GHMaskShifted16]
07344 
07345                 and             ebx,[GWMaskShifted]
07346                 xor             eax,0
07347 
07348                 add             ecx,ebx
07349 
07350                 shr             ecx,16
07351                 add             edx,dword ptr[DeltaV]
07352 
07353                 rol             eax,16
07354                 mov             ax,word ptr[2*ecx+esi]
07355 
07356                 mov             ecx,edx
07357                 xor             eax,0
07358 
07359                 and             ecx,[GHMaskShifted16]
07360                 mov             esi,eax
07361 
07362                 mov             ebp,eax
07363                 and             esi,REDMASK2
07364 
07365                 and             ebp,GREENMASK2
07366                 mov             dword ptr[Red],esi
07367 
07368                 mov             dword ptr[Green],ebp
07369                 add             ebx,dword ptr[DeltaU]
07371 
07372 
07373                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07374 
07375                 mov             ebp,eax
07376 
07377                 fmul    st,st(3)                                ; R    LB   LG   LR
07378                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07379 
07380                 and             ebp,BLUEMASK
07381                 and             ebx,[GWMaskShifted]
07382 
07383                 mov             dword ptr[Blue],ebp
07384 
07385                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07386                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07387                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07388                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07389                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07390                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07391                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07392                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07393                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07394                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07395                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07396                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07397 
07398                 mov             eax,dword ptr[Bucket]
07399                 mov             ebp,dword ptr[Bucket2]
07400 
07401                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07402                 fxch    st(1)
07403                 fadd    qword ptr[GreenDelta]
07404                 fxch    st(1)
07405                 fadd    qword ptr[BlueDelta]
07406                 fxch    st(2)
07407                 fadd    qword ptr[RedDelta]
07408                 fxch    st(2)
07409 
07410                 and             eax,REDMASK2
07411                 and             ebp,BLUEMASK
07412                 
07413                 mov             esi,dword ptr[Bucket]
07414                 or              ebp,eax
07415 
07416                 add             ecx,ebx
07417                 and             esi,GREENMASK2
07418 
07419                 shr             ecx,16
07420                 or              ebp,esi
07421 
07422                 xor             eax,0
07423                 mov             esi,pTex
07424 
07425                 rol             ebp,16
07426                 add             edx,dword ptr[DeltaV]
07427 
07428                 mov             ax,word ptr[2*ecx+esi]
07429                 mov             ecx,[ZVal]
07430 
07431                 mov             esi,[ZVal]
07432                 add             ecx,[ZDelta]
07433 
07434                 shr             esi,16
07435                 mov             [ZVal],ecx
07436 
07437                 mov             ecx,pZBufferPtr
07438 
07439                 cmp             si,word ptr[ecx+12]
07440                 jle             Skip3
07441 
07442                 mov             [edi+12],ebp
07443                 mov             word ptr[ecx+12],si
07444                 mov             word ptr[ecx+14],si
07445 
07446 Skip3:
07447                 mov             ecx,edx
07448                 mov             esi,pTex
07449 
07450                 add             ebx,dword ptr[DeltaU]
07451                 and             ecx,[GHMaskShifted16]
07452 
07453                 and             ebx,[GWMaskShifted]
07454                 xor             eax,0
07455 
07456                 add             ecx,ebx
07457 
07458                 shr             ecx,16
07459                 add             edx,dword ptr[DeltaV]
07460 
07461                 rol             eax,16
07462                 mov             ax,word ptr[2*ecx+esi]
07463 
07464                 mov             ecx,edx
07465                 xor             eax,0
07466 
07467                 and             ecx,[GHMaskShifted16]
07468                 mov             esi,eax
07469 
07470                 mov             ebp,eax
07471                 and             esi,REDMASK2
07472 
07473                 and             ebp,GREENMASK2
07474                 mov             dword ptr[Red],esi
07475 
07476                 mov             dword ptr[Green],ebp
07477                 add             ebx,dword ptr[DeltaU]
07479 
07480 
07481                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07482 
07483                 mov             ebp,eax
07484 
07485                 fmul    st,st(3)                                ; R    LB   LG   LR
07486                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07487 
07488                 and             ebp,BLUEMASK
07489                 and             ebx,[GWMaskShifted]
07490 
07491                 mov             dword ptr[Blue],ebp
07492 
07493                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07494                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07495                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07496                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07497                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07498                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07499                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07500                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07501                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07502                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07503                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07504                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07505 
07506                 mov             eax,dword ptr[Bucket]
07507                 mov             ebp,dword ptr[Bucket2]
07508 
07509                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07510                 fxch    st(1)
07511                 fadd    qword ptr[GreenDelta]
07512                 fxch    st(1)
07513                 fadd    qword ptr[BlueDelta]
07514                 fxch    st(2)
07515                 fadd    qword ptr[RedDelta]
07516                 fxch    st(2)
07517 
07518                 and             eax,REDMASK2
07519                 and             ebp,BLUEMASK
07520                 
07521                 mov             esi,dword ptr[Bucket]
07522                 or              ebp,eax
07523 
07524                 add             ecx,ebx
07525                 and             esi,GREENMASK2
07526 
07527                 shr             ecx,16
07528                 or              ebp,esi
07529 
07530                 xor             eax,0
07531                 mov             esi,pTex
07532 
07533                 rol             ebp,16
07534                 add             edx,dword ptr[DeltaV]
07535 
07536                 mov             ax,word ptr[2*ecx+esi]
07537                 mov             ecx,[ZVal]
07538 
07539                 mov             esi,[ZVal]
07540                 add             ecx,[ZDelta]
07541 
07542                 shr             esi,16
07543                 mov             [ZVal],ecx
07544 
07545                 mov             ecx,pZBufferPtr
07546 
07547                 cmp             si,word ptr[ecx+16]
07548                 jle             Skip4
07549 
07550                 mov             [edi+16],ebp
07551                 mov             word ptr[ecx+16],si
07552                 mov             word ptr[ecx+18],si
07553 
07554 Skip4:
07555                 mov             ecx,edx
07556                 mov             esi,pTex
07557 
07558                 add             ebx,dword ptr[DeltaU]
07559                 and             ecx,[GHMaskShifted16]
07560 
07561                 and             ebx,[GWMaskShifted]
07562                 xor             eax,0
07563 
07564                 add             ecx,ebx
07565 
07566                 shr             ecx,16
07567                 add             edx,dword ptr[DeltaV]
07568 
07569                 rol             eax,16
07570                 mov             ax,word ptr[2*ecx+esi]
07571 
07572                 mov             ecx,edx
07573                 xor             eax,0
07574 
07575                 and             ecx,[GHMaskShifted16]
07576                 mov             esi,eax
07577 
07578                 mov             ebp,eax
07579                 and             esi,REDMASK2
07580 
07581                 and             ebp,GREENMASK2
07582                 mov             dword ptr[Red],esi
07583 
07584                 mov             dword ptr[Green],ebp
07585                 add             ebx,dword ptr[DeltaU]
07587 
07588 
07589                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07590 
07591                 mov             ebp,eax
07592 
07593                 fmul    st,st(3)                                ; R    LB   LG   LR
07594                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07595 
07596                 and             ebp,BLUEMASK
07597                 and             ebx,[GWMaskShifted]
07598 
07599                 mov             dword ptr[Blue],ebp
07600 
07601                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07602                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07603                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07604                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07605                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07606                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07607                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07608                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07609                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07610                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07611                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07612                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07613 
07614                 mov             eax,dword ptr[Bucket]
07615                 mov             ebp,dword ptr[Bucket2]
07616 
07617                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07618                 fxch    st(1)
07619                 fadd    qword ptr[GreenDelta]
07620                 fxch    st(1)
07621                 fadd    qword ptr[BlueDelta]
07622                 fxch    st(2)
07623                 fadd    qword ptr[RedDelta]
07624                 fxch    st(2)
07625 
07626                 and             eax,REDMASK2
07627                 and             ebp,BLUEMASK
07628                 
07629                 mov             esi,dword ptr[Bucket]
07630                 or              ebp,eax
07631 
07632                 add             ecx,ebx
07633                 and             esi,GREENMASK2
07634 
07635                 shr             ecx,16
07636                 or              ebp,esi
07637 
07638                 xor             eax,0
07639                 mov             esi,pTex
07640 
07641                 rol             ebp,16
07642                 add             edx,dword ptr[DeltaV]
07643 
07644                 mov             ax,word ptr[2*ecx+esi]
07645                 mov             ecx,[ZVal]
07646 
07647                 mov             esi,[ZVal]
07648                 add             ecx,[ZDelta]
07649 
07650                 shr             esi,16
07651                 mov             [ZVal],ecx
07652 
07653                 mov             ecx,pZBufferPtr
07654 
07655                 cmp             si,word ptr[ecx+20]
07656                 jle             Skip5
07657 
07658                 mov             [edi+20],ebp
07659                 mov             word ptr[ecx+20],si
07660                 mov             word ptr[ecx+22],si
07661 
07662 Skip5:
07663                 mov             ecx,edx
07664                 mov             esi,pTex
07665 
07666                 add             ebx,dword ptr[DeltaU]
07667                 and             ecx,[GHMaskShifted16]
07668 
07669                 and             ebx,[GWMaskShifted]
07670                 xor             eax,0
07671 
07672                 add             ecx,ebx
07673 
07674                 shr             ecx,16
07675                 add             edx,dword ptr[DeltaV]
07676 
07677                 rol             eax,16
07678                 mov             ax,word ptr[2*ecx+esi]
07679 
07680                 mov             ecx,edx
07681                 xor             eax,0
07682 
07683                 and             ecx,[GHMaskShifted16]
07684                 mov             esi,eax
07685 
07686                 mov             ebp,eax
07687                 and             esi,REDMASK2
07688 
07689                 and             ebp,GREENMASK2
07690                 mov             dword ptr[Red],esi
07691 
07692                 mov             dword ptr[Green],ebp
07693                 add             ebx,dword ptr[DeltaU]
07695 
07696 
07697                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07698 
07699                 mov             ebp,eax
07700 
07701                 fmul    st,st(3)                                ; R    LB   LG   LR
07702                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07703 
07704                 and             ebp,BLUEMASK
07705                 and             ebx,[GWMaskShifted]
07706 
07707                 mov             dword ptr[Blue],ebp
07708 
07709                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07710                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07711                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07712                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07713                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07714                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07715                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07716                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07717                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07718                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07719                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07720                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07721 
07722                 mov             eax,dword ptr[Bucket]
07723                 mov             ebp,dword ptr[Bucket2]
07724 
07725                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07726                 fxch    st(1)
07727                 fadd    qword ptr[GreenDelta]
07728                 fxch    st(1)
07729                 fadd    qword ptr[BlueDelta]
07730                 fxch    st(2)
07731                 fadd    qword ptr[RedDelta]
07732                 fxch    st(2)
07733 
07734                 and             eax,REDMASK2
07735                 and             ebp,BLUEMASK
07736                 
07737                 mov             esi,dword ptr[Bucket]
07738                 or              ebp,eax
07739 
07740                 add             ecx,ebx
07741                 and             esi,GREENMASK2
07742 
07743                 shr             ecx,16
07744                 or              ebp,esi
07745 
07746                 xor             eax,0
07747                 mov             esi,pTex
07748 
07749                 rol             ebp,16
07750                 add             edx,dword ptr[DeltaV]
07751 
07752                 mov             ax,word ptr[2*ecx+esi]
07753                 mov             ecx,[ZVal]
07754 
07755                 mov             esi,[ZVal]
07756                 add             ecx,[ZDelta]
07757 
07758                 shr             esi,16
07759                 mov             [ZVal],ecx
07760 
07761                 mov             ecx,pZBufferPtr
07762 
07763                 cmp             si,word ptr[ecx+24]
07764                 jle             Skip6
07765 
07766                 mov             [edi+24],ebp
07767                 mov             word ptr[ecx+24],si
07768                 mov             word ptr[ecx+26],si
07769 
07770 Skip6:
07771                 mov             ecx,edx
07772                 mov             esi,pTex
07773 
07774                 add             ebx,dword ptr[DeltaU]
07775                 and             ecx,[GHMaskShifted16]
07776 
07777                 and             ebx,[GWMaskShifted]
07778                 xor             eax,0
07779 
07780                 add             ecx,ebx
07781 
07782                 shr             ecx,16
07783                 add             edx,dword ptr[DeltaV]
07784 
07785                 rol             eax,16
07786                 mov             ax,word ptr[2*ecx+esi]
07787 
07788                 mov             ecx,edx
07789                 xor             eax,0
07790 
07791                 and             ecx,[GHMaskShifted16]
07792                 mov             esi,eax
07793 
07794                 mov             ebp,eax
07795                 and             esi,REDMASK2
07796 
07797                 and             ebp,GREENMASK2
07798                 mov             dword ptr[Red],esi
07799 
07800                 mov             dword ptr[Green],ebp
07801                 add             ebx,dword ptr[DeltaU]
07803                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07804 
07805                 mov             ebp,eax
07806 
07807                 fmul    st,st(3)                                ; R    LB   LG   LR
07808                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07809 
07810                 and             ebp,BLUEMASK
07811                 and             ebx,[GWMaskShifted]
07812 
07813                 mov             dword ptr[Blue],ebp
07814 
07815                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07816                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07817                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07818                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07819                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07820                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07821                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07822                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07823                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07824                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07825                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07826                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07827 
07828                 mov             eax,dword ptr[Bucket]
07829                 mov             ebp,dword ptr[Bucket2]
07830 
07831                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07832                 fadd    qword ptr[BlueDelta]
07833                 fistp   dword ptr[BB1]
07834                 fadd    qword ptr[GreenDelta]
07835                 fistp   dword ptr[GG1]
07836                 fadd    qword ptr[RedDelta]
07837                 fistp   dword ptr[RR1]
07838 
07839                 and             eax,REDMASK2
07840                 and             ebp,BLUEMASK
07841                 
07842                 mov             esi,dword ptr[Bucket]
07843                 or              ebp,eax
07844 
07845                 fstp    dword ptr[Bucket]
07846                 fstp    dword ptr[Bucket2]
07847                 fstp    dword ptr[Bucket]
07848 
07849                 and             esi,GREENMASK2
07850 
07851                 fld             dword ptr[FTemp5]
07852                 fld             dword ptr[FTemp4]
07853 
07854                 or              ebp,esi
07855 
07856                 fld             dword ptr[FTemp3]
07857                 fld             dword ptr[FTemp2]
07858 
07859                 rol             ebp,16
07860 
07861                 fld             dword ptr[FTemp1]
07862                 fld             dword ptr[FTemp0]
07863 
07864                 mov             ecx,[ZVal]
07865 
07866                 mov             esi,[ZVal]
07867                 add             ecx,[ZDelta]
07868 
07869                 shr             esi,16
07870                 mov             [ZVal],ecx
07871 
07872                 mov             ecx,pZBufferPtr
07873 
07874                 cmp             si,word ptr[ecx+28]
07875                 jle             Skip7
07876 
07877                 mov             [edi+28],ebp
07878                 mov             word ptr[ecx+28],si
07879                 mov             word ptr[ecx+30],si
07880 
07881 Skip7:
07882                 pop             ebp
07883 
07884 
07885                 ; get corrected right side deltas ; st0  st1  st2  st3  st4  st5  st6  st7
07886                                                                                 ; ZR   UZR  ZRi  VZR  UL   VL
07887                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
07888                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
07889                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
07890                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
07891 
07892                 add             edi,32                                  ; move screen pointer to start of next aspan
07893                 add             [pZBufferPtr],32
07894                 dec             [NumASpans]                     ; dec num affine spans
07895                 jnz             SpanLoop16
07896 
07897 HandleLeftoverPixels16:
07898 
07899                 mov             esi,[pTex]
07900 
07901 
07902                 cmp             [RemainingCount],0
07903                 jz              FPUReturn16
07904 
07905                 //need one more stack spot
07906                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
07907                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
07908                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
07909                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
07910                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
07911                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
07912                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
07913                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
07914                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
07915                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
07916 
07917                 mov             ebx,dword ptr[Bucket]
07918                 mov             eax,dword ptr[Bucket2]
07919 
07920                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
07921                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
07922 
07923                 add             ebx,dword ptr[UAdjust]
07924                 add             eax,dword ptr[UAdjustL]
07925 
07926                 mov             [U1],ebx
07927                 mov             [UFixed],eax
07928 
07929                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
07930                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
07931                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
07932                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
07933                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
07934                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
07935                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
07936 
07937                 mov             ebx,dword ptr[Bucket]
07938                 mov             eax,dword ptr[Bucket2]
07939 
07940                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
07941 
07942                 add             ebx,dword ptr[VAdjust]
07943                 add             eax,dword ptr[VAdjustL]
07944 
07945                 mov             [V1],ebx
07946                 mov             [VFixed],eax
07947 
07948                 dec             [RemainingCount]
07949                 jz              OnePixelSpan16
07950 
07951 
07952                 //must get rid of this wasted time
07953                 fstp    [FloatTemp]                             ; inv. inv. inv. inv. UL   VL
07954                 fstp    [FloatTemp]                             ; inv. inv. inv. UL   VL
07955                 fstp    [FloatTemp]                             ; inv. inv. UL   VL
07956                 fstp    [FloatTemp]                             ; inv. UL   VL
07957                 fstp    [FloatTemp]                             ; UL   VL
07958                 fild    [y]                                             ; y    UL   VL
07959                 fild    [x2]                                    ; xr   y    UL   VL
07960 
07961                 fld             [UDivZStepY]                    ; UZdY xr   y    UL   VL
07962                 fld             [UDivZStepX]                    ; UZdX UZdY xr   y    UL   VL
07963                 fmul    st,st(2)                                ; UZX  UZdY xr   y    UL   VL
07964                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY xr   y    UL   VL
07965                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY xr   y    UL   VL
07966                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX xr   y    UL   VL
07967                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX xr   y    UL   VL
07968                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX xr   y    UL   VL
07969                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX xr   y    UL   VL
07970                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS xr   y    UL   VL
07971                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS xr   y    UL   VL
07972                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS xr   y    UL   VL
07973                 faddp   st(3),st                                ; VZdY VZX  UZ   xr   y    UL   VL
07974                 fmul    st,st(4)                                ; VZY  VZX  UZ   xr   y    UL   VL
07975                 fxch    st(1)                                   ; VZX  VZY  UZ   xr   y    UL   VL
07976                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   xr   y    UL   VL
07977                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   xr   y    UL   VL
07978                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y    UL   VL
07979                 faddp   st(1),st                                ; VZ   UZ   ZX   y    UL   VL
07980                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y    UL   VL
07981                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY   UL   VL
07982                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY   UL   VL
07983                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY   UL   VL
07984 
07985                 faddp   st(3),st                                ; UZ   VZ   Zi   UL   VL
07986                 fld1                                                    ; 1    UZ   VZ   Zi   UL   VL
07987                 fdiv    st,st(3)                                ; ZR   UZ   VZ   Zi   UL   VL
07988 
07989                 fld             st                                              ; ZR   ZR   UZ   VZ   Zi   UL   VL
07990                 fmul    st,st(3)                                ; VR   ZR   UZ   VZ   Zi   UL   VL
07991                 fxch    st(1)                                   ; ZR   VR   UZ   VZ   Zi   UL   VL
07992                 fmul    st,st(2)                                ; UR   VR   UZ   VZ   Zi   UL   VL
07993 
07994                 //lazy idiv below... should 1/int mul mul
07995 
07996                 ; calculate deltas                              ; st0  st1  st2  st3  st4  st5  st6  st7
07997                 fsubr   st(5),st                                ; UR   VR   inv. inv. inv. dU   VL
07998                 fxch    st(1)                                   ; VR   UR   inv. inv. inv. dU   VL
07999                 fsubr   st(6),st                                ; VR   UR   inv. inv. inv. dU   dV
08000                 fxch    st(6)                                   ; dV   UR   inv. inv. inv. dU   VR
08001                 fidiv   dword ptr[RemainingCount];dv   UR   inv. inv. inv. dU   VR
08002                 fadd    qword ptr[MipMagic]             ; dvk  UR   inv. inv. inv. dU   VR
08003                 fxch    st(5)                                   ; dU   UR   inv. inv. inv. dvk  VR
08004                 fidiv   dword ptr[RemainingCount];du   UR   inv. inv. inv. dvk  VR
08005                 fadd    qword ptr[MipMagic]             ; duk  UR   inv. inv. inv. dvk  VR
08006                 fxch    st(5)                                   ; dvk  UR   inv. inv. inv. duk  VR
08007                 fstp    qword ptr[DeltaV]               ; UR   inv. inv. inv. duk  VR
08008                 fxch    st(4)                                   ; duk  inv. inv. inv. UR   VR
08009                 fstp    qword ptr[DeltaU]               ; inv. inv. inv. UR   VR
08010                 fld             st(1)                                   ; inv. inv. inv. inv. UR   VR
08011                 fld             st(2)                                   ; inv. inv. inv. inv. inv. UR   VR
08012 
08013 OnePixelSpan16:
08014                 // Clamp U/V
08015                 mov             ebx,[UFixed]
08016                 cmp             ebx,MaxU
08017                 jle             TryClampU116
08018                 mov             ecx,MaxU
08019                 mov             dword ptr[UFixed],ecx
08020                 jmp             NoClampU116
08021 
08022 TryClampU116:
08023                 cmp             ebx,0
08024                 jge             NoClampU116
08025                 mov             dword ptr[UFixed],0
08026 NoClampU116:
08027                 mov             eax,[VFixed]
08028                 cmp             eax,MaxV
08029                 jle             TryClampV116
08030                 mov             ecx,MaxV
08031                 mov             dword ptr[VFixed],ecx
08032                 jmp             NoClampV116
08033 
08034 TryClampV116:
08035                 cmp             eax,0
08036                 jge             NoClampV116
08037                 mov             dword ptr[VFixed],0
08038 
08039 NoClampV116:
08040 
08041                 fstp    [FTemp0]
08042                 fstp    [FTemp1]
08043                 fstp    [FTemp2]
08044                 fstp    [FTemp3]
08045                 fstp    [FTemp4]
08046                 fstp    [FTemp5]
08047 
08048                 mov             ebx,dword ptr[U1]
08049                 mov             edx,dword ptr[V1]
08050 
08051                 fild    [RR1]                                   ; LR
08052                 fild    [GG1]                                   ; LG   LR
08053                 fild    [BB1]                                   ; LB   LG   LR
08054 
08055                 mov             ecx,[VShift]
08056                 add             edx,dword ptr[VAdjust2]
08057 
08058                 add             ebx,dword ptr[UAdjust2]
08059                 mov             eax,dword ptr[DeltaV]
08060 
08061                 shl             eax,cl
08062                 mov             esi,pTex
08063 
08064                 shl             edx,cl
08065                 mov             dword ptr[DeltaV],eax
08066 
08067                 mov             eax,[ZDelta]
08068                 mov             ecx,[ZVal]
08069 
08070                 sar             eax,1
08071                 push    ebp
08072 
08073                 mov             [ZDelta],eax
08074 
08075 LeftoverLoop16:
08076                 mov             eax,edx
08077                 and             ebx,[GWMaskShifted]
08078 
08079                 and             eax,[GHMaskShifted16]
08080 
08081                 add             eax,ebx
08082                 add             ebx,dword ptr[DeltaU]
08083 
08084                 shr             eax,16
08085                 add             edi,2
08086 
08087                 mov             ax,word ptr[2*eax+esi]
08088                 add             edx,dword ptr[DeltaV]
08089 
08090                 xor             eax,0
08091 
08092                 mov             esi,eax
08093                 mov             ebp,eax
08094 
08095                 and             esi,REDMASK2
08096                 and             ebp,GREENMASK2
08097 
08098                 mov             dword ptr[Red],esi
08099                 mov             dword ptr[Green],ebp
08100 
08101                 fild    qword ptr[Red]                  ; r    LB   LG   LR
08102 
08103                 mov             ebp,eax
08104 
08105                 fmul    st,st(3)                                ; R    LB   LG   LR
08106                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
08107 
08108                 and             ebp,BLUEMASK
08109 
08110                 mov             dword ptr[Blue],ebp
08111 
08112                 fmul    st,st(3)                                ; G    R    LB   LG   LR
08113                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
08114                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
08115                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
08116                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
08117                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
08118                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
08119                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
08120                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
08121                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
08122                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
08123                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
08124 
08125                 mov             eax,dword ptr[Bucket]
08126                 mov             ebp,dword ptr[Bucket2]
08127 
08128                 fstp    qword ptr[Bucket]               ; LB   LG   LR
08129 
08130                 and             eax,REDMASK2
08131                 and             ebp,BLUEMASK
08132                 
08133                 mov             esi,dword ptr[Bucket]
08134                 or              ebp,eax
08135 
08136                 and             esi,GREENMASK2
08137                 mov             eax,ecx
08138 
08139                 or              ebp,esi
08140 
08141                 shr             eax,16
08142                 mov             esi,pZBufferPtr
08143 
08144                 cmp             ax,word ptr[esi]
08145                 jle             SkipLeftOver
08146 
08147                 mov             word ptr[edi-2],bp
08148                 mov             word ptr[esi],ax
08149 
08150 SkipLeftOver:
08151                 add             ecx,[ZDelta]
08152                 mov             esi,pTex
08153 
08154                 add             pZBufferPtr,2
08155 
08156                 dec             [RemainingCount]
08157                 jge             LeftoverLoop16
08158 
08159                 pop             ebp
08160 
08161 
08162 FPUReturn16:
08163                 ffree   st(0)
08164                 ffree   st(1)
08165                 ffree   st(2)
08166                 ffree   st(3)
08167                 ffree   st(4)
08168                 ffree   st(5)
08169                 ffree   st(6)
08170 
08171 Return16:
08172                 pop             edi
08173                 pop             esi
08174                 pop             ecx
08175                 pop             ebx
08176         }
08177 }

void DrawSpan16_AsmGouraudZBufferTrans555X86FPU int32  x1,
int32  x2,
int32  y,
int32  r1,
int32  g1,
int32  b1,
int32  r2,
int32  g2,
int32  b2
 

Definition at line 11017 of file x86span555.c.

References B, BB1, Blue, BlueDelta, BLUEMASK, Bucket, Bucket2, CKeyTest, DeltaU, DeltaV, Dest, FloatTemp, FTemp0, FTemp1, FTemp2, FTemp3, FTemp4, FTemp5, G, GBitPtr16, GG1, GHMaskShifted16, GLMapMulU, GLMapMulV, Green, GreenDelta, GREENMASK2, GWMaskShifted, Magic, MaxU, MaxV, MipMagic, MipMagic2, NumASpans, or, pointer, pTex, pZBufferPtr, R, r, Red, RedDelta, REDMASK2, RemainingCount, RR1, TDest, Two, U1, UAdjust, UAdjust2, UAdjustL, UDivZ16StepX, UDivZOrigin, UDivZStepX, UDivZStepY, UFixed, V1, VAdjust, VAdjust2, VAdjustL, VDivZ16StepX, VDivZOrigin, VDivZStepX, VDivZStepY, VFixed, VShift, widTemp, y, ZBufferPrec, ZDelta, Zi, Zi16StepX, ZiOrigin, ZiStepX, ZiStepY, and ZVal.

Referenced by RenderWorldPoly().

11018 {
11019         RR1     =r1;
11020         GG1     =g1;
11021         BB1     =b1;
11022         TDest   =Dest;
11023         _asm
11024         {
11025                 push    ebx
11026                 push    ecx
11027                 push    esi
11028                 push    edi
11029 
11030                 mov             eax,x1
11031                 mov             ecx,x2
11032                 sub             ecx,eax
11033                 jle             Return16
11034 
11035                 mov             edi,[GBitPtr16]
11036                 mov             pTex,edi
11037 
11038                 fild    [y]                                             ; y
11039                 mov             [widTemp],ecx
11040 
11041                 fild    [x1]                                            ; x    y
11042                 fild    [widTemp]
11043 
11044                 fld1
11045                 fdivrp  st(1),st
11046 
11047                 mov             esi,x1
11048                 mov             edi,[TDest]
11049 
11050                 shl             esi,1
11051                 mov             eax,ecx
11052 
11053                 add             edi,esi
11054                 add             pZBufferPtr,esi
11055 
11056                 mov             eax,ecx
11057                 shr             ecx,4
11058                 and             eax,15
11059                 _emit 75h
11060                 _emit 06h
11061                 dec             ecx
11062                 mov             eax,16
11063 
11064                 mov             [NumASpans],ecx
11065                 mov             [RemainingCount],eax
11066 
11067                 fild    [r2]
11068                 fisub   [r1]
11069                 fild    [g2]
11070                 fisub   [g1]
11071                 fild    [b2]
11072                 fisub   [b1]
11073                 fxch    st(2)
11074                 fmul    st,st(3)
11075                 fxch    st(1)
11076                 fmul    st,st(3)
11077                 fxch    st(2)
11078                 fmul    st,st(3)
11079                 frndint
11080                 fstp    qword ptr[BlueDelta]
11081                 frndint
11082                 fstp    qword ptr[RedDelta]
11083                 frndint
11084                 fstp    qword ptr[GreenDelta]
11085                 fstp    qword ptr[FTemp0]
11086 
11087 
11088                 //decoder won't keep up with these huge instructions
11089                 //need to find some int instructions to cram in here somewhere
11090                 fld             [UDivZStepY]                    ; UZdY x    y
11091                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
11092                 fmul    st,st(2)                                ; UZX  UZdY x    y
11093                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
11094                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
11095                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
11096                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
11097                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
11098                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
11099                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
11100                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
11101                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
11102                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
11103                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
11104                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
11105                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
11106                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
11107 
11108                 //zbuffer step action
11109                 fld             [ZiStepX]
11110                 fmul    dword ptr[ZBufferPrec]
11111                 fmul    dword ptr[Two]
11112                 fistp   dword ptr[ZDelta]
11113 
11114                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
11115                 faddp   st(1),st                                ; VZ   UZ   ZX   y
11116                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
11117                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
11118                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
11119                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
11120 
11121                 //room for two cycles of int instructions here
11122 
11123                 faddp   st(3),st                                ; UZ   VZ   Zi
11124                 fld1                                                    ; 1    UZ   VZ   Zi
11125                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
11126 
11127                 //room for 18 cycles of int instructions here
11128 
11129                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
11130                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
11131                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
11132 
11133                 //zbuffer action
11134                 fld             st
11135                 fmul    dword ptr[ZBufferPrec]
11136                 fistp   dword ptr[ZVal]
11137 
11138                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
11139                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
11140                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
11141                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
11142                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
11143                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
11144                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
11145                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
11146                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
11147 
11148                 //room for 18 cycles of int stuff here
11149 
11150                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
11151                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
11152                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
11153                 //fmul stall one cycle
11154                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
11155 
11156                 test    ecx,ecx
11157                 jz              HandleLeftoverPixels16
11158 
11159 SpanLoop16:
11160                 //need one more stack spot
11161                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
11162                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
11163                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
11164                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
11165                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
11166                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
11167                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
11168                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
11169                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
11170                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
11171 
11172                 mov             ebx,dword ptr[Bucket]
11173                 mov             eax,dword ptr[Bucket2]
11174 
11175                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
11176                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
11177 
11178                 add             ebx,dword ptr[UAdjust]
11179                 add             eax,dword ptr[UAdjustL]
11180 
11181                 mov             [U1],ebx
11182                 mov             [UFixed],eax
11183 
11184                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
11185                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
11186                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
11187                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
11188                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
11189                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
11190                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
11191                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
11192 
11193                 mov             ebx,dword ptr[Bucket]
11194                 mov             eax,dword ptr[Bucket2]
11195 
11196                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
11197 
11198                 add             ebx,dword ptr[VAdjust]
11199                 add             eax,dword ptr[VAdjustL]
11200 
11201                 mov             [V1],ebx
11202                 mov             [VFixed],eax
11203 
11204                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
11205                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
11206                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
11207                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
11208                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
11209                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
11210                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
11211                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
11212                 //gotta do this to get em lined back up right
11213                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
11214                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
11215 
11216                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
11217                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
11218                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
11219                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
11220                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
11221                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
11222                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
11223                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
11224                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
11225                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
11226 
11227                 // Clamp U/V
11228                 mov             ebx,[UFixed]
11229                 cmp             ebx,MaxU
11230                 jle             TryClampU016
11231                 mov             ecx,MaxU
11232                 mov             dword ptr[UFixed],ecx
11233                 jmp             NoClampU016
11234 
11235 TryClampU016:
11236                 cmp             ebx,0
11237                 jge             NoClampU016
11238                 mov             dword ptr[UFixed],0
11239 NoClampU016:
11240                 mov             eax,[VFixed]
11241                 cmp             eax,MaxV
11242                 jle             TryClampV016
11243                 mov             ecx,MaxV
11244                 mov             dword ptr[VFixed],ecx
11245                 jmp             NoClampV016
11246 
11247 TryClampV016:
11248                 cmp             eax,0
11249                 jge             NoClampV016
11250                 mov             dword ptr[VFixed],0
11251 
11252 NoClampV016:
11253 
11254                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
11255                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
11256                 fstp    [FTemp2]                                ; VZR  UL   VL
11257                 fstp    [FTemp3]                                ; UL   VL
11258                 fstp    [FTemp4]                                ; VL
11259                 fstp    [FTemp5]                                ; 
11260 
11261 
11262                 fild    [RR1]                                   ; LR
11263                 fild    [GG1]                                   ; LG   LR
11264                 fild    [BB1]                                   ; LB   LG   LR
11265                 
11266                 
11267                 mov             ebx,dword ptr[U1]
11268                 mov             eax,dword ptr[V1]
11269 
11270                 add             ebx,dword ptr[UAdjust2]
11271                 add             eax,dword ptr[VAdjust2]
11272 
11273                 mov             ecx,[VShift]
11274                 mov             dword ptr[Bucket],ebx
11275 
11276                 shl             eax,cl
11277 
11278                 push    ebp
11279 
11280                 mov             dword ptr[Bucket2],eax
11281                 mov             ebp,dword ptr[DeltaV]
11282 
11283                 and             eax,[GHMaskShifted16]
11284                 and             ebx,[GWMaskShifted]
11285 
11286                 shl             ebp,cl
11287                 add             eax,ebx
11288 
11289                 mov             edx,dword ptr[Bucket2]
11290                 mov             esi,pTex
11291 
11292                 shr             eax,16
11293                 mov             dword ptr[DeltaV],ebp
11294 
11295                 mov             ebx,dword ptr[Bucket]
11296 
11297                 mov             ax,word ptr[2*eax+esi]
11298                 add             edx,dword ptr[DeltaV]
11299 
11300                 xor             eax,0
11301                 mov             ecx,edx
11302 
11303                 mov             ebp,eax
11304                 add             ebx,dword ptr[DeltaU]
11305 
11306                 shr             ebp,1
11307                 and             ecx,[GHMaskShifted16]
11308 
11309                 rol             eax,16
11310                 mov             [CKeyTest],ebp
11311 
11312                 and             ebx,[GWMaskShifted]
11313 
11314                 xor             eax,0
11315                 add             ecx,ebx
11316 
11317                 add             edx,dword ptr[DeltaV]
11318                 mov             esi,pTex
11319 
11320                 shr             ecx,16
11321                 add             ebx,dword ptr[DeltaU]
11322 
11323                 mov             ax,word ptr[2*ecx+esi]
11324                 mov             ecx,edx
11325 
11326                 xor             eax,0
11327                 and             ecx,[GHMaskShifted16]
11328 
11329                 mov             esi,eax
11330                 mov             ebp,eax
11331 
11332                 and             esi,REDMASK2
11333                 and             ebp,GREENMASK2
11334 
11335                 mov             dword ptr[Red],esi
11336                 mov             dword ptr[Green],ebp
11337 
11338                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11339 
11340                 mov             ebp,eax
11341                 shr             eax,1
11342 
11343                 fmul    st,st(3)                                ; R    LB   LG   LR
11344                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11345 
11346                 and             [CKeyTest],eax
11347 
11348                 and             ebp,BLUEMASK
11349                 and             ebx,[GWMaskShifted]
11350 
11351                 mov             dword ptr[Blue],ebp
11352 
11353                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11354                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11355                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11356                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11357                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11358                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11359                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11360                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11361                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11362                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11363                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11364                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11365 
11366                 mov             eax,dword ptr[Bucket]
11367                 mov             ebp,dword ptr[Bucket2]
11368 
11369                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11370                 fxch    st(1)
11371                 fadd    qword ptr[GreenDelta]
11372                 fxch    st(1)
11373                 fadd    qword ptr[BlueDelta]
11374                 fxch    st(2)
11375                 fadd    qword ptr[RedDelta]
11376                 fxch    st(2)
11377 
11378                 and             eax,REDMASK2
11379                 and             ebp,BLUEMASK
11380                 
11381                 mov             esi,dword ptr[Bucket]
11382                 or              ebp,eax
11383 
11384                 add             ecx,ebx
11385                 and             esi,GREENMASK2
11386 
11387                 shr             ecx,16
11388                 or              ebp,esi
11389 
11390                 xor             eax,0
11391                 mov             esi,pTex
11392 
11393                 rol             ebp,16
11394                 add             edx,dword ptr[DeltaV]
11395 
11396                 mov             ax,word ptr[2*ecx+esi]
11397                 mov             ecx,[ZVal]
11398 
11399                 mov             esi,[ZVal]
11400                 add             ecx,[ZDelta]
11401 
11402                 shr             esi,16
11403                 mov             [ZVal],ecx
11404 
11405                 dec             [CKeyTest]
11406                 jl              Skip0
11407 
11408                 mov             ecx,pZBufferPtr
11409 
11410                 cmp             si,word ptr[ecx+0]
11411                 jle             Skip0
11412 
11413                 mov             [edi+0],ebp
11414                 mov             word ptr[ecx+0],si
11415                 mov             word ptr[ecx+2],si
11416 
11417 Skip0:
11418                 mov             ecx,edx
11419 
11420                 mov             esi,pTex
11421                 xor             eax,0
11422 
11423                 add             ebx,dword ptr[DeltaU]
11424                 and             ecx,[GHMaskShifted16]
11425 
11426                 mov             ebp,eax
11427                 and             ebx,[GWMaskShifted]
11428 
11429                 shr             ebp,1
11430                 add             ecx,ebx
11431 
11432                 rol             eax,16
11433                 add             edx,dword ptr[DeltaV]
11434 
11435                 shr             ecx,16
11436                 add             ebx,dword ptr[DeltaU]
11437 
11438                 mov             ax,word ptr[2*ecx+esi]
11439                 mov             [CKeyTest],ebp
11440 
11441                 mov             ecx,edx
11442                 xor             eax,0
11443 
11444                 and             ecx,[GHMaskShifted16]
11445                 mov             esi,eax
11446 
11447                 mov             ebp,eax
11448                 and             esi,REDMASK2
11449 
11450                 and             ebp,GREENMASK2
11451                 mov             dword ptr[Red],esi
11452 
11453                 mov             dword ptr[Green],ebp
11455 
11456 
11457                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11458 
11459                 mov             ebp,eax
11460                 shr             eax,1
11461 
11462                 fmul    st,st(3)                                ; R    LB   LG   LR
11463                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11464 
11465                 and             [CKeyTest],eax
11466 
11467                 and             ebp,BLUEMASK
11468                 and             ebx,[GWMaskShifted]
11469 
11470                 mov             dword ptr[Blue],ebp
11471 
11472                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11473                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11474                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11475                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11476                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11477                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11478                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11479                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11480                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11481                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11482                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11483                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11484 
11485                 mov             eax,dword ptr[Bucket]
11486                 mov             ebp,dword ptr[Bucket2]
11487 
11488                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11489                 fxch    st(1)
11490                 fadd    qword ptr[GreenDelta]
11491                 fxch    st(1)
11492                 fadd    qword ptr[BlueDelta]
11493                 fxch    st(2)
11494                 fadd    qword ptr[RedDelta]
11495                 fxch    st(2)
11496 
11497                 and             eax,REDMASK2
11498                 and             ebp,BLUEMASK
11499                 
11500                 mov             esi,dword ptr[Bucket]
11501                 or              ebp,eax
11502 
11503                 add             ecx,ebx
11504                 and             esi,GREENMASK2
11505 
11506                 shr             ecx,16
11507                 or              ebp,esi
11508 
11509                 xor             eax,0
11510                 mov             esi,pTex
11511 
11512                 rol             ebp,16
11513                 add             edx,dword ptr[DeltaV]
11514 
11515                 mov             ax,word ptr[2*ecx+esi]
11516                 mov             ecx,[ZVal]
11517 
11518                 mov             esi,[ZVal]
11519                 add             ecx,[ZDelta]
11520 
11521                 shr             esi,16
11522                 mov             [ZVal],ecx
11523 
11524                 dec             [CKeyTest]
11525                 jl              Skip1
11526 
11527                 mov             ecx,pZBufferPtr
11528 
11529                 cmp             si,word ptr[ecx+4]
11530                 jle             Skip1
11531 
11532                 mov             [edi+4],ebp
11533                 mov             word ptr[ecx+4],si
11534                 mov             word ptr[ecx+6],si
11535 
11536 Skip1:
11537                 mov             ecx,edx
11538 
11539                 mov             esi,pTex
11540                 xor             eax,0
11541 
11542                 add             ebx,dword ptr[DeltaU]
11543                 and             ecx,[GHMaskShifted16]
11544 
11545                 mov             ebp,eax
11546                 and             ebx,[GWMaskShifted]
11547 
11548                 shr             ebp,1
11549                 add             ecx,ebx
11550 
11551                 rol             eax,16
11552                 add             edx,dword ptr[DeltaV]
11553 
11554                 shr             ecx,16
11555                 add             ebx,dword ptr[DeltaU]
11556 
11557                 mov             ax,word ptr[2*ecx+esi]
11558                 mov             [CKeyTest],ebp
11559 
11560                 mov             ecx,edx
11561                 xor             eax,0
11562 
11563                 and             ecx,[GHMaskShifted16]
11564                 mov             esi,eax
11565 
11566                 mov             ebp,eax
11567                 and             esi,REDMASK2
11568 
11569                 and             ebp,GREENMASK2
11570                 mov             dword ptr[Red],esi
11571 
11572                 mov             dword ptr[Green],ebp
11574 
11575 
11576                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11577 
11578                 mov             ebp,eax
11579                 shr             eax,1
11580 
11581                 fmul    st,st(3)                                ; R    LB   LG   LR
11582                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11583 
11584                 and             [CKeyTest],eax
11585 
11586                 and             ebp,BLUEMASK
11587                 and             ebx,[GWMaskShifted]
11588 
11589                 mov             dword ptr[Blue],ebp
11590 
11591                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11592                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11593                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11594                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11595                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11596                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11597                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11598                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11599                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11600                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11601                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11602                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11603 
11604                 mov             eax,dword ptr[Bucket]
11605                 mov             ebp,dword ptr[Bucket2]
11606 
11607                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11608                 fxch    st(1)
11609                 fadd    qword ptr[GreenDelta]
11610                 fxch    st(1)
11611                 fadd    qword ptr[BlueDelta]
11612                 fxch    st(2)
11613                 fadd    qword ptr[RedDelta]
11614                 fxch    st(2)
11615 
11616                 and             eax,REDMASK2
11617                 and             ebp,BLUEMASK
11618                 
11619                 mov             esi,dword ptr[Bucket]
11620                 or              ebp,eax
11621 
11622                 add             ecx,ebx
11623                 and             esi,GREENMASK2
11624 
11625                 shr             ecx,16
11626                 or              ebp,esi
11627 
11628                 xor             eax,0
11629                 mov             esi,pTex
11630 
11631                 rol             ebp,16
11632                 add             edx,dword ptr[DeltaV]
11633 
11634                 mov             ax,word ptr[2*ecx+esi]
11635                 mov             ecx,[ZVal]
11636 
11637                 mov             esi,[ZVal]
11638                 add             ecx,[ZDelta]
11639 
11640                 shr             esi,16
11641                 mov             [ZVal],ecx
11642 
11643                 dec             [CKeyTest]
11644                 jl              Skip2
11645 
11646                 mov             ecx,pZBufferPtr
11647 
11648                 cmp             si,word ptr[ecx+8]
11649                 jle             Skip2
11650 
11651                 mov             [edi+8],ebp
11652                 mov             word ptr[ecx+8],si
11653                 mov             word ptr[ecx+10],si
11654 
11655 Skip2:
11656                 mov             ecx,edx
11657 
11658                 mov             esi,pTex
11659                 xor             eax,0
11660 
11661                 add             ebx,dword ptr[DeltaU]
11662                 and             ecx,[GHMaskShifted16]
11663 
11664                 mov             ebp,eax
11665                 and             ebx,[GWMaskShifted]
11666 
11667                 shr             ebp,1
11668                 add             ecx,ebx
11669 
11670                 rol             eax,16
11671                 add             edx,dword ptr[DeltaV]
11672 
11673                 shr             ecx,16
11674                 add             ebx,dword ptr[DeltaU]
11675 
11676                 mov             ax,word ptr[2*ecx+esi]
11677                 mov             [CKeyTest],ebp
11678 
11679                 mov             ecx,edx
11680                 xor             eax,0
11681 
11682                 and             ecx,[GHMaskShifted16]
11683                 mov             esi,eax
11684 
11685                 mov             ebp,eax
11686                 and             esi,REDMASK2
11687 
11688                 and             ebp,GREENMASK2
11689                 mov             dword ptr[Red],esi
11690 
11691                 mov             dword ptr[Green],ebp
11692                 add             ebx,dword ptr[DeltaU]
11694 
11695 
11696                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11697 
11698                 mov             ebp,eax
11699                 shr             eax,1
11700 
11701                 fmul    st,st(3)                                ; R    LB   LG   LR
11702                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11703 
11704                 and             [CKeyTest],eax
11705 
11706                 and             ebp,BLUEMASK
11707                 and             ebx,[GWMaskShifted]
11708 
11709                 mov             dword ptr[Blue],ebp
11710 
11711                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11712                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11713                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11714                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11715                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11716                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11717                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11718                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11719                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11720                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11721                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11722                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11723 
11724                 mov             eax,dword ptr[Bucket]
11725                 mov             ebp,dword ptr[Bucket2]
11726 
11727                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11728                 fxch    st(1)
11729                 fadd    qword ptr[GreenDelta]
11730                 fxch    st(1)
11731                 fadd    qword ptr[BlueDelta]
11732                 fxch    st(2)
11733                 fadd    qword ptr[RedDelta]
11734                 fxch    st(2)
11735 
11736                 and             eax,REDMASK2
11737                 and             ebp,BLUEMASK
11738                 
11739                 mov             esi,dword ptr[Bucket]
11740                 or              ebp,eax
11741 
11742                 add             ecx,ebx
11743                 and             esi,GREENMASK2
11744 
11745                 shr             ecx,16
11746                 or              ebp,esi
11747 
11748                 xor             eax,0
11749                 mov             esi,pTex
11750 
11751                 rol             ebp,16
11752                 add             edx,dword ptr[DeltaV]
11753 
11754                 mov             ax,word ptr[2*ecx+esi]
11755                 mov             ecx,[ZVal]
11756 
11757                 mov             esi,[ZVal]
11758                 add             ecx,[ZDelta]
11759 
11760                 shr             esi,16
11761                 mov             [ZVal],ecx
11762 
11763                 dec             [CKeyTest]
11764                 jl              Skip3
11765 
11766                 mov             ecx,pZBufferPtr
11767 
11768                 cmp             si,word ptr[ecx+12]
11769                 jle             Skip3
11770 
11771                 mov             [edi+12],ebp
11772                 mov             word ptr[ecx+12],si
11773                 mov             word ptr[ecx+14],si
11774 
11775 Skip3:
11776                 mov             ecx,edx
11777 
11778                 mov             esi,pTex
11779                 xor             eax,0
11780 
11781                 add             ebx,dword ptr[DeltaU]
11782                 and             ecx,[GHMaskShifted16]
11783 
11784                 mov             ebp,eax
11785                 and             ebx,[GWMaskShifted]
11786 
11787                 shr             ebp,1
11788                 add             ecx,ebx
11789 
11790                 rol             eax,16
11791                 add             edx,dword ptr[DeltaV]
11792 
11793                 shr             ecx,16
11794                 add             ebx,dword ptr[DeltaU]
11795 
11796                 mov             ax,word ptr[2*ecx+esi]
11797                 mov             [CKeyTest],ebp
11798 
11799                 mov             ecx,edx
11800                 xor             eax,0
11801 
11802                 and             ecx,[GHMaskShifted16]
11803                 mov             esi,eax
11804 
11805                 mov             ebp,eax
11806                 and             esi,REDMASK2
11807 
11808                 and             ebp,GREENMASK2
11809                 mov             dword ptr[Red],esi
11810 
11811                 mov             dword ptr[Green],ebp
11812                 add             ebx,dword ptr[DeltaU]
11814 
11815 
11816                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11817 
11818                 mov             ebp,eax
11819                 shr             eax,1
11820 
11821                 fmul    st,st(3)                                ; R    LB   LG   LR
11822                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11823 
11824                 and             [CKeyTest],eax
11825 
11826                 and             ebp,BLUEMASK
11827                 and             ebx,[GWMaskShifted]
11828 
11829                 mov             dword ptr[Blue],ebp
11830 
11831                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11832                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11833                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11834                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11835                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11836                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11837                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11838                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11839                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11840                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11841                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11842                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11843 
11844                 mov             eax,dword ptr[Bucket]
11845                 mov             ebp,dword ptr[Bucket2]
11846 
11847                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11848                 fxch    st(1)
11849                 fadd    qword ptr[GreenDelta]
11850                 fxch    st(1)
11851                 fadd    qword ptr[BlueDelta]
11852                 fxch    st(2)
11853                 fadd    qword ptr[RedDelta]
11854                 fxch    st(2)
11855 
11856                 and             eax,REDMASK2
11857                 and             ebp,BLUEMASK
11858                 
11859                 mov             esi,dword ptr[Bucket]
11860                 or              ebp,eax
11861 
11862                 add             ecx,ebx
11863                 and             esi,GREENMASK2
11864 
11865                 shr             ecx,16
11866                 or              ebp,esi
11867 
11868                 xor             eax,0
11869                 mov             esi,pTex
11870 
11871                 rol             ebp,16
11872                 add             edx,dword ptr[DeltaV]
11873 
11874                 mov             ax,word ptr[2*ecx+esi]
11875                 mov             ecx,[ZVal]
11876 
11877                 mov             esi,[ZVal]
11878                 add             ecx,[ZDelta]
11879 
11880                 shr             esi,16
11881                 mov             [ZVal],ecx
11882 
11883                 dec             [CKeyTest]
11884                 jl              Skip4
11885 
11886                 mov             ecx,pZBufferPtr
11887 
11888                 cmp             si,word ptr[ecx+16]
11889                 jle             Skip4
11890 
11891                 mov             [edi+16],ebp
11892                 mov             word ptr[ecx+16],si
11893                 mov             word ptr[ecx+18],si
11894 
11895 Skip4:
11896                 mov             ecx,edx
11897 
11898                 mov             esi,pTex
11899                 xor             eax,0
11900 
11901                 add             ebx,dword ptr[DeltaU]
11902                 and             ecx,[GHMaskShifted16]
11903 
11904                 mov             ebp,eax
11905                 and             ebx,[GWMaskShifted]
11906 
11907                 shr             ebp,1
11908                 add             ecx,ebx
11909 
11910                 rol             eax,16
11911                 add             edx,dword ptr[DeltaV]
11912 
11913                 shr             ecx,16
11914                 add             ebx,dword ptr[DeltaU]
11915 
11916                 mov             ax,word ptr[2*ecx+esi]
11917                 mov             [CKeyTest],ebp
11918 
11919                 mov             ecx,edx
11920                 xor             eax,0
11921 
11922                 and             ecx,[GHMaskShifted16]
11923                 mov             esi,eax
11924 
11925                 mov             ebp,eax
11926                 and             esi,REDMASK2
11927 
11928                 and             ebp,GREENMASK2
11929                 mov             dword ptr[Red],esi
11930 
11931                 mov             dword ptr[Green],ebp
11932                 add             ebx,dword ptr[DeltaU]
11934 
11935 
11936                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11937 
11938                 mov             ebp,eax
11939                 shr             eax,1
11940 
11941                 fmul    st,st(3)                                ; R    LB   LG   LR
11942                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11943 
11944                 and             [CKeyTest],eax
11945 
11946                 and             ebp,BLUEMASK
11947                 and             ebx,[GWMaskShifted]
11948 
11949                 mov             dword ptr[Blue],ebp
11950 
11951                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11952                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11953                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11954                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11955                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11956                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11957                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11958                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11959                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11960                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11961                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11962                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11963 
11964                 mov             eax,dword ptr[Bucket]
11965                 mov             ebp,dword ptr[Bucket2]
11966 
11967                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11968                 fxch    st(1)
11969                 fadd    qword ptr[GreenDelta]
11970                 fxch    st(1)
11971                 fadd    qword ptr[BlueDelta]
11972                 fxch    st(2)
11973                 fadd    qword ptr[RedDelta]
11974                 fxch    st(2)
11975 
11976                 and             eax,REDMASK2
11977                 and             ebp,BLUEMASK
11978                 
11979                 mov             esi,dword ptr[Bucket]
11980                 or              ebp,eax
11981 
11982                 add             ecx,ebx
11983                 and             esi,GREENMASK2
11984 
11985                 shr             ecx,16
11986                 or              ebp,esi
11987 
11988                 xor             eax,0
11989                 mov             esi,pTex
11990 
11991                 rol             ebp,16
11992                 add             edx,dword ptr[DeltaV]
11993 
11994                 mov             ax,word ptr[2*ecx+esi]
11995                 mov             ecx,[ZVal]
11996 
11997                 mov             esi,[ZVal]
11998                 add             ecx,[ZDelta]
11999 
12000                 shr             esi,16
12001                 mov             [ZVal],ecx
12002 
12003                 dec             [CKeyTest]
12004                 jl              Skip5
12005 
12006                 mov             ecx,pZBufferPtr
12007 
12008                 cmp             si,word ptr[ecx+20]
12009                 jle             Skip5
12010 
12011                 mov             [edi+20],ebp
12012                 mov             word ptr[ecx+20],si
12013                 mov             word ptr[ecx+22],si
12014 
12015 Skip5:
12016                 mov             ecx,edx
12017 
12018                 mov             esi,pTex
12019                 xor             eax,0
12020 
12021                 add             ebx,dword ptr[DeltaU]
12022                 and             ecx,[GHMaskShifted16]
12023 
12024                 mov             ebp,eax
12025                 and             ebx,[GWMaskShifted]
12026 
12027                 shr             ebp,1
12028                 add             ecx,ebx
12029 
12030                 rol             eax,16
12031                 add             edx,dword ptr[DeltaV]
12032 
12033                 shr             ecx,16
12034                 add             ebx,dword ptr[DeltaU]
12035 
12036                 mov             ax,word ptr[2*ecx+esi]
12037                 mov             [CKeyTest],ebp
12038 
12039                 mov             ecx,edx
12040                 xor             eax,0
12041 
12042                 and             ecx,[GHMaskShifted16]
12043                 mov             esi,eax
12044 
12045                 mov             ebp,eax
12046                 and             esi,REDMASK2
12047 
12048                 and             ebp,GREENMASK2
12049                 mov             dword ptr[Red],esi
12050 
12051                 mov             dword ptr[Green],ebp
12052                 add             ebx,dword ptr[DeltaU]
12054 
12055 
12056                 fild    qword ptr[Red]                  ; r    LB   LG   LR
12057 
12058                 mov             ebp,eax
12059                 shr             eax,1
12060 
12061                 fmul    st,st(3)                                ; R    LB   LG   LR
12062                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
12063 
12064                 and             [CKeyTest],eax
12065 
12066                 and             ebp,BLUEMASK
12067                 and             ebx,[GWMaskShifted]
12068 
12069                 mov             dword ptr[Blue],ebp
12070 
12071                 fmul    st,st(3)                                ; G    R    LB   LG   LR
12072                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
12073                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
12074                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
12075                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
12076                 fxch    st(1)                                   ; G    Rk   B