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

	#-----------------------------------------------------------------
	# case_G_RDPCHUNK
	#	RDP コマンドチャンクを処理した後で, 
	#	gfx1 -> コマンドチャンクへのポインタ
	#-----------------------------------------------------------------
case_G_RDPCHUNK:
	#------ リターンアドレスの設定 ------
	_li	(zStat0, GfxDone)
	
	#=================================================================
	#  RDP コマンドチャンクを処理する.
	#
	#  RDP コマンドを一度に 16 個ロードする. (これぐらいで十分)
	#  16 個まとめて Output Buffer に出力する.
	#  この間に, yield 要求のチェックはしない.
	#  16 個で 128 bytes が必要であるが, これは Shading + Txtr 3 角形
	#  1 つ分(160bytes)以下である.
	#
	#  ZOBJ の処理ループから呼び出される場合と, G_RDPCHUNK GBI で呼び
	#  出される場合とがある. 前者の場合は zStat0 にリターン位置が代入さ
	#  れ, case_G_RDPCHUNK_1 から開始する. 
	#  後者の場合は, case_G_RDPCHUNK へ飛ぶ.
	#  gfx1 の値を Gfx へのポインタとして使用する.
	#
	#  Reg 17,18,19,20,22,zStat0,zStat1,gfx0,gfx1,sys0,sys1 を破壊する
	#=================================================================
  FixedAssign(dmem, 22)
	#------ セグメントアドレスの変換 ------
	#
	#  Gfx へのポインタをセグメントアドレス(sys0)から
	#  物理アドレス(dram)へ変換する.
	#
case_G_RDPCHUNK_1:
		lw	sys1, RSP_RETURN_MASK(zero)
	srl	sys0, gfx1, 22
	andi	sys0, sys0, 0x3c
	lw	sys0, RSP_SEG_OFFSET(sys0)
		and	zStat0, zStat0, sys1	# Delay
	add	zStat1, gfx1, sys0
		
	#------ Gfx データのロード ------
  AssignForDMAproc
RDPchunk_DMA:
	_li	(dma_len,   GZ_MAX_CHUNK*8-1)
	_li	(dmem_adrs, RSP_RDPCHUNK_OFFSET)
	jal	DMAread
	_mov	(dram_adrs, zStat1)
	jal	DMAwait
	_li	(dmem, -GZ_MAX_CHUNK*8)
	addiu	zStat1, zStat1, GZ_MAX_CHUNK*8
  EndAssignForDMAproc

	#------ rdp_G_RDP_Genaral の処理 ------
	addi	outp, outp, -8
rdp_G_RDP_General:
	addi	outp, outp, 8
		
	#------ Gfx 処理ループ ------
  FixedAssign(sys2, 20)
rdp_G_SPNOOP:
	lw	sys0, RSP_RDPCHUNK_BOTTOM+0(dmem)
	lw	sys1, RSP_RDPCHUNK_BOTTOM+4(dmem)
	beq	dmem, zero, RDPchunk_Next
	sra	sys2, sys0, 24
	sll	sys2, sys2, 1
	lhu	sys2, RSP_JTBL_B_ORG(sys2)
	sw	sys0, 0(outp)
	addiu	dmem, dmem, 8
	jr	sys2
	sw	sys1, 4(outp)
		
	#------ 次の Chunk のロード処理 ------
RDPchunk_Next:
	j	OutputClose		# FIFO 転送処理
	#-------------------
rdp_G_SETOTHERMODE_H:
	_li	(return, RDPchunk_DMA)
	#------------------------------------この間に命令を入れてはならぬ!!
	#---------------------------------------------------------------------
	# rdp_G_SETOTHERMODE_[LH]
	#	Other mode フラグを ON/OFF し RDP へ送る
	#	rdp_G_SETOTHERMODE_H と rdp_G_SETOTHERMODE_L のアドレス差
	#	が 4 Bytes であることを利用して処理を行なっているのでこれを
	#	変更する場合はここを修正すること.
	#---------------------------------------------------------------------
rdp_G_SETOTHERMODE_L:
  FixedAssign(maskA, 17)
  FixedAssign(maskB, 18)
  FixedAssign(shift, 19)
   .symbol adrs_G_SETOTHERMODE_L, (rdp_G_SETOTHERMODE_L & 0x1fff)
   .symbol RSP_OTHERMODE_DIFF,    (RSP_STATEP_OTHER_L-adrs_G_SETOTHERMODE_L)
	srl	shift, sys0,  8	
	nor	maskA, zero,  zero	# maskA = 0xffffffff
	sllv	maskB, maskA, shift	# maskB = 0xffffffff << (shift)
	addi	sys0,  sys0,  -1	# len = 32 の場合のための対策 (len>0)
	sllv	maskA, maskB, sys0	# maskA = 0xffffffff << (shift+len-1)
	lw	sys0,  RSP_OTHERMODE_DIFF(sys2)
	sll	maskA, maskA, 1		# maskA = maskA << 1
	xor	maskA, maskA, maskB	# マスク値を得る
	nor	maskA, maskA, zero	# 反転させる
	and	maskA, maskA, sys0	# 変更するフラグをクリアする
	or	sys0,  maskA, sys1
	sw	sys0,  RSP_OTHERMODE_DIFF(sys2)
	lw	sys0,  RSP_STATEP_OTHER_H(zero)
	lw	sys1,  RSP_STATEP_OTHER_L(zero)
	j	rdp_G_SETOTHERMODE_SKIP
	sw	sys0,  0(outp)
  EndAssign(maskA, 17)
  EndAssign(maskB, 18)
  EndAssign(shift, 19)
	
	#---------------------------------------------------------------------
	# rdp_G_RDPSETOTHERMODE
	#	現在の OtherMode の設定を保存しておく.
	#	(G_SETOTHERMODE_[LH] のために必要)
	#---------------------------------------------------------------------
