第１８章

## 第１８章　間接アドレッシング

### 間接アドレッシング

ここまで色々なことを扱いましたが、まだ基本的で重要なことでありながら説明していない部分があります。 今回は２つほど説明します。これをダウンロードして見てください。

まず一つ目は、間接アドレッシングです。 いままでデータを次々と処理する場合は、lda tilepal, xのようにしていました。 でも複数のテーブルがあって、このtilepalを動的に切り替えたいときはどうすれば良いのでしょうか。 アドレスは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つの２バイトのアドレスとして処理することが可能になります。 なぜ下位、上位の順なのかは6502がリトルエンディアン であることによります。

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

### 比較

二つ目は比較命令についてです。ここまでの比較は、値が等しいかどうか、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ボタンで値が増加し、十字キーの上で比較を行います。

今回のサンプルは非常に地味で基本的なことをやっていますが、非常に重要なところでもあります。

トップページ 前のページ 次のページ

FC2 |  | キャッシング 花 | 無料 掲示板 無料ホームページ