

　ＶＵ１によるモデル表示について


現在ＶＵ１のプログラムソースは以下のものが用意されている

 trans0.dsm：通常モジュール
   |
   +-t0_fast.vu1
   | +-クリップなし平行光源パケット用
   | +-クリップなしシングルエンベロープ対応パケット用
   | +-クリップなしプリシェードパケット用
   |
   +-t0_clip.vu1
   | +-クリップあり平行光源パケット用
   | +-クリップありシングルエンベロープ対応パケット用
   | +-クリップありプリシェードパケット用
   |
   +-t0_shdw.vu1
     +-クリップなし影テクスチャ投影パケット用
     +-クリップあり影テクスチャ投影パケット用

 trans1.dsm：フォグ対応モジュール
   |
   +-t1_fast.vu1
   | +-簡易フォグ付きクリップなし平行光源パケット用
   | +-簡易フォグ付きクリップなしシングルエンベロープ対応パケット用
   | +-頂点フォグ付きクリップなしプリシェードパケット用
   |
   +-t1_clip.vu1
   | +-簡易フォグ付きクリップあり平行光源パケット用
   | +-簡易フォグ付きクリップありシングルエンベロープ対応パケット用
   | +-頂点フォグ付きクリップありプリシェードパケット用
   |
   +-t1_shdw.vu1
     +-頂点フォグ付きクリップなし影テクスチャ投影パケット用
     +-頂点フォグ付きクリップあり影テクスチャ投影パケット用


　このルーチンがターゲットとしているモデルの種類は
　　・キャラクタ用平行光源シェーディングモデル（シングルエンベロープ含む）
　　・ステージ背景用プリシェードモデル
　　・影テクスチャ投影対象モデル
　の３つである。今のところ１６ＫＢのμＭＥＭに納まっている為、
　フレーム中のモデル表示処理は一度読み込んだモジュールだけで
　処理するようになっている。また、個々のルーチンは初期のマトリクス
　設定などが必要な１回目と同じパラメータで連続変換するための２回目以降
　で別々の実行開始アドレスが用意されている。
　ＶＵプログラムの呼びわけは実行アドレステーブルを参照することで
　行われる。

　また、ＶＵ１のメモリワークの取り方などは一部メイン側の設定によって
　変わったりすることもあるので注意する必要がある。


＜プログラム呼び出しエントリ＞
Vu1DrawObject1_Func:
	.word	( FastTransStart / 8 )				; 描画１回目
	.word	( FastTransNext / 8 )				; 描画２回目以降
	.word	( ClipTransStart / 8 )				; クリップ処理付き描画１回目
	.word	( ClipTransNext / 8 )				; クリップ処理付き描画２回目以降
	.word	( FastTransEnvelopeStart / 8 )		; エンベロープ処理付き描画１回目
	.word	( FastTransEnvelopeNext / 8 )		; エンベロープ処理付き描画２回目以降
	.word	( ClipTransEnvelopeStart / 8 )		; エンベロープ・クリップ処理付き描画１回目
	.word	( ClipTransEnvelopeNext / 8 )		; エンベロープ・クリップ処理付き描画２回目以降

	.word	( FastPreshadeTransStart / 8 )		; プリシェード・描画１回目
	.word	( FastPreshadeTransNext / 8 )		; プリシェード・描画２回目以降
	.word	( ClipPreshadeTransStart / 8 )		; プリシェード・クリップ処理付き描画１回目
	.word	( ClipPreshadeTransNext / 8 )		; プリシェード・クリップ処理付き描画２回目以降
	.word	( FastTransEnvelopeStart / 8 )		; プリシェード・エンベロープ処理付き描画１回目＜未使用＞
	.word	( FastTransEnvelopeNext / 8 )		; プリシェード・エンベロープ処理付き描画２回目以降＜未使用＞
	.word	( ClipTransEnvelopeStart / 8 )		; プリシェード・エンベロープ・クリップ処理付き描画１回目＜未使用＞
	.word	( ClipTransEnvelopeNext / 8 )		; プリシェード・エンベロープ・クリップ処理付き描画２回目以降＜未使用＞

	.word	( ShadowFastTransStart / 8 )	; 影描画１回目
	.word	( ShadowFastTransNext / 8 )		; 影描画２回目以降
	.word	( ShadowClipTransStart / 8 )	; クリップ処理付き描画１回目
	.word	( ShadowClipTransNext / 8 )		; クリップ所利付き描画２回目以降