rdp_G_RDPSETOTHERMODE:
	sw	sys0, RSP_STATEP_OTHER_H(zero)
	j	rdp_G_RDP_General
	sw	sys1, RSP_STATEP_OTHER_L(zero)

	#---------------------------------------------------------------------
	# rdp_G_SETSCISSOR
	#	シザリングパラメータを保存しておいて, SP によってスプライトを
	#	カットする. (Copy-Mode 必須)
	#	RDP コマンドの図と異なり画面の左上を XL,YL 右下を XH,YH と
	#	している.
	#---------------------------------------------------------------------
rdp_G_SETSCISSOR:
	andi	sys2, sys0, 0xfff
	sh	sys2, RSP_STATEP_SCISSOR_YL(zero)
	srl	sys2, sys0, 12
	andi	sys2, sys2, 0xfff
	sh	sys2, RSP_STATEP_SCISSOR_XL(zero)
	andi	sys2, sys1, 0xfff
	sh	sys2, RSP_STATEP_SCISSOR_YH(zero)
	srl	sys2, sys1, 12
	andi	sys2, sys2, 0xfff
	j	rdp_G_RDP_General
	sh	sys2, RSP_STATEP_SCISSOR_XH(zero)
	
        #---------------------------------------------------------------------
	# rdp_G_RDP_AdrsFixup
	#	コマンド内のセグメントアドレスを物理アドレスに変換してから
	#	RDP コマンドとして送る
        #---------------------------------------------------------------------
rdp_G_RDP_AdrsFixup:	
	srl	sys0, sys1, 22			# セグメント index 取得
	andi	sys0, sys0, 0x3c
	lw	sys0, RSP_SEG_OFFSET(sys0)	# テーブル参照
	sll	sys1, sys1, 8			# 上位 8 bit クリア
	srl	sys1, sys1, 8
	add	sys1, sys0, sys1		# オフセットの加算
rdp_G_SETOTHERMODE_SKIP:
	j	rdp_G_RDP_General
	sw	sys1, 4(outp)

        #---------------------------------------------------------------------
        # rdp_G_ENDDL
        #       DisplayList の終端処理
	#	FIFO への出力を行なった後, zStat0 の位置へ Jump する.
	#	もし DL からの呼び出しなら Flush する.
	#	RSP_STATEP_RDPHALF_0H を破壊するが問題ないだろう.
        #---------------------------------------------------------------------
rdp_G_ENDDL:
	bne	zStat0, gfxdone, OutputClose
	_mov	(return, zStat0)
	j	OutputCloseFlush

        #---------------------------------------------------------------------
        # rdp_G_RDPHALF_0
        #       TextureRectangle 系のコマンド Part 1 を処理する
        #       noYield を無くすためにまとめて処理を行なう
	#	RSP_STATEP_RDPHALF_0H / RSP_STATEP_RDPHALF_0L へ値を代入する
        #---------------------------------------------------------------------
        # rdp_G_RDPHALF_1
        #       TextureRectangle 系のコマンド Part 2 を処理する
        #       パラメータが足りない GBI の補助用にも使用
	#	RSP_STATEP_RDPHALF_1L へ値を代入する
	#---------------------------------------------------------------------
	#	RSP_STATEP_RDPHALF_0L と RSP_STATEP_RDPHALF_1L のアドレス差
	#	が 4Bytes であることを利用して共通化する.
        #---------------------------------------------------------------------
rdp_G_RDPHALF_0:	
	sw	sys0, RSP_STATEP_RDPHALF_0H(zero)
rdp_G_RDPHALF_1:
   .symbol adrs_G_RDPHALF_0, (rdp_G_RDPHALF_0 & 0x1fff)
   .symbol RSP_RDPHALF_DIFF, (RSP_STATEP_RDPHALF_0L-adrs_G_RDPHALF_0)
	j	rdp_G_SPNOOP
	sw	sys1, RSP_RDPHALF_DIFF(sys2)
  EndAssign(sys2, 20)

        #---------------------------------------------------------------------
        # rdp_G_TEXRECT_DONE
        #       TextureRectangle 系のコマンド Part 3 を処理する
        #---------------------------------------------------------------------
rdp_G_TEXRECT_DONE:
	lw	sys0, RSP_STATEP_RDPHALF_1L(zero)
	sw	sys1, 12(outp)
	lw	sys1, RSP_STATEP_RDPHALF_0L(zero)
	sw	sys0,  8(outp)
	lw	sys0, RSP_STATEP_RDPHALF_0H(zero)
	sw	sys1,  4(outp)
	addi	outp, outp, 16
	j	rdp_G_SPNOOP
	sw	sys0,  0-16(outp)
  EndAssign(dmem, 22)

/*======== End of gzrdp.s ========*/