gximm.s
18.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
/*---------------------------------------------------------------------*
Copyright (C) 1997, Nintendo.
File gximm.s
Coded by Yoshitaka Yasumoto. Oct 20, 1997.
$Id: gximm.s,v 1.1.1.1 2002/05/02 03:29:11 blythe Exp $
*---------------------------------------------------------------------*/
#============================================================================
# IMM 系処理
#============================================================================
#ifndef OVERLAY
#ifdef MTXSYNC
#---------------------------------------------------------------------
# case_G_SPECIAL_1
#
# M マトリクスと P マトリクスを掛け, MP マトリクスにする
# +------------+------------+------------+------------+
# | SPECIAL_1 | | 1 |
# +------------+------------+------------+------------+
# | |
# +------------+------------+------------+------------+
#---------------------------------------------------------------------
FixedAssign(mpmtx, 19)
FixedAssign(mmtx, 20)
FixedAssign(pmtx, 21)
case_G_SPECIAL_1:
_li (return, GfxDone)
_li (pmtx, RSP_GSTAT_PMTX)
_li (mmtx, RSP_GSTAT_MMTX)
_li (mpmtx, RSP_GSTAT_MPMTX)
j math_MatCat
sb gfx0, RSP_LSTAT_MULMP_FLAG(zero) # フラグを非 0 にする
EndAssign(mpmtx, 19)
EndAssign(mmtx, 20)
EndAssign(pmtx, 21)
#else /*MTXSYNC*/
.symbol case_G_SPECIAL_1, GfxDone
#endif /*MTXSYNC*/
.symbol case_G_SPECIAL_2, GfxDone
.symbol case_G_SPECIAL_3, GfxDone
#---------------------------------------------------------------------
# case_G_DMA_IO (DEBUG 用)
# IMEM/DMEM 内のデータを DMA で DRAM へ読み出したり書き出し
# たりする.
#
# +------------+-+----------+---+-+------+--------+---+
# | DMA_IO |F| dmem_adrs/8 |0| dma_len/8 |000|
# +------------+-+----------+---+-+------+--------+---+
# | dram adrs |
# +------------+------------+------------+------------+
#---------------------------------------------------------------------
AssignForDMAproc
case_G_DMA_IO:
jal AdrsFixup
lh dmem_adrs, RSP_DLINPUT_BOTTOM-7(dinp) # F が符号拡張される
andi dma_len, gfx0, 0xff8
sra dmem_adrs, dmem_adrs, 2
j DMAproc
_li (return, DMAwaitGfxDone)
EndAssignForDMAproc
#---------------------------------------------------------------------
# case_G_GEOMETRYMODE (旧 SETGEOMETRYMODE/CLEARGEOMETRYMODE)
#
# Level 2 から GBI が変更になったので注意すること.
# +------------+------------+------------+------------+
# |GEOMETRYMODE| AND Data |
# +------------+------------+------------+------------+
# | Any | OR Data |
# +------------+------------+------------+------------+
#
# Geometry モードに AND 処理をしたのちに OR 処理をする.
# これによって SET/CLEAR が 1 つの命令で処理可能となり,
# 4 命令減となる.
# Geometry モードは 0-23 bit までを使用するので上位 8 bit は
# 無視できる.
# CULL フラグと SHADING_SMOOTH フラグが変更になっている.
#
# 0x00000001 G_ZBUFFER
# 0x00000002 G_TEXTURE_ENABLE
# 0x00000004 G_SHADE
# 0x00000400 G_CULL_FRONT /* Level2 */
# 0x00000800 G_CULL_BACK /* Level2 */
# 0x00000c00 G_CULL_BOTH /* Level2 */
# 0x00010000 G_FOG
# 0x00020000 G_LIGHTING
# 0x00040000 G_TEXTURE_GEN
# 0x00080000 G_TEXTURE_GEN_LINEAR
# 0x00100000 G_LOD /* NOT IMPLEMENTED */
# 0x00200000 G_SHADING_SMOOTH /* Level2 */
# 0x00800000 G_CLIPPING
#---------------------------------------------------------------------
case_G_GEOMETRYMODE:
lw sys0, RSP_LSTAT_RENDER(zero)
and sys0, sys0, gfx0
or sys0, sys0, gfx1
j GfxDone
sw sys0, RSP_LSTAT_RENDER(zero)
#---------------------------------------------------------------------
# case_G_ENDDL
# DL スタックを POP して 呼び出し側の DL へ処理を移す
#
# JUMP 先の TaskDone は stackp($1) で DL スタックの計算を行な
# うことに依存したコードとなっているので変更するときは注意する.
#---------------------------------------------------------------------
FixedAssign(stackp, 1) /* G_DL と共通 */
case_G_ENDDL: lbu stackp, RSP_GSTAT_DL_N(zero) # Load Delay 2clk
beq stackp, zero, TaskDone # stackp == -4 で Jump
addi stackp, stackp, -4
j case_G_DL_1
lw inp, RSP_GSTAT_DLSTACK_OFFSET(stackp)
EndAssign(stackp, 1)
#else /*!OVERLAY */
#---------------------------------------------------------------------
# case_G_DL
# 指定された DL へ処理を移す.
# gfx0 の bit16 が 1 なら gSPBranchDL, 0 なら gSPDisplayList
# となる. DL スタックのオーバーフローのチェックはしていない.
#---------------------------------------------------------------------
case_G_DL:
FixedAssign(stackp, 1) /* G_ENDDL と共通 */
FixedAssign(param, 2)
Assign(save_inp, 3)
lbu stackp, RSP_GSTAT_DL_N(zero)
sll param, gfx0, 15
case_G_DL_0: jal AdrsFixup # gximm_ex.s から Jump in する
add save_inp, inp, dinp
bltz param, StartDLload
_mov (inp, dram_adrs)
sw save_inp, RSP_GSTAT_DLSTACK_OFFSET(stackp)
addi stackp, stackp, 4
case_G_DL_1: j StartDLload # G_ENDDL から Jump in する
sb stackp, RSP_GSTAT_DL_N(zero)
EndAssign(stackp, 1)
EndAssign(param, 2)
EndAssign(save_inp, 3)
#---------------------------------------------------------------------
# case_G_TEXTURE
# コマンドを RSP_LSTAT_TEX_CMD および RSP_LSTAT_TEX_SCALE に
# 保存する. sys0 の値をいじることで, case_G_RDPHALF_0 の命令
# と共通化する. 1 サイクルのロスとなるが 2 命令短縮できる.
# Fast3D と異なり, TEXTURE_ON/OFF のフラグの
# GEOMETRYMODE へのマージは行なわないので G_TEXTURE_ENABLE
# フラグは RSP_LSTAT_TEX_CMD の方を参照することになる.
# setup ルーチンで RSP_LSTAT_TEX_ENABLE の値が 0 かどうかを
# 判定する
#---------------------------------------------------------------------
.symbol adrs_G_RDPHALF_0, case_G_RDPHALF_0 & 0x1fff
.symbol RSP_RDPHALF_DIFF, RSP_GSTAT_RDPHALF_0H - adrs_G_RDPHALF_0
.symbol RSP_TEXTURE_DIFF, RSP_LSTAT_TEX_CMD - RSP_RDPHALF_DIFF
case_G_TEXTURE:
_li (sys0, RSP_TEXTURE_DIFF)
#===== この間に命令をいれてはならん. =====
#---------------------------------------------------------------------
# case_G_RDPHALF_0
# GBI を内部バッファに保存する.
# TextureRectangle 系のコマンド Part 1 を処理する
#---------------------------------------------------------------------
# case_G_RDPHALF_1
# GBI を内部バッファに保存する.
# TextureRectangle 系のコマンド Part 2 を処理する
# パラメータが足りない GBI の補助用にも使用
#---------------------------------------------------------------------
# RSP_STATEP_RDPHALF_0L と RSP_STATEP_RDPHALF_1L のアドレス差
# が 4Bytes であることを利用して共通化する.
#---------------------------------------------------------------------
case_G_RDPHALF_0:
sw gfx0, RSP_RDPHALF_DIFF+0(sys0)
case_G_RDPHALF_1:
j GfxDone
sw gfx1, RSP_RDPHALF_DIFF+4(sys0)
#---------------------------------------------------------------------
# case_G_MOVEWORD
# 32bit データを DMEM に書き込む
#
# Level 2 から GBI が変更になったので注意すること.
# +------------+------------+------------+------------+
# | MOVEWORD | index | offset |
# +------------+------------+------------+------------+
# | data |
# +------------+------------+------------+------------+
#
# DMEM のレンジは下位 12 Bit しかないので上位の値をあえて
# マスクする必要はない.
#---------------------------------------------------------------------
case_G_MOVEWORD:
FixedAssign(adrs, 1)
Assign(index, 2)
srl index, gfx0, 16
lhu adrs, RSP_LSTAT_MOVEWORD_OFFSET-(G_MOVEWORD<<8)(index)
case_G_MOVEWORD_0:
# gximm_ex.s からここへ Jump する
add adrs, adrs, gfx0
j GfxDone
sw gfx1, 0(adrs)
EndAssign(adrs, 1)
EndAssign(index, 2)
#---------------------------------------------------------------------
# case_G_MOVEMEM
# case_G_DMA_General 後, 何もする必要がないため DMAwait 後
# 終了する.
#---------------------------------------------------------------------
.symbol case_G_MOVEMEM, DMAwaitGfxDone
#---------------------------------------------------------------------
# case_G_POPMTX
#
# Level 2 から GBI が変更になったので注意すること.
# +------------+------------+------------+----------+-+
# | cmd | 0x07<<3 | 0x00 | 0x02 |0|
# +------------+------------+------------+----------+-+
# | POP level |
# +------------+------------+------------+------------+
# dram_adrs = gfx1 なので書き換えて case_G_MOVEMEM として
# 処理する. これによりスピードはやや落ちるが 3 命令短縮
# になる. Stack バッファの溢れのチェックはしていないので注意.
# POP level 複数のマトリクスを POP できる. 1 つ分の POP 処
# 理の場合は 64 で OK.
#
# MP マトリクス計算要求フラグ, ライトデータ計算要求フラグを
# 共に ON(=0) にする.
#---------------------------------------------------------------------
#define CHECK_EMPTY_POPMTX
#ifdef CHECK_EMPTY_POPMTX
Assign(size, 1)
Assign(stack, 2)
case_G_POPMTX: lw sys0, RSP_GSTAT_DRAM_STACK(zero)
lw stack,GTASK_STACK(zero) # スタックの底
sub dram_adrs, sys0, gfx1 # ポインタ減算
sub size, dram_adrs, stack # サイズ計算
bgez size, case_G_POPMTX_0 # 底を超えるかの判定
nop
_mov (dram_adrs, stack) # スタックを空にする
case_G_POPMTX_0: beq dram_adrs, sys0,GfxDone # 既ロードの判定
sw dram_adrs, RSP_GSTAT_DRAM_STACK(zero)
j case_G_DMA_General_1
sw zero, RSP_LSTAT_SETMTX_FLAG(zero)
EndAssign(size, 1)
EndAssign(stack, 2)
#else /*CHECK_EMPTY_POPMTX*/
case_G_POPMTX: nop
nop
nop
nop
nop
nop
lw sys0, RSP_GSTAT_DRAM_STACK(zero)
sw zero, RSP_LSTAT_SETMTX_FLAG(zero)
sub dram_adrs, sys0, gfx1
j case_G_DMA_General_1
sw dram_adrs, RSP_GSTAT_DRAM_STACK(zero)
#endif /*CHECK_EMPTY_POPMTX*/
#---------------------------------------------------------------------
# case_G_MTX
#
# Level 2 から GBI が変更になったので注意すること.
# +------------+------------+------------+------------+
# | cmd | 0x07<<3 | 00000000 | flg^1 |
# +------------+------------+------------+------------+
# | data |
# +------------+------------+------------+------------+
#
# 以下のような処理を行なう.
# (1) PUSH/NOPUSH フラグを判別し, STACK への PUSH 処理を行なう.
# (2) LOAD/MUL の判定で直接行列エリアへロードするか DMA バッ
# ファへロードする. LOAD なら終了
# (3) DMA したデータとマトリクスを掛け合わせる
#
# Level 1 ではこの後さらに MxP マトリクスの計算をしていたが,
# Level 2 ではこの計算は Vtx の計算の DMA 待ちの間に行なう.
#
# flg&0xfe == index となるようにパラメータを調整している.
#
# G_MTX_MODELVIEW 0x00 /* matrix types */
# G_MTX_PROJECTION 0x04
# G_MTX_MUL 0x00 /* concat or load */
# G_MTX_LOAD 0x02
# G_MTX_NOPUSH 0x00 /* push or not */
# G_MTX_PUSH 0x01
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# (3) DMA したデータとマトリクスを掛け合わせる
# MUL=0 なので index の値は 0(=MMTX) あるいは 4(=PMTX) となる
# ので index を利用して MtxT,D の値を作成する. index の値は
# DMA_General で設定されている.
# 乗算マトリクスの MtxS が dmem_adrs($20) で指定されている.
# そのまま math_MatCat へ移行する. MatCat 終了後, GfxDone
# となる.
#---------------------------------------------------------------------
FixedAssign(index, 1)
case_G_MTX_Mul:
FixedAssign(MtxD, 19)
FixedAssign(MtxS, 20)
FixedAssign(MtxT, 21)
#define eMtxS1 sys1
#define eMtxS2 sys0
lhu MtxD, (RSP_LSTAT_MOVEMEM_OFFSET+2)(index)
jal DMAwait
lhu MtxT, (RSP_LSTAT_MOVEMEM_OFFSET+2)(index)
_li (return, GfxDone)
#====== この間にコードをはさんではならん
#---------------------------------------------------------------------
# math_MatCat
#
# マトリクスを乗ずる. (MtxD)=(MtxS)x(MtxT)
# MtxT($21) と MtxD($19) は保存される.
# MtxS($20) と $v2-$v9, sys0, sys1 は破壊される.
#---------------------------------------------------------------------
Assign(vMtxSi, v2)
Assign(vMtxSf, v3)
Assign(vMtxTi, v4)
Assign(vMtxTf, v5)
Assign(vMtxDi, v6)
Assign(vMtxDf, v7)
Assign(vMtxDi_sv, v8)
Assign(vMtxDf_sv, v9)
math_MatCat: addi eMtxS1, MtxS, 24 # DMAwait の遅延内での計算
math_MtxCat_1: vmadn vMtxDf_sv, vzero, _0x0000
addi eMtxS2, MtxS, 8
vmadh vMtxDi_sv, vzero, _0x0000
addi MtxT, MtxT, -32
vmudh vtmp, vzero, _0x0000
math_MtxCat_2: ldv vMtxTf[0], 32+32(MtxT)
ldv vMtxTf[8], 32+32(MtxT)
lqv vMtxSf[0], 32(MtxS)
ldv vMtxTi[0], 32+ 0(MtxT)
ldv vMtxTi[8], 32+ 0(MtxT)
lqv vMtxSi[0], 0(MtxS)
vmadl vtmp, vMtxTf, vMtxSf[0h]
addi MtxS, MtxS, 2
vmadm vtmp, vMtxTi, vMtxSf[0h]
addi MtxT, MtxT, 8
vmadn vMtxDf, vMtxTf, vMtxSi[0h]
bne MtxS, eMtxS2, math_MtxCat_2
vmadh vMtxDi, vMtxTi, vMtxSi[0h]
bne MtxS, eMtxS1, math_MtxCat_1
addi MtxS, MtxS, 8
sqv vMtxDf_sv[0], 32(MtxD)
sqv vMtxDi_sv[0], 0(MtxD)
sqv vMtxDf[0], 48(MtxD)
jr return
sqv vMtxDi[0], 16(MtxD)
EndAssign(vMtxSi, v2)
EndAssign(vMtxSf, v3)
EndAssign(vMtxTi, v4)
EndAssign(vMtxTf, v5)
EndAssign(vMtxDi, v6)
EndAssign(vMtxDf, v7)
EndAssign(vMtxDi_sv, v8)
EndAssign(vMtxDf_sv, v9)
EndAssign(MtxD, 19)
EndAssign(MtxS, 20)
EndAssign(MtxT, 21)
#undef eMtxS1
#undef eMtxS2
#---------------------------------------------------------------------
# (1) PUSH/NOPUSH フラグを判別し, STACK への PUSH 処理を行なう.
# PUSH ができるのは MODELVIEW のみ
#---------------------------------------------------------------------
# PUSH フラグと MODELVIEW フラグのチェック
#---------------------------------------------------------------------
case_G_MTX:
Assign(isload, 2)
andi sys0, gfx0, (G_MTX_PUSH|G_MTX_PROJECTION)
bne sys0, zero, case_G_MTX_NoPush
andi isload, gfx0, G_MTX_LOAD # LOAD なら isload=2
#---------------------------------------------------------------------
# ModelView Matrix を DMA 転送する.
# Stack バッファの溢れのチェックはしていないので注意.
# DMAwrite のため gfx1 の値を変更するので DMA 終了後,
# gfx1 を再取得する
#---------------------------------------------------------------------
AssignForDMAproc
lw dram_adrs, RSP_GSTAT_DRAM_STACK(zero)
_li (dmem_adrs, RSP_GSTAT_MMTX-0x2000)
jal DMAwrite # dmem_adrs < 0 なので WRITE 動作
_li (dma_len, 63)
addi dram_adrs, dram_adrs, 64
sw dram_adrs, RSP_GSTAT_DRAM_STACK(zero)
lw gfx1, RSP_DLINPUT_BOTTOM-4(dinp) # gfx1 の再取得
EndAssignForDMAproc
#---------------------------------------------------------------------
# (2) LOAD/MUL の判定で直接行列エリアへロードするか DMA バッファへ
# ロードする. LOAD なら DMA 後終了
#
# もし LOAD なら MTX_MUL(0xda) を MTX_LOAD(0xdc) に修正し
# DMA_General へ, もし MUL なら DMA 終了後 case_G_MTX_Mul
# へ Jump する.
# MP マトリクス計算要求フラグ, ライトデータ計算要求フラグを
# 共に ON(=0) にする.
#---------------------------------------------------------------------
case_G_MTX_NoPush:
add sys1, sys1, isload
sw zero, RSP_LSTAT_SETMTX_FLAG(zero)
# このまま case_G_DMA_General へ
EndAssign(isload, 2)
#====== この間にコードをはさんではならん
#---------------------------------------------------------------------
# case_G_DMA_General (G_MOVEMEM/G_MTX/G_POPMTX)
#
# DMA を起動し DRAM 上のデータを DMEM へロードする.
# G_MOVEMEM/G_MTX/G_POPMTX の GBI の処理に使用する.
# ロード処理後, 更に各 GBI へ Jump する.
#
# Level 2 から GBI が変更になったので注意すること.
# +------------+------------+------------+----------+-+
# | cmd |(len-1)&0xf8| offset/8 | index |0|
# +------------+------------+------------+----------+-+
# | data |
# +------------+------------+------------+------------+
#
# DMEM のレンジは下位 12 Bit しかないので上位の値をあえて
# マスクする必要はない. offset の値の下位 3 bit は意味を持
# たないのでマスクをしない. len は 8 の倍数であるので下位
# 3 bit は 0 である. 最大転送量は 256 Byte である
# sys1 には cmd の値 が入っている.
#---------------------------------------------------------------------
case_G_DMA_General:
Assign(offset, 2)
AssignForDMAproc
jal AdrsFixup # Fix up gfx1 as dram_adrs
case_G_DMA_General_1:
andi index, gfx0, 0xfe # index 取得
lbu dma_len, RSP_DLINPUT_BOTTOM-7(dinp)
lhu dmem_adrs, RSP_LSTAT_MOVEMEM_OFFSET(index)
srl offset, gfx0, 5 # offset > 0 となる
lhu return, RSP_LSTAT_JUMPTBL_DMA-G_POPMTX+0x100(sys1)
j DMAread # 必ず dmem_adrs > 0 なので READ 動作
case_G_SETOTHERMODE_H:
add dmem_adrs, dmem_adrs, offset
EndAssign(offset, 2)
EndAssign(index, 1)
EndAssignForDMAproc
#===== この間に命令をいれてはならん. =====
#---------------------------------------------------------------------
# case_G_SETOTHERMODE_[LH]
# Other mode フラグを ON/OFF し RDP へ送る
# case_G_SETOTHERMODE_H と case_G_SETOTHERMODE_L のアドレス差
# が 4 Bytes であることを利用して処理を行なっているのでこれを
# 変更する場合はここを修正すること. case_G_SETOTHERMODE_H は
# この前のルーチン case_G_DMA_General 内にそのエントリがある.
# 本命令は RDP 系の命令ではあるが, 他の RDP 系の命令の中で都
# 合の良い命令で終るもの(case_G_SETOTHERMODE_H のエントリとし
# て使えそうな命令)が gxrdp.s 内に無かったため, 止む終えず
# gximm.s に置いてある.
#
# Level 2 から GBI が変更になったので注意すること.
# +------------+------------+------------+------------+
# |OTHERMODE_LH| |32-shift-len| len-1 |
# +------------+------------+------------+------------+
# | data |
# +------------+------------+------------+------------+
#
# DL のデコード時にジャンプ先を代入した sys0 を用いて
# RSP_OTHERMODE の _H/_L の違いを吸収する.
# srlv/srav 命令のシフト数は下位 5 bit のみが有効なので
# わざわざ and を掛ける必要はない.
#---------------------------------------------------------------------
case_G_SETOTHERMODE_L:
Assign(shft, 1)
Assign(mask, 2)
Assign(mode, 3)
.symbol adrs_G_SETOTHERMODE_L, (case_G_SETOTHERMODE_L & 0x1fff)
.symbol RSP_OTHERMODE_DIFF, (RSP_GSTAT_OTHER_L-adrs_G_SETOTHERMODE_L)
lw mode, RSP_OTHERMODE_DIFF(sys0)
lui mask, 0x8000 # mask = 0x80000000
srav mask, mask, gfx0 # mask = 11..100..0b (1 が len 個)
srl shft, gfx0, 8 # shift 値の取得
srlv mask, mask, shft # mask = 00..011..100..0
nor mask, mask, zero # Bit 反転 mask = 11..100..011..1
and mode, mode, mask # 変更するフラグをクリアする
or mode, mode, gfx1 # フラグ変更
sw mode, RSP_OTHERMODE_DIFF(sys0) # DMEM に変更を保存
lw gfx0, RSP_GSTAT_OTHER_H(zero)
j case_G_RDP_General
lw gfx1, RSP_GSTAT_OTHER_L(zero)
EndAssign(shft, 1)
EndAssign(mask, 2)
EndAssign(mode, 3)
#endif /* OVERLAY */
/*======== End of gximm.s ========*/