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

  rts

 

【ライブラリー編】

;************* ライブラリー **************************************************

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

  rts

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

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

f:id:chien1956:20200114210958p:plain

*次回は、FONTの追加とステータスの表示をやってみましょう。