From: j8takagi Date: Sun, 7 Feb 2010 03:27:08 +0000 (+0900) Subject: inl.caslのリファクタリング X-Git-Tag: v0.1~47^2~19 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=598dbf796573614de96effbe3563dec0f538e017;p=YACASL2.git inl.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