第18章 間接アドレッシング


間接アドレッシング

 ここまで色々と説明してきましたが、まだ基本的で重要なことが色々と残っています。 今回は2つほど説明します。これをダウンロードして見てください。

 まず1つ目は、間接アドレッシングです。 いままでテーブルのデータを次々と処理する場合は、lda tilepal, xのようにしていました。 しかし、複数のテーブルがあり、そのテーブルを動的に切り替えたいときはどうすれば良いのでしょうか。 アドレスは16ビット長なのに、6502のレジスタは8ビットなので、レジスタにアドレスを渡すことはできません。 テーブル毎にいちいちlda命令を用意していては非常に冗長なプログラムになります。

 今回のサンプルでやっているように、以下のようにすると16ビットアドレス指定が可能になります。


StrAdr_L = $00			; 文字列下位アドレス
StrAdr_H = $01			; 文字列上位アドレス
(中略)
	lda #low(S_Title)	; テーブル下位アドレス取得
	sta <StrAdr_L
	lda #high(S_Title)	; テーブル上位アドレス取得
	sta <StrAdr_H
(中略)
	lda [StrAdr_L],y	; 間接アドレッシング
(中略)
S_Title:
	.db "  VALUE COMPARE@"

 S_Titleのような文字列テーブルを用意し、その先頭アドレスS_Titleをlow(),high()というNESASMのマクロで 下位、上位と1バイトずつ取得してゼロページに格納します。そして下位アドレスを"[","]"で指定します。こうすると、下位→上位の順で 並んでいる2連続1バイトデータを1つの2バイトのアドレスとして処理することが可能になります。 なぜ下位、上位の順なのかは6502がリトルエンディアン であることによります。

 今回はアスキーコード文字列を 使うのに間接アドレッシングを使用しましたが、文字列に限らずマップデータなどでもこのやり方は有効的です。 これでネームテーブルを簡単に利用することができます。ただ、サンプルのようなベタデータではメモリの使用効率が悪いです。 まあファミコンエミュでちょっとした自作ゲームとかを作るくらいなら、気にすることは無いでしょうが。

比較

 2つ目は比較命令についてです。ここまでの比較は、値が等しいかどうか、0かどうかということしか扱いませんでした。値が〜以上、〜未満、 (C言語で言えば>=、<)のような比較処理をやりたい時があります。その場合、以下のようにすると比較が可能です。

	cmp #$A			; Aと$Aを比較
	bcs baseA		; Aが$A以上ならbaseAへ

	cmp <Value_B		; AとValue_Bを比較
	bcc lessThan		; AがValue_B未満ならlessThanへ

 つまり、比較元の値が比較先以上になると、キャリーフラグが1になるということです。 ちなみにこれは符号無し(unsigned)、0~255という前提ですが、符号ありの場合はネガティブフラグで判断します。 しかしファミコンで符号付き数はまず使わないと思うのでここでは省略します。

 今回のサンプルを実行すると以下のような画面になります。A,Bボタンで値が増加し、十字キーの上で比較を行います。

 今回のサンプルはスクロールなどに比べると地味で基本的なことをやっていますが、非常に重要なところです。


トップページ 前のページ 次のページ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送