Nov19th

CC65(CA65) のバックアップソース(No.5)

Top / CC65(CA65)

*環境整備 [#ic5d41d2]
-CC65
available for downloadからwindows版をダウンロード
http://www.cc65.org/oldindex.php#Download

-NES研究室サンプル
サンプル1をダウンロード
http://hp.vector.co.jp/authors/VA042397/nes/sample.html

-Virtual NES
作成した.nesファイルのエミュレート用

-makeコマンド
make for Windowsをインストール
Completeパッケージをダウンロード
http://gnuwin32.sourceforge.net/packages/make.htm
~

*アセンブル方法 [#ge41a965]
-NES研究室のサンプル内のmakefileを利用してmake
--makeコマンドはcygwinを入れるかmake on Windowsを入れる
--メモリマップを記述したmain.cfgも必要

-以下のファイルを同じディレクトリに入れて,cmd.exeからmakeを実行
--CC65一式
--各種割り込みを記述した,mainとなる.asmファイル
--makefile
--main.cfg
~

*文法 [#jb601fa9]
-16進数値
$を付ける
例: $00、$81

-即値
#を付ける
例: #$00、 #$29
~

*コントロールコマンド [#h2cb4431]
-.segment
セグメントを切り替える。
データやニーモニックを配置するには、.cfgファイルでセグメントにメモリ割り当てをしておく必要がある。
#highlight(cpp){{
.segment "HEADER"
    ...
    ...

.segment "INIT"
    ...
    ...
}}

-.byte
バイトサイズのデータ(8bit)を配置する。
.cfgファイルでセグメントにメモリを割り当てる必要がある。
#highlight(cpp){{
.segment "DATA"
    .byte    $06    ;0x06
    .byte    $4E, $45, $53, $1A    ;NES Header
}}

-.word
ワードサイズのデータ(16bit)を配置する。
#highlight(cpp){{
.segment "DATA"
    .word    $0000    ;0x0000
    .word    $3E64    ;0x3E64
}}

-.proc、.endproc
サブルーチンを定義する。
#highlight(cpp){{
.proc Reset
    ....
.endproc
}}
~

*メモ [#e73c7d8d]
-?jsrでラベル以外の番地に飛ぶ方法
8bitレジスタで16bitアドレスを計算する方法が分からんちん

-プログラムのエントリーポイントはリセット割り込みの指定先アドレスになる。

-$0000番地から4+12byte分の領域は、NES用ヘッダのデータが指定される。
先頭4byteには固有の値が、残りの12byteにはバンクの数やミラーリング方式が指定される。
#highlight(cpp){{
.segment "HEADER"    ;$0000に配置
    .byte    $4E, $45, $53, $1A    ;NES Header
    .byte    $02                            ;プログラムバンク数
    .byte    $01                            ;キャラクターバンク数
    .byte    $01                            ;ミラーリング方式(垂直ミラーリング)
    .byte    $00                            ;不明
    .byte    $00, $00, $00, $00    ;不明
    .byte    $00, $00, $00, $00    ;不明
}}

-$FFFA番地からword3つ分の領域は、各種割り込みの分岐先が指定される。
上から順に、VBlank割り込み、リセット割り込み、ハードウェア割り込み。
#highlight(cpp){{
.segment "STARTUP"
.proc Reset
.endproc

.segment "INTERRUPT"    ;$FFFAに配置
    .word    $0000    ;VBlank
    .word    Reset     ;リセット
    .word    $0000    ;ハードウェア
}}

-メモリサイズは8bit以上16bit以下なので、16bitの値で指定する。
レジスタにメモリアドレスを格納する場合2つ使用する必要がある。

-ROMとRAMの違いを押さえておく

-VirtualNESだと.incbinにオフセット値を与える命令が使えない
#highlight(cpp){{
    .incbin "data.dat", $100
}}
これが含まれると「未定義の命令が実行されました」のダイアログが出て止まる
~

*リンク [#xf983ebc]
-NES研究室
http://hp.vector.co.jp/authors/VA042397/nes/index.html
ニーモニックやアーキテクチャ、サンプルなどなど

-Control Commands
http://www.cc65.org/doc/ca65-11.html
.byte等のCC65用プリプロセスコマンド集。

#highlight(end)