gzobj.s 5.2 KB
/*---------------------------------------------------------------------
  $Id: gzobj.s,v 1.1.1.1 2002/05/02 03:29:12 blythe Exp $
  
  File : gzobj.s
  
  Coded     by Yoshitaka Yasumoto.   Jun 18, 1997.
  Copyright by Nintendo, Co., Ltd.           1997.
  ---------------------------------------------------------------------*/

  FixedAssign(zObjHdr, 1)
  FixedAssign(zStat0, 13)
  FixedAssign(zStat1, 14)
  FixedAssign(zMask,  15)
  FixedAssign(zBuf,   16)
  FixedAssign(zType,  21)
	#---------------------------------------------------------------------
	#  RDP_CHUNK の処理
	#---------------------------------------------------------------------
#include	"gzrdp.s"
	
	#---------------------------------------------------------------------
	#  case_G_ZOBJ
	#	ZSort Object の描画
	#
	#		31                      3 2 0
	#		+------------------------+--+
	#	ZObj 1	|        Pointer         |ID|
	#		+------------------------+--+
	#	ZObj 2	|        Pointer         |ID|
	#		+------------------------+--+
	#
	#	単純に Object リンクへのポインタ+ID が 2 つ並んだもので
	#	ある. Pointer は Kseg0 を指さねばならない.
	#	そのため, 上位 8 bit は 0x80 となる.
	#	ZObj n == 0x80000000 なら, そのデータは無効となる.
	#---------------------------------------------------------------------

	#------ 次の Gfx リンクの処理 ------
ZObj_NextLink:
	lw	objp, RSPZS_ZOBJ_SAVE_GFX1(zero)
	bne	objp, zero, ZObj_Start		# gfx1 の処理なら jump
	sw	zero, RSPZS_ZOBJ_SAVE_GFX1(zero)
	j	GfxDone				# gfx0,1 共に終了なら GfxDone
		
case_G_ZOBJ:
	#------ 初期設定 ------
	sw	gfx1,  RSPZS_ZOBJ_SAVE_GFX1(zero)	# gfx1 の保存
	_mov	(objp, gfx0)

	#------ Yield 復帰ポイント ------
RSPcontinue_B:	
	lw	zMask, RSP_ZOBJ_MASK(zero)		# マスクの取得
	_li	(zBuf, RSP_ZOBJ_BUF_A)

	#------ Gfx 処理開始 ------
	#
	#  objp からリンクの走査を開始する.
	#
ZObj_Start:
  AssignForDMAproc
	#------ 最初の ZObject のロード -----	
	_mov	(dmem_adrs, zBuf)
	and	dram_adrs, objp, zMask
	beq	dram_adrs, zero, ZObj_NextLink
	andi	zType, objp, 7
	jal	DMAread
	lbu	dma_len, RSP_ZOBJ_SIZE(zType)
	sll	zType, zType, 1
  EndAssignForDMAproc

	#------ Gfx 処理分岐 ------
	#
	#  DMA 終了待ち
	#  objp が 0 なら次のリンクリストへ
	#  objp より各タイプの分岐処理を行なう
	#  分岐先で sys1 の値をチェックし, 0 でないなら
	#  RSPyield 処理へ jump させる.
	#  gfx1 に RDPCMD_1 の値を代入しておく
	#
ZObj_Launch:
	mfc0	zStat1, DMA_BUSY		# DMA Busy ならループ
	mfc0	zStat0, SP_STATUS
