0
|
1 ; ---------------------------------------------------------------------
|
|
2 ;
|
|
3 ;
|
|
4 ; vu1 micro code for basic sample
|
|
5 ;
|
|
6 ;
|
|
7 ; VF01 - VF04 : perspective + transformation matrix
|
|
8 ; VF05 - VF08 : light color matrix
|
|
9 ; VF09 - VF12 : X light vector matrix(3 lighting vector + 1 ambient)
|
|
10 ; VF15 : gif tag
|
|
11 ; VF20 : source vertex
|
|
12 ; VF21 : source normal
|
|
13 ; VF22 : source st
|
|
14 ; VF23 : source color
|
|
15 ;
|
|
16 ;
|
|
17 ; VI00 : 0 (定数レジスタ)
|
|
18 ; VI01 : ポインタ
|
|
19 ; VI02 : pointer for gif tag / for XGKICK
|
|
20 ; VI03 : pointer for vertex
|
|
21 ; VI04 : pointer for normal
|
|
22 ; VI05 : pointer for st
|
|
23 ; VI06 : pointer for color
|
|
24 ; VI07 : store pointer for RGBAQ
|
|
25 ; VI08 : store pointer for ST
|
|
26 ; VI09 : store pointer for XYZF2
|
|
27 ; VI10 : counter for vertices
|
|
28 ;
|
|
29 ; クリッピングの処理に使用します
|
|
30 ; -----------------------------------
|
|
31 ; VI14 : vertex counter
|
|
32 ;
|
|
33 ; VI15 : リンクレジスタ
|
|
34 ;
|
|
35 ; ---------------------------------------------------------------------
|
|
36 NOP IADDIU VI01, VI00, 0
|
|
37 NOP IADDIU VI02, VI00, 4
|
|
38 NOP IADDIU VI03, VI00, 16 ; screen matrix X object matrix
|
|
39 NOP BAL VI15, MulMatrix
|
|
40 NOP NOP
|
|
41
|
|
42 NOP LOI 255.0 ; iレジスタ即値ロード
|
|
43 MULi.w VF16, VF00, I NOP; vf00 (0.0, 0.0, 0.0, 1.0)
|
|
44
|
|
45 ; ------------------------------------------------------------
|
|
46 ; クリッピング用の初期値を設定
|
|
47 ; ------------------------------------------------------------
|
|
48 NOP LOI -2048.0
|
|
49 ADDi.xy VF29,VF00, I NOP
|
|
50 NOP LOI -8388608.0
|
|
51 ADDi.z VF29,VF00, I NOP
|
|
52 ADDw.xy VF30,VF00, VF00 NOP
|
|
53 NOP LOI 0.00012207
|
|
54 ADDi.z VF30,VF00,I NOP
|
|
55 NOP LOI 1024.0
|
|
56 MULi.w VF30,VF00,I NOP
|
|
57 ;------------------------------------------------------------------
|
|
58
|
|
59 NOP IADDIU VI01, VI00, 8
|
|
60 NOP LQI VF09, (VI01++) ; (8) load light color matrix
|
|
61 NOP LQI VF10, (VI01++)
|
|
62 NOP LQI VF11, (VI01++)
|
|
63 NOP LQI VF12, (VI01++)
|
|
64 NOP LQI VF05, (VI01++) ; (12) load light vector matrix
|
|
65 NOP LQI VF06, (VI01++)
|
|
66 NOP LQI VF07, (VI01++)
|
|
67 NOP LQI VF08, (VI01++)
|
|
68 NOP LQI VF01, (VI01++) ; (16) load screen x transformation matrix
|
|
69 NOP LQI VF02, (VI01++)
|
|
70 NOP LQI VF03, (VI01++)
|
|
71 NOP LQI VF04, (VI01++)
|
|
72
|
|
73 NOP IADDIU VI12,VI00,0x7fff ; VI12: 0x7fff
|
|
74 NOP IADDIU VI13,VI12,0x0001 ; VI13: 0x8000
|
|
75
|
|
76 NOP[E] NOP
|
|
77 NOP NOP
|
|
78
|
|
79 START0:
|
|
80 NOP XTOP VI01 ; VI01にVIFのTOPレジスタ値をロード
|
|
81 NOP ILWR.x VI10, (VI01)x ; copy to VI10
|
|
82 NOP IADDIU VI11, VI00, 0x7fff ; set mask
|
|
83 NOP IAND VI10, VI11, VI10 ; mask. VI10 is counter for vertices.
|
|
84 NOP LQ VF19, 0(VI01) ; load gif tag
|
|
85 NOP IADDIU VI03, VI01, 1 ; pointer for vertices
|
|
86 NOP IADD VI04, VI03, VI10 ; pointer for normal
|
|
87 NOP IADD VI05, VI04, VI10 ; pointer for color
|
|
88 NOP IADD VI06, VI05, VI10 ; pointer for st
|
|
89 NOP IADD VI02, VI06, VI10 ; set XGKICK pointer
|
|
90 NOP SQ VF19, 0(VI02) ; store gif tag
|
|
91 NOP IADDIU VI07, VI02, 2 ; set store pointer for RGBAQ
|
|
92 NOP IADDIU VI08, VI02, 1 ; set store pointer for ST
|
|
93 NOP IADDIU VI09, VI02, 3 ; set store pointer for XYZF2
|
|
94 NOP IAND VI14, VI14, VI00 ;
|
|
95 NOP IADDIU VI14, VI00, 3 ; VI14(counter)に3をセット
|
|
96 NOP FCSET 0x000000 ; クリッピングフラグ初期化
|
|
97 LOOP:
|
|
98 NOP LQI VF20, (VI03++) ; load vertex
|
|
99 NOP LQI VF21, (VI04++) ; load normal
|
|
100 NOP LQI VF22, (VI05++) ; load color
|
|
101 NOP LQI VF23, (VI06++) ; load st
|
|
102 ; ------------------------------------------------------------------
|
|
103 ; counter--;
|
|
104 ; if (counter==0) goto CLEAR2 // counter(VI14) は頂点数のカウンタ
|
|
105 ; else goto CLEAR1
|
|
106 ; ------------------------------------------------------------------
|
|
107 NOP IADDI VI14, VI14, -1 ; VI14(counter)をデクリメント
|
|
108 NOP IBEQ VI14, VI00, CLEAR2 ; VI14==0ならCLEAR2:へジャンプ
|
|
109 NOP NOP
|
|
110 NOP B CLEAR1 ;
|
|
111 NOP NOP
|
|
112 CLEAR2:
|
|
113 NOP IADDIU VI14, VI00, 2 ; VI14(counter)を初期化
|
|
114 NOP FCSET 0x000000 ; クリッピングフラグをクリア
|
|
115 ;------------------------------------------------------------------
|
|
116 CLEAR1:
|
|
117
|
|
118 ; --- rotation/translation/perspective transform ---
|
|
119 MULAx.xyzw ACC, VF01, VF20x NOP ; rot/trans/pers
|
|
120 MADDAy.xyzw ACC, VF02, VF20y NOP
|
|
121 MADDAz.xyzw ACC, VF03, VF20z NOP
|
|
122 MADDw.xyzw VF25, VF04, VF20w NOP
|
|
123 NOP NOP
|
|
124 NOP NOP
|
|
125 NOP NOP
|
|
126 NOP DIV Q, VF00w, VF25w
|
|
127
|
|
128 ; --- light matrix X normal ---
|
|
129 MULAx.xyzw ACC, VF05, VF21x NOP ; dot products
|
|
130 MADDAy.xyzw ACC, VF06, VF21y NOP
|
|
131 MADDAz.xyzw ACC, VF07, VF21z NOP
|
|
132 MADDw.xyzw VF13, VF08, VF21w NOP
|
|
133 NOP NOP
|
|
134 NOP NOP
|
|
135 NOP NOP
|
|
136 MAXx.xyzw VF13, VF13, VF00x NOP ; cut under 0.0f
|
|
137
|
|
138 ; --- calc transformed position and store it ---
|
|
139 MULq VF28, VF25, Q NOP
|
|
140 NOP NOP
|
|
141 NOP NOP
|
|
142 NOP NOP
|
|
143 FTOI4 VF27, VF28 NOP
|
|
144
|
|
145 ADD VF31,VF28,VF29 NOP
|
|
146 MUL VF31,VF31,VF30 NOP
|
|
147
|
|
148 ; ------------------------------------------------------------------
|
|
149 ; Triangleは3頂点ごとに描画キックするので、3頂点カウンタを設けたい
|
|
150 ; 3頂点の内、どれか1つにでもFCが立てばそれを保持したい
|
|
151 ; ------------------------------------------------------------------
|
|
152 NOP FCAND VI01, 0x03fff ; FCの2回前までの結果をVI01に
|
|
153 NOP IBEQ VI01, VI00, CLIP1 ; (FC==0)ではみ出し無し
|
|
154 NOP NOP
|
|
155 NOP B CLIP0 ;
|
|
156 NOP NOP
|
|
157 CLIP1:
|
|
158 CLIPw VF31,VF30w NOP ; クリッピング検査
|
|
159 NOP NOP
|
|
160 NOP NOP
|
|
161 ; ------------------------------------------------------------------
|
|
162 CLIP0:
|
|
163 ; --- store XYZF2 ---
|
|
164 NOP SQ VF27, 0(VI09)
|
|
165 NOP FCAND VI01,0x03fff
|
|
166 NOP IADDIU VI11,VI01,0x7fff
|
|
167 ; NOP IADDIU VI01, VI00, 0x8000
|
|
168 ; NOP IAND VI11,VI11,VI01
|
|
169 NOP IAND VI11,VI11,VI13
|
|
170 NOP ISW.w VI11,0(VI09)
|
|
171 NOP IADDIU VI09, VI09, 3
|
|
172
|
|
173 ; --- load st and store it ---
|
|
174 MULq.xyz VF27, VF23, Q NOP
|
|
175 NOP NOP
|
|
176 NOP NOP
|
|
177 NOP NOP
|
|
178 NOP SQ VF27, 0(VI08)
|
|
179 NOP IADDIU VI08, VI08, 3
|
|
180 NOP NOP
|
|
181 NOP NOP
|
|
182
|
|
183 ; --- color * dot-product ---
|
|
184 MULAx.xyzw ACC, VF09, VF13x NOP
|
|
185 MADDAy.xyzw ACC, VF10, VF13y NOP
|
|
186 MADDAz.xyzw ACC, VF11, VF13z NOP
|
|
187 MADDw.xyzw VF14, VF12, VF13w NOP
|
|
188 NOP NOP
|
|
189 NOP NOP
|
|
190 NOP NOP
|
|
191 MUL.xyzw VF27, VF22, VF14 NOP
|
|
192 NOP NOP
|
|
193 NOP NOP
|
|
194 NOP NOP
|
|
195 MINI.w VF27, VF27, VF16w NOP
|
|
196 NOP NOP
|
|
197 NOP NOP
|
|
198 NOP NOP
|
|
199 FTOI0 VF26, VF27 NOP
|
|
200 NOP NOP
|
|
201 NOP NOP
|
|
202 NOP NOP
|
|
203 NOP SQ VF26, 0(VI07)
|
|
204 NOP IADDIU VI07, VI07, 3
|
|
205
|
|
206 ; --- decrement loop ---
|
|
207 NOP IADDI VI10, VI10, -1
|
|
208 NOP IBNE VI10, VI00, LOOP
|
|
209
|
|
210 ; --- send result to GIF and stop ---
|
|
211 NOP NOP
|
|
212 NOP XGKICK VI02
|
|
213 NOP[E] NOP
|
|
214 NOP NOP
|
|
215 NOP B START0
|
|
216 NOP NOP ;Take care!! Don't forget.
|
|
217
|
|
218
|
|
219 ; -------------------------------------------------------------------
|
|
220 ; MulMatrix
|
|
221 ; VI01 : address of source matrix
|
|
222 ; VI02 : address of source matrix
|
|
223 ; VI03 : address of destination matrix
|
|
224 ;
|
|
225
|
|
226 MulMatrix:
|
|
227 NOP LQI.xyzw VF08, (VI02++)
|
|
228 NOP LQI.xyzw VF04, (VI01++)
|
|
229 NOP LQI.xyzw VF05, (VI01++)
|
|
230 NOP LQI.xyzw VF06, (VI01++)
|
|
231 NOP LQI.xyzw VF07, (VI01++)
|
|
232 MULAx.xyzw ACC, VF04, VF08x LQI.xyzw VF09, (VI02++)
|
|
233 MADDAy.xyzw ACC, VF05, VF08y NOP
|
|
234 MADDAz.xyzw ACC, VF06, VF08z NOP
|
|
235 MADDw.xyzw VF12, VF07, VF08w NOP
|
|
236 MULAx.xyzw ACC, VF04, VF09x LQI.xyzw VF10, (VI02++)
|
|
237 MADDAy.xyzw ACC, VF05, VF09y NOP
|
|
238 MADDAz.xyzw ACC, VF06, VF09z NOP
|
|
239 MADDw.xyzw VF13, VF07, VF09w SQI.xyzw VF12, (VI03++)
|
|
240 MULAx.xyzw ACC, VF04, VF10x LQI.xyzw VF11, (VI02++)
|
|
241 MADDAy.xyzw ACC, VF05, VF10y NOP
|
|
242 MADDAz.xyzw ACC, VF06, VF10z NOP
|
|
243 MADDw.xyzw VF14, VF07, VF10w SQI.xyzw VF13, (VI03++)
|
|
244 MULAx.xyzw ACC, VF04, VF11x NOP
|
|
245 MADDAy.xyzw ACC, VF05, VF11y NOP
|
|
246 MADDAz.xyzw ACC, VF06, VF11z NOP
|
|
247 MADDw.xyzw VF15, VF07, VF11w SQI.xyzw VF14, (VI03++)
|
|
248 NOP NOP
|
|
249 NOP NOP
|
|
250 NOP NOP
|
|
251 NOP SQI.xyzw VF15, (VI03++)
|
|
252 NOP NOP
|
|
253 NOP JR VI15
|
|
254 NOP NOP
|