茜崎貴巳さんからもトラックバックが来たので、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