;//================================================================== ;//================================================================== ;//== == ;//== -PSX2- FXNORMALS PERSPECTIVE - TRIANGLE STRIP - CLIPPING == ;//== == ;//== == ;//== Features : Transform vertices into camera space and == ;//== perform clipping using the frustum info. == ;//== Clipped triangles are inserted as a new strip == ;//== in the previous strip. == ;//== Process Normals. == ;//== == ;//== -RUNNING- == ;//== == ;//================================================================== ;//================================================================== ;//================================================================================================================ ;//======================================== Pre-processing ======================================================== ;//================================================================================================================ ;---------------------------------------------------------------------------- SUB.zw VF17, VF00, VF00 LQ.xyzw VF26, vuSDClipvec1(VI00) ; Build x100 vector - Load Clipping vector-1 ADDw.y VF17, VF00, VF00 LQ.xyzw VF03, (0+0*vertexSize)(VI11) ; Build x100 vector - Load position-1 ADDw.z VF19, VF00, VF00 LQ.xyzw VF27, vuSDClipvec2(VI00) ; Build x010 vector - Load Clipping vector-2 SUB.yw VF19, VF00, VF00 LQ.xyzw VF04, (0+1*vertexSize)(VI11) ; Build x010 vector - Load position-2 MULAw.xyzw ACC, VF31, VF00 LQ.xyzw VF05, (0+2*vertexSize)(VI11) ; Transform pos-1 - Load position-3 MADDAx.xyw ACC, VF28, VF03 MR32.x VF26, VF26 ; Transform pos-1 - Frustrum x coef MADDAy.xyw ACC, VF29, VF03 MR32.x VF24, VF26 ; Transform pos-1 - Frustrum x coef MADDz.xyzw VF03, VF30, VF03 LQ.yz VF24, vuSDClipvec2(VI00) ; Transform pos-1 - Load Frustrum y-z1 MULAw.xyzw ACC, VF31, VF00 MR32.x VF27, VF27 ; Transform pos-2 - Frustrum y coef MADDAx.xyw ACC, VF28, VF04 NOP ; Transform pos-2 MADDAy.xyw ACC, VF29, VF04 NOP ; Transform pos-2 MADDz.xyzw VF04, VF30, VF04 NOP ; Transform pos-2 MULAw.xyzw ACC, VF31, VF00 NOP ; Transform pos-3 MADDAx.xyw ACC, VF28, VF05 IADDIU VI02, VI00, 0x00c0 ; Transform pos-3 - Store Fmac filter MADDAy.xyw ACC, VF29, VF05 MOVE.xyzw VF16, VF03 ; Transform pos-3 - Copy pos-1 in interp-1 MADDz.xyzw VF05, VF30, VF05 MOVE.xyzw VF18, VF04 ; Transform pos-3 - Copy pos-2 in interp-2 ADDA.z ACC, VF00, VF26 IADDIU VI09, VI00, 0 ; Zmapping offset - Set vertex counter to 0 MUL.xy VF01, VF03, VF24 IADDIU VI07, VI00, ClippingBuffer ; Zmapping pos-1 - Set Clipping buffer adress MADDw.z VF01, VF24, VF03 IADDIU VI11, VI11, (2*vertexSize) ; Zmapping pos-1 - Set position in the input buffer MUL.xy VF23, VF04, VF24 IADDIU VI05, VI00, 1 ; Zmapping pos-2 - Set Degeneration flag to active MADDw.z VF23, VF24, VF04 SQ.xyzw VF00, 3(VI14) ; Zmapping pos-2 - Store interpolator 001 MUL.xy VF25, VF05, VF24 SQ.xyzw VF17, 5(VI14) ; Zmapping pos-3 - Store interpolator 100 MADDw.z VF25, VF24, VF05 SQ.xyzw VF19, 1(VI14) ; Zmapping pos-3 - Store interpolator 010 CLIPw.xyz VF00, VF00 LQ.xyzw VF15, (0+1*vertexSize)(VI11) ; Clear clip flag - Load new pos-3 ;---------------------------------------------------------------------------- ;//================================================================================================================ ;//==================================== CLIPPING DATA EXPANDER ==================================================== ;//================================================================================================================ TSEExpanderLoop:;---------------------------------------------------------------- CLIPw.xyz VF01, VF03 SQ.xyzw VF03, 4(VI14) ; Clip pos-1 - Store interp-1 CLIPw.xyz VF23, VF04 SQ.xyzw VF04, 0(VI14) ; Clip pos-2 - Store interp-2 CLIPw.xyz VF25, VF05 SQ.xyzw VF05, 2(VI14) ; Clip pos-3 - Store interp-3 MULAw.xyzw ACC, VF31, VF00 MOVE.xyzw VF01, VF23 ; Transform pos-3 - Save clip vect2 MADDAx.xyw ACC, VF28, VF15 IADDIU VI08, VI14, 6 ; Transform pos-3 - Increment ring memory MADDAy.xyw ACC, VF29, VF15 IADDIU VI03, VI14, 0 ; Transform pos-3 - Ring Pointer TSEWall1:;======================================================================= ;//=============== CLIPPING PLAN : Z= Zmin ===================== ;============================================================================ ADDx.xyzw VF23, VF25, VF00 FCAND VI01, 0xffffff ; Save clip vect3 - Test clipping flag 1111 1111 1111 1111 1111 1111 MADDz.xyzw VF15, VF30, VF15 IBEQ VI01, VI00, TSEFullTrig ; Transform pos-3 - Trig inside frustum ADDx.xyzw VF16, VF03, VF00 FCOR VI01, 0x7df7df ; Save Interp-1 - Test clipping flag 0111 1101 1111 0111 1101 1111 ADDw.y VF06, VF00, VF18 IBNE VI01, VI00, TSEFullClip ; Vert-1 zpos - Trig outside Zmin clipping plan ADDw.x VF06, VF00, VF03 FCAND VI01, 0x820820 ; Vert-2 zpos - Test clipping flag 1000 0010 0000 1000 0010 0000 NOP IBEQ VI01, VI00, TSEWall2 ; - Trig not intersecting zmin clip plan SUBw.w VF20, VF18, VF16 LQ.xyzw VF17, -1(VI08) ; Distz1-2 - Load interpolator-1 CLIPw.xyz VF00, VF00 IADDIU VI04, VI08, 0 ; Shift Clip flag - Set ring pointer to end of ring memory TSERing1:;----------------------------------------------------------------------- SUBw.xy VF07, VF06, VF27 LQ.xyzw VF08, 2(VI03) ; Build clip test - Load interp-2 ADDy.x VF06, VF00, VF06 LQ.xyzw VF19, 1(VI03) ; Swap interpolator - Load interpolator-2 MUL.xy VF09, VF18, VF24 IADDIU VI03, VI03, 2 ; Restore Clip test - Increment ring pointer ADDA.z ACC, VF00, VF26 DIV Q, VF00w, VF20w ; Restore Clip test - Launch 1/D calc ADDw.y VF06, VF00, VF08 FMAND VI01, VI02 ; Interpolator y - Test Fmac register MADDw.z VF09, VF24, VF18 IBEQ VI01, VI02, TSENext1 ; Restore Clip test - Full Clipped segment MULAy.xyw ACC, VF16, VF07 MOVE.xyzw VF16, VF18 ; Calc new pos - Swap interp2-1 MSUBx.xyw VF22, VF18, VF07 IBEQ VI01, VI00, TSESwap1 ; Calc new pos - Full segment inside frustum MULAy.xyzw ACC, VF17, VF07 NOP ; Calc new Interp MSUBx.xyzw VF21, VF19, VF07 NOP ; Calc new Interp NOP NOP ; MULq.xyw VF22, VF22, Q NOP ; Scale new pos SUBw.z VF20, VF00, VF27 NOP ; Use Zmin Clip pos MULq.xyzw VF21, VF21, Q IADDIU VI02, VI00, 0x0040 ; Scale new Interp - Bit mask 0000 0000 0100 0000 NOP NOP ; MUL.xy VF20, VF22, VF24 SQI.xyzw VF22,(VI08++) ; Final Clip test - Store interpolated position NOP NOP ; NOP SQI.xyzw VF21,(VI08++) ; - Store new trig interpolator NOP IBEQ VI01, VI02, TSENext1 ; - Test Fmac second position CLIPw.xyz VF20, VF22 IADDIU VI02, VI00, 0x00c0 ; Refresh clip info - Restore Fmac filter in vi02 TSESwap1:;----------------------------------------------------------------------- NOP SQI.xyzw VF18,(VI08++) ; - Store last position CLIPw.xyz VF09, VF18 SQI.xyzw VF19,(VI08++) ; Refresh clip info - Store last interpolator TSENext1:;----------------------------------------------------------------------- ADDx.xyzw VF18, VF08, VF00 IBNE VI03, VI04, TSERing1 ; Swap second vert - Ring End test SUBw.w VF20, VF08, VF16 MOVE.xyzw VF17, VF19 ; Distz1-2 - Swap interpolators2-1 ;---------------------------------------------------------------------------- NOP IBEQ VI08, VI04, TSEFullClip ; - Test data consistance NOP LQ.xyzw VF16, -2(VI08) ; - Load first vertex for next stage TSEWall2:;======================================================================= ;//=============== CLIPPING PLAN : Z= Zmax ===================== ;============================================================================ NOP FCAND VI01, 0x7df7df ; - Test clipping flag 0000 0001 1111 0111 1101 1111 NOP IBEQ VI01, VI00, TSEMetaFormer ; - End clipping test SUBw.y VF06, VF00, VF18 FCOR VI01, 0xbefbef ; Vert-1 zpos - Test clipping flag 1111 1110 1111 1011 1110 1111 SUBw.x VF06, VF00, VF16 IBNE VI01, VI00, TSEFullClip ; Vert-2 zpos - Trig outside zmax clipping plan NOP FCAND VI01, 0x410410 ; - Test Clipping Flag 0000 0001 0000 1000 0001 0000 NOP IBEQ VI01, VI00, TSEWall3 ; - Trig not intersecting this wall NOP LQ.xyzw VF17, -1(VI08) ; - Load interpolator-1 SUBx.y VF20, VF06, VF06 IADDIU VI04, VI08, 0 ; Distz1-2 - Set ring pointer to end of ring memory TSERing2:;----------------------------------------------------------------------- ADDw.xy VF07, VF06, VF26 LQ.xyzw VF08, 2(VI03) ; Build clip test - Load interp-2 ADDx.xyzw VF22, VF16, VF00 LQ.xyzw VF19, 1(VI03) ; Transfer interp-1 - Load interpolator-2 ADDx.xyzw VF16, VF18, VF00 IADDIU VI03, VI03, 2 ; Swap interp2-1 - Increment ring pointer ADDy.x VF06, VF00, VF06 DIV Q, VF00w, VF20y ; Swap interpolator - Launch 1/D calc SUBw.y VF06, VF00, VF08 FMAND VI01, VI02 ; Interpolator y - Test Fmac register MULAy.xyzw ACC, VF22, VF07 IBEQ VI01, VI02, TSENext2 ; Calc new pos - Full Clipped segment MSUBx.xyzw VF22, VF16, VF07 SQ.xyzw VF22, 0(VI08) ; Calc new pos - Store first position MULAy.xyzw ACC, VF17, VF07 SQ.xyzw VF17, 1(VI08) ; Calc new Interp - Store first interpolator MSUBx.xyzw VF21, VF19, VF07 IBEQ VI01, VI00, TSENext2 ; Calc new Interp - Full segment inside frustum NOP IADDIU VI08, VI08, 2 ; Use Zmax pos - Increment vertex counter NOP NOP ; Use Zmax pos MULq.xyzw VF22, VF22, Q IADDIU VI02, VI00, 0x0040 ; Scale new pos - Bit mask 0000 0000 0100 0000 MULq.xyzw VF21, VF21, Q NOP ; Scale new Interp NOP IBEQ VI01, VI02, TSESwap2 ; - Test Fmac second position NOP IADDIU VI02, VI00, 0x00c0 ; - Restore Fmac filter in vi02 NOP ISUBIU VI08, VI08, 2 ; - Decrement vertex counter TSESwap2:;----------------------------------------------------------------------- NOP SQI.xyzw VF22,(VI08++) ; - Store interpolated position NOP SQI.xyzw VF21,(VI08++) ; - Store new trig interpolator TSENext2:;----------------------------------------------------------------------- ADDx.xyzw VF18, VF08, VF00 IBNE VI03, VI04, TSERing2 ; Swap second vert - Ring End test SUBx.y VF20, VF06, VF06 MOVE.xyzw VF17, VF19 ; Distz1-2 - Swap interpolators2-1 ;---------------------------------------------------------------------------- NOP LQ.xyzw VF16, -2(VI08) ; - Load first vertex for next stage NOP IBEQ VI08, VI04, TSEFullClip ; - Test data consistance TSEWall3:;======================================================================= ;//=============== CLIPPING PLAN : Y = -Z ===================== ;============================================================================ ADDAw.y ACC, VF00, VF18 FCAND VI01, 0x3cf3cf ; Vert-1 z+y - Test clipping flag 0000 0000 1111 0011 1100 1111 MADDy.y VF06, VF27, VF18 IBEQ VI01, VI00, TSEMetaFormer ; Vert-1 z+y - End clipping test ADDAw.x ACC, VF00, VF16 FCOR VI01, 0xdf7df7 ; Vert-2 z+y - Test clipping flag 1111 1111 0111 1101 1111 0111 MADDy.x VF06, VF27, VF16 IBNE VI01, VI00, TSEFullClip ; Vert-2 z+y - Trig outside y=-z clipping plan NOP FCAND VI01, 0x208208 ; - Test clipping flag 0000 0010 0000 1000 0010 0000 NOP IBEQ VI01, VI00, TSEWall4 ; - Trig not intersecting this wall NOP LQ.xyzw VF17, -1(VI08) ; - Load interpolator-1 SUBx.y VF20, VF06, VF06 IADDIU VI04, VI08, 0 ; Dist y+z1-2 - Set ring pointer to end of ring memory TSERing3:;----------------------------------------------------------------------- ADD.xy VF07, VF06, VF00 LQ.xyzw VF08, 2(VI03) ; Build clip test - Load interp-2 ADDx.xyzw VF22, VF16, VF00 LQ.xyzw VF19, 1(VI03) ; Transfer interp-1 - Load interpolator-2 ADDx.xyzw VF16, VF18, VF00 IADDIU VI03, VI03, 2 ; Swap interp2-1 - Increment ring pointer ADDy.x VF06, VF00, VF06 DIV Q, VF00w, VF20y ; Swap interpolator - Launch 1/D calc ADDAw.y ACC, VF00, VF08 FMAND VI01, VI02 ; Interpolator y - Test Fmac register MADDy.y VF06, VF27, VF08 SQ.xyzw VF22, 0(VI08) ; Interpolator y - Store first position MULAy.xyzw ACC, VF22, VF07 IBEQ VI01, VI02, TSENext3 ; Calc new pos - Full Clipped segment MSUBx.xyzw VF22, VF16, VF07 SQ.xyzw VF17, 1(VI08) ; Calc new pos - Store first interpolator MULAy.xyzw ACC, VF17, VF07 IBEQ VI01, VI00, TSENext3 ; Calc new Interp - Full segment inside frustum MSUBx.xyzw VF21, VF19, VF07 IADDIU VI08, VI08, 2 ; Calc new Interp - Increment vertex counter NOP NOP ; NOP IADDIU VI02, VI00, 0x0040 ; - Bit mask 0000 0000 0100 0000 MULq.xyzw VF22, VF22, Q NOP ; Scale new pos MULq.xyzw VF21, VF21, Q NOP ; Scale new Interp NOP IBEQ VI01, VI02, TSESwap3 ; - Test Fmac second position NOP IADDIU VI02, VI00, 0x00c0 ; - Restore Fmac filter in vi02 NOP ISUBIU VI08, VI08, 2 ; - Decrement vertex counter TSESwap3:;----------------------------------------------------------------------- NOP SQI.xyzw VF22,(VI08++) ; - Store interpolated position NOP SQI.xyzw VF21,(VI08++) ; - Store new trig interpolator TSENext3:;----------------------------------------------------------------------- ADDx.xyzw VF18, VF08, VF00 IBNE VI03, VI04, TSERing3 ; Swap second vert - Ring End test SUBx.y VF20, VF06, VF06 MOVE.xyzw VF17, VF19 ; Dist1-2 - Swap interpolators2-1 ;---------------------------------------------------------------------------- NOP LQ.xyzw VF16, -2(VI08) ; - Load first vertex for next stage NOP IBEQ VI08, VI04, TSEFullClip ; - Test data consistance TSEWall4:;======================================================================= ;//=============== CLIPPING PLAN : Y = Z ===================== ;============================================================================ ADDAw.y ACC, VF00, VF18 FCAND VI01, 0x1c71c7 ; Vert-1 z-y - Test clipping flag 0000 0000 0111 0001 1100 0111 MSUBy.y VF06, VF27, VF18 IBEQ VI01, VI00, TSEMetaFormer ; Vert-1 z-y - End clipping test ADDAw.x ACC, VF00, VF16 FCOR VI01, 0xefbefb ; Vert-2 z-y - Test clipping flag 1111 1111 1011 1110 1111 1011 MSUBy.x VF06, VF27, VF16 IBNE VI01, VI00, TSEFullClip ; Vert-2 z-y - Trig outside y=z clipping plan NOP FCAND VI01, 0x104104 ; - Test clipping flag 0000 0000 0100 0001 0000 0100 NOP IBEQ VI01, VI00, TSEWall5 ; - Trig not intersecting this wall NOP LQ.xyzw VF17, -1(VI08) ; - Load interpolator-1 SUBx.y VF20, VF06, VF06 IADDIU VI04, VI08, 0 ; Dist y+z1-2 - Set ring pointer to end of ring memory TSERing4:;----------------------------------------------------------------------- ADD.xy VF07, VF06, VF00 LQ.xyzw VF08, 2(VI03) ; Build clip test - Load interp-2 ADDx.xyzw VF22, VF16, VF00 LQ.xyzw VF19, 1(VI03) ; Transfer interp-1 - Load interpolator-2 ADDx.xyzw VF16, VF18, VF00 IADDIU VI03, VI03, 2 ; Swap interp2-1 - Increment ring pointer ADDy.x VF06, VF00, VF06 DIV Q, VF00w, VF20y ; Swap interpolator - Launch 1/D calc ADDAw.y ACC, VF00, VF08 FMAND VI01, VI02 ; Interpolator y - Test Fmac register MSUBy.y VF06, VF27, VF08 SQ.xyzw VF22, 0(VI08) ; Interpolator y - Store first position MULAy.xyzw ACC, VF22, VF07 IBEQ VI01, VI02, TSENext4 ; Calc new pos - Full Clipped segment MSUBx.xyzw VF22, VF16, VF07 SQ.xyzw VF17, 1(VI08) ; Calc new pos - Store first interpolator MULAy.xyzw ACC, VF17, VF07 IBEQ VI01, VI00, TSENext4 ; Calc new Interp - Full segment inside frustum MSUBx.xyzw VF21, VF19, VF07 IADDIU VI08, VI08, 2 ; Calc new Interp - Increment vertex counter NOP NOP ; NOP IADDIU VI02, VI00, 0x0040 ; - Bit mask 0000 0000 0100 0000 MULq.xyzw VF22, VF22, Q NOP ; Scale new pos MULq.xyzw VF21, VF21, Q NOP ; Scale new Interp NOP IBEQ VI01, VI02, TSESwap4 ; - Test Fmac second position NOP IADDIU VI02, VI00, 0x00c0 ; - Restore Fmac filter in vi02 NOP ISUBIU VI08, VI08, 2 ; - Decrement vertex counter TSESwap4:;----------------------------------------------------------------------- NOP SQI.xyzw VF22,(VI08++) ; - Store interpolated position NOP SQI.xyzw VF21,(VI08++) ; - Store new trig interpolator TSENext4:;----------------------------------------------------------------------- ADDx.xyzw VF18, VF08, VF00 IBNE VI03, VI04, TSERing4 ; Swap second vert - Ring End test SUBx.y VF20, VF06, VF06 MOVE.xyzw VF17, VF19 ; Dist1-2 - Swap interpolators2-1 ;---------------------------------------------------------------------------- NOP LQ.xyzw VF16, -2(VI08) ; - Load first vertex for next stage NOP IBEQ VI08, VI04, TSEFullClip ; - Test data consistance TSEWall5:;======================================================================= ;//=============== CLIPPING PLAN : X = -Z ===================== ;============================================================================ ADDAw.y ACC, VF00, VF18 FCAND VI01, 0x0c30c3 ; Vert-1 z+x - Test clipping flag 0000 0000 0011 0000 1100 0011 MADDx.y VF06, VF26, VF18 IBEQ VI01, VI00, TSEMetaFormer ; Vert-1 z+x - End clipping test ADDAw.x ACC, VF00, VF16 FCOR VI01, 0xf7df7d ; Vert-2 z+x - Test clipping flag 1111 1111 1101 1111 0111 1101 MADDx.x VF06, VF26, VF16 IBNE VI01, VI00, TSEFullClip ; Vert-2 z+x - Trig outside x=-z clipping plan NOP FCAND VI01, 0x082082 ; - Test clipping flag 0000 0000 0010 0000 1000 0010 NOP IBEQ VI01, VI00, TSEWall6 ; - Trig not intersecting this wall NOP LQ.xyzw VF17, -1(VI08) ; - Load interpolator-1 SUBx.y VF20, VF06, VF06 IADDIU VI04, VI08, 0 ; Dist y+z1-2 - Set ring pointer to end of ring memory TSERing5:;----------------------------------------------------------------------- ADD.xy VF07, VF06, VF00 LQ.xyzw VF08, 2(VI03) ; Build clip test - Load interp-2 ADDx.xyzw VF22, VF16, VF00 LQ.xyzw VF19, 1(VI03) ; Transfer interp-1 - Load interpolator-2 ADDx.xyzw VF16, VF18, VF00 IADDIU VI03, VI03, 2 ; Swap interp2-1 - Increment ring pointer ADDy.x VF06, VF00, VF06 DIV Q, VF00w, VF20y ; Swap interpolator - Launch 1/D calc ADDAw.y ACC, VF00, VF08 FMAND VI01, VI02 ; Interpolator y - Test Fmac register MADDx.y VF06, VF26, VF08 SQ.xyzw VF22, 0(VI08) ; Interpolator y - Store first position MULAy.xyzw ACC, VF22, VF07 IBEQ VI01, VI02, TSENext5 ; Calc new pos - Full Clipped segment MSUBx.xyzw VF22, VF16, VF07 SQ.xyzw VF17, 1(VI08) ; Calc new pos - Store first interpolator MULAy.xyzw ACC, VF17, VF07 IBEQ VI01, VI00, TSENext5 ; Calc new Interp - Full segment inside frustum MSUBx.xyzw VF21, VF19, VF07 IADDIU VI08, VI08, 2 ; Calc new Interp - Increment vertex counter NOP NOP ; NOP IADDIU VI02, VI00, 0x0040 ; - Bit mask 0000 0000 0100 0000 MULq.xyzw VF22, VF22, Q NOP ; Scale new pos MULq.xyzw VF21, VF21, Q NOP ; Scale new Interp NOP IBEQ VI01, VI02, TSESwap5 ; - Test Fmac second position NOP IADDIU VI02, VI00, 0x00c0 ; - Restore Fmac filter in vi02 NOP ISUBIU VI08, VI08, 2 ; - Decrement vertex counter TSESwap5:;----------------------------------------------------------------------- NOP SQI.xyzw VF22,(VI08++) ; - Store interpolated position NOP SQI.xyzw VF21,(VI08++) ; - Store new trig interpolator TSENext5:;----------------------------------------------------------------------- ADDx.xyzw VF18, VF08, VF00 IBNE VI03, VI04, TSERing5 ; Swap second vert - Ring End test SUBx.y VF20, VF06, VF06 MOVE.xyzw VF17, VF19 ; Dist1-2 - Swap interpolators2-1 ;---------------------------------------------------------------------------- NOP LQ.xyzw VF16, -2(VI08) ; - Load first vertex for next stage NOP IBEQ VI08, VI04, TSEFullClip ; - Test data consistance TSEWall6:;======================================================================= ;//=============== CLIPPING PLAN : X = Z ===================== ;============================================================================ ADDAw.y ACC, VF00, VF18 FCAND VI01, 0x041041 ; Vert-1 z-x - Test clipping flag 0000 0000 0001 0000 0100 0001 MSUBx.y VF06, VF26, VF18 IBEQ VI01, VI00, TSEMetaFormer ; Vert-1 z-x - End clipping test ADDAw.x ACC, VF00, VF16 FCOR VI01, 0xfbefbe ; Vert-2 z-x - Test clipping flag 1111 1111 1110 1110 1011 1110 MSUBx.x VF06, VF26, VF16 IBNE VI01, VI00, TSEFullClip ; Vert-2 z-x - Trig outside x=z clipping plan NOP FCAND VI01, 0x041041 ; - Test clipping flag 0000 0000 0001 0001 0100 0001 NOP IBEQ VI01, VI00, TSEMetaFormer ; - Trig not intersecting this wall NOP LQ.xyzw VF17, -1(VI08) ; - Load interpolator-1 SUBx.y VF20, VF06, VF06 IADDIU VI04, VI08, 0 ; Dist y+z1-2 - Set ring pointer to end of ring memory TSERing6:;----------------------------------------------------------------------- ADD.xy VF07, VF06, VF00 LQ.xyzw VF08, 2(VI03) ; Build clip test - Load interp-2 ADDx.xyzw VF22, VF16, VF00 LQ.xyzw VF19, 1(VI03) ; Transfer interp-1 - Load interpolator-2 ADDx.xyzw VF16, VF18, VF00 IADDIU VI03, VI03, 2 ; Swap interp2-1 - Increment ring pointer ADDy.x VF06, VF00, VF06 DIV Q, VF00w, VF20y ; Swap interpolator - Launch 1/D calc ADDAw.y ACC, VF00, VF08 FMAND VI01, VI02 ; Interpolator y - Test Fmac register MSUBx.y VF06, VF26, VF08 SQ.xyzw VF22, 0(VI08) ; Interpolator y - Store first position MULAy.xyzw ACC, VF22, VF07 IBEQ VI01, VI02, TSENext6 ; Calc new pos - Full Clipped segment MSUBx.xyzw VF22, VF16, VF07 SQ.xyzw VF17, 1(VI08) ; Calc new pos - Store first interpolator MULAy.xyzw ACC, VF17, VF07 IBEQ VI01, VI00, TSENext6 ; Calc new Interp - Full segment inside frustum MSUBx.xyzw VF21, VF19, VF07 IADDIU VI08, VI08, 2 ; Calc new Interp - Increment vertex counter NOP NOP ; NOP IADDIU VI02, VI00, 0x0040 ; - Bit mask 0000 0000 0100 0000 MULq.xyzw VF22, VF22, Q NOP ; Scale new pos MULq.xyzw VF21, VF21, Q NOP ; Scale new Interp NOP IBEQ VI01, VI02, TSESwap6 ; - Test Fmac second position NOP IADDIU VI02, VI00, 0x00c0 ; - Restore Fmac filter in vi02 NOP ISUBIU VI08, VI08, 2 ; - Decrement vertex counter TSESwap6:;----------------------------------------------------------------------- NOP SQI.xyzw VF22,(VI08++) ; - Store interpolated position NOP SQI.xyzw VF21,(VI08++) ; - Store new trig interpolator TSENext6:;----------------------------------------------------------------------- ADDx.xyzw VF18, VF08, VF00 IBNE VI03, VI04, TSERing6 ; Swap second vert - Ring End test SUBx.y VF20, VF06, VF06 MOVE.xyzw VF17, VF19 ; Dist1-2 - Swap interpolators2-1 TSEMetaFormer:;================================================================== ;//=============== INSERT A NEW DNA STRUCTURE ====================== ;============================================================================ NOP IBEQ VI08, VI04, TSEFullClip ; - Test data consistency NOP LQ.xyzw VF18, (0-1*vertexSize)(VI07) ; - Load first vertex NOP IBNE VI05, VI00, TSEIgnition ; - Degeneration test NOP IADDIU VI07, VI07, vertexSize ; - Increment clipping buffer NOP IADDIU VI09, VI09, 1 ; - Increment number of vertices NOP SQ.xyzw VF18, (0-1*vertexSize)(VI07) ; - Store degenerated vertex NOP IADDIU VI07, VI07, vertexSize ; - Increment clipping buffer TSEIgnition:;-------------------------------------------------------------------- NOP LQI.xyw VF20, (VI04++) ; - Load new vertex ADD.z VF20, VF31, VF00 LQI.xyzw VF22, (VI04++) ; Use Zbuff range - Load new interpolator ADD.z VF03, VF31, VF00 LQ.xyzw VF06, (1-2*vertexSize)(VI11) ; Use Zbuff range - Load uv-1 NOP LQ.xyzw VF07, (1-1*vertexSize)(VI11) ; - Load uv-2 NOP LQ.xyzw VF08, (1-0*vertexSize)(VI11) ; - Load uv-3 NOP LQ.xyzw VF09, (2-2*vertexSize)(VI11) ; - Load rgba-1 MULAy.xyzw ACC, VF06, VF22 LQ.xyzw VF10, (2-1*vertexSize)(VI11) ; Interp uv - Load rgba-2 MADDAz.xyzw ACC, VF07, VF22 LQ.xyzw VF11, (2-0*vertexSize)(VI11) ; Interp uv - Load rgba-3 MADDw.xyzw VF16, VF08, VF22 LQ.xyzw VF12, (3-2*vertexSize)(VI11) ; Interp uv - Load normal-1 MULAy.xyzw ACC, VF09, VF22 LQ.xyzw VF13, (3-1*vertexSize)(VI11) ; Interp rgba - Load normal-2 MADDAz.xyzw ACC, VF10, VF22 LQ.xyzw VF14, (3-0*vertexSize)(VI11) ; Interp rgba - Load normal-3 MADDw.xyzw VF17, VF11, VF22 LQD.xyzw VF21, (--VI08) ; Interp rgba - Load new vertex MULAy.xyzw ACC, VF12, VF22 LQD.xyw VF03, (--VI08) ; Inperp normal - Load new interpolator MADDAz.xyzw ACC, VF13, VF22 ISUB VI01, VI08, VI04 ; Interp normal - Number of remaining data MADDw.xyzw VF18, VF14, VF22 SQ.xyzw VF20, (0-1*vertexSize)(VI07) ; Interp normal - Store Degenerated vertex TSEMetaFormerLoop:;-------------------------------------------------------------- MULAy.xyzw ACC, VF06, VF21 SQI.xyzw VF20, (VI07++) ; Inperp uv - Store position MADDAz.xyzw ACC, VF07, VF21 LQI.xyw VF20, (VI04++) ; Interp uv - Load new vertex MADDw.xyzw VF16, VF08, VF21 SQI.xyzw VF16, (VI07++) ; Interp uv - Store uv MULAy.xyzw ACC, VF09, VF21 SQI.xyzw VF17, (VI07++) ; Interp rgba - Store rgba MADDAz.xyzw ACC, VF10, VF21 LQI.xyzw VF22, (VI04++) ; Interp rgba - Load new interpolator MADDw.xyzw VF17, VF11, VF21 SQI.xyzw VF18, (VI07++) ; Interp rgba - Store normal MULAy.xyzw ACC, VF12, VF21 IBLTZ VI01, TSEMetaFormerEnd ; Interp normal - End test MADDAz.xyzw ACC, VF13, VF21 IADDIU VI09, VI09, 1 ; Interp normal - Increment number of vertices MADDw.xyzw VF18, VF14, VF21 ISUB VI01, VI08, VI04 ; Interp normal - Number of remaining data MULAy.xyzw ACC, VF06, VF22 SQI.xyzw VF03, (VI07++) ; Interp uv - Store position MADDAz.xyzw ACC, VF07, VF22 LQD.xyzw VF21, (--VI08) ; Interp uv - Load new interpolator MADDw.xyzw VF16, VF08, VF22 SQI.xyzw VF16, (VI07++) ; Interp uv - Store uv MULAy.xyzw ACC, VF09, VF22 SQI.xyzw VF17, (VI07++) ; Interp rgba - Store rgba MADDAz.xyzw ACC, VF10, VF22 LQD.xyw VF03, (--VI08) ; Interp rgba - Load new vertex MADDw.xyzw VF17, VF11, VF22 SQI.xyzw VF18, (VI07++) ; Interp rgba - Store normal MULAy.xyzw ACC, VF12, VF22 IADDIU VI09, VI09, 1 ; Interp normal - Increment number of vertices MADDAz.xyzw ACC, VF13, VF22 IBGEZ VI01, TSEMetaFormerLoop ; Interp normal - End test MADDw.xyzw VF18, VF14, VF22 ISUB VI01, VI08, VI04 ; Interp normal - Number of remaining data TSEMetaFormerEnd:;--------------------------------------------------------------- NOP LQ.xyzw VF03, (0-1*vertexSize)(VI07) ; - Load Last vertex position NOP IADDIU VI07, VI07, vertexSize ; - Increment clipping buffer adress NOP IADDIU VI09, VI09, 2 ; - Increment number of vertices NOP B TSEFullClip ; - Jump to clipping flag NOP SQ.xyzw VF03, (0-1*vertexSize)(VI07) ; - Store degenerated vertex TSEFullTrig:;==================================================================== ;//=============== START A DNA STRUCTURE ====================== ;============================================================================ NOP IBEQ VI05, VI00, TSEByPass ; - Degeration test NOP IADDIU VI09, VI09, 1 ; - Increment number of vertices NOP IADDIU VI07, VI07, vertexSize ; - Increment clipping buffer adress NOP SQ.xyzw VF03, (0-1*vertexSize)(VI07) ; - Store degenerated vertex NOP LQ.xyzw VF06, (1-2*vertexSize)(VI11) ; - Load uvs NOP LQ.xyzw VF07, (2-2*vertexSize)(VI11) ; - Load rgbas NOP LQ.xyzw VF08, (3-2*vertexSize)(VI11) ; - Load normal NOP SQI.xyzw VF03, (VI07++) ; - Store position NOP SQI.xyzw VF06, (VI07++) ; - Store uvs NOP SQI.xyzw VF07, (VI07++) ; - Store rgbas NOP SQI.xyzw VF08, (VI07++) ; - Store normal NOP LQ.xyzw VF06, (1-1*vertexSize)(VI11) ; - Load uvs NOP LQ.xyzw VF07, (2-1*vertexSize)(VI11) ; - Load rgbas NOP LQ.xyzw VF08, (3-1*vertexSize)(VI11) ; - Load normal NOP SQI.xyzw VF04, (VI07++) ; - Store position NOP SQI.xyzw VF06, (VI07++) ; - Store uvs NOP SQI.xyzw VF07, (VI07++) ; - Store rgbas NOP SQI.xyzw VF08, (VI07++) ; - Store normal NOP IADDIU VI09, VI09, 3 ; - Increment number of vertices NOP IADDIU VI05, VI00, 0 ; - Reset Clipping flag TSEByPass:;====================================================================== ;//=============== FILL THE DNA STRUCTURE ====================== ;============================================================================ NOP LQ.xyzw VF06, (1-0*vertexSize)(VI11) ; - Load uvs NOP LQ.xyzw VF07, (2-0*vertexSize)(VI11) ; - Load rgbas NOP LQ.xyzw VF08, (3-0*vertexSize)(VI11) ; - Load normal NOP SQI.xyzw VF05, (VI07++) ; - Store position NOP SQI.xyzw VF06, (VI07++) ; - Store uv NOP SQI.xyzw VF07, (VI07++) ; - Store rgbas NOP B TSERedLine ; - Bypass Clipping MULw.z VF25, VF24, VF15 SQI.xyzw VF08, (VI07++) ; Zmapping pos-3 - Store normal TSEFullClip:;==================================================================== ;//=============== FLAG OF DNA MODIFICATION ===================== ;============================================================================ MULw.z VF25, VF24, VF15 IADDIU VI05, VI00, 1 ; Zmapping pos-3 - Degeneration flag TSERedLine:;===================================================================== ;//=============== LOOP OVER INPUT BUFFER ======================= ;============================================================================ ADDx.xyzw VF03, VF04, VF00 ISUBIU VI01, VI07, TSClipRedLine ; Shift pos2-1 - Test Clipping buffer limit ADDx.xyzw VF04, VF05, VF00 IADDIU VI11, VI11, (1*vertexSize) ; Shift pos3-2 - Increment input buffe adress MUL.xy VF25, VF15, VF24 IBGEZ VI01, TSEOverLoad ; XYZmapping pos-3 - Test clipping buffer filling ADDx.xyzw VF05, VF15, VF00 LQ.xyzw VF15, (0+1*vertexSize)(VI11) ; Shift pos3-3 - Load new vertex position ADD.z VF25, VF25, VF26 IBNE VI11, VI10, TSEExpanderLoop ; Zmapping pos-3 - End test CLIPw.xyz VF00, VF00 MOVE.xyzw VF18, VF04 ; Shift clip flag - Shift interp1 TSEOverLoad:;//================================================================== ;//================================================================================================================ ;//======================================= ======================================================= ;//=================== THE END ========================= ;//======================================= ======================================================= ;//============================================================================================= JCL Janvier 2001 =