Copyright (C) 2001  Sony Computer Entertainment Inc.

$B%Y!<%7%C%/%5%s%W%k(B basic3d VU1$BHG(B
================================

<$B%5%s%W%k$N2r@b(B>
	EE Core$B$d(BVU0$B$G<BAu$7$F$$$?F);kJQ49$d%Q%1%C%H:n@.$N%W%m%;%9$r!"(B
	VU1$B%^%$%/%m%b!<%I$G9bB.$K=hM}$9$kNc$r<($7$^$9!#$=$N:]$KI,MW$J(B
	VUMem1$B$N%@%V%k%P%C%U%!=hM}$J$I$N%F%/%K%C%/$b<BAu$7!"$h$j9bB.$J(B
	$B%8%*%a%H%j=hM}$r<B8=$9$k4pAC$rDs6!$7$^$9!#(B

<$B%U%!%$%k(B>
	main.c		$B%a%$%s%W%m%0%i%`(B
	mathfunc.c	$BF);kJQ49Ey$N9TNs1i;;4X?t(B(CPUcore$BHG(B)
	mathfunc.h	$B%X%C%@%U%!%$%k(B
	cube.dsm	$B%*%V%8%'%/%H%G!<%?(B($BN)J}BN(B)(VU1$BMQ%Q%1%C%H7A<0(B)
	sjoy.c		$B%3%s%H%m!<%iFI$_9~$_4X?t(B
	sjoy.h		$B%3%s%H%m!<%iFI$_9~$_4X?t$N%X%C%@%U%!%$%k(B
	torus.dsm	$B%*%V%8%'%/%H%G!<%?(B($B%H!<%i%9(B $B%G!<%?J,3d(B)
			(VU1$BMQ%Q%1%C%H7A<0(B)
	torus1.dsm	$B%*%V%8%'%/%H%G!<%?(B($B%H!<%i%9(B $B%G!<%?J,3d(B)
			(VU1$BMQ%Q%1%C%H7A<0(B)
	flower.dsm	$B%F%/%9%A%c%G!<%?(B
	basic.vsm	VU1$B%^%$%/%m%b!<%I$N<B9TL?Na%U%!%$%k(B
	vu1dump.c	VU1$B%m!<%+%k%a%b%j$N%@%s%W4X?t(B

<$B%3%s%Q%$%kJ}K!(B>
	% make

<$B5/F0J}K!(B>
	% make run

<$B;EMM(B>
	$B%F%/%9%A%cIU$-(BTriangle Strip$B$N%-%e!<%V$rI=<($9$k!#(B
	$B%F%/%9%A%cIU$-(BTriangle$B$N%H!<%i%9$rI=<($9$k!#(B
	(select$B%\%?%s$G@Z$jBX$((B)

	Z$B%P%C%U%!$O(B24bit
	$B8w8;$O(B3$B$D(B
	$B%F%/%9%A%c$O(B32bit

  <$B%3%s%H%m!<%i$NA`:nJ}K!(B>
	$B","-(B($BJ}8~%-!<(B) : $B%*%V%8%'%/%H$N(Bx$B<42sE>(B
	$B"+"*(B           : $B%*%V%8%'%/%H$N(By$B<42sE>(B
	L1L2$B%\%?%s(B     : $B%*%V%8%'%/%H$N(Bz$B<42sE>(B
	$B""!{%\%?%s(B     : $B%o!<%k%I:BI87O$KBP$9$k%+%a%i$N(By$B<42sE>(B
	$B"$!_%\%?%s(B     : $B%o!<%k%I:BI87O$KBP$9$k%+%a%i$N(Bx$B<42sE>(B
	R1R2$B%\%?%s(B     : $B%+%a%i$NA0?J8eB`2sE>(B
	SELECT$B%\%?%s(B   : $B%*%V%8%'%/%H@Z$jBX$((B

<$B=hM}35N,(B>
	1. $B%F%/%9%A%c$r%m!<%I(B
	2. $B%Q%C%I%*!<%W%s(B
	3. $B%^%H%j%/%9!"8w8;%^%H%j%/%9$r(BVU1$B$XEO$9%Q%1%C%HCf$K%;%C%H(B
	4. VU1$B$X$N(BDMA kick
	5. 2$B$KLa$k(B

	VU1$B%^%$%/%m%W%m%0%i%`$G$O0J2<$N$h$&$J=hM}$r9T$C$F$$$^$9!#(B
	1. $B2sE>(B x $BF);kJQ49%^%H%j%/%9$r@_Dj(B
	2. $B3F<o%Q%i%a!<%?!J%^%H%j%/%9Ey!K$r(BVU1$B%l%8%9%?$K%m!<%I(B
	3. $BK!@~%Y%/%H%k!"Jd4V$9$k#2$D$N:BI8!"(BST$BCM!"?'$r%m!<%I(B
	4. $B:BI8Jd4V!"F);kJQ49!"8w8;7W;;$r$7$F7k2L$r(BVU1Mem$B$K%9%H%"(B
	5. 3. $B$KLa$k!#D:E@?t2s7+$jJV$9!#(B
	6. $B%9%H%"$5$l$?%G!<%?(B(Gif Packet)$B$r(BGS$B$X(BXGKICK

	VU1Mem$B>e$G$O%@%V%k%P%C%U%!%j%s%0$r9T$$$^$9!#(B


$B%G!<%?%U%m!<(B
--------------------------------------------------------------------------

<$B=i4|2=2aDx(B>
$B%a%$%s(BRAM                          GS$BFbB"(BRAM(4M)
  $B%F%/%9%A%c%G!<%?(B ----------------> $B%F%/%9%A%c%G!<%?E83+(B
  $B%*%V%8%'%/%H%G!<%?E83+(B
  $BF);kJQ499TNsEy$NE83+(B

<$B<B9T=hM}2aDx(B>
$B%a%$%s(BRAM                            VUMem1(16K)
  $B%*%V%8%'%/%H%G!<%?(B ----------------> GS$BE>AwMQ%Q%1%C%H%G!<%?E83+(B
  ($B3F<o%^%H%j%/%9!u(B       DMA$BE>Aw(B      ($B%8%*%a%H%j1i;;!$%@%V%k%P%C%U%!(B)
   $B%8%*%a%H%jA0%G!<%?(B)                 ($B%W%j%_%F%#%V%G!<%?(B(STQ,RGBA,XYZF))
                                                    |
                                                    |
GS$BFbB"(BRAM(4M) <-------------------------------------+
 $B%U%l!<%`!u(BZ$B%P%C%U%!=q$-9~$_(B                 GIF$B$K%G!<%?(BKick
 ($B%l%s%@%j%s%0(B)

$B%W%m%0%i%`$N@bL@(B($B>\:Y(B)
--------------------------------------------------------------------------

<$BJQ?t!&9=B$BN!&4X?t(B>$B!!!J(Bmathfunc.c$B$N4X?t$r=|$/!K(B

        My_dma_start            :VU1$B$XAw$k%Q%1%C%H72$N@hF,MWAG(B
        My_dma_next             :VU1$B$XAw$k(B2$B$D$a$N%Q%1%C%H$N@hF,MWAG(B
        My_matrix               :$B%Q%1%C%HCf$N(Blocal_screen$B%^%H%j%/%9(B
        My_rot_trans_matrix     :$B%Q%1%C%HCf$N(Blocal_world$B%^%H%j%/%9(B
        My_light_matrix         :$B%Q%1%C%HCf$N(Blocal_light$B%^%H%j%/%9(B
        My_cube_start           :cube$B%Q%1%C%H%G!<%?$N@hF,MWAG(B
        My_torus_start          :torus$B%Q%1%C%H%G!<%?$N@hF,MWAG(B
        My_texture1             :$B%F%/%9%A%c%G!<%?$N@hF,(B

        TexEnv          :ps2_gs_texenv$B9=B$BN$rE>Aw$9$k%Q%1%C%H:n@.$N9=B$BN(B

        camera_p        :$B%+%a%i0LCV(B
        camera_zd       :$B%+%a%i$N;k@~J}8~%Y%/%H%k(B
        camera_yd       :$B%+%a%i$N2<J}8~%Y%/%H%k(B
        camera_rot      :$B%+%a%i$N2sE>MQ%Y%/%H%k(B

        light0          :$B%i%$%H(B0
        light1          :$B%i%$%H(B1
        light2          :$B%i%$%H(B2
        color0          :$B%i%$%H(B0$B$N?'(B
        color1          :$B%i%$%H(B1$B$N?'(B
        color2          :$B%i%$%H(B2$B$N?'(B

        ambient         :$B4D6-8w(B

        obj_trans       :$B%*%V%8%'%/%H$N0\F0%Y%/%H%k(B
        obj_rot         :$B%*%V%8%'%/%H$N2sE>%Y%/%H%k(B

        local_world     :$B%*%V%8%'%/%H(BLocal$B:BI8$r(BWorld$B:BI87O$KJQ49$9$k9TNs(B
        world_view      :World$B:BI87O$r(BView$B:BI87O$KJQ49$9$k9TNs(B
        view_screen     :View$B:BI87O$r(BScreen$B:BI87O$KJQ49$9$k9TNs(B
        local_screen    :Local$B:BI8$r(BScreen$B:BI8$KJQ49$9$k9TNs(B($B>e#39TNs$N@Q(B)

        normal_light    :World$B:BI87O$K$*$1$kD:E@$NK!@~%Y%/%H%k$H%i%$%H$N(B
                         $BJ}8~%Y%/%H%k$NFb@Q$r<h$k$?$a$N9TNs(B
                         ($B%i%$%H$NJ}8~%Y%/%H%k$,%;%C%H$5$l$k(B)
        local_light     :normal_light$B9TNs$K(Blocal_world$B9TNs$r3]$1$F!"(B
                         Local$B:BI87O$K$*$1$kD:E@$NK!@~%Y%/%H%k$H(B
                         $B%i%$%H$NJ}8~%Y%/%H%k$NFb@Q$r<h$l$k$h$&$K$9$k9TNs(B
        light_color     :local_light$B9TNs$HD:E@$NK!@~%Y%/%H%k$N@Q$K$h$j(B
                         $B@8@.$5$l$?Fb@Q%Y%/%H%k$K3F%i%$%H$N?'(B(3$B?'!\4D6-8w(B)
                         $B$r3]$1$FOB$r$H$k9TNs(B
        local_color     :local_light$B$H(Blight_color$B$N@Q$r<h$C$?9TNs(B

        work            :$B0l;~E*$J:n6H$N$?$a$N9TNs(B

        ps2_gs_dbuff g_db :$B%@%V%k%P%C%U%!$r<BAu$9$k$?$a$N9=B$BN(B
        ps2_image g_img	  :$B%F%/%9%A%c$r(BGS$B%m!<%+%k%a%b%j$KE>Aw$9$k$?(B
                           $B$a$N9=B$BN(B
        TexEnv texenv	  :$B%F%/%9%A%c%G!<%?$rE>Aw$9$k$?$a$N%Q%1%C%H(B
                           $B$r:n@.$9$k9=B$BN(B

        void SetVu1PacketMatrix(void)
                        :VU1$B$KAw$k%Q%1%C%HFb$K%^%H%j%/%9$r%;%C%H$9$k4X?t(B

<main$B4X?tFb$NJQ?t(B>

        frame           :$B%@%V%k%P%C%U%!$G%U%j%C%W$r9T$&$?$a$N%9%$%C%A(B
        delta           :$B2sE>3Q$r@_Dj$9$k$?$a$NJQ?t(B
        obj_switch      :$B%*%V%8%'%/%H$r@Z$jBX$($k$?$a$N%H%0%k%9%$%C%A(B
        toggle          :select$B%\%?%s$NFI$_9~$_$r%H%0%k$G@)8f$9$kJQ?t(B

<mathfunc.c$B$G%5%]!<%H$9$kJQ?t!&4X?t(B>

        ps2Samp0IVECTOR[4]      :128bit$B6-3&$GG[CV$9$k(Bint$B7?$NG[Ns(B($BMWAG(B4)
        ps2Samp0FVECTOR[4]      :128bit$B6-3&$GG[CV$9$k(Bfloat$B7?$NG[Ns(B($BMWAG(B4)
        ps2Samp0FMATRIX[4][4]   :128bit$B6-3&$GG[CV$9$k(Bfloat$B7?$NG[Ns(B($BMWAG(B4x4)

$B4X?t$K$D$$$F$N>\$7$$@bL@$O(Bmathfunc.c$B$K$"$j$^$9$N$G$=$A$i$r;2>H$7$F$/$@(B
$B$5$$!#(Bmathfunc.c$B$G<BAu$5$l$k4X?t$N$[$H$s$I$O(BVU0$B%^%/%m$G<BAu$5$l$F$*$j!"(B
libvu0$B$K$h$jDs6!$7$F$$$^$9!#(B
VU1$BHG$G$O!"9TNs$N7W;;$K(BCore$B$G<B9T$9$k(Bps2Samp0*()$B4X?t$rMQ$$$F$$$^$9$,!"(B
VU0$BHGF1MM$K4X?t$rCV$-49$($l$P!"$5$i$K9bB.$J=hM}$,4|BT$G$-$^$9!#(B
$B$J$*!"(BCore$BHG$H(BVU0$BHG(B/VU1$BHG$G$O9TNs$NG[Ns7A<0$,0[$J$j$^$9$N$GCm0U$7$F$/(B
$B$@$5$$!#(BCore$BHG$G$O0lHLE*$JG[Ns$G$9$,!"(BVU0$BHG(B/VU1$BHG$G$O(BVU$B$N1i;;5!G=$rM-(B
$B8z$KMxMQ$9$k$?$a!"E>CO7A<0$K$J$C$F$$$^$9!#(B


$B%W%m%0%i%`2r@b!J=i4|2=ItJ,!K(B
---------------------------------------------------------------------------

$B!&%*%V%8%'%/%H%G!<%?$NFI$_9~$_(B
	VU1$BHG$G$O!"%*%V%8%'%/%H%G!<%?$O%3%s%Q%$%k$N;~E@$G%j%s%/$5$l%a%b%j$K(B
	$BE83+$5$l$F$$$^$9!%(B*.dsm$B7A<0$N%U%!%$%k$O(BVU1$B$KD>@\Aw$l$k%Q%1%C%H7A<0(B
	$B$G!"$=$N$^$^(BMy_dma_start$B%]%$%s%?$,;H$($^$9!#(B

$B!&%G%P%$%9$N=i4|2=(B
    g_fd_gs = ps2_gs_open(-1); // GS$B$N%*!<%W%s(B
    g_vpu0 = ps2_vpu_open(0);  // VPU0$B$N%*!<%W%s(B
    g_vpu1 = ps2_vpu_open(1);  // VPU1$B$N%*!<%W%s(B

    ps2_gs_vc_graphicsmode();	// $B2>A[%3%s%=!<%k$r%0%i%U%#%C%/%b!<%I$K!#(B

    ps2_gs_reset(0, g_inter, g_out_mode, g_ff_mode, g_resolution,
		 g_refresh_rate);	// GS$B$r=i4|2=$9$k(B

	$B;HMQ$9$k%G%P%$%9$N=i4|2=$r9T$$$^$9!#(B

$B!&IA2h4D6-$N@_Dj(B
    ps2_gs_set_dbuff(&db, g_psm, gp->width, gp->height,
		     (g_zbits == 0) ? 0 : PS2_GS_ZGREATER, g_zpsm, 1);
    *(__u64 *)&db.clear0.rgbaq = PS2_GS_SETREG_RGBAQ(0x10, 0x10, 0x20, 0x80,
						     0x3f800000);
    *(__u64 *)&db.clear1.rgbaq = PS2_GS_SETREG_RGBAQ(0x10, 0x10, 0x20, 0x80,
						     0x3f800000);

	GS$B$NIA2h4D6-$N@_Dj$r9T$$$^$9!#(B

$B!&%F%/%9%A%cMQ$N%$%a!<%8E>Aw(B
    load_teximages(void);
	| ps2_gs_set_image(&g_img, g_textop64, IMAGE_SIZE / 64, PS2_GS_PSMCT32,
	| 		 0, 0, IMAGE_SIZE, IMAGE_SIZE, My_texture1);
	| ps2_gs_load_image(&g_img);

	$B%F%/%9%A%cMQ$N%$%a!<%8$r(BGS$B%m!<%+%k%a%b$j$KE>Aw$9$k$?$a$K(BLoadImage
	$B$N>pJs$r@_Dj$7$^$9!#$=$N8e!"(Bps2_gs_load_image()$B$r<B9T$9$k$3$H$G!"(B
	$B;XDj$5$l$?%$%a!<%8$,(BGS$B$N%m!<%+%k%a%b$j$KE>Aw$5$l$^$9!#(B
	$B2>A[%3%s%=!<%k$r%5%]!<%H$9$k$?$a!"$=$N@Z$jBX$($N%?%$%_%s%0$G$b%m!<(B
	$B%I$7D>$7$^$9!#(B

$B!&%F%/%9%A%c$N4D6-@_DjMQ%Q%1%C%H$N@8@.(B
    // set texture env
    ps2_gs_set_texenv(&texenv.gs_tex, 0, &g_img, 8, 8, 0, 0, 0, 0, 1);

    PS2_GIFTAG_CLEAR_TAG(&texenv.giftag);
    texenv.giftag.NLOOP = sizeof(texenv) / 16 - 1;
    texenv.giftag.EOP = 1;
    texenv.giftag.PRE = 0;
    texenv.giftag.NREG = 1;
    texenv.giftag.REGS0 = PS2_GIFTAG_REGS_AD;

    ps2_gs_set_alphaenv(&texenv.gs_alpha, 0);
    *(__u64 *)&texenv.gs_alpha.alpha1 = PS2_GS_SETREG_ALPHA(0, 1, 0, 1, 0);

    texenv.gs_test1addr = PS2_GS_TEST_1;
    *(__u64 *)&texenv.gs_test =  PS2_GS_SETREG_TEST(0, 0, 0, 0, 0, 0, 1,
		(g_zbits == 0) ? PS2_GS_ZALWAYS : PS2_GS_ZGREATER);
    *(__u64 *)&texenv.gs_tex.clamp1 = PS2_GS_SETREG_CLAMP(0, 0, 0, 0, 0, 0);

	ps2_gs_set_texenv()$B$rMQ$$$F!"%F%/%9%A%c4XO"$N(BGS$BHFMQ%l%8%9%?(BTEX0_1, 
	TEX0_1, CLAMP_1$B$N@_Dj$r9T$&%Q%1%C%H$r:n@.$7$^$9!#(B

$B!&%F%/%9%A%c$N4D6-@_DjMQ%Q%1%C%H$NE>Aw(B
    ps2_gs_put_drawenv(&texenv.giftag);

	$B@8@.$5$l$?%F%/%9%A%c4D6-@_DjMQ$N%Q%1%C%H$rE>Aw$7$^$9!#(B

$B!&%3%s%H%m!<%i$N=i4|2=(B
    sjoy_open();

	$B%3%s%H%m!<%i$r;H$&$?$a$N=i4|2=$r9T$$$^$9!#(B($BDL>o$N%8%g%$%9%F%#%C(B
	$B%/$H$7$F07$&$3$H$,$G$-$^$9(B) $B0J8e$O(Bsjoy_get_ps2_button()$B$rMQ$$$F(B
	$B$=$N>uBV$r<hF@$7$^$9!#%3%s%H%m!<%i$N%G!<%?$N99?7$O(Bsjoy_poll()$B$N(B
	$B8F$S=P$7$G9T$o$l$^$9!#(B


$B%W%m%0%i%`2r@b!J%a%$%s%k!<%W!K(B
--------------------------------------------------------------------------
$B!!0J2<!"%a%$%s%k!<%W$NCf$G9T$o$l$k!"%3%s%H%m!<%i$N>pJs<hF@!"%^%H%j%/%9$N@8(B
$B@.!"%Q%1%C%H@8@.(B($B:BI8JQ49!"F);kJQ49!"(BUV->STQ$BJQ49!"8w8;7W;;(B)$B!"$K$D$$$F@bL@$7(B
$B$^$9!#(B

$B!&(BView-Screen$B%^%H%j%/%9$N@8@.(B
    ps2Samp0ViewScreenMatrix(view_screen, 512.0f, 1.0f, gp->pixel_ratio,
			     gp->center_x, gp->center_y,
			     1.0f, (g_zbits == 0) ? 2 : ((1 << g_zbits) - 1),
			     1.0f, 65536.0f);

	ps2Samp0ViewScreenMatrix()$B$rMQ$$$F!"(BView-Screen$B%^%H%j%C%/%9$r(B
	$B5a$a$^$9!#$3$3$G$O!";kE@$+$iEj1F%9%/!<%j%s$^$G$N5wN%$r(B512$B!"2hLL(B
	$B$N%"%9%Z%/%HHf$r(Bgp->pixel_ratio$B!"2hLL$NCf?4$r(B(gp->center_x,
	gp->center_y)$B!"(BZ$B%P%C%U%!$NCM$r;HMQ$9$k(BZ$B%P%C%U%!$GI=$9$3$H$,$G$-(B
	$B$k:GBgCM!"(BZ$B$NCM$r(B1.0$B!A(B65536.0$B$H$7$?(BView-Screen$B%^%H%j%/%9$r5a$a$F(B
	$B$$$^$9!#(B

$B!&2>A[%3%s%=!<%k$N%m%C%/(B
    ps2_gs_vc_lock();

	$B2>A[%3%s%=!<%k$r%m%C%/$7!"JL$N%"%W%j%1!<%7%g%s$K@Z$jBX$o$k$N$r6X(B
	$B;_$7$^$9!#(BGS/VPU0/VPU1$BEy$N%3%s%F%-%9%H$OA4$FJ]B8$5$l$J$$$N$G2>A[(B
	$B%3%s%=!<%k@Z$jBX$($r%5%]!<%H$9$k>l9g$O$=$N%a%s%F%J%s%9$,I,MW$G$9!#(B
		
$B!&IA2h4D6-$N@Z$jBX$((B
    ps2_gs_set_half_offset((frame & 1) ? &g_db.draw1 : &g_db.draw0, odev);
    ps2_gs_swap_dbuff(&g_db, frame);

	NTSC$B$N%$%s%?!<%l!<%9%b!<%I$N>l9g$O(B0.5$B%T%/%;%kJ,$:$i$7$?IA2h4D6-(B
	$B$rMQ0U$7$^$9!#(B

$B!&%3%s%H%m!<%i$N>pJs<hF@(B
    // --- read pad ---
    sjoy_poll();
    paddata = sjoy_get_ps2_button(0);

    // --- object rotate & change view point ---
    if (paddata & SJOY_PS2_L_DOWN) {
	obj_rot[0] += delta;
	    :	:
	    :	:

	$B%3%s%H%m!<%i$N%\%?%s>pJs$O!"(Bsjoy_get_ps2_button()$B$rMQ$$$F<hF@$7$^$9!#(B
	$B$3$3$G$OF@$i$l$?%G!<%?$r$b$H$K!"%*%V%8%'%/%H!"%+%a%iAPJ}$N2sE>3Q!"(B
	$B0\F0NL$r99?7$7$F$$$^$9!#%3%s%H%m!<%i$N:8<jB&$,%*%V%8%'%/%H!"1&<jB&(B
	$B$N%\%?%s$,%+%a%i$NA`:n$H$J$C$F$$$^$9!#$^$?!"(Bselect$B%\%?%s$,%*%V%8%'(B
	$B%/%H$N@Z$jBX$($G$9!#(B

$B!&(BLocal-World$B%^%H%j%/%9(B($B2sE>$N$_(B)$B$N@8@.(B
    ps2Samp0UnitMatrix(work);                   //$BC10L9TNs(B
    ps2Samp0RotMatrix(local_world, work, rot);  //$B2sE>9TNs(B

	Local-World$B%^%H%j%/%9$O!"(BLocal$B:BI8$GJ];}$5$l$F$$$k%*%V%8%'%/%HKh$K(B
	$B5a$a$kI,MW$,$"$j$^$9!#2sE>!"J?9T0\F0$H$$$C$?%"%U%#%sJQ49$,MQ$$$i$l(B
	$B$^$9!#$3$N%5%s%W%k$G$O!"2sE>%^%H%j%/%9$*$h$SJ?9T0\F0%^%H%j%/%9$r7W(B
	$B;;$7$F!"$=$l$i$r>h;;$7$?$b$N$r(BLocal-World$B%^%H%j%/%9$H$7$FMQ$$$F$$(B
	$B$^$9!#(B
	$B$?$@$7$3$N%5%s%W%k$G$O!"(B3$B9TL\$NJ?9T0\F0(B(obj_trans)$B$r@_Dj$9$kA0$K(B
	Local_Light$B%^%H%j%/%9$r@_Dj$9$kI,MW$,$"$j$^$9!#J?9T0\F0$r2CL#$7$?(B
	$B9TNs$rMQ$$$F(BLocal_Light$B%^%H%j%/%9$r@8@.$9$k$H!"4D6-8w$N7W;;$,@5$7(B
	$B$/9T$($^$;$s!#$3$l$OJ?9T0\F0!"4D6-8w$$$:$l$b9TNs$NBh(B4$BNs$rMQ$$$F7W(B
	$B;;$9$k$?$a$G$9!#$7$?$,$C$F2sE>9TNs$r@_Dj$7$?D>8e$K!"(BLocal_Light$B%^(B
	$B%H%j%/%9$r:n$C$F$/$@$5$$!#(B
	$B$b$&$R$H$DCm0UE@$H$7$F!"(Bobj_trans$B$NBh(B4$BMWAG$K$OI,$:%<%m$r@_Dj$7$F$/(B
	$B$@$5$$!#%^%H%j%/%9$N(B[4,4]$BMWAG$K$OHs>o$K%/%j%F%#%+%k$JCM$,%;%C%H$5(B
	$B$l$F$*$j!"%<%m0J30$NCM$O$3$l$rJQ$($F$7$^$&$3$H$K$J$k$?$a$G$9!#(B

$B!&%m!<%+%k%i%$%H%^%H%j%/%9$N@8@.(B
    ps2Samp0NormalLightMatrix( normal_light, light0,light1,light2);
    ps2Samp0MulMatrix(local_light, normal_light,local_world);

	ps2Samp0NormalLightMatrix()$B$rMQ$$$F!"(B3$B$D$N8w8;$+$i(BNormal-Light$B%^%H(B
	$B%j%/%9$r5a$a$^$9!#$5$i$K!"(BLocal-World$B%^%H%j%/%9$H3]$19g$o$;$F!"(B
	Local-Light$B%^%H%j%/%9$r@8@.$7$^$9!#A0=R$7$?$h$&$K!"$3$N$H$-3]$1$k(B
        Local_World$B%^%H%j%/%9$O!"(Bobj_trans$B$,%;%C%H$5$l$F$$$F$O$$$1$^$;$s!#(B

$B!&%i%$%H%+%i!<%^%H%j%/%9$N@8@.(B
    ps2Samp0LightColorMatrix(light_color, color0, color1, color2, ambient);

	$B8w8;?'$H4D6-?'$+$i(Bps2Samp0LightColorMatrix()$B$rMQ$$$F(BLight_Color$B%^(B
	$B%H%j%/%9$r5a$a$^$9!#8w8;7W;;;~$K!"3F8w8;$N1F6A?'$,5a$^$C$?8e$K!"(B
	Light_Color$B%^%H%j%C%/%9$r>h;;$7$F!":G=*E*$J%9%/%j!<%s>e$G$ND:E@?'(B
	$B$,7hDj$7$^$9!#(B

$B!&(BWorld-View$B%^%H%j%C%/%9$N@8@.(B
    ps2Samp0RotCameraMatrix(world_view, camera_p, camera_zd, camera_yd,
                                                         camera_rot);

	$B$3$N4X?t(Bps2Samp0RotCameraMatrix()$B$O!"FbIt$G(Bps2Samp0CameraMatrix()
	$B$r8F$S=P$7$F$$$^$9!#$3$N(Bps2Samp0CameraMatrix()$BMQ$$$F!"(BWorld-View$B%^(B
	$B%H%j%/%9$r5a$a$^$9!#(BView$B:BI87O$O;kE@(B(eye)$B$r86E@(B(0,0,0)$B$H$7!";k@~J}(B
	$B8~$,(BZ+$B!"1&<jJ}8~$,(BX+$B!"B-J}8~$,(BY+$B$H$J$C$F$$$^$9(B($B1&<j:BI87O!K!#$3$3(B
	$B$G$O!"(BWorld$B$KBP$7$F;kE@(Bcamera_p$B$r(B(0,0,-25)$B!";k@~(Bcamera_zd$B$r(B(0,0,1)$B!"(B
	$B?bD>J}8~(Bcamera_yd$B$r(B(0,1,0)$B$H$7!"$3$l$r4p=`$K(BWorld-View$B%^%H%j%/%9$r(B
	$B@8@.$7$^$9!#(B
        ps2Samp0RotCameraMatrix()$B4X?tFbIt$G$O$3$l$i$N%Y%/%H%k$r$"$i$+$8$a(B
        camera_rot$B$K$h$C$F2sE>$7!"$=$N7k2L$r(Bps2Samp0CameraMatrix()$B$KEO$9$3(B
	$B$H$G!"%+%a%i$N2sE>$r<B8=$7$^$9!#(B

$B!&(BLocal-World$B%^%H%j%/%9(B($B2sE>!uJ?9T0\F0(B)$B$N@8@.(B
    ps2Samp0TransMatrix(local_world, local_world, obj_trans);
        //$B2sE>!uJ?9T0\F0(B

	Local_Light$B$N%^%H%j%/%9$N@8@.$,=*N;$7$?$N$G!"(BLocal_World$B%^%H%j%/%9(B
	$B$KJ?9T0\F0MWAG(B(obj_trans)$B$r2C$($F!"??$N(BLocal_World$B%^%H%j%/%9$r@8@.(B
	$B$7$^$9!#(B

$B!&(BLocal-Screen$B%^%H%j%/%9$N@8@.(B
    ps2Samp0MulMatrix(world_screen, view_screen, world_view);
    ps2Samp0MulMatrix(local_screen, world_screen, local_world);

	$B$3$3$^$G$K5a$a$i$l$?(BView-Screen$B%^%H%j%/%9!"(BWorld-View$B%^%H%j%/%9$r(B
	$BMQ$$$F!"$^$:(BWorld-Screen$B%^%H%j%/%9$r5a$a$^$9!#$5$i$K(BLocal-World$B%^(B
	$B%H%j%/%9$r3]$19g$o$;$F!"(BLocal-Screen$B%^%H%j%/%9$,5a$a$i$l$^$9!#(B
	$B$3$N;~E@$G3]$19g$o$;$k(BLocal-World$B%^%H%j%/%9$O!"2sE>$HJ?9T0\F0$NMW(B
	$BAG$,@5$7$/%;%C%H$5$l$?$b$N$G$"$kI,MW$,$"$j$^$9!#(B

$B!&(BVUMem1$B$KE>Aw$9$k%Q%1%C%H$KCM$N%;%C%H(B/$BE>Aw(B
    SetVu1PacketMatrix();
    if (obj_switch == 0) {
	((ps2_dmatag *)My_dma_next)->ADDR = (__u32)My_cube_start;
    } else if (obj_switch == 1) {
	((ps2_dmatag *)My_dma_next)->ADDR = (__u32)My_torus_start;
    }
    ps2_dma_start(ps2_vpu_fd(g_vpu1), vfd, (ps2_dmatag *)My_dma_start);

	SetVu1PacketMatrix()$B4X?t$G!"(BVU1$B$KE>Aw$9$k%^%H%j%/%9$KCM$r%;%C%H$7(B
	$B$^$9!#$^$?!"%*%V%8%'%/%H$r@Z$jBX$($k$?$a!"%Q%1%C%HFb$N(BDMAtag$B$K!"(B
	VU1$B$KE>Aw$9$Y$-%*%V%8%'%/%H%G!<%?$N%"%I%l%9$r%;%C%H$7$F$$$^$9!#(B

$B!&2>A[%3%s%=!<%k%m%C%/$N2r=|(B
    ps2_gs_vc_unlock();

	$B2>A[%3%s%=!<%k$N%m%C%/$r2r=|$7!"JL$N%"%W%j%1!<%7%g%s$K@Z$jBX$($r(B
	$B5v2D$7$^$9!#(B


VU1$B!&(BVIF1$B%G!<%?=hM}(B
--------------------------------------------------------------------------
$B!!(BVU1$B$KAw$k%G!<%?$NN.$l$K$D$$$F4JC1$K@bL@$7$^$9!#(B

	$B%a%$%s(BRAM ---> DMA ---> VIF1 ---> MicroMem1 or VUMem1

$B!!4JC1$K$O$3$N$h$&$JN.$l$G%G!<%?$,Aw$i$l$k$o$1$G$9$,!"$=$N:]I,MW$J=hM}2aDx(B
$B$K$D$$$F2r@b$7$^$9!#(B

$B!!$^$:(BDMA$B$r2p$7$F%G!<%?$rE>Aw$9$k$?$a!"(BDMA$B@)8f$r9T$$$^$9!#(BDMA$B@)8f$O(BDMAtag$B$r(B
$BAw$k$3$H$G9T$$$^$9!#$3$N(BDMAtag$B$NDI2C$O%a%$%s%k!<%W$H(B*.dsm$B%U%!%$%k$NFbIt$G@8(B
$B@.$7DI2C$7$F$$$^$9(B(*.dsm$B%U%!%$%kFb$N!V(BDMAcnt *$B!W!V(B.EndDmaData$B!W$J$I(B)$B!#(B

    if (obj_switch == 0) {
	((ps2_dmatag *)My_dma_next)->ADDR = (__u32)My_cube_start;
    } else if (obj_switch == 1) {
	((ps2_dmatag *)My_dma_next)->ADDR = (__u32)My_torus_start;
    }

$B!!$?$H$($P$3$N=hM}$G$O!"%*%V%8%'%/%H$N@Z$jBX$(=hM}$N$?$a!"(BDMAtag$B$K(Bnext$B$r;X(B
$BDj$7$F$*$-!"(BDMAtag$BFb$N%"%I%l%9$r@Z$jBX$($k$3$H$GE>Aw%*%V%8%'%/%H$r8r49$7$F(B
$B$$$^$9!#(B

$B!!$=$N8e%G!<%?$O(BVIF1$B$rDL2a$7$^$9!#$3$N(BVIF1$B$K$bB?MM$J5!G=$,<BAu$5$l$F$*$j!"(B
$B$=$3$+$i(BVU1$B$r@)8f$9$k$3$H$,2DG=$G$9!#(BVIF$B$r@)8f$9$k%3!<%I$O(BVIFcode$B$G<BAu$5(B
$B$l!"%Q%1%C%H$KAH$_9~$`$3$H$,$G$-$^$9!#K\%5%s%W%k$G$O(B *.dsm$B%U%!%$%kFb$G;HMQ(B
$B$7$F$$$^$9!#(B

	$BNc(B:

	MPG    :$B%^%$%/%m%W%m%0%i%`$r%m!<%I(B($B%G!<%?$r(BuMem$B$KAw$k(B)
	-- data --
	.EndMPG

	unpack 4, 4, V4_32, 0, *    :$B8eB3%G!<%?$rE83+!&(BVUMem$B$K=q$-9~$_(B
	-- data --
	.EndUnpack

$B!!$3$N%5%s%W%k$G$O!"%^%$%/%m%3!<%I$H(BVIFcode$B$N5!G=$K$h$C$F(B,$B<!$N$h$&$J<j=g$G(B
$B%@%V%k%P%C%U%!=hM}$r<B8=$7$F$$$^$9!#(B

	MSCAL 0       :$B%^%$%/%m%W%m%0%i%`<B9T(B($B%"%I%l%9(B0$B%9%?!<%H(B)
	BASE 0        :$B%@%V%k%P%C%U%!$N0lJ}$N@hF,%"%I%l%9$r(B0$B$K;XDj!#(B
                       (vif1 base $B%l%8%9%?@_Dj(B)
	OFFSET 512    :$B%@%V%k%P%C%U%!$NB>J}$N@hF,%"%I%l%9$r(B512$B$K;XDj(B
                       (vif1 offset $B%l%8%9%?@_Dj(B)

	unpack ......
	-- object data --
	.EndUnpack
	MSCNT     :$B%^%$%/%m%3!<%I$N<B9T:F3+(B($BIA2h=hM}(B)

$B!!%^%$%/%m%3!<%I$N=hM}$NN.$l$r4JC1$K<($7$^$9!#(B

        $BA0=hM}(B --+-> $BF);kJQ49!&8w8;=hM}(B(GIF$B%Q%1%C%H@8@.!&E>Aw(B) 
                 |                              |
                 |               |              |
                 +<----<----<----|<----<----<---+
                         restart | stop
                               MSCNT
                          (switch buffer)

$B!!%^%$%/%m%3!<%I$OA0=hM}$b$7$/$O0l2s$N%k!<%W=hM}$r$7$?8e!"<!$N(BMSCNT$BL?Na$,(B
$B$/$k$^$GBT5!$7$F$$$^$9!#$=$7$F!"<!$N%P%C%U%!$KCM$,%;%C%H$5$l!"(BMSCNT$BL?Na$,(B
$B<B9T$5$l$k$H<B9T:F3+!J$b$7$/$O%^%$%/%m%W%m%0%i%`$N=hM}Dd;_$^$G(BMSCNT$B$,%9%H(B
$B!<%k!K$7!"%G!<%?$r=hM}$7$^$9!#(B
$B!!(BMSCNT$BL?Na$,<B9T$5$l$k$H$-!"%*%U%;%C%H%"%I%l%9$,@Z$jBX$($i$l$k$?$a!"=hM}(B
$B%a%b%j$,%9%$%C%A$7$F%@%V%k%P%C%U%!=hM}$,2DG=$H$J$j$^$9!#(B


Basic3d VU1 $B%^%$%/%m%3!<%I(B
--------------------------------------------------------------------------

<$BF0:n$N35N,(B>
	1.$B%o!<%k%I:BI87O$G$N:BI8JQ49(B 
	2.$BF);kJQ49(B 
	3.$BD:E@$NK!@~%Y%/%H%k$HJ?9T8w8;$K$h$k%i%$%F%#%s%0(B 
	4.$B%Q!<%9%Z%/%F%#%V%3%l%/%H$5$l$?%F%/%9%A%c%^%C%T%s%0(B 


<VUMem1$B>e$N%G!<%?G[CV(B>

   $B%"%I%l%9(B     $B%9%H%"$5$l$?%G!<%?(B              $B@bL@(B
  ---------------------------------------------------------------------
     0 - 3      - $BF);kJQ49%^%H%j%/%9(B              $B%b%G%kA4BN$G6&MQ$5$l$k(B
     4 - 7      - $B:BI8JQ49%^%H%j%/%9(B              $B%^%H%j%/%9%G!<%?Ey(B
     8 - 11     - $BJ?9T8w8;%Y%/%H%k(B
    12 - 15     - $B8w8;?'(B
  ----------------------------------------------------------------------
    0 - 511     [$B%=!<%9%G!<%?(B]
                - GIFtag
                - $BD:E@:BI8(B
                - $BK!@~%Y%/%H%k(B
                - $BD:E@?'(B
                - $B%F%/%9%A%c:BI8(B
                                                VU1$B$N%@%V%k%P%C%U%!NN0h(B 0
                [GIF$B$X(BXGKICK$B$5$l$k%Q%1%C%H(B]
                - GIFtag
                - ST
                - RGBAQ
                - XYZF2
  -----------------------------------------------------------------------
   512 - 1023
                [$B%=!<%9%G!<%?(B]
                - GIFtag
                - $BD:E@:BI8(B
                - $BK!@~%Y%/%H%k(B
                - $BD:E@?'(B
                - $B%F%/%9%A%c:BI8(B
                                                VU1$B$N%@%V%k%P%C%U%!NN0h(B 1
                [GIF$B$X(BXGKICK$B$5$l$k%Q%1%C%H(B]
                - GIFtag
                - ST
                - RGBAQ
                - XYZF2

  ---------------------------------------------------------------------

<$B%^%$%/%m%3!<%I(B>

;
;
; vu1 micro code for basic sample
;
; [$B<g$J%l%8%9%?$N0UL#(B]
;
; VF01 - VF04 : $BF);kJQ49%^%H%j%/%9(B x   $B%o!<%k%I:BI87O$G$N2sE>!&0\F0%^%H%j%/%9(B
; VF05 - VF08 : $BJ?9T8w8;$NJ}8~%Y%/%H%k(B
; VF09 - VF11 : $B3F8w8;$N?'(B
; VF19 : gif tag 
; VF20 : $B=hM}$9$kD:E@:BI8(B
; VF21 : $B=hM}$9$kD:E@$G$NK!@~%Y%/%H%k(B
; VF22 : $B=hM}$9$kD:E@$N%F%/%9%A%c:BI8(B
; VF23 : $B=hM}$9$kD:E@$N?'(B
;
;
; VI02 : VUMEM$B$+$i(BGIF$B$X(BXGKICK$B$GAw$i$l$k%G!<%?$N@hF,!J(Bgif tag$B$,CV$+$l$k!K(B
; VI03 : VUMEM$B>e$K$"$k=hM}$9$kD:E@%G!<%?$X$N%j!<%I%]%$%s%?(B
; VI04 : VUMEM$B>e$K$"$k=hM}$9$kK!@~%Y%/%H%k$X$N%j!<%I%]%$%s%?(B
; VI05 : VUMEM$B>e$K$"$k=hM}$9$k%F%/%9%A%c:BI8$X$N%j!<%I%]%$%s%?(B
; VI06 : VUMEM$B>e$K$"$k=hM}$9$kD:E@$N?'$X$N%j!<%I%]%$%s%?(B
; VI07 : GIF$B$KAw$k(BRGBAQ$B%G!<%?$X$N%9%H%"%]%$%s%?(B
; VI08 : GIF$B$KAw$k(BST$B%G!<%?$X$N%9%H%"%]%$%s%?(B
; VI09 : GIF$B$KAw$k(BXYZF2$B%G!<%?$X$N%9%H%"%]%$%s%?(B
;
; VI10 : $B=hM}$9$kD:E@?t!J%k!<%W%+%&%s%?!K(B
;
;
; ---------------------------------------------------------------------


NOP IADDIU VI01, VI00, 0
NOP IADDIU VI02, VI00, 4
NOP IADDIU VI03, VI00, 16 
NOP BAL VI15, MulMatrix ; $BF);kJQ49%^%H%j%/%9(B x   $B%o!<%k%I:BI87O$G$N2sE>!&0\F0%^%H%j%/%9$r7W;;$9$k(B
NOP NOP

NOP IADDIU VI01, VI00, 8 
NOP LQI VF09, (VI01++) ; $BJ?9T8w8;%Y%/%H%k$N%m!<%I(B (8)
NOP LQI VF10, (VI01++)
NOP LQI VF11, (VI01++)
NOP LQI VF12, (VI01++)
NOP LQI VF05, (VI01++) ; $B3F8w8;$N?'$N%m!<%I(B (12) 
NOP LQI VF06, (VI01++)
NOP LQI VF07, (VI01++)
NOP LQI VF08, (VI01++)
NOP LQI VF01, (VI01++) ; $BF);kJQ49%^%H%j%/%9(B x   $B%o!<%k%I:BI87O$G$N2sE>!&0\F0%^%H%j%/%9$N%m!<%I(B (16)
NOP LQI VF02, (VI01++)
NOP LQI VF03, (VI01++)
NOP LQI VF04, (VI01++)

NOP[E] NOP
NOP NOP
START0:
NOP XTOP VI01                 ; $B%@%V%k%P%C%U%!%j%s%0$N$?$a$K(B
                              ; VIF$B$N(BTOP$B%l%8%9%?$NCMFI$_=P$7(B
NOP ILWR.x VI10, (VI01)x      ; GIFtag$B$+$i(Bnloop$B$NCM$rFI$_=P$9(B
NOP IADDIU VI11, VI00, 0x7fff ; $B%k!<%W%+%&%s%?!JD:E@?t!K$NCM$rF@$k$?$a$K%^%9%/$r@_Dj(B
NOP IAND VI10, VI11, VI10     ; $B%^%9%/$7$F(B VI10 $B$rD:E@?t$NF~$C$?%k!<%W%+%&%s%?$K@_Dj(B
NOP LQ VF19, 0(VI01)          ; gif tag$B$NFI$_9~$_(B
NOP IADDIU VI03, VI01, 1      ; $BFI$_9~$`D:E@%G!<%?$X$N%]%$%s%?(B
NOP IADD VI04, VI03, VI10     ; $BFI$_9~$`K!@~%Y%/%H%k$X$N%]%$%s%?(B
NOP IADD VI05, VI04, VI10     ; $BFI$_9~$`D:E@?'%G!<%?$X$N%]%$%s%?(B
NOP IADD VI06, VI05, VI10     ; $BFI$_9~$`%F%/%9%A%c:BI8%G!<%?$X$N%]%$%s%?(B
NOP IADD VI02, VI06, VI10     ; XGKICK$B$9$k0LCV$N%]%$%s%?(B
NOP SQ VF19, 0(VI02)          ; giftag$B$r%9%H%"(B
NOP IADDIU VI07, VI02, 2      ; $B7W;;$5$l$?(BRGBAQ$B$r%9%H%"$9$k0LCV$X$N%]%$%s%?(B
NOP IADDIU VI08, VI02, 1      ; $B7W;;$5$l$?(BST$B$r%9%H%"$9$k0LCV$X$N%]%$%s%?(B
NOP IADDIU VI09, VI02, 3      ; $B7W;;$5$l$?(BXYZF2$B$r%9%H%"$9$k0LCV$X$N%]%$%s%?(B

LOOP:
NOP LQI VF20, (VI03++)        ; $BD:E@%G!<%?$NFI$_9~$_(B
NOP LQI VF21, (VI04++)        ; $BK!@~%Y%/%H%k$NFI$_9~$_(B
NOP LQI VF22, (VI05++)        ; $BD:E@?'$NFI$_9~$_(B
NOP LQI VF23, (VI06++)        ; $B%F%/%9%A%c:BI8$NFI$_9~$_(B

; --- $B:BI8JQ49(B &$BF);kJQ49(B ---
MULAx.xyzw ACC, VF01, VF20x NOP   ; $B:BI8JQ49$HF);kJQ49$r9T$&(B 
MADDAy.xyzw ACC, VF02, VF20y NOP 
MADDAz.xyzw ACC, VF03, VF20z NOP 
MADDw.xyzw VF25, VF04, VF20w NOP 
NOP NOP
NOP NOP
NOP NOP
NOP DIV Q, VF00w, VF25w          ; 1/w$B$r5a$a$k(B

; --- $BJ?9T8w8;%Y%/%H%k$HK!@~%Y%/%H%k$H$NFb@Q(B ---
MULAx.xyzw ACC, VF05, VF21x NOP   ; $BFb@Q(B
MADDAy.xyzw ACC, VF06, VF21y NOP 
MADDAz.xyzw ACC, VF07, VF21z NOP 
MADDw.xyzw VF13, VF08, VF21w NOP 
NOP NOP
NOP NOP
NOP NOP
MAXx.xyzw VF13, VF13, VF00x NOP ; 0.0f$BL$K~$NCM$r(B0.0f$B$K$9$k(B

; --- 1/w $B$r$+$1$F!"%9%H%"$9$k(B ---
MULq VF28, VF25, Q NOP       ; 1/w $B$r$+$1$k(B
NOP NOP
NOP NOP
NOP NOP
FTOI4 VF27, VF28 NOP         ; $B8GDj>.?tE@$KJQ49(B
NOP NOP
NOP NOP
NOP NOP
NOP SQ VF27, 0(VI09)         ; XYZF2$B$r%9%H%"(B(unpacked mode)
NOP IADDIU VI09, VI09, 3     ; $B%9%H%"%]%$%s%?$r%$%s%/%j%a%s%H(B

; st$B$rFI$_9~$s$G(BQ$B$r$+$1$F%9%H%"$9$k(B(for perspective correction)
MULq.xyz VF27, VF23, Q NOP   ; ST$B$K(B1/w$B$r$+$1!"(BQ$B$K(B1/w$B$r@_Dj$9$k(B
NOP NOP
NOP NOP
NOP NOP
NOP SQ VF27, 0(VI08)         ; STQ$B$r%9%H%"$9$k(B(unpacked mode)
NOP IADDIU VI08, VI08, 3     ; $B%9%H%"%]%$%s%?$r%$%s%/%j%a%s%H$9$k(B
NOP NOP
NOP NOP

; --- $B>HEY7W;;$5$l$?%^%F%j%"%k$N?'$r5a$a%9%H%"$9$k(B ---
MULAx.xyzw ACC, VF09, VF13x NOP    ; $BFb@Q$K8w8;?'$r$+$1$k(B
MADDAy.xyzw ACC, VF10, VF13y NOP
MADDAz.xyzw ACC, VF11, VF13z NOP
MADDw.xyzw VF14, VF12, VF13w NOP
NOP NOP
NOP NOP
NOP NOP
MUL.xyz VF27, VF22, VF14 NOP       ; $B7W;;$5$l$?%i%$%H$N?'$r%^%F%j%"%k?'$K$+$1$k(B
NOP NOP
NOP NOP
NOP NOP
FTOI0 VF26, VF27 NOP               ; $B@0?t$KJQ49(B 
NOP NOP
NOP NOP
NOP NOP
NOP SQ VF26, 0(VI07)               ; RGBAQ$B$r%9%H%"$9$k(B(unpacked mode)
NOP IADDIU VI07, VI07, 3           ; $B%9%H%"%]%$%s%?$r%$%s%/%j%a%s%H$9$k(B

; --- $B%k!<%W(B ---
NOP IADDI VI10, VI10, -1           ; $B%k!<%W%+%&%s%?$r%G%/%j%a%s%H(B
NOP IBNE VI10, VI00, LOOP          ; $B%k!<%W$r7+$jJV$7(B

; --- $B7W;;7k2L$r(BGIF$B$KAw$j(B(XGKICK)$B!"%^%$%/%m$N<B9T$rDd;_(B ---
NOP NOP 
NOP XGKICK VI02 ; XGKICK 
NOP[E] NOP      ; $B%^%$%/%m$NDd;_(B
NOP NOP 
NOP B START0    ; $B<!$N%^%$%/%m<B9T0LCV$X%8%c%s%W(B
NOP NOP


; -------------------------------------------------------------------
; MulMatrix $B%^%H%j%/%9$N3]$1;;(B 
; VI01 : $B%=!<%9%^%H%j%/%9(B1$B$N%"%I%l%9(B
; VI02 : $B%=!<%9%^%H%j%/%9(B1$B$N%"%I%l%9(B
; VI03 : $B7W;;$5$l$?%^%H%j%/%9$r%9%H%"$9$k%"%I%l%9(B
;

MulMatrix:
NOP LQI.xyzw VF08, (VI02++)
NOP LQI.xyzw VF04, (VI01++)
NOP LQI.xyzw VF05, (VI01++)
NOP LQI.xyzw VF06, (VI01++)
NOP LQI.xyzw VF07, (VI01++)
MULAx.xyzw ACC, VF04, VF08x LQI.xyzw VF09, (VI02++)
MADDAy.xyzw ACC, VF05, VF08y NOP
MADDAz.xyzw ACC, VF06, VF08z NOP
MADDw.xyzw VF12, VF07, VF08w NOP
MULAx.xyzw ACC, VF04, VF09x LQI.xyzw VF10, (VI02++)
MADDAy.xyzw ACC, VF05, VF09y NOP
MADDAz.xyzw ACC, VF06, VF09z NOP
MADDw.xyzw VF13, VF07, VF09w SQI.xyzw VF12, (VI03++)
MULAx.xyzw ACC, VF04, VF10x LQI.xyzw VF11, (VI02++)
MADDAy.xyzw ACC, VF05, VF10y NOP
MADDAz.xyzw ACC, VF06, VF10z NOP
MADDw.xyzw VF14, VF07, VF10w SQI.xyzw VF13, (VI03++)
MULAx.xyzw ACC, VF04, VF11x NOP
MADDAy.xyzw ACC, VF05, VF11y NOP
MADDAz.xyzw ACC, VF06, VF11z NOP
MADDw.xyzw VF15, VF07, VF11w SQI.xyzw VF14, (VI03++)
NOP NOP
NOP NOP
NOP NOP
NOP SQI.xyzw VF15, (VI03++)
NOP NOP
NOP JR VI15
NOP NOP


$B%Q%1%C%H@bL@(B
--------------------------------------------------------------------------

$B!!(BVU1$B%^%$%/%m%3!<%I$rMQ$$$FF);kJQ49!&J?9T8w8;7W;;$r9T$&$?$a$K(BVU1$B$KAw$k%Q%1(B
$B%C%H!J(B.dsm$B7A<0!K$K$D$$$F@bL@$7$^$9!#(B
$B!!(BGIFtag$B$r@_Dj$9$k$3$H$G!"FHN);03Q7A!"%H%i%$%"%s%0%k%9%H%j%C%W$H$b$K07$&$3(B
$B$H$,$G$-$^$9!#B?$/$ND:E@$rIA2h$9$k>l9g$K$O!"(BGIFtag - MSCNT$B$^$G$N%Q%1%C%H$r(B
$BJ#?t8D$J$i$Y$FE>Aw$7$^$9!#$3$l$K$h$j(BVU1$B$O%@%V%k%P%C%U%!=hM}$r9T$$$^$9!#(B

 <$BNc(B>$B%H%i%$%"%s%0%k%9%H%j%C%W%-%e!<%V(B------------------------------------
.include "vumacros.h"
.global My_dma_start
.global My_matrix
.global My_light_matrix
.global My_rot_trans_matrix

My_dma_start:
.align 0
DMAcnt *     ; $B%^%$%/%m%3!<%I<+BN$r(BVU1$B$KAw$k(B
MPG 0, *
.include "basic.vsm" 
.EndMPG
.EndDmaData

DMAcnt *
unpack 4, 4, V4_32, 0, *  ; $B%9%/%j!<%s%^%H%j%/%9(B
My_matrix:
fwzyx 0.000000, 0.000000, 0.000000, 35.752483
fwzyx 0.000000, 0.000000, -14.765776, 0.000000
fwzyx 0.050000, 4995000.000000, 102.400002, 102.400002
fwzyx 1.000000, 100000000.000000, 2048.000000, 2048.000000
.EndUnpack

unpack 4, 4, V4_32, 4, * ; $B%o!<%k%I:BI87O$G$N2sE>!"0\F0%^%H%j%/%9(B
My_rot_trans_matrix:
fwzyx 0.0, -0.000000, -0.000000, 1.000000
fwzyx 0.0, -0.000000, 1.000000, 0.000000
fwzyx 0.0, 1.000000, 0.000000, 0.000000
fwzyx 1.0, 0.000000, 0.000000, 0.000000
.EndUnpack

unpack 4, 4, V4_32, 8, * ; $B8w8;?'!JJ?9T8w8;(Bx3, $B4D6-8w(Bx1$B!K(B
fxyzw 1.0, 0.0, 0.0, 0.0 ; $BJ?9T8w8;#1(B (R,G,B)=(1.0, 0.0, 0.0)
fxyzw 0.0, 0.0, 1.0, 0.0 ; $BJ?9T8w8;#2(B (R,G,B)=(1.0, 0.0, 0.0)
fxyzw 0.0, 0.0, 0.0, 0.0 ; $BJ?9T8w8;#3(B (R,G,B)=(1.0, 0.0, 0.0)
fxyzw 0.2, 0.2, 0.2, 1.0 ; $B4D6-8w(B (R,G,B) = (0.2, 0.2, 0.2)
.EndUnpack

unpack 4, 4, V4_32, 12, * ; $BJ?9T8w8;%Y%/%H%k(B(x3)
My_light_matrix:
fxyzw 0.0, -1.0, 0.0, 0.000000 ; $B3FNs$,%Y%/%H%k$r<($9!#$3$NNc$G$O(B Light1=(0.0, 1.0, 0.0), 
fxyzw 1.0, 0.0, 0.0, 0.000000  ; Light2 = (-1.0, 0.0, 0.0), Light3=(0.0, 0.0, 0.0)
fxyzw 0.0, 0.0, 0.0, 0.000000  ; $BBh#4Ns$O4D6-8w$N@_Dj(B
fxyzw 0.0, 0.0, 0.0, 1.000000
.EndUnpack

MSCAL 0 ; $B%^%$%/%m$N<B9T(B
BASE 0 ; vif1 base $B$N%Y!<%9%l%8%9%?$N@_Dj(B 
OFFSET 512 ; vif1 offset $B%l%8%9%?$N@_Dj(B
.EndDmaData


; ------------------------------------------------------------------------
; $BIA2h$7$h$&$H$9$k%b%G%k%G!<%?!#(B
; $B$3$3$G$O#18D$NN)J}BN!J%H%i%$%"%s%0%k%9%H%j%C%W!K!#(B

DMAcnt *
unpack[r] 4, 4, V4_32, 0, *
iwzyx 0x00000000, 0x00000412, 0x300a4000, 0x0000800e ; giftag(texture$B$"$j!K(B
.EndUnpack
unpack[r] 4, 4, V4_32, 1, *
; $B%9%H%j%C%WD:E@$N%o!<%k%I:BI87O$G$N0LCV(B
fxyzw -5.0, -5.0, 5.0, 1.0
fxyzw -5.0, -5.0, -5.0, 1.0
fxyzw -5.0, 5.0, 5.0, 1.0
fxyzw -5.0, 5.0, -5.0, 1.0
fxyzw 5.0, 5.0, -5.0, 1.0
fxyzw -5.0, -5.0, -5.0, 1.0
fxyzw 5.0, -5.0, -5.0, 1.0
fxyzw -5.0, -5.0, 5.0, 1.0
fxyzw 5.0, -5.0, 5.0, 1.0
fxyzw -5.0, 5.0, 5.0, 1.0
fxyzw 5.0, 5.0, 5.0, 1.0
fxyzw 5.0, 5.0, -5.0, 1.0
fxyzw 5.0, -5.0, 5.0, 1.0
fxyzw 5.0, -5.0, -5.0, 1.0

; $BK!@~%Y%/%H%k(B
fxyzw -1.0, 0.0, 0.0, 1.0
fxyzw -1.0, 0.0, 0.0, 1.0
fxyzw -1.0, 0.0, 0.0, 1.0
fxyzw -1.0, 0.0, 0.0, 1.0
fxyzw 0.0, 1.0, 0.0, 1.0
fxyzw 0.0, 0.0, -1.0, 1.0
fxyzw 0.0, 0.0, -1.0, 1.0
fxyzw 0.0, -1.0, 0.0, 1.0
fxyzw 0.0, -1.0, 0.0, 1.0
fxyzw 0.0, 0.0, 1.0, 1.0
fxyzw 0.0, 0.0, 1.0, 1.0
fxyzw 0.0, 1.0, 0.0, 1.0
fxyzw 1.0, 0.0, 0.0, 1.0
fxyzw 1.0, 0.0, 0.0, 1.0

; $B?'(B
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0
fxyzw 200.0, 200.0, 200.0, 128.0

; $B%F%/%9%A%c:BI8(B
fxyzw 0.0, 0.0, 1.0, 0.0
fxyzw 0.0, 1.0, 1.0, 0.0
fxyzw 1.0, 0.0, 1.0, 0.0
fxyzw 1.0, 1.0, 1.0, 0.0
fxyzw 0.0, 1.0, 1.0, 0.0
fxyzw 1.0, 0.0, 1.0, 0.0
fxyzw 0.0, 0.0, 1.0, 0.0
fxyzw 1.0, 1.0, 1.0, 0.0
fxyzw 0.0, 1.0, 1.0, 0.0
fxyzw 1.0, 0.0, 1.0, 0.0
fxyzw 0.0, 0.0, 1.0, 0.0
fxyzw 0.0, 1.0, 1.0, 0.0
fxyzw 1.0, 0.0, 1.0, 0.0
fxyzw 1.0, 1.0, 1.0, 0.0

.EndUnpack
MSCNT  ; $B%^%$%/%m%3!<%I$N<B9T:F3+!JIA2h=hM}!K(B
.EndDmaData

DMAend

