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