R3000特訓講座
第7号(校正中)

更新日付 1998-03-19

駆け足で一週間、R3000を解説してきました。
無事に最終回となりました。
今回は、実際に使えそうなサブルーチンを作ります。

[戻る]


・プログラム

ではでは、さっそくプログラムを組んでみましょう。
二つの座標を元に、その距離を求めるプログラム・・・。
を、やるつもりでしたが、浮ェ出てきたので中止しました。

問題71.座標x,yをθ度回転させ、回転後の座標を求めるサブルーチン。
 t0=x、t1=y、t2=回転角度θから、t0=x'、t1=y'を求める。
 結果を格納するレジスタ以外のレジスタはすべて保存すること。
 値はすべて16.16bit、回転後の座標は32bitの整数とする。

回転後の座標は次の計算式で求められます。
理由? 私は中卒です。聞かないでください。
 x' = x.cosθ - y.sinθ
 y' = y.cosθ + x.sinθ
前回作ったtantanと同じ仕様で、
サブルーチンsinsinとcoscosが存在するものとします。
-------------------------------------------------------------------
rot:
	addi	sp,sp,-4*6	#4バイト×保存するレジスタ数
	sw	ra,$0000(sp)	#ra保存
	sw	t3,$0004(sp)	#t3保存
	sw	t4,$0008(sp)	# :
	sw	t5,$000c(sp)	# :
	sw	s0,$0010(sp)	# :
	sw	s1,$0014(sp)	#てな感じ

	move	t3,t0		#t3=x座標
	jal	sinsin		#sinθを求める
	move	t0,t2		#t0=θ(遅延スロットなのでjalと共に実行される)
	move	t4,t0		#t4=sinθ
	jal	coscos		#cosθを求める
	move	t0,t2		#t0=θ(遅延スロットなのでjalと共に実行される)
	move	t5,t0		#t5=cosθ

	mult	t3,t5		#x.cosθ
	mfhi	s0		#s0=x.cosθ
	mult	t1,t4		#y.sinθ
	mfhi	s1		#s1=y.sinθ
	sub	t0,s0,s1	#t0=x'=x.cosθ-y.sinθ

	mult	t1,t5		#y.cosθ
	mfhi	s0		#s0=y.cosθ
	mult	t3,t4		#x.sinθ
	mfhi	s1		#s1=x.sinθ
	add	t1,s0,s1	#t1=y'=y.cosθ + x.sinθ

	lw	ra,$0000(sp)	#レジスタra復帰
	lw	t3,$0004(sp)	#レジスタt3復帰
	lw	t4,$0008(sp)	# :
	lw	t5,$000c(sp)	# :
	lw	s0,$0010(sp)	# :
	lw	s1,$0014(sp)	#てな感じ
	addi	sp,sp,4*6	#スタックポインタを元の位置に戻す
	jr	ra		#戻り番地へジャンプ
	nop			#遅延スロットを殺す
-------------------------------------------------------------------

[戻る]


・PEDデータの転送

問題72.a0=転送元アドレス、a1=転送先アドレスとし、
 PED形式のポーズデータをソートして転送するサブルーチン。
 PEDデータはスプライトを12個組み合わせて1ポーズとし、
 そのポーズを連続で書き換えることでアクションを表現する。
 一つのスプライトは、
 |x座標8bit|y座標8bit|反転情報2bit|優先順位5bit|スプライトNo.9bit|
 の32bitとなっており、12キャラの優先順位は0〜11、
 つまり2進数で00000〜01011で表すことができる。
 この優先順位を小さい順に並べ換えて転送する。
 全レジスタを保存すること。
-------------------------------------------------------------------
set_ped:
	addi	sp,sp,-4*4
	sw	a0,$0000(sp)
	sw	a2,$0004(sp)
	sw	a3,$0008(sp)
	sw	t0,$000c(sp)

	addi	a2,a0,4*12		#a2=転送終了時の転送元アドレス
_loop:
	lw	t0,$0000(a0)		#1キャラ分ロード
	addi	a0,a0,4			#転送元アドレスを進める
	andi	a3,t0,$3e00		#関係のないbitを殺す
	slr	a3,a3,9			#優先順位を最下位bitに移動
	sll	a3,a3,2			#a3=a3×4
	add	a3,a1,a3		#a3=転送先アドレス+優先順位オフセット
	sw	t0,$0000(a3)		#1キャラストア
	bne	a0,a2,_loop

	lw	a0,$0000(sp)
	lw	a2,$0004(sp)
	lw	a3,$0008(sp)
	lw	t0,$000c(sp)
	addi	sp,sp,4*4
	jr	ra
	nop
-------------------------------------------------------------------
PED形式のデータは、拙作ポーズエディタPEDITのデータ形式です。
プレステ専用のポーズエディタを作るのもいいですが、
それではいつになるやらわかりません。
そこで、すでにあるスーファミのポーズデータを利用するため、
サブルーチンを作ってみたというわけです。

[戻る]


・後書き

いかがでしたか。そんなに難しくはなかったでしょ。
このままR3000にを楽しむのもいいのですが、
ここらでいったんお別れです。
スーファミのバスケゲーム「どんば」を完成させてから、
プレステに移植することにしましょう。
プレステの開発環境は、基本的にC言語です。
C言語+アセンブラだとしても、
アセンブラ100%でプログラムするスーファミよりは簡単です。

[戻る]


お仕事ください(笑)... koh@inetmie.or.jp