From: j8takagi Date: Sun, 5 Dec 2010 14:44:38 +0000 (+0900) Subject: CASL2LIBのドキュメント記述内容とテストを編集、再構成 X-Git-Tag: v0.1p15~19 X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=commitdiff_plain;h=3c757d760e9af5c84f56e8e3e4cc69eb85721d7c CASL2LIBのドキュメント記述内容とテストを編集、再構成 --- diff --git a/as/casl2lib/Makefile b/as/casl2lib/Makefile index 80a43fe..89b2073 100644 --- a/as/casl2lib/Makefile +++ b/as/casl2lib/Makefile @@ -1,7 +1,10 @@ ECHOHEADER = 'echo ";;; *** This file is auto generated. ***"' -TARGETS = inl.casl l2str.casl mula.casl outa.casl outb.casl outl.casl +TARGETS = diva.casl inl.casl l2str.casl mula.casl outa.casl outb.casl outl.casl .PHONY: all clean all: $(TARGETS) +diva.casl: src_diva/diva_main.casl divl.casl + @echo ";;; *** This file is auto generated. ***" >$@; \ + cat $^ >>$@ inl.casl: src_inl/inl_main.casl str2l.casl @echo ";;; *** This file is auto generated. ***" >$@; \ cat $^ >>$@ diff --git a/as/casl2lib/abs.casl b/as/casl2lib/abs.casl index 35aa20d..be0b922 100644 --- a/as/casl2lib/abs.casl +++ b/as/casl2lib/abs.casl @@ -1,5 +1,5 @@ -;;; GR1を絶対値に変換する -;;; 入力 GR1:-32768〜32767の整数 +;;; GR1を符号付き整数とみなし、絶対値に変換 +;;; 入力 GR1:-32768から32767の整数 ;;; 出力 GR1:入力された整数の絶対値 ;;; OF:入力されたGR1が-32768の場合、1 ;;; SF:入力されたGR1が負数(-32767〜-1)の場合、1 diff --git a/as/casl2lib/addl32.casl b/as/casl2lib/addl32.casl index 37d2f25..23740bf 100644 --- a/as/casl2lib/addl32.casl +++ b/as/casl2lib/addl32.casl @@ -1,4 +1,4 @@ -;;; 2つの32ビット数値を加算する +;;; 2つの32ビット値を加算する ;;; 32ビットの値を、連続する2語の領域に格納 ;;; 入力 GR1:数値1の先頭アドレス GR2:数値2の先頭アドレス ;;; 出力 GR0:和の先頭アドレス @@ -36,8 +36,8 @@ OV LAD GR3,=#8000 ; 強制的にオーバーフロー発生 FIN LAD GR0,A ; GR0 <- A RPOP RET -X DS 1 ; 数値1のアドレス -Y DS 1 ; 数値2のアドレス +X DS 1 ; 数値1の先頭アドレス +Y DS 1 ; 数値2の先頭アドレス A DS 2 ; 和 LEN DC 2 ; 数値の語数 END diff --git a/as/casl2lib/diva.casl b/as/casl2lib/diva.casl index e592709..5e723f5 100644 --- a/as/casl2lib/diva.casl +++ b/as/casl2lib/diva.casl @@ -1,7 +1,41 @@ -;;; -32767〜32767の範囲にある整数の割算(筆算方式)を行う +;;; 符号付き整数の割算を筆算方式で行う ;;; 入力 GR1:被除数 GR2:除数 ;;; 出力 GR0:商 GR3:剰余 -;;; GR2が0の場合は、GR0、GR3とも0になり、オーバーフロー +;;; 次の場合はオーバーフロー +;;; GR1 = -32768; GR2 = -32768; GR2 = 0 +;;; DIVA START + PUSH 0,GR1 + PUSH 0,GR2 + PUSH 0,GR4 + XOR GR0,GR0 ; 商を初期化 + XOR GR4,GR4 ; マイナスフラグを初期化 +CHK1 AND GR1,GR1 ; (GR1 > 0)の場合は、CHK2へジャンプ + JPL CHK2 ; ↓ + XOR GR1,ALLON ; GR1の正負を反転 + ADDA GR1,ONE ; ↓ + JOV FIN ; (GR1 = -32768)の場合は終了 + XOR GR4,ONE ; GR4 <- 1 +CHK2 AND GR2,GR2 ; (GR1 > 0)の場合は、DIVへジャンプ + JPL DIV ; ↓ + XOR GR2,ALLON ; GR2の正負を反転 + ADDA GR2,ONE ; ↓ + JOV FIN ; (GR2 = -32768)の場合は終了 + XOR GR4,ONE ; マイナスフラグを反転 +DIV CALL DIVL ; GR0 <- GR1 / GR2; GR3 <- GR1 mod GR2 + JOV FIN ; (GR2 = 0)の場合は終了 +MIN AND GR4,GR4 ; マイナスフラグがオフの場合、終了 + JZE FIN ; ↓ + XOR GR0,ALLON ; GR1の正負を反転 + ADDA GR0,ONE ; ↓ + XOR GR3,ALLON ; GR3の正負を反転 + ADDA GR3,ONE ; ↓ + JUMP FIN +OV ADDL GR0,=#8000 +FIN POP GR4 + POP GR2 + POP GR1 RET +ONE DC 1 +ALLON DC #FFFF END diff --git a/as/casl2lib/src_diva/diva.casl b/as/casl2lib/src_diva/diva.casl deleted file mode 100644 index 3dba44d..0000000 --- a/as/casl2lib/src_diva/diva.casl +++ /dev/null @@ -1,39 +0,0 @@ -;;; -32767〜32767の範囲にある整数の割算(筆算方式)を行う -;;; 入力 GR1:被除数 GR2:除数 -;;; 出力 GR0:商 GR3:剰余 -;;; GR2が0の場合は、GR0、GR3とも0になり、オーバーフロー -DIVA START - PUSH 0,GR1 - PUSH 0,GR2 - PUSH 0,GR4 - XOR GR0,GR0 ; 積 - AND GR2,GR2 ; (GR2 = 0)の場合、終了 - JZE DIVZERO ; ↓ - AND GR1,GR1 ; (GR1 = 0)の場合、終了 - JZE FIN ; ↓ - XOR GR4,GR4 ; マイナスフラグ -CHK1 AND GR1,GR1 ; (GR1 > 0)の場合は、CHK2へジャンプ - JPL CHK2 ; ↓ - XOR GR1,ALLON ; GR1の正負を反転 - ADDA GR1,ONE ; ↓ - JOV FIN ; (GR1 = -32768)の場合は終了 - XOR GR4,ONE ; GR4 <- 1 -CHK2 AND GR2,GR2 ; (GR1 > 0)の場合は、LOOPへジャンプ - JPL MUL ; ↓ - XOR GR2,ALLON ; GR2の正負を反転 - ADDA GR2,ONE ; ↓ - JOV FIN ; (GR2 = -32768)の場合は終了 - XOR GR4,ONE ; マイナスフラグを反転 -DIV CALL DIVL ; GR0 <- GR1 / GR2; GR3 <- GR1 mod GR2 - JOV FIN -MIN AND GR4,GR4 ; マイナスフラグがオフの場合、終了 - JZE FIN ; ↓ - XOR GR0,ALLON ; GR1の正負を反転 - ADDA GR0,ONE ; ↓ - JUMP FIN -OV ADDL GR0,=#8000 -FIN RPOP - RET -ONE DC 1 -ALLON DC #FFFF - END diff --git a/as/casl2lib/src_inl/inl_main.casl b/as/casl2lib/src_inl/inl_main.casl deleted file mode 100644 index 20237e4..0000000 --- a/as/casl2lib/src_inl/inl_main.casl +++ /dev/null @@ -1,22 +0,0 @@ -;;; 0〜65535の範囲にある整数の入力を受け付ける -;;; 入力 (SVC) -;;; 出力 GR1: 入力された数値 -;;; GR0: 文字列の長さ。入力が数字以外の場合は、#FFFF -;;; 65536以上の正数が入力された場合はエラー -INL START - IN IBUF,ILEN ; 入力文字列を格納 - LAD GR1,IBUF - LD GR2,ILEN - CPA GR2,LENMAX - JPL LENOV - CALL STR2L - JOV FIN - LD GR0,GR2 - JUMP FIN -LENOV LAD GR0,#FFFF - SRA GR0,1 -FIN RET -ILEN DS 1 -LENMAX DC 5 -IBUF DS 5 - END diff --git a/as/casl2lib/src_l2str/l2str_main.casl b/as/casl2lib/src_l2str/l2str_main.casl deleted file mode 100644 index 3623c72..0000000 --- a/as/casl2lib/src_l2str/l2str_main.casl +++ /dev/null @@ -1,45 +0,0 @@ -;;; 数値を10進数の整数を表す文字列として格納 -;;; 入力 GR1: 数値(0〜65535) GR2: 文字列を格納するアドレス -;;; 出力 GR0: 文字列の長さ -L2STR START - PUSH 0,GR1 - PUSH 0,GR3 - PUSH 0,GR4 - LAD GR2,10 ; GR2に10進数の「10」を格納。 - LAD GR0,0 ; GR0 <- 0 - LD GR4,GR2 ; GR4 <- GR2 - AND GR1,GR1 ; GR1をテスト - JZE ZERO ; GR1が0の場合、ZEROにジャンプ - PUSH 0,GR2 ; GR2を退避 - LAD GR2,BASE ; GR2 <- BASE:基数10 -STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出 - JMI STLST ; ↓ - CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納 - LD GR1,GR3 ; GR1にGR3をコピー - LD GR1,NCHAR,GR1 ; GR1を文字に変換 - ST GR1,0,GR4 ; GR4のアドレス <- GR1 - LAD GR4,1,GR4 ; GR4 <- GR4 + 1 - LD GR1,GR0 ; GR1 <- GR0:商 - JUMP STI ; ループ終端 -STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換 - ST GR1,0,GR4 ; GR4のアドレス <- GR1 - LAD GR4,1,GR4 ; GR4 <- GR4 + 1 - POP GR2 ; GR2を復元 - SUBL GR4,GR2 ; GR4 <- (GR4 - GR2):文字列の長さ - JUMP RV ; RVへジャンプ -ZERO LD GR1,NCHAR ; 「0」をSTR領域に格納 - ST GR1,0,GR4 ; ↓ GR4のアドレス <- GR1 - LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 -RV LD GR1,GR2 ; 文字列を逆順に並べ替え - LD GR2,GR4 ; ↓ - CALL REV ; ↓ -FIN LD GR0,GR2 ; GR0 <- GR2 - LD GR2,GR1 ; GR2 <- GR1 - POP GR4 - POP GR3 - POP GR1 - RET -BASE DC 10 -LEN DS 1 -NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' - END diff --git a/as/casl2lib/src_mula/mula_main.casl b/as/casl2lib/src_mula/mula_main.casl deleted file mode 100644 index 431486a..0000000 --- a/as/casl2lib/src_mula/mula_main.casl +++ /dev/null @@ -1,41 +0,0 @@ -;;; -32767〜32767の範囲にある正数のかけ算(筆算方式)を行う -;;; 入力 GR1:被乗数 GR2:乗数 -;;; 出力 GR0:積 -;;; 被乗数または乗数が-32768の場合は、オーバーフロー -;;; 積が-32767未満または32767より大きい場合は、GR0は積の下位16ビットになり、オーバーフロー -MULA START - RPUSH - XOR GR0,GR0 ; 積 - AND GR1,GR1 ; (GR1 = 0)の場合、終了 - JZE FIN ; ↓ - AND GR2,GR2 ; (GR2 = 0)の場合、終了 - JZE FIN ; ↓ - LAD GR3,1 ; 対象ビット - XOR GR4,GR4 ; マイナスフラグ -CHK1 AND GR1,GR1 ; (GR1 > 0)の場合は、CHK2へジャンプ - JPL CHK2 ; ↓ - XOR GR1,ALLON ; GR1の正負を反転 - ADDA GR1,ONE ; ↓ - JOV FIN ; (GR1 = -32768)の場合は終了 - XOR GR4,ONE ; GR4 <- 1 -CHK2 AND GR2,GR2 ; (GR1 > 0)の場合は、LOOPへジャンプ - JPL MUL ; ↓ - XOR GR2,ALLON ; GR2の正負を反転 - ADDA GR2,ONE ; ↓ - JOV FIN ; (GR2 = -32768)の場合は終了 - XOR GR4,ONE ; マイナスフラグを反転 -MUL CALL MULL ; GR0 <- GR1 * GR2 - JOV FIN - AND GR0,GR0 - JMI OV -MIN AND GR4,GR4 ; マイナスフラグがオフの場合、終了 - JZE FIN ; ↓ - XOR GR0,ALLON ; GR1の正負を反転 - ADDA GR0,ONE ; ↓ - JUMP FIN -OV ADDL GR0,=#8000 -FIN RPOP - RET -ONE DC 1 -ALLON DC #FFFF - END diff --git a/as/casl2lib/src_outa/outa_main.casl b/as/casl2lib/src_outa/outa_main.casl deleted file mode 100644 index 6f8f84d..0000000 --- a/as/casl2lib/src_outa/outa_main.casl +++ /dev/null @@ -1,44 +0,0 @@ -;;; GR1に格納された値を、10進数の整数値(-32768〜32767)として表示 -OUTA START - RPUSH - LAD GR2,10 ; GR2に10進数の「10」を格納。 - LAD GR0,0 ; GR0 <- 0 - LAD GR4,0 ; 負数フラグ。GR1が負数の場合、GR4は1 - LAD GR5,0 ; 整数値の長さ - AND GR1,GR1 ; GR1をテスト - JZE ZPRT ; GR1が0の場合、ZPRTにジャンプ - JPL STI ; GR1が正数の場合、STIにジャンプ - LAD GR4,1 ; GR1が負数の場合、GR4をオン - CALL ABS ; GR1を正数に変換 -STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出 - JMI STLST ; ↓ - CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納 - LD GR1,GR3 ; GR1にGR3をコピー - LD GR1,NCHAR,GR1 ; GR1を文字に変換 - ST GR1,STR,GR5 ; (STR + GR5) <- GR1 - LAD GR5,1,GR5 ; GR5 <- GR5 + 1 - LD GR1,GR0 ; GR0をGR1にコピー - JUMP STI ; ループ終端 -STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換 - ST GR1,STR,GR5 ; (STR + GR5) <- GR1 - LAD GR5,1,GR5 ; GR5 <- GR5 + 1 - AND GR4,GR4 ; 正数の場合 - JZE PRT ; ↓ - LD GR1,='-' ; 負数の場合、「-」をSTR領域に格納 - ST GR1,STR,GR5 ; (STR + GR5) <- GR1 - LAD GR5,1,GR5 ; GR5 <- GR5 + 1 - JUMP PRT ; PRTにジャンプ -ZPRT LD GR1,NCHAR ; 「0」をSTR領域に格納 - ST GR1,STR,GR5 ; (STR + GR5) <- GR1 - LAD GR5,1,GR5 ; GR5 <- GR5 + 1 -PRT ST GR5,LEN ; LEN <- GR5 - LD GR2,LEN ; GR2にLENの値を格納 - LAD GR1,STR ; GR1に文字列のアドレスを格納 - CALL REV ; 文字列を逆順に並べ替え - OUT STR,LEN ; 文字列を出力 - RPOP - RET -STR DS 17 -LEN DS 1 -NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' - END diff --git a/as/casl2lib/src_outb/outb_main.casl b/as/casl2lib/src_outb/outb_main.casl deleted file mode 100644 index 91ee4fa..0000000 --- a/as/casl2lib/src_outb/outb_main.casl +++ /dev/null @@ -1,42 +0,0 @@ -;;; GR1に格納された値を、2進数値として表示 -OUTB START - RPUSH - LAD GR2,2 ; GR2に2進数の「2」を格納。 - LAD GR0,0 ; GR0 <- 0 - XOR GR4,GR4 ; 2進数値の長さ - AND GR1,GR1 ; GR1をテスト - JZE ZERO ; GR1が0の場合、ZEROにジャンプ -STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出 - JMI STLST ; ↓ - CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納 - LD GR1,GR3 ; GR1にGR3をコピー - LD GR1,NCHAR,GR1 ; GR1を文字に変換 - ST GR1,STR,GR4 ; (STR + GR4) <- GR1 - LAD GR4,1,GR4 ; GR4 <- GR4 + 1 - LD GR1,GR0 ; GR0をGR1にコピー - JUMP STI ; ループ終端 -STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換 - ST GR1,STR,GR4 ; (STR + GR4) <- GR1 - LAD GR4,1,GR4 ; GR4 <- GR4 + 1 - JUMP EMB ; EMBにジャンプ -ZERO LD GR1,NCHAR ; 「0」をSTR領域に格納 - ST GR1,STR,GR4 ; ↓ (STR + GR4) <- GR1 - LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 -EMB LD GR1,NCHAR ; GR1 <- '0' -EMLOOP CPA GR4,DIG ; ループ先頭。(GR4 = DIG)の場合は、ループ脱出 - JZE PRT ; ↓ - ST GR1,STR,GR4 ; ↓ (STR + GR4) <- GR1 - LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 - JUMP EMLOOP ; ループ終端 -PRT ST GR4,LEN ; LEN <- GR4 - LD GR2,LEN ; GR2にLENの値を格納 - LAD GR1,STR ; GR1に文字列のアドレスを格納 - CALL REV ; 文字列を逆順に並べ替え - OUT STR,LEN ; 文字列を出力 - RPOP - RET -STR DS 17 -LEN DS 1 -NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' -DIG DC 16 - END diff --git a/as/casl2lib/src_outl/outl_main.casl b/as/casl2lib/src_outl/outl_main.casl deleted file mode 100644 index 881db90..0000000 --- a/as/casl2lib/src_outl/outl_main.casl +++ /dev/null @@ -1,35 +0,0 @@ -;;; GR1に格納された値を、10進数の整数値(0〜65535)として表示 -OUTL START - RPUSH - LAD GR2,10 ; GR2に10進数の「10」を格納。 - LAD GR0,0 ; GR0 <- 0 - XOR GR4,GR4 ; 整数値の長さ - AND GR1,GR1 ; GR1をテスト - JZE ZERO ; GR1が0の場合、ZEROにジャンプ -STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出 - JMI STLST ; ↓ - CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納 - LD GR1,GR3 ; GR1にGR3をコピー - LD GR1,NCHAR,GR1 ; GR1を文字に変換 - ST GR1,STR,GR4 ; (STR + GR4) <- GR1 - LAD GR4,1,GR4 ; GR4 <- GR4 + 1 - LD GR1,GR0 ; GR0をGR1にコピー - JUMP STI ; ループ終端 -STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換 - ST GR1,STR,GR4 ; (STR + GR4) <- GR1 - LAD GR4,1,GR4 ; GR4 <- GR4 + 1 - JUMP PRT ; PRTにジャンプ -ZERO LD GR1,NCHAR ; 「0」をSTR領域に格納 - ST GR1,STR,GR4 ; ↓ (STR + GR4) <- GR1 - LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 -PRT ST GR4,LEN ; LEN <- GR4 - LD GR2,LEN ; GR2にLENの値を格納 - LAD GR1,STR ; GR1に文字列のアドレスを格納 - CALL REV ; 文字列を逆順に並べ替え - OUT STR,LEN ; 文字列を出力 - RPOP - RET -STR DS 17 ; 符号付き2進数で表記した場合を想定 -LEN DS 1 -NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' - END diff --git a/as/casl2lib/src_str2l/str2l_main.casl b/as/casl2lib/src_str2l/str2l_main.casl deleted file mode 100644 index 70532d3..0000000 --- a/as/casl2lib/src_str2l/str2l_main.casl +++ /dev/null @@ -1,62 +0,0 @@ -;;; 0〜65535の範囲にある整数の入力を受け付ける -;;; 10進数の整数を表す文字列を数値に変換 -;;; 入力 GR1: 文字列を格納するアドレス -;;; GR2: 文字列の長さ。1-5を想定 -;;; 出力 GR0: 数値(0〜65535) -;;; 文字列が長過ぎる場合や数値以外の場合は、GR2に#FFFFを格納 -STR2L START - PUSH 0,GR3 - PUSH 0,GR4 - XOR GR0,GR0 ; GR0:初期化 - AND GR2,GR2 ; (GR2 = 0)の場合、FINへジャンプ - JZE FIN ; ↓ - CPL GR2,MAXLEN ; (GR2 > MAXLEN)の場合、LENOVへジャンプ - JPL LENOV ; ↓ - ST GR1,STR ; STR <- GR1 文字列の開始アドレス - ST GR2,LEN ; LEN <- GR2 - LAD GR2,10 ; GR2:10進数の「10」 - XOR GR3,GR3 ; GR3:値の一時格納 - XOR GR4,GR4 ; GR4:インデックス -STOL CPL GR4,LEN ; ループ先頭。(GR4 = LEN)の場合、ループ脱出 - JZE CP ; ↓ - LD GR1,STR ; GR1に、入力文字列中の次の桁を格納 - ADDL GR1,GR4 ; ↓ - LD GR1,0,GR1 ; ↓ - CPL GR1,ZERO ; (GR1 < '0')の場合、NANへジャンプ - JMI NAN ; ↓ - CPL GR1,NINE ; (GR1 > '9')の場合、NANへジャンプ - JPL NAN ; ↓ - SUBL GR1,ZERO ; GR1の文字を、対応する数値に変換 - ST GR4,NLEN ; GR4 <- LEN - NLEN - 1 - LD GR4,LEN ; ↓ - SUBA GR4,NLEN ; ↓ -MUL10 CPA GR4,=1 ; ループ先頭。GR1 <- 10 ** GR4 - JZE NEXT ; (GR4 = 1)の場合、ループ脱出 - JMI NEXT ; ↓ - CALL MULL ; MULLを呼び出し、GR0 <- GR1 * GR2 - JOV FIN ; ↓ - 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 - JOV FIN ; ↓ - LAD GR4,1,GR4 ; GR4 <- GR4 + 1 - JUMP STOL ; ループ終端 -NAN LAD GR2,#FFFF ; GR2 <- #FFFF - JUMP FIN ; FINへジャンプ -CP LD GR1,GR3 ; GR0 <- GR3 - LD GR0,LEN ; GR0 <- LEN - JUMP FIN -LENOV LAD GR0,#FFFF - SRA GR0,1 -FIN POP GR4 - POP GR3 - RET -ZERO DC '0' -NINE DC '9' -MAXLEN DC 10 ; 10桁の数値まで入力可能 -STR DS 1 -LEN DS 1 -NLEN DS 1 - END diff --git a/as/casl2lib/test/divl/divl0/call_divl.casl b/as/casl2lib/test/divl/divl0/call_divl.casl new file mode 100644 index 0000000..eb5fdea --- /dev/null +++ b/as/casl2lib/test/divl/divl0/call_divl.casl @@ -0,0 +1,18 @@ +;; CASL2LIB > DIVLを呼び出し、65535 / 256 の商と剰余を表示 +MAIN START +BEGIN LD GR1,A + LD GR2,B + CALL DIVL + JOV ERR + LD GR1,GR0 + CALL OUTA + LD GR1,GR3 + CALL OUTA + JUMP FIN +ERR OUT EMSG,ELEN +FIN RET +A DC 65535 +B DC 256 +EMSG DC 'error' +ELEN DC 5 + END diff --git a/as/casl2lib/test/inl/cmd b/as/casl2lib/test/inl/cmd new file mode 100644 index 0000000..9e91fb1 --- /dev/null +++ b/as/casl2lib/test/inl/cmd @@ -0,0 +1 @@ +casl2 cal_inl.casl $CASL2LIB/inl.casl $CASL2LIB/outl.casl < in.txt \ No newline at end of file diff --git a/doc/casl2lib/Define.mk b/doc/casl2lib/Define.mk new file mode 100644 index 0000000..efc1aeb --- /dev/null +++ b/doc/casl2lib/Define.mk @@ -0,0 +1,130 @@ +# autotest.mk > test_template > Define.mk +# 自動テスト用の変数、マクロ定義 + +ifndef DEFINE_INCLUDED +DEFINE_INCLUDED = 1 + +# 現在の日時 +DATE = $(shell date +"%F %T") + +# 現在のディレクトリー +CURRDIR = $(shell pwd) + +# Makefile +MAKEFILE := Makefile + +###################################################################### +# コマンド +###################################################################### + +CP ?= cp + +CAT ?= cat + +MKDIR ?= mkdir + +RM ?= rm -f + +ECHO ?= echo + +TIME ?= /usr/bin/time --quiet + +DIFF ?= diff -c + +DEV_NULL ?= /dev/null + +CHMOD ?= chmod + +GREP ?= grep + +LINECOUNT ?= wc -l + +FIND ?= find + +TR ?= tr + +EXPR ?= expr + +LINK ?= ln -s + +###################################################################### +# テストグループとテストでの共通マクロ +###################################################################### + +# chk_var_null: 引数がNULLの場合、エラー +# 用例: $(call chk_var_null,var) +define chk_var_null + $(if $1,,$(error NULL argument)) +endef + +# chk_file_ext: 指定されたファイルが実在する場合、エラー +# 用例: $(call chk_file_ext,file) +define chk_file_ext + $(if $(wildcard $1),$(error $1 exists in $(CURRDIR))) +endef + +# chk_file_notext: 指定されたファイルが実在しない場合、エラー +# 用例: $(call chk_file_notext,file) +define chk_file_notext + $(if $(wildcard $1),,$(error $1 not exists in $(CURRDIR))) +endef + +###################################################################### +# テストグループのディレクトリー +###################################################################### + +# テストグループとテストの変数を定義したMakefile +DEF_FILE := Define.mk + +# テストグループの変数を定義したMakefile +DEF_GROUP_FILE := Define_group.mk + +# テストの変数を定義したMakefile +DEF_TEST_FILE := Define_test.mk + +# テストのターゲットを定義したMakefile +TEST_MAKEFILE := Test.mk + +# すべてのMakefile群 +MAKEFILES := $(DEF_FILE) $(DEF_GROUP_FILE) $(DEF_TEST_FILE) $(TEST_MAKEFILE) + +MAKEFILES_ABS := $(foreach file,$(MAKEFILES),$(CURRDIR)/$(file)) + +# テストごとのMakefileでインクルードするMakefile群 +TEST_MAKEFILES := $(DEF_FILE) $(DEF_TEST_FILE) $(TEST_MAKEFILE) + +###################################################################### +# テストのディレクトリー +###################################################################### + +# テストコマンドファイル +CMD_FILE := cmd + +# テスト説明ファイル +DESC_FILE := desc.txt + +# テスト想定結果ファイル +TEST0_FILE := 0.txt + +# テスト結果ファイル +TEST1_FILE := 1.txt + +# テストの、想定結果と結果の差分ファイル +DIFF_FILE := diff.txt + +# テストエラーファイル +ERR_FILE := err.txt + +# テストログファイル +LOG_FILE := test.log + +# 実行時間ファイル +TIME_FILE := time.log + +# テスト詳細レポートファイル +DETAIL_FILE := detail.log + +# テストの結果として作成されるファイル群 +TEST_RES_FILES := $(TEST1_FILE) $(DIFF_FILE) $(ERR_FILE) $(LOG_FILE) $(DETAIL_FILE) $(TIME_FILE) + +endif diff --git a/doc/casl2lib/Define_group.mk b/doc/casl2lib/Define_group.mk new file mode 100644 index 0000000..f3cda2c --- /dev/null +++ b/doc/casl2lib/Define_group.mk @@ -0,0 +1,95 @@ +###################################################################### +# テストグループのディレクトリー +# ほかに、Define.mkでも一部定義 +###################################################################### + +# グループディレクトリー +GROUP_DIR := $(CURRDIR) + +# グループ名。ディレクトリ名から取得 +GROUP := $(notdir $(GROUP_DIR)) + +# テスト名。カレントディレクトリー内の、名前が大文字または.以外で始まるディレクトリー +TESTS = $(notdir $(shell $(FIND) -maxdepth 1 -name "[^A-Z.]*" -type d)) + +# テストグループログファイル +GROUP_LOG_FILE := $(shell $(ECHO) $(GROUP) | $(TR) '[a-z]' '[A-Z]').log + +# テストグループレポートファイル +GROUP_REPORT_FILE := Report.log + +# テストグループ実行時間ファイル +GROUP_TIME_FILE := $(shell echo $(GROUP) | $(TR) '[a-z]' '[A-Z]')_time.log + +# グループで、テスト結果として作成されるファイル群 +GROUP_RES_FILES := $(GROUP_LOG_FILE) $(GROUP_REPORT_FILE) $(GROUP_TIME_FILE) + +# テストごとのログファイル +TEST_LOG_FILES := $(foreach test,$(TESTS),$(test)/$(LOG_FILE)) + +###################################################################### +# テストグループのマクロ +###################################################################### + +# 指定したディレクトリーを作成 +# 用例: $(call create_dir,name) +define create_dir + $(call chk_var_null,$1) + $(call chk_file_ext,$1) + $(MKDIR) $1 +endef + +# リストで指定された親ディレクトリーにあるMakefileをインクルードするMakefileを作成 +# 用例: $(call create_makefile,file,list_include_file) +define create_makefile + $(RM) $1 + $(foreach infile,$2,$(ECHO) "include ../$(infile)" >>$1; ) +endef + +# テストごとのファイルをグループファイルに出力 +# 引数は、テストのリスト、グループファイル、テストファイル +# 用例: $(call group_log,files_test_log,file_group_log) +define group_log + $(foreach target,$1,$(call group_log_each,$(target),$2)) +endef + +# テストのログファイルをグループログファイルに出力。引数は、テスト、グループログファイル +# 用例: $(call group_log_each,file_test_log,file_group_log) +define group_log_each + if test -s $1; then $(CAT) $1 >>$2; else $(ECHO) $(dir $1)": no log" >>$2; fi + $(ECHO) >>$2; + +endef + +# 成功したテストの数。テストグループログファイルから取得 +SUCCESS_TEST = $(shell $(GREP) "^[^A-Z.].*: Test Success" $(GROUP_LOG_FILE) | $(LINECOUNT)) + +# 失敗したテストの数。テストグループログファイルから取得 +FAIL_TEST = $(shell $(GREP) "^[^A-Z.].*: Test Failure" $(GROUP_LOG_FILE) | $(LINECOUNT)) + +# すべてのテストの数 +ALL_TEST = $(shell $(EXPR) $(SUCCESS_TEST) + $(FAIL_TEST)) + +# テストごとの実行時間ファイル +TEST_TIME_FILES := $(foreach test,$(TESTS),$(test)/$(TIME_FILE)) + +# テストの結果を、グループログファイルを元にレポート。 +# 引数は、グループ名、グループログファイル、グループレポートファイル +# 用例: $(call group_report,name,file_log,file_report) +define group_report + $(ECHO) "$1: $(SUCCESS_TEST) / $(ALL_TEST) tests passed. Detail in $(GROUP_DIR)/$2" >$3; + if test $(FAIL_TEST) -eq 0; then $(ECHO) "$1: All tests are succeded." >>$3; fi +endef + +# リストで指定したディレクトリーでmakeを実行 +# 用例: $(call make_tests,list_dir,target) +define make_tests + $(foreach dir,$1,$(call make_test_each,$(dir),$2)) +endef + +# 指定したディレクトリーでmakeを実行 +# 用例: $(call make_test_each,tests,target) +define make_test_each + $(MAKE) $2 -sC $1; + +endef diff --git a/doc/casl2lib/Define_test.mk b/doc/casl2lib/Define_test.mk new file mode 100644 index 0000000..78394cb --- /dev/null +++ b/doc/casl2lib/Define_test.mk @@ -0,0 +1,80 @@ +###################################################################### +# マクロ +###################################################################### + +# 引数のファイルをチェックし、内容がない場合は削除 +# 用例: $(call rm_null,file) +define rm_null + if test ! -s $1; then $(RM) $1; fi +endef + +# 説明ファイルの内容を、引数のファイルに出力 +# 用例: $(call desc_log,file_out) +define desc_log + if test -s $(DESC_FILE); then $(CAT) $(DESC_FILE) >>$1; fi +endef + +# テスト実行の経過時間を、ファイルに出力して表示 +# 引数は、テスト名、コマンドファイル、出力ファイル +# 用例: $(call time_cmd,name,file_cmd,file_out) +define time_cmd + $(call chk_file_notext,$2) + $(CHMOD) u+x $2 + $(TIME) -f"$1: %E" -o $3 ./$2 >$(DEV_NULL) 2>&1 +endef + +# テスト実行コマンド。引数は、コマンドファイル、出力ファイル、エラーファイル +# コマンドファイルを実行し、標準出力を出力ファイルに保存。 +# エラー発生時は、エラー出力を出力ファイルとエラーファイルに保存。 +# 用例: $(call exec_cmd,file_cmd,file_out,file_err) +define exec_cmd + $(call chk_file_notext,$1) + $(CHMOD) u+x $1 + ./$1 >>$2 2>$3 + if test -s $3; then $(CAT) $3 >>$2; fi + $(call rm_null,$3) +endef + +# 2つのファイルを比較し、差分ファイルを作成 +# 引数は、2ファイルのリスト、差分ファイル +# 用例: $(call diff_files,files,file_out) +define diff_files + $(DIFF) $1 >$2 2>&1 + $(call rm_null,$2) +endef + +# 差分ファイルの内容をログファイルに出力 +# 引数は、テスト名、差分ファイル、ログファイル +# 用例: $(call test_log,name,file_diff,file_log) +define test_log + $(call desc_log,$3) + if test ! -s $2; then RES=Success; else RES=Failure; fi; $(ECHO) "$1: Test $$RES $(DATE)" >>$3 + $(ECHO) "Detail in $(CURRDIR)/$(DETAIL_FILE)" >>$3 +endef + +# NODISPが設定されていない時は、ログファイルを表示 +# 引数は、ログファイル +# 用例: $(call disp_test_log,file_log) +define disp_test_log + $(if $(NODISP),,$(CAT) $1) +endef + +# ファイル群から、ファイル名とファイルの内容を出力 +# 引数は、対象ファイル群、出力ファイル +# 用例: $(call report_files,list_file_target,file_out) +define report_files + $(call chk_file_ext,$2) + $(foreach tfile,$1,$(call report_file,$(tfile),$2)) +endef + +# ファイル名とファイルの内容を出力 +# 引数は、対象ファイル、出力ファイル +# 用例: $(call report_file,file_target,file_out) +define report_file + $(call chk_var_null,$1) + if test -s $1; then $(ECHO) "== $1 ==" >>$2; $(call echo_hr,$2); cat $1 >>$2; $(call echo_hr,$2); $(ECHO) >>$2; fi +endef + +define echo_hr + $(ECHO) "----------------------------------------------------------------------" >>$1 +endef diff --git a/doc/casl2lib/Makefile b/doc/casl2lib/Makefile new file mode 100644 index 0000000..e22d03c --- /dev/null +++ b/doc/casl2lib/Makefile @@ -0,0 +1,52 @@ +# autotest.mk > template > Group.mk +# テストグループのMakefile +# +# オペレーター +# make : すべてのテストを実施し、ログファイルを作成 +# make check : ↓ +# make create : TESTNAMEで指定されたテストを新規に作成 +# make set : すべてのテストの、想定結果を出力 +# make checkeach: すべてのテストを実施 +# make report : ログファイルから、テストの結果をレポート +# make clean : すべてのテストで、"make" で生成されたファイルをクリア +# make cleanall: すべてのテストで、"make" と "make set" で生成されたファイルをクリア + +SHELL = /bin/sh + +include Define.mk +include Define_group.mk + +.PHONY: check checkall time create clean cleantime + +check checkall: clean $(GROUP_REPORT_FILE) + @$(CAT) $(GROUP_REPORT_FILE) + +time: cleantime $(GROUP_TIME_FILE) + @$(CAT) $(GROUP_TIME_FILE) + +create: + @$(call create_dir,$(TEST)) + @$(call create_makefile,$(TEST)/$(MAKEFILE),$(TEST_MAKEFILES)) + +clean: + @$(call make_tests,$(TESTS),$@) + @$(RM) $(GROUP_RES_FILES) + +cleantime: + @$(call make_tests,$(TESTS),$@) + @$(RM) $(GROUP_TIME_FILE) + +$(GROUP_REPORT_FILE): $(GROUP_LOG_FILE) + @$(call group_report,$(GROUP),$^,$@) + +$(GROUP_LOG_FILE): $(TEST_LOG_FILES) + @$(call group_log,$^,$@) + +$(TEST_LOG_FILES): + @$(MAKE) $(MAKECMDGOALS) -sC $(dir $@) NODISP=1 + +$(GROUP_TIME_FILE): $(TEST_TIME_FILES) + @$(call group_log,$^,$@) + +$(TEST_TIME_FILES): + @$(MAKE) time -sC $(dir $@) diff --git a/doc/casl2lib/Test.mk b/doc/casl2lib/Test.mk new file mode 100644 index 0000000..edfa278 --- /dev/null +++ b/doc/casl2lib/Test.mk @@ -0,0 +1,65 @@ +# autotest.mk > test_template > Test.mk +# 自動テスト用のMakefile +# +# 要: Define.mk Define_test.mk +# +# オペレーター +# make : CMDの標準出力をTEST1_FILEに保存したあと、TEST0_FILEとの差分を比較し、結果をLOG_FILEに出力 +# make check : ↓ +# make set : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は実行しない +# make reset : CMDの標準出力をTEST0_FILEに保存。TEST0_FILEが存在する場合は上書き +# make time : CMDの実行にかかった時間をTIME_FILEに保存し、出力 +# make cleantime: "make time" で作成されたファイルをクリア +# make clean : "make" で作成されたファイルをクリア +# make cleanall: "make" と "make set" で作成されたファイルをクリア + +SHELL = /bin/sh + +# テスト名。カレントディレクトリー名から取得 +TEST = $(notdir $(CURRDIR)) + +.PHONY: check set reset time cleantime clean cleanall + +check: clean $(DETAIL_FILE) + @$(call disp_test_log,$(LOG_FILE)) + +checkall: check $(TIME_FILE) + @$(CAT) $(TIME_FILE) >>$(LOG_FILE) + @$(call disp_test_log,$(LOG_FILE)) + +set: $(TEST0_FILE) + @$(CAT) $^ + +reset: cleanall $(TEST0_FILE) + @$(CAT) $(TEST0_FILE) + +time: cleantime $(TIME_FILE) + +cleantime: + @$(RM) $(TIME_FILE) + +clean: + @$(RM) $(TEST_RES_FILES) + +cleanall: clean + @$(RM) $(TEST0_FILE) + +$(CMD_FILE): + @$(call chk_file_notext,$@) + @$(CHMOD) u+x $@ + +$(TEST0_FILE) $(TEST1_FILE): $(CMD_FILE) + @-$(call exec_cmd,$^,$@,$(ERR_FILE)) + +$(DIFF_FILE): $(TEST0_FILE) $(TEST1_FILE) + @$(call chk_file_notext,$(TEST0_FILE)) + @-$(call diff_files,$^,$@) + +$(LOG_FILE): $(DIFF_FILE) + @$(call test_log,$(TEST),$^,$@) + +$(DETAIL_FILE): $(LOG_FILE) + @$(call report_files,$(LOG_FILE) $(CMD_FILE) $(TEST0_FILE) $(ERR_FILE) $(DIFF_FILE) $(TEST1_FILE),$@) + +$(TIME_FILE): $(CMD_FILE) + @-$(call time_cmd,$(TEST),$^,$@) diff --git a/doc/casl2lib/abs/0.txt b/doc/casl2lib/abs/0.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/doc/casl2lib/abs/0.txt @@ -0,0 +1 @@ +1 diff --git a/doc/casl2lib/abs/Makefile b/doc/casl2lib/abs/Makefile new file mode 100644 index 0000000..e38b63c --- /dev/null +++ b/doc/casl2lib/abs/Makefile @@ -0,0 +1,3 @@ +include ../Define.mk +include ../Define_test.mk +include ../Test.mk diff --git a/doc/casl2lib/abs/call_abs.casl b/doc/casl2lib/abs/call_abs.casl new file mode 100644 index 0000000..251ee3d --- /dev/null +++ b/doc/casl2lib/abs/call_abs.casl @@ -0,0 +1,8 @@ +;;; CASL2LIB > ABSを呼び出し、-1の絶対値を表示 +MAIN START + LD GR1,A + CALL ABS + CALL OUTA + RET +A DC -1 + END diff --git a/doc/casl2lib/abs/cmd b/doc/casl2lib/abs/cmd new file mode 100755 index 0000000..700039d --- /dev/null +++ b/doc/casl2lib/abs/cmd @@ -0,0 +1,3 @@ +PATH=../../..:$PATH +CASL2LIBDIR=../../../as/casl2lib +casl2 call_abs.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/outa.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/rev.casl diff --git a/doc/casl2lib/addl32/0.txt b/doc/casl2lib/addl32/0.txt new file mode 100644 index 0000000..97b23a9 --- /dev/null +++ b/doc/casl2lib/addl32/0.txt @@ -0,0 +1,15 @@ +MAIN START + LAD GR1,A + LAD GR2,B + CALL ADDL32 + LD GR2,GR0 + LD GR1,1,GR2 + CALL OUTL + LD GR1,0,GR2 + CALL OUTL + RET +A DC 6,10 +B DC 2,65530 + END +4 +9 diff --git a/doc/casl2lib/addl32/Makefile b/doc/casl2lib/addl32/Makefile new file mode 100644 index 0000000..e38b63c --- /dev/null +++ b/doc/casl2lib/addl32/Makefile @@ -0,0 +1,3 @@ +include ../Define.mk +include ../Define_test.mk +include ../Test.mk diff --git a/doc/casl2lib/addl32/call_addl32.casl b/doc/casl2lib/addl32/call_addl32.casl new file mode 100644 index 0000000..6072b8b --- /dev/null +++ b/doc/casl2lib/addl32/call_addl32.casl @@ -0,0 +1,13 @@ +MAIN START + LAD GR1,A + LAD GR2,B + CALL ADDL32 + LD GR2,GR0 + LD GR1,1,GR2 + CALL OUTL + LD GR1,0,GR2 + CALL OUTL + RET +A DC 6,10 +B DC 2,65530 + END diff --git a/doc/casl2lib/addl32/cmd b/doc/casl2lib/addl32/cmd new file mode 100755 index 0000000..ac6c38a --- /dev/null +++ b/doc/casl2lib/addl32/cmd @@ -0,0 +1,3 @@ +PATH=../../../..:$PATH +CASL2LIBDIR=../../../../as/casl2lib +cat call_addl32.casl && casl2 call_addl32.casl $CASL2LIBDIR/addl32.casl $CASL2LIBDIR/outl.casl diff --git a/doc/casl2lib/diva/0.txt b/doc/casl2lib/diva/0.txt new file mode 100644 index 0000000..bab389d --- /dev/null +++ b/doc/casl2lib/diva/0.txt @@ -0,0 +1,2 @@ +-128 +-127 diff --git a/doc/casl2lib/diva/Makefile b/doc/casl2lib/diva/Makefile new file mode 100644 index 0000000..e38b63c --- /dev/null +++ b/doc/casl2lib/diva/Makefile @@ -0,0 +1,3 @@ +include ../Define.mk +include ../Define_test.mk +include ../Test.mk diff --git a/doc/casl2lib/diva/call_diva.casl b/doc/casl2lib/diva/call_diva.casl new file mode 100644 index 0000000..13acb85 --- /dev/null +++ b/doc/casl2lib/diva/call_diva.casl @@ -0,0 +1,18 @@ +;; CASL2LIB > DIVAを呼び出し、-32767 / 255 の商と剰余を表示 +MAIN START +BEGIN LD GR1,A + LD GR2,B + CALL DIVA + JOV ERR + LD GR1,GR0 + CALL OUTA + LD GR1,GR3 + CALL OUTA + JUMP FIN +ERR OUT EMSG,ELEN +FIN RET +A DC -32767 +B DC 255 +EMSG DC 'error' +ELEN DC 5 + END diff --git a/doc/casl2lib/diva/cmd b/doc/casl2lib/diva/cmd new file mode 100755 index 0000000..c758964 --- /dev/null +++ b/doc/casl2lib/diva/cmd @@ -0,0 +1,3 @@ +PATH=../../..:$PATH +CASL2LIBDIR=../../../as/casl2lib +casl2 call_diva.casl $CASL2LIBDIR/diva.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outa.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/rev.casl diff --git a/doc/casl2lib/divl/0.txt b/doc/casl2lib/divl/0.txt new file mode 100644 index 0000000..130f552 --- /dev/null +++ b/doc/casl2lib/divl/0.txt @@ -0,0 +1,2 @@ +256 +254 diff --git a/doc/casl2lib/divl/Makefile b/doc/casl2lib/divl/Makefile new file mode 100644 index 0000000..e38b63c --- /dev/null +++ b/doc/casl2lib/divl/Makefile @@ -0,0 +1,3 @@ +include ../Define.mk +include ../Define_test.mk +include ../Test.mk diff --git a/doc/casl2lib/divl/call_divl.casl b/doc/casl2lib/divl/call_divl.casl new file mode 100644 index 0000000..2347a43 --- /dev/null +++ b/doc/casl2lib/divl/call_divl.casl @@ -0,0 +1,18 @@ +;; CASL2LIB > DIVLを呼び出し、65534 / 255 の商と剰余を表示 +MAIN START +BEGIN LD GR1,A + LD GR2,B + CALL DIVL + JOV ERR + LD GR1,GR0 + CALL OUTL + LD GR1,GR3 + CALL OUTL + JUMP FIN +ERR OUT EMSG,ELEN +FIN RET +A DC 65534 +B DC 255 +EMSG DC 'error' +ELEN DC 5 + END diff --git a/doc/casl2lib/divl/cmd b/doc/casl2lib/divl/cmd new file mode 100755 index 0000000..9936525 --- /dev/null +++ b/doc/casl2lib/divl/cmd @@ -0,0 +1,3 @@ +PATH=../../..:$PATH +CASL2LIBDIR=../../../as/casl2lib +casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl $CASL2LIBDIR/rev.casl diff --git a/doc/casl2lib/inl/0.txt b/doc/casl2lib/inl/0.txt new file mode 100644 index 0000000..a3de2d7 --- /dev/null +++ b/doc/casl2lib/inl/0.txt @@ -0,0 +1,14 @@ +0 +1 +2 +10 +12 +32767 +32768 +65535 +Over 65535 +Over 65535 +Not A Number +Not A Number +12345 +Str too long. Stop diff --git a/doc/casl2lib/inl/Makefile b/doc/casl2lib/inl/Makefile new file mode 100644 index 0000000..e38b63c --- /dev/null +++ b/doc/casl2lib/inl/Makefile @@ -0,0 +1,3 @@ +include ../Define.mk +include ../Define_test.mk +include ../Test.mk diff --git a/doc/casl2lib/inl/call_inl.casl b/doc/casl2lib/inl/call_inl.casl new file mode 100644 index 0000000..28c6a9c --- /dev/null +++ b/doc/casl2lib/inl/call_inl.casl @@ -0,0 +1,25 @@ +;;; casl2 inl.casl ../casl2lib/inl.casl ../casl2lib/outl.casl +MAIN START +LOOP CALL INL ; GR1に数値、GR0に文字列の長さ + JOV OV + AND GR0,GR0 + JZE FIN + CPL GR0,=#FFFF + JZE NAN + CALL OUTL + JUMP LOOP +OV CPL GR0,=#FFFF + JZE LENOV + OUT OVMSG,MLEN1 + JUMP LOOP +NAN OUT NANMSG,MLEN2 + JUMP LOOP +LENOV OUT LENOVMSG,MLEN3 +FIN RET +OVMSG DC 'Over 65535' +MLEN1 DC 10 +NANMSG DC 'Not A Number' +MLEN2 DC 12 +LENOVMSG DC 'Str too long. Stop' +MLEN3 DC 18 + END diff --git a/doc/casl2lib/inl/cmd b/doc/casl2lib/inl/cmd new file mode 100755 index 0000000..b17a5b0 --- /dev/null +++ b/doc/casl2lib/inl/cmd @@ -0,0 +1,3 @@ +PATH=../../..:$PATH +CASL2LIBDIR=../../../as/casl2lib +casl2 -M 720 call_inl.casl $CASL2LIBDIR/inl.casl $CASL2LIBDIR/outl.casl $CASL2LIBDIR/str2l.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/rev.casl $CASL2LIBDIR/mull.casl 2.4 casl2、comet2、dumpwordのビルド
  • 2.5 casl2の実行テスト
  • 2.6 詳細なテスト -
  • 2.7 環境変数PATHの設定 +
  • 2.7 環境変数の設定 +
  • 3 YACASL2の使い方 -
  • 5.2 ADDL32 - addl32.casl - -
  • 5.3 DIVA -diva.casl +
  • 5.2 DIVA - diva.casl -
  • 5.4 DIVL - divl.casl +
  • 5.3 DIVL - divl.casl -
  • 5.5 INL - inl.casl -
  • 5.6 L2STR - l2str.casl -
  • 5.7 MAX - max.casl -
  • 5.8 MINIM - minim.casl -
  • 5.9 MULA - mula.casl -
  • 5.10 MULL - mull.casl -
  • 5.11 OUTA - outa.casl -
  • 5.12 OUTB - outb.casl -
  • 5.13 OUTD_Q15 - outd_q15.casl -
  • 5.14 OUTL - outl.casl -
  • 5.15 REV - rev.casl -
  • 5.16 STR2L - str2l.casl +
  • 5.4 INL - inl.casl + +
  • 5.5 L2STR - l2str.casl +
  • 5.6 MAX - max.casl +
  • 5.7 MINIM - minim.casl +
  • 5.8 MULA - mula.casl +
  • 5.9 MULL - mull.casl +
  • 5.10 OUTA - outa.casl +
  • 5.11 OUTB - outb.casl +
  • 5.12 OUTD_Q15 - outd_q15.casl +
  • 5.13 OUTL - outl.casl +
  • 5.14 REV - rev.casl +
  • 5.15 STR2L - str2l.casl
  • @@ -259,7 +264,7 @@ YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試 GitHub/j8takagi/YACASL2のダウンロードページ -

    続けて、対応するmd5sumファイルをダウンロードします(2010年3月6日現在、j8takagi-YACASL2-6323ce4.tar.gz.md5sum)。 +

    続けて、対応するmd5sumファイルをダウンロードします。

    @@ -336,24 +341,42 @@ YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試 /dumpword/Test.log All tests are succeded. -

    +

    -

    2.7 環境変数PATHの設定

    +

    2.7 環境変数の設定

    -

    環境変数PATHにYACASL2のディレクトリを追加すると、どのディレクトリでもcasl2、comet2、dumpwordを実行できます。 +

    環境変数を設定することで、YACASL2が使いやすくなります。環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されます。 +するときは、 +環境変数PATHにYACASL2のディレクトリを追加すると、どのディレクトリでもcasl2、comet2、dumpwordを実行できます。また、 -

    環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。 +

    シェルの確認

    + +

    環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。

      $ echo $SHELL
       /bin/bash
     
    -

    現在もっとも多く使われているシェルは、BASHでしょう。BASHでは、次のコマンドを実行すると環境変数PATHにYACASL2のディレクトリが追加されます。 +

    現在もっとも多く使われているシェルは、BASHでしょう。以下、BASHでの設定方法を記載します。 + +

    PATHにYACASL2のディレクトリを追加

    + +

    PATHにYACASL2のディレクトリを追加すると、どのディレクトリでもディレクトリを指定せずにcasl2、comet2、dumpwordを実行できます。YACASL2をホームディレクトリ~にインストールしたときは、次のコマンドで設定できます。

      $ PATH=$PATH:~/yacasl2 && export PATH
     
    -

    シェルの初期設定ファイルに上記のコマンドを追加すれば、今後ログインした後は自動的にどのディレクトリでも casl2、comet2、dumpwordを実行できます。BASHではホームディレクトリにある.bashrcが初期設定ファイルのため、次のコマンドで追加されます。 +

    BASHではホームディレクトリにある.bashrcが初期設定ファイルです。次のコマンドで追加できます。

      $ echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc
    +
    +

    CASL2LIBの設定

    + +

    環境変数CASL2LIBを設定しておけば、後述するCASL2LIBを利用するときの手間が小さくなります。YACASL2をホームディレクトリ~にインストールしたときは、次のコマンドで設定できます。 + +

      $ CASL2LIB=~/yacasl2/as/casl2lib && export CASL2LIB
    +
    +

    BASHの初期設定ファイル.bashrcには、次のコマンドで追加できます。 + +

      $  echo 'CASL2LIB=~/yacasl2/as/casl2lib && export CASL2LIB' >>~/.bashrc
     

    @@ -665,12 +688,12 @@ YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試

      $ dumpword 72
           72:     72 = #0048 = 0000000001001000 = 'H'
     
    -

    マイナスの数は、次のように指定します。 +

    マイナスの数は、次のように--を付けて指定します。

      $ dumpword -- -72
          -72:    -72 = #FFB8 = 1111111110111000
     
    -

    16進数は、次のように指定します。 +

    16進数は、次のように次のように'で囲み#を付けて指定します。

      $ dumpword '#0048'
        #0048:     72 = #0048 = 0000000001001000 = 'H'
    @@ -739,25 +762,53 @@ YACASL2のコマンドとオプションについて解説します。
          
    -s
    --source
    CASLファイルの内容を表示します。 -
    -l
    --label
    ラベルの一覧を表示し、ほかの作業を続行します。 +
    -l
    --label
    ラベルの一覧を次の形式で表示します。表示後、ほかの作業を続行します。 -
    -L
    --labelonly
    ラベルの一覧を表示して終了します。 +
           <プログラム名>.<ラベル名> ---> <アドレスの16進数表現>
    +
    +
    -L
    --labelonly
    -lと同じ形式でラベルの一覧を表示します。表示後、ほかの作業は続行せず、終了します。
    -a
    --assembledetail
    アセンブル詳細結果を表示し、ほかの作業を続行します。 -
    -A
    --show-all
    アセンブル詳細結果を表示して終了します。 +
    -A
    --assembledetailonly
    アセンブル詳細結果を表示して終了します。 + +
    -o<OBJECTFILE>
    --assembleout<OBJECTFILE>
    アセンブル結果をオブジェクトファイル<OBJECTFILE>に出力し、ほかの作業を続行します。出力されたオブジェクトファイルは、comet2で実行できます。オブジェクトファイルを指定しない場合、出力先はa.oです。オブジェクトファイルは1つだけ指定できます。 + +
    -O[<OBJECTFILE>]
    --assembleoutonly[<OBJECTFILE>]
    アセンブル結果をオブジェクトファイル<OBJECTFILE>に出力し、終了します。出力されたオブジェクトファイルは、comet2で実行できます。オブジェクトファイルを指定しない場合、出力先はa.oです。オブジェクトファイルは1つだけ指定できます。 + +
    -t
    --trace
    --tracearithmetic
    プログラム実行中のレジスタの値を次の形式で表示します。<値の10進数表現>は符号の付いた10進数です。範囲は-32768から32767です。 + +
           <PR値の16進数表現>: <レジスタ>: <値の10進数表現> = <値の16進数表現> = <値の2進数表現>[ ='文字']
    +
    +
      +
    • <PR値の16進数表現>と<値の16進数表現>は、先頭に#が付いた4けたの16進数で表されます。範囲は、#0000から#FFFFです + +
    • <値の2進数表現>は、16けたの2進数で表されます。範囲は、0000000000000000から1111111111111111です + +
    • [ ='文字']は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 +
    + +

    表示されるレジスタには、次の種類があります。 -

    -o<OBJECTFILE>
    --assembleout
    アセンブル結果をオブジェクトファイル<OBJECTFILE>に出力し、ほかの作業を続行します。出力されたオブジェクトファイルは、comet2で実行できます。オブジェクトファイルを指定しない場合、出力先はa.oです。オブジェクトファイルは1つだけ指定できます。 +
    +
    GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7
    汎用レジスタ -
    -O<OBJECTFILE>
    --assembleoutonly
    アセンブル結果をオブジェクトファイル<OBJECTFILE>に出力し、終了します。出力されたオブジェクトファイルは、comet2で実行できます。オブジェクトファイルを指定しない場合、出力先はa.oです。オブジェクトファイルは1つだけ指定できます。 +
    SP
    スタックポインタ -
    -t
    --trace
    --tracearithmetic
    実行時のレジスタをトレースします。レジスタには、GR0〜GR7という8個の汎用レジスタと、SP(スタックポインタ)、PR(プログラムレジスタ)、FR(フラグレジスタ)があります。レジストリの内容は、-32,768〜32,767の範囲の整数、#0000〜#FFFFの範囲の16進数、2進数で表示されます。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。-32768〜32767の範囲の整数を表示するので、算術演算の結果を確認する場合に使えます。 +
    PR
    プログラムレジスタ -
    -T
    --tracelogical
    -tと同じく、実行時のレジスタをトレースします。-tと異なり0〜65,535の範囲の整数を表示するので、論理演算の結果を確認する場合に使えます。 +
    FR
    フラグレジスタ +
    + +

    例えば、次のように表示されます。 + +

           #0002: GR1:      3 = #0003 = 0000000000000011
    +
    +
    -T
    --tracelogical
    -tと同じように、プログラム実行中のレジスタの値を表示します。ただし、-tと異なり、<値の10進数表現>は符号の付かない10進数です。値の範囲は0から65535です。
    -d
    --dump
    メモリの内容をすべて表示します。 -
    -M <MEMORYSIZE>
    --memorysize <MEMORYSIZE>
    アセンブルおよび実行時のメモリサイズ<MEMORYSIZE>を0〜65,535の範囲で指定します。指定しない場合、メモリサイズは512です。 +
    -M <MEMORYSIZE>
    --memorysize <MEMORYSIZE>
    アセンブルおよび実行時のメモリサイズ<MEMORYSIZE>を0から65535の範囲で指定します。指定しない場合、512です。
    -C <CLOCKS>
    --clocks <CLOCKS>
    実行時のクロック周波数<CLOCKS>を0より大きい整数で指定します。指定しない場合、クロック周波数は5000000です。 @@ -780,15 +831,41 @@ YACASL2のコマンドとオプションについて解説します。

    comet2は、次のオプションを指定できます。

    -
    -t
    --trace
    --tracearithmetic
    実行時のレジスタをトレースします。レジスタには、GR0〜GR7という8個の汎用レジスタと、SP(スタックポインタ)、PR(プログラムレジスタ)、FR(フラグレジスタ)があります。レジストリの内容は、-32,768〜32,767の範囲の整数、#0000〜#FFFFの範囲の16進数、2進数で表示されます。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。-32768〜32767の範囲の整数が表示されるので、算術演算の結果を確認する場合に使えます。 +
    -t
    --trace
    --tracearithmetic
    プログラム実行中のレジスタの値を次の形式で表示します。<値の10進数表現>は符号の付いた10進数です。範囲は-32768から32767です。 + +
           <PR値の16進数表現>: <レジスタ>: <値の10進数表現> = <値の16進数表現> = <値の2進数表現>[ ='文字']
    +
    +
      +
    • <PR値の16進数表現>と<値の16進数表現>は、先頭に#が付いた4けたの16進数で表されます。範囲は、#0000から#FFFFです + +
    • <値の2進数表現>は、16けたの2進数で表されます。範囲は、0000000000000000から1111111111111111です + +
    • [ ='文字']は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 +
    + +

    例えば、次のように表示されます。 + +

           #0002: GR1:      3 = #0003 = 0000000000000011
    +
    +

    表示されるレジスタには、次の種類があります。 -

    -T
    --tracelogical
    -tと同じく、実行時のレジスタをトレースします。-tと異なり0〜65,535の範囲の整数を表示するので、論理演算の結果を確認する場合に使えます。 +
    +
    GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7
    汎用レジスタ + +
    SP
    スタックポインタ + +
    PR
    プログラムレジスタ + +
    FR
    フラグレジスタ +
    + +
    -T
    --tracelogical
    -tと同じように、プログラム実行中のレジスタの値を表示します。ただし、-tと異なり、<値の10進数表現>は符号の付かない10進数です。値の範囲は0から65535です。
    -d
    --dump
    メモリの内容をすべて表示します。 -
    -M <MEMORYSIZE>
    --memorysize <MEMORYSIZE>
    実行時のメモリサイズ<MEMORYSIZE>を0〜65,535の範囲で指定します。指定しない場合、メモリサイズは512です。 +
    -M <MEMORYSIZE>
    --memorysize <MEMORYSIZE>
    実行時のメモリサイズ<MEMORYSIZE>を0から65535の範囲で指定します。指定しない場合、512です。 -
    -C <CLOCKS>
    --clocks <CLOCKS>
    実行時のクロック周波数<CLOCKS>を0より大きい整数で指定します。指定しない場合、クロック周波数は5,000,000です。 +
    -C <CLOCKS>
    --clocks <CLOCKS>
    実行時のクロック周波数<CLOCKS>を0より大きい整数で指定します。指定しない場合、5000000です。
    -h
    --help
    comet2の使用方法を表示して終了します。
    @@ -798,7 +875,7 @@ YACASL2のコマンドとオプションについて解説します。

    4.3 dumpword

    -dumpwordは、引数として指定された数値を、整数、#0000〜#FFFFの範囲の16進数、2進数で表示します。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。引数は、10進数または先頭に「#」の付いた16進数で指定します。表示される整数は、オプションにより-32,768〜32,767または0〜65,535の範囲です。オプションなしの場合は、-32,768〜32,767です。 +dumpwordは、引数として指定された数値を、整数、#0000〜#FFFFの範囲の16進数、2進数で表示します。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。引数は、10進数または先頭に「#」の付いた16進数で指定します。表示される整数は、オプションにより符号付きか符号なしかを指定します。オプションなしの場合は符号付きです。整数の範囲は、符号付きの場合は-32768から32767、符号なしの場合は0から65535です。

      $ dumpword 10
     
    @@ -824,22 +901,22 @@ YACASL2のコマンドとオプションについて解説します。

    5.1 ABS - abs.casl

    -

    入力された整数を絶対値に変換して出力 +

    GR1を符号付き整数とみなし、絶対値に変換

    入力

    -
    GR1
    -32768〜32767の整数 +
    GR1
    符号付き整数

    出力

    -
    GR1
    入力された整数の絶対値 +
    GR1
    入力された値の絶対値 -
    OF
    入力されたGR1が-32768の場合、1 +
    OF
    入力された値が-32768の場合、1 -
    SF
    入力されたGR1が負数(-32767〜-1)の場合、1 +
    SF
    入力された値が負数(-32767から-1)の場合、1

    依存する副プログラム

    @@ -848,259 +925,240 @@ YACASL2のコマンドとオプションについて解説します。

    使用例

    -
      ;;; ABSを呼び出す
    +
      ;;; CASL2LIB > ABSを呼び出し、-1の絶対値を表示
       MAIN    START
    -          LAD     GR2,0
    -  MLOOP   CPA     GR2,MLEN
    -          JZE     MFIN
    -          LD      GR1,MVAL,GR2
    -          CALL    OUTA
    +          LD      GR1,A
               CALL    ABS
    -          JOV     PUTOV
    -          JMI     PUTM
    -          OUT     PLUS,=1
    -          JUMP    PUTD
    -  PUTM    OUT     MINUS,=1
    -          JUMP    PUTD
    -  PUTOV   OUT     OV,=2
    -  PUTD    CALL    OUTA
    -          OUT     SEP,MLEN
    -          LAD     GR2,1,GR2
    -          JUMP    MLOOP
    -  MFIN    RET
    -  MVAL    DC      12,-12,1,-1,32767,-32767,0,-32768
    -  MLEN    DC      8
    -  SEP     DC      '--------'
    -  PLUS    DC      '+'
    -  MINUS   DC      '-'
    -  OV      DC      'OV'
    +          CALL    OUTA
    +          RET
    +  A       DC      -1
               END
     
    -
      ../../../../casl2 abs.casl ../../../../as/casl2lib/outa.casl
    -  12
    -  +
    -  12
    -  --------
    -  -12
    -  -
    -  12
    -  --------
    +
      $ casl2 call_abs.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/outa.casl
    +    $CASL2LIBDIR/divl.casl $CASL2LIBDIR/rev.casl
       1
    -  +
    -  1
    -  --------
    -  -1
    -  -
    -  1
    -  --------
    -  32767
    -  +
    -  32767
    -  --------
    -  -32767
    -  -
    -  32767
    -  --------
    -  0
    -  +
    -  0
    -  --------
    -  -32768
    -  OV
    -  -32768
    -  --------
    -
    -

    +

    +

    -

    5.2 ADDL32 - addl32.casl

    +

    5.2 DIVA - diva.casl

    -

    32ビットの値を、連続する2語の領域に格納 +

    符号付き整数の割算を筆算方式で行う

    入力

    -
    GR1
    32ビット値1の先頭アドレス +
    GR1
    被除数 -
    GR2
    32ビット値2の先頭アドレス +
    GR2
    除数

    出力

    -
    GR0
    和の先頭アドレス +
    GR0
    商 + +
    GR3
    剰余 + +
    OF
    次の場合、1 +
      +
    • GR2が0 -
      OF
      上位アドレスでオーバーフローした場合、1 +
    • GR1が-32768 -
      SF
      和が負数(-32767〜-1)の場合、1 +
    • GR2が-32768 +
    + +
    SF
    商が負数(-32767から-1)の場合、1 -
    ZF
    和が0の場合、1 +
    ZF
    商が0の場合、1
    +

    依存する副プログラム

    + +
      +
    • DIVL +
    +

    使用例

    -
      MAIN    START
    -          LAD     GR1,A
    -          LAD     GR2,B
    -          CALL    ADDL32
    -          LD      GR2,GR0
    -          LD      GR1,1,GR2
    -          CALL    OUTL
    -          LD      GR1,0,GR2
    -          CALL    OUTL
    -          RET
    -  A       DC      6,10
    -  B       DC      2,65530
    +
      ;; CASL2LIB > DIVAを呼び出し、-32767 / 255 の商と剰余を表示
    +  MAIN    START
    +  BEGIN   LD      GR1,A
    +          LD      GR2,B
    +          CALL    DIVA
    +          JOV     ERR
    +          LD      GR1,GR0
    +          CALL    OUTA
    +          LD      GR1,GR3
    +          CALL    OUTA
    +          JUMP    FIN
    +  ERR     OUT     EMSG,ELEN
    +  FIN     RET
    +  A       DC      -32767
    +  B       DC      255
    +  EMSG    DC      'error'
    +  ELEN    DC      5
               END
     
    -
      4
    -  9
    +
      $ casl2 call_diva.casl $CASL2LIBDIR/diva.casl $CASL2LIBDIR/divl.casl
    +    $CASL2LIBDIR/outa.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/rev.casl
    +  -128
    +  -127
     
    -

    依存する副プログラム

    - -

    なし +

    -

    +

    5.3 DIVL - divl.casl

    -

    5.3 DIVA -diva.casl

    - -

    -32,767〜32,767の範囲にある整数の割算(筆算方式)を行う +

    符号なし整数の割算を筆算方式で行う

    入力

    -
    GR1
    被除数 +
    GR1
    被除数 -
    GR2
    除数 +
    GR2
    除数

    出力

    -
    GR0
    商 +
    GR0
    商 -
    GR3
    剰余 +
    GR3
    剰余 -
    OF
    除数が0の場合、1 +
    OF
    GR2が0の場合、1 -
    SF
    商が負数(-32767〜-1)の場合、1 +
    SF
    商が32768から65535の場合、1 -
    ZF
    商が0の場合、1 +
    ZF
    商が0の場合、1

    依存する副プログラム

    -
      -
    • DIVL -
    +

    なし - - - - - - - - - - - - - - - - - - - -

    - -

    5.4 DIVL - divl.casl

    - -

    0〜65,535の範囲にある整数の割算(筆算方式)を行う +

    使用例

    + +
      ;; CASL2LIB > DIVLを呼び出し、65534 / 255 の商と剰余を表示
    +  MAIN    START
    +  BEGIN   LD      GR1,A
    +          LD      GR2,B
    +          CALL    DIVL
    +          JOV     ERR
    +          LD      GR1,GR0
    +          CALL    OUTL
    +          LD      GR1,GR3
    +          CALL    OUTL
    +          JUMP    FIN        
    +  ERR     OUT     EMSG,ELEN
    +  FIN     RET
    +  A       DC      65534
    +  B       DC      255
    +  EMSG    DC      'error'
    +  ELEN	DC	5
    +          END
    +
    +
      $ casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl
    +    $CASL2LIBDIR/rev.casl
    +  256
    +  254
    +
    +

    + +

    5.4 INL - inl.casl

    + +

    符号なし整数の入力を受け付ける

    入力

    -
    GR1
    被除数 - -
    GR2
    除数 +
    標準入力
    符号なし整数

    出力

    -
    GR0
    商 - -
    GR3
    剰余 - -
    OF
    除数が0の場合、1 +
    GR1
    入力された符号なし整数 -
    SF
    商が32,768〜65535の場合、1 - -
    ZF
    商が0の場合、1 +
    GR0
    文字列の長さ。数字以外が入力された場合は#FFFF

    依存する副プログラム

    -

    なし +

      +
    • STR2L +

    使用例

    -
      MAIN    START
    -  BEGIN   LAD     GR1,101
    -          LAD     GR2,10
    +
      ;; CASL2LIB > DIVLを呼び出し、65534 / 255 の商と剰余を表示
    +  MAIN    START
    +  BEGIN   LD      GR1,A
    +          LD      GR2,B
               CALL    DIVL
    -          RET
    +          JOV     ERR
    +          LD      GR1,GR0
    +          CALL    OUTL
    +          LD      GR1,GR3
    +          CALL    OUTL
    +          JUMP    FIN        
    +  ERR     OUT     EMSG,ELEN
    +  FIN     RET
    +  A       DC      65534
    +  B       DC      255
    +  EMSG    DC      'error'
    +  ELEN	DC	5
               END
     
    -

    - -

    5.5 INL - inl.casl

    - -

    +

      $ casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl
    +    $CASL2LIBDIR/rev.casl
    +  256
    +  254
    +
    +

    -

    5.6 L2STR - l2str.casl

    +

    5.5 L2STR - l2str.casl

    -

    5.7 MAX - max.casl

    +

    5.6 MAX - max.casl

    -

    5.8 MINIM - minim.casl

    +

    5.7 MINIM - minim.casl

    -

    5.9 MULA - mula.casl

    +

    5.8 MULA - mula.casl

    -

    5.10 MULL - mull.casl

    +

    5.9 MULL - mull.casl

    -

    5.11 OUTA - outa.casl

    +

    5.10 OUTA - outa.casl

    -

    5.12 OUTB - outb.casl

    +

    5.11 OUTB - outb.casl

    -

    5.13 OUTD_Q15 - outd_q15.casl

    +

    5.12 OUTD_Q15 - outd_q15.casl

    -

    5.14 OUTL - outl.casl

    +

    5.13 OUTL - outl.casl

    -

    5.15 REV - rev.casl

    +

    5.14 REV - rev.casl

    -

    5.16 STR2L - str2l.casl

    +

    5.15 STR2L - str2l.casl

    diff --git a/doc/yacasl2.texi b/doc/yacasl2.texi index a097830..e79d678 100644 --- a/doc/yacasl2.texi +++ b/doc/yacasl2.texi @@ -110,7 +110,7 @@ YACASL2をインストールするには、Linux上で次の作業をします * Build:: @kbd{casl2}、@kbd{comet2}、@kbd{dumpword}のビルド * Simple Test:: @kbd{casl2}の実行テスト * Detail Test:: 詳細なテスト -* Path Setting:: 環境変数@code{PATH}の設定 +* Environment:: 環境変数の設定 @end menu @node Download, Verify, Install, Install @@ -127,7 +127,7 @@ YACASL2をインストールするには、Linux上で次の作業をします @end cartouche @end iftex -続けて、対応する@file{md5sum}ファイルをダウンロードします(2010年3月6日現在、@file{j8takagi-YACASL2-6323ce4.tar.gz.md5sum})。 +続けて、対応する@file{md5sum}ファイルをダウンロードします。 @node Verify, Expand, Download, Install @section YACASL2ファイルの検証 @@ -191,7 +191,7 @@ $ @kbd{./casl2 as/hello.casl} Hello, World! @end example -@node Detail Test, Path Setting, Simple Test, Install +@node Detail Test, Environment, Simple Test, Install @section 詳細なテスト 次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。 @@ -209,10 +209,16 @@ All tests are succeded. All tests are succeded. @end example -@node Path Setting,, Detail Test, Install -@section 環境変数@code{PATH}の設定 +@node Environment,, Detail Test, Install +@section 環境変数の設定 -環境変数@code{PATH}にYACASL2のディレクトリを追加すると、どのディレクトリでも@kbd{casl2}、@kbd{comet2}、@kbd{dumpword}を実行できます。 +環境変数を設定することで、YACASL2が使いやすくなります。環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されます。 +するときは、 +環境変数@code{PATH}にYACASL2のディレクトリを追加すると、どのディレクトリでも@kbd{casl2}、@kbd{comet2}、@kbd{dumpword}を実行できます。また、 + + + +@unnumberedsubsec シェルの確認 環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。 @@ -221,18 +227,38 @@ $ @kbd{echo $SHELL} /bin/bash @end example -現在もっとも多く使われているシェルは、BASHでしょう。BASHでは、次のコマンドを実行すると環境変数@code{PATH}にYACASL2のディレクトリが追加されます。 +現在もっとも多く使われているシェルは、BASHでしょう。以下、BASHでの設定方法を記載します。 + +@unnumberedsubsec @code{PATH}にYACASL2のディレクトリを追加 + +@code{PATH}にYACASL2のディレクトリを追加すると、どのディレクトリでもディレクトリを指定せずに@kbd{casl2}、@kbd{comet2}、@kbd{dumpword}を実行できます。YACASL2をホームディレクトリ@code{~}にインストールしたときは、次のコマンドで設定できます。 @example $ @kbd{PATH=$PATH:~/yacasl2 && export PATH} @end example -シェルの初期設定ファイルに上記のコマンドを追加すれば、今後ログインした後は自動的にどのディレクトリでも @kbd{casl2}、@kbd{comet2}、@kbd{dumpword}を実行できます。BASHではホームディレクトリにある@file{.bashrc}が初期設定ファイルのため、次のコマンドで追加されます。 +BASHではホームディレクトリにある@file{.bashrc}が初期設定ファイルです。次のコマンドで追加できます。 @example $ @kbd{echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc} @end example + +@unnumberedsubsec @code{CASL2LIB}の設定 + +環境変数@code{CASL2LIB}を設定しておけば、後述するCASL2LIBを利用するときの手間が小さくなります。YACASL2をホームディレクトリ@code{~}にインストールしたときは、次のコマンドで設定できます。 + +@example +$ @kbd{CASL2LIB=~/yacasl2/as/casl2lib && export CASL2LIB} +@end example + +BASHの初期設定ファイル@file{.bashrc}には、次のコマンドで追加できます。 + +@example +$ @kbd{ echo 'CASL2LIB=~/yacasl2/as/casl2lib && export CASL2LIB' >>~/.bashrc} +@end example + + @node Usage, Command Manual, Install, Top @chapter YACASL2の使い方 YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリの中にある@file{as}ディレクトリからコピーして作成することもできます。 @@ -586,14 +612,14 @@ $ @kbd{dumpword 72} 72: 72 = #0048 = 0000000001001000 = 'H' @end example -マイナスの数は、次のように指定します。 +マイナスの数は、次のように@kbd{--}を付けて指定します。 @example $ @kbd{dumpword -- -72} -72: -72 = #FFB8 = 1111111110111000 @end example -16進数は、次のように指定します。 +16進数は、次のように次のように@kbd{'}で囲み@kbd{#}を付けて指定します。 @example $ @kbd{dumpword '#0048'} @@ -686,36 +712,77 @@ CASLファイルの内容を表示します。 @item -l @itemx --label -ラベルの一覧を表示し、ほかの作業を続行します。 +ラベルの一覧を次の形式で表示します。表示後、ほかの作業を続行します。 + +@example +<プログラム名>.<ラベル名> ---> <アドレスの16進数表現> +@end example @item -L @itemx --labelonly -ラベルの一覧を表示して終了します。 +@option{-l}と同じ形式でラベルの一覧を表示します。表示後、ほかの作業は続行せず、終了します。 @item -a @itemx --assembledetail アセンブル詳細結果を表示し、ほかの作業を続行します。 @item -A -@itemx --show-all +@itemx --assembledetailonly アセンブル詳細結果を表示して終了します。 @item -o -@itemx --assembleout +@itemx --assembleout アセンブル結果をオブジェクトファイル@file{}に出力し、ほかの作業を続行します。出力されたオブジェクトファイルは、@kbd{comet2}で実行できます。オブジェクトファイルを指定しない場合、出力先は@file{a.o}です。オブジェクトファイルは1つだけ指定できます。 -@item -O -@itemx --assembleoutonly +@item -O[] +@itemx --assembleoutonly[] アセンブル結果をオブジェクトファイル@file{}に出力し、終了します。出力されたオブジェクトファイルは、@kbd{comet2}で実行できます。オブジェクトファイルを指定しない場合、出力先は@file{a.o}です。オブジェクトファイルは1つだけ指定できます。 @item -t @itemx --trace @itemx --tracearithmetic -実行時のレジスタをトレースします。レジスタには、GR0〜GR7という8個の汎用レジスタと、SP(スタックポインタ)、PR(プログラムレジスタ)、FR(フラグレジスタ)があります。レジストリの内容は、-32,768〜32,767の範囲の整数、#0000〜#FFFFの範囲の16進数、2進数で表示されます。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。-32768〜32767の範囲の整数を表示するので、算術演算の結果を確認する場合に使えます。 +プログラム実行中のレジスタの値を次の形式で表示します。@code{<値の10進数表現>}は符号の付いた10進数です。範囲は-32768から32767です。 + +@example +: <レジスタ>: <値の10進数表現> = <値の16進数表現> = <値の2進数表現>[ ='文字'] +@end example + +@itemize +@item +@code{}と@code{<値の16進数表現>}は、先頭に@code{#}が付いた4けたの16進数で表されます。範囲は、@code{#0000}から@code{#FFFF}です + +@item +@code{<値の2進数表現>}は、16けたの2進数で表されます。範囲は、@code{0000000000000000}から@code{1111111111111111}です + +@item +@code{[ ='文字']}は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 +@end itemize + +表示されるレジスタには、次の種類があります。 + +@table @code +@item GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7 +汎用レジスタ + +@item SP +スタックポインタ + +@item PR +プログラムレジスタ + +@item FR +フラグレジスタ +@end table + +例えば、次のように表示されます。 + +@example +#0002: GR1: 3 = #0003 = 0000000000000011 +@end example @item -T @itemx --tracelogical -@option{-t}と同じく、実行時のレジスタをトレースします。@option{-t}と異なり0〜65,535の範囲の整数を表示するので、論理演算の結果を確認する場合に使えます。 +@option{-t}と同じように、プログラム実行中のレジスタの値を表示します。ただし、@option{-t}と異なり、@code{<値の10進数表現>}は符号の付かない10進数です。値の範囲は0から65535です。 @item -d @itemx --dump @@ -723,7 +790,7 @@ CASLファイルの内容を表示します。 @item -M @itemx --memorysize -アセンブルおよび実行時のメモリサイズ@option{}を0〜65,535の範囲で指定します。指定しない場合、メモリサイズは512です。 +アセンブルおよび実行時のメモリサイズ@option{}を0から65535の範囲で指定します。指定しない場合、512です。 @item -C @itemx --clocks @@ -757,11 +824,48 @@ $ @kbd{comet2 hello.o} @item -t @itemx --trace @itemx --tracearithmetic -実行時のレジスタをトレースします。レジスタには、GR0〜GR7という8個の汎用レジスタと、SP(スタックポインタ)、PR(プログラムレジスタ)、FR(フラグレジスタ)があります。レジストリの内容は、-32,768〜32,767の範囲の整数、#0000〜#FFFFの範囲の16進数、2進数で表示されます。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。-32768〜32767の範囲の整数が表示されるので、算術演算の結果を確認する場合に使えます。 +プログラム実行中のレジスタの値を次の形式で表示します。@code{<値の10進数表現>}は符号の付いた10進数です。範囲は-32768から32767です。 + +@example +: <レジスタ>: <値の10進数表現> = <値の16進数表現> = <値の2進数表現>[ ='文字'] +@end example + +@itemize +@item +@code{}と@code{<値の16進数表現>}は、先頭に@code{#}が付いた4けたの16進数で表されます。範囲は、@code{#0000}から@code{#FFFF}です + +@item +@code{<値の2進数表現>}は、16けたの2進数で表されます。範囲は、@code{0000000000000000}から@code{1111111111111111}です + +@item +@code{[ ='文字']}は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 +@end itemize + +例えば、次のように表示されます。 + +@example +#0002: GR1: 3 = #0003 = 0000000000000011 +@end example + +表示されるレジスタには、次の種類があります。 + +@table @code +@item GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7 +汎用レジスタ + +@item SP +スタックポインタ + +@item PR +プログラムレジスタ + +@item FR +フラグレジスタ +@end table @item -T @itemx --tracelogical -@option{-t}と同じく、実行時のレジスタをトレースします。@option{-t}と異なり0〜65,535の範囲の整数を表示するので、論理演算の結果を確認する場合に使えます。 +@option{-t}と同じように、プログラム実行中のレジスタの値を表示します。ただし、@option{-t}と異なり、@code{<値の10進数表現>}は符号の付かない10進数です。値の範囲は0から65535です。 @item -d @itemx --dump @@ -769,11 +873,11 @@ $ @kbd{comet2 hello.o} @item -M @itemx --memorysize -実行時のメモリサイズ@option{}を0〜65,535の範囲で指定します。指定しない場合、メモリサイズは512です。 +実行時のメモリサイズ@option{}を0から65535の範囲で指定します。指定しない場合、512です。 @item -C @itemx --clocks -実行時のクロック周波数@option{}を0より大きい整数で指定します。指定しない場合、クロック周波数は5,000,000です。 +実行時のクロック周波数@option{}を0より大きい整数で指定します。指定しない場合、5000000です。 @item -h @itemx --help @@ -786,7 +890,7 @@ $ @kbd{comet2 hello.o} @pindex dumpword @cindex dumpword -@kbd{dumpword}は、引数として指定された数値を、整数、#0000〜#FFFFの範囲の16進数、2進数で表示します。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。引数は、10進数または先頭に「#」の付いた16進数で指定します。表示される整数は、オプションにより-32,768〜32,767または0〜65,535の範囲です。オプションなしの場合は、-32,768〜32,767です。 +@kbd{dumpword}は、引数として指定された数値を、整数、#0000〜#FFFFの範囲の16進数、2進数で表示します。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。引数は、10進数または先頭に「#」の付いた16進数で指定します。表示される整数は、オプションにより符号付きか符号なしかを指定します。オプションなしの場合は符号付きです。整数の範囲は、符号付きの場合は-32768から32767、符号なしの場合は0から65535です。 @example $ @kbd{dumpword 10} @@ -818,7 +922,6 @@ $ @kbd{dumpword 10} @menu * ABS:: -* ADDL32:: * DIVA:: * DIVL:: * INL:: @@ -835,28 +938,26 @@ $ @kbd{dumpword 10} * STR2L:: @end menu -@node ABS +@node ABS, DIVA, CASL2LIB Manual, CASL2LIB Manual @section @kbd{ABS} - @file{abs.casl} -入力された整数を絶対値に変換して出力 +GR1を符号付き整数とみなし、絶対値に変換 @unnumberedsubsec 入力 -@table @var - +@table @code @item GR1 --32768〜32767の整数 +符号付き整数 @end table @unnumberedsubsec 出力 -@table @var - +@table @code @item GR1 -入力された整数の絶対値 +入力された値の絶対値 @item OF -入力されたGR1が-32768の場合、1 +入力された値が-32768の場合、1 @item SF -入力されたGR1が負数(-32767〜-1)の場合、1 +入力された値が負数(-32767から-1)の場合、1 @end table @unnumberedsubsec 依存する副プログラム @@ -864,60 +965,79 @@ $ @kbd{dumpword 10} @unnumberedsubsec 使用例 @example -@verbatiminclude ../as/casl2lib/test/abs/abs.casl +@verbatiminclude casl2lib/abs/call_abs.casl @end example @example -@verbatiminclude ../as/casl2lib/test/abs/0.txt +$ @kbd{casl2 call_abs.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/outa.casl + $CASL2LIBDIR/divl.casl $CASL2LIBDIR/rev.casl} +1 @end example -@node ADDL32 -@section @kbd{ADDL32} - @file{addl32.casl} -32ビットの値を、連続する2語の領域に格納 +@node DIVA, DIVL, ABS, CASL2LIB Manual +@section @kbd{DIVA} - @file{diva.casl} +符号付き整数の割算を筆算方式で行う @unnumberedsubsec 入力 -@table @var +@table @code @item GR1 -32ビット値1の先頭アドレス +被除数 @item GR2 -32ビット値2の先頭アドレス +除数 @end table @unnumberedsubsec 出力 -@table @var +@table @code @item GR0 -和の先頭アドレス +商 + +@item GR3 +剰余 @item OF -上位アドレスでオーバーフローした場合、1 +次の場合、1 +@itemize +@item +GR2が0 + +@item +GR1が-32768 + +@item +GR2が-32768 +@end itemize @item SF -和が負数(-32767〜-1)の場合、1 +商が負数(-32767から-1)の場合、1 @item ZF -和が0の場合、1 +商が0の場合、1 @end table +@unnumberedsubsec 依存する副プログラム +@itemize +@item @code{DIVL} +@end itemize + @unnumberedsubsec 使用例 @example -@verbatiminclude ../as/casl2lib/test/addl32/addl32_1.casl +@verbatiminclude casl2lib/diva/call_diva.casl @end example @example -4 -9 +$ @kbd{casl2 call_diva.casl $CASL2LIBDIR/diva.casl $CASL2LIBDIR/divl.casl + $CASL2LIBDIR/outa.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/rev.casl} +-128 +-127 @end example -@unnumberedsubsec 依存する副プログラム -なし - -@node DIVA -@section @kbd{DIVA} -@file{diva.casl} --32,767〜32,767の範囲にある整数の割算(筆算方式)を行う +@node DIVL, INL, DIVA, CASL2LIB Manual +@section @kbd{DIVL} - @file{divl.casl} +符号なし整数の割算を筆算方式で行う @unnumberedsubsec 入力 -@table @var +@table @code @item GR1 被除数 @@ -926,7 +1046,7 @@ $ @kbd{dumpword 10} @end table @unnumberedsubsec 出力 -@table @var +@table @code @item GR0 商 @@ -934,82 +1054,67 @@ $ @kbd{dumpword 10} 剰余 @item OF -除数が0の場合、1 +GR2が0の場合、1 @item SF -商が負数(-32767〜-1)の場合、1 +商が32768から65535の場合、1 @item ZF 商が0の場合、1 @end table @unnumberedsubsec 依存する副プログラム -@itemize -@item @kbd{DIVL} -@end itemize - -@c @unnumberedsubsec 使用例 -@c @iftex -@c @cartouche -@c @end iftex -@c @example -@c @verbatiminclude ../as/casl2lib/test/diva/diva.casl -@c @end example -@c @iftex -@c @end cartouche -@c @end iftex - -@c @iftex -@c @cartouche -@c @end iftex -@c @example -@c @verbatiminclude ../as/casl2lib/test/diva/0.txt -@c @end example -@c @iftex -@c @end cartouche -@c @end iftex - -@node DIVL -@section @kbd{DIVL} - @file{divl.casl} -0〜65,535の範囲にある整数の割算(筆算方式)を行う +なし -@unnumberedsubsec 入力 -@table @var -@item GR1 -被除数 +@unnumberedsubsec 使用例 +@example +@verbatiminclude casl2lib/divl/call_divl.casl +@end example -@item GR2 -除数 -@end table +@example +$ @kbd{casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl + $CASL2LIBDIR/rev.casl} +256 +254 +@end example -@unnumberedsubsec 出力 -@table @var -@item GR0 -商 +@node INL, L2STR, DIVL, CASL2LIB Manual +@section @kbd{INL} - @file{inl.casl} -@item GR3 -剰余 +符号なし整数の入力を受け付ける -@item OF -除数が0の場合、1 +@unnumberedsubsec 入力 +@table @code +@item 標準入力 +符号なし整数 +@end table -@item SF -商が32,768〜65535の場合、1 +@unnumberedsubsec 出力 +@table @code +@item GR1 +入力された符号なし整数 -@item ZF -商が0の場合、1 +@item GR0 +文字列の長さ。数字以外が入力された場合は@code{#FFFF} @end table @unnumberedsubsec 依存する副プログラム -なし +@itemize +@item +@code{STR2L} +@end itemize @unnumberedsubsec 使用例 @example -@verbatiminclude ../as/casl2lib/test/divl/divl0/divl0.casl +@verbatiminclude casl2lib/divl/call_divl.casl @end example -@node INL -@section @kbd{INL} - @file{inl.casl} +@example +$ @kbd{casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl + $CASL2LIBDIR/rev.casl} +256 +254 +@end example @node L2STR @section @kbd{L2STR} - @file{l2str.casl}