ドラクエ風RPGファミコンプログラム講座 アセンブラ入門編
第34回
*今回は、文字列出力ルーチン string
【文字列表示ルーチン】
『string:』
*string の仕様
1.文字列DATAを用意する(str_data:)
エンドコードは $ff
2.表示用 str_buff をRAMエリアに確保する。
3.表示開始アドレス座標をloc_x、loc_yにセットしてlocata:をコール
4.str_dataのポインタオフセットをXレジスタにロードしてコール
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エリアに用意する(パレットDATAと同じ場所)
2)表示用 str_buff をRAMエリアに確保する。
.bank 0
.org $0200 ;RAMエリアにBUFFを確保
str_buff:
.db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
3)表示開始アドレス座標をloc_x、loc_yにセットして locata:をコールする。
*X座標(0~31)・Y座標(0~14)の範囲でセットする。
lda #$0a
sta loc_x
lda #$09
sta loc_y
jsr locate
4)str_dataのポインタオフセットをXレジスタに
ロード してコール。
lda #$06;DATAオフセット
jsr string
5)str_dataをstr_buffに転送する。
string:
lda str_data,x
sta str_buff,x
inx
cmp #$ff ;エンドコード $ffか?
bne string
6)BUFFに転送された文字列を指定位置に描画処理
ldx #0
lp1:
lda str_buff,x
inx
cmp #$ff ;エンドコード $ffか?
beq exit
sta $2007
jmp llp1
exit:
jsr scroll_zero
【ライブラリー編】
;************* ライブラリー **************************************************
string:
lda str_data,x
sta str_buff,x
inx
cmp #$ff ;エンドコード $ffか?
bne string
ldx #0
lp1:
lda str_buff,x
inx
cmp #$ff ;エンドコード $ffか?
beq exit
sta $2007
jmp llp1
exit:
jsr scroll_zero
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
;********************************************************************
*次回は、FONTの追加とステータスの表示をやってみましょう。