ドラクエ風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

;********************************************************************