.equ vertexTop, 0x3d0 .equ numInAttribs, 4 .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_default vu1_default: 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 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 ;; Convert normals and colors to float. this is also where we'd do skinning probably ;; also clear ADC flag here but eventually this shouldn't happen if the geomtry has none nop xtop vi02 ; input pointer nop xitop vi01 ; vertex count PreprocLoop: nop lq vf02,2(vi02) ; load rgba nop lq.xyz vf03,3(vi02) ; load normal nop mr32.w vf01,vf00 ; clear ADC flag nop nop itof0 vf02,vf02 loi 0.007874015748031496 ; convert rgba itof0.xyz vf03,vf03 nop ; convert normal nop nop nop nop nop nop muli.xyz vf03,vf03,i nop ; scale normal nop sq.w vf01,0(vi02) ; store cleared ADC flag nop isubiu vi01,vi01,1 nop sq vf02,2(vi02) ; store rgba nop sq.xyz vf03,3(vi02) ; store normal nop ibne vi01,vi00,PreprocLoop nop iaddiu vi02,vi02,numInAttribs .include "lighting.vu" nop xtop vi02 ; input pointer nop xitop vi01 ; vertex count nop lq vf10,0(vi02) ; xyz nop lq vf11,2(vi02) ; rgba nop lq vf12,1(vi02) ; st ProcessLoop: 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 nop move.xy vf03,vf12 ; 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 loi 255.0 ; pos.xyz*scale.xyz nop nop 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,vf11 lq vf10,0(vi02) ; convert rgba ftoi4 vf01,vf01 lq vf11,2(vi02) ; convert xyzf nop lq vf12,1(vi02) nop sq vf03,0(vi03) ; stq nop sq vf02,1(vi03) ; rgba nop sq vf01,2(vi03) ; xyzf nop ibne vi01,vi00,ProcessLoop 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