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

x86span565.c

Go to the documentation of this file.
00001 /****************************************************************************************/
00002 /*  x86span565.c                                                                        */
00003 /*                                                                                      */
00004 /*  Author:       Ken Baird                                                             */
00005 /*  Description:  565 assembly calls for tons of renderstates                           */
00006 /*                                                                                      */
00007 /*  The contents of this file are subject to the Genesis3D Public License               */
00008 /*  Version 1.01 (the "License"); you may not use this file except in                   */
00009 /*  compliance with the License. You may obtain a copy of the License at                */
00010 /*  http://www.genesis3d.com                                                            */
00011 /*                                                                                      */
00012 /*  Software distributed under the License is distributed on an "AS IS"                 */
00013 /*  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See                */
00014 /*  the License for the specific language governing rights and limitations              */
00015 /*  under the License.                                                                  */
00016 /*                                                                                      */
00017 /*  The Original Code is Genesis3D, released March 25, 1999.                            */
00018 /*Genesis3D Version 1.1 released November 15, 1999                            */
00019 /*  Copyright (C) 1999 WildTangent, Inc. All Rights Reserved           */
00020 /*                                                                                      */
00021 /****************************************************************************************/
00022 
00023 /*
00024 Code fragments from Chris Hecker's texture mapping articles used with
00025 permission.  http://www.d6.com/users/checker 
00026 */
00027 
00028 /*
00029 Alot of this code uses some really bizzare fpu tricks to do two
00030 pixel blends at a time.  I never got time to properly dword align
00031 the perspective correct mappers.  This would get us gains I think.
00032 Unrolling is evil in here.  This stuff shouldn't be unrolled
00033 */
00034 #include        "windows.h"             //I really didn't want to do this
00035 #include        "softdrv.h"
00036 #include        "basetype.h"
00037 #include        "drawspan.h"
00038 #include        "render.h"
00039 
00040 typedef struct EdgeAsmFPUTag
00041 {
00042         int             X, y, Height;
00043         geFloat x, u, v, z, r, g, b;
00044         geFloat xstep, ustep, vstep, zstep;
00045         geFloat rstep, gstep, bstep;
00046         uint32  R, G, B;
00047 } EdgeAsmFPU;
00048 
00049 
00050 #pragma warning (disable:4410)  //illegal size for operand
00051 
00052 void    DrawScanLineGouraudNoZ_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
00053 {
00054         TDest   =Dest;
00055         Red             =Green  =0;
00056         _asm
00057         {
00058                 push    ebx
00059                 push    ecx
00060                 push    esi
00061                 push    edi
00062 
00063                 mov             ebx,pLeft
00064                 mov     ecx,pRight
00065                 mov     eax,[ebx]EdgeAsmFPU.X
00066                 mov     edx,[ecx]EdgeAsmFPU.X
00067                 sub     edx,eax
00068                 jle             GouraudReturnNoZ
00069 
00070                 mov             esi,eax
00071                 inc             edx
00072                 shl             eax,1
00073                 add             TDest,eax
00074                 test    esi,1                                   //dword align left side
00075                 jz              NoSinglePixie
00076 
00077                 //odd sized spans write one pixel to dword align
00078                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
00079                 fmul    [Real65536]                                             ; UL16
00080                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
00081                 fmul    [Real65536]                                             ; VL16 UL16
00082                 fld             dword ptr [ebx]EdgeAsmFPU.r             ; RL   VL16 UL16
00083                 fld             dword ptr [ebx]EdgeAsmFPU.g             ; GL   RL   VL16 UL16
00084                 fld             dword ptr [ebx]EdgeAsmFPU.b             ; BL   GL   RL   VL16 UL16
00085                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
00086                 fistp   [u16]                                                   ; GL   RL   VL16 BL
00087                 fxch    st(2)                                                   ; VL16 RL   GL   BL
00088                 fistp   [v16]                                                   ; RL   GL   BL
00089 
00090                 mov     [widTemp],edx
00091 
00092                 mov             ecx,[VShift]
00093                 mov             ebx,[GHMaskShifted]
00094 
00095                 mov             esi,[GWMask]
00096                 mov             edi,[v16]
00097 
00098                 mov             edx,dword ptr[u16]
00099 
00100                 shr             edi,cl
00101 
00102                 shr             edx,16
00103                 xor             eax,eax
00104 
00105                 and             edi,ebx
00106                 and             edx,esi
00107 
00108                 add             edi,edx
00109 
00110                 add             edi,GBitPtrHalf
00111                 mov             ax,word ptr[edi*2]
00112 
00113                 mov             ebx,eax
00114                 and             eax,REDMASK
00115 
00116                 mov             ecx,ebx
00117                 and             ebx,GREENMASK
00118 
00119                 mov             dword ptr[Red],eax
00120                 and             ecx,BLUEMASK
00121 
00122                 mov             dword ptr[Green],ebx
00123                 mov             dword ptr[Blue],ecx
00124 
00125                 fimul   dword ptr[Red]                                  ; R    GL   BL
00126                 fxch    st(1)                                                   ; GL   R    BL
00127                 fimul   dword ptr[Green]                                ; G    R    BL
00128                 fxch    st(1)                                                   ; R    G    BL
00129                 fadd    qword ptr[Magic]                                ; Rk   G    BL
00130                 fxch    st(2)                                                   ; BL   G    Rk
00131                 fimul   [Blue]                                                  ; B    G    Rk
00132                 fxch    st(1)                                                   ; G    B    Rk
00133                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
00134                 fxch    st(2)                                                   ; Rk   B    Gk
00135                 fstp    qword ptr[Bucket]                               ; B    Gk
00136                 fadd    qword ptr[Magic]                                ; Bk   Gk
00137                 fxch    st(1)                                                   ; Gk   Bk
00138                 fstp    qword ptr[Bucket2]                              ; Bk
00139 
00140                 mov             edx,dword ptr[Bucket]
00141                 mov             eax,dword ptr[Bucket2]
00142 
00143                 and             edx,REDMASK
00144                 and             eax,GREENMASK
00145 
00146                 fstp    qword ptr[Bucket]
00147 
00148                 mov             ecx,TDest
00149                 mov             ebx,dword ptr[Bucket]
00150 
00151                 and             ebx,BLUEMASK
00152                 or              edx,eax
00153 
00154                 add             TDest,2
00155                 or              edx,ebx
00156 
00157                 mov             ebx,pLeft
00158                 mov             word ptr[ecx],dx
00159                 mov     edx,[widTemp]
00160                 mov     ecx,pRight
00161                 dec             edx
00162                 jz              GouraudReturnNoZ
00163                 mov             esi,edx
00164                 and             esi,1
00165                 sub             edx,esi
00166                 jz              GouraudReturnNoZ
00167 
00168 NoSinglePixie:
00169                 mov     [widTemp],edx                 ; just for a temp
00170                 shr             edx,1
00171 
00172                 ; try to keep fmul fxch pairs seperated to avoid stalling
00173                 ; calc this scanlines steps           ; FPU Stack
00174                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
00175                 fild    dword ptr [widTemp]           ; WID
00176 
00177                 mov     [widTemp],edx                 ; Color interps doubled
00178 
00179                 fld     dword ptr [ecx]EdgeAsmFPU.u             ; UR   WID
00180                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL   UR   WID
00181                 fsub    st(1), st                                               ; UL   UD   WID
00182                 fld     dword ptr [ecx]EdgeAsmFPU.v             ; VR   UL   UD   WID
00183                 fxch    st(1)                                                   ; UL   VR   UD   WID
00184                 fmul    [Real65536]                                             ; UL16 VR   UD   WID
00185                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16 VR   UD   WID
00186                 fsub    st(2), st                                               ; VL   UL16 VD   UD   WID
00187                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   VL   UL16 VD   UD   WID
00188                 fxch    st(3)                                                   ; VD   VL   UL16 RR   UD   WID
00189                 fmul    [Real65536]                                             ; VD16 VL   UL16 RR   UD   WID
00190                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VD16 VL   UL16 RR   UD   WID
00191                 fsub    st(4),st                                                ; RL   VD16 VL   UL16 RD   UD   WID
00192                 fxch    st(5)                                                   ; UD   VD16 VL   UL16 RD   RL   WID
00193                 fmul    [Real65536]                                             ; UD16 VD16 VL   UL16 RD   RL   WID
00194                 fxch    st(2)                                                   ; VL   VD16 UD16 UL16 RD   RL   WID
00195                 fmul    [Real65536]                                             ; VL16 VD16 UD16 UL16 RD   RL   WID
00196                 fxch    st(3)                                                   ; UL16 VD16 UD16 VL16 RD   RL   WID
00197                 fistp   [u16]                                                   ; VD16 UD16 VL16 RD   RL   WID
00198                 fxch    st(2)                                                   ; VL16 UD16 VD16 RD   RL   WID
00199                 fistp   [v16]                                                   ; UD16 VD16 RD   RL   WID
00200                 fld1                                                                    ; 1    UD16 VD16 RD   RL   WID
00201                 fdivrp  st(5),st                                                ; UD16 VD16 RD   RL   DWID
00202 
00203                 //let that cook
00204 
00205                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
00206                 fild    [ecx]EdgeAsmFPU.G                                       ; RG   USTP VD16 RD   RL   DWID
00207                 fild    [ebx]EdgeAsmFPU.G                                       ; LG   RG   USTP VD16 RD   RL   DWID
00208                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
00209                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
00210                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
00211                 fild    [ecx]EdgeAsmFPU.B                                       ; RB   GD   LG   VD16 RD   RL   DWID
00212                 fild    [ebx]EdgeAsmFPU.B                                       ; LB   RB   GD   LG   VD16 RD   RL   DWID
00213                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
00214                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
00215                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
00216                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
00217                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
00218                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
00219                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
00220                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
00221                 frndint
00222                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
00223                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
00224                 frndint
00225                 fxch    st(7)                                                   ; DW2  BD   RI   LG   LB   VSTP RL   GI
00226                 fmulp   st(1),st                                                ; BI   RI   LG   LB   VSTP RL   GI
00227                 frndint
00228                 fxch    st(4)                                                   ; VSTP RI   LG   LB   BI   RL   GI
00229                 fistp   [VStep]                                                 ; RI   LG   LB   BI   RL   GI
00230 
00231                 push    ebp
00232 
00233 PixieLoop:
00234                 mov             ecx,[VShift]
00235                 mov             ebx,[GHMaskShifted]
00236 
00237                 mov             ebp,[GWMask]
00238                 mov             edi,[v16]
00239 
00240                 mov             edx,dword ptr[u16]
00241                 mov             esi,edi
00242 
00243                 mov             eax,edx
00244 
00245                 shr             edi,cl
00246                 add             esi,[VStep]
00247 
00248                 shr             edx,16
00249                 add             eax,[UStep]
00250 
00251                 and             edi,ebx
00252                 and             edx,ebp
00253 
00254                 add             edi,edx
00255                 mov             edx,eax
00256 
00257                 add             edi,GBitPtrHalf
00258                 add             eax,[UStep]
00259 
00260                 mov             [u16],eax
00261                 mov             ax,word ptr[edi*2]
00262 
00263                 mov             edi,esi
00264                 add             esi,[VStep]
00265 
00266                 shr             edx,16
00267                 mov             [v16],esi
00268 
00269                 shr             edi,cl
00270                 and             edx,ebp
00271 
00272                 mov             esi,GBitPtrHalf
00273                 and             edi,ebx
00274 
00275                 shl             eax,16
00276                 add             esi,edx
00277 
00278                 add             esi,edi
00279 
00280                 mov             ax,word ptr[esi*2]
00281 
00282                 mov             ebx,eax
00283                 and             eax,REDMASK
00284 
00285                 mov             ecx,ebx
00286                 and             ebx,GREENMASK
00287 
00288                 mov             dword ptr[Red],eax
00289                 and             ecx,BLUEMASK
00290 
00291                 mov             dword ptr[Green],ebx
00292                 mov             dword ptr[Blue],ecx
00293 
00294                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
00295                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
00296                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
00297                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
00298                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
00299                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
00300                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
00301                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
00302                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
00303                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
00304                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
00305                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
00306                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
00307                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
00308                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
00309 
00310                 mov             edx,dword ptr[Bucket]
00311                 mov             eax,dword ptr[Bucket2]
00312 
00313                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
00314                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
00315                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
00316                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
00317                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
00318                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
00319 
00320                 and             edx,GREENMASK
00321                 and             eax,REDMASK
00322 
00323                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
00324                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
00325 
00326                 mov             edi,edx
00327                 mov             ebx,dword ptr[Bucket]
00328                 or              edi,eax
00329                 mov             ebp,TDest
00330                 and             ebx,BLUEMASK
00331 
00332                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
00333                 or              edi,ebx
00334 
00335                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
00336 
00337                 rol             edi,16
00338                 add             TDest,4
00339 
00340                 mov             [ebp],edi
00341                 dec             [widTemp]
00342 
00343                 jnz             PixieLoop
00344 
00345                 pop             ebp
00346 
00347                 fstp    [u16]
00348                 fstp    [v16]
00349                 fstp    [u16]
00350                 fstp    [v16]
00351                 fstp    [u16]
00352                 fstp    [v16]
00353 
00354 GouraudReturnNoZ:
00355                 pop             edi
00356                 pop             esi
00357                 pop             ecx
00358                 pop             ebx
00359         }
00360 }
00361 
00362 void    DrawScanLineGouraudNoZTrans_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
00363 {
00364         TDest   =Dest;
00365         Red             =Green  =0;
00366         _asm
00367         {
00368                 push    ebx
00369                 push    ecx
00370                 push    esi
00371                 push    edi
00372 
00373                 mov             ebx,pLeft
00374                 mov     ecx,pRight
00375                 mov     eax,[ebx]EdgeAsmFPU.X
00376                 mov     edx,[ecx]EdgeAsmFPU.X
00377                 sub     edx,eax
00378                 jle             GouraudReturnNoZ
00379 
00380                 mov             esi,eax
00381                 inc             edx
00382                 shl             eax,1
00383                 add             TDest,eax
00384                 test    esi,1           //dword align left side
00385                 jz              NoSinglePixie
00386 
00387                 //odd sized spans write one pixel to dword align
00388                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
00389                 fmul    [Real65536]                                             ; UL16
00390                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
00391                 fmul    [Real65536]                                             ; VL16 UL16
00392                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
00393                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
00394                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
00395                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
00396                 fistp   [u16]                                                   ; GL   RL   VL16 BL
00397                 fxch    st(2)                                                   ; VL16 RL   GL   BL
00398                 fistp   [v16]                                                   ; RL   GL   BL
00399 
00400                 mov     [widTemp],edx
00401 
00402                 mov             ecx,[VShift]
00403                 mov             ebx,[GHMaskShifted]
00404 
00405                 mov             esi,[GWMask]
00406                 mov             edi,[v16]
00407 
00408                 mov             edx,dword ptr[u16]
00409 
00410                 shr             edi,cl
00411 
00412                 shr             edx,16
00413                 xor             eax,eax
00414 
00415                 and             edi,ebx
00416                 and             edx,esi
00417 
00418                 add             edi,edx
00419 
00420                 add             edi,GBitPtrHalf
00421                 mov             ax,word ptr[edi*2]
00422 
00423                 mov             word ptr[TempPix],ax
00424 
00425                 mov             ebx,eax
00426                 and             eax,REDMASK
00427 
00428                 mov             ecx,ebx
00429                 and             ebx,GREENMASK
00430 
00431                 mov             dword ptr[Red],eax
00432                 and             ecx,BLUEMASK
00433 
00434                 mov             dword ptr[Green],ebx
00435                 mov             dword ptr[Blue],ecx
00436 
00437                 fimul   dword ptr[Red]                                  ; R    GL   BL
00438                 fxch    st(1)                                                   ; GL   R    BL
00439                 fimul   dword ptr[Green]                                ; G    R    BL
00440                 fxch    st(1)                                                   ; R    G    BL
00441                 fadd    qword ptr[Magic]                                ; Rk   G    BL
00442                 fxch    st(2)                                                   ; BL   G    Rk
00443                 fimul   [Blue]                                                  ; B    G    Rk
00444                 fxch    st(1)                                                   ; G    B    Rk
00445                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
00446                 fxch    st(2)                                                   ; Rk   B    Gk
00447                 fstp    qword ptr[Bucket]                               ; B    Gk
00448                 fadd    qword ptr[Magic]                                ; Bk   Gk
00449                 fxch    st(1)                                                   ; Gk   Bk
00450                 fstp    qword ptr[Bucket2]                              ; Bk
00451 
00452                 mov             edx,dword ptr[Bucket]
00453                 mov             eax,dword ptr[Bucket2]
00454 
00455                 and             edx,REDMASK
00456                 and             eax,GREENMASK
00457 
00458                 fstp    qword ptr[Bucket]
00459 
00460                 mov             ecx,TDest
00461                 mov             ebx,dword ptr[Bucket]
00462 
00463                 and             ebx,BLUEMASK
00464                 or              edx,eax
00465 
00466                 add             TDest,2
00467                 or              edx,ebx
00468 
00469                 mov             ebx,pLeft
00470                 cmp             word ptr[TempPix],01h
00471                 je              SkipSinglePixie
00472 
00473                 mov             word ptr[ecx],dx
00474 
00475 SkipSinglePixie:
00476                 mov     edx,[widTemp]
00477                 mov     ecx,pRight
00478                 dec             edx
00479                 jz              GouraudReturnNoZ
00480                 mov             esi,edx
00481                 and             esi,1
00482                 sub             edx,esi
00483                 jz              GouraudReturnNoZ
00484 
00485 NoSinglePixie:
00486                 mov     [widTemp],edx                 ; just for a temp
00487                 shr             edx,1
00488 
00489                 ; try to keep fmul fxch pairs seperated to avoid stalling
00490                 ; calc this scanlines steps           ; FPU Stack
00491                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
00492                 fild    dword ptr [widTemp]           ; WID
00493 
00494                 mov     [widTemp],edx                 ; Color interps doubled
00495 
00496                 fld     dword ptr [ecx]EdgeAsmFPU.u      ; UR   WID
00497                 fld     dword ptr [ebx]EdgeAsmFPU.u      ; UL   UR   WID
00498                 fsub    st(1), st                     ; UL   UD   WID
00499                 fld     dword ptr [ecx]EdgeAsmFPU.v      ; VR   UL   UD   WID
00500                 fxch    st(1)                         ; UL   VR   UD   WID
00501                 fmul    [Real65536]                   ; UL16 VR   UD   WID
00502                 fld     dword ptr [ebx]EdgeAsmFPU.v      ; VL   UL16 VR   UD   WID
00503                 fsub    st(2), st                     ; VL   UL16 VD   UD   WID
00504                 fild    dword ptr [ecx]EdgeAsmFPU.R      ; RR   VL   UL16 VD   UD   WID
00505                 fxch    st(3)                         ; VD   VL   UL16 RR   UD   WID
00506                 fmul    [Real65536]                   ; VD16 VL   UL16 RR   UD   WID
00507                 fild    dword ptr [ebx]EdgeAsmFPU.R      ; RL   VD16 VL   UL16 RR   UD   WID
00508                 fsub    st(4),st                      ; RL   VD16 VL   UL16 RD   UD   WID
00509                 fxch    st(5)                         ; UD   VD16 VL   UL16 RD   RL   WID
00510                 fmul    [Real65536]                   ; UD16 VD16 VL   UL16 RD   RL   WID
00511                 fxch    st(2)                                             ; VL   VD16 UD16 UL16 RD   RL   WID
00512                 fmul    [Real65536]                   ; VL16 VD16 UD16 UL16 RD   RL   WID
00513                 fxch    st(3)                                                   ; UL16 VD16 UD16 VL16 RD   RL   WID
00514                 fistp   [u16]                                                   ; VD16 UD16 VL16 RD   RL   WID
00515                 fxch    st(2)                                                   ; VL16 UD16 VD16 RD   RL   WID
00516                 fistp   [v16]                                                   ; UD16 VD16 RD   RL   WID
00517                 fld1                                                                    ; 1    UD16 VD16 RD   RL   WID
00518                 fdivrp  st(5),st                                                ; UD16 VD16 RD   RL   DWID
00519 
00520                 //let that cook
00521 
00522                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
00523                 fild    [ecx]EdgeAsmFPU.G                                       ; RG   USTP VD16 RD   RL   DWID
00524                 fild    [ebx]EdgeAsmFPU.G                                       ; LG   RG   USTP VD16 RD   RL   DWID
00525                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
00526                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
00527                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
00528                 fild    [ecx]EdgeAsmFPU.B                                       ; RB   GD   LG   VD16 RD   RL   DWID
00529                 fild    [ebx]EdgeAsmFPU.B                                       ; LB   RB   GD   LG   VD16 RD   RL   DWID
00530                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
00531                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
00532                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
00533                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
00534                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
00535                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
00536                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
00537                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
00538                 frndint
00539                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
00540                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
00541                 frndint
00542                 fxch    st(7)                                                   ; DW2  BD   RI   LG   LB   VSTP RL   GI
00543                 fmulp   st(1),st                                                ; BI   RI   LG   LB   VSTP RL   GI
00544                 frndint
00545                 fxch    st(4)                                                   ; VSTP RI   LG   LB   BI   RL   GI
00546                 fistp   [VStep]                                                 ; RI   LG   LB   BI   RL   GI
00547 
00548                 push    ebp
00549 
00550 PixieLoop:
00551                 mov             ecx,[VShift]
00552                 mov             ebx,[GHMaskShifted]
00553 
00554                 mov             ebp,[GWMask]
00555                 mov             edi,[v16]
00556 
00557                 mov             edx,dword ptr[u16]
00558                 mov             esi,edi
00559 
00560                 mov             eax,edx
00561 
00562                 shr             edi,cl
00563                 add             esi,[VStep]
00564 
00565                 shr             edx,16
00566                 add             eax,[UStep]
00567 
00568                 and             edi,ebx
00569                 and             edx,ebp
00570 
00571                 add             edi,edx
00572                 mov             edx,eax
00573 
00574                 add             edi,GBitPtrHalf
00575                 add             eax,[UStep]
00576 
00577                 mov             [u16],eax
00578                 mov             ax,word ptr[edi*2]
00579 
00580                 mov             edi,esi
00581                 add             esi,[VStep]
00582 
00583                 shr             edx,16
00584                 mov             [v16],esi
00585 
00586                 shr             edi,cl
00587                 and             edx,ebp
00588 
00589                 mov             esi,GBitPtrHalf
00590                 and             edi,ebx
00591 
00592                 shl             eax,16
00593                 add             esi,edx
00594 
00595                 add             esi,edi
00596 
00597                 mov             ax,word ptr[esi*2]
00598 
00599                 mov             [TempPix],eax
00600 
00601                 mov             ebx,eax
00602                 and             eax,REDMASK
00603 
00604                 mov             ecx,ebx
00605                 and             ebx,GREENMASK
00606 
00607                 mov             dword ptr[Red],eax
00608                 and             ecx,BLUEMASK
00609 
00610                 mov             dword ptr[Green],ebx
00611                 mov             dword ptr[Blue],ecx
00612 
00613                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
00614                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
00615                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
00616                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
00617                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
00618                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
00619                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
00620                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
00621                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
00622                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
00623                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
00624                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
00625                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
00626                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
00627                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
00628 
00629                 mov             edx,dword ptr[Bucket]
00630                 mov             eax,dword ptr[Bucket2]
00631 
00632                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
00633                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
00634                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
00635                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
00636                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
00637                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
00638 
00639                 and             edx,GREENMASK
00640                 and             eax,REDMASK
00641 
00642                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
00643                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
00644 
00645                 mov             edi,edx
00646                 mov             ebx,dword ptr[Bucket]
00647                 or              edi,eax
00648                 mov             ebp,TDest
00649                 and             ebx,BLUEMASK
00650 
00651                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
00652                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
00653 
00654                 or              edi,ebx
00655                 add             TDest,4
00656 
00657                 cmp             [TempPix],010001h
00658                 je              SkipPixie
00659 
00660                 mov             [ebp],edi
00661 
00662 SkipPixie:
00663                 dec             [widTemp]
00664 
00665                 jnz             PixieLoop
00666 
00667                 pop             ebp
00668 
00669                 fstp    [u16]
00670                 fstp    [v16]
00671                 fstp    [u16]
00672                 fstp    [v16]
00673                 fstp    [u16]
00674                 fstp    [v16]
00675 
00676 GouraudReturnNoZ:
00677                 pop             edi
00678                 pop             esi
00679                 pop             ecx
00680                 pop             ebx
00681         }
00682 }
00683 
00684 void    DrawScanLineGouraudZBuffer_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
00685 {
00686         TDest   =Dest;
00687         Red             =Green  =0;
00688         _asm
00689         {
00690                 push    ebx
00691                 push    ecx
00692                 push    esi
00693                 push    edi
00694 
00695                 mov             ebx,pLeft
00696                 mov     ecx,pRight
00697                 mov     eax,[ebx]EdgeAsmFPU.X
00698                 mov     edx,[ecx]EdgeAsmFPU.X
00699                 sub     edx,eax
00700                 jle             GouraudReturnNoZ
00701 
00702                 mov             esi,eax
00703                 inc             edx
00704                 shl             eax,1
00705                 add             TDest,eax
00706                 add             pZBufferPtr,eax
00707                 test    esi,1           //dword align left
00708                 jz              NoSinglePixie
00709 
00710                 //odd sized spans write one pixel to dword align
00711                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
00712                 fmul    [Real65536]                                             ; UL16
00713                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
00714                 fmul    [Real65536]                                             ; VL16 UL16
00715                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
00716                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
00717                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
00718                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
00719                 fistp   [u16]                                                   ; GL   RL   VL16 BL
00720                 fxch    st(2)                                                   ; VL16 RL   GL   BL
00721                 fistp   [v16]                                                   ; RL   GL   BL
00722                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
00723                 fistp   [z16]                                                   ; RL   GL   BL
00724 
00725                 mov     [widTemp],edx
00726 
00727                 mov             ecx,[VShift]
00728                 mov             ebx,[GHMaskShifted]
00729 
00730                 mov             esi,[GWMask]
00731                 mov             edi,[v16]
00732 
00733                 mov             edx,dword ptr[u16]
00734 
00735                 shr             edi,cl
00736 
00737                 shr             edx,16
00738                 xor             eax,eax
00739 
00740                 and             edi,ebx
00741                 and             edx,esi
00742 
00743                 add             edi,edx
00744 
00745                 add             edi,GBitPtrHalf
00746                 mov             ax,word ptr[edi*2]
00747 
00748                 mov             ebx,eax
00749                 and             eax,REDMASK
00750 
00751                 mov             ecx,ebx
00752                 and             ebx,GREENMASK
00753 
00754                 mov             dword ptr[Red],eax
00755                 and             ecx,BLUEMASK
00756 
00757                 mov             dword ptr[Green],ebx
00758                 mov             dword ptr[Blue],ecx
00759 
00760                 fimul   dword ptr[Red]                                  ; R    GL   BL
00761                 fxch    st(1)                                                   ; GL   R    BL
00762                 fimul   dword ptr[Green]                                ; G    R    BL
00763                 fxch    st(1)                                                   ; R    G    BL
00764                 fadd    qword ptr[Magic]                                ; Rk   G    BL
00765                 fxch    st(2)                                                   ; BL   G    Rk
00766                 fimul   [Blue]                                                  ; B    G    Rk
00767                 fxch    st(1)                                                   ; G    B    Rk
00768                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
00769                 fxch    st(2)                                                   ; Rk   B    Gk
00770                 fstp    qword ptr[Bucket]                               ; B    Gk
00771                 fadd    qword ptr[Magic]                                ; Bk   Gk
00772                 fxch    st(1)                                                   ; Gk   Bk
00773                 fstp    qword ptr[Bucket2]                              ; Bk
00774 
00775                 mov             edx,dword ptr[Bucket]
00776                 mov             eax,dword ptr[Bucket2]
00777 
00778                 and             edx,REDMASK
00779                 and             eax,GREENMASK
00780 
00781                 fstp    qword ptr[Bucket]
00782 
00783                 mov             ecx,TDest
00784                 mov             ebx,dword ptr[Bucket]
00785 
00786                 mov             esi,[z16]
00787                 and             ebx,BLUEMASK
00788 
00789                 shr             esi,16
00790                 or              edx,eax
00791 
00792                 mov             eax,pZBufferPtr
00793                 add             TDest,2
00794 
00795                 cmp             word ptr[eax],si
00796                 jg              SkipSinglePixie
00797 
00798                 or              edx,ebx
00799                 mov             word ptr[eax],si
00800 
00801                 mov             word ptr[ecx],dx
00802 
00803 SkipSinglePixie:
00804                 mov             ebx,pLeft
00805                 mov     edx,[widTemp]
00806                 add             pZBufferPtr,2
00807                 mov     ecx,pRight
00808                 dec             edx
00809                 jz              GouraudReturnNoZ
00810                 mov             esi,edx
00811                 and             esi,1
00812                 sub             edx,esi
00813                 jz              GouraudReturnNoZ
00814 
00815 NoSinglePixie:
00816                 mov     [widTemp],edx                 ; just for a temp
00817                 shr             edx,1
00818 
00819                 ; try to keep fmul fxch pairs seperated to avoid stalling
00820                 ; calc this scanlines steps           ; FPU Stack
00821                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
00822                 fild    dword ptr [widTemp]           ; WID
00823 
00824                 mov     [widTemp],edx                 ; Color interps doubled
00825 
00826                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
00827                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
00828                 fsub    st(1), st                   ; UL   UD   WID
00829                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
00830                 fxch    st(1)                       ; UL   VR   UD   WID
00831                 fmul    [Real65536]                 ; UL16 VR   UD   WID
00832                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
00833                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
00834                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
00835                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
00836                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
00837                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
00838                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
00839                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
00840                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
00841                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
00842                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
00843                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
00844                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
00845                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
00846                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
00847                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
00848                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
00849 
00850                 //let that cook
00851 
00852                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
00853                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
00854                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
00855                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
00856                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
00857                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
00858                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
00859                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
00860                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
00861                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
00862                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
00863                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
00864                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
00865                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
00866                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
00867                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
00868                 frndint
00869                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
00870                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
00871                 frndint
00872                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
00873                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
00874                 frndint
00875                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
00876                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
00877                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
00878                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
00879                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
00880                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
00881                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
00882                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
00883                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
00884                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
00885                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
00886 
00887                 push    ebp
00888 
00889 PixieLoop:
00890                 mov             ebx,[ZStep]
00891 
00892                 add             [z16],ebx
00893                 mov             ecx,[VShift]
00894 
00895                 mov             edi,[z16]
00896 
00897                 shr             edi,16
00898                 mov             ebx,[GHMaskShifted]
00899 
00900                 mov             ebp,[GWMask]
00901                 mov             edx,dword ptr[u16]
00902 
00903                 mov             word ptr[Z32],di
00904                 mov             eax,edx
00905 
00906                 shr             edx,16
00907                 mov             edi,[v16]
00908 
00909                 add             eax,[UStep]
00910                 mov             esi,edi
00911 
00912                 shr             edi,cl
00913                 add             esi,[VStep]
00914 
00915                 and             edi,ebx
00916                 and             edx,ebp
00917 
00918                 add             edi,edx
00919                 mov             edx,eax
00920 
00921                 add             edi,GBitPtrHalf
00922                 add             eax,[UStep]
00923 
00924                 mov             [u16],eax
00925                 mov             ax,word ptr[edi*2]
00926 
00927                 mov             edi,esi
00928                 add             esi,[VStep]
00929 
00930                 shr             edx,16
00931                 mov             [v16],esi
00932 
00933                 shr             edi,cl
00934                 and             edx,ebp
00935 
00936                 mov             esi,GBitPtrHalf
00937                 and             edi,ebx
00938 
00939                 shl             eax,16
00940                 add             esi,edx
00941 
00942                 add             esi,edi
00943 
00944                 mov             ax,word ptr[esi*2]
00945 
00946                 mov             ebx,eax
00947                 and             eax,REDMASK
00948 
00949                 mov             ecx,ebx
00950                 and             ebx,GREENMASK
00951 
00952                 mov             dword ptr[Red],eax
00953                 and             ecx,BLUEMASK
00954 
00955                 mov             dword ptr[Green],ebx
00956                 mov             dword ptr[Blue],ecx
00957 
00958                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
00959                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
00960                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
00961                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
00962                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
00963                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
00964                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
00965                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
00966                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
00967                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
00968                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
00969                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
00970                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
00971                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
00972                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
00973 
00974                 mov             edx,dword ptr[Bucket]
00975                 mov             eax,dword ptr[Bucket2]
00976 
00977                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
00978                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
00979                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
00980                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
00981                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
00982                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
00983 
00984                 and             edx,GREENMASK
00985                 and             eax,REDMASK
00986 
00987                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
00988                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
00989 
00990                 mov             edi,edx
00991                 mov             ebx,dword ptr[Bucket]
00992                 or              edi,eax
00993                 mov             ebp,TDest
00994                 and             ebx,BLUEMASK
00995 
00996                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
00997                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
00998 
00999                 mov             si,word ptr[Z32]
01000                 add             TDest,4
01001 
01002                 mov             ecx,pZBufferPtr
01003                 or              edi,ebx
01004 
01005                 cmp             word ptr[ecx],si
01006                 jg              SkipPixie
01007 
01008                 rol             edi,16
01009 
01010                 mov             [ecx],si
01011                 mov             dword ptr[ebp],edi
01012                 mov             [ecx+2],si
01013 SkipPixie:
01014                 add             pZBufferPtr,4
01015                 dec             [widTemp]
01016 
01017                 jnz             PixieLoop
01018 
01019                 pop             ebp
01020 
01021                 fstp    [u16]
01022                 fstp    [v16]
01023                 fstp    [u16]
01024                 fstp    [v16]
01025                 fstp    [u16]
01026                 fstp    [v16]
01027 
01028 GouraudReturnNoZ:
01029                 pop             edi
01030                 pop             esi
01031                 pop             ecx
01032                 pop             ebx
01033         }
01034 }
01035 
01036 void    DrawScanLineGouraudZBufferNoZWrite_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
01037 {
01038         TDest   =Dest;
01039         Red             =Green  =0;
01040         _asm
01041         {
01042                 push    ebx
01043                 push    ecx
01044                 push    esi
01045                 push    edi
01046 
01047                 mov             ebx,pLeft
01048                 mov     ecx,pRight
01049                 mov     eax,[ebx]EdgeAsmFPU.X
01050                 mov     edx,[ecx]EdgeAsmFPU.X
01051                 sub     edx,eax
01052                 jle             GouraudReturnNoZ
01053 
01054                 mov             esi,eax
01055                 inc             edx
01056                 shl             eax,1
01057                 add             TDest,eax
01058                 add             pZBufferPtr,eax
01059                 test    esi,1           //dword align left
01060                 jz              NoSinglePixie
01061 
01062                 //odd sized spans write one pixel to dword align
01063                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
01064                 fmul    [Real65536]                                             ; UL16
01065                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
01066                 fmul    [Real65536]                                             ; VL16 UL16
01067                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
01068                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
01069                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
01070                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
01071                 fistp   [u16]                                                   ; GL   RL   VL16 BL
01072                 fxch    st(2)                                                   ; VL16 RL   GL   BL
01073                 fistp   [v16]                                                   ; RL   GL   BL
01074                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
01075                 fistp   [z16]                                                   ; RL   GL   BL
01076 
01077                 mov     [widTemp],edx
01078 
01079                 mov             ecx,[VShift]
01080                 mov             ebx,[GHMaskShifted]
01081 
01082                 mov             esi,[GWMask]
01083                 mov             edi,[v16]
01084 
01085                 mov             edx,dword ptr[u16]
01086 
01087                 shr             edi,cl
01088 
01089                 shr             edx,16
01090                 xor             eax,eax
01091 
01092                 and             edi,ebx
01093                 and             edx,esi
01094 
01095                 add             edi,edx
01096 
01097                 add             edi,GBitPtrHalf
01098                 mov             ax,word ptr[edi*2]
01099 
01100                 mov             ebx,eax
01101                 and             eax,REDMASK
01102 
01103                 mov             ecx,ebx
01104                 and             ebx,GREENMASK
01105 
01106                 mov             dword ptr[Red],eax
01107                 and             ecx,BLUEMASK
01108 
01109                 mov             dword ptr[Green],ebx
01110                 mov             dword ptr[Blue],ecx
01111 
01112                 fimul   dword ptr[Red]                                  ; R    GL   BL
01113                 fxch    st(1)                                                   ; GL   R    BL
01114                 fimul   dword ptr[Green]                                ; G    R    BL
01115                 fxch    st(1)                                                   ; R    G    BL
01116                 fadd    qword ptr[Magic]                                ; Rk   G    BL
01117                 fxch    st(2)                                                   ; BL   G    Rk
01118                 fimul   [Blue]                                                  ; B    G    Rk
01119                 fxch    st(1)                                                   ; G    B    Rk
01120                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
01121                 fxch    st(2)                                                   ; Rk   B    Gk
01122                 fstp    qword ptr[Bucket]                               ; B    Gk
01123                 fadd    qword ptr[Magic]                                ; Bk   Gk
01124                 fxch    st(1)                                                   ; Gk   Bk
01125                 fstp    qword ptr[Bucket2]                              ; Bk
01126 
01127                 mov             edx,dword ptr[Bucket]
01128                 mov             eax,dword ptr[Bucket2]
01129 
01130                 and             edx,REDMASK
01131                 and             eax,GREENMASK
01132 
01133                 fstp    qword ptr[Bucket]
01134 
01135                 mov             ecx,TDest
01136                 mov             ebx,dword ptr[Bucket]
01137 
01138                 mov             esi,[z16]
01139                 and             ebx,BLUEMASK
01140 
01141                 shr             esi,16
01142                 or              edx,eax
01143 
01144                 mov             eax,pZBufferPtr
01145                 add             TDest,2
01146 
01147                 cmp             word ptr[eax],si
01148                 jg              SkipSinglePixie
01149 
01150                 or              edx,ebx
01151 
01152                 mov             word ptr[ecx],dx
01153 
01154 SkipSinglePixie:
01155                 mov             ebx,pLeft
01156                 mov     edx,[widTemp]
01157                 add             pZBufferPtr,2
01158                 mov     ecx,pRight
01159                 dec             edx
01160                 jz              GouraudReturnNoZ
01161                 mov             esi,edx
01162                 and             esi,1
01163                 sub             edx,esi
01164                 jz              GouraudReturnNoZ
01165 
01166 NoSinglePixie:
01167                 mov     [widTemp],edx                 ; just for a temp
01168                 shr             edx,1
01169 
01170                 ; try to keep fmul fxch pairs seperated to avoid stalling
01171                 ; calc this scanlines steps           ; FPU Stack
01172                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
01173                 fild    dword ptr [widTemp]           ; WID
01174 
01175                 mov     [widTemp],edx                 ; Color interps doubled
01176 
01177                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
01178                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
01179                 fsub    st(1), st                   ; UL   UD   WID
01180                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
01181                 fxch    st(1)                       ; UL   VR   UD   WID
01182                 fmul    [Real65536]                 ; UL16 VR   UD   WID
01183                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
01184                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
01185                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
01186                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
01187                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
01188                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
01189                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
01190                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
01191                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
01192                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
01193                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
01194                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
01195                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
01196                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
01197                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
01198                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
01199                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
01200 
01201                 //let that cook
01202 
01203                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
01204                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
01205                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
01206                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
01207                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
01208                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
01209                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
01210                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
01211                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
01212                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
01213                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
01214                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
01215                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
01216                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
01217                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
01218                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
01219                 frndint
01220                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
01221                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
01222                 frndint
01223                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
01224                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
01225                 frndint
01226                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
01227                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
01228                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
01229                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
01230                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
01231                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
01232                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
01233                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
01234                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
01235                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
01236                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
01237 
01238                 push    ebp
01239 
01240 PixieLoop:
01241                 mov             ebx,[ZStep]
01242 
01243                 add             [z16],ebx
01244                 mov             ecx,[VShift]
01245 
01246                 mov             edi,[z16]
01247 
01248                 shr             edi,16
01249                 mov             ebx,[GHMaskShifted]
01250 
01251                 mov             ebp,[GWMask]
01252                 mov             edx,dword ptr[u16]
01253 
01254                 mov             word ptr[Z32],di
01255                 mov             eax,edx
01256 
01257                 shr             edx,16
01258                 mov             edi,[v16]
01259 
01260                 add             eax,[UStep]
01261                 mov             esi,edi
01262 
01263                 shr             edi,cl
01264                 add             esi,[VStep]
01265 
01266                 and             edi,ebx
01267                 and             edx,ebp
01268 
01269                 add             edi,edx
01270                 mov             edx,eax
01271 
01272                 add             edi,GBitPtrHalf
01273                 add             eax,[UStep]
01274 
01275                 mov             [u16],eax
01276                 mov             ax,word ptr[edi*2]
01277 
01278                 mov             edi,esi
01279                 add             esi,[VStep]
01280 
01281                 shr             edx,16
01282                 mov             [v16],esi
01283 
01284                 shr             edi,cl
01285                 and             edx,ebp
01286 
01287                 mov             esi,GBitPtrHalf
01288                 and             edi,ebx
01289 
01290                 shl             eax,16
01291                 add             esi,edx
01292 
01293                 add             esi,edi
01294 
01295                 mov             ax,word ptr[esi*2]
01296 
01297                 mov             ebx,eax
01298                 and             eax,REDMASK
01299 
01300                 mov             ecx,ebx
01301                 and             ebx,GREENMASK
01302 
01303                 mov             dword ptr[Red],eax
01304                 and             ecx,BLUEMASK
01305 
01306                 mov             dword ptr[Green],ebx
01307                 mov             dword ptr[Blue],ecx
01308 
01309                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
01310                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
01311                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
01312                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
01313                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
01314                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
01315                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
01316                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
01317                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
01318                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
01319                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
01320                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
01321                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
01322                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
01323                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
01324 
01325                 mov             edx,dword ptr[Bucket]
01326                 mov             eax,dword ptr[Bucket2]
01327 
01328                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
01329                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
01330                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
01331                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
01332                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
01333                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
01334 
01335                 and             edx,GREENMASK
01336                 and             eax,REDMASK
01337 
01338                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
01339                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
01340 
01341                 mov             edi,edx
01342                 mov             ebx,dword ptr[Bucket]
01343                 or              edi,eax
01344                 mov             ebp,TDest
01345                 and             ebx,BLUEMASK
01346 
01347                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
01348                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
01349 
01350                 mov             si,word ptr[Z32]
01351                 add             TDest,4
01352 
01353                 mov             ecx,pZBufferPtr
01354                 or              edi,ebx
01355 
01356                 cmp             word ptr[ecx],si
01357                 jg              SkipPixie
01358 
01359                 rol             edi,16
01360 
01361                 mov             dword ptr[ebp],edi
01362 SkipPixie:
01363                 add             pZBufferPtr,4
01364                 dec             [widTemp]
01365 
01366                 jnz             PixieLoop
01367 
01368                 pop             ebp
01369 
01370                 fstp    [u16]
01371                 fstp    [v16]
01372                 fstp    [u16]
01373                 fstp    [v16]
01374                 fstp    [u16]
01375                 fstp    [v16]
01376 
01377 GouraudReturnNoZ:
01378                 pop             edi
01379                 pop             esi
01380                 pop             ecx
01381                 pop             ebx
01382         }
01383 }
01384 
01385 void    DrawScanLineGouraudNoZBufferZWrite_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
01386 {
01387         TDest   =Dest;
01388         Red             =Green  =0;
01389         _asm
01390         {
01391                 push    ebx
01392                 push    ecx
01393                 push    esi
01394                 push    edi
01395 
01396                 mov             ebx,pLeft
01397                 mov     ecx,pRight
01398                 mov     eax,[ebx]EdgeAsmFPU.X
01399                 mov     edx,[ecx]EdgeAsmFPU.X
01400                 sub     edx,eax
01401                 jle             GouraudReturnNoZ
01402 
01403                 mov             esi,eax
01404                 inc             edx
01405                 shl             eax,1
01406                 add             TDest,eax
01407                 add             pZBufferPtr,eax
01408                 test    esi,1           //dword align left
01409                 jz              NoSinglePixie
01410 
01411                 //odd sized spans write one pixel to dword align
01412                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
01413                 fmul    [Real65536]                                             ; UL16
01414                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
01415                 fmul    [Real65536]                                             ; VL16 UL16
01416                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
01417                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
01418                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
01419                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
01420                 fistp   [u16]                                                   ; GL   RL   VL16 BL
01421                 fxch    st(2)                                                   ; VL16 RL   GL   BL
01422                 fistp   [v16]                                                   ; RL   GL   BL
01423                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
01424                 fistp   [z16]                                                   ; RL   GL   BL
01425 
01426                 mov     [widTemp],edx
01427 
01428                 mov             ecx,[VShift]
01429                 mov             ebx,[GHMaskShifted]
01430 
01431                 mov             esi,[GWMask]
01432                 mov             edi,[v16]
01433 
01434                 mov             edx,dword ptr[u16]
01435 
01436                 shr             edi,cl
01437 
01438                 shr             edx,16
01439                 xor             eax,eax
01440 
01441                 and             edi,ebx
01442                 and             edx,esi
01443 
01444                 add             edi,edx
01445 
01446                 add             edi,GBitPtrHalf
01447                 mov             ax,word ptr[edi*2]
01448 
01449                 mov             ebx,eax
01450                 and             eax,REDMASK
01451 
01452                 mov             ecx,ebx
01453                 and             ebx,GREENMASK
01454 
01455                 mov             dword ptr[Red],eax
01456                 and             ecx,BLUEMASK
01457 
01458                 mov             dword ptr[Green],ebx
01459                 mov             dword ptr[Blue],ecx
01460 
01461                 fimul   dword ptr[Red]                                  ; R    GL   BL
01462                 fxch    st(1)                                                   ; GL   R    BL
01463                 fimul   dword ptr[Green]                                ; G    R    BL
01464                 fxch    st(1)                                                   ; R    G    BL
01465                 fadd    qword ptr[Magic]                                ; Rk   G    BL
01466                 fxch    st(2)                                                   ; BL   G    Rk
01467                 fimul   [Blue]                                                  ; B    G    Rk
01468                 fxch    st(1)                                                   ; G    B    Rk
01469                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
01470                 fxch    st(2)                                                   ; Rk   B    Gk
01471                 fstp    qword ptr[Bucket]                               ; B    Gk
01472                 fadd    qword ptr[Magic]                                ; Bk   Gk
01473                 fxch    st(1)                                                   ; Gk   Bk
01474                 fstp    qword ptr[Bucket2]                              ; Bk
01475 
01476                 mov             edx,dword ptr[Bucket]
01477                 mov             eax,dword ptr[Bucket2]
01478 
01479                 and             edx,REDMASK
01480                 and             eax,GREENMASK
01481 
01482                 fstp    qword ptr[Bucket]
01483 
01484                 mov             ecx,TDest
01485                 mov             ebx,dword ptr[Bucket]
01486 
01487                 mov             esi,[z16]
01488                 and             ebx,BLUEMASK
01489 
01490                 shr             esi,16
01491                 or              edx,eax
01492 
01493                 mov             eax,pZBufferPtr
01494                 add             TDest,2
01495 
01496                 or              edx,ebx
01497                 mov             word ptr[eax],si
01498 
01499                 mov             word ptr[ecx],dx
01500 
01501                 mov             ebx,pLeft
01502                 mov     edx,[widTemp]
01503                 add             pZBufferPtr,2
01504                 mov     ecx,pRight
01505                 dec             edx
01506                 jz              GouraudReturnNoZ
01507                 mov             esi,edx
01508                 and             esi,1
01509                 sub             edx,esi
01510                 jz              GouraudReturnNoZ
01511 
01512 NoSinglePixie:
01513                 mov     [widTemp],edx                 ; just for a temp
01514                 shr             edx,1
01515 
01516                 ; try to keep fmul fxch pairs seperated to avoid stalling
01517                 ; calc this scanlines steps           ; FPU Stack
01518                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
01519                 fild    dword ptr [widTemp]           ; WID
01520 
01521                 mov     [widTemp],edx                 ; Color interps doubled
01522 
01523                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
01524                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
01525                 fsub    st(1), st                   ; UL   UD   WID
01526                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
01527                 fxch    st(1)                       ; UL   VR   UD   WID
01528                 fmul    [Real65536]                 ; UL16 VR   UD   WID
01529                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
01530                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
01531                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
01532                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
01533                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
01534                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
01535                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
01536                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
01537                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
01538                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
01539                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
01540                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
01541                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
01542                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
01543                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
01544                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
01545                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
01546 
01547                 //let that cook
01548 
01549                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
01550                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
01551                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
01552                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
01553                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
01554                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
01555                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
01556                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
01557                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
01558                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
01559                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
01560                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
01561                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
01562                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
01563                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
01564                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
01565                 frndint
01566                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
01567                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
01568                 frndint
01569                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
01570                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
01571                 frndint
01572                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
01573                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
01574                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
01575                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
01576                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
01577                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
01578                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
01579                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
01580                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
01581                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
01582                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
01583 
01584                 push    ebp
01585 
01586 PixieLoop:
01587                 mov             ebx,[ZStep]
01588 
01589                 add             [z16],ebx
01590                 mov             ecx,[VShift]
01591 
01592                 mov             edi,[z16]
01593 
01594                 shr             edi,16
01595                 mov             ebx,[GHMaskShifted]
01596 
01597                 mov             ebp,[GWMask]
01598                 mov             edx,dword ptr[u16]
01599 
01600                 mov             word ptr[Z32],di
01601                 mov             eax,edx
01602 
01603                 shr             edx,16
01604                 mov             edi,[v16]
01605 
01606                 add             eax,[UStep]
01607                 mov             esi,edi
01608 
01609                 shr             edi,cl
01610                 add             esi,[VStep]
01611 
01612                 and             edi,ebx
01613                 and             edx,ebp
01614 
01615                 add             edi,edx
01616                 mov             edx,eax
01617 
01618                 add             edi,GBitPtrHalf
01619                 add             eax,[UStep]
01620 
01621                 mov             [u16],eax
01622                 mov             ax,word ptr[edi*2]
01623 
01624                 mov             edi,esi
01625                 add             esi,[VStep]
01626 
01627                 shr             edx,16
01628                 mov             [v16],esi
01629 
01630                 shr             edi,cl
01631                 and             edx,ebp
01632 
01633                 mov             esi,GBitPtrHalf
01634                 and             edi,ebx
01635 
01636                 shl             eax,16
01637                 add             esi,edx
01638 
01639                 add             esi,edi
01640 
01641                 mov             ax,word ptr[esi*2]
01642 
01643                 mov             ebx,eax
01644                 and             eax,REDMASK
01645 
01646                 mov             ecx,ebx
01647                 and             ebx,GREENMASK
01648 
01649                 mov             dword ptr[Red],eax
01650                 and             ecx,BLUEMASK
01651 
01652                 mov             dword ptr[Green],ebx
01653                 mov             dword ptr[Blue],ecx
01654 
01655                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
01656                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
01657                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
01658                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
01659                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
01660                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
01661                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
01662                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
01663                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
01664                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
01665                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
01666                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
01667                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
01668                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
01669                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
01670 
01671                 mov             edx,dword ptr[Bucket]
01672                 mov             eax,dword ptr[Bucket2]
01673 
01674                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
01675                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
01676                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
01677                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
01678                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
01679                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
01680 
01681                 and             edx,GREENMASK
01682                 and             eax,REDMASK
01683 
01684                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
01685                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
01686 
01687                 mov             edi,edx
01688                 mov             ebx,dword ptr[Bucket]
01689                 or              edi,eax
01690                 mov             ebp,TDest
01691                 and             ebx,BLUEMASK
01692 
01693                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
01694                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
01695 
01696                 mov             si,word ptr[Z32]
01697                 add             TDest,4
01698 
01699                 mov             ecx,pZBufferPtr
01700                 or              edi,ebx
01701 
01702                 mov             [ecx],si
01703                 rol             edi,16
01704 
01705                 mov             dword ptr[ebp],edi
01706                 mov             [ecx+2],si
01707 
01708                 add             pZBufferPtr,4
01709                 dec             [widTemp]
01710 
01711                 jnz             PixieLoop
01712 
01713                 pop             ebp
01714 
01715                 fstp    [u16]
01716                 fstp    [v16]
01717                 fstp    [u16]
01718                 fstp    [v16]
01719                 fstp    [u16]
01720                 fstp    [v16]
01721 
01722 GouraudReturnNoZ:
01723                 pop             edi
01724                 pop             esi
01725                 pop             ecx
01726                 pop             ebx
01727         }
01728 }
01729 
01730 void    DrawScanLineGouraudZBufferTrans_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
01731 {
01732         TDest   =Dest;
01733         Red             =Green  =0;
01734         _asm
01735         {
01736                 push    ebx
01737                 push    ecx
01738                 push    esi
01739                 push    edi
01740 
01741                 mov             ebx,pLeft
01742                 mov     ecx,pRight
01743                 mov     eax,[ebx]EdgeAsmFPU.X
01744                 mov     edx,[ecx]EdgeAsmFPU.X
01745                 sub     edx,eax
01746                 jle             GouraudReturnNoZ
01747 
01748                 mov             esi,eax
01749                 inc             edx
01750                 shl             eax,1
01751                 add             TDest,eax
01752                 add             pZBufferPtr,eax
01753                 test    esi,1           //dword align left
01754                 jz              NoSinglePixie
01755 
01756                 //odd sized spans write one pixel to dword align
01757                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
01758                 fmul    [Real65536]                                             ; UL16
01759                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
01760                 fmul    [Real65536]                                             ; VL16 UL16
01761                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
01762                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
01763                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
01764                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
01765                 fistp   [u16]                                                   ; GL   RL   VL16 BL
01766                 fxch    st(2)                                                   ; VL16 RL   GL   BL
01767                 fistp   [v16]                                                   ; RL   GL   BL
01768                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
01769                 fistp   [z16]                                                   ; RL   GL   BL
01770 
01771                 mov     [widTemp],edx
01772 
01773                 mov             ecx,[VShift]
01774                 mov             ebx,[GHMaskShifted]
01775 
01776                 mov             esi,[GWMask]
01777                 mov             edi,[v16]
01778 
01779                 mov             edx,dword ptr[u16]
01780 
01781                 shr             edi,cl
01782 
01783                 shr             edx,16
01784                 xor             eax,eax
01785 
01786                 and             edi,ebx
01787                 and             edx,esi
01788 
01789                 add             edi,edx
01790 
01791                 add             edi,GBitPtrHalf
01792                 mov             ax,word ptr[edi*2]
01793 
01794                 mov             word ptr[TempPix],ax
01795 
01796                 mov             ebx,eax
01797                 and             eax,REDMASK
01798 
01799                 mov             ecx,ebx
01800                 and             ebx,GREENMASK
01801 
01802                 mov             dword ptr[Red],eax
01803                 and             ecx,BLUEMASK
01804 
01805                 mov             dword ptr[Green],ebx
01806                 mov             dword ptr[Blue],ecx
01807 
01808                 fimul   dword ptr[Red]                                  ; R    GL   BL
01809                 fxch    st(1)                                                   ; GL   R    BL
01810                 fimul   dword ptr[Green]                                ; G    R    BL
01811                 fxch    st(1)                                                   ; R    G    BL
01812                 fadd    qword ptr[Magic]                                ; Rk   G    BL
01813                 fxch    st(2)                                                   ; BL   G    Rk
01814                 fimul   [Blue]                                                  ; B    G    Rk
01815                 fxch    st(1)                                                   ; G    B    Rk
01816                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
01817                 fxch    st(2)                                                   ; Rk   B    Gk
01818                 fstp    qword ptr[Bucket]                               ; B    Gk
01819                 fadd    qword ptr[Magic]                                ; Bk   Gk
01820                 fxch    st(1)                                                   ; Gk   Bk
01821                 fstp    qword ptr[Bucket2]                              ; Bk
01822 
01823                 mov             edx,dword ptr[Bucket]
01824                 mov             eax,dword ptr[Bucket2]
01825 
01826                 and             edx,REDMASK
01827                 and             eax,GREENMASK
01828 
01829                 fstp    qword ptr[Bucket]
01830 
01831                 mov             ecx,TDest
01832                 mov             ebx,dword ptr[Bucket]
01833 
01834                 mov             esi,[z16]
01835                 and             ebx,BLUEMASK
01836 
01837                 shr             esi,16
01838                 or              edx,eax
01839 
01840                 mov             eax,pZBufferPtr
01841                 add             TDest,2
01842 
01843                 cmp             word ptr[TempPix],01h
01844                 je              SkipSinglePixie
01845 
01846                 cmp             word ptr[eax],si
01847                 jg              SkipSinglePixie
01848 
01849                 or              edx,ebx
01850                 mov             word ptr[eax],si
01851 
01852                 mov             word ptr[ecx],dx
01853 
01854 SkipSinglePixie:
01855                 mov             ebx,pLeft
01856                 mov     edx,[widTemp]
01857                 add             pZBufferPtr,2
01858                 mov     ecx,pRight
01859                 dec             edx
01860                 jz              GouraudReturnNoZ
01861                 mov             esi,edx
01862                 and             esi,1
01863                 sub             edx,esi
01864                 jz              GouraudReturnNoZ
01865 
01866 NoSinglePixie:
01867                 mov     [widTemp],edx                 ; just for a temp
01868                 shr             edx,1
01869 
01870                 ; try to keep fmul fxch pairs seperated to avoid stalling
01871                 ; calc this scanlines steps           ; FPU Stack
01872                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
01873                 fild    dword ptr [widTemp]           ; WID
01874 
01875                 mov     [widTemp],edx                 ; Color interps doubled
01876 
01877                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
01878                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
01879                 fsub    st(1), st                   ; UL   UD   WID
01880                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
01881                 fxch    st(1)                       ; UL   VR   UD   WID
01882                 fmul    [Real65536]                 ; UL16 VR   UD   WID
01883                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
01884                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
01885                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
01886                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
01887                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
01888                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
01889                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
01890                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
01891                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
01892                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
01893                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
01894                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
01895                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
01896                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
01897                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
01898                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
01899                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
01900 
01901                 //let that cook
01902 
01903                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
01904                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
01905                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
01906                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
01907                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
01908                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
01909                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
01910                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
01911                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
01912                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
01913                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
01914                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
01915                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
01916                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
01917                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
01918                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
01919                 frndint
01920                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
01921                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
01922                 frndint
01923                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
01924                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
01925                 frndint
01926                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
01927                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
01928                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
01929                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
01930                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
01931                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
01932                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
01933                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
01934                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
01935                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
01936                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
01937 
01938                 push    ebp
01939 
01940 PixieLoop:
01941                 mov             ebx,[ZStep]
01942 
01943                 add             [z16],ebx
01944                 mov             ecx,[VShift]
01945 
01946                 mov             edi,[z16]
01947 
01948                 shr             edi,16
01949                 mov             ebx,[GHMaskShifted]
01950 
01951                 mov             ebp,[GWMask]
01952                 mov             edx,dword ptr[u16]
01953 
01954                 mov             word ptr[Z32],di
01955                 mov             eax,edx
01956 
01957                 shr             edx,16
01958                 mov             edi,[v16]
01959 
01960                 add             eax,[UStep]
01961                 mov             esi,edi
01962 
01963                 shr             edi,cl
01964                 add             esi,[VStep]
01965 
01966                 and             edi,ebx
01967                 and             edx,ebp
01968 
01969                 add             edi,edx
01970                 mov             edx,eax
01971 
01972                 add             edi,GBitPtrHalf
01973                 add             eax,[UStep]
01974 
01975                 mov             [u16],eax
01976                 mov             ax,word ptr[edi*2]
01977 
01978                 mov             edi,esi
01979                 add             esi,[VStep]
01980 
01981                 shr             edx,16
01982                 mov             [v16],esi
01983 
01984                 shr             edi,cl
01985                 and             edx,ebp
01986 
01987                 mov             esi,GBitPtrHalf
01988                 and             edi,ebx
01989 
01990                 shl             eax,16
01991                 add             esi,edx
01992 
01993                 add             esi,edi
01994 
01995                 mov             ax,word ptr[esi*2]
01996 
01997                 mov             [TempPix],eax
01998 
01999                 mov             ebx,eax
02000                 and             eax,REDMASK
02001 
02002                 mov             ecx,ebx
02003                 and             ebx,GREENMASK
02004 
02005                 mov             dword ptr[Red],eax
02006                 and             ecx,BLUEMASK
02007 
02008                 mov             dword ptr[Green],ebx
02009                 mov             dword ptr[Blue],ecx
02010 
02011                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
02012                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
02013                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
02014                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
02015                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
02016                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
02017                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
02018                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
02019                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
02020                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
02021                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
02022                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
02023                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
02024                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
02025                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
02026 
02027                 mov             edx,dword ptr[Bucket]
02028                 mov             eax,dword ptr[Bucket2]
02029 
02030                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
02031                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
02032                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
02033                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
02034                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
02035                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
02036 
02037                 and             edx,GREENMASK
02038                 and             eax,REDMASK
02039 
02040                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
02041                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
02042 
02043                 mov             edi,edx
02044                 mov             ebx,dword ptr[Bucket]
02045                 or              edi,eax
02046                 mov             ebp,TDest
02047                 and             ebx,BLUEMASK
02048 
02049                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
02050                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
02051 
02052                 mov             si,word ptr[Z32]
02053                 add             TDest,4
02054 
02055                 mov             ecx,pZBufferPtr
02056                 or              edi,ebx
02057 
02058                 cmp             [TempPix],010001h
02059                 je              SkipPixie
02060 
02061                 rol             edi,16
02062 
02063                 cmp             word ptr[ecx],si
02064                 jg              SkipPixie
02065 
02066                 mov             [ecx],si
02067                 mov             dword ptr[ebp],edi
02068                 mov             [ecx+2],si
02069 SkipPixie:
02070                 add             pZBufferPtr,4
02071                 dec             [widTemp]
02072 
02073                 jnz             PixieLoop
02074 
02075                 pop             ebp
02076 
02077                 fstp    [u16]
02078                 fstp    [v16]
02079                 fstp    [u16]
02080                 fstp    [v16]
02081                 fstp    [u16]
02082                 fstp    [v16]
02083 
02084 GouraudReturnNoZ:
02085                 pop             edi
02086                 pop             esi
02087                 pop             ecx
02088                 pop             ebx
02089         }
02090 }
02091 
02092 void    DrawScanLineGouraudZBufferNoZWriteTrans_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
02093 {
02094         TDest   =Dest;
02095         Red             =Green  =0;
02096         _asm
02097         {
02098                 push    ebx
02099                 push    ecx
02100                 push    esi
02101                 push    edi
02102 
02103                 mov             ebx,pLeft
02104                 mov     ecx,pRight
02105                 mov     eax,[ebx]EdgeAsmFPU.X
02106                 mov     edx,[ecx]EdgeAsmFPU.X
02107                 sub     edx,eax
02108                 jle             GouraudReturnNoZ
02109 
02110                 mov             esi,eax
02111                 inc             edx
02112                 shl             eax,1
02113                 add             TDest,eax
02114                 add             pZBufferPtr,eax
02115                 test    esi,1           //dword align left
02116                 jz              NoSinglePixie
02117 
02118                 //odd sized spans write one pixel to dword align
02119                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
02120                 fmul    [Real65536]                                             ; UL16
02121                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
02122                 fmul    [Real65536]                                             ; VL16 UL16
02123                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
02124                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
02125                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
02126                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
02127                 fistp   [u16]                                                   ; GL   RL   VL16 BL
02128                 fxch    st(2)                                                   ; VL16 RL   GL   BL
02129                 fistp   [v16]                                                   ; RL   GL   BL
02130                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
02131                 fistp   [z16]                                                   ; RL   GL   BL
02132 
02133                 mov     [widTemp],edx
02134 
02135                 mov             ecx,[VShift]
02136                 mov             ebx,[GHMaskShifted]
02137 
02138                 mov             esi,[GWMask]
02139                 mov             edi,[v16]
02140 
02141                 mov             edx,dword ptr[u16]
02142 
02143                 shr             edi,cl
02144 
02145                 shr             edx,16
02146                 xor             eax,eax
02147 
02148                 and             edi,ebx
02149                 and             edx,esi
02150 
02151                 add             edi,edx
02152 
02153                 add             edi,GBitPtrHalf
02154                 mov             ax,word ptr[edi*2]
02155 
02156                 mov             word ptr[TempPix],ax
02157 
02158                 mov             ebx,eax
02159                 and             eax,REDMASK
02160 
02161                 mov             ecx,ebx
02162                 and             ebx,GREENMASK
02163 
02164                 mov             dword ptr[Red],eax
02165                 and             ecx,BLUEMASK
02166 
02167                 mov             dword ptr[Green],ebx
02168                 mov             dword ptr[Blue],ecx
02169 
02170                 fimul   dword ptr[Red]                                  ; R    GL   BL
02171                 fxch    st(1)                                                   ; GL   R    BL
02172                 fimul   dword ptr[Green]                                ; G    R    BL
02173                 fxch    st(1)                                                   ; R    G    BL
02174                 fadd    qword ptr[Magic]                                ; Rk   G    BL
02175                 fxch    st(2)                                                   ; BL   G    Rk
02176                 fimul   [Blue]                                                  ; B    G    Rk
02177                 fxch    st(1)                                                   ; G    B    Rk
02178                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
02179                 fxch    st(2)                                                   ; Rk   B    Gk
02180                 fstp    qword ptr[Bucket]                               ; B    Gk
02181                 fadd    qword ptr[Magic]                                ; Bk   Gk
02182                 fxch    st(1)                                                   ; Gk   Bk
02183                 fstp    qword ptr[Bucket2]                              ; Bk
02184 
02185                 mov             edx,dword ptr[Bucket]
02186                 mov             eax,dword ptr[Bucket2]
02187 
02188                 and             edx,REDMASK
02189                 and             eax,GREENMASK
02190 
02191                 fstp    qword ptr[Bucket]
02192 
02193                 mov             ecx,TDest
02194                 mov             ebx,dword ptr[Bucket]
02195 
02196                 mov             esi,[z16]
02197                 and             ebx,BLUEMASK
02198 
02199                 shr             esi,16
02200                 or              edx,eax
02201 
02202                 mov             eax,pZBufferPtr
02203                 add             TDest,2
02204 
02205                 cmp             word ptr[TempPix],01h
02206                 je              SkipSinglePixie
02207 
02208                 cmp             word ptr[eax],si
02209                 jg              SkipSinglePixie
02210 
02211                 or              edx,ebx
02212 
02213                 mov             word ptr[ecx],dx
02214 
02215 SkipSinglePixie:
02216                 mov             ebx,pLeft
02217                 mov     edx,[widTemp]
02218                 add             pZBufferPtr,2
02219                 mov     ecx,pRight
02220                 dec             edx
02221                 jz              GouraudReturnNoZ
02222                 mov             esi,edx
02223                 and             esi,1
02224                 sub             edx,esi
02225                 jz              GouraudReturnNoZ
02226 
02227 NoSinglePixie:
02228                 mov     [widTemp],edx                 ; just for a temp
02229                 shr             edx,1
02230 
02231                 ; try to keep fmul fxch pairs seperated to avoid stalling
02232                 ; calc this scanlines steps           ; FPU Stack
02233                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
02234                 fild    dword ptr [widTemp]           ; WID
02235 
02236                 mov     [widTemp],edx                 ; Color interps doubled
02237 
02238                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
02239                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
02240                 fsub    st(1), st                   ; UL   UD   WID
02241                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
02242                 fxch    st(1)                       ; UL   VR   UD   WID
02243                 fmul    [Real65536]                 ; UL16 VR   UD   WID
02244                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
02245                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
02246                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
02247                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
02248                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
02249                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
02250                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
02251                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
02252                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
02253                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
02254                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
02255                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
02256                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
02257                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
02258                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
02259                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
02260                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
02261 
02262                 //let that cook
02263 
02264                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
02265                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
02266                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
02267                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
02268                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
02269                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
02270                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
02271                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
02272                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
02273                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
02274                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
02275                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
02276                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
02277                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
02278                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
02279                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
02280                 frndint
02281                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
02282                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
02283                 frndint
02284                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
02285                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
02286                 frndint
02287                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
02288                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
02289                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
02290                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
02291                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
02292                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
02293                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
02294                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
02295                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
02296                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
02297                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
02298 
02299                 push    ebp
02300 
02301 PixieLoop:
02302                 mov             ebx,[ZStep]
02303 
02304                 add             [z16],ebx
02305                 mov             ecx,[VShift]
02306 
02307                 mov             edi,[z16]
02308 
02309                 shr             edi,16
02310                 mov             ebx,[GHMaskShifted]
02311 
02312                 mov             ebp,[GWMask]
02313                 mov             edx,dword ptr[u16]
02314 
02315                 mov             word ptr[Z32],di
02316                 mov             eax,edx
02317 
02318                 shr             edx,16
02319                 mov             edi,[v16]
02320 
02321                 add             eax,[UStep]
02322                 mov             esi,edi
02323 
02324                 shr             edi,cl
02325                 add             esi,[VStep]
02326 
02327                 and             edi,ebx
02328                 and             edx,ebp
02329 
02330                 add             edi,edx
02331                 mov             edx,eax
02332 
02333                 add             edi,GBitPtrHalf
02334                 add             eax,[UStep]
02335 
02336                 mov             [u16],eax
02337                 mov             ax,word ptr[edi*2]
02338 
02339                 mov             edi,esi
02340                 add             esi,[VStep]
02341 
02342                 shr             edx,16
02343                 mov             [v16],esi
02344 
02345                 shr             edi,cl
02346                 and             edx,ebp
02347 
02348                 mov             esi,GBitPtrHalf
02349                 and             edi,ebx
02350 
02351                 shl             eax,16
02352                 add             esi,edx
02353 
02354                 add             esi,edi
02355 
02356                 mov             ax,word ptr[esi*2]
02357 
02358                 mov             [TempPix],eax
02359 
02360                 mov             ebx,eax
02361                 and             eax,REDMASK
02362 
02363                 mov             ecx,ebx
02364                 and             ebx,GREENMASK
02365 
02366                 mov             dword ptr[Red],eax
02367                 and             ecx,BLUEMASK
02368 
02369                 mov             dword ptr[Green],ebx
02370                 mov             dword ptr[Blue],ecx
02371 
02372                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
02373                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
02374                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
02375                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
02376                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
02377                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
02378                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
02379                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
02380                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
02381                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
02382                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
02383                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
02384                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
02385                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
02386                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
02387 
02388                 mov             edx,dword ptr[Bucket]
02389                 mov             eax,dword ptr[Bucket2]
02390 
02391                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
02392                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
02393                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
02394                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
02395                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
02396                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
02397 
02398                 and             edx,GREENMASK
02399                 and             eax,REDMASK
02400 
02401                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
02402                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
02403 
02404                 mov             edi,edx
02405                 mov             ebx,dword ptr[Bucket]
02406                 or              edi,eax
02407                 mov             ebp,TDest
02408                 and             ebx,BLUEMASK
02409 
02410                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
02411                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
02412 
02413                 mov             si,word ptr[Z32]
02414                 add             TDest,4
02415 
02416                 mov             ecx,pZBufferPtr
02417                 or              edi,ebx
02418 
02419                 cmp             [TempPix],010001h
02420                 je              SkipPixie
02421 
02422                 rol             edi,16
02423 
02424                 cmp             word ptr[ecx],si
02425                 jg              SkipPixie
02426 
02427                 mov             dword ptr[ebp],edi
02428 SkipPixie:
02429                 add             pZBufferPtr,4
02430                 dec             [widTemp]
02431 
02432                 jnz             PixieLoop
02433 
02434                 pop             ebp
02435 
02436                 fstp    [u16]
02437                 fstp    [v16]
02438                 fstp    [u16]
02439                 fstp    [v16]
02440                 fstp    [u16]
02441                 fstp    [v16]
02442 
02443 GouraudReturnNoZ:
02444                 pop             edi
02445                 pop             esi
02446                 pop             ecx
02447                 pop             ebx
02448         }
02449 }
02450 
02451 void    DrawScanLineGouraudNoZBufferZWriteTrans_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
02452 {
02453         TDest   =Dest;
02454         Red             =Green  =0;
02455         _asm
02456         {
02457                 push    ebx
02458                 push    ecx
02459                 push    esi
02460                 push    edi
02461 
02462                 mov             ebx,pLeft
02463                 mov     ecx,pRight
02464                 mov     eax,[ebx]EdgeAsmFPU.X
02465                 mov     edx,[ecx]EdgeAsmFPU.X
02466                 sub     edx,eax
02467                 jle             GouraudReturnNoZ
02468 
02469                 mov             esi,eax
02470                 inc             edx
02471                 shl             eax,1
02472                 add             TDest,eax
02473                 add             pZBufferPtr,eax
02474                 test    esi,1           //dword align left
02475                 jz              NoSinglePixie
02476 
02477                 //odd sized spans write one pixel to dword align
02478                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
02479                 fmul    [Real65536]                                             ; UL16
02480                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
02481                 fmul    [Real65536]                                             ; VL16 UL16
02482                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
02483                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
02484                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
02485                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
02486                 fistp   [u16]                                                   ; GL   RL   VL16 BL
02487                 fxch    st(2)                                                   ; VL16 RL   GL   BL
02488                 fistp   [v16]                                                   ; RL   GL   BL
02489                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
02490                 fistp   [z16]                                                   ; RL   GL   BL
02491 
02492                 mov     [widTemp],edx
02493 
02494                 mov             ecx,[VShift]
02495                 mov             ebx,[GHMaskShifted]
02496 
02497                 mov             esi,[GWMask]
02498                 mov             edi,[v16]
02499 
02500                 mov             edx,dword ptr[u16]
02501 
02502                 shr             edi,cl
02503 
02504                 shr             edx,16
02505                 xor             eax,eax
02506 
02507                 and             edi,ebx
02508                 and             edx,esi
02509 
02510                 add             edi,edx
02511 
02512                 add             edi,GBitPtrHalf
02513                 mov             ax,word ptr[edi*2]
02514 
02515                 mov             word ptr[TempPix],ax
02516 
02517                 mov             ebx,eax
02518                 and             eax,REDMASK
02519 
02520                 mov             ecx,ebx
02521                 and             ebx,GREENMASK
02522 
02523                 mov             dword ptr[Red],eax
02524                 and             ecx,BLUEMASK
02525 
02526                 mov             dword ptr[Green],ebx
02527                 mov             dword ptr[Blue],ecx
02528 
02529                 fimul   dword ptr[Red]                                  ; R    GL   BL
02530                 fxch    st(1)                                                   ; GL   R    BL
02531                 fimul   dword ptr[Green]                                ; G    R    BL
02532                 fxch    st(1)                                                   ; R    G    BL
02533                 fadd    qword ptr[Magic]                                ; Rk   G    BL
02534                 fxch    st(2)                                                   ; BL   G    Rk
02535                 fimul   [Blue]                                                  ; B    G    Rk
02536                 fxch    st(1)                                                   ; G    B    Rk
02537                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
02538                 fxch    st(2)                                                   ; Rk   B    Gk
02539                 fstp    qword ptr[Bucket]                               ; B    Gk
02540                 fadd    qword ptr[Magic]                                ; Bk   Gk
02541                 fxch    st(1)                                                   ; Gk   Bk
02542                 fstp    qword ptr[Bucket2]                              ; Bk
02543 
02544                 mov             edx,dword ptr[Bucket]
02545                 mov             eax,dword ptr[Bucket2]
02546 
02547                 and             edx,REDMASK
02548                 and             eax,GREENMASK
02549 
02550                 fstp    qword ptr[Bucket]
02551 
02552                 mov             ecx,TDest
02553                 mov             ebx,dword ptr[Bucket]
02554 
02555                 mov             esi,[z16]
02556                 and             ebx,BLUEMASK
02557 
02558                 shr             esi,16
02559                 or              edx,eax
02560 
02561                 mov             eax,pZBufferPtr
02562                 add             TDest,2
02563 
02564                 cmp             word ptr[TempPix],01h
02565                 je              SkipSinglePixie
02566 
02567                 or              edx,ebx
02568                 mov             word ptr[eax],si
02569 
02570                 mov             word ptr[ecx],dx
02571 
02572 SkipSinglePixie:
02573                 mov             ebx,pLeft
02574                 mov     edx,[widTemp]
02575                 add             pZBufferPtr,2
02576                 mov     ecx,pRight
02577                 dec             edx
02578                 jz              GouraudReturnNoZ
02579                 mov             esi,edx
02580                 and             esi,1
02581                 sub             edx,esi
02582                 jz              GouraudReturnNoZ
02583 
02584 NoSinglePixie:
02585                 mov     [widTemp],edx                 ; just for a temp
02586                 shr             edx,1
02587 
02588                 ; try to keep fmul fxch pairs seperated to avoid stalling
02589                 ; calc this scanlines steps           ; FPU Stack
02590                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
02591                 fild    dword ptr [widTemp]           ; WID
02592 
02593                 mov     [widTemp],edx                 ; Color interps doubled
02594 
02595                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
02596                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
02597                 fsub    st(1), st                   ; UL   UD   WID
02598                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
02599                 fxch    st(1)                       ; UL   VR   UD   WID
02600                 fmul    [Real65536]                 ; UL16 VR   UD   WID
02601                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
02602                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
02603                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
02604                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
02605                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
02606                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
02607                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
02608                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
02609                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
02610                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
02611                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
02612                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
02613                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
02614                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
02615                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
02616                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
02617                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
02618 
02619                 //let that cook
02620 
02621                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
02622                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
02623                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
02624                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
02625                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
02626                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
02627                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
02628                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
02629                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
02630                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
02631                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
02632                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
02633                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
02634                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
02635                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
02636                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
02637                 frndint
02638                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
02639                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
02640                 frndint
02641                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
02642                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
02643                 frndint
02644                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
02645                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
02646                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
02647                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
02648                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
02649                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
02650                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
02651                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
02652                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
02653                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
02654                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
02655 
02656                 push    ebp
02657 
02658 PixieLoop:
02659                 mov             ebx,[ZStep]
02660 
02661                 add             [z16],ebx
02662                 mov             ecx,[VShift]
02663 
02664                 mov             edi,[z16]
02665 
02666                 shr             edi,16
02667                 mov             ebx,[GHMaskShifted]
02668 
02669                 mov             ebp,[GWMask]
02670                 mov             edx,dword ptr[u16]
02671 
02672                 mov             word ptr[Z32],di
02673                 mov             eax,edx
02674 
02675                 shr             edx,16
02676                 mov             edi,[v16]
02677 
02678                 add             eax,[UStep]
02679                 mov             esi,edi
02680 
02681                 shr             edi,cl
02682                 add             esi,[VStep]
02683 
02684                 and             edi,ebx
02685                 and             edx,ebp
02686 
02687                 add             edi,edx
02688                 mov             edx,eax
02689 
02690                 add             edi,GBitPtrHalf
02691                 add             eax,[UStep]
02692 
02693                 mov             [u16],eax
02694                 mov             ax,word ptr[edi*2]
02695 
02696                 mov             edi,esi
02697                 add             esi,[VStep]
02698 
02699                 shr             edx,16
02700                 mov             [v16],esi
02701 
02702                 shr             edi,cl
02703                 and             edx,ebp
02704 
02705                 mov             esi,GBitPtrHalf
02706                 and             edi,ebx
02707 
02708                 shl             eax,16
02709                 add             esi,edx
02710 
02711                 add             esi,edi
02712 
02713                 mov             ax,word ptr[esi*2]
02714 
02715                 mov             [TempPix],eax
02716 
02717                 mov             ebx,eax
02718                 and             eax,REDMASK
02719 
02720                 mov             ecx,ebx
02721                 and             ebx,GREENMASK
02722 
02723                 mov             dword ptr[Red],eax
02724                 and             ecx,BLUEMASK
02725 
02726                 mov             dword ptr[Green],ebx
02727                 mov             dword ptr[Blue],ecx
02728 
02729                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
02730                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
02731                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
02732                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
02733                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
02734                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
02735                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
02736                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
02737                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
02738                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
02739                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
02740                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
02741                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
02742                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
02743                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
02744 
02745                 mov             edx,dword ptr[Bucket]
02746                 mov             eax,dword ptr[Bucket2]
02747 
02748                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
02749                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
02750                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
02751                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
02752                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
02753                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
02754 
02755                 and             edx,GREENMASK
02756                 and             eax,REDMASK
02757 
02758                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
02759                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
02760 
02761                 mov             edi,edx
02762                 mov             ebx,dword ptr[Bucket]
02763                 or              edi,eax
02764                 mov             ebp,TDest
02765                 and             ebx,BLUEMASK
02766 
02767                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
02768                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
02769 
02770                 mov             si,word ptr[Z32]
02771                 add             TDest,4
02772 
02773                 mov             ecx,pZBufferPtr
02774                 or              edi,ebx
02775 
02776                 cmp             [TempPix],010001h
02777                 je              SkipPixie
02778 
02779                 mov             [ecx],si
02780                 rol             edi,16
02781 
02782                 mov             dword ptr[ebp],edi
02783                 mov             [ecx+2],si
02784 SkipPixie:
02785                 add             pZBufferPtr,4
02786                 dec             [widTemp]
02787 
02788                 jnz             PixieLoop
02789 
02790                 pop             ebp
02791 
02792                 fstp    [u16]
02793                 fstp    [v16]
02794                 fstp    [u16]
02795                 fstp    [v16]
02796                 fstp    [u16]
02797                 fstp    [v16]
02798 
02799 GouraudReturnNoZ:
02800                 pop             edi
02801                 pop             esi
02802                 pop             ecx
02803                 pop             ebx
02804         }
02805 }
02806 
02807 void    DrawScanLineGouraudNoZSolid_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
02808 {
02809         TDest   =Dest;
02810         Red             =Green  =0;
02811         _asm
02812         {
02813                 push    ebx
02814                 push    ecx
02815                 push    esi
02816                 push    edi
02817 
02818                 mov             ebx,pLeft
02819                 mov     ecx,pRight
02820                 mov     eax,[ebx]EdgeAsmFPU.X
02821                 mov     edx,[ecx]EdgeAsmFPU.X
02822                 sub     edx,eax
02823                 jle             GouraudReturnNoZ
02824 
02825                 mov             esi,eax
02826                 inc             edx
02827                 shl             eax,1
02828                 add             TDest,eax
02829                 test    esi,1                                   //dword align left side
02830                 jz              NoSinglePixie
02831 
02832                 //odd sized spans write one pixel to dword align
02833                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
02834                 fmul    dword ptr[BlueMask]
02835                 fadd    qword ptr[Magic]                                ; Bk
02836                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
02837                 fmul    dword ptr[GreenMask]
02838                 fadd    qword ptr[Magic]                                ; Gk   Bk
02839                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
02840                 fmul    dword ptr[MiniRedMask]
02841                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
02842                 fxch    st(2)                                                   ; Bk   Gk   Rk
02843                 fstp    qword ptr[Bucket]                               ; Gk   Rk
02844                 fstp    qword ptr[Bucket2]                              ; Rk
02845 
02846                 mov             esi,dword ptr[Bucket]
02847                 mov             eax,dword ptr[Bucket2]
02848 
02849                 and             esi,BLUEMASK
02850                 and             eax,GREENMASK
02851 
02852                 fstp    qword ptr[Bucket]
02853 
02854                 mov             ecx,TDest
02855                 mov             ebx,dword ptr[Bucket]
02856 
02857                 and             ebx,REDMASK
02858                 or              esi,eax
02859 
02860                 add             TDest,2
02861                 or              esi,ebx
02862 
02863                 mov             ebx,pLeft
02864                 mov             word ptr[ecx],si
02865 
02866                 mov             ecx,pRight
02867                 dec             edx
02868 
02869                 jz              GouraudReturnNoZ
02870                 mov             esi,edx
02871                 and             esi,1
02872                 sub             edx,esi
02873                 jz              GouraudReturnNoZ
02874 
02875 NoSinglePixie:
02876                 shr             edx,1
02877                 fld1
02878                 mov     [widTemp],edx                 ; just for a temp
02879                 
02880 
02881                 ; try to keep fmul fxch pairs seperated to avoid stalling
02882                 ; calc this scanlines steps                             ; FPU Stack
02883                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
02884                 fidiv   dword ptr [widTemp]                             ; WID
02885                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
02886                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
02887                 fsub    st(1),st                                                ; RL   RD   WID
02888                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
02889                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
02890                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
02891                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
02892                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
02893                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
02894                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
02895                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
02896                 frndint
02897                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
02898                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
02899                 frndint
02900                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
02901                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
02902                 frndint
02903                 fld             qword ptr[RedMask]                              ; rm   BI   GL   RI   RL   BL   GI
02904                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
02905                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
02906                 fld             dword ptr[GreenMask]                    ; gm   BI   GL   RI   RL   BL   GI
02907                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
02908                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
02909                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
02910                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
02911                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
02912 
02913 PixieLoop:
02914 
02915                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
02916                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
02917                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
02918                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
02919                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
02920                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
02921                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
02922                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
02923                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
02924 
02925                 mov             ecx,dword ptr[Bucket]
02926                 mov             eax,dword ptr[Bucket2]
02927 
02928                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
02929                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
02930 
02931                 and             ecx,REDMASK
02932                 and             eax,GREENMASK
02933 
02934                 mov             ebx,dword ptr[Bucket]
02935                 or              ecx,eax
02936 
02937                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
02938                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
02939                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
02940                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
02941                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
02942                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
02943 
02944                 and             ebx,BLUEMASK
02945                 mov             edi,TDest
02946 
02947                 or              ecx,ebx
02948                 add             TDest,4
02949 
02950                 rol             ecx,16
02951 
02952                 mov             [edi],ecx
02953                 dec             edx
02954 
02955                 jnz             PixieLoop
02956 
02957 
02958                 fstp    [u16]
02959                 fstp    [v16]
02960                 fstp    [u16]
02961                 fstp    [v16]
02962                 fstp    [u16]
02963                 fstp    [v16]
02964 
02965 GouraudReturnNoZ:
02966                 pop             edi
02967                 pop             esi
02968                 pop             ecx
02969                 pop             ebx
02970         }
02971 }
02972 
02973 void    DrawScanLineGouraudNoZBufferZWriteSolid_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
02974 {
02975         TDest   =Dest;
02976         Red             =Green  =0;
02977         _asm
02978         {
02979                 push    ebx
02980                 push    ecx
02981                 push    esi
02982                 push    edi
02983 
02984                 mov             ebx,pLeft
02985                 mov     ecx,pRight
02986                 mov     eax,[ebx]EdgeAsmFPU.X
02987                 mov     edx,[ecx]EdgeAsmFPU.X
02988                 sub     edx,eax
02989                 jle             GouraudReturnNoZ
02990 
02991                 mov             esi,eax
02992                 inc             edx
02993                 shl             eax,1
02994                 add             TDest,eax
02995                 add             pZBufferPtr,eax
02996                 test    esi,1                                   //dword align left side
02997                 jz              NoSinglePixie
02998 
02999                 //odd sized spans write one pixel to dword align
03000                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
03001                 fmul    dword ptr[BlueMask]
03002                 fadd    qword ptr[Magic]                                ; Bk
03003                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
03004                 fmul    dword ptr[GreenMask]
03005                 fadd    qword ptr[Magic]                                ; Gk   Bk
03006                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
03007                 fmul    dword ptr[MiniRedMask]
03008                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
03009                 fxch    st(2)                                                   ; Bk   Gk   Rk
03010                 fstp    qword ptr[Bucket]                               ; Gk   Rk
03011                 fstp    qword ptr[Bucket2]                              ; Rk
03012                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z
03013                 fistp   [z16]                                                   ;
03014 
03015                 mov             esi,dword ptr[Bucket]
03016                 mov             eax,dword ptr[Bucket2]
03017 
03018                 and             esi,BLUEMASK
03019                 and             eax,GREENMASK
03020 
03021                 fstp    qword ptr[Bucket]
03022 
03023                 mov             ecx,TDest
03024                 mov             ebx,dword ptr[Bucket]
03025 
03026                 and             ebx,REDMASK
03027                 or              esi,eax
03028 
03029                 mov             edi,[z16]
03030                 mov             eax,pZBufferPtr
03031 
03032                 add             TDest,2
03033                 or              esi,ebx
03034 
03035                 shr             edi,16
03036                 mov             ebx,pLeft
03037 
03038                 mov             word ptr[eax],di
03039                 mov             word ptr[ecx],si
03040 
03041                 mov             ecx,pRight
03042                 dec             edx
03043 
03044                 jz              GouraudReturnNoZ
03045                 mov             esi,edx
03046                 add             pZBufferPtr,2
03047                 and             esi,1
03048                 sub             edx,esi
03049                 jz              GouraudReturnNoZ
03050 
03051 NoSinglePixie:
03052                 shr             edx,1
03053                 fld1
03054                 mov     [widTemp],edx                 ; just for a temp
03055                 
03056 
03057                 ; try to keep fmul fxch pairs seperated to avoid stalling
03058                 ; calc this scanlines steps                             ; FPU Stack
03059                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
03060                 fidiv   dword ptr [widTemp]                             ; WID
03061                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
03062                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
03063                 fsub    st(1),st                                                ; RL   RD   WID
03064                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
03065                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
03066                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
03067                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
03068                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
03069                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
03070                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
03071                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
03072                 frndint
03073                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
03074                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
03075                 frndint
03076                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
03077                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
03078                 frndint
03079                 fld             qword ptr[RedMask]                              ; rm   BI   GL   RI   RL   BL   GI
03080                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
03081                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
03082                 fld             dword ptr[GreenMask]                    ; gm   BI   GL   RI   RL   BL   GI
03083                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
03084                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
03085                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
03086                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
03087                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
03088                 fld             [ecx]EdgeAsmFPU.z                               ; rz   BI   GL   RI   RL   BL   GI
03089                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   BI   GL   RI   RL   BL   GI
03090                 fld             [ebx]EdgeAsmFPU.z                               ; lz   zd   BI   GL   RI   RL   BL   GI
03091                 fistp   [z16]                                                   ; zd   BI   GL   RI   RL   BL   GI
03092                 fistp   [ZStep]                                                 ; BI   GL   RI   RL   BL   GI
03093 
03094 PixieLoop:
03095 
03096                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
03097                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
03098                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
03099                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
03100                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
03101                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
03102 
03103                 mov             edi,[z16]
03104                 mov             esi,pZBufferPtr
03105 
03106                 shr             edi,16
03107                 mov             ebx,[ZStep]
03108 
03109                 mov             word ptr[esi],di
03110                 add             [z16],ebx
03111 
03112                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
03113                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
03114                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
03115 
03116                 mov             word ptr[esi+2],di
03117 
03118                 mov             ecx,dword ptr[Bucket]
03119                 mov             eax,dword ptr[Bucket2]
03120 
03121                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
03122                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
03123 
03124                 and             ecx,REDMASK
03125                 and             eax,GREENMASK
03126 
03127                 mov             ebx,dword ptr[Bucket]
03128                 or              ecx,eax
03129 
03130                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
03131                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
03132                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
03133                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
03134                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
03135                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
03136 
03137                 and             ebx,BLUEMASK
03138                 mov             edi,TDest
03139 
03140                 or              ecx,ebx
03141                 add             TDest,4
03142 
03143                 rol             ecx,16
03144 
03145                 mov             [edi],ecx
03146 
03147                 add             pZBufferPtr,4
03148 
03149                 dec             edx
03150 
03151                 jnz             PixieLoop
03152 
03153 
03154                 fstp    [u16]
03155                 fstp    [v16]
03156                 fstp    [u16]
03157                 fstp    [v16]
03158                 fstp    [u16]
03159                 fstp    [v16]
03160 
03161 GouraudReturnNoZ:
03162                 pop             edi
03163                 pop             esi
03164                 pop             ecx
03165                 pop             ebx
03166         }
03167 }
03168 
03169 void    DrawScanLineGouraudZBufferSolid_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
03170 {
03171         TDest   =Dest;
03172         Red             =Green  =0;
03173         _asm
03174         {
03175                 push    ebx
03176                 push    ecx
03177                 push    esi
03178                 push    edi
03179 
03180                 mov             ebx,pLeft
03181                 mov     ecx,pRight
03182                 mov     eax,[ebx]EdgeAsmFPU.X
03183                 mov     edx,[ecx]EdgeAsmFPU.X
03184                 sub     edx,eax
03185                 jle             GouraudReturnNoZ
03186 
03187                 mov             esi,eax
03188                 inc             edx
03189                 shl             eax,1
03190                 add             TDest,eax
03191                 add             pZBufferPtr,eax
03192                 test    esi,1                                   //dword align left side
03193                 jz              NoSinglePixie
03194 
03195                 //odd sized spans write one pixel to dword align
03196                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
03197                 fmul    dword ptr[BlueMask]
03198                 fadd    qword ptr[Magic]                                ; Bk
03199                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
03200                 fmul    dword ptr[GreenMask]
03201                 fadd    qword ptr[Magic]                                ; Gk   Bk
03202                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
03203                 fmul    dword ptr[MiniRedMask]
03204                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
03205                 fxch    st(2)                                                   ; Bk   Gk   Rk
03206                 fstp    qword ptr[Bucket]                               ; Gk   Rk
03207                 fstp    qword ptr[Bucket2]                              ; Rk
03208                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z
03209                 fistp   [z16]                                                   ;
03210 
03211                 mov             esi,dword ptr[Bucket]
03212                 mov             eax,dword ptr[Bucket2]
03213 
03214                 and             esi,BLUEMASK
03215                 and             eax,GREENMASK
03216 
03217                 fstp    qword ptr[Bucket]
03218 
03219                 mov             ecx,TDest
03220                 mov             ebx,dword ptr[Bucket]
03221 
03222                 and             ebx,REDMASK
03223                 or              esi,eax
03224 
03225                 mov             edi,[z16]
03226                 mov             eax,pZBufferPtr
03227 
03228                 add             TDest,2
03229                 or              esi,ebx
03230 
03231                 shr             edi,16
03232                 mov             ebx,pLeft
03233 
03234                 cmp             word ptr[eax],di
03235                 jg              SkipSinglePixie
03236 
03237                 mov             word ptr[eax],di
03238                 mov             word ptr[ecx],si
03239 
03240 SkipSinglePixie:
03241                 mov             ecx,pRight
03242                 add             pZBufferPtr,2
03243                 dec             edx
03244 
03245                 jz              GouraudReturnNoZ
03246                 mov             esi,edx
03247                 and             esi,1
03248                 sub             edx,esi
03249                 jz              GouraudReturnNoZ
03250 
03251 NoSinglePixie:
03252                 shr             edx,1
03253                 fld1
03254                 mov     [widTemp],edx                 ; just for a temp
03255                 
03256 
03257                 ; try to keep fmul fxch pairs seperated to avoid stalling
03258                 ; calc this scanlines steps                             ; FPU Stack
03259                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
03260                 fidiv   dword ptr [widTemp]                             ; WID
03261                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
03262                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
03263                 fsub    st(1),st                                                ; RL   RD   WID
03264                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
03265                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
03266                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
03267                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
03268                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
03269                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
03270                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
03271                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
03272                 frndint
03273                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
03274                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
03275                 frndint
03276                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
03277                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
03278                 frndint
03279                 fld             qword ptr[RedMask]                              ; rm   BI   GL   RI   RL   BL   GI
03280                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
03281                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
03282                 fld             dword ptr[GreenMask]                    ; gm   BI   GL   RI   RL   BL   GI
03283                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
03284                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
03285                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
03286                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
03287                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
03288                 fld             [ecx]EdgeAsmFPU.z                               ; rz   BI   GL   RI   RL   BL   GI
03289                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   BI   GL   RI   RL   BL   GI
03290                 fld             [ebx]EdgeAsmFPU.z                               ; lz   zd   BI   GL   RI   RL   BL   GI
03291                 fistp   [z16]                                                   ; zd   BI   GL   RI   RL   BL   GI
03292                 fistp   [ZStep]                                                 ; BI   GL   RI   RL   BL   GI
03293 
03294 PixieLoop:
03295 
03296                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
03297                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
03298                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
03299                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
03300                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
03301                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
03302                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
03303                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
03304                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
03305 
03306                 mov             ecx,dword ptr[Bucket]
03307                 mov             eax,dword ptr[Bucket2]
03308 
03309                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
03310                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
03311 
03312                 and             ecx,REDMASK
03313                 and             eax,GREENMASK
03314 
03315                 mov             ebx,dword ptr[Bucket]
03316                 or              ecx,eax
03317 
03318                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
03319                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
03320                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
03321                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
03322                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
03323                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
03324 
03325                 and             ebx,BLUEMASK
03326                 mov             edi,TDest
03327 
03328                 or              ecx,ebx
03329                 add             TDest,4
03330 
03331                 mov             eax,[z16]
03332                 mov             esi,pZBufferPtr
03333 
03334                 shr             eax,16
03335                 mov             ebx,[ZStep]
03336 
03337                 cmp             word ptr[esi],ax
03338                 jg              SkipPixie
03339 
03340                 mov             word ptr[esi],ax
03341                 rol             ecx,16
03342 
03343                 add             [z16],ebx
03344                 mov             word ptr[esi+2],ax
03345 
03346                 mov             [edi],ecx
03347 SkipPixie:
03348                 add             pZBufferPtr,4
03349                 dec             edx
03350 
03351                 jnz             PixieLoop
03352 
03353 
03354                 fstp    [u16]
03355                 fstp    [v16]
03356                 fstp    [u16]
03357                 fstp    [v16]
03358                 fstp    [u16]
03359                 fstp    [v16]
03360 
03361 GouraudReturnNoZ:
03362                 pop             edi
03363                 pop             esi
03364                 pop             ecx
03365                 pop             ebx
03366         }
03367 }
03368 
03369 void    DrawScanLineGouraudZBufferNoZWriteSolid_AsmX86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
03370 {
03371         TDest   =Dest;
03372         Red             =Green  =0;
03373         _asm
03374         {
03375                 push    ebx
03376                 push    ecx
03377                 push    esi
03378                 push    edi
03379 
03380                 mov             ebx,pLeft
03381                 mov     ecx,pRight
03382                 mov     eax,[ebx]EdgeAsmFPU.X
03383                 mov     edx,[ecx]EdgeAsmFPU.X
03384                 sub     edx,eax
03385                 jle             GouraudReturnNoZ
03386 
03387                 mov             esi,eax
03388                 inc             edx
03389                 shl             eax,1
03390                 add             TDest,eax
03391                 add             pZBufferPtr,eax
03392                 test    esi,1                                   //dword align left side
03393                 jz              NoSinglePixie
03394 
03395                 //odd sized spans write one pixel to dword align
03396                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
03397                 fmul    dword ptr[BlueMask]
03398                 fadd    qword ptr[Magic]                                ; Bk
03399                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
03400                 fmul    dword ptr[GreenMask]
03401                 fadd    qword ptr[Magic]                                ; Gk   Bk
03402                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
03403                 fmul    dword ptr[MiniRedMask]
03404                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
03405                 fxch    st(2)                                                   ; Bk   Gk   Rk
03406                 fstp    qword ptr[Bucket]                               ; Gk   Rk
03407                 fstp    qword ptr[Bucket2]                              ; Rk
03408                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z
03409                 fistp   [z16]                                                   ;
03410 
03411                 mov             esi,dword ptr[Bucket]
03412                 mov             eax,dword ptr[Bucket2]
03413 
03414                 and             esi,BLUEMASK
03415                 and             eax,GREENMASK
03416 
03417                 fstp    qword ptr[Bucket]
03418 
03419                 mov             ecx,TDest
03420                 mov             ebx,dword ptr[Bucket]
03421 
03422                 and             ebx,REDMASK
03423                 or              esi,eax
03424 
03425                 mov             edi,[z16]
03426                 mov             eax,pZBufferPtr
03427 
03428                 add             TDest,2
03429                 or              esi,ebx
03430 
03431                 shr             edi,16
03432                 mov             ebx,pLeft
03433 
03434                 cmp             word ptr[eax],di
03435                 jg              SkipSinglePixie
03436 
03437                 mov             word ptr[ecx],si
03438 
03439 SkipSinglePixie:
03440                 mov             ecx,pRight
03441                 add             pZBufferPtr,2
03442                 dec             edx
03443 
03444                 jz              GouraudReturnNoZ
03445                 mov             esi,edx
03446                 and             esi,1
03447                 sub             edx,esi
03448                 jz              GouraudReturnNoZ
03449 
03450 NoSinglePixie:
03451                 shr             edx,1
03452                 fld1
03453                 mov     [widTemp],edx                 ; just for a temp
03454                 
03455 
03456                 ; try to keep fmul fxch pairs seperated to avoid stalling
03457                 ; calc this scanlines steps                             ; FPU Stack
03458                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
03459                 fidiv   dword ptr [widTemp]                             ; WID
03460                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
03461                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
03462                 fsub    st(1),st                                                ; RL   RD   WID
03463                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
03464                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
03465                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
03466                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
03467                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
03468                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
03469                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
03470                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
03471                 frndint
03472                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
03473                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
03474                 frndint
03475                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
03476                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
03477                 frndint
03478                 fld             qword ptr[RedMask]                              ; rm   BI   GL   RI   RL   BL   GI
03479                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
03480                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
03481                 fld             dword ptr[GreenMask]                    ; gm   BI   GL   RI   RL   BL   GI
03482                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
03483                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
03484                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
03485                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
03486                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
03487                 fld             [ecx]EdgeAsmFPU.z                               ; rz   BI   GL   RI   RL   BL   GI
03488                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   BI   GL   RI   RL   BL   GI
03489                 fld             [ebx]EdgeAsmFPU.z                               ; lz   zd   BI   GL   RI   RL   BL   GI
03490                 fistp   [z16]                                                   ; zd   BI   GL   RI   RL   BL   GI
03491                 fistp   [ZStep]                                                 ; BI   GL   RI   RL   BL   GI
03492 
03493 PixieLoop:
03494 
03495                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
03496                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
03497                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
03498                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
03499                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
03500                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
03501                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
03502                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
03503                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
03504 
03505                 mov             ecx,dword ptr[Bucket]
03506                 mov             eax,dword ptr[Bucket2]
03507 
03508                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
03509                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
03510 
03511                 and             ecx,REDMASK
03512                 and             eax,GREENMASK
03513 
03514                 mov             ebx,dword ptr[Bucket]
03515                 or              ecx,eax
03516 
03517                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
03518                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
03519                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
03520                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
03521                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
03522                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
03523 
03524                 and             ebx,BLUEMASK
03525                 mov             edi,TDest
03526 
03527                 or              ecx,ebx
03528                 add             TDest,4
03529 
03530                 mov             eax,[z16]
03531                 mov             esi,pZBufferPtr
03532 
03533                 shr             eax,16
03534                 mov             ebx,[ZStep]
03535 
03536                 cmp             word ptr[esi],ax
03537                 jg              SkipPixie
03538 
03539                 rol             ecx,16
03540                 add             [z16],ebx
03541 
03542                 mov             [edi],ecx
03543 SkipPixie:
03544                 add             pZBufferPtr,4
03545                 dec             edx
03546 
03547                 jnz             PixieLoop
03548 
03549 
03550                 fstp    [u16]
03551                 fstp    [v16]
03552                 fstp    [u16]
03553                 fstp    [v16]
03554                 fstp    [u16]
03555                 fstp    [v16]
03556 
03557 GouraudReturnNoZ:
03558                 pop             edi
03559                 pop             esi
03560                 pop             ecx
03561                 pop             ebx
03562         }
03563 }
03564 
03565 void DrawSpan16_AsmLitX86FPU(int32 x1, int32 x2, int32 y)
03566 {
03567         _asm
03568         {
03569                 push    ebx
03570                 push    ecx
03571                 push    esi
03572                 push    edi
03573 
03574                 mov             eax,x1
03575                 mov             ecx,x2
03576                 sub             ecx,eax
03577                 jle             Return16
03578 
03579                 mov             edi,[GBitPtr16]
03580                 mov             pTex,edi
03581 
03582                 fild    [y]                                             ; y
03583 
03584                 mov             edi, ClientWindow.Buffer
03585                 mov             eax, y
03586                 imul    eax, ClientWindow.Width
03587                 add             eax, x1
03588                 shl             eax, 1
03589                 add             edi, eax
03590                 mov             eax,ecx
03591                 shr             ecx,4
03592                 and             eax,15
03593                 _emit 75h
03594                 _emit 06h
03595                 dec             ecx
03596                 mov             eax,16
03597 
03598                 mov             [NumASpans],ecx
03599                 mov             [RemainingCount],eax
03600 
03601                 fild [x1]                                               ; x    y
03602 
03603                 //decoder won't keep up with these huge instructions
03604                 //need to find some int instructions to cram in here somewhere
03605                 fld             [UDivZStepY]                    ; UZdY x    y
03606                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
03607                 fmul    st,st(2)                                ; UZX  UZdY x    y
03608                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
03609                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
03610                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
03611                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
03612                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
03613                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
03614                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
03615                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
03616                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
03617                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
03618                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
03619                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
03620                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
03621                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
03622                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
03623                 faddp   st(1),st                                ; VZ   UZ   ZX   y
03624                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
03625                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
03626                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
03627                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
03628 
03629                 //room for two cycles of int instructions here
03630 
03631                 faddp   st(3),st                                ; UZ   VZ   Zi
03632                 fld1                                                    ; 1    UZ   VZ   Zi
03633                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
03634 
03635                 //room for 18 cycles of int instructions here
03636 
03637                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
03638                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
03639                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
03640                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
03641                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
03642                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
03643                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
03644                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
03645                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
03646                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
03647                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
03648                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
03649 
03650                 //room for 18 cycles of int stuff here
03651 
03652                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
03653                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
03654                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
03655                 //fmul stall one cycle
03656                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
03657 
03658                 test    ecx,ecx
03659                 jz              HandleLeftoverPixels16
03660 
03661 SpanLoop16:
03662                 //need one more stack spot
03663                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
03664                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
03665                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
03666                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
03667                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
03668                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
03669                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
03670                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
03671                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
03672                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
03673 
03674                 mov             ebx,dword ptr[Bucket]
03675                 mov             eax,dword ptr[Bucket2]
03676 
03677                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
03678                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
03679 
03680                 add             ebx,dword ptr[UAdjust]
03681                 add             eax,dword ptr[UAdjustL]
03682 
03683                 mov             [U1],ebx
03684                 mov             [UFixed],eax
03685 
03686                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
03687                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
03688                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
03689                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
03690                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
03691                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
03692                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
03693                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
03694 
03695                 mov             ebx,dword ptr[Bucket]
03696                 mov             eax,dword ptr[Bucket2]
03697 
03698                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
03699 
03700                 add             ebx,dword ptr[VAdjust]
03701                 add             eax,dword ptr[VAdjustL]
03702 
03703                 mov             [V1],ebx
03704                 mov             [VFixed],eax
03705 
03706                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
03707                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
03708                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
03709                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
03710                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
03711                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
03712                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
03713                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
03714                 //gotta do this to get em lined back up right
03715                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
03716                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
03717 
03718                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
03719                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
03720                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
03721                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
03722                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
03723                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
03724                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
03725                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
03726                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
03727                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
03728 
03729                 // Clamp U/V
03730                 mov             ebx,[UFixed]
03731                 cmp             ebx,MaxU
03732                 jle             TryClampU016
03733                 mov             ecx,MaxU
03734                 mov             dword ptr[UFixed],ecx
03735                 jmp             NoClampU016
03736 
03737 TryClampU016:
03738                 cmp             ebx,0
03739                 jge             NoClampU016
03740                 mov             dword ptr[UFixed],0
03741 NoClampU016:
03742                 mov             eax,[VFixed]
03743                 cmp             eax,MaxV
03744                 jle             TryClampV016
03745                 mov             ecx,MaxV
03746                 mov             dword ptr[VFixed],ecx
03747                 jmp             NoClampV016
03748 
03749 TryClampV016:
03750                 cmp             eax,0
03751                 jge             NoClampV016
03752                 mov             dword ptr[VFixed],0
03753 
03754 NoClampV016:
03755 
03756 
03757                 mov esi,dword ptr[UFixed]
03758                 mov eax,dword ptr[VFixed]
03759 
03760 
03761                 mov ecx, GMipLevel4_8
03762                 sar esi, cl
03763                 sar eax, cl
03764                 and esi, 0ffh
03765                 and eax, 0ffh
03766                 mov UDist, esi
03767                 mov VDist, eax
03768 
03769                 mov esi,dword ptr[UFixed]
03770                 mov eax,dword ptr[VFixed]
03771                 mov ecx, GMipLevel20
03772                 shr esi, cl
03773                 shr eax, cl
03774 
03775                 imul eax, GLightWidth
03776                 add esi, eax
03777 
03778                 mov edx, esi
03779                 shl esi, 1
03780                 add edx, esi
03781 
03782                 add edx, GLightData
03783 
03784                 // Interpolate accross top
03785                 xor ecx, ecx
03786                 mov cl, [edx+3]
03787                 mov eax, ecx
03788                 mov cl, [edx+0]
03789                 sub eax, ecx
03790                 imul eax, UDist
03791                 shl ecx, 8
03792                 add eax, ecx
03793                 mov [R1], eax
03794 
03795                 xor ecx, ecx
03796                 mov cl, [edx+4]
03797                 mov eax, ecx
03798                 mov cl, [edx+1]
03799                 sub eax, ecx
03800                 imul eax, UDist
03801                 shl ecx, 8
03802                 add eax, ecx
03803                 mov [G1], eax
03804 
03805                 xor ecx, ecx
03806                 mov cl, [edx+5]
03807                 mov eax, ecx
03808                 mov cl, [edx+2]
03809                 sub eax, ecx
03810                 imul eax, UDist
03811                 shl ecx, 8
03812                 add eax, ecx
03813                 mov [B1], eax
03814 
03815                 add edx, GLightWidth
03816                 add edx, GLightWidth
03817                 add edx, GLightWidth
03818 
03819                 // Interpolate accross bottom
03820                 xor ecx, ecx
03821                 mov cl, [edx+3]
03822                 mov eax, ecx
03823                 mov cl, [edx+0]
03824                 sub eax, ecx
03825                 imul eax, UDist
03826                 shl ecx, 8
03827                 add eax, ecx
03828                 mov [R2], eax
03829 
03830                 xor ecx, ecx
03831                 mov cl, [edx+4]
03832                 mov eax, ecx
03833                 mov cl, [edx+1]
03834                 sub eax, ecx
03835                 imul eax, UDist
03836                 shl ecx, 8
03837                 add eax, ecx
03838                 mov [G2], eax
03839 
03840                 xor ecx, ecx
03841                 mov cl, [edx+5]
03842                 mov eax, ecx
03843                 mov cl, [edx+2]
03844                 sub eax, ecx
03845                 imul eax, UDist
03846                 shl ecx, 8
03847                 add eax, ecx
03848                 mov [B2], eax
03849 
03850                 // Interpolate down
03851                 mov eax, [R2]
03852                 sub eax, [R1]
03853                 imul eax, VDist
03854                 sar eax, 8
03855                 add eax, [R1]
03856                 shr eax, 8
03857                 and     eax,0feh
03858 
03859                 mov [RR1], eax
03860 
03861                 mov eax, [G2]
03862                 sub eax, [G1]
03863                 imul eax, VDist
03864                 sar eax, 8
03865                 add eax, [G1]
03866                 shr eax, 8
03867                 and     eax,0feh
03868 
03869                 mov [GG1], eax
03870 
03871                 mov eax, [B2]
03872                 sub eax, [B1]
03873                 imul eax, VDist
03874                 sar eax, 8
03875                 add eax, [B1]
03876                 shr eax, 8
03877                 and     eax,0feh
03878 
03879                 mov [BB1], eax
03880 
03881                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
03882                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
03883                 fstp    [FTemp2]                                ; VZR  UL   VL
03884                 fstp    [FTemp3]                                ; UL   VL
03885                 fstp    [FTemp4]                                ; VL
03886                 fstp    [FTemp5]                                ; 
03887 
03888                 fild    [RR1]                                   ; LR
03889                 fild    [GG1]                                   ; LG   LR
03890                 fild    [BB1]                                   ; LB   LG   LR
03891                 
03892                 
03893                 mov             ebx,dword ptr[U1]
03894                 mov             eax,dword ptr[V1]
03895 
03896                 add             ebx,dword ptr[UAdjust2]
03897                 add             eax,dword ptr[VAdjust2]
03898 
03899                 mov             ecx,[VShift]
03900                 mov             dword ptr[Bucket],ebx
03901 
03902                 shl             eax,cl
03903 
03904                 push    ebp
03905 
03906                 mov             dword ptr[Bucket2],eax
03907                 mov             ebp,dword ptr[DeltaV]
03908 
03909                 and             eax,[GHMaskShifted16]
03910                 and             ebx,[GWMaskShifted]
03911 
03912                 shl             ebp,cl
03913                 add             eax,ebx
03914 
03915                 mov             edx,dword ptr[Bucket2]
03916                 mov             esi,pTex
03917 
03918                 shr             eax,16
03919                 mov             dword ptr[DeltaV],ebp
03920 
03921                 mov             ebx,dword ptr[Bucket]
03922 
03923                 mov             ax,word ptr[2*eax+esi]
03924                 add             edx,dword ptr[DeltaV]
03925 
03926                 xor             eax,0
03927                 mov             ecx,edx
03928 
03929                 add             ebx,dword ptr[DeltaU]
03930                 and             ecx,[GHMaskShifted16]
03931 
03932                 rol             eax,16
03933                 and             ebx,[GWMaskShifted]
03934 
03935                 xor             eax,0
03936                 add             ecx,ebx
03937 
03938                 add             edx,dword ptr[DeltaV]
03939                 mov             esi,pTex
03940 
03941                 shr             ecx,16
03942                 add             ebx,dword ptr[DeltaU]
03943 
03944                 mov             ax,word ptr[2*ecx+esi]
03945                 mov             ecx,edx
03946 
03947                 xor             eax,0
03948                 and             ecx,[GHMaskShifted16]
03949 
03950                 mov             esi,eax
03951                 mov             ebp,eax
03952 
03953                 and             esi,REDMASK
03954                 and             ebp,GREENMASK
03955 
03956                 mov             dword ptr[Red],esi
03957                 mov             dword ptr[Green],ebp
03958 
03959                 fild    qword ptr[Red]                  ; r    LB   LG   LR
03960 
03961                 mov             ebp,eax
03962 
03963                 fmul    st,st(3)                                ; R    LB   LG   LR
03964                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
03965 
03966                 and             ebp,BLUEMASK
03967                 and             ebx,[GWMaskShifted]
03968 
03969                 mov             dword ptr[Blue],ebp
03970 
03971                 fmul    st,st(3)                                ; G    R    LB   LG   LR
03972                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
03973                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
03974                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
03975                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
03976                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
03977                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
03978                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
03979                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
03980                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
03981                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
03982                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
03983 
03984                 mov             eax,dword ptr[Bucket]
03985                 mov             ebp,dword ptr[Bucket2]
03986 
03987                 fstp    qword ptr[Bucket]               ; LB   LG   LR
03988 
03989                 and             eax,REDMASK
03990                 and             ebp,BLUEMASK
03991                 
03992                 mov             esi,dword ptr[Bucket]
03993                 or              ebp,eax
03994 
03995                 add             ecx,ebx
03996                 and             esi,GREENMASK
03997 
03998                 shr             ecx,16
03999                 or              ebp,esi
04000 
04001                 xor             eax,0
04002                 mov             esi,pTex
04003 
04004                 rol             ebp,16
04005                 add             edx,dword ptr[DeltaV]
04006 
04007                 mov             ax,word ptr[2*ecx+esi]
04008                 mov             ecx,edx
04009 
04010                 add             ebx,dword ptr[DeltaU]
04011                 and             ecx,[GHMaskShifted16]
04012 
04013                 and             ebx,[GWMaskShifted]
04014                 xor             eax,0
04015 
04016                 add             ecx,ebx
04017                 mov             [edi],ebp
04018 
04019                 rol             eax,16
04020                 add             edx,dword ptr[DeltaV]
04021 
04022                 shr             ecx,16
04023                 add             ebx,dword ptr[DeltaU]
04024 
04025                 mov             ax,word ptr[2*ecx+esi]
04026 
04027                 mov             ecx,edx
04028                 xor             eax,0
04029 
04030                 and             ecx,[GHMaskShifted16]
04031                 mov             esi,eax
04032 
04033                 mov             ebp,eax
04034                 and             esi,REDMASK
04035 
04036                 and             ebp,GREENMASK
04037                 mov             dword ptr[Red],esi
04038 
04039                 mov             dword ptr[Green],ebp
04041 
04042 
04043                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04044 
04045                 mov             ebp,eax
04046 
04047                 fmul    st,st(3)                                ; R    LB   LG   LR
04048                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04049 
04050                 and             ebp,BLUEMASK
04051                 and             ebx,[GWMaskShifted]
04052 
04053                 mov             dword ptr[Blue],ebp
04054 
04055                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04056                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04057                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04058                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04059                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04060                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04061                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04062                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04063                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04064                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04065                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04066                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04067 
04068                 mov             eax,dword ptr[Bucket]
04069                 mov             ebp,dword ptr[Bucket2]
04070 
04071                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04072 
04073                 and             eax,REDMASK
04074                 and             ebp,BLUEMASK
04075                 
04076                 mov             esi,dword ptr[Bucket]
04077                 or              ebp,eax
04078 
04079                 add             ecx,ebx
04080                 and             esi,GREENMASK
04081 
04082                 shr             ecx,16
04083                 or              ebp,esi
04084 
04085                 xor             eax,0
04086                 mov             esi,pTex
04087 
04088                 rol             ebp,16
04089                 add             edx,dword ptr[DeltaV]
04090 
04091                 mov             ax,word ptr[2*ecx+esi]
04092                 mov             ecx,edx
04093 
04094                 add             ebx,dword ptr[DeltaU]
04095                 and             ecx,[GHMaskShifted16]
04096 
04097                 and             ebx,[GWMaskShifted]
04098                 xor             eax,0
04099 
04100                 add             ecx,ebx
04101                 mov             [edi+4],ebp
04102 
04103                 rol             eax,16
04104                 add             edx,dword ptr[DeltaV]
04105 
04106                 shr             ecx,16
04107                 add             ebx,dword ptr[DeltaU]
04108 
04109                 mov             ax,word ptr[2*ecx+esi]
04110 
04111                 mov             ecx,edx
04112                 xor             eax,0
04113 
04114                 and             ecx,[GHMaskShifted16]
04115                 mov             esi,eax
04116 
04117                 mov             ebp,eax
04118                 and             esi,REDMASK
04119 
04120                 and             ebp,GREENMASK
04121                 mov             dword ptr[Red],esi
04122 
04123                 mov             dword ptr[Green],ebp
04125 
04126 
04127                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04128 
04129                 mov             ebp,eax
04130 
04131                 fmul    st,st(3)                                ; R    LB   LG   LR
04132                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04133 
04134                 and             ebp,BLUEMASK
04135                 and             ebx,[GWMaskShifted]
04136 
04137                 mov             dword ptr[Blue],ebp
04138 
04139                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04140                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04141                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04142                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04143                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04144                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04145                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04146                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04147                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04148                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04149                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04150                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04151 
04152                 mov             eax,dword ptr[Bucket]
04153                 mov             ebp,dword ptr[Bucket2]
04154 
04155                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04156 
04157                 and             eax,REDMASK
04158                 and             ebp,BLUEMASK
04159                 
04160                 mov             esi,dword ptr[Bucket]
04161                 or              ebp,eax
04162 
04163                 add             ecx,ebx
04164                 and             esi,GREENMASK
04165 
04166                 shr             ecx,16
04167                 or              ebp,esi
04168 
04169                 xor             eax,0
04170                 mov             esi,pTex
04171 
04172                 rol             ebp,16
04173                 add             edx,dword ptr[DeltaV]
04174 
04175                 mov             ax,word ptr[2*ecx+esi]
04176                 mov             ecx,edx
04177 
04178                 add             ebx,dword ptr[DeltaU]
04179                 and             ecx,[GHMaskShifted16]
04180 
04181                 and             ebx,[GWMaskShifted]
04182                 xor             eax,0
04183 
04184                 add             ecx,ebx
04185                 mov             [edi+8],ebp
04186 
04187                 shr             ecx,16
04188                 add             edx,dword ptr[DeltaV]
04189 
04190                 rol             eax,16
04191                 mov             ax,word ptr[2*ecx+esi]
04192 
04193                 mov             ecx,edx
04194                 xor             eax,0
04195 
04196                 and             ecx,[GHMaskShifted16]
04197                 mov             esi,eax
04198 
04199                 mov             ebp,eax
04200                 and             esi,REDMASK
04201 
04202                 and             ebp,GREENMASK
04203                 mov             dword ptr[Red],esi
04204 
04205                 mov             dword ptr[Green],ebp
04206                 add             ebx,dword ptr[DeltaU]
04208 
04209 
04210                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04211 
04212                 mov             ebp,eax
04213 
04214                 fmul    st,st(3)                                ; R    LB   LG   LR
04215                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04216 
04217                 and             ebp,BLUEMASK
04218                 and             ebx,[GWMaskShifted]
04219 
04220                 mov             dword ptr[Blue],ebp
04221 
04222                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04223                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04224                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04225                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04226                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04227                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04228                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04229                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04230                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04231                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04232                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04233                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04234 
04235                 mov             eax,dword ptr[Bucket]
04236                 mov             ebp,dword ptr[Bucket2]
04237 
04238                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04239 
04240                 and             eax,REDMASK
04241                 and             ebp,BLUEMASK
04242                 
04243                 mov             esi,dword ptr[Bucket]
04244                 or              ebp,eax
04245 
04246                 add             ecx,ebx
04247                 and             esi,GREENMASK
04248 
04249                 shr             ecx,16
04250                 or              ebp,esi
04251 
04252                 xor             eax,0
04253                 mov             esi,pTex
04254 
04255                 rol             ebp,16
04256                 add             edx,dword ptr[DeltaV]
04257 
04258                 mov             ax,word ptr[2*ecx+esi]
04259                 mov             ecx,edx
04260 
04261                 add             ebx,dword ptr[DeltaU]
04262                 and             ecx,[GHMaskShifted16]
04263 
04264                 and             ebx,[GWMaskShifted]
04265                 xor             eax,0
04266 
04267                 add             ecx,ebx
04268                 mov             [edi+12],ebp
04269 
04270                 shr             ecx,16
04271                 add             edx,dword ptr[DeltaV]
04272 
04273                 rol             eax,16
04274                 mov             ax,word ptr[2*ecx+esi]
04275 
04276                 mov             ecx,edx
04277                 xor             eax,0
04278 
04279                 and             ecx,[GHMaskShifted16]
04280                 mov             esi,eax
04281 
04282                 mov             ebp,eax
04283                 and             esi,REDMASK
04284 
04285                 and             ebp,GREENMASK
04286                 mov             dword ptr[Red],esi
04287 
04288                 mov             dword ptr[Green],ebp
04289                 add             ebx,dword ptr[DeltaU]
04291 
04292 
04293                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04294 
04295                 mov             ebp,eax
04296 
04297                 fmul    st,st(3)                                ; R    LB   LG   LR
04298                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04299 
04300                 and             ebp,BLUEMASK
04301                 and             ebx,[GWMaskShifted]
04302 
04303                 mov             dword ptr[Blue],ebp
04304 
04305                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04306                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04307                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04308                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04309                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04310                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04311                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04312                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04313                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04314                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04315                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04316                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04317 
04318                 mov             eax,dword ptr[Bucket]
04319                 mov             ebp,dword ptr[Bucket2]
04320 
04321                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04322 
04323                 and             eax,REDMASK
04324                 and             ebp,BLUEMASK
04325                 
04326                 mov             esi,dword ptr[Bucket]
04327                 or              ebp,eax
04328 
04329                 add             ecx,ebx
04330                 and             esi,GREENMASK
04331 
04332                 shr             ecx,16
04333                 or              ebp,esi
04334 
04335                 xor             eax,0
04336                 mov             esi,pTex
04337 
04338                 rol             ebp,16
04339                 add             edx,dword ptr[DeltaV]
04340 
04341                 mov             ax,word ptr[2*ecx+esi]
04342                 mov             ecx,edx
04343 
04344                 add             ebx,dword ptr[DeltaU]
04345                 and             ecx,[GHMaskShifted16]
04346 
04347                 and             ebx,[GWMaskShifted]
04348                 xor             eax,0
04349 
04350                 add             ecx,ebx
04351                 mov             [edi+16],ebp
04352 
04353                 shr             ecx,16
04354                 add             edx,dword ptr[DeltaV]
04355 
04356                 rol             eax,16
04357                 mov             ax,word ptr[2*ecx+esi]
04358 
04359                 mov             ecx,edx
04360                 xor             eax,0
04361 
04362                 and             ecx,[GHMaskShifted16]
04363                 mov             esi,eax
04364 
04365                 mov             ebp,eax
04366                 and             esi,REDMASK
04367 
04368                 and             ebp,GREENMASK
04369                 mov             dword ptr[Red],esi
04370 
04371                 mov             dword ptr[Green],ebp
04372                 add             ebx,dword ptr[DeltaU]
04374 
04375 
04376                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04377 
04378                 mov             ebp,eax
04379 
04380                 fmul    st,st(3)                                ; R    LB   LG   LR
04381                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04382 
04383                 and             ebp,BLUEMASK
04384                 and             ebx,[GWMaskShifted]
04385 
04386                 mov             dword ptr[Blue],ebp
04387 
04388                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04389                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04390                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04391                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04392                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04393                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04394                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04395                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04396                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04397                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04398                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04399                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04400 
04401                 mov             eax,dword ptr[Bucket]
04402                 mov             ebp,dword ptr[Bucket2]
04403 
04404                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04405 
04406                 and             eax,REDMASK
04407                 and             ebp,BLUEMASK
04408                 
04409                 mov             esi,dword ptr[Bucket]
04410                 or              ebp,eax
04411 
04412                 add             ecx,ebx
04413                 and             esi,GREENMASK
04414 
04415                 shr             ecx,16
04416                 or              ebp,esi
04417 
04418                 xor             eax,0
04419                 mov             esi,pTex
04420 
04421                 rol             ebp,16
04422                 add             edx,dword ptr[DeltaV]
04423 
04424                 mov             ax,word ptr[2*ecx+esi]
04425                 mov             ecx,edx
04426 
04427                 add             ebx,dword ptr[DeltaU]
04428                 and             ecx,[GHMaskShifted16]
04429 
04430                 and             ebx,[GWMaskShifted]
04431                 xor             eax,0
04432 
04433                 add             ecx,ebx
04434                 mov             [edi+20],ebp
04435 
04436                 shr             ecx,16
04437                 add             edx,dword ptr[DeltaV]
04438 
04439                 rol             eax,16
04440                 mov             ax,word ptr[2*ecx+esi]
04441 
04442                 mov             ecx,edx
04443                 xor             eax,0
04444 
04445                 and             ecx,[GHMaskShifted16]
04446                 mov             esi,eax
04447 
04448                 mov             ebp,eax
04449                 and             esi,REDMASK
04450 
04451                 and             ebp,GREENMASK
04452                 mov             dword ptr[Red],esi
04453 
04454                 mov             dword ptr[Green],ebp
04455                 add             ebx,dword ptr[DeltaU]
04457 
04458 
04459                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04460 
04461                 mov             ebp,eax
04462 
04463                 fmul    st,st(3)                                ; R    LB   LG   LR
04464                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04465 
04466                 and             ebp,BLUEMASK
04467                 and             ebx,[GWMaskShifted]
04468 
04469                 mov             dword ptr[Blue],ebp
04470 
04471                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04472                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04473                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04474                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04475                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04476                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04477                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04478                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04479                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04480                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04481                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04482                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04483 
04484                 mov             eax,dword ptr[Bucket]
04485                 mov             ebp,dword ptr[Bucket2]
04486 
04487                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04488 
04489                 and             eax,REDMASK
04490                 and             ebp,BLUEMASK
04491                 
04492                 mov             esi,dword ptr[Bucket]
04493                 or              ebp,eax
04494 
04495                 add             ecx,ebx
04496                 and             esi,GREENMASK
04497 
04498                 shr             ecx,16
04499                 or              ebp,esi
04500 
04501                 xor             eax,0
04502                 mov             esi,pTex
04503 
04504                 rol             ebp,16
04505                 add             edx,dword ptr[DeltaV]
04506 
04507                 mov             ax,word ptr[2*ecx+esi]
04508                 mov             ecx,edx
04509 
04510                 add             ebx,dword ptr[DeltaU]
04511                 and             ecx,[GHMaskShifted16]
04512 
04513                 and             ebx,[GWMaskShifted]
04514                 xor             eax,0
04515 
04516                 add             ecx,ebx
04517                 mov             [edi+24],ebp
04518 
04519                 shr             ecx,16
04520                 add             edx,dword ptr[DeltaV]
04521 
04522                 rol             eax,16
04523                 mov             ax,word ptr[2*ecx+esi]
04524 
04525                 mov             ecx,edx
04526                 xor             eax,0
04527 
04528                 and             ecx,[GHMaskShifted16]
04529                 mov             esi,eax
04530 
04531                 mov             ebp,eax
04532                 and             esi,REDMASK
04533 
04534                 and             ebp,GREENMASK
04535                 mov             dword ptr[Red],esi
04536 
04537                 mov             dword ptr[Green],ebp
04538                 add             ebx,dword ptr[DeltaU]
04540                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04541 
04542                 mov             ebp,eax
04543 
04544                 fmul    st,st(3)                                ; R    LB   LG   LR
04545                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04546 
04547                 and             ebp,BLUEMASK
04548                 and             ebx,[GWMaskShifted]
04549 
04550                 mov             dword ptr[Blue],ebp
04551 
04552                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04553                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04554                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04555                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04556                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04557                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04558                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04559                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04560                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04561                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04562                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04563                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04564 
04565                 mov             eax,dword ptr[Bucket]
04566                 mov             ebp,dword ptr[Bucket2]
04567 
04568                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04569 
04570                 and             eax,REDMASK
04571                 and             ebp,BLUEMASK
04572                 
04573                 mov             esi,dword ptr[Bucket]
04574                 or              ebp,eax
04575 
04576                 fstp    dword ptr[Bucket]
04577                 fstp    dword ptr[Bucket2]
04578                 fstp    dword ptr[Bucket]
04579 
04580                 and             esi,GREENMASK
04581 
04582                 fld             dword ptr[FTemp5]
04583                 fld             dword ptr[FTemp4]
04584 
04585                 or              ebp,esi
04586 
04587                 fld             dword ptr[FTemp3]
04588                 fld             dword ptr[FTemp2]
04589 
04590                 rol             ebp,16
04591 
04592                 fld             dword ptr[FTemp1]
04593                 fld             dword ptr[FTemp0]
04594 
04595                 mov             [edi+28],ebp                            ; store pixel 0
04596                 pop             ebp
04597 
04598 
04599                 ; get corrected right side deltas ; st0  st1  st2  st3  st4  st5  st6  st7
04600                                                                                 ; ZR   UZR  ZRi  VZR  UL   VL
04601                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
04602                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
04603                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
04604                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
04605 
04606                 add             edi,32                                  ; move screen pointer to start of next aspan
04607                 dec             [NumASpans]                     ; dec num affine spans
04608                 jnz             SpanLoop16
04609 
04610 HandleLeftoverPixels16:
04611 
04612                 mov             esi,[pTex]
04613 
04614 
04615                 cmp             [RemainingCount],0
04616                 jz              FPUReturn16
04617 
04618                 //need one more stack spot
04619                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
04620                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
04621                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
04622                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
04623                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
04624                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
04625                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
04626                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
04627                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
04628                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
04629 
04630                 mov             ebx,dword ptr[Bucket]
04631                 mov             eax,dword ptr[Bucket2]
04632 
04633                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
04634                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
04635 
04636                 add             ebx,dword ptr[UAdjust]
04637                 add             eax,dword ptr[UAdjustL]
04638 
04639                 mov             [U1],ebx
04640                 mov             [UFixed],eax
04641 
04642                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
04643                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
04644                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
04645                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
04646                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
04647                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
04648                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
04649 
04650                 mov             ebx,dword ptr[Bucket]
04651                 mov             eax,dword ptr[Bucket2]
04652 
04653                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
04654 
04655                 add             ebx,dword ptr[VAdjust]
04656                 add             eax,dword ptr[VAdjustL]
04657 
04658                 mov             [V1],ebx
04659                 mov             [VFixed],eax
04660 
04661                 dec             [RemainingCount]
04662                 jz              OnePixelSpan16
04663 
04664 
04665                 //must get rid of this wasted time
04666                 fstp    [FloatTemp]                             ; inv. inv. inv. inv. UL   VL
04667                 fstp    [FloatTemp]                             ; inv. inv. inv. UL   VL
04668                 fstp    [FloatTemp]                             ; inv. inv. UL   VL
04669                 fstp    [FloatTemp]                             ; inv. UL   VL
04670                 fstp    [FloatTemp]                             ; UL   VL
04671                 fild    [y]                                             ; y    UL   VL
04672                 fild    [x2]                                    ; xr   y    UL   VL
04673 
04674                 fld             [UDivZStepY]                    ; UZdY xr   y    UL   VL
04675                 fld             [UDivZStepX]                    ; UZdX UZdY xr   y    UL   VL
04676                 fmul    st,st(2)                                ; UZX  UZdY xr   y    UL   VL
04677                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY xr   y    UL   VL
04678                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY xr   y    UL   VL
04679                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX xr   y    UL   VL
04680                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX xr   y    UL   VL
04681                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX xr   y    UL   VL
04682                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX xr   y    UL   VL
04683                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS xr   y    UL   VL
04684                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS xr   y    UL   VL
04685                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS xr   y    UL   VL
04686                 faddp   st(3),st                                ; VZdY VZX  UZ   xr   y    UL   VL
04687                 fmul    st,st(4)                                ; VZY  VZX  UZ   xr   y    UL   VL
04688                 fxch    st(1)                                   ; VZX  VZY  UZ   xr   y    UL   VL
04689                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   xr   y    UL   VL
04690                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   xr   y    UL   VL
04691                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y    UL   VL
04692                 faddp   st(1),st                                ; VZ   UZ   ZX   y    UL   VL
04693                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y    UL   VL
04694                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY   UL   VL
04695                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY   UL   VL
04696                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY   UL   VL
04697 
04698                 faddp   st(3),st                                ; UZ   VZ   Zi   UL   VL
04699                 fld1                                                    ; 1    UZ   VZ   Zi   UL   VL
04700                 fdiv    st,st(3)                                ; ZR   UZ   VZ   Zi   UL   VL
04701 
04702                 fld             st                                              ; ZR   ZR   UZ   VZ   Zi   UL   VL
04703                 fmul    st,st(3)                                ; VR   ZR   UZ   VZ   Zi   UL   VL
04704                 fxch    st(1)                                   ; ZR   VR   UZ   VZ   Zi   UL   VL
04705                 fmul    st,st(2)                                ; UR   VR   UZ   VZ   Zi   UL   VL
04706 
04707                 //lazy idiv below... should 1/int mul mul
04708 
04709                 ; calculate deltas                              ; st0  st1  st2  st3  st4  st5  st6  st7
04710                 fsubr   st(5),st                                ; UR   VR   inv. inv. inv. dU   VL
04711                 fxch    st(1)                                   ; VR   UR   inv. inv. inv. dU   VL
04712                 fsubr   st(6),st                                ; VR   UR   inv. inv. inv. dU   dV
04713                 fxch    st(6)                                   ; dV   UR   inv. inv. inv. dU   VR
04714                 fidiv   dword ptr[RemainingCount];dv   UR   inv. inv. inv. dU   VR
04715                 fadd    qword ptr[MipMagic]             ; dvk  UR   inv. inv. inv. dU   VR
04716                 fxch    st(5)                                   ; dU   UR   inv. inv. inv. dvk  VR
04717                 fidiv   dword ptr[RemainingCount];du   UR   inv. inv. inv. dvk  VR
04718                 fadd    qword ptr[MipMagic]             ; duk  UR   inv. inv. inv. dvk  VR
04719                 fxch    st(5)                                   ; dvk  UR   inv. inv. inv. duk  VR
04720                 fstp    qword ptr[DeltaV]               ; UR   inv. inv. inv. duk  VR
04721                 fxch    st(4)                                   ; duk  inv. inv. inv. UR   VR
04722                 fstp    qword ptr[DeltaU]               ; inv. inv. inv. UR   VR
04723                 fld             st(1)                                   ; inv. inv. inv. inv. UR   VR
04724                 fld             st(2)                                   ; inv. inv. inv. inv. inv. UR   VR
04725 
04726 OnePixelSpan16:
04727                 // Clamp U/V
04728                 mov             ebx,[UFixed]
04729                 cmp             ebx,MaxU
04730                 jle             TryClampU116
04731                 mov             ecx,MaxU
04732                 mov             dword ptr[UFixed],ecx
04733                 jmp             NoClampU116
04734 
04735 TryClampU116:
04736                 cmp             ebx,0
04737                 jge             NoClampU116
04738                 mov             dword ptr[UFixed],0
04739 NoClampU116:
04740                 mov             eax,[VFixed]
04741                 cmp             eax,MaxV
04742                 jle             TryClampV116
04743                 mov             ecx,MaxV
04744                 mov             dword ptr[VFixed],ecx
04745                 jmp             NoClampV116
04746 
04747 TryClampV116:
04748                 cmp             eax,0
04749                 jge             NoClampV116
04750                 mov             dword ptr[VFixed],0
04751 
04752 NoClampV116:
04753                 mov             esi,dword ptr[UFixed]
04754                 mov             eax,dword ptr[VFixed]
04755 
04756                 mov ecx, GMipLevel4_8
04757                 sar esi, cl
04758                 sar eax, cl
04759                 and esi, 0ffh
04760                 and eax, 0ffh
04761                 mov UDist, esi
04762                 mov VDist, eax
04763 
04764                 mov esi,dword ptr[UFixed]
04765                 mov eax,dword ptr[VFixed]
04766                 mov ecx, GMipLevel20
04767                 shr esi, cl
04768                 shr eax, cl
04769 
04770                 imul eax, GLightWidth
04771                 add esi, eax
04772 
04773                 mov edx, esi
04774                 shl esi, 1
04775                 add edx, esi
04776 
04777                 add edx, GLightData
04778 
04779                 // Interpolate accross top
04780                 xor ecx, ecx
04781                 mov cl, [edx+3]
04782                 mov eax, ecx
04783                 mov cl, [edx+0]
04784                 sub eax, ecx
04785                 imul eax, UDist
04786                 shl ecx, 8
04787                 add eax, ecx
04788                 mov [R1], eax
04789 
04790                 xor ecx, ecx
04791                 mov cl, [edx+4]
04792                 mov eax, ecx
04793                 mov cl, [edx+1]
04794                 sub eax, ecx
04795                 imul eax, UDist
04796                 shl ecx, 8
04797                 add eax, ecx
04798                 mov [G1], eax
04799 
04800                 xor ecx, ecx
04801                 mov cl, [edx+5]
04802                 mov eax, ecx
04803                 mov cl, [edx+2]
04804                 sub eax, ecx
04805                 imul eax, UDist
04806                 shl ecx, 8
04807                 add eax, ecx
04808                 mov [B1], eax
04809 
04810                 add edx, GLightWidth
04811                 add edx, GLightWidth
04812                 add edx, GLightWidth
04813 
04814                 // Interpolate accross bottom
04815                 xor ecx, ecx
04816                 mov cl, [edx+3]
04817                 mov eax, ecx
04818                 mov cl, [edx+0]
04819                 sub eax, ecx
04820                 imul eax, UDist
04821                 shl ecx, 8
04822                 add eax, ecx
04823                 mov [R2], eax
04824 
04825                 xor ecx, ecx
04826                 mov cl, [edx+4]
04827                 mov eax, ecx
04828                 mov cl, [edx+1]
04829                 sub eax, ecx
04830                 imul eax, UDist
04831                 shl ecx, 8
04832                 add eax, ecx
04833                 mov [G2], eax
04834 
04835                 xor ecx, ecx
04836                 mov cl, [edx+5]
04837                 mov eax, ecx
04838                 mov cl, [edx+2]
04839                 sub eax, ecx
04840                 imul eax, UDist
04841                 shl ecx, 8
04842                 add eax, ecx
04843                 mov [B2], eax
04844 
04845                 // Interpolate down
04846                 mov eax, [R2]
04847                 sub eax, [R1]
04848                 imul eax, VDist
04849                 sar eax, 8
04850                 add eax, [R1]
04851                 shr eax, 8
04852                 and     eax,0feh
04853 
04854                 mov [RR1], eax
04855 
04856                 mov eax, [G2]
04857                 sub eax, [G1]
04858                 imul eax, VDist
04859                 sar eax, 8
04860                 add eax, [G1]
04861                 shr eax, 8
04862                 and     eax,0feh
04863 
04864                 mov [GG1], eax
04865 
04866                 mov eax, [B2]
04867                 sub eax, [B1]
04868                 imul eax, VDist
04869                 sar eax, 8
04870                 add eax, [B1]
04871                 shr eax, 8
04872                 and     eax,0feh
04873 
04874                 mov [BB1], eax
04875 
04876                 fstp    [FTemp0]
04877                 fstp    [FTemp1]
04878                 fstp    [FTemp2]
04879                 fstp    [FTemp3]
04880                 fstp    [FTemp4]
04881                 fstp    [FTemp5]
04882 
04883                 mov             ebx,dword ptr[U1]
04884                 mov             edx,dword ptr[V1]
04885 
04886                 fild    [RR1]                                   ; LR
04887                 fild    [GG1]                                   ; LG   LR
04888                 fild    [BB1]                                   ; LB   LG   LR
04889 
04890                 mov             ecx,[VShift]
04891                 add             edx,dword ptr[VAdjust2]
04892 
04893                 add             ebx,dword ptr[UAdjust2]
04894                 mov             eax,dword ptr[DeltaV]
04895 
04896                 shl             eax,cl
04897                 mov             esi,pTex
04898 
04899                 shl             edx,cl
04900                 mov             dword ptr[DeltaV],eax
04901 
04902 
04903                 push    ebp
04904 
04905 LeftoverLoop16:
04906                 mov             eax,edx
04907                 and             ebx,[GWMaskShifted]
04908 
04909                 and             eax,[GHMaskShifted16]
04910 
04911                 add             eax,ebx 
04912                 add             ebx,dword ptr[DeltaU]
04913 
04914                 shr             eax,16
04915                 add             edi,2
04916 
04917                 mov             ax,word ptr[2*eax+esi]
04918                 add             edx,dword ptr[DeltaV]
04919 
04920                 xor             eax,0
04921 
04922                 mov             esi,eax
04923                 mov             ebp,eax
04924 
04925                 and             esi,REDMASK
04926                 and             ebp,GREENMASK
04927 
04928                 mov             dword ptr[Red],esi
04929                 mov             dword ptr[Green],ebp
04930 
04931                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04932 
04933                 mov             ebp,eax
04934 
04935                 fmul    st,st(3)                                ; R    LB   LG   LR
04936                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04937 
04938                 and             ebp,BLUEMASK
04939 
04940                 mov             dword ptr[Blue],ebp
04941 
04942                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04943                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04944                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04945                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04946                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04947                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04948                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04949                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04950                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04951                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04952                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04953                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04954 
04955                 mov             eax,dword ptr[Bucket]
04956                 mov             ebp,dword ptr[Bucket2]
04957 
04958                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04959 
04960                 and             eax,REDMASK
04961                 and             ebp,BLUEMASK
04962                 
04963                 mov             esi,dword ptr[Bucket]
04964                 or              ebp,eax
04965 
04966                 and             esi,GREENMASK
04967 
04968                 or              ebp,esi
04969 
04970                 mov             esi,pTex
04971 
04972                 mov             word ptr[edi-2],bp
04973 
04974                 dec             [RemainingCount]
04975                 jge             LeftoverLoop16
04976 
04977                 pop             ebp
04978 
04979 
04980 FPUReturn16:
04981                 ffree   st(0)
04982                 ffree   st(1)
04983                 ffree   st(2)
04984                 ffree   st(3)
04985                 ffree   st(4)
04986                 ffree   st(5)
04987                 ffree   st(6)
04988 
04989 Return16:
04990                 pop             edi
04991                 pop             esi
04992                 pop             ecx
04993                 pop             ebx
04994         }
04995 }
04996 
04997 void DrawSpan16_AsmLitZBufferX86FPU(int32 x1, int32 x2, int32 y)
04998 {
04999         TDest   =Dest;
05000         _asm
05001         {
05002                 push    ebx
05003                 push    ecx
05004                 push    esi
05005                 push    edi
05006 
05007                 mov             eax,x1
05008                 mov             ecx,x2
05009                 sub             ecx,eax
05010                 jle             Return16
05011 
05012                 mov             edi,[GBitPtr16]
05013                 mov             pTex,edi
05014 
05015                 fild    [y]                                             ; y
05016 
05017                 mov             esi,x1
05018                 mov             edi,[TDest]
05019 
05020                 shl             esi,1
05021                 mov             eax,ecx
05022 
05023                 add             edi,esi
05024                 add             pZBufferPtr,esi
05025 
05026                 shr             ecx,4
05027                 and             eax,15
05028                 _emit 75h
05029                 _emit 06h
05030                 dec             ecx
05031                 mov             eax,16
05032 
05033                 mov             [NumASpans],ecx
05034                 mov             [RemainingCount],eax
05035 
05036                 fild [x1]                                               ; x    y
05037 
05038                 //decoder won't keep up with these huge instructions
05039                 //need to find some int instructions to cram in here somewhere
05040                 fld             [UDivZStepY]                    ; UZdY x    y
05041                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
05042                 fmul    st,st(2)                                ; UZX  UZdY x    y
05043                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
05044                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
05045                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
05046                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
05047                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
05048                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
05049                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
05050                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
05051                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
05052                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
05053                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
05054                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
05055                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
05056                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
05057 
05058                 //zbuffer step action
05059                 fld             [ZiStepX]
05060                 fmul    dword ptr[ZBufferPrec]
05061                 fmul    dword ptr[Two]
05062                 fistp   dword ptr[ZDelta]
05063 
05064                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
05065                 faddp   st(1),st                                ; VZ   UZ   ZX   y
05066                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
05067                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
05068                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
05069                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
05070 
05071                 //room for two cycles of int instructions here
05072 
05073                 faddp   st(3),st                                ; UZ   VZ   Zi
05074                 fld1                                                    ; 1    UZ   VZ   Zi
05075                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
05076 
05077                 //room for 18 cycles of int instructions here
05078 
05079                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
05080                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
05081                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
05082 
05083                 //zbuffer action
05084                 fld             st
05085                 fmul    dword ptr[ZBufferPrec]
05086                 fistp   dword ptr[ZVal]
05087 
05088                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
05089                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
05090                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
05091                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
05092                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
05093                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
05094                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
05095                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
05096                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
05097 
05098                 //room for 18 cycles of int stuff here
05099 
05100                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
05101                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
05102                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
05103                 //fmul stall one cycle
05104                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
05105 
05106                 test    ecx,ecx
05107                 jz              HandleLeftoverPixels16
05108 
05109 SpanLoop16:
05110                 //need one more stack spot
05111                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
05112                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
05113                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
05114                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
05115                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
05116                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
05117                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
05118                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
05119                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
05120                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
05121 
05122                 mov             ebx,dword ptr[Bucket]
05123                 mov             eax,dword ptr[Bucket2]
05124 
05125                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
05126                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
05127 
05128                 add             ebx,dword ptr[UAdjust]
05129                 add             eax,dword ptr[UAdjustL]
05130 
05131                 mov             [U1],ebx
05132                 mov             [UFixed],eax
05133 
05134                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
05135                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
05136                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
05137                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
05138                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
05139                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
05140                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
05141                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
05142 
05143                 mov             ebx,dword ptr[Bucket]
05144                 mov             eax,dword ptr[Bucket2]
05145 
05146                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
05147 
05148                 add             ebx,dword ptr[VAdjust]
05149                 add             eax,dword ptr[VAdjustL]
05150 
05151                 mov             [V1],ebx
05152                 mov             [VFixed],eax
05153 
05154                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
05155                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
05156                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
05157                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
05158                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
05159                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
05160                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
05161                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
05162                 //gotta do this to get em lined back up right
05163                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
05164                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
05165 
05166                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
05167                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
05168                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
05169                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
05170                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
05171                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
05172                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
05173                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
05174                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
05175                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
05176 
05177                 // Clamp U/V
05178                 mov             ebx,[UFixed]
05179                 cmp             ebx,MaxU
05180                 jle             TryClampU016
05181                 mov             ecx,MaxU
05182                 mov             dword ptr[UFixed],ecx
05183                 jmp             NoClampU016
05184 
05185 TryClampU016:
05186                 cmp             ebx,0
05187                 jge             NoClampU016
05188                 mov             dword ptr[UFixed],0
05189 NoClampU016:
05190                 mov             eax,[VFixed]
05191                 cmp             eax,MaxV
05192                 jle             TryClampV016
05193                 mov             ecx,MaxV
05194                 mov             dword ptr[VFixed],ecx
05195                 jmp             NoClampV016
05196 
05197 TryClampV016:
05198                 cmp             eax,0
05199                 jge             NoClampV016
05200                 mov             dword ptr[VFixed],0
05201 
05202 NoClampV016:
05203 
05204 
05205                 mov esi,dword ptr[UFixed]
05206                 mov eax,dword ptr[VFixed]
05207 
05208 
05209                 mov ecx, GMipLevel4_8
05210                 sar esi, cl
05211                 sar eax, cl
05212                 and esi, 0ffh
05213                 and eax, 0ffh
05214                 mov UDist, esi
05215                 mov VDist, eax
05216 
05217                 mov esi,dword ptr[UFixed]
05218                 mov eax,dword ptr[VFixed]
05219                 mov ecx, GMipLevel20
05220                 shr esi, cl
05221                 shr eax, cl
05222 
05223                 imul eax, GLightWidth
05224                 add esi, eax
05225 
05226                 mov edx, esi
05227                 shl esi, 1
05228                 add edx, esi
05229 
05230                 add edx, GLightData
05231 
05232                 // Interpolate accross top
05233                 xor ecx, ecx
05234                 mov cl, [edx+3]
05235                 mov eax, ecx
05236                 mov cl, [edx+0]
05237                 sub eax, ecx
05238                 imul eax, UDist
05239                 shl ecx, 8
05240                 add eax, ecx
05241                 mov [R1], eax
05242 
05243                 xor ecx, ecx
05244                 mov cl, [edx+4]
05245                 mov eax, ecx
05246                 mov cl, [edx+1]
05247                 sub eax, ecx
05248                 imul eax, UDist
05249                 shl ecx, 8
05250                 add eax, ecx
05251                 mov [G1], eax
05252 
05253                 xor ecx, ecx
05254                 mov cl, [edx+5]
05255                 mov eax, ecx
05256                 mov cl, [edx+2]
05257                 sub eax, ecx
05258                 imul eax, UDist
05259                 shl ecx, 8
05260                 add eax, ecx
05261                 mov [B1], eax
05262 
05263                 add edx, GLightWidth
05264                 add edx, GLightWidth
05265                 add edx, GLightWidth
05266 
05267                 // Interpolate accross bottom
05268                 xor ecx, ecx
05269                 mov cl, [edx+3]
05270                 mov eax, ecx
05271                 mov cl, [edx+0]
05272                 sub eax, ecx
05273                 imul eax, UDist
05274                 shl ecx, 8
05275                 add eax, ecx
05276                 mov [R2], eax
05277 
05278                 xor ecx, ecx
05279                 mov cl, [edx+4]
05280                 mov eax, ecx
05281                 mov cl, [edx+1]
05282                 sub eax, ecx
05283                 imul eax, UDist
05284                 shl ecx, 8
05285                 add eax, ecx
05286                 mov [G2], eax
05287 
05288                 xor ecx, ecx
05289                 mov cl, [edx+5]
05290                 mov eax, ecx
05291                 mov cl, [edx+2]
05292                 sub eax, ecx
05293                 imul eax, UDist
05294                 shl ecx, 8
05295                 add eax, ecx
05296                 mov [B2], eax
05297 
05298                 // Interpolate down
05299                 mov eax, [R2]
05300                 sub eax, [R1]
05301                 imul eax, VDist
05302                 sar eax, 8
05303                 add eax, [R1]
05304                 shr eax, 8
05305                 and     eax,0feh
05306 
05307                 mov [RR1], eax
05308 
05309                 mov eax, [G2]
05310                 sub eax, [G1]
05311                 imul eax, VDist
05312                 sar eax, 8
05313                 add eax, [G1]
05314                 shr eax, 8
05315                 and     eax,0feh
05316 
05317                 mov [GG1], eax
05318 
05319                 mov eax, [B2]
05320                 sub eax, [B1]
05321                 imul eax, VDist
05322                 sar eax, 8
05323                 add eax, [B1]
05324                 shr eax, 8
05325                 and     eax,0feh
05326 
05327                 mov [BB1], eax
05328 
05329                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
05330                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
05331                 fstp    [FTemp2]                                ; VZR  UL   VL
05332                 fstp    [FTemp3]                                ; UL   VL
05333                 fstp    [FTemp4]                                ; VL
05334                 fstp    [FTemp5]                                ; 
05335 
05336                 fild    [RR1]                                   ; LR
05337                 fild    [GG1]                                   ; LG   LR
05338                 fild    [BB1]                                   ; LB   LG   LR
05339                 
05340                 
05341                 mov             ebx,dword ptr[U1]
05342                 mov             eax,dword ptr[V1]
05343 
05344                 add             ebx,dword ptr[UAdjust2]
05345                 add             eax,dword ptr[VAdjust2]
05346 
05347                 mov             ecx,[VShift]
05348                 mov             dword ptr[Bucket],ebx
05349 
05350                 shl             eax,cl
05351 
05352                 push    ebp
05353 
05354                 mov             dword ptr[Bucket2],eax
05355                 mov             ebp,dword ptr[DeltaV]
05356 
05357                 and             eax,[GHMaskShifted16]
05358                 and             ebx,[GWMaskShifted]
05359 
05360                 shl             ebp,cl
05361                 add             eax,ebx
05362 
05363                 mov             edx,dword ptr[Bucket2]
05364                 mov             esi,pTex
05365 
05366                 shr             eax,16
05367                 mov             dword ptr[DeltaV],ebp
05368 
05369                 mov             ebx,dword ptr[Bucket]
05370 
05371                 mov             ax,word ptr[2*eax+esi]
05372                 add             edx,dword ptr[DeltaV]
05373 
05374                 xor             eax,0
05375                 mov             ecx,edx
05376 
05377                 add             ebx,dword ptr[DeltaU]
05378                 and             ecx,[GHMaskShifted16]
05379 
05380                 rol             eax,16
05381                 and             ebx,[GWMaskShifted]
05382 
05383                 xor             eax,0
05384                 add             ecx,ebx
05385 
05386                 add             edx,dword ptr[DeltaV]
05387                 mov             esi,pTex
05388 
05389                 shr             ecx,16
05390                 add             ebx,dword ptr[DeltaU]
05391 
05392                 mov             ax,word ptr[2*ecx+esi]
05393                 mov             ecx,edx
05394 
05395                 xor             eax,0
05396                 and             ecx,[GHMaskShifted16]
05397 
05398                 mov             esi,eax
05399                 mov             ebp,eax
05400 
05401                 and             esi,REDMASK
05402                 and             ebp,GREENMASK
05403 
05404                 mov             dword ptr[Red],esi
05405                 mov             dword ptr[Green],ebp
05406 
05407                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05408 
05409                 mov             ebp,eax
05410 
05411                 fmul    st,st(3)                                ; R    LB   LG   LR
05412                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05413 
05414                 and             ebp,BLUEMASK
05415                 and             ebx,[GWMaskShifted]
05416 
05417                 mov             dword ptr[Blue],ebp
05418 
05419                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05420                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05421                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05422                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05423                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05424                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05425                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05426                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05427                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05428                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05429                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05430                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05431 
05432                 mov             eax,dword ptr[Bucket]
05433                 mov             ebp,dword ptr[Bucket2]
05434 
05435                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05436 
05437                 and             eax,REDMASK
05438                 and             ebp,BLUEMASK
05439                 
05440                 mov             esi,dword ptr[Bucket]
05441                 or              ebp,eax
05442 
05443                 add             ecx,ebx
05444                 and             esi,GREENMASK
05445 
05446                 shr             ecx,16
05447                 or              ebp,esi
05448 
05449                 xor             eax,0
05450                 mov             esi,pTex
05451 
05452                 rol             ebp,16
05453                 add             edx,dword ptr[DeltaV]
05454 
05455                 mov             ax,word ptr[2*ecx+esi]
05456                 mov             ecx,[ZVal]
05457 
05458                 mov             esi,[ZVal]
05459                 add             ecx,[ZDelta]
05460 
05461                 shr             esi,16
05462                 mov             [ZVal],ecx
05463 
05464                 mov             ecx,pZBufferPtr
05465 
05466                 cmp             si,word ptr[ecx+0]
05467                 jle             Skip0
05468 
05469                 mov             dword ptr[edi],ebp
05470                 mov             word ptr[ecx+0],si
05471                 mov             word ptr[ecx+2],si
05472 
05473 Skip0:
05474                 mov             ecx,edx
05475 
05476                 add             ebx,dword ptr[DeltaU]
05477                 and             ecx,[GHMaskShifted16]
05478 
05479                 and             ebx,[GWMaskShifted]
05480                 xor             eax,0
05481 
05482                 add             ecx,ebx
05483                 mov             esi,pTex
05484 
05485                 rol             eax,16
05486                 add             edx,dword ptr[DeltaV]
05487 
05488                 shr             ecx,16
05489                 add             ebx,dword ptr[DeltaU]
05490 
05491                 mov             ax,word ptr[2*ecx+esi]
05492 
05493                 mov             ecx,edx
05494                 xor             eax,0
05495 
05496                 and             ecx,[GHMaskShifted16]
05497                 mov             esi,eax
05498 
05499                 mov             ebp,eax
05500                 and             esi,REDMASK
05501 
05502                 and             ebp,GREENMASK
05503                 mov             dword ptr[Red],esi
05504 
05505                 mov             dword ptr[Green],ebp
05507 
05508 
05509                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05510 
05511                 mov             ebp,eax
05512 
05513                 fmul    st,st(3)                                ; R    LB   LG   LR
05514                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05515 
05516                 and             ebp,BLUEMASK
05517                 and             ebx,[GWMaskShifted]
05518 
05519                 mov             dword ptr[Blue],ebp
05520 
05521                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05522                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05523                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05524                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05525                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05526                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05527                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05528                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05529                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05530                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05531                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05532                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05533 
05534                 mov             eax,dword ptr[Bucket]
05535                 mov             ebp,dword ptr[Bucket2]
05536 
05537                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05538 
05539                 and             eax,REDMASK
05540                 and             ebp,BLUEMASK
05541                 
05542                 mov             esi,dword ptr[Bucket]
05543                 or              ebp,eax
05544 
05545                 add             ecx,ebx
05546                 and             esi,GREENMASK
05547 
05548                 shr             ecx,16
05549                 or              ebp,esi
05550 
05551                 xor             eax,0
05552                 mov             esi,pTex
05553 
05554                 rol             ebp,16
05555                 add             edx,dword ptr[DeltaV]
05556 
05557                 mov             ax,word ptr[2*ecx+esi]
05558                 mov             ecx,[ZVal]
05559 
05560                 mov             esi,[ZVal]
05561                 add             ecx,[ZDelta]
05562 
05563                 shr             esi,16
05564                 mov             [ZVal],ecx
05565 
05566                 mov             ecx,pZBufferPtr
05567 
05568                 cmp             si,word ptr[ecx+4]
05569                 jle             Skip1
05570 
05571                 mov             [edi+4],ebp
05572                 mov             word ptr[ecx+4],si
05573                 mov             word ptr[ecx+6],si
05574 
05575 Skip1:
05576                 mov             ecx,edx
05577 
05578                 add             ebx,dword ptr[DeltaU]
05579                 and             ecx,[GHMaskShifted16]
05580 
05581                 and             ebx,[GWMaskShifted]
05582                 xor             eax,0
05583 
05584                 add             ecx,ebx
05585                 mov             esi,pTex
05586 
05587                 rol             eax,16
05588                 add             edx,dword ptr[DeltaV]
05589 
05590                 shr             ecx,16
05591                 add             ebx,dword ptr[DeltaU]
05592 
05593                 mov             ax,word ptr[2*ecx+esi]
05594 
05595                 mov             ecx,edx
05596                 xor             eax,0
05597 
05598                 and             ecx,[GHMaskShifted16]
05599                 mov             esi,eax
05600 
05601                 mov             ebp,eax
05602                 and             esi,REDMASK
05603 
05604                 and             ebp,GREENMASK
05605                 mov             dword ptr[Red],esi
05606 
05607                 mov             dword ptr[Green],ebp
05609 
05610 
05611                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05612 
05613                 mov             ebp,eax
05614 
05615                 fmul    st,st(3)                                ; R    LB   LG   LR
05616                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05617 
05618                 and             ebp,BLUEMASK
05619                 and             ebx,[GWMaskShifted]
05620 
05621                 mov             dword ptr[Blue],ebp
05622 
05623                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05624                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05625                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05626                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05627                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05628                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05629                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05630                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05631                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05632                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05633                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05634                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05635 
05636                 mov             eax,dword ptr[Bucket]
05637                 mov             ebp,dword ptr[Bucket2]
05638 
05639                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05640 
05641                 and             eax,REDMASK
05642                 and             ebp,BLUEMASK
05643                 
05644                 mov             esi,dword ptr[Bucket]
05645                 or              ebp,eax
05646 
05647                 add             ecx,ebx
05648                 and             esi,GREENMASK
05649 
05650                 shr             ecx,16
05651                 or              ebp,esi
05652 
05653                 xor             eax,0
05654                 mov             esi,pTex
05655 
05656                 rol             ebp,16
05657                 add             edx,dword ptr[DeltaV]
05658 
05659                 mov             ax,word ptr[2*ecx+esi]
05660                 mov             ecx,[ZVal]
05661 
05662                 mov             esi,[ZVal]
05663                 add             ecx,[ZDelta]
05664 
05665                 shr             esi,16
05666                 mov             [ZVal],ecx
05667 
05668                 mov             ecx,pZBufferPtr
05669 
05670                 cmp             si,word ptr[ecx+8]
05671                 jle             Skip2
05672 
05673                 mov             [edi+8],ebp
05674                 mov             word ptr[ecx+8],si
05675                 mov             word ptr[ecx+10],si
05676 
05677 Skip2:
05678                 mov             ecx,edx
05679 
05680                 add             ebx,dword ptr[DeltaU]
05681                 and             ecx,[GHMaskShifted16]
05682 
05683                 and             ebx,[GWMaskShifted]
05684                 xor             eax,0
05685 
05686                 add             ecx,ebx
05687                 mov             esi,pTex
05688 
05689                 shr             ecx,16
05690                 add             edx,dword ptr[DeltaV]
05691 
05692                 rol             eax,16
05693                 mov             ax,word ptr[2*ecx+esi]
05694 
05695                 mov             ecx,edx
05696                 xor             eax,0
05697 
05698                 and             ecx,[GHMaskShifted16]
05699                 mov             esi,eax
05700 
05701                 mov             ebp,eax
05702                 and             esi,REDMASK
05703 
05704                 and             ebp,GREENMASK
05705                 mov             dword ptr[Red],esi
05706 
05707                 mov             dword ptr[Green],ebp
05708                 add             ebx,dword ptr[DeltaU]
05710 
05711 
05712                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05713 
05714                 mov             ebp,eax
05715 
05716                 fmul    st,st(3)                                ; R    LB   LG   LR
05717                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05718 
05719                 and             ebp,BLUEMASK
05720                 and             ebx,[GWMaskShifted]
05721 
05722                 mov             dword ptr[Blue],ebp
05723 
05724                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05725                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05726                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05727                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05728                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05729                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05730                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05731                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05732                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05733                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05734                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05735                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05736 
05737                 mov             eax,dword ptr[Bucket]
05738                 mov             ebp,dword ptr[Bucket2]
05739 
05740                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05741 
05742                 and             eax,REDMASK
05743                 and             ebp,BLUEMASK
05744                 
05745                 mov             esi,dword ptr[Bucket]
05746                 or              ebp,eax
05747 
05748                 add             ecx,ebx
05749                 and             esi,GREENMASK
05750 
05751                 shr             ecx,16
05752                 or              ebp,esi
05753 
05754                 xor             eax,0
05755                 mov             esi,pTex
05756 
05757                 rol             ebp,16
05758                 add             edx,dword ptr[DeltaV]
05759 
05760                 mov             ax,word ptr[2*ecx+esi]
05761                 mov             ecx,[ZVal]
05762 
05763                 mov             esi,[ZVal]
05764                 add             ecx,[ZDelta]
05765 
05766                 shr             esi,16
05767                 mov             [ZVal],ecx
05768 
05769                 mov             ecx,pZBufferPtr
05770 
05771                 cmp             si,word ptr[ecx+12]
05772                 jle             Skip3
05773 
05774                 mov             [edi+12],ebp
05775                 mov             word ptr[ecx+12],si
05776                 mov             word ptr[ecx+14],si
05777 
05778 Skip3:
05779                 mov             ecx,edx
05780 
05781                 add             ebx,dword ptr[DeltaU]
05782                 and             ecx,[GHMaskShifted16]
05783 
05784                 and             ebx,[GWMaskShifted]
05785                 xor             eax,0
05786 
05787                 add             ecx,ebx
05788                 mov             esi,pTex
05789 
05790                 shr             ecx,16
05791                 add             edx,dword ptr[DeltaV]
05792 
05793                 rol             eax,16
05794                 mov             ax,word ptr[2*ecx+esi]
05795 
05796                 mov             ecx,edx
05797                 xor             eax,0
05798 
05799                 and             ecx,[GHMaskShifted16]
05800                 mov             esi,eax
05801 
05802                 mov             ebp,eax
05803                 and             esi,REDMASK
05804 
05805                 and             ebp,GREENMASK
05806                 mov             dword ptr[Red],esi
05807 
05808                 mov             dword ptr[Green],ebp
05809                 add             ebx,dword ptr[DeltaU]
05811 
05812 
05813                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05814 
05815                 mov             ebp,eax
05816 
05817                 fmul    st,st(3)                                ; R    LB   LG   LR
05818                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05819 
05820                 and             ebp,BLUEMASK
05821                 and             ebx,[GWMaskShifted]
05822 
05823                 mov             dword ptr[Blue],ebp
05824 
05825                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05826                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05827                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05828                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05829                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05830                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05831                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05832                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05833                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05834                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05835                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05836                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05837 
05838                 mov             eax,dword ptr[Bucket]
05839                 mov             ebp,dword ptr[Bucket2]
05840 
05841                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05842 
05843                 and             eax,REDMASK
05844                 and             ebp,BLUEMASK
05845                 
05846                 mov             esi,dword ptr[Bucket]
05847                 or              ebp,eax
05848 
05849                 add             ecx,ebx
05850                 and             esi,GREENMASK
05851 
05852                 shr             ecx,16
05853                 or              ebp,esi
05854 
05855                 xor             eax,0
05856                 mov             esi,pTex
05857 
05858                 rol             ebp,16
05859                 add             edx,dword ptr[DeltaV]
05860 
05861                 mov             ax,word ptr[2*ecx+esi]
05862                 mov             ecx,[ZVal]
05863 
05864                 mov             esi,[ZVal]
05865                 add             ecx,[ZDelta]
05866 
05867                 shr             esi,16
05868                 mov             [ZVal],ecx
05869 
05870                 mov             ecx,pZBufferPtr
05871 
05872                 cmp             si,word ptr[ecx+16]
05873                 jle             Skip4
05874 
05875                 mov             [edi+16],ebp
05876                 mov             word ptr[ecx+16],si
05877                 mov             word ptr[ecx+18],si
05878 
05879 Skip4:
05880                 mov             ecx,edx
05881 
05882                 add             ebx,dword ptr[DeltaU]
05883                 and             ecx,[GHMaskShifted16]
05884 
05885                 and             ebx,[GWMaskShifted]
05886                 xor             eax,0
05887 
05888                 add             ecx,ebx
05889                 mov             esi,pTex
05890 
05891                 shr             ecx,16
05892                 add             edx,dword ptr[DeltaV]
05893 
05894                 rol             eax,16
05895                 mov             ax,word ptr[2*ecx+esi]
05896 
05897                 mov             ecx,edx
05898                 xor             eax,0
05899 
05900                 and             ecx,[GHMaskShifted16]
05901                 mov             esi,eax
05902 
05903                 mov             ebp,eax
05904                 and             esi,REDMASK
05905 
05906                 and             ebp,GREENMASK
05907                 mov             dword ptr[Red],esi
05908 
05909                 mov             dword ptr[Green],ebp
05910                 add             ebx,dword ptr[DeltaU]
05912 
05913 
05914                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05915 
05916                 mov             ebp,eax
05917 
05918                 fmul    st,st(3)                                ; R    LB   LG   LR
05919                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05920 
05921                 and             ebp,BLUEMASK
05922                 and             ebx,[GWMaskShifted]
05923 
05924                 mov             dword ptr[Blue],ebp
05925 
05926                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05927                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05928                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05929                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05930                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05931                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05932                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05933                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05934                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05935                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05936                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05937                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05938 
05939                 mov             eax,dword ptr[Bucket]
05940                 mov             ebp,dword ptr[Bucket2]
05941 
05942                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05943 
05944                 and             eax,REDMASK
05945                 and             ebp,BLUEMASK
05946                 
05947                 mov             esi,dword ptr[Bucket]
05948                 or              ebp,eax
05949 
05950                 add             ecx,ebx
05951                 and             esi,GREENMASK
05952 
05953                 shr             ecx,16
05954                 or              ebp,esi
05955 
05956                 xor             eax,0
05957                 mov             esi,pTex
05958 
05959                 rol             ebp,16
05960                 add             edx,dword ptr[DeltaV]
05961 
05962                 mov             ax,word ptr[2*ecx+esi]
05963                 mov             ecx,[ZVal]
05964 
05965                 mov             esi,[ZVal]
05966                 add             ecx,[ZDelta]
05967 
05968                 shr             esi,16
05969                 mov             [ZVal],ecx
05970 
05971                 mov             ecx,pZBufferPtr
05972 
05973                 cmp             si,word ptr[ecx+20]
05974                 jle             Skip5
05975 
05976                 mov             [edi+20],ebp
05977                 mov             word ptr[ecx+20],si
05978                 mov             word ptr[ecx+22],si
05979 
05980 Skip5:
05981                 mov             ecx,edx
05982 
05983                 add             ebx,dword ptr[DeltaU]
05984                 and             ecx,[GHMaskShifted16]
05985 
05986                 and             ebx,[GWMaskShifted]
05987                 xor             eax,0
05988 
05989                 add             ecx,ebx
05990                 mov             esi,pTex
05991 
05992                 shr             ecx,16
05993                 add             edx,dword ptr[DeltaV]
05994 
05995                 rol             eax,16
05996                 mov             ax,word ptr[2*ecx+esi]
05997 
05998                 mov             ecx,edx
05999                 xor             eax,0
06000 
06001                 and             ecx,[GHMaskShifted16]
06002                 mov             esi,eax
06003 
06004                 mov             ebp,eax
06005                 and             esi,REDMASK
06006 
06007                 and             ebp,GREENMASK
06008                 mov             dword ptr[Red],esi
06009 
06010                 mov             dword ptr[Green],ebp
06011                 add             ebx,dword ptr[DeltaU]
06013 
06014 
06015                 fild    qword ptr[Red]                  ; r    LB   LG   LR
06016 
06017                 mov             ebp,eax
06018 
06019                 fmul    st,st(3)                                ; R    LB   LG   LR
06020                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
06021 
06022                 and             ebp,BLUEMASK
06023                 and             ebx,[GWMaskShifted]
06024 
06025                 mov             dword ptr[Blue],ebp
06026 
06027                 fmul    st,st(3)                                ; G    R    LB   LG   LR
06028                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
06029                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
06030                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
06031                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
06032                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
06033                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
06034                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
06035                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
06036                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
06037                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
06038                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
06039 
06040                 mov             eax,dword ptr[Bucket]
06041                 mov             ebp,dword ptr[Bucket2]
06042 
06043                 fstp    qword ptr[Bucket]               ; LB   LG   LR
06044 
06045                 and             eax,REDMASK
06046                 and             ebp,BLUEMASK
06047                 
06048                 mov             esi,dword ptr[Bucket]
06049                 or              ebp,eax
06050 
06051                 add             ecx,ebx
06052                 and             esi,GREENMASK
06053 
06054                 shr             ecx,16
06055                 or              ebp,esi
06056 
06057                 xor             eax,0
06058                 mov             esi,pTex
06059 
06060                 rol             ebp,16
06061                 add             edx,dword ptr[DeltaV]
06062 
06063                 mov             ax,word ptr[2*ecx+esi]
06064                 mov             ecx,[ZVal]
06065 
06066                 mov             esi,[ZVal]
06067                 add             ecx,[ZDelta]
06068 
06069                 shr             esi,16
06070                 mov             [ZVal],ecx
06071 
06072                 mov             ecx,pZBufferPtr
06073 
06074                 cmp             si,word ptr[ecx+24]
06075                 jle             Skip6
06076 
06077                 mov             [edi+24],ebp
06078                 mov             word ptr[ecx+24],si
06079                 mov             word ptr[ecx+26],si
06080 
06081 Skip6:
06082                 mov             ecx,edx
06083 
06084                 add             ebx,dword ptr[DeltaU]
06085                 and             ecx,[GHMaskShifted16]
06086 
06087                 and             ebx,[GWMaskShifted]
06088                 xor             eax,0
06089 
06090                 add             ecx,ebx
06091                 mov             esi,pTex
06092 
06093                 shr             ecx,16
06094                 add             edx,dword ptr[DeltaV]
06095 
06096                 rol             eax,16
06097                 mov             ax,word ptr[2*ecx+esi]
06098 
06099                 mov             ecx,edx
06100                 xor             eax,0
06101 
06102                 and             ecx,[GHMaskShifted16]
06103                 mov             esi,eax
06104 
06105                 mov             ebp,eax
06106                 and             esi,REDMASK
06107 
06108                 and             ebp,GREENMASK
06109                 mov             dword ptr[Red],esi
06110 
06111                 mov             dword ptr[Green],ebp
06112                 add             ebx,dword ptr[DeltaU]
06114                 fild    qword ptr[Red]                  ; r    LB   LG   LR
06115 
06116                 mov             ebp,eax
06117 
06118                 fmul    st,st(3)                                ; R    LB   LG   LR
06119                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
06120 
06121                 and             ebp,BLUEMASK
06122                 and             ebx,[GWMaskShifted]
06123 
06124                 mov             dword ptr[Blue],ebp
06125 
06126                 fmul    st,st(3)                                ; G    R    LB   LG   LR
06127                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
06128                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
06129                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
06130                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
06131                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
06132                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
06133                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
06134                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
06135                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
06136                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
06137                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
06138 
06139                 mov             eax,dword ptr[Bucket]
06140                 mov             ebp,dword ptr[Bucket2]
06141 
06142                 fstp    qword ptr[Bucket]               ; LB   LG   LR
06143 
06144                 and             eax,REDMASK
06145                 and             ebp,BLUEMASK
06146                 
06147                 mov             esi,dword ptr[Bucket]
06148                 or              ebp,eax
06149 
06150                 fstp    dword ptr[Bucket]
06151                 fstp    dword ptr[Bucket2]
06152                 fstp    dword ptr[Bucket]
06153 
06154                 and             esi,GREENMASK
06155 
06156                 fld             dword ptr[FTemp5]
06157                 fld             dword ptr[FTemp4]
06158 
06159                 or              ebp,esi
06160 
06161                 fld             dword ptr[FTemp3]
06162                 fld             dword ptr[FTemp2]
06163 
06164                 rol             ebp,16
06165 
06166                 fld             dword ptr[FTemp1]
06167                 fld             dword ptr[FTemp0]
06168                 mov             ecx,[ZVal]
06169 
06170                 mov             esi,[ZVal]
06171                 add             ecx,[ZDelta]
06172 
06173                 shr             esi,16
06174                 mov             [ZVal],ecx
06175 
06176                 mov             ecx,pZBufferPtr
06177 
06178                 cmp             si,word ptr[ecx+28]
06179                 jle             Skip7
06180 
06181                 mov             dword ptr[edi+28],ebp
06182                 mov             word ptr[ecx+28],si
06183                 mov             word ptr[ecx+30],si
06184 
06185 Skip7:
06186                 pop             ebp
06187 
06188 
06189                 ; get corrected right side deltas ; st0  st1  st2  st3  st4  st5  st6  st7
06190                                                                                 ; ZR   UZR  ZRi  VZR  UL   VL
06191                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
06192                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
06193                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
06194                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
06195 
06196                 add             edi,32                                  ; move screen pointer to start of next aspan
06197                 add             [pZBufferPtr],32
06198                 dec             [NumASpans]                     ; dec num affine spans
06199                 jnz             SpanLoop16
06200 
06201 HandleLeftoverPixels16:
06202 
06203                 mov             esi,[pTex]
06204 
06205 
06206                 cmp             [RemainingCount],0
06207                 jz              FPUReturn16
06208 
06209                 //need one more stack spot
06210                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
06211                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
06212                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
06213                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
06214                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
06215                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
06216                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
06217                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
06218                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
06219                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06220 
06221                 mov             ebx,dword ptr[Bucket]
06222                 mov             eax,dword ptr[Bucket2]
06223 
06224                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
06225                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
06226 
06227                 add             ebx,dword ptr[UAdjust]
06228                 add             eax,dword ptr[UAdjustL]
06229 
06230                 mov             [U1],ebx
06231                 mov             [UFixed],eax
06232 
06233                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
06234                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
06235                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
06236                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
06237                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
06238                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
06239                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06240 
06241                 mov             ebx,dword ptr[Bucket]
06242                 mov             eax,dword ptr[Bucket2]
06243 
06244                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
06245 
06246                 add             ebx,dword ptr[VAdjust]
06247                 add             eax,dword ptr[VAdjustL]
06248 
06249                 mov             [V1],ebx
06250                 mov             [VFixed],eax
06251 
06252                 dec             [RemainingCount]
06253                 jz              OnePixelSpan16
06254 
06255 
06256                 //must get rid of this wasted time
06257                 fstp    [FloatTemp]                             ; inv. inv. inv. inv. UL   VL
06258                 fstp    [FloatTemp]                             ; inv. inv. inv. UL   VL
06259                 fstp    [FloatTemp]                             ; inv. inv. UL   VL
06260                 fstp    [FloatTemp]                             ; inv. UL   VL
06261                 fstp    [FloatTemp]                             ; UL   VL
06262                 fild    [y]                                             ; y    UL   VL
06263                 fild    [x2]                                    ; xr   y    UL   VL
06264 
06265                 fld             [UDivZStepY]                    ; UZdY xr   y    UL   VL
06266                 fld             [UDivZStepX]                    ; UZdX UZdY xr   y    UL   VL
06267                 fmul    st,st(2)                                ; UZX  UZdY xr   y    UL   VL
06268                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY xr   y    UL   VL
06269                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY xr   y    UL   VL
06270                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX xr   y    UL   VL
06271                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX xr   y    UL   VL
06272                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX xr   y    UL   VL
06273                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX xr   y    UL   VL
06274                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS xr   y    UL   VL
06275                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS xr   y    UL   VL
06276                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS xr   y    UL   VL
06277                 faddp   st(3),st                                ; VZdY VZX  UZ   xr   y    UL   VL
06278                 fmul    st,st(4)                                ; VZY  VZX  UZ   xr   y    UL   VL
06279                 fxch    st(1)                                   ; VZX  VZY  UZ   xr   y    UL   VL
06280                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   xr   y    UL   VL
06281                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   xr   y    UL   VL
06282                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y    UL   VL
06283                 faddp   st(1),st                                ; VZ   UZ   ZX   y    UL   VL
06284                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y    UL   VL
06285                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY   UL   VL
06286                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY   UL   VL
06287                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY   UL   VL
06288 
06289                 faddp   st(3),st                                ; UZ   VZ   Zi   UL   VL
06290                 fld1                                                    ; 1    UZ   VZ   Zi   UL   VL
06291                 fdiv    st,st(3)                                ; ZR   UZ   VZ   Zi   UL   VL
06292 
06293                 fld             st                                              ; ZR   ZR   UZ   VZ   Zi   UL   VL
06294                 fmul    st,st(3)                                ; VR   ZR   UZ   VZ   Zi   UL   VL
06295                 fxch    st(1)                                   ; ZR   VR   UZ   VZ   Zi   UL   VL
06296                 fmul    st,st(2)                                ; UR   VR   UZ   VZ   Zi   UL   VL
06297 
06298                 //lazy idiv below... should 1/int mul mul
06299 
06300                 ; calculate deltas                              ; st0  st1  st2  st3  st4  st5  st6  st7
06301                 fsubr   st(5),st                                ; UR   VR   inv. inv. inv. dU   VL
06302                 fxch    st(1)                                   ; VR   UR   inv. inv. inv. dU   VL
06303                 fsubr   st(6),st                                ; VR   UR   inv. inv. inv. dU   dV
06304                 fxch    st(6)                                   ; dV   UR   inv. inv. inv. dU   VR
06305                 fidiv   dword ptr[RemainingCount];dv   UR   inv. inv. inv. dU   VR
06306                 fadd    qword ptr[MipMagic]             ; dvk  UR   inv. inv. inv. dU   VR
06307                 fxch    st(5)                                   ; dU   UR   inv. inv. inv. dvk  VR
06308                 fidiv   dword ptr[RemainingCount];du   UR   inv. inv. inv. dvk  VR
06309                 fadd    qword ptr[MipMagic]             ; duk  UR   inv. inv. inv. dvk  VR
06310                 fxch    st(5)                                   ; dvk  UR   inv. inv. inv. duk  VR
06311                 fstp    qword ptr[DeltaV]               ; UR   inv. inv. inv. duk  VR
06312                 fxch    st(4)                                   ; duk  inv. inv. inv. UR   VR
06313                 fstp    qword ptr[DeltaU]               ; inv. inv. inv. UR   VR
06314                 fld             st(1)                                   ; inv. inv. inv. inv. UR   VR
06315                 fld             st(2)                                   ; inv. inv. inv. inv. inv. UR   VR
06316 
06317 OnePixelSpan16:
06318                 // Clamp U/V
06319                 mov             ebx,[UFixed]
06320                 cmp             ebx,MaxU
06321                 jle             TryClampU116
06322                 mov             ecx,MaxU
06323                 mov             dword ptr[UFixed],ecx
06324                 jmp             NoClampU116
06325 
06326 TryClampU116:
06327                 cmp             ebx,0
06328                 jge             NoClampU116
06329                 mov             dword ptr[UFixed],0
06330 NoClampU116:
06331                 mov             eax,[VFixed]
06332                 cmp             eax,MaxV
06333                 jle             TryClampV116
06334                 mov             ecx,MaxV
06335                 mov             dword ptr[VFixed],ecx
06336                 jmp             NoClampV116
06337 
06338 TryClampV116:
06339                 cmp             eax,0
06340                 jge             NoClampV116
06341                 mov             dword ptr[VFixed],0
06342 
06343 NoClampV116:
06344                 mov             esi,dword ptr[UFixed]
06345                 mov             eax,dword ptr[VFixed]
06346 
06347                 mov ecx, GMipLevel4_8
06348                 sar esi, cl
06349                 sar eax, cl
06350                 and esi, 0ffh
06351                 and eax, 0ffh
06352                 mov UDist, esi
06353                 mov VDist, eax
06354 
06355                 mov esi,dword ptr[UFixed]
06356                 mov eax,dword ptr[VFixed]
06357                 mov ecx, GMipLevel20
06358                 shr esi, cl
06359                 shr eax, cl
06360 
06361                 imul eax, GLightWidth
06362                 add esi, eax
06363 
06364                 mov edx, esi
06365                 shl esi, 1
06366                 add edx, esi
06367 
06368                 add edx, GLightData
06369 
06370                 // Interpolate accross top
06371                 xor ecx, ecx
06372                 mov cl, [edx+3]
06373                 mov eax, ecx
06374                 mov cl, [edx+0]
06375                 sub eax, ecx
06376                 imul eax, UDist
06377                 shl ecx, 8
06378                 add eax, ecx
06379                 mov [R1], eax
06380 
06381                 xor ecx, ecx
06382                 mov cl, [edx+4]
06383                 mov eax, ecx
06384                 mov cl, [edx+1]
06385                 sub eax, ecx
06386                 imul eax, UDist
06387                 shl ecx, 8
06388                 add eax, ecx
06389                 mov [G1], eax
06390 
06391                 xor ecx, ecx
06392                 mov cl, [edx+5]
06393                 mov eax, ecx
06394                 mov cl, [edx+2]
06395                 sub eax, ecx
06396                 imul eax, UDist
06397                 shl ecx, 8
06398                 add eax, ecx
06399                 mov [B1], eax
06400 
06401                 add edx, GLightWidth
06402                 add edx, GLightWidth
06403                 add edx, GLightWidth
06404 
06405                 // Interpolate accross bottom
06406                 xor ecx, ecx
06407                 mov cl, [edx+3]
06408                 mov eax, ecx
06409                 mov cl, [edx+0]
06410                 sub eax, ecx
06411                 imul eax, UDist
06412                 shl ecx, 8
06413                 add eax, ecx
06414                 mov [R2], eax
06415 
06416                 xor ecx, ecx
06417                 mov cl, [edx+4]
06418                 mov eax, ecx
06419                 mov cl, [edx+1]
06420                 sub eax, ecx
06421                 imul eax, UDist
06422                 shl ecx, 8
06423                 add eax, ecx
06424                 mov [G2], eax
06425 
06426                 xor ecx, ecx
06427                 mov cl, [edx+5]
06428                 mov eax, ecx
06429                 mov cl, [edx+2]
06430                 sub eax, ecx
06431                 imul eax, UDist
06432                 shl ecx, 8
06433                 add eax, ecx
06434                 mov [B2], eax
06435 
06436                 // Interpolate down
06437                 mov eax, [R2]
06438                 sub eax, [R1]
06439                 imul eax, VDist
06440                 sar eax, 8
06441                 add eax, [R1]
06442                 shr eax, 8
06443                 and     eax,0feh
06444 
06445                 mov [RR1], eax
06446 
06447                 mov eax, [G2]
06448                 sub eax, [G1]
06449                 imul eax, VDist
06450                 sar eax, 8
06451                 add eax, [G1]
06452                 shr eax, 8
06453                 and     eax,0feh
06454 
06455                 mov [GG1], eax
06456 
06457                 mov eax, [B2]
06458                 sub eax, [B1]
06459                 imul eax, VDist
06460                 sar eax, 8
06461                 add eax, [B1]
06462                 shr eax, 8
06463                 and     eax,0feh
06464 
06465                 mov [BB1], eax
06466 
06467                 fstp    [FTemp0]
06468                 fstp    [FTemp1]
06469                 fstp    [FTemp2]
06470                 fstp    [FTemp3]
06471                 fstp    [FTemp4]
06472                 fstp    [FTemp5]
06473 
06474                 mov             ebx,dword ptr[U1]
06475                 mov             edx,dword ptr[V1]
06476 
06477                 fild    [RR1]                                   ; LR
06478                 fild    [GG1]                                   ; LG   LR
06479                 fild    [BB1]                                   ; LB   LG   LR
06480 
06481                 mov             ecx,[VShift]
06482                 add             edx,dword ptr[VAdjust2]
06483 
06484                 add             ebx,dword ptr[UAdjust2]
06485                 mov             eax,dword ptr[DeltaV]
06486 
06487                 shl             eax,cl
06488                 mov             esi,pTex
06489 
06490                 shl             edx,cl
06491                 mov             dword ptr[DeltaV],eax
06492 
06493                 mov             eax,[ZDelta]
06494                 mov             ecx,[ZVal]
06495 
06496                 sar             eax,1
06497                 push    ebp
06498 
06499                 mov             [ZDelta],eax
06500 
06501 
06502 LeftoverLoop16:
06503                 mov             eax,edx
06504                 and             ebx,[GWMaskShifted]
06505 
06506                 and             eax,[GHMaskShifted16]
06507 
06508                 add             eax,ebx
06509                 add             ebx,dword ptr[DeltaU]
06510 
06511                 shr             eax,16
06512                 add             edi,2
06513 
06514                 mov             ax,word ptr[2*eax+esi]
06515                 add             edx,dword ptr[DeltaV]
06516 
06517                 xor             eax,0
06518 
06519                 mov             esi,eax
06520                 mov             ebp,eax
06521 
06522                 and             esi,REDMASK
06523                 and             ebp,GREENMASK
06524 
06525                 mov             dword ptr[Red],esi
06526                 mov             dword ptr[Green],ebp
06527 
06528                 fild    qword ptr[Red]                  ; r    LB   LG   LR
06529 
06530                 mov             ebp,eax
06531 
06532                 fmul    st,st(3)                                ; R    LB   LG   LR
06533                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
06534 
06535                 and             ebp,BLUEMASK
06536 
06537                 mov             dword ptr[Blue],ebp
06538 
06539                 fmul    st,st(3)                                ; G    R    LB   LG   LR
06540                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
06541                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
06542                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
06543                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
06544                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
06545                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
06546                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
06547                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
06548                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
06549                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
06550                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
06551 
06552                 mov             eax,dword ptr[Bucket]
06553                 mov             ebp,dword ptr[Bucket2]
06554 
06555                 fstp    qword ptr[Bucket]               ; LB   LG   LR
06556 
06557                 and             eax,REDMASK
06558                 and             ebp,BLUEMASK
06559                 
06560                 mov             esi,dword ptr[Bucket]
06561                 or              ebp,eax
06562 
06563                 and             esi,GREENMASK
06564                 mov             eax,ecx
06565 
06566                 or              ebp,esi
06567 
06568                 shr             eax,16
06569                 mov             esi,pZBufferPtr
06570 
06571                 cmp             ax,word ptr[esi]
06572                 jle             SkipLeftOver
06573 
06574                 mov             word ptr[edi-2],bp
06575                 mov             word ptr[esi],ax
06576 
06577 SkipLeftOver:
06578                 add             ecx,[ZDelta]
06579                 mov             esi,pTex
06580 
06581                 add             pZBufferPtr,2
06582 
06583                 dec             [RemainingCount]
06584                 jge             LeftoverLoop16
06585 
06586                 pop             ebp
06587 
06588 
06589 FPUReturn16:
06590                 ffree   st(0)
06591                 ffree   st(1)
06592                 ffree   st(2)
06593                 ffree   st(3)
06594                 ffree   st(4)
06595                 ffree   st(5)
06596                 ffree   st(6)
06597 
06598 Return16:
06599                 pop             edi
06600                 pop             esi
06601                 pop             ecx
06602                 pop             ebx
06603         }
06604 }
06605 
06606 void DrawSpan16_AsmLitZWriteX86FPU(int32 x1, int32 x2, int32 y)
06607 {
06608         TDest   =Dest;
06609         _asm
06610         {
06611                 push    ebx
06612                 push    ecx
06613                 push    esi
06614                 push    edi
06615 
06616                 mov             eax,x1
06617                 mov             ecx,x2
06618                 sub             ecx,eax
06619                 jle             Return16
06620 
06621                 mov             edi,[GBitPtr16]
06622                 mov             pTex,edi
06623 
06624                 fild    [y]                                             ; y
06625 
06626                 mov             esi,x1
06627                 mov             edi,[TDest]
06628 
06629                 shl             esi,1
06630                 mov             eax,ecx
06631 
06632                 add             edi,esi
06633                 add             pZBufferPtr,esi
06634 
06635                 shr             ecx,4
06636                 and             eax,15
06637                 _emit 75h
06638                 _emit 06h
06639                 dec             ecx
06640                 mov             eax,16
06641 
06642                 mov             [NumASpans],ecx
06643                 mov             [RemainingCount],eax
06644 
06645                 fild [x1]                                               ; x    y
06646 
06647                 //decoder won't keep up with these huge instructions
06648                 //need to find some int instructions to cram in here somewhere
06649                 fld             [UDivZStepY]                    ; UZdY x    y
06650                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
06651                 fmul    st,st(2)                                ; UZX  UZdY x    y
06652                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
06653                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
06654                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
06655                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
06656                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
06657                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
06658                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
06659                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
06660                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
06661                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
06662                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
06663                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
06664                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
06665                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
06666 
06667                 //zbuffer step action
06668                 fld             [ZiStepX]
06669                 fmul    dword ptr[ZBufferPrec]
06670                 fmul    dword ptr[Two]
06671                 fistp   dword ptr[ZDelta]
06672 
06673                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
06674                 faddp   st(1),st                                ; VZ   UZ   ZX   y
06675                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
06676                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
06677                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
06678                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
06679 
06680                 //room for two cycles of int instructions here
06681 
06682                 faddp   st(3),st                                ; UZ   VZ   Zi
06683                 fld1                                                    ; 1    UZ   VZ   Zi
06684                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
06685 
06686                 //room for 18 cycles of int instructions here
06687 
06688                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
06689                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
06690                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
06691 
06692                 //zbuffer action
06693                 fld             st
06694                 fmul    dword ptr[ZBufferPrec]
06695                 fistp   dword ptr[ZVal]
06696 
06697                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
06698                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
06699                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
06700                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
06701                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
06702                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
06703                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
06704                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
06705                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
06706 
06707                 //room for 18 cycles of int stuff here
06708 
06709                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
06710                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
06711                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
06712                 //fmul stall one cycle
06713                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
06714 
06715                 test    ecx,ecx
06716                 jz              HandleLeftoverPixels16
06717 
06718 SpanLoop16:
06719                 //need one more stack spot
06720                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
06721                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
06722                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
06723                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
06724                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
06725                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
06726                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
06727                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
06728                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
06729                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06730 
06731                 mov             ebx,dword ptr[Bucket]
06732                 mov             eax,dword ptr[Bucket2]
06733 
06734                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
06735                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
06736 
06737                 add             ebx,dword ptr[UAdjust]
06738                 add             eax,dword ptr[UAdjustL]
06739 
06740                 mov             [U1],ebx
06741                 mov             [UFixed],eax
06742 
06743                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
06744                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
06745                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
06746                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
06747                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
06748                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
06749                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06750                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
06751 
06752                 mov             ebx,dword ptr[Bucket]
06753                 mov             eax,dword ptr[Bucket2]
06754 
06755                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
06756 
06757                 add             ebx,dword ptr[VAdjust]
06758                 add             eax,dword ptr[VAdjustL]
06759 
06760                 mov             [V1],ebx
06761                 mov             [VFixed],eax
06762 
06763                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
06764                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
06765                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
06766                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
06767                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
06768                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
06769                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
06770                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
06771                 //gotta do this to get em lined back up right
06772                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
06773                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
06774 
06775                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
06776                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
06777                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
06778                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
06779                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
06780                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
06781                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
06782                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
06783                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
06784                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
06785 
06786                 // Clamp U/V
06787                 mov             ebx,[UFixed]
06788                 cmp             ebx,MaxU
06789                 jle             TryClampU016
06790                 mov             ecx,MaxU
06791                 mov             dword ptr[UFixed],ecx
06792                 jmp             NoClampU016
06793 
06794 TryClampU016:
06795                 cmp             ebx,0
06796                 jge             NoClampU016
06797                 mov             dword ptr[UFixed],0
06798 NoClampU016:
06799                 mov             eax,[VFixed]
06800                 cmp             eax,MaxV
06801                 jle             TryClampV016
06802                 mov             ecx,MaxV
06803                 mov             dword ptr[VFixed],ecx
06804                 jmp             NoClampV016
06805 
06806 TryClampV016:
06807                 cmp             eax,0
06808                 jge             NoClampV016
06809                 mov             dword ptr[VFixed],0
06810 
06811 NoClampV016:
06812 
06813 
06814                 mov esi,dword ptr[UFixed]
06815                 mov eax,dword ptr[VFixed]
06816 
06817 
06818                 mov ecx, GMipLevel4_8
06819                 sar esi, cl
06820                 sar eax, cl
06821                 and esi, 0ffh
06822                 and eax, 0ffh
06823                 mov UDist, esi
06824                 mov VDist, eax
06825 
06826                 mov esi,dword ptr[UFixed]
06827                 mov eax,dword ptr[VFixed]
06828                 mov ecx, GMipLevel20
06829                 shr esi, cl
06830                 shr eax, cl
06831 
06832                 imul eax, GLightWidth
06833                 add esi, eax
06834 
06835                 mov edx, esi
06836                 shl esi, 1
06837                 add edx, esi
06838 
06839                 add edx, GLightData
06840 
06841                 // Interpolate accross top
06842                 xor ecx, ecx
06843                 mov cl, [edx+3]
06844                 mov eax, ecx
06845                 mov cl, [edx+0]
06846                 sub eax, ecx
06847                 imul eax, UDist
06848                 shl ecx, 8
06849                 add eax, ecx
06850                 mov [R1], eax
06851 
06852                 xor ecx, ecx
06853                 mov cl, [edx+4]
06854                 mov eax, ecx
06855                 mov cl, [edx+1]
06856                 sub eax, ecx
06857                 imul eax, UDist
06858                 shl ecx, 8
06859                 add eax, ecx
06860                 mov [G1], eax
06861 
06862                 xor ecx, ecx
06863                 mov cl, [edx+5]
06864                 mov eax, ecx
06865                 mov cl, [edx+2]
06866                 sub eax, ecx
06867                 imul eax, UDist
06868                 shl ecx, 8
06869                 add eax, ecx
06870                 mov [B1], eax
06871 
06872                 add edx, GLightWidth
06873                 add edx, GLightWidth
06874                 add edx, GLightWidth
06875 
06876                 // Interpolate accross bottom
06877                 xor ecx, ecx
06878                 mov cl, [edx+3]
06879                 mov eax, ecx
06880                 mov cl, [edx+0]
06881                 sub eax, ecx
06882                 imul eax, UDist
06883                 shl ecx, 8
06884                 add eax, ecx
06885                 mov [R2], eax
06886 
06887                 xor ecx, ecx
06888                 mov cl, [edx+4]
06889                 mov eax, ecx
06890                 mov cl, [edx+1]
06891                 sub eax, ecx
06892                 imul eax, UDist
06893                 shl ecx, 8
06894                 add eax, ecx
06895                 mov [G2], eax
06896 
06897                 xor ecx, ecx
06898                 mov cl, [edx+5]
06899                 mov eax, ecx
06900                 mov cl, [edx+2]
06901                 sub eax, ecx
06902                 imul eax, UDist
06903                 shl ecx, 8
06904                 add eax, ecx
06905                 mov [B2], eax
06906 
06907                 // Interpolate down
06908                 mov eax, [R2]
06909                 sub eax, [R1]
06910                 imul eax, VDist
06911                 sar eax, 8
06912                 add eax, [R1]
06913                 shr eax, 8
06914                 and     eax,0feh
06915 
06916                 mov [RR1], eax
06917 
06918                 mov eax, [G2]
06919                 sub eax, [G1]
06920                 imul eax, VDist
06921                 sar eax, 8
06922                 add eax, [G1]
06923                 shr eax, 8
06924                 and     eax,0feh
06925 
06926                 mov [GG1], eax
06927 
06928                 mov eax, [B2]
06929                 sub eax, [B1]
06930                 imul eax, VDist
06931                 sar eax, 8
06932                 add eax, [B1]
06933                 shr eax, 8
06934                 and     eax,0feh
06935 
06936                 mov [BB1], eax
06937 
06938                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
06939                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
06940                 fstp    [FTemp2]                                ; VZR  UL   VL
06941                 fstp    [FTemp3]                                ; UL   VL
06942                 fstp    [FTemp4]                                ; VL
06943                 fstp    [FTemp5]                                ; 
06944 
06945                 fild    [RR1]                                   ; LR
06946                 fild    [GG1]                                   ; LG   LR
06947                 fild    [BB1]                                   ; LB   LG   LR
06948                 
06949                 
06950                 mov             ebx,dword ptr[U1]
06951                 mov             eax,dword ptr[V1]
06952 
06953                 add             ebx,dword ptr[UAdjust2]
06954                 add             eax,dword ptr[VAdjust2]
06955 
06956                 mov             ecx,[VShift]
06957                 mov             dword ptr[Bucket],ebx
06958 
06959                 shl             eax,cl
06960 
06961                 push    ebp
06962 
06963                 mov             dword ptr[Bucket2],eax
06964                 mov             ebp,dword ptr[DeltaV]
06965 
06966                 and             eax,[GHMaskShifted16]
06967                 and             ebx,[GWMaskShifted]
06968 
06969                 shl             ebp,cl
06970                 add             eax,ebx
06971 
06972                 mov             edx,dword ptr[Bucket2]
06973                 mov             esi,pTex
06974 
06975                 shr             eax,16
06976                 mov             dword ptr[DeltaV],ebp
06977 
06978                 mov             ebx,dword ptr[Bucket]
06979 
06980                 mov             ax,word ptr[2*eax+esi]
06981                 add             edx,dword ptr[DeltaV]
06982 
06983                 xor             eax,0
06984                 mov             ecx,edx
06985 
06986                 add             ebx,dword ptr[DeltaU]
06987                 and             ecx,[GHMaskShifted16]
06988 
06989                 rol             eax,16
06990                 and             ebx,[GWMaskShifted]
06991 
06992                 xor             eax,0
06993                 add             ecx,ebx
06994 
06995                 add             edx,dword ptr[DeltaV]
06996                 mov             esi,pTex
06997 
06998                 shr             ecx,16
06999                 add             ebx,dword ptr[DeltaU]
07000 
07001                 mov             ax,word ptr[2*ecx+esi]
07002                 mov             ecx,edx
07003 
07004                 xor             eax,0
07005                 and             ecx,[GHMaskShifted16]
07006 
07007                 mov             esi,eax
07008                 mov             ebp,eax
07009 
07010                 and             esi,REDMASK
07011                 and             ebp,GREENMASK
07012 
07013                 mov             dword ptr[Red],esi
07014                 mov             dword ptr[Green],ebp
07015 
07016                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07017 
07018                 mov             ebp,eax
07019 
07020                 fmul    st,st(3)                                ; R    LB   LG   LR
07021                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07022 
07023                 and             ebp,BLUEMASK
07024                 and             ebx,[GWMaskShifted]
07025 
07026                 mov             dword ptr[Blue],ebp
07027 
07028                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07029                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07030                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07031                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07032                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07033                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07034                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07035                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07036                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07037                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07038                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07039                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07040 
07041                 mov             eax,dword ptr[Bucket]
07042                 mov             ebp,dword ptr[Bucket2]
07043 
07044                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07045 
07046                 and             eax,REDMASK
07047                 and             ebp,BLUEMASK
07048                 
07049                 mov             esi,dword ptr[Bucket]
07050                 or              ebp,eax
07051 
07052                 add             ecx,ebx
07053                 and             esi,GREENMASK
07054 
07055                 shr             ecx,16
07056                 or              ebp,esi
07057 
07058                 xor             eax,0
07059                 mov             esi,pTex
07060 
07061                 rol             ebp,16
07062                 add             edx,dword ptr[DeltaV]
07063 
07064                 mov             ax,word ptr[2*ecx+esi]
07065                 mov             ecx,[ZVal]
07066 
07067                 mov             esi,[ZVal]
07068                 add             ecx,[ZDelta]
07069 
07070                 shr             esi,16
07071                 mov             [ZVal],ecx
07072 
07073                 mov             ecx,pZBufferPtr
07074                 mov             [edi+0],ebp
07075 
07076                 mov             word ptr[ecx+0],si
07077                 mov             word ptr[ecx+2],si
07078                 mov             ecx,edx
07079 
07080                 add             ebx,dword ptr[DeltaU]
07081                 and             ecx,[GHMaskShifted16]
07082 
07083                 and             ebx,[GWMaskShifted]
07084                 xor             eax,0
07085 
07086                 add             ecx,ebx
07087                 mov             esi,pTex
07088 
07089                 rol             eax,16
07090                 add             edx,dword ptr[DeltaV]
07091 
07092                 shr             ecx,16
07093                 add             ebx,dword ptr[DeltaU]
07094 
07095                 mov             ax,word ptr[2*ecx+esi]
07096 
07097                 mov             ecx,edx
07098                 xor             eax,0
07099 
07100                 and             ecx,[GHMaskShifted16]
07101                 mov             esi,eax
07102 
07103                 mov             ebp,eax
07104                 and             esi,REDMASK
07105 
07106                 and             ebp,GREENMASK
07107                 mov             dword ptr[Red],esi
07108 
07109                 mov             dword ptr[Green],ebp
07111 
07112 
07113                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07114 
07115                 mov             ebp,eax
07116 
07117                 fmul    st,st(3)                                ; R    LB   LG   LR
07118                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07119 
07120                 and             ebp,BLUEMASK
07121                 and             ebx,[GWMaskShifted]
07122 
07123                 mov             dword ptr[Blue],ebp
07124 
07125                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07126                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07127                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07128                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07129                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07130                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07131                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07132                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07133                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07134                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07135                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07136                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07137 
07138                 mov             eax,dword ptr[Bucket]
07139                 mov             ebp,dword ptr[Bucket2]
07140 
07141                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07142 
07143                 and             eax,REDMASK
07144                 and             ebp,BLUEMASK
07145                 
07146                 mov             esi,dword ptr[Bucket]
07147                 or              ebp,eax
07148 
07149                 add             ecx,ebx
07150                 and             esi,GREENMASK
07151 
07152                 shr             ecx,16
07153                 or              ebp,esi
07154 
07155                 xor             eax,0
07156                 mov             esi,pTex
07157 
07158                 rol             ebp,16
07159                 add             edx,dword ptr[DeltaV]
07160 
07161                 mov             ax,word ptr[2*ecx+esi]
07162                 mov             ecx,[ZVal]
07163 
07164                 mov             esi,[ZVal]
07165                 add             ecx,[ZDelta]
07166 
07167                 shr             esi,16
07168                 mov             [ZVal],ecx
07169 
07170                 mov             ecx,pZBufferPtr
07171                 mov             [edi+4],ebp
07172 
07173                 mov             word ptr[ecx+4],si
07174                 mov             word ptr[ecx+6],si
07175                 mov             ecx,edx
07176 
07177                 add             ebx,dword ptr[DeltaU]
07178                 and             ecx,[GHMaskShifted16]
07179 
07180                 and             ebx,[GWMaskShifted]
07181                 xor             eax,0
07182 
07183                 add             ecx,ebx
07184                 mov             esi,pTex
07185 
07186                 rol             eax,16
07187                 add             edx,dword ptr[DeltaV]
07188 
07189                 shr             ecx,16
07190                 add             ebx,dword ptr[DeltaU]
07191 
07192                 mov             ax,word ptr[2*ecx+esi]
07193 
07194                 mov             ecx,edx
07195                 xor             eax,0
07196 
07197                 and             ecx,[GHMaskShifted16]
07198                 mov             esi,eax
07199 
07200                 mov             ebp,eax
07201                 and             esi,REDMASK
07202 
07203                 and             ebp,GREENMASK
07204                 mov             dword ptr[Red],esi
07205 
07206                 mov             dword ptr[Green],ebp
07208 
07209 
07210                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07211 
07212                 mov             ebp,eax
07213 
07214                 fmul    st,st(3)                                ; R    LB   LG   LR
07215                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07216 
07217                 and             ebp,BLUEMASK
07218                 and             ebx,[GWMaskShifted]
07219 
07220                 mov             dword ptr[Blue],ebp
07221 
07222                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07223                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07224                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07225                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07226                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07227                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07228                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07229                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07230                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07231                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07232                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07233                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07234 
07235                 mov             eax,dword ptr[Bucket]
07236                 mov             ebp,dword ptr[Bucket2]
07237 
07238                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07239 
07240                 and             eax,REDMASK
07241                 and             ebp,BLUEMASK
07242                 
07243                 mov             esi,dword ptr[Bucket]
07244                 or              ebp,eax
07245 
07246                 add             ecx,ebx
07247                 and             esi,GREENMASK
07248 
07249                 shr             ecx,16
07250                 or              ebp,esi
07251 
07252                 xor             eax,0
07253                 mov             esi,pTex
07254 
07255                 rol             ebp,16
07256                 add             edx,dword ptr[DeltaV]
07257 
07258                 mov             ax,word ptr[2*ecx+esi]
07259                 mov             ecx,[ZVal]
07260 
07261                 mov             esi,[ZVal]
07262                 add             ecx,[ZDelta]
07263 
07264                 shr             esi,16
07265                 mov             [ZVal],ecx
07266 
07267                 mov             ecx,pZBufferPtr
07268                 mov             [edi+8],ebp
07269 
07270                 mov             word ptr[ecx+8],si
07271                 mov             word ptr[ecx+10],si
07272                 mov             ecx,edx
07273 
07274                 add             ebx,dword ptr[DeltaU]
07275                 and             ecx,[GHMaskShifted16]
07276 
07277                 and             ebx,[GWMaskShifted]
07278                 xor             eax,0
07279 
07280                 add             ecx,ebx
07281                 mov             esi,pTex
07282 
07283                 shr             ecx,16
07284                 add             edx,dword ptr[DeltaV]
07285 
07286                 rol             eax,16
07287                 mov             ax,word ptr[2*ecx+esi]
07288 
07289                 mov             ecx,edx
07290                 xor             eax,0
07291 
07292                 and             ecx,[GHMaskShifted16]
07293                 mov             esi,eax
07294 
07295                 mov             ebp,eax
07296                 and             esi,REDMASK
07297 
07298                 and             ebp,GREENMASK
07299                 mov             dword ptr[Red],esi
07300 
07301                 mov             dword ptr[Green],ebp
07302                 add             ebx,dword ptr[DeltaU]
07304 
07305 
07306                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07307 
07308                 mov             ebp,eax
07309 
07310                 fmul    st,st(3)                                ; R    LB   LG   LR
07311                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07312 
07313                 and             ebp,BLUEMASK
07314                 and             ebx,[GWMaskShifted]
07315 
07316                 mov             dword ptr[Blue],ebp
07317 
07318                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07319                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07320                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07321                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07322                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07323                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07324                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07325                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07326                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07327                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07328                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07329                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07330 
07331                 mov             eax,dword ptr[Bucket]
07332                 mov             ebp,dword ptr[Bucket2]
07333 
07334                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07335 
07336                 and             eax,REDMASK
07337                 and             ebp,BLUEMASK
07338                 
07339                 mov             esi,dword ptr[Bucket]
07340                 or              ebp,eax
07341 
07342                 add             ecx,ebx
07343                 and             esi,GREENMASK
07344 
07345                 shr             ecx,16
07346                 or              ebp,esi
07347 
07348                 xor             eax,0
07349                 mov             esi,pTex
07350 
07351                 rol             ebp,16
07352                 add             edx,dword ptr[DeltaV]
07353 
07354                 mov             ax,word ptr[2*ecx+esi]
07355                 mov             ecx,[ZVal]
07356 
07357                 mov             esi,[ZVal]
07358                 add             ecx,[ZDelta]
07359 
07360                 shr             esi,16
07361                 mov             [ZVal],ecx
07362 
07363                 mov             ecx,pZBufferPtr
07364                 mov             [edi+12],ebp
07365 
07366                 mov             word ptr[ecx+12],si
07367                 mov             word ptr[ecx+14],si
07368                 mov             ecx,edx
07369 
07370                 add             ebx,dword ptr[DeltaU]
07371                 and             ecx,[GHMaskShifted16]
07372 
07373                 and             ebx,[GWMaskShifted]
07374                 xor             eax,0
07375 
07376                 add             ecx,ebx
07377                 mov             esi,pTex
07378 
07379                 shr             ecx,16
07380                 add             edx,dword ptr[DeltaV]
07381 
07382                 rol             eax,16
07383                 mov             ax,word ptr[2*ecx+esi]
07384 
07385                 mov             ecx,edx
07386                 xor             eax,0
07387 
07388                 and             ecx,[GHMaskShifted16]
07389                 mov             esi,eax
07390 
07391                 mov             ebp,eax
07392                 and             esi,REDMASK
07393 
07394                 and             ebp,GREENMASK
07395                 mov             dword ptr[Red],esi
07396 
07397                 mov             dword ptr[Green],ebp
07398                 add             ebx,dword ptr[DeltaU]
07400 
07401 
07402                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07403 
07404                 mov             ebp,eax
07405 
07406                 fmul    st,st(3)                                ; R    LB   LG   LR
07407                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07408 
07409                 and             ebp,BLUEMASK
07410                 and             ebx,[GWMaskShifted]
07411 
07412                 mov             dword ptr[Blue],ebp
07413 
07414                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07415                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07416                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07417                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07418                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07419                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07420                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07421                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07422                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07423                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07424                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07425                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07426 
07427                 mov             eax,dword ptr[Bucket]
07428                 mov             ebp,dword ptr[Bucket2]
07429 
07430                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07431 
07432                 and             eax,REDMASK
07433                 and             ebp,BLUEMASK
07434                 
07435                 mov             esi,dword ptr[Bucket]
07436                 or              ebp,eax
07437 
07438                 add             ecx,ebx
07439                 and             esi,GREENMASK
07440 
07441                 shr             ecx,16
07442                 or              ebp,esi
07443 
07444                 xor             eax,0
07445                 mov             esi,pTex
07446 
07447                 rol             ebp,16
07448                 add             edx,dword ptr[DeltaV]
07449 
07450                 mov             ax,word ptr[2*ecx+esi]
07451                 mov             ecx,[ZVal]
07452 
07453                 mov             esi,[ZVal]
07454                 add             ecx,[ZDelta]
07455 
07456                 shr             esi,16
07457                 mov             [ZVal],ecx
07458 
07459                 mov             ecx,pZBufferPtr
07460                 mov             [edi+16],ebp
07461 
07462                 mov             word ptr[ecx+16],si
07463                 mov             word ptr[ecx+18],si
07464                 mov             ecx,edx
07465 
07466                 add             ebx,dword ptr[DeltaU]
07467                 and             ecx,[GHMaskShifted16]
07468 
07469                 and             ebx,[GWMaskShifted]
07470                 xor             eax,0
07471 
07472                 add             ecx,ebx
07473                 mov             esi,pTex
07474 
07475                 shr             ecx,16
07476                 add             edx,dword ptr[DeltaV]
07477 
07478                 rol             eax,16
07479                 mov             ax,word ptr[2*ecx+esi]
07480 
07481                 mov             ecx,edx
07482                 xor             eax,0
07483 
07484                 and             ecx,[GHMaskShifted16]
07485                 mov             esi,eax
07486 
07487                 mov             ebp,eax
07488                 and             esi,REDMASK
07489 
07490                 and             ebp,GREENMASK
07491                 mov             dword ptr[Red],esi
07492 
07493                 mov             dword ptr[Green],ebp
07494                 add             ebx,dword ptr[DeltaU]
07496 
07497 
07498                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07499 
07500                 mov             ebp,eax
07501 
07502                 fmul    st,st(3)                                ; R    LB   LG   LR
07503                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07504 
07505                 and             ebp,BLUEMASK
07506                 and             ebx,[GWMaskShifted]
07507 
07508                 mov             dword ptr[Blue],ebp
07509 
07510                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07511                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07512                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07513                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07514                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07515                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07516                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07517                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07518                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07519                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07520                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07521                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07522 
07523                 mov             eax,dword ptr[Bucket]
07524                 mov             ebp,dword ptr[Bucket2]
07525 
07526                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07527 
07528                 and             eax,REDMASK
07529                 and             ebp,BLUEMASK
07530                 
07531                 mov             esi,dword ptr[Bucket]
07532                 or              ebp,eax
07533 
07534                 add             ecx,ebx
07535                 and             esi,GREENMASK
07536 
07537                 shr             ecx,16
07538                 or              ebp,esi
07539 
07540                 xor             eax,0
07541                 mov             esi,pTex
07542 
07543                 rol             ebp,16
07544                 add             edx,dword ptr[DeltaV]
07545 
07546                 mov             ax,word ptr[2*ecx+esi]
07547                 mov             ecx,[ZVal]
07548 
07549                 mov             esi,[ZVal]
07550                 add             ecx,[ZDelta]
07551 
07552                 shr             esi,16
07553                 mov             [ZVal],ecx
07554 
07555                 mov             ecx,pZBufferPtr
07556                 mov             [edi+20],ebp
07557 
07558                 mov             word ptr[ecx+20],si
07559                 mov             word ptr[ecx+22],si
07560                 mov             ecx,edx
07561 
07562                 add             ebx,dword ptr[DeltaU]
07563                 and             ecx,[GHMaskShifted16]
07564 
07565                 and             ebx,[GWMaskShifted]
07566                 xor             eax,0
07567 
07568                 add             ecx,ebx
07569                 mov             esi,pTex
07570 
07571                 shr             ecx,16
07572                 add             edx,dword ptr[DeltaV]
07573 
07574                 rol             eax,16
07575                 mov             ax,word ptr[2*ecx+esi]
07576 
07577                 mov             ecx,edx
07578                 xor             eax,0
07579 
07580                 and             ecx,[GHMaskShifted16]
07581                 mov             esi,eax
07582 
07583                 mov             ebp,eax
07584                 and             esi,REDMASK
07585 
07586                 and             ebp,GREENMASK
07587                 mov             dword ptr[Red],esi
07588 
07589                 mov             dword ptr[Green],ebp
07590                 add             ebx,dword ptr[DeltaU]
07592 
07593 
07594                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07595 
07596                 mov             ebp,eax
07597 
07598                 fmul    st,st(3)                                ; R    LB   LG   LR
07599                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07600 
07601                 and             ebp,BLUEMASK
07602                 and             ebx,[GWMaskShifted]
07603 
07604                 mov             dword ptr[Blue],ebp
07605 
07606                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07607                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07608                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07609                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07610                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07611                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07612                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07613                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07614                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07615                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07616                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07617                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07618 
07619                 mov             eax,dword ptr[Bucket]
07620                 mov             ebp,dword ptr[Bucket2]
07621 
07622                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07623 
07624                 and             eax,REDMASK
07625                 and             ebp,BLUEMASK
07626                 
07627                 mov             esi,dword ptr[Bucket]
07628                 or              ebp,eax
07629 
07630                 add             ecx,ebx
07631                 and             esi,GREENMASK
07632 
07633                 shr             ecx,16
07634                 or              ebp,esi
07635 
07636                 xor             eax,0
07637                 mov             esi,pTex
07638 
07639                 rol             ebp,16
07640                 add             edx,dword ptr[DeltaV]
07641 
07642                 mov             ax,word ptr[2*ecx+esi]
07643                 mov             ecx,[ZVal]
07644 
07645                 mov             esi,[ZVal]
07646                 add             ecx,[ZDelta]
07647 
07648                 shr             esi,16
07649                 mov             [ZVal],ecx
07650 
07651                 mov             ecx,pZBufferPtr
07652                 mov             [edi+24],ebp
07653 
07654                 mov             word ptr[ecx+24],si
07655                 mov             word ptr[ecx+26],si
07656                 mov             ecx,edx
07657 
07658                 add             ebx,dword ptr[DeltaU]
07659                 xor             eax,0
07660 
07661                 and             ebx,[GWMaskShifted]
07662                 and             ecx,[GHMaskShifted16]
07663 
07664                 mov             esi,pTex
07665                 add             ecx,ebx
07666 
07667                 shr             ecx,16
07668                 add             edx,dword ptr[DeltaV]
07669 
07670                 rol             eax,16
07671                 mov             ax,word ptr[2*ecx+esi]
07672 
07673 //              mov             ecx,edx
07674                 xor             eax,0
07675 
07676                 mov             esi,eax
07677 
07678                 mov             ebp,eax
07679                 and             esi,REDMASK
07680 
07681                 and             ebp,GREENMASK
07682                 mov             dword ptr[Red],esi
07683 
07684                 mov             dword ptr[Green],ebp
07685 //              add             ebx,dword ptr[DeltaU]
07687                 fild    qword ptr[Red]                  ; r    LB   LG   LR
07688 
07689                 mov             ebp,eax
07690 
07691                 fmul    st,st(3)                                ; R    LB   LG   LR
07692                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
07693 
07694                 and             ebp,BLUEMASK
07695 //              and             ebx,[GWMaskShifted]
07696 
07697                 mov             dword ptr[Blue],ebp
07698 
07699                 fmul    st,st(3)                                ; G    R    LB   LG   LR
07700                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
07701                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
07702                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
07703                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
07704                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
07705                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
07706                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
07707                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
07708                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
07709                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
07710                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
07711 
07712                 mov             eax,dword ptr[Bucket]
07713                 mov             ebp,dword ptr[Bucket2]
07714 
07715                 fstp    qword ptr[Bucket]               ; LB   LG   LR
07716 
07717                 and             eax,REDMASK
07718                 and             ebp,BLUEMASK
07719                 
07720                 mov             esi,dword ptr[Bucket]
07721                 or              ebp,eax
07722 
07723                 fstp    dword ptr[Bucket]
07724                 fstp    dword ptr[Bucket2]
07725                 fstp    dword ptr[Bucket]
07726 
07727                 and             esi,GREENMASK
07728 
07729                 fld             dword ptr[FTemp5]
07730                 fld             dword ptr[FTemp4]
07731 
07732                 or              ebp,esi
07733 
07734                 fld             dword ptr[FTemp3]
07735                 fld             dword ptr[FTemp2]
07736 
07737                 rol             ebp,16
07738 
07739                 fld             dword ptr[FTemp1]
07740                 fld             dword ptr[FTemp0]
07741                 mov             ecx,[ZVal]
07742 
07743                 mov             esi,[ZVal]
07744                 add             ecx,[ZDelta]
07745 
07746                 shr             esi,16
07747                 mov             [ZVal],ecx
07748 
07749                 mov             ecx,pZBufferPtr
07750                 mov             [edi+28],ebp
07751 
07752                 mov             word ptr[ecx+28],si
07753                 mov             word ptr[ecx+30],si
07754                 pop             ebp
07755 
07756 
07757                 ; get corrected right side deltas ; st0  st1  st2  st3  st4  st5  st6  st7
07758                                                                                 ; ZR   UZR  ZRi  VZR  UL   VL
07759                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
07760                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
07761                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
07762                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
07763 
07764                 add             edi,32                                  ; move screen pointer to start of next aspan
07765                 add             pZBufferPtr,32
07766                 dec             [NumASpans]                     ; dec num affine spans
07767                 jnz             SpanLoop16
07768 
07769 HandleLeftoverPixels16:
07770 
07771                 mov             esi,[pTex]
07772 
07773 
07774                 cmp             [RemainingCount],0
07775                 jz              FPUReturn16
07776 
07777                 //need one more stack spot
07778                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
07779                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
07780                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
07781                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
07782                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
07783                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
07784                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
07785                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
07786                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
07787                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
07788 
07789                 mov             ebx,dword ptr[Bucket]
07790                 mov             eax,dword ptr[Bucket2]
07791 
07792                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
07793                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
07794 
07795                 add             ebx,dword ptr[UAdjust]
07796                 add             eax,dword ptr[UAdjustL]
07797 
07798                 mov             [U1],ebx
07799                 mov             [UFixed],eax
07800 
07801                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
07802                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
07803                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
07804                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
07805                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
07806                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
07807                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
07808 
07809                 mov             ebx,dword ptr[Bucket]
07810                 mov             eax,dword ptr[Bucket2]
07811 
07812                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
07813 
07814                 add             ebx,dword ptr[VAdjust]
07815                 add             eax,dword ptr[VAdjustL]
07816 
07817                 mov             [V1],ebx
07818                 mov             [VFixed],eax
07819 
07820                 dec             [RemainingCount]
07821                 jz              OnePixelSpan16
07822 
07823 
07824                 //must get rid of this wasted time
07825                 fstp    [FloatTemp]                             ; inv. inv. inv. inv. UL   VL
07826                 fstp    [FloatTemp]                             ; inv. inv. inv. UL   VL
07827                 fstp    [FloatTemp]                             ; inv. inv. UL   VL
07828                 fstp    [FloatTemp]                             ; inv. UL   VL
07829                 fstp    [FloatTemp]                             ; UL   VL
07830                 fild    [y]                                             ; y    UL   VL
07831                 fild    [x2]                                    ; xr   y    UL   VL
07832 
07833                 fld             [UDivZStepY]                    ; UZdY xr   y    UL   VL
07834                 fld             [UDivZStepX]                    ; UZdX UZdY xr   y    UL   VL
07835                 fmul    st,st(2)                                ; UZX  UZdY xr   y    UL   VL
07836                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY xr   y    UL   VL
07837                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY xr   y    UL   VL
07838                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX xr   y    UL   VL
07839                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX xr   y    UL   VL
07840                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX xr   y    UL   VL
07841                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX xr   y    UL   VL
07842                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS xr   y    UL   VL
07843                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS xr   y    UL   VL
07844                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS xr   y    UL   VL
07845                 faddp   st(3),st                                ; VZdY VZX  UZ   xr   y    UL   VL
07846                 fmul    st,st(4)                                ; VZY  VZX  UZ   xr   y    UL   VL
07847                 fxch    st(1)                                   ; VZX  VZY  UZ   xr   y    UL   VL
07848                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   xr   y    UL   VL
07849                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   xr   y    UL   VL
07850                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y    UL   VL
07851                 faddp   st(1),st                                ; VZ   UZ   ZX   y    UL   VL
07852                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y    UL   VL
07853                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY   UL   VL
07854                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY   UL   VL
07855                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY   UL   VL
07856 
07857                 faddp   st(3),st                                ; UZ   VZ   Zi   UL   VL
07858                 fld1                                                    ; 1    UZ   VZ   Zi   UL   VL
07859                 fdiv    st,st(3)                                ; ZR   UZ   VZ   Zi   UL   VL
07860 
07861                 fld             st                                              ; ZR   ZR   UZ   VZ   Zi   UL   VL
07862                 fmul    st,st(3)                                ; VR   ZR   UZ   VZ   Zi   UL   VL
07863                 fxch    st(1)                                   ; ZR   VR   UZ   VZ   Zi   UL   VL
07864                 fmul    st,st(2)                                ; UR   VR   UZ   VZ   Zi   UL   VL
07865 
07866                 //lazy idiv below... should 1/int mul mul
07867 
07868                 ; calculate deltas                              ; st0  st1  st2  st3  st4  st5  st6  st7
07869                 fsubr   st(5),st                                ; UR   VR   inv. inv. inv. dU   VL
07870                 fxch    st(1)                                   ; VR   UR   inv. inv. inv. dU   VL
07871                 fsubr   st(6),st                                ; VR   UR   inv. inv. inv. dU   dV
07872                 fxch    st(6)                                   ; dV   UR   inv. inv. inv. dU   VR
07873                 fidiv   dword ptr[RemainingCount];dv   UR   inv. inv. inv. dU   VR
07874                 fadd    qword ptr[MipMagic]             ; dvk  UR   inv. inv. inv. dU   VR
07875                 fxch    st(5)                                   ; dU   UR   inv. inv. inv. dvk  VR
07876                 fidiv   dword ptr[RemainingCount];du   UR   inv. inv. inv. dvk  VR
07877                 fadd    qword ptr[MipMagic]             ; duk  UR   inv. inv. inv. dvk  VR
07878                 fxch    st(5)                                   ; dvk  UR   inv. inv. inv. duk  VR
07879                 fstp    qword ptr[DeltaV]               ; UR   inv. inv. inv. duk  VR
07880                 fxch    st(4)                                   ; duk  inv. inv. inv. UR   VR
07881                 fstp    qword ptr[DeltaU]               ; inv. inv. inv. UR   VR
07882                 fld             st(1)                                   ; inv. inv. inv. inv. UR   VR
07883                 fld             st(2)                                   ; inv. inv. inv. inv. inv. UR   VR
07884 
07885 OnePixelSpan16:
07886                 // Clamp U/V
07887                 mov             ebx,[UFixed]
07888                 cmp             ebx,MaxU
07889                 jle             TryClampU116
07890                 mov             ecx,MaxU
07891                 mov             dword ptr[UFixed],ecx
07892                 jmp             NoClampU116
07893 
07894 TryClampU116:
07895                 cmp             ebx,0
07896                 jge             NoClampU116
07897                 mov             dword ptr[UFixed],0
07898 NoClampU116:
07899                 mov             eax,[VFixed]
07900                 cmp             eax,MaxV
07901                 jle             TryClampV116
07902                 mov             ecx,MaxV
07903                 mov             dword ptr[VFixed],ecx
07904                 jmp             NoClampV116
07905 
07906 TryClampV116:
07907                 cmp             eax,0
07908                 jge             NoClampV116
07909                 mov             dword ptr[VFixed],0
07910 
07911 NoClampV116:
07912                 mov             esi,dword ptr[UFixed]
07913                 mov             eax,dword ptr[VFixed]
07914 
07915                 mov ecx, GMipLevel4_8
07916                 sar esi, cl
07917                 sar eax, cl
07918                 and esi, 0ffh
07919                 and eax, 0ffh
07920                 mov UDist, esi
07921                 mov VDist, eax
07922 
07923                 mov esi,dword ptr[UFixed]
07924                 mov eax,dword ptr[VFixed]
07925                 mov ecx, GMipLevel20
07926                 shr esi, cl
07927                 shr eax, cl
07928 
07929                 imul eax, GLightWidth
07930                 add esi, eax
07931 
07932                 mov edx, esi
07933                 shl esi, 1
07934                 add edx, esi
07935 
07936                 add edx, GLightData
07937 
07938                 // Interpolate accross top
07939                 xor ecx, ecx
07940                 mov cl, [edx+3]
07941                 mov eax, ecx
07942                 mov cl, [edx+0]
07943                 sub eax, ecx
07944                 imul eax, UDist
07945                 shl ecx, 8
07946                 add eax, ecx
07947                 mov [R1], eax
07948 
07949                 xor ecx, ecx
07950                 mov cl, [edx+4]
07951                 mov eax, ecx
07952                 mov cl, [edx+1]
07953                 sub eax, ecx
07954                 imul eax, UDist
07955                 shl ecx, 8
07956                 add eax, ecx
07957                 mov [G1], eax
07958 
07959                 xor ecx, ecx
07960                 mov cl, [edx+5]
07961                 mov eax, ecx
07962                 mov cl, [edx+2]
07963                 sub eax, ecx
07964                 imul eax, UDist
07965                 shl ecx, 8
07966                 add eax, ecx
07967                 mov [B1], eax
07968 
07969                 add edx, GLightWidth
07970                 add edx, GLightWidth
07971                 add edx, GLightWidth
07972 
07973                 // Interpolate accross bottom
07974                 xor ecx, ecx
07975                 mov cl, [edx+3]
07976                 mov eax, ecx
07977                 mov cl, [edx+0]
07978                 sub eax, ecx
07979                 imul eax, UDist
07980                 shl ecx, 8
07981                 add eax, ecx
07982                 mov [R2], eax
07983 
07984                 xor ecx, ecx
07985                 mov cl, [edx+4]
07986                 mov eax, ecx
07987                 mov cl, [edx+1]
07988                 sub eax, ecx
07989                 imul eax, UDist
07990                 shl ecx, 8
07991                 add eax, ecx
07992                 mov [G2], eax
07993 
07994                 xor ecx, ecx
07995                 mov cl, [edx+5]
07996                 mov eax, ecx
07997                 mov cl, [edx+2]
07998                 sub eax, ecx
07999                 imul eax, UDist
08000                 shl ecx, 8
08001                 add eax, ecx
08002                 mov [B2], eax
08003 
08004                 // Interpolate down
08005                 mov eax, [R2]
08006                 sub eax, [R1]
08007                 imul eax, VDist
08008                 sar eax, 8
08009                 add eax, [R1]
08010                 shr eax, 8
08011                 and     eax,0feh
08012 
08013                 mov [RR1], eax
08014 
08015                 mov eax, [G2]
08016                 sub eax, [G1]
08017                 imul eax, VDist
08018                 sar eax, 8
08019                 add eax, [G1]
08020                 shr eax, 8
08021                 and     eax,0feh
08022 
08023                 mov [GG1], eax
08024 
08025                 mov eax, [B2]
08026                 sub eax, [B1]
08027                 imul eax, VDist
08028                 sar eax, 8
08029                 add eax, [B1]
08030                 shr eax, 8
08031                 and     eax,0feh
08032 
08033                 mov [BB1], eax
08034 
08035                 fstp    [FTemp0]
08036                 fstp    [FTemp1]
08037                 fstp    [FTemp2]
08038                 fstp    [FTemp3]
08039                 fstp    [FTemp4]
08040                 fstp    [FTemp5]
08041 
08042                 mov             ebx,dword ptr[U1]
08043                 mov             edx,dword ptr[V1]
08044 
08045                 fild    [RR1]                                   ; LR
08046                 fild    [GG1]                                   ; LG   LR
08047                 fild    [BB1]                                   ; LB   LG   LR
08048 
08049                 mov             ecx,[VShift]
08050                 add             edx,dword ptr[VAdjust2]
08051 
08052                 add             ebx,dword ptr[UAdjust2]
08053                 mov             eax,dword ptr[DeltaV]
08054 
08055                 shl             eax,cl
08056                 mov             esi,pTex
08057 
08058                 shl             edx,cl
08059                 mov             dword ptr[DeltaV],eax
08060 
08061                 mov             eax,[ZDelta]
08062                 mov             ecx,[ZVal]
08063 
08064                 sar             eax,1
08065                 push    ebp
08066 
08067                 mov             [ZDelta],eax
08068 
08069 LeftoverLoop16:
08070                 mov             eax,edx
08071                 and             ebx,[GWMaskShifted]
08072 
08073                 and             eax,[GHMaskShifted16]
08074 
08075                 add             eax,ebx
08076                 add             ebx,dword ptr[DeltaU]
08077 
08078                 shr             eax,16
08079                 add             edi,2
08080 
08081                 mov             ax,word ptr[2*eax+esi]
08082                 add             edx,dword ptr[DeltaV]
08083 
08084                 xor             eax,0
08085 
08086                 mov             esi,eax
08087                 mov             ebp,eax
08088 
08089                 and             esi,REDMASK
08090                 and             ebp,GREENMASK
08091 
08092                 mov             dword ptr[Red],esi
08093                 mov             dword ptr[Green],ebp
08094 
08095                 fild    qword ptr[Red]                  ; r    LB   LG   LR
08096 
08097                 mov             ebp,eax
08098 
08099                 fmul    st,st(3)                                ; R    LB   LG   LR
08100                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
08101 
08102                 and             ebp,BLUEMASK
08103 
08104                 mov             dword ptr[Blue],ebp
08105 
08106                 fmul    st,st(3)                                ; G    R    LB   LG   LR
08107                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
08108                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
08109                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
08110                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
08111                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
08112                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
08113                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
08114                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
08115                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
08116                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
08117                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
08118 
08119                 mov             eax,dword ptr[Bucket]
08120                 mov             ebp,dword ptr[Bucket2]
08121 
08122                 fstp    qword ptr[Bucket]               ; LB   LG   LR
08123 
08124                 and             eax,REDMASK
08125                 and             ebp,BLUEMASK
08126                 
08127                 mov             esi,dword ptr[Bucket]
08128                 or              ebp,eax
08129 
08130                 and             esi,GREENMASK
08131                 mov             eax,ecx
08132 
08133                 or              ebp,esi
08134 
08135                 shr             eax,16
08136                 mov             esi,pZBufferPtr
08137 
08138                 mov             word ptr[edi-2],bp
08139                 mov             word ptr[esi],ax
08140 
08141                 add             ecx,[ZDelta]
08142                 mov             esi,pTex
08143 
08144                 add             pZBufferPtr,2
08145 
08146                 dec             [RemainingCount]
08147                 jge             LeftoverLoop16
08148 
08149                 pop             ebp
08150 
08151 
08152 FPUReturn16:
08153                 ffree   st(0)
08154                 ffree   st(1)
08155                 ffree   st(2)
08156                 ffree   st(3)
08157                 ffree   st(4)
08158                 ffree   st(5)
08159                 ffree   st(6)
08160 
08161 Return16:
08162                 pop             edi
08163                 pop             esi
08164                 pop             ecx
08165                 pop             ebx
08166         }
08167 }
08168 
08169 void DrawSpan16_AsmGouraudX86FPU(int32 x1, int32 x2, int32 y, int32 r1, int32 g1, int32 b1, int32 r2, int32 g2, int32 b2)
08170 {
08171         RR1     =r1;
08172         GG1     =g1;
08173         BB1     =b1;
08174         _asm
08175         {
08176                 push    ebx
08177                 push    ecx
08178                 push    esi
08179                 push    edi
08180 
08181                 mov             eax,x1
08182                 mov             ecx,x2
08183                 sub             ecx,eax
08184                 jle             Return16
08185 
08186                 mov             edi,[GBitPtr16]
08187 //              inc             ecx
08188                 mov             pTex,edi
08189 
08190                 fild    [y]                                             ; y
08191                 mov             [widTemp],ecx
08192 
08193                 mov             edi, ClientWindow.Buffer
08194                 mov             eax, y
08195 
08196                 fild    [x1]                                            ; x    y
08197                 fild    [widTemp]
08198 
08199                 imul    eax, ClientWindow.Width
08200 
08201                 fld1
08202                 fdivrp  st(1),st
08203 
08204 
08205                 add             eax, x1
08206                 shl             eax, 1
08207                 add             edi, eax
08208                 mov             eax,ecx
08209                 shr             ecx,4
08210                 and             eax,15
08211                 _emit 75h
08212                 _emit 06h
08213                 dec             ecx
08214                 mov             eax,16
08215 
08216                 mov             [NumASpans],ecx
08217                 mov             [RemainingCount],eax
08218 
08219                 fild    [r2]
08220                 fisub   [r1]
08221                 fild    [g2]
08222                 fisub   [g1]
08223                 fild    [b2]
08224                 fisub   [b1]
08225                 fxch    st(2)
08226                 fmul    st,st(3)
08227                 fxch    st(1)
08228                 fmul    st,st(3)
08229                 fxch    st(2)
08230                 fmul    st,st(3)
08231                 frndint
08232                 fstp    qword ptr[BlueDelta]
08233                 frndint
08234                 fstp    qword ptr[RedDelta]
08235                 frndint
08236                 fstp    qword ptr[GreenDelta]
08237                 fstp    qword ptr[FTemp0]
08238 
08239 
08240                 //decoder won't keep up with these huge instructions
08241                 //need to find some int instructions to cram in here somewhere
08242                 fld             [UDivZStepY]                    ; UZdY x    y
08243                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
08244                 fmul    st,st(2)                                ; UZX  UZdY x    y
08245                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
08246                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
08247                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
08248                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
08249                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
08250                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
08251                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
08252                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
08253                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
08254                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
08255                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
08256                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
08257                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
08258                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
08259                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
08260                 faddp   st(1),st                                ; VZ   UZ   ZX   y
08261                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
08262                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
08263                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
08264                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
08265 
08266                 //room for two cycles of int instructions here
08267 
08268                 faddp   st(3),st                                ; UZ   VZ   Zi
08269                 fld1                                                    ; 1    UZ   VZ   Zi
08270                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
08271 
08272                 //room for 18 cycles of int instructions here
08273 
08274                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
08275                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
08276                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
08277                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
08278                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
08279                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
08280                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
08281                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
08282                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
08283                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
08284                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
08285                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
08286 
08287                 //room for 18 cycles of int stuff here
08288 
08289                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
08290                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
08291                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
08292                 //fmul stall one cycle
08293                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
08294 
08295                 test    ecx,ecx
08296                 jz              HandleLeftoverPixels16
08297 
08298 SpanLoop16:
08299                 //need one more stack spot
08300                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
08301                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
08302                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
08303                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
08304                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
08305                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
08306                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
08307                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
08308                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
08309                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
08310 
08311                 mov             ebx,dword ptr[Bucket]
08312                 mov             eax,dword ptr[Bucket2]
08313 
08314                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
08315                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
08316 
08317                 add             ebx,dword ptr[UAdjust]
08318                 add             eax,dword ptr[UAdjustL]
08319 
08320                 mov             [U1],ebx
08321                 mov             [UFixed],eax
08322 
08323                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
08324                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
08325                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
08326                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
08327                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
08328                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
08329                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
08330                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
08331 
08332                 mov             ebx,dword ptr[Bucket]
08333                 mov             eax,dword ptr[Bucket2]
08334 
08335                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
08336 
08337                 add             ebx,dword ptr[VAdjust]
08338                 add             eax,dword ptr[VAdjustL]
08339 
08340                 mov             [V1],ebx
08341                 mov             [VFixed],eax
08342 
08343                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
08344                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
08345                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
08346                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
08347                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
08348                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
08349                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
08350                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
08351                 //gotta do this to get em lined back up right
08352                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
08353                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
08354 
08355                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
08356                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
08357                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
08358                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
08359                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
08360                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
08361                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
08362                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
08363                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
08364                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
08365 
08366                 // Clamp U/V
08367                 mov             ebx,[UFixed]
08368                 cmp             ebx,MaxU
08369                 jle             TryClampU016
08370                 mov             ecx,MaxU
08371                 mov             dword ptr[UFixed],ecx
08372                 jmp             NoClampU016
08373 
08374 TryClampU016:
08375                 cmp             ebx,0
08376                 jge             NoClampU016
08377                 mov             dword ptr[UFixed],0
08378 NoClampU016:
08379                 mov             eax,[VFixed]
08380                 cmp             eax,MaxV
08381                 jle             TryClampV016
08382                 mov             ecx,MaxV
08383                 mov             dword ptr[VFixed],ecx
08384                 jmp             NoClampV016
08385 
08386 TryClampV016:
08387                 cmp             eax,0
08388                 jge             NoClampV016
08389                 mov             dword ptr[VFixed],0
08390 
08391 NoClampV016:
08392 
08393                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
08394                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
08395                 fstp    [FTemp2]                                ; VZR  UL   VL
08396                 fstp    [FTemp3]                                ; UL   VL
08397                 fstp    [FTemp4]                                ; VL
08398                 fstp    [FTemp5]                                ; 
08399 
08400 
08401                 fild    [RR1]                                   ; LR
08402                 fild    [GG1]                                   ; LG   LR
08403                 fild    [BB1]                                   ; LB   LG   LR
08404                 
08405                 
08406                 mov             ebx,dword ptr[U1]
08407                 mov             eax,dword ptr[V1]
08408 
08409                 add             ebx,dword ptr[UAdjust2]
08410                 add             eax,dword ptr[VAdjust2]
08411 
08412                 mov             ecx,[VShift]
08413                 mov             dword ptr[Bucket],ebx
08414 
08415                 shl             eax,cl
08416 
08417                 push    ebp
08418 
08419                 mov             dword ptr[Bucket2],eax
08420                 mov             ebp,dword ptr[DeltaV]
08421 
08422                 and             eax,[GHMaskShifted16]
08423                 and             ebx,[GWMaskShifted]
08424 
08425                 shl             ebp,cl
08426                 add             eax,ebx
08427 
08428                 mov             edx,dword ptr[Bucket2]
08429                 mov             esi,pTex
08430 
08431                 shr             eax,16
08432                 mov             dword ptr[DeltaV],ebp
08433 
08434                 mov             ebx,dword ptr[Bucket]
08435 
08436                 mov             ax,word ptr[2*eax+esi]
08437                 add             edx,dword ptr[DeltaV]
08438 
08439                 xor             eax,0
08440                 mov             ecx,edx
08441 
08442                 add             ebx,dword ptr[DeltaU]
08443                 and             ecx,[GHMaskShifted16]
08444 
08445                 rol             eax,16
08446                 and             ebx,[GWMaskShifted]
08447 
08448                 xor             eax,0
08449                 add             ecx,ebx
08450 
08451                 add             edx,dword ptr[DeltaV]
08452                 mov             esi,pTex
08453 
08454                 shr             ecx,16
08455                 add             ebx,dword ptr[DeltaU]
08456 
08457                 mov             ax,word ptr[2*ecx+esi]
08458                 mov             ecx,edx
08459 
08460                 xor             eax,0
08461                 and             ecx,[GHMaskShifted16]
08462 
08463                 mov             esi,eax
08464                 mov             ebp,eax
08465 
08466                 and             esi,REDMASK
08467                 and             ebp,GREENMASK
08468 
08469                 mov             dword ptr[Red],esi
08470                 mov             dword ptr[Green],ebp
08471 
08472                 fild    qword ptr[Red]                  ; r    LB   LG   LR
08473 
08474                 mov             ebp,eax
08475 
08476                 fmul    st,st(3)                                ; R    LB   LG   LR
08477                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
08478 
08479                 and             ebp,BLUEMASK
08480                 and             ebx,[GWMaskShifted]
08481 
08482                 mov             dword ptr[Blue],ebp
08483 
08484                 fmul    st,st(3)                                ; G    R    LB   LG   LR
08485                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
08486                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
08487                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
08488                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
08489                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
08490                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
08491                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
08492                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
08493                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
08494                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
08495                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
08496 
08497                 mov             eax,dword ptr[Bucket]
08498                 mov             ebp,dword ptr[Bucket2]
08499 
08500                 fstp    qword ptr[Bucket]               ; LB   LG   LR
08501                 fxch    st(1)
08502                 fadd    qword ptr[GreenDelta]
08503                 fxch    st(1)
08504                 fadd    qword ptr[BlueDelta]
08505                 fxch    st(2)
08506                 fadd    qword ptr[RedDelta]
08507                 fxch    st(2)
08508 
08509                 and             eax,REDMASK
08510                 and             ebp,BLUEMASK
08511                 
08512                 mov             esi,dword ptr[Bucket]
08513                 or              ebp,eax
08514 
08515                 add             ecx,ebx
08516                 and             esi,GREENMASK
08517 
08518                 shr             ecx,16
08519                 or              ebp,esi
08520 
08521                 xor             eax,0
08522                 mov             esi,pTex
08523 
08524                 rol             ebp,16
08525                 add             edx,dword ptr[DeltaV]
08526 
08527                 mov             ax,word ptr[2*ecx+esi]
08528                 mov             ecx,edx
08529 
08530                 add             ebx,dword ptr[DeltaU]
08531                 and             ecx,[GHMaskShifted16]
08532 
08533                 and             ebx,[GWMaskShifted]
08534                 xor             eax,0
08535 
08536                 add             ecx,ebx
08537                 mov             [edi],ebp
08538 
08539                 rol             eax,16
08540                 add             edx,dword ptr[DeltaV]
08541 
08542                 shr             ecx,16
08543                 add             ebx,dword ptr[DeltaU]
08544 
08545                 mov             ax,word ptr[2*ecx+esi]
08546 
08547                 mov             ecx,edx
08548                 xor             eax,0
08549 
08550                 and             ecx,[GHMaskShifted16]
08551                 mov             esi,eax
08552 
08553                 mov             ebp,eax
08554                 and             esi,REDMASK
08555 
08556                 and             ebp,GREENMASK
08557                 mov             dword ptr[Red],esi
08558 
08559                 mov             dword ptr[Green],ebp
08561 
08562 
08563                 fild    qword ptr[Red]                  ; r    LB   LG   LR
08564 
08565                 mov             ebp,eax
08566 
08567                 fmul    st,st(3)                                ; R    LB   LG   LR
08568                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
08569 
08570                 and             ebp,BLUEMASK
08571                 and             ebx,[GWMaskShifted]
08572 
08573                 mov             dword ptr[Blue],ebp
08574 
08575                 fmul    st,st(3)                                ; G    R    LB   LG   LR
08576                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
08577                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
08578                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
08579                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
08580                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
08581                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
08582                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
08583                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
08584                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
08585                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
08586                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
08587 
08588                 mov             eax,dword ptr[Bucket]
08589                 mov             ebp,dword ptr[Bucket2]
08590 
08591                 fstp    qword ptr[Bucket]               ; LB   LG   LR
08592                 fxch    st(1)
08593                 fadd    qword ptr[GreenDelta]
08594                 fxch    st(1)
08595                 fadd    qword ptr[BlueDelta]
08596                 fxch    st(2)
08597                 fadd    qword ptr[RedDelta]
08598                 fxch    st(2)
08599 
08600                 and             eax,REDMASK
08601                 and             ebp,BLUEMASK
08602                 
08603                 mov             esi,dword ptr[Bucket]
08604                 or              ebp,eax
08605 
08606                 add             ecx,ebx
08607                 and             esi,GREENMASK
08608 
08609                 shr             ecx,16
08610                 or              ebp,esi
08611 
08612                 xor             eax,0
08613                 mov             esi,pTex
08614 
08615                 rol             ebp,16
08616                 add             edx,dword ptr[DeltaV]
08617 
08618                 mov             ax,word ptr[2*ecx+esi]
08619                 mov             ecx,edx
08620 
08621                 add             ebx,dword ptr[DeltaU]
08622                 and             ecx,[GHMaskShifted16]
08623 
08624                 and             ebx,[GWMaskShifted]
08625                 xor             eax,0
08626 
08627                 add             ecx,ebx
08628                 mov             [edi+4],ebp
08629 
08630                 rol             eax,16
08631                 add             edx,dword ptr[DeltaV]
08632 
08633                 shr             ecx,16
08634                 add             ebx,dword ptr[DeltaU]
08635 
08636                 mov             ax,word ptr[2*ecx+esi]
08637 
08638                 mov             ecx,edx
08639                 xor             eax,0
08640 
08641                 and             ecx,[GHMaskShifted16]
08642                 mov             esi,eax
08643 
08644                 mov             ebp,eax
08645                 and             esi,REDMASK
08646 
08647                 and             ebp,GREENMASK
08648                 mov             dword ptr[Red],esi
08649 
08650                 mov             dword ptr[Green],ebp
08652 
08653 
08654                 fild    qword ptr[Red]                  ; r    LB   LG   LR
08655 
08656                 mov             ebp,eax
08657 
08658                 fmul    st,st(3)                                ; R    LB   LG   LR
08659                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
08660 
08661                 and             ebp,BLUEMASK
08662                 and             ebx,[GWMaskShifted]
08663 
08664                 mov             dword ptr[Blue],ebp
08665 
08666                 fmul    st,st(3)                                ; G    R    LB   LG   LR
08667                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
08668                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
08669                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
08670                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
08671                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
08672                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
08673                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
08674                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
08675                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
08676                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
08677                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
08678 
08679                 mov             eax,dword ptr[Bucket]
08680                 mov             ebp,dword ptr[Bucket2]
08681 
08682                 fstp    qword ptr[Bucket]               ; LB   LG   LR
08683                 fxch    st(1)
08684                 fadd    qword ptr[GreenDelta]
08685                 fxch    st(1)
08686                 fadd    qword ptr[BlueDelta]
08687                 fxch    st(2)
08688                 fadd    qword ptr[RedDelta]
08689                 fxch    st(2)
08690 
08691                 and             eax,REDMASK
08692                 and             ebp,BLUEMASK
08693                 
08694                 mov             esi,dword ptr[Bucket]
08695                 or              ebp,eax
08696 
08697                 add             ecx,ebx
08698                 and             esi,GREENMASK
08699 
08700                 shr             ecx,16
08701                 or              ebp,esi
08702 
08703                 xor             eax,0
08704                 mov             esi,pTex
08705 
08706                 rol             ebp,16
08707                 add             edx,dword ptr[DeltaV]
08708 
08709                 mov             ax,word ptr[2*ecx+esi]
08710                 mov             ecx,edx
08711 
08712                 add             ebx,dword ptr[DeltaU]
08713                 and             ecx,[GHMaskShifted16]
08714 
08715                 and             ebx,[GWMaskShifted]
08716                 xor             eax,0
08717 
08718                 add             ecx,ebx
08719                 mov             [edi+8],ebp
08720 
08721                 shr             ecx,16
08722                 add             edx,dword ptr[DeltaV]
08723 
08724                 rol             eax,16
08725                 mov             ax,word ptr[2*ecx+esi]
08726 
08727                 mov             ecx,edx
08728                 xor             eax,0
08729 
08730                 and             ecx,[GHMaskShifted16]
08731                 mov             esi,eax
08732 
08733                 mov             ebp,eax
08734                 and             esi,REDMASK
08735 
08736                 and             ebp,GREENMASK
08737                 mov             dword ptr[Red],esi
08738 
08739                 mov             dword ptr[Green],ebp
08740                 add             ebx,dword ptr[DeltaU]
08742 
08743 
08744                 fild    qword ptr[Red]                  ; r    LB   LG   LR
08745 
08746                 mov             ebp,eax
08747 
08748                 fmul    st,st(3)                                ; R    LB   LG   LR
08749                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
08750 
08751                 and             ebp,BLUEMASK
08752                 and             ebx,[GWMaskShifted]
08753 
08754                 mov             dword ptr[Blue],ebp
08755 
08756                 fmul    st,st(3)                                ; G    R    LB   LG   LR
08757                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
08758                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
08759                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
08760                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
08761                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
08762                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
08763                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
08764                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
08765                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
08766                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
08767                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
08768 
08769                 mov             eax,dword ptr[Bucket]
08770                 mov             ebp,dword ptr[Bucket2]
08771 
08772                 fstp    qword ptr[Bucket]               ; LB   LG   LR
08773                 fxch    st(1)
08774                 fadd    qword ptr[GreenDelta]
08775                 fxch    st(1)
08776                 fadd    qword ptr[BlueDelta]
08777                 fxch    st(2)
08778                 fadd    qword ptr[RedDelta]
08779                 fxch    st(2)
08780 
08781                 and             eax,REDMASK
08782                 and             ebp,BLUEMASK
08783                 
08784                 mov             esi,dword ptr[Bucket]
08785                 or              ebp,eax
08786 
08787                 add             ecx,ebx
08788                 and             esi,GREENMASK
08789 
08790                 shr             ecx,16
08791                 or              ebp,esi
08792 
08793                 xor             eax,0
08794                 mov             esi,pTex
08795 
08796                 rol             ebp,16
08797                 add             edx,dword ptr[DeltaV]
08798 
08799                 mov             ax,word ptr[2*ecx+esi]
08800                 mov             ecx,edx
08801 
08802                 add             ebx,dword ptr[DeltaU]
08803                 and             ecx,[GHMaskShifted16]
08804 
08805                 and             ebx,[GWMaskShifted]
08806                 xor             eax,0
08807 
08808                 add             ecx,ebx
08809                 mov             [edi+12],ebp
08810 
08811                 shr             ecx,16
08812                 add             edx,dword ptr[DeltaV]
08813 
08814                 rol             eax,16
08815                 mov             ax,word ptr[2*ecx+esi]
08816 
08817                 mov             ecx,edx
08818                 xor             eax,0
08819 
08820                 and             ecx,[GHMaskShifted16]
08821                 mov             esi,eax
08822 
08823                 mov             ebp,eax
08824                 and             esi,REDMASK
08825 
08826                 and             ebp,GREENMASK
08827                 mov             dword ptr[Red],esi
08828 
08829                 mov             dword ptr[Green],ebp
08830                 add             ebx,dword ptr[DeltaU]
08832 
08833 
08834                 fild    qword ptr[Red]                  ; r    LB   LG   LR
08835 
08836                 mov             ebp,eax
08837 
08838                 fmul    st,st(3)                                ; R    LB   LG   LR
08839                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
08840 
08841                 and             ebp,BLUEMASK
08842                 and             ebx,[GWMaskShifted]
08843 
08844                 mov             dword ptr[Blue],ebp
08845 
08846                 fmul    st,st(3)                                ; G    R    LB   LG   LR
08847                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
08848                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
08849                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
08850                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
08851                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
08852                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
08853                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
08854                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
08855                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
08856                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
08857                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
08858 
08859                 mov             eax,dword ptr[Bucket]
08860                 mov             ebp,dword ptr[Bucket2]
08861 
08862                 fstp    qword ptr[Bucket]               ; LB   LG   LR
08863                 fxch    st(1)
08864                 fadd    qword ptr[GreenDelta]
08865                 fxch    st(1)
08866                 fadd    qword ptr[BlueDelta]
08867                 fxch    st(2)
08868                 fadd    qword ptr[RedDelta]
08869                 fxch    st(2)
08870 
08871                 and             eax,REDMASK
08872                 and             ebp,BLUEMASK
08873                 
08874                 mov             esi,dword ptr[Bucket]
08875                 or              ebp,eax
08876 
08877                 add             ecx,ebx
08878                 and             esi,GREENMASK
08879 
08880                 shr             ecx,16
08881                 or              ebp,esi
08882 
08883                 xor             eax,0
08884                 mov             esi,pTex
08885 
08886                 rol             ebp,16
08887                 add             edx,dword ptr[DeltaV]
08888 
08889                 mov             ax,word ptr[2*ecx+esi]
08890                 mov             ecx,edx
08891 
08892                 add             ebx,dword ptr[DeltaU]
08893                 and             ecx,[GHMaskShifted16]
08894 
08895                 and             ebx,[GWMaskShifted]
08896                 xor             eax,0
08897 
08898                 add             ecx,ebx
08899                 mov             [edi+16],ebp
08900 
08901                 shr             ecx,16
08902                 add             edx,dword ptr[DeltaV]
08903 
08904                 rol             eax,16
08905                 mov             ax,word ptr[2*ecx+esi]
08906 
08907                 mov             ecx,edx
08908                 xor             eax,0
08909 
08910                 and             ecx,[GHMaskShifted16]
08911                 mov             esi,eax
08912 
08913                 mov             ebp,eax
08914                 and             esi,REDMASK
08915 
08916                 and             ebp,GREENMASK
08917                 mov             dword ptr[Red],esi
08918 
08919                 mov             dword ptr[Green],ebp
08920                 add             ebx,dword ptr[DeltaU]
08922 
08923 
08924                 fild    qword ptr[Red]                  ; r    LB   LG   LR
08925 
08926                 mov             ebp,eax
08927 
08928                 fmul    st,st(3)                                ; R    LB   LG   LR
08929                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
08930 
08931                 and             ebp,BLUEMASK
08932                 and             ebx,[GWMaskShifted]
08933 
08934                 mov             dword ptr[Blue],ebp
08935 
08936                 fmul    st,st(3)                                ; G    R    LB   LG   LR
08937                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
08938                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
08939                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
08940                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
08941                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
08942                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
08943                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
08944                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
08945                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
08946                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
08947                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
08948 
08949                 mov             eax,dword ptr[Bucket]
08950                 mov             ebp,dword ptr[Bucket2]
08951 
08952                 fstp    qword ptr[Bucket]               ; LB   LG   LR
08953                 fxch    st(1)
08954                 fadd    qword ptr[GreenDelta]
08955                 fxch    st(1)
08956                 fadd    qword ptr[BlueDelta]
08957                 fxch    st(2)
08958                 fadd    qword ptr[RedDelta]
08959                 fxch    st(2)
08960 
08961                 and             eax,REDMASK
08962                 and             ebp,BLUEMASK
08963                 
08964                 mov             esi,dword ptr[Bucket]
08965                 or              ebp,eax
08966 
08967                 add             ecx,ebx
08968                 and             esi,GREENMASK
08969 
08970                 shr             ecx,16
08971                 or              ebp,esi
08972 
08973                 xor             eax,0
08974                 mov             esi,pTex
08975 
08976                 rol             ebp,16
08977                 add             edx,dword ptr[DeltaV]
08978 
08979                 mov             ax,word ptr[2*ecx+esi]
08980                 mov             ecx,edx
08981 
08982                 add             ebx,dword ptr[DeltaU]
08983                 and             ecx,[GHMaskShifted16]
08984 
08985                 and             ebx,[GWMaskShifted]
08986                 xor             eax,0
08987 
08988                 add             ecx,ebx
08989                 mov             [edi+20],ebp
08990 
08991                 shr             ecx,16
08992                 add             edx,dword ptr[DeltaV]
08993 
08994                 rol             eax,16
08995                 mov             ax,word ptr[2*ecx+esi]
08996 
08997                 mov             ecx,edx
08998                 xor             eax,0
08999 
09000                 and             ecx,[GHMaskShifted16]
09001                 mov             esi,eax
09002 
09003                 mov             ebp,eax
09004                 and             esi,REDMASK
09005 
09006                 and             ebp,GREENMASK
09007                 mov             dword ptr[Red],esi
09008 
09009                 mov             dword ptr[Green],ebp
09010                 add             ebx,dword ptr[DeltaU]
09012 
09013 
09014                 fild    qword ptr[Red]                  ; r    LB   LG   LR
09015 
09016                 mov             ebp,eax
09017 
09018                 fmul    st,st(3)                                ; R    LB   LG   LR
09019                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
09020 
09021                 and             ebp,BLUEMASK
09022                 and             ebx,[GWMaskShifted]
09023 
09024                 mov             dword ptr[Blue],ebp
09025 
09026                 fmul    st,st(3)                                ; G    R    LB   LG   LR
09027                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
09028                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
09029                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
09030                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
09031                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
09032                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
09033                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
09034                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
09035                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
09036                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
09037                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
09038 
09039                 mov             eax,dword ptr[Bucket]
09040                 mov             ebp,dword ptr[Bucket2]
09041 
09042                 fstp    qword ptr[Bucket]               ; LB   LG   LR
09043                 fxch    st(1)
09044                 fadd    qword ptr[GreenDelta]
09045                 fxch    st(1)
09046                 fadd    qword ptr[BlueDelta]
09047                 fxch    st(2)
09048                 fadd    qword ptr[RedDelta]
09049                 fxch    st(2)
09050 
09051                 and             eax,REDMASK
09052                 and             ebp,BLUEMASK
09053                 
09054                 mov             esi,dword ptr[Bucket]
09055                 or              ebp,eax
09056 
09057                 add             ecx,ebx
09058                 and             esi,GREENMASK
09059 
09060                 shr             ecx,16
09061                 or              ebp,esi
09062 
09063                 xor             eax,0
09064                 mov             esi,pTex
09065 
09066                 rol             ebp,16
09067                 add             edx,dword ptr[DeltaV]
09068 
09069                 mov             ax,word ptr[2*ecx+esi]
09070                 mov             ecx,edx
09071 
09072                 add             ebx,dword ptr[DeltaU]
09073                 and             ecx,[GHMaskShifted16]
09074 
09075                 and             ebx,[GWMaskShifted]
09076                 xor             eax,0
09077 
09078                 add             ecx,ebx
09079                 mov             [edi+24],ebp
09080 
09081                 shr             ecx,16
09082                 add             edx,dword ptr[DeltaV]
09083 
09084                 rol             eax,16
09085                 mov             ax,word ptr[2*ecx+esi]
09086 
09087                 mov             ecx,edx
09088                 xor             eax,0
09089 
09090                 and             ecx,[GHMaskShifted16]
09091                 mov             esi,eax
09092 
09093                 mov             ebp,eax
09094                 and             esi,REDMASK
09095 
09096                 and             ebp,GREENMASK
09097                 mov             dword ptr[Red],esi
09098 
09099                 mov             dword ptr[Green],ebp
09100                 add             ebx,dword ptr[DeltaU]
09102                 fild    qword ptr[Red]                  ; r    LB   LG   LR
09103 
09104                 mov             ebp,eax
09105 
09106                 fmul    st,st(3)                                ; R    LB   LG   LR
09107                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
09108 
09109                 and             ebp,BLUEMASK
09110                 and             ebx,[GWMaskShifted]
09111 
09112                 mov             dword ptr[Blue],ebp
09113 
09114                 fmul    st,st(3)                                ; G    R    LB   LG   LR
09115                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
09116                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
09117                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
09118                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
09119                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
09120                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
09121                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
09122                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
09123                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
09124                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
09125                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
09126 
09127                 mov             eax,dword ptr[Bucket]
09128                 mov             ebp,dword ptr[Bucket2]
09129 
09130                 fstp    qword ptr[Bucket]               ; LB   LG   LR
09131                 fadd    qword ptr[BlueDelta]
09132                 fistp   dword ptr[BB1]
09133                 fadd    qword ptr[GreenDelta]
09134                 fistp   dword ptr[GG1]
09135                 fadd    qword ptr[RedDelta]
09136                 fistp   dword ptr[RR1]
09137 
09138                 and             eax,REDMASK
09139                 and             ebp,BLUEMASK
09140                 
09141                 mov             esi,dword ptr[Bucket]
09142                 or              ebp,eax
09143 
09144                 fstp    dword ptr[Bucket]
09145                 fstp    dword ptr[Bucket2]
09146                 fstp    dword ptr[Bucket]
09147 
09148                 and             esi,GREENMASK
09149 
09150                 fld             dword ptr[FTemp5]
09151                 fld             dword ptr[FTemp4]
09152 
09153                 or              ebp,esi
09154 
09155                 fld             dword ptr[FTemp3]
09156                 fld             dword ptr[FTemp2]
09157 
09158                 rol             ebp,16
09159 
09160                 fld             dword ptr[FTemp1]
09161                 fld             dword ptr[FTemp0]
09162 
09163                 mov             [edi+28],ebp                            ; store pixel 0
09164                 pop             ebp
09165 
09166 
09167                 ; get corrected right side deltas ; st0  st1  st2  st3  st4  st5  st6  st7
09168                                                                                 ; ZR   UZR  ZRi  VZR  UL   VL
09169                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
09170                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
09171                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
09172                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
09173 
09174                 add             edi,32                                  ; move screen pointer to start of next aspan
09175                 dec             [NumASpans]                     ; dec num affine spans
09176                 jnz             SpanLoop16
09177 
09178 HandleLeftoverPixels16:
09179 
09180                 mov             esi,[pTex]
09181 
09182 
09183                 cmp             [RemainingCount],0
09184                 jz              FPUReturn16
09185 
09186                 //need one more stack spot
09187                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
09188                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
09189                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
09190                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
09191                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
09192                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
09193                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
09194                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
09195                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
09196                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
09197 
09198                 mov             ebx,dword ptr[Bucket]
09199                 mov             eax,dword ptr[Bucket2]
09200 
09201                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
09202                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
09203 
09204                 add             ebx,dword ptr[UAdjust]
09205                 add             eax,dword ptr[UAdjustL]
09206 
09207                 mov             [U1],ebx
09208                 mov             [UFixed],eax
09209 
09210                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
09211                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
09212                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
09213                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
09214                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
09215                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
09216                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
09217 
09218                 mov             ebx,dword ptr[Bucket]
09219                 mov             eax,dword ptr[Bucket2]
09220 
09221                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
09222 
09223                 add             ebx,dword ptr[VAdjust]
09224                 add             eax,dword ptr[VAdjustL]
09225 
09226                 mov             [V1],ebx
09227                 mov             [VFixed],eax
09228 
09229                 dec             [RemainingCount]
09230                 jz              OnePixelSpan16
09231 
09232 
09233                 //must get rid of this wasted time
09234                 fstp    [FloatTemp]                             ; inv. inv. inv. inv. UL   VL
09235                 fstp    [FloatTemp]                             ; inv. inv. inv. UL   VL
09236                 fstp    [FloatTemp]                             ; inv. inv. UL   VL
09237                 fstp    [FloatTemp]                             ; inv. UL   VL
09238                 fstp    [FloatTemp]                             ; UL   VL
09239                 fild    [y]                                             ; y    UL   VL
09240                 fild    [x2]                                    ; xr   y    UL   VL
09241 
09242                 fld             [UDivZStepY]                    ; UZdY xr   y    UL   VL
09243                 fld             [UDivZStepX]                    ; UZdX UZdY xr   y    UL   VL
09244                 fmul    st,st(2)                                ; UZX  UZdY xr   y    UL   VL
09245                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY xr   y    UL   VL
09246                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY xr   y    UL   VL
09247                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX xr   y    UL   VL
09248                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX xr   y    UL   VL
09249                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX xr   y    UL   VL
09250                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX xr   y    UL   VL
09251                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS xr   y    UL   VL
09252                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS xr   y    UL   VL
09253                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS xr   y    UL   VL
09254                 faddp   st(3),st                                ; VZdY VZX  UZ   xr   y    UL   VL
09255                 fmul    st,st(4)                                ; VZY  VZX  UZ   xr   y    UL   VL
09256                 fxch    st(1)                                   ; VZX  VZY  UZ   xr   y    UL   VL
09257                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   xr   y    UL   VL
09258                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   xr   y    UL   VL
09259                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y    UL   VL
09260                 faddp   st(1),st                                ; VZ   UZ   ZX   y    UL   VL
09261                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y    UL   VL
09262                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY   UL   VL
09263                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY   UL   VL
09264                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY   UL   VL
09265 
09266                 faddp   st(3),st                                ; UZ   VZ   Zi   UL   VL
09267                 fld1                                                    ; 1    UZ   VZ   Zi   UL   VL
09268                 fdiv    st,st(3)                                ; ZR   UZ   VZ   Zi   UL   VL
09269 
09270                 fld             st                                              ; ZR   ZR   UZ   VZ   Zi   UL   VL
09271                 fmul    st,st(3)                                ; VR   ZR   UZ   VZ   Zi   UL   VL
09272                 fxch    st(1)                                   ; ZR   VR   UZ   VZ   Zi   UL   VL
09273                 fmul    st,st(2)                                ; UR   VR   UZ   VZ   Zi   UL   VL
09274 
09275                 //lazy idiv below... should 1/int mul mul
09276 
09277                 ; calculate deltas                              ; st0  st1  st2  st3  st4  st5  st6  st7
09278                 fsubr   st(5),st                                ; UR   VR   inv. inv. inv. dU   VL
09279                 fxch    st(1)                                   ; VR   UR   inv. inv. inv. dU   VL
09280                 fsubr   st(6),st                                ; VR   UR   inv. inv. inv. dU   dV
09281                 fxch    st(6)                                   ; dV   UR   inv. inv. inv. dU   VR
09282                 fidiv   dword ptr[RemainingCount];dv   UR   inv. inv. inv. dU   VR
09283                 fadd    qword ptr[MipMagic]             ; dvk  UR   inv. inv. inv. dU   VR
09284                 fxch    st(5)                                   ; dU   UR   inv. inv. inv. dvk  VR
09285                 fidiv   dword ptr[RemainingCount];du   UR   inv. inv. inv. dvk  VR
09286                 fadd    qword ptr[MipMagic]             ; duk  UR   inv. inv. inv. dvk  VR
09287                 fxch    st(5)                                   ; dvk  UR   inv. inv. inv. duk  VR
09288                 fstp    qword ptr[DeltaV]               ; UR   inv. inv. inv. duk  VR
09289                 fxch    st(4)                                   ; duk  inv. inv. inv. UR   VR
09290                 fstp    qword ptr[DeltaU]               ; inv. inv. inv. UR   VR
09291                 fld             st(1)                                   ; inv. inv. inv. inv. UR   VR
09292                 fld             st(2)                                   ; inv. inv. inv. inv. inv. UR   VR
09293 
09294 OnePixelSpan16:
09295                 // Clamp U/V
09296                 mov             ebx,[UFixed]
09297                 cmp             ebx,MaxU
09298                 jle             TryClampU116
09299                 mov             ecx,MaxU
09300                 mov             dword ptr[UFixed],ecx
09301                 jmp             NoClampU116
09302 
09303 TryClampU116:
09304                 cmp             ebx,0
09305                 jge             NoClampU116
09306                 mov             dword ptr[UFixed],0
09307 NoClampU116:
09308                 mov             eax,[VFixed]
09309                 cmp             eax,MaxV
09310                 jle             TryClampV116
09311                 mov             ecx,MaxV
09312                 mov             dword ptr[VFixed],ecx
09313                 jmp             NoClampV116
09314 
09315 TryClampV116:
09316                 cmp             eax,0
09317                 jge             NoClampV116
09318                 mov             dword ptr[VFixed],0
09319 
09320 NoClampV116:
09321 
09322                 fstp    [FTemp0]
09323                 fstp    [FTemp1]
09324                 fstp    [FTemp2]
09325                 fstp    [FTemp3]
09326                 fstp    [FTemp4]
09327                 fstp    [FTemp5]
09328 
09329                 mov             ebx,dword ptr[U1]
09330                 mov             edx,dword ptr[V1]
09331 
09332                 fild    [RR1]                                   ; LR
09333                 fild    [GG1]                                   ; LG   LR
09334                 fild    [BB1]                                   ; LB   LG   LR
09335 
09336                 mov             ecx,[VShift]
09337                 add             edx,dword ptr[VAdjust2]
09338 
09339                 add             ebx,dword ptr[UAdjust2]
09340                 mov             eax,dword ptr[DeltaV]
09341 
09342                 shl             eax,cl
09343                 mov             esi,pTex
09344 
09345                 shl             edx,cl
09346                 mov             dword ptr[DeltaV],eax
09347 
09348 
09349                 push    ebp
09350 
09351 LeftoverLoop16:
09352                 mov             eax,edx
09353                 and             ebx,[GWMaskShifted]
09354 
09355                 and             eax,[GHMaskShifted16]
09356 
09357                 add             eax,ebx
09358                 add             ebx,dword ptr[DeltaU]
09359 
09360                 shr             eax,16
09361                 add             edi,2
09362 
09363                 mov             ax,word ptr[2*eax+esi]
09364                 add             edx,dword ptr[DeltaV]
09365 
09366                 xor             eax,0
09367 
09368                 mov             esi,eax
09369                 mov             ebp,eax
09370 
09371                 and             esi,REDMASK
09372                 and             ebp,GREENMASK
09373 
09374                 mov             dword ptr[Red],esi
09375                 mov             dword ptr[Green],ebp
09376 
09377                 fild    qword ptr[Red]                  ; r    LB   LG   LR
09378 
09379                 mov             ebp,eax
09380 
09381                 fmul    st,st(3)                                ; R    LB   LG   LR
09382                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
09383 
09384                 and             ebp,BLUEMASK
09385 
09386                 mov             dword ptr[Blue],ebp
09387 
09388                 fmul    st,st(3)                                ; G    R    LB   LG   LR
09389                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
09390                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
09391                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
09392                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
09393                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
09394                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
09395                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
09396                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
09397                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
09398                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
09399                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
09400 
09401                 mov             eax,dword ptr[Bucket]
09402                 mov             ebp,dword ptr[Bucket2]
09403 
09404                 fstp    qword ptr[Bucket]               ; LB   LG   LR
09405 
09406                 and             eax,REDMASK
09407                 and             ebp,BLUEMASK
09408                 
09409                 mov             esi,dword ptr[Bucket]
09410                 or              ebp,eax
09411 
09412                 and             esi,GREENMASK
09413 
09414                 or              ebp,esi
09415 
09416                 mov             esi,pTex
09417 
09418                 mov             word ptr[edi-2],bp
09419 
09420                 dec             [RemainingCount]
09421                 jge             LeftoverLoop16
09422 
09423                 pop             ebp
09424 
09425 
09426 FPUReturn16:
09427                 ffree   st(0)
09428                 ffree   st(1)
09429                 ffree   st(2)
09430                 ffree   st(3)
09431                 ffree   st(4)
09432                 ffree   st(5)
09433                 ffree   st(6)
09434 
09435 Return16:
09436                 pop             edi
09437                 pop             esi
09438                 pop             ecx
09439                 pop             ebx
09440         }
09441 }
09442 
09443 void DrawSpan16_AsmGouraudZBufferX86FPU(int32 x1, int32 x2, int32 y, int32 r1, int32 g1, int32 b1, int32 r2, int32 g2, int32 b2)
09444 {
09445         RR1     =r1;
09446         GG1     =g1;
09447         BB1     =b1;
09448         TDest   =Dest;
09449         Red     =Green  =Blue   =0;
09450         _asm
09451         {
09452                 push    ebx
09453                 push    ecx
09454                 push    esi
09455                 push    edi
09456 
09457                 mov             eax,x1
09458                 mov             ecx,x2
09459                 sub             ecx,eax
09460                 jle             Return16
09461 
09462                 mov             edi,[GBitPtr16]
09463 //              inc             ecx
09464                 mov             pTex,edi
09465 
09466                 fild    [y]                                             ; y
09467                 mov             [widTemp],ecx
09468 
09469                 fild    [x1]                                            ; x    y
09470                 fild    [widTemp]
09471 
09472                 fld1
09473                 fdivrp  st(1),st
09474 
09475                 mov             esi,x1
09476                 mov             edi,[TDest]
09477 
09478                 shl             esi,1
09479                 mov             eax,ecx
09480 
09481                 add             edi,esi
09482                 add             pZBufferPtr,esi
09483 
09484                 mov             eax,ecx
09485                 shr             ecx,4
09486                 and             eax,15
09487                 _emit 75h
09488                 _emit 06h
09489                 dec             ecx
09490                 mov             eax,16
09491 
09492                 mov             [NumASpans],ecx
09493                 mov             [RemainingCount],eax
09494 
09495                 fild    [r2]
09496                 fisub   [r1]
09497                 fild    [g2]
09498                 fisub   [g1]
09499                 fild    [b2]
09500                 fisub   [b1]
09501                 fxch    st(2)
09502                 fmul    st,st(3)
09503                 fxch    st(1)
09504                 fmul    st,st(3)
09505                 fxch    st(2)
09506                 fmul    st,st(3)
09507                 frndint
09508                 fstp    qword ptr[BlueDelta]
09509                 frndint
09510                 fstp    qword ptr[RedDelta]
09511                 frndint
09512                 fstp    qword ptr[GreenDelta]
09513                 fstp    qword ptr[FTemp0]
09514 
09515 
09516                 //decoder won't keep up with these huge instructions
09517                 //need to find some int instructions to cram in here somewhere
09518                 fld             [UDivZStepY]                    ; UZdY x    y
09519                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
09520                 fmul    st,st(2)                                ; UZX  UZdY x    y
09521                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
09522                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
09523                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
09524                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
09525                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
09526                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
09527                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
09528                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
09529                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
09530                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
09531                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
09532                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
09533                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
09534                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
09535 
09536                 //zbuffer step action
09537                 fld             [ZiStepX]
09538                 fmul    dword ptr[ZBufferPrec]
09539                 fmul    dword ptr[Two]
09540                 fistp   dword ptr[ZDelta]
09541 
09542                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
09543                 faddp   st(1),st                                ; VZ   UZ   ZX   y
09544                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
09545                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
09546                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
09547                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
09548 
09549                 //room for two cycles of int instructions here
09550 
09551                 faddp   st(3),st                                ; UZ   VZ   Zi
09552                 fld1                                                    ; 1    UZ   VZ   Zi
09553                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
09554 
09555                 //room for 18 cycles of int instructions here
09556 
09557                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
09558                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
09559                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
09560 
09561                 //zbuffer action
09562                 fld             st
09563                 fmul    dword ptr[ZBufferPrec]
09564                 fistp   dword ptr[ZVal]
09565 
09566                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
09567                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
09568                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
09569                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
09570                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
09571                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
09572                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
09573                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
09574                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
09575 
09576                 //room for 18 cycles of int stuff here
09577 
09578                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
09579                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
09580                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
09581                 //fmul stall one cycle
09582                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
09583 
09584                 test    ecx,ecx
09585                 jz              HandleLeftoverPixels16
09586 
09587 SpanLoop16:
09588                 //need one more stack spot
09589                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
09590                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
09591                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
09592                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
09593                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
09594                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
09595                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
09596                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
09597                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
09598                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
09599 
09600                 mov             ebx,dword ptr[Bucket]
09601                 mov             eax,dword ptr[Bucket2]
09602 
09603                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
09604                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
09605 
09606                 add             ebx,dword ptr[UAdjust]
09607                 add             eax,dword ptr[UAdjustL]
09608 
09609                 mov             [U1],ebx
09610                 mov             [UFixed],eax
09611 
09612                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
09613                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
09614                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
09615                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
09616                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
09617                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
09618                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
09619                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
09620 
09621                 mov             ebx,dword ptr[Bucket]
09622                 mov             eax,dword ptr[Bucket2]
09623 
09624                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
09625 
09626                 add             ebx,dword ptr[VAdjust]
09627                 add             eax,dword ptr[VAdjustL]
09628 
09629                 mov             [V1],ebx
09630                 mov             [VFixed],eax
09631 
09632                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
09633                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
09634                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
09635                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
09636                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
09637                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
09638                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
09639                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
09640                 //gotta do this to get em lined back up right
09641                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
09642                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
09643 
09644                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
09645                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
09646                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
09647                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
09648                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
09649                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
09650                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
09651                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
09652                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
09653                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
09654 
09655                 // Clamp U/V
09656                 mov             ebx,[UFixed]
09657                 cmp             ebx,MaxU
09658                 jle             TryClampU016
09659                 mov             ecx,MaxU
09660                 mov             dword ptr[UFixed],ecx
09661                 jmp             NoClampU016
09662 
09663 TryClampU016:
09664                 cmp             ebx,0
09665                 jge             NoClampU016
09666                 mov             dword ptr[UFixed],0
09667 NoClampU016:
09668                 mov             eax,[VFixed]
09669                 cmp             eax,MaxV
09670                 jle             TryClampV016
09671                 mov             ecx,MaxV
09672                 mov             dword ptr[VFixed],ecx
09673                 jmp             NoClampV016
09674 
09675 TryClampV016:
09676                 cmp             eax,0
09677                 jge             NoClampV016
09678                 mov             dword ptr[VFixed],0
09679 
09680 NoClampV016:
09681 
09682                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
09683                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
09684                 fstp    [FTemp2]                                ; VZR  UL   VL
09685                 fstp    [FTemp3]                                ; UL   VL
09686                 fstp    [FTemp4]                                ; VL
09687                 fstp    [FTemp5]                                ; 
09688 
09689 
09690                 fild    [RR1]                                   ; LR
09691                 fild    [GG1]                                   ; LG   LR
09692                 fild    [BB1]                                   ; LB   LG   LR
09693                 
09694                 
09695                 mov             ebx,dword ptr[U1]
09696                 mov             eax,dword ptr[V1]
09697 
09698                 add             ebx,dword ptr[UAdjust2]
09699                 add             eax,dword ptr[VAdjust2]
09700 
09701                 mov             ecx,[VShift]
09702                 mov             dword ptr[Bucket],ebx
09703 
09704                 shl             eax,cl
09705 
09706                 push    ebp
09707 
09708                 mov             dword ptr[Bucket2],eax
09709                 mov             ebp,dword ptr[DeltaV]
09710 
09711                 and             eax,[GHMaskShifted16]
09712                 and             ebx,[GWMaskShifted]
09713 
09714                 shl             ebp,cl
09715                 add             eax,ebx
09716 
09717                 mov             edx,dword ptr[Bucket2]
09718                 mov             esi,pTex
09719 
09720                 shr             eax,16
09721                 mov             dword ptr[DeltaV],ebp
09722 
09723                 mov             ebx,dword ptr[Bucket]
09724 
09725                 mov             ax,word ptr[2*eax+esi]
09726                 add             edx,dword ptr[DeltaV]
09727 
09728                 xor             eax,0
09729                 mov             ecx,edx
09730 
09731                 add             ebx,dword ptr[DeltaU]
09732                 and             ecx,[GHMaskShifted16]
09733 
09734                 rol             eax,16
09735                 and             ebx,[GWMaskShifted]
09736 
09737                 xor             eax,0
09738                 add             ecx,ebx
09739 
09740                 add             edx,dword ptr[DeltaV]
09741                 mov             esi,pTex
09742 
09743                 shr             ecx,16
09744                 add             ebx,dword ptr[DeltaU]
09745 
09746                 mov             ax,word ptr[2*ecx+esi]
09747                 mov             ecx,edx
09748 
09749                 xor             eax,0
09750                 and             ecx,[GHMaskShifted16]
09751 
09752                 mov             esi,eax
09753                 mov             ebp,eax
09754 
09755                 and             esi,REDMASK
09756                 and             ebp,GREENMASK
09757 
09758                 mov             dword ptr[Red],esi
09759                 mov             dword ptr[Green],ebp
09760 
09761                 fild    qword ptr[Red]                  ; r    LB   LG   LR
09762 
09763                 mov             ebp,eax
09764 
09765                 fmul    st,st(3)                                ; R    LB   LG   LR
09766                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
09767 
09768                 and             ebp,BLUEMASK
09769                 and             ebx,[GWMaskShifted]
09770 
09771                 mov             dword ptr[Blue],ebp
09772 
09773                 fmul    st,st(3)                                ; G    R    LB   LG   LR
09774                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
09775                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
09776                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
09777                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
09778                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
09779                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
09780                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
09781                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
09782                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
09783                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
09784                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
09785 
09786                 mov             eax,dword ptr[Bucket]
09787                 mov             ebp,dword ptr[Bucket2]
09788 
09789                 fstp    qword ptr[Bucket]               ; LB   LG   LR
09790                 fxch    st(1)
09791                 fadd    qword ptr[GreenDelta]
09792                 fxch    st(1)
09793                 fadd    qword ptr[BlueDelta]
09794                 fxch    st(2)
09795                 fadd    qword ptr[RedDelta]
09796                 fxch    st(2)
09797 
09798                 and             eax,REDMASK
09799                 and             ebp,BLUEMASK
09800                 
09801                 mov             esi,dword ptr[Bucket]
09802                 or              ebp,eax
09803 
09804                 add             ecx,ebx
09805                 and             esi,GREENMASK
09806 
09807                 shr             ecx,16
09808                 or              ebp,esi
09809 
09810                 xor             eax,0
09811                 mov             esi,pTex
09812 
09813                 rol             ebp,16
09814                 add             edx,dword ptr[DeltaV]
09815 
09816                 mov             ax,word ptr[2*ecx+esi]
09817                 mov             ecx,[ZVal]
09818 
09819                 mov             esi,[ZVal]
09820                 add             ecx,[ZDelta]
09821 
09822                 shr             esi,16
09823                 mov             [ZVal],ecx
09824 
09825                 mov             ecx,pZBufferPtr
09826 
09827                 cmp             si,word ptr[ecx+0]
09828                 jle             Skip0
09829 
09830                 mov             [edi+0],ebp
09831                 mov             word ptr[ecx+0],si
09832                 mov             word ptr[ecx+2],si
09833 
09834 Skip0:
09835                 mov             ecx,edx
09836                 mov             esi,pTex
09837 
09838                 add             ebx,dword ptr[DeltaU]
09839                 and             ecx,[GHMaskShifted16]
09840 
09841                 and             ebx,[GWMaskShifted]
09842                 xor             eax,0
09843 
09844                 add             ecx,ebx
09845 
09846                 rol             eax,16
09847                 add             edx,dword ptr[DeltaV]
09848 
09849                 shr             ecx,16
09850                 add             ebx,dword ptr[DeltaU]
09851 
09852                 mov             ax,word ptr[2*ecx+esi]
09853 
09854                 mov             ecx,edx
09855                 xor             eax,0
09856 
09857                 and             ecx,[GHMaskShifted16]
09858                 mov             esi,eax
09859 
09860                 mov             ebp,eax
09861                 and             esi,REDMASK
09862 
09863                 and             ebp,GREENMASK
09864                 mov             dword ptr[Red],esi
09865 
09866                 mov             dword ptr[Green],ebp
09868 
09869 
09870                 fild    qword ptr[Red]                  ; r    LB   LG   LR
09871 
09872                 mov             ebp,eax
09873 
09874                 fmul    st,st(3)                                ; R    LB   LG   LR
09875                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
09876 
09877                 and             ebp,BLUEMASK
09878                 and             ebx,[GWMaskShifted]
09879 
09880                 mov             dword ptr[Blue],ebp
09881 
09882                 fmul    st,st(3)                                ; G    R    LB   LG   LR
09883                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
09884                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
09885                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
09886                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
09887                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
09888                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
09889                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
09890                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
09891                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
09892                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
09893                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
09894 
09895                 mov             eax,dword ptr[Bucket]
09896                 mov             ebp,dword ptr[Bucket2]
09897 
09898                 fstp    qword ptr[Bucket]               ; LB   LG   LR
09899                 fxch    st(1)
09900                 fadd    qword ptr[GreenDelta]
09901                 fxch    st(1)
09902                 fadd    qword ptr[BlueDelta]
09903                 fxch    st(2)
09904                 fadd    qword ptr[RedDelta]
09905                 fxch    st(2)
09906 
09907                 and             eax,REDMASK
09908                 and             ebp,BLUEMASK
09909                 
09910                 mov             esi,dword ptr[Bucket]
09911                 or              ebp,eax
09912 
09913                 add             ecx,ebx
09914                 and             esi,GREENMASK
09915 
09916                 shr             ecx,16
09917                 or              ebp,esi
09918 
09919                 xor             eax,0
09920                 mov             esi,pTex
09921 
09922                 rol             ebp,16
09923                 add             edx,dword ptr[DeltaV]
09924 
09925                 mov             ax,word ptr[2*ecx+esi]
09926                 mov             ecx,[ZVal]
09927 
09928                 mov             esi,[ZVal]
09929                 add             ecx,[ZDelta]
09930 
09931                 shr             esi,16
09932                 mov             [ZVal],ecx
09933 
09934                 mov             ecx,pZBufferPtr
09935 
09936                 cmp             si,word ptr[ecx+4]
09937                 jle             Skip1
09938 
09939                 mov             [edi+4],ebp
09940                 mov             word ptr[ecx+4],si
09941                 mov             word ptr[ecx+6],si
09942 
09943 Skip1:
09944                 mov             ecx,edx
09945                 mov             esi,pTex
09946 
09947                 add             ebx,dword ptr[DeltaU]
09948                 and             ecx,[GHMaskShifted16]
09949 
09950                 and             ebx,[GWMaskShifted]
09951                 xor             eax,0
09952 
09953                 add             ecx,ebx
09954 
09955                 rol             eax,16
09956                 add             edx,dword ptr[DeltaV]
09957 
09958                 shr             ecx,16
09959                 add             ebx,dword ptr[DeltaU]
09960 
09961                 mov             ax,word ptr[2*ecx+esi]
09962 
09963                 mov             ecx,edx
09964                 xor             eax,0
09965 
09966                 and             ecx,[GHMaskShifted16]
09967                 mov             esi,eax
09968 
09969                 mov             ebp,eax
09970                 and             esi,REDMASK
09971 
09972                 and             ebp,GREENMASK
09973                 mov             dword ptr[Red],esi
09974 
09975                 mov             dword ptr[Green],ebp
09977 
09978 
09979                 fild    qword ptr[Red]                  ; r    LB   LG   LR
09980 
09981                 mov             ebp,eax
09982 
09983                 fmul    st,st(3)                                ; R    LB   LG   LR
09984                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
09985 
09986                 and             ebp,BLUEMASK
09987                 and             ebx,[GWMaskShifted]
09988 
09989                 mov             dword ptr[Blue],ebp
09990 
09991                 fmul    st,st(3)                                ; G    R    LB   LG   LR
09992                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
09993                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
09994                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
09995                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
09996                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
09997                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
09998                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
09999                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
10000                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
10001                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
10002                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
10003 
10004                 mov             eax,dword ptr[Bucket]
10005                 mov             ebp,dword ptr[Bucket2]
10006 
10007                 fstp    qword ptr[Bucket]               ; LB   LG   LR
10008                 fxch    st(1)
10009                 fadd    qword ptr[GreenDelta]
10010                 fxch    st(1)
10011                 fadd    qword ptr[BlueDelta]
10012                 fxch    st(2)
10013                 fadd    qword ptr[RedDelta]
10014                 fxch    st(2)
10015 
10016                 and             eax,REDMASK
10017                 and             ebp,BLUEMASK
10018                 
10019                 mov             esi,dword ptr[Bucket]
10020                 or              ebp,eax
10021 
10022                 add             ecx,ebx
10023                 and             esi,GREENMASK
10024 
10025                 shr             ecx,16
10026                 or              ebp,esi
10027 
10028                 xor             eax,0
10029                 mov             esi,pTex
10030 
10031                 rol             ebp,16
10032                 add             edx,dword ptr[DeltaV]
10033 
10034                 mov             ax,word ptr[2*ecx+esi]
10035                 mov             ecx,[ZVal]
10036 
10037                 mov             esi,[ZVal]
10038                 add             ecx,[ZDelta]
10039 
10040                 shr             esi,16
10041                 mov             [ZVal],ecx
10042 
10043                 mov             ecx,pZBufferPtr
10044 
10045                 cmp             si,word ptr[ecx+8]
10046                 jle             Skip2
10047 
10048                 mov             [edi+8],ebp
10049                 mov             word ptr[ecx+8],si
10050                 mov             word ptr[ecx+10],si
10051 
10052 Skip2:
10053                 mov             ecx,edx
10054                 mov             esi,pTex
10055 
10056                 add             ebx,dword ptr[DeltaU]
10057                 and             ecx,[GHMaskShifted16]
10058 
10059                 and             ebx,[GWMaskShifted]
10060                 xor             eax,0
10061 
10062                 add             ecx,ebx
10063 
10064                 shr             ecx,16
10065                 add             edx,dword ptr[DeltaV]
10066 
10067                 rol             eax,16
10068                 mov             ax,word ptr[2*ecx+esi]
10069 
10070                 mov             ecx,edx
10071                 xor             eax,0
10072 
10073                 and             ecx,[GHMaskShifted16]
10074                 mov             esi,eax
10075 
10076                 mov             ebp,eax
10077                 and             esi,REDMASK
10078 
10079                 and             ebp,GREENMASK
10080                 mov             dword ptr[Red],esi
10081 
10082                 mov             dword ptr[Green],ebp
10083                 add             ebx,dword ptr[DeltaU]
10085 
10086 
10087                 fild    qword ptr[Red]                  ; r    LB   LG   LR
10088 
10089                 mov             ebp,eax
10090 
10091                 fmul    st,st(3)                                ; R    LB   LG   LR
10092                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
10093 
10094                 and             ebp,BLUEMASK
10095                 and             ebx,[GWMaskShifted]
10096 
10097                 mov             dword ptr[Blue],ebp
10098 
10099                 fmul    st,st(3)                                ; G    R    LB   LG   LR
10100                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
10101                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
10102                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
10103                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
10104                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
10105                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
10106                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
10107                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
10108                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
10109                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
10110                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
10111 
10112                 mov             eax,dword ptr[Bucket]
10113                 mov             ebp,dword ptr[Bucket2]
10114 
10115                 fstp    qword ptr[Bucket]               ; LB   LG   LR
10116                 fxch    st(1)
10117                 fadd    qword ptr[GreenDelta]
10118                 fxch    st(1)
10119                 fadd    qword ptr[BlueDelta]
10120                 fxch    st(2)
10121                 fadd    qword ptr[RedDelta]
10122                 fxch    st(2)
10123 
10124                 and             eax,REDMASK
10125                 and             ebp,BLUEMASK
10126                 
10127                 mov             esi,dword ptr[Bucket]
10128                 or              ebp,eax
10129 
10130                 add             ecx,ebx
10131                 and             esi,GREENMASK
10132 
10133                 shr             ecx,16
10134                 or              ebp,esi
10135 
10136                 xor             eax,0
10137                 mov             esi,pTex
10138 
10139                 rol             ebp,16
10140                 add             edx,dword ptr[DeltaV]
10141 
10142                 mov             ax,word ptr[2*ecx+esi]
10143                 mov             ecx,[ZVal]
10144 
10145                 mov             esi,[ZVal]
10146                 add             ecx,[ZDelta]
10147 
10148                 shr             esi,16
10149                 mov             [ZVal],ecx
10150 
10151                 mov             ecx,pZBufferPtr
10152 
10153                 cmp             si,word ptr[ecx+12]
10154                 jle             Skip3
10155 
10156                 mov             [edi+12],ebp
10157                 mov             word ptr[ecx+12],si
10158                 mov             word ptr[ecx+14],si
10159 
10160 Skip3:
10161                 mov             ecx,edx
10162                 mov             esi,pTex
10163 
10164                 add             ebx,dword ptr[DeltaU]
10165                 and             ecx,[GHMaskShifted16]
10166 
10167                 and             ebx,[GWMaskShifted]
10168                 xor             eax,0
10169 
10170                 add             ecx,ebx
10171 
10172                 shr             ecx,16
10173                 add             edx,dword ptr[DeltaV]
10174 
10175                 rol             eax,16
10176                 mov             ax,word ptr[2*ecx+esi]
10177 
10178                 mov             ecx,edx
10179                 xor             eax,0
10180 
10181                 and             ecx,[GHMaskShifted16]
10182                 mov             esi,eax
10183 
10184                 mov             ebp,eax
10185                 and             esi,REDMASK
10186 
10187                 and             ebp,GREENMASK
10188                 mov             dword ptr[Red],esi
10189 
10190                 mov             dword ptr[Green],ebp
10191                 add             ebx,dword ptr[DeltaU]
10193 
10194 
10195                 fild    qword ptr[Red]                  ; r    LB   LG   LR
10196 
10197                 mov             ebp,eax
10198 
10199                 fmul    st,st(3)                                ; R    LB   LG   LR
10200                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
10201 
10202                 and             ebp,BLUEMASK
10203                 and             ebx,[GWMaskShifted]
10204 
10205                 mov             dword ptr[Blue],ebp
10206 
10207                 fmul    st,st(3)                                ; G    R    LB   LG   LR
10208                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
10209                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
10210                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
10211                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
10212                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
10213                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
10214                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
10215                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
10216                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
10217                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
10218                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
10219 
10220                 mov             eax,dword ptr[Bucket]
10221                 mov             ebp,dword ptr[Bucket2]
10222 
10223                 fstp    qword ptr[Bucket]               ; LB   LG   LR
10224                 fxch    st(1)
10225                 fadd    qword ptr[GreenDelta]
10226                 fxch    st(1)
10227                 fadd    qword ptr[BlueDelta]
10228                 fxch    st(2)
10229                 fadd    qword ptr[RedDelta]
10230                 fxch    st(2)
10231 
10232                 and             eax,REDMASK
10233                 and             ebp,BLUEMASK
10234                 
10235                 mov             esi,dword ptr[Bucket]
10236                 or              ebp,eax
10237 
10238                 add             ecx,ebx
10239                 and             esi,GREENMASK
10240 
10241                 shr             ecx,16
10242                 or              ebp,esi
10243 
10244                 xor             eax,0
10245                 mov             esi,pTex
10246 
10247                 rol             ebp,16
10248                 add             edx,dword ptr[DeltaV]
10249 
10250                 mov             ax,word ptr[2*ecx+esi]
10251                 mov             ecx,[ZVal]
10252 
10253                 mov             esi,[ZVal]
10254                 add             ecx,[ZDelta]
10255 
10256                 shr             esi,16
10257                 mov             [ZVal],ecx
10258 
10259                 mov             ecx,pZBufferPtr
10260 
10261                 cmp             si,word ptr[ecx+16]
10262                 jle             Skip4
10263 
10264                 mov             [edi+16],ebp
10265                 mov             word ptr[ecx+16],si
10266                 mov             word ptr[ecx+18],si
10267 
10268 Skip4:
10269                 mov             ecx,edx
10270                 mov             esi,pTex
10271 
10272                 add             ebx,dword ptr[DeltaU]
10273                 and             ecx,[GHMaskShifted16]
10274 
10275                 and             ebx,[GWMaskShifted]
10276                 xor             eax,0
10277 
10278                 add             ecx,ebx
10279 
10280                 shr             ecx,16
10281                 add             edx,dword ptr[DeltaV]
10282 
10283                 rol             eax,16
10284                 mov             ax,word ptr[2*ecx+esi]
10285 
10286                 mov             ecx,edx
10287                 xor             eax,0
10288 
10289                 and             ecx,[GHMaskShifted16]
10290                 mov             esi,eax
10291 
10292                 mov             ebp,eax
10293                 and             esi,REDMASK
10294 
10295                 and             ebp,GREENMASK
10296                 mov             dword ptr[Red],esi
10297 
10298                 mov             dword ptr[Green],ebp
10299                 add             ebx,dword ptr[DeltaU]
10301 
10302 
10303                 fild    qword ptr[Red]                  ; r    LB   LG   LR
10304 
10305                 mov             ebp,eax
10306 
10307                 fmul    st,st(3)                                ; R    LB   LG   LR
10308                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
10309 
10310                 and             ebp,BLUEMASK
10311                 and             ebx,[GWMaskShifted]
10312 
10313                 mov             dword ptr[Blue],ebp
10314 
10315                 fmul    st,st(3)                                ; G    R    LB   LG   LR
10316                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
10317                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
10318                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
10319                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
10320                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
10321                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
10322                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
10323                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
10324                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
10325                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
10326                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
10327 
10328                 mov             eax,dword ptr[Bucket]
10329                 mov             ebp,dword ptr[Bucket2]
10330 
10331                 fstp    qword ptr[Bucket]               ; LB   LG   LR
10332                 fxch    st(1)
10333                 fadd    qword ptr[GreenDelta]
10334                 fxch    st(1)
10335                 fadd    qword ptr[BlueDelta]
10336                 fxch    st(2)
10337                 fadd    qword ptr[RedDelta]
10338                 fxch    st(2)
10339 
10340                 and             eax,REDMASK
10341                 and             ebp,BLUEMASK
10342                 
10343                 mov             esi,dword ptr[Bucket]
10344                 or              ebp,eax
10345 
10346                 add             ecx,ebx
10347                 and             esi,GREENMASK
10348 
10349                 shr             ecx,16
10350                 or              ebp,esi
10351 
10352                 xor             eax,0
10353                 mov             esi,pTex
10354 
10355                 rol             ebp,16
10356                 add             edx,dword ptr[DeltaV]
10357 
10358                 mov             ax,word ptr[2*ecx+esi]
10359                 mov             ecx,[ZVal]
10360 
10361                 mov             esi,[ZVal]
10362                 add             ecx,[ZDelta]
10363 
10364                 shr             esi,16
10365                 mov             [ZVal],ecx
10366 
10367                 mov             ecx,pZBufferPtr
10368 
10369                 cmp             si,word ptr[ecx+20]
10370                 jle             Skip5
10371 
10372                 mov             [edi+20],ebp
10373                 mov             word ptr[ecx+20],si
10374                 mov             word ptr[ecx+22],si
10375 
10376 Skip5:
10377                 mov             ecx,edx
10378                 mov             esi,pTex
10379 
10380                 add             ebx,dword ptr[DeltaU]
10381                 and             ecx,[GHMaskShifted16]
10382 
10383                 and             ebx,[GWMaskShifted]
10384                 xor             eax,0
10385 
10386                 add             ecx,ebx
10387 
10388                 shr             ecx,16
10389                 add             edx,dword ptr[DeltaV]
10390 
10391                 rol             eax,16
10392                 mov             ax,word ptr[2*ecx+esi]
10393 
10394                 mov             ecx,edx
10395                 xor             eax,0
10396 
10397                 and             ecx,[GHMaskShifted16]
10398                 mov             esi,eax
10399 
10400                 mov             ebp,eax
10401                 and             esi,REDMASK
10402 
10403                 and             ebp,GREENMASK
10404                 mov             dword ptr[Red],esi
10405 
10406                 mov             dword ptr[Green],ebp
10407                 add             ebx,dword ptr[DeltaU]
10409 
10410 
10411                 fild    qword ptr[Red]                  ; r    LB   LG   LR
10412 
10413                 mov             ebp,eax
10414 
10415                 fmul    st,st(3)                                ; R    LB   LG   LR
10416                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
10417 
10418                 and             ebp,BLUEMASK
10419                 and             ebx,[GWMaskShifted]
10420 
10421                 mov             dword ptr[Blue],ebp
10422 
10423                 fmul    st,st(3)                                ; G    R    LB   LG   LR
10424                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
10425                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
10426                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
10427                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
10428                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
10429                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
10430                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
10431                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
10432                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
10433                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
10434                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
10435 
10436                 mov             eax,dword ptr[Bucket]
10437                 mov             ebp,dword ptr[Bucket2]
10438 
10439                 fstp    qword ptr[Bucket]               ; LB   LG   LR
10440                 fxch    st(1)
10441                 fadd    qword ptr[GreenDelta]
10442                 fxch    st(1)
10443                 fadd    qword ptr[BlueDelta]
10444                 fxch    st(2)
10445                 fadd    qword ptr[RedDelta]
10446                 fxch    st(2)
10447 
10448                 and             eax,REDMASK
10449                 and             ebp,BLUEMASK
10450                 
10451                 mov             esi,dword ptr[Bucket]
10452                 or              ebp,eax
10453 
10454                 add             ecx,ebx
10455                 and             esi,GREENMASK
10456 
10457                 shr             ecx,16
10458                 or              ebp,esi
10459 
10460                 xor             eax,0
10461                 mov             esi,pTex
10462 
10463                 rol             ebp,16
10464                 add             edx,dword ptr[DeltaV]
10465 
10466                 mov             ax,word ptr[2*ecx+esi]
10467                 mov             ecx,[ZVal]
10468 
10469                 mov             esi,[ZVal]
10470                 add             ecx,[ZDelta]
10471 
10472                 shr             esi,16
10473                 mov             [ZVal],ecx
10474 
10475                 mov             ecx,pZBufferPtr
10476 
10477                 cmp             si,word ptr[ecx+24]
10478                 jle             Skip6
10479 
10480                 mov             [edi+24],ebp
10481                 mov             word ptr[ecx+24],si
10482                 mov             word ptr[ecx+26],si
10483 
10484 Skip6:
10485                 mov             ecx,edx
10486                 mov             esi,pTex
10487 
10488                 add             ebx,dword ptr[DeltaU]
10489                 and             ecx,[GHMaskShifted16]
10490 
10491                 and             ebx,[GWMaskShifted]
10492                 xor             eax,0
10493 
10494                 add             ecx,ebx
10495 
10496                 shr             ecx,16
10497                 add             edx,dword ptr[DeltaV]
10498 
10499                 rol             eax,16
10500                 mov             ax,word ptr[2*ecx+esi]
10501 
10502                 mov             ecx,edx
10503                 xor             eax,0
10504 
10505                 and             ecx,[GHMaskShifted16]
10506                 mov             esi,eax
10507 
10508                 mov             ebp,eax
10509                 and             esi,REDMASK
10510 
10511                 and             ebp,GREENMASK
10512                 mov             dword ptr[Red],esi
10513 
10514                 mov             dword ptr[Green],ebp
10515                 add             ebx,dword ptr[DeltaU]
10517                 fild    qword ptr[Red]                  ; r    LB   LG   LR
10518 
10519                 mov             ebp,eax
10520 
10521                 fmul    st,st(3)                                ; R    LB   LG   LR
10522                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
10523 
10524                 and             ebp,BLUEMASK
10525                 and             ebx,[GWMaskShifted]
10526 
10527                 mov             dword ptr[Blue],ebp
10528 
10529                 fmul    st,st(3)                                ; G    R    LB   LG   LR
10530                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
10531                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
10532                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
10533                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
10534                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
10535                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
10536                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
10537                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
10538                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
10539                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
10540                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
10541 
10542                 mov             eax,dword ptr[Bucket]
10543                 mov             ebp,dword ptr[Bucket2]
10544 
10545                 fstp    qword ptr[Bucket]               ; LB   LG   LR
10546                 fadd    qword ptr[BlueDelta]
10547                 fistp   dword ptr[BB1]
10548                 fadd    qword ptr[GreenDelta]
10549                 fistp   dword ptr[GG1]
10550                 fadd    qword ptr[RedDelta]
10551                 fistp   dword ptr[RR1]
10552 
10553                 and             eax,REDMASK
10554                 and             ebp,BLUEMASK
10555                 
10556                 mov             esi,dword ptr[Bucket]
10557                 or              ebp,eax
10558 
10559                 fstp    dword ptr[Bucket]
10560                 fstp    dword ptr[Bucket2]
10561                 fstp    dword ptr[Bucket]
10562 
10563                 and             esi,GREENMASK
10564 
10565                 fld             dword ptr[FTemp5]
10566                 fld             dword ptr[FTemp4]
10567 
10568                 or              ebp,esi
10569 
10570                 fld             dword ptr[FTemp3]
10571                 fld             dword ptr[FTemp2]
10572 
10573                 rol             ebp,16
10574 
10575                 fld             dword ptr[FTemp1]
10576                 fld             dword ptr[FTemp0]
10577 
10578                 mov             ecx,[ZVal]
10579 
10580                 mov             esi,[ZVal]
10581                 add             ecx,[ZDelta]
10582 
10583                 shr             esi,16
10584                 mov             [ZVal],ecx
10585 
10586                 mov             ecx,pZBufferPtr
10587 
10588                 cmp             si,word ptr[ecx+28]
10589                 jle             Skip7
10590 
10591                 mov             [edi+28],ebp
10592                 mov             word ptr[ecx+28],si
10593                 mov             word ptr[ecx+30],si
10594 
10595 Skip7:
10596                 pop             ebp
10597 
10598 
10599                 ; get corrected right side deltas ; st0  st1  st2  st3  st4  st5  st6  st7
10600                                                                                 ; ZR   UZR  ZRi  VZR  UL   VL
10601                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
10602                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
10603                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
10604                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
10605 
10606                 add             edi,32                                  ; move screen pointer to start of next aspan
10607                 add             [pZBufferPtr],32
10608                 dec             [NumASpans]                     ; dec num affine spans
10609                 jnz             SpanLoop16
10610 
10611 HandleLeftoverPixels16:
10612 
10613                 mov             esi,[pTex]
10614 
10615 
10616                 cmp             [RemainingCount],0
10617                 jz              FPUReturn16
10618 
10619                 //need one more stack spot
10620                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
10621                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
10622                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
10623                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
10624                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
10625                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
10626                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
10627                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
10628                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
10629                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
10630 
10631                 mov             ebx,dword ptr[Bucket]
10632                 mov             eax,dword ptr[Bucket2]
10633 
10634                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
10635                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
10636 
10637                 add             ebx,dword ptr[UAdjust]
10638                 add             eax,dword ptr[UAdjustL]
10639 
10640                 mov             [U1],ebx
10641                 mov             [UFixed],eax
10642 
10643                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
10644                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
10645                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
10646                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
10647                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
10648                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
10649                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
10650 
10651                 mov             ebx,dword ptr[Bucket]
10652                 mov             eax,dword ptr[Bucket2]
10653 
10654                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
10655 
10656                 add             ebx,dword ptr[VAdjust]
10657                 add             eax,dword ptr[VAdjustL]
10658 
10659                 mov             [V1],ebx
10660                 mov             [VFixed],eax
10661 
10662                 dec             [RemainingCount]
10663                 jz              OnePixelSpan16
10664 
10665 
10666                 //must get rid of this wasted time
10667                 fstp    [FloatTemp]                             ; inv. inv. inv. inv. UL   VL
10668                 fstp    [FloatTemp]                             ; inv. inv. inv. UL   VL
10669                 fstp    [FloatTemp]                             ; inv. inv. UL   VL
10670                 fstp    [FloatTemp]                             ; inv. UL   VL
10671                 fstp    [FloatTemp]                             ; UL   VL
10672                 fild    [y]                                             ; y    UL   VL
10673                 fild    [x2]                                    ; xr   y    UL   VL
10674 
10675                 fld             [UDivZStepY]                    ; UZdY xr   y    UL   VL
10676                 fld             [UDivZStepX]                    ; UZdX UZdY xr   y    UL   VL
10677                 fmul    st,st(2)                                ; UZX  UZdY xr   y    UL   VL
10678                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY xr   y    UL   VL
10679                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY xr   y    UL   VL
10680                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX xr   y    UL   VL
10681                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX xr   y    UL   VL
10682                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX xr   y    UL   VL
10683                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX xr   y    UL   VL
10684                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS xr   y    UL   VL
10685                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS xr   y    UL   VL
10686                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS xr   y    UL   VL
10687                 faddp   st(3),st                                ; VZdY VZX  UZ   xr   y    UL   VL
10688                 fmul    st,st(4)                                ; VZY  VZX  UZ   xr   y    UL   VL
10689                 fxch    st(1)                                   ; VZX  VZY  UZ   xr   y    UL   VL
10690                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   xr   y    UL   VL
10691                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   xr   y    UL   VL
10692                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y    UL   VL
10693                 faddp   st(1),st                                ; VZ   UZ   ZX   y    UL   VL
10694                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y    UL   VL
10695                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY   UL   VL
10696                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY   UL   VL
10697                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY   UL   VL
10698 
10699                 faddp   st(3),st                                ; UZ   VZ   Zi   UL   VL
10700                 fld1                                                    ; 1    UZ   VZ   Zi   UL   VL
10701                 fdiv    st,st(3)                                ; ZR   UZ   VZ   Zi   UL   VL
10702 
10703                 fld             st                                              ; ZR   ZR   UZ   VZ   Zi   UL   VL
10704                 fmul    st,st(3)                                ; VR   ZR   UZ   VZ   Zi   UL   VL
10705                 fxch    st(1)                                   ; ZR   VR   UZ   VZ   Zi   UL   VL
10706                 fmul    st,st(2)                                ; UR   VR   UZ   VZ   Zi   UL   VL
10707 
10708                 //lazy idiv below... should 1/int mul mul
10709 
10710                 ; calculate deltas                              ; st0  st1  st2  st3  st4  st5  st6  st7
10711                 fsubr   st(5),st                                ; UR   VR   inv. inv. inv. dU   VL
10712                 fxch    st(1)                                   ; VR   UR   inv. inv. inv. dU   VL
10713                 fsubr   st(6),st                                ; VR   UR   inv. inv. inv. dU   dV
10714                 fxch    st(6)                                   ; dV   UR   inv. inv. inv. dU   VR
10715                 fidiv   dword ptr[RemainingCount];dv   UR   inv. inv. inv. dU   VR
10716                 fadd    qword ptr[MipMagic]             ; dvk  UR   inv. inv. inv. dU   VR
10717                 fxch    st(5)                                   ; dU   UR   inv. inv. inv. dvk  VR
10718                 fidiv   dword ptr[RemainingCount];du   UR   inv. inv. inv. dvk  VR
10719                 fadd    qword ptr[MipMagic]             ; duk  UR   inv. inv. inv. dvk  VR
10720                 fxch    st(5)                                   ; dvk  UR   inv. inv. inv. duk  VR
10721                 fstp    qword ptr[DeltaV]               ; UR   inv. inv. inv. duk  VR
10722                 fxch    st(4)                                   ; duk  inv. inv. inv. UR   VR
10723                 fstp    qword ptr[DeltaU]               ; inv. inv. inv. UR   VR
10724                 fld             st(1)                                   ; inv. inv. inv. inv. UR   VR
10725                 fld             st(2)                                   ; inv. inv. inv. inv. inv. UR   VR
10726 
10727 OnePixelSpan16:
10728                 // Clamp U/V
10729                 mov             ebx,[UFixed]
10730                 cmp             ebx,MaxU
10731                 jle             TryClampU116
10732                 mov             ecx,MaxU
10733                 mov             dword ptr[UFixed],ecx
10734                 jmp             NoClampU116
10735 
10736 TryClampU116:
10737                 cmp             ebx,0
10738                 jge             NoClampU116
10739                 mov             dword ptr[UFixed],0
10740 NoClampU116:
10741                 mov             eax,[VFixed]
10742                 cmp             eax,MaxV
10743                 jle             TryClampV116
10744                 mov             ecx,MaxV
10745                 mov             dword ptr[VFixed],ecx
10746                 jmp             NoClampV116
10747 
10748 TryClampV116:
10749                 cmp             eax,0
10750                 jge             NoClampV116
10751                 mov             dword ptr[VFixed],0
10752 
10753 NoClampV116:
10754 
10755                 fstp    [FTemp0]
10756                 fstp    [FTemp1]
10757                 fstp    [FTemp2]
10758                 fstp    [FTemp3]
10759                 fstp    [FTemp4]
10760                 fstp    [FTemp5]
10761 
10762                 mov             ebx,dword ptr[U1]
10763                 mov             edx,dword ptr[V1]
10764 
10765                 fild    [RR1]                                   ; LR
10766                 fild    [GG1]                                   ; LG   LR
10767                 fild    [BB1]                                   ; LB   LG   LR
10768 
10769                 mov             ecx,[VShift]
10770                 add             edx,dword ptr[VAdjust2]
10771 
10772                 add             ebx,dword ptr[UAdjust2]
10773                 mov             eax,dword ptr[DeltaV]
10774 
10775                 shl             eax,cl
10776                 mov             esi,pTex
10777 
10778                 shl             edx,cl
10779                 mov             dword ptr[DeltaV],eax
10780 
10781                 mov             eax,[ZDelta]
10782                 mov             ecx,[ZVal]
10783 
10784                 sar             eax,1
10785                 push    ebp
10786 
10787                 mov             [ZDelta],eax
10788 
10789 
10790 LeftoverLoop16:
10791                 mov             eax,edx
10792                 and             ebx,[GWMaskShifted]
10793 
10794                 and             eax,[GHMaskShifted16]
10795 
10796                 add             eax,ebx
10797                 add             ebx,dword ptr[DeltaU]
10798 
10799                 shr             eax,16
10800                 add             edi,2
10801 
10802                 mov             ax,word ptr[2*eax+esi]
10803                 add             edx,dword ptr[DeltaV]
10804 
10805                 xor             eax,0
10806 
10807                 mov             esi,eax
10808                 mov             ebp,eax
10809 
10810                 and             esi,REDMASK
10811                 and             ebp,GREENMASK
10812 
10813                 mov             dword ptr[Red],esi
10814                 mov             dword ptr[Green],ebp
10815 
10816                 fild    qword ptr[Red]                  ; r    LB   LG   LR
10817 
10818                 mov             ebp,eax
10819 
10820                 fmul    st,st(3)                                ; R    LB   LG   LR
10821                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
10822 
10823                 and             ebp,BLUEMASK
10824 
10825                 mov             dword ptr[Blue],ebp
10826 
10827                 fmul    st,st(3)                                ; G    R    LB   LG   LR
10828                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
10829                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
10830                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
10831                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
10832                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
10833                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
10834                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
10835                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
10836                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
10837                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
10838                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
10839 
10840                 mov             eax,dword ptr[Bucket]
10841                 mov             ebp,dword ptr[Bucket2]
10842 
10843                 fstp    qword ptr[Bucket]               ; LB   LG   LR
10844 
10845                 and             eax,REDMASK
10846                 and             ebp,BLUEMASK
10847                 
10848                 mov             esi,dword ptr[Bucket]
10849                 or              ebp,eax
10850 
10851                 and             esi,GREENMASK
10852                 mov             eax,ecx
10853 
10854                 or              ebp,esi
10855 
10856                 shr             eax,16
10857                 mov             esi,pZBufferPtr
10858 
10859                 cmp             ax,word ptr[esi]
10860                 jle             SkipLeftOver
10861 
10862                 mov             word ptr[edi-2],bp
10863                 mov             word ptr[esi],ax
10864 
10865 SkipLeftOver:
10866                 add             ecx,[ZDelta]
10867                 mov             esi,pTex
10868 
10869                 add             pZBufferPtr,2
10870 
10871                 dec             [RemainingCount]
10872                 jge             LeftoverLoop16
10873 
10874                 pop             ebp
10875 
10876 
10877 FPUReturn16:
10878                 ffree   st(0)
10879                 ffree   st(1)
10880                 ffree   st(2)
10881                 ffree   st(3)
10882                 ffree   st(4)
10883                 ffree   st(5)
10884                 ffree   st(6)
10885 
10886 Return16:
10887                 pop             edi
10888                 pop             esi
10889                 pop             ecx
10890                 pop             ebx
10891         }
10892 }
10893 
10894 //int32 bb1;
10895 //__int64       rr1,gg1;
10896 
10897 void DrawSpan16_AsmGouraudZWriteX86FPU(int32 x1, int32 x2, int32 y, int32 r1, int32 g1, int32 b1, int32 r2, int32 g2, int32 b2)
10898 {
10899         RR1     =r1;
10900         GG1     =g1;
10901         BB1     =b1;
10902 //      RR2     =r2;
10903 //      GG2     =g2;
10904 //      BB2     =b2;
10905         TDest   =Dest;
10906         _asm
10907         {
10908                 push    ebx
10909                 push    ecx
10910                 push    esi
10911                 push    edi
10912 
10913                 mov             eax,x1
10914                 mov             ecx,x2
10915                 sub             ecx,eax
10916                 jle             Return16
10917 
10918                 mov             edi,[GBitPtr16]
10919 //              inc             ecx
10920                 mov             pTex,edi
10921 
10922                 fild    [y]                                             ; y
10923                 mov             [widTemp],ecx
10924 
10925                 fild    [x1]                                            ; x    y
10926                 fild    [widTemp]
10927 
10928                 fld1
10929                 fdivrp  st(1),st
10930 
10931                 mov             esi,x1
10932                 mov             edi,[TDest]
10933 
10934                 shl             esi,1
10935                 mov             eax,ecx
10936 
10937                 add             edi,esi
10938                 add             pZBufferPtr,esi
10939 
10940                 mov             eax,ecx
10941                 shr             ecx,4
10942                 and             eax,15
10943                 _emit 75h
10944                 _emit 06h
10945                 dec             ecx
10946                 mov             eax,16
10947 
10948                 mov             [NumASpans],ecx
10949                 mov             [RemainingCount],eax
10950 
10951                 fild    [r2]
10952                 fisub   [r1]
10953                 fild    [g2]
10954                 fisub   [g1]
10955                 fild    [b2]
10956                 fisub   [b1]
10957                 fxch    st(2)
10958                 fmul    st,st(3)
10959                 fxch    st(1)
10960                 fmul    st,st(3)
10961                 fxch    st(2)
10962                 fmul    st,st(3)
10963                 frndint
10964                 fstp    qword ptr[BlueDelta]
10965                 frndint
10966                 fstp    qword ptr[RedDelta]
10967                 frndint
10968                 fstp    qword ptr[GreenDelta]
10969                 fstp    qword ptr[FTemp0]
10970 
10971 
10972                 //decoder won't keep up with these huge instructions
10973                 //need to find some int instructions to cram in here somewhere
10974                 fld             [UDivZStepY]                    ; UZdY x    y
10975                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
10976                 fmul    st,st(2)                                ; UZX  UZdY x    y
10977                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
10978                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
10979                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
10980                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
10981                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
10982                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
10983                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
10984                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
10985                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
10986                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
10987                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
10988                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
10989                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
10990                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
10991 
10992                 //zbuffer step action
10993                 fld             [ZiStepX]
10994                 fmul    dword ptr[ZBufferPrec]
10995                 fmul    dword ptr[Two]
10996                 fistp   dword ptr[ZDelta]
10997 
10998                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
10999                 faddp   st(1),st                                ; VZ   UZ   ZX   y
11000                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
11001                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
11002                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
11003                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
11004 
11005                 //room for two cycles of int instructions here
11006 
11007                 faddp   st(3),st                                ; UZ   VZ   Zi
11008                 fld1                                                    ; 1    UZ   VZ   Zi
11009                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
11010 
11011                 //room for 18 cycles of int instructions here
11012 
11013                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
11014                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
11015                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
11016 
11017                 //zbuffer action
11018                 fld             st
11019                 fmul    dword ptr[ZBufferPrec]
11020                 fistp   dword ptr[ZVal]
11021 
11022                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
11023                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
11024                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
11025                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
11026                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
11027                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
11028                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
11029                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
11030                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
11031 
11032                 //room for 18 cycles of int stuff here
11033 
11034                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
11035                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
11036                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
11037                 //fmul stall one cycle
11038                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
11039 
11040                 test    ecx,ecx
11041                 jz              HandleLeftoverPixels16
11042 
11043 SpanLoop16:
11044                 //need one more stack spot
11045                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
11046                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
11047                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
11048                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
11049                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
11050                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
11051                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
11052                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
11053                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
11054                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
11055 
11056                 mov             ebx,dword ptr[Bucket]
11057                 mov             eax,dword ptr[Bucket2]
11058 
11059                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
11060                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
11061 
11062                 add             ebx,dword ptr[UAdjust]
11063                 add             eax,dword ptr[UAdjustL]
11064 
11065                 mov             [U1],ebx
11066                 mov             [UFixed],eax
11067 
11068                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
11069                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
11070                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
11071                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
11072                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
11073                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
11074                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
11075                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
11076 
11077                 mov             ebx,dword ptr[Bucket]
11078                 mov             eax,dword ptr[Bucket2]
11079 
11080                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
11081 
11082                 add             ebx,dword ptr[VAdjust]
11083                 add             eax,dword ptr[VAdjustL]
11084 
11085                 mov             [V1],ebx
11086                 mov             [VFixed],eax
11087 
11088                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
11089                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
11090                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
11091                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
11092                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
11093                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
11094                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
11095                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
11096                 //gotta do this to get em lined back up right
11097                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
11098                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
11099 
11100                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
11101                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
11102                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
11103                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
11104                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
11105                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
11106                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
11107                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
11108                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
11109                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
11110 
11111                 // Clamp U/V
11112                 mov             ebx,[UFixed]
11113                 cmp             ebx,MaxU
11114                 jle             TryClampU016
11115                 mov             ecx,MaxU
11116                 mov             dword ptr[UFixed],ecx
11117                 jmp             NoClampU016
11118 
11119 TryClampU016:
11120                 cmp             ebx,0
11121                 jge             NoClampU016
11122                 mov             dword ptr[UFixed],0
11123 NoClampU016:
11124                 mov             eax,[VFixed]
11125                 cmp             eax,MaxV
11126                 jle             TryClampV016
11127                 mov             ecx,MaxV
11128                 mov             dword ptr[VFixed],ecx
11129                 jmp             NoClampV016
11130 
11131 TryClampV016:
11132                 cmp             eax,0
11133                 jge             NoClampV016
11134                 mov             dword ptr[VFixed],0
11135 
11136 NoClampV016:
11137 
11138                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
11139                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
11140                 fstp    [FTemp2]                                ; VZR  UL   VL
11141                 fstp    [FTemp3]                                ; UL   VL
11142                 fstp    [FTemp4]                                ; VL
11143                 fstp    [FTemp5]                                ; 
11144 
11145 
11146                 fild    [RR1]                                   ; LR
11147                 fild    [GG1]                                   ; LG   LR
11148                 fild    [BB1]                                   ; LB   LG   LR
11149                 
11150                 
11151                 mov             ebx,dword ptr[U1]
11152                 mov             eax,dword ptr[V1]
11153 
11154                 add             ebx,dword ptr[UAdjust2]
11155                 add             eax,dword ptr[VAdjust2]
11156 
11157                 mov             ecx,[VShift]
11158                 mov             dword ptr[Bucket],ebx
11159 
11160                 shl             eax,cl
11161 
11162                 push    ebp
11163 
11164                 mov             dword ptr[Bucket2],eax
11165                 mov             ebp,dword ptr[DeltaV]
11166 
11167                 and             eax,[GHMaskShifted16]
11168                 and             ebx,[GWMaskShifted]
11169 
11170                 shl             ebp,cl
11171                 add             eax,ebx
11172 
11173                 mov             edx,dword ptr[Bucket2]
11174                 mov             esi,pTex
11175 
11176                 shr             eax,16
11177                 mov             dword ptr[DeltaV],ebp
11178 
11179                 mov             ebx,dword ptr[Bucket]
11180 
11181                 mov             ax,word ptr[2*eax+esi]
11182                 add             edx,dword ptr[DeltaV]
11183 
11184                 xor             eax,0
11185                 mov             ecx,edx
11186 
11187                 add             ebx,dword ptr[DeltaU]
11188                 and             ecx,[GHMaskShifted16]
11189 
11190                 rol             eax,16
11191                 and             ebx,[GWMaskShifted]
11192 
11193                 xor             eax,0
11194                 add             ecx,ebx
11195 
11196                 add             edx,dword ptr[DeltaV]
11197                 mov             esi,pTex
11198 
11199                 shr             ecx,16
11200                 add             ebx,dword ptr[DeltaU]
11201 
11202                 mov             ax,word ptr[2*ecx+esi]
11203                 mov             ecx,edx
11204 
11205                 xor             eax,0
11206                 and             ecx,[GHMaskShifted16]
11207 
11208                 mov             esi,eax
11209                 mov             ebp,eax
11210 
11211                 and             esi,REDMASK
11212                 and             ebp,GREENMASK
11213 
11214                 mov             dword ptr[Red],esi
11215                 mov             dword ptr[Green],ebp
11216 
11217                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11218 
11219                 mov             ebp,eax
11220 
11221                 fmul    st,st(3)                                ; R    LB   LG   LR
11222                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11223 
11224                 and             ebp,BLUEMASK
11225                 and             ebx,[GWMaskShifted]
11226 
11227                 mov             dword ptr[Blue],ebp
11228 
11229                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11230                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11231                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11232                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11233                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11234                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11235                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11236                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11237                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11238                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11239                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11240                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11241 
11242                 mov             eax,dword ptr[Bucket]
11243                 mov             ebp,dword ptr[Bucket2]
11244 
11245                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11246                 fxch    st(1)
11247                 fadd    qword ptr[GreenDelta]
11248                 fxch    st(1)
11249                 fadd    qword ptr[BlueDelta]
11250                 fxch    st(2)
11251                 fadd    qword ptr[RedDelta]
11252                 fxch    st(2)
11253 
11254                 and             eax,REDMASK
11255                 and             ebp,BLUEMASK
11256                 
11257                 mov             esi,dword ptr[Bucket]
11258                 or              ebp,eax
11259 
11260                 add             ecx,ebx
11261                 and             esi,GREENMASK
11262 
11263                 shr             ecx,16
11264                 or              ebp,esi
11265 
11266                 xor             eax,0
11267                 mov             esi,pTex
11268 
11269                 rol             ebp,16
11270                 add             edx,dword ptr[DeltaV]
11271 
11272                 mov             ax,word ptr[2*ecx+esi]
11273                 mov             ecx,[ZVal]
11274 
11275                 mov             esi,[ZVal]
11276                 add             ecx,[ZDelta]
11277 
11278                 shr             esi,16
11279                 mov             [ZVal],ecx
11280 
11281                 mov             ecx,pZBufferPtr
11282 
11283                 mov             [edi+0],ebp
11284                 mov             word ptr[ecx+0],si
11285                 mov             word ptr[ecx+2],si
11286 
11287                 mov             ecx,edx
11288                 mov             esi,pTex
11289 
11290                 add             ebx,dword ptr[DeltaU]
11291                 and             ecx,[GHMaskShifted16]
11292 
11293                 and             ebx,[GWMaskShifted]
11294                 xor             eax,0
11295 
11296                 add             ecx,ebx
11297 
11298                 rol             eax,16
11299                 add             edx,dword ptr[DeltaV]
11300 
11301                 shr             ecx,16
11302                 add             ebx,dword ptr[DeltaU]
11303 
11304                 mov             ax,word ptr[2*ecx+esi]
11305 
11306                 mov             ecx,edx
11307                 xor             eax,0
11308 
11309                 and             ecx,[GHMaskShifted16]
11310                 mov             esi,eax
11311 
11312                 mov             ebp,eax
11313                 and             esi,REDMASK
11314 
11315                 and             ebp,GREENMASK
11316                 mov             dword ptr[Red],esi
11317 
11318                 mov             dword ptr[Green],ebp
11320 
11321 
11322                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11323 
11324                 mov             ebp,eax
11325 
11326                 fmul    st,st(3)                                ; R    LB   LG   LR
11327                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11328 
11329                 and             ebp,BLUEMASK
11330                 and             ebx,[GWMaskShifted]
11331 
11332                 mov             dword ptr[Blue],ebp
11333 
11334                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11335                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11336                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11337                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11338                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11339                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11340                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11341                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11342                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11343                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11344                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11345                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11346 
11347                 mov             eax,dword ptr[Bucket]
11348                 mov             ebp,dword ptr[Bucket2]
11349 
11350                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11351                 fxch    st(1)
11352                 fadd    qword ptr[GreenDelta]
11353                 fxch    st(1)
11354                 fadd    qword ptr[BlueDelta]
11355                 fxch    st(2)
11356                 fadd    qword ptr[RedDelta]
11357                 fxch    st(2)
11358 
11359                 and             eax,REDMASK
11360                 and             ebp,BLUEMASK
11361                 
11362                 mov             esi,dword ptr[Bucket]
11363                 or              ebp,eax
11364 
11365                 add             ecx,ebx
11366                 and             esi,GREENMASK
11367 
11368                 shr             ecx,16
11369                 or              ebp,esi
11370 
11371                 xor             eax,0
11372                 mov             esi,pTex
11373 
11374                 rol             ebp,16
11375                 add             edx,dword ptr[DeltaV]
11376 
11377                 mov             ax,word ptr[2*ecx+esi]
11378                 mov             ecx,[ZVal]
11379 
11380                 mov             esi,[ZVal]
11381                 add             ecx,[ZDelta]
11382 
11383                 shr             esi,16
11384                 mov             [ZVal],ecx
11385 
11386                 mov             ecx,pZBufferPtr
11387 
11388 
11389                 mov             [edi+4],ebp
11390                 mov             word ptr[ecx+4],si
11391                 mov             word ptr[ecx+6],si
11392 
11393                 mov             ecx,edx
11394                 mov             esi,pTex
11395 
11396                 add             ebx,dword ptr[DeltaU]
11397                 and             ecx,[GHMaskShifted16]
11398 
11399                 and             ebx,[GWMaskShifted]
11400                 xor             eax,0
11401 
11402                 add             ecx,ebx
11403 
11404                 rol             eax,16
11405                 add             edx,dword ptr[DeltaV]
11406 
11407                 shr             ecx,16
11408                 add             ebx,dword ptr[DeltaU]
11409 
11410                 mov             ax,word ptr[2*ecx+esi]
11411 
11412                 mov             ecx,edx
11413                 xor             eax,0
11414 
11415                 and             ecx,[GHMaskShifted16]
11416                 mov             esi,eax
11417 
11418                 mov             ebp,eax
11419                 and             esi,REDMASK
11420 
11421                 and             ebp,GREENMASK
11422                 mov             dword ptr[Red],esi
11423 
11424                 mov             dword ptr[Green],ebp
11426 
11427 
11428                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11429 
11430                 mov             ebp,eax
11431 
11432                 fmul    st,st(3)                                ; R    LB   LG   LR
11433                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11434 
11435                 and             ebp,BLUEMASK
11436                 and             ebx,[GWMaskShifted]
11437 
11438                 mov             dword ptr[Blue],ebp
11439 
11440                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11441                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11442                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11443                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11444                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11445                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11446                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11447                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11448                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11449                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11450                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11451                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11452 
11453                 mov             eax,dword ptr[Bucket]
11454                 mov             ebp,dword ptr[Bucket2]
11455 
11456                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11457                 fxch    st(1)
11458                 fadd    qword ptr[GreenDelta]
11459                 fxch    st(1)
11460                 fadd    qword ptr[BlueDelta]
11461                 fxch    st(2)
11462                 fadd    qword ptr[RedDelta]
11463                 fxch    st(2)
11464 
11465                 and             eax,REDMASK
11466                 and             ebp,BLUEMASK
11467                 
11468                 mov             esi,dword ptr[Bucket]
11469                 or              ebp,eax
11470 
11471                 add             ecx,ebx
11472                 and             esi,GREENMASK
11473 
11474                 shr             ecx,16
11475                 or              ebp,esi
11476 
11477                 xor             eax,0
11478                 mov             esi,pTex
11479 
11480                 rol             ebp,16
11481                 add             edx,dword ptr[DeltaV]
11482 
11483                 mov             ax,word ptr[2*ecx+esi]
11484                 mov             ecx,[ZVal]
11485 
11486                 mov             esi,[ZVal]
11487                 add             ecx,[ZDelta]
11488 
11489                 shr             esi,16
11490                 mov             [ZVal],ecx
11491 
11492                 mov             ecx,pZBufferPtr
11493 
11494                 mov             [edi+8],ebp
11495                 mov             word ptr[ecx+8],si
11496                 mov             word ptr[ecx+10],si
11497 
11498                 mov             ecx,edx
11499                 mov             esi,pTex
11500 
11501                 add             ebx,dword ptr[DeltaU]
11502                 and             ecx,[GHMaskShifted16]
11503 
11504                 and             ebx,[GWMaskShifted]
11505                 xor             eax,0
11506 
11507                 add             ecx,ebx
11508 
11509                 shr             ecx,16
11510                 add             edx,dword ptr[DeltaV]
11511 
11512                 rol             eax,16
11513                 mov             ax,word ptr[2*ecx+esi]
11514 
11515                 mov             ecx,edx
11516                 xor             eax,0
11517 
11518                 and             ecx,[GHMaskShifted16]
11519                 mov             esi,eax
11520 
11521                 mov             ebp,eax
11522                 and             esi,REDMASK
11523 
11524                 and             ebp,GREENMASK
11525                 mov             dword ptr[Red],esi
11526 
11527                 mov             dword ptr[Green],ebp
11528                 add             ebx,dword ptr[DeltaU]
11530 
11531 
11532                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11533 
11534                 mov             ebp,eax
11535 
11536                 fmul    st,st(3)                                ; R    LB   LG   LR
11537                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11538 
11539                 and             ebp,BLUEMASK
11540                 and             ebx,[GWMaskShifted]
11541 
11542                 mov             dword ptr[Blue],ebp
11543 
11544                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11545                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11546                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11547                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11548                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11549                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11550                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11551                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11552                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11553                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11554                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11555                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11556 
11557                 mov             eax,dword ptr[Bucket]
11558                 mov             ebp,dword ptr[Bucket2]
11559 
11560                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11561                 fxch    st(1)
11562                 fadd    qword ptr[GreenDelta]
11563                 fxch    st(1)
11564                 fadd    qword ptr[BlueDelta]
11565                 fxch    st(2)
11566                 fadd    qword ptr[RedDelta]
11567                 fxch    st(2)
11568 
11569                 and             eax,REDMASK
11570                 and             ebp,BLUEMASK
11571                 
11572                 mov             esi,dword ptr[Bucket]
11573                 or              ebp,eax
11574 
11575                 add             ecx,ebx
11576                 and             esi,GREENMASK
11577 
11578                 shr             ecx,16
11579                 or              ebp,esi
11580 
11581                 xor             eax,0
11582                 mov             esi,pTex
11583 
11584                 rol             ebp,16
11585                 add             edx,dword ptr[DeltaV]
11586 
11587                 mov             ax,word ptr[2*ecx+esi]
11588                 mov             ecx,[ZVal]
11589 
11590                 mov             esi,[ZVal]
11591                 add             ecx,[ZDelta]
11592 
11593                 shr             esi,16
11594                 mov             [ZVal],ecx
11595 
11596                 mov             ecx,pZBufferPtr
11597 
11598                 mov             [edi+12],ebp
11599                 mov             word ptr[ecx+12],si
11600                 mov             word ptr[ecx+14],si
11601 
11602                 mov             ecx,edx
11603                 mov             esi,pTex
11604 
11605                 add             ebx,dword ptr[DeltaU]
11606                 and             ecx,[GHMaskShifted16]
11607 
11608                 and             ebx,[GWMaskShifted]
11609                 xor             eax,0
11610 
11611                 add             ecx,ebx
11612 
11613                 shr             ecx,16
11614                 add             edx,dword ptr[DeltaV]
11615 
11616                 rol             eax,16
11617                 mov             ax,word ptr[2*ecx+esi]
11618 
11619                 mov             ecx,edx
11620                 xor             eax,0
11621 
11622                 and             ecx,[GHMaskShifted16]
11623                 mov             esi,eax
11624 
11625                 mov             ebp,eax
11626                 and             esi,REDMASK
11627 
11628                 and             ebp,GREENMASK
11629                 mov             dword ptr[Red],esi
11630 
11631                 mov             dword ptr[Green],ebp
11632                 add             ebx,dword ptr[DeltaU]
11634 
11635 
11636                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11637 
11638                 mov             ebp,eax
11639 
11640                 fmul    st,st(3)                                ; R    LB   LG   LR
11641                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11642 
11643                 and             ebp,BLUEMASK
11644                 and             ebx,[GWMaskShifted]
11645 
11646                 mov             dword ptr[Blue],ebp
11647 
11648                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11649                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11650                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11651                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11652                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11653                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11654                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11655                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11656                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11657                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11658                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11659                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11660 
11661                 mov             eax,dword ptr[Bucket]
11662                 mov             ebp,dword ptr[Bucket2]
11663 
11664                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11665                 fxch    st(1)
11666                 fadd    qword ptr[GreenDelta]
11667                 fxch    st(1)
11668                 fadd    qword ptr[BlueDelta]
11669                 fxch    st(2)
11670                 fadd    qword ptr[RedDelta]
11671                 fxch    st(2)
11672 
11673                 and             eax,REDMASK
11674                 and             ebp,BLUEMASK
11675                 
11676                 mov             esi,dword ptr[Bucket]
11677                 or              ebp,eax
11678 
11679                 add             ecx,ebx
11680                 and             esi,GREENMASK
11681 
11682                 shr             ecx,16
11683                 or              ebp,esi
11684 
11685                 xor             eax,0
11686                 mov             esi,pTex
11687 
11688                 rol             ebp,16
11689                 add             edx,dword ptr[DeltaV]
11690 
11691                 mov             ax,word ptr[2*ecx+esi]
11692                 mov             ecx,[ZVal]
11693 
11694                 mov             esi,[ZVal]
11695                 add             ecx,[ZDelta]
11696 
11697                 shr             esi,16
11698                 mov             [ZVal],ecx
11699 
11700                 mov             ecx,pZBufferPtr
11701 
11702                 mov             [edi+16],ebp
11703                 mov             word ptr[ecx+16],si
11704                 mov             word ptr[ecx+18],si
11705 
11706                 mov             ecx,edx
11707                 mov             esi,pTex
11708 
11709                 add             ebx,dword ptr[DeltaU]
11710                 and             ecx,[GHMaskShifted16]
11711 
11712                 and             ebx,[GWMaskShifted]
11713                 xor             eax,0
11714 
11715                 add             ecx,ebx
11716 
11717                 shr             ecx,16
11718                 add             edx,dword ptr[DeltaV]
11719 
11720                 rol             eax,16
11721                 mov             ax,word ptr[2*ecx+esi]
11722 
11723                 mov             ecx,edx
11724                 xor             eax,0
11725 
11726                 and             ecx,[GHMaskShifted16]
11727                 mov             esi,eax
11728 
11729                 mov             ebp,eax
11730                 and             esi,REDMASK
11731 
11732                 and             ebp,GREENMASK
11733                 mov             dword ptr[Red],esi
11734 
11735                 mov             dword ptr[Green],ebp
11736                 add             ebx,dword ptr[DeltaU]
11738 
11739 
11740                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11741 
11742                 mov             ebp,eax
11743 
11744                 fmul    st,st(3)                                ; R    LB   LG   LR
11745                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11746 
11747                 and             ebp,BLUEMASK
11748                 and             ebx,[GWMaskShifted]
11749 
11750                 mov             dword ptr[Blue],ebp
11751 
11752                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11753                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11754                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11755                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11756                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11757                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11758                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11759                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11760                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11761                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11762                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11763                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11764 
11765                 mov             eax,dword ptr[Bucket]
11766                 mov             ebp,dword ptr[Bucket2]
11767 
11768                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11769                 fxch    st(1)
11770                 fadd    qword ptr[GreenDelta]
11771                 fxch    st(1)
11772                 fadd    qword ptr[BlueDelta]
11773                 fxch    st(2)
11774                 fadd    qword ptr[RedDelta]
11775                 fxch    st(2)
11776 
11777                 and             eax,REDMASK
11778                 and             ebp,BLUEMASK
11779                 
11780                 mov             esi,dword ptr[Bucket]
11781                 or              ebp,eax
11782 
11783                 add             ecx,ebx
11784                 and             esi,GREENMASK
11785 
11786                 shr             ecx,16
11787                 or              ebp,esi
11788 
11789                 xor             eax,0
11790                 mov             esi,pTex
11791 
11792                 rol             ebp,16
11793                 add             edx,dword ptr[DeltaV]
11794 
11795                 mov             ax,word ptr[2*ecx+esi]
11796                 mov             ecx,[ZVal]
11797 
11798                 mov             esi,[ZVal]
11799                 add             ecx,[ZDelta]
11800 
11801                 shr             esi,16
11802                 mov             [ZVal],ecx
11803 
11804                 mov             ecx,pZBufferPtr
11805 
11806                 mov             [edi+20],ebp
11807                 mov             word ptr[ecx+20],si
11808                 mov             word ptr[ecx+22],si
11809 
11810                 mov             ecx,edx
11811                 mov             esi,pTex
11812 
11813                 add             ebx,dword ptr[DeltaU]
11814                 and             ecx,[GHMaskShifted16]
11815 
11816                 and             ebx,[GWMaskShifted]
11817                 xor             eax,0
11818 
11819                 add             ecx,ebx
11820 
11821                 shr             ecx,16
11822                 add             edx,dword ptr[DeltaV]
11823 
11824                 rol             eax,16
11825                 mov             ax,word ptr[2*ecx+esi]
11826 
11827                 mov             ecx,edx
11828                 xor             eax,0
11829 
11830                 and             ecx,[GHMaskShifted16]
11831                 mov             esi,eax
11832 
11833                 mov             ebp,eax
11834                 and             esi,REDMASK
11835 
11836                 and             ebp,GREENMASK
11837                 mov             dword ptr[Red],esi
11838 
11839                 mov             dword ptr[Green],ebp
11840                 add             ebx,dword ptr[DeltaU]
11842 
11843 
11844                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11845 
11846                 mov             ebp,eax
11847 
11848                 fmul    st,st(3)                                ; R    LB   LG   LR
11849                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11850 
11851                 and             ebp,BLUEMASK
11852                 and             ebx,[GWMaskShifted]
11853 
11854                 mov             dword ptr[Blue],ebp
11855 
11856                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11857                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11858                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11859                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11860                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11861                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11862                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11863                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11864                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11865                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11866                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11867                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11868 
11869                 mov             eax,dword ptr[Bucket]
11870                 mov             ebp,dword ptr[Bucket2]
11871 
11872                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11873                 fxch    st(1)
11874                 fadd    qword ptr[GreenDelta]
11875                 fxch    st(1)
11876                 fadd    qword ptr[BlueDelta]
11877                 fxch    st(2)
11878                 fadd    qword ptr[RedDelta]
11879                 fxch    st(2)
11880 
11881                 and             eax,REDMASK
11882                 and             ebp,BLUEMASK
11883                 
11884                 mov             esi,dword ptr[Bucket]
11885                 or              ebp,eax
11886 
11887                 add             ecx,ebx
11888                 and             esi,GREENMASK
11889 
11890                 shr             ecx,16
11891                 or              ebp,esi
11892 
11893                 xor             eax,0
11894                 mov             esi,pTex
11895 
11896                 rol             ebp,16
11897                 add             edx,dword ptr[DeltaV]
11898 
11899                 mov             ax,word ptr[2*ecx+esi]
11900                 mov             ecx,[ZVal]
11901 
11902                 mov             esi,[ZVal]
11903                 add             ecx,[ZDelta]
11904 
11905                 shr             esi,16
11906                 mov             [ZVal],ecx
11907 
11908                 mov             ecx,pZBufferPtr
11909 
11910                 mov             [edi+24],ebp
11911                 mov             word ptr[ecx+24],si
11912                 mov             word ptr[ecx+26],si
11913 
11914                 mov             ecx,edx
11915                 mov             esi,pTex
11916 
11917                 add             ebx,dword ptr[DeltaU]
11918                 and             ecx,[GHMaskShifted16]
11919 
11920                 and             ebx,[GWMaskShifted]
11921                 xor             eax,0
11922 
11923                 add             ecx,ebx
11924 
11925                 shr             ecx,16
11926                 add             edx,dword ptr[DeltaV]
11927 
11928                 rol             eax,16
11929                 mov             ax,word ptr[2*ecx+esi]
11930 
11931                 mov             ecx,edx
11932                 xor             eax,0
11933 
11934                 and             ecx,[GHMaskShifted16]
11935                 mov             esi,eax
11936 
11937                 mov             ebp,eax
11938                 and             esi,REDMASK
11939 
11940                 and             ebp,GREENMASK
11941                 mov             dword ptr[Red],esi
11942 
11943                 mov             dword ptr[Green],ebp
11944                 add             ebx,dword ptr[DeltaU]
11946                 fild    qword ptr[Red]                  ; r    LB   LG   LR
11947 
11948                 mov             ebp,eax
11949 
11950                 fmul    st,st(3)                                ; R    LB   LG   LR
11951                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
11952 
11953                 and             ebp,BLUEMASK
11954                 and             ebx,[GWMaskShifted]
11955 
11956                 mov             dword ptr[Blue],ebp
11957 
11958                 fmul    st,st(3)                                ; G    R    LB   LG   LR
11959                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
11960                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
11961                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
11962                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
11963                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
11964                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
11965                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
11966                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
11967                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
11968                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
11969                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
11970 
11971                 mov             eax,dword ptr[Bucket]
11972                 mov             ebp,dword ptr[Bucket2]
11973 
11974                 fstp    qword ptr[Bucket]               ; LB   LG   LR
11975                 fadd    qword ptr[BlueDelta]
11976                 fistp   dword ptr[BB1]
11977                 fadd    qword ptr[GreenDelta]
11978                 fistp   dword ptr[GG1]
11979                 fadd    qword ptr[RedDelta]
11980                 fistp   dword ptr[RR1]
11981 
11982                 and             eax,REDMASK
11983                 and             ebp,BLUEMASK
11984                 
11985                 mov             esi,dword ptr[Bucket]
11986                 or              ebp,eax
11987 
11988                 fstp    dword ptr[Bucket]
11989                 fstp    dword ptr[Bucket2]
11990                 fstp    dword ptr[Bucket]
11991 
11992                 and             esi,GREENMASK
11993 
11994                 fld             dword ptr[FTemp5]
11995                 fld             dword ptr[FTemp4]
11996 
11997                 or              ebp,esi
11998 
11999                 fld             dword ptr[FTemp3]
12000                 fld             dword ptr[FTemp2]
12001 
12002                 rol             ebp,16
12003 
12004                 fld             dword ptr[FTemp1]
12005                 fld             dword ptr[FTemp0]
12006 
12007                 mov             ecx,[ZVal]
12008 
12009                 mov             esi,[ZVal]
12010                 add             ecx,[ZDelta]
12011 
12012                 shr             esi,16
12013                 mov             [ZVal],ecx
12014 
12015                 mov             ecx,pZBufferPtr
12016 
12017                 mov             [edi+28],ebp
12018                 mov             word ptr[ecx+28],si
12019                 mov             word ptr[ecx+30],si
12020 
12021                 pop             ebp
12022 
12023 
12024                 ; get corrected right side deltas ; st0  st1  st2  st3  st4  st5  st6  st7
12025                                                                                 ; ZR   UZR  ZRi  VZR  UL   VL
12026                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
12027                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
12028                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
12029                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
12030 
12031                 add             edi,32                                  ; move screen pointer to start of next aspan
12032                 add             [pZBufferPtr],32
12033                 dec             [NumASpans]                     ; dec num affine spans
12034                 jnz             SpanLoop16
12035 
12036 HandleLeftoverPixels16:
12037 
12038                 mov             esi,[pTex]
12039 
12040 
12041                 cmp             [RemainingCount],0
12042                 jz              FPUReturn16
12043 
12044                 //need one more stack spot
12045                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
12046                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
12047                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
12048                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
12049                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
12050                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
12051                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
12052                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
12053                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
12054                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
12055 
12056                 mov             ebx,dword ptr[Bucket]
12057                 mov             eax,dword ptr[Bucket2]
12058 
12059                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
12060                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
12061 
12062                 add             ebx,dword ptr[UAdjust]
12063                 add             eax,dword ptr[UAdjustL]
12064 
12065                 mov             [U1],ebx
12066                 mov             [UFixed],eax
12067 
12068                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
12069                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
12070                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
12071                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
12072                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
12073                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
12074                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
12075 
12076                 mov             ebx,dword ptr[Bucket]
12077                 mov             eax,dword ptr[Bucket2]
12078 
12079                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
12080 
12081                 add             ebx,dword ptr[VAdjust]
12082                 add             eax,dword ptr[VAdjustL]
12083 
12084                 mov             [V1],ebx
12085                 mov             [VFixed],eax
12086 
12087                 dec             [RemainingCount]
12088                 jz              OnePixelSpan16
12089 
12090                 //must get rid of this wasted time
12091                 fstp    [FloatTemp]                             ; inv. inv. inv. inv. UL   VL
12092                 fstp    [FloatTemp]                             ; inv. inv. inv. UL   VL
12093                 fstp    [FloatTemp]                             ; inv. inv. UL   VL
12094                 fstp    [FloatTemp]                             ; inv. UL   VL
12095                 fstp    [FloatTemp]                             ; UL   VL
12096                 fild    [y]                                             ; y    UL   VL
12097                 fild    [x2]                                    ; xr   y    UL   VL
12098 
12099                 fld             [UDivZStepY]                    ; UZdY xr   y    UL   VL
12100                 fld             [UDivZStepX]                    ; UZdX UZdY xr   y    UL   VL
12101                 fmul    st,st(2)                                ; UZX  UZdY xr   y    UL   VL
12102                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY xr   y    UL   VL
12103                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY xr   y    UL   VL
12104                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX xr   y    UL   VL
12105                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX xr   y    UL   VL
12106                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX xr   y    UL   VL
12107                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX xr   y    UL   VL
12108                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS xr   y    UL   VL
12109                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS xr   y    UL   VL
12110                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS xr   y    UL   VL
12111                 faddp   st(3),st                                ; VZdY VZX  UZ   xr   y    UL   VL
12112                 fmul    st,st(4)                                ; VZY  VZX  UZ   xr   y    UL   VL
12113                 fxch    st(1)                                   ; VZX  VZY  UZ   xr   y    UL   VL
12114                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   xr   y    UL   VL
12115                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   xr   y    UL   VL
12116                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y    UL   VL
12117                 faddp   st(1),st                                ; VZ   UZ   ZX   y    UL   VL
12118                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y    UL   VL
12119                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY   UL   VL
12120                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY   UL   VL
12121                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY   UL   VL
12122 
12123                 faddp   st(3),st                                ; UZ   VZ   Zi   UL   VL
12124                 fld1                                                    ; 1    UZ   VZ   Zi   UL   VL
12125                 fdiv    st,st(3)                                ; ZR   UZ   VZ   Zi   UL   VL
12126 
12127                 fld             st                                              ; ZR   ZR   UZ   VZ   Zi   UL   VL
12128                 fmul    st,st(3)                                ; VR   ZR   UZ   VZ   Zi   UL   VL
12129                 fxch    st(1)                                   ; ZR   VR   UZ   VZ   Zi   UL   VL
12130                 fmul    st,st(2)                                ; UR   VR   UZ   VZ   Zi   UL   VL
12131 
12132                 //lazy idiv below... should 1/int mul mul
12133 
12134                 ; calculate deltas                              ; st0  st1  st2  st3  st4  st5  st6  st7
12135                 fsubr   st(5),st                                ; UR   VR   inv. inv. inv. dU   VL
12136                 fxch    st(1)                                   ; VR   UR   inv. inv. inv. dU   VL
12137                 fsubr   st(6),st                                ; VR   UR   inv. inv. inv. dU   dV
12138                 fxch    st(6)                                   ; dV   UR   inv. inv. inv. dU   VR
12139                 fidiv   dword ptr[RemainingCount];dv   UR   inv. inv. inv. dU   VR
12140                 fadd    qword ptr[MipMagic]             ; dvk  UR   inv. inv. inv. dU   VR
12141                 fxch    st(5)                                   ; dU   UR   inv. inv. inv. dvk  VR
12142                 fidiv   dword ptr[RemainingCount];du   UR   inv. inv. inv. dvk  VR
12143                 fadd    qword ptr[MipMagic]             ; duk  UR   inv. inv. inv. dvk  VR
12144                 fxch    st(5)                                   ; dvk  UR   inv. inv. inv. duk  VR
12145                 fstp    qword ptr[DeltaV]               ; UR   inv. inv. inv. duk  VR
12146                 fxch    st(4)                                   ; duk  inv. inv. inv. UR   VR
12147                 fstp    qword ptr[DeltaU]               ; inv. inv. inv. UR   VR
12148                 fld             st(1)                                   ; inv. inv. inv. inv. UR   VR
12149                 fld             st(2)                                   ; inv. inv. inv. inv. inv. UR   VR
12150 
12151 OnePixelSpan16:
12152                 // Clamp U/V
12153                 mov             ebx,[UFixed]
12154                 cmp             ebx,MaxU
12155                 jle             TryClampU116
12156                 mov             ecx,MaxU
12157                 mov             dword ptr[UFixed],ecx
12158                 jmp             NoClampU116
12159 
12160 TryClampU116:
12161                 cmp             ebx,0
12162                 jge             NoClampU116
12163                 mov             dword ptr[UFixed],0
12164 NoClampU116:
12165                 mov             eax,[VFixed]
12166                 cmp             eax,MaxV
12167                 jle             TryClampV116
12168                 mov             ecx,MaxV
12169                 mov             dword ptr[VFixed],ecx
12170                 jmp             NoClampV116
12171 
12172 TryClampV116:
12173                 cmp             eax,0
12174                 jge             NoClampV116
12175                 mov             dword ptr[VFixed],0
12176 
12177 NoClampV116:
12178 
12179                 fstp    [FTemp0]
12180                 fstp    [FTemp1]
12181                 fstp    [FTemp2]
12182                 fstp    [FTemp3]
12183                 fstp    [FTemp4]
12184                 fstp    [FTemp5]
12185 
12186                 mov             ebx,dword ptr[U1]
12187                 mov             edx,dword ptr[V1]
12188 
12189                 fild    [RR1]                                   ; LR
12190                 fild    [GG1]                                   ; LG   LR
12191                 fild    [BB1]                                   ; LB   LG   LR
12192 
12193                 mov             ecx,[VShift]
12194                 add             edx,dword ptr[VAdjust2]
12195 
12196                 add             ebx,dword ptr[UAdjust2]
12197                 mov             eax,dword ptr[DeltaV]
12198 
12199                 shl             eax,cl
12200                 mov             esi,pTex
12201 
12202                 shl             edx,cl
12203                 mov             dword ptr[DeltaV],eax
12204 
12205                 mov             eax,[ZDelta]
12206                 mov             ecx,[ZVal]
12207 
12208                 sar             eax,1
12209                 push    ebp
12210 
12211                 mov             [ZDelta],eax
12212 
12213 
12214 LeftoverLoop16:
12215                 mov             eax,edx
12216                 and             ebx,[GWMaskShifted]
12217 
12218                 and             eax,[GHMaskShifted16]
12219 
12220                 add             eax,ebx
12221                 add             ebx,dword ptr[DeltaU]
12222 
12223                 shr             eax,16
12224                 add             edi,2
12225 
12226                 mov             ax,word ptr[2*eax+esi]
12227                 add             edx,dword ptr[DeltaV]
12228 
12229                 xor             eax,0
12230 
12231                 mov             esi,eax
12232                 mov             ebp,eax
12233 
12234                 and             esi,REDMASK
12235                 and             ebp,GREENMASK
12236 
12237                 mov             dword ptr[Red],esi
12238                 mov             dword ptr[Green],ebp
12239 
12240                 fild    qword ptr[Red]                  ; r    LB   LG   LR
12241 
12242                 mov             ebp,eax
12243 
12244                 fmul    st,st(3)                                ; R    LB   LG   LR
12245                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
12246 
12247                 and             ebp,BLUEMASK
12248 
12249                 mov             dword ptr[Blue],ebp
12250 
12251                 fmul    st,st(3)                                ; G    R    LB   LG   LR
12252                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
12253                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
12254                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
12255                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
12256                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
12257                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
12258                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
12259                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
12260                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
12261                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
12262                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
12263 
12264                 mov             eax,dword ptr[Bucket]
12265                 mov             ebp,dword ptr[Bucket2]
12266 
12267                 fstp    qword ptr[Bucket]               ; LB   LG   LR
12268 
12269                 and             eax,REDMASK
12270                 and             ebp,BLUEMASK
12271                 
12272                 mov             esi,dword ptr[Bucket]
12273                 or              ebp,eax
12274 
12275                 and             esi,GREENMASK
12276                 mov             eax,ecx
12277 
12278                 or              ebp,esi
12279 
12280                 shr             eax,16
12281                 mov             esi,pZBufferPtr
12282 
12283                 mov             word ptr[edi-2],bp
12284                 mov             word ptr[esi],ax
12285 
12286                 add             ecx,[ZDelta]
12287                 mov             esi,pTex
12288 
12289                 add             pZBufferPtr,2
12290 
12291                 dec             [RemainingCount]
12292                 jge             LeftoverLoop16
12293 
12294                 pop             ebp
12295 
12296 
12297 FPUReturn16:
12298                 ffree   st(0)
12299                 ffree   st(1)
12300                 ffree   st(2)
12301                 ffree   st(3)
12302                 ffree   st(4)
12303                 ffree   st(5)
12304                 ffree   st(6)
12305 
12306 Return16:
12307                 pop             edi
12308                 pop             esi
12309                 pop             ecx
12310                 pop             ebx
12311         }
12312 }
12313 
12314 void DrawSpan16_AsmGouraudZBufferTransX86FPU(int32 x1, int32 x2, int32 y, int32 r1, int32 g1, int32 b1, int32 r2, int32 g2, int32 b2)
12315 {
12316         RR1     =r1;
12317         GG1     =g1;
12318         BB1     =b1;
12319         TDest   =Dest;
12320         _asm
12321         {
12322                 push    ebx
12323                 push    ecx
12324                 push    esi
12325                 push    edi
12326 
12327                 mov             eax,x1
12328                 mov             ecx,x2
12329                 sub             ecx,eax
12330                 jle             Return16
12331 
12332                 mov             edi,[GBitPtr16]
12333 //              inc             ecx
12334                 mov             pTex,edi
12335 
12336                 fild    [y]                                             ; y
12337                 mov             [widTemp],ecx
12338 
12339                 fild    [x1]                                            ; x    y
12340                 fild    [widTemp]
12341 
12342                 fld1
12343                 fdivrp  st(1),st
12344 
12345                 mov             esi,x1
12346                 mov             edi,[TDest]
12347 
12348                 shl             esi,1
12349                 mov             eax,ecx
12350 
12351                 add             edi,esi
12352                 add             pZBufferPtr,esi
12353 
12354                 mov             eax,ecx
12355                 shr             ecx,4
12356                 and             eax,15
12357                 _emit 75h
12358                 _emit 06h
12359                 dec             ecx
12360                 mov             eax,16
12361 
12362                 mov             [NumASpans],ecx
12363                 mov             [RemainingCount],eax
12364 
12365                 fild    [r2]
12366                 fisub   [r1]
12367                 fild    [g2]
12368                 fisub   [g1]
12369                 fild    [b2]
12370                 fisub   [b1]
12371                 fxch    st(2)
12372                 fmul    st,st(3)
12373                 fxch    st(1)
12374                 fmul    st,st(3)
12375                 fxch    st(2)
12376                 fmul    st,st(3)
12377                 frndint
12378                 fstp    qword ptr[BlueDelta]
12379                 frndint
12380                 fstp    qword ptr[RedDelta]
12381                 frndint
12382                 fstp    qword ptr[GreenDelta]
12383                 fstp    qword ptr[FTemp0]
12384 
12385 
12386                 //decoder won't keep up with these huge instructions
12387                 //need to find some int instructions to cram in here somewhere
12388                 fld             [UDivZStepY]                    ; UZdY x    y
12389                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
12390                 fmul    st,st(2)                                ; UZX  UZdY x    y
12391                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
12392                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
12393                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
12394                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
12395                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
12396                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
12397                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
12398                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
12399                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
12400                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
12401                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
12402                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
12403                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
12404                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
12405 
12406                 //zbuffer step action
12407                 fld             [ZiStepX]
12408                 fmul    dword ptr[ZBufferPrec]
12409                 fmul    dword ptr[Two]
12410                 fistp   dword ptr[ZDelta]
12411 
12412                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
12413                 faddp   st(1),st                                ; VZ   UZ   ZX   y
12414                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
12415                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
12416                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
12417                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
12418 
12419                 //room for two cycles of int instructions here
12420 
12421                 faddp   st(3),st                                ; UZ   VZ   Zi
12422                 fld1                                                    ; 1    UZ   VZ   Zi
12423                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
12424 
12425                 //room for 18 cycles of int instructions here
12426 
12427                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
12428                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
12429                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
12430 
12431                 //zbuffer action
12432                 fld             st
12433                 fmul    dword ptr[ZBufferPrec]
12434                 fistp   dword ptr[ZVal]
12435 
12436                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
12437                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
12438                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
12439                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
12440                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
12441                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
12442                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
12443                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
12444                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
12445 
12446                 //room for 18 cycles of int stuff here
12447 
12448                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
12449                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
12450                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
12451                 //fmul stall one cycle
12452                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
12453 
12454                 test    ecx,ecx
12455                 jz              HandleLeftoverPixels16
12456 
12457 SpanLoop16:
12458                 //need one more stack spot
12459                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
12460                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
12461                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
12462                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
12463                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
12464                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
12465                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
12466                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
12467                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
12468                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
12469 
12470                 mov             ebx,dword ptr[Bucket]
12471                 mov             eax,dword ptr[Bucket2]
12472 
12473                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
12474                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
12475 
12476                 add             ebx,dword ptr[UAdjust]
12477                 add             eax,dword ptr[UAdjustL]
12478 
12479                 mov             [U1],ebx
12480                 mov             [UFixed],eax
12481 
12482                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
12483                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
12484                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
12485                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
12486                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
12487                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
12488                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
12489                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
12490 
12491                 mov             ebx,dword ptr[Bucket]
12492                 mov             eax,dword ptr[Bucket2]
12493 
12494                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
12495 
12496                 add             ebx,dword ptr[VAdjust]
12497                 add             eax,dword ptr[VAdjustL]
12498 
12499                 mov             [V1],ebx
12500                 mov             [VFixed],eax
12501 
12502                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
12503                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
12504                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
12505                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
12506                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
12507                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
12508                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
12509                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
12510                 //gotta do this to get em lined back up right
12511                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
12512                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
12513 
12514                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
12515                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
12516                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
12517                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
12518                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
12519                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
12520                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
12521                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
12522                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
12523                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
12524 
12525                 // Clamp U/V
12526                 mov             ebx,[UFixed]
12527                 cmp             ebx,MaxU
12528                 jle             TryClampU016
12529                 mov             ecx,MaxU
12530                 mov             dword ptr[UFixed],ecx
12531                 jmp             NoClampU016
12532 
12533 TryClampU016:
12534                 cmp             ebx,0
12535                 jge             NoClampU016
12536                 mov             dword ptr[UFixed],0
12537 NoClampU016:
12538                 mov             eax,[VFixed]
12539                 cmp             eax,MaxV
12540                 jle             TryClampV016
12541                 mov             ecx,MaxV
12542                 mov             dword ptr[VFixed],ecx
12543                 jmp             NoClampV016
12544 
12545 TryClampV016:
12546                 cmp             eax,0
12547                 jge             NoClampV016
12548                 mov             dword ptr[VFixed],0
12549 
12550 NoClampV016:
12551 
12552                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
12553                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
12554                 fstp    [FTemp2]                                ; VZR  UL   VL
12555                 fstp    [FTemp3]                                ; UL   VL
12556                 fstp    [FTemp4]                                ; VL
12557                 fstp    [FTemp5]                                ; 
12558 
12559 
12560                 fild    [RR1]                                   ; LR
12561                 fild    [GG1]                                   ; LG   LR
12562                 fild    [BB1]                                   ; LB   LG   LR
12563                 
12564                 
12565                 mov             ebx,dword ptr[U1]
12566                 mov             eax,dword ptr[V1]
12567 
12568                 add             ebx,dword ptr[UAdjust2]
12569                 add             eax,dword ptr[VAdjust2]
12570 
12571                 mov             ecx,[VShift]
12572                 mov             dword ptr[Bucket],ebx
12573 
12574                 shl             eax,cl
12575 
12576                 push    ebp
12577 
12578                 mov             dword ptr[Bucket2],eax
12579                 mov             ebp,dword ptr[DeltaV]
12580 
12581                 and             eax,[GHMaskShifted16]
12582                 and             ebx,[GWMaskShifted]
12583 
12584                 shl             ebp,cl
12585                 add             eax,ebx
12586 
12587                 mov             edx,dword ptr[Bucket2]
12588                 mov             esi,pTex
12589 
12590                 shr             eax,16
12591                 mov             dword ptr[DeltaV],ebp
12592 
12593                 mov             ebx,dword ptr[Bucket]
12594 
12595                 mov             ax,word ptr[2*eax+esi]
12596                 add             edx,dword ptr[DeltaV]
12597 
12598                 xor             eax,0
12599                 mov             ecx,edx
12600 
12601                 mov             ebp,eax
12602                 add             ebx,dword ptr[DeltaU]
12603 
12604                 shr             ebp,1
12605                 and             ecx,[GHMaskShifted16]
12606 
12607                 rol             eax,16
12608                 mov             [CKeyTest],ebp
12609 
12610                 and             ebx,[GWMaskShifted]
12611 
12612                 xor             eax,0
12613                 add             ecx,ebx
12614 
12615                 add             edx,dword ptr[DeltaV]
12616                 mov             esi,pTex
12617 
12618                 shr             ecx,16
12619                 add             ebx,dword ptr[DeltaU]
12620 
12621                 mov             ax,word ptr[2*ecx+esi]
12622                 mov             ecx,edx
12623 
12624                 xor             eax,0
12625                 and             ecx,[GHMaskShifted16]
12626 
12627                 mov             esi,eax
12628                 mov             ebp,eax
12629 
12630                 and             esi,REDMASK
12631                 and             ebp,GREENMASK
12632 
12633                 mov             dword ptr[Red],esi
12634                 mov             dword ptr[Green],ebp
12635 
12636                 fild    qword ptr[Red]                  ; r    LB   LG   LR
12637 
12638                 mov             ebp,eax
12639                 shr             eax,1
12640 
12641                 fmul    st,st(3)                                ; R    LB   LG   LR
12642                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
12643 
12644                 and             [CKeyTest],eax
12645 
12646                 and             ebp,BLUEMASK
12647                 and             ebx,[GWMaskShifted]
12648 
12649                 mov             dword ptr[Blue],ebp
12650 
12651                 fmul    st,st(3)                                ; G    R    LB   LG   LR
12652                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
12653                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
12654                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
12655                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
12656                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
12657                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
12658                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
12659                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
12660                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
12661                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
12662                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
12663 
12664                 mov             eax,dword ptr[Bucket]
12665                 mov             ebp,dword ptr[Bucket2]
12666 
12667                 fstp    qword ptr[Bucket]               ; LB   LG   LR
12668                 fxch    st(1)
12669                 fadd    qword ptr[GreenDelta]
12670                 fxch    st(1)
12671                 fadd    qword ptr[BlueDelta]
12672                 fxch    st(2)
12673                 fadd    qword ptr[RedDelta]
12674                 fxch    st(2)
12675 
12676                 and             eax,REDMASK
12677                 and             ebp,BLUEMASK
12678                 
12679                 mov             esi,dword ptr[Bucket]
12680                 or              ebp,eax
12681 
12682                 add             ecx,ebx
12683                 and             esi,GREENMASK
12684 
12685                 shr             ecx,16
12686                 or              ebp,esi
12687 
12688                 xor             eax,0
12689                 mov             esi,pTex
12690 
12691                 rol             ebp,16
12692                 add             edx,dword ptr[DeltaV]
12693 
12694                 mov             ax,word ptr[2*ecx+esi]
12695                 mov             ecx,[ZVal]
12696 
12697                 mov             esi,[ZVal]
12698                 add             ecx,[ZDelta]
12699 
12700                 shr             esi,16
12701                 mov             [ZVal],ecx
12702 
12703                 dec             [CKeyTest]
12704                 jl              Skip0
12705 
12706                 mov             ecx,pZBufferPtr
12707 
12708                 cmp             si,word ptr[ecx+0]
12709                 jle             Skip0
12710 
12711                 mov             [edi+0],ebp
12712                 mov             word ptr[ecx+0],si
12713                 mov             word ptr[ecx+2],si
12714 
12715 Skip0:
12716                 mov             ecx,edx
12717 
12718                 mov             esi,pTex
12719                 xor             eax,0
12720 
12721                 add             ebx,dword ptr[DeltaU]
12722                 and             ecx,[GHMaskShifted16]
12723 
12724                 mov             ebp,eax
12725                 and             ebx,[GWMaskShifted]
12726 
12727                 shr             ebp,1
12728                 add             ecx,ebx
12729 
12730                 rol             eax,16
12731                 add             edx,dword ptr[DeltaV]
12732 
12733                 shr             ecx,16
12734                 add             ebx,dword ptr[DeltaU]
12735 
12736                 mov             ax,word ptr[2*ecx+esi]
12737                 mov             [CKeyTest],ebp
12738 
12739                 mov             ecx,edx
12740                 xor             eax,0
12741 
12742                 and             ecx,[GHMaskShifted16]
12743                 mov             esi,eax
12744 
12745                 mov             ebp,eax
12746                 and             esi,REDMASK
12747 
12748                 and             ebp,GREENMASK
12749                 mov             dword ptr[Red],esi
12750 
12751                 mov             dword ptr[Green],ebp
12753 
12754 
12755                 fild    qword ptr[Red]                  ; r    LB   LG   LR
12756 
12757                 mov             ebp,eax
12758                 shr             eax,1
12759 
12760                 fmul    st,st(3)                                ; R    LB   LG   LR
12761                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
12762 
12763                 and             [CKeyTest],eax
12764 
12765                 and             ebp,BLUEMASK
12766                 and             ebx,[GWMaskShifted]
12767 
12768                 mov             dword ptr[Blue],ebp
12769 
12770                 fmul    st,st(3)                                ; G    R    LB   LG   LR
12771                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
12772                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
12773                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
12774                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
12775                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
12776                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
12777                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
12778                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
12779                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
12780                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
12781                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
12782 
12783                 mov             eax,dword ptr[Bucket]
12784                 mov             ebp,dword ptr[Bucket2]
12785 
12786                 fstp    qword ptr[Bucket]               ; LB   LG   LR
12787                 fxch    st(1)
12788                 fadd    qword ptr[GreenDelta]
12789                 fxch    st(1)
12790                 fadd    qword ptr[BlueDelta]
12791                 fxch    st(2)
12792                 fadd    qword ptr[RedDelta]
12793                 fxch    st(2)
12794 
12795                 and             eax,REDMASK
12796                 and             ebp,BLUEMASK
12797                 
12798                 mov             esi,dword ptr[Bucket]
12799                 or              ebp,eax
12800 
12801                 add             ecx,ebx
12802                 and             esi,GREENMASK
12803 
12804                 shr             ecx,16
12805                 or              ebp,esi
12806 
12807                 xor             eax,0
12808                 mov             esi,pTex
12809 
12810                 rol             ebp,16
12811                 add             edx,dword ptr[DeltaV]
12812 
12813                 mov             ax,word ptr[2*ecx+esi]
12814                 mov             ecx,[ZVal]
12815 
12816                 mov             esi,[ZVal]
12817                 add             ecx,[ZDelta]
12818 
12819                 shr             esi,16
12820                 mov             [ZVal],ecx
12821 
12822                 dec             [CKeyTest]
12823                 jl              Skip1
12824 
12825                 mov             ecx,pZBufferPtr
12826 
12827                 cmp             si,word ptr[ecx+4]
12828                 jle             Skip1
12829 
12830                 mov             [edi+4],ebp
12831                 mov             word ptr[ecx+4],si
12832                 mov             word ptr[ecx+6],si
12833 
12834 Skip1:
12835                 mov             ecx,edx
12836 
12837                 mov             esi,pTex
12838                 xor             eax,0
12839 
12840                 add             ebx,dword ptr[DeltaU]
12841                 and             ecx,[GHMaskShifted16]
12842 
12843                 mov             ebp,eax
12844                 and             ebx,[GWMaskShifted]
12845 
12846                 shr             ebp,1
12847                 add             ecx,ebx
12848 
12849                 rol             eax,16
12850                 add             edx,dword ptr[DeltaV]
12851 
12852                 shr             ecx,16
12853                 add             ebx,dword ptr[DeltaU]
12854 
12855                 mov             ax,word ptr[2*ecx+esi]
12856                 mov             [CKeyTest],ebp
12857 
12858                 mov             ecx,edx
12859                 xor             eax,0
12860 
12861                 and             ecx,[GHMaskShifted16]
12862                 mov             esi,eax
12863 
12864                 mov             ebp,eax
12865                 and             esi,REDMASK
12866 
12867                 and             ebp,GREENMASK
12868                 mov             dword ptr[Red],esi
12869 
12870                 mov             dword ptr[Green],ebp
12872 
12873 
12874                 fild    qword ptr[Red]                  ; r    LB   LG   LR
12875 
12876                 mov             ebp,eax
12877                 shr             eax,1
12878 
12879                 fmul    st,st(3)                                ; R    LB   LG   LR
12880                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
12881 
12882                 and             [CKeyTest],eax
12883 
12884                 and             ebp,BLUEMASK
12885                 and             ebx,[GWMaskShifted]
12886 
12887                 mov             dword ptr[Blue],ebp
12888 
12889                 fmul    st,st(3)                                ; G    R    LB   LG   LR
12890                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
12891                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
12892                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
12893                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
12894                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
12895                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
12896                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
12897                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
12898                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
12899                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
12900                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
12901 
12902                 mov             eax,dword ptr[Bucket]
12903                 mov             ebp,dword ptr[Bucket2]
12904 
12905                 fstp    qword ptr[Bucket]               ; LB   LG   LR
12906                 fxch    st(1)
12907                 fadd    qword ptr[GreenDelta]
12908                 fxch    st(1)
12909                 fadd    qword ptr[BlueDelta]
12910                 fxch    st(2)
12911                 fadd    qword ptr[RedDelta]
12912                 fxch    st(2)
12913 
12914                 and             eax,REDMASK
12915                 and             ebp,BLUEMASK
12916                 
12917                 mov             esi,dword ptr[Bucket]
12918                 or              ebp,eax
12919 
12920                 add             ecx,ebx
12921                 and             esi,GREENMASK
12922 
12923                 shr             ecx,16
12924                 or              ebp,esi
12925 
12926                 xor             eax,0
12927                 mov             esi,pTex
12928 
12929                 rol             ebp,16
12930                 add             edx,dword ptr[DeltaV]
12931 
12932                 mov             ax,word ptr[2*ecx+esi]
12933                 mov             ecx,[ZVal]
12934 
12935                 mov             esi,[ZVal]
12936                 add             ecx,[ZDelta]
12937 
12938                 shr             esi,16
12939                 mov             [ZVal],ecx
12940 
12941                 dec             [CKeyTest]
12942                 jl              Skip2
12943 
12944                 mov             ecx,pZBufferPtr
12945 
12946                 cmp             si,word ptr[ecx+8]
12947                 jle             Skip2
12948 
12949                 mov             [edi+8],ebp
12950                 mov             word ptr[ecx+8],si
12951                 mov             word ptr[ecx+10],si
12952 
12953 Skip2:
12954                 mov             ecx,edx
12955 
12956                 mov             esi,pTex
12957                 xor             eax,0
12958 
12959                 add             ebx,dword ptr[DeltaU]
12960                 and             ecx,[GHMaskShifted16]
12961 
12962                 mov             ebp,eax
12963                 and             ebx,[GWMaskShifted]
12964 
12965                 shr             ebp,1
12966                 add             ecx,ebx
12967 
12968                 rol             eax,16
12969                 add             edx,dword ptr[DeltaV]
12970 
12971                 shr             ecx,16
12972                 add             ebx,dword ptr[DeltaU]
12973 
12974                 mov             ax,word ptr[2*ecx+esi]
12975                 mov             [CKeyTest],ebp
12976 
12977                 mov             ecx,edx
12978                 xor             eax,0
12979 
12980                 and             ecx,[GHMaskShifted16]
12981                 mov             esi,eax
12982 
12983                 mov             ebp,eax
12984                 and             esi,REDMASK
12985 
12986                 and             ebp,GREENMASK
12987                 mov             dword ptr[Red],esi
12988 
12989                 mov             dword ptr[Green],ebp
12990                 add             ebx,dword ptr[DeltaU]
12992 
12993 
12994                 fild    qword ptr[Red]                  ; r    LB   LG   LR
12995 
12996                 mov             ebp,eax
12997                 shr             eax,1
12998 
12999                 fmul    st,st(3)                                ; R    LB   LG   LR
13000                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
13001 
13002                 and             [CKeyTest],eax
13003 
13004                 and             ebp,BLUEMASK
13005                 and             ebx,[GWMaskShifted]
13006 
13007                 mov             dword ptr[Blue],ebp
13008 
13009                 fmul    st,st(3)                                ; G    R    LB   LG   LR
13010                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
13011                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
13012                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
13013                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
13014                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
13015                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
13016                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
13017                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
13018                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
13019                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
13020                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
13021 
13022                 mov             eax,dword ptr[Bucket]
13023                 mov             ebp,dword ptr[Bucket2]
13024 
13025                 fstp    qword ptr[Bucket]               ; LB   LG   LR
13026                 fxch    st(1)
13027                 fadd    qword ptr[GreenDelta]
13028                 fxch    st(1)
13029                 fadd    qword ptr[BlueDelta]
13030                 fxch    st(2)
13031                 fadd    qword ptr[RedDelta]
13032                 fxch    st(2)
13033 
13034                 and             eax,REDMASK
13035                 and             ebp,BLUEMASK
13036                 
13037                 mov             esi,dword ptr[Bucket]
13038                 or              ebp,eax
13039 
13040                 add             ecx,ebx
13041                 and             esi,GREENMASK
13042 
13043                 shr             ecx,16
13044                 or              ebp,esi
13045 
13046                 xor             eax,0
13047                 mov             esi,pTex
13048 
13049                 rol             ebp,16
13050                 add             edx,dword ptr[DeltaV]
13051 
13052                 mov             ax,word ptr[2*ecx+esi]
13053                 mov             ecx,[ZVal]
13054 
13055                 mov             esi,[ZVal]
13056                 add             ecx,[ZDelta]
13057 
13058                 shr             esi,16
13059                 mov             [ZVal],ecx
13060 
13061                 dec             [CKeyTest]
13062                 jl              Skip3
13063 
13064                 mov             ecx,pZBufferPtr
13065 
13066                 cmp             si,word ptr[ecx+12]
13067                 jle             Skip3
13068 
13069                 mov             [edi+12],ebp
13070                 mov             word ptr[ecx+12],si
13071                 mov             word ptr[ecx+14],si
13072 
13073 Skip3:
13074                 mov             ecx,edx
13075 
13076                 mov             esi,pTex
13077                 xor             eax,0
13078 
13079                 add             ebx,dword ptr[DeltaU]
13080                 and             ecx,[GHMaskShifted16]
13081 
13082                 mov             ebp,eax
13083                 and             ebx,[GWMaskShifted]
13084 
13085                 shr             ebp,1
13086                 add             ecx,ebx
13087 
13088                 rol             eax,16
13089                 add             edx,dword ptr[DeltaV]
13090 
13091                 shr             ecx,16
13092                 add             ebx,dword ptr[DeltaU]
13093 
13094                 mov             ax,word ptr[2*ecx+esi]
13095                 mov             [CKeyTest],ebp
13096 
13097                 mov             ecx,edx
13098                 xor             eax,0
13099 
13100                 and             ecx,[GHMaskShifted16]
13101                 mov             esi,eax
13102 
13103                 mov             ebp,eax
13104                 and             esi,REDMASK
13105 
13106                 and             ebp,GREENMASK
13107                 mov             dword ptr[Red],esi
13108 
13109                 mov             dword ptr[Green],ebp
13110                 add             ebx,dword ptr[DeltaU]
13112 
13113 
13114                 fild    qword ptr[Red]                  ; r    LB   LG   LR
13115 
13116                 mov             ebp,eax
13117                 shr             eax,1
13118 
13119                 fmul    st,st(3)                                ; R    LB   LG   LR
13120                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
13121 
13122                 and             [CKeyTest],eax
13123 
13124                 and             ebp,BLUEMASK
13125                 and             ebx,[GWMaskShifted]
13126 
13127                 mov             dword ptr[Blue],ebp
13128 
13129                 fmul    st,st(3)                                ; G    R    LB   LG   LR
13130                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
13131                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
13132                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
13133                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
13134                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
13135                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
13136                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
13137                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
13138                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
13139                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
13140                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
13141 
13142                 mov             eax,dword ptr[Bucket]
13143                 mov             ebp,dword ptr[Bucket2]
13144 
13145                 fstp    qword ptr[Bucket]               ; LB   LG   LR
13146                 fxch    st(1)
13147                 fadd    qword ptr[GreenDelta]
13148                 fxch    st(1)
13149                 fadd    qword ptr[BlueDelta]
13150                 fxch    st(2)
13151                 fadd    qword ptr[RedDelta]
13152                 fxch    st(2)
13153 
13154                 and             eax,REDMASK
13155                 and             ebp,BLUEMASK
13156                 
13157                 mov             esi,dword ptr[Bucket]
13158                 or              ebp,eax
13159 
13160                 add             ecx,ebx
13161                 and             esi,GREENMASK
13162 
13163                 shr             ecx,16
13164                 or              ebp,esi
13165 
13166                 xor             eax,0
13167                 mov             esi,pTex
13168 
13169                 rol             ebp,16
13170                 add             edx,dword ptr[DeltaV]
13171 
13172                 mov             ax,word ptr[2*ecx+esi]
13173                 mov             ecx,[ZVal]
13174 
13175                 mov             esi,[ZVal]
13176                 add             ecx,[ZDelta]
13177 
13178                 shr             esi,16
13179                 mov             [ZVal],ecx
13180 
13181                 dec             [CKeyTest]
13182                 jl              Skip4
13183 
13184                 mov             ecx,pZBufferPtr
13185 
13186                 cmp             si,word ptr[ecx+16]
13187                 jle             Skip4
13188 
13189                 mov             [edi+16],ebp
13190                 mov             word ptr[ecx+16],si
13191                 mov             word ptr[ecx+18],si
13192 
13193 Skip4:
13194                 mov             ecx,edx
13195 
13196                 mov             esi,pTex
13197                 xor             eax,0
13198 
13199                 add             ebx,dword ptr[DeltaU]
13200                 and             ecx,[GHMaskShifted16]
13201 
13202                 mov             ebp,eax
13203                 and             ebx,[GWMaskShifted]
13204 
13205                 shr             ebp,1
13206                 add             ecx,ebx
13207 
13208                 rol             eax,16
13209                 add             edx,dword ptr[DeltaV]
13210 
13211                 shr             ecx,16
13212                 add             ebx,dword ptr[DeltaU]
13213 
13214                 mov             ax,word ptr[2*ecx+esi]
13215                 mov             [CKeyTest],ebp
13216 
13217                 mov             ecx,edx
13218                 xor             eax,0
13219 
13220                 and             ecx,[GHMaskShifted16]
13221                 mov             esi,eax
13222 
13223                 mov             ebp,eax
13224                 and             esi,REDMASK
13225 
13226                 and             ebp,GREENMASK
13227                 mov             dword ptr[Red],esi
13228 
13229                 mov             dword ptr[Green],ebp
13230                 add             ebx,dword ptr[DeltaU]
13232 
13233 
13234                 fild    qword ptr[Red]                  ; r    LB   LG   LR
13235 
13236                 mov             ebp,eax
13237                 shr             eax,1
13238 
13239                 fmul    st,st(3)                                ; R    LB   LG   LR
13240                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
13241 
13242                 and             [CKeyTest],eax
13243 
13244                 and             ebp,BLUEMASK
13245                 and             ebx,[GWMaskShifted]
13246 
13247                 mov             dword ptr[Blue],ebp
13248 
13249                 fmul    st,st(3)                                ; G    R    LB   LG   LR
13250                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
13251                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
13252                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
13253                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
13254                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
13255                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
13256                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
13257                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
13258                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
13259                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
13260                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
13261 
13262                 mov             eax,dword ptr[Bucket]
13263                 mov             ebp,dword ptr[Bucket2]
13264 
13265                 fstp    qword ptr[Bucket]               ; LB   LG   LR
13266                 fxch    st(1)
13267                 fadd    qword ptr[GreenDelta]
13268                 fxch    st(1)
13269                 fadd    qword ptr[BlueDelta]
13270                 fxch    st(2)
13271                 fadd    qword ptr[RedDelta]
13272                 fxch    st(2)
13273 
13274                 and             eax,REDMASK
13275                 and             ebp,BLUEMASK
13276                 
13277                 mov             esi,dword ptr[Bucket]
13278                 or              ebp,eax
13279 
13280                 add             ecx,ebx
13281                 and             esi,GREENMASK
13282 
13283                 shr             ecx,16
13284                 or              ebp,esi
13285 
13286                 xor             eax,0
13287                 mov             esi,pTex
13288 
13289                 rol             ebp,16
13290                 add             edx,dword ptr[DeltaV]
13291 
13292                 mov             ax,word ptr[2*ecx+esi]
13293                 mov             ecx,[ZVal]
13294 
13295                 mov             esi,[ZVal]
13296                 add             ecx,[ZDelta]
13297 
13298                 shr             esi,16
13299                 mov             [ZVal],ecx
13300 
13301                 dec             [CKeyTest]
13302                 jl              Skip5
13303 
13304                 mov             ecx,pZBufferPtr
13305 
13306                 cmp             si,word ptr[ecx+20]
13307                 jle             Skip5
13308 
13309                 mov             [edi+20],ebp
13310                 mov             word ptr[ecx+20],si
13311                 mov             word ptr[ecx+22],si
13312 
13313 Skip5:
13314                 mov             ecx,edx
13315 
13316                 mov             esi,pTex
13317                 xor             eax,0
13318 
13319