第１章

## 第１章　はじめに

### ファミコンアセンブラ開発の準備

ファミコンには、AppleIIで有名なモトローラ社6502のカスタムCPUが搭載されています。 6502にはC言語 コンパイラが存在するようですが、当サイトではアセンブラで開発を行います。

必要なものは、asmソースから実行ファイル(.NES形式）を生成できるアセンブラです。このnesasmをダウンロードしてください。 NESファイルを実行するファミコンエミュレータも必要です。各自好きなものを使ってください。 できればメモリ表示機能があるエミュが望ましいです。デバッガ機能と逆アセンブル機能もあると良いでしょう。 ファミコンのエミュレータはどこで手に入れるのかって？ネットで探してください。フリーのものがいくらでもあります。

(NES開発の全体の流れを知りたい人は、NES開発プロセスをご覧ください。)

### ファミコンのアセンブラ言語

CPUには、レジスタという数値を格納できる入れ物があります。一般的に新しいCPUほどレジスタをたくさん持っているのですが、 ファミコンの6502にはユーザーが自由に使えるレジスタは以下の３つしかありません（他にステータスレジスタとスタックポインタがありますが、今は説明しません）。しかも８ビットですから、10進数で0〜255までの値しか格納できません。

    	A　　アキュムレータ。計算に使います。

    	X,Y　インデックス。メモリアクセスに使います。

アセンブラは、ニーモニックと言われる命令コマンドでプログラムを記述します。以下は、レジスタに16進数の値を格納する例です。

    	lda #$10  ; 10(16進数)をAレジスタにロード(格納)する。

    	ldx #$20  ; 20(16進数)をXレジスタにロード(格納)する。

    	ldy #$30  ; 30(16進数)をYレジスタにロード(格納)する。

数字の前の$は16進数という意味で、#は値という意味を示します。;はコメントです。C言語やJavaで言えば//、VBなら'ですね。

2進数は%を先頭につけ、何もつけないと10進数になります。

    	lda #%00100001  ; 2進数をAレジスタにロード(格納)する。

    	ldx #10         ; 10(10進数)をXレジスタにロード(格納)する。

    	ldy #$10        ; 10(16進数)をYレジスタにロード(格納)する。

### メモリアクセス

ここまでは、値を直接指定してレジスタに格納していましたが、メモリ上の指定したある「場所」から、そこの値をレジスタにコピーしたい場合は、どうするのでしょうか。 その場合は、数値の先頭の#を外して、アドレス（番地）を指定します。 RAM（メモリ）には、１バイト(0〜255)単位で値がぎっしり詰まってて、 それぞれにアドレスという場所を示す番号が付いていると思ってください。

    	lda $4016	; 4016番地(16進数)の値をAレジスタにロードする。

    	ldx $4016	; 4016番地(16進数)の値をXレジスタにロードする。

    	ldy $4016	; 4016番地(16進数)の値をYレジスタにロードする。

上の３つの例のうちの１つ目だと、$4016番地の値に01が入っているとしたら、Aレジスタに01が入るということです。 「アドレス」と「そのアドレスの場所の値」の関係は、C言語で言えばポインタ変数に当たります。 まぁこのサイトの目的はファミコンエミュを動かすことだけなので、よくわからなくても先に進むのもいいかもしれません。

### メモリに値を保存

では逆に、レジスタからメモリに値をコピーするのはどうするのでしょうか。以下のようにします。

    	sta $2004	; Aレジスタの値を2004番地(16進数)番地にストア（保存）する。

    	sty $2002	; Yレジスタの値を2002番地(16進数)番地にストア（保存）する。

    	stx $FF		; Xレジスタの値を00FF番地(16進数)番地にストア（保存）する。

ここまで説明した命令の動作を図に表すと以下のようになります。

ところで、ファミコンのメモリ分布は、どのようになっているのでしょうか？RAM･ROM領域の分け方を、「メモリマップ」と言います。 大雑把に書くと、以下のようになっています。ハードディスクのパーティションのようなものだと思っておけば良いでしょう。

    	$0000〜$07FF	RAM（ユーザーが自由に使える）
    	$0800〜$1FFF	RAMのミラー
    	$2000〜$2007	I/Oレジスタ（ここを操作して画面やボタンの入出力操作を行います）
    	$2008〜$3FFF	I/Oレジスタのミラー
    	$4000〜$401F	I/Oレジスタ
    	$4020〜$5FFF	拡張ROM用
    	$6000〜$7FFF	バックアップRAM用
    	$8000〜$BFFF	プログラムROM
    	$C000〜$FFFF	プログラムROM

自由に使えるメモリは、$0000〜$07FFの2キロバイトということです。

メモリマップなどの参考になる資料は、トップページからリンクしているすずめ愛好会のFamicom開発室が充実しているので、是非ご覧ください。

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