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

 #============================================================================
 #	本コードは, Ucode の自己ロード機能実現のため IMEM の最後尾に
 #	置かれなければならない. (=0x2000-21*4=0x1fac)
 #============================================================================

	#---------------------------------------------------------------------
	#  TaskDone/TaskYield/case_G_LOAD_UCODE			 2 insts.
	#
	#	マイクロコードの自己ロードモジュール / TASK 終了処理 /
	#	TASK Yield 処理共通の Overlay 用フック
	#
	#	Overlay 終了後 overlay_TaskDone へ Jump する.
	#	overlay_TaskDone で $1 の値に応じて処理が振り分けられる.
	#		$1 ==   0  なら case_G_LOAD_UCODE
	#		$1 ==  -4  なら TaskDone
	#		$1 == 0x80 なら TaskYield
	#	これにより常駐部のサイズを減らすことができる.
	#---------------------------------------------------------------------
  AssignForDMAproc
TaskDone:	_li	(sys1, 0x1000)			   # overlay_TaskDone
		_li	(sys0, RSP_LSTAT_OVERLAY_TASKDONE) # LoadOverlay へ
		.symbol	case_G_LOAD_UCODE,	TaskDone
		.symbol	TaskYield,		TaskDone

	#---------------------------------------------------------------------
	#  Overlay 処理コード					 5 inst.
	#
	#	sys0: ロードするモジュールのデータの DMEM 格納先を指定
	#	sys1: ロード後の Jump 先を指定
	#
	#	$19,$20,gfx1,return,sys0 は破壊される
	#---------------------------------------------------------------------
LoadOverlay:	lw	dram_adrs, 0(sys0)
LoadOverlay_1:	lhu	dma_len,   4(sys0)	# <-case_G_SUBMODULE から呼出
		jal	DMAproc
		lhu	dmem_adrs, 6(sys0)	# 正の値 => READ 動作
		_mov	(return, sys1)		# そのまま DMAwait へ
	
 #============================================================================
 #	これ以降 Ucode 共通のコードとなる.		以下 14 inst.
 #	アドレス 0x2000-14*4 = 0x1fc8 番地
 #============================================================================
			.space	0x1fc8
CODE_TOP_COMMON:	.bound	8
	#--- この間に命令を入れてはならん.	
	#---------------------------------------------------------------------
	#  DMA 待ち						 4 insts.
	#	sys0 は破壊される.
	#---------------------------------------------------------------------
DMAwait:	mfc0	sys0, DMA_BUSY
DMAwait1:	bne	sys0, zero, DMAwait1
		mfc0	sys0, DMA_BUSY
ReturnToR31:	jr	return

	#---------------------------------------------------------------------
	#  DMA 処理						10 insts.
	#	DMA の Read/Write 処理を行なう. 
	#	dmem_adrs は下位 13bit のみを DMEM アドレスとして使用する
	#	ため, 上位を Read/Write 動作の切り替え用に使用する.
	#	dmem_adrs = (DMEM アドレス) とすれば Read 動作
	#	dmem_adrs = (DMEM アドレス - 0x8000) として負の値を
	#	代入することで Write 動作になる.
	#
	#	dma_len($19):	DMA するデータ長 - 1
	#	dmem_adrs($20):	DMA 対象の DMEM アドレス
	#	gfx1($24):	DMA 対象の DRAM アドレス (下位 24bit のみ有効)
	#
	#	sys0 は破壊される.
	#---------------------------------------------------------------------
DMAproc:	mfc0	sys0, DMA_FULL
DMAproc1:	bne	sys0, zero, DMAproc1
		mfc0	sys0, DMA_FULL
		mtc0	dmem_adrs, DMA_CACHE
		bltz	dmem_adrs, DMAprocWrite	# もし dmem_adrs < 0 なら Write
 		mtc0	gfx1, DMA_DRAM
		jr	return
		mtc0	dma_len, DMA_READ_LENGTH
DMAprocWrite:	jr	return
		mtc0	dma_len, DMA_WRITE_LENGTH
		.symbol	DMAread,  DMAproc
		.symbol	DMAwrite, DMAproc
  EndAssignForDMAproc

/*======== End of gxoverlay.s ========*/