ドラクエ風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 ゲームプログラミング編】

【ファイルの分割】

*NESASM は、分割コンパイルには対応していませんが .include/.incbin の疑似命令

 でファイルを分けることが出来ます。

.include "library.asm"

.incbin "map_data.bin"

*上記のようにアセンブラソース又は、バイナリーファイルを分割できます。



f:id:chien1956:20200307220618p:plain

 

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

NES ゲームプログラミング編】

【ファイルの分割】

*NESASM は、分割コンパイルには対応していませんが .include/.incbin の疑似命令

 でファイルを分けることが出来ます。

.include "library.asm"

.incbin "map_data.bin"

*上記のようにアセンブラソース又は、バイナリーファイルを分割できます。



f:id:chien1956:20200307220618p:plain

 

ドラクエ風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

f:id:chien1956:20200307220618p:plain

 

ドラクエ風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で確認できます。

 

f:id:chien1956:20200306152003p:plain

 

 

 

 

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

NES アセンブラ入門編】

【 シフト・ローテート命令 】

〖 左シフト命令 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: はみ出たビット

 

f:id:chien1956:20200220202414p:plain

 

 

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

NES アセンブラ入門編】

【 算術演算と論理演算】

排他的論理和命令( EOR ) 〗 

 *排他的論理和命令 EOR は、Aレジスタオペランドの各BITを比較して、お互いの

 BITが 反するときそのBITを 1 にする。

 

  『例』

 lda #1

  EOR #$01

  *上記のコードは Aレジスタは #%00000001 オペランドが #$00000001

      なので。

Aレジスタ    #$00000001

オペランド     #$00000001

演算結果                 #$00000000    

*上の演算結果で、排他的論理和オペランドのBIT が0の時変化無し、1の時

 反転するのが理解できると思う。このことから EOR命令は、

 特定のBITを反転するのに使われる。

  

f:id:chien1956:20200220202414p:plain

 

 

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

NES アセンブラ入門編】

【 算術演算と論理演算】

ファミコン(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をはめ込むのに使われる。

 

  

 

 

f:id:chien1956:20200220202414p:plain