まず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がリトルエンディアン であることによります。
今回はアスキーコード文字列を 使うのに間接アドレッシングを使用しましたが、文字列に限らずマップデータなどでもこのやり方は有効的です。 これでネームテーブルを簡単に利用することができます。ただ、サンプルのようなベタデータではメモリの使用効率が悪いです。 まあファミコンエミュでちょっとした自作ゲームとかを作るくらいなら、気にすることは無いでしょうが。
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] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||