.equ vertexTop, 0x3f0 .equ numInAttribs, 3 .equ numOutAttribs, 3 .equ numOutBuf, 2 .equ vertCount, ((vertexTop-numOutBuf)/(numInAttribs*2+numOutAttribs*numOutBuf)) .equ offset, (vertCount*numInAttribs) .equ outBuf1, (2*offset) ;.equ outSize, ((vertexTop-outBuf1-numOutBuf)/numOutBuf) .equ outSize, (1 + vertCount*numOutAttribs) .equ outBuf2, (outBuf1+outSize) .include "defines.inc" .balign 16,0 .global vu1_im3d vu1_im3d: DMAret * MPG 0, * .vu start: nop iaddiu vi12,vi00,outBuf1 nop iaddiu vi13,vi00,outBuf2 nop lq vf28,matrix0(vi00) nop lq vf29,matrix1(vi00) nop lq vf30,matrix2(vi00) nop lq vf31,matrix3(vi00) nop lq vf27,xyzwScale(vi00) nop lq vf26,xyzwOffset(vi00) nop lq vf25,colorScale(vi00) nop lq vf24,clipConsts(vi00) restart: nop xtop vi02 ; input pointer nop lq vf01,gifTag(vi00) ; GIF tag nop xitop vi01 ; vertex count nop iaddiu vi05,vi00,0x4000 nop iadd vi05,vi05,vi05 ; EOP bit nop ior vi05,vi05,vi01 ; enter vertex count nop sq vf01,0(vi12) ; store GIF tag nop isw.x vi05,0(vi12) nop iaddiu vi03,vi12,1 ; output pointer nop lq vf10,0(vi02) ; xyz nop lq vf11,1(vi02) ; st nop lq vf12,2(vi02) ; rgba loop: mulaw acc,vf31,vf00 nop maddax acc,vf28,vf10 nop ; xform pos madday acc,vf29,vf10 mr32.z vf01,vf00 ; - pos.z = 1.0 maddz.xyw vf01,vf30,vf10 mr32.z vf03,vf00 ; - st.q = 1.0 itof0 vf02,vf12 move.xy vf03,vf11 ; convert rgba nop nop nop nop miniy.w vf01,vf01,vf24 div q,vf00w,vf01w ; clamp to fog far - start perspective division mul.xyz vf22,vf01,vf27 nop ; pos.xyz*scale.xyz mul vf02,vf02,vf25 nop ; scale color nop nop maxx.w vf01,vf01,vf24 waitq ; clamp to fog near mulaq.xyz acc,vf22,q nop ; scale+shift pos maddw.xyz vf01,vf26,vf00 nop ; scale+shift pos adda.w acc,vf26,vf10 nop ; calc fog NB: also adds ADC flag! madd.w vf01,vf01,vf27 iaddiu vi02,vi02,numInAttribs ; calc fog mulq.xyz vf03,vf03,q isubiu vi01,vi01,1 ; scale stq nop nop ftoi0 vf02,vf02 lq vf10,0(vi02) ; convert rgba ftoi4 vf01,vf01 lq vf11,1(vi02) ; convert xyzf nop lq vf12,2(vi02) nop sq vf03,0(vi03) ; stq nop sq vf02,1(vi03) ; rgba nop sq vf01,2(vi03) ; xyzf nop ibne vi01,vi00,loop nop iaddiu vi03,vi03,numOutAttribs nop xgkick vi12 nop iadd vi15,vi00,vi12 nop iadd vi12,vi00,vi13 nop[e] iadd vi13,vi00,vi15 nop nop nop b restart nop nop .EndMPG .EndDmaData