極楽プレイステーション
プログラミング
最終編集日 1998-02-25
プレイステーションのゲーム開発はC言語で十分ですが、
C言語はさっぱりわからないので(笑)、
とりあえずアセンブラでのプログラミングに挑戦します。
最初の目標はPi形式のグラフィックを展開する関数です。
・アセンブラの効能
ゲームのすべてをC言語で記述できたとしても、
アセンブラを使うことでもっと快適なゲームになるかもしれません。
速度が要求される関数だけをアセンブラで記述すれば、
最小の手間で効果的に高速化できます。
たとえばロード時間が長いゲームがあったとしましょう。
その原因が圧縮データの展開だとすれば、
展開ルーチンをアセンブラで記述することで、
ロード時間を半分にできるかもしれません。
アセンブラが理解できるようになると、
Pro Action Replay(=PAR)を使って、市販ゲームの改造にも役立ちます。
レベル99や所持金65535ゴールドは簡単ですが、
Rボタンを押している間だけ通常の2倍加速なんて改造には、
アセンブラの知識が必須です。
・サンプルプログラム
小さな関数を記述してみることにしましょう。
いきなり高度な関数は難しいので、
値を加算するだけの関数を作ってみました。
・C言語版
--------------------------------------------------------------------
/* 二つのint値を加算する */
int tasu(int a, int b)
{
int ans;
ans = a + b;
return ans;
}
--------------------------------------------------------------------
・アセンブラ版(コンパイル結果)
--------------------------------------------------------------------
# 値の交換
.align 2 #以下のプログラムをワード境界へ配置
.globl tasu #関数tasuを外部から参照可能とする
.ent tasu #関数tasuの始まり
.frame $fp,16,$31 #スタックフレームの設定
.mask 0x40000000,-8 #R30のマスク
.fmask 0x00000000,0 #浮動小数レジスタのマスク
tasu:
subu $sp,$sp,16 #SP←SP-16(ワークを16バイト確保)
sw $fp,8($sp) #FPを保存
move $fp,$sp
sw $4,16($fp)
sw $5,20($fp)
lw $2,16($fp) #スタックに積まれた値を取り出す
lw $3,20($fp) # 〃
addu $2,$2,$3 #R2 ← R2 + R3
sw $2,0($fp) #いったんストアして、
lw $2,0($fp) #またロード(なぜ?)
j $skip
$skip:
move $sp,$fp #SP←FP
lw $fp,8($sp) #FPを復帰
addu $sp,$sp,16 #SP←SP+16(確保していたワークを開放)
j $31 #サブルーチンから戻る
.end tasu #関数tasuの終わり
--------------------------------------------------------------------
moveはR3000には存在しない命令で、
アセンブラにはマクロとして用意されています。
予想がつくと思いますが、レジスタ間のデータ転送命令です。
私自身、よくわかっていないのですが、
詳しい解説はまた書きます。
・アセンブラの使い方
プログラムで利用する方法について説明します。
ゲームをすべてアセンブラで記述するのは非人道的な行為です。
そこでC言語で記述されたプログラムの一部を、
アセンブラで記述する方法について説明します。
これから書きます。
間違いがあったら教えてください...
koh@inetmie.or.jp