From 632d6b1815d6ce037e8a58e43e831807aacf0919 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Sun, 7 Feb 2010 18:05:32 +0900 Subject: [PATCH] =?utf8?q?32=E3=83=93=E3=83=83=E3=83=88=E8=AB=96=E7=90=86?= =?utf8?q?=E5=8A=A0=E7=AE=97=E3=81=AECASL=E3=83=97=E3=83=AD=E3=82=B0?= =?utf8?q?=E3=83=A9=E3=83=A0addl32=E3=82=92=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- as/casl2lib/addl32.casl | 47 ++++++++++++++++++++----------- as/casl2lib_test/addl32_call.casl | 9 ++++++ 2 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 as/casl2lib_test/addl32_call.casl diff --git a/as/casl2lib/addl32.casl b/as/casl2lib/addl32.casl index 63a6bba..cfb5c1d 100644 --- a/as/casl2lib/addl32.casl +++ b/as/casl2lib/addl32.casl @@ -1,22 +1,35 @@ ;;; 2つの32ビット数値を加算する ;;; 32ビットの値は、連続する2語の領域に格納 -MAIN START BEGIN -BEGIN LAD GR1,1 ; GR1にAの下位語を転送 - LD GR1,A,GR1 ; ↓ - LAD GR2,1 ; GR2にBの下位語を転送 - LD GR2,B,GR2 ; ↓ +;;; 入力 GR1:数値1の先頭アドレス GR2:数値2の先頭アドレス +;;; 出力 GR0:和の先頭アドレス +ADDL32 START + ST GR1,A + ST GR2,B + LD GR3,LEN ; GR3:語を表すインデックス 初期化 + LAD GR3,-1,GR3 ; ↓ +LOOP AND GR3,GR3 ; ループ先頭。(GR3 = 0)の場合は、ループ脱出 + JMI FIN ; ↓ + LD GR1,GR3 ; GR1 <- (A + GR3)の値 + ADDL GR1,A ; ↓ + LD GR1,0,GR1 ; ↓ + LD GR2,GR3 ; GR2 <- (B + GR3)の値 + ADDL GR2,B ; ↓ + LD GR2,0,GR2 ; ↓ ADDL GR1,GR2 ; GR1 <- GR1 + GR2 - JOV CARR ; オーバーフロー時は、CARRにジャンプ - JUMP STL -CARR LAD GR2,1 ; Cの上位語に1を格納 - ST GR2,C ; ↓ -STL LAD GR2,1 ; Cの下位語にGR1の内容を格納 - ST GR1,C,GR2 ; ↓ - LD GR1,A ; GR1にAの上位語を転送 - ADDL GR1,B ; GR1 <- GR1 + B - ADDL GR1,C ; GR1 <- GR1 + C + ST GR1,C,GR3 ; (C + GR3) <- GR1(フラグ不変) + LAD GR3,-1,GR3 ; GR3 <- GR3 - 1(フラグ不変) + JOV CRRY ; オーバーフロー時は、CRRYへジャンプ + XOR GR1,GR1 ; GR1 <- 0 + JUMP LOOP ; ループ先頭へジャンプ +CRRY AND GR3,GR3 ; 最上位の語でオーバーフローした場合 + JZE OV ; ↓OVへジャンプ + LAD GR1,1 ; GR1 <- 1 + JUMP LOOP ; ループ終端 +OV ADDL GR1,=#FFFF ; 強制的にオーバーフロー発生 +FIN LAD GR0,C ; GR3 <- C RET -A DC 0,65534 -B DC 0,65535 -C DS 2 +A DS 1 ; 数値1のアドレス +B DS 1 ; 数値2のアドレス +C DS 2 ; 和 +LEN DC 2 ; 数値の語数 END diff --git a/as/casl2lib_test/addl32_call.casl b/as/casl2lib_test/addl32_call.casl new file mode 100644 index 0000000..2b3b323 --- /dev/null +++ b/as/casl2lib_test/addl32_call.casl @@ -0,0 +1,9 @@ +MAIN START + LAD GR1,A + LAD GR2,B + CALL ADDL32 + RET +A DC 12,34 +B DC 10,32767 +C DS 2 + END -- 2.18.0