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

 #!Reserved  (0,11,12,17,18,19,20,23,24,25,26,27,30,31)
 #!Reserved  (v0,v1,v28,v29,v30,v31)

 #----------------------------------------------------------------------------
 #  case_G_OBJ_LOADTMEM
 #  case_G_OBJ_LDTM_SPRITE
 #  case_G_OBJ_LDTM_RECT
 #  case_G_OBJ_LDTM_RECT_R
 #
 #	条件に一致した場合において Texture をロードする.
 #
 #	+------------------------------------------+
 #	|  cmd:8  |0|                    | size:8  |
 #	+------------------------------------------+
 #	|           texter pointer:32              |
 #	+------------------------------------------+
 #
 #	cmd = G_OBJ_LOADTMEM のとき size=23 だが複合命令を作る場合
 #	この値を調整する.
 #
 #	G_OBJ_LOADTMEM は正の値にし, 複合命令は負の値にする.
 #	gfx0 の bit:23 は 0 にする必要あり.
 #
 #	各命令における cmd,size の値
 #		G_OBJ_LOADTMEM:	        cmd=0xc1/0x05  size=23
 #		G_OBJ_LDTM_SPRITE:	cmd=0xc2/0x06  size=47
 #		G_OBJ_LDTM_RECT:	cmd=0xc3/0x07  size=47
 #		G_OBJ_LDTM_RECT_R:	cmd=0xc4/0x08  size=47
 #
 #	typedef	struct	{
 #	  u64	*image;		DRAM 上のテクスチャソースアドレス
 #	  u16	tmem;		TMEM ワードアドレス (8byteWORD)
 #	  u16	tsize;		TMEM ワードサイズ   (8byteWORD)
 #	  u16	tstride;	TMEM のラップ幅 (Type が TLUT なら 0 にする)
 #	  u8	type;		Type 種別 G_OBJLT_TEXTURE or G_OBJLT_TLUT
 #	  u8	sid;		STATE ID  4 の倍数で 0,4,8,12 のどれか
 #	  u32	flag;		STATE flag
 #	  u32	mask;		STATE mask
 #	  u32	padding;	For 8 byte Alignment
 #	} uObjTxtr_t;
 #----------------------------------------------------------------------------
case_G_OBJ_LOADTMEM:
	#---------------------------------------------------------------------
	# uObjTxtr データのアドレスを物理アドレスに変換し, 
	# DMA 転送をかける.
	#---------------------------------------------------------------------
  AssignForDMAproc
	jal	AdrsFixup
	_li	(dmem_adrs, RSP_INPUT_TMEM)	# 32bit alignment
	jal	DMAread			# dram_adrs は AdrsFixup で設定される
	andi	dma_len, gfx0, 0xff	# gfx0 から size を得る
  EndAssignForDMAproc

	#---------------------------------------------------------------------
	# DMA 終了待ちの間に各パラメータを取得しておく
	#	gfx0:    複合命令処理用のジャンプ位置(テーブル引き)
	#                RECT_R のときは負の値にする.
	#	rsmode:  レンダリングパラメータ
	#	rdpstat: RDP の現在の状態
	#	tptr:    TMEM データ終了位置=sprite 構造体の先頭
	#---------------------------------------------------------------------
  Assign(rdpstat, 1)
  FixedAssign(rsmode, v3)	# RenderMode AA/BLP パラメータ
  FixedAssign(shrink, v4)	# RenderMode Shrink パラメータ  
  FixedAssign(tptr, 20)
	lhu	sys0, RSPOBJ_RENDERP_SMODE(zero)
	ldv	shrink[0], oRSPOBJ_SHRINKPARAM(vecptr)	# Shrink パラメータ
	lb	rdpstat, RSP_STATEP_RDP_STAT(zero)	# 符号は必要
	lqv	rsmode[0], 0(sys0)			# AA/BLP パラメータ 
	srl	gfx0, gfx0, 23
	jal	DMAwait
