root/as/misc/divl0.casl

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

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