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

f:id:chien1956:20200120093451p:plain

【画像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

f:id:chien1956:20200120101125p:plain

【画像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

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

*検証の結果⑵の変数を使うサブルーチンを採用します。