From 598dbf796573614de96effbe3563dec0f538e017 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Sun, 7 Feb 2010 12:27:08 +0900 Subject: [PATCH 1/1] =?utf8?q?inl.casl=E3=81=AE=E3=83=AA=E3=83=95=E3=82=A1?= =?utf8?q?=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- as/casl2lib/Makefile | 8 +++++ as/casl2lib/inl.casl | 73 +++++++++++++++++++++++++++++++++++++++ as/casl2lib/inl_main.casl | 42 ++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 as/casl2lib/Makefile create mode 100644 as/casl2lib/inl.casl create mode 100644 as/casl2lib/inl_main.casl diff --git a/as/casl2lib/Makefile b/as/casl2lib/Makefile new file mode 100644 index 0000000..cb6ecff --- /dev/null +++ b/as/casl2lib/Makefile @@ -0,0 +1,8 @@ +outl.casl: outl_main.casl divl1.casl rev.casl + cat $^ >$@ +outa.casl: outa_main.casl divl1.casl rev.casl abs.casl + cat $^ >$@ +outb.casl: outb_main.casl divl1.casl rev.casl + cat $^ >$@ +inl.casl: inl_main.casl mull1.casl + cat $^ >$@ diff --git a/as/casl2lib/inl.casl b/as/casl2lib/inl.casl new file mode 100644 index 0000000..aa9c6f8 --- /dev/null +++ b/as/casl2lib/inl.casl @@ -0,0 +1,73 @@ +;;; 入力された数値をGR0に格納する +INL START + RPUSH + IN IBUF,ILEN ; 入力文字列を格納 + XOR GR1,GR1 ; GR1:各桁の数値 初期化 + LAD GR2,10 ; GR2:10進数の「10」 初期化 + LAD GR3,0 ; GR3:値の一時格納 初期化 + LAD GR4,0 ; GR4:インデックス 初期化 +STOL CPL GR4,ILEN ; ループ先頭。(GR4 = ILEN)の場合、ループ脱出 + JZE CP ; ↓ + LD GR1,IBUF,GR4 ; GR1に、入力文字列中の次の桁を格納 + CPL GR1,ZERO ; (GR1 < '0')の場合、IOVへジャンプ + JMI OV ; ↓ + CPL GR1,NINE ; (GR1 > '9')の場合、IOVへジャンプ + JPL OV ; ↓ + SUBL GR1,ZERO ; GR1の文字を、対応する数値に変換 + ST GR4,NLEN ; GR4 <- ILEN - NLEN - 1 + LD GR4,ILEN ; ↓ + SUBA GR4,NLEN ; ↓ +MUL10 CPA GR4,=1 ; ループ先頭。GR1 <- 10 ** GR4 + JZE NEXT ; (GR4 = 1)の場合、ループ脱出 + JMI NEXT ; ↓ + CALL MULL ; MULLを呼び出し、GR0 <- GR1 * GR2 + LD GR1,GR0 ; GR1 <- GR0 + LAD GR4,-1,GR4 ; GR4 <- GR4 -1 + JUMP MUL10 ; ループ終端 +NEXT LD GR4,NLEN ; GR4 <- NLEN。復元 + ADDL GR3,GR1 ; GR3 <- GR3 + GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 + JUMP STOL ; ループ終端 +OV LAD GR0,1 ; GR0 <- 0。オーバーフローを強制的に発生させる + ADDL GR0,=#FFFF ; ↓ + JUMP FIN ; FINへジャンプ +CP LD GR0,GR3 ; GR0 <- GR3 +FIN RPOP + RET +ZERO DC '0' +NINE DC '9' +IBUF DS 5 +ILEN DS 1 +NLEN DS 1 + END +;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う +;;; 入力 GR1:被乗数 GR2:乗数 +;;; 出力 GR0:積 +;;; 積が65535より大きい場合は、GR0は積の下位16ビットになり、オーバーフロー +MULL START + PUSH 0,GR1 + PUSH 0,GR3 + XOR GR0,GR0 ; 積 + AND GR1,GR1 ; (GR1 = 0)の場合、終了 + JZE FIN ; ↓ + AND GR2,GR2 ; (GR2 = 0)の場合、終了 + JZE FIN ; ↓ + LAD GR3,1 ; 対象ビット +LOOP PUSH 0,GR3 ; ループ先頭。GR2のビット中でGR3が示すビットが0の場合、NEXTへジャンプ + AND GR3,GR2 ; ↓ + POP GR3 ; ↓ + JZE NEXT ; ↓ + ADDL GR0,GR1 ; GR0 <- GR0 + GR1 + JOV FIN ; GR0がオーバーフローした場合、ループ脱出 +NEXT SLL GR3,1 ; GR3を1回左シフト + AND GR3,GR3 ; (GR3 = 0)の場合、ループ脱出 + JZE FIN ; ↓ + CPL GR3,GR2 ; (GR3 > GR2)の場合、ループ脱出 + JPL FIN ; ↓ + SLL GR1,1 ; GR1を1回左シフト + JOV FIN ; GR1がオーバーフローした場合、ループ脱出 + JUMP LOOP ; ループ終端 +FIN POP GR3 + POP GR1 + RET + END diff --git a/as/casl2lib/inl_main.casl b/as/casl2lib/inl_main.casl new file mode 100644 index 0000000..40770ed --- /dev/null +++ b/as/casl2lib/inl_main.casl @@ -0,0 +1,42 @@ +;;; 入力された数値をGR0に格納する +INL START + RPUSH + IN IBUF,ILEN ; 入力文字列を格納 + XOR GR1,GR1 ; GR1:各桁の数値 初期化 + LAD GR2,10 ; GR2:10進数の「10」 初期化 + LAD GR3,0 ; GR3:値の一時格納 初期化 + LAD GR4,0 ; GR4:インデックス 初期化 +STOL CPL GR4,ILEN ; ループ先頭。(GR4 = ILEN)の場合、ループ脱出 + JZE CP ; ↓ + LD GR1,IBUF,GR4 ; GR1に、入力文字列中の次の桁を格納 + CPL GR1,ZERO ; (GR1 < '0')の場合、IOVへジャンプ + JMI OV ; ↓ + CPL GR1,NINE ; (GR1 > '9')の場合、IOVへジャンプ + JPL OV ; ↓ + SUBL GR1,ZERO ; GR1の文字を、対応する数値に変換 + ST GR4,NLEN ; GR4 <- ILEN - NLEN - 1 + LD GR4,ILEN ; ↓ + SUBA GR4,NLEN ; ↓ +MUL10 CPA GR4,=1 ; ループ先頭。GR1 <- 10 ** GR4 + JZE NEXT ; (GR4 = 1)の場合、ループ脱出 + JMI NEXT ; ↓ + CALL MULL ; MULLを呼び出し、GR0 <- GR1 * GR2 + LD GR1,GR0 ; GR1 <- GR0 + LAD GR4,-1,GR4 ; GR4 <- GR4 -1 + JUMP MUL10 ; ループ終端 +NEXT LD GR4,NLEN ; GR4 <- NLEN。復元 + ADDL GR3,GR1 ; GR3 <- GR3 + GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 + JUMP STOL ; ループ終端 +OV LAD GR0,1 ; GR0 <- 0。オーバーフローを強制的に発生させる + ADDL GR0,=#FFFF ; ↓ + JUMP FIN ; FINへジャンプ +CP LD GR0,GR3 ; GR0 <- GR3 +FIN RPOP + RET +ZERO DC '0' +NINE DC '9' +IBUF DS 5 +ILEN DS 1 +NLEN DS 1 + END -- 2.18.0