ドラクエ風RPGファミコンプログラム講座 アセンブラ入門編
第34回
*今回は、文字列出力ルーチン string
【文字列表示ルーチン】
『string:』
*string の仕様
1.文字列DATAを用意する(str_data:)
エンドコードは $ff
2.表示用 str_buff をRAMエリアに確保する。
3.表示開始アドレス座標をloc_x、loc_yにセットしてlocata:をコール
4.str_dataのポインタオフセットをAレジスタにロードしてコール
5.str_dataをstr_buffに転送する。
6.BUFFに転送された文字列を指定位置に描画処理
1)文字列DATAを用意する(str_data:)
エンドコードは $ff
str_data:
.db $02,$02,$03,$04,$05,$ff
.db $03,$02,$06,$04,$ff
⁂str_data:はROMエリアに用意する。
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)表示用 str_buff をRAMエリアに確保する。
.org $0200
str_buff:
.db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
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)表示開始アドレス座標をloc_x、loc_yにセットして locata:をコールする。
*Aレジスタに書き込むDATAをロードーしphp命令で
スタックに積み込む。
⁂検証の結果JSR命令の戻りアドレスがセットされている為、
変則てきな操作が必要なため、入門レベルで扱う題材では
ないようです。
lda #$09
sta
jsr char_print
;****************************************
char_print:
lda Vram_add_hi
sta $2006
lda Vram_add_low
sta $2006
pla ;プールDATAは、サブルーチンのリターンアドレス
sta $2007
rts
4)BUFFに転送された文字列を指定位置に描画処理
⁂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
;********************************************************************