続々・FizzBuzz問題(Z80アセンブラ・その2)

茜崎貴巳さんからもトラックバックが来たので、FizzBuzz問題Z80アセンブラ版を除算処理しないように手直ししてみた。
それだけじゃ芸が無いので、数字を表示する箇所をZ80ならではのBCD(2進化10進数)で行ってみた。普通なら0から1ずつ数字を増加させると、00〜FFとなるところを、00〜09の次が10となり99まで増加するようDAA命令を追加して、さらに0〜9の文字コードとなる30〜39をRLD命令で上から1桁ずつ取り出して表示している。

      LD   B,3    ; 3の倍数か確認するためのカウンタを初期化
      LD   H,5    ; 5の倍数か確認するためのカウンタを初期化
      XOR  A      ; 数字を初期化
;
LOOP: ADD  A,1    ; 数字を10進数として次へ進める
      DAA
      DEC  B      ; 3の倍数ならFizz表示へ
      JR   Z,FIZZ
      DEC  H      ; 5の倍数ならBuzz表示へ
      JR   Z,BUZZ
;
; 数字表示
;
      EX   DE,HL
      LD   HL,TMP
      LD   (HL),A ; 数字の上1桁を文字表示
      LD   A,30H
      RLD
      LD   E,A
      CP   30H    ; 数字が'0'なら表示しない
      JR   Z,ZERO
      LD   C,02H
      CALL 0005H
ZERO: RLD         ; 数字の下1桁を文字表示
      LD   E,A
      LD   C,02H
      CALL 0005H
      EX   DE,HL
      JR   SKIP
;
; Fizz表示
;
FIZZ: LD   B,3     ; 3の倍数か確認するためのカウンタを初期化
      LD   DE,MSG1
      LD   C,09H   ; DEレジスタが指す文字列を表示
      CALL 0005H
      DEC  H       ; 5の倍数でなければカンマ表示へ
      JR   NZ,SKIP
;
; Buzz表示
;
BUZZ: LD   H,5     ; 5の倍数か確認するためのカウンタを初期化
      LD   DE,MSG2
      LD   C,09H   ; DEレジスタが指す文字列を表示
      CALL 0005H
;
; カンマ表示
;
SKIP: LD   E,'.'
      LD   C,02H   ; Eレジスタに入っている文字を表示
      CALL 0005H
      OR   A       ; Aが00Hでなければ繰り返す
      JR   NZ,LOOP
      RET  
;
MSG1: DB   'Fizz$' ; Fizzの文字列、「$」は終端記号
MSG2: DB   'Buzz$' ; Buzzの文字列、「$」は終端記号
TMP:  DS   1