root/as/misc/divl0.casl

/* [<][>][^][v][top][bottom][index][help] */
;;; 0〜65535の範囲にある正数の割算を行う
;;; 入力 GR1:被除数 GR2:除数
;;; 出力 GR0:商 GR3:剰余
;;; GR2が0の場合は、GR0、GR3とも0になり、オーバーフロー
DIVL0   START
        PUSH    0,GR1
        AND     GR2,GR2         ; (GR2 = 0)の場合、DIVZEROへジャンプ
        JZE     DIVZERO         ; ↓
        LAD     GR0,0           ; GR0を初期化
        LD      GR3,GR1         ; GR3 <- GR1
LOOP    CPL     GR3,GR2         ; ループ先頭。(GR3 < GR2)の場合、終了
        JMI     FIN             ; ↓
        SUBL    GR3,GR2         ; GR3 <- GR3 - GR2
        ADDL    GR0,ONE         ; ↓
        JUMP    LOOP            ; ループ終端
DIVZERO LAD     GR3,#8000       ; 強制的にオーバーフローを発生させ、GR3 <- 0
        SLL     GR3,1           ; ↓
        JUMP    FIN             ; FIN へジャンプ
FIN     POP     GR1
        RET
ONE     DC      1
        END

/* [<][>][^][v][top][bottom][index][help] */