gxoutxbus.s 2.59 KB
/*---------------------------------------------------------------------*
	Copyright (C) 1997, Nintendo.
	
	File		gxoutxbus.s
	Coded    by	Yoshitaka Yasumoto.	Oct 17, 1997.
	
	$Id: gxoutxbus.s,v 1.1.1.1 2002/05/02 03:29:11 blythe Exp $
 *---------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*
 *  DMEM FIFO への出力処理
 *
 *	gfx1 は破壊されます.
 *---------------------------------------------------------------------------*/
	#---------------------------------------------------------------------
	#  DPC_END の更新後 GfxDone へ飛ぶ
	#---------------------------------------------------------------------
  AssignForDMAproc
OutputCloseGfxDone:	_li	(return, GfxDone)

	#---------------------------------------------------------------------
	#  DPC_END の更新
	#	書き込んだ RDP コマンド処理するように RDP へ指示する
	#---------------------------------------------------------------------
	#  RDP コマンドが充分に貯まったかどうかの判定
	#	次に 1TRI の処理をしたとして充分な空き容量があれば outp の
	#	続きに出力できる. 容量がなければ outp を再設定する.
	#---------------------------------------------------------------------
OutputClose:
#if	defined(SAFE_MODE)
			_li	(sys0, G_RDPPIPESYNC)
			sb	sys0, 0(outp)
			addi	outp, outp, 8
#endif	
			addi	sys0, outp, -RSP_WORK_OUTPUT_THD_1
			blez	sys0, oc_WaitFree
			mtc0	outp, CMD_END
			
	#---------------------------------------------------------------------
	#  DMEM の START 位置の再設定を行なう.
	#	(1) DP STATUS が START_VALID で無くなるまで待つ.
	#	(2) DMEM 先頭アドレスを取得する
	#	(3) DP の CURRENT 位置が先頭でなくなるまで待つ.
	#	(4) DP の読み出し開始位置を DMEM 先頭にセットする.
	#---------------------------------------------------------------------
OutputClose_InitXbus:	mfc0	sys0, CMD_STATUS
			andi	sys0, sys0, \
				DPC_STATUS_START_VALID|DPC_STATUS_END_VALID
			bne	sys0, zero, OutputClose_InitXbus
oc_CheckTop:		mfc0	sys0, CMD_CURRENT
			_li	(outp, RSP_WORK_OUTPUT_0)
			beq	sys0, outp, oc_CheckTop
			nop
			mtc0	outp, CMD_START
			mtc0	outp, CMD_END			
			
	#---------------------------------------------------------------------
	#  データを書き出す分だけの DMEM 領域が空くまで待つ
	#	CMD_CURRNET <= outp または, 
	#	CMD_CURRENT >  outp+176 になるまで待つ
	#---------------------------------------------------------------------
oc_WaitFree:		mfc0	sys0, CMD_CURRENT
			sub	sys0, sys0, outp
			blez	sys0, oc_WaitFreeEnd
			addi	sys0, sys0, -RSP_WORK_OUTPUT_MINSZ
			blez	sys0, oc_WaitFree
			nop
oc_WaitFreeEnd:		jr	return
			nop
  EndAssignForDMAproc

/*======= End of gxoutxbus.s =======*/