gxoverlay.s
3.49 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
/*---------------------------------------------------------------------
Copyright (C) 1997, Nintendo.
File gxoverlay.s
Coded by Yoshitaka Yasumoto. Oct 14, 1997.
Modified by
$Id: gxoverlay.s,v 1.1.1.1 2002/05/02 03:29:11 blythe Exp $
---------------------------------------------------------------------*/
#============================================================================
# 本コードは, Ucode の自己ロード機能実現のため IMEM の最後尾に
# 置かれなければならない. (=0x2000-21*4=0x1fac)
#============================================================================
#---------------------------------------------------------------------
# TaskDone/TaskYield/case_G_LOAD_UCODE 2 insts.
#
# マイクロコードの自己ロードモジュール / TASK 終了処理 /
# TASK Yield 処理共通の Overlay 用フック
#
# Overlay 終了後 overlay_TaskDone へ Jump する.
# overlay_TaskDone で $1 の値に応じて処理が振り分けられる.
# $1 == 0 なら case_G_LOAD_UCODE
# $1 == -4 なら TaskDone
# $1 == 0x80 なら TaskYield
# これにより常駐部のサイズを減らすことができる.
#---------------------------------------------------------------------
AssignForDMAproc
TaskDone: _li (sys1, 0x1000) # overlay_TaskDone
_li (sys0, RSP_LSTAT_OVERLAY_TASKDONE) # LoadOverlay へ
.symbol case_G_LOAD_UCODE, TaskDone
.symbol TaskYield, TaskDone
#---------------------------------------------------------------------
# Overlay 処理コード 5 inst.
#
# sys0: ロードするモジュールのデータの DMEM 格納先を指定
# sys1: ロード後の Jump 先を指定
#
# $19,$20,gfx1,return,sys0 は破壊される
#---------------------------------------------------------------------
LoadOverlay: lw dram_adrs, 0(sys0)
LoadOverlay_1: lhu dma_len, 4(sys0) # <-case_G_SUBMODULE から呼出
jal DMAproc
lhu dmem_adrs, 6(sys0) # 正の値 => READ 動作
_mov (return, sys1) # そのまま DMAwait へ
#============================================================================
# これ以降 Ucode 共通のコードとなる. 以下 14 inst.
# アドレス 0x2000-14*4 = 0x1fc8 番地
#============================================================================
.space 0x1fc8
CODE_TOP_COMMON: .bound 8
#--- この間に命令を入れてはならん.
#---------------------------------------------------------------------
# DMA 待ち 4 insts.
# sys0 は破壊される.
#---------------------------------------------------------------------
DMAwait: mfc0 sys0, DMA_BUSY
DMAwait1: bne sys0, zero, DMAwait1
mfc0 sys0, DMA_BUSY
ReturnToR31: jr return
#---------------------------------------------------------------------
# DMA 処理 10 insts.
# DMA の Read/Write 処理を行なう.
# dmem_adrs は下位 13bit のみを DMEM アドレスとして使用する
# ため, 上位を Read/Write 動作の切り替え用に使用する.
# dmem_adrs = (DMEM アドレス) とすれば Read 動作
# dmem_adrs = (DMEM アドレス - 0x8000) として負の値を
# 代入することで Write 動作になる.
#
# dma_len($19): DMA するデータ長 - 1
# dmem_adrs($20): DMA 対象の DMEM アドレス
# gfx1($24): DMA 対象の DRAM アドレス (下位 24bit のみ有効)
#
# sys0 は破壊される.
#---------------------------------------------------------------------
DMAproc: mfc0 sys0, DMA_FULL
DMAproc1: bne sys0, zero, DMAproc1
mfc0 sys0, DMA_FULL
mtc0 dmem_adrs, DMA_CACHE
bltz dmem_adrs, DMAprocWrite # もし dmem_adrs < 0 なら Write
mtc0 gfx1, DMA_DRAM
jr return
mtc0 dma_len, DMA_READ_LENGTH
DMAprocWrite: jr return
mtc0 dma_len, DMA_WRITE_LENGTH
.symbol DMAread, DMAproc
.symbol DMAwrite, DMAproc
EndAssignForDMAproc
/*======== End of gxoverlay.s ========*/