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