ドラクエ風RPGファミコンプログラム講座

第12回

新年あけましておめでとうございます。
今年も、ファミコンプログラミングはじめましょう。
アセンブラ入門編③】
1.アドレッシング
    ⑴ ld命令とアドレッシング
     lda #100
     lda #$64
     lda $7000(ラベル)
     lda $7000,x
     lda $7000,y
     lda <$00
     lda <$00,x
     lda <$00,y

   ⑵ ld命令と、st命令。

*lda のaは、レジスタ名 ldxならxは対象はXレジスタになります。

 sta の場合も同じです。

 stx $2000 は、Xレジスタ$2000にコピーする命令です。

*$7000、xは $7000番地にXレジスタを加えた番地を示しています。

*<$00は、ZEROPAGEを表しています。

*#は、数値を示し、$がつくと16進数 なにも付かないのが10進数です。

[アドレッシング1欄]
Implied TAX AをXにコピー
Accumulator LSR A Aを左に1bitシフト
Immediate LDA #IM8 即値IM8をAにロード
Zeropage LDA IM8 アドレス「IM8」の8bit値をAにロード
Zeropage, X LDA IM8, X アドレス「IM8 + X」の8bit値をAにロード
Zeropage, Y LDA IM8, Y アドレス「IM8 + Y」の8bit値をAにロード
Relative BEQ IM8 ステータスレジスタZがオンの時、アドレス「PC + IM8」へジャンプ
Absolute LDA IM16 アドレス「IM16」の8bit値をAにロード
Absolute, X LDA IM16, X アドレス「IM16 + X」の8bit値をAにロード
Absolute, Y LDA IM16, Y アドレス「IM16 + Y」の8bit値をAにロード
(Indirect) JMP (IM16) アドレス「アドレス「IM16」の16bit値」へジャンプ
(Indirect, X) LDA (IM8, X) アドレス「アドレス「IM8 + X」の16bit値」の8bit値をAにロード
(Indirect), Y LDA (IM8), Y アドレス「アドレス「IM8」の16bit値 + Y」の8bit値をAにロード

ファミコンハード編】
1.メモリーマップ(メインメモリー

$0000-$07FF RAM
$0800-$1FFF RAM ミラー
$2000-$2007 PPU I/O レジスタ
$2008-$3FFF PPU I/O レジスタ ミラー
$4000-$4017 APU/OAMDMA/コントローラ I/O レジスタ
$4018-$401F 没機能レジスタ (通常は無効)
$4020-$FFFF カートリッジ側で構成

*00-$FF は「ゼロページ」と呼ばれ、準レジスタ的な
存在といえます。ゼロページは基本的に、
作業用変数や頻繁にアクセスされる変数が置かれる。
*$FFFA-$FFFFの6バイトは、割り込みベクターといい、
CPUの割り込み時のアドレスを起動する特別なエリア。
アセンブラの疑似命令では、(bank 3)に分類される。

2.メモリーマップ(PPUメモリー

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

アセンブラ実習編】
1.基本プログラム
*これからの実習につかう、TESTプログラムです。
エディターに記述して、保存しておいてください。【画像5】

f:id:chien1956:20200101115133j:plain

【画像5】

⁂上記のファイルをコンパイルし、FUECXを起動し実行します。

 

2.デバッグ

*Debug から Debuggerを起動します、【画像5】

 $8000番地から書いたプログラムであることが分かるとおもいます。

78、D8、A2、FF とあるのは機械語です。

その後ろにあるのが、逆アセンブルといって機械語アセンブリソースに

変換したものです、この先よく使うので覚えておいてください。

 

f:id:chien1956:20200101121119j:plain

【画像5】

⁂>の印は現在プログラムが、停止している位置です、jmp命令で$8005に
 無限ループしているのが分かります、無限ループはプログラムのストッパー

 として使いデバッグの必需品です。

*次回からは、パレットの設定とキャラクターDATAの設置を目標に進めていきます、

 当面はCPUの命令は全て覚える必要はありません、必要に応じて習得していけば

 いいのです。