#ifdef	UCODE_S2DEX2
	lh	gfx0, RSPOBJ_LDTX_TABLE-(G_OBJ_LOADTXTR*2)(gfx0)
#else
	lh	gfx0, RSPOBJ_LDTX_TABLE-(0xc1*2)(gfx0)
#endif
	#---------------------------------------------------------------------
	# フラグの判定
	#	(STATUS[sid] & mask) == flag の場合には, 呼び出さない.
	#	その他の場合, 呼び出しを行ない STATUS を以下のように変更.
	#	STATUS[sid] = (STATUS[sid] & ~mask) | (flag & mask); 
	#---------------------------------------------------------------------
  Assign(sid, 3)
  Assign(status, 4)
  Assign(flag, 5)
  Assign(flag2, 6)
  Assign(mask, 7)
  Assign(maskR, 8)
  Assign(tmp, 9)
		lbu	sid,    RSP_TXT_SID(tptr)
		lw	mask,   RSP_TXT_MASK(tptr)
		lw	flag,   RSP_TXT_FLAG(tptr)
		lw	status, RSPOBJ_GENSTAT_TABLE(sid)
		nor	maskR,  mask,   zero
		and	flag2,  flag,   mask
		and	tmp,    status, mask
		beq	tmp,    flag,   ReturnNext  # status&mask==flag なら終
		and	tmp,    status, maskR
		or	tmp,    tmp,    flag2		# 新 status 作成
		sw	tmp, RSPOBJ_GENSTAT_TABLE(sid)	# 新 status 保存
  EndAssign(sid, 3)
  EndAssign(status, 4)
  EndAssign(flag, 5)
  EndAssign(flag2, 6)
  EndAssign(mask, 7)
  EndAssign(maskR, 8)
  EndAssign(tmp, 9)

	#---------------------------------------------------------------------
	# Tilesync コマンドの処理
	#	もし rdpstat == RDP_STAT_LOADTILE なら TileSync を出力
	#	STATE を RDP_STAT_LOADTILE にする
	#---------------------------------------------------------------------
		_li	(sys0, (RDP_STAT_LOADTILE|0xff00))
		bne	sys0, rdpstat, NoTileSyncTxtr
		sb	sys0, RSP_STATEP_RDP_STAT(zero)
		sbv	_TILESYNC, 0(outp)
		addi	outp, outp, 8
NoTileSyncTxtr:	
	#---------------------------------------------------------------------
	#  gsDPSetTextureImage コマンド設定
	#       パラメータは
	#	  gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, image)
	#	  gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, width,image)
	#
	#	CMD.0=0x3d100000|width  CMD.1=AdrsFixup(image)
	#	width は LoadBlock 時には関係なし
	#
	#	テクスチャ image のアドレス変換を行なってから代入
	#---------------------------------------------------------------------
  FixedAssign(image, 19)
  Assign(tmem, 3)
  Assign(tsize, 4)
		lhu	tsize, RSP_TXT_TSIZE(tptr)	# 
		ssv	_SETTXTRIMG, 0(outp)		# RDP cmd 前半設定
		lw	gfx1, RSP_TXT_IMAGE(tptr)	# Image アドレスを取得
		sh	tsize, 2(outp)			# TMEM 幅 (16b換算)
		jal	AdrsFixup
		lhu	tmem, RSP_TXT_TMEM(tptr)
#ifdef	UCODE_S2DEX2
		sw	gfx1, 4(outp)
#else
		sw	image,  4(outp)
