せっかくだから俺もZ80版を書いてみるぜ!

すでに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