ドラクエ風RPGファミコンプログラム講座 アセンブラ入門編
第37回
*今回は、予定を変更して、10進数変換(8bit)0~255 です
1.100で割る、商が100の桁。
2.余りを10で割る、商が10の桁。
3.余りが1の
deci100:
cmp #100
bcc deci10 ;dataが#100より小さい時ループを抜ける
sec ;キャリーフラグをセットする。
sbc #100 ;減算する。
inc <$91 ;100の桁をセットする。
jmp deci100
deci10:
cmp #10
bcc deci1
sec
sbc #10
inc $92 ;10の桁をセットする。
jmp deci10
deci1:
sta $93 ;1の桁をセットする。
*今回は、これだけです 次回は、表示までいきたいと思います。
ドラクエ風RPGファミコンプログラム講座
【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
ドラクエ風RPGファミコンプログラム講座
【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で確認できます。
ドラクエ風RPGファミコンプログラム講座
【 シフト・ローテート命令 】
〖 左シフト命令 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 フラグを書き換えます:
- N: 結果の最上位ビット
- Z: 結果が 0 であるか
- C: はみ出たビット
ドラクエ風RPGファミコンプログラム講座
【 算術演算と論理演算】
〖 排他的論理和命令( EOR ) 〗
*排他的論理和命令 EOR は、Aレジスタとオペランドの各BITを比較して、お互いの
BITが 反するときそのBITを 1 にする。
『例』
lda #1
EOR #$01
*上記のコードは Aレジスタは #%00000001 オペランドが #$00000001
なので。
Aレジスタ #$00000001
オペランド #$00000001
演算結果 #$00000000
*上の演算結果で、排他的論理和は オペランドのBIT が0の時変化無し、1の時
反転するのが理解できると思う。このことから EOR命令は、
特定のBITを反転するのに使われる。
ドラクエ風RPGファミコンプログラム講座
【 算術演算と論理演算】
* ファミコン(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をはめ込むのに使われる。