#endif
  EndAssign(image, 19)

	#---------------------------------------------------------------------
	#  gsDPSetTile コマンド設定
	#       パラメータは
	#	  gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, line, tmem,
	#			G_LOAD_TILE, 0,0,0,0,0,0,0)
	#  LoadBlock の時は line = 0
	#  LoadTile  の時は line = (TMEM 横幅  Word 単位)
	#
	#	CMD.0=0x35100000+tmem  CMD.1=G_TX_LOADTILE<<24
	#---------------------------------------------------------------------
  Assign(head, 5)
  Assign(line, 6)
  Assign(format, 7)
  Assign(lmask, 8)
		lb	lmask,  RSP_TXT_TYPE_LINE(tptr)	# 0 or 0xfffc
		lbu	format, RSP_TXT_TYPE_FMT (tptr)
		lbu	head,   RSP_TXT_TYPE_HEAD(tptr)
		addi	line,   tsize,  1
		and	line,   line,   lmask
		sll	line,   line,   7
		sll	format, format, 16
		or	tmem, tmem, line
		or	tmem, tmem, format
		sw	tmem,     8(outp)
		sbv	_SETTILE, 8(outp)
  EndAssign(tmem, 3)
  EndAssign(line, 6)
  EndAssign(format, 7)
  EndAssign(lmask, 8)
	
	#---------------------------------------------------------------------
	# LoadSync コマンドの処理
	#	もし rdpstat == RDP_STAT_PRIMITIVE(n) なら LoadSync を出力
	#---------------------------------------------------------------------
		bltz	rdpstat, NoLoadSyncTxtr
		slv	_TX_LOADTILE, 12(outp)		# G_TX_LOADTILE<<24
		sbv	_LOADSYNC, 16(outp)		# G_RDPLOADSYNC
		addi	outp, outp, 8
NoLoadSyncTxtr:	
  EndAssign(rdpstat, 1)
	
	#---------------------------------------------------------------------
	# LoadBlock コマンドの処理
	#	gsDPLoadBlock(G_TX_LOADTILE, 0, 0, tsiz*4-1, 0x800/tstride); 
	#
	#	CMD.0=0x33000000	# G_OBJLT_TXTRBLOCK
	#	CMD.0=0x34000000	# G_OBJLT_TXTRTILE
	#	CMD.0=0x30000000	# G_OBJLT_TLUT
	#	CMD.1=(G_TX_LOADTILE<<24)|((tsiz*4-1)<<12)|(0x800/tstride)
	#---------------------------------------------------------------------
  Assign(tstride, 1)
		lhu	tstride, RSP_TXT_TSTRIDE(tptr)
		sll	head, head, 24	# 0x30 か 0x33 か 0x34
		sw	head, 16(outp)
		sll	tsize, tsize, 14
		or	tsize, tsize, tstride
		sw	tsize, 20(outp)
		sbv	_TX_LOADTILE, 20(outp)
  EndAssign(head, 5)

	#---------------------------------------------------------------------
	# コマンド出力後, 各処理先へ Jump する
	#---------------------------------------------------------------------
		jal	OutputClose
		addi	outp, outp, 24
		#
		# ここで処理先に Jump するが, もし Sprite コードをオーバー
		# レイした場合, tptr の値が破壊されるので, オーバーレイ後は
		# ここに戻り, tptr を再度設定し next_cmd へ Jump する.
		#
ReturnNext:	jr	gfx0
		_li	(tptr, RSP_INPUT_TMEM+24)	# データポインタ設定
  EndAssign(tstride, 1)
  EndAssign(tsize, 4)
  EndAssign(tptr, 20)
  EndAssign(rsmode, v3)	# RenderMode AA/BLP パラメータ
  EndAssign(shrink, v4)	# RenderMode Shrink パラメータ
		.symbol	adrs_LoadTx_ReturnNext, ReturnNext
		.symbol	case_G_OBJ_LDTM_SPRITE, case_G_OBJ_LOADTMEM
		.symbol	case_G_OBJ_LDTM_RECT,   case_G_OBJ_LOADTMEM
		.symbol	case_G_OBJ_LDTM_RECT_R, case_G_OBJ_LOADTMEM

/*======== End of gs2tmem.s ========*/