gs2tmem.s
8.25 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
/*---------------------------------------------------------------------
Copyright (C) 1997, Nintendo.
File gs2tmem.s
Coded by Yoshitaka Yasumoto. Mar 5, 1997.
Modified by
Comments
$Id: gs2tmem.s,v 1.1.1.1 2002/05/02 03:29:12 blythe Exp $
---------------------------------------------------------------------*/
#!Reserved (0,11,12,17,18,19,20,23,24,25,26,27,30,31)
#!Reserved (v0,v1,v28,v29,v30,v31)
#----------------------------------------------------------------------------
# case_G_OBJ_LOADTMEM
# case_G_OBJ_LDTM_SPRITE
# case_G_OBJ_LDTM_RECT
# case_G_OBJ_LDTM_RECT_R
#
# 条件に一致した場合において Texture をロードする.
#
# +------------------------------------------+
# | cmd:8 |0| | size:8 |
# +------------------------------------------+
# | texter pointer:32 |
# +------------------------------------------+
#
# cmd = G_OBJ_LOADTMEM のとき size=23 だが複合命令を作る場合
# この値を調整する.
#
# G_OBJ_LOADTMEM は正の値にし, 複合命令は負の値にする.
# gfx0 の bit:23 は 0 にする必要あり.
#
# 各命令における cmd,size の値
# G_OBJ_LOADTMEM: cmd=0xc1/0x05 size=23
# G_OBJ_LDTM_SPRITE: cmd=0xc2/0x06 size=47
# G_OBJ_LDTM_RECT: cmd=0xc3/0x07 size=47
# G_OBJ_LDTM_RECT_R: cmd=0xc4/0x08 size=47
#
# typedef struct {
# u64 *image; DRAM 上のテクスチャソースアドレス
# u16 tmem; TMEM ワードアドレス (8byteWORD)
# u16 tsize; TMEM ワードサイズ (8byteWORD)
# u16 tstride; TMEM のラップ幅 (Type が TLUT なら 0 にする)
# u8 type; Type 種別 G_OBJLT_TEXTURE or G_OBJLT_TLUT
# u8 sid; STATE ID 4 の倍数で 0,4,8,12 のどれか
# u32 flag; STATE flag
# u32 mask; STATE mask
# u32 padding; For 8 byte Alignment
# } uObjTxtr_t;
#----------------------------------------------------------------------------
case_G_OBJ_LOADTMEM:
#---------------------------------------------------------------------
# uObjTxtr データのアドレスを物理アドレスに変換し,
# DMA 転送をかける.
#---------------------------------------------------------------------
AssignForDMAproc
jal AdrsFixup
_li (dmem_adrs, RSP_INPUT_TMEM) # 32bit alignment
jal DMAread # dram_adrs は AdrsFixup で設定される
andi dma_len, gfx0, 0xff # gfx0 から size を得る
EndAssignForDMAproc
#---------------------------------------------------------------------
# DMA 終了待ちの間に各パラメータを取得しておく
# gfx0: 複合命令処理用のジャンプ位置(テーブル引き)
# RECT_R のときは負の値にする.
# rsmode: レンダリングパラメータ
# rdpstat: RDP の現在の状態
# tptr: TMEM データ終了位置=sprite 構造体の先頭
#---------------------------------------------------------------------
Assign(rdpstat, 1)
FixedAssign(rsmode, v3) # RenderMode AA/BLP パラメータ
FixedAssign(shrink, v4) # RenderMode Shrink パラメータ
FixedAssign(tptr, 20)
lhu sys0, RSPOBJ_RENDERP_SMODE(zero)
ldv shrink[0], oRSPOBJ_SHRINKPARAM(vecptr) # Shrink パラメータ
lb rdpstat, RSP_STATEP_RDP_STAT(zero) # 符号は必要
lqv rsmode[0], 0(sys0) # AA/BLP パラメータ
srl gfx0, gfx0, 23
jal DMAwait
#ifdef UCODE_S2DEX2
lh gfx0, RSPOBJ_LDTX_TABLE-(G_OBJ_LOADTXTR*2)(gfx0)
#else
lh gfx0, RSPOBJ_LDTX_TABLE-(0xc1*2)(gfx0)
#endif
#---------------------------------------------------------------------
# フラグの判定
# (STATUS[sid] & mask) == flag の場合には, 呼び出さない.
# その他の場合, 呼び出しを行ない STATUS を以下のように変更.
# STATUS[sid] = (STATUS[sid] & ~mask) | (flag & mask);
#---------------------------------------------------------------------
Assign(sid, 3)
Assign(status, 4)
Assign(flag, 5)
Assign(flag2, 6)
Assign(mask, 7)
Assign(maskR, 8)
Assign(tmp, 9)
lbu sid, RSP_TXT_SID(tptr)
lw mask, RSP_TXT_MASK(tptr)
lw flag, RSP_TXT_FLAG(tptr)
lw status, RSPOBJ_GENSTAT_TABLE(sid)
nor maskR, mask, zero
and flag2, flag, mask
and tmp, status, mask
beq tmp, flag, ReturnNext # status&mask==flag なら終
and tmp, status, maskR
or tmp, tmp, flag2 # 新 status 作成
sw tmp, RSPOBJ_GENSTAT_TABLE(sid) # 新 status 保存
EndAssign(sid, 3)
EndAssign(status, 4)
EndAssign(flag, 5)
EndAssign(flag2, 6)
EndAssign(mask, 7)
EndAssign(maskR, 8)
EndAssign(tmp, 9)
#---------------------------------------------------------------------
# Tilesync コマンドの処理
# もし rdpstat == RDP_STAT_LOADTILE なら TileSync を出力
# STATE を RDP_STAT_LOADTILE にする
#---------------------------------------------------------------------
_li (sys0, (RDP_STAT_LOADTILE|0xff00))
bne sys0, rdpstat, NoTileSyncTxtr
sb sys0, RSP_STATEP_RDP_STAT(zero)
sbv _TILESYNC, 0(outp)
addi outp, outp, 8
NoTileSyncTxtr:
#---------------------------------------------------------------------
# gsDPSetTextureImage コマンド設定
# パラメータは
# gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, image)
# gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, width,image)
#
# CMD.0=0x3d100000|width CMD.1=AdrsFixup(image)
# width は LoadBlock 時には関係なし
#
# テクスチャ image のアドレス変換を行なってから代入
#---------------------------------------------------------------------
FixedAssign(image, 19)
Assign(tmem, 3)
Assign(tsize, 4)
lhu tsize, RSP_TXT_TSIZE(tptr) #
ssv _SETTXTRIMG, 0(outp) # RDP cmd 前半設定
lw gfx1, RSP_TXT_IMAGE(tptr) # Image アドレスを取得
sh tsize, 2(outp) # TMEM 幅 (16b換算)
jal AdrsFixup
lhu tmem, RSP_TXT_TMEM(tptr)
#ifdef UCODE_S2DEX2
sw gfx1, 4(outp)
#else
sw image, 4(outp)
#endif
EndAssign(image, 19)
#---------------------------------------------------------------------
# gsDPSetTile コマンド設定
# パラメータは
# gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, line, tmem,
# G_LOAD_TILE, 0,0,0,0,0,0,0)
# LoadBlock の時は line = 0
# LoadTile の時は line = (TMEM 横幅 Word 単位)
#
# CMD.0=0x35100000+tmem CMD.1=G_TX_LOADTILE<<24
#---------------------------------------------------------------------
Assign(head, 5)
Assign(line, 6)
Assign(format, 7)
Assign(lmask, 8)
lb lmask, RSP_TXT_TYPE_LINE(tptr) # 0 or 0xfffc
lbu format, RSP_TXT_TYPE_FMT (tptr)
lbu head, RSP_TXT_TYPE_HEAD(tptr)
addi line, tsize, 1
and line, line, lmask
sll line, line, 7
sll format, format, 16
or tmem, tmem, line
or tmem, tmem, format
sw tmem, 8(outp)
sbv _SETTILE, 8(outp)
EndAssign(tmem, 3)
EndAssign(line, 6)
EndAssign(format, 7)
EndAssign(lmask, 8)
#---------------------------------------------------------------------
# LoadSync コマンドの処理
# もし rdpstat == RDP_STAT_PRIMITIVE(n) なら LoadSync を出力
#---------------------------------------------------------------------
bltz rdpstat, NoLoadSyncTxtr
slv _TX_LOADTILE, 12(outp) # G_TX_LOADTILE<<24
sbv _LOADSYNC, 16(outp) # G_RDPLOADSYNC
addi outp, outp, 8
NoLoadSyncTxtr:
EndAssign(rdpstat, 1)
#---------------------------------------------------------------------
# LoadBlock コマンドの処理
# gsDPLoadBlock(G_TX_LOADTILE, 0, 0, tsiz*4-1, 0x800/tstride);
#
# CMD.0=0x33000000 # G_OBJLT_TXTRBLOCK
# CMD.0=0x34000000 # G_OBJLT_TXTRTILE
# CMD.0=0x30000000 # G_OBJLT_TLUT
# CMD.1=(G_TX_LOADTILE<<24)|((tsiz*4-1)<<12)|(0x800/tstride)
#---------------------------------------------------------------------
Assign(tstride, 1)
lhu tstride, RSP_TXT_TSTRIDE(tptr)
sll head, head, 24 # 0x30 か 0x33 か 0x34
sw head, 16(outp)
sll tsize, tsize, 14
or tsize, tsize, tstride
sw tsize, 20(outp)
sbv _TX_LOADTILE, 20(outp)
EndAssign(head, 5)
#---------------------------------------------------------------------
# コマンド出力後, 各処理先へ Jump する
#---------------------------------------------------------------------
jal OutputClose
addi outp, outp, 24
#
# ここで処理先に Jump するが, もし Sprite コードをオーバー
# レイした場合, tptr の値が破壊されるので, オーバーレイ後は
# ここに戻り, tptr を再度設定し next_cmd へ Jump する.
#
ReturnNext: jr gfx0
_li (tptr, RSP_INPUT_TMEM+24) # データポインタ設定
EndAssign(tstride, 1)
EndAssign(tsize, 4)
EndAssign(tptr, 20)
EndAssign(rsmode, v3) # RenderMode AA/BLP パラメータ
EndAssign(shrink, v4) # RenderMode Shrink パラメータ
.symbol adrs_LoadTx_ReturnNext, ReturnNext
.symbol case_G_OBJ_LDTM_SPRITE, case_G_OBJ_LOADTMEM
.symbol case_G_OBJ_LDTM_RECT, case_G_OBJ_LOADTMEM
.symbol case_G_OBJ_LDTM_RECT_R, case_G_OBJ_LOADTMEM
/*======== End of gs2tmem.s ========*/