＜代表的なレジスタ割り当て＞

　基本的にこれに沿ったレジスタ割り当てを行っているが、クリップルーチンや
エンベロープ処理などここで示したレジスタ割り当てない場合もありえる。
基本的にオブジェクト毎にレジスタは再設定されることを想定しているため
必ずしもこの通りに使わなくてはいけないわけではない．

;	浮動小数点レジスタ使用状況
;	vf0:fix
;	vf1:定数読み込みベクトル
;	vf2:tmp
;	vf3:tmp
;	vf4~vf7:透視変換マトリクス
;	vf8~vf11:ローカルライトマトリクス
;	vf12:頂点読み込み
;	vf13:法線読み込み
;	vf14:ＵＶ値読み込み
;	vf15:リザーブ（頂点データ読み込み）
;	vf16~19:エンベロープ用マトリクス
;	vf20:透視変換直後座標
;	vf21:光源計算用ワーク
;	vf22~23:エンベロープ用ワーク
;	vf24~27:ローカルカラーマトリクス
;	vf28:描画頂点データ
;	vf29:色データ
;	vf30:テクスチャ座標
;	vf31:リザーブ（変換後頂点データ）
;	
;	整数レジスタ使用状況
;	vi0:０固定
;	vi1:バッファ先頭アドレス（インクリメントしてキックアドレスとして使用する）
;	vi2:ＧＩＦキックアドレス
;	vi3:読み出し頂点処理アドレス
;	vi4:汎用
;	vi5:汎用
;	vi6:汎用
;	vi7:描画キックフラグの記憶
;	vi8:頂点数（＝ループカウンタ）
;	vi9:リザーブ
;	vi10:リザーブ
;	vi11:リザーブ
;	vi12:リザーブ
;	vi13:リザーブ
;	vi14:スタック
;	vi15:リンクレジスタ
;	


＜ワークの説明＞

　１６ＫＢあるＶＵ－ＭＥＭを下のように分けて使用している。
　基本的にＶＵパケットは次の処理に影響を及ぼすことがある為、
すべてのＶＵプログラムは共通のメモリ配分において作られなければ
ならないので注意すること。

; メモリ使用構成（ＶＵ１側から見るときには下位４ビットを無視すること）
; 0x0000~0x01ff	プログラムワーク
; 0x0200~0x03ff オブジェクトパラメータ設定（変換マトリクス等）
; 0x0400~0x21ff ダブルバッファ０
;  +0x0000_0x0eff 転送用バッファ
;  +0x0f00_0x1cff 読み込み用バッファ
; 0x2200~0x3fff ダブルバッファ１
;  +0x0000_0x0eff 転送用バッファ
;  +0x0f00_0x1cff 読み込み用バッファ
; 0x4000		最終アドレス
; 


＜プログラムワーク及びオブジェクトパラメータ設定の詳細＞

; 固定パラメータ類（ＶＵ－ＭＥＭ絶対アドレス）
FV_MIN		= 0		; プリミティブ座標クランプ値（最小値）
FV_MAX		= 1		; プリミティブ座標クランプ値（最大値）
FV_FOG		= 2		; フォグパラメータ
FV_PRM		= 3		; 各種定数
FV_SCN		= 4		; プリミティブ座標へのスケーリングパラメータ
FV_OFT		= 5		; プリミティブ座標へのオフセット値
FV_PRM2		= 6		; 各種定数２
FV_PD2		= 7		; リザーブ
; オブジェクト処理パラメータ類（ＶＵ－ＭＥＭ絶対アドレス）
M_PRS0		= 32	; 透視変換マトリクス０ （もしかするとFV_DATがここに来てそれ以降１づつずれるかも）
M_PRS1		= 33	; 透視変換マトリクス１
M_PRS2		= 34	; 透視変換マトリクス２
M_PRS3		= 35	; 透視変換マトリクス３
M_LIT0		= 36	; ローカルライトマトリクスＸ = lit0_x,lit1_x,lit2_x,supecular_x
M_LIT1		= 37	; ローカルライトマトリクスＹ = lit0_y,lit1_y,lit2_y,supecular_y
M_LIT2		= 38	; ローカルライトマトリクスＺ = lit0_z,lit1_z,lit2_z,supecular_z
M_LIT3		= 39	; 未使用
M_COL0		= 40	; ローカルカラー０ = lit0_r,lit0_g,lit0_b
M_COL1		= 41	; ローカルカラー１ = lit1_r,lit1_g,lit1_b
M_COL2		= 42	; ローカルカラー２ = lit2_r,lit2_g,lit2_b
M_COL3		= 43	; アンビエントカラー = amb_r amb_g amb_b
M_SUP0		= 44	; エンベロープ補償マトリクス
M_SUP1		= 45	; エンベロープ補償マトリクス
M_SUP2		= 46	; エンベロープ補償マトリクス
M_SUP3		= 47	; エンベロープ補償マトリクス
FV_DAT		= 48	; ローカル定数（固定フォグ値、リザーブ、リザーブ、リザーブ）




