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