gzobj.s
5.2 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
/*---------------------------------------------------------------------
$Id: gzobj.s,v 1.1.1.1 2002/05/02 03:29:12 blythe Exp $
File : gzobj.s
Coded by Yoshitaka Yasumoto. Jun 18, 1997.
Copyright by Nintendo, Co., Ltd. 1997.
---------------------------------------------------------------------*/
FixedAssign(zObjHdr, 1)
FixedAssign(zStat0, 13)
FixedAssign(zStat1, 14)
FixedAssign(zMask, 15)
FixedAssign(zBuf, 16)
FixedAssign(zType, 21)
#---------------------------------------------------------------------
# RDP_CHUNK の処理
#---------------------------------------------------------------------
#include "gzrdp.s"
#---------------------------------------------------------------------
# case_G_ZOBJ
# ZSort Object の描画
#
# 31 3 2 0
# +------------------------+--+
# ZObj 1 | Pointer |ID|
# +------------------------+--+
# ZObj 2 | Pointer |ID|
# +------------------------+--+
#
# 単純に Object リンクへのポインタ+ID が 2 つ並んだもので
# ある. Pointer は Kseg0 を指さねばならない.
# そのため, 上位 8 bit は 0x80 となる.
# ZObj n == 0x80000000 なら, そのデータは無効となる.
#---------------------------------------------------------------------
#------ 次の Gfx リンクの処理 ------
ZObj_NextLink:
lw objp, RSPZS_ZOBJ_SAVE_GFX1(zero)
bne objp, zero, ZObj_Start # gfx1 の処理なら jump
sw zero, RSPZS_ZOBJ_SAVE_GFX1(zero)
j GfxDone # gfx0,1 共に終了なら GfxDone
case_G_ZOBJ:
#------ 初期設定 ------
sw gfx1, RSPZS_ZOBJ_SAVE_GFX1(zero) # gfx1 の保存
_mov (objp, gfx0)
#------ Yield 復帰ポイント ------
RSPcontinue_B:
lw zMask, RSP_ZOBJ_MASK(zero) # マスクの取得
_li (zBuf, RSP_ZOBJ_BUF_A)
#------ Gfx 処理開始 ------
#
# objp からリンクの走査を開始する.
#
ZObj_Start:
AssignForDMAproc
#------ 最初の ZObject のロード -----
_mov (dmem_adrs, zBuf)
and dram_adrs, objp, zMask
beq dram_adrs, zero, ZObj_NextLink
andi zType, objp, 7
jal DMAread
lbu dma_len, RSP_ZOBJ_SIZE(zType)
sll zType, zType, 1
EndAssignForDMAproc
#------ Gfx 処理分岐 ------
#
# DMA 終了待ち
# objp が 0 なら次のリンクリストへ
# objp より各タイプの分岐処理を行なう
# 分岐先で sys1 の値をチェックし, 0 でないなら
# RSPyield 処理へ jump させる.
# gfx1 に RDPCMD_1 の値を代入しておく
#
ZObj_Launch:
mfc0 zStat1, DMA_BUSY # DMA Busy ならループ
mfc0 zStat0, SP_STATUS
ZObj_Launch_A:
Assign(vdata0, v2)
Assign(vdata1, v3)
lh zObjHdr, RSP_ZOBJ_TABLE(zType) # 符号付で処理する
bne zStat1, zero, ZObj_Launch
# lw gfx1, oRZ_RDPCMD_1(zBuf) # 命令を入れ替える
lqv vdata0[0], 16(zBuf)
jr zObjHdr # 各処理へ Jump する
# andi sys1, zStat0, SP_STATUS_YIELD # 0x80
lqv vdata1[0], 32(zBuf)
EndAssign(vdata0, v2)
EndAssign(vdata1, v3)
#---------------------------------------------------------------------
# ZObject - "Null" の処理
#
# +-----------+-----------+-----------+-----------+
# | Hdr | RDP cmd 1 | RDP cmd 2 | RDP cmd 3 |
# +-----------+-----------+-----------+-----------+
#
# RDP cmd 1,2,3 からリンクしている RDPCMD を FIFO バッファへ
# 転送する.
#
#---------------------------------------------------------------------
Assign(gfx1Sv, 2)
Assign(rdpcmd, 3)
Assign(rdpcmdSv, 4)
ZObj_Null:
lw gfx1, oRZ_RDPCMD_1(zBuf) # 移動してきた
andi sys1, zStat0, SP_STATUS_YIELD # 移動してきた
bne sys1, zero, RSPyield_B # Yield 判定
#
lw rdpcmd, RSP_STATUS_RDPCMD_1(zero) # RDPCMD1 保存値取得
beq gfx1, zero, ZObj_Null_1 # RDPCMD1 が 0 ならSKIP
_forward_adrs(adrs_ZObj_Null_1, 3)
_liu (zStat0, adrs_ZObj_Null_1) # Return 位置設定(正)
bne gfx1, rdpcmd, case_G_RDPCHUNK_1 # 直前にロードならSKIP
sw gfx1, RSP_STATUS_RDPCMD_1(zero) # RDPCMD1 保存値更新
ZObj_Null_1:
lw gfx1, oRZ_RDPCMD_2(zBuf) # RDPCMD2 取得
lw gfx1Sv, oRZ_RDPCMD_3(zBuf) # RDPCMD3 取得
lw rdpcmd, RSP_STATUS_RDPCMD_2(zero) # RDPCMD2 保存値取得
beq gfx1, zero, ZObj_Null_2 # RDPCMD2 が 0 ならSKIP
lw rdpcmdSv, RSP_STATUS_RDPCMD_3(zero) # RDPCMD3 保存値取得
_forward_adrs(adrs_ZObj_Null_2, 3)
_liu (zStat0, adrs_ZObj_Null_2) # Return 位置設定(正)
bne gfx1, rdpcmd, case_G_RDPCHUNK_1 # 直前にロードならSKIP
sw gfx1, RSP_STATUS_RDPCMD_2(zero) # RDPCMD2 保存値更新
ZObj_Null_2:
beq gfx1Sv, zero, ZObj_Start # RDPCMD3 が 0 ならSKIP
lw objp, oRZ_HEADER(zBuf) # 次の ZObj の Ptr 取得
beq gfx1Sv, rdpcmdSv, ZObj_Start # 直前にロードならSKIP
_mov (gfx1, gfx1Sv) # RDPCMD3 を gfx1に SET
sw gfx1, RSP_STATUS_RDPCMD_3(zero) # RDPCMD3 保存値更新
j case_G_RDPCHUNK_1 # コマンド転送
_liu (zStat0, ZObj_Start) # Return 位置設定(正)
EndAssign(gfx1Sv, 2)
EndAssign(rdpcmd, 3)
EndAssign(rdpcmdSv, 4)
#----------------------------------------------------------------------------
# ZObject - "Shaded Triangle" の処理
#----------------------------------------------------------------------------
#include "gzshtri.s"
#----------------------------------------------------------------------------
# ZObject - "Shaded Textured Triangle" の処理
#----------------------------------------------------------------------------
#include "gztxtri.s"
EndAssign(zObjHdr, 1)
EndAssign(zStat0, 13)
EndAssign(zStat1, 14)
EndAssign(zMask, 15)
EndAssign(zBuf, 16)
EndAssign(zType, 21)
/*======== End of gzobj.s ========*/