第1章 はじめに


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

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

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

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

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

 CPUには、レジスタという数値を格納できる入れ物があります。一般的に新しいCPUほどレジスタをたくさん持っているのですが、 ファミコンの6502には、ユーザーが自由に使えるレジスタは以下の3つしかありません(他にステータスレジスタとスタックポインタがありますが、今は説明しません)。しかも8ビットですから、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(メモリ)には、1バイト(0〜255)単位で値がぎっしり詰まってて、 それぞれにアドレス(番地)という場所を示す番号が付いていると思ってください。

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

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

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

 上の3つの例のうちの1つ目だと、$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キロバイトということです。
 この章を読んで難しいと思った方に、お勧めの本です。
トップページ 次のページ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送