.PHONY: build check doc clean
build:
- make -C src
+ $(MAKE) -C src
check:
- @make -sC test/system
+ @$(MAKE) -sC test/system
doc:
- make -sC doc
+ @$(MAKE) -sC doc
clean:
- @make -sC src $@
- @make -sC test/system $@
- @make -sC test/unit $@
+ @$(MAKE) -sC src clean
+ @$(MAKE) -sC test/system/casl2 clean
+ @$(MAKE) -sC test/system/comet2 clean
+ @$(MAKE) -sC test/system/dumpword clean
+ @$(MAKE) -sC test/unit clean
@rm -f casl2 comet2 dumpword
JOV FIN ; (GR2 = -32768)の場合は終了
XOR GR4,ONE ; マイナスフラグを反転
DIV CALL DIVL ; GR0 <- GR1 / GR2; GR3 <- GR1 mod GR2
- JOV FIN ; (GR2 = 0)の場合は終了
+ JOV FIN ; (GR2 = 0)の場合は終了
MIN AND GR4,GR4 ; マイナスフラグがオフの場合、終了
JZE FIN ; ↓
XOR GR0,ALLON ; GR1の正負を反転
;; GR1の内容を小数値と見なし、10進数の文字列に変換してSTRに格納
TODIG AND GR1,GR1 ; GR1が0の場合は、ループを脱出
JZE PRT ; ↓
- CALL MUL ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納
+ CALL MULL ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納
LD GR5,GR3 ; GR3をGR1にコピー
ADDA GR5,='0' ; GR1を文字に変換
ST GR5,STR,GR4 ; (STR + GR4) <- GR1
STR DS 20
LEN DS 1
END
-;; GR1の値を10倍にし、GR3にオーバーフロー値を格納
-MUL START
- PUSH 0,GR5
- PUSH 0,GR6
- LAD GR3,0 ; GR3は、オーバーフロー値を格納
- LAD GR5,1 ; GR5は、インデックス
- LD GR6,GR1 ; GR6は、GR4の元の値を保持
-MLOOP CPA GR5,=10 ; GR5が10になったらループ脱出
- JZE MFIN ; ↓
- ADDA GR1,GR6 ; GR4 <- GR4 + GR6
- LAD GR5,1,GR5 ; GR5 <- GR5 + 1
- JOV MADD ; オーバーフローした場合、MADDへジャンプ
- JUMP MLOOP ; ループ
-MADD LAD GR3,1,GR3 ; GR3 <- GR3 + 1
- AND GR1,=#7FFF ; GR4の最上位ビットをクリア
- JUMP MLOOP ; ループ
-MFIN POP GR6
- POP GR5
- RET
- END
-;; GR1の値を絶対値に変換する。GR1には0未満の数値が格納されていると想定。
-;; 例: -10 => 10, -20 => 20
-ABS START
- XOR GR1,=#FFFF ; GR1の値を反転
- LAD GR1,1,GR1 ; GR1 <- GR1 + 1
- RET
- END
-;;; *** This file is auto generated. ***
-;;; 0〜65535の範囲にある整数の入力を受け付ける
;;; 10進数の整数を表す文字列を数値に変換
+;;; 数値の範囲は、0から65535
;;; 入力 GR1: 文字列を格納するアドレス
-;;; GR2: 文字列の長さ。1-5を想定
-;;; 出力 GR0: 数値(0〜65535)
-;;; 文字列が長過ぎる場合や数値以外の場合は、GR2に#FFFFを格納
+;;; GR2: 文字列の長さ。最大5けた
+;;; 出力 GR0: 数値
+;;; 文字列が最大長より大きい場合や数値以外の場合は、GR0は#FFFF、OFは1
+;;; 依存プログラム: MULL
STR2L START
PUSH 0,GR3
PUSH 0,GR4
JZE NEXT ; (GR4 = 1)の場合、ループ脱出
JMI NEXT ; ↓
CALL MULL ; MULLを呼び出し、GR0 <- GR1 * GR2
- JOV FIN ; ↓
+ JOV FIN ; ↓ オーバーフロー時は、プログラム終端へジャンプ
LD GR1,GR0 ; GR1 <- GR0
LAD GR4,-1,GR4 ; GR4 <- GR4 -1
- JUMP MUL10 ; ループ終端
+ JUMP MUL10 ; ループ終端へジャンプ
NEXT LD GR4,NLEN ; GR4 <- NLEN。復元
ADDL GR3,GR1 ; GR3 <- GR3 + GR1
JOV FIN ; ↓
JUMP FIN ; FINへジャンプ
CP LD GR1,GR3 ; GR0 <- GR3
LD GR0,LEN ; GR0 <- LEN
- JUMP FIN
-LENOV LAD GR0,#FFFF
- SRA GR0,1
+ JUMP FIN ; プログラム終端へジャンプ
+LENOV LAD GR0,#FFFF ; 文字列が最大長より大きい場合、GR0 <- #FFFF
+ SRA GR0,1 ; ↓ オーバーフロー発生
FIN POP GR4
POP GR3
RET
ZERO DC '0'
NINE DC '9'
-MAXLEN DC 10 ; 10桁の数値まで入力可能
+MAXLEN DC 5 ; 文字列の最大長
STR DS 1
LEN DS 1
NLEN DS 1
END
+<<<<<<< HEAD
+=======
;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
;;; 入力 GR1:被乗数 GR2:乗数
;;; 出力 GR0:積
POP GR1
RET
END
+>>>>>>> b22ffc2662e5fe300bfab3adb46ca97b5b630d8b
--- /dev/null
+digraph CASL2LIBdepend {
+ graph [label = "YACASL2のモジュール依存関係"];
+ "DIVA" -> "DIVL";
+ "INL" -> "STR2L";
+ "L2STR" -> "DIVL";
+ "L2STR" -> "REV";
+ "MULA" -> "MULL";
+ "OUTA" -> "ABS";
+ "OUTB" -> "DIVL";
+ "OUTB" -> "REV";
+ "OUTD_Q15" -> "ABS";
+ "OUTD_Q15" -> "MULL";
+ "OUTL" -> "DIVL";
+ "OUTL" -> "REV";
+ "STR2L" -> "MULL"
+}
--- /dev/null
+digraph yacasl2depend {
+ graph [label = "YACASL2のモジュール依存関係"];
+ "assemble.c" -> "casl2.h";
+ "assemble.c" -> "assemble.h";
+ "casl2.c" -> "casl2.h";
+ "casl2.c" -> "assemble.h";
+ "casl2.c" -> "exec.h";
+ "cerr.c" -> "cerr.h";
+
+ "comet2.c" -> "casl2.h";
+ "comet2.c" -> "exec.h";
+ "dumpword.c" -> "word.h";
+ "dumpword.c" -> "cerr.h";
+ "casl2.h" -> "word.h";
+ "casl2.h" -> "hash.h";
+ "casl2.h" -> "cmem.h";
+ "casl2.h" -> "cerr.h";
+ "cerr.h" -> "cmem.h";
+ "hash.h" -> "cmem.h";
+ "word.h" -> "cmem.h";
+ "word.h" -> "cerr.h";
+}
<h2 class="chapter">1 YACASL2の概要</h2>
-<p>YACASL2は、Linux上で動作するオープンソースのCASL II処理系です。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。
+<p>YACASL2は、UNIX/Linuxのコマンドラインインターフェイスで動作するオープンソースのCASL II処理システムです。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。
<blockquote>
<a href="http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf">試験で使用する情報処理用語・プログラム言語など(2008年10月版)</a>[PDFファイル]
A DC -1
END
</pre></pre>
-<pre class="example"> $ <kbd>casl2 call_abs.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/outa.casl
+<pre class="example"> $ <kbd>casl2 call_abs.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/outa.casl \
$CASL2LIBDIR/divl.casl $CASL2LIBDIR/rev.casl</kbd>
1
</pre>
ELEN DC 5
END
</pre></pre>
-<pre class="example"> $ <kbd>casl2 call_diva.casl $CASL2LIBDIR/diva.casl $CASL2LIBDIR/divl.casl
+<pre class="example"> $ <kbd>casl2 call_diva.casl $CASL2LIBDIR/diva.casl $CASL2LIBDIR/divl.casl \
$CASL2LIBDIR/outa.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/rev.casl</kbd>
-128
-127
ELEN DC 5
END
</pre></pre>
-<pre class="example"> $ <kbd>casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl
+<pre class="example"> $ <kbd>casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl \
$CASL2LIBDIR/rev.casl</kbd>
256
254
ELEN DC 5
END
</pre></pre>
-<pre class="example"> $ <kbd>casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl
+<pre class="example"> $ <kbd>casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl \
$CASL2LIBDIR/rev.casl</kbd>
256
254
@titlepage
@title YACASL2
-@subtitle Linux上のCASL II処理系
+@subtitle UNIX/Linuxのコマンドラインインターフェイスで動作するCASL II処理システム
@author j8takagi
@insertcopying
@end titlepage
@ifnottex
-@node Top
+@node Top, About, (dir), (dir)
@end ifnottex
@menu
@node About, Install, Top, Top
@chapter YACASL2の概要
-YACASL2は、Linux上で動作するオープンソースのCASL II処理系です。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。
+YACASL2は、UNIX/Linuxのコマンドラインインターフェイスで動作するオープンソースのCASL II処理システムです。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。
@iftex
@cartouche
All tests are succeded.
@end example
-@node Environment,, Detail Test, Install
+@node Environment, , Detail Test, Install
@section 環境変数の設定
環境変数を設定することで、YACASL2が使いやすくなります。環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されます。
#0010: GR0: 55 = #0037 = 0000000000110111 = '7'
@end example
-@node Step Count,, Ending Value, Register and Memory
+@node Step Count, , Ending Value, Register and Memory
@subsection プログラムのステップ数を表示
@kbd{grep}と@kbd{wc}を組み合わせれば、プログラムのステップ数を表示できます。
#0048: 72 = #0048 = 0000000001001000 = 'H'
@end example
-@node CASL2lib,, Analyze Word, Usage
+@node CASL2lib, , Analyze Word, Usage
@section CASL2ライブラリの使用
YACASL2の@file{as/casl2lib}ディレクトリには、CASL IIで記述されたライブラリファイルが格納されています。
4
@end example
-@node Command Manual,CASL2LIB Manual,Usage,TOP
+@node Command Manual, CASL2LIB Manual, Usage, Top
@chapter YACASL2コマンドマニュアル
@cindex YACASL2コマンドマニュアル
* dumpword::
@end menu
-@node casl2
+@node casl2, comet2, Command Manual, Command Manual
@section @kbd{casl2}
@pindex casl2
@kbd{casl2}の使用方法を表示して終了します。
@end table
-@node comet2
+@node comet2, dumpword, casl2, Command Manual
@section @kbd{comet2}
@pindex comet2
@kbd{comet2}の使用方法を表示して終了します。
@end table
-@node dumpword
+@node dumpword, , comet2, Command Manual
@section @kbd{dumpword}
@pindex dumpword
@kbd{dumpword}の使用方法を表示して終了します。
@end table
-@node CASL2LIB Manual,,Command Manual,TOP
+@node CASL2LIB Manual, , Command Manual, Top
@chapter CASL2LIBマニュアル
@menu
@end example
@example
-$ @kbd{casl2 call_abs.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/outa.casl
+$ @kbd{casl2 call_abs.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/outa.casl \
$CASL2LIBDIR/divl.casl $CASL2LIBDIR/rev.casl}
1
@end example
@end example
@example
-$ @kbd{casl2 call_diva.casl $CASL2LIBDIR/diva.casl $CASL2LIBDIR/divl.casl
+$ @kbd{casl2 call_diva.casl $CASL2LIBDIR/diva.casl $CASL2LIBDIR/divl.casl \
$CASL2LIBDIR/outa.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/rev.casl}
-128
-127
@end example
@example
-$ @kbd{casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl
+$ @kbd{casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl \
$CASL2LIBDIR/rev.casl}
256
254
@end example
@example
-$ @kbd{casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl
+$ @kbd{casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl \
$CASL2LIBDIR/rev.casl}
256
254
@end example
-@node L2STR
+@node L2STR, MAX, INL, CASL2LIB Manual
@section @kbd{L2STR} - @file{l2str.casl}
-@node MAX
+@node MAX, MINIM, L2STR, CASL2LIB Manual
@section @kbd{MAX} - @file{max.casl}
-@node MINIM
+@node MINIM, MULA, MAX, CASL2LIB Manual
@section @kbd{MINIM} - @file{minim.casl}
-@node MULA
+@node MULA, MULL, MINIM, CASL2LIB Manual
@section @kbd{MULA} - @file{mula.casl}
-@node MULL
+@node MULL, OUTA, MULA, CASL2LIB Manual
@section @kbd{MULL} - @file{mull.casl}
-@node OUTA
+@node OUTA, OUTB, MULL, CASL2LIB Manual
@section @kbd{OUTA} - @file{outa.casl}
-@node OUTB
+@node OUTB, OUTD_Q15, OUTA, CASL2LIB Manual
@section @kbd{OUTB} - @file{outb.casl}
-@node OUTD_Q15
+@node OUTD_Q15, OUTL, OUTB, CASL2LIB Manual
@section @kbd{OUTD_Q15} - @file{outd_q15.casl}
-@node OUTL
+@node OUTL, REV, OUTD_Q15, CASL2LIB Manual
@section @kbd{OUTL} - @file{outl.casl}
-@node REV
+@node REV, STR2L, OUTL, CASL2LIB Manual
@section @kbd{REV} - @file{rev.casl}
-@node STR2L
+@node STR2L, , REV, CASL2LIB Manual
@section @kbd{STR2L} - @file{str2l.casl}
@bye
#include <ctype.h>
#include <stdbool.h>
-#include "cmem.h"
-#include "cerr.h"
-
/* wordのエラー定義 */
bool addcerrlist_word();
+#include "cmem.h"
+#include "cerr.h"
+#include "hash.h"
+#include "word.h"
#include "casl2.h"
CMD comet2cmd[] = {
np = code_type[i];
while(np != NULL) {
nq = np->next;
- free(np);
+ free_chk(np, "np");
np = nq;
}
}
- free(code_type);
+ free_chk(code_type, "code_type");
}
-#include "casl2.h"
#define _GNU_SOURCE
#include <getopt.h>
+#include "word.h"
+#include "cerr.h"
+#include "cmem.h"
static struct option longopts[] = {
{ "arithmetic", no_argument, NULL, 'a' },
#include "word.h"
+#include "cerr.h"
/* wordのエラー定義 */
CERR cerr_word[] = {
#000B: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
#000B: 0000: 1010 000C 3411 6600 0009 1210 0000 6400 000B 1210 FFFF 8100 FFFF 0000 0000 0000
+;;; JOV OF:0/SF:1/ZF:0
+MAIN START
+ LD GR1,A
+ AND GR1,GR1
+ JOV TO
+ LAD GR1,0
+ JUMP FIN
+TO LAD GR1,#FFFF
+FIN RET
+A DC -1
+ END
+
+Assemble ../../../../as/cmd/JOV/jov_m.casl (0)
+
+Assemble ../../../../as/cmd/JOV/jov_m.casl (1)
+../../../../as/cmd/JOV/jov_m.casl: 1:;;; JOV OF:0/SF:1/ZF:0
+../../../../as/cmd/JOV/jov_m.casl: 2:MAIN START
+../../../../as/cmd/JOV/jov_m.casl: 3: LD GR1,A
+ #0000 #1010
+ #0001 #000C
+../../../../as/cmd/JOV/jov_m.casl: 4: AND GR1,GR1
+ #0002 #3411
+../../../../as/cmd/JOV/jov_m.casl: 5: JOV TO
+ #0003 #6600
+ #0004 #0009
+../../../../as/cmd/JOV/jov_m.casl: 6: LAD GR1,0
+ #0005 #1210
+ #0006 #0000
+../../../../as/cmd/JOV/jov_m.casl: 7: JUMP FIN
+ #0007 #6400
+ #0008 #000B
+../../../../as/cmd/JOV/jov_m.casl: 8:TO LAD GR1,#FFFF
+ #0009 #1210
+ #000A #FFFF
+../../../../as/cmd/JOV/jov_m.casl: 9:FIN RET
+ #000B #8100
+../../../../as/cmd/JOV/jov_m.casl: 10:A DC -1
+ #000C #FFFF
+../../../../as/cmd/JOV/jov_m.casl: 11: END
+
+Executing machine codes
+#0000: Register::::
+#0000: GR0: 0 = #0000 = 0000000000000000
+#0000: GR1: 0 = #0000 = 0000000000000000
+#0000: GR2: 0 = #0000 = 0000000000000000
+#0000: GR3: 0 = #0000 = 0000000000000000
+#0000: GR4: 0 = #0000 = 0000000000000000
+#0000: GR5: 0 = #0000 = 0000000000000000
+#0000: GR6: 0 = #0000 = 0000000000000000
+#0000: GR7: 0 = #0000 = 0000000000000000
+#0000: SP: 16 = #0010 = 0000000000010000
+#0000: PR: 0 = #0000 = 0000000000000000
+#0000: FR (OF SF ZF): 000
+#0000: Memory::::
+#0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0000: 0000: 1010 000C 3411 6600 0009 1210 0000 6400 000B 1210 FFFF 8100 FFFF 0000 0000 0000
+
+#0002: Register::::
+#0002: GR0: 0 = #0000 = 0000000000000000
+#0002: GR1: -1 = #FFFF = 1111111111111111
+#0002: GR2: 0 = #0000 = 0000000000000000
+#0002: GR3: 0 = #0000 = 0000000000000000
+#0002: GR4: 0 = #0000 = 0000000000000000
+#0002: GR5: 0 = #0000 = 0000000000000000
+#0002: GR6: 0 = #0000 = 0000000000000000
+#0002: GR7: 0 = #0000 = 0000000000000000
+#0002: SP: 16 = #0010 = 0000000000010000
+#0002: PR: 2 = #0002 = 0000000000000010
+#0002: FR (OF SF ZF): 010
+#0002: Memory::::
+#0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0002: 0000: 1010 000C 3411 6600 0009 1210 0000 6400 000B 1210 FFFF 8100 FFFF 0000 0000 0000
+
+#0003: Register::::
+#0003: GR0: 0 = #0000 = 0000000000000000
+#0003: GR1: -1 = #FFFF = 1111111111111111
+#0003: GR2: 0 = #0000 = 0000000000000000
+#0003: GR3: 0 = #0000 = 0000000000000000
+#0003: GR4: 0 = #0000 = 0000000000000000
+#0003: GR5: 0 = #0000 = 0000000000000000
+#0003: GR6: 0 = #0000 = 0000000000000000
+#0003: GR7: 0 = #0000 = 0000000000000000
+#0003: SP: 16 = #0010 = 0000000000010000
+#0003: PR: 3 = #0003 = 0000000000000011
+#0003: FR (OF SF ZF): 010
+#0003: Memory::::
+#0003: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0003: 0000: 1010 000C 3411 6600 0009 1210 0000 6400 000B 1210 FFFF 8100 FFFF 0000 0000 0000
+
+#0005: Register::::
+#0005: GR0: 0 = #0000 = 0000000000000000
+#0005: GR1: -1 = #FFFF = 1111111111111111
+#0005: GR2: 0 = #0000 = 0000000000000000
+#0005: GR3: 0 = #0000 = 0000000000000000
+#0005: GR4: 0 = #0000 = 0000000000000000
+#0005: GR5: 0 = #0000 = 0000000000000000
+#0005: GR6: 0 = #0000 = 0000000000000000
+#0005: GR7: 0 = #0000 = 0000000000000000
+#0005: SP: 16 = #0010 = 0000000000010000
+#0005: PR: 5 = #0005 = 0000000000000101
+#0005: FR (OF SF ZF): 010
+#0005: Memory::::
+#0005: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0005: 0000: 1010 000C 3411 6600 0009 1210 0000 6400 000B 1210 FFFF 8100 FFFF 0000 0000 0000
+
+#0007: Register::::
+#0007: GR0: 0 = #0000 = 0000000000000000
+#0007: GR1: 0 = #0000 = 0000000000000000
+#0007: GR2: 0 = #0000 = 0000000000000000
+#0007: GR3: 0 = #0000 = 0000000000000000
+#0007: GR4: 0 = #0000 = 0000000000000000
+#0007: GR5: 0 = #0000 = 0000000000000000
+#0007: GR6: 0 = #0000 = 0000000000000000
+#0007: GR7: 0 = #0000 = 0000000000000000
+#0007: SP: 16 = #0010 = 0000000000010000
+#0007: PR: 7 = #0007 = 0000000000000111
+#0007: FR (OF SF ZF): 010
+#0007: Memory::::
+#0007: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0007: 0000: 1010 000C 3411 6600 0009 1210 0000 6400 000B 1210 FFFF 8100 FFFF 0000 0000 0000
+
+#000B: Register::::
+#000B: GR0: 0 = #0000 = 0000000000000000
+#000B: GR1: 0 = #0000 = 0000000000000000
+#000B: GR2: 0 = #0000 = 0000000000000000
+#000B: GR3: 0 = #0000 = 0000000000000000
+#000B: GR4: 0 = #0000 = 0000000000000000
+#000B: GR5: 0 = #0000 = 0000000000000000
+#000B: GR6: 0 = #0000 = 0000000000000000
+#000B: GR7: 0 = #0000 = 0000000000000000
+#000B: SP: 16 = #0010 = 0000000000010000
+#000B: PR: 11 = #000B = 0000000000001011
+#000B: FR (OF SF ZF): 010
+#000B: Memory::::
+#000B: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#000B: 0000: 1010 000C 3411 6600 0009 1210 0000 6400 000B 1210 FFFF 8100 FFFF 0000 0000 0000
+