;;; 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