すでにZ80アセンブラ版を書いている人はいるようだが、単に久々で面白かったからというだけの理由で、私も調子にのって書いてみるw
S-OS SWORD + ZEDA3 環境でアセンブルおよび実行。
#PRTHX EQU 1FC1H #PRTHL EQU 1FBEH #MPRNT EQU 1FE2H #PRINT EQU 1FF4H ORG 0C000H JP _MAIN DIV PUSH AF PUSH BC LD B,8 LD A,80H ADD A,A DIV_LOOP RL L ADC A,A CP H JR C,DIV_SKIP SUB H DIV_SKIP DJNZ DIV_LOOP RL L LD H,A LD A,L CPL LD L,A POP BC POP AF RET _MAIN LD D,1 LD B,100 LOOP LD E,0 LD L,D LD H,3 CALL DIV LD A,H OR A JR NZ,BUZZ_CHK INC E CALL #MPRNT DM "Fizz" DB 0 BUZZ_CHK LD L,D LD H,5 CALL DIV LD A,H OR A JR NZ,DIGIT INC E CALL #MPRNT DM "Buzz" DB 0 DIGIT LD A,E OR A JR NZ,WEND LD C,100 LD L,D DG_LOOP LD H,C CALL DIV LD A,030H ADD A,L CALL #PRINT LD A,C CP 1 JR Z,WEND LD L,H PUSH HL LD L,C LD H,10 CALL DIV LD C,L POP HL JR DG_LOOP WEND CALL #MPRNT DB 0DH,0 INC D DJNZ LOOP RET
…で、さすがにこいつに関しては、2分で書くのは無理。
なんせプロセッサ命令レベルでは乗算/除算の無いZ80であるから、まず「割り算が正常に動作するかどうか」ってところから確かめないと駄目だしw
倍数カウンタを使う方法(前日の日記に記載)なら除算ルーチンを検証する必要はないし、Z80の場合はそちらのアルゴリズムで最適化するのが本道なんだろうけど、ここは一つ、敢えて正面から除算をやってみるという無駄なことをしているw
、