gxrdp.s
4.42 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
/*---------------------------------------------------------------------*
Copyright (C) 1997, Nintendo.
File gxrdp.s
Coded by Yoshitaka Yasumoto. Oct 23, 1997.
$Id: gxrdp.s,v 1.1.1.1 2002/05/02 03:29:11 blythe Exp $
*---------------------------------------------------------------------*/
#============================================================================
# RDP 系処理
#============================================================================
#if (!defined(UCODE_S2DEX2))||(defined(OVERLAY))
#---------------------------------------------------------------------
# case_G_TEXRECT_DONE
# TextureRectangle 系のコマンド Part 3 を処理する.
# そのまま case_G_RDP_Genaral 処理へ
#---------------------------------------------------------------------
case_G_TEXRECT_DONE:
#if !(defined(UCODE_L3DEX2)||defined(UCODE_S2DEX2))
ldv vtmp[0], RSP_GSTAT_RDPHALF_0H(zero)
lw gfx0, RSP_GSTAT_RDPHALF_1L(zero)
addi outp, outp, 8
sdv vtmp[0], 0-8(outp)
#else
ldv vtmp[0], RSP_GSTAT_SCISSOR(zero)
ldv vtmp[8], RSP_GSTAT_RDPHALF_0H(zero)
lw gfx0, RSP_GSTAT_RDPHALF_1L(zero)
addi outp, outp, 16
sdv vtmp[0], 0-16(outp)
sdv vtmp[8], 0-8(outp)
#endif
#===== この間に命令をいれてはならん. =====
#---------------------------------------------------------------------
# case_G_RDP_Genaral
# Gfx DL が RDP コマンドであるとみなし, そのまま DMEM バッファ
# に送る
#---------------------------------------------------------------------
case_G_RDP_General:
sw gfx1, 4(outp)
#===== この間に命令をいれてはならん. =====
#---------------------------------------------------------------------
# case_G_RDP_Genaral_Half
# Gfx DL が前半 4 BYTE のみで充分な RDP コマンドであるとみ
# なし, 前半部のみを DMEM バッファに送る.
# Sync 系コマンドおよび NoOp コマンドがこれに該当する.
#---------------------------------------------------------------------
case_G_RDP_General_Half:
sw gfx0, 0(outp)
j OutputCloseGfxDone
addi outp, outp, 8
#---------------------------------------------------------------------
# case_G_RDP_AdrsFixup
# コマンド内のセグメントアドレスを物理アドレスに変換してから
# RDP コマンドとして送る
#---------------------------------------------------------------------
case_G_RDP_AdrsFixup:
_li (return, case_G_RDP_General)
#===== この間に命令をいれてはならん. =====
#---------------------------------------------------------------------
# AdrsFixup
# セグメントアドレスを物理アドレスに変換する
#---------------------------------------------------------------------
AdrsFixup:
srl sys0, gfx1, 22 # セグメント index 取得
andi sys0, sys0, 0x3c
lw sys0, RSP_GSTAT_SEG_OFFSET(sys0) # テーブル参照
sll gfx1, gfx1, 8 # 上位 8 bit をマスク
srl gfx1, gfx1, 8
jr return
add gfx1, gfx1, sys0 # オフセットの加算
#---------------------------------------------------------------------
# case_G_RDPSETOTHERMODE
# 現在の OtherMode の設定を保存し, 送信する.
# (G_SETOTHERMODE_[LH] のために必要)
#---------------------------------------------------------------------
case_G_RDPSETOTHERMODE:
sw gfx0, RSP_GSTAT_OTHER_H(zero)
j case_G_RDP_General
sw gfx1, RSP_GSTAT_OTHER_L(zero)
#endif /*(!defined(UCODE_S2DEX2))||(defined(OVERLAY))*/
#if (!defined(UCODE_S2DEX2))||(!defined(OVERLAY))
#---------------------------------------------------------------------
# case_G_SETSCISSOR
# S2DEX/L3DEX に対応させるためにシザリングパラメータを保存する.
# RDP コマンドリファレンスの図と異なり画面の左上を XL,YL
# 右下を XH,YH としている.
#---------------------------------------------------------------------
case_G_SETSCISSOR:
#if !(defined(UCODE_L3DEX2)||defined(UCODE_S2DEX2))
sw gfx0, RSP_GSTAT_SCISSOR+0(zero)
j case_G_RDP_General
sw gfx1, RSP_GSTAT_SCISSOR+4(zero)
#else /*!(defined(UCODE_L3DEX2)||defined(UCODE_S2DEX2))*/
sw gfx0, RSP_GSTAT_SCISSOR+0(zero)
sw gfx1, RSP_GSTAT_SCISSOR+4(zero)
_li (return, case_G_RDP_General)
case_G_SETSCISSOR_Decode:
#------ 左上 ------
andi sys0, gfx0, 0xfff
sh sys0, RSP_SUBMOD_LN_SCIS_YL(zero)
srl sys0, gfx0, 12
andi sys0, sys0, 0xfff
sh sys0, RSP_SUBMOD_LN_SCIS_XL(zero)
#------ 右下 ------
andi sys0, gfx1, 0xfff
sh sys0, RSP_SUBMOD_LN_SCIS_YH(zero)
srl sys0, gfx1, 12
andi sys0, sys0, 0xfff
jr return
sh sys0, RSP_SUBMOD_LN_SCIS_XH(zero)
#endif /*!(defined(UCODE_L3DEX2)||defined(UCODE_S2DEX2))*/
#endif /*(!defined(UCODE_S2DEX2))||(!defined(OVERLAY))*/
/*======== End of gxrdp.s ========*/