.TITLE MULDIV
                                ; MUL/DIVマイクロサブルーチンテスト

*START: 100
        R1:=D"16
*
        R2:=D"5
*
        CALL MULT                ; R1*R2

*
        R3:=R1                        ; 乗算結果(下位16ビット)

*
        R1:=D"16
*
        R2:=D"5
*
        CALL DIV                ; R1/R2

*
        R4:=R1                        ; 除算結果(商)

*
        R5:=R0                        ; 除算結果(余り)

*
        SET HLT
                                ; 乗算を行なうマイクロサブルーチン

*MULT:                                ; r1に被乗数 r2に乗数をセットして呼び出す

                                ; 上位16ビットをr0、下位16ビットをr1に返す

        R0:=ZERO AND 10                ; r0への0のセットと

        C:=RBUS                        ; カウンタCへの0x10のセットを同時に行なう

*
        R1:=SRL R1
*MULT2:                         ; 乗算ループ

        IF CRY=0 THEN MULT3
        C-1
*
        R0:=R0+R2
*MULT3:
        R0:=SRL R0
        WITH CRY
*
        IF CZ=0 THEN MULT2
        R1:=SRL R1
        WITH CRY
*
        RETURN
                                ; 除算を行なうマイクロサブルーチン

*DIV:                                ; r1に被除数 r2に除数をセットして呼び出す

                                ; 余りをr0、商をr1に返す

        SET BY R2                ; 除数が0であるかをチェック

*
        IF ZER=0 THEN DIV1
*
        SET OV                        ; 除数が0の場合はエラーで終了

*DIV1:
        R0:=0
*
        C:=10                   ; カウンタCに0x10をセット

*
        R1:=SLL R1
*DIV2:                                ; 除算ループ

        R0:=SLL R0
        WITH CRY
*
        R0:=R0-R2
        C-1
*
        IF NEG=0 THEN DIV3
*
        R0:=R0+R2
*
        IF CZ=0 THEN DIV2
        R1:=SLL R1
*
        RETURN
*DIV3:
        IF CZ=0 THEN DIV2
        R1:=SLL R1
        WITH ONE
*
        RETURN
        .END