gs2dma.s 4.14 KB
/*---------------------------------------------------------------------
	Copyright (C) 1997, Nintendo.
	
	File		gs2dma.s
	Coded    by	Yoshitaka Yasumoto.	Jan 23, 1997.
	Modified by	
	Comments	
	
	$Id: gs2dma.s,v 1.1.1.1 2002/05/02 03:29:12 blythe Exp $
  ---------------------------------------------------------------------*/

	# ================================================================
	# DMA 系処理
	# ================================================================

	# ----------------------------------------------------------------
	# case_G_SELECT_DL
	#	条件に一致した場合において DL を呼び出す.
	#
	#	+------------------------------------------+
	#	|G_RDPHALF_0|  sid:8   |      DL_L:16      |
	#	+------------------------------------------+
	#	|                  flag:32                 |
	#	+------------------------------------------+
	#	|G_SELECT_DL|  param:8 |      DL_H:16      |
	#	+------------------------------------------+
	#	|                  mask:32                 |
	#	+------------------------------------------+
	#
	#	(STATUS[sid] & mask) == flag の場合には, 呼び出さない.
	#	その他の場合, 呼び出しを行ない STATUS を以下のように変更.
	#	STATUS[sid] = (STATUS[sid] & ~mask) | (flag & mask); 
	#
	#	gfx1 に DL の値を代入し G_DL へ処理を移す.
	#	param は G_DL_PUSH, G_DL_NOPUSH のいづれかである.
	# ----------------------------------------------------------------
case_G_SELECT_DL:
  Assign(sid,    1)
  Assign(status, 2)
  Assign(flag,   3)
  Assign(flag2,  4)
# define mask    gfx1
  Assign(maskR,  5)
  Assign(tmp,    6)
		lbu	sid,    RSP_STATEP_RDPHALF_0H+1(zero)
		lw	flag,   RSP_STATEP_RDPHALF_0L(zero)
		nor	maskR,  mask,   zero
		lw	status, RSPOBJ_GENSTAT_TABLE(sid)
		sh	gfx0,   RSP_STATEP_RDPHALF_0H(zero)
		and	flag2,  flag,   mask
		and	tmp,    status, mask
		beq	tmp,    flag,   GfxDone	# status & mask == flag なら終
		and	tmp,    status, maskR
		or	tmp,    tmp,    flag2		    # 新 status の作成
		sw	tmp,    RSPOBJ_GENSTAT_TABLE(sid)	# 新 stat 保存
		lw	gfx1,   RSP_STATEP_RDPHALF_0H(zero)	# DL の取得
		# gfx1 に DL のポインタを代入して G_DL へ抜ける
  EndAssign(sid,    1)
  EndAssign(status, 2)
  EndAssign(flag,   3)
  EndAssign(flag2,  4)
# undef     mask
  EndAssign(maskR,  5)
  EndAssign(tmp,    6)

	# ----------------------------------------------------------------
	# case_G_DL:
	#	現在の DL ポインタをパラメータに応じてスタック内に保存し, 
	#	与えられた DL へ分岐する
	# ----------------------------------------------------------------
case_G_DL:
  Assign(param,      1)
  Assign(stackp,     2)
  Assign(return_inp, 3)
  Assign(dram_adrs, 19)
	#
	# 実際の DL において BranchDL より DisplayList 命令の方が
	# よく使用されると思うので DisplayList 命令を対象にオプティ
	# マイズを行なう. (stackp のロードストールを回避する)
	#
	lbu	stackp, RSP_STATEP_DL_N(zero)	# DL スタックのポインタ
	add	return_inp, inp, dinp		# 次の DL のアドレス保存
	#	
	# 本命令が終了次第 Yield チェックを行なわずに次の DL ブロックの
	# DMA ロードを開始する.
	#
	jal	AdrsFixup			# Segment アドレスの変換
	lbu	param,  RSP_DLINPUT_BOTTOM-7(dinp)
	bne	param,  zero, StartDLload	# Load Delay ではない
	_mov	(inp, dram_adrs)
	#
	# 呼び出し側の DL アドレスの保存
	#   スタックオーバーなら停止する
	#
	Assert_geI(stackp, 18*4)
	sw	return_inp, RSP_DLSTACK_OFFSET(stackp)	
	addiu	stackp, stackp, 4
	j	StartDLload
	sb	stackp, RSP_STATEP_DL_N(zero)
  EndAssign(param,      1)
  EndAssign(stackp,     2)
  EndAssign(return_inp, 3)
  EndAssign(dram_adrs, 19)

	# ----------------------------------------------------------------
	# case_G_OBJ_MOVEMEM
	#	RDRAM から DMEM へデータの転送を行なう
	#	+-----------------------+
	#	|CMD:8|Len:8|   ID:16   |
	#	+-----------------------+
	#	|    Source Adrs:32     |
	#	+-----------------------+
	#
	#	Matrix     スプライトの回転のためのマトリクスをロードする.
	#	SubMatrix  スプライトの移動, スケーリング値をロードする.
	# ----------------------------------------------------------------
case_G_OBJ_MOVEMEM:
  AssignForDMAproc
	jal	AdrsFixup		# Matrix データのアドレスの変換
	lhu	dmem_adrs, RSP_MOVEMEM_TBL(gfx0)	# 転送先アドレス
	jal	DMAread
	lbu	dma_len, (RSP_DLINPUT_BOTTOM-7)(dinp)
	j	DMAwait
	_li	(return, GfxDone)	
  EndAssignForDMAproc
		
/*======== End of gs2dma.s ========*/