第2章 NESASM


バンク

 プログラムやグラフィックのデータは、バンク という単位に分けることができます。このサイトでは、以下のように3つに分けて格納します。
	Bank 0 - $8000番地から始まるプログラムROM領域。ここにプログラムを入れる。

	Bank 1 - 割り込みテープル。$FFFA番地から始まる。

	Bank 2 - スプライトと背景データを入れるバンク。VRAMの$0000番地から始まる。
 ここまでにRAMやROMという言葉が出てきていますが、RAMはファミコンハード本体の中にあるデータが読み書き可能な領域、 ROMはカセットの中にある読み取りしかできない領域と理解してください。

iNESヘッダ

 エミュで動かすためには、iNES形式のソースファイルに、ヘッダ情報を入れる必要があります。以下の4つを記述します。 各行の先頭には必ずタブを入れてください。

	.inesprg 1	; - プログラムにいくつのバンクを使うか。今は1つ。
	.ineschr 1	; - グラフィックデータにいくつのバンクを使うか。今は1つ。
	.inesmir 0	; - VRAMのミラーリングを水平にするか垂直にするか。とりあえず0(水平)にする。
	.inesmap 0	; - マッパー。0番にする。

 4行目のマッパーとは、ファミコンの容量制限を増やすためなどの目的で作られたROMの種別のことです。 0番は初期状態で、プログラム32kb,キャラクタ8kbが最大サイズです。3行目のVRAMのミラーリングについては、後の章で説明します。

プログラム

 プログラムはバンク0に配置し、開始アドレスは$8000とします。以下のように記述します。

	.bank 0		; バンク0
	.org $8000	; $8000から開始

	; ここからプログラムコード開始

3つの割り込みハンドラ

 バンク1には割り込みベクタテーブルを記述します。割り込みは重要な処理を行う機能ですが、ここではリセットボタンを押すと最初に戻るだけにします。 割り込みを使う場合は、.dwには割り込みハンドラの先頭アドレスを記述します

	.bank 1      ; バンク1に切り替える
	.org $FFFA   ; $FFFAから開始

	.dw 0        ; VBlank割り込み
	.dw Start    ; リセット割り込み。起動時とリセットでStartラベルに飛ぶ
	.dw 0        ; ハードウェア割り込みとソフトウェア割り込みによって発生

グラフィックデータ

 バンク2にはVRAM領域の$0000から開始する、背景のBGデータと スプライトを格納します。VRAMとは、6502がレジスタとのやりとりで使用するRAMとは別の、グラフィックデータのためだけのRAMだと思ってください。

	.bank 2       ; バンク2に切り替える
	.org $0000    ; $0000から開始

	.incbin "giko.bkg"  ; 背景データのバイナリィファイルをincludeする
	.incbin "giko.spr"  ; スプライトデータのバイナリィファイルをincludeする

 この順番で並べると、背景がパターンテーブル0、スプライトがパターンテーブル1になります。このincbinはC言語の#includeのようなものです。対象はテキストファイルではありませんが (拡張子が背景は.bkg、スプライトは.sprとなってますが、.chrという拡張子のほうが一般的かもしれません)。

 VRAMにもメモリマップの概念があり、以下の通りになっています。それぞれの領域の役割は以後の章で説明します。

	$0000〜$0FFF パターンテーブル0 
	$1000〜$1FFF パターンテーブル1 
	$2000〜$23BF ネームテーブル 
	$23C0〜$23FF 属性テーブル 
	$2400〜$27BF ネームテーブル 
	$27C0〜$27FF 属性テーブル 
	$2800〜$2BBF ネームテーブル 
	$2BC0〜$2BFF 属性テーブル 
	$2C00〜$2FBF ネームテーブル 
	$2FC0〜$2FFF 属性テーブル 
	$3000〜$3EFF $2000-$2EFFのミラー 
	$3F00〜$3F0F BG用パレット 
	$3F10〜$3F1F スプライト用パレット 
	$3F20〜$3FFF パレットミラー 
	$4000〜$FFFF $0000-$3FFFのミラー 

トップページ 前のページ 次のページ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送