gzinit.s
4.26 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
/*---------------------------------------------------------------------
$Id: gzinit.s,v 1.1.1.1 2002/05/02 03:29:12 blythe Exp $
File : gzinit.s
Coded by Yoshitaka Yasumoto. Jun 17, 1997.
Copyright by Nintendo, Co., Ltd. 1997.
---------------------------------------------------------------------*/
#------ 初期化を行なう ------
doInit:
#------ 定数の初期化 ------
#
# vecptr VU でアクセス可能な DMEM 領域へのポインタ
# vzero 全ての要素が 0 の Vec. Reg.
# vone 全ての要素が 1 の Vec. Reg.
# vconst VU 計算時に使用する定数値を保持する
# outp DMEM 内のコマンドバッファのポインタ
# SP_STATUS YIELDED/TASKDONE フラグのクリア
#
vxor vzero, vzero, vzero
_li (vecptr, RSPZS_VPTR)
lqv vconst[0], oRSPZS_VCONST(vecptr)
lqv vconst1[0], oRSPZS_VCONST1(vecptr)
lui sys0, SP_SET_CPUSIGNAL>>16
ori sys0, sys0, SP_CLR_YIELDED|SP_CLR_TASKDONE
mtc0 sys0, SP_STATUS
_li (outp, RSP_OUTPUT_OFFSET)
vadd vone, vzero, _0x0001
#------ Yield からの復帰かを判定 ------
#
# GTASK_FLAGS を参照して Yield 復帰判定を行ない, 分岐する
# その後 FLAGS をクリアする
#
lw sys1, GTASK_FLAGS(zero)
#------ GfxDone の位置の取得 ------
lhu gfxdone, RSP_GFXDONE(zero)
andi sys0, sys1, OS_TASK_YIELDED
beq sys0, zero, RSPinit # Fifo 設定へ
sw zero, GTASK_FLAGS(zero)
#====================================================================
#------ Yield 復帰処理 ------
#
# * セーブしておいたレジスタを復帰し, 処理を再開する
# * ZSort ucode には 2 つの Yield 状態がある. そのうちどちらの
# モードかを SAVE_MODE の値が 0 かどうかで判定する.
#
# inp --- DRAM 上の Gfx コマンドへのポインタ
# objp --- DMEM 内の Z Draw Object データへのポインタ
#
lb sys0, RSP_YIELD_SAVE_MODE(zero)
beq sys0, zero, RSPcontinue_A # DL 処理中のYield
lw inp, RSP_YIELD_SAVE_INP(zero)
lw objp, RSP_YIELD_SAVE_OBJP(zero)
_li (dinp, 0) # DL バッファは空
j Do_Overlay
lhu sys1, RSP_RSPCONTINUE_B(zero) # ZOBJ 処理中の Yield
#====================================================================
#------ Fifo 設定 ------
#
# DP が現在 fifo のどこを処理しているかを判定することで,
# FIFO への書き込み開始位置を取得する.
#
# Fast3D では xbus バージョンをサポートしていたが F3DEX,S2DEX,ZSort
# ではサポートしていないので XBUS かどうかの判定を省略する
#
RSPinit:
Assign(rdpcur, 1)
Assign(rdpend, 2)
Assign(buftop, 3)
Assign(bufend, 4)
#
# RDP を使用しないなら FIFO バッファのセットは行なわない.
# (SP コプロモード)
#
andi sys0, sys1, OS_TASK_SP_ONLY
bne sys0, zero, RSPcontinue_0
#
# RDP のコマンド終了ポインタが fifo バッファの前にあるなら
# fifo をリセットする
#
lw buftop, GTASK_OUTBUFF(zero) # Delay
mfc0 rdpend, CMD_END
_if_gotoR (buftop, gt, rdpend, restart_fifo)
#
# CMD_CURRENT が 0 なら fifo のリセット
#
mfc0 rdpcur, CMD_CURRENT
_if_eq_gotoR(rdpcur, zero, restart_fifo)
nop
#
# CMD_CURRENT != CMD_END なら fifo を継続する
#
_if_ne_gotoR(rdpcur, rdpend, set_fifo)
#------ fifo のリセット処理 ------
#
# DP ステータスが DPC_STATUS_START_VALID になるまで待機
# DP コマンドバッファを RDRAM を参照するように変更 (前半は Delay 内)
# バッファの次に書き込む位置をリセット
# DP コマンドポインタを設定
#
restart_fifo:
_flag_c0_nz_goto(CMD_STATUS, DPC_STATUS_START_VALID, restart_fifo)
_set_c0_regI(CMD_STATUS, DPC_CLR_XBUS_DMEM_DMA)
lw rdpend, GTASK_OUTBUFF_SZ(zero)
_set_c0_regR(CMD_START, rdpend)
_set_c0_regR(CMD_END, rdpend)
#------ DP command へのポインタ設定 ------
#
# 次の DP コマンドの送信位置を DMEM へ保存する
#
set_fifo:
sw rdpend, RSP_STATEP_FIFO_OUTP(zero)
EndAssign(rdpcur, 1)
EndAssign(rdpend, 2)
EndAssign(buftop, 3)
EndAssign(bufend, 4)
#------ 通常起動時の変数の初期化 ------
#
# inp --- Gfx コマンド Buffer 内の Gfx コマンドへのポインタ
#
RSPcontinue_0:
lw inp, GTASK_DATA(zero)
RSPcontinue_A:
#------ オーバーレイ処理 ------
#
# 初期化部分をオーバーレイして gzmath.s の一部分をロードする.
#
AssignForDMAproc
_forward_adrs(adrs_OverlayArea_End, 6)
_forward_adrs(adrs_OverlayArea_Return, 8)
_li (sys1, adrs_OverlayArea_Return)
Do_Overlay:
lw dram_adrs, GTASK_UCODE(zero)
_li (dmem_adrs, 0x1000)
addiu dram_adrs, dram_adrs, 0x1000-0x80
jal DMAread
_li (dma_len, (adrs_OverlayArea_End&0xff8)-1)
OverlayArea_End:
j DMAwait
_mov (return, sys1)
EndAssignForDMAproc
/*======== End of gzinit.s ========*/