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

 #============================================================================
 #  RDP 系処理
 #============================================================================
#if	(!defined(UCODE_S2DEX2))||(defined(OVERLAY))
	#---------------------------------------------------------------------
	# case_G_TEXRECT_DONE
	#	TextureRectangle 系のコマンド Part 3 を処理する.
	#	そのまま case_G_RDP_Genaral 処理へ
	#---------------------------------------------------------------------
case_G_TEXRECT_DONE:
#if	!(defined(UCODE_L3DEX2)||defined(UCODE_S2DEX2))
	ldv	vtmp[0], RSP_GSTAT_RDPHALF_0H(zero)
	lw	gfx0,    RSP_GSTAT_RDPHALF_1L(zero)
	addi	outp,    outp, 8
	sdv	vtmp[0], 0-8(outp)
#else
	ldv	vtmp[0], RSP_GSTAT_SCISSOR(zero)
	ldv	vtmp[8], RSP_GSTAT_RDPHALF_0H(zero)
	lw	gfx0,    RSP_GSTAT_RDPHALF_1L(zero)
	addi	outp,    outp, 16
	sdv	vtmp[0], 0-16(outp)
	sdv	vtmp[8], 0-8(outp)
#endif	
	#===== この間に命令をいれてはならん. =====
	#---------------------------------------------------------------------
	#  case_G_RDP_Genaral
	#	Gfx DL が RDP コマンドであるとみなし, そのまま DMEM バッファ
	#	に送る
	#---------------------------------------------------------------------
case_G_RDP_General:
	sw	gfx1, 4(outp)

	#===== この間に命令をいれてはならん. =====
	#---------------------------------------------------------------------
	#  case_G_RDP_Genaral_Half
	#	Gfx DL が前半 4 BYTE のみで充分な RDP コマンドであるとみ
	#	なし, 前半部のみを DMEM バッファに送る.
	#	Sync 系コマンドおよび NoOp コマンドがこれに該当する.
	#---------------------------------------------------------------------
case_G_RDP_General_Half:
	sw	gfx0, 0(outp)
	j	OutputCloseGfxDone
	addi	outp, outp, 8
	
	#---------------------------------------------------------------------
	#  case_G_RDP_AdrsFixup
	#	コマンド内のセグメントアドレスを物理アドレスに変換してから
	#	RDP コマンドとして送る
	#---------------------------------------------------------------------
case_G_RDP_AdrsFixup:
	_li	(return, case_G_RDP_General)

	#===== この間に命令をいれてはならん. =====
	#---------------------------------------------------------------------
	#  AdrsFixup
	#	セグメントアドレスを物理アドレスに変換する
	#---------------------------------------------------------------------
AdrsFixup:
        srl     sys0, gfx1, 22				# セグメント index 取得
        andi    sys0, sys0, 0x3c
        lw      sys0, RSP_GSTAT_SEG_OFFSET(sys0)	# テーブル参照
        sll     gfx1, gfx1, 8				# 上位 8 bit をマスク
        srl     gfx1, gfx1, 8
        jr      return
        add     gfx1, gfx1, sys0			# オフセットの加算

	#---------------------------------------------------------------------
	# case_G_RDPSETOTHERMODE
	#	現在の OtherMode の設定を保存し, 送信する.
	#	(G_SETOTHERMODE_[LH] のために必要)
	#---------------------------------------------------------------------
case_G_RDPSETOTHERMODE:
	sw	gfx0, RSP_GSTAT_OTHER_H(zero)
	j	case_G_RDP_General
	sw	gfx1, RSP_GSTAT_OTHER_L(zero)

#endif	/*(!defined(UCODE_S2DEX2))||(defined(OVERLAY))*/
#if	(!defined(UCODE_S2DEX2))||(!defined(OVERLAY))
	#---------------------------------------------------------------------
	# case_G_SETSCISSOR
	#	S2DEX/L3DEX に対応させるためにシザリングパラメータを保存する.
	#	RDP コマンドリファレンスの図と異なり画面の左上を XL,YL 
	#	右下を XH,YH としている.
	#---------------------------------------------------------------------
case_G_SETSCISSOR:
#if	!(defined(UCODE_L3DEX2)||defined(UCODE_S2DEX2))
	sw	gfx0, RSP_GSTAT_SCISSOR+0(zero)
	j	case_G_RDP_General
	sw	gfx1, RSP_GSTAT_SCISSOR+4(zero)
#else	/*!(defined(UCODE_L3DEX2)||defined(UCODE_S2DEX2))*/
	sw	gfx0, RSP_GSTAT_SCISSOR+0(zero)
	sw	gfx1, RSP_GSTAT_SCISSOR+4(zero)
	_li	(return, case_G_RDP_General)
case_G_SETSCISSOR_Decode:
        #------ 左上 ------
	andi	sys0, gfx0, 0xfff
	sh	sys0, RSP_SUBMOD_LN_SCIS_YL(zero)
	srl	sys0, gfx0, 12
	andi	sys0, sys0, 0xfff
	sh	sys0, RSP_SUBMOD_LN_SCIS_XL(zero)
        #------ 右下 ------     
	andi	sys0, gfx1, 0xfff
	sh	sys0, RSP_SUBMOD_LN_SCIS_YH(zero)
	srl	sys0, gfx1, 12
	andi	sys0, sys0, 0xfff
	jr	return
	sh	sys0, RSP_SUBMOD_LN_SCIS_XH(zero)
#endif	/*!(defined(UCODE_L3DEX2)||defined(UCODE_S2DEX2))*/
#endif	/*(!defined(UCODE_S2DEX2))||(!defined(OVERLAY))*/
		
/*======== End of gxrdp.s ========*/