ドラクエ風RPGファミコンプログラム講座 アセンブラ入門編
第33回
*今回は、前回の1文字出力ルーチン(C言語でいうとPUTCHAR)
の動作チェック
【ライブラリーの作成追加】
*ライブラリーの作成上の注意点。
1.凡庸性を持たせること
2.使用レジスタの選び方
3.変数を使う必要性
『putchar』
*char_print:の仕様
書き込み位置のVRAMアドレスをBUFFにストア後、書き込むDATAを渡す
DATAの受渡し方法はなん通りかあるが、呼ぶ側のサブルーチンの構造に合わせて
使い分ける必要があります、2番目の方法が一番安全
『putchar』
1.レジスタを使う方法。
2.変数を使う方法。
3.スタックを使う方法。
1)レジスタを使う方法
*Xレジスタに書き込むDATAをロードーし受渡す。
使用条件は、そのレジスタ(Xレジスタ)がサブルーチン内やコール先で、
使われていないこと。
ldx #$02 ;chardataをXレジスタにロード
char_print:
lda Vram_add_hi
sta $2006
lda Vram_add_low
sta $2006
stx $2007 ;Xレジスタの値を$2007にストア
rts
【画像1】
2)変数を使う方法。
*Aレジスタに書き込むDATAをロードーしchr_buff
にストアする。
lda #$02
sta chr_buff ;ゼロページに用意する。
char_print:
lda Vram_add_hi
sta $2006
lda Vram_add_low
sta $2006
lda chr_buff
sta $2007
rts
【画像2】
3)スタックを使う方法。
*Aレジスタに書き込むDATAをロードーしphp命令で
スタックに積み込む。
⁂検証の結果JSR命令の戻りアドレスがセットされている為、
変則てきな操作が必要なため、入門レベルで扱う題材では
ないようです。
lda #$02
php
jsr char_print
;****************************************
char_print:
lda Vram_add_hi
sta $2006
lda Vram_add_low
sta $2006
pla ;プールDATAは、サブルーチンのリターンアドレス
sta $2007
rts
⁂plaのところでスタックの操作必要があります、そこまでやる必要性は
ないでしょう。
【ライブラリー編】
;************* ライブラリー **************************************************
char_print:
lda Vram_add_hi
sta $2006
lda Vram_add_low
sta $2006
lda chr_buff
sta $2007
rts
locate:
lda loc_y ;Y座標
tax ;カウンターをセット
lp:
lda Vram_add_low ;アドレス下位
clc ;キャリーフラグリセット
adc #$20 ;VRAMの横幅(32)を加算する。
sta Vram_add_low
lda Vram_add_hi ;アドレス上位
adc #$0 ;繰り上がり分を加算する。
sta Vram_add_hi
dex ;Xを-1する。
bne lp
lda Vram_add_low
clc ;キャリーフラグリセット
adc loc_x ;x座標
sta Vram_add_low
rts
palette:
jsr VB0
lda #$3f
sta $2006
lda #$00
sta $2006
ldx #0
pal_loop:
lda pall,x
sta $2007
inx
cpx #32
bne pal_loop
rts
scroll_zero:
lda $2002
lda #$00
sta $2005
sta $2005
rts
zero_init:
lda #0
tax
lp00:
sta <$00,x
inx
bne lp00
rts
VB0:
lda $2002
bpl VB0
rts
IRQ:
rti
;********************************************************************
*検証の結果⑵の変数を使うサブルーチンを採用します。