ドラクエ風RPGファミコンプログラム講座 アセンブラ入門編

【第41回】

*今回は、ゲームメインと画面消去ーチンです。

【割り込みルーチンの時間制限】

ファミコンのVRAMアクセスは大変遅く、1度に全画面消去できません。

 分割して行う必要があります。

Vram 1画面は、$2000~$23bf で 32x30=960 byte になります。

  

 

【全画面消去ルーチンの構造と考え方】

*一回に、書き込むDATA限界の TEST

 下記のコードを検証してみます。

cls:

     lda #$20       ;Vram 先頭アドレスHI

    sta $2006     ;アドレスのセット

      lda #$00       ;Vram 先頭アドレスLOW

      sta $2006   ;アドレスのセット

  

    ldx #$93        ;Vramアクセス回数     

 loop:   

      lda #$00        ;消去DATA        

      sta $2007

    dex                 ;カウンターデクリメント

      bne loop

     rts

*検証の結果 $92  143byte であることが分かります。

 実際には、他のプログラムもあるのでもうすこしすくなるでしょう

 限界は、4.5 行という事になります。

 

*画面消去ならVramアクセスに専念できるので、4行単位で行けるでしょう。

 

*分割処理の方法は、WAITルーチンの時と同じように ID 、描画回数、  

 VRAM先頭アドレスをセットして、コールします。

【サンプルプログラム】

*呼び出し部分

    lda #$20

    sta Vram_add_hi

    lda #$00

    sta Vram_add_low

    lda #$0f

    sta cls_ct

    lda #1

    lda cls_f

*ルーチン本体 cls_f が1の時呼び出す

    lda Vram_add_hi

    sta $2006

    lda Vram_add_low

    sta $2006

    lda #0

    sta $2007 x128                ;128回繰り返す。(省略)

                                                                    ;ループ処理でもいい

    lda #$40                           ;次の描画位置の計算

    clc

    adc Vram_add_low

    sta Vram_add_low

    lda #0

    adc Vram_add_hi

    sta Vram_add_hi

    dec cls_ct                   ;カウンタデクリメント

    bne exit                       ;カウンタ 0で終了

    lda #0

    sta cls_f           ;CLS終了

exit:

    rts

*メインルーチンは、IDをセットしてコールすることになります、

 始めは中々馴染めないかもしれませんが、時期になれます。

 今日は、この辺で失礼します。

f:id:chien1956:20191229053904p:plain