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