+++ /dev/null
-;;; 2つの32ビット値を加算する
-;;; 32ビットの値を、連続する2語の領域に格納
-;;; 入力 GR1:数値1の先頭アドレス GR2:数値2の先頭アドレス
-;;; 出力 GR0:和の先頭アドレス
-ADDL32 START
- 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,X ; GR1 <- (X + GR3)の値
- ADDL GR1,GR3 ; ↓
- LD GR1,0,GR1 ; ↓
- LD GR2,Y ; GR2 <- (Y + GR3)の値
- ADDL GR2,GR3 ; ↓
- LD GR2,0,GR2 ; ↓
- ADDL GR1,GR2 ; GR1 <- GR1 + GR2
- JOV CRRY ; オーバーフロー時は、CRRYへジャンプ
- 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 ; 最上位の語でオーバーフローした場合、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 LAD GR3,=#8000 ; 強制的にオーバーフロー発生
- SLL GR3,1 ; ↓
-FIN LAD GR0,A ; GR0 <- A
- RPOP
- RET
-X DS 1 ; 数値1の先頭アドレス
-Y DS 1 ; 数値2の先頭アドレス
-A DS 2 ; 和
-LEN DC 2 ; 数値の語数
- END