第７章

## 第７章　ゼロページ

### 変数・定数

RAMのアドレスに変数のように名前をつけてアクセスしたり、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領域の初期化は、第２章で、バンク1に.dw(２バイト・ワード)で割り込みテーブルを初期化したのと同じ要領です。 ちなみに、$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領域に対しては以下のようなアドレスの１バイト指定アクセスが可能です。

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

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

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

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

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

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

ちなみにスタック領域には$0100~$01FFの１ページが使用されますが、今は扱いません。

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

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