gzdone.s
2.33 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
/*---------------------------------------------------------------------
$Id: gzdone.s,v 1.1.1.1 2002/05/02 03:29:12 blythe Exp $
File : gzdone.s
Coded by Yoshitaka Yasumoto. Jun 17, 1997.
Copyright by Nintendo, Co., Ltd. 1997.
---------------------------------------------------------------------*/
#---------------------------------------------------------------------
# Yield 処理
# ucode の処理状態をセーブする
# outp はバッファフラッシュにより RSP_OUTPUT_OFFSET に初期化
# されるのでここでセーブする必要はない.
#
# Yield する位置でモード分けし処理を変える
#
# Mode A: DL 処理部での Yield
# Mode B: ZObject 処理部での Yield
# Mode C: Sub DL 処理部での Yield
#
#---------------------------------------------------------------------
AssignForDMAproc
#------ ZObject 処理部での Yield ------
RSPyield_B:
_li (sys0, 1)
sb sys0, RSP_YIELD_SAVE_MODE(zero) # モード ID 1 を設定
j RSPyield_Common
sw objp, RSP_YIELD_SAVE_OBJP(zero) # ZOBJ のポインタ保存
#------ DL 処理部での Yield ------
RSPyield_A:
sb zero, RSP_YIELD_SAVE_MODE(zero) # モード ID 0 を設定
#------ パラメータの DMEM への書き出し(共通部) ------
RSPyield_Common:
add inp, inp, dinp # Gfx のポインタ計算
lw sys0, GTASK_UCODE(zero) # 現在の ucode を取得
sw inp, RSP_YIELD_SAVE_INP(zero) # Gfx のポインタ保存
jal OutputCloseFlush # バッファフラッシュ
sw sys0, RSP_YIELD_SAVE_LEN-4(zero) # 現在の ucode を保存
#------ DMEM の内容の DMA 転送 ------
lw dram_adrs, GTASK_YIELD(zero)
_li (dmem_adrs, 0)
_li (dma_len, RSP_YIELD_SAVE_LEN-1)
_li (iswrite, SP_SET_YIELDED|SP_SET_TASKDONE) # フラグとしても使用
jal DMAproc
addiu return, return, 8 # TaskDone2 へ飛ぶ
#---------------------------------------------------------------------
# TaskDone 処理
# CPU に割り込み通知を送り, タスクを終了する
#---------------------------------------------------------------------
#------ 終了フラグの設定 ------
TaskDone: _li (iswrite, SP_SET_TASKDONE)
#------ バッファのフラッシュ ------
TaskDone1: jal OutputCloseFlush
#------ STATUS 更新/ RSP 停止 ------
TaskDone2: mtc0 iswrite, SP_STATUS
break
EndAssignForDMAproc
/*======== End of gzdone.s ========*/