valgrindのオプションを変更
[YACASL2.git] / as / casl2lib / addl32.casl
index cfb5c1d..23740bf 100644 (file)
@@ -1,35 +1,43 @@
-;;; 2つの32ビット値を加算する
-;;; 32ã\83\93ã\83\83ã\83\88ã\81®å\80¤ã\81¯、連続する2語の領域に格納
+;;; 2つの32ビット値を加算する
+;;; 32ã\83\93ã\83\83ã\83\88ã\81®å\80¤ã\82\92、連続する2語の領域に格納
 ;;; 入力 GR1:数値1の先頭アドレス GR2:数値2の先頭アドレス
 ;;; 出力 GR0:和の先頭アドレス
 ADDL32  START
-        ST      GR1,A
-        ST      GR2,B
+        RPUSH
+        ST      GR1,X           ; X <- GR1:数値1
+        ST      GR2,Y           ; Y <- GR2:数値2
         LD      GR3,LEN         ; GR3:語を表すインデックス 初期化
+        XOR     GR4,GR4         ; GR4:キャリー値 初期化
         LAD     GR3,-1,GR3      ; ↓
 LOOP    AND     GR3,GR3         ; ループ先頭。(GR3 = 0)の場合は、ループ脱出
         JMI     FIN             ; ↓
-        LD      GR1,GR3         ; GR1 <- (A + GR3)の値
-        ADDL    GR1,A           ; ↓
+        LD      GR1,X           ; GR1 <- (X + GR3)の値
+        ADDL    GR1,GR3         ; ↓
         LD      GR1,0,GR1       ; ↓
-        LD      GR2,GR3         ; GR2 <- (B + GR3)の値
-        ADDL    GR2,B           ; ↓
+        LD      GR2,Y           ; GR2 <- (Y + GR3)の値
+        ADDL    GR2,GR3         ; ↓
         LD      GR2,0,GR2       ; ↓
         ADDL    GR1,GR2         ; GR1 <- GR1 + GR2
-        ST      GR1,C,GR3       ; (C + GR3) <- GR1(フラグ不変)
-        LAD     GR3,-1,GR3      ; GR3 <- GR3 - 1(フラグ不変)
         JOV     CRRY            ; オーバーフロー時は、CRRYへジャンプ
-        XOR     GR1,GR1         ; GR1 <- 0
+        ADDL    GR1,GR4         ; GR1 <- GR1 + GR4
+        JOV     CRRY            ; オーバーフロー時は、CRRYへジャンプ
+        ST      GR1,A,GR3       ; (A + GR3) <- GR1
+        LAD     GR3,-1,GR3      ; GR3 <- GR3 - 1
+        XOR     GR4,GR4         ; GR4 <- 0
         JUMP    LOOP            ; ループ先頭へジャンプ
-CRRY    AND     GR3,GR3         ; 最上位の語でオーバーフローした場合
-        JZE     OV              ; ↓OVへジャンプ
-        LAD     GR1,1           ; GR1 <- 1
+CRRY    AND     GR3,GR3         ; 最上位の語でオーバーフローした場合、OVへジャンプ
+        JMI     OV              ; ↓
+        ST      GR1,A,GR3       ; (A + GR3) <- GR1
+        LAD     GR3,-1,GR3      ; GR3 <- GR3 - 1
+        LAD     GR4,1           ; GR4 <- 1
         JUMP    LOOP            ; ループ終端
-OV      ADDL    GR1,=#FFFF      ; 強制的にオーバーフロー発生
-FIN     LAD     GR0,C           ; GR3 <- C
+OV      LAD     GR3,=#8000      ; 強制的にオーバーフロー発生
+        SLL     GR3,1           ; ↓
+FIN     LAD     GR0,A           ; GR0 <- A
+        RPOP
         RET
-A       DS      1               ; 数値1のアドレス
-B       DS      1               ; 数値2のアドレス
-C       DS      2               ; 和
+X       DS      1               ; 数値1の先頭アドレス
+Y       DS      1               ; 数値2の先頭アドレス
+A       DS      2               ; 和
 LEN     DC      2               ; 数値の語数
         END