ドラクエ風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
*検証の結果 $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:
*メインルーチンは、IDをセットしてコールすることになります、
始めは中々馴染めないかもしれませんが、時期になれます。
今日は、この辺で失礼します。