【NES ゲームプログラミング編】
【ファイルの分割】
*NESASM は、分割コンパイルには対応していませんが .include/.incbin の疑似命令
でファイルを分けることが出来ます。
.include "library.asm"
.incbin "map_data.bin"
*上記のようにアセンブラソース又は、バイナリーファイルを分割できます。

【NES ゲームプログラミング編】
【 PPUの初期化 】
*PPUの初期化は、 $2000 と $2001 のコントロールレジスタを設定します、
只、コントロールレジスタはビットフラグになっていてプログラム上で個別に
設定しなければならない時があります。
下記にコードを示します、 ゼロページに変数として PPU2000、PPU2001 に
値を保持し、変数を変更し8ビット全体をSTA します。
SP_table:
lda ppu_2000
ora #%00001000
sta ppu_2000
sta $2000
rts
color:
lda ppu_2001
and #%11111110
sta ppu_2001
sta $2001
rts
monochro:
lda ppu_2001
ora #%00000001
sta ppu_2001
sta $2001
rts
red:
lda ppu_2001
ora #%00100000
sta ppu_2001
sta $2001
rts
green:
lda ppu_2001
ora #%01000000
sta ppu_2001
sta $2001
rts
bule:
lda ppu_2001
ora #%10000000
sta ppu_2001
sta $2001
rts
RGB_res:
lda ppu_2001
and #%00011111
sta ppu_2001
sta $2001
rts
BG_on:
lda ppu_2001
ora #%00001000
sta ppu_2001
sta $2001
rts
BG_off:
lda ppu_2001
and #%11110111
sta ppu_2001
sta $2001
rts
SP_on:
lda ppu_2001
ora #%00010000
sta ppu_2001
sta $2001
rts
SP_off:
lda ppu_2001
and #%11101111
sta ppu_2001
sta $2001
rts
Vraminc32:
lda ppu_2000
ora #%00000100
sta ppu_2000
sta $2000
rts
Vraminc1:
lda ppu_2000
and #%11111011
sta ppu_2000
sta $2000
rts

【NES ゲームプログラミング編】
【 スケルトンプログラムの作成 】
*スケルトンプログラムとは初期化とメインルーチンで構成され、それに各
処理への流れを記述しただけのプログラムを言う。
先ずは、ゲームメインルーチン設置から始めます。
〖 VBlank割り込みルーチン 〗
*VBlank割り込みルーチンとは、1秒間に60回 VBlank 時に呼び出される
ルーチンで 割り込みベクター1番目に設定されたラベル番地にjmp
します。
『 割り込みベクターの設定』
*最初にジャンプベクトルの設定をします、続いてjmp先ラベルを設置
します、最後にVBlank割り込みを許可します。
VBlank割り込み S/W は、コントロールレジスタ$2000のbit7をセットします。
RTI は,割り込みルーチンからの帰還には rti を使います。
.bank 1
.org $FFFA
.dw main
.dw Start
.dw IRQ
main:
RTI
lda #%10001000
sta $2000
*これで、メインルーチンの設置は完了です、動作確認用に main 内に inc <$00
を追加すれば FCEUXのHex Editorで確認できます。

【 シフト・ローテート命令 】
〖 左シフト命令 ASL 〗
*ASL は左に 1bit シフト する命令です。(空いた部分には 0 が入ります。)
Aレジスタ x2を実行している。
『例』
lda #$01 ;#%00000001
asl a ;#%00000010
〖 右シフト命令 LSR〗
*LSR は右に 1bit シフト する命令です。(空いた部分には 0 が入ります。)部分には 0 が入
Aレジスタ /2を実行している。
『例』
lda #$08 ;#%00001000
lsr a ;#%00000100
〖 左ローテート命令 ROL 〗
*ROL は左に 1bit ローテートします。(左シフトを行い、空いた部分に C が入る)。
〖 右ローテート命令 ROR 〗
*RORは右に 1bit ローテートします。(右シフトを行い、空いた部分に C が入る)。
これらの命令は N, Z, C フラグを書き換えます:

【 算術演算と論理演算】
〖 排他的論理和命令( EOR ) 〗
*排他的論理和命令 EOR は、Aレジスタとオペランドの各BITを比較して、お互いの
BITが 反するときそのBITを 1 にする。
『例』
lda #1
EOR #$01
*上記のコードは Aレジスタは #%00000001 オペランドが #$00000001
なので。
Aレジスタ #$00000001
オペランド #$00000001
演算結果 #$00000000
*上の演算結果で、排他的論理和は オペランドのBIT が0の時変化無し、1の時
反転するのが理解できると思う。このことから EOR命令は、
特定のBITを反転するのに使われる。

【 算術演算と論理演算】
* ファミコン(6502)の算術演算は、加算と減算のみで、
キャリー付きの加算命令と減算命令が1つずつあるだけです。
〖 論理積命令( AND ) 〗
*論理積命令 AND は、Aレジスタとオペランドの各BITを比較して、双方が1の時
のみ そのBITを 1 にする。
『例』
lda #$44
and #$0f
*上記のコードは Aレジスタは #%01000100 オペランドが #$00001111
なので。
Aレジスタ #$01000100
オペランド #$00001111
演算結果 #$00000100
*上の演算結果で、#$04 になるのが理解できるとおもう。このことから AND
命令は、特定のBITを取り出すのに使われる。
〖 論理和命令( ORA ) 〗
*論理積命令 ORA は、Aレジスタとオペランドの各BITを比較して、片方が1の時
そのBITを 1 にする。
『例』
lda #$44
and #$0f
ora #$80
*上記のコードは Aレジスタは 論理積の続きで #%00000100 オペランドが #$1000000 なので。
Aレジスタ #$00000100
オペランド #$10000000
演算結果 #$10000100
*上の演算結果で、#$84 になるのが理解できるとおもう。このことから ORA
命令は、特定のBITをはめ込むのに使われる。