ZObj_Launch_A:
  Assign(vdata0, v2)
  Assign(vdata1, v3)
	lh	zObjHdr, RSP_ZOBJ_TABLE(zType)	# 符号付で処理する
	bne	zStat1,  zero, ZObj_Launch
 #	lw	gfx1,    oRZ_RDPCMD_1(zBuf)	# 命令を入れ替える
		lqv	vdata0[0], 16(zBuf)
	jr	zObjHdr				# 各処理へ Jump する
 #	andi	sys1, zStat0, SP_STATUS_YIELD	# 0x80
		lqv	vdata1[0], 32(zBuf)
  EndAssign(vdata0, v2)
  EndAssign(vdata1, v3)
	
	#---------------------------------------------------------------------
	#  ZObject - "Null" の処理
	#
	#	+-----------+-----------+-----------+-----------+
	#	|    Hdr    | RDP cmd 1 | RDP cmd 2 | RDP cmd 3 |
	#	+-----------+-----------+-----------+-----------+
	#
	#	RDP cmd 1,2,3 からリンクしている RDPCMD を FIFO バッファへ
	#	転送する.
	#
	#---------------------------------------------------------------------
  Assign(gfx1Sv, 2)
  Assign(rdpcmd, 3)
  Assign(rdpcmdSv, 4)
ZObj_Null:
	lw	gfx1, oRZ_RDPCMD_1(zBuf)		# 移動してきた
	andi	sys1, zStat0, SP_STATUS_YIELD		# 移動してきた
	bne	sys1, zero, RSPyield_B			# Yield 判定
	#
	lw	rdpcmd, RSP_STATUS_RDPCMD_1(zero)	# RDPCMD1 保存値取得
	beq	gfx1, zero, ZObj_Null_1			# RDPCMD1 が 0 ならSKIP
  _forward_adrs(adrs_ZObj_Null_1, 3)
	_liu	(zStat0, adrs_ZObj_Null_1)		# Return 位置設定(正)
	bne	gfx1, rdpcmd, case_G_RDPCHUNK_1		# 直前にロードならSKIP
	sw	gfx1, RSP_STATUS_RDPCMD_1(zero)		# RDPCMD1 保存値更新
ZObj_Null_1:
	lw	gfx1,   oRZ_RDPCMD_2(zBuf)		# RDPCMD2 取得
	lw	gfx1Sv, oRZ_RDPCMD_3(zBuf)		# RDPCMD3 取得
	lw	rdpcmd, RSP_STATUS_RDPCMD_2(zero)	# RDPCMD2 保存値取得
	beq	gfx1, zero, ZObj_Null_2			# RDPCMD2 が 0 ならSKIP
	lw	rdpcmdSv, RSP_STATUS_RDPCMD_3(zero)	# RDPCMD3 保存値取得
  _forward_adrs(adrs_ZObj_Null_2, 3)
	_liu	(zStat0, adrs_ZObj_Null_2)		# Return 位置設定(正)
	bne	gfx1, rdpcmd, case_G_RDPCHUNK_1		# 直前にロードならSKIP
	sw	gfx1, RSP_STATUS_RDPCMD_2(zero)		# RDPCMD2 保存値更新
ZObj_Null_2:
	beq	gfx1Sv, zero, ZObj_Start		# RDPCMD3 が 0 ならSKIP
	lw	objp, oRZ_HEADER(zBuf)			# 次の ZObj の Ptr 取得
	beq	gfx1Sv, rdpcmdSv, ZObj_Start		# 直前にロードならSKIP
	_mov	(gfx1, gfx1Sv)				# RDPCMD3 を gfx1に SET
	sw	gfx1, RSP_STATUS_RDPCMD_3(zero)		# RDPCMD3 保存値更新
	j	case_G_RDPCHUNK_1			# コマンド転送
	_liu	(zStat0, ZObj_Start)			# Return 位置設定(正)
  EndAssign(gfx1Sv, 2)
  EndAssign(rdpcmd, 3)
  EndAssign(rdpcmdSv, 4)

 #----------------------------------------------------------------------------
 #  ZObject - "Shaded Triangle" の処理
 #----------------------------------------------------------------------------
#include	"gzshtri.s"	

 #----------------------------------------------------------------------------
 #  ZObject - "Shaded Textured Triangle" の処理
 #----------------------------------------------------------------------------
#include	"gztxtri.s"

  EndAssign(zObjHdr, 1)
  EndAssign(zStat0, 13)
  EndAssign(zStat1, 14)
  EndAssign(zMask,  15)
  EndAssign(zBuf,   16)
  EndAssign(zType,  21)

/*======== End of gzobj.s ========*/