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

x86span555.c

Go to the documentation of this file.
00001 /****************************************************************************************/
00002 /*  x86span555.c                                                                        */
00003 /*                                                                                      */
00004 /*  Author:       Ken Baird                                                             */
00005 /*  Description:  555 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 //see notes in x86span565
00023 
00024 /*
00025 Code fragments from Chris Hecker's texture mapping articles used with
00026 permission.  http://www.d6.com/users/checker 
00027 */
00028 
00029 
00030 #include        "windows.h"             //I really didn't want to do this
00031 #include        "softdrv.h"
00032 #include        "basetype.h"
00033 #include        "drawspan.h"
00034 #include        "render.h"
00035 
00036 
00037 typedef struct EdgeAsmFPUTag
00038 {
00039         int             X, y, Height;
00040         geFloat x, u, v, z, r, g, b;
00041         geFloat xstep, ustep, vstep, zstep;
00042         geFloat rstep, gstep, bstep;
00043         uint32  R, G, B;
00044 } EdgeAsmFPU;
00045 
00046 
00047 void    DrawScanLineGouraudNoZ_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
00048 {
00049         TDest   =Dest;
00050         Red             =Green  =0;
00051         _asm
00052         {
00053                 push    ebx
00054                 push    ecx
00055                 push    esi
00056                 push    edi
00057 
00058                 mov             ebx,pLeft
00059                 mov     ecx,pRight
00060                 mov     eax,[ebx]EdgeAsmFPU.X
00061                 mov     edx,[ecx]EdgeAsmFPU.X
00062                 sub     edx,eax
00063                 jle             GouraudReturnNoZ
00064 
00065                 mov             esi,eax
00066                 inc             edx
00067                 shl             eax,1
00068                 add             TDest,eax
00069                 test    esi,1                                   //dword align left side
00070                 jz              NoSinglePixie
00071 
00072                 //odd sized spans write one pixel to dword align
00073                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
00074                 fmul    [Real65536]                                             ; UL16
00075                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
00076                 fmul    [Real65536]                                             ; VL16 UL16
00077                 fld             dword ptr [ebx]EdgeAsmFPU.r             ; RL   VL16 UL16
00078                 fld             dword ptr [ebx]EdgeAsmFPU.g             ; GL   RL   VL16 UL16
00079                 fld             dword ptr [ebx]EdgeAsmFPU.b             ; BL   GL   RL   VL16 UL16
00080                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
00081                 fistp   [u16]                                                   ; GL   RL   VL16 BL
00082                 fxch    st(2)                                                   ; VL16 RL   GL   BL
00083                 fistp   [v16]                                                   ; RL   GL   BL
00084 
00085                 mov     [widTemp],edx
00086 
00087                 mov             ecx,[VShift]
00088                 mov             ebx,[GHMaskShifted]
00089 
00090                 mov             esi,[GWMask]
00091                 mov             edi,[v16]
00092 
00093                 mov             edx,dword ptr[u16]
00094 
00095                 shr             edi,cl
00096 
00097                 shr             edx,16
00098                 xor             eax,eax
00099 
00100                 and             edi,ebx
00101                 and             edx,esi
00102 
00103                 add             edi,edx
00104 
00105                 add             edi,GBitPtrHalf
00106                 mov             ax,word ptr[edi*2]
00107 
00108                 mov             ebx,eax
00109                 and             eax,REDMASK2
00110 
00111                 mov             ecx,ebx
00112                 and             ebx,GREENMASK2
00113 
00114                 mov             dword ptr[Red],eax
00115                 and             ecx,BLUEMASK2
00116 
00117                 mov             dword ptr[Green],ebx
00118                 mov             dword ptr[Blue],ecx
00119 
00120                 fimul   dword ptr[Red]                                  ; R    GL   BL
00121                 fxch    st(1)                                                   ; GL   R    BL
00122                 fimul   dword ptr[Green]                                ; G    R    BL
00123                 fxch    st(1)                                                   ; R    G    BL
00124                 fadd    qword ptr[Magic]                                ; Rk   G    BL
00125                 fxch    st(2)                                                   ; BL   G    Rk
00126                 fimul   [Blue]                                                  ; B    G    Rk
00127                 fxch    st(1)                                                   ; G    B    Rk
00128                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
00129                 fxch    st(2)                                                   ; Rk   B    Gk
00130                 fstp    qword ptr[Bucket]                               ; B    Gk
00131                 fadd    qword ptr[Magic]                                ; Bk   Gk
00132                 fxch    st(1)                                                   ; Gk   Bk
00133                 fstp    qword ptr[Bucket2]                              ; Bk
00134 
00135                 mov             edx,dword ptr[Bucket]
00136                 mov             eax,dword ptr[Bucket2]
00137 
00138                 and             edx,REDMASK2
00139                 and             eax,GREENMASK2
00140 
00141                 fstp    qword ptr[Bucket]
00142 
00143                 mov             ecx,TDest
00144                 mov             ebx,dword ptr[Bucket]
00145 
00146                 and             ebx,BLUEMASK2
00147                 or              edx,eax
00148 
00149                 add             TDest,2
00150                 or              edx,ebx
00151 
00152                 mov             ebx,pLeft
00153                 mov             word ptr[ecx],dx
00154                 mov     edx,[widTemp]
00155                 mov     ecx,pRight
00156                 dec             edx
00157                 jz              GouraudReturnNoZ
00158                 mov             esi,edx
00159                 and             esi,1
00160                 sub             edx,esi
00161                 jz              GouraudReturnNoZ
00162 
00163 NoSinglePixie:
00164                 mov     [widTemp],edx                 ; just for a temp
00165                 shr             edx,1
00166 
00167                 ; try to keep fmul fxch pairs seperated to avoid stalling
00168                 ; calc this scanlines steps           ; FPU Stack
00169                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
00170                 fild    dword ptr [widTemp]           ; WID
00171 
00172                 mov     [widTemp],edx                 ; Color interps doubled
00173 
00174                 fld     dword ptr [ecx]EdgeAsmFPU.u      ; UR   WID
00175                 fld     dword ptr [ebx]EdgeAsmFPU.u      ; UL   UR   WID
00176                 fsub    st(1), st                     ; UL   UD   WID
00177                 fld     dword ptr [ecx]EdgeAsmFPU.v      ; VR   UL   UD   WID
00178                 fxch    st(1)                         ; UL   VR   UD   WID
00179                 fmul    [Real65536]                   ; UL16 VR   UD   WID
00180                 fld     dword ptr [ebx]EdgeAsmFPU.v      ; VL   UL16 VR   UD   WID
00181                 fsub    st(2), st                     ; VL   UL16 VD   UD   WID
00182                 fild    dword ptr [ecx]EdgeAsmFPU.R      ; RR   VL   UL16 VD   UD   WID
00183                 fxch    st(3)                         ; VD   VL   UL16 RR   UD   WID
00184                 fmul    [Real65536]                   ; VD16 VL   UL16 RR   UD   WID
00185                 fild    dword ptr [ebx]EdgeAsmFPU.R      ; RL   VD16 VL   UL16 RR   UD   WID
00186                 fsub    st(4),st                      ; RL   VD16 VL   UL16 RD   UD   WID
00187                 fxch    st(5)                         ; UD   VD16 VL   UL16 RD   RL   WID
00188                 fmul    [Real65536]                   ; UD16 VD16 VL   UL16 RD   RL   WID
00189                 fxch    st(2)                                             ; VL   VD16 UD16 UL16 RD   RL   WID
00190                 fmul    [Real65536]                   ; VL16 VD16 UD16 UL16 RD   RL   WID
00191                 fxch    st(3)                                                   ; UL16 VD16 UD16 VL16 RD   RL   WID
00192                 fistp   [u16]                                                   ; VD16 UD16 VL16 RD   RL   WID
00193                 fxch    st(2)                                                   ; VL16 UD16 VD16 RD   RL   WID
00194                 fistp   [v16]                                                   ; UD16 VD16 RD   RL   WID
00195                 fld1                                                                    ; 1    UD16 VD16 RD   RL   WID
00196                 fdivrp  st(5),st                                                ; UD16 VD16 RD   RL   DWID
00197 
00198                 //let that cook
00199 
00200                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
00201                 fild    [ecx]EdgeAsmFPU.G                                       ; RG   USTP VD16 RD   RL   DWID
00202                 fild    [ebx]EdgeAsmFPU.G                                       ; LG   RG   USTP VD16 RD   RL   DWID
00203                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
00204                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
00205                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
00206                 fild    [ecx]EdgeAsmFPU.B                                       ; RB   GD   LG   VD16 RD   RL   DWID
00207                 fild    [ebx]EdgeAsmFPU.B                                       ; LB   RB   GD   LG   VD16 RD   RL   DWID
00208                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
00209                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
00210                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
00211                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
00212                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
00213                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
00214                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
00215                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
00216                 frndint
00217                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
00218                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
00219                 frndint
00220                 fxch    st(7)                                                   ; DW2  BD   RI   LG   LB   VSTP RL   GI
00221                 fmulp   st(1),st                                                ; BI   RI   LG   LB   VSTP RL   GI
00222                 frndint
00223                 fxch    st(4)                                                   ; VSTP RI   LG   LB   BI   RL   GI
00224                 fistp   [VStep]                                                 ; RI   LG   LB   BI   RL   GI
00225 
00226                 push    ebp
00227 
00228 PixieLoop:
00229                 mov             ecx,[VShift]
00230                 mov             ebx,[GHMaskShifted]
00231 
00232                 mov             ebp,[GWMask]
00233                 mov             edi,[v16]
00234 
00235                 mov             edx,dword ptr[u16]
00236                 mov             esi,edi
00237 
00238                 mov             eax,edx
00239 
00240                 shr             edi,cl
00241                 add             esi,[VStep]
00242 
00243                 shr             edx,16
00244                 add             eax,[UStep]
00245 
00246                 and             edi,ebx
00247                 and             edx,ebp
00248 
00249                 add             edi,edx
00250                 mov             edx,eax
00251 
00252                 add             edi,GBitPtrHalf
00253                 add             eax,[UStep]
00254 
00255                 mov             [u16],eax
00256                 mov             ax,word ptr[edi*2]
00257 
00258                 mov             edi,esi
00259                 add             esi,[VStep]
00260 
00261                 shr             edx,16
00262                 mov             [v16],esi
00263 
00264                 shr             edi,cl
00265                 and             edx,ebp
00266 
00267                 mov             esi,GBitPtrHalf
00268                 and             edi,ebx
00269 
00270                 shl             eax,16
00271                 add             esi,edx
00272 
00273                 add             esi,edi
00274 
00275                 mov             ax,word ptr[esi*2]
00276 
00277                 mov             ebx,eax
00278                 and             eax,REDMASK2
00279 
00280                 mov             ecx,ebx
00281                 and             ebx,GREENMASK2
00282 
00283                 mov             dword ptr[Red],eax
00284                 and             ecx,BLUEMASK2
00285 
00286                 mov             dword ptr[Green],ebx
00287                 mov             dword ptr[Blue],ecx
00288 
00289                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
00290                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
00291                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
00292                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
00293                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
00294                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
00295                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
00296                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
00297                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
00298                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
00299                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
00300                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
00301                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
00302                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
00303                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
00304 
00305                 mov             edx,dword ptr[Bucket]
00306                 mov             eax,dword ptr[Bucket2]
00307 
00308                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
00309                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
00310                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
00311                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
00312                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
00313                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
00314 
00315                 and             edx,GREENMASK2
00316                 and             eax,REDMASK2
00317 
00318                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
00319                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
00320 
00321                 mov             edi,edx
00322                 mov             ebx,dword ptr[Bucket]
00323                 or              edi,eax
00324                 mov             ebp,TDest
00325                 and             ebx,BLUEMASK2
00326 
00327                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
00328                 or              edi,ebx
00329 
00330                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
00331 
00332                 rol             edi,16
00333                 add             TDest,4
00334 
00335                 mov             [ebp],edi
00336                 dec             [widTemp]
00337 
00338                 jnz             PixieLoop
00339 
00340                 pop             ebp
00341 
00342                 fstp    [u16]
00343                 fstp    [v16]
00344                 fstp    [u16]
00345                 fstp    [v16]
00346                 fstp    [u16]
00347                 fstp    [v16]
00348 
00349 GouraudReturnNoZ:
00350                 pop             edi
00351                 pop             esi
00352                 pop             ecx
00353                 pop             ebx
00354         }
00355 }
00356 
00357 void    DrawScanLineGouraudNoZTrans_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
00358 {
00359         TDest   =Dest;
00360         Red             =Green  =0;
00361         _asm
00362         {
00363                 push    ebx
00364                 push    ecx
00365                 push    esi
00366                 push    edi
00367 
00368                 mov             ebx,pLeft
00369                 mov     ecx,pRight
00370                 mov     eax,[ebx]EdgeAsmFPU.X
00371                 mov     edx,[ecx]EdgeAsmFPU.X
00372                 sub     edx,eax
00373                 jle             GouraudReturnNoZ
00374 
00375                 mov             esi,eax
00376                 inc             edx
00377                 shl             eax,1
00378                 add             TDest,eax
00379                 test    esi,1           //dword align left side
00380                 jz              NoSinglePixie
00381 
00382                 //odd sized spans write one pixel to dword align
00383                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
00384                 fmul    [Real65536]                                             ; UL16
00385                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
00386                 fmul    [Real65536]                                             ; VL16 UL16
00387                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
00388                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
00389                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
00390                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
00391                 fistp   [u16]                                                   ; GL   RL   VL16 BL
00392                 fxch    st(2)                                                   ; VL16 RL   GL   BL
00393                 fistp   [v16]                                                   ; RL   GL   BL
00394 
00395                 mov     [widTemp],edx
00396 
00397                 mov             ecx,[VShift]
00398                 mov             ebx,[GHMaskShifted]
00399 
00400                 mov             esi,[GWMask]
00401                 mov             edi,[v16]
00402 
00403                 mov             edx,dword ptr[u16]
00404 
00405                 shr             edi,cl
00406 
00407                 shr             edx,16
00408                 xor             eax,eax
00409 
00410                 and             edi,ebx
00411                 and             edx,esi
00412 
00413                 add             edi,edx
00414 
00415                 add             edi,GBitPtrHalf
00416                 mov             ax,word ptr[edi*2]
00417 
00418                 mov             word ptr[TempPix],ax
00419 
00420                 mov             ebx,eax
00421                 and             eax,REDMASK2
00422 
00423                 mov             ecx,ebx
00424                 and             ebx,GREENMASK2
00425 
00426                 mov             dword ptr[Red],eax
00427                 and             ecx,BLUEMASK2
00428 
00429                 mov             dword ptr[Green],ebx
00430                 mov             dword ptr[Blue],ecx
00431 
00432                 fimul   dword ptr[Red]                                  ; R    GL   BL
00433                 fxch    st(1)                                                   ; GL   R    BL
00434                 fimul   dword ptr[Green]                                ; G    R    BL
00435                 fxch    st(1)                                                   ; R    G    BL
00436                 fadd    qword ptr[Magic]                                ; Rk   G    BL
00437                 fxch    st(2)                                                   ; BL   G    Rk
00438                 fimul   [Blue]                                                  ; B    G    Rk
00439                 fxch    st(1)                                                   ; G    B    Rk
00440                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
00441                 fxch    st(2)                                                   ; Rk   B    Gk
00442                 fstp    qword ptr[Bucket]                               ; B    Gk
00443                 fadd    qword ptr[Magic]                                ; Bk   Gk
00444                 fxch    st(1)                                                   ; Gk   Bk
00445                 fstp    qword ptr[Bucket2]                              ; Bk
00446 
00447                 mov             edx,dword ptr[Bucket]
00448                 mov             eax,dword ptr[Bucket2]
00449 
00450                 and             edx,REDMASK2
00451                 and             eax,GREENMASK2
00452 
00453                 fstp    qword ptr[Bucket]
00454 
00455                 mov             ecx,TDest
00456                 mov             ebx,dword ptr[Bucket]
00457 
00458                 and             ebx,BLUEMASK2
00459                 or              edx,eax
00460 
00461                 add             TDest,2
00462                 or              edx,ebx
00463 
00464                 mov             ebx,pLeft
00465                 cmp             word ptr[TempPix],01h
00466                 je              SkipSinglePixie
00467 
00468                 mov             word ptr[ecx],dx
00469 
00470 SkipSinglePixie:
00471                 mov     edx,[widTemp]
00472                 mov     ecx,pRight
00473                 dec             edx
00474                 jz              GouraudReturnNoZ
00475                 mov             esi,edx
00476                 and             esi,1
00477                 sub             edx,esi
00478                 jz              GouraudReturnNoZ
00479 
00480 NoSinglePixie:
00481                 mov     [widTemp],edx                 ; just for a temp
00482                 shr             edx,1
00483 
00484                 ; try to keep fmul fxch pairs seperated to avoid stalling
00485                 ; calc this scanlines steps           ; FPU Stack
00486                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
00487                 fild    dword ptr [widTemp]           ; WID
00488 
00489                 mov     [widTemp],edx                 ; Color interps doubled
00490 
00491                 fld     dword ptr [ecx]EdgeAsmFPU.u      ; UR   WID
00492                 fld     dword ptr [ebx]EdgeAsmFPU.u      ; UL   UR   WID
00493                 fsub    st(1), st                     ; UL   UD   WID
00494                 fld     dword ptr [ecx]EdgeAsmFPU.v      ; VR   UL   UD   WID
00495                 fxch    st(1)                         ; UL   VR   UD   WID
00496                 fmul    [Real65536]                   ; UL16 VR   UD   WID
00497                 fld     dword ptr [ebx]EdgeAsmFPU.v      ; VL   UL16 VR   UD   WID
00498                 fsub    st(2), st                     ; VL   UL16 VD   UD   WID
00499                 fild    dword ptr [ecx]EdgeAsmFPU.R      ; RR   VL   UL16 VD   UD   WID
00500                 fxch    st(3)                         ; VD   VL   UL16 RR   UD   WID
00501                 fmul    [Real65536]                   ; VD16 VL   UL16 RR   UD   WID
00502                 fild    dword ptr [ebx]EdgeAsmFPU.R      ; RL   VD16 VL   UL16 RR   UD   WID
00503                 fsub    st(4),st                      ; RL   VD16 VL   UL16 RD   UD   WID
00504                 fxch    st(5)                         ; UD   VD16 VL   UL16 RD   RL   WID
00505                 fmul    [Real65536]                   ; UD16 VD16 VL   UL16 RD   RL   WID
00506                 fxch    st(2)                                             ; VL   VD16 UD16 UL16 RD   RL   WID
00507                 fmul    [Real65536]                   ; VL16 VD16 UD16 UL16 RD   RL   WID
00508                 fxch    st(3)                                                   ; UL16 VD16 UD16 VL16 RD   RL   WID
00509                 fistp   [u16]                                                   ; VD16 UD16 VL16 RD   RL   WID
00510                 fxch    st(2)                                                   ; VL16 UD16 VD16 RD   RL   WID
00511                 fistp   [v16]                                                   ; UD16 VD16 RD   RL   WID
00512                 fld1                                                                    ; 1    UD16 VD16 RD   RL   WID
00513                 fdivrp  st(5),st                                                ; UD16 VD16 RD   RL   DWID
00514 
00515                 //let that cook
00516 
00517                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
00518                 fild    [ecx]EdgeAsmFPU.G                                       ; RG   USTP VD16 RD   RL   DWID
00519                 fild    [ebx]EdgeAsmFPU.G                                       ; LG   RG   USTP VD16 RD   RL   DWID
00520                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
00521                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
00522                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
00523                 fild    [ecx]EdgeAsmFPU.B                                       ; RB   GD   LG   VD16 RD   RL   DWID
00524                 fild    [ebx]EdgeAsmFPU.B                                       ; LB   RB   GD   LG   VD16 RD   RL   DWID
00525                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
00526                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
00527                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
00528                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
00529                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
00530                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
00531                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
00532                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
00533                 frndint
00534                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
00535                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
00536                 frndint
00537                 fxch    st(7)                                                   ; DW2  BD   RI   LG   LB   VSTP RL   GI
00538                 fmulp   st(1),st                                                ; BI   RI   LG   LB   VSTP RL   GI
00539                 frndint
00540                 fxch    st(4)                                                   ; VSTP RI   LG   LB   BI   RL   GI
00541                 fistp   [VStep]                                                 ; RI   LG   LB   BI   RL   GI
00542 
00543                 push    ebp
00544 
00545 PixieLoop:
00546                 mov             ecx,[VShift]
00547                 mov             ebx,[GHMaskShifted]
00548 
00549                 mov             ebp,[GWMask]
00550                 mov             edi,[v16]
00551 
00552                 mov             edx,dword ptr[u16]
00553                 mov             esi,edi
00554 
00555                 mov             eax,edx
00556 
00557                 shr             edi,cl
00558                 add             esi,[VStep]
00559 
00560                 shr             edx,16
00561                 add             eax,[UStep]
00562 
00563                 and             edi,ebx
00564                 and             edx,ebp
00565 
00566                 add             edi,edx
00567                 mov             edx,eax
00568 
00569                 add             edi,GBitPtrHalf
00570                 add             eax,[UStep]
00571 
00572                 mov             [u16],eax
00573                 mov             ax,word ptr[edi*2]
00574 
00575                 mov             edi,esi
00576                 add             esi,[VStep]
00577 
00578                 shr             edx,16
00579                 mov             [v16],esi
00580 
00581                 shr             edi,cl
00582                 and             edx,ebp
00583 
00584                 mov             esi,GBitPtrHalf
00585                 and             edi,ebx
00586 
00587                 shl             eax,16
00588                 add             esi,edx
00589 
00590                 add             esi,edi
00591 
00592                 mov             ax,word ptr[esi*2]
00593 
00594                 mov             [TempPix],eax
00595 
00596                 mov             ebx,eax
00597                 and             eax,REDMASK2
00598 
00599                 mov             ecx,ebx
00600                 and             ebx,GREENMASK2
00601 
00602                 mov             dword ptr[Red],eax
00603                 and             ecx,BLUEMASK2
00604 
00605                 mov             dword ptr[Green],ebx
00606                 mov             dword ptr[Blue],ecx
00607 
00608                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
00609                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
00610                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
00611                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
00612                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
00613                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
00614                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
00615                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
00616                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
00617                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
00618                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
00619                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
00620                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
00621                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
00622                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
00623 
00624                 mov             edx,dword ptr[Bucket]
00625                 mov             eax,dword ptr[Bucket2]
00626 
00627                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
00628                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
00629                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
00630                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
00631                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
00632                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
00633 
00634                 and             edx,GREENMASK2
00635                 and             eax,REDMASK2
00636 
00637                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
00638                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
00639 
00640                 mov             edi,edx
00641                 mov             ebx,dword ptr[Bucket]
00642                 or              edi,eax
00643                 mov             ebp,TDest
00644                 and             ebx,BLUEMASK2
00645 
00646                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
00647                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
00648 
00649                 or              edi,ebx
00650                 add             TDest,4
00651 
00652                 cmp             [TempPix],010001h
00653                 je              SkipPixie
00654 
00655                 mov             [ebp],edi
00656 
00657 SkipPixie:
00658                 dec             [widTemp]
00659 
00660                 jnz             PixieLoop
00661 
00662                 pop             ebp
00663 
00664                 fstp    [u16]
00665                 fstp    [v16]
00666                 fstp    [u16]
00667                 fstp    [v16]
00668                 fstp    [u16]
00669                 fstp    [v16]
00670 
00671 GouraudReturnNoZ:
00672                 pop             edi
00673                 pop             esi
00674                 pop             ecx
00675                 pop             ebx
00676         }
00677 }
00678 
00679 void    DrawScanLineGouraudZBuffer_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
00680 {
00681         TDest   =Dest;
00682         Red             =Green  =0;
00683         _asm
00684         {
00685                 push    ebx
00686                 push    ecx
00687                 push    esi
00688                 push    edi
00689 
00690                 mov             ebx,pLeft
00691                 mov     ecx,pRight
00692                 mov     eax,[ebx]EdgeAsmFPU.X
00693                 mov     edx,[ecx]EdgeAsmFPU.X
00694                 sub     edx,eax
00695                 jle             GouraudReturnNoZ
00696 
00697                 mov             esi,eax
00698                 inc             edx
00699                 shl             eax,1
00700                 add             TDest,eax
00701                 add             pZBufferPtr,eax
00702                 test    esi,1           //dword align left
00703                 jz              NoSinglePixie
00704 
00705                 //odd sized spans write one pixel to dword align
00706                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
00707                 fmul    [Real65536]                                             ; UL16
00708                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
00709                 fmul    [Real65536]                                             ; VL16 UL16
00710                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
00711                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
00712                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
00713                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
00714                 fistp   [u16]                                                   ; GL   RL   VL16 BL
00715                 fxch    st(2)                                                   ; VL16 RL   GL   BL
00716                 fistp   [v16]                                                   ; RL   GL   BL
00717                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
00718                 fistp   [z16]                                                   ; RL   GL   BL
00719 
00720                 mov     [widTemp],edx
00721 
00722                 mov             ecx,[VShift]
00723                 mov             ebx,[GHMaskShifted]
00724 
00725                 mov             esi,[GWMask]
00726                 mov             edi,[v16]
00727 
00728                 mov             edx,dword ptr[u16]
00729 
00730                 shr             edi,cl
00731 
00732                 shr             edx,16
00733                 xor             eax,eax
00734 
00735                 and             edi,ebx
00736                 and             edx,esi
00737 
00738                 add             edi,edx
00739 
00740                 add             edi,GBitPtrHalf
00741                 mov             ax,word ptr[edi*2]
00742 
00743                 mov             ebx,eax
00744                 and             eax,REDMASK2
00745 
00746                 mov             ecx,ebx
00747                 and             ebx,GREENMASK2
00748 
00749                 mov             dword ptr[Red],eax
00750                 and             ecx,BLUEMASK2
00751 
00752                 mov             dword ptr[Green],ebx
00753                 mov             dword ptr[Blue],ecx
00754 
00755                 fimul   dword ptr[Red]                                  ; R    GL   BL
00756                 fxch    st(1)                                                   ; GL   R    BL
00757                 fimul   dword ptr[Green]                                ; G    R    BL
00758                 fxch    st(1)                                                   ; R    G    BL
00759                 fadd    qword ptr[Magic]                                ; Rk   G    BL
00760                 fxch    st(2)                                                   ; BL   G    Rk
00761                 fimul   [Blue]                                                  ; B    G    Rk
00762                 fxch    st(1)                                                   ; G    B    Rk
00763                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
00764                 fxch    st(2)                                                   ; Rk   B    Gk
00765                 fstp    qword ptr[Bucket]                               ; B    Gk
00766                 fadd    qword ptr[Magic]                                ; Bk   Gk
00767                 fxch    st(1)                                                   ; Gk   Bk
00768                 fstp    qword ptr[Bucket2]                              ; Bk
00769 
00770                 mov             edx,dword ptr[Bucket]
00771                 mov             eax,dword ptr[Bucket2]
00772 
00773                 and             edx,REDMASK2
00774                 and             eax,GREENMASK2
00775 
00776                 fstp    qword ptr[Bucket]
00777 
00778                 mov             ecx,TDest
00779                 mov             ebx,dword ptr[Bucket]
00780 
00781                 mov             esi,[z16]
00782                 and             ebx,BLUEMASK2
00783 
00784                 shr             esi,16
00785                 or              edx,eax
00786 
00787                 mov             eax,pZBufferPtr
00788                 add             TDest,2
00789 
00790                 cmp             word ptr[eax],si
00791                 jg              SkipSinglePixie
00792 
00793                 or              edx,ebx
00794                 mov             word ptr[eax],si
00795 
00796                 mov             word ptr[ecx],dx
00797 
00798 SkipSinglePixie:
00799                 mov             ebx,pLeft
00800                 mov     edx,[widTemp]
00801                 add             pZBufferPtr,2
00802                 mov     ecx,pRight
00803                 dec             edx
00804                 jz              GouraudReturnNoZ
00805                 mov             esi,edx
00806                 and             esi,1
00807                 sub             edx,esi
00808                 jz              GouraudReturnNoZ
00809 
00810 NoSinglePixie:
00811                 mov     [widTemp],edx                 ; just for a temp
00812                 shr             edx,1
00813 
00814                 ; try to keep fmul fxch pairs seperated to avoid stalling
00815                 ; calc this scanlines steps           ; FPU Stack
00816                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
00817                 fild    dword ptr [widTemp]           ; WID
00818 
00819                 mov     [widTemp],edx                 ; Color interps doubled
00820 
00821                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
00822                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
00823                 fsub    st(1), st                   ; UL   UD   WID
00824                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
00825                 fxch    st(1)                       ; UL   VR   UD   WID
00826                 fmul    [Real65536]                 ; UL16 VR   UD   WID
00827                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
00828                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
00829                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
00830                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
00831                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
00832                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
00833                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
00834                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
00835                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
00836                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
00837                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
00838                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
00839                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
00840                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
00841                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
00842                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
00843                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
00844 
00845                 //let that cook
00846 
00847                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
00848                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
00849                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
00850                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
00851                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
00852                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
00853                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
00854                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
00855                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
00856                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
00857                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
00858                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
00859                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
00860                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
00861                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
00862                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
00863                 frndint
00864                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
00865                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
00866                 frndint
00867                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
00868                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
00869                 frndint
00870                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
00871                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
00872                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
00873                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
00874                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
00875                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
00876                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
00877                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
00878                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
00879                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
00880                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
00881 
00882                 push    ebp
00883 
00884 PixieLoop:
00885                 mov             ebx,[ZStep]
00886 
00887                 add             [z16],ebx
00888                 mov             ecx,[VShift]
00889 
00890                 mov             edi,[z16]
00891 
00892                 shr             edi,16
00893                 mov             ebx,[GHMaskShifted]
00894 
00895                 mov             ebp,[GWMask]
00896                 mov             edx,dword ptr[u16]
00897 
00898                 mov             word ptr[Z32],di
00899                 mov             eax,edx
00900 
00901                 shr             edx,16
00902                 mov             edi,[v16]
00903 
00904                 add             eax,[UStep]
00905                 mov             esi,edi
00906 
00907                 shr             edi,cl
00908                 add             esi,[VStep]
00909 
00910                 and             edi,ebx
00911                 and             edx,ebp
00912 
00913                 add             edi,edx
00914                 mov             edx,eax
00915 
00916                 add             edi,GBitPtrHalf
00917                 add             eax,[UStep]
00918 
00919                 mov             [u16],eax
00920                 mov             ax,word ptr[edi*2]
00921 
00922                 mov             edi,esi
00923                 add             esi,[VStep]
00924 
00925                 shr             edx,16
00926                 mov             [v16],esi
00927 
00928                 shr             edi,cl
00929                 and             edx,ebp
00930 
00931                 mov             esi,GBitPtrHalf
00932                 and             edi,ebx
00933 
00934                 shl             eax,16
00935                 add             esi,edx
00936 
00937                 add             esi,edi
00938 
00939                 mov             ax,word ptr[esi*2]
00940 
00941                 mov             ebx,eax
00942                 and             eax,REDMASK2
00943 
00944                 mov             ecx,ebx
00945                 and             ebx,GREENMASK2
00946 
00947                 mov             dword ptr[Red],eax
00948                 and             ecx,BLUEMASK2
00949 
00950                 mov             dword ptr[Green],ebx
00951                 mov             dword ptr[Blue],ecx
00952 
00953                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
00954                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
00955                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
00956                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
00957                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
00958                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
00959                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
00960                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
00961                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
00962                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
00963                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
00964                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
00965                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
00966                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
00967                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
00968 
00969                 mov             edx,dword ptr[Bucket]
00970                 mov             eax,dword ptr[Bucket2]
00971 
00972                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
00973                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
00974                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
00975                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
00976                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
00977                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
00978 
00979                 and             edx,GREENMASK2
00980                 and             eax,REDMASK2
00981 
00982                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
00983                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
00984 
00985                 mov             edi,edx
00986                 mov             ebx,dword ptr[Bucket]
00987                 or              edi,eax
00988                 mov             ebp,TDest
00989                 and             ebx,BLUEMASK2
00990 
00991                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
00992                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
00993 
00994                 mov             si,word ptr[Z32]
00995                 add             TDest,4
00996 
00997                 mov             ecx,pZBufferPtr
00998                 or              edi,ebx
00999 
01000                 cmp             word ptr[ecx],si
01001                 jg              SkipPixie
01002 
01003                 rol             edi,16
01004 
01005                 mov             [ecx],si
01006                 mov             dword ptr[ebp],edi
01007                 mov             [ecx+2],si
01008 SkipPixie:
01009                 add             pZBufferPtr,4
01010                 dec             [widTemp]
01011 
01012                 jnz             PixieLoop
01013 //              mov             dword ptr[ebp],0ffffffffh
01014 
01015                 pop             ebp
01016 
01017                 fstp    [u16]
01018                 fstp    [v16]
01019                 fstp    [u16]
01020                 fstp    [v16]
01021                 fstp    [u16]
01022                 fstp    [v16]
01023 
01024 GouraudReturnNoZ:
01025                 pop             edi
01026                 pop             esi
01027                 pop             ecx
01028                 pop             ebx
01029         }
01030 }
01031 
01032 void    DrawScanLineGouraudZBufferNoZWrite_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
01033 {
01034         TDest   =Dest;
01035         Red             =Green  =0;
01036         _asm
01037         {
01038                 push    ebx
01039                 push    ecx
01040                 push    esi
01041                 push    edi
01042 
01043                 mov             ebx,pLeft
01044                 mov     ecx,pRight
01045                 mov     eax,[ebx]EdgeAsmFPU.X
01046                 mov     edx,[ecx]EdgeAsmFPU.X
01047                 sub     edx,eax
01048                 jle             GouraudReturnNoZ
01049 
01050                 mov             esi,eax
01051                 inc             edx
01052                 shl             eax,1
01053                 add             TDest,eax
01054                 add             pZBufferPtr,eax
01055                 test    esi,1           //dword align left
01056                 jz              NoSinglePixie
01057 
01058                 //odd sized spans write one pixel to dword align
01059                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
01060                 fmul    [Real65536]                                             ; UL16
01061                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
01062                 fmul    [Real65536]                                             ; VL16 UL16
01063                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
01064                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
01065                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
01066                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
01067                 fistp   [u16]                                                   ; GL   RL   VL16 BL
01068                 fxch    st(2)                                                   ; VL16 RL   GL   BL
01069                 fistp   [v16]                                                   ; RL   GL   BL
01070                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
01071                 fistp   [z16]                                                   ; RL   GL   BL
01072 
01073                 mov     [widTemp],edx
01074 
01075                 mov             ecx,[VShift]
01076                 mov             ebx,[GHMaskShifted]
01077 
01078                 mov             esi,[GWMask]
01079                 mov             edi,[v16]
01080 
01081                 mov             edx,dword ptr[u16]
01082 
01083                 shr             edi,cl
01084 
01085                 shr             edx,16
01086                 xor             eax,eax
01087 
01088                 and             edi,ebx
01089                 and             edx,esi
01090 
01091                 add             edi,edx
01092 
01093                 add             edi,GBitPtrHalf
01094                 mov             ax,word ptr[edi*2]
01095 
01096                 mov             ebx,eax
01097                 and             eax,REDMASK2
01098 
01099                 mov             ecx,ebx
01100                 and             ebx,GREENMASK2
01101 
01102                 mov             dword ptr[Red],eax
01103                 and             ecx,BLUEMASK2
01104 
01105                 mov             dword ptr[Green],ebx
01106                 mov             dword ptr[Blue],ecx
01107 
01108                 fimul   dword ptr[Red]                                  ; R    GL   BL
01109                 fxch    st(1)                                                   ; GL   R    BL
01110                 fimul   dword ptr[Green]                                ; G    R    BL
01111                 fxch    st(1)                                                   ; R    G    BL
01112                 fadd    qword ptr[Magic]                                ; Rk   G    BL
01113                 fxch    st(2)                                                   ; BL   G    Rk
01114                 fimul   [Blue]                                                  ; B    G    Rk
01115                 fxch    st(1)                                                   ; G    B    Rk
01116                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
01117                 fxch    st(2)                                                   ; Rk   B    Gk
01118                 fstp    qword ptr[Bucket]                               ; B    Gk
01119                 fadd    qword ptr[Magic]                                ; Bk   Gk
01120                 fxch    st(1)                                                   ; Gk   Bk
01121                 fstp    qword ptr[Bucket2]                              ; Bk
01122 
01123                 mov             edx,dword ptr[Bucket]
01124                 mov             eax,dword ptr[Bucket2]
01125 
01126                 and             edx,REDMASK2
01127                 and             eax,GREENMASK2
01128 
01129                 fstp    qword ptr[Bucket]
01130 
01131                 mov             ecx,TDest
01132                 mov             ebx,dword ptr[Bucket]
01133 
01134                 mov             esi,[z16]
01135                 and             ebx,BLUEMASK2
01136 
01137                 shr             esi,16
01138                 or              edx,eax
01139 
01140                 mov             eax,pZBufferPtr
01141                 add             TDest,2
01142 
01143                 cmp             word ptr[eax],si
01144                 jg              SkipSinglePixie
01145 
01146                 or              edx,ebx
01147 
01148                 mov             word ptr[ecx],dx
01149 
01150 SkipSinglePixie:
01151                 mov             ebx,pLeft
01152                 mov     edx,[widTemp]
01153                 add             pZBufferPtr,2
01154                 mov     ecx,pRight
01155                 dec             edx
01156                 jz              GouraudReturnNoZ
01157                 mov             esi,edx
01158                 and             esi,1
01159                 sub             edx,esi
01160                 jz              GouraudReturnNoZ
01161 
01162 NoSinglePixie:
01163                 mov     [widTemp],edx                 ; just for a temp
01164                 shr             edx,1
01165 
01166                 ; try to keep fmul fxch pairs seperated to avoid stalling
01167                 ; calc this scanlines steps           ; FPU Stack
01168                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
01169                 fild    dword ptr [widTemp]           ; WID
01170 
01171                 mov     [widTemp],edx                 ; Color interps doubled
01172 
01173                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
01174                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
01175                 fsub    st(1), st                   ; UL   UD   WID
01176                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
01177                 fxch    st(1)                       ; UL   VR   UD   WID
01178                 fmul    [Real65536]                 ; UL16 VR   UD   WID
01179                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
01180                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
01181                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
01182                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
01183                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
01184                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
01185                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
01186                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
01187                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
01188                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
01189                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
01190                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
01191                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
01192                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
01193                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
01194                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
01195                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
01196 
01197                 //let that cook
01198 
01199                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
01200                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
01201                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
01202                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
01203                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
01204                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
01205                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
01206                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
01207                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
01208                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
01209                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
01210                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
01211                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
01212                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
01213                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
01214                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
01215                 frndint
01216                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
01217                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
01218                 frndint
01219                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
01220                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
01221                 frndint
01222                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
01223                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
01224                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
01225                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
01226                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
01227                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
01228                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
01229                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
01230                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
01231                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
01232                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
01233 
01234                 push    ebp
01235 
01236 PixieLoop:
01237                 mov             ebx,[ZStep]
01238 
01239                 add             [z16],ebx
01240                 mov             ecx,[VShift]
01241 
01242                 mov             edi,[z16]
01243 
01244                 shr             edi,16
01245                 mov             ebx,[GHMaskShifted]
01246 
01247                 mov             ebp,[GWMask]
01248                 mov             edx,dword ptr[u16]
01249 
01250                 mov             word ptr[Z32],di
01251                 mov             eax,edx
01252 
01253                 shr             edx,16
01254                 mov             edi,[v16]
01255 
01256                 add             eax,[UStep]
01257                 mov             esi,edi
01258 
01259                 shr             edi,cl
01260                 add             esi,[VStep]
01261 
01262                 and             edi,ebx
01263                 and             edx,ebp
01264 
01265                 add             edi,edx
01266                 mov             edx,eax
01267 
01268                 add             edi,GBitPtrHalf
01269                 add             eax,[UStep]
01270 
01271                 mov             [u16],eax
01272                 mov             ax,word ptr[edi*2]
01273 
01274                 mov             edi,esi
01275                 add             esi,[VStep]
01276 
01277                 shr             edx,16
01278                 mov             [v16],esi
01279 
01280                 shr             edi,cl
01281                 and             edx,ebp
01282 
01283                 mov             esi,GBitPtrHalf
01284                 and             edi,ebx
01285 
01286                 shl             eax,16
01287                 add             esi,edx
01288 
01289                 add             esi,edi
01290 
01291                 mov             ax,word ptr[esi*2]
01292 
01293                 mov             ebx,eax
01294                 and             eax,REDMASK2
01295 
01296                 mov             ecx,ebx
01297                 and             ebx,GREENMASK2
01298 
01299                 mov             dword ptr[Red],eax
01300                 and             ecx,BLUEMASK2
01301 
01302                 mov             dword ptr[Green],ebx
01303                 mov             dword ptr[Blue],ecx
01304 
01305                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
01306                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
01307                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
01308                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
01309                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
01310                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
01311                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
01312                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
01313                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
01314                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
01315                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
01316                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
01317                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
01318                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
01319                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
01320 
01321                 mov             edx,dword ptr[Bucket]
01322                 mov             eax,dword ptr[Bucket2]
01323 
01324                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
01325                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
01326                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
01327                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
01328                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
01329                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
01330 
01331                 and             edx,GREENMASK2
01332                 and             eax,REDMASK2
01333 
01334                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
01335                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
01336 
01337                 mov             edi,edx
01338                 mov             ebx,dword ptr[Bucket]
01339                 or              edi,eax
01340                 mov             ebp,TDest
01341                 and             ebx,BLUEMASK2
01342 
01343                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
01344                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
01345 
01346                 mov             si,word ptr[Z32]
01347                 add             TDest,4
01348 
01349                 mov             ecx,pZBufferPtr
01350                 or              edi,ebx
01351 
01352                 cmp             word ptr[ecx],si
01353                 jg              SkipPixie
01354 
01355                 rol             edi,16
01356 
01357                 mov             dword ptr[ebp],edi
01358 SkipPixie:
01359                 add             pZBufferPtr,4
01360                 dec             [widTemp]
01361 
01362                 jnz             PixieLoop
01363 
01364                 pop             ebp
01365 
01366                 fstp    [u16]
01367                 fstp    [v16]
01368                 fstp    [u16]
01369                 fstp    [v16]
01370                 fstp    [u16]
01371                 fstp    [v16]
01372 
01373 GouraudReturnNoZ:
01374                 pop             edi
01375                 pop             esi
01376                 pop             ecx
01377                 pop             ebx
01378         }
01379 }
01380 
01381 void    DrawScanLineGouraudNoZBufferZWrite_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
01382 {
01383         TDest   =Dest;
01384         Red             =Green  =0;
01385         _asm
01386         {
01387                 push    ebx
01388                 push    ecx
01389                 push    esi
01390                 push    edi
01391 
01392                 mov             ebx,pLeft
01393                 mov     ecx,pRight
01394                 mov     eax,[ebx]EdgeAsmFPU.X
01395                 mov     edx,[ecx]EdgeAsmFPU.X
01396                 sub     edx,eax
01397                 jle             GouraudReturnNoZ
01398 
01399                 mov             esi,eax
01400                 inc             edx
01401                 shl             eax,1
01402                 add             TDest,eax
01403                 add             pZBufferPtr,eax
01404                 test    esi,1           //dword align left
01405                 jz              NoSinglePixie
01406 
01407                 //odd sized spans write one pixel to dword align
01408                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
01409                 fmul    [Real65536]                                             ; UL16
01410                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
01411                 fmul    [Real65536]                                             ; VL16 UL16
01412                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
01413                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
01414                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
01415                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
01416                 fistp   [u16]                                                   ; GL   RL   VL16 BL
01417                 fxch    st(2)                                                   ; VL16 RL   GL   BL
01418                 fistp   [v16]                                                   ; RL   GL   BL
01419                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
01420                 fistp   [z16]                                                   ; RL   GL   BL
01421 
01422                 mov     [widTemp],edx
01423 
01424                 mov             ecx,[VShift]
01425                 mov             ebx,[GHMaskShifted]
01426 
01427                 mov             esi,[GWMask]
01428                 mov             edi,[v16]
01429 
01430                 mov             edx,dword ptr[u16]
01431 
01432                 shr             edi,cl
01433 
01434                 shr             edx,16
01435                 xor             eax,eax
01436 
01437                 and             edi,ebx
01438                 and             edx,esi
01439 
01440                 add             edi,edx
01441 
01442                 add             edi,GBitPtrHalf
01443                 mov             ax,word ptr[edi*2]
01444 
01445                 mov             ebx,eax
01446                 and             eax,REDMASK2
01447 
01448                 mov             ecx,ebx
01449                 and             ebx,GREENMASK2
01450 
01451                 mov             dword ptr[Red],eax
01452                 and             ecx,BLUEMASK2
01453 
01454                 mov             dword ptr[Green],ebx
01455                 mov             dword ptr[Blue],ecx
01456 
01457                 fimul   dword ptr[Red]                                  ; R    GL   BL
01458                 fxch    st(1)                                                   ; GL   R    BL
01459                 fimul   dword ptr[Green]                                ; G    R    BL
01460                 fxch    st(1)                                                   ; R    G    BL
01461                 fadd    qword ptr[Magic]                                ; Rk   G    BL
01462                 fxch    st(2)                                                   ; BL   G    Rk
01463                 fimul   [Blue]                                                  ; B    G    Rk
01464                 fxch    st(1)                                                   ; G    B    Rk
01465                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
01466                 fxch    st(2)                                                   ; Rk   B    Gk
01467                 fstp    qword ptr[Bucket]                               ; B    Gk
01468                 fadd    qword ptr[Magic]                                ; Bk   Gk
01469                 fxch    st(1)                                                   ; Gk   Bk
01470                 fstp    qword ptr[Bucket2]                              ; Bk
01471 
01472                 mov             edx,dword ptr[Bucket]
01473                 mov             eax,dword ptr[Bucket2]
01474 
01475                 and             edx,REDMASK2
01476                 and             eax,GREENMASK2
01477 
01478                 fstp    qword ptr[Bucket]
01479 
01480                 mov             ecx,TDest
01481                 mov             ebx,dword ptr[Bucket]
01482 
01483                 mov             esi,[z16]
01484                 and             ebx,BLUEMASK2
01485 
01486                 shr             esi,16
01487                 or              edx,eax
01488 
01489                 mov             eax,pZBufferPtr
01490                 add             TDest,2
01491 
01492                 or              edx,ebx
01493                 mov             word ptr[eax],si
01494 
01495                 mov             word ptr[ecx],dx
01496 
01497                 mov             ebx,pLeft
01498                 mov     edx,[widTemp]
01499                 add             pZBufferPtr,2
01500                 mov     ecx,pRight
01501                 dec             edx
01502                 jz              GouraudReturnNoZ
01503                 mov             esi,edx
01504                 and             esi,1
01505                 sub             edx,esi
01506                 jz              GouraudReturnNoZ
01507 
01508 NoSinglePixie:
01509                 mov     [widTemp],edx                 ; just for a temp
01510                 shr             edx,1
01511 
01512                 ; try to keep fmul fxch pairs seperated to avoid stalling
01513                 ; calc this scanlines steps           ; FPU Stack
01514                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
01515                 fild    dword ptr [widTemp]           ; WID
01516 
01517                 mov     [widTemp],edx                 ; Color interps doubled
01518 
01519                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
01520                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
01521                 fsub    st(1), st                   ; UL   UD   WID
01522                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
01523                 fxch    st(1)                       ; UL   VR   UD   WID
01524                 fmul    [Real65536]                 ; UL16 VR   UD   WID
01525                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
01526                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
01527                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
01528                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
01529                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
01530                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
01531                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
01532                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
01533                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
01534                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
01535                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
01536                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
01537                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
01538                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
01539                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
01540                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
01541                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
01542 
01543                 //let that cook
01544 
01545                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
01546                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
01547                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
01548                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
01549                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
01550                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
01551                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
01552                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
01553                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
01554                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
01555                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
01556                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
01557                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
01558                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
01559                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
01560                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
01561                 frndint
01562                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
01563                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
01564                 frndint
01565                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
01566                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
01567                 frndint
01568                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
01569                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
01570                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
01571                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
01572                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
01573                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
01574                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
01575                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
01576                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
01577                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
01578                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
01579 
01580                 push    ebp
01581 
01582 PixieLoop:
01583                 mov             ebx,[ZStep]
01584 
01585                 add             [z16],ebx
01586                 mov             ecx,[VShift]
01587 
01588                 mov             edi,[z16]
01589 
01590                 shr             edi,16
01591                 mov             ebx,[GHMaskShifted]
01592 
01593                 mov             ebp,[GWMask]
01594                 mov             edx,dword ptr[u16]
01595 
01596                 mov             word ptr[Z32],di
01597                 mov             eax,edx
01598 
01599                 shr             edx,16
01600                 mov             edi,[v16]
01601 
01602                 add             eax,[UStep]
01603                 mov             esi,edi
01604 
01605                 shr             edi,cl
01606                 add             esi,[VStep]
01607 
01608                 and             edi,ebx
01609                 and             edx,ebp
01610 
01611                 add             edi,edx
01612                 mov             edx,eax
01613 
01614                 add             edi,GBitPtrHalf
01615                 add             eax,[UStep]
01616 
01617                 mov             [u16],eax
01618                 mov             ax,word ptr[edi*2]
01619 
01620                 mov             edi,esi
01621                 add             esi,[VStep]
01622 
01623                 shr             edx,16
01624                 mov             [v16],esi
01625 
01626                 shr             edi,cl
01627                 and             edx,ebp
01628 
01629                 mov             esi,GBitPtrHalf
01630                 and             edi,ebx
01631 
01632                 shl             eax,16
01633                 add             esi,edx
01634 
01635                 add             esi,edi
01636 
01637                 mov             ax,word ptr[esi*2]
01638 
01639                 mov             ebx,eax
01640                 and             eax,REDMASK2
01641 
01642                 mov             ecx,ebx
01643                 and             ebx,GREENMASK2
01644 
01645                 mov             dword ptr[Red],eax
01646                 and             ecx,BLUEMASK2
01647 
01648                 mov             dword ptr[Green],ebx
01649                 mov             dword ptr[Blue],ecx
01650 
01651                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
01652                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
01653                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
01654                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
01655                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
01656                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
01657                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
01658                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
01659                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
01660                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
01661                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
01662                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
01663                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
01664                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
01665                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
01666 
01667                 mov             edx,dword ptr[Bucket]
01668                 mov             eax,dword ptr[Bucket2]
01669 
01670                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
01671                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
01672                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
01673                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
01674                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
01675                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
01676 
01677                 and             edx,GREENMASK2
01678                 and             eax,REDMASK2
01679 
01680                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
01681                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
01682 
01683                 mov             edi,edx
01684                 mov             ebx,dword ptr[Bucket]
01685                 or              edi,eax
01686                 mov             ebp,TDest
01687                 and             ebx,BLUEMASK2
01688 
01689                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
01690                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
01691 
01692                 mov             si,word ptr[Z32]
01693                 add             TDest,4
01694 
01695                 mov             ecx,pZBufferPtr
01696                 or              edi,ebx
01697 
01698                 mov             [ecx],si
01699                 rol             edi,16
01700 
01701                 mov             dword ptr[ebp],edi
01702                 mov             [ecx+2],si
01703 
01704                 add             pZBufferPtr,4
01705                 dec             [widTemp]
01706 
01707                 jnz             PixieLoop
01708 
01709                 pop             ebp
01710 
01711                 fstp    [u16]
01712                 fstp    [v16]
01713                 fstp    [u16]
01714                 fstp    [v16]
01715                 fstp    [u16]
01716                 fstp    [v16]
01717 
01718 GouraudReturnNoZ:
01719                 pop             edi
01720                 pop             esi
01721                 pop             ecx
01722                 pop             ebx
01723         }
01724 }
01725 
01726 void    DrawScanLineGouraudZBufferTrans_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
01727 {
01728         TDest   =Dest;
01729         Red             =Green  =0;
01730         _asm
01731         {
01732                 push    ebx
01733                 push    ecx
01734                 push    esi
01735                 push    edi
01736 
01737                 mov             ebx,pLeft
01738                 mov     ecx,pRight
01739                 mov     eax,[ebx]EdgeAsmFPU.X
01740                 mov     edx,[ecx]EdgeAsmFPU.X
01741                 sub     edx,eax
01742                 jle             GouraudReturnNoZ
01743 
01744                 mov             esi,eax
01745                 inc             edx
01746                 shl             eax,1
01747                 add             TDest,eax
01748                 add             pZBufferPtr,eax
01749                 test    esi,1           //dword align left
01750                 jz              NoSinglePixie
01751 
01752                 //odd sized spans write one pixel to dword align
01753                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
01754                 fmul    [Real65536]                                             ; UL16
01755                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
01756                 fmul    [Real65536]                                             ; VL16 UL16
01757                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
01758                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
01759                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
01760                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
01761                 fistp   [u16]                                                   ; GL   RL   VL16 BL
01762                 fxch    st(2)                                                   ; VL16 RL   GL   BL
01763                 fistp   [v16]                                                   ; RL   GL   BL
01764                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
01765                 fistp   [z16]                                                   ; RL   GL   BL
01766 
01767                 mov     [widTemp],edx
01768 
01769                 mov             ecx,[VShift]
01770                 mov             ebx,[GHMaskShifted]
01771 
01772                 mov             esi,[GWMask]
01773                 mov             edi,[v16]
01774 
01775                 mov             edx,dword ptr[u16]
01776 
01777                 shr             edi,cl
01778 
01779                 shr             edx,16
01780                 xor             eax,eax
01781 
01782                 and             edi,ebx
01783                 and             edx,esi
01784 
01785                 add             edi,edx
01786 
01787                 add             edi,GBitPtrHalf
01788                 mov             ax,word ptr[edi*2]
01789 
01790                 mov             word ptr[TempPix],ax
01791 
01792                 mov             ebx,eax
01793                 and             eax,REDMASK2
01794 
01795                 mov             ecx,ebx
01796                 and             ebx,GREENMASK2
01797 
01798                 mov             dword ptr[Red],eax
01799                 and             ecx,BLUEMASK2
01800 
01801                 mov             dword ptr[Green],ebx
01802                 mov             dword ptr[Blue],ecx
01803 
01804                 fimul   dword ptr[Red]                                  ; R    GL   BL
01805                 fxch    st(1)                                                   ; GL   R    BL
01806                 fimul   dword ptr[Green]                                ; G    R    BL
01807                 fxch    st(1)                                                   ; R    G    BL
01808                 fadd    qword ptr[Magic]                                ; Rk   G    BL
01809                 fxch    st(2)                                                   ; BL   G    Rk
01810                 fimul   [Blue]                                                  ; B    G    Rk
01811                 fxch    st(1)                                                   ; G    B    Rk
01812                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
01813                 fxch    st(2)                                                   ; Rk   B    Gk
01814                 fstp    qword ptr[Bucket]                               ; B    Gk
01815                 fadd    qword ptr[Magic]                                ; Bk   Gk
01816                 fxch    st(1)                                                   ; Gk   Bk
01817                 fstp    qword ptr[Bucket2]                              ; Bk
01818 
01819                 mov             edx,dword ptr[Bucket]
01820                 mov             eax,dword ptr[Bucket2]
01821 
01822                 and             edx,REDMASK2
01823                 and             eax,GREENMASK2
01824 
01825                 fstp    qword ptr[Bucket]
01826 
01827                 mov             ecx,TDest
01828                 mov             ebx,dword ptr[Bucket]
01829 
01830                 mov             esi,[z16]
01831                 and             ebx,BLUEMASK2
01832 
01833                 shr             esi,16
01834                 or              edx,eax
01835 
01836                 mov             eax,pZBufferPtr
01837                 add             TDest,2
01838 
01839                 cmp             word ptr[TempPix],01h
01840                 je              SkipSinglePixie
01841 
01842                 cmp             word ptr[eax],si
01843                 jg              SkipSinglePixie
01844 
01845                 or              edx,ebx
01846                 mov             word ptr[eax],si
01847 
01848                 mov             word ptr[ecx],dx
01849 
01850 SkipSinglePixie:
01851                 mov             ebx,pLeft
01852                 mov     edx,[widTemp]
01853                 add             pZBufferPtr,2
01854                 mov     ecx,pRight
01855                 dec             edx
01856                 jz              GouraudReturnNoZ
01857                 mov             esi,edx
01858                 and             esi,1
01859                 sub             edx,esi
01860                 jz              GouraudReturnNoZ
01861 
01862 NoSinglePixie:
01863                 mov     [widTemp],edx                 ; just for a temp
01864                 shr             edx,1
01865 
01866                 ; try to keep fmul fxch pairs seperated to avoid stalling
01867                 ; calc this scanlines steps           ; FPU Stack
01868                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
01869                 fild    dword ptr [widTemp]           ; WID
01870 
01871                 mov     [widTemp],edx                 ; Color interps doubled
01872 
01873                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
01874                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
01875                 fsub    st(1), st                   ; UL   UD   WID
01876                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
01877                 fxch    st(1)                       ; UL   VR   UD   WID
01878                 fmul    [Real65536]                 ; UL16 VR   UD   WID
01879                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
01880                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
01881                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
01882                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
01883                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
01884                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
01885                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
01886                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
01887                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
01888                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
01889                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
01890                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
01891                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
01892                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
01893                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
01894                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
01895                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
01896 
01897                 //let that cook
01898 
01899                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
01900                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
01901                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
01902                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
01903                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
01904                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
01905                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
01906                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
01907                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
01908                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
01909                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
01910                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
01911                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
01912                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
01913                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
01914                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
01915                 frndint
01916                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
01917                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
01918                 frndint
01919                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
01920                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
01921                 frndint
01922                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
01923                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
01924                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
01925                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
01926                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
01927                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
01928                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
01929                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
01930                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
01931                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
01932                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
01933 
01934                 push    ebp
01935 
01936 PixieLoop:
01937                 mov             ebx,[ZStep]
01938 
01939                 add             [z16],ebx
01940                 mov             ecx,[VShift]
01941 
01942                 mov             edi,[z16]
01943 
01944                 shr             edi,16
01945                 mov             ebx,[GHMaskShifted]
01946 
01947                 mov             ebp,[GWMask]
01948                 mov             edx,dword ptr[u16]
01949 
01950                 mov             word ptr[Z32],di
01951                 mov             eax,edx
01952 
01953                 shr             edx,16
01954                 mov             edi,[v16]
01955 
01956                 add             eax,[UStep]
01957                 mov             esi,edi
01958 
01959                 shr             edi,cl
01960                 add             esi,[VStep]
01961 
01962                 and             edi,ebx
01963                 and             edx,ebp
01964 
01965                 add             edi,edx
01966                 mov             edx,eax
01967 
01968                 add             edi,GBitPtrHalf
01969                 add             eax,[UStep]
01970 
01971                 mov             [u16],eax
01972                 mov             ax,word ptr[edi*2]
01973 
01974                 mov             edi,esi
01975                 add             esi,[VStep]
01976 
01977                 shr             edx,16
01978                 mov             [v16],esi
01979 
01980                 shr             edi,cl
01981                 and             edx,ebp
01982 
01983                 mov             esi,GBitPtrHalf
01984                 and             edi,ebx
01985 
01986                 shl             eax,16
01987                 add             esi,edx
01988 
01989                 add             esi,edi
01990 
01991                 mov             ax,word ptr[esi*2]
01992 
01993                 mov             [TempPix],eax
01994 
01995                 mov             ebx,eax
01996                 and             eax,REDMASK2
01997 
01998                 mov             ecx,ebx
01999                 and             ebx,GREENMASK2
02000 
02001                 mov             dword ptr[Red],eax
02002                 and             ecx,BLUEMASK2
02003 
02004                 mov             dword ptr[Green],ebx
02005                 mov             dword ptr[Blue],ecx
02006 
02007                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
02008                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
02009                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
02010                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
02011                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
02012                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
02013                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
02014                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
02015                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
02016                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
02017                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
02018                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
02019                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
02020                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
02021                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
02022 
02023                 mov             edx,dword ptr[Bucket]
02024                 mov             eax,dword ptr[Bucket2]
02025 
02026                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
02027                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
02028                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
02029                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
02030                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
02031                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
02032 
02033                 and             edx,GREENMASK2
02034                 and             eax,REDMASK2
02035 
02036                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
02037                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
02038 
02039                 mov             edi,edx
02040                 mov             ebx,dword ptr[Bucket]
02041                 or              edi,eax
02042                 mov             ebp,TDest
02043                 and             ebx,BLUEMASK2
02044 
02045                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
02046                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
02047 
02048                 mov             si,word ptr[Z32]
02049                 add             TDest,4
02050 
02051                 mov             ecx,pZBufferPtr
02052                 or              edi,ebx
02053 
02054                 cmp             [TempPix],010001h
02055                 je              SkipPixie
02056 
02057                 rol             edi,16
02058 
02059                 cmp             word ptr[ecx],si
02060                 jg              SkipPixie
02061 
02062                 mov             [ecx],si
02063                 mov             dword ptr[ebp],edi
02064                 mov             [ecx+2],si
02065 SkipPixie:
02066                 add             pZBufferPtr,4
02067                 dec             [widTemp]
02068 
02069                 jnz             PixieLoop
02070 //              mov             dword ptr[ebp],0ffffffffh
02071 
02072                 pop             ebp
02073 
02074                 fstp    [u16]
02075                 fstp    [v16]
02076                 fstp    [u16]
02077                 fstp    [v16]
02078                 fstp    [u16]
02079                 fstp    [v16]
02080 
02081 GouraudReturnNoZ:
02082                 pop             edi
02083                 pop             esi
02084                 pop             ecx
02085                 pop             ebx
02086         }
02087 }
02088 
02089 void    DrawScanLineGouraudZBufferNoZWriteTrans_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
02090 {
02091         TDest   =Dest;
02092         Red             =Green  =0;
02093         _asm
02094         {
02095                 push    ebx
02096                 push    ecx
02097                 push    esi
02098                 push    edi
02099 
02100                 mov             ebx,pLeft
02101                 mov     ecx,pRight
02102                 mov     eax,[ebx]EdgeAsmFPU.X
02103                 mov     edx,[ecx]EdgeAsmFPU.X
02104                 sub     edx,eax
02105                 jle             GouraudReturnNoZ
02106 
02107                 mov             esi,eax
02108                 inc             edx
02109                 shl             eax,1
02110                 add             TDest,eax
02111                 add             pZBufferPtr,eax
02112                 test    esi,1           //dword align left
02113                 jz              NoSinglePixie
02114 
02115                 //odd sized spans write one pixel to dword align
02116                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
02117                 fmul    [Real65536]                                             ; UL16
02118                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
02119                 fmul    [Real65536]                                             ; VL16 UL16
02120                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
02121                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
02122                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
02123                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
02124                 fistp   [u16]                                                   ; GL   RL   VL16 BL
02125                 fxch    st(2)                                                   ; VL16 RL   GL   BL
02126                 fistp   [v16]                                                   ; RL   GL   BL
02127                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
02128                 fistp   [z16]                                                   ; RL   GL   BL
02129 
02130                 mov     [widTemp],edx
02131 
02132                 mov             ecx,[VShift]
02133                 mov             ebx,[GHMaskShifted]
02134 
02135                 mov             esi,[GWMask]
02136                 mov             edi,[v16]
02137 
02138                 mov             edx,dword ptr[u16]
02139 
02140                 shr             edi,cl
02141 
02142                 shr             edx,16
02143                 xor             eax,eax
02144 
02145                 and             edi,ebx
02146                 and             edx,esi
02147 
02148                 add             edi,edx
02149 
02150                 add             edi,GBitPtrHalf
02151                 mov             ax,word ptr[edi*2]
02152 
02153                 mov             word ptr[TempPix],ax
02154 
02155                 mov             ebx,eax
02156                 and             eax,REDMASK2
02157 
02158                 mov             ecx,ebx
02159                 and             ebx,GREENMASK2
02160 
02161                 mov             dword ptr[Red],eax
02162                 and             ecx,BLUEMASK2
02163 
02164                 mov             dword ptr[Green],ebx
02165                 mov             dword ptr[Blue],ecx
02166 
02167                 fimul   dword ptr[Red]                                  ; R    GL   BL
02168                 fxch    st(1)                                                   ; GL   R    BL
02169                 fimul   dword ptr[Green]                                ; G    R    BL
02170                 fxch    st(1)                                                   ; R    G    BL
02171                 fadd    qword ptr[Magic]                                ; Rk   G    BL
02172                 fxch    st(2)                                                   ; BL   G    Rk
02173                 fimul   [Blue]                                                  ; B    G    Rk
02174                 fxch    st(1)                                                   ; G    B    Rk
02175                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
02176                 fxch    st(2)                                                   ; Rk   B    Gk
02177                 fstp    qword ptr[Bucket]                               ; B    Gk
02178                 fadd    qword ptr[Magic]                                ; Bk   Gk
02179                 fxch    st(1)                                                   ; Gk   Bk
02180                 fstp    qword ptr[Bucket2]                              ; Bk
02181 
02182                 mov             edx,dword ptr[Bucket]
02183                 mov             eax,dword ptr[Bucket2]
02184 
02185                 and             edx,REDMASK2
02186                 and             eax,GREENMASK2
02187 
02188                 fstp    qword ptr[Bucket]
02189 
02190                 mov             ecx,TDest
02191                 mov             ebx,dword ptr[Bucket]
02192 
02193                 mov             esi,[z16]
02194                 and             ebx,BLUEMASK2
02195 
02196                 shr             esi,16
02197                 or              edx,eax
02198 
02199                 mov             eax,pZBufferPtr
02200                 add             TDest,2
02201 
02202                 cmp             word ptr[TempPix],01h
02203                 je              SkipSinglePixie
02204 
02205                 cmp             word ptr[eax],si
02206                 jg              SkipSinglePixie
02207 
02208                 or              edx,ebx
02209 
02210                 mov             word ptr[ecx],dx
02211 
02212 SkipSinglePixie:
02213                 mov             ebx,pLeft
02214                 mov     edx,[widTemp]
02215                 add             pZBufferPtr,2
02216                 mov     ecx,pRight
02217                 dec             edx
02218                 jz              GouraudReturnNoZ
02219                 mov             esi,edx
02220                 and             esi,1
02221                 sub             edx,esi
02222                 jz              GouraudReturnNoZ
02223 
02224 NoSinglePixie:
02225                 mov     [widTemp],edx                 ; just for a temp
02226                 shr             edx,1
02227 
02228                 ; try to keep fmul fxch pairs seperated to avoid stalling
02229                 ; calc this scanlines steps           ; FPU Stack
02230                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
02231                 fild    dword ptr [widTemp]           ; WID
02232 
02233                 mov     [widTemp],edx                 ; Color interps doubled
02234 
02235                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
02236                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
02237                 fsub    st(1), st                   ; UL   UD   WID
02238                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
02239                 fxch    st(1)                       ; UL   VR   UD   WID
02240                 fmul    [Real65536]                 ; UL16 VR   UD   WID
02241                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
02242                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
02243                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
02244                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
02245                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
02246                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
02247                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
02248                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
02249                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
02250                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
02251                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
02252                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
02253                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
02254                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
02255                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
02256                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
02257                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
02258 
02259                 //let that cook
02260 
02261                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
02262                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
02263                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
02264                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
02265                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
02266                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
02267                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
02268                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
02269                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
02270                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
02271                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
02272                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
02273                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
02274                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
02275                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
02276                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
02277                 frndint
02278                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
02279                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
02280                 frndint
02281                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
02282                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
02283                 frndint
02284                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
02285                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
02286                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
02287                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
02288                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
02289                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
02290                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
02291                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
02292                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
02293                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
02294                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
02295 
02296                 push    ebp
02297 
02298 PixieLoop:
02299                 mov             ebx,[ZStep]
02300 
02301                 add             [z16],ebx
02302                 mov             ecx,[VShift]
02303 
02304                 mov             edi,[z16]
02305 
02306                 shr             edi,16
02307                 mov             ebx,[GHMaskShifted]
02308 
02309                 mov             ebp,[GWMask]
02310                 mov             edx,dword ptr[u16]
02311 
02312                 mov             word ptr[Z32],di
02313                 mov             eax,edx
02314 
02315                 shr             edx,16
02316                 mov             edi,[v16]
02317 
02318                 add             eax,[UStep]
02319                 mov             esi,edi
02320 
02321                 shr             edi,cl
02322                 add             esi,[VStep]
02323 
02324                 and             edi,ebx
02325                 and             edx,ebp
02326 
02327                 add             edi,edx
02328                 mov             edx,eax
02329 
02330                 add             edi,GBitPtrHalf
02331                 add             eax,[UStep]
02332 
02333                 mov             [u16],eax
02334                 mov             ax,word ptr[edi*2]
02335 
02336                 mov             edi,esi
02337                 add             esi,[VStep]
02338 
02339                 shr             edx,16
02340                 mov             [v16],esi
02341 
02342                 shr             edi,cl
02343                 and             edx,ebp
02344 
02345                 mov             esi,GBitPtrHalf
02346                 and             edi,ebx
02347 
02348                 shl             eax,16
02349                 add             esi,edx
02350 
02351                 add             esi,edi
02352 
02353                 mov             ax,word ptr[esi*2]
02354 
02355                 mov             [TempPix],eax
02356 
02357                 mov             ebx,eax
02358                 and             eax,REDMASK2
02359 
02360                 mov             ecx,ebx
02361                 and             ebx,GREENMASK2
02362 
02363                 mov             dword ptr[Red],eax
02364                 and             ecx,BLUEMASK2
02365 
02366                 mov             dword ptr[Green],ebx
02367                 mov             dword ptr[Blue],ecx
02368 
02369                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
02370                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
02371                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
02372                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
02373                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
02374                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
02375                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
02376                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
02377                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
02378                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
02379                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
02380                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
02381                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
02382                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
02383                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
02384 
02385                 mov             edx,dword ptr[Bucket]
02386                 mov             eax,dword ptr[Bucket2]
02387 
02388                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
02389                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
02390                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
02391                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
02392                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
02393                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
02394 
02395                 and             edx,GREENMASK2
02396                 and             eax,REDMASK2
02397 
02398                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
02399                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
02400 
02401                 mov             edi,edx
02402                 mov             ebx,dword ptr[Bucket]
02403                 or              edi,eax
02404                 mov             ebp,TDest
02405                 and             ebx,BLUEMASK2
02406 
02407                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
02408                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
02409 
02410                 mov             si,word ptr[Z32]
02411                 add             TDest,4
02412 
02413                 mov             ecx,pZBufferPtr
02414                 or              edi,ebx
02415 
02416                 cmp             [TempPix],010001h
02417                 je              SkipPixie
02418 
02419                 rol             edi,16
02420 
02421                 cmp             word ptr[ecx],si
02422                 jg              SkipPixie
02423 
02424                 mov             dword ptr[ebp],edi
02425 SkipPixie:
02426                 add             pZBufferPtr,4
02427                 dec             [widTemp]
02428 
02429                 jnz             PixieLoop
02430 
02431                 pop             ebp
02432 
02433                 fstp    [u16]
02434                 fstp    [v16]
02435                 fstp    [u16]
02436                 fstp    [v16]
02437                 fstp    [u16]
02438                 fstp    [v16]
02439 
02440 GouraudReturnNoZ:
02441                 pop             edi
02442                 pop             esi
02443                 pop             ecx
02444                 pop             ebx
02445         }
02446 }
02447 
02448 void    DrawScanLineGouraudNoZBufferZWriteTrans_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
02449 {
02450         TDest   =Dest;
02451         Red             =Green  =0;
02452         _asm
02453         {
02454                 push    ebx
02455                 push    ecx
02456                 push    esi
02457                 push    edi
02458 
02459                 mov             ebx,pLeft
02460                 mov     ecx,pRight
02461                 mov     eax,[ebx]EdgeAsmFPU.X
02462                 mov     edx,[ecx]EdgeAsmFPU.X
02463                 sub     edx,eax
02464                 jle             GouraudReturnNoZ
02465 
02466                 mov             esi,eax
02467                 inc             edx
02468                 shl             eax,1
02469                 add             TDest,eax
02470                 add             pZBufferPtr,eax
02471                 test    esi,1           //dword align left
02472                 jz              NoSinglePixie
02473 
02474                 //odd sized spans write one pixel to dword align
02475                 fld     dword ptr [ebx]EdgeAsmFPU.u             ; UL
02476                 fmul    [Real65536]                                             ; UL16
02477                 fld     dword ptr [ebx]EdgeAsmFPU.v             ; VL   UL16
02478                 fmul    [Real65536]                                             ; VL16 UL16
02479                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   VL16 UL16
02480                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   RL   VL16 UL16
02481                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL   GL   RL   VL16 UL16
02482                 fxch    st(4)                                                   ; UL16 GL   RL   VL16 BL
02483                 fistp   [u16]                                                   ; GL   RL   VL16 BL
02484                 fxch    st(2)                                                   ; VL16 RL   GL   BL
02485                 fistp   [v16]                                                   ; RL   GL   BL
02486                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z    RL   GL   BL
02487                 fistp   [z16]                                                   ; RL   GL   BL
02488 
02489                 mov     [widTemp],edx
02490 
02491                 mov             ecx,[VShift]
02492                 mov             ebx,[GHMaskShifted]
02493 
02494                 mov             esi,[GWMask]
02495                 mov             edi,[v16]
02496 
02497                 mov             edx,dword ptr[u16]
02498 
02499                 shr             edi,cl
02500 
02501                 shr             edx,16
02502                 xor             eax,eax
02503 
02504                 and             edi,ebx
02505                 and             edx,esi
02506 
02507                 add             edi,edx
02508 
02509                 add             edi,GBitPtrHalf
02510                 mov             ax,word ptr[edi*2]
02511 
02512                 mov             word ptr[TempPix],ax
02513 
02514                 mov             ebx,eax
02515                 and             eax,REDMASK2
02516 
02517                 mov             ecx,ebx
02518                 and             ebx,GREENMASK2
02519 
02520                 mov             dword ptr[Red],eax
02521                 and             ecx,BLUEMASK2
02522 
02523                 mov             dword ptr[Green],ebx
02524                 mov             dword ptr[Blue],ecx
02525 
02526                 fimul   dword ptr[Red]                                  ; R    GL   BL
02527                 fxch    st(1)                                                   ; GL   R    BL
02528                 fimul   dword ptr[Green]                                ; G    R    BL
02529                 fxch    st(1)                                                   ; R    G    BL
02530                 fadd    qword ptr[Magic]                                ; Rk   G    BL
02531                 fxch    st(2)                                                   ; BL   G    Rk
02532                 fimul   [Blue]                                                  ; B    G    Rk
02533                 fxch    st(1)                                                   ; G    B    Rk
02534                 fadd    qword ptr[Magic]                                ; Gk   B    Rk
02535                 fxch    st(2)                                                   ; Rk   B    Gk
02536                 fstp    qword ptr[Bucket]                               ; B    Gk
02537                 fadd    qword ptr[Magic]                                ; Bk   Gk
02538                 fxch    st(1)                                                   ; Gk   Bk
02539                 fstp    qword ptr[Bucket2]                              ; Bk
02540 
02541                 mov             edx,dword ptr[Bucket]
02542                 mov             eax,dword ptr[Bucket2]
02543 
02544                 and             edx,REDMASK2
02545                 and             eax,GREENMASK2
02546 
02547                 fstp    qword ptr[Bucket]
02548 
02549                 mov             ecx,TDest
02550                 mov             ebx,dword ptr[Bucket]
02551 
02552                 mov             esi,[z16]
02553                 and             ebx,BLUEMASK2
02554 
02555                 shr             esi,16
02556                 or              edx,eax
02557 
02558                 mov             eax,pZBufferPtr
02559                 add             TDest,2
02560 
02561                 cmp             word ptr[TempPix],01h
02562                 je              SkipSinglePixie
02563 
02564                 or              edx,ebx
02565                 mov             word ptr[eax],si
02566 
02567                 mov             word ptr[ecx],dx
02568 
02569 SkipSinglePixie:
02570                 mov             ebx,pLeft
02571                 mov     edx,[widTemp]
02572                 add             pZBufferPtr,2
02573                 mov     ecx,pRight
02574                 dec             edx
02575                 jz              GouraudReturnNoZ
02576                 mov             esi,edx
02577                 and             esi,1
02578                 sub             edx,esi
02579                 jz              GouraudReturnNoZ
02580 
02581 NoSinglePixie:
02582                 mov     [widTemp],edx                 ; just for a temp
02583                 shr             edx,1
02584 
02585                 ; try to keep fmul fxch pairs seperated to avoid stalling
02586                 ; calc this scanlines steps           ; FPU Stack
02587                                                       ; st0  st1  st2  st3  st4  st5  st6  st7
02588                 fild    dword ptr [widTemp]           ; WID
02589 
02590                 mov     [widTemp],edx                 ; Color interps doubled
02591 
02592                 fld     dword ptr [ecx]EdgeAsmFPU.u ; UR   WID
02593                 fld     dword ptr [ebx]EdgeAsmFPU.u ; UL   UR   WID
02594                 fsub    st(1), st                   ; UL   UD   WID
02595                 fld     dword ptr [ecx]EdgeAsmFPU.v ; VR   UL   UD   WID
02596                 fxch    st(1)                       ; UL   VR   UD   WID
02597                 fmul    [Real65536]                 ; UL16 VR   UD   WID
02598                 fld     dword ptr [ebx]EdgeAsmFPU.v ; VL   UL16 VR   UD   WID
02599                 fsub    st(2), st                   ; VL   UL16 VD   UD   WID
02600                 fild    dword ptr [ecx]EdgeAsmFPU.R ; RR   VL   UL16 VD   UD   WID
02601                 fxch    st(3)                       ; VD   VL   UL16 RR   UD   WID
02602                 fmul    [Real65536]                 ; VD16 VL   UL16 RR   UD   WID
02603                 fild    dword ptr [ebx]EdgeAsmFPU.R ; RL   VD16 VL   UL16 RR   UD   WID
02604                 fsub    st(4),st                    ; RL   VD16 VL   UL16 RD   UD   WID
02605                 fxch    st(5)                       ; UD   VD16 VL   UL16 RD   RL   WID
02606                 fmul    [Real65536]                 ; UD16 VD16 VL   UL16 RD   RL   WID
02607                 fxch    st(2)                                           ; VL   VD16 UD16 UL16 RD   RL   WID
02608                 fmul    [Real65536]                 ; VL16 VD16 UD16 UL16 RD   RL   WID
02609                 fxch    st(3)                                           ; UL16 VD16 UD16 VL16 RD   RL   WID
02610                 fistp   [u16]                                           ; VD16 UD16 VL16 RD   RL   WID
02611                 fxch    st(2)                                           ; VL16 UD16 VD16 RD   RL   WID
02612                 fistp   [v16]                                           ; UD16 VD16 RD   RL   WID
02613                 fld1                                                            ; 1    UD16 VD16 RD   RL   WID
02614                 fdivrp  st(5),st                                        ; UD16 VD16 RD   RL   DWID
02615 
02616                 //let that cook
02617 
02618                 fmul    st,st(4)                                                ; USTP VD16 RD   RL   DWID
02619                 fild    [ecx]EdgeAsmFPU.G                               ; RG   USTP VD16 RD   RL   DWID
02620                 fild    [ebx]EdgeAsmFPU.G                               ; LG   RG   USTP VD16 RD   RL   DWID
02621                 fsub    st(1),st                                                ; LG   GD   USTP VD16 RD   RL   DWID
02622                 fxch    st(2)                                                   ; USTP GD   LG   VD16 RD   RL   DWID
02623                 fistp   [UStep]                                                 ; GD   LG   VD16 RD   RL   DWID
02624                 fild    [ecx]EdgeAsmFPU.B                               ; RB   GD   LG   VD16 RD   RL   DWID
02625                 fild    [ebx]EdgeAsmFPU.B                               ; LB   RB   GD   LG   VD16 RD   RL   DWID
02626                 fsub    st(1),st                                                ; LB   BD   GD   LG   VD16 RD   RL   DWID
02627                 fxch    st(4)                                                   ; VD16 BD   GD   LG   LB   RD   RL   DWID
02628                 fmul    st,st(7)                                                ; VSTP BD   GD   LG   LB   RD   RL   DWID
02629                 fxch    st(7)                                                   ; DWID BD   GD   LG   LB   RD   RL   VSTP
02630                 fmul    dword ptr[Two]                                  ; DW2  BD   GD   LG   LB   RD   RL   VSTP
02631                 fxch    st(7)                                                   ; VSTP BD   GD   LG   LB   RD   RL   DW2
02632                 fxch    st(5)                                                   ; RD   BD   GD   LG   LB   VSTP RL   DW2
02633                 fmul    st,st(7)                                                ; RI   BD   GD   LG   LB   VSTP RL   DW2
02634                 frndint
02635                 fxch    st(2)                                                   ; GD   BD   RI   LG   LB   VSTP RL   DW2
02636                 fmul    st,st(7)                                                ; GI   BD   RI   LG   LB   VSTP RL   DW2
02637                 frndint
02638                 fxch    st(1)                                                   ; BD   GI   RI   LG   LB   VSTP RL   DW2
02639                 fmul    st,st(7)                                                ; BD   GI   RI   LG   LB   VSTP RL   DW2
02640                 frndint
02641                 fxch    st(5)                                                   ; VSTP GI   RI   LG   LB   BD   RL   DW2
02642                 fistp   [VStep]                                                 ; GI   RI   LG   LB   BD   RL   DW2
02643                 fld             [ecx]EdgeAsmFPU.z                               ; rz   GI   RI   LG   LB   BD   RL   DW2
02644                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   GI   RI   LG   LB   BD   RL   DW2
02645                 fxch    st(7)                                                   ; DW2  GI   RI   LG   LB   BD   RL   zd
02646                 fmulp   st(7),st                                                ; GI   RI   LG   LB   BD   RL   zd
02647                 fld             [ebx]EdgeAsmFPU.z                               ; lz   GI   RI   LG   LB   BD   RL   zd
02648                 fxch    st(7)                                                   ; zd   GI   RI   LG   LB   BD   RL   lz
02649                 fistp   [ZStep]                                                 ; GI   RI   LG   LB   BD   RL   lz
02650                 fxch    st(6)                                                   ; lz   RI   LG   LB   BD   RL   GI
02651                 fistp   [z16]                                                   ; RI   LG   LB   BD   RL   GI
02652 
02653                 push    ebp
02654 
02655 PixieLoop:
02656                 mov             ebx,[ZStep]
02657 
02658                 add             [z16],ebx
02659                 mov             ecx,[VShift]
02660 
02661                 mov             edi,[z16]
02662 
02663                 shr             edi,16
02664                 mov             ebx,[GHMaskShifted]
02665 
02666                 mov             ebp,[GWMask]
02667                 mov             edx,dword ptr[u16]
02668 
02669                 mov             word ptr[Z32],di
02670                 mov             eax,edx
02671 
02672                 shr             edx,16
02673                 mov             edi,[v16]
02674 
02675                 add             eax,[UStep]
02676                 mov             esi,edi
02677 
02678                 shr             edi,cl
02679                 add             esi,[VStep]
02680 
02681                 and             edi,ebx
02682                 and             edx,ebp
02683 
02684                 add             edi,edx
02685                 mov             edx,eax
02686 
02687                 add             edi,GBitPtrHalf
02688                 add             eax,[UStep]
02689 
02690                 mov             [u16],eax
02691                 mov             ax,word ptr[edi*2]
02692 
02693                 mov             edi,esi
02694                 add             esi,[VStep]
02695 
02696                 shr             edx,16
02697                 mov             [v16],esi
02698 
02699                 shr             edi,cl
02700                 and             edx,ebp
02701 
02702                 mov             esi,GBitPtrHalf
02703                 and             edi,ebx
02704 
02705                 shl             eax,16
02706                 add             esi,edx
02707 
02708                 add             esi,edi
02709 
02710                 mov             ax,word ptr[esi*2]
02711 
02712                 mov             [TempPix],eax
02713 
02714                 mov             ebx,eax
02715                 and             eax,REDMASK2
02716 
02717                 mov             ecx,ebx
02718                 and             ebx,GREENMASK2
02719 
02720                 mov             dword ptr[Red],eax
02721                 and             ecx,BLUEMASK2
02722 
02723                 mov             dword ptr[Green],ebx
02724                 mov             dword ptr[Blue],ecx
02725 
02726                 fild    qword ptr[Red]                                  ; r    RI   LG   LB   BI   RL   GI
02727                 fmul    st,st(5)                                                ; R    RI   LG   LB   BI   RL   GI
02728                 fild    qword ptr[Green]                                ; g    R    RI   LG   LB   BI   RL   GI
02729                 fmul    st,st(3)                                                ; G    R    RI   LG   LB   BI   RL   GI
02730                 fxch    st(6)                                                   ; RL   R    RI   LG   LB   BI   G    GI
02731                 fadd    st,st(2)                                                ; RL2  R    RI   LG   LB   BI   G    GI
02732                 fxch    st(3)                                                   ; LG   R    RI   RL2  LB   BI   G    GI
02733                 fadd    st,st(7)                                                ; LG2  R    RI   RL2  LB   BI   G    GI
02734                 fxch    st(6)                                                   ; G    R    RI   RL2  LB   BI   LG2  GI
02735                 fadd    qword ptr[Magic]                                ; Gk   R    RI   RL2  LB   BI   LG2  GI
02736                 fxch    st(1)                                                   ; R    Gk   RI   RL2  LB   BI   LG2  GI
02737                 fadd    qword ptr[Magic]                                ; Rk   Gk   RI   RL2  LB   BI   LG2  GI
02738                 fxch    st(1)                                                   ; Gk   Rk   RI   RL2  LB   BI   LG2  GI
02739                 fstp    qword ptr[Bucket]                               ; Rk   RI   RL2  LB   BI   LG2  GI
02740                 fstp    qword ptr[Bucket2]                              ; RI   RL2  LB   BI   LG2  GI
02741 
02742                 mov             edx,dword ptr[Bucket]
02743                 mov             eax,dword ptr[Bucket2]
02744 
02745                 fild    dword ptr[Blue]                                 ; b    RI   RL2  LB   BI   LG2  GI
02746                 fmul    st,st(3)                                                ; B    RI   RL2  LB   BI   LG2  GI
02747                 fxch    st(3)                                                   ; LB   RI   RL2  B    BI   LG2  GI
02748                 fadd    st,st(4)                                                ; LB2  RI   RL2  B    BI   LG2  GI
02749                 fxch    st(3)                                                   ; B    RI   RL2  LB2  BI   LG2  GI
02750                 fadd    qword ptr[Magic]                                ; Bk   RI   RL2  LB2  BI   LG2  GI
02751 
02752                 and             edx,GREENMASK2
02753                 and             eax,REDMASK2
02754 
02755                 fstp    qword ptr[Bucket]                               ; RI   RL2  LB2  BI   LG2  GI
02756                 fstp    qword ptr[Bucket2]                              ; RL2  LB2  BI   LG2  GI
02757 
02758                 mov             edi,edx
02759                 mov             ebx,dword ptr[Bucket]
02760                 or              edi,eax
02761                 mov             ebp,TDest
02762                 and             ebx,BLUEMASK2
02763 
02764                 fxch    st(3)                                                   ; LG2  LB2  BI   RL2  GI
02765                 fld             qword ptr[Bucket2]                              ; RI   LG2  LB2  BI   RL2  GI
02766 
02767                 mov             si,word ptr[Z32]
02768                 add             TDest,4
02769 
02770                 mov             ecx,pZBufferPtr
02771                 or              edi,ebx
02772 
02773                 cmp             [TempPix],010001h
02774                 je              SkipPixie
02775 
02776                 mov             [ecx],si
02777                 rol             edi,16
02778 
02779                 mov             dword ptr[ebp],edi
02780                 mov             [ecx+2],si
02781 SkipPixie:
02782                 add             pZBufferPtr,4
02783                 dec             [widTemp]
02784 
02785                 jnz             PixieLoop
02786 
02787                 pop             ebp
02788 
02789                 fstp    [u16]
02790                 fstp    [v16]
02791                 fstp    [u16]
02792                 fstp    [v16]
02793                 fstp    [u16]
02794                 fstp    [v16]
02795 
02796 GouraudReturnNoZ:
02797                 pop             edi
02798                 pop             esi
02799                 pop             ecx
02800                 pop             ebx
02801         }
02802 }
02803 
02804 void    DrawScanLineGouraudNoZSolid_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
02805 {
02806         TDest   =Dest;
02807         Red             =Green  =0;
02808         _asm
02809         {
02810                 push    ebx
02811                 push    ecx
02812                 push    esi
02813                 push    edi
02814 
02815                 mov             ebx,pLeft
02816                 mov     ecx,pRight
02817                 mov     eax,[ebx]EdgeAsmFPU.X
02818                 mov     edx,[ecx]EdgeAsmFPU.X
02819                 sub     edx,eax
02820                 jle             GouraudReturnNoZ
02821 
02822                 mov             esi,eax
02823                 inc             edx
02824                 shl             eax,1
02825                 add             TDest,eax
02826                 test    esi,1                                   //dword align left side
02827                 jz              NoSinglePixie
02828 
02829                 //odd sized spans write one pixel to dword align
02830                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
02831                 fmul    dword ptr[BlueMask]
02832                 fadd    qword ptr[Magic]                                ; Bk
02833                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
02834                 fmul    dword ptr[GreenMask2]
02835                 fadd    qword ptr[Magic]                                ; Gk   Bk
02836                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
02837                 fmul    dword ptr[MiniRedMask2]
02838                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
02839                 fxch    st(2)                                                   ; Bk   Gk   Rk
02840                 fstp    qword ptr[Bucket]                               ; Gk   Rk
02841                 fstp    qword ptr[Bucket2]                              ; Rk
02842 
02843                 mov             esi,dword ptr[Bucket]
02844                 mov             eax,dword ptr[Bucket2]
02845 
02846                 and             esi,BLUEMASK2
02847                 and             eax,GREENMASK2
02848 
02849                 fstp    qword ptr[Bucket]
02850 
02851                 mov             ecx,TDest
02852                 mov             ebx,dword ptr[Bucket]
02853 
02854                 and             ebx,REDMASK2
02855                 or              esi,eax
02856 
02857                 add             TDest,2
02858                 or              esi,ebx
02859 
02860                 mov             ebx,pLeft
02861                 mov             word ptr[ecx],si
02862 
02863                 mov             ecx,pRight
02864                 dec             edx
02865 
02866                 jz              GouraudReturnNoZ
02867                 mov             esi,edx
02868                 and             esi,1
02869                 sub             edx,esi
02870                 jz              GouraudReturnNoZ
02871 
02872 NoSinglePixie:
02873                 shr             edx,1
02874                 fld1
02875                 mov     [widTemp],edx                 ; just for a temp
02876                 
02877 
02878                 ; try to keep fmul fxch pairs seperated to avoid stalling
02879                 ; calc this scanlines steps                             ; FPU Stack
02880                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
02881                 fidiv   dword ptr [widTemp]                             ; WID
02882                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
02883                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
02884                 fsub    st(1),st                                                ; RL   RD   WID
02885                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
02886                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
02887                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
02888                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
02889                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
02890                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
02891                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
02892                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
02893                 frndint
02894                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
02895                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
02896                 frndint
02897                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
02898                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
02899                 frndint
02900                 fld             qword ptr[RedMask2]                             ; rm   BI   GL   RI   RL   BL   GI
02901                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
02902                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
02903                 fld             dword ptr[GreenMask2]                   ; gm   BI   GL   RI   RL   BL   GI
02904                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
02905                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
02906                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
02907                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
02908                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
02909 
02910 PixieLoop:
02911 
02912                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
02913                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
02914                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
02915                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
02916                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
02917                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
02918                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
02919                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
02920                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
02921 
02922                 mov             ecx,dword ptr[Bucket]
02923                 mov             eax,dword ptr[Bucket2]
02924 
02925                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
02926                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
02927 
02928                 and             ecx,REDMASK2
02929                 and             eax,GREENMASK2
02930 
02931                 mov             ebx,dword ptr[Bucket]
02932                 or              ecx,eax
02933 
02934                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
02935                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
02936                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
02937                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
02938                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
02939                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
02940 
02941                 and             ebx,BLUEMASK2
02942                 mov             edi,TDest
02943 
02944                 or              ecx,ebx
02945                 add             TDest,4
02946 
02947                 rol             ecx,16
02948 
02949                 mov             [edi],ecx
02950                 dec             edx
02951 
02952                 jnz             PixieLoop
02953 
02954 
02955                 fstp    [u16]
02956                 fstp    [v16]
02957                 fstp    [u16]
02958                 fstp    [v16]
02959                 fstp    [u16]
02960                 fstp    [v16]
02961 
02962 GouraudReturnNoZ:
02963                 pop             edi
02964                 pop             esi
02965                 pop             ecx
02966                 pop             ebx
02967         }
02968 }
02969 
02970 void    DrawScanLineGouraudNoZBufferZWriteSolid_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
02971 {
02972         TDest   =Dest;
02973         Red             =Green  =0;
02974         _asm
02975         {
02976                 push    ebx
02977                 push    ecx
02978                 push    esi
02979                 push    edi
02980 
02981                 mov             ebx,pLeft
02982                 mov     ecx,pRight
02983                 mov     eax,[ebx]EdgeAsmFPU.X
02984                 mov     edx,[ecx]EdgeAsmFPU.X
02985                 sub     edx,eax
02986                 jle             GouraudReturnNoZ
02987 
02988                 mov             esi,eax
02989                 inc             edx
02990                 shl             eax,1
02991                 add             TDest,eax
02992                 add             pZBufferPtr,eax
02993                 test    esi,1                                   //dword align left side
02994                 jz              NoSinglePixie
02995 
02996                 //odd sized spans write one pixel to dword align
02997                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
02998                 fmul    dword ptr[BlueMask]
02999                 fadd    qword ptr[Magic]                                ; Bk
03000                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
03001                 fmul    dword ptr[GreenMask2]
03002                 fadd    qword ptr[Magic]                                ; Gk   Bk
03003                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
03004                 fmul    dword ptr[MiniRedMask2]
03005                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
03006                 fxch    st(2)                                                   ; Bk   Gk   Rk
03007                 fstp    qword ptr[Bucket]                               ; Gk   Rk
03008                 fstp    qword ptr[Bucket2]                              ; Rk
03009                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z
03010                 fistp   [z16]                                                   ;
03011 
03012                 mov             esi,dword ptr[Bucket]
03013                 mov             eax,dword ptr[Bucket2]
03014 
03015                 and             esi,BLUEMASK2
03016                 and             eax,GREENMASK2
03017 
03018                 fstp    qword ptr[Bucket]
03019 
03020                 mov             ecx,TDest
03021                 mov             ebx,dword ptr[Bucket]
03022 
03023                 and             ebx,REDMASK2
03024                 or              esi,eax
03025 
03026                 mov             edi,[z16]
03027                 mov             eax,pZBufferPtr
03028 
03029                 add             TDest,2
03030                 or              esi,ebx
03031 
03032                 shr             edi,16
03033                 mov             ebx,pLeft
03034 
03035                 mov             word ptr[eax],di
03036                 mov             word ptr[ecx],si
03037 
03038                 mov             ecx,pRight
03039                 dec             edx
03040 
03041                 jz              GouraudReturnNoZ
03042                 mov             esi,edx
03043                 add             pZBufferPtr,2
03044                 and             esi,1
03045                 sub             edx,esi
03046                 jz              GouraudReturnNoZ
03047 
03048 NoSinglePixie:
03049                 shr             edx,1
03050                 fld1
03051                 mov     [widTemp],edx                 ; just for a temp
03052                 
03053 
03054                 ; try to keep fmul fxch pairs seperated to avoid stalling
03055                 ; calc this scanlines steps                             ; FPU Stack
03056                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
03057                 fidiv   dword ptr [widTemp]                             ; WID
03058                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
03059                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
03060                 fsub    st(1),st                                                ; RL   RD   WID
03061                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
03062                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
03063                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
03064                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
03065                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
03066                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
03067                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
03068                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
03069                 frndint
03070                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
03071                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
03072                 frndint
03073                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
03074                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
03075                 frndint
03076                 fld             qword ptr[RedMask2]                             ; rm   BI   GL   RI   RL   BL   GI
03077                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
03078                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
03079                 fld             dword ptr[GreenMask2]                   ; gm   BI   GL   RI   RL   BL   GI
03080                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
03081                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
03082                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
03083                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
03084                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
03085                 fld             [ecx]EdgeAsmFPU.z                               ; rz   BI   GL   RI   RL   BL   GI
03086                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   BI   GL   RI   RL   BL   GI
03087                 fld             [ebx]EdgeAsmFPU.z                               ; lz   zd   BI   GL   RI   RL   BL   GI
03088                 fistp   [z16]                                                   ; zd   BI   GL   RI   RL   BL   GI
03089                 fistp   [ZStep]                                                 ; BI   GL   RI   RL   BL   GI
03090 
03091 PixieLoop:
03092 
03093                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
03094                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
03095                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
03096                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
03097                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
03098                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
03099 
03100                 mov             edi,[z16]
03101                 mov             esi,pZBufferPtr
03102 
03103                 shr             edi,16
03104                 mov             ebx,[ZStep]
03105 
03106                 mov             word ptr[esi],di
03107                 add             [z16],ebx
03108 
03109                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
03110                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
03111                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
03112 
03113                 mov             word ptr[esi+2],di
03114 
03115                 mov             ecx,dword ptr[Bucket]
03116                 mov             eax,dword ptr[Bucket2]
03117 
03118                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
03119                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
03120 
03121                 and             ecx,REDMASK2
03122                 and             eax,GREENMASK2
03123 
03124                 mov             ebx,dword ptr[Bucket]
03125                 or              ecx,eax
03126 
03127                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
03128                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
03129                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
03130                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
03131                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
03132                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
03133 
03134                 and             ebx,BLUEMASK2
03135                 mov             edi,TDest
03136 
03137                 or              ecx,ebx
03138                 add             TDest,4
03139 
03140                 rol             ecx,16
03141 
03142                 mov             [edi],ecx
03143 
03144                 add             pZBufferPtr,4
03145 
03146                 dec             edx
03147 
03148                 jnz             PixieLoop
03149 
03150 
03151                 fstp    [u16]
03152                 fstp    [v16]
03153                 fstp    [u16]
03154                 fstp    [v16]
03155                 fstp    [u16]
03156                 fstp    [v16]
03157 
03158 GouraudReturnNoZ:
03159                 pop             edi
03160                 pop             esi
03161                 pop             ecx
03162                 pop             ebx
03163         }
03164 }
03165 
03166 void    DrawScanLineGouraudZBufferSolid_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
03167 {
03168         TDest   =Dest;
03169         Red             =Green  =0;
03170         _asm
03171         {
03172                 push    ebx
03173                 push    ecx
03174                 push    esi
03175                 push    edi
03176 
03177                 mov             ebx,pLeft
03178                 mov     ecx,pRight
03179                 mov     eax,[ebx]EdgeAsmFPU.X
03180                 mov     edx,[ecx]EdgeAsmFPU.X
03181                 sub     edx,eax
03182                 jle             GouraudReturnNoZ
03183 
03184                 mov             esi,eax
03185                 inc             edx
03186                 shl             eax,1
03187                 add             TDest,eax
03188                 add             pZBufferPtr,eax
03189                 test    esi,1                                   //dword align left side
03190                 jz              NoSinglePixie
03191 
03192                 //odd sized spans write one pixel to dword align
03193                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
03194                 fmul    dword ptr[BlueMask]
03195                 fadd    qword ptr[Magic]                                ; Bk
03196                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
03197                 fmul    dword ptr[GreenMask2]
03198                 fadd    qword ptr[Magic]                                ; Gk   Bk
03199                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
03200                 fmul    dword ptr[MiniRedMask2]
03201                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
03202                 fxch    st(2)                                                   ; Bk   Gk   Rk
03203                 fstp    qword ptr[Bucket]                               ; Gk   Rk
03204                 fstp    qword ptr[Bucket2]                              ; Rk
03205                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z
03206                 fistp   [z16]                                                   ;
03207 
03208                 mov             esi,dword ptr[Bucket]
03209                 mov             eax,dword ptr[Bucket2]
03210 
03211                 and             esi,BLUEMASK2
03212                 and             eax,GREENMASK2
03213 
03214                 fstp    qword ptr[Bucket]
03215 
03216                 mov             ecx,TDest
03217                 mov             ebx,dword ptr[Bucket]
03218 
03219                 and             ebx,REDMASK2
03220                 or              esi,eax
03221 
03222                 mov             edi,[z16]
03223                 mov             eax,pZBufferPtr
03224 
03225                 add             TDest,2
03226                 or              esi,ebx
03227 
03228                 shr             edi,16
03229                 mov             ebx,pLeft
03230 
03231                 cmp             word ptr[eax],di
03232                 jg              SkipSinglePixie
03233 
03234                 mov             word ptr[eax],di
03235                 mov             word ptr[ecx],si
03236 
03237 SkipSinglePixie:
03238                 mov             ecx,pRight
03239                 add             pZBufferPtr,2
03240                 dec             edx
03241 
03242                 jz              GouraudReturnNoZ
03243                 mov             esi,edx
03244                 and             esi,1
03245                 sub             edx,esi
03246                 jz              GouraudReturnNoZ
03247 
03248 NoSinglePixie:
03249                 shr             edx,1
03250                 fld1
03251                 mov     [widTemp],edx                 ; just for a temp
03252                 
03253 
03254                 ; try to keep fmul fxch pairs seperated to avoid stalling
03255                 ; calc this scanlines steps                             ; FPU Stack
03256                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
03257                 fidiv   dword ptr [widTemp]                             ; WID
03258                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
03259                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
03260                 fsub    st(1),st                                                ; RL   RD   WID
03261                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
03262                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
03263                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
03264                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
03265                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
03266                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
03267                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
03268                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
03269                 frndint
03270                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
03271                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
03272                 frndint
03273                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
03274                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
03275                 frndint
03276                 fld             qword ptr[RedMask2]                             ; rm   BI   GL   RI   RL   BL   GI
03277                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
03278                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
03279                 fld             dword ptr[GreenMask2]                   ; gm   BI   GL   RI   RL   BL   GI
03280                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
03281                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
03282                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
03283                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
03284                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
03285                 fld             [ecx]EdgeAsmFPU.z                               ; rz   BI   GL   RI   RL   BL   GI
03286                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   BI   GL   RI   RL   BL   GI
03287                 fld             [ebx]EdgeAsmFPU.z                               ; lz   zd   BI   GL   RI   RL   BL   GI
03288                 fistp   [z16]                                                   ; zd   BI   GL   RI   RL   BL   GI
03289                 fistp   [ZStep]                                                 ; BI   GL   RI   RL   BL   GI
03290 
03291 PixieLoop:
03292 
03293                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
03294                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
03295                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
03296                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
03297                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
03298                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
03299                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
03300                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
03301                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
03302 
03303                 mov             ecx,dword ptr[Bucket]
03304                 mov             eax,dword ptr[Bucket2]
03305 
03306                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
03307                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
03308 
03309                 and             ecx,REDMASK2
03310                 and             eax,GREENMASK2
03311 
03312                 mov             ebx,dword ptr[Bucket]
03313                 or              ecx,eax
03314 
03315                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
03316                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
03317                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
03318                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
03319                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
03320                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
03321 
03322                 and             ebx,BLUEMASK2
03323                 mov             edi,TDest
03324 
03325                 or              ecx,ebx
03326                 add             TDest,4
03327 
03328                 mov             eax,[z16]
03329                 mov             esi,pZBufferPtr
03330 
03331                 shr             eax,16
03332                 mov             ebx,[ZStep]
03333 
03334                 cmp             word ptr[esi],ax
03335                 jg              SkipPixie
03336 
03337                 mov             word ptr[esi],ax
03338                 rol             ecx,16
03339 
03340                 add             [z16],ebx
03341                 mov             word ptr[esi+2],ax
03342 
03343                 mov             [edi],ecx
03344 SkipPixie:
03345                 add             pZBufferPtr,4
03346                 dec             edx
03347 
03348                 jnz             PixieLoop
03349 
03350 
03351                 fstp    [u16]
03352                 fstp    [v16]
03353                 fstp    [u16]
03354                 fstp    [v16]
03355                 fstp    [u16]
03356                 fstp    [v16]
03357 
03358 GouraudReturnNoZ:
03359                 pop             edi
03360                 pop             esi
03361                 pop             ecx
03362                 pop             ebx
03363         }
03364 }
03365 
03366 void    DrawScanLineGouraudZBufferNoZWriteSolid_Asm555X86FPU(EdgeAsmFPU *pLeft, EdgeAsmFPU *pRight)
03367 {
03368         TDest   =Dest;
03369         Red             =Green  =0;
03370         _asm
03371         {
03372                 push    ebx
03373                 push    ecx
03374                 push    esi
03375                 push    edi
03376 
03377                 mov             ebx,pLeft
03378                 mov     ecx,pRight
03379                 mov     eax,[ebx]EdgeAsmFPU.X
03380                 mov     edx,[ecx]EdgeAsmFPU.X
03381                 sub     edx,eax
03382                 jle             GouraudReturnNoZ
03383 
03384                 mov             esi,eax
03385                 inc             edx
03386                 shl             eax,1
03387                 add             TDest,eax
03388                 add             pZBufferPtr,eax
03389                 test    esi,1                                   //dword align left side
03390                 jz              NoSinglePixie
03391 
03392                 //odd sized spans write one pixel to dword align
03393                 fild    dword ptr [ebx]EdgeAsmFPU.B             ; BL
03394                 fmul    dword ptr[BlueMask]
03395                 fadd    qword ptr[Magic]                                ; Bk
03396                 fild    dword ptr [ebx]EdgeAsmFPU.G             ; GL   Bk
03397                 fmul    dword ptr[GreenMask2]
03398                 fadd    qword ptr[Magic]                                ; Gk   Bk
03399                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   Gk   Bk
03400                 fmul    dword ptr[MiniRedMask2]
03401                 fadd    qword ptr[Magic]                                ; Rk   Gk   Bk
03402                 fxch    st(2)                                                   ; Bk   Gk   Rk
03403                 fstp    qword ptr[Bucket]                               ; Gk   Rk
03404                 fstp    qword ptr[Bucket2]                              ; Rk
03405                 fld             dword ptr[ebx]EdgeAsmFPU.z              ; z
03406                 fistp   [z16]                                                   ;
03407 
03408                 mov             esi,dword ptr[Bucket]
03409                 mov             eax,dword ptr[Bucket2]
03410 
03411                 and             esi,BLUEMASK2
03412                 and             eax,GREENMASK2
03413 
03414                 fstp    qword ptr[Bucket]
03415 
03416                 mov             ecx,TDest
03417                 mov             ebx,dword ptr[Bucket]
03418 
03419                 and             ebx,REDMASK2
03420                 or              esi,eax
03421 
03422                 mov             edi,[z16]
03423                 mov             eax,pZBufferPtr
03424 
03425                 add             TDest,2
03426                 or              esi,ebx
03427 
03428                 shr             edi,16
03429                 mov             ebx,pLeft
03430 
03431                 cmp             word ptr[eax],di
03432                 jg              SkipSinglePixie
03433 
03434                 mov             word ptr[ecx],si
03435 
03436 SkipSinglePixie:
03437                 mov             ecx,pRight
03438                 add             pZBufferPtr,2
03439                 dec             edx
03440 
03441                 jz              GouraudReturnNoZ
03442                 mov             esi,edx
03443                 and             esi,1
03444                 sub             edx,esi
03445                 jz              GouraudReturnNoZ
03446 
03447 NoSinglePixie:
03448                 shr             edx,1
03449                 fld1
03450                 mov     [widTemp],edx                 ; just for a temp
03451                 
03452 
03453                 ; try to keep fmul fxch pairs seperated to avoid stalling
03454                 ; calc this scanlines steps                             ; FPU Stack
03455                                                                                                 ; st0  st1  st2  st3  st4  st5  st6  st7
03456                 fidiv   dword ptr [widTemp]                             ; WID
03457                 fild    dword ptr [ecx]EdgeAsmFPU.R             ; RR   WID
03458                 fild    dword ptr [ebx]EdgeAsmFPU.R             ; RL   RR   WID
03459                 fsub    st(1),st                                                ; RL   RD   WID
03460                 fild    [ecx]EdgeAsmFPU.G                               ; GR   RL   RD   WID
03461                 fild    [ebx]EdgeAsmFPU.G                               ; GL   GR   RL   RD   WID
03462                 fsub    st(1),st                                                ; GL   GD   RL   RD   WID
03463                 fild    [ecx]EdgeAsmFPU.B                               ; BR   GL   GD   RL   RD   WID
03464                 fild    [ebx]EdgeAsmFPU.B                               ; BL   BR   GL   GD   RL   RD   WID
03465                 fsub    st(1),st                                                ; BL   BD   GL   GD   RL   RD   WID
03466                 fxch    st(5)                                                   ; RD   BD   GL   GD   RL   BL   WID
03467                 fmul    st,st(6)                                                ; RI   BD   GL   GD   RL   BL   WID
03468                 frndint
03469                 fxch    st(3)                                                   ; GD   BD   GL   RI   RL   BL   WID
03470                 fmul    st,st(6)                                                ; GI   BD   GL   RI   RL   BL   WID
03471                 frndint
03472                 fxch    st(6)                                                   ; WID  BD   GL   RI   RL   BL   GI
03473                 fmulp   st(1),st                                                ; BI   GL   RI   RL   BL   GI
03474                 frndint
03475                 fld             qword ptr[RedMask2]                             ; rm   BI   GL   RI   RL   BL   GI
03476                 fmul    st(3),st                                                ; rm   BI   GL   RI   RL   BL   GI
03477                 fmulp   st(4),st                                                ; BI   GL   RI   RL   BL   GI
03478                 fld             dword ptr[GreenMask2]                   ; gm   BI   GL   RI   RL   BL   GI
03479                 fmul    st(2),st                                                ; gm   BI   GL   RI   RL   BL   GI
03480                 fmulp   st(6),st                                                ; BI   GL   RI   RL   BL   GI
03481                 fld             dword ptr[BlueMask]                             ; bm   BI   GL   RI   RL   BL   GI
03482                 fmul    st(1),st                                                ; bm   BI   GL   RI   RL   BL   GI
03483                 fmulp   st(5),st                                                ; BI   GL   RI   RL   BL   GI
03484                 fld             [ecx]EdgeAsmFPU.z                               ; rz   BI   GL   RI   RL   BL   GI
03485                 fsub    [ebx]EdgeAsmFPU.z                               ; zd   BI   GL   RI   RL   BL   GI
03486                 fld             [ebx]EdgeAsmFPU.z                               ; lz   zd   BI   GL   RI   RL   BL   GI
03487                 fistp   [z16]                                                   ; zd   BI   GL   RI   RL   BL   GI
03488                 fistp   [ZStep]                                                 ; BI   GL   RI   RL   BL   GI
03489 
03490 PixieLoop:
03491 
03492                 fld             st(3)                                                   ; r    BI   GL   RI   RL   BL   GI
03493                 fadd    qword ptr[Magic]                                ; rk   BI   GL   RI   RL   BL   GI
03494                 fld             st(2)                                                   ; g    rk   BI   GL   RI   RL   BL   GI
03495                 fadd    qword ptr[Magic]                                ; gk   rk   BI   GL   RI   RL   BL   GI
03496                 fxch    st(1)                                                   ; rk   gk   BI   GL   RI   RL   BL   GI
03497                 fstp    qword ptr[Bucket]                               ; gk   BI   GL   RI   RL   BL   GI
03498                 fstp    qword ptr[Bucket2]                              ; BI   GL   RI   RL   BL   GI
03499                 fld             st(4)                                                   ; b    BI   GL   RI   RL   BL   GI
03500                 fadd    qword ptr[Magic]                                ; bk   BI   GL   RI   RL   BL   GI
03501 
03502                 mov             ecx,dword ptr[Bucket]
03503                 mov             eax,dword ptr[Bucket2]
03504 
03505                 fstp    qword ptr[Bucket]                               ; BI   GL   RI   RL   BL   GI
03506                 fadd    st(4),st                                                ; BI   GL   RI   RL   BL2  GI
03507 
03508                 and             ecx,REDMASK2
03509                 and             eax,GREENMASK2
03510 
03511                 mov             ebx,dword ptr[Bucket]
03512                 or              ecx,eax
03513 
03514                 fstp    qword ptr[Bucket]                               ; GL   RI   RL   BL2  GI
03515                 fadd    st,st(4)                                                ; GL2  RI   RL   BL2  GI
03516                 fstp    qword ptr[Bucket2]                              ; RI   RL   BL2  GI
03517                 fadd    st(1),st                                                ; RI   RL2  BL2  GI
03518                 fld             qword ptr[Bucket2]                              ; GL2  RI   RL2  BL2  GI
03519                 fld             qword ptr[Bucket]                               ; BI   GL2  RI   RL2  BL2  GI
03520 
03521                 and             ebx,BLUEMASK2
03522                 mov             edi,TDest
03523 
03524                 or              ecx,ebx
03525                 add             TDest,4
03526 
03527                 mov             eax,[z16]
03528                 mov             esi,pZBufferPtr
03529 
03530                 shr             eax,16
03531                 mov             ebx,[ZStep]
03532 
03533                 cmp             word ptr[esi],ax
03534                 jg              SkipPixie
03535 
03536                 rol             ecx,16
03537                 add             [z16],ebx
03538 
03539                 mov             [edi],ecx
03540 SkipPixie:
03541                 add             pZBufferPtr,4
03542                 dec             edx
03543 
03544                 jnz             PixieLoop
03545 
03546 
03547                 fstp    [u16]
03548                 fstp    [v16]
03549                 fstp    [u16]
03550                 fstp    [v16]
03551                 fstp    [u16]
03552                 fstp    [v16]
03553 
03554 GouraudReturnNoZ:
03555                 pop             edi
03556                 pop             esi
03557                 pop             ecx
03558                 pop             ebx
03559         }
03560 }
03561 
03562 void DrawSpan16_AsmLitZBuffer555X86FPU(int32 x1, int32 x2, int32 y)
03563 {
03564         TDest   =Dest;
03565         _asm
03566         {
03567                 push    ebx
03568                 push    ecx
03569                 push    esi
03570                 push    edi
03571 
03572                 mov             eax,x1
03573                 mov             ecx,x2
03574                 sub             ecx,eax
03575                 jle             Return16
03576 
03577                 mov             edi,[GBitPtr16]
03578                 mov             pTex,edi
03579 
03580                 fild    [y]                                             ; y
03581 
03582                 mov             esi,x1
03583                 mov             edi,[TDest]
03584 
03585                 shl             esi,1
03586                 mov             eax,ecx
03587 
03588                 add             edi,esi
03589                 add             pZBufferPtr,esi
03590 
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 
03623                 //zbuffer step action
03624                 fld             [ZiStepX]
03625                 fmul    dword ptr[ZBufferPrec]
03626                 fmul    dword ptr[Two]
03627                 fistp   dword ptr[ZDelta]
03628 
03629                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
03630                 faddp   st(1),st                                ; VZ   UZ   ZX   y
03631                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
03632                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
03633                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
03634                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
03635 
03636                 //room for two cycles of int instructions here
03637 
03638                 faddp   st(3),st                                ; UZ   VZ   Zi
03639                 fld1                                                    ; 1    UZ   VZ   Zi
03640                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
03641 
03642                 //room for 18 cycles of int instructions here
03643 
03644                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
03645                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
03646                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
03647 
03648                 //zbuffer action
03649                 fld             st
03650                 fmul    dword ptr[ZBufferPrec]
03651                 fistp   dword ptr[ZVal]
03652 
03653                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
03654                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
03655                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
03656                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
03657                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
03658                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
03659                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
03660                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
03661                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
03662 
03663                 //room for 18 cycles of int stuff here
03664 
03665                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
03666                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
03667                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
03668                 //fmul stall one cycle
03669                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
03670 
03671                 test    ecx,ecx
03672                 jz              HandleLeftoverPixels16
03673 
03674 SpanLoop16:
03675                 //need one more stack spot
03676                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
03677                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
03678                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
03679                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
03680                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
03681                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
03682                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
03683                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
03684                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
03685                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
03686 
03687                 mov             ebx,dword ptr[Bucket]
03688                 mov             eax,dword ptr[Bucket2]
03689 
03690                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
03691                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
03692 
03693                 add             ebx,dword ptr[UAdjust]
03694                 add             eax,dword ptr[UAdjustL]
03695 
03696                 mov             [U1],ebx
03697                 mov             [UFixed],eax
03698 
03699                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
03700                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
03701                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
03702                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
03703                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
03704                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
03705                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
03706                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
03707 
03708                 mov             ebx,dword ptr[Bucket]
03709                 mov             eax,dword ptr[Bucket2]
03710 
03711                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
03712 
03713                 add             ebx,dword ptr[VAdjust]
03714                 add             eax,dword ptr[VAdjustL]
03715 
03716                 mov             [V1],ebx
03717                 mov             [VFixed],eax
03718 
03719                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
03720                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
03721                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
03722                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
03723                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
03724                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
03725                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
03726                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
03727                 //gotta do this to get em lined back up right
03728                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
03729                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
03730 
03731                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
03732                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
03733                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
03734                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
03735                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
03736                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
03737                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
03738                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
03739                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
03740                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
03741 
03742                 // Clamp U/V
03743                 mov             ebx,[UFixed]
03744                 cmp             ebx,MaxU
03745                 jle             TryClampU016
03746                 mov             ecx,MaxU
03747                 mov             dword ptr[UFixed],ecx
03748                 jmp             NoClampU016
03749 
03750 TryClampU016:
03751                 cmp             ebx,0
03752                 jge             NoClampU016
03753                 mov             dword ptr[UFixed],0
03754 NoClampU016:
03755                 mov             eax,[VFixed]
03756                 cmp             eax,MaxV
03757                 jle             TryClampV016
03758                 mov             ecx,MaxV
03759                 mov             dword ptr[VFixed],ecx
03760                 jmp             NoClampV016
03761 
03762 TryClampV016:
03763                 cmp             eax,0
03764                 jge             NoClampV016
03765                 mov             dword ptr[VFixed],0
03766 
03767 NoClampV016:
03768 
03769 
03770                 mov esi,dword ptr[UFixed]
03771                 mov eax,dword ptr[VFixed]
03772 
03773 
03774                 mov ecx, GMipLevel4_8
03775                 sar esi, cl
03776                 sar eax, cl
03777                 and esi, 0ffh
03778                 and eax, 0ffh
03779                 mov UDist, esi
03780                 mov VDist, eax
03781 
03782                 mov esi,dword ptr[UFixed]
03783                 mov eax,dword ptr[VFixed]
03784                 mov ecx, GMipLevel20
03785                 shr esi, cl
03786                 shr eax, cl
03787 
03788                 imul eax, GLightWidth
03789                 add esi, eax
03790 
03791                 mov edx, esi
03792                 shl esi, 1
03793                 add edx, esi
03794 
03795                 add edx, GLightData
03796 
03797                 // Interpolate accross top
03798                 xor ecx, ecx
03799                 mov cl, [edx+3]
03800                 mov eax, ecx
03801                 mov cl, [edx+0]
03802                 sub eax, ecx
03803                 imul eax, UDist
03804                 shl ecx, 8
03805                 add eax, ecx
03806                 mov [R1], eax
03807 
03808                 xor ecx, ecx
03809                 mov cl, [edx+4]
03810                 mov eax, ecx
03811                 mov cl, [edx+1]
03812                 sub eax, ecx
03813                 imul eax, UDist
03814                 shl ecx, 8
03815                 add eax, ecx
03816                 mov [G1], eax
03817 
03818                 xor ecx, ecx
03819                 mov cl, [edx+5]
03820                 mov eax, ecx
03821                 mov cl, [edx+2]
03822                 sub eax, ecx
03823                 imul eax, UDist
03824                 shl ecx, 8
03825                 add eax, ecx
03826                 mov [B1], eax
03827 
03828                 add edx, GLightWidth
03829                 add edx, GLightWidth
03830                 add edx, GLightWidth
03831 
03832                 // Interpolate accross bottom
03833                 xor ecx, ecx
03834                 mov cl, [edx+3]
03835                 mov eax, ecx
03836                 mov cl, [edx+0]
03837                 sub eax, ecx
03838                 imul eax, UDist
03839                 shl ecx, 8
03840                 add eax, ecx
03841                 mov [R2], eax
03842 
03843                 xor ecx, ecx
03844                 mov cl, [edx+4]
03845                 mov eax, ecx
03846                 mov cl, [edx+1]
03847                 sub eax, ecx
03848                 imul eax, UDist
03849                 shl ecx, 8
03850                 add eax, ecx
03851                 mov [G2], eax
03852 
03853                 xor ecx, ecx
03854                 mov cl, [edx+5]
03855                 mov eax, ecx
03856                 mov cl, [edx+2]
03857                 sub eax, ecx
03858                 imul eax, UDist
03859                 shl ecx, 8
03860                 add eax, ecx
03861                 mov [B2], eax
03862 
03863                 // Interpolate down
03864                 mov eax, [R2]
03865                 sub eax, [R1]
03866                 imul eax, VDist
03867                 sar eax, 8
03868                 add eax, [R1]
03869                 shr eax, 8
03870                 and     eax,0feh
03871 
03872                 mov [RR1], eax
03873 
03874                 mov eax, [G2]
03875                 sub eax, [G1]
03876                 imul eax, VDist
03877                 sar eax, 8
03878                 add eax, [G1]
03879                 shr eax, 8
03880                 and     eax,0feh
03881 
03882                 mov [GG1], eax
03883 
03884                 mov eax, [B2]
03885                 sub eax, [B1]
03886                 imul eax, VDist
03887                 sar eax, 8
03888                 add eax, [B1]
03889                 shr eax, 8
03890                 and     eax,0feh
03891 
03892                 mov [BB1], eax
03893 
03894                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
03895                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
03896                 fstp    [FTemp2]                                ; VZR  UL   VL
03897                 fstp    [FTemp3]                                ; UL   VL
03898                 fstp    [FTemp4]                                ; VL
03899                 fstp    [FTemp5]                                ; 
03900 
03901                 fild    [RR1]                                   ; LR
03902                 fild    [GG1]                                   ; LG   LR
03903                 fild    [BB1]                                   ; LB   LG   LR
03904                 
03905                 
03906                 mov             ebx,dword ptr[U1]
03907                 mov             eax,dword ptr[V1]
03908 
03909                 add             ebx,dword ptr[UAdjust2]
03910                 add             eax,dword ptr[VAdjust2]
03911 
03912                 mov             ecx,[VShift]
03913                 mov             dword ptr[Bucket],ebx
03914 
03915                 shl             eax,cl
03916 
03917                 push    ebp
03918 
03919                 mov             dword ptr[Bucket2],eax
03920                 mov             ebp,dword ptr[DeltaV]
03921 
03922                 and             eax,[GHMaskShifted16]
03923                 and             ebx,[GWMaskShifted]
03924 
03925                 shl             ebp,cl
03926                 add             eax,ebx
03927 
03928                 mov             edx,dword ptr[Bucket2]
03929                 mov             esi,pTex
03930 
03931                 shr             eax,16
03932                 mov             dword ptr[DeltaV],ebp
03933 
03934                 mov             ebx,dword ptr[Bucket]
03935 
03936                 mov             ax,word ptr[2*eax+esi]
03937                 add             edx,dword ptr[DeltaV]
03938 
03939                 xor             eax,0
03940                 mov             ecx,edx
03941 
03942                 add             ebx,dword ptr[DeltaU]
03943                 and             ecx,[GHMaskShifted16]
03944 
03945                 rol             eax,16
03946                 and             ebx,[GWMaskShifted]
03947 
03948                 xor             eax,0
03949                 add             ecx,ebx
03950 
03951                 add             edx,dword ptr[DeltaV]
03952                 mov             esi,pTex
03953 
03954                 shr             ecx,16
03955                 add             ebx,dword ptr[DeltaU]
03956 
03957                 mov             ax,word ptr[2*ecx+esi]
03958                 mov             ecx,edx
03959 
03960                 xor             eax,0
03961                 and             ecx,[GHMaskShifted16]
03962 
03963                 mov             esi,eax
03964                 mov             ebp,eax
03965 
03966                 and             esi,REDMASK2
03967                 and             ebp,GREENMASK2
03968 
03969                 mov             dword ptr[Red],esi
03970                 mov             dword ptr[Green],ebp
03971 
03972                 fild    qword ptr[Red]                  ; r    LB   LG   LR
03973 
03974                 mov             ebp,eax
03975 
03976                 fmul    st,st(3)                                ; R    LB   LG   LR
03977                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
03978 
03979                 and             ebp,BLUEMASK
03980                 and             ebx,[GWMaskShifted]
03981 
03982                 mov             dword ptr[Blue],ebp
03983 
03984                 fmul    st,st(3)                                ; G    R    LB   LG   LR
03985                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
03986                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
03987                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
03988                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
03989                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
03990                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
03991                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
03992                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
03993                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
03994                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
03995                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
03996 
03997                 mov             eax,dword ptr[Bucket]
03998                 mov             ebp,dword ptr[Bucket2]
03999 
04000                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04001 
04002                 and             eax,REDMASK2
04003                 and             ebp,BLUEMASK
04004                 
04005                 mov             esi,dword ptr[Bucket]
04006                 or              ebp,eax
04007 
04008                 add             ecx,ebx
04009                 and             esi,GREENMASK2
04010 
04011                 shr             ecx,16
04012                 or              ebp,esi
04013 
04014                 xor             eax,0
04015                 mov             esi,pTex
04016 
04017                 rol             ebp,16
04018                 add             edx,dword ptr[DeltaV]
04019 
04020                 mov             ax,word ptr[2*ecx+esi]
04021                 mov             ecx,[ZVal]
04022 
04023                 mov             esi,[ZVal]
04024                 add             ecx,[ZDelta]
04025 
04026                 shr             esi,16
04027                 mov             [ZVal],ecx
04028 
04029                 mov             ecx,pZBufferPtr
04030 
04031                 cmp             si,word ptr[ecx+0]
04032                 jle             Skip0
04033 
04034                 mov             [edi+0],ebp
04035                 mov             word ptr[ecx+0],si
04036                 mov             word ptr[ecx+2],si
04037 
04038 Skip0:
04039                 mov             ecx,edx
04040 
04041                 add             ebx,dword ptr[DeltaU]
04042                 and             ecx,[GHMaskShifted16]
04043 
04044                 and             ebx,[GWMaskShifted]
04045                 xor             eax,0
04046 
04047                 add             ecx,ebx
04048                 mov             esi,pTex
04049 
04050                 rol             eax,16
04051                 add             edx,dword ptr[DeltaV]
04052 
04053                 shr             ecx,16
04054                 add             ebx,dword ptr[DeltaU]
04055 
04056                 mov             ax,word ptr[2*ecx+esi]
04057 
04058                 mov             ecx,edx
04059                 xor             eax,0
04060 
04061                 and             ecx,[GHMaskShifted16]
04062                 mov             esi,eax
04063 
04064                 mov             ebp,eax
04065                 and             esi,REDMASK2
04066 
04067                 and             ebp,GREENMASK2
04068                 mov             dword ptr[Red],esi
04069 
04070                 mov             dword ptr[Green],ebp
04072 
04073 
04074                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04075 
04076                 mov             ebp,eax
04077 
04078                 fmul    st,st(3)                                ; R    LB   LG   LR
04079                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04080 
04081                 and             ebp,BLUEMASK
04082                 and             ebx,[GWMaskShifted]
04083 
04084                 mov             dword ptr[Blue],ebp
04085 
04086                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04087                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04088                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04089                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04090                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04091                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04092                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04093                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04094                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04095                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04096                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04097                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04098 
04099                 mov             eax,dword ptr[Bucket]
04100                 mov             ebp,dword ptr[Bucket2]
04101 
04102                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04103 
04104                 and             eax,REDMASK2
04105                 and             ebp,BLUEMASK
04106                 
04107                 mov             esi,dword ptr[Bucket]
04108                 or              ebp,eax
04109 
04110                 add             ecx,ebx
04111                 and             esi,GREENMASK2
04112 
04113                 shr             ecx,16
04114                 or              ebp,esi
04115 
04116                 xor             eax,0
04117                 mov             esi,pTex
04118 
04119                 rol             ebp,16
04120                 add             edx,dword ptr[DeltaV]
04121 
04122                 mov             ax,word ptr[2*ecx+esi]
04123                 mov             ecx,[ZVal]
04124 
04125                 mov             esi,[ZVal]
04126                 add             ecx,[ZDelta]
04127 
04128                 shr             esi,16
04129                 mov             [ZVal],ecx
04130 
04131                 mov             ecx,pZBufferPtr
04132 
04133                 cmp             si,word ptr[ecx+4]
04134                 jle             Skip1
04135 
04136                 mov             [edi+4],ebp
04137                 mov             word ptr[ecx+4],si
04138                 mov             word ptr[ecx+6],si
04139 
04140 Skip1:
04141                 mov             ecx,edx
04142 
04143                 add             ebx,dword ptr[DeltaU]
04144                 and             ecx,[GHMaskShifted16]
04145 
04146                 and             ebx,[GWMaskShifted]
04147                 xor             eax,0
04148 
04149                 add             ecx,ebx
04150                 mov             esi,pTex
04151 
04152                 rol             eax,16
04153                 add             edx,dword ptr[DeltaV]
04154 
04155                 shr             ecx,16
04156                 add             ebx,dword ptr[DeltaU]
04157 
04158                 mov             ax,word ptr[2*ecx+esi]
04159 
04160                 mov             ecx,edx
04161                 xor             eax,0
04162 
04163                 and             ecx,[GHMaskShifted16]
04164                 mov             esi,eax
04165 
04166                 mov             ebp,eax
04167                 and             esi,REDMASK2
04168 
04169                 and             ebp,GREENMASK2
04170                 mov             dword ptr[Red],esi
04171 
04172                 mov             dword ptr[Green],ebp
04174 
04175 
04176                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04177 
04178                 mov             ebp,eax
04179 
04180                 fmul    st,st(3)                                ; R    LB   LG   LR
04181                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04182 
04183                 and             ebp,BLUEMASK
04184                 and             ebx,[GWMaskShifted]
04185 
04186                 mov             dword ptr[Blue],ebp
04187 
04188                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04189                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04190                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04191                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04192                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04193                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04194                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04195                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04196                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04197                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04198                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04199                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04200 
04201                 mov             eax,dword ptr[Bucket]
04202                 mov             ebp,dword ptr[Bucket2]
04203 
04204                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04205 
04206                 and             eax,REDMASK2
04207                 and             ebp,BLUEMASK
04208                 
04209                 mov             esi,dword ptr[Bucket]
04210                 or              ebp,eax
04211 
04212                 add             ecx,ebx
04213                 and             esi,GREENMASK2
04214 
04215                 shr             ecx,16
04216                 or              ebp,esi
04217 
04218                 xor             eax,0
04219                 mov             esi,pTex
04220 
04221                 rol             ebp,16
04222                 add             edx,dword ptr[DeltaV]
04223 
04224                 mov             ax,word ptr[2*ecx+esi]
04225                 mov             ecx,[ZVal]
04226 
04227                 mov             esi,[ZVal]
04228                 add             ecx,[ZDelta]
04229 
04230                 shr             esi,16
04231                 mov             [ZVal],ecx
04232 
04233                 mov             ecx,pZBufferPtr
04234 
04235                 cmp             si,word ptr[ecx+8]
04236                 jle             Skip2
04237 
04238                 mov             [edi+8],ebp
04239                 mov             word ptr[ecx+8],si
04240                 mov             word ptr[ecx+10],si
04241 
04242 Skip2:
04243                 mov             ecx,edx
04244 
04245                 add             ebx,dword ptr[DeltaU]
04246                 and             ecx,[GHMaskShifted16]
04247 
04248                 and             ebx,[GWMaskShifted]
04249                 xor             eax,0
04250 
04251                 add             ecx,ebx
04252                 mov             esi,pTex
04253 
04254                 shr             ecx,16
04255                 add             edx,dword ptr[DeltaV]
04256 
04257                 rol             eax,16
04258                 mov             ax,word ptr[2*ecx+esi]
04259 
04260                 mov             ecx,edx
04261                 xor             eax,0
04262 
04263                 and             ecx,[GHMaskShifted16]
04264                 mov             esi,eax
04265 
04266                 mov             ebp,eax
04267                 and             esi,REDMASK2
04268 
04269                 and             ebp,GREENMASK2
04270                 mov             dword ptr[Red],esi
04271 
04272                 mov             dword ptr[Green],ebp
04273                 add             ebx,dword ptr[DeltaU]
04275 
04276 
04277                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04278 
04279                 mov             ebp,eax
04280 
04281                 fmul    st,st(3)                                ; R    LB   LG   LR
04282                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04283 
04284                 and             ebp,BLUEMASK
04285                 and             ebx,[GWMaskShifted]
04286 
04287                 mov             dword ptr[Blue],ebp
04288 
04289                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04290                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04291                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04292                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04293                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04294                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04295                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04296                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04297                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04298                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04299                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04300                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04301 
04302                 mov             eax,dword ptr[Bucket]
04303                 mov             ebp,dword ptr[Bucket2]
04304 
04305                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04306 
04307                 and             eax,REDMASK2
04308                 and             ebp,BLUEMASK
04309                 
04310                 mov             esi,dword ptr[Bucket]
04311                 or              ebp,eax
04312 
04313                 add             ecx,ebx
04314                 and             esi,GREENMASK2
04315 
04316                 shr             ecx,16
04317                 or              ebp,esi
04318 
04319                 xor             eax,0
04320                 mov             esi,pTex
04321 
04322                 rol             ebp,16
04323                 add             edx,dword ptr[DeltaV]
04324 
04325                 mov             ax,word ptr[2*ecx+esi]
04326                 mov             ecx,[ZVal]
04327 
04328                 mov             esi,[ZVal]
04329                 add             ecx,[ZDelta]
04330 
04331                 shr             esi,16
04332                 mov             [ZVal],ecx
04333 
04334                 mov             ecx,pZBufferPtr
04335 
04336                 cmp             si,word ptr[ecx+12]
04337                 jle             Skip3
04338 
04339                 mov             [edi+12],ebp
04340                 mov             word ptr[ecx+12],si
04341                 mov             word ptr[ecx+14],si
04342 
04343 Skip3:
04344                 mov             ecx,edx
04345 
04346                 add             ebx,dword ptr[DeltaU]
04347                 and             ecx,[GHMaskShifted16]
04348 
04349                 and             ebx,[GWMaskShifted]
04350                 xor             eax,0
04351 
04352                 add             ecx,ebx
04353                 mov             esi,pTex
04354 
04355                 shr             ecx,16
04356                 add             edx,dword ptr[DeltaV]
04357 
04358                 rol             eax,16
04359                 mov             ax,word ptr[2*ecx+esi]
04360 
04361                 mov             ecx,edx
04362                 xor             eax,0
04363 
04364                 and             ecx,[GHMaskShifted16]
04365                 mov             esi,eax
04366 
04367                 mov             ebp,eax
04368                 and             esi,REDMASK2
04369 
04370                 and             ebp,GREENMASK2
04371                 mov             dword ptr[Red],esi
04372 
04373                 mov             dword ptr[Green],ebp
04374                 add             ebx,dword ptr[DeltaU]
04376 
04377 
04378                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04379 
04380                 mov             ebp,eax
04381 
04382                 fmul    st,st(3)                                ; R    LB   LG   LR
04383                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04384 
04385                 and             ebp,BLUEMASK
04386                 and             ebx,[GWMaskShifted]
04387 
04388                 mov             dword ptr[Blue],ebp
04389 
04390                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04391                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04392                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04393                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04394                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04395                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04396                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04397                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04398                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04399                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04400                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04401                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04402 
04403                 mov             eax,dword ptr[Bucket]
04404                 mov             ebp,dword ptr[Bucket2]
04405 
04406                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04407 
04408                 and             eax,REDMASK2
04409                 and             ebp,BLUEMASK
04410                 
04411                 mov             esi,dword ptr[Bucket]
04412                 or              ebp,eax
04413 
04414                 add             ecx,ebx
04415                 and             esi,GREENMASK2
04416 
04417                 shr             ecx,16
04418                 or              ebp,esi
04419 
04420                 xor             eax,0
04421                 mov             esi,pTex
04422 
04423                 rol             ebp,16
04424                 add             edx,dword ptr[DeltaV]
04425 
04426                 mov             ax,word ptr[2*ecx+esi]
04427                 mov             ecx,[ZVal]
04428 
04429                 mov             esi,[ZVal]
04430                 add             ecx,[ZDelta]
04431 
04432                 shr             esi,16
04433                 mov             [ZVal],ecx
04434 
04435                 mov             ecx,pZBufferPtr
04436 
04437                 cmp             si,word ptr[ecx+16]
04438                 jle             Skip4
04439 
04440                 mov             [edi+16],ebp
04441                 mov             word ptr[ecx+16],si
04442                 mov             word ptr[ecx+18],si
04443 
04444 Skip4:
04445                 mov             ecx,edx
04446 
04447                 add             ebx,dword ptr[DeltaU]
04448                 and             ecx,[GHMaskShifted16]
04449 
04450                 and             ebx,[GWMaskShifted]
04451                 xor             eax,0
04452 
04453                 add             ecx,ebx
04454                 mov             esi,pTex
04455 
04456                 shr             ecx,16
04457                 add             edx,dword ptr[DeltaV]
04458 
04459                 rol             eax,16
04460                 mov             ax,word ptr[2*ecx+esi]
04461 
04462                 mov             ecx,edx
04463                 xor             eax,0
04464 
04465                 and             ecx,[GHMaskShifted16]
04466                 mov             esi,eax
04467 
04468                 mov             ebp,eax
04469                 and             esi,REDMASK2
04470 
04471                 and             ebp,GREENMASK2
04472                 mov             dword ptr[Red],esi
04473 
04474                 mov             dword ptr[Green],ebp
04475                 add             ebx,dword ptr[DeltaU]
04477 
04478 
04479                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04480 
04481                 mov             ebp,eax
04482 
04483                 fmul    st,st(3)                                ; R    LB   LG   LR
04484                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04485 
04486                 and             ebp,BLUEMASK
04487                 and             ebx,[GWMaskShifted]
04488 
04489                 mov             dword ptr[Blue],ebp
04490 
04491                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04492                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04493                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04494                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04495                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04496                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04497                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04498                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04499                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04500                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04501                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04502                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04503 
04504                 mov             eax,dword ptr[Bucket]
04505                 mov             ebp,dword ptr[Bucket2]
04506 
04507                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04508 
04509                 and             eax,REDMASK2
04510                 and             ebp,BLUEMASK
04511                 
04512                 mov             esi,dword ptr[Bucket]
04513                 or              ebp,eax
04514 
04515                 add             ecx,ebx
04516                 and             esi,GREENMASK2
04517 
04518                 shr             ecx,16
04519                 or              ebp,esi
04520 
04521                 xor             eax,0
04522                 mov             esi,pTex
04523 
04524                 rol             ebp,16
04525                 add             edx,dword ptr[DeltaV]
04526 
04527                 mov             ax,word ptr[2*ecx+esi]
04528                 mov             ecx,[ZVal]
04529 
04530                 mov             esi,[ZVal]
04531                 add             ecx,[ZDelta]
04532 
04533                 shr             esi,16
04534                 mov             [ZVal],ecx
04535 
04536                 mov             ecx,pZBufferPtr
04537 
04538                 cmp             si,word ptr[ecx+20]
04539                 jle             Skip5
04540 
04541                 mov             [edi+20],ebp
04542                 mov             word ptr[ecx+20],si
04543                 mov             word ptr[ecx+22],si
04544 
04545 Skip5:
04546                 mov             ecx,edx
04547 
04548                 add             ebx,dword ptr[DeltaU]
04549                 and             ecx,[GHMaskShifted16]
04550 
04551                 and             ebx,[GWMaskShifted]
04552                 xor             eax,0
04553 
04554                 add             ecx,ebx
04555                 mov             esi,pTex
04556 
04557                 shr             ecx,16
04558                 add             edx,dword ptr[DeltaV]
04559 
04560                 rol             eax,16
04561                 mov             ax,word ptr[2*ecx+esi]
04562 
04563                 mov             ecx,edx
04564                 xor             eax,0
04565 
04566                 and             ecx,[GHMaskShifted16]
04567                 mov             esi,eax
04568 
04569                 mov             ebp,eax
04570                 and             esi,REDMASK2
04571 
04572                 and             ebp,GREENMASK2
04573                 mov             dword ptr[Red],esi
04574 
04575                 mov             dword ptr[Green],ebp
04576                 add             ebx,dword ptr[DeltaU]
04578 
04579 
04580                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04581 
04582                 mov             ebp,eax
04583 
04584                 fmul    st,st(3)                                ; R    LB   LG   LR
04585                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04586 
04587                 and             ebp,BLUEMASK
04588                 and             ebx,[GWMaskShifted]
04589 
04590                 mov             dword ptr[Blue],ebp
04591 
04592                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04593                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04594                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04595                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04596                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04597                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04598                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04599                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04600                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04601                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04602                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04603                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04604 
04605                 mov             eax,dword ptr[Bucket]
04606                 mov             ebp,dword ptr[Bucket2]
04607 
04608                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04609 
04610                 and             eax,REDMASK2
04611                 and             ebp,BLUEMASK
04612                 
04613                 mov             esi,dword ptr[Bucket]
04614                 or              ebp,eax
04615 
04616                 add             ecx,ebx
04617                 and             esi,GREENMASK2
04618 
04619                 shr             ecx,16
04620                 or              ebp,esi
04621 
04622                 xor             eax,0
04623                 mov             esi,pTex
04624 
04625                 rol             ebp,16
04626                 add             edx,dword ptr[DeltaV]
04627 
04628                 mov             ax,word ptr[2*ecx+esi]
04629                 mov             ecx,[ZVal]
04630 
04631                 mov             esi,[ZVal]
04632                 add             ecx,[ZDelta]
04633 
04634                 shr             esi,16
04635                 mov             [ZVal],ecx
04636 
04637                 mov             ecx,pZBufferPtr
04638 
04639                 cmp             si,word ptr[ecx+24]
04640                 jle             Skip6
04641 
04642                 mov             [edi+24],ebp
04643                 mov             word ptr[ecx+24],si
04644                 mov             word ptr[ecx+26],si
04645 
04646 Skip6:
04647                 mov             ecx,edx
04648 
04649                 add             ebx,dword ptr[DeltaU]
04650                 and             ecx,[GHMaskShifted16]
04651 
04652                 and             ebx,[GWMaskShifted]
04653                 xor             eax,0
04654 
04655                 add             ecx,ebx
04656                 mov             esi,pTex
04657 
04658                 shr             ecx,16
04659                 add             edx,dword ptr[DeltaV]
04660 
04661                 rol             eax,16
04662                 mov             ax,word ptr[2*ecx+esi]
04663 
04664                 mov             ecx,edx
04665                 xor             eax,0
04666 
04667                 and             ecx,[GHMaskShifted16]
04668                 mov             esi,eax
04669 
04670                 mov             ebp,eax
04671                 and             esi,REDMASK2
04672 
04673                 and             ebp,GREENMASK2
04674                 mov             dword ptr[Red],esi
04675 
04676                 mov             dword ptr[Green],ebp
04677                 add             ebx,dword ptr[DeltaU]
04679                 fild    qword ptr[Red]                  ; r    LB   LG   LR
04680 
04681                 mov             ebp,eax
04682 
04683                 fmul    st,st(3)                                ; R    LB   LG   LR
04684                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
04685 
04686                 and             ebp,BLUEMASK
04687                 and             ebx,[GWMaskShifted]
04688 
04689                 mov             dword ptr[Blue],ebp
04690 
04691                 fmul    st,st(3)                                ; G    R    LB   LG   LR
04692                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
04693                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
04694                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
04695                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
04696                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
04697                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
04698                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
04699                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
04700                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
04701                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
04702                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
04703 
04704                 mov             eax,dword ptr[Bucket]
04705                 mov             ebp,dword ptr[Bucket2]
04706 
04707                 fstp    qword ptr[Bucket]               ; LB   LG   LR
04708 
04709                 and             eax,REDMASK2
04710                 and             ebp,BLUEMASK
04711                 
04712                 mov             esi,dword ptr[Bucket]
04713                 or              ebp,eax
04714 
04715                 fstp    dword ptr[Bucket]
04716                 fstp    dword ptr[Bucket2]
04717                 fstp    dword ptr[Bucket]
04718 
04719                 and             esi,GREENMASK2
04720 
04721                 fld             dword ptr[FTemp5]
04722                 fld             dword ptr[FTemp4]
04723 
04724                 or              ebp,esi
04725 
04726                 fld             dword ptr[FTemp3]
04727                 fld             dword ptr[FTemp2]
04728 
04729                 rol             ebp,16
04730 
04731                 fld             dword ptr[FTemp1]
04732                 fld             dword ptr[FTemp0]
04733                 mov             ecx,[ZVal]
04734 
04735                 mov             esi,[ZVal]
04736                 add             ecx,[ZDelta]
04737 
04738                 shr             esi,16
04739                 mov             [ZVal],ecx
04740 
04741                 mov             ecx,pZBufferPtr
04742 
04743                 cmp             si,word ptr[ecx+28]
04744                 jle             Skip7
04745 
04746                 mov             [edi+28],ebp
04747                 mov             word ptr[ecx+28],si
04748                 mov             word ptr[ecx+30],si
04749 
04750 Skip7:
04751                 pop             ebp
04752 
04753 
04754                 ; get corrected right side deltas ; st0  st1  st2  st3  st4  st5  st6  st7
04755                                                                                 ; ZR   UZR  ZRi  VZR  UL   VL
04756                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
04757                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
04758                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
04759                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
04760 
04761                 add             edi,32                                  ; move screen pointer to start of next aspan
04762                 add             [pZBufferPtr],32
04763                 dec             [NumASpans]                     ; dec num affine spans
04764                 jnz             SpanLoop16
04765 
04766 HandleLeftoverPixels16:
04767 
04768                 mov             esi,[pTex]
04769 
04770                 cmp             [RemainingCount],0
04771                 jz              FPUReturn16     
04772 
04773                 //need one more stack spot
04774                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
04775                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
04776                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
04777                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
04778                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
04779                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
04780                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
04781                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
04782                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
04783                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
04784 
04785                 mov             ebx,dword ptr[Bucket]
04786                 mov             eax,dword ptr[Bucket2]
04787 
04788                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
04789                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
04790 
04791                 add             ebx,dword ptr[UAdjust]
04792                 add             eax,dword ptr[UAdjustL]
04793 
04794                 mov             [U1],ebx
04795                 mov             [UFixed],eax
04796 
04797                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
04798                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
04799                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
04800                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
04801                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
04802                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
04803                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
04804 
04805                 mov             ebx,dword ptr[Bucket]
04806                 mov             eax,dword ptr[Bucket2]
04807 
04808                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
04809 
04810                 add             ebx,dword ptr[VAdjust]
04811                 add             eax,dword ptr[VAdjustL]
04812 
04813                 mov             [V1],ebx
04814                 mov             [VFixed],eax
04815 
04816                 dec             [RemainingCount]
04817                 jz              OnePixelSpan16
04818 
04819 
04820                 //must get rid of this wasted time
04821                 fstp    [FloatTemp]                             ; inv. inv. inv. inv. UL   VL
04822                 fstp    [FloatTemp]                             ; inv. inv. inv. UL   VL
04823                 fstp    [FloatTemp]                             ; inv. inv. UL   VL
04824                 fstp    [FloatTemp]                             ; inv. UL   VL
04825                 fstp    [FloatTemp]                             ; UL   VL
04826                 fild    [y]                                             ; y    UL   VL
04827                 fild    [x2]                                    ; xr   y    UL   VL
04828 
04829                 fld             [UDivZStepY]                    ; UZdY xr   y    UL   VL
04830                 fld             [UDivZStepX]                    ; UZdX UZdY xr   y    UL   VL
04831                 fmul    st,st(2)                                ; UZX  UZdY xr   y    UL   VL
04832                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY xr   y    UL   VL
04833                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY xr   y    UL   VL
04834                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX xr   y    UL   VL
04835                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX xr   y    UL   VL
04836                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX xr   y    UL   VL
04837                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX xr   y    UL   VL
04838                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS xr   y    UL   VL
04839                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS xr   y    UL   VL
04840                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS xr   y    UL   VL
04841                 faddp   st(3),st                                ; VZdY VZX  UZ   xr   y    UL   VL
04842                 fmul    st,st(4)                                ; VZY  VZX  UZ   xr   y    UL   VL
04843                 fxch    st(1)                                   ; VZX  VZY  UZ   xr   y    UL   VL
04844                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   xr   y    UL   VL
04845                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   xr   y    UL   VL
04846                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y    UL   VL
04847                 faddp   st(1),st                                ; VZ   UZ   ZX   y    UL   VL
04848                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y    UL   VL
04849                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY   UL   VL
04850                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY   UL   VL
04851                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY   UL   VL
04852 
04853                 faddp   st(3),st                                ; UZ   VZ   Zi   UL   VL
04854                 fld1                                                    ; 1    UZ   VZ   Zi   UL   VL
04855                 fdiv    st,st(3)                                ; ZR   UZ   VZ   Zi   UL   VL
04856 
04857                 fld             st                                              ; ZR   ZR   UZ   VZ   Zi   UL   VL
04858                 fmul    st,st(3)                                ; VR   ZR   UZ   VZ   Zi   UL   VL
04859                 fxch    st(1)                                   ; ZR   VR   UZ   VZ   Zi   UL   VL
04860                 fmul    st,st(2)                                ; UR   VR   UZ   VZ   Zi   UL   VL
04861 
04862                 //lazy idiv below... should 1/int mul mul
04863 
04864                 ; calculate deltas                              ; st0  st1  st2  st3  st4  st5  st6  st7
04865                 fsubr   st(5),st                                ; UR   VR   inv. inv. inv. dU   VL
04866                 fxch    st(1)                                   ; VR   UR   inv. inv. inv. dU   VL
04867                 fsubr   st(6),st                                ; VR   UR   inv. inv. inv. dU   dV
04868                 fxch    st(6)                                   ; dV   UR   inv. inv. inv. dU   VR
04869                 fidiv   dword ptr[RemainingCount];dv   UR   inv. inv. inv. dU   VR
04870                 fadd    qword ptr[MipMagic]             ; dvk  UR   inv. inv. inv. dU   VR
04871                 fxch    st(5)                                   ; dU   UR   inv. inv. inv. dvk  VR
04872                 fidiv   dword ptr[RemainingCount];du   UR   inv. inv. inv. dvk  VR
04873                 fadd    qword ptr[MipMagic]             ; duk  UR   inv. inv. inv. dvk  VR
04874                 fxch    st(5)                                   ; dvk  UR   inv. inv. inv. duk  VR
04875                 fstp    qword ptr[DeltaV]               ; UR   inv. inv. inv. duk  VR
04876                 fxch    st(4)                                   ; duk  inv. inv. inv. UR   VR
04877                 fstp    qword ptr[DeltaU]               ; inv. inv. inv. UR   VR
04878                 fld             st(1)                                   ; inv. inv. inv. inv. UR   VR
04879                 fld             st(2)                                   ; inv. inv. inv. inv. inv. UR   VR
04880 
04881 OnePixelSpan16:
04882                 // Clamp U/V
04883                 mov             ebx,[UFixed]
04884                 cmp             ebx,MaxU
04885                 jle             TryClampU116
04886                 mov             ecx,MaxU
04887                 mov             dword ptr[UFixed],ecx
04888                 jmp             NoClampU116
04889 
04890 TryClampU116:
04891                 cmp             ebx,0
04892                 jge             NoClampU116
04893                 mov             dword ptr[UFixed],0
04894 NoClampU116:
04895                 mov             eax,[VFixed]
04896                 cmp             eax,MaxV
04897                 jle             TryClampV116
04898                 mov             ecx,MaxV
04899                 mov             dword ptr[VFixed],ecx
04900                 jmp             NoClampV116
04901 
04902 TryClampV116:
04903                 cmp             eax,0
04904                 jge             NoClampV116
04905                 mov             dword ptr[VFixed],0
04906 
04907 NoClampV116:
04908                 mov             esi,dword ptr[UFixed]
04909                 mov             eax,dword ptr[VFixed]
04910 
04911                 mov ecx, GMipLevel4_8
04912                 sar esi, cl
04913                 sar eax, cl
04914                 and esi, 0ffh
04915                 and eax, 0ffh
04916                 mov UDist, esi
04917                 mov VDist, eax
04918 
04919                 mov esi,dword ptr[UFixed]
04920                 mov eax,dword ptr[VFixed]
04921                 mov ecx, GMipLevel20
04922                 shr esi, cl
04923                 shr eax, cl
04924 
04925                 imul eax, GLightWidth
04926                 add esi, eax
04927 
04928                 mov edx, esi
04929                 shl esi, 1
04930                 add edx, esi
04931 
04932                 add edx, GLightData
04933 
04934                 // Interpolate accross top
04935                 xor ecx, ecx
04936                 mov cl, [edx+3]
04937                 mov eax, ecx
04938                 mov cl, [edx+0]
04939                 sub eax, ecx
04940                 imul eax, UDist
04941                 shl ecx, 8
04942                 add eax, ecx
04943                 mov [R1], eax
04944 
04945                 xor ecx, ecx
04946                 mov cl, [edx+4]
04947                 mov eax, ecx
04948                 mov cl, [edx+1]
04949                 sub eax, ecx
04950                 imul eax, UDist
04951                 shl ecx, 8
04952                 add eax, ecx
04953                 mov [G1], eax
04954 
04955                 xor ecx, ecx
04956                 mov cl, [edx+5]
04957                 mov eax, ecx
04958                 mov cl, [edx+2]
04959                 sub eax, ecx
04960                 imul eax, UDist
04961                 shl ecx, 8
04962                 add eax, ecx
04963                 mov [B1], eax
04964 
04965                 add edx, GLightWidth
04966                 add edx, GLightWidth
04967                 add edx, GLightWidth
04968 
04969                 // Interpolate accross bottom
04970                 xor ecx, ecx
04971                 mov cl, [edx+3]
04972                 mov eax, ecx
04973                 mov cl, [edx+0]
04974                 sub eax, ecx
04975                 imul eax, UDist
04976                 shl ecx, 8
04977                 add eax, ecx
04978                 mov [R2], eax
04979 
04980                 xor ecx, ecx
04981                 mov cl, [edx+4]
04982                 mov eax, ecx
04983                 mov cl, [edx+1]
04984                 sub eax, ecx
04985                 imul eax, UDist
04986                 shl ecx, 8
04987                 add eax, ecx
04988                 mov [G2], eax
04989 
04990                 xor ecx, ecx
04991                 mov cl, [edx+5]
04992                 mov eax, ecx
04993                 mov cl, [edx+2]
04994                 sub eax, ecx
04995                 imul eax, UDist
04996                 shl ecx, 8
04997                 add eax, ecx
04998                 mov [B2], eax
04999 
05000                 // Interpolate down
05001                 mov eax, [R2]
05002                 sub eax, [R1]
05003                 imul eax, VDist
05004                 sar eax, 8
05005                 add eax, [R1]
05006                 shr eax, 8
05007                 and     eax,0feh
05008 
05009                 mov [RR1], eax
05010 
05011                 mov eax, [G2]
05012                 sub eax, [G1]
05013                 imul eax, VDist
05014                 sar eax, 8
05015                 add eax, [G1]
05016                 shr eax, 8
05017                 and     eax,0feh
05018 
05019                 mov [GG1], eax
05020 
05021                 mov eax, [B2]
05022                 sub eax, [B1]
05023                 imul eax, VDist
05024                 sar eax, 8
05025                 add eax, [B1]
05026                 shr eax, 8
05027                 and     eax,0feh
05028 
05029                 mov [BB1], eax
05030 
05031                 fstp    [FTemp0]
05032                 fstp    [FTemp1]
05033                 fstp    [FTemp2]
05034                 fstp    [FTemp3]
05035                 fstp    [FTemp4]
05036                 fstp    [FTemp5]
05037 
05038                 mov             ebx,dword ptr[U1]
05039                 mov             edx,dword ptr[V1]
05040 
05041                 fild    [RR1]                                   ; LR
05042                 fild    [GG1]                                   ; LG   LR
05043                 fild    [BB1]                                   ; LB   LG   LR
05044 
05045                 mov             ecx,[VShift]
05046                 add             edx,dword ptr[VAdjust2]
05047 
05048                 add             ebx,dword ptr[UAdjust2]
05049                 mov             eax,dword ptr[DeltaV]
05050 
05051                 shl             eax,cl
05052                 mov             esi,pTex
05053 
05054                 shl             edx,cl
05055                 mov             dword ptr[DeltaV],eax
05056 
05057                 mov             eax,[ZDelta]
05058                 mov             ecx,[ZVal]
05059 
05060                 sar             eax,1
05061                 push    ebp
05062 
05063                 mov             [ZDelta],eax
05064 
05065 LeftoverLoop16:
05066                 mov             eax,edx
05067                 and             ebx,[GWMaskShifted]
05068 
05069                 and             eax,[GHMaskShifted16]
05070 
05071                 add             eax,ebx
05072                 add             ebx,dword ptr[DeltaU]
05073 
05074                 shr             eax,16
05075                 add             edi,2
05076 
05077                 mov             ax,word ptr[2*eax+esi]
05078                 add             edx,dword ptr[DeltaV]
05079 
05080                 xor             eax,0
05081 
05082                 mov             esi,eax
05083                 mov             ebp,eax
05084 
05085                 and             esi,REDMASK2
05086                 and             ebp,GREENMASK2
05087 
05088                 mov             dword ptr[Red],esi
05089                 mov             dword ptr[Green],ebp
05090 
05091                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05092 
05093                 mov             ebp,eax
05094 
05095                 fmul    st,st(3)                                ; R    LB   LG   LR
05096                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05097 
05098                 and             ebp,BLUEMASK
05099 
05100                 mov             dword ptr[Blue],ebp
05101 
05102                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05103                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05104                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05105                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05106                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05107                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05108                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05109                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05110                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05111                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05112                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05113                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05114 
05115                 mov             eax,dword ptr[Bucket]
05116                 mov             ebp,dword ptr[Bucket2]
05117 
05118                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05119 
05120                 and             eax,REDMASK2
05121                 and             ebp,BLUEMASK
05122                 
05123                 mov             esi,dword ptr[Bucket]
05124                 or              ebp,eax
05125 
05126                 and             esi,GREENMASK2
05127                 mov             eax,ecx
05128 
05129                 or              ebp,esi
05130 
05131                 shr             eax,16
05132                 mov             esi,pZBufferPtr
05133 
05134                 cmp             ax,word ptr[esi]
05135                 jle             SkipLeftOver
05136 
05137                 mov             word ptr[edi-2],bp
05138                 mov             word ptr[esi],ax
05139 
05140 SkipLeftOver:
05141                 add             ecx,[ZDelta]
05142                 mov             esi,pTex
05143 
05144                 add             pZBufferPtr,2
05145 
05146                 dec             [RemainingCount]
05147                 jge             LeftoverLoop16
05148 
05149                 pop             ebp
05150 
05151 
05152 FPUReturn16:
05153                 ffree   st(0)
05154                 ffree   st(1)
05155                 ffree   st(2)
05156                 ffree   st(3)
05157                 ffree   st(4)
05158                 ffree   st(5)
05159                 ffree   st(6)
05160 
05161 Return16:
05162                 pop             edi
05163                 pop             esi
05164                 pop             ecx
05165                 pop             ebx
05166         }
05167 }
05168 
05169 void DrawSpan16_AsmLitZWrite555X86FPU(int32 x1, int32 x2, int32 y)
05170 {
05171         TDest   =Dest;
05172         _asm
05173         {
05174                 push    ebx
05175                 push    ecx
05176                 push    esi
05177                 push    edi
05178 
05179                 mov             eax,x1
05180                 mov             ecx,x2
05181                 sub             ecx,eax
05182                 jle             Return16
05183 
05184                 mov             edi,[GBitPtr16]
05185                 mov             pTex,edi
05186 
05187                 fild    [y]                                             ; y
05188 
05189                 mov             esi,x1
05190                 mov             edi,[TDest]
05191 
05192                 shl             esi,1
05193                 mov             eax,ecx
05194 
05195                 add             edi,esi
05196                 add             pZBufferPtr,esi
05197 
05198                 shr             ecx,4
05199                 and             eax,15
05200                 _emit 75h
05201                 _emit 06h
05202                 dec             ecx
05203                 mov             eax,16
05204 
05205                 mov             [NumASpans],ecx
05206                 mov             [RemainingCount],eax
05207 
05208                 fild [x1]                                               ; x    y
05209 
05210                 //decoder won't keep up with these huge instructions
05211                 //need to find some int instructions to cram in here somewhere
05212                 fld             [UDivZStepY]                    ; UZdY x    y
05213                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
05214                 fmul    st,st(2)                                ; UZX  UZdY x    y
05215                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
05216                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
05217                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
05218                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
05219                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
05220                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
05221                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
05222                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
05223                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
05224                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
05225                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
05226                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
05227                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
05228                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
05229 
05230                 //zbuffer step action
05231                 fld             [ZiStepX]
05232                 fmul    dword ptr[ZBufferPrec]
05233                 fmul    dword ptr[Two]
05234                 fistp   dword ptr[ZDelta]
05235 
05236                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
05237                 faddp   st(1),st                                ; VZ   UZ   ZX   y
05238                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
05239                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
05240                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
05241                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
05242 
05243                 //room for two cycles of int instructions here
05244 
05245                 faddp   st(3),st                                ; UZ   VZ   Zi
05246                 fld1                                                    ; 1    UZ   VZ   Zi
05247                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
05248 
05249                 //room for 18 cycles of int instructions here
05250 
05251                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
05252                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
05253                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
05254 
05255                 //zbuffer action
05256                 fld             st
05257                 fmul    dword ptr[ZBufferPrec]
05258                 fistp   dword ptr[ZVal]
05259 
05260                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
05261                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
05262                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
05263                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
05264                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
05265                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
05266                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
05267                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
05268                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
05269 
05270                 //room for 18 cycles of int stuff here
05271 
05272                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
05273                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
05274                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
05275                 //fmul stall one cycle
05276                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
05277 
05278                 test    ecx,ecx
05279                 jz              HandleLeftoverPixels16
05280 
05281 SpanLoop16:
05282                 //need one more stack spot
05283                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
05284                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
05285                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
05286                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
05287                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
05288                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
05289                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
05290                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
05291                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
05292                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
05293 
05294                 mov             ebx,dword ptr[Bucket]
05295                 mov             eax,dword ptr[Bucket2]
05296 
05297                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
05298                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
05299 
05300                 add             ebx,dword ptr[UAdjust]
05301                 add             eax,dword ptr[UAdjustL]
05302 
05303                 mov             [U1],ebx
05304                 mov             [UFixed],eax
05305 
05306                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
05307                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
05308                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
05309                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
05310                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
05311                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
05312                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
05313                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
05314 
05315                 mov             ebx,dword ptr[Bucket]
05316                 mov             eax,dword ptr[Bucket2]
05317 
05318                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
05319 
05320                 add             ebx,dword ptr[VAdjust]
05321                 add             eax,dword ptr[VAdjustL]
05322 
05323                 mov             [V1],ebx
05324                 mov             [VFixed],eax
05325 
05326                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
05327                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
05328                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
05329                 fxch    st(5)                                   ; dU   VR   UZR  ZRi  VZR  dVk  UR
05330                 fadd    qword ptr[MipMagic2]    ; dUk  VR   UZR  ZRi  VZR  dVk  UR
05331                 fxch    st(5)                                   ; dVk  VR   UZR  ZRi  VZR  dUk  UR
05332                 fstp    qword ptr[DeltaV]               ; VR   UZR  ZRi  VZR  dUk  UR
05333                 fxch    st(5)                                   ; UR   UZR  ZRi  VZR  dUk  VR
05334                 //gotta do this to get em lined back up right
05335                 fxch    st(4)                                   ; dUk  UZR  ZRi  VZR  UR   VR
05336                 fstp    qword ptr[DeltaU]               ; UZR  ZRi  VZR  UR   VR
05337 
05338                 //right becomes left                    ; UZL  ZLi  VZL  UL   VL
05339                 fadd    [UDivZ16StepX]                  ; UZR  ZLi  VZL  UL   VL
05340                 fxch    st(1)                                   ; ZLi  UZR  VZL  UL   VL
05341                 fadd    [Zi16StepX]                             ; ZRi  UZR  VZL  UL   VL
05342                 fxch    st(2)                                   ; VZL  UZR  ZRi  UL   VL
05343                 fadd    [VDivZ16StepX]                  ; VZR  UZR  ZRi  UL   VL
05344                 fxch    st(2)                                   ; ZRi  UZR  VZR  UL   VL
05345                 fxch    st(1)                                   ; UZR  ZRi  VZR  UL   VL
05346                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
05347                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
05348 
05349                 // Clamp U/V
05350                 mov             ebx,[UFixed]
05351                 cmp             ebx,MaxU
05352                 jle             TryClampU016
05353                 mov             ecx,MaxU
05354                 mov             dword ptr[UFixed],ecx
05355                 jmp             NoClampU016
05356 
05357 TryClampU016:
05358                 cmp             ebx,0
05359                 jge             NoClampU016
05360                 mov             dword ptr[UFixed],0
05361 NoClampU016:
05362                 mov             eax,[VFixed]
05363                 cmp             eax,MaxV
05364                 jle             TryClampV016
05365                 mov             ecx,MaxV
05366                 mov             dword ptr[VFixed],ecx
05367                 jmp             NoClampV016
05368 
05369 TryClampV016:
05370                 cmp             eax,0
05371                 jge             NoClampV016
05372                 mov             dword ptr[VFixed],0
05373 
05374 NoClampV016:
05375 
05376 
05377                 mov esi,dword ptr[UFixed]
05378                 mov eax,dword ptr[VFixed]
05379 
05380 
05381                 mov ecx, GMipLevel4_8
05382                 sar esi, cl
05383                 sar eax, cl
05384                 and esi, 0ffh
05385                 and eax, 0ffh
05386                 mov UDist, esi
05387                 mov VDist, eax
05388 
05389                 mov esi,dword ptr[UFixed]
05390                 mov eax,dword ptr[VFixed]
05391                 mov ecx, GMipLevel20
05392                 shr esi, cl
05393                 shr eax, cl
05394 
05395                 imul eax, GLightWidth
05396                 add esi, eax
05397 
05398                 mov edx, esi
05399                 shl esi, 1
05400                 add edx, esi
05401 
05402                 add edx, GLightData
05403 
05404                 // Interpolate accross top
05405                 xor ecx, ecx
05406                 mov cl, [edx+3]
05407                 mov eax, ecx
05408                 mov cl, [edx+0]
05409                 sub eax, ecx
05410                 imul eax, UDist
05411                 shl ecx, 8
05412                 add eax, ecx
05413                 mov [R1], eax
05414 
05415                 xor ecx, ecx
05416                 mov cl, [edx+4]
05417                 mov eax, ecx
05418                 mov cl, [edx+1]
05419                 sub eax, ecx
05420                 imul eax, UDist
05421                 shl ecx, 8
05422                 add eax, ecx
05423                 mov [G1], eax
05424 
05425                 xor ecx, ecx
05426                 mov cl, [edx+5]
05427                 mov eax, ecx
05428                 mov cl, [edx+2]
05429                 sub eax, ecx
05430                 imul eax, UDist
05431                 shl ecx, 8
05432                 add eax, ecx
05433                 mov [B1], eax
05434 
05435                 add edx, GLightWidth
05436                 add edx, GLightWidth
05437                 add edx, GLightWidth
05438 
05439                 // Interpolate accross bottom
05440                 xor ecx, ecx
05441                 mov cl, [edx+3]
05442                 mov eax, ecx
05443                 mov cl, [edx+0]
05444                 sub eax, ecx
05445                 imul eax, UDist
05446                 shl ecx, 8
05447                 add eax, ecx
05448                 mov [R2], eax
05449 
05450                 xor ecx, ecx
05451                 mov cl, [edx+4]
05452                 mov eax, ecx
05453                 mov cl, [edx+1]
05454                 sub eax, ecx
05455                 imul eax, UDist
05456                 shl ecx, 8
05457                 add eax, ecx
05458                 mov [G2], eax
05459 
05460                 xor ecx, ecx
05461                 mov cl, [edx+5]
05462                 mov eax, ecx
05463                 mov cl, [edx+2]
05464                 sub eax, ecx
05465                 imul eax, UDist
05466                 shl ecx, 8
05467                 add eax, ecx
05468                 mov [B2], eax
05469 
05470                 // Interpolate down
05471                 mov eax, [R2]
05472                 sub eax, [R1]
05473                 imul eax, VDist
05474                 sar eax, 8
05475                 add eax, [R1]
05476                 shr eax, 8
05477                 and     eax,0feh
05478 
05479                 mov [RR1], eax
05480 
05481                 mov eax, [G2]
05482                 sub eax, [G1]
05483                 imul eax, VDist
05484                 sar eax, 8
05485                 add eax, [G1]
05486                 shr eax, 8
05487                 and     eax,0feh
05488 
05489                 mov [GG1], eax
05490 
05491                 mov eax, [B2]
05492                 sub eax, [B1]
05493                 imul eax, VDist
05494                 sar eax, 8
05495                 add eax, [B1]
05496                 shr eax, 8
05497                 and     eax,0feh
05498 
05499                 mov [BB1], eax
05500 
05501                 fstp    [FTemp0]                                ; UZR  ZRi  VZR  UL   VL
05502                 fstp    [FTemp1]                                ; ZRi  VZR  UL   VL
05503                 fstp    [FTemp2]                                ; VZR  UL   VL
05504                 fstp    [FTemp3]                                ; UL   VL
05505                 fstp    [FTemp4]                                ; VL
05506                 fstp    [FTemp5]                                ; 
05507 
05508                 fild    [RR1]                                   ; LR
05509                 fild    [GG1]                                   ; LG   LR
05510                 fild    [BB1]                                   ; LB   LG   LR
05511                 
05512                 
05513                 mov             ebx,dword ptr[U1]
05514                 mov             eax,dword ptr[V1]
05515 
05516                 add             ebx,dword ptr[UAdjust2]
05517                 add             eax,dword ptr[VAdjust2]
05518 
05519                 mov             ecx,[VShift]
05520                 mov             dword ptr[Bucket],ebx
05521 
05522                 shl             eax,cl
05523 
05524                 push    ebp
05525 
05526                 mov             dword ptr[Bucket2],eax
05527                 mov             ebp,dword ptr[DeltaV]
05528 
05529                 and             eax,[GHMaskShifted16]
05530                 and             ebx,[GWMaskShifted]
05531 
05532                 shl             ebp,cl
05533                 add             eax,ebx
05534 
05535                 mov             edx,dword ptr[Bucket2]
05536                 mov             esi,pTex
05537 
05538                 shr             eax,16
05539                 mov             dword ptr[DeltaV],ebp
05540 
05541                 mov             ebx,dword ptr[Bucket]
05542 
05543                 mov             ax,word ptr[2*eax+esi]
05544                 add             edx,dword ptr[DeltaV]
05545 
05546                 xor             eax,0
05547                 mov             ecx,edx
05548 
05549                 add             ebx,dword ptr[DeltaU]
05550                 and             ecx,[GHMaskShifted16]
05551 
05552                 rol             eax,16
05553                 and             ebx,[GWMaskShifted]
05554 
05555                 xor             eax,0
05556                 add             ecx,ebx
05557 
05558                 add             edx,dword ptr[DeltaV]
05559                 mov             esi,pTex
05560 
05561                 shr             ecx,16
05562                 add             ebx,dword ptr[DeltaU]
05563 
05564                 mov             ax,word ptr[2*ecx+esi]
05565                 mov             ecx,edx
05566 
05567                 xor             eax,0
05568                 and             ecx,[GHMaskShifted16]
05569 
05570                 mov             esi,eax
05571                 mov             ebp,eax
05572 
05573                 and             esi,REDMASK2
05574                 and             ebp,GREENMASK2
05575 
05576                 mov             dword ptr[Red],esi
05577                 mov             dword ptr[Green],ebp
05578 
05579                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05580 
05581                 mov             ebp,eax
05582 
05583                 fmul    st,st(3)                                ; R    LB   LG   LR
05584                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05585 
05586                 and             ebp,BLUEMASK
05587                 and             ebx,[GWMaskShifted]
05588 
05589                 mov             dword ptr[Blue],ebp
05590 
05591                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05592                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05593                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05594                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05595                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05596                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05597                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05598                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05599                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05600                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05601                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05602                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05603 
05604                 mov             eax,dword ptr[Bucket]
05605                 mov             ebp,dword ptr[Bucket2]
05606 
05607                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05608 
05609                 and             eax,REDMASK2
05610                 and             ebp,BLUEMASK
05611                 
05612                 mov             esi,dword ptr[Bucket]
05613                 or              ebp,eax
05614 
05615                 add             ecx,ebx
05616                 and             esi,GREENMASK2
05617 
05618                 shr             ecx,16
05619                 or              ebp,esi
05620 
05621                 xor             eax,0
05622                 mov             esi,pTex
05623 
05624                 rol             ebp,16
05625                 add             edx,dword ptr[DeltaV]
05626 
05627                 mov             ax,word ptr[2*ecx+esi]
05628                 mov             ecx,[ZVal]
05629 
05630                 mov             esi,[ZVal]
05631                 add             ecx,[ZDelta]
05632 
05633                 shr             esi,16
05634                 mov             [ZVal],ecx
05635 
05636                 mov             ecx,pZBufferPtr
05637                 mov             [edi+0],ebp
05638 
05639                 mov             word ptr[ecx+0],si
05640                 mov             word ptr[ecx+2],si
05641                 mov             ecx,edx
05642 
05643                 add             ebx,dword ptr[DeltaU]
05644                 and             ecx,[GHMaskShifted16]
05645 
05646                 and             ebx,[GWMaskShifted]
05647                 xor             eax,0
05648 
05649                 add             ecx,ebx
05650                 mov             esi,pTex
05651 
05652                 rol             eax,16
05653                 add             edx,dword ptr[DeltaV]
05654 
05655                 shr             ecx,16
05656                 add             ebx,dword ptr[DeltaU]
05657 
05658                 mov             ax,word ptr[2*ecx+esi]
05659 
05660                 mov             ecx,edx
05661                 xor             eax,0
05662 
05663                 and             ecx,[GHMaskShifted16]
05664                 mov             esi,eax
05665 
05666                 mov             ebp,eax
05667                 and             esi,REDMASK2
05668 
05669                 and             ebp,GREENMASK2
05670                 mov             dword ptr[Red],esi
05671 
05672                 mov             dword ptr[Green],ebp
05674 
05675 
05676                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05677 
05678                 mov             ebp,eax
05679 
05680                 fmul    st,st(3)                                ; R    LB   LG   LR
05681                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05682 
05683                 and             ebp,BLUEMASK
05684                 and             ebx,[GWMaskShifted]
05685 
05686                 mov             dword ptr[Blue],ebp
05687 
05688                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05689                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05690                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05691                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05692                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05693                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05694                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05695                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05696                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05697                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05698                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05699                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05700 
05701                 mov             eax,dword ptr[Bucket]
05702                 mov             ebp,dword ptr[Bucket2]
05703 
05704                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05705 
05706                 and             eax,REDMASK2
05707                 and             ebp,BLUEMASK
05708                 
05709                 mov             esi,dword ptr[Bucket]
05710                 or              ebp,eax
05711 
05712                 add             ecx,ebx
05713                 and             esi,GREENMASK2
05714 
05715                 shr             ecx,16
05716                 or              ebp,esi
05717 
05718                 xor             eax,0
05719                 mov             esi,pTex
05720 
05721                 rol             ebp,16
05722                 add             edx,dword ptr[DeltaV]
05723 
05724                 mov             ax,word ptr[2*ecx+esi]
05725                 mov             ecx,[ZVal]
05726 
05727                 mov             esi,[ZVal]
05728                 add             ecx,[ZDelta]
05729 
05730                 shr             esi,16
05731                 mov             [ZVal],ecx
05732 
05733                 mov             ecx,pZBufferPtr
05734                 mov             [edi+4],ebp
05735 
05736                 mov             word ptr[ecx+4],si
05737                 mov             word ptr[ecx+6],si
05738                 mov             ecx,edx
05739 
05740                 add             ebx,dword ptr[DeltaU]
05741                 and             ecx,[GHMaskShifted16]
05742 
05743                 and             ebx,[GWMaskShifted]
05744                 xor             eax,0
05745 
05746                 add             ecx,ebx
05747                 mov             esi,pTex
05748 
05749                 rol             eax,16
05750                 add             edx,dword ptr[DeltaV]
05751 
05752                 shr             ecx,16
05753                 add             ebx,dword ptr[DeltaU]
05754 
05755                 mov             ax,word ptr[2*ecx+esi]
05756 
05757                 mov             ecx,edx
05758                 xor             eax,0
05759 
05760                 and             ecx,[GHMaskShifted16]
05761                 mov             esi,eax
05762 
05763                 mov             ebp,eax
05764                 and             esi,REDMASK2
05765 
05766                 and             ebp,GREENMASK2
05767                 mov             dword ptr[Red],esi
05768 
05769                 mov             dword ptr[Green],ebp
05771 
05772 
05773                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05774 
05775                 mov             ebp,eax
05776 
05777                 fmul    st,st(3)                                ; R    LB   LG   LR
05778                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05779 
05780                 and             ebp,BLUEMASK
05781                 and             ebx,[GWMaskShifted]
05782 
05783                 mov             dword ptr[Blue],ebp
05784 
05785                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05786                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05787                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05788                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05789                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05790                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05791                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05792                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05793                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05794                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05795                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05796                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05797 
05798                 mov             eax,dword ptr[Bucket]
05799                 mov             ebp,dword ptr[Bucket2]
05800 
05801                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05802 
05803                 and             eax,REDMASK2
05804                 and             ebp,BLUEMASK
05805                 
05806                 mov             esi,dword ptr[Bucket]
05807                 or              ebp,eax
05808 
05809                 add             ecx,ebx
05810                 and             esi,GREENMASK2
05811 
05812                 shr             ecx,16
05813                 or              ebp,esi
05814 
05815                 xor             eax,0
05816                 mov             esi,pTex
05817 
05818                 rol             ebp,16
05819                 add             edx,dword ptr[DeltaV]
05820 
05821                 mov             ax,word ptr[2*ecx+esi]
05822                 mov             ecx,[ZVal]
05823 
05824                 mov             esi,[ZVal]
05825                 add             ecx,[ZDelta]
05826 
05827                 shr             esi,16
05828                 mov             [ZVal],ecx
05829 
05830                 mov             ecx,pZBufferPtr
05831                 mov             [edi+8],ebp
05832 
05833                 mov             word ptr[ecx+8],si
05834                 mov             word ptr[ecx+10],si
05835                 mov             ecx,edx
05836 
05837                 add             ebx,dword ptr[DeltaU]
05838                 and             ecx,[GHMaskShifted16]
05839 
05840                 and             ebx,[GWMaskShifted]
05841                 xor             eax,0
05842 
05843                 add             ecx,ebx
05844                 mov             esi,pTex
05845 
05846                 shr             ecx,16
05847                 add             edx,dword ptr[DeltaV]
05848 
05849                 rol             eax,16
05850                 mov             ax,word ptr[2*ecx+esi]
05851 
05852                 mov             ecx,edx
05853                 xor             eax,0
05854 
05855                 and             ecx,[GHMaskShifted16]
05856                 mov             esi,eax
05857 
05858                 mov             ebp,eax
05859                 and             esi,REDMASK2
05860 
05861                 and             ebp,GREENMASK2
05862                 mov             dword ptr[Red],esi
05863 
05864                 mov             dword ptr[Green],ebp
05865                 add             ebx,dword ptr[DeltaU]
05867 
05868 
05869                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05870 
05871                 mov             ebp,eax
05872 
05873                 fmul    st,st(3)                                ; R    LB   LG   LR
05874                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05875 
05876                 and             ebp,BLUEMASK
05877                 and             ebx,[GWMaskShifted]
05878 
05879                 mov             dword ptr[Blue],ebp
05880 
05881                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05882                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05883                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05884                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05885                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05886                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05887                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05888                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05889                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05890                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05891                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05892                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05893 
05894                 mov             eax,dword ptr[Bucket]
05895                 mov             ebp,dword ptr[Bucket2]
05896 
05897                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05898 
05899                 and             eax,REDMASK2
05900                 and             ebp,BLUEMASK
05901                 
05902                 mov             esi,dword ptr[Bucket]
05903                 or              ebp,eax
05904 
05905                 add             ecx,ebx
05906                 and             esi,GREENMASK2
05907 
05908                 shr             ecx,16
05909                 or              ebp,esi
05910 
05911                 xor             eax,0
05912                 mov             esi,pTex
05913 
05914                 rol             ebp,16
05915                 add             edx,dword ptr[DeltaV]
05916 
05917                 mov             ax,word ptr[2*ecx+esi]
05918                 mov             ecx,[ZVal]
05919 
05920                 mov             esi,[ZVal]
05921                 add             ecx,[ZDelta]
05922 
05923                 shr             esi,16
05924                 mov             [ZVal],ecx
05925 
05926                 mov             ecx,pZBufferPtr
05927                 mov             [edi+12],ebp
05928 
05929                 mov             word ptr[ecx+12],si
05930                 mov             word ptr[ecx+14],si
05931                 mov             ecx,edx
05932 
05933                 add             ebx,dword ptr[DeltaU]
05934                 and             ecx,[GHMaskShifted16]
05935 
05936                 and             ebx,[GWMaskShifted]
05937                 xor             eax,0
05938 
05939                 add             ecx,ebx
05940                 mov             esi,pTex
05941 
05942                 shr             ecx,16
05943                 add             edx,dword ptr[DeltaV]
05944 
05945                 rol             eax,16
05946                 mov             ax,word ptr[2*ecx+esi]
05947 
05948                 mov             ecx,edx
05949                 xor             eax,0
05950 
05951                 and             ecx,[GHMaskShifted16]
05952                 mov             esi,eax
05953 
05954                 mov             ebp,eax
05955                 and             esi,REDMASK2
05956 
05957                 and             ebp,GREENMASK2
05958                 mov             dword ptr[Red],esi
05959 
05960                 mov             dword ptr[Green],ebp
05961                 add             ebx,dword ptr[DeltaU]
05963 
05964 
05965                 fild    qword ptr[Red]                  ; r    LB   LG   LR
05966 
05967                 mov             ebp,eax
05968 
05969                 fmul    st,st(3)                                ; R    LB   LG   LR
05970                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
05971 
05972                 and             ebp,BLUEMASK
05973                 and             ebx,[GWMaskShifted]
05974 
05975                 mov             dword ptr[Blue],ebp
05976 
05977                 fmul    st,st(3)                                ; G    R    LB   LG   LR
05978                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
05979                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
05980                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
05981                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
05982                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
05983                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
05984                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
05985                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
05986                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
05987                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
05988                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
05989 
05990                 mov             eax,dword ptr[Bucket]
05991                 mov             ebp,dword ptr[Bucket2]
05992 
05993                 fstp    qword ptr[Bucket]               ; LB   LG   LR
05994 
05995                 and             eax,REDMASK2
05996                 and             ebp,BLUEMASK
05997                 
05998                 mov             esi,dword ptr[Bucket]
05999                 or              ebp,eax
06000 
06001                 add             ecx,ebx
06002                 and             esi,GREENMASK2
06003 
06004                 shr             ecx,16
06005                 or              ebp,esi
06006 
06007                 xor             eax,0
06008                 mov             esi,pTex
06009 
06010                 rol             ebp,16
06011                 add             edx,dword ptr[DeltaV]
06012 
06013                 mov             ax,word ptr[2*ecx+esi]
06014                 mov             ecx,[ZVal]
06015 
06016                 mov             esi,[ZVal]
06017                 add             ecx,[ZDelta]
06018 
06019                 shr             esi,16
06020                 mov             [ZVal],ecx
06021 
06022                 mov             ecx,pZBufferPtr
06023                 mov             [edi+16],ebp
06024 
06025                 mov             word ptr[ecx+16],si
06026                 mov             word ptr[ecx+18],si
06027                 mov             ecx,edx
06028 
06029                 add             ebx,dword ptr[DeltaU]
06030                 and             ecx,[GHMaskShifted16]
06031 
06032                 and             ebx,[GWMaskShifted]
06033                 xor             eax,0
06034 
06035                 add             ecx,ebx
06036                 mov             esi,pTex
06037 
06038                 shr             ecx,16
06039                 add             edx,dword ptr[DeltaV]
06040 
06041                 rol             eax,16
06042                 mov             ax,word ptr[2*ecx+esi]
06043 
06044                 mov             ecx,edx
06045                 xor             eax,0
06046 
06047                 and             ecx,[GHMaskShifted16]
06048                 mov             esi,eax
06049 
06050                 mov             ebp,eax
06051                 and             esi,REDMASK2
06052 
06053                 and             ebp,GREENMASK2
06054                 mov             dword ptr[Red],esi
06055 
06056                 mov             dword ptr[Green],ebp
06057                 add             ebx,dword ptr[DeltaU]
06059 
06060 
06061                 fild    qword ptr[Red]                  ; r    LB   LG   LR
06062 
06063                 mov             ebp,eax
06064 
06065                 fmul    st,st(3)                                ; R    LB   LG   LR
06066                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
06067 
06068                 and             ebp,BLUEMASK
06069                 and             ebx,[GWMaskShifted]
06070 
06071                 mov             dword ptr[Blue],ebp
06072 
06073                 fmul    st,st(3)                                ; G    R    LB   LG   LR
06074                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
06075                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
06076                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
06077                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
06078                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
06079                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
06080                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
06081                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
06082                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
06083                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
06084                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
06085 
06086                 mov             eax,dword ptr[Bucket]
06087                 mov             ebp,dword ptr[Bucket2]
06088 
06089                 fstp    qword ptr[Bucket]               ; LB   LG   LR
06090 
06091                 and             eax,REDMASK2
06092                 and             ebp,BLUEMASK
06093                 
06094                 mov             esi,dword ptr[Bucket]
06095                 or              ebp,eax
06096 
06097                 add             ecx,ebx
06098                 and             esi,GREENMASK2
06099 
06100                 shr             ecx,16
06101                 or              ebp,esi
06102 
06103                 xor             eax,0
06104                 mov             esi,pTex
06105 
06106                 rol             ebp,16
06107                 add             edx,dword ptr[DeltaV]
06108 
06109                 mov             ax,word ptr[2*ecx+esi]
06110                 mov             ecx,[ZVal]
06111 
06112                 mov             esi,[ZVal]
06113                 add             ecx,[ZDelta]
06114 
06115                 shr             esi,16
06116                 mov             [ZVal],ecx
06117 
06118                 mov             ecx,pZBufferPtr
06119                 mov             [edi+20],ebp
06120 
06121                 mov             word ptr[ecx+20],si
06122                 mov             word ptr[ecx+22],si
06123                 mov             ecx,edx
06124 
06125                 add             ebx,dword ptr[DeltaU]
06126                 and             ecx,[GHMaskShifted16]
06127 
06128                 and             ebx,[GWMaskShifted]
06129                 xor             eax,0
06130 
06131                 add             ecx,ebx
06132                 mov             esi,pTex
06133 
06134                 shr             ecx,16
06135                 add             edx,dword ptr[DeltaV]
06136 
06137                 rol             eax,16
06138                 mov             ax,word ptr[2*ecx+esi]
06139 
06140                 mov             ecx,edx
06141                 xor             eax,0
06142 
06143                 and             ecx,[GHMaskShifted16]
06144                 mov             esi,eax
06145 
06146                 mov             ebp,eax
06147                 and             esi,REDMASK2
06148 
06149                 and             ebp,GREENMASK2
06150                 mov             dword ptr[Red],esi
06151 
06152                 mov             dword ptr[Green],ebp
06153                 add             ebx,dword ptr[DeltaU]
06155 
06156 
06157                 fild    qword ptr[Red]                  ; r    LB   LG   LR
06158 
06159                 mov             ebp,eax
06160 
06161                 fmul    st,st(3)                                ; R    LB   LG   LR
06162                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
06163 
06164                 and             ebp,BLUEMASK
06165                 and             ebx,[GWMaskShifted]
06166 
06167                 mov             dword ptr[Blue],ebp
06168 
06169                 fmul    st,st(3)                                ; G    R    LB   LG   LR
06170                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
06171                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
06172                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
06173                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
06174                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
06175                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
06176                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
06177                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
06178                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
06179                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
06180                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
06181 
06182                 mov             eax,dword ptr[Bucket]
06183                 mov             ebp,dword ptr[Bucket2]
06184 
06185                 fstp    qword ptr[Bucket]               ; LB   LG   LR
06186 
06187                 and             eax,REDMASK2
06188                 and             ebp,BLUEMASK
06189                 
06190                 mov             esi,dword ptr[Bucket]
06191                 or              ebp,eax
06192 
06193                 add             ecx,ebx
06194                 and             esi,GREENMASK2
06195 
06196                 shr             ecx,16
06197                 or              ebp,esi
06198 
06199                 xor             eax,0
06200                 mov             esi,pTex
06201 
06202                 rol             ebp,16
06203                 add             edx,dword ptr[DeltaV]
06204 
06205                 mov             ax,word ptr[2*ecx+esi]
06206                 mov             ecx,[ZVal]
06207 
06208                 mov             esi,[ZVal]
06209                 add             ecx,[ZDelta]
06210 
06211                 shr             esi,16
06212                 mov             [ZVal],ecx
06213 
06214                 mov             ecx,pZBufferPtr
06215                 mov             [edi+24],ebp
06216 
06217                 mov             word ptr[ecx+24],si
06218                 mov             word ptr[ecx+26],si
06219                 mov             ecx,edx
06220 
06221                 add             ebx,dword ptr[DeltaU]
06222                 xor             eax,0
06223 
06224                 and             ecx,[GHMaskShifted16]
06225                 mov             esi,pTex
06226 
06227                 add             ecx,ebx
06228 
06229                 shr             ecx,16
06230                 add             edx,dword ptr[DeltaV]
06231 
06232                 rol             eax,16
06233                 mov             ax,word ptr[2*ecx+esi]
06234 
06235 //              mov             ecx,edx
06236                 xor             eax,0
06237 
06238                 mov             esi,eax
06239 
06240                 mov             ebp,eax
06241                 and             esi,REDMASK2
06242 
06243                 and             ebp,GREENMASK2
06244                 mov             dword ptr[Red],esi
06245 
06246                 mov             dword ptr[Green],ebp
06247 //              add             ebx,dword ptr[DeltaU]
06249                 fild    qword ptr[Red]                  ; r    LB   LG   LR
06250 
06251                 mov             ebp,eax
06252 
06253                 fmul    st,st(3)                                ; R    LB   LG   LR
06254                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
06255 
06256                 and             ebp,BLUEMASK
06257 //              and             ebx,[GWMaskShifted]
06258 
06259                 mov             dword ptr[Blue],ebp
06260 
06261                 fmul    st,st(3)                                ; G    R    LB   LG   LR
06262                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
06263                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
06264                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
06265                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
06266                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
06267                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
06268                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
06269                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
06270                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
06271                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
06272                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
06273 
06274                 mov             eax,dword ptr[Bucket]
06275                 mov             ebp,dword ptr[Bucket2]
06276 
06277                 fstp    qword ptr[Bucket]               ; LB   LG   LR
06278 
06279                 and             eax,REDMASK2
06280                 and             ebp,BLUEMASK
06281                 
06282                 mov             esi,dword ptr[Bucket]
06283                 or              ebp,eax
06284 
06285                 fstp    dword ptr[Bucket]
06286                 fstp    dword ptr[Bucket2]
06287                 fstp    dword ptr[Bucket]
06288 
06289                 and             esi,GREENMASK2
06290 
06291                 fld             dword ptr[FTemp5]
06292                 fld             dword ptr[FTemp4]
06293 
06294                 or              ebp,esi
06295 
06296                 fld             dword ptr[FTemp3]
06297                 fld             dword ptr[FTemp2]
06298 
06299                 rol             ebp,16
06300 
06301                 fld             dword ptr[FTemp1]
06302                 fld             dword ptr[FTemp0]
06303                 mov             ecx,[ZVal]
06304 
06305                 mov             esi,[ZVal]
06306                 add             ecx,[ZDelta]
06307 
06308                 shr             esi,16
06309                 mov             [ZVal],ecx
06310 
06311                 mov             ecx,pZBufferPtr
06312                 mov             [edi+28],ebp
06313 
06314                 mov             word ptr[ecx+28],si
06315                 mov             word ptr[ecx+30],si
06316                 pop             ebp
06317 
06318 
06319                 ; get corrected right side deltas ; st0  st1  st2  st3  st4  st5  st6  st7
06320                                                                                 ; ZR   UZR  ZRi  VZR  UL   VL
06321                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
06322                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
06323                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
06324                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
06325 
06326                 add             edi,32                                  ; move screen pointer to start of next aspan
06327                 add             pZBufferPtr,32
06328                 dec             [NumASpans]                     ; dec num affine spans
06329                 jnz             SpanLoop16
06330 
06331 HandleLeftoverPixels16:
06332 
06333                 mov             esi,[pTex]
06334 
06335 
06336                 cmp             [RemainingCount],0
06337                 jz              FPUReturn16
06338 
06339                 //need one more stack spot
06340                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
06341                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
06342                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
06343                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
06344                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
06345                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
06346                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
06347                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
06348                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
06349                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06350 
06351                 mov             ebx,dword ptr[Bucket]
06352                 mov             eax,dword ptr[Bucket2]
06353 
06354                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
06355                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
06356 
06357                 add             ebx,dword ptr[UAdjust]
06358                 add             eax,dword ptr[UAdjustL]
06359 
06360                 mov             [U1],ebx
06361                 mov             [UFixed],eax
06362 
06363                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
06364                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
06365                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
06366                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
06367                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
06368                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
06369                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06370 
06371                 mov             ebx,dword ptr[Bucket]
06372                 mov             eax,dword ptr[Bucket2]
06373 
06374                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
06375 
06376                 add             ebx,dword ptr[VAdjust]
06377                 add             eax,dword ptr[VAdjustL]
06378 
06379                 mov             [V1],ebx
06380                 mov             [VFixed],eax
06381 
06382                 dec             [RemainingCount]
06383                 jz              OnePixelSpan16
06384 
06385 
06386                 //must get rid of this wasted time
06387                 fstp    [FloatTemp]                             ; inv. inv. inv. inv. UL   VL
06388                 fstp    [FloatTemp]                             ; inv. inv. inv. UL   VL
06389                 fstp    [FloatTemp]                             ; inv. inv. UL   VL
06390                 fstp    [FloatTemp]                             ; inv. UL   VL
06391                 fstp    [FloatTemp]                             ; UL   VL
06392                 fild    [y]                                             ; y    UL   VL
06393                 fild    [x2]                                    ; xr   y    UL   VL
06394 
06395                 fld             [UDivZStepY]                    ; UZdY xr   y    UL   VL
06396                 fld             [UDivZStepX]                    ; UZdX UZdY xr   y    UL   VL
06397                 fmul    st,st(2)                                ; UZX  UZdY xr   y    UL   VL
06398                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY xr   y    UL   VL
06399                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY xr   y    UL   VL
06400                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX xr   y    UL   VL
06401                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX xr   y    UL   VL
06402                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX xr   y    UL   VL
06403                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX xr   y    UL   VL
06404                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS xr   y    UL   VL
06405                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS xr   y    UL   VL
06406                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS xr   y    UL   VL
06407                 faddp   st(3),st                                ; VZdY VZX  UZ   xr   y    UL   VL
06408                 fmul    st,st(4)                                ; VZY  VZX  UZ   xr   y    UL   VL
06409                 fxch    st(1)                                   ; VZX  VZY  UZ   xr   y    UL   VL
06410                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   xr   y    UL   VL
06411                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   xr   y    UL   VL
06412                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y    UL   VL
06413                 faddp   st(1),st                                ; VZ   UZ   ZX   y    UL   VL
06414                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y    UL   VL
06415                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY   UL   VL
06416                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY   UL   VL
06417                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY   UL   VL
06418 
06419                 faddp   st(3),st                                ; UZ   VZ   Zi   UL   VL
06420                 fld1                                                    ; 1    UZ   VZ   Zi   UL   VL
06421                 fdiv    st,st(3)                                ; ZR   UZ   VZ   Zi   UL   VL
06422 
06423                 fld             st                                              ; ZR   ZR   UZ   VZ   Zi   UL   VL
06424                 fmul    st,st(3)                                ; VR   ZR   UZ   VZ   Zi   UL   VL
06425                 fxch    st(1)                                   ; ZR   VR   UZ   VZ   Zi   UL   VL
06426                 fmul    st,st(2)                                ; UR   VR   UZ   VZ   Zi   UL   VL
06427 
06428                 //lazy idiv below... should 1/int mul mul
06429 
06430                 ; calculate deltas                              ; st0  st1  st2  st3  st4  st5  st6  st7
06431                 fsubr   st(5),st                                ; UR   VR   inv. inv. inv. dU   VL
06432                 fxch    st(1)                                   ; VR   UR   inv. inv. inv. dU   VL
06433                 fsubr   st(6),st                                ; VR   UR   inv. inv. inv. dU   dV
06434                 fxch    st(6)                                   ; dV   UR   inv. inv. inv. dU   VR
06435                 fidiv   dword ptr[RemainingCount];dv   UR   inv. inv. inv. dU   VR
06436                 fadd    qword ptr[MipMagic]             ; dvk  UR   inv. inv. inv. dU   VR
06437                 fxch    st(5)                                   ; dU   UR   inv. inv. inv. dvk  VR
06438                 fidiv   dword ptr[RemainingCount];du   UR   inv. inv. inv. dvk  VR
06439                 fadd    qword ptr[MipMagic]             ; duk  UR   inv. inv. inv. dvk  VR
06440                 fxch    st(5)                                   ; dvk  UR   inv. inv. inv. duk  VR
06441                 fstp    qword ptr[DeltaV]               ; UR   inv. inv. inv. duk  VR
06442                 fxch    st(4)                                   ; duk  inv. inv. inv. UR   VR
06443                 fstp    qword ptr[DeltaU]               ; inv. inv. inv. UR   VR
06444                 fld             st(1)                                   ; inv. inv. inv. inv. UR   VR
06445                 fld             st(2)                                   ; inv. inv. inv. inv. inv. UR   VR
06446 
06447 OnePixelSpan16:
06448                 // Clamp U/V
06449                 mov             ebx,[UFixed]
06450                 cmp             ebx,MaxU
06451                 jle             TryClampU116
06452                 mov             ecx,MaxU
06453                 mov             dword ptr[UFixed],ecx
06454                 jmp             NoClampU116
06455 
06456 TryClampU116:
06457                 cmp             ebx,0
06458                 jge             NoClampU116
06459                 mov             dword ptr[UFixed],0
06460 NoClampU116:
06461                 mov             eax,[VFixed]
06462                 cmp             eax,MaxV
06463                 jle             TryClampV116
06464                 mov             ecx,MaxV
06465                 mov             dword ptr[VFixed],ecx
06466                 jmp             NoClampV116
06467 
06468 TryClampV116:
06469                 cmp             eax,0
06470                 jge             NoClampV116
06471                 mov             dword ptr[VFixed],0
06472 
06473 NoClampV116:
06474                 mov             esi,dword ptr[UFixed]
06475                 mov             eax,dword ptr[VFixed]
06476 
06477                 mov ecx, GMipLevel4_8
06478                 sar esi, cl
06479                 sar eax, cl
06480                 and esi, 0ffh
06481                 and eax, 0ffh
06482                 mov UDist, esi
06483                 mov VDist, eax
06484 
06485                 mov esi,dword ptr[UFixed]
06486                 mov eax,dword ptr[VFixed]
06487                 mov ecx, GMipLevel20
06488                 shr esi, cl
06489                 shr eax, cl
06490 
06491                 imul eax, GLightWidth
06492                 add esi, eax
06493 
06494                 mov edx, esi
06495                 shl esi, 1
06496                 add edx, esi
06497 
06498                 add edx, GLightData
06499 
06500                 // Interpolate accross top
06501                 xor ecx, ecx
06502                 mov cl, [edx+3]
06503                 mov eax, ecx
06504                 mov cl, [edx+0]
06505                 sub eax, ecx
06506                 imul eax, UDist
06507                 shl ecx, 8
06508                 add eax, ecx
06509                 mov [R1], eax
06510 
06511                 xor ecx, ecx
06512                 mov cl, [edx+4]
06513                 mov eax, ecx
06514                 mov cl, [edx+1]
06515                 sub eax, ecx
06516                 imul eax, UDist
06517                 shl ecx, 8
06518                 add eax, ecx
06519                 mov [G1], eax
06520 
06521                 xor ecx, ecx
06522                 mov cl, [edx+5]
06523                 mov eax, ecx
06524                 mov cl, [edx+2]
06525                 sub eax, ecx
06526                 imul eax, UDist
06527                 shl ecx, 8
06528                 add eax, ecx
06529                 mov [B1], eax
06530 
06531                 add edx, GLightWidth
06532                 add edx, GLightWidth
06533                 add edx, GLightWidth
06534 
06535                 // Interpolate accross bottom
06536                 xor ecx, ecx
06537                 mov cl, [edx+3]
06538                 mov eax, ecx
06539                 mov cl, [edx+0]
06540                 sub eax, ecx
06541                 imul eax, UDist
06542                 shl ecx, 8
06543                 add eax, ecx
06544                 mov [R2], eax
06545 
06546                 xor ecx, ecx
06547                 mov cl, [edx+4]
06548                 mov eax, ecx
06549                 mov cl, [edx+1]
06550                 sub eax, ecx
06551                 imul eax, UDist
06552                 shl ecx, 8
06553                 add eax, ecx
06554                 mov [G2], eax
06555 
06556                 xor ecx, ecx
06557                 mov cl, [edx+5]
06558                 mov eax, ecx
06559                 mov cl, [edx+2]
06560                 sub eax, ecx
06561                 imul eax, UDist
06562                 shl ecx, 8
06563                 add eax, ecx
06564                 mov [B2], eax
06565 
06566                 // Interpolate down
06567                 mov eax, [R2]
06568                 sub eax, [R1]
06569                 imul eax, VDist
06570                 sar eax, 8
06571                 add eax, [R1]
06572                 shr eax, 8
06573                 and     eax,0feh
06574 
06575                 mov [RR1], eax
06576 
06577                 mov eax, [G2]
06578                 sub eax, [G1]
06579                 imul eax, VDist
06580                 sar eax, 8
06581                 add eax, [G1]
06582                 shr eax, 8
06583                 and     eax,0feh
06584 
06585                 mov [GG1], eax
06586 
06587                 mov eax, [B2]
06588                 sub eax, [B1]
06589                 imul eax, VDist
06590                 sar eax, 8
06591                 add eax, [B1]
06592                 shr eax, 8
06593                 and     eax,0feh
06594 
06595                 mov [BB1], eax
06596 
06597                 fstp    [FTemp0]
06598                 fstp    [FTemp1]
06599                 fstp    [FTemp2]
06600                 fstp    [FTemp3]
06601                 fstp    [FTemp4]
06602                 fstp    [FTemp5]
06603 
06604                 mov             ebx,dword ptr[U1]
06605                 mov             edx,dword ptr[V1]
06606 
06607                 fild    [RR1]                                   ; LR
06608                 fild    [GG1]                                   ; LG   LR
06609                 fild    [BB1]                                   ; LB   LG   LR
06610 
06611                 mov             ecx,[VShift]
06612                 add             edx,dword ptr[VAdjust2]
06613 
06614                 add             ebx,dword ptr[UAdjust2]
06615                 mov             eax,dword ptr[DeltaV]
06616 
06617                 shl             eax,cl
06618                 mov             esi,pTex
06619 
06620                 shl             edx,cl
06621                 mov             dword ptr[DeltaV],eax
06622 
06623                 mov             eax,[ZDelta]
06624                 mov             ecx,[ZVal]
06625 
06626                 sar             eax,1
06627                 push    ebp
06628 
06629                 mov             [ZDelta],eax
06630 
06631 LeftoverLoop16:
06632                 mov             eax,edx
06633                 and             ebx,[GWMaskShifted]
06634 
06635                 and             eax,[GHMaskShifted16]
06636 
06637                 add             eax,ebx
06638                 add             ebx,dword ptr[DeltaU]
06639 
06640                 shr             eax,16
06641                 add             edi,2
06642 
06643                 mov             ax,word ptr[2*eax+esi]
06644                 add             edx,dword ptr[DeltaV]
06645 
06646                 xor             eax,0
06647 
06648                 mov             esi,eax
06649                 mov             ebp,eax
06650 
06651                 and             esi,REDMASK2
06652                 and             ebp,GREENMASK2
06653 
06654                 mov             dword ptr[Red],esi
06655                 mov             dword ptr[Green],ebp
06656 
06657                 fild    qword ptr[Red]                  ; r    LB   LG   LR
06658 
06659                 mov             ebp,eax
06660 
06661                 fmul    st,st(3)                                ; R    LB   LG   LR
06662                 fild    qword ptr[Green]                ; g    R    LB   LG   LR
06663 
06664                 and             ebp,BLUEMASK
06665 
06666                 mov             dword ptr[Blue],ebp
06667 
06668                 fmul    st,st(3)                                ; G    R    LB   LG   LR
06669                 fild    [Blue]                                  ; b    G    R    LB   LG   LR
06670                 fmul    st,st(3)                                ; B    G    R    LB   LG   LR
06671                 fxch    st(2)                                   ; R    G    B    LB   LG   LR
06672                 fadd    qword ptr[Magic]                ; Rk   G    B    LB   LG   LR
06673                 fxch    st(1)                                   ; G    Rk   B    LB   LG   LR
06674                 fadd    qword ptr[Magic]                ; Gk   Rk   B    LB   LG   LR
06675                 fxch    st(2)                                   ; B    Rk   Gk   LB   LG   LR
06676                 fadd    qword ptr[Magic]                ; Bk   Rk   Gk   LB   LG   LR
06677                 fxch    st(1)                                   ; Rk   Bk   Gk   LB   LG   LR
06678                 fstp    qword ptr[Bucket]               ; Bk   Gk   LB   LG   LR
06679                 fstp    qword ptr[Bucket2]              ; Gk   LB   LG   LR
06680 
06681                 mov             eax,dword ptr[Bucket]
06682                 mov             ebp,dword ptr[Bucket2]
06683 
06684                 fstp    qword ptr[Bucket]               ; LB   LG   LR
06685 
06686                 and             eax,REDMASK2
06687                 and             ebp,BLUEMASK
06688                 
06689                 mov             esi,dword ptr[Bucket]
06690                 or              ebp,eax
06691 
06692                 and             esi,GREENMASK2
06693                 mov             eax,ecx
06694 
06695                 or              ebp,esi
06696 
06697                 shr             eax,16
06698                 mov             esi,pZBufferPtr
06699 
06700                 mov             word ptr[edi-2],bp
06701                 mov             word ptr[esi],ax
06702 
06703                 add             ecx,[ZDelta]
06704                 mov             esi,pTex
06705 
06706                 add             pZBufferPtr,2
06707 
06708                 dec             [RemainingCount]
06709                 jge             LeftoverLoop16
06710 
06711                 pop             ebp
06712 
06713 
06714 FPUReturn16:
06715                 ffree   st(0)
06716                 ffree   st(1)
06717                 ffree   st(2)
06718                 ffree   st(3)
06719                 ffree   st(4)
06720                 ffree   st(5)
06721                 ffree   st(6)
06722 
06723 Return16:
06724                 pop             edi
06725                 pop             esi
06726                 pop             ecx
06727                 pop             ebx
06728         }
06729 }
06730 
06731 void DrawSpan16_AsmGouraudZBuffer555X86FPU(int32 x1, int32 x2, int32 y, int32 r1, int32 g1, int32 b1, int32 r2, int32 g2, int32 b2)
06732 {
06733         RR1     =r1;
06734         GG1     =g1;
06735         BB1     =b1;
06736         TDest   =Dest;
06737         _asm
06738         {
06739                 push    ebx
06740                 push    ecx
06741                 push    esi
06742                 push    edi
06743 
06744                 mov             eax,x1
06745                 mov             ecx,x2
06746                 sub             ecx,eax
06747                 jle             Return16
06748 
06749                 mov             edi,[GBitPtr16]
06750                 mov             pTex,edi
06751 
06752                 fild    [y]                                             ; y
06753                 mov             [widTemp],ecx
06754 
06755                 fild    [x1]                                            ; x    y
06756                 fild    [widTemp]
06757 
06758                 fld1
06759                 fdivrp  st(1),st
06760 
06761                 mov             esi,x1
06762                 mov             edi,[TDest]
06763 
06764                 shl             esi,1
06765                 mov             eax,ecx
06766 
06767                 add             edi,esi
06768                 add             pZBufferPtr,esi
06769 
06770                 mov             eax,ecx
06771                 shr             ecx,4
06772                 and             eax,15
06773                 _emit 75h
06774                 _emit 06h
06775                 dec             ecx
06776                 mov             eax,16
06777 
06778                 mov             [NumASpans],ecx
06779                 mov             [RemainingCount],eax
06780 
06781                 fild    [r2]
06782                 fisub   [r1]
06783                 fild    [g2]
06784                 fisub   [g1]
06785                 fild    [b2]
06786                 fisub   [b1]
06787                 fxch    st(2)
06788                 fmul    st,st(3)
06789                 fxch    st(1)
06790                 fmul    st,st(3)
06791                 fxch    st(2)
06792                 fmul    st,st(3)
06793                 frndint
06794                 fstp    qword ptr[BlueDelta]
06795                 frndint
06796                 fstp    qword ptr[RedDelta]
06797                 frndint
06798                 fstp    qword ptr[GreenDelta]
06799                 fstp    qword ptr[FTemp0]
06800 
06801 
06802                 //decoder won't keep up with these huge instructions
06803                 //need to find some int instructions to cram in here somewhere
06804                 fld             [UDivZStepY]                    ; UZdY x    y
06805                 fld             [UDivZStepX]                    ; UZdX UZdY x    y
06806                 fmul    st,st(2)                                ; UZX  UZdY x    y
06807                 fld             [VDivZStepY]                    ; VZdY UZX  UZdY x    y
06808                 fld             [VDivZStepX]                    ; VZdX VZdY UZX  UZdY x    y
06809                 fxch    st(3)                                   ; UZdy VZdY UZX  VZdX x    y
06810                 fmul    st,st(5)                                ; UZY  VZdY UZX  VZdX x    y
06811                 fxch    st(2)                                   ; UZX  VZdY UZY  VZdX x    y
06812                 fadd    [UDivZOrigin]                   ; UZXS VZdY UZY  VZdX x    y
06813                 fxch    st(3)                                   ; VZdX VZdY UZY  UZXS x    y
06814                 fmul    st,st(4)                                ; VZX  VZdY UZY  UZXS x    y
06815                 fxch    st(2)                                   ; UZY  VZdY VZX  UZXS x    y
06816                 faddp   st(3),st                                ; VZdY VZX  UZ   x    y
06817                 fmul    st,st(4)                                ; VZY  VZX  UZ   x    y
06818                 fxch    st(1)                                   ; VZX  VZY  UZ   x    y
06819                 fadd    [VDivZOrigin]                   ; VZXS VZY  UZ   x    y
06820                 fld             [ZiStepX]                               ; ZdX  VZXS VZY  UZ   x    y
06821 
06822                 //zbuffer step action
06823                 fld             [ZiStepX]
06824                 fmul    dword ptr[ZBufferPrec]
06825                 fmul    dword ptr[Two]
06826                 fistp   dword ptr[ZDelta]
06827 
06828                 fmulp   st(4),st                                ; VZXS VZY  UZ   ZX   y
06829                 faddp   st(1),st                                ; VZ   UZ   ZX   y
06830                 fld             [ZiStepY]                               ; ZdY  VZ   UZ   ZX   y
06831                 fmulp   st(4),st                                ; VZ   UZ   ZX   ZY
06832                 fxch    st(2)                                   ; ZX   UZ   VZ   ZY
06833                 fadd    [ZiOrigin]                              ; ZXS  UZ   VZ   ZY
06834 
06835                 //room for two cycles of int instructions here
06836 
06837                 faddp   st(3),st                                ; UZ   VZ   Zi
06838                 fld1                                                    ; 1    UZ   VZ   Zi
06839                 fdiv    st,st(3)                                ; ZL   UZ   VZ   Zi
06840 
06841                 //room for 18 cycles of int instructions here
06842 
06843                 fld             st                                              ; ZL   ZL   UZ   VZ   Zi
06844                 fmul    st,st(3)                                ; VL   ZL   UZ   VZ   Zi
06845                 fxch    st(4)                                   ; Zi   ZL   UZ   VZ   VL
06846 
06847                 //zbuffer action
06848                 fld             st
06849                 fmul    dword ptr[ZBufferPrec]
06850                 fistp   dword ptr[ZVal]
06851 
06852                 fadd    [Zi16StepX]                             ; ZRi  ZL   UZ   VZ   VL
06853                 fxch    st(1)                                   ; ZL   ZRi  UZ   VZ   VL
06854                 fmul    st,st(2)                                ; UL   ZRi  UZ   VZ   VL
06855                 fxch    st(3)                                   ; VZ   ZRi  UZ   UL   VL
06856                 fadd    [VDivZ16StepX]                  ; VZR  ZRi  UZ   UL   VL
06857                 fxch    st(2)                                   ; UZ   ZRi  VZR  UL   VL
06858                 fadd    [UDivZ16StepX]                  ; UZR  ZRi  VZR  UL   VL
06859                 fld1                                                    ; 1    UZR  ZRi  VZR  UL   VL
06860                 fdiv    st,st(2)                                ; ZR   UZR  ZRi  VZR  UL   VL
06861 
06862                 //room for 18 cycles of int stuff here
06863 
06864                 fld             st                                              ; ZR   ZR   UZR  ZRi  VZR  UL   VL
06865                 fmul    st,st(4)                                ; VR   ZR   UZR  ZRi  VZR  UL   VL
06866                 fxch    st(1)                                   ; ZR   VR   UZR  ZRi  VZR  UL   VL
06867                 //fmul stall one cycle
06868                 fmul    st,st(2)                                ; UR   VR   UZR  ZRi  VZR  UL   VL
06869 
06870                 test    ecx,ecx
06871                 jz              HandleLeftoverPixels16
06872 
06873 SpanLoop16:
06874                 //need one more stack spot
06875                 fstp    dword ptr[FloatTemp]    ; VR   UZR  ZRi  VZR  UL   VL
06876                 fld             st(4)                                   ; UL   VR   UZR  ZRi  VZR  UL   VL
06877                 fmul    [GLMapMulU]                             ; ULL  VR   UZR  ZRi  VZR  UL   VL
06878                 fld             st(5)                                   ; UL   ULL  VR   UZR  ZRi  VZR  UL   VL
06879                 fadd    qword ptr[MipMagic]             ; ULk  ULL  VR   UZR  ZRi  VZR  UL   VL
06880                 fxch    st(1)                                   ; ULL  ULk  VR   UZR  ZRi  VZR  UL   VL
06881                 fadd    qword ptr[MipMagic]             ; ULLk ULk  VR   UZR  ZRi  VZR  UL   VL
06882                 fxch    st(1)                                   ; ULk  ULLk VR   UZR  ZRi  VZR  UL   VL
06883                 fstp    qword ptr[Bucket]               ; ULLk VR   UZR  ZRi  VZR  UL   VL
06884                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06885 
06886                 mov             ebx,dword ptr[Bucket]
06887                 mov             eax,dword ptr[Bucket2]
06888 
06889                 fld             st(5)                                   ; VL   VR   UZR  ZRi  VZR  UL   VL
06890                 fmul    [GLMapMulV]                             ; VLL  VR   UZR  ZRi  VZR  UL   VL
06891 
06892                 add             ebx,dword ptr[UAdjust]
06893                 add             eax,dword ptr[UAdjustL]
06894 
06895                 mov             [U1],ebx
06896                 mov             [UFixed],eax
06897 
06898                 fld             st(6)                                   ; VL   VLL  VR   UZR  ZRi  VZR  UL   VL
06899                 fadd    qword ptr[MipMagic]             ; VLk  VLL  VR   UZR  ZRi  VZR  UL   VL
06900                 fxch    st(1)                                   ; VLL  VLk  VR   UZR  ZRi  VZR  UL   VL
06901                 fadd    qword ptr[MipMagic]             ; VLLk VLk  VR   UZR  ZRi  VZR  UL   VL
06902                 fxch    st(1)                                   ; VLk  VLLk VR   UZR  ZRi  VZR  UL   VL
06903                 fstp    qword ptr[Bucket]               ; VLLk VR   UZR  ZRi  VZR  UL   VL
06904                 fstp    qword ptr[Bucket2]              ; VR   UZR  ZRi  VZR  UL   VL
06905                 fsubr   st(5),st                                ; VR   UZR  ZRi  VZR  UL   dV
06906 
06907                 mov             ebx,dword ptr[Bucket]
06908                 mov             eax,dword ptr[Bucket2]
06909 
06910                 fld             dword ptr[FloatTemp]    ; UR   VR   UZR  ZRi  VZR  UL   dV
06911 
06912                 add             ebx,dword ptr[VAdjust]
06913                 add             eax,dword ptr[VAdjustL]
06914 
06915                 mov             [V1],ebx
06916                 mov             [VFixed],eax
06917 
06918                 fsubr   st(5),st                                ; UR   VR   UZR  ZRi  VZR  dU   dV
06919                 fxch    st(6)                                   ; dV   VR   UZR  ZRi  VZR  dU   UR
06920                 fadd    qword ptr[MipMagic2]    ; dVk  VR   UZR  ZRi  VZR  dU   UR
06921                 fxch    st(5)