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