Nov17th

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

Top / CC65(CA65)

*文法 [#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)