続々・FizzBuzz(Z80アセンブラ)

FizzBuzz問題の続き〜。翌日続きを書いてマス。
永字八法 - 恐るべき現実からトラックバックが来ていた。NScripterで作ってる・・・すげぇ。しかも、ちゃんとNScripterで画面に収まり切らない場合も考慮されているのがカッコいい。
うちは昨日書いた8086アセンブラのんが取り上げられてたんだけど、そこに茜崎貴巳の日記@はてな - 昨日のFizzBuzzの続き。って、Z80らしき例があった。なるほど、除算とか使わずにやってるのねん。那乃さんがやってたパターンか。これ、カッコいいなー。
でも、せっかくなので昨日書いた8086アセンブラMS-DOS版)をZ80アセンブラ版(CP/MMSX-DOS版)に書き直してみた。

      LD   C,1     ; 1から始める
;
MAIN: LD   D,C     ; 3で割ってみる
      LD   E,3
      CALL DIV
      CP   0       ; 余りが0ならFizz表示へ
      JR   Z,FIZZ
;
      LD   D,C     ; 5で割ってみる
      LD   E,5
      CALL DIV
      CP   0       ; 余りが0ならBuzz表示へ
      JR   Z,BUZZ
;
; 数字を10進文字列に変換して表示
;
      LD   A,C
      LD   HL,MSG3 ; 文字列の格納場所
      LD   E,10
LOOP: CALL DIV     ; 10で割る
      ADD  A,'0'   ; 余りを文字にして格納
      DEC  HL
      LD   (HL),A
      LD   A,D     ; 商が0以外なら繰り返し
      CP   0
      JR   NZ,LOOP
      LD   C,09H   ; 10進文字列を表示
      LD   DE,HL
      CALL 0005H
      JR   NEXT
;
FIZZ: LD   C,09H   ; Fizzを表示
      LD   DE,MSG1
      CALL 0005H
      LD   D,C     ; 5で割ってみる
      LD   E,5
      CALL DIV
      CP   0       ; 余りが0以外ならカンマ表示へ
      JR   NZ,NEXT
;
BUZZ: LD   C,09H   ; Buzzを表示
      LD   DE,MSG2
      CALL 0005H
;
NEXT: LD   E,'.'   ; カンマを表示
      LD   C,02H
      CALL 0005H
      INC  C       ; 数字を次へ進める
      LD   A,C     ; 100を超えたら終わり
      CP   101
      JR   NZ,MAIN
      RET
;
; 割り算(D÷E=D あまり A)を行う
;
DIV:  LD   B,8     ; 8桁(8ビット)分繰り返す
      XOR  A       ; A=0
CALC: CP   A,E     ; 引けるなら1、引けなければ0
      JR   C,SKIP  ;  を答えとして1桁加える
      SUB  A,E     ;  Cフラグは引けなければ1
SKIP: CCF          ;  なのでCCF命令で反転させる
      RL   D       ; 1桁取り出す&1桁加える
      RL   A       ; 引いた結果に1桁加える
      DJNZ CALC    ; B=B-1をして0以上なら繰り返す
      RET
;
MSG1: DB   'Fizz$' ; Fizzの文字列、$は終端記号
MSG2: DB   'Buzz$' ; Buzzの文字列、$は終端記号
      DB   '   '   ; 10進文字列格納場所
MSG3: DB   '$'