第7章 ゼロページ


変数・定数

 RAMのアドレスにC言語の変数のように名前をつけてアクセスしたり、ROMとして初期化したりすることができます。 その場合は、例えば以下のように定数を記述するための.dbを使用します。

	.bank 0
	.org $0000	; $0000番地から
label1:    .db   0		; RAMの$0000番地をlabel1とする。初期値は持たせられない。
byte1:     .db   0		; RAMの$0001番地をbyte1とする。初期値は持たせられない。

	.org $8000

Start:     ; ここからはプログラムROM領域。プログラムと初期データを記述する。

label1Init:    .db   10		; プログラムROM領域にlabel1の初期値を配置。
byte1Init:     .db   20		; プログラムROM領域にbyte1の初期値を配置。


 ROM領域の初期化は、第2章で、バンク1に.dw(2バイト・ワード)で割り込みテーブルを初期化したのと同じ要領です。 ちなみに、$0000〜$07FFのRAM領域に値を書いて初期化することはできません。ROMからロード・ストアしてください。 また、ROM領域にストアして値を更新することはできません。

 ラベルを指定すればこの初期値を利用できます。


	lda label1  ; Aにlabel1の値をロードする
	ldx label1  ; Xにlabel1の値をロードする
	ldy label1  ; Yにlabel1の値をロードする
	lda byte1   ; Aにbyte1の値をロードする

 RAM領域であれば、値を更新することも出来ます。アセンブラ以外の言語の変数のように使えるということです。

	sta label1  ; Aの値をlabel1($0000)にストアする
	stx label1  ; Xの値をlabel1($0000)にストアする
	sty label1  ; Yの値をlabel1($0000)にストアする
	stx byte1   ; Xの値をbyte1($0001)にストアする

ゼロページ

 ファミコンの6502はレジスタだけでなく、RAM領域に対しても直接演算を行うことが可能です。  例えばこのようにいちいちレジスタを介せず加算、減算もできます。

	inc label1  ; label1を1加算

	dec label1  ; label1を1減算

 また、$0000~$00FFまでをゼロページと呼び、このRAM領域に対しては以下のようなアドレスの1バイト指定アクセスが可能です。

	lda <$00	; $0000の値をAにロード

	inc <$00	; $0000の値を1加算

 しかしこれではさっきのラベルよりも分かりにくいですね。でもラベルのような記述も可能です。

label1 = $00	; ゼロページアドレス名を定義

	lda <label1	; $0000の値をAにロード

	inc <label1	; $0000の値を1加算


 ちなみにスタック領域には$0100~$01FFの1ページが使用されますが、今は扱いません。
トップページ 前のページ 次のページ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送