gzinit.s 4.26 KB
/*---------------------------------------------------------------------
  $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 ========*/