cfb5c1d643fc2864a1efdd304c54362045775d90
[YACASL2.git] / as / casl2lib / addl32.casl
1 ;;; 2つの32ビット数値を加算する
2 ;;; 32ビットの値は、連続する2語の領域に格納
3 ;;; 入力 GR1:数値1の先頭アドレス GR2:数値2の先頭アドレス
4 ;;; 出力 GR0:和の先頭アドレス
5 ADDL32  START
6         ST      GR1,A
7         ST      GR2,B
8         LD      GR3,LEN         ; GR3:語を表すインデックス 初期化
9         LAD     GR3,-1,GR3      ; ↓
10 LOOP    AND     GR3,GR3         ; ループ先頭。(GR3 = 0)の場合は、ループ脱出
11         JMI     FIN             ; ↓
12         LD      GR1,GR3         ; GR1 <- (A + GR3)の値
13         ADDL    GR1,A           ; ↓
14         LD      GR1,0,GR1       ; ↓
15         LD      GR2,GR3         ; GR2 <- (B + GR3)の値
16         ADDL    GR2,B           ; ↓
17         LD      GR2,0,GR2       ; ↓
18         ADDL    GR1,GR2         ; GR1 <- GR1 + GR2
19         ST      GR1,C,GR3       ; (C + GR3) <- GR1(フラグ不変)
20         LAD     GR3,-1,GR3      ; GR3 <- GR3 - 1(フラグ不変)
21         JOV     CRRY            ; オーバーフロー時は、CRRYへジャンプ
22         XOR     GR1,GR1         ; GR1 <- 0
23         JUMP    LOOP            ; ループ先頭へジャンプ
24 CRRY    AND     GR3,GR3         ; 最上位の語でオーバーフローした場合
25         JZE     OV              ; ↓OVへジャンプ
26         LAD     GR1,1           ; GR1 <- 1
27         JUMP    LOOP            ; ループ終端
28 OV      ADDL    GR1,=#FFFF      ; 強制的にオーバーフロー発生
29 FIN     LAD     GR0,C           ; GR3 <- C
30         RET
31 A       DS      1               ; 数値1のアドレス
32 B       DS      1               ; 数値2のアドレス
33 C       DS      2               ; 和
34 LEN     DC      2               ; 数値の語数
35         END