＜ダブルバッファメモリにおけるデータの詳細＞

; データフォーマット（ダブルバッファ先頭からの相対アドレス）
; 以下は頂点データなどと一緒に毎処理後とに転送される
; + 0.xyzw HEADER（xtopで取得するアドレス）
			; x 頂点データ数
			; y データ開始位置（＝９：第１ＳＴＱ格納アドレスまでのオフセット）
			; z 
			; w 
; + 1.xyzw GIFtag（クリップポリゴン用プリミティブ設定ＧＩＦタグ）
			; SCE_GIF_SET_TAG(1, 1, 0, 0, 0, 1), GS_REGS_AD
; + 2.xyzw PRIM
			; SCE_GS_SET_PRIM( SCE_GS_PRIM_TRIFAN, 1, 1, USE_FOG, USE_ABE, USE_AA1, 0, 0, 0)
; + 3.xyzw GIFtag（クリップポリゴン頂点用の転送ＧＩＦタグ）
			; SCE_GIF_SET_TAG( 1, 1, 0, 0, SCE_GIF_PACKED, 3), GS_REGS_STQ, GS_REGS_RGBA, GS_REGS_XYZF2
; + 4.xyzw GIFtag（テクスチャパラメータ設定ＧＩＦタグ）
			; SCE_GIF_SET_TAG(3, 0, 0, 0, 0, 1). GS_REGS_AD
; + 5.xyzw CLAMP_1
			; 
; + 6.xyzw TEX0_1
			; 
; + 7.xyzw ALPHA_1
			; 
; + 8.xyzw GIFtag（頂点の転送ＧＩＦタグ）
			; SCE_GIF_SET_TAG( n_verts, 1, 1,
			;  SCE_GS_SET_PRIM( SCE_GS_PRIM_TRISTRIP, 1, 1, USE_FOG, USE_ABE, USE_AA1, 0, 0, 0),
			;  SCE_GIF_PACKED, 3) ;
; 以下は計算結果が格納される
; + 9.xyzw （透視変換後データ）第１ＳＴＱ
; +10.xyzw （透視変換後データ）第１ＲＧＢＡ（テクスチャファンクションにHILIGHTを使っているのでＡは０にする）
; +11.xyzw （透視変換後データ）第１ＸＹＺＦ（フォグにはまだ未対応）
; +12.xyzw （透視変換後データ）第２ＳＴＱ
; +13.xyzw （透視変換後データ）第２ＲＧＢＡ
; .
; .
; .
; 以下は毎処理毎に転送される（但し、１６ビットで送って３２ビットに拡張されるため全て整数）
; +f0.xyzw （変換前データ）第１ＶＵデータ
			; x (1.19.12)テクスチャ座標Ｕ
			; y (1.19.12)テクスチャ座標Ｖ
			; z (1.19.12)定数１．０
			; w 未使用
; +f1.xyzw （変換前データ）第１法線データ
			; x (1.19.12)法線Ｘ
			; y (1.19.12)法線Ｙ
			; z (1.19.12)法線Ｚ
			; w 描画＆頂点キック：0x0fff 頂点キックのみ：0x8fff
; +f2.xyzw （変換前データ）第１頂点データ
			; x (1.31.0)Ｘ座標
			; y (1.31.0)Ｙ座標
			; z (1.31.0)Ｚ座標
			; w (1.19.12)エンベロープ用ウェイト
; +f3.xyzw （変換前データ）第２ＶＵデータ
; +f4.xyzw （変換前データ）第２法線データ
; 
; 
; 
; 

