極楽プレイステーション
プログラミング

最終編集日 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