X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=as%2Fcasl2lib%2Faddl32.casl;h=23740bf0b84efedc505d472c29c009f999a7fc69;hb=9a90bce10b932f8aa7045b9dceb4b99156666920;hp=cfb5c1d643fc2864a1efdd304c54362045775d90;hpb=4fe8479d27f535a0ff44c9f6ce270249934e980f;p=YACASL2.git diff --git a/as/casl2lib/addl32.casl b/as/casl2lib/addl32.casl index cfb5c1d..23740bf 100644 --- a/as/casl2lib/addl32.casl +++ b/as/casl2lib/addl32.casl @@ -1,35 +1,43 @@ -;;; 2つの32ビット数値を加算する -;;; 32ビットの値は、連続する2語の領域に格納 +;;; 2つの32ビット値を加算する +;;; 32ビットの値を、連続する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