YACAL2: CASL2処理系
authorj8takagi <j8takagi@nifty.com>
Mon, 23 Nov 2009 04:20:30 +0000 (13:20 +0900)
committerj8takagi <j8takagi@nifty.com>
Wed, 2 Dec 2009 02:41:12 +0000 (11:41 +0900)
253 files changed:
.gitignore [new file with mode: 0644]
Makefile [new file with mode: 0644]
README [new file with mode: 0644]
TODO [new file with mode: 0644]
as/add.casl [new file with mode: 0644]
as/add1.casl [new file with mode: 0644]
as/add2.casl [new file with mode: 0644]
as/add_err.casl [new file with mode: 0644]
as/add_labelerr.casl [new file with mode: 0644]
as/add_loop.casl [new file with mode: 0644]
as/add_opdspc_err.casl [new file with mode: 0644]
as/add_p.casl [new file with mode: 0644]
as/adda_overflow.casl [new file with mode: 0644]
as/addl.casl [new file with mode: 0644]
as/addl_overflow.casl [new file with mode: 0644]
as/binout.casl [new file with mode: 0644]
as/count.casl [new file with mode: 0644]
as/count_call.casl [new file with mode: 0644]
as/count_call1.casl [new file with mode: 0644]
as/count_call2.casl [new file with mode: 0644]
as/cpa1.casl [new file with mode: 0644]
as/dc_overflow.casl [new file with mode: 0644]
as/dc_spc.casl [new file with mode: 0644]
as/div.casl [new file with mode: 0644]
as/div10.casl [new file with mode: 0644]
as/div10_test.casl [new file with mode: 0644]
as/div2.casl [new file with mode: 0644]
as/div3.casl [new file with mode: 0644]
as/div_call.casl [new file with mode: 0644]
as/div_sub.casl [new file with mode: 0644]
as/ds.casl [new file with mode: 0644]
as/ds_err.casl [new file with mode: 0644]
as/floatedit.casl [new file with mode: 0644]
as/hanoi.casl [new file with mode: 0644]
as/hello.casl [new file with mode: 0644]
as/iotest.casl [new file with mode: 0644]
as/itoa.casl [new file with mode: 0644]
as/itoa0.casl [new file with mode: 0644]
as/itoa1.casl [new file with mode: 0644]
as/itoa2.casl [new file with mode: 0644]
as/lad.casl [new file with mode: 0644]
as/ladtest.casl [new file with mode: 0644]
as/ld.casl [new file with mode: 0644]
as/ld2.casl [new file with mode: 0644]
as/ld3.casl [new file with mode: 0644]
as/ld4.casl [new file with mode: 0644]
as/ld_data.casl [new file with mode: 0644]
as/ld_zero.casl [new file with mode: 0644]
as/literal_spc.casl [new file with mode: 0644]
as/literalstr.casl [new file with mode: 0644]
as/min_main.casl [new file with mode: 0644]
as/min_main2.casl [new file with mode: 0644]
as/min_sub.casl [new file with mode: 0644]
as/min_sub2.casl [new file with mode: 0644]
as/minus.casl [new file with mode: 0644]
as/minus2.casl [new file with mode: 0644]
as/mul.casl [new file with mode: 0644]
as/muls.casl [new file with mode: 0644]
as/muls2.casl [new file with mode: 0644]
as/muls_out.casl [new file with mode: 0644]
as/muls_p.casl [new file with mode: 0644]
as/multi.casl [new file with mode: 0644]
as/multi2.casl [new file with mode: 0644]
as/multi2_test.casl [new file with mode: 0644]
as/multi_call.casl [new file with mode: 0644]
as/multi_call0.casl [new file with mode: 0644]
as/multi_sub.casl [new file with mode: 0644]
as/not.casl [new file with mode: 0644]
as/outi.casl [new file with mode: 0644]
as/outi0.casl [new file with mode: 0644]
as/outi2.casl [new file with mode: 0644]
as/outi2_call.casl [new file with mode: 0644]
as/outi_call.casl [new file with mode: 0644]
as/outtest.casl [new file with mode: 0644]
as/outtest1.casl [new file with mode: 0644]
as/outtest2.casl [new file with mode: 0644]
as/outtest_err.casl [new file with mode: 0644]
as/ptn1.casl [new file with mode: 0644]
as/ptn1_call.casl [new file with mode: 0644]
as/ptn2.casl [new file with mode: 0644]
as/ptn2_call.casl [new file with mode: 0644]
as/ptn3.casl [new file with mode: 0644]
as/ptn3_call.casl [new file with mode: 0644]
as/ptn4.casl [new file with mode: 0644]
as/ptn4_call.casl [new file with mode: 0644]
as/pushpop.casl [new file with mode: 0644]
as/revtest.casl [new file with mode: 0644]
as/sla2.casl [new file with mode: 0644]
as/sra2.casl [new file with mode: 0644]
as/sra3.casl [new file with mode: 0644]
as/sra4.casl [new file with mode: 0644]
as/suba_p.casl [new file with mode: 0644]
as/suba_p2.casl [new file with mode: 0644]
as/summary.casl [new file with mode: 0644]
as/summary_call.casl [new file with mode: 0644]
as/summary_call2.casl [new file with mode: 0644]
as/summary_lderr.casl [new file with mode: 0644]
as/svctest.casl [new file with mode: 0644]
as/xor.casl [new file with mode: 0644]
as/xor0.casl [new file with mode: 0644]
as/xor1.casl [new file with mode: 0644]
as/zero1.casl [new file with mode: 0644]
casl2 [new file with mode: 0755]
comet2 [new file with mode: 0755]
include/assemble.h [new file with mode: 0644]
include/casl2.h [new file with mode: 0644]
include/exec.h [new file with mode: 0644]
src/Makefile [new file with mode: 0644]
src/assemble.c [new file with mode: 0644]
src/casl2.c [new file with mode: 0644]
src/cerr.c [new file with mode: 0644]
src/cmd.c [new file with mode: 0644]
src/comet2.c [new file with mode: 0644]
src/dump.c [new file with mode: 0644]
src/exec.c [new file with mode: 0644]
src/label.c [new file with mode: 0644]
src/macro.c [new file with mode: 0644]
src/struct.c [new file with mode: 0644]
src/token.c [new file with mode: 0644]
test/astest/List.mk [new file with mode: 0644]
test/astest/Makefile [new file with mode: 0644]
test/astest/Test.mk [new file with mode: 0644]
test/astest/add/0.o.txt [new file with mode: 0644]
test/astest/add/0.txt [new file with mode: 0644]
test/astest/add/Makefile [new file with mode: 0644]
test/astest/add_err/0.txt [new file with mode: 0644]
test/astest/add_err/Makefile [new file with mode: 0644]
test/astest/add_labelerr/0.txt [new file with mode: 0644]
test/astest/add_labelerr/Makefile [new file with mode: 0644]
test/astest/add_opdspc_err/0.txt [new file with mode: 0644]
test/astest/add_opdspc_err/Makefile [new file with mode: 0644]
test/astest/add_p/0.txt [new file with mode: 0644]
test/astest/add_p/Makefile [new file with mode: 0644]
test/astest/adda_overflow/0.txt [new file with mode: 0644]
test/astest/adda_overflow/Makefile [new file with mode: 0644]
test/astest/addl/0.txt [new file with mode: 0644]
test/astest/addl/Makefile [new file with mode: 0644]
test/astest/addl_overflow/0.txt [new file with mode: 0644]
test/astest/addl_overflow/Makefile [new file with mode: 0644]
test/astest/binout/0.txt [new file with mode: 0644]
test/astest/binout/Makefile [new file with mode: 0644]
test/astest/call/0.txt [new file with mode: 0644]
test/astest/call/Makefile [new file with mode: 0644]
test/astest/count/0.txt [new file with mode: 0644]
test/astest/count/Makefile [new file with mode: 0644]
test/astest/count_call/0.txt [new file with mode: 0644]
test/astest/count_call/Makefile [new file with mode: 0644]
test/astest/count_call1/0.txt [new file with mode: 0644]
test/astest/count_call1/Makefile [new file with mode: 0644]
test/astest/count_call2/0.txt [new file with mode: 0644]
test/astest/count_call2/Makefile [new file with mode: 0644]
test/astest/dc_overflow/0.txt [new file with mode: 0644]
test/astest/dc_overflow/Makefile [new file with mode: 0644]
test/astest/dc_spc/0.txt [new file with mode: 0644]
test/astest/dc_spc/Makefile [new file with mode: 0644]
test/astest/div/0.txt [new file with mode: 0644]
test/astest/div/Makefile [new file with mode: 0644]
test/astest/div10_test/0.txt [new file with mode: 0644]
test/astest/div10_test/Makefile [new file with mode: 0644]
test/astest/div2/0.txt [new file with mode: 0644]
test/astest/div2/Makefile [new file with mode: 0644]
test/astest/ds/0.txt [new file with mode: 0644]
test/astest/ds/Makefile [new file with mode: 0644]
test/astest/ds_err/0.txt [new file with mode: 0644]
test/astest/ds_err/Makefile [new file with mode: 0644]
test/astest/floatedit/0.txt [new file with mode: 0644]
test/astest/floatedit/Makefile [new file with mode: 0644]
test/astest/floatedit/teststr.txt [new file with mode: 0644]
test/astest/hanoi/0.txt [new file with mode: 0644]
test/astest/hanoi/Makefile [new file with mode: 0644]
test/astest/hello/0.txt [new file with mode: 0644]
test/astest/hello/Makefile [new file with mode: 0644]
test/astest/iotest/0.txt [new file with mode: 0644]
test/astest/iotest/Makefile [new file with mode: 0644]
test/astest/iotest/teststr.txt [new file with mode: 0644]
test/astest/lad/0.txt [new file with mode: 0644]
test/astest/lad/Makefile [new file with mode: 0644]
test/astest/ladtest/0.txt [new file with mode: 0644]
test/astest/ladtest/Makefile [new file with mode: 0644]
test/astest/ld/0.txt [new file with mode: 0644]
test/astest/ld/Makefile [new file with mode: 0644]
test/astest/literal_spc/0.txt [new file with mode: 0644]
test/astest/literal_spc/Makefile [new file with mode: 0644]
test/astest/literalstr/0.txt [new file with mode: 0644]
test/astest/literalstr/Makefile [new file with mode: 0644]
test/astest/muls/0.txt [new file with mode: 0644]
test/astest/muls/Makefile [new file with mode: 0644]
test/astest/muls_p/0.txt [new file with mode: 0644]
test/astest/muls_p/Makefile [new file with mode: 0644]
test/astest/multi/0.txt [new file with mode: 0644]
test/astest/multi/Makefile [new file with mode: 0644]
test/astest/multi_p/0.txt [new file with mode: 0644]
test/astest/multi_p/Makefile [new file with mode: 0644]
test/astest/outtest/0.txt [new file with mode: 0644]
test/astest/outtest/Makefile [new file with mode: 0644]
test/astest/outtest1/0.txt [new file with mode: 0644]
test/astest/outtest1/Makefile [new file with mode: 0644]
test/astest/outtest2/0.txt [new file with mode: 0644]
test/astest/outtest2/Makefile [new file with mode: 0644]
test/astest/outtest_err/0.txt [new file with mode: 0644]
test/astest/outtest_err/Makefile [new file with mode: 0644]
test/astest/ptn1/0.txt [new file with mode: 0644]
test/astest/ptn1/Makefile [new file with mode: 0644]
test/astest/ptn2/0.txt [new file with mode: 0644]
test/astest/ptn2/Makefile [new file with mode: 0644]
test/astest/ptn3/0.txt [new file with mode: 0644]
test/astest/ptn3/Makefile [new file with mode: 0644]
test/astest/ptn4/0.txt [new file with mode: 0644]
test/astest/ptn4/Makefile [new file with mode: 0644]
test/astest/pushpop/0.txt [new file with mode: 0644]
test/astest/pushpop/Makefile [new file with mode: 0644]
test/astest/sla2/0.txt [new file with mode: 0644]
test/astest/sla2/Makefile [new file with mode: 0644]
test/astest/sra2/0.txt [new file with mode: 0644]
test/astest/sra2/Makefile [new file with mode: 0644]
test/astest/summary/0.txt [new file with mode: 0644]
test/astest/summary/Makefile [new file with mode: 0644]
test/astest/summary_lderr/0.txt [new file with mode: 0644]
test/astest/summary_lderr/Makefile [new file with mode: 0644]
test/utest/List.mk [new file with mode: 0644]
test/utest/Makefile [new file with mode: 0644]
test/utest/Template.c [new file with mode: 0644]
test/utest/Test.mk [new file with mode: 0644]
test/utest/cerrtest/0.txt [new file with mode: 0644]
test/utest/cerrtest/Makefile [new file with mode: 0644]
test/utest/cerrtest/cerrtest.c [new file with mode: 0644]
test/utest/getcmdcode/0.txt [new file with mode: 0644]
test/utest/getcmdcode/Makefile [new file with mode: 0644]
test/utest/getcmdcode/getcmdcode.c [new file with mode: 0644]
test/utest/getcmdtype/0.txt [new file with mode: 0644]
test/utest/getcmdtype/Makefile [new file with mode: 0644]
test/utest/getcmdtype/getcmdtype.c [new file with mode: 0644]
test/utest/getgr/0.txt [new file with mode: 0644]
test/utest/getgr/Makefile [new file with mode: 0644]
test/utest/getgr/getgr.c [new file with mode: 0644]
test/utest/gethex/0.txt [new file with mode: 0644]
test/utest/gethex/Makefile [new file with mode: 0644]
test/utest/gethex/gethex.c [new file with mode: 0644]
test/utest/getint/0.txt [new file with mode: 0644]
test/utest/getint/Makefile [new file with mode: 0644]
test/utest/getint/getint.c [new file with mode: 0644]
test/utest/linetok/0.txt [new file with mode: 0644]
test/utest/linetok/Makefile [new file with mode: 0644]
test/utest/linetok/linetok.c [new file with mode: 0644]
test/utest/opdtok/0.txt [new file with mode: 0644]
test/utest/opdtok/Makefile [new file with mode: 0644]
test/utest/opdtok/opdtok.c [new file with mode: 0644]
test/utest/print_cmdtype_code/0.txt [new file with mode: 0644]
test/utest/print_cmdtype_code/Makefile [new file with mode: 0644]
test/utest/print_cmdtype_code/print_cmdtype_code.c [new file with mode: 0644]
test/utest/print_code_type/0.txt [new file with mode: 0644]
test/utest/print_code_type/Makefile [new file with mode: 0644]
test/utest/print_code_type/print_code_type.c [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..79a230f
--- /dev/null
@@ -0,0 +1,6 @@
+*.o
+1.txt
+report.txt
+diff.txt
+casl2
+comet2
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..06cf19d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,19 @@
+INSTALLDIR = /usr/local/bin
+.PHPNY: all clean check install uninstall
+all:
+       make -C src ../casl2 ../comet2
+check:
+       make -C test/astest
+clean:
+       make -C src clean
+       make -C test/astest clean
+       make -C test/utest clean
+install: casl2 comet2
+       @if test -d $(INSTALLDIR); then \
+       install -s ./casl2 $(INSTALLDIR)/casl2; \
+       install -s ./comet2 $(INSTALLDIR)/comet2; \
+     fi
+uninstall:
+       @if test -d $(INSTALLDIR); then \
+       rm -f $(INSTALLDIR)/casl2 $(INSTALLDIR)/comet2; \
+     fi
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..bbe97ea
--- /dev/null
+++ b/README
@@ -0,0 +1,70 @@
+このファイルは、YACASL2(仮称)のREADMEファイルである。
+
+■機能概要
+YACASL2は、Linux上で動作するオープンソースのCASL II処理系。
+CASL IIは、情報処理試験で用いられるアセンブラ言語。
+仕様は、次の資料「試験で使用する情報処理用語・プログラム言語など」(2008年10月版)の
+中にある「別紙 1 アセンブラ言語の仕様」参照。
+    http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf (PDFファイル)
+
+■要件
+Linux(Ubuntu Linux 9.04とVine Linux 4.2で動作確認)
+インストールに、gcc、makeが必要
+
+■インストール
+yacasl2.tar.gz をダウンロードし、シェルで次のコマンド実行
+
+ $ tar xvzf yacasl2.tar.gz
+ $ cd casl2
+ $ make
+ gcc -o ../casl2 -g -Wall struct.c cmd.c cerr.c dump.c exec.c label.c parseline.c macro.c assemble.c casl2.c
+ gcc -o ../comet2 -g -Wall struct.c cmd.c cerr.c dump.c exec.c comet2.c
+ make[1]: Leaving directory `/home/kazubito/casl2/src'
+
+■実行方法
+※asディレクトリに、サンプルのcaslファイルを格納
+1. アセンブラファイルをアセンブルし、仮想システムCOMET II上で実行
+
+ $ ./casl as/hello.casl
+ $ ./casl as/add.casl
+
+2. アセンブラファイルの、ラベルの解析結果とアセンブル詳細結果を出力。
+   実行はしない
+
+ $ ./casl -Al as/add.casl
+
+3. アセンブラファイルの、ラベルの解析結果とアセンブル詳細結果を
+   出力してから、仮想システムCOMET II上で実行
+
+ $ ./casl -al as/add.casl
+
+4. アセンブラファイルの、ラベルの解析結果とアセンブル詳細結果を
+   出力してから、仮想システムCOMET II上で実行。
+   実行時に、レジスタの内容を出力
+
+ $ ./casl -alt as/add.casl
+
+5. アセンブラファイルの、ラベルの解析結果とアセンブル詳細結果を
+   出力してから、仮想システムCOMET II上で実行。
+   実行時に、レジスタとメモリの内容を出力
+
+ $ ./casl -altd as/add.casl
+
+6. アセンブラファイルのアセンブラ結果をオブジェクトファイルadd.oに出力し、
+   comet2コマンドでadd.oを仮想システムCOMET II上で実行。
+
+ $ ./casl -oadd.o as/add.casl
+ $ ./comet2 -td add.o
+
+7. オプションの確認
+
+ $ ./casl2 --help
+ Usage: ./casl2 [-tdslaAh] [-o <OUTFILE>] FILE ...
+ $ ./comet2 --help
+ Usage: ./comet2 [-tdh] FILE
+
+詳細は、チュートリアル(作成予定)参照。
+
+■ライセンス    
+Copyright (C) 2009 j8takagi (j8takagi@nifty.com)
+(未定。GPL or 修正BSDの予定)
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..7ec06ca
--- /dev/null
+++ b/TODO
@@ -0,0 +1,7 @@
+*ユニットテスト
+*Autoconf導入
+*copyright
+*過去問追加
+*チュートリアル
+*info
+*デジタル署名
diff --git a/as/add.casl b/as/add.casl
new file mode 100644 (file)
index 0000000..2b769a4
--- /dev/null
@@ -0,0 +1,7 @@
+MAIN   START
+BEGIN  LD      GR1,A
+       ADDA    GR1,B
+    RET
+A      DC      3
+B      DC      1
+       END
diff --git a/as/add1.casl b/as/add1.casl
new file mode 100644 (file)
index 0000000..7d470aa
--- /dev/null
@@ -0,0 +1,11 @@
+MAIN   START   BEGIN
+BEGIN  RPUSH
+       LD      GR1,A
+       ADDA    GR1,B
+    ST GR1,C
+    RPOP
+    RET
+A      DC      3
+B      DC      1
+C      DS      1
+       END
diff --git a/as/add2.casl b/as/add2.casl
new file mode 100644 (file)
index 0000000..fac7ac2
--- /dev/null
@@ -0,0 +1,10 @@
+MAIN   START
+BEGIN  LD      GR0,A
+       LD      GR1,B
+       ADDA    GR0,GR1
+    ST GR1,C
+    RET
+A      DC      3
+B      DC      1
+C      DS      1
+       END
diff --git a/as/add_err.casl b/as/add_err.casl
new file mode 100644 (file)
index 0000000..14b2ee5
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN   START   BEGIN
+BEGIN  LD      GR1,A
+       ADEA    GR1,B
+    ST GR1, C
+    RET
+A      DC      3
+B      DC      1
+C      DS      1
+       END
diff --git a/as/add_labelerr.casl b/as/add_labelerr.casl
new file mode 100644 (file)
index 0000000..6f40d11
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN   START   BEGIN
+BEGIN  LD      GR1,A
+       ADDA    GR1,B
+    ST GR1,C
+    RET
+A      DC      3
+A      DC      1
+C      DS      1
+       END
diff --git a/as/add_loop.casl b/as/add_loop.casl
new file mode 100644 (file)
index 0000000..875ea98
--- /dev/null
@@ -0,0 +1,11 @@
+MAIN   START
+BEGIN  LAD     GR0,0
+       LAD     GR1,0
+LOOP   CPA GR1,LEN
+       JZE     FIN
+    LAD        GR1,1,GR1
+       ADDA    GR0,GR1
+    JUMP       LOOP
+FIN    RET
+LEN    DC      10
+       END
diff --git a/as/add_opdspc_err.casl b/as/add_opdspc_err.casl
new file mode 100644 (file)
index 0000000..8ab765a
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN   START   BEGIN
+BEGIN  LD      GR1, A
+       ADDA    GR1,B
+    ST GR1, C
+    RET
+A      DC      3
+B      DC      1
+C      DS      1
+       END
diff --git a/as/add_p.casl b/as/add_p.casl
new file mode 100644 (file)
index 0000000..ca656e0
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN   START
+BEGIN  LD      GR1,A
+       ADDA    GR1,B
+    CALL       ITOA
+    RET
+A      DC      999
+B      DC      998
+C      DS      1
+       END
diff --git a/as/adda_overflow.casl b/as/adda_overflow.casl
new file mode 100644 (file)
index 0000000..82c08bd
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN   START   BEGIN
+BEGIN  LD      GR0,A
+       ADDA    GR0,B
+       ST      GR0,C
+       RET
+A      DC      32766
+B      DC      29
+C      DS      1
+       END
diff --git a/as/addl.casl b/as/addl.casl
new file mode 100644 (file)
index 0000000..d496648
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN    START   BEGIN
+BEGIN   LD  GR0,A
+        ADDL    GR0,B
+        ST  GR0,C
+        RET
+A   DC  32766
+B   DC  29
+C   DS  1
+        END
diff --git a/as/addl_overflow.casl b/as/addl_overflow.casl
new file mode 100644 (file)
index 0000000..5a6f7c9
--- /dev/null
@@ -0,0 +1,11 @@
+MAIN   START   BEGIN
+BEGIN  LD      GR1,A
+       ADDL    GR1,B
+       ADDL    GR1,C
+    ADDL       GR1,D
+       RET
+A      DC      32765
+B      DC      4
+C      DC      32764
+D      DC      7
+       END
diff --git a/as/binout.casl b/as/binout.casl
new file mode 100644 (file)
index 0000000..23577fc
--- /dev/null
@@ -0,0 +1,40 @@
+BINOUT START
+       LAD     GR1,#09CD
+       LAD     GR2,1
+       PUSH    0,GR1
+       PUSH    0,GR2
+       PUSH    0,GR3
+       PUSH    0,GR4
+       LAD     GR2,0
+       LAD     GR3,15
+       LD      GR4,GR1
+       JZE     OUT1
+LOOP1  JMI     ONE
+       LAD     GR3,-1,GR3
+       SLL     GR1,1
+       JUMP    LOOP1
+LOOP2  JMI     ONE
+ZERO   LAD     GR0,48
+       JUMP    STORE
+ONE    LAD     GR0,49
+STORE  ST      GR0,OBUF,GR2
+       LAD     GR2,1,GR2
+       LAD     GR3,-1,GR3
+       CPA     GR3,NZERO
+       JMI     OUT2
+       SLL     GR1,1
+       JUMP    LOOP2
+OUT1   LAD     GR0,48
+       ST      GR0,OBUF,GR2
+       LAD     GR2,1,GR2
+OUT2   ST      GR2,OLNG
+       OUT     OBUF,OLNG
+       POP     GR4
+       POP     GR3
+       POP     GR2
+       POP     GR1
+       RET
+OBUF   DS      16
+OLNG   DS      1
+NZERO  DC      0
+       END
diff --git a/as/count.casl b/as/count.casl
new file mode 100644 (file)
index 0000000..41f8d57
--- /dev/null
@@ -0,0 +1,18 @@
+COUNT1 START
+;       入力    GR1:検索する語
+;       処理    GR1中の'1'のビットの個数を求める
+;       出力    GR0:GR1中の'1'のビットの個数
+       PUSH    0,GR1
+    PUSH       0,GR2
+    SUBA       GR2,GR2
+    AND                GR1,GR1
+    JZE        RETURN
+MORE LAD       GR2,1,GR2
+       LAD             GR0,-1,GR1
+    AND                GR1,GR0
+    JNZ                MORE
+RETURN LD      GR0,GR2
+       POP             GR2
+    POP                GR1
+    RET
+    END
diff --git a/as/count_call.casl b/as/count_call.casl
new file mode 100644 (file)
index 0000000..9f33cfa
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN   START
+       LAD GR1,33
+    CALL COUNT1
+FIN    RET
+       END
diff --git a/as/count_call1.casl b/as/count_call1.casl
new file mode 100644 (file)
index 0000000..933b5a3
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN   START
+       LAD GR1,9
+    CALL COUNT1
+FIN    RET
+       END
diff --git a/as/count_call2.casl b/as/count_call2.casl
new file mode 100644 (file)
index 0000000..b5def9e
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN   START
+       LAD GR1,-1
+    CALL COUNT1
+FIN    RET
+       END
diff --git a/as/cpa1.casl b/as/cpa1.casl
new file mode 100644 (file)
index 0000000..4422daa
--- /dev/null
@@ -0,0 +1,6 @@
+MAIN   START   BEGIN
+BEGIN  LAD     GR1,#5000
+       LAD     GR2,#F000
+       CPA     GR2,GR1
+    RET
+       END
diff --git a/as/dc_overflow.casl b/as/dc_overflow.casl
new file mode 100644 (file)
index 0000000..1225f40
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN   START   BEGIN
+BEGIN  LD      GR0,A
+       ADDL    GR0,B
+       ST      GR0,C
+       RET
+A      DC      32779
+B      DC      32778
+C      DS      1
+       END
diff --git a/as/dc_spc.casl b/as/dc_spc.casl
new file mode 100644 (file)
index 0000000..45dc857
--- /dev/null
@@ -0,0 +1,7 @@
+; DC命令で空白を指定した場合のテスト 
+MAIN    START
+        OUT BUF,LEN
+        RET
+BUF            DC      ' '
+LEN            DC      1
+        END
diff --git a/as/div.casl b/as/div.casl
new file mode 100644 (file)
index 0000000..26fd543
--- /dev/null
@@ -0,0 +1,17 @@
+DIV    START
+BEGIN  LD      GR1,X
+       LD      GR2,A
+LOOP   SUBL    GR1,Y
+    ADDL       GR2,=1
+    CPL        GR1,Y
+       JPL     LOOP
+    JZE LOOP
+MOD    LAD     GR3,0,GR1
+       ST      GR3,M
+FIN    ST      GR2,A
+       RET
+X      DC      87
+Y      DC      11
+A      DC      0
+M      DS      1
+       END
diff --git a/as/div10.casl b/as/div10.casl
new file mode 100644 (file)
index 0000000..b1c1de8
--- /dev/null
@@ -0,0 +1,12 @@
+;GR1を10で割ったときの商をGR2、剰余をGR3に格納
+DIV10  START
+       LD      GR3,GR1
+       LAD     GR2,0
+LOOP   CPA     GR3,TEN
+       JMI     FIN
+    SUBL GR3,TEN
+    LAD        GR2,1,GR2
+    JUMP       LOOP
+FIN    RET
+TEN    DC      10
+       END
diff --git a/as/div10_test.casl b/as/div10_test.casl
new file mode 100644 (file)
index 0000000..3623a48
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN   START
+BEGIN  LAD     GR1,91
+       CALL    DIV10
+       RET
+    END
diff --git a/as/div2.casl b/as/div2.casl
new file mode 100644 (file)
index 0000000..89d7405
--- /dev/null
@@ -0,0 +1,16 @@
+DIV    START
+BEGIN  LD      GR1,X
+       LD      GR2,A
+LOOP   SUBL    GR1,Y
+    ADDL       GR2,=1
+    CPL        GR1,Y
+       JPL     LOOP
+    JZE LOOP
+MOD    ST      GR1,M
+FIN    ST      GR2,A
+       RET
+X      DC      333
+Y      DC      12
+A      DC      0
+M      DS      1
+       END
diff --git a/as/div3.casl b/as/div3.casl
new file mode 100644 (file)
index 0000000..a9eadea
--- /dev/null
@@ -0,0 +1,16 @@
+DIV    START
+BEGIN  LD      GR3,X
+       LD      GR1,Y
+       LD      GR2,A
+       LAD     GR0,0,GR3
+LOOP   SUBL    GR3,Y
+    LAD        GR2,1,GR2
+    CPL        GR3,Y
+       JPL     LOOP
+    JZE LOOP
+       RET
+X      DC      64
+Y      DC      8
+A      DC      0
+M      DS      1
+       END
diff --git a/as/div_call.casl b/as/div_call.casl
new file mode 100644 (file)
index 0000000..50460e7
--- /dev/null
@@ -0,0 +1,8 @@
+MAIN   START
+BEGIN  LD      GR0,X
+       LD      GR1,Y
+    CALL DIV
+       RET
+X      DC      101
+Y      DC      50
+       END
diff --git a/as/div_sub.casl b/as/div_sub.casl
new file mode 100644 (file)
index 0000000..893a2e4
--- /dev/null
@@ -0,0 +1,12 @@
+; GR0に格納された内容とGR1に格納された内容の、
+; 商をGR2、剰余をGR3に格納する
+DIV    START
+    LAD GR2,0
+       LD      GR3,GR0
+LOOP   SUBA    GR3,GR1
+    LAD        GR2,1,GR2
+    CPA        GR3,GR1
+       JPL     LOOP
+    JZE LOOP
+       RET
+    END
diff --git a/as/ds.casl b/as/ds.casl
new file mode 100644 (file)
index 0000000..eb15efb
--- /dev/null
@@ -0,0 +1,13 @@
+MAIN START
+    LAD GR1,=10
+    LAD GR2,=20
+    LD GR1,0,GR1
+    LD GR2,0,GR2
+    ST GR1,A
+    LD GR3,A
+    ST GR2,B
+    LD GR3,A
+    RET
+A DS 0
+B DS 1
+    END
diff --git a/as/ds_err.casl b/as/ds_err.casl
new file mode 100644 (file)
index 0000000..60581b3
--- /dev/null
@@ -0,0 +1,6 @@
+MAIN START
+    LAD GR0,=10
+    ST GR0,A
+A DS
+    RET
+    END
diff --git a/as/floatedit.casl b/as/floatedit.casl
new file mode 100644 (file)
index 0000000..f4121b2
--- /dev/null
@@ -0,0 +1,64 @@
+EDIT   START
+RETRY  IN      INAREA,INLENG
+       LAD     GR1,0
+       OR      GR1,INLENG
+       JZE     FINISH
+       CPA     GR1,TEN
+       JZE     BEGIN
+       OUT     ERRMSG,MSGLNG
+       JUMP    RETRY
+BEGIN  LAD     GR0,1
+       ST      GR0,ZSFLAG
+       LAD     GR1,0
+       LAD     GR2,-1
+       LAD     GR3,0
+LOOP   LD      GR0,MASK,GR3
+       PUSH    1,GR3
+       LD      GR3,INAREA,GR1
+       LAD     GR1,1,GR1
+       CPL     GR0,DIGIT0
+       JZE     ENDSPR
+       CPL     GR0,DIGIT9
+       JNZ     NONDGT
+       CPL     GR3,DIGIT0
+       JNZ     ENDSPR
+       LAD     GR0,0
+       OR      GR0,ZSFLAG
+       JNZ     SUPPRS
+ENDSPR LD      GR0,OTAREA,GR2
+       CPL     GR0,SPACE
+       JNZ     NOT1ST
+       LD      GR0,MASK
+       ST      GR0,OTAREA,GR2
+       LAD     GR0,0
+       ST      GR0,ZSFLAG
+NOT1ST LAD     GR0,0,GR3
+       JUMP    STORE
+NONDGT LAD     GR1,-1,GR1
+       LAD     GR3,0
+       OR      GR3,ZSFLAG
+       JZE     STORE
+SUPPRS LD      GR0,SPACE
+STORE  LAD     GR2,1,GR2
+       ST      GR0,OTAREA,GR2
+       POP     GR3
+       CPA     GR1,INLENG
+       JNZ     LOOP
+       LAD     GR2,1,GR2
+       ST      GR2,OTLENG
+       OUT     OTAREA,OTLENG
+    JUMP RETRY
+FINISH RET
+MASK   DC      '\99,999,990.99'
+SPACE  DC      ' '
+DIGIT0 DC      '0'
+DIGIT9 DC      '9'
+TEN    DC      10
+ERRMSG DC      'input error!'
+MSGLNG DC      12
+INAREA DS      80
+INLENG DS      1
+OTAREA DS      80
+OTLENG DS      1
+ZSFLAG DS      1
+       END
diff --git a/as/hanoi.casl b/as/hanoi.casl
new file mode 100644 (file)
index 0000000..6d294e7
--- /dev/null
@@ -0,0 +1,49 @@
+; ハノイの塔を解くプログラム
+MAIN   START
+       LD      GR0,N
+       LD      GR1,A
+       LD      GR2,B
+       LD      GR3,C
+       CALL    HANOI
+       RET
+
+HANOI  CPA     GR0,=1
+       JZE     DISP
+       SUBA    GR0,=1
+       PUSH    0,GR2
+       PUSH    0,GR3
+       POP     GR2
+       POP     GR3
+       CALL    HANOI
+       PUSH    0,GR2
+       PUSH    0,GR3
+       POP     GR2
+       POP     GR3
+       CALL    DISP
+       PUSH    0,GR1
+       PUSH    0,GR2
+       POP     GR1
+       POP     GR2
+       CALL    HANOI
+       PUSH    0,GR1
+       PUSH    0,GR2
+       POP     GR1
+       POP     GR2
+       ADDA    GR0,=1
+       RET
+
+DISP   ST      GR1,MSG1
+       ST      GR3,MSG2
+       OUT     MSG,LNG
+       RET
+
+N      DC      3       ;輪の総数
+LNG    DC      11      ;メッセージの長さ
+A      DC      'A'
+B      DC      'B'
+C      DC      'C'
+MSG    DC      'from '
+MSG1   DS      1
+       DC      ' to '
+MSG2   DS      1
+       END
diff --git a/as/hello.casl b/as/hello.casl
new file mode 100644 (file)
index 0000000..191f75a
--- /dev/null
@@ -0,0 +1,6 @@
+MAIN     START
+         OUT    BUF,LEN
+         RET
+BUF      DC     'Hello, World!'
+LEN      DC     13
+         END
diff --git a/as/iotest.casl b/as/iotest.casl
new file mode 100644 (file)
index 0000000..74f2a74
--- /dev/null
@@ -0,0 +1,20 @@
+IOTEST START
+       OUT OBUF1,OLEN1
+LOOP IN IOBUF,IOLEN
+       LD      GR1,IOLEN
+    JZE        RETURN
+       OUT OBUF2,OLEN2
+       OUT IOBUF,IOLEN
+       OUT OBUF3,OLEN3
+       JUMP LOOP
+RETURN RET
+; Memory
+OBUF1 DC 'LET''S START. TYPE IN'
+OLEN1 DC 20
+OBUF2 DC 'YOU TYPED'
+OLEN2 DC 9
+OBUF3 DC 'WHAT''S NEXT?'
+OLEN3 DC 12
+IOBUF DS 64
+IOLEN DS 1
+       END
diff --git a/as/itoa.casl b/as/itoa.casl
new file mode 100644 (file)
index 0000000..75338f2
--- /dev/null
@@ -0,0 +1,90 @@
+;GR1に格納された数値を表示
+ITOA   START
+       PUSH 0,GR2
+       PUSH 0,GR3
+       PUSH 0,GR4
+    LAD        GR0,0
+    LAD        GR2,0
+    AND GR1,GR1
+    JPL ILOOP
+    JZE ILOOP
+    LAD GR0,1
+    CALL INV
+ILOOP  CPA     GR1,TEN
+       JMI     INEXT
+       CALL    DIV
+    ADDA       GR4,ZCHAR
+    ST GR4,STR,GR2
+    LAD        GR2,1,GR2
+    LD GR1,GR3
+    JUMP       ILOOP
+INEXT  ADDA    GR1,ZCHAR
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+    CPA GR0,=1
+    JPL        PRT
+    JMI        PRT
+    LD GR1,MINUS
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+PRT    ST      GR2,LEN
+       LAD     GR1,STR
+    LD GR2,LEN
+    CALL REV
+       OUT     STR,LEN
+       POP GR4
+       POP GR3
+       POP GR2
+       RET
+TEN    DC      10
+ZCHAR DC '0'
+MINUS DC '-'
+STR    DS      6
+LEN    DS      1
+    END
+;GR1を10で割ったときの商をGR3、剰余をGR4に格納
+DIV    LD      GR4,GR1
+       LAD     GR3,0
+DLOOP  CPA     GR4,TEN
+       JMI     DFIN
+    SUBL GR4,TEN
+    LAD        GR3,1,GR3
+    JUMP       DLOOP
+DFIN RET
+       END
+;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+;例: 12345 -> 54321
+REV    START
+       PUSH    0,GR3
+    PUSH       0,GR4
+    PUSH       0,GR5
+       LAD     GR3,1
+RPU    CPA     GR2,GR3
+       JMI     RNEXT
+    LD GR4,GR1
+    ADDA       GR4,GR3
+    LD GR4,-1,GR4
+       PUSH 0,GR4
+    LAD        GR3,1,GR3
+    JUMP       RPU
+RNEXT    LAD   GR3,1
+RPO    CPA     GR2,GR3
+       JMI     RFIN
+    POP GR4
+    LD GR5,GR1
+    ADDA GR5,GR3
+    ST GR4,-1,GR5
+    LAD        GR3,1,GR3
+    JUMP RPO
+RFIN POP GR5
+       POP     GR4
+    POP        GR3
+       RET
+       END
+;GR1の内容をマイナス値にする
+;例: 10 -> -10, -20 -> 20
+INV    START
+       XOR     GR1,=#FFFF
+    LAD        GR1,1,GR1
+    RET
+       END
diff --git a/as/itoa0.casl b/as/itoa0.casl
new file mode 100644 (file)
index 0000000..a08844e
--- /dev/null
@@ -0,0 +1,14 @@
+MAIN   START
+BEGIN  LAD     GR1,765
+       CALL    DIV10
+    ADDA       GR3,Z
+    ST GR3,A
+    LAD        GR1,A
+    LAD        GR2,1
+    SVC        2
+    LAD GR1,=#A
+    SVC 2
+       RET
+Z      DC      '0'
+A      DS      1
+    END
diff --git a/as/itoa1.casl b/as/itoa1.casl
new file mode 100644 (file)
index 0000000..f23df07
--- /dev/null
@@ -0,0 +1,34 @@
+MAIN   START
+       LD      GR1,I
+       LAD     GR2,10
+    LAD        GR5,0
+LOOP   CPA     GR1,GR2
+       JMI     NEXT
+       CALL    DIV
+    ADDA       GR4,Z
+    ST GR4,STR,GR5
+    LAD        GR5,1,GR5
+    LD GR1,GR3
+    JUMP       LOOP
+NEXT   ADDA    GR1,Z
+       ST      GR1,STR,GR5
+       LAD     GR5,1,GR5
+       ST      GR5,LEN
+PRT OUT        STR,LEN
+       RET
+I      DC      12345
+Z      DC      '0'
+STR    DS      5
+LEN    DS      1
+    END
+;GR1をGR2で割ったときの商をGR3、剰余をGR4に格納
+DIV    LD      GR4,GR1
+       LAD     GR3,0
+DLOOP  CPA     GR4,GR2
+       JMI     DFIN
+    SUBL GR4,GR2
+    LAD        GR3,1,GR3
+    JUMP       DLOOP
+DFIN RET
+       RET
+       END
diff --git a/as/itoa2.casl b/as/itoa2.casl
new file mode 100644 (file)
index 0000000..73f6977
--- /dev/null
@@ -0,0 +1,66 @@
+MAIN   START
+       LD      GR1,I
+       LAD     GR2,10
+    LAD        GR5,0
+LOOP   CPA     GR1,GR2
+       JMI     NEXT
+       CALL    DIV
+    ADDA       GR4,Z
+    ST GR4,STR,GR5
+    LAD        GR5,1,GR5
+    LD GR1,GR3
+    JUMP       LOOP
+NEXT   ADDA    GR1,Z
+       ST      GR1,STR,GR5
+       LAD     GR5,1,GR5
+       ST      GR5,LEN
+    OUT        STR,LEN
+    LAD        GR1,STR
+    LD GR2,LEN
+    CALL       REV
+PRT OUT        STR,LEN
+       RET
+I      DC      15342
+Z      DC      '0'
+STR    DS      5
+LEN    DS      1
+    END
+;GR1をGR2で割ったときの商をGR3、剰余をGR4に格納
+DIV    LD      GR4,GR1
+       LAD     GR3,0
+DLOOP  CPA     GR4,GR2
+       JMI     DFIN
+    SUBL GR4,GR2
+    LAD        GR3,1,GR3
+    JUMP       DLOOP
+DFIN RET
+       END
+;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+;例: 12345 -> 54321
+REV    START
+       PUSH    0,GR3
+    PUSH       0,GR4
+    PUSH       0,GR5
+       LAD     GR3,1
+RPU    CPA     GR2,GR3
+       JMI     RNEXT
+    LD GR4,GR1
+    ADDA       GR4,GR3
+    LD GR4,-1,GR4
+       PUSH 0,GR4
+    LAD        GR3,1,GR3
+    JUMP       RPU
+RNEXT    LAD   GR3,1
+RPO    CPA     GR2,GR3
+       JMI     PFIN
+    POP        GR4
+    LD GR5,GR1
+    ADDA       GR5,GR3
+    ST GR4,-1,GR5
+    LAD        GR3,1,GR3
+    JUMP       RPO
+PFIN   POP     GR5
+       POP     GR4
+    POP        GR3
+       RET
+       END
diff --git a/as/lad.casl b/as/lad.casl
new file mode 100644 (file)
index 0000000..755c35a
--- /dev/null
@@ -0,0 +1,6 @@
+MAIN   START   BEGIN
+BEGIN  LD      GR1,A
+    LAD        GR1,1,GR1
+       RET
+A      DC      3
+       END
diff --git a/as/ladtest.casl b/as/ladtest.casl
new file mode 100644 (file)
index 0000000..6e8966a
--- /dev/null
@@ -0,0 +1,6 @@
+LADTEST        START
+       LAD     GR1,1
+       LAD     GR2,2
+    LAD        GR3,3
+    RET
+    END
diff --git a/as/ld.casl b/as/ld.casl
new file mode 100644 (file)
index 0000000..0039e85
--- /dev/null
@@ -0,0 +1,8 @@
+; LDコマンド
+MAIN   START   BEGIN
+BEGIN  LD      GR1,A
+    ST GR1,B
+       RET
+A      DC      -2
+B      DS      1
+       END
diff --git a/as/ld2.casl b/as/ld2.casl
new file mode 100644 (file)
index 0000000..5e3fc3a
--- /dev/null
@@ -0,0 +1,6 @@
+; LDコマンド
+MAIN   START   BEGIN
+BEGIN  LAD     GR0,3
+    LD GR1,GR0
+       RET
+       END
diff --git a/as/ld3.casl b/as/ld3.casl
new file mode 100644 (file)
index 0000000..733c109
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN   START
+BEGIN  LD      GR1,I
+       RET
+I      DC      17
+       END
diff --git a/as/ld4.casl b/as/ld4.casl
new file mode 100644 (file)
index 0000000..634c47f
--- /dev/null
@@ -0,0 +1,9 @@
+; LDコマンド
+MAIN   START   BEGIN
+BEGIN  LD  GR1,A
+        LD  GR2,B
+        ADDL  GR1,GR2
+        RET
+A      DC  32767
+B   DC  32675
+       END
diff --git a/as/ld_data.casl b/as/ld_data.casl
new file mode 100644 (file)
index 0000000..af8ce18
--- /dev/null
@@ -0,0 +1,11 @@
+MAIN   START
+        LAD GR2,0
+MLOOP   CPL GR2,LEN
+        JZE MEND
+        LD  GR1,DATA,GR2
+        LAD GR2,1,GR2
+        JUMP    MLOOP
+MEND    RET
+DATA    DC  #9600,#F000,#A400
+LEN     DC  3
+        END
diff --git a/as/ld_zero.casl b/as/ld_zero.casl
new file mode 100644 (file)
index 0000000..43799c6
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN    START
+BEGIN   LD     GR1,0
+        LD     GR2,0,GR1
+        RET
+        END
diff --git a/as/literal_spc.casl b/as/literal_spc.casl
new file mode 100644 (file)
index 0000000..3c034d4
--- /dev/null
@@ -0,0 +1,9 @@
+; リテラルに「=' '」を指定した場合のテスト
+MAIN    START
+        LD  GR1,=' '
+        ST  GR1,BUF      
+        OUT BUF,LEN
+        RET
+BUF            DS      1
+LEN            DC      1
+        END
diff --git a/as/literalstr.casl b/as/literalstr.casl
new file mode 100644 (file)
index 0000000..bd1bbcc
--- /dev/null
@@ -0,0 +1,13 @@
+MAIN START
+       LAD     GR1,='abcdeABCDE'
+    LAD GR2,10
+LOOP CPA GR2,=0
+    JZE LEND
+    JMI LEND
+    LD GR3,0,GR1
+    ADDA GR1,=1
+    SUBA GR2,=1
+    JUMP LOOP
+LEND RET
+LEN DC 5
+    END
diff --git a/as/min_main.casl b/as/min_main.casl
new file mode 100644 (file)
index 0000000..14f397f
--- /dev/null
@@ -0,0 +1,24 @@
+PROG    START   BEGIN
+BEGIN  LAD GR1,A
+        LD  GR3,C5
+        CALL    MINIM
+        ST  GR0,MINA
+        LAD  GR1,B
+        LD  GR3,C5
+        CALL    MINIM
+        ST  GR0,MINB
+        RET
+A   DC  17
+    DC  21
+    DC  15
+    DC  28
+    DC  6
+B   DC  4
+    DC  8
+    DC  21
+    DC  13
+    DC  12
+MINA    DS  1
+MINB    DS  1
+C5  DC  4
+       END
diff --git a/as/min_main2.casl b/as/min_main2.casl
new file mode 100644 (file)
index 0000000..fd0164c
--- /dev/null
@@ -0,0 +1,17 @@
+PROG    START   BEGIN
+BEGIN  LAD GR1,DATA_A
+        LD  GR3,SIZE_A
+        CALL    MINIM
+        ST  GR0,MINA
+        LAD  GR1,B
+        LD  GR3,C5
+        CALL    MINIM
+        ST  GR0,MINB
+        RET
+DATA_A   DC  17,21,15,28,6
+SIZE_A   DC  5
+DATA_B   DC  4,8,21,13,12
+SIZE_B   DC  5
+MINA    DS  1
+MINB    DS  1
+       END
diff --git a/as/min_sub.casl b/as/min_sub.casl
new file mode 100644 (file)
index 0000000..78d385e
--- /dev/null
@@ -0,0 +1,20 @@
+MINIM   START
+       ST      GR3,GOSU
+    LD GR0,0,GR1
+    ST GR0,MIN
+    LAD        GR2,1
+S1  CPA GR2,GOSU
+       JPL     LRET
+    LAD        GR1,1,GR1
+    LD GR0,0,GR1
+    CPA        GR0,MIN
+    JPL        S2
+    JZE        S2
+    ST GR0,MIN
+S2     LAD     GR2,1,GR2
+       JUMP    S1
+LRET   LD      GR0,MIN
+       RET
+GOSU   DS      1
+MIN    DS      1
+       END
diff --git a/as/min_sub2.casl b/as/min_sub2.casl
new file mode 100644 (file)
index 0000000..b873ffa
--- /dev/null
@@ -0,0 +1,19 @@
+MINIM   START
+       ST      GR2,CNT
+    LD GR0,0,GR1
+    ST GR0,MIN
+    LAD        GR3,0
+LOOP  CPA GR3,CNT
+       JZE     MINEND
+    LAD        GR1,1,GR1
+    LD GR0,0,GR1
+    CPA        GR0,MIN
+    JPL        CNTADD
+    ST GR1,MIN
+CNTADD LAD     GR3,1,GR3
+       JUMP    LOOP
+MINEND LD      GR0,MIN
+       RET
+CNT    DS      1
+MIN    DS      1
+       END
diff --git a/as/minus.casl b/as/minus.casl
new file mode 100644 (file)
index 0000000..7e8895d
--- /dev/null
@@ -0,0 +1,8 @@
+MAIN   START
+BEGIN  LD      GR1,A
+       XOR     GR1,B
+    LAD        GR1,1,GR1
+    RET
+A      DC      -3
+B      DC      #FFFF
+       END
diff --git a/as/minus2.casl b/as/minus2.casl
new file mode 100644 (file)
index 0000000..97b69fd
--- /dev/null
@@ -0,0 +1,12 @@
+MAIN   START
+       LAD     GR1,-20
+    CALL MINUS
+       RET
+    END
+MINUS  START
+       CPA GR1,=#FFFF
+    JZE MFIN
+       XOR     GR1,=#FFFF
+    LAD        GR1,1,GR1
+MFIN   RET
+       END
diff --git a/as/mul.casl b/as/mul.casl
new file mode 100644 (file)
index 0000000..ec7b57b
--- /dev/null
@@ -0,0 +1,55 @@
+;平成21年 春期 基本情報技術者 午後 問12-2
+MAIN   START
+       LAD     GR1,X
+       LAD     GR2,Y
+    LAD GR3,A
+    CALL MUL
+       RET
+X      DC      2,3
+Y      DC      4,5
+A   DS  2
+       END
+MUL     START              ; 32ビット×32ビット→32ビット
+        RPUSH
+        PUSH  0,GR3
+        PUSH  0,GR2
+        LD    GR2,1,GR2    ; 乗数下位語を取り出してGR2に設定
+        CALL  MULS         ; 被乗数×乗数下位語→積(A)
+        POP   GR2
+        LD    GR2,0,GR2
+        LAD   GR3,SV       ; 結果の格納先として作業領域を設定
+        CALL  MULS         ; 被乗数×乗数上位語→積(B)
+        LD    GR6,1,GR3
+        POP   GR3
+        ADDL  GR6,0,GR3    ; 積(A)の上位語と積(B)の下位語を加算
+        ST    GR6,0,GR3
+        RPOP
+        RET
+SV      DS    2
+        END
+MULS    START              ; 32ビット×16ビット→32ビット
+        RPUSH
+        LAD   GR6,0        ; 積 上位語の初期化
+        LAD   GR7,0        ; 積 下位語の初期化
+        LD    GR4,0,GR1    ; 被乗数 上位語の取出し
+        LD    GR5,1,GR1    ; 被乗数 下位語の取出し
+LP      SRL   GR2,1        ; 乗数を1ビット右にシフト
+        JOV   ADD32
+        JZE   FIN
+        JUMP  NEXT         ; 加算処理をスキップ
+ADD32   ADDL  GR6,GR4      ; 32ビット+32ビット→32ビット
+        ADDL  GR7,GR5
+        JOV   ADJ1
+        JUMP  NEXT 
+ADJ1    ADDL  GR6,=1       ; けた上げ処理
+NEXT    SLL   GR4,1        ; 被乗数(32ビット)を1ビット左にシフト
+        SLL   GR5,1
+        JOV   ADJ2
+        JUMP  LP
+ADJ2    OR    GR4,=1
+        JUMP  LP
+FIN     ST    GR6,0,GR3    ; 乗算結果の格納
+        ST    GR7,1,GR3
+        RPOP
+        RET
+        END
diff --git a/as/muls.casl b/as/muls.casl
new file mode 100644 (file)
index 0000000..3cb8761
--- /dev/null
@@ -0,0 +1,37 @@
+;平成21年 春期 基本情報技術者 午後 問12
+MAIN    START
+               LAD             GR1,X
+               LD              GR2,Y
+       LAD     GR3,A
+           CALL        MULS
+           RET
+X              DC              10,30
+Y              DC              4
+A          DS          2
+               END
+MULS    START                ; 32ビット×16ビット→32ビット
+        RPUSH
+        LAD    GR6,0        ; 積 上位語の初期化
+        LAD    GR7,0        ; 積 下位語の初期化
+        LD     GR4,0,GR1    ; 被乗数 上位語の取出し
+        LD     GR5,1,GR1    ; 被乗数 下位語の取出し
+LP      SRL    GR2,1        ; 乗数を1ビット右にシフト
+        JOV    ADD32
+        JZE     FIN
+        JUMP   NEXT         ; 加算処理をスキップ
+ADD32   ADDL   GR6,GR4      ; 32ビット+32ビット→32ビット
+        ADDL   GR7,GR5
+        JOV    ADJ1
+        JUMP   NEXT 
+ADJ1    ADDL   GR6,=1       ; けた上げ処理
+NEXT    SLL    GR4,1        ; 被乗数(32ビット)を1ビット左にシフト
+        SLL    GR5,1
+        JOV    ADJ2
+        JUMP   LP
+ADJ2    OR     GR4,=1
+        JUMP   LP
+FIN     ST     GR6,0,GR3    ; 乗算結果の格納
+        ST     GR7,1,GR3
+        RPOP
+        RET
+        END
diff --git a/as/muls2.casl b/as/muls2.casl
new file mode 100644 (file)
index 0000000..ec7b57b
--- /dev/null
@@ -0,0 +1,55 @@
+;平成21年 春期 基本情報技術者 午後 問12-2
+MAIN   START
+       LAD     GR1,X
+       LAD     GR2,Y
+    LAD GR3,A
+    CALL MUL
+       RET
+X      DC      2,3
+Y      DC      4,5
+A   DS  2
+       END
+MUL     START              ; 32ビット×32ビット→32ビット
+        RPUSH
+        PUSH  0,GR3
+        PUSH  0,GR2
+        LD    GR2,1,GR2    ; 乗数下位語を取り出してGR2に設定
+        CALL  MULS         ; 被乗数×乗数下位語→積(A)
+        POP   GR2
+        LD    GR2,0,GR2
+        LAD   GR3,SV       ; 結果の格納先として作業領域を設定
+        CALL  MULS         ; 被乗数×乗数上位語→積(B)
+        LD    GR6,1,GR3
+        POP   GR3
+        ADDL  GR6,0,GR3    ; 積(A)の上位語と積(B)の下位語を加算
+        ST    GR6,0,GR3
+        RPOP
+        RET
+SV      DS    2
+        END
+MULS    START              ; 32ビット×16ビット→32ビット
+        RPUSH
+        LAD   GR6,0        ; 積 上位語の初期化
+        LAD   GR7,0        ; 積 下位語の初期化
+        LD    GR4,0,GR1    ; 被乗数 上位語の取出し
+        LD    GR5,1,GR1    ; 被乗数 下位語の取出し
+LP      SRL   GR2,1        ; 乗数を1ビット右にシフト
+        JOV   ADD32
+        JZE   FIN
+        JUMP  NEXT         ; 加算処理をスキップ
+ADD32   ADDL  GR6,GR4      ; 32ビット+32ビット→32ビット
+        ADDL  GR7,GR5
+        JOV   ADJ1
+        JUMP  NEXT 
+ADJ1    ADDL  GR6,=1       ; けた上げ処理
+NEXT    SLL   GR4,1        ; 被乗数(32ビット)を1ビット左にシフト
+        SLL   GR5,1
+        JOV   ADJ2
+        JUMP  LP
+ADJ2    OR    GR4,=1
+        JUMP  LP
+FIN     ST    GR6,0,GR3    ; 乗算結果の格納
+        ST    GR7,1,GR3
+        RPOP
+        RET
+        END
diff --git a/as/muls_out.casl b/as/muls_out.casl
new file mode 100644 (file)
index 0000000..2adc161
--- /dev/null
@@ -0,0 +1,42 @@
+; Xの2語とYの1語の積をAの2語に格納し、表示
+MAIN   START
+       LAD     GR1,X
+       LD      GR2,Y
+    LAD GR3,A
+    CALL MULS
+    LAD GR2,A
+    LD GR1,0,GR2
+    CALL OUTI
+    LD GR1,1,GR2
+    CALL OUTI
+       RET
+X      DC      1000,10000
+Y      DC      8
+A   DS  2
+       END
+MULS    START              ; 32ビット×16ビット→32ビット
+        RPUSH
+        LAD   GR6,0        ; 積 上位語の初期化
+        LAD   GR7,0        ; 積 下位語の初期化
+        LD    GR4,0,GR1    ; 被乗数 上位語の取出し
+        LD    GR5,1,GR1    ; 被乗数 下位語の取出し
+LP      SRL   GR2,1        ; 乗数を1ビット右にシフト
+        JOV   ADD32
+        JZE   FIN
+        JUMP  NEXT         ; 加算処理をスキップ
+ADD32   ADDL  GR6,GR4      ; 32ビット+32ビット→32ビット
+        ADDL  GR7,GR5
+        JOV   ADJ1
+        JUMP  NEXT 
+ADJ1    ADDL  GR6,=1       ; けた上げ処理
+NEXT    SLL   GR4,1        ; 被乗数(32ビット)を1ビット左にシフト
+        SLL   GR5,1
+        JOV   ADJ2
+        JUMP  LP
+ADJ2    OR    GR4,=1
+        JUMP  LP
+FIN     ST    GR6,0,GR3    ; 乗算結果の格納
+        ST    GR7,1,GR3
+        RPOP
+        RET
+        END
diff --git a/as/muls_p.casl b/as/muls_p.casl
new file mode 100644 (file)
index 0000000..457f236
--- /dev/null
@@ -0,0 +1,42 @@
+;./casl2 as/muls.casl as/itoa.casl 
+MAIN   START
+       LAD     GR1,X
+       LD      GR2,Y
+    LAD GR3,A
+    CALL MULS
+    LAD GR2,A
+    LD GR1,0,GR2
+    CALL ITOA
+    LD GR1,1,GR2
+    CALL ITOA    
+       RET
+X      DC      10,50
+Y      DC      4
+A   DS  2
+       END
+MULS    START              ; 32ビット×16ビット→32ビット
+        RPUSH
+        LAD   GR6,0        ; 積 上位語の初期化
+        LAD   GR7,0        ; 積 下位語の初期化
+        LD    GR4,0,GR1    ; 被乗数 上位語の取出し
+        LD    GR5,1,GR1    ; 被乗数 下位語の取出し
+LP      SRL   GR2,1        ; 乗数を1ビット右にシフト
+        JOV   ADD32
+        JZE   FIN
+        JUMP  NEXT         ; 加算処理をスキップ
+ADD32   ADDL  GR6,GR4      ; 32ビット+32ビット→32ビット
+        ADDL  GR7,GR5
+        JOV   ADJ1
+        JUMP  NEXT 
+ADJ1    ADDL  GR6,=1       ; けた上げ処理
+NEXT    SLL   GR4,1        ; 被乗数(32ビット)を1ビット左にシフト
+        SLL   GR5,1
+        JOV   ADJ2
+        JUMP  LP
+ADJ2    OR    GR4,=1
+        JUMP  LP
+FIN     ST    GR6,0,GR3    ; 乗算結果の格納
+        ST    GR7,1,GR3
+        RPOP
+        RET
+        END
diff --git a/as/multi.casl b/as/multi.casl
new file mode 100644 (file)
index 0000000..3140095
--- /dev/null
@@ -0,0 +1,22 @@
+MAIN   START   BEGIN
+BEGIN  LD      GR1,X
+       LD      GR2,Y
+       LAD     GR3,0
+    LAD        GR4,1
+LOOP   CPA     GR4,GR2
+       JPL     FIN
+       AND     GR2,GR4
+       JZE     NEXT
+    ADDA       GR3,GR1
+       JOV     FIN
+NEXT   SLA     GR1,1
+       JOV     FIN
+       LD      GR2,Y
+    SLA        GR4,1
+    JUMP       LOOP
+FIN    ST      GR3,A
+       RET
+X      DC      6
+Y      DC      5
+A      DS      1
+       END
diff --git a/as/multi2.casl b/as/multi2.casl
new file mode 100644 (file)
index 0000000..898ac23
--- /dev/null
@@ -0,0 +1,14 @@
+;GR0の内容とGR1の内容の積をGR3に格納
+MULTI  START
+       PUSH    0,GR4
+       LAD     GR3,0
+    LAD        GR4,1
+LOOP   CPA     GR2,GR4
+       JMI     FIN
+    ADDA       GR3,GR1
+       JOV     FIN
+    LAD        GR4,1,GR4
+    JUMP       LOOP
+FIN    POP     GR4
+       RET
+       END
diff --git a/as/multi2_test.casl b/as/multi2_test.casl
new file mode 100644 (file)
index 0000000..6262736
--- /dev/null
@@ -0,0 +1,8 @@
+MAIN   START
+BEGIN  LD      GR1,A
+    LD GR2,B
+       CALL    MULTI
+       RET
+A      DC      6
+B      DC      5
+       END
diff --git a/as/multi_call.casl b/as/multi_call.casl
new file mode 100644 (file)
index 0000000..418c8a9
--- /dev/null
@@ -0,0 +1,17 @@
+MAIN   START
+       LAD GR4,0
+LOOP CPA GR4,CNT
+       JZE FIN
+       JPL FIN
+       LD      GR1,X,GR4
+       LD      GR2,Y,GR4
+    CALL MULTI
+    LD GR1,GR3
+    CALL ITOA
+    LAD GR4,1,GR4
+    JUMP LOOP
+FIN    RET
+X      DC      3,3,3,-3,-6
+Y      DC      2,-3,4,5,-17
+CNT DC 5
+       END
diff --git a/as/multi_call0.casl b/as/multi_call0.casl
new file mode 100644 (file)
index 0000000..4341457
--- /dev/null
@@ -0,0 +1,10 @@
+MAIN   START
+       LD      GR1,X,GR4
+       LD      GR2,Y,GR4
+    CALL MULTI
+    LD GR1,GR3
+    CALL ITOA
+FIN    RET
+X      DC      -6
+Y      DC      -17
+       END
diff --git a/as/multi_sub.casl b/as/multi_sub.casl
new file mode 100644 (file)
index 0000000..2d4be0b
--- /dev/null
@@ -0,0 +1,46 @@
+;GR1とGR2の積を、GR3に格納
+MULTI  START
+       PUSH 0,GR4
+    PUSH 0,GR5
+       LAD     GR3,0
+    LAD        GR4,1
+    LAD GR5,0
+M1     AND GR1,GR1
+    JMI        MMIN1
+    JPL        M2
+    LAD GR3,0
+       JUMP MFIN
+MMIN1 XOR GR1,IALL
+    LAD        GR1,1,GR1
+    LD GR5,ON
+M2  AND GR2,GR2
+    JMI        MMIN2
+    JPL        MLOOP
+    LAD GR3,0
+       JUMP MFIN
+MMIN2 XOR GR5,ON
+       XOR GR2,IALL
+    LAD        GR2,1,GR2
+MLOOP  CPA     GR2,GR4
+       JMI     MCOND
+    ST GR4,A
+       AND     GR4,GR2
+       JZE     MNEXT
+    ADDA       GR3,GR1
+       JOV     MFIN
+MNEXT  SLA     GR1,1
+       JOV     MFIN
+       LD      GR4,A
+    SLA        GR4,1
+    JUMP MLOOP
+MCOND AND GR5,GR5
+       JZE MFIN
+       XOR GR3,IALL
+    LAD        GR3,1,GR3
+MFIN POP GR5
+       POP GR4
+       RET
+IALL DC        #FFFF
+ON     DC 1
+A      DS 1
+       END
diff --git a/as/not.casl b/as/not.casl
new file mode 100644 (file)
index 0000000..cae8127
--- /dev/null
@@ -0,0 +1,7 @@
+MAIN   START
+BEGIN  LD      GR1,A
+       XOR     GR1,B
+    RET
+A      DC      3
+B      DC      #FFFF
+       END
diff --git a/as/outi.casl b/as/outi.casl
new file mode 100644 (file)
index 0000000..a56a9db
--- /dev/null
@@ -0,0 +1,178 @@
+;GR1に格納された数値を表示
+OUTI   START
+       PUSH 0,GR2
+       PUSH 0,GR3
+       PUSH 0,GR4
+    LAD        GR0,0
+    LAD        GR2,0
+    AND GR1,GR1
+    JZE INEXT
+    JPL ILOOP
+    LAD GR0,1
+    CALL INV
+ILOOP  CPL     GR1,TEN
+       JMI     INEXT
+       CALL    DIV10
+    ADDL       GR4,ZCHAR
+    ST GR4,STR,GR2
+    LAD        GR2,1,GR2
+    LD GR1,GR3
+    JUMP       ILOOP
+INEXT  ADDL    GR1,ZCHAR
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+    CPL GR0,=1
+    JNZ        PRT
+    LD GR1,MINUS
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+PRT    ST      GR2,LEN
+       LAD     GR1,STR
+    LD GR2,LEN
+    CALL REV
+       OUT     STR,LEN
+       POP GR4
+       POP GR3
+       POP GR2
+       RET
+TEN    DC      10
+ZCHAR DC '0'
+MINUS DC '-'
+STR    DS      6
+LEN    DS      1
+    END
+;GR1を10で割ったときの商をGR3、剰余をGR4に格納
+DIV10  LD      GR4,GR1
+       LAD     GR3,0
+DLOOP  CPL     GR4,TEN
+       JMI     DFIN
+    SUBL GR4,TEN
+    LAD        GR3,1,GR3
+    JUMP       DLOOP
+DFIN RET
+       END
+;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+;例: 12345 -> 54321
+REV    START
+       PUSH    0,GR3
+    PUSH       0,GR4
+    PUSH       0,GR5
+       LAD     GR3,1
+RPU    CPL     GR2,GR3
+       JMI     RNEXT
+    LD GR4,GR1
+    ADDL       GR4,GR3
+    LD GR4,-1,GR4
+       PUSH 0,GR4
+    LAD        GR3,1,GR3
+    JUMP       RPU
+RNEXT    LAD   GR3,1
+RPO    CPL     GR2,GR3
+       JMI     RFIN
+    POP GR4
+    LD GR5,GR1
+    ADDL GR5,GR3
+    ST GR4,-1,GR5
+    LAD        GR3,1,GR3
+    JUMP RPO
+RFIN POP GR5
+       POP     GR4
+    POP        GR3
+       RET
+       END
+;GR1の内容をマイナス値にする
+;例: 10 -> -10, -20 -> 20
+INV    START
+       XOR     GR1,=#FFFF
+    LAD        GR1,1,GR1
+    RET
+       END
+;GR1に格納された数値を表示
+OUTI   START
+       PUSH 0,GR2
+       PUSH 0,GR3
+       PUSH 0,GR4
+    LAD        GR0,0
+    LAD        GR2,0
+    AND GR1,GR1
+    JZE INEXT
+    JPL ILOOP
+    LAD GR0,1
+    CALL INV
+ILOOP  CPL     GR1,TEN
+       JMI     INEXT
+       CALL    DIV10
+    ADDL       GR4,ZCHAR
+    ST GR4,STR,GR2
+    LAD        GR2,1,GR2
+    LD GR1,GR3
+    JUMP       ILOOP
+INEXT  ADDL    GR1,ZCHAR
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+    CPL GR0,=1
+    JNZ        PRT
+    LD GR1,MINUS
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+PRT    ST      GR2,LEN
+       LAD     GR1,STR
+    LD GR2,LEN
+    CALL REV
+       OUT     STR,LEN
+       POP GR4
+       POP GR3
+       POP GR2
+       RET
+TEN    DC      10
+ZCHAR DC '0'
+MINUS DC '-'
+STR    DS      6
+LEN    DS      1
+    END
+;GR1を10で割ったときの商をGR3、剰余をGR4に格納
+DIV10  LD      GR4,GR1
+       LAD     GR3,0
+DLOOP  CPL     GR4,TEN
+       JMI     DFIN
+    SUBL GR4,TEN
+    LAD        GR3,1,GR3
+    JUMP       DLOOP
+DFIN RET
+       END
+;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+;例: 12345 -> 54321
+REV    START
+       PUSH    0,GR3
+    PUSH       0,GR4
+    PUSH       0,GR5
+       LAD     GR3,1
+RPU    CPL     GR2,GR3
+       JMI     RNEXT
+    LD GR4,GR1
+    ADDL       GR4,GR3
+    LD GR4,-1,GR4
+       PUSH 0,GR4
+    LAD        GR3,1,GR3
+    JUMP       RPU
+RNEXT    LAD   GR3,1
+RPO    CPL     GR2,GR3
+       JMI     RFIN
+    POP GR4
+    LD GR5,GR1
+    ADDL GR5,GR3
+    ST GR4,-1,GR5
+    LAD        GR3,1,GR3
+    JUMP RPO
+RFIN POP GR5
+       POP     GR4
+    POP        GR3
+       RET
+       END
+;GR1の内容をマイナス値にする
+;例: 10 -> -10, -20 -> 20
+INV    START
+       XOR     GR1,=#FFFF
+    LAD        GR1,1,GR1
+    RET
+       END
diff --git a/as/outi0.casl b/as/outi0.casl
new file mode 100644 (file)
index 0000000..50c282f
--- /dev/null
@@ -0,0 +1,90 @@
+;GR1に格納された数値を表示
+OUTI   START
+       PUSH 0,GR2
+       PUSH 0,GR3
+       PUSH 0,GR4
+    LAD        GR0,0
+    LAD        GR2,0
+    AND GR1,GR1
+    JPL ILOOP
+    JZE ILOOP
+    LAD GR0,1
+    CALL INV
+ILOOP  CPA     GR1,TEN
+       JMI     INEXT
+       CALL    DIV
+    ADDA       GR4,ZCHAR
+    ST GR4,STR,GR2
+    LAD        GR2,1,GR2
+    LD GR1,GR3
+    JUMP       ILOOP
+INEXT  ADDA    GR1,ZCHAR
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+    CPA GR0,=1
+    JPL        PRT
+    JMI        PRT
+    LD GR1,MINUS
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+PRT    ST      GR2,LEN
+       LAD     GR1,STR
+    LD GR2,LEN
+    CALL REV
+       OUT     STR,LEN
+       POP GR4
+       POP GR3
+       POP GR2
+       RET
+TEN    DC      10
+ZCHAR DC '0'
+MINUS DC '-'
+STR    DS      6
+LEN    DS      1
+    END
+;GR1を10で割ったときの商をGR3、剰余をGR4に格納
+DIV    LD      GR4,GR1
+       LAD     GR3,0
+DLOOP  CPA     GR4,TEN
+       JMI     DFIN
+    SUBL GR4,TEN
+    LAD        GR3,1,GR3
+    JUMP       DLOOP
+DFIN RET
+       END
+;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+;例: 12345 -> 54321
+REV    START
+       PUSH    0,GR3
+    PUSH       0,GR4
+    PUSH       0,GR5
+       LAD     GR3,1
+RPU    CPA     GR2,GR3
+       JMI     RNEXT
+    LD GR4,GR1
+    ADDA       GR4,GR3
+    LD GR4,-1,GR4
+       PUSH 0,GR4
+    LAD        GR3,1,GR3
+    JUMP       RPU
+RNEXT    LAD   GR3,1
+RPO    CPA     GR2,GR3
+       JMI     RFIN
+    POP GR4
+    LD GR5,GR1
+    ADDA GR5,GR3
+    ST GR4,-1,GR5
+    LAD        GR3,1,GR3
+    JUMP RPO
+RFIN POP GR5
+       POP     GR4
+    POP        GR3
+       RET
+       END
+;GR1の内容をマイナス値にする
+;例: 10 -> -10, -20 -> 20
+INV    START
+       XOR     GR1,=#FFFF
+    LAD        GR1,1,GR1
+    RET
+       END
diff --git a/as/outi2.casl b/as/outi2.casl
new file mode 100644 (file)
index 0000000..eddd6fb
--- /dev/null
@@ -0,0 +1,82 @@
+; 数値を表示
+; 入力:
+;   GR1: 開始アドレス
+;   GR2: 語数
+OUTI START
+       RPUSH
+    ST GR1,TMP
+    LAD        GR5,0   ; 語数のカウンタ
+    LAD        GR6,0   ; 全体の桁数
+WLOOP CPL GR5,GR2    ; GR5がGR2より大きい場合は終了
+    JZE IEND
+       JPL     IEND
+    LD GR1,TMP    ; GR1をリセット
+    ADDL GR1,GR5    ; GR1に(GR1+GR5)の内容をロード
+    LD GR1,0,GR1
+    LAD        GR5,1,GR5    ; GR5をインクリメント
+ILOOP  CPL     GR1,TEN    ; GR1が10未満の場合は次の語
+       JMI     WLOOP
+       CALL DIV10    ; GR1を10で割り、商をGR3、剰余をGR4に格納
+    LAD  GR4,ZCHAR,GR4
+    ST GR4,STR,GR6 ; GR4を(STR+GR6)に格納
+    LAD        GR6,1,GR6    ; GR6をインクリメント
+    LD GR1,GR3
+    JUMP ILOOP
+INEXT ADDL GR1,ZCHAR
+       ST      GR1,STR,GR6
+    JUMP WLOOP
+IEND LAD GR6,1,GR6
+    LAD GR1,ZCHAR,GR1
+    ST GR1,STR,GR6
+       ST      GR6,LEN
+       LAD     GR1,STR
+    LD GR2,LEN
+    CALL REV
+       OUT     STR,LEN
+    RPOP
+       RET
+TEN    DC      10
+ZCHAR DC '0'
+TMP DS 1
+STR    DS      10
+LEN    DS      1
+    END
+;GR1を10で割ったときの商をGR3、剰余をGR4に格納
+DIV10  LD      GR4,GR1
+       LAD     GR3,0
+DLOOP  CPL     GR4,TEN
+       JMI     DFIN
+    SUBL GR4,TEN
+    LAD        GR3,1,GR3
+    JUMP       DLOOP
+DFIN RET
+       END
+;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+;例: 12345 -> 54321
+REV    START
+       PUSH    0,GR3
+    PUSH       0,GR4
+    PUSH       0,GR5
+       LAD     GR3,1
+RPU    CPL     GR2,GR3
+       JMI     RNEXT
+    LD GR4,GR1
+    ADDL       GR4,GR3
+    LD GR4,-1,GR4
+       PUSH 0,GR4
+    LAD        GR3,1,GR3
+    JUMP       RPU
+RNEXT    LAD   GR3,1
+RPO    CPL     GR2,GR3
+       JMI     RFIN
+    POP GR4
+    LD GR5,GR1
+    ADDL GR5,GR3
+    ST GR4,-1,GR5
+    LAD        GR3,1,GR3
+    JUMP RPO
+RFIN POP GR5
+       POP     GR4
+    POP        GR3
+       RET
+       END
diff --git a/as/outi2_call.casl b/as/outi2_call.casl
new file mode 100644 (file)
index 0000000..907e678
--- /dev/null
@@ -0,0 +1,8 @@
+; need outi.casl
+MAIN   START
+       LAD GR1,A
+    LAD        GR2,5
+    CALL OUTI
+FIN    RET
+A      DC      12,67891,20,12,23
+       END
diff --git a/as/outi_call.casl b/as/outi_call.casl
new file mode 100644 (file)
index 0000000..bcfaf67
--- /dev/null
@@ -0,0 +1,6 @@
+; need outi.casl
+MAIN   START
+       LAD GR1,#8000
+    CALL OUTI
+FIN    RET
+       END
diff --git a/as/outtest.casl b/as/outtest.casl
new file mode 100644 (file)
index 0000000..46c2a8e
--- /dev/null
@@ -0,0 +1,7 @@
+OTEST START
+       OUT IOBUF,IOLEN
+       RET
+        ; Memory
+IOBUF DC 'aaaa',10,'b','c',10,'as','qwerty','111111'
+IOLEN DC 24
+       END
diff --git a/as/outtest1.casl b/as/outtest1.casl
new file mode 100644 (file)
index 0000000..32f4757
--- /dev/null
@@ -0,0 +1,7 @@
+OTEST START
+       OUT IOBUF,IOLEN
+       RET
+        ; Memory
+IOBUF DC 'abcd'
+IOLEN DC 4
+       END
diff --git a/as/outtest2.casl b/as/outtest2.casl
new file mode 100644 (file)
index 0000000..7b3b31d
--- /dev/null
@@ -0,0 +1,16 @@
+OTEST START
+    PUSH 0,GR1
+    PUSH 0,GR2
+    LAD GR1,OBUF
+    LD GR2,LEN
+    SVC 2
+    LAD GR1,=#A
+    LAD GR2,1
+    SVC 2
+    POP GR2
+    POP GR1
+       RET
+        ; Memory
+OBUF DC 'abcd'
+LEN DC 4
+       END
diff --git a/as/outtest_err.casl b/as/outtest_err.casl
new file mode 100644 (file)
index 0000000..b902c88
--- /dev/null
@@ -0,0 +1,7 @@
+OTEST START
+       OUT IOBUF,IOLEN
+       RET
+        ; Memory
+IOBUF 5
+IOLEN DC 100
+       END
diff --git a/as/ptn1.casl b/as/ptn1.casl
new file mode 100644 (file)
index 0000000..f14c24e
--- /dev/null
@@ -0,0 +1,10 @@
+PTN1   START
+               PUSH    0,GR1
+           LAD     GR2,15
+        SUBL    GR2,GR1
+        LD      GR1,GR2
+        LD      GR2,=#8000
+        SRA     GR2,0,GR1
+        POP     GR1
+        RET
+        END
diff --git a/as/ptn1_call.casl b/as/ptn1_call.casl
new file mode 100644 (file)
index 0000000..c0f838d
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN    START
+        LAD     GR1,5
+        CALL    PTN1
+        RET
+        END
diff --git a/as/ptn2.casl b/as/ptn2.casl
new file mode 100644 (file)
index 0000000..4714518
--- /dev/null
@@ -0,0 +1,10 @@
+PTN2    START
+        PUSH    0,GR1
+        LAD     GR2,16
+        SUBL    GR2,GR1
+        LD      GR1,GR2
+        LD      GR2,=#FFFF
+        SRL     GR2,0,GR1
+        POP     GR1
+        RET
+        END
diff --git a/as/ptn2_call.casl b/as/ptn2_call.casl
new file mode 100644 (file)
index 0000000..703261a
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN    START
+        LAD     GR1,5
+        CALL    PTN2
+        RET
+        END
diff --git a/as/ptn3.casl b/as/ptn3.casl
new file mode 100644 (file)
index 0000000..e262081
--- /dev/null
@@ -0,0 +1,5 @@
+PTN3   START
+       LD      GR2,=#0001
+       SLL     GR2,0,GR1
+       RET
+       END
diff --git a/as/ptn3_call.casl b/as/ptn3_call.casl
new file mode 100644 (file)
index 0000000..3c3e7ec
--- /dev/null
@@ -0,0 +1,5 @@
+MAIN    START
+        LAD     GR1,5
+        CALL    PTN3
+        RET
+        END
diff --git a/as/ptn4.casl b/as/ptn4.casl
new file mode 100644 (file)
index 0000000..5fbac0f
--- /dev/null
@@ -0,0 +1,14 @@
+PTN4    START
+        ST      GR1,WRK
+        LD      GR1,GR2
+        CALL    PTN1
+        PUSH    0,GR2       ; PTN1 の結果を一時保存
+        LD      GR1,WRK
+        LAD     GR1,1,GR1   ; ビット番号の調整
+        CALL    PTN2
+        POP     GR1         ; 保存していた PTN1 の結果を GR1 ヘ
+        XOR     GR2,GR1
+        LD      GR1,WRK
+        RET
+WRK     DS      1
+        END
diff --git a/as/ptn4_call.casl b/as/ptn4_call.casl
new file mode 100644 (file)
index 0000000..24d0fa5
--- /dev/null
@@ -0,0 +1,6 @@
+MAIN    START
+        LAD     GR1,10
+        LAD     GR2,5
+        CALL    PTN4
+        RET
+        END
diff --git a/as/pushpop.casl b/as/pushpop.casl
new file mode 100644 (file)
index 0000000..e466248
--- /dev/null
@@ -0,0 +1,11 @@
+OTEST START
+       LD GR1,=1
+    LD GR2,=2
+    PUSH 0,GR1
+    PUSH 0,GR2
+    LAD GR1,0
+    LAD GR2,0
+    POP GR2
+    POP GR1
+       RET
+       END
diff --git a/as/revtest.casl b/as/revtest.casl
new file mode 100644 (file)
index 0000000..69c2b02
--- /dev/null
@@ -0,0 +1,31 @@
+MAIN   START
+       OUT     STR,LEN
+    LAD        GR1,STR
+    LD GR2,LEN
+    CALL       REV
+       OUT     STR,LEN
+    RET
+STR    DC      '12345'
+LEN    DC      5
+    END
+REV    START
+       LAD     GR3,1
+RPU    CPA     GR2,GR3
+       JMI     RNEXT
+    LD GR4,GR1
+    ADDA       GR4,GR3
+    LD GR4,-1,GR4
+       PUSH 0,GR4
+    LAD        GR3,1,GR3
+    JUMP       RPU
+RNEXT    LAD   GR3,1
+RPO    CPA     GR2,GR3
+       JMI     PFIN
+    POP        GR4
+    LD GR5,GR1
+    ADDA       GR5,GR3
+    ST GR4,-1,GR5
+    LAD        GR3,1,GR3
+    JUMP       RPO
+PFIN   RET
+       END
diff --git a/as/sla2.casl b/as/sla2.casl
new file mode 100644 (file)
index 0000000..16eec58
--- /dev/null
@@ -0,0 +1,8 @@
+SLA2   START   BEGIN
+BEGIN  LD      GR1,X
+       SLA     GR1,2
+    ST GR1,Y
+       RET
+X      DC      3
+Y      DS      1
+       END
diff --git a/as/sra2.casl b/as/sra2.casl
new file mode 100644 (file)
index 0000000..66e5d5e
--- /dev/null
@@ -0,0 +1,8 @@
+SLA2   START   BEGIN
+BEGIN  LD      GR4,X
+       SRA     GR4,2
+    ST GR4,Y
+       RET
+X      DC      124
+Y      DS      1
+       END
diff --git a/as/sra3.casl b/as/sra3.casl
new file mode 100644 (file)
index 0000000..b056150
--- /dev/null
@@ -0,0 +1,6 @@
+SLA2   START   BEGIN
+BEGIN  LD      GR0,X
+       SRA     GR0,2
+       RET
+X      DC      #7A31
+       END
diff --git a/as/sra4.casl b/as/sra4.casl
new file mode 100644 (file)
index 0000000..e4e8f99
--- /dev/null
@@ -0,0 +1,8 @@
+SRA4    START   BEGIN
+BEGIN   LD  GR0,X
+        LD  GR1,Y
+        SRA GR0,1,GR1
+        RET
+X   DC  #A238
+Y   DC  2
+        END
diff --git a/as/suba_p.casl b/as/suba_p.casl
new file mode 100644 (file)
index 0000000..d4b5ebc
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN   START
+BEGIN  LD      GR1,A
+       SUBA    GR1,B
+    CALL       ITOA
+    RET
+A      DC      0
+B      DC      #7FFF
+C      DS      1
+       END
diff --git a/as/suba_p2.casl b/as/suba_p2.casl
new file mode 100644 (file)
index 0000000..5b3a899
--- /dev/null
@@ -0,0 +1,95 @@
+MAIN   START
+BEGIN  LD      GR1,A
+       SUBA    GR1,B
+    CALL       ITOA
+    RET
+A      DC      0
+B      DC      #7FFF
+C      DS      1
+       END
+ITOA   START
+       PUSH 0,GR2
+       PUSH 0,GR3
+       PUSH 0,GR4
+    LAD        GR0,0
+    LAD        GR2,0
+    AND GR1,GR1
+    JPL LOOP
+    JZE LOOP
+    LAD GR0,1
+    CALL MINUS
+LOOP   CPA     GR1,=10
+       JMI     NEXT
+       CALL    DIV
+    ADDA       GR4,='0'
+    ST GR4,STR,GR2
+    LAD        GR2,1,GR2
+    LD GR1,GR3
+    JUMP       LOOP
+NEXT   ADDA    GR1,='0'
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+    CPA GR0,=1
+    JPL        PRT
+    JMI        PRT
+    LD GR1,='-'
+       ST      GR1,STR,GR2
+       LAD     GR2,1,GR2
+PRT    ST      GR2,LEN
+       LAD     GR1,STR
+    LD GR2,LEN
+    CALL REV
+       OUT     STR,LEN
+       POP GR4
+       POP GR3
+       POP GR2
+       RET
+STR    DS      6
+LEN    DS      1
+    END
+;GR1を10で割ったときの商をGR3、剰余をGR4に格納
+DIV    LD      GR4,GR1
+       LAD     GR3,0
+DLOOP  CPA     GR4,=10
+       JMI     DFIN
+    SUBL GR4,=10
+    LAD        GR3,1,GR3
+    JUMP       DLOOP
+DFIN RET
+       END
+;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+;例: 12345 -> 54321
+REV    START
+       PUSH    0,GR3
+    PUSH       0,GR4
+    PUSH       0,GR5
+       LAD     GR3,1
+RPU    CPA     GR2,GR3
+       JMI     RNEXT
+    LD GR4,GR1
+    ADDA       GR4,GR3
+    LD GR4,-1,GR4
+       PUSH 0,GR4
+    LAD        GR3,1,GR3
+    JUMP       RPU
+RNEXT    LAD   GR3,1
+RPO    CPA     GR2,GR3
+       JMI     RFIN
+    POP GR4
+    LD GR5,GR1
+    ADDA GR5,GR3
+    ST GR4,-1,GR5
+    LAD        GR3,1,GR3
+    JUMP RPO
+RFIN POP GR5
+       POP     GR4
+    POP        GR3
+       RET
+       END
+;GR1の内容をマイナス値にする
+;例: 10 -> -10, -20 -> 20
+MINUS  START
+       XOR     GR1,=#FFFF
+    LAD        GR1,1,GR1
+    RET
+       END
diff --git a/as/summary.casl b/as/summary.casl
new file mode 100644 (file)
index 0000000..4d52851
--- /dev/null
@@ -0,0 +1,60 @@
+SUMMARY START
+        RPUSH
+; カウンタ領域と出力バッファを初期化
+        LD    GR2,=0
+        LD    GR3,=' '
+        LD    GR4,=0          ; ループカウンタ
+        LAD   GR5,PBUF        ; 出力バッファのポインタ
+LOOP1   ST    GR2,COUNTR,GR4  ; カウンタ領域を初期化
+        ST    GR3,0,GR5       ; 出力バッファを空白で初期化
+        ST    GR3,1,GR5
+        ST    GR3,2,GR5
+        LAD   GR5,3,GR5       ; 出力バッファのポインタを更新
+        LAD   GR4,1,GR4       ; ループカウンタを更新
+        CPA   GR4,=16
+        JMI   LOOP1
+; 項目ごとに "はい" と答えた人数を集計
+        LD    GR5,=0          ; GR5: "はい" の人数の最大値
+LOOP2   LD    GR4,=0          ; カウンタ領域のポインタ
+        LD    GR2,0,GR1       ; GR2 ←1人分の回答
+LOOP3   SLL   GR2,1           ; 回答は "はい" ?
+        JOV   ON
+        JZE   NEXTW           ; 残りの項目はすべて "いいえ"
+        JUMP  OFF
+ON      LD    GR3,COUNTR,GR4  ; カウンタに1を加算
+        ADDA  GR3,=1
+        ST    GR3,COUNTR,GR4
+        CPA   GR3,GR5         ; 最大値と比較
+        JPL   CHANGE
+        JUMP  OFF
+CHANGE  LD    GR5,GR3         ; 最大値を入替え
+OFF     LAD   GR4,1,GR4       ; 次の項目
+        JUMP  LOOP3
+NEXTW   LAD   GR1,1,GR1
+        SUBA  GR0,=1          ; 全回答処理済?
+        JPL   LOOP2
+; 集計結果を棒グラフで出力
+        LD    GR5,GR5
+        JZE   FIN
+        LD    GR0,='*'
+LOOP4   LD    GR3,=1          ; 出力バッファのポインタ
+        LD    GR4,=0          ; カウンタ領域のポインタ
+LOOP5   CPA   GR5,COUNTR,GR4  ; "はい" の人数と比較
+        JNZ   NOTSET
+        ST    GR0,PBUF,GR3    ; 出力バッファに "*" を設定
+NOTSET  LAD   GR3,3,GR3       ; 出力バッファのポインタを更新
+        LAD   GR4,1,GR4       ; カウンタ領域のポインタを更新
+        CPA   GR4,=16
+        JMI   LOOP5
+        OUT   PBUF,PLEN
+        SUBA  GR5,=1
+        JPL   LOOP4
+FIN     OUT   FOOTER,PLEN
+        RPOP
+        RET
+COUNTR  DS    16              ; カウンタ領域
+PLEN    DC    48
+PBUF    DS    48              ; 出力バッファ
+FOOTER  DC    '01 02 03 04 05 06 07 08 09 10 11 12 13 '
+        DC    '14 15 16 '
+        END
diff --git a/as/summary_call.casl b/as/summary_call.casl
new file mode 100644 (file)
index 0000000..106d6da
--- /dev/null
@@ -0,0 +1,8 @@
+MAIN    START
+        LAD GR1,DATA
+        LD  GR0,CNT
+        CALL SUMMARY
+        RET
+DATA    DC  #9600,#F000,#A400
+CNT     DC  3
+        END
diff --git a/as/summary_call2.casl b/as/summary_call2.casl
new file mode 100644 (file)
index 0000000..9287f86
--- /dev/null
@@ -0,0 +1,8 @@
+MAIN    START
+        LAD GR1,DATA
+        LD  GR0,CNT
+        CALL SUMMARY
+        RET
+DATA    DC  #9600,#F000,#A400,#FFFF,0,#2
+CNT     DC  6
+        END
diff --git a/as/summary_lderr.casl b/as/summary_lderr.casl
new file mode 100644 (file)
index 0000000..e3720c9
--- /dev/null
@@ -0,0 +1,60 @@
+SUMMARY START
+        RPUSH
+; カウンタ領域と出力バッファを初期化
+        LD    GR2,=0
+        LD    GR3,=' '
+        LD    GR4,=0          ; ループカウンタ
+        LAD   GR5,PBUF        ; 出力バッファのポインタ
+LOOP1   ST    GR2,COUNTR,GR4  ; カウンタ領域を初期化
+        ST    GR3,0,GR5       ; 出力バッファを空白で初期化
+        ST    GR3,1,GR5
+        ST    GR3,2,GR5
+        LAD   GR5,3,GR5       ; 出力バッファのポインタを更新
+        LAD   GR4,1,GR4       ; ループカウンタを更新
+        CPA   GR4,=16
+        JMI   LOOP1
+; 項目ごとに "はい" と答えた人数を集計
+        LD    GR5,=0          ; GR5: "はい" の人数の最大値
+LOOP2   LD    GR4,=0          ; カウンタ領域のポインタ
+        LD    GR2,0,GR1       ; GR2 ←1人分の回答
+LOOP3   SLL   GR2,1           ; 回答は "はい" ?
+        JOV   ON
+        JZE   NEXTW           ; 残りの項目はすべて "いいえ"
+        JUMP  OFF
+ON      LD    GR3,COUNTR,GR4  ; カウンタに1を加算
+        ADDA  GR3,=1
+        ST    GR3,COUNTR,GR4
+        CPA   GR3,GR5         ; 最大値と比較
+        JPL   CHANGE
+        JUMP  OFF
+CHANGE  LD    GR5,GR3         ; 最大値を入替え
+OFF     LAD   GR4,1,GR4       ; 次の項目
+        JUMP  LOOP3
+NEXTW   LAD   GR1,1,GR1
+        SUBA  GR0,=1          ; 全回答処理済?
+        JPL   LOOP2
+; 集計結果を棒グラフで出力
+        LD    GR5,GR5
+        JZE   FIN
+        LD    GR0,='*'
+LOOP4   LD    GR3,=1          ; 出力バッファのポインタ
+        LD    GR4,0           ; カウンタ領域のポインタ
+LOOP5   CPA   GR5,COUNTR,GR4  ; "はい" の人数と比較
+        JNZ   NOTSET
+        ST    GR0,PBUF,GR3    ; 出力バッファに "*" を設定
+NOTSET  LAD   GR3,3,GR3       ; 出力バッファのポインタを更新
+        LAD   GR4,1,GR4       ; カウンタ領域のポインタを更新
+        CPA   GR4,=16
+        JMI   LOOP5
+        OUT   PBUF,PLEN
+        SUBA  GR5,=1
+        JPL   LOOP4
+FIN     OUT   FOOTER,PLEN
+        RPOP
+        RET
+COUNTR  DS    16              ; カウンタ領域
+PLEN    DC    48
+PBUF    DS    48              ; 出力バッファ
+FOOTER  DC    '01 02 03 04 05 06 07 08 09 10 11 12 13 '
+        DC    '14 15 16 '
+        END
diff --git a/as/svctest.casl b/as/svctest.casl
new file mode 100644 (file)
index 0000000..d614c3e
--- /dev/null
@@ -0,0 +1,15 @@
+; ./casl2 as/svctest.casl as/div10.casl
+MAIN   START
+BEGIN  LAD     GR0,91
+       CALL    DIV10
+    ST GR3,A
+    LD GR1,A
+    ADDA       GR1,Z
+    LAD        GR2,1
+    SVC        2
+    LAD GR1,=#A
+    SVC 2
+       RET
+D      DC      '0'
+A      DS      1
+    END
diff --git a/as/xor.casl b/as/xor.casl
new file mode 100644 (file)
index 0000000..a587fab
--- /dev/null
@@ -0,0 +1,7 @@
+MAIN   START
+BEGIN  LAD     GR0,#3444
+       LD      GR1,A
+       XOR     GR0,A
+    RET
+A      DC      #00DD
+       END
diff --git a/as/xor0.casl b/as/xor0.casl
new file mode 100644 (file)
index 0000000..ced17dd
--- /dev/null
@@ -0,0 +1,8 @@
+MAIN   START
+BEGIN  LD      GR1,A
+       LD      GR2,A
+       XOR     GR1,GR2
+    RET
+A      DC      #8001
+B      DC      #3521
+       END
diff --git a/as/xor1.casl b/as/xor1.casl
new file mode 100644 (file)
index 0000000..a587fab
--- /dev/null
@@ -0,0 +1,7 @@
+MAIN   START
+BEGIN  LAD     GR0,#3444
+       LD      GR1,A
+       XOR     GR0,A
+    RET
+A      DC      #00DD
+       END
diff --git a/as/zero1.casl b/as/zero1.casl
new file mode 100644 (file)
index 0000000..e874423
--- /dev/null
@@ -0,0 +1,13 @@
+MAIN   START
+BEGIN  XOR     GR2,GR2
+LOOP   CPA     GR2,LEN
+    JZE LAST
+    JPL        LAST
+       LD      GR1,A,GR2
+    XOR        GR1,GR1
+    LAD        GR2,1,GR2
+    JUMP LOOP
+LAST RET
+A      DC      #8001,#8000,#FFFF,#51,#7FFF
+LEN    DC      5
+       END
diff --git a/casl2 b/casl2
new file mode 100755 (executable)
index 0000000..ca2c1f6
Binary files /dev/null and b/casl2 differ
diff --git a/comet2 b/comet2
new file mode 100755 (executable)
index 0000000..b1d553d
Binary files /dev/null and b/comet2 differ
diff --git a/include/assemble.h b/include/assemble.h
new file mode 100644 (file)
index 0000000..fddad63
--- /dev/null
@@ -0,0 +1,143 @@
+/* CASL IIの制限 */
+enum {
+    LINESIZE = 1024,    /* 行の最大文字数 */
+    TOKENSIZE = 256,    /* トークンの最大文字数 */
+    LABELSIZE = 8,    /* ラベルの最大文字数 */
+    LABELTABSIZE = 256,    /* ラベルの最大数 */
+    OPDSIZE = 40     /* オペラントの最大数 */
+};
+
+/* 値を格納するポインタ */
+extern WORD ptr;
+
+/* リテラル(=付きの値)を格納するポインタ */
+extern WORD lptr;
+
+/* アセンブラ命令とマクロ命令を表す番号 */
+typedef enum {
+    START = 01,
+    END = 02,
+    DS = 03,
+    DC = 04,
+    IN = 011,
+    OUT = 012,
+    RPUSH = 013,
+    RPOP = 014
+} CASLCMD;
+
+/* アセンブラ命令とマクロ命令を表す配列 */
+typedef struct {
+    CASLCMD cmdid;
+    int opdc_min;
+    int opdc_max;
+    char *cmd;
+} CMDARRAY;
+
+/* ラベル表 */
+typedef struct _LABELTAB {
+    struct _LABELTAB *next;
+    char *name;
+    WORD adr;
+} LABELTAB;
+
+/* アセンブラが、1回目か、2回目か、を表す */
+typedef enum {
+    FIRST = 0,
+    SECOND = 1
+} PASS;
+
+/* ラベル表からアドレスを検索する */
+WORD getlabel(const char *label);
+
+/* ラベルを表に追加する */
+bool addlabel(const char *label, WORD word);
+
+/* ラベル表を表示する */
+void printlabel();
+
+/* ラベル表を解放する */
+void freelabel();
+
+/* オペランド */
+typedef struct {
+    int opdc;
+    char *opdv[OPDSIZE];
+} OPD;
+
+/* 命令行 */
+typedef struct {
+    char *label;
+    char *cmd;
+    OPD *opd;
+} CMDLINE;
+
+/* 命令がマクロ命令の場合はメモリに書込
+   書込に成功した場合TRUE、それ以外の場合はFALSEを返す */
+bool macrocmd(const CMDLINE *cmdl, PASS pass);
+
+/* 「,」区切りの文字列から、オペランドを取得する */
+OPD *opdtok(const char *str);
+
+/* 1行を解析する */
+CMDLINE *linetok(const char *line);
+
+/* 汎用レジスタを表す文字列「GR[0-7]」をWORD値に変換
+   is_xがTRUEの場合は、指標レジスタとして用いる汎用レジスタ
+   文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
+WORD getgr(const char *str, bool is_x);
+
+/* 10進定数をWORDに変換 */
+WORD getint(const char *str);
+
+/* 16進定数をWORDに変換 */
+WORD gethex(const char *str);
+
+/* アドレスを返す */
+/* アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */
+WORD getadr(const char *str, PASS pass);
+
+/* 定数の前に等号(=)をつけて記述される、リテラルを返す */
+/* リテラルには、10進定数/16進定数/文字定数が含まれる */
+WORD getliteral(const char *str, PASS pass);
+
+/* COMET IIのメモリにアドレス値を書き込む */
+bool writememory(WORD word, WORD adr, PASS pass);
+
+/* ' 'で囲まれた、文字定数をメモリに書込 */
+/* DC命令とリテラルで使い、リテラルの場合はリテラル領域に書込 */
+void writestr(const char *str, bool literal, PASS pass);
+
+/* アセンブラ命令DCをメモリに書込 */
+void writeDC(const char *str, PASS pass);
+
+/* 命令がアセンブラ命令の場合は処理を実行する。
+   実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
+bool assemblecmd(const CMDLINE *cmdl, PASS pass);
+
+/* 命令のコードを返す
+   命令が無効な場合は0xFFFF */
+WORD getcmd(CMDTYPE type, const char *cmd);
+
+/* 命令が機械語命令の場合は処理を実行
+   実行に成功した場合TRUE、それ以外の場合はFALSEを返す */
+bool cometcmd(const CMDLINE *cmdl, PASS pass);
+
+/* 1行のアセンブル */
+/* アセンブル完了時はTRUE、未完了時はFALSEを返す */
+bool assembleline(const CMDLINE *cmdl, PASS pass);
+
+/* 指定された名前のファイルをアセンブル */
+/* 2回実行される */
+bool assemble(const char *file, PASS pass);
+
+/* マクロ命令「IN IBUF,LEN」をメモリに書込 */
+bool writeIN(const char *ibuf, const char *len, PASS pass);
+
+/* マクロ命令「OUT OBUF,LEN」をメモリに書込 */
+bool writeOUT(const char *obuf, const char *len, PASS pass);
+
+/* マクロ命令「RPUSH」をメモリに書込 */
+bool writeRPUSH(PASS pass);
+
+/* マクロ命令「RPOP」をメモリに書込 */
+bool writeRPOP(PASS pass);
diff --git a/include/casl2.h b/include/casl2.h
new file mode 100644 (file)
index 0000000..4f933b4
--- /dev/null
@@ -0,0 +1,145 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <malloc.h>
+#include <ctype.h>
+#include <assert.h>
+#include <stdbool.h>
+#define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0]))
+
+/* COMET IIの規格 */
+enum {
+    CMDSIZE = 4,    /* 命令の最大文字数 */    
+    REGSIZE = 8,     /* レジスタの数。COMET II規格では、8 */
+    MEMSIZE = 512    /* 主記憶の容量。COMET II規格では、65536語 */
+};
+
+/* ハッシュ値を取得する */
+unsigned hash(const char *key, int size);
+
+/* COMET IIの基本データサイズ */
+typedef unsigned short WORD;
+
+/* COMET IIのメモリ */
+extern WORD memory[MEMSIZE];
+
+/* COMET IIのCPUレジスタ */
+extern WORD GR[REGSIZE], SP, PR, FR;
+
+/* COMET II フラグのマスク値 */
+enum {
+    OF = 0x4,    /* Overflow Flag */
+    SF = 0x2,    /* Sign Flag */
+    ZF = 0x1     /* Zero Flag */
+};
+
+/* エラー番号 */
+extern int cerrno;
+
+/* エラーメッセージ */
+extern char *cerrmsg;
+
+/* レジストリの内容を表示する場合はTRUE */
+extern bool tracemode;
+
+/* レジストリの内容を論理値(0〜65535)で表示する場合はTRUE */
+extern bool logicalmode;
+
+/* メモリの内容を表示する場合はTRUE */
+extern bool dumpmode;
+
+/* ソースを表示する場合はTRUE */
+extern bool srcmode;
+
+/* ラベル表を表示する場合はTRUE */
+extern bool labelmode;
+
+/* アセンブラ詳細結果を表示するならTRUE */
+extern bool asdetailmode;
+
+/* アセンブルだけを行う場合はTRUE */
+extern bool onlyassemblemode;
+
+/* 実行開始番地 */
+extern WORD startptr;
+
+/* 実行終了番地 */
+extern WORD endptr;
+
+/* COMET II 命令
+   命令タイプは、オペランドにより6つに分類
+       R_ADR_X = 010: オペランド数2または3。
+                第1オペランドは汎用レジスタ、第2オペランドはアドレス、第3オペランドは指標レジスタ
+       R_ADR_X_ = 011: 同上。ただし、実効アドレスに格納されている内容を示す
+       R1_R2 = 020: オペランド数2。第1オペランド、第2オペランドともに汎用レジスタ
+       ADR_X = 030: オペランド数1または2。第1オペランドはアドレス、第2オペランドは指標レジスタ
+       R_ = 040: オペランド数1。第1オペランドはGR
+       NONE = 0: オペランドなし
+*/
+typedef enum {
+    R_ADR_X = 010,
+    R_ADR_X_ = 011,
+    R1_R2 = 020,
+    ADR_X = 030,
+    R_ = 040,
+    NONE = 0
+} CMDTYPE;
+
+typedef struct {
+    char *cmd;
+    CMDTYPE type;
+    WORD code;
+} CMDCODEARRAY;
+
+/* 命令コードのハッシュ表 */
+typedef struct _CMDCODETAB {
+    struct _CMDCODETAB *next;
+    CMDCODEARRAY *cca;
+} CMDCODETAB;
+
+/* 命令と命令タイプがキーのハッシュ表を作成する */
+bool create_cmdtype_code();
+
+/* 命令と命令タイプから、命令コードを取得する。
+   無効な場合は0xFFFFを返す */
+WORD getcmdcode(const char *cmd, CMDTYPE type);
+
+/* 命令と命令タイプからハッシュ値を生成する */
+unsigned hash_cmdtype(const char *cmd, CMDTYPE type);
+
+/* 命令と命令タイプがキーのハッシュ表を表示する */
+void print_cmdtype_code();
+
+/* 命令と命令タイプがキーのハッシュ表を解放する */
+void free_cmdtype_code();
+
+/* 命令コードがキーのハッシュ表を作成する */
+bool create_code_type();
+
+/* 命令コードからハッシュ値を生成する */
+unsigned hash_code(WORD code);
+
+/* 命令コードから命令タイプを取得する。
+   無効な場合はNONEを返す */
+CMDTYPE getcmdtype(WORD code);
+
+/* 命令コードがキーのハッシュ表を表示する */
+void print_code_type();
+
+/* 命令コードがキーのハッシュ表を解放する */
+void free_code_type();
+
+/* エラー番号とエラーメッセージを設定 */
+void setcerr(int num, const char *val);
+
+/* エラー番号からメッセージを返す */
+char *getcerrmsg(int num);
+
+/* WORD値を文字列に変換 */
+char *wtoa(WORD word);
+
+/* エラーを解放する */
+void freecerr();
+
+/* 指定されたファイルにアセンブル結果を書込 */
+void outassemble(char *file);
diff --git a/include/exec.h b/include/exec.h
new file mode 100644 (file)
index 0000000..529702c
--- /dev/null
@@ -0,0 +1,63 @@
+/* コードから命令のパターンを取得 */
+CMDTYPE getcmdtype(WORD code);
+
+enum {
+    INSIZE = 256    /* CASL IIの、IN命令入力領域 */
+};
+
+/* 指定されたファイルからアセンブル結果を読込 */
+bool inassemble(char *file);
+
+/* 標準入力から文字データを読込(SVC 1) */
+void svcin();
+
+/* 標準出力へ文字データを書出(SVC 2) */
+void svcout();
+
+/* ロード/論理積/論理和/排他的論理和のフラグ設定。OFは常に0 */
+void setfr(WORD val);
+
+/* 算術加算。フラグを設定して値を返す */
+WORD adda(WORD val0, WORD val1);
+
+/* 算術減算。フラグを設定して値を返す */
+WORD suba(WORD val0, WORD val1);
+
+/* 論理加算。フラグを設定して値を返す */
+WORD addl(WORD val0, WORD val1);
+
+/* 論理減算。フラグを設定して値を返す */
+WORD subl(WORD val0, WORD val1);
+
+/* 算術比較のフラグ設定。OFは常に0 */
+void cpa(WORD val0, WORD val1);
+
+/* 論理比較のフラグ設定。OFは常に0 */
+void cpl(WORD val0, WORD val1);
+
+/* 算術左シフト。フラグを設定して値を返す */
+WORD sla(WORD val0, WORD val1);
+
+/* 算術右シフト。フラグを設定して値を返す */
+WORD sra(WORD val0, WORD val1);
+
+/* 論理左シフト。フラグを設定して値を返す */
+WORD sll(WORD val0, WORD val1);
+
+/* 論理右シフト。フラグを設定して値を返す */
+WORD srl(WORD val0, WORD val1);
+
+/* 仮想マシンのリセット */
+void reset();
+
+/* コードの実行 */
+void exec();
+
+/* WORD値を2進数表記に変換 */
+char *word2bit(const WORD word);
+
+/* COMET IIのメモリを表示 */
+void dumpmemory();
+
+/* COMET IIのレジスタを表示 */
+void dspregister();
diff --git a/src/Makefile b/src/Makefile
new file mode 100644 (file)
index 0000000..eab8363
--- /dev/null
@@ -0,0 +1,23 @@
+INCLUDE = ../include
+CC = gcc
+CFLAGS = -g -Wall -I $(INCLUDE)
+COMMONSRC = struct.o cmd.o cerr.o
+ASSRC = assemble.o token.o label.o macro.o
+EXECSRC = exec.o dump.o
+.PHPNY: all clean
+all: ../casl2 ../comet2 TAGS
+../casl2: casl2.o $(COMMONSRC) $(ASSRC) $(EXECSRC)
+       $(CC) $(CFLAGS) -o $@ $^
+../comet2: comet2.o $(COMMONSRC) $(EXECSRC)
+       $(CC) $(CFLAGS) -o $@ $^
+%.o: %.c
+       $(CC) -c $(CFLAGS) $<
+casl2.o comet2.o $(COMMONSRC) $(ASSRC) $(EXECSRC): $(INCLUDE)/casl2.h
+casl2.o $(ASSRC): $(INCLUDE)/assemble.h
+comet2.c $(EXECSRC): $(INCLUDE)/exec.h
+TAGS: $(INCLUDE)/*.h *.c
+       @if test `which etags`; then \
+      etags $^; \
+    fi
+clean:
+       @rm -f *.o
diff --git a/src/assemble.c b/src/assemble.c
new file mode 100644 (file)
index 0000000..3549c61
--- /dev/null
@@ -0,0 +1,471 @@
+#include "casl2.h"
+#include "assemble.h"
+
+/* 値を格納するポインタ */
+WORD ptr;
+
+/* リテラル(=付きの値)を格納するポインタ */
+WORD lptr;
+
+/* 汎用レジスタを表す文字列「GR[0-7]」をWORD値に変換
+   is_xがtrueの場合は、指標レジスタとして用いる汎用レジスタ
+   文字列が汎用レジスタを表さない場合は、0xFFFFを返す */
+WORD getgr(const char *str, bool is_x)
+{
+    assert(str != NULL);
+    WORD r;
+    if(!(strlen(str) == 3 && strncmp(str, "GR", 2) == 0 &&
+         (*(str+2) >= '0' && *(str+2) <= '7')))
+    {
+        return 0xFFFF;
+    }
+    r = (WORD)(*(str+2) - '0');
+    /* COMET IIの仕様により、GR0は指標レジスタとして用いることはできない */
+    if(is_x == true && r == 0x0) {
+        setcerr(120, NULL);    /* GR0 in operand x */
+        return 0x0;
+    }
+    return r;
+}
+
+/* 10進定数をWORD値に変換 */
+WORD getint(const char *str)
+{
+    assert(isdigit(*str) || *str == '-');
+    char *check;
+    int n;
+    /* WORD値に変換 */
+    n = strtol(str, &check, 10);
+    if(*check != '\0') {
+        setcerr(114, str);    /* not integer */
+        return 0x0;
+    }
+    /* nが-32768〜32767の範囲にないときは、その下位16ビットを格納 */
+    if(n < -32768 || n > 32767) {
+        n = n % 32768;
+    }
+    return (WORD)n;
+}
+
+/* 16進定数をWORD値に変換 */
+WORD gethex(const char *str)
+{
+    assert(*str == '#');
+    WORD adr = 0x0;
+    char *check;
+    str++;
+    if(*str == '-' || strlen(str) > 4) {
+        setcerr(116, str-1);    /* out of hex range */
+        return 0;
+    }
+    /* WORD値に変換 */
+    adr = (WORD)strtol(str, &check, 16);
+    if(*check != '\0') {
+        setcerr(115, str-1);    /* not hex */
+        return 0x0;
+    }
+    return adr;
+}
+
+/* アドレスを返す
+   アドレスには、リテラル/10進定数/16進定数/アドレス定数が含まれる */
+WORD getadr(const char *str, PASS pass)
+{
+    WORD adr = 0x0;
+    if(*str == '=') {
+        adr = getliteral(str, pass);
+    } else if(*str == '#') {
+        adr = gethex(str);
+    } else if(isdigit(*str) || *str == '-') {
+        adr = getint(str);
+    } else {
+        if(pass == SECOND && (adr = getlabel(str)) == 0xFFFF) {
+            setcerr(103, str);    /* label not found */
+        }
+    }
+    return adr;
+}
+
+/* WORD値wordをアドレスadrに書込
+   書込に成功した場合はtrue、失敗した場合はfalseを返す */
+bool writememory(WORD word, WORD adr, PASS pass)
+{
+    bool status = false;
+    /* COMET IIメモリオーバーの場合 */
+    if(adr >= MEMSIZE) {
+        setcerr(119, wtoa(adr));    /* out of COMET II memory */
+    }
+    if(cerrno == 0) {
+        memory[adr] = word;
+        if(pass == SECOND && asdetailmode == true) {
+            fprintf(stdout, "\t#%04X\t#%04X\n", adr, word);
+        }
+        status = true;
+    }
+    return status;
+}
+
+/* 定数の前に等号(=)をつけて記述されるリテラルを返す */
+/* リテラルには、10進定数/16進定数/文字定数が含まれる */
+WORD getliteral(const char *str, PASS pass)
+{
+    WORD adr = lptr, word = 0x0;
+    assert(*str == '=');
+    str++;
+    if(*str == '\'') {    /* 文字定数 */
+        writestr(str, true, pass);
+    } else {
+        if(*str == '#') {    /* 16進定数  */
+            word = gethex(str);
+        } else if(isdigit(*str) || *str == '-') {    /* 10進定数  */
+            word = getint(str);
+        }
+        /* リテラル領域に書込 */
+        writememory(word, lptr++, pass);
+    }
+    return adr;
+}
+
+/* ' 'で囲まれた文字定数をメモリに書込 */
+/* DC命令とリテラルで使い、リテラルの場合はリテラル領域に書込 */
+void writestr(const char *str, bool literal, PASS pass)
+{
+    assert(cerrno == 0);
+    assert(*str == '\'');
+    str++;
+    while(*str != '\0') {
+        if(*str == '\'') {
+            if(*(str+1) != '\'') {
+                break;
+            }
+            str++;
+        }
+        /*リテラルの場合はリテラル領域に書込 */
+        if(literal == true) {
+            writememory(*(str++), lptr++, pass);
+        } else {
+            writememory(*(str++), ptr++, pass);
+        }
+    }
+}
+
+/* アセンブラ命令DCをメモリに書込 */
+void writeDC(const char *str, PASS pass)
+{
+    WORD adr = 0x0;
+    if(*str == '\''){
+        writestr(str, false, pass);
+    } else {
+        if(*str == '#') {
+            adr = gethex(str);
+        } else if(isdigit(*str) || *str == '-') {
+            adr = getint(str);
+        } else {
+            if(pass == SECOND && (adr = getlabel(str)) == 0xFFFF) {
+                setcerr(103, str);    /* label not found */
+            }
+        }
+        writememory(adr, ptr++, pass);
+    }
+}
+
+/* 命令がアセンブラ命令の場合は処理を実行
+   実行に成功した場合はtrue、それ以外の場合はfalseを返す */
+bool assemblecmd(const CMDLINE *cmdl, PASS pass)
+{
+    int i = 0;
+    CASLCMD cmd = 0;
+    bool status = false;
+    CMDARRAY ascmd[] = {
+        { START, 0, 1, "START" },
+        { END, 0, 0, "END" },
+        { DC, 0, OPDSIZE, "DC" },
+        { DS, 1, 1, "DS" },
+        { 0, 0, 0, NULL }
+    };
+
+    do {
+        if(strcmp(cmdl->cmd, ascmd[i].cmd) == 0) {
+            if(cmdl->opd->opdc < ascmd[i].opdc_min || cmdl->opd->opdc > ascmd[i].opdc_max) {
+                setcerr(106, NULL);    /* operand count mismatch */
+                return false;
+            }
+            cmd = ascmd[i].cmdid;
+            break;
+        }
+    } while(ascmd[++i].cmdid != 0);
+    /* アセンブラ命令 */
+    switch(cmd)
+    {
+    case START:
+        if(cmdl->label == NULL) {
+            setcerr(107, NULL);    /* no label in START */
+            return false;
+        }
+       /* オペランドがある場合、実行開始番地を設定 */
+        if(pass == SECOND && cmdl->opd->opdc == 1) {
+            if((startptr = getlabel(cmdl->opd->opdv[0])) == 0xFFFF) {
+                setcerr(103, cmdl->opd->opdv[0]);    /* label not found */
+            }
+        }
+        status = true;
+        break;
+    case END:
+        /* リテラル領域の設定 */
+        if(pass == FIRST) {
+            lptr = ptr;
+        }
+        /* 実行終了番地と次のプログラムの実行開始番地を設定 */
+        else if(pass == SECOND) {
+            endptr = lptr;
+        }
+        status = true;
+        break;
+    case DS:
+        for(i = 0; i < atoi(cmdl->opd->opdv[0]); i++) {
+            writememory(0x0, ptr++, pass);
+            if(cerrno > 0) {
+                return false;
+            }
+        }
+        status = true;
+        break;
+    case DC:
+        for(i = 0; i < cmdl->opd->opdc; i++) {
+            writeDC(cmdl->opd->opdv[i], pass);
+            if(cerrno > 0) {
+                return false;
+            }
+        }
+        status = true;
+        break;
+    default:
+        return false;
+    }
+    if(cerrno > 0) {
+        status = false;
+    }
+    return status;
+}
+
+/* 命令がマクロ命令の場合はメモリに書込
+   書込に成功した場合はtrue、それ以外の場合はfalseを返す */
+bool macrocmd(const CMDLINE *cmdl, PASS pass)
+{
+    int i = 0;
+    CASLCMD cmd;
+    bool status = false;
+    CMDARRAY macrocmd[] = {
+        { IN, 2, 2, "IN" },
+        { OUT, 2, 2, "OUT" },
+        { RPUSH, 0, 0, "RPUSH" },
+        { RPOP, 0, 0, "RPOP" },
+        { 0, 0, 0, NULL }
+    };
+
+    do {
+        if(strcmp(cmdl->cmd, macrocmd[i].cmd) == 0) {
+            if(cmdl->opd->opdc < macrocmd[i].opdc_min || cmdl->opd->opdc > macrocmd[i].opdc_max) {
+                setcerr(106, NULL);    /* operand count mismatch */
+                return false;
+            }
+            cmd = macrocmd[i].cmdid;
+            break;
+        }
+    } while(macrocmd[++i].cmdid != 0);
+    switch(cmd)
+    {
+    case IN:
+        status = writeIN(cmdl->opd->opdv[0], cmdl->opd->opdv[1], pass);
+        break;
+    case OUT:
+        status = writeOUT(cmdl->opd->opdv[0], cmdl->opd->opdv[1], pass);
+        break;
+    case RPUSH:
+        status = writeRPUSH(pass);
+        break;
+    case RPOP:
+        status = writeRPOP(pass);
+        break;
+    default:
+        return false;
+    }
+    return status;
+}
+
+
+/* 機械語命令の書込
+   書込に成功した場合はtrue、それ以外の場合はfalseを返す */
+bool cometcmd(const CMDLINE *cmdl, PASS pass)
+{
+    WORD cmd, adr, r1, r2, x;
+    bool status = false;
+
+    /* オペランドなし */
+    if(cmdl->opd->opdc == 0) {
+        if((cmd = getcmdcode(cmdl->cmd, NONE)) == 0xFFFF) {
+            setcerr(112, cmdl->cmd);    /* not command of no operand */
+            return false;
+        }
+        if(writememory(cmd, ptr++, pass) == true) {
+            status = true;
+        }
+    }
+    /* 第1オペランドは汎用レジスタ */
+    else if((r1 = getgr(cmdl->opd->opdv[0], false)) != 0xFFFF) {
+        /* オペランド数1 */
+        if(cmdl->opd->opdc == 1) {
+            if((cmd = getcmdcode(cmdl->cmd, R_)) == 0xFFFF) {
+                setcerr(108, cmdl->cmd);    /* not command of operand "r" */
+                return false;
+            }
+            cmd |= (r1 << 4);
+            if(writememory(cmd, ptr++, pass) == true) {
+                status = true;
+            }
+        }
+        /* オペランド数2。第2オペランドは汎用レジスタ */
+        else if(cmdl->opd->opdc == 2 && (r2 = getgr(cmdl->opd->opdv[1], false)) != 0xFFFF) {
+            if((cmd = getcmdcode(cmdl->cmd, R1_R2)) == 0xFFFF) {
+                setcerr(109, cmdl->cmd);    /* not command of operand "r1,r2" */
+                return false;
+            } 
+            cmd |= ((r1 << 4) | r2);
+            if(cerrno == 0 && writememory(cmd, ptr++, pass) == true) {
+                status = true;
+            }
+        }
+        /* オペランド数2〜3。第2オペランドはアドレス、
+           第3オペランドは指標レジスタとして用いる汎用レジスタ */
+        else if(cmdl->opd->opdc == 2 || cmdl->opd->opdc == 3)
+        {
+            if((cmd = getcmdcode(cmdl->cmd, R_ADR_X_)) == 0xFFFF &&
+               (cmd = getcmdcode(cmdl->cmd, R_ADR_X)) == 0xFFFF)
+            {
+                setcerr(110, cmdl->cmd);    /* not command of operand "r,adr[,x]" */
+                return false;
+            }
+            cmd |= (r1 << 4);
+            /* オペランド数3 */
+            if(cmdl->opd->opdc == 3) {
+                if((x = getgr(cmdl->opd->opdv[2], true)) == 0xFFFF) {
+                    return false;
+                }
+                cmd |= x;
+            }
+            adr = getadr(cmdl->opd->opdv[1], pass);
+            writememory(cmd, ptr++, pass);
+            writememory(adr, ptr++, pass);
+            if(cerrno == 0) {
+                status = true;
+            }
+        } else {
+            setcerr(113, cmdl->cmd);    /* command not defined */
+            return false;
+        }
+    }
+    /* オペランド数1〜2。第1オペランドはアドレス */
+    else if(cmdl->opd->opdc == 1 || cmdl->opd->opdc == 2) {
+        if((cmd = getcmdcode(cmdl->cmd, ADR_X)) == 0xFFFF) {                
+            setcerr(111, cmdl->cmd);    /* not command of operand "adr[,x]" */
+            return false;
+        }
+        /* オペランド数2の場合、第2オペランドは指標レジスタとして用いる汎用レジスタ */
+        if(cmdl->opd->opdc == 2) {
+            x = getgr(cmdl->opd->opdv[1], true);
+            if(cerrno > 0) {
+                return false;
+            }
+            cmd |= x;
+        }
+        adr = getadr(cmdl->opd->opdv[0], pass);
+        writememory(cmd, ptr++, pass);
+        writememory(adr, ptr++, pass);
+        if(cerrno == 0) {
+            status = true;
+        }
+    }
+    return status;
+}
+
+/* 命令行を1行アセンブルする */
+bool assembleline(const CMDLINE *cmdl, PASS pass)
+{
+    bool status = false;
+    /* 命令がない場合 */
+    if(cmdl->cmd == NULL){
+        /* ラベルが定義されていて命令がない場合はエラー */
+        if(cmdl->label != NULL) {
+            setcerr(105, NULL);    /* no command in the line */
+        }
+    }
+    /* アセンブラ命令の処理 */
+    else if(cerrno == 0 && assemblecmd(cmdl, pass) == true) {
+        ;
+    }
+    /* マクロ命令の書込 */
+    else if(cerrno == 0 && macrocmd(cmdl, pass) == true) {
+        ;
+    }
+    /* 機械語命令の書込 */
+    else if(cerrno == 0 && cometcmd(cmdl, pass) == true) {
+        ;
+    }
+    else if(cerrno == 0) {
+        setcerr(113, cmdl->cmd);    /* command not defined */
+    }
+    /* エラーが発生していないか確認 */
+    if(cerrno == 0) {
+        status = true;
+    }
+    return status;
+}
+
+/* 指定された名前のファイルをアセンブル */
+/* 2回実行される */
+bool assemble(const char *file, PASS pass)
+{
+    int lineno = 0;
+    bool status = true;
+    CMDLINE *cmdl;
+    char *line;
+    FILE *fp;
+    
+    if(create_cmdtype_code() == false) {
+        return false;
+    }
+    if((fp = fopen(file, "r")) == NULL) {
+        perror(file);
+        return false;
+    }
+    for(; ;) {
+        cmdl = malloc(sizeof(CMDLINE));
+        line = malloc(LINESIZE+1);
+        if((line = fgets(line, LINESIZE, fp)) == NULL) {
+            break;
+        }
+        lineno++;
+        if((pass == FIRST && srcmode == true) || (pass == SECOND && asdetailmode == true)) {
+            fprintf(stdout, "%s:%d:%s", file, lineno, line);
+        }
+        if((cmdl = linetok(line)) != NULL) {
+            if(pass == FIRST && cmdl->label != NULL) {
+                if(addlabel(cmdl->label, ptr) == false) {
+                    break;
+                }
+            }
+            if(assembleline(cmdl, pass) == false) {
+                break;
+            }
+        }
+        if(cerrno > 0) {
+            break;
+        }
+    }
+    if(cerrno > 0) {
+        fprintf(stderr, "Assemble error - %d: %s\n %s:%d: %s\n", cerrno, cerrmsg, file, lineno, line);
+        status = false;
+    }
+    fclose(fp);
+    return status;
+}
diff --git a/src/casl2.c b/src/casl2.c
new file mode 100644 (file)
index 0000000..2d17acd
--- /dev/null
@@ -0,0 +1,122 @@
+#include "casl2.h"
+#include "assemble.h"
+#include "exec.h"
+#define _GNU_SOURCE
+#include <getopt.h>
+
+/* 指定されたファイルにCOMET II仮想メモリ(アセンブル結果)を書込 */
+void outassemble(char *file) {
+    FILE *fp;
+    if((fp = fopen(file, "w")) == NULL) {
+        perror(file);
+        return;
+    }
+    fwrite(memory, sizeof(WORD), endptr, fp);
+    fclose(fp);
+}
+
+static struct option longopts[] = {
+    {"trace", no_argument, NULL, 't'},
+    {"tracearithmetic", no_argument, NULL, 't'},
+    {"tracelogical", no_argument, NULL, 'T'},
+    {"dump", no_argument, NULL, 'd'},
+    {"source", no_argument, NULL, 's'},
+    {"label", no_argument, NULL, 'l'},
+    {"assembledetail", no_argument, NULL, 'a'},    
+    {"onlyassemble", optional_argument, NULL, 'o'},
+    {"assembledetailonly", no_argument, NULL, 'A'},
+    {"help", no_argument, NULL, 'h'},
+    {0, 0, 0, 0}
+};
+
+int main(int argc, char *argv[])
+{
+    int opt, i;
+    PASS pass;
+    bool status = false;
+    WORD beginptr[argc];
+    char *objfile = NULL;
+    const char *usage = "Usage: %s [-tTdslaAh] [-o <OUTFILE>] FILE ...\n";
+
+    while((opt = getopt_long(argc, argv, "tTdslao:Ah", longopts, NULL)) != -1) {
+        switch(opt) {
+        case 't':
+            tracemode = true;
+            break;
+        case 'T':
+            tracemode = true;
+            logicalmode = true;
+            break;
+        case 'd':
+            dumpmode = true;
+            break;
+        case 's':
+            srcmode = true;
+            break;
+        case 'l':
+            labelmode = true;
+            break;
+        case 'a':
+            asdetailmode = true;
+            break;
+        case 'o':
+            onlyassemblemode = true;
+            if(optarg != NULL) {
+                objfile = strdup(optarg);
+            }
+            break;
+        case 'A':
+            onlyassemblemode = true;
+            objfile = NULL;
+            asdetailmode = true;
+            break;
+        case 'h':
+            fprintf(stdout, usage, argv[0]);
+            exit(-1);
+        case '?':
+            fprintf(stderr, usage, argv[0]);
+            exit(-1);
+        }
+    }
+    /* アセンブル。ラベル表作成のため、2回行う */
+    for(pass = FIRST; pass <= SECOND; pass++) {
+        for(i = optind; i < argc; i++) {
+            /* データの格納開始位置 */
+            if(pass == FIRST) {
+                beginptr[i] = ptr;
+            } else if(pass == SECOND) {
+                ptr = beginptr[i];
+            }
+            if(tracemode == true || dumpmode == true || srcmode == true ||
+               labelmode == true || asdetailmode == true) {
+                fprintf(stdout, "\nAssemble %s (%d)\n", argv[i], pass);
+            }
+            if((status = assemble(argv[i], pass)) == false) {
+                freelabel();    /* ラベル表の解放 */
+                if(cerrno > 0) {
+                    freecerr();    /* エラーの解放 */
+                }
+                exit(-1);
+            }
+        }
+        if(pass == FIRST && labelmode == true) {
+            fprintf(stdout, "\nLabel::::\n");
+            printlabel();
+        }
+    }
+    freelabel();    /* ラベル表の解放 */
+    if(status == true) {
+        if(onlyassemblemode) {
+            if(objfile != NULL) {
+                outassemble(objfile);
+            }
+        } else {
+            exec();    /* プログラム実行 */
+        }
+    }
+    if(cerrno > 0) {
+        freecerr();
+        exit(-1);
+    }
+    return 0;
+}
diff --git a/src/cerr.c b/src/cerr.c
new file mode 100644 (file)
index 0000000..250ad80
--- /dev/null
@@ -0,0 +1,89 @@
+#include "casl2.h"
+
+/* エラーコードリスト */
+typedef struct {
+    int num;
+    char *msg;
+} CERRARRAY;
+CERRARRAY cerr[] = {
+    { 101, "label already defined" },
+    { 102, "label table is full" },
+    { 103, "label not found" },
+    { 104, "label length is too long" },
+    { 105, "no command in the line" },
+    { 106, "operand count mismatch" },
+    { 107, "no label in START" },
+    { 108, "not command of operand \"r\"" },
+    { 109, "not command of operand \"r1,r2\"" },
+    { 110, "not command of operand \"r,adr[,x]\"" },
+    { 111, "not command of operand \"adr[,x]\"" },
+    { 112, "not command of no operand" },
+    { 113, "command not defined" },
+    { 114, "not integer" },
+    { 115, "not hex" },
+    { 116, "out of hex range" },
+    { 117, "operand is too many" },
+    { 118, "operand length is too long" },
+    { 119, "out of COMET II memory" },
+    { 120, "GR0 in operand x" },
+    { 121, "cannot get operand token" },
+    { 122, "cannot create hash table" },
+    { 201, "execute - out of COMET II memory" },
+    { 202, "SVC input - out of Input memory" },
+    { 203, "SVC output - out of COMET II memory" },
+    { 204, "Program Register (PR) - out of COMET II memory" },
+    { 205, "Stack Pointer (SP) - cannot allocate stack buffer" },
+    { 206, "Address - out of COMET II memory" }
+};
+
+/* WORD値を文字列に変換 */
+char *wtoa(WORD word)
+{
+    char *p = malloc(6), *q = malloc(6);
+    int i = 0, j;
+    do{
+        *(p + i++) = word % 10 + '0';
+    } while((word /= 10) > 0);
+    for(j = 0; j < i; j++) {
+        *(q + j) = *(p + (i - 1) - j);
+    }
+    *(q + j + 1) = '\0';
+    return q;
+}
+
+/* エラー番号とエラーメッセージを設定する */
+void setcerr(int num, const char *val)
+{
+    cerrno = num;
+    cerrmsg = malloc(256);
+    if(val != NULL) {
+        strcpy(cerrmsg, val);
+        strcat(cerrmsg, ": ");
+        strcat(cerrmsg, getcerrmsg(cerrno));
+    } else {
+        strcpy(cerrmsg, getcerrmsg(cerrno));
+    }
+}
+
+/* エラー番号からメッセージを返す */
+char *getcerrmsg(int num)
+{
+    assert(num > 0);
+    int i;
+    for(i = 0; i < ARRAYSIZE(cerr); i++) {
+        if((&cerr[i])->num == num) {
+            return (&cerr[i])->msg;
+        }
+    }
+    return "unkown error";
+}
+
+/* エラーを解放する */
+void freecerr()
+{
+    assert(cerrno > 0);
+    cerrno = 0;
+    if(strlen(cerrmsg) > 0) {
+        free(cerrmsg);
+    }
+}
diff --git a/src/cmd.c b/src/cmd.c
new file mode 100644 (file)
index 0000000..7e2b7fa
--- /dev/null
+++ b/src/cmd.c
@@ -0,0 +1,195 @@
+#include "casl2.h"
+
+CMDCODEARRAY cmdcodearray[] = {
+    { "NOP", NONE, 0x0 },
+    { "LD", R_ADR_X_, 0x1000 },
+    { "ST", R_ADR_X, 0x1100 },
+    { "LAD", R_ADR_X, 0x1200 },
+    { "LD", R1_R2, 0x1400 },
+    { "ADDA", R_ADR_X_, 0x2000 },
+    { "SUBA", R_ADR_X_, 0x2100 },
+    { "ADDL", R_ADR_X_, 0x2200 },
+    { "SUBL", R_ADR_X_, 0x2300 },
+    { "ADDA", R1_R2, 0x2400 },
+    { "SUBA", R1_R2, 0x2500 },
+    { "ADDL", R1_R2, 0x2600 },
+    { "SUBL", R1_R2, 0x2700 },
+    { "AND", R_ADR_X_, 0x3000 },
+    { "OR", R_ADR_X_, 0x3100 },
+    { "XOR", R_ADR_X_, 0x3200 },
+    { "AND", R1_R2, 0x3400 },
+    { "OR", R1_R2, 0x3500 },
+    { "XOR", R1_R2, 0x3600 },
+    { "CPA", R_ADR_X_, 0x4000 },
+    { "CPL", R_ADR_X_, 0x4100 },
+    { "CPA", R1_R2, 0x4400 },
+    { "CPL", R1_R2, 0x4500 },
+    { "SLA", R_ADR_X, 0x5000 },
+    { "SRA", R_ADR_X, 0x5100 },
+    { "SLL", R_ADR_X, 0x5200 },
+    { "SRL", R_ADR_X, 0x5300 },
+    { "JMI", ADR_X, 0x6100 },
+    { "JNZ", ADR_X, 0x6200 },
+    { "JZE", ADR_X, 0x6300 },
+    { "JUMP", ADR_X, 0x6400 },
+    { "JPL", ADR_X, 0x6500 },
+    { "JOV", ADR_X, 0x6600 },
+    { "PUSH", ADR_X, 0x7000 },
+    { "POP", R_, 0x7100 },
+    { "CALL", ADR_X, 0x8000 },
+    { "SVC", ADR_X, 0xF000 },
+    { "RET", NONE, 0x8100 }
+};
+
+int cmdcodesize = ARRAYSIZE(cmdcodearray);
+CMDCODETAB *cmdtype_code[ARRAYSIZE(cmdcodearray)], *code_type[ARRAYSIZE(cmdcodearray)];
+
+/* 命令と命令タイプがキーのハッシュ表を作成する */
+bool create_cmdtype_code()
+{
+    CMDCODETAB *np;
+    unsigned hashval;
+    int i;
+    
+    for(i = 0; i < cmdcodesize; i++) {
+        np = (CMDCODETAB *) malloc(sizeof(*np));
+        if(np == NULL) {
+            setcerr(122, NULL);    /* cannot create hash table */
+            return false;
+        }
+        /* ハッシュ値の生成 */
+        hashval = hash_cmdtype((&cmdcodearray[i])->cmd, (&cmdcodearray[i])->type);
+        /* ハッシュ表に値を追加 */
+        np->next = cmdtype_code[hashval];
+        cmdtype_code[hashval] = np;
+        np->cca = &(cmdcodearray[i]);
+    }
+    return true;
+}
+
+/* 命令と命令タイプからハッシュ値を生成する */
+unsigned hash_cmdtype(const char *cmd, CMDTYPE type) {
+    int i;
+    unsigned hashval = 0;
+    for(i = 0; *cmd != '\0'; cmd++) {
+        hashval = *cmd + 31 * hashval;
+    }
+    hashval = (int)(type & 070) + 31 * hashval;
+    return hashval % cmdcodesize;
+}
+
+/* 命令と命令タイプから、命令コードを取得する。
+   無効な場合は0xFFFFを返す */
+WORD getcmdcode(const char *cmd, CMDTYPE type)
+{
+    CMDCODETAB *np;
+    assert(cmd != NULL);
+    for(np = cmdtype_code[hash_cmdtype(cmd, type)]; np != NULL; np = np->next){
+        if(strcmp(cmd, np->cca->cmd) == 0 && type == np->cca->type) {
+            return np->cca->code;
+        }
+    }
+    return 0xFFFF;
+}
+
+/* 命令と命令タイプがキーのハッシュ表を表示する */
+void print_cmdtype_code()
+{
+    int i;
+    CMDCODETAB *np;
+    for(i = 0; i < cmdcodesize; i++){
+        np = cmdtype_code[i];
+        while(np != NULL) {
+            fprintf(stdout, "(%2d) - %s\t0%02o\t#%04X\n",
+                    i, np->cca->cmd, np->cca->type, np->cca->code);
+            np = np->next;
+        }
+    }
+}
+
+/* 命令と命令タイプがキーのハッシュ表を解放する */
+void free_cmdtype_code()
+{
+    int i;
+    CMDCODETAB *np, *nq;
+    for(i = 0; i < cmdcodesize; i++){
+        np = cmdtype_code[i];
+        while(np != NULL) {
+            nq = np->next;
+            free(np);
+            np = nq;
+        }
+    }
+}
+
+/* 命令コードがキーのハッシュ表を作成する */
+bool create_code_type()
+{
+    CMDCODETAB *np;
+    unsigned hashval;
+    int i;
+    
+    for(i = 0; i < cmdcodesize; i++) {
+        np = (CMDCODETAB *) malloc(sizeof(*np));
+        if(np == NULL) {
+            setcerr(122, NULL);    /* cannot create hash table */
+            return false;
+        }
+        /* ハッシュ値の生成 */
+        hashval = hash_code((&cmdcodearray[i])->code);
+        /* ハッシュ表に値を追加 */
+        np->next = code_type[hashval];
+        code_type[hashval] = np;
+        np->cca = &cmdcodearray[i];
+    }
+    return true;
+}
+
+/* 命令コードからハッシュ値を生成する */
+unsigned hash_code(WORD code)
+{
+    unsigned hashval = 0;
+    hashval = (code >> 8);
+    return hashval % cmdcodesize;
+}
+
+/* 命令コードから命令タイプを取得する。
+   無効な場合はNONEを返す */
+CMDTYPE getcmdtype(WORD code)
+{
+    CMDCODETAB *np;
+    for(np = code_type[hash_code(code)]; np != NULL; np = np->next) {
+        if(code == np->cca->code) {
+            return np->cca->type;
+        }
+    }
+    return NONE;
+}
+
+/* 命令コードがキーのハッシュ表を表示する */
+void print_code_type()
+{
+    int i;
+    CMDCODETAB *np;
+    for(i = 0; i < cmdcodesize; i++){
+        for(np = code_type[i]; np != NULL; np = np->next) {
+            fprintf(stdout, "(%2d) - #%04X\t0%02o\t%s\n",
+                    i, np->cca->code, np->cca->type, np->cca->cmd);
+        }
+    }
+}
+
+/* 命令コードがキーのハッシュ表を解放する */
+void free_code_type()
+{
+    int i;
+    CMDCODETAB *np, *nq;
+    for(i = 0; i < cmdcodesize; i++){
+        np = code_type[i];
+        while(np != NULL) {
+            nq = np->next;
+            free(np);
+            np = nq;
+        }
+    }
+}
diff --git a/src/comet2.c b/src/comet2.c
new file mode 100644 (file)
index 0000000..0312035
--- /dev/null
@@ -0,0 +1,60 @@
+#include "casl2.h"
+#include "exec.h"
+#define _GNU_SOURCE
+#include <getopt.h>
+
+/* 指定されたファイルからCOMET II仮想メモリ(アセンブル結果)を読込 */
+bool inassemble(char *file) {
+    FILE *fp;
+    if((fp = fopen(file, "r")) == NULL) {
+        perror(file);
+        return false;
+    }
+    fread(memory, sizeof(WORD), MEMSIZE, fp);
+    fclose(fp);
+    return true;
+}
+
+static struct option longopts[] = {
+    {"trace", no_argument, NULL, 't'},
+    {"tracearithmetic", no_argument, NULL, 't'},
+    {"tracelogical", no_argument, NULL, 'T'},
+    {"dump", no_argument, NULL, 'd'},
+    {"help", no_argument, NULL, 'h'},
+    {0, 0, 0, 0}
+};
+
+int main(int argc, char *argv[])
+{
+    int opt;
+    const char *usage = "Usage: %s [-tTdh] FILE\n";
+
+    while((opt = getopt_long(argc, argv, "tTdh", longopts, NULL)) != -1) {
+        switch(opt) {
+        case 't':
+            tracemode = true;
+            break;
+        case 'T':
+            tracemode = true;
+            logicalmode = true;
+            break;
+        case 'd':
+            dumpmode = true;
+            break;
+        case 'h':
+            fprintf(stdout, usage, argv[0]);
+            exit(-1);
+        case '?':
+            fprintf(stderr, usage, argv[0]);
+            exit(-1);
+        }
+    }
+    if(inassemble(argv[optind]) == true) {
+        exec();    /* プログラム実行 */
+    }
+    if(cerrno > 0) {
+        freecerr();
+        exit(-1);
+    }
+    return 0;
+}
diff --git a/src/dump.c b/src/dump.c
new file mode 100644 (file)
index 0000000..2c77520
--- /dev/null
@@ -0,0 +1,64 @@
+#include "casl2.h"
+#include "exec.h"
+
+/* WORD値を2進数表記に変換 */
+char *word2bit(const WORD word)
+{
+    WORD mask = 0x8000;
+    char *bit, *p;
+    bit = malloc(16 + 1);
+    p = bit;
+       while(mask > 0){
+           if((word & mask) == 0) {
+            *p++ = '0';
+        } else {
+            *p++ = '1';
+        }
+        mask = (mask >> 1);
+    }
+    *p = '\0';
+    return bit;
+}
+
+/* COMET IIのメモリを表示 */
+void dumpmemory()
+{
+    const int col = 16;
+    int i;
+    /* Header */
+    fprintf(stdout, "#%04X: adr :", PR);
+    for(i = 0; i < col; i++) {
+        fprintf(stdout, " %04X", i);
+    }
+    fprintf(stdout, "\n");
+    /* Memory */
+    for(i = 0; i < MEMSIZE; i++) {
+        if(i % col == 0) {
+            fprintf(stdout, "#%04X: %04X: ", PR, i);
+        }
+        fprintf(stdout, "%04X", memory[i]);
+        if(i > 0 && (i + 1) % col == 0) {
+            fprintf(stdout, "\n");
+        } else {
+            fprintf(stdout, " ");
+        }
+    }
+}
+
+/* COMET IIのレジスタを表示 */
+void dspregister()
+{
+    int i;
+    for(i = 0; i < REGSIZE; i++ ) {
+        if(logicalmode == true) {
+            fprintf(stdout, "#%04X: GR%d: %6d = #%04X = %s\n",
+                    PR, i, GR[i], GR[i], word2bit(GR[i]));
+        } else {
+            fprintf(stdout, "#%04X: GR%d: %6d = #%04X = %s\n",
+                    PR, i, (short)GR[i], GR[i], word2bit(GR[i]));
+        }
+    }
+    fprintf(stdout, "#%04X: SP:  %6d = #%04X = %s\n", PR, SP, SP, word2bit(SP));
+    fprintf(stdout, "#%04X: PR:  %6d = #%04X = %s\n", PR, PR, PR, word2bit(PR));
+    fprintf(stdout, "#%04X: FR (OF SF ZF): %s\n", PR, (word2bit(FR)+13));
+}
diff --git a/src/exec.c b/src/exec.c
new file mode 100644 (file)
index 0000000..d811c92
--- /dev/null
@@ -0,0 +1,454 @@
+#include "casl2.h"
+#include "exec.h"
+
+/* 標準入力から文字データを読込(SVC 1) */
+void svcin()
+{
+    int i;
+    char *buffer = malloc(INSIZE + 1);
+
+    if(fgets(buffer, INSIZE, stdin) == NULL) {
+        memory[GR[1]] = 0x0;
+        memory[GR[2]] = 0x0;
+        return;
+    }
+    for(i = 0; i < GR[1] && i < INSIZE; i++) {
+        if(*(buffer + i) == '\0' || *(buffer + i) == '\n') {
+            --i;
+            break;
+        }
+        if(GR[1] + i >= MEMSIZE - 1) {
+            setcerr(202, NULL);    /* SVC input - out of Input memory */
+            break;
+        }
+        memory[GR[1]+i] = *(buffer + i);
+    }
+    memory[GR[2]] = i + 1;
+}
+
+/* 標準出力へ文字データを書出(SVC 2) */
+void svcout()
+{
+    int i;
+    char c;
+
+    for(i = 0; i < GR[2]; i++) {
+        if(GR[1] + i >= MEMSIZE - 1) {
+            setcerr(203, NULL);    /* SVC output - out of Comet II memory */
+            return;
+        }
+        if(memory[GR[1]+i] == '\0') {
+            break;
+        }
+        /* 「文字の組」の符号表に記載された文字と、改行(CR)/タブを表示
+           それ以外の文字は、「.」で表す */
+        if(((c = (char)(memory[GR[1]+i])) >= 0x20 && c <= 0x7E) || c == 0xA || c == '\t') {
+            putchar(c);
+        } else {
+            putchar('.');
+        }
+    }
+}
+
+/* ロード/論理積/論理和/排他的論理和のフラグ設定。OFは常に0 */
+void setfr(WORD val)
+{
+    FR = 0x0;
+    /* 第15ビットが1のとき、SFは1 */
+    if((val & 0x8000) > 0x0) {
+        FR += SF;
+    }
+    /* 演算結果が0のとき、ZFは1 */
+    if(val == 0x0) {
+        FR += ZF;
+    }
+}
+
+/* 算術加算。フラグを設定して値を返す */
+WORD adda(WORD val0, WORD val1)
+{
+    WORD res;
+    long temp;
+    FR = 0x0;
+
+    temp = (short)val0 + (short)val1;
+    if(temp > 32767 || temp < -32768) {
+        FR += OF;
+    }
+    res = (WORD)(temp & 0xFFFF);
+    if((res & 0x8000) > 0x0) {
+        FR += SF;
+    } else if(res == 0x0) {
+        FR += ZF;
+    }
+    return res;
+}
+
+/* 算術減算。フラグを設定して値を返す */
+WORD suba(WORD val0, WORD val1)
+{
+    return adda(val0, (~val1 + 1));
+}
+
+/* 論理加算。フラグを設定して値を返す */
+WORD addl(WORD val0, WORD val1)
+{
+    long temp;
+    WORD res;
+    FR = 0x0;
+
+    temp = val0 + val1;
+    if(temp > 65535) {
+        FR += OF;
+    }
+    res = (WORD)(temp & 0xFFFF);
+    if((res & 0x8000) > 0x0) {
+        FR += SF;
+    } else if(res == 0x0) {
+        FR += ZF;
+    }
+    return res;
+}
+
+/* 論理減算。フラグを設定して値を返す */
+WORD subl(WORD val0, WORD val1)
+{
+    long temp;
+    WORD res;
+    FR = 0x0;
+
+    temp = val0 - val1;
+    if(temp < 0) {
+        FR += OF;
+    }
+    res = (WORD)(temp & 0xFFFF);
+    if((res & 0x8000) > 0) {
+        FR += SF;
+    } else if(res == 0) {
+        FR += ZF;
+    }
+    return res;
+}
+
+/* 算術比較のフラグ設定。OFは常に0 */
+void cpa(WORD val0, WORD val1)
+{
+    FR = 0x0;
+    if((short)val0 < (short)val1) {
+        FR = SF;
+    } else if(val0 == val1) {
+        FR = ZF;
+    }
+}
+
+/* 論理比較のフラグ設定。OFは常に0 */
+void cpl(WORD val0, WORD val1)
+{
+    FR = 0x0;
+    if(val0 < val1) {
+        FR = SF;
+    } else if(val0 == val1) {
+        FR = ZF;
+    }
+}
+
+/* 算術左シフト。フラグを設定して値を返す。
+   算術演算なので、第15ビットは送り出されない */
+WORD sla(WORD val0, WORD val1)
+{
+    FR = 0x0;
+    WORD sign, res;
+    sign = val0 & 0x8000;
+    res = ((val0 << val1) & 0x7FFF) | sign;
+    /* OFに、レジスタから最後に送り出されたビットの値を設定 */
+    if((val0 & (0x4000 >> (val1 - 1))) > 0x0) {
+        FR += OF;
+    }
+    /* 符号(第15ビット)が1のとき、SFは1 */
+    if(sign > 0x0) {
+        FR += SF;
+    }
+    /* 演算結果が0のとき、ZFは1 */
+    if(res == 0x0) {
+        FR += ZF;
+    }
+    return res;
+}
+
+/* 算術右シフト。フラグを設定して値を返す */
+WORD sra(WORD val0, WORD val1)
+{
+    WORD sign, res, onbit = 0x8000;
+    int i;
+    FR = 0x0;
+    res = (val0 & 0x7FFF) >> val1;
+    /* 符号(第15ビット)が1の場合、符号と空いたビット位置に1を設定
+       COMET IIの仕様で、シフトの結果空いたビット位置には符号と同じものが入る */
+    if((sign = val0 & 0x8000) > 0x0) {
+        for(i = 0; i <= val1; i++) {
+            res |= onbit;
+            onbit >>= 1;
+        }
+    }
+    /* OFに、レジスタから最後に送り出されたビットの値を設定 */
+    if((val0 & (0x1 << (val1 - 1))) > 0x0) {
+        FR += OF;
+    }
+    /* 符号(第15ビット)が1のとき、SFは1 */
+    if(sign > 0x0) {
+        FR += SF;
+    }
+    /* 演算結果が0のとき、ZFは1 */
+    if(res == 0x0) {
+        FR += ZF;
+    }
+    return res;
+}
+
+/* 論理左シフト。フラグを設定して値を返す */
+WORD sll(WORD val0, WORD val1)
+{
+    FR = 0x0;
+    WORD res;
+    res = val0 << val1;
+    /* OFに、レジスタから最後に送り出されたビットの値を設定 */
+    if((val0 & (0x8000 >> (val1 - 1))) > 0x0) {
+        FR += OF;
+    }
+    /* 第15ビットが1のとき、SFは1 */
+    if((res & 0x8000) > 0x0) {
+        FR += SF;
+    }
+    /* 演算結果が0のとき、ZFは1 */
+    if(res == 0x0) {
+        FR += ZF;
+    }
+    return res;
+}
+
+/* 論理右シフト。フラグを設定して値を返す */
+WORD srl(WORD val0, WORD val1)
+{
+    FR = 0x0;
+    WORD res;
+    res = val0 >> val1;
+    /* OFに、レジスタから最後に送り出されたビットの値を設定 */
+    if((val0 & (0x1 << (val1 - 1))) > 0x0) {
+        FR += OF;
+    }
+    /* 第15ビットが1のとき、SFは1 */
+    if((res & 0x8000) > 0x0) {
+        FR += SF;
+    }
+    /* 演算結果が0のとき、ZFは1 */
+    if(res == 0x0) {
+        FR += ZF;
+    }
+    return res;
+}
+
+/* 仮想マシンのリセット */
+void reset()
+{
+    int i;
+    for(i = 0; i <= 7; i++) {
+        GR[i] = 0x0;
+    }
+    SP = PR = FR = 0x0;
+    for(i = 0; i < MEMSIZE; i++) {
+        memory[i] = 0x0;
+    }
+}
+
+/* コードの実行 */
+void exec()
+{
+    WORD op, r_r1, x_r2, val;
+    CMDTYPE cmdtype;
+    char *errpr = malloc(8);
+    if(tracemode) {
+        fprintf(stdout, "\nExecuting machine codes\n");
+    }
+    /* フラグレジスタの初期値設定 */
+    FR = 0x0;
+    SP = MEMSIZE;
+    PR = startptr;
+    if(create_code_type() == false) {
+        goto execerr;
+    }
+    /* 機械語の実行 */
+    for (; ; ) {
+        /* プログラムレジスタのアドレスが主記憶の範囲外の場合はエラー */
+        if(PR >= MEMSIZE) {
+            sprintf(errpr, "PR:#%04X", PR);
+            setcerr(204, errpr);    /* Program Register (PR) - out of COMET II memory */
+        }
+        /* スタック領域を確保できない場合はエラー */
+        if(SP <= endptr) {
+            sprintf(errpr, "PR:#%04X", PR);
+            setcerr(205, errpr);    /* Stack Pointer (SP) - cannot allocate stack buffer */
+        }
+        op = memory[PR] & 0xFF00;
+        cmdtype = getcmdtype(op);
+        r_r1 = (memory[PR] >> 4) & 0xF;
+        x_r2 = memory[PR] & 0xF;
+        /* エラー発生時は終了 */
+        if(cerrno > 0) {
+            goto execerr;
+        }
+        if(tracemode){
+            fprintf(stdout, "#%04X: Register::::\n", PR);
+            dspregister();
+        }
+        if(dumpmode){
+            fprintf(stdout, "#%04X: Memory::::\n", PR);
+            dumpmemory();
+        }
+        if(dumpmode || tracemode) {
+            fprintf(stdout, "\n");
+        }
+        PR++;
+        /* 処理対象の値を取得 */
+        if(cmdtype == R1_R2) {
+            assert(x_r2 < REGSIZE);
+            val = GR[x_r2];
+        }
+        else if(cmdtype ==  R_ADR_X || cmdtype == R_ADR_X_ || cmdtype == ADR_X) {
+            /* 実効アドレス(値または値が示す番地)を取得  */
+            val = memory[PR++];
+            /* 指標アドレスを加算  */
+            if(x_r2 > 0x0) {
+                val += GR[x_r2];
+            }
+            /* ロード/算術論理演算命令/比較演算命令では、アドレスに格納されている内容を取得 */
+            if(cmdtype == R_ADR_X_) {
+                if(val >= MEMSIZE) {
+                    sprintf(errpr, "PR:#%04X", PR-1);
+                    setcerr(206, errpr);    /* Address - out of COMET II memory */
+                    goto execerr;
+                }
+                val = memory[val];
+            }
+        }
+        /* 主オペランドが1〜4の場合、第2ビットを無視 */
+        if(op >= 0x1000 && op <= 0x4FFF) {
+            op &= 0xFB00;
+        }
+        /* 命令ごとの処理を実行 */
+        switch(op)
+        {
+        case 0x0:  /* NOP */
+            break;
+        case 0x1000:    /* LD */
+            setfr(GR[r_r1] = val);
+            break;
+        case 0x1100:    /* ST */
+            memory[val] = GR[r_r1];
+            break;
+        case 0x1200:    /* LAD */
+            GR[r_r1] = val;
+            break;
+        case 0x2000:  /* ADDA */
+            GR[r_r1] = adda(GR[r_r1], val);
+            break;
+        case 0x2100:  /* SUBA */
+            GR[r_r1] = suba(GR[r_r1], val);
+            break;
+        case 0x2200:  /* ADDL */
+            GR[r_r1] = addl(GR[r_r1], val);
+            break;
+        case 0x2300:  /* SUBL */
+            GR[r_r1] = subl(GR[r_r1], val);
+            break;
+        case 0x3000:  /* AND */
+            setfr(GR[r_r1] &= val);
+            break;
+        case 0x3100:  /* OR */
+            setfr(GR[r_r1] |= val);
+            break;
+        case 0x3200:  /* XOR */
+            setfr(GR[r_r1] ^= val);
+            break;
+        case 0x4000:  /* CPA */
+            cpa(GR[r_r1], val);
+            break;
+        case 0x4100:  /* CPL */
+            cpl(GR[r_r1], val);
+            break;
+        case 0x5000:  /* SLA */
+            GR[r_r1] = sla(GR[r_r1], val);
+            break;
+        case 0x5100:  /* SRA */
+            GR[r_r1] = sra(GR[r_r1], val);
+            break;
+        case 0x5200:  /* SLL */
+            GR[r_r1] = sll(GR[r_r1], val);
+            break;
+        case 0x5300:  /* SRL */
+            GR[r_r1] = srl(GR[r_r1], val);
+            break;
+        case 0x6100:  /* JMI */
+            if((FR & SF) > 0) {
+                PR = val;
+            }
+            break;
+        case 0x6200:  /* JNZ */
+            if((FR & ZF) == 0) {
+                PR = val;
+            }
+            break;
+        case 0x6300:  /* JZE */
+            if((FR & ZF) > 0) {
+                PR = val;
+            }
+            break;
+        case 0x6400:  /* JUMP */
+            PR = val;
+            break;
+        case 0x6500:  /* JPL */
+            if((FR & (SF | ZF)) == 0) {
+                PR = val;
+            }
+            break;
+        case 0x6600:  /* JOV */
+            if((FR & OF) > 0) {
+                PR = val;
+            }
+            break;
+        case 0x7000:  /* PUSH */
+            memory[--SP] = val;
+            break;
+        case 0x7100:  /* POP */
+            GR[r_r1] = memory[SP++];
+            break;
+        case 0x8000:  /* CALL */
+            memory[--SP] = PR;
+            PR = val;
+            break;
+        case 0x8100:  /* RET */
+            assert(SP > endptr && SP <= MEMSIZE);
+            if(SP == MEMSIZE) {
+                return;
+            } else {
+                PR = memory[SP++];
+                break;
+            }
+        case 0xf000:  /* SVC */
+            switch(val)
+            {
+            case 0x0: /* EXIT */
+                return;
+            case 0x1: /* IN */
+                svcin();
+                break;
+            case 0x2: /* OUT */
+                svcout();
+                break;
+            }
+        default:
+            break;
+        }
+    }
+execerr:
+    fprintf(stderr, "Execute error - %d: %s\n", cerrno, cerrmsg);
+}
diff --git a/src/label.c b/src/label.c
new file mode 100644 (file)
index 0000000..02840a5
--- /dev/null
@@ -0,0 +1,65 @@
+#include "casl2.h"
+#include "assemble.h"
+
+LABELTAB *labels[LABELTABSIZE];
+
+/* ラベル表からアドレスを検索する */
+WORD getlabel(const char *label)
+{
+    LABELTAB *np;
+
+    for(np = labels[hash(label, LABELTABSIZE)]; np != NULL; np = np->next){
+        if(strcmp(label, np->name) == 0) {
+            return np->adr;
+        }
+    }
+    return 0xFFFF;
+}
+
+/* ラベルを表に追加する */
+bool addlabel(const char *label, WORD adr)
+{
+    LABELTAB *np;
+    unsigned hashval;
+
+    if(getlabel(label) != 0xFFFF){
+        setcerr(101, label);    /* label already defined */
+        return false;
+    }
+    np = (LABELTAB *) malloc(sizeof(*np));
+    if(np == NULL || (np->name = strdup(label)) == NULL){
+        setcerr(102, NULL);    /* label table is full */
+        return false;
+    }
+    hashval = hash(label, LABELTABSIZE);
+    np->next = labels[hashval];
+    labels[hashval] = np;
+    np->adr = adr;
+    return true;
+}
+
+/* ラベル表を表示する */
+void printlabel()
+{
+    int i;
+    LABELTAB *np;
+    for(i = 0; i < LABELTABSIZE; i++){
+        for(np = labels[i]; np != NULL; np = np->next){
+            fprintf(stdout, "%s ---> #%04X\n", np->name, np->adr);
+        }
+    }
+}
+
+/* ラベル表を解放する */
+void freelabel()
+{
+    int i;
+    LABELTAB *np, *nq;
+    for(i = 0; i < LABELTABSIZE; i++){
+        for(np = labels[i]; np != NULL; np = nq){
+            nq = np->next;
+            free(np->name);
+            free(np);
+        }
+    }
+}
diff --git a/src/macro.c b/src/macro.c
new file mode 100644 (file)
index 0000000..ff78dfb
--- /dev/null
@@ -0,0 +1,140 @@
+#include "casl2.h"
+#include "assemble.h"
+
+/*マクロ命令「IN IBUF,LEN」をメモリに書込  
+       PUSH 0,GR1
+       PUSH 0,GR2
+       LAD GR1,IBUF
+       LAD GR2,LEN
+        SVC 1
+       POP GR2
+       POP GR1
+*/
+bool writeIN(const char *ibuf, const char *len, PASS pass)
+{
+    bool status = false;
+
+    /* PUSH 0,GR1 */
+    writememory(0x7001, ptr++, pass);
+    writememory(0x0, ptr++, pass);
+    /* PUSH 0,GR2 */
+    writememory(0x7002, ptr++, pass);
+    writememory(0x0, ptr++, pass);
+    /* LAD GR1,IBUF */
+    writememory(0x1210, ptr++, pass);
+    writememory(getadr(ibuf, pass), ptr++, pass);
+    /* LAD GR2,LEN */
+    writememory(0x1220, ptr++, pass);
+    writememory(getadr(len, pass), ptr++, pass);
+    /* SVC 1 */
+    writememory(0xF000, ptr++, pass);
+    writememory(0x0001, ptr++, pass);
+    /* POP GR2 */
+    writememory(0x7120, ptr++, pass);
+    /* POP GR1 */
+    writememory(0x7110, ptr++, pass);
+    if(cerrno == 0) {
+        status = true;
+    }
+    return status;
+}
+
+/* マクロ命令「OUT OBUF,LEN」をメモリに書込
+       PUSH 0,GR1
+        PUSH 0,GR2
+        LAD GR1,OBUF
+        LD GR2,LEN
+        SVC 2
+       LAD GR1,=#A
+        LAD GR2,1
+        SVC 2
+        POP GR2
+        POP GR1
+*/
+bool writeOUT(const char *obuf, const char *len, PASS pass)
+{
+    bool status = false;
+
+    /* PUSH 0,GR1 */
+    writememory(0x7001, ptr++, pass);
+    writememory(0x0, ptr++, pass);
+    /* PUSH 0,GR2 */
+    writememory(0x7002, ptr++, pass);
+    writememory(0x0, ptr++, pass);
+    /* LAD GR1,OBUF */
+    writememory(0x1210, ptr++, pass);
+    writememory(getadr(obuf, pass), ptr++, pass);
+    /* LD GR2,OLEN */
+    writememory(0x1020, ptr++, pass);
+    writememory(getadr(len, pass), ptr++, pass);
+    /* SVC 2 */
+    writememory(0xF000, ptr++, pass);
+    writememory(0x0002, ptr++, pass);
+    /* LAD GR1,=#A */ 
+    writememory(0x1210, ptr++, pass);
+    if(pass == FIRST) {
+        ptr++;
+    } else {
+        writememory(lptr, ptr++, pass);    /* リテラルのアドレスを書込 */
+    }
+    writememory(0xA, lptr++, pass);
+    /* LAD GR2,1 */
+    writememory(0x1220, ptr++, pass);
+    writememory(0x0001, ptr++, pass);
+    /* SVC 2 */
+    writememory(0xF000, ptr++, pass);
+    writememory(0x0002, ptr++, pass);
+    /* POP GR2 */
+    writememory(0x7120, ptr++, pass);
+    /* POP GR1 */
+    writememory(0x7110, ptr++, pass);
+    if(cerrno == 0) {
+        status = true;
+    }
+    return status;
+}
+
+/* マクロ命令「RPUSH」をメモリに書き込む
+       PUSH 0,GR1
+        PUSH 0,GR2
+       PUSH 0,GR3
+        PUSH 0,GR4
+       PUSH 0,GR5
+        PUSH 0,GR6
+       PUSH 0,GR7
+ */
+bool writeRPUSH(PASS pass) {
+    int i;
+    bool status = false;
+
+    for(i = 1; i <= 7; i++) {
+        writememory(0x7000 + i, ptr++, pass);   /* PUSH GRn */
+        writememory(0x0, ptr++, pass);
+    }
+    if(cerrno == 0) {
+        status = true;
+    }
+    return status;
+}
+
+/* マクロ命令「RPOP」をメモリに書き込む
+       POP GR7
+       POP GR6
+       POP GR5
+       POP GR4
+       POP GR3
+       POP GR3
+       POP GR2
+       POP GR1
+ */
+bool writeRPOP(PASS pass) {
+    int i;
+    bool status = false;
+    for(i = 7; i >= 1; i--) {
+        writememory((0x7100 + (i << 4)), ptr++, pass);  /* POP GRn */
+    }
+    if(cerrno == 0) {
+        status = true;
+    }
+    return status;
+}
diff --git a/src/struct.c b/src/struct.c
new file mode 100644 (file)
index 0000000..dc1f358
--- /dev/null
@@ -0,0 +1,48 @@
+#include "casl2.h"
+
+/* COMET IIのメモリ */
+WORD memory[MEMSIZE];
+
+/* COMET IIのCPUレジスタ */
+WORD GR[REGSIZE], SP, PR, FR;
+
+/* エラーメッセージ */
+int cerrno = 0;
+char *cerrmsg;
+
+/* レジストリの内容を表示する場合はtrue */
+bool tracemode = false;
+
+/* レジストリの内容を論理値(0〜65535)で表示する場合はTRUE */
+bool logicalmode = false;
+
+/* メモリの内容を表示する場合はtrue */
+bool dumpmode = false;
+
+/* ソースを表示する場合はtrue */
+bool srcmode = false;
+
+/* ラベル表を表示する場合はtrue */
+bool labelmode = false;
+
+/* アセンブラ詳細結果を表示する場合はtrue */
+bool asdetailmode = false;
+
+/* アセンブルだけを行う場合はtrue */
+bool onlyassemblemode = false;
+
+/* 実行開始番地 */
+WORD startptr = 0x0;
+
+/* 実行終了番地 */
+WORD endptr = 0x0;
+
+/* ハッシュ値を取得する */
+unsigned hash(const char *key, int size){
+    unsigned hashval;
+
+    for(hashval = 0; *key != '\0'; key++){
+        hashval = *key + 31 * hashval;
+    }
+    return hashval % size;
+}
diff --git a/src/token.c b/src/token.c
new file mode 100644 (file)
index 0000000..c46c9f2
--- /dev/null
@@ -0,0 +1,110 @@
+#include "casl2.h"
+#include "assemble.h"
+
+/* 「,」区切りの文字列から、オペランドのトークンを取得 */
+OPD *opdtok(const char *str)
+{
+    OPD *opd = malloc(sizeof(OPD));
+    char *p, *q, *sepp;
+    int sepc = ',';
+    bool quoting = false;
+
+    opd->opdc = 0;
+    if(str == NULL || strlen(str) == 0) {
+        return opd;
+    }
+    p = q = strdup(str);
+    do {
+        /* オペランド数が多すぎる場合はエラー */
+        if(opd->opdc >= OPDSIZE) {
+            setcerr(117, NULL);    /* operand is too many */
+            break;
+        }
+        /* 先頭が「=」の場合の処理 */
+        if(*q == '=') {
+            q++;
+        }
+        /* 「'」で囲まれた文字列の処理。「''」は無視 */
+        if(*q == '\'' && *(q+1) != '\'' && !(p < q && *(q-1) == '\'')) {
+            quoting = !quoting;
+        }
+        if(quoting == true) {
+            q++;
+        } else {
+            sepp = q + strcspn(q, ", ");
+            sepc = *sepp;
+            *sepp = '\0';
+            if(strlen(p) == 0) {
+                setcerr(121, NULL);    /* cannot get operand token */
+                break;
+            }
+            if(strlen(p) > OPDSIZE + 1) {
+                setcerr(118, p);    /* operand length is too long */
+                break;
+            }
+            opd->opdv[(++opd->opdc)-1] = strdup(p);
+            p = q = sepp + 1;
+        }
+    } while(sepc == ',');
+    return opd;
+}
+
+/* 空白またはタブで区切られた1行から、トークンを取得 */
+CMDLINE *linetok(const char *line)
+{
+    char *tokens, *p, *q, *sepp;
+    CMDLINE *cmdl = malloc(sizeof(CMDLINE));
+    if(line == NULL || strlen(line) == 0) {
+        return NULL;
+    }
+    tokens = p = strdup(line);
+    /* コメントを削除 */
+    if((q = strchr(tokens, ';')) != NULL) {
+        *q = '\0';
+    }
+    if(*p == '\0') {
+        return NULL;
+    }
+    /* 行の先頭が空白またはタブの場合、ラベルは空 */
+    if((sepp = p + strcspn(p, " \t\n")) == p){
+        cmdl->label = NULL;
+    } else {        /* ラベルを取得 */
+        *sepp = '\0';
+        /* 文字列が長すぎる場合はエラー */
+        if(strlen(p) > LABELSIZE) {
+            setcerr(104, p);    /* label length is too long */
+        }
+        cmdl->label = strdup(p);
+        p = sepp + 1;
+    }
+    while(*p == ' ' || *p == '\t') {
+        p++;
+    }
+    /* 命令がない場合、終了 */
+    if(*p == '\n' || *p == '\0') {
+        /* ラベルが定義されていて命令がない場合はエラー */
+        if(cmdl->label != NULL) {
+            setcerr(105, NULL);    /* no command in the line */
+        }
+        return NULL;
+    }
+    /* 命令を取得 */
+    sepp = p + strcspn(p, " \t\n");
+    *sepp = '\0';
+    cmdl->cmd = strdup(p);
+    p = sepp + 1;
+    while(*p == ' ' || *p == '\t') {
+        p++;
+    }
+    /* オペランドを取得 */
+    cmdl->opd = malloc(sizeof(OPD));
+    /* 改行かタブまでの文字列を取得。
+       「'」で囲まれた文字列に含まれる場合があるため、空白は無視 */
+    if((sepp = p + strcspn(p, "\t\n")) > p) {
+        *sepp = '\0';
+        cmdl->opd = opdtok(p);
+    } else {
+        cmdl->opd->opdc = 0;
+    }
+    return cmdl;
+}
diff --git a/test/astest/List.mk b/test/astest/List.mk
new file mode 100644 (file)
index 0000000..9dc62b4
--- /dev/null
@@ -0,0 +1,48 @@
+TESTS = \
+add \
+add_err \
+add_labelerr \
+adda_overflow \
+addl \
+addl_overflow \
+binout \
+div \
+floatedit \
+hello \
+iotest \
+lad \
+ladtest \
+multi \
+outtest \
+outtest1 \
+outtest2 \
+outtest_err \
+pushpop \
+sla2 \
+sra2 \
+ds \
+ds_err \
+literalstr \
+ld \
+call \
+add_p \
+count \
+multi_p \
+muls \
+muls_p \
+add_opdspc_err \
+dc_overflow \
+hanoi  \
+summary \
+summary_lderr \
+literal_spc \
+dc_spc \
+ptn1 \
+ptn2 \
+ptn3 \
+ptn4 \
+count_call1 \
+count_call2 \
+count_call \
+div10_test \
+div2 \
diff --git a/test/astest/Makefile b/test/astest/Makefile
new file mode 100644 (file)
index 0000000..19d11b4
--- /dev/null
@@ -0,0 +1,47 @@
+include List.mk
+LOGFILE = test.log
+ifdef UNITNAME
+  define create
+    @mkdir $(UNITNAME)
+    @echo "UNITNAME = $(UNITNAME)" >$(UNITNAME)/Makefile; \
+     echo "# ASFILE = " >>$(UNITNAME)/Makefile; \
+     echo "# CASL2FLAG = " >>$(UNITNAME)/Makefile; \
+     echo "# INFILE = " >>$(UNITNAME)/Makefile; \
+     echo "include ../Test.mk" >>$(UNITNAME)/Makefile
+    @echo $(UNITNAME) \\ >>List.mk
+  endef
+else
+  define create
+    @echo "no test created. set UNITNAME"
+  endef
+endif
+
+.PHONY: all clean logclean testclean check prepare
+all: check
+check: logclean checkeach report
+clean: logclean testclean
+logclean:
+       @rm -f $(LOGFILE)
+testclean:
+       @for target in $(TESTS); do \
+         $(MAKE) testclean -C $$target; \
+     done
+checkeach:
+       @for target in $(TESTS); do \
+         $(MAKE) -C $$target; \
+     done
+prepare: logclean
+       @for target in $(TESTS) ; do \
+            $(MAKE) prepare -C $$target ;\
+     done
+create:
+       $(create)
+report:
+       @success=`grep "Success" $(LOGFILE) | wc -l`; \
+        all=`cat $(LOGFILE) | wc -l`; \
+        echo "$$success / $$all tests passed. Details in $(PWD)/$(LOGFILE)"; \
+        if test $$success -eq $$all; then \
+          echo "All tests are succeded."; \
+        else \
+          grep "Failure" $(LOGFILE); \
+        fi
diff --git a/test/astest/Test.mk b/test/astest/Test.mk
new file mode 100644 (file)
index 0000000..e06a979
--- /dev/null
@@ -0,0 +1,61 @@
+CASL2 = ../../../casl2
+ifndef CASL2FLAG
+       CASL2FLAG = -tals
+endif
+COMET2 = ../../../comet2
+ifndef COMET2FLAG
+       COMET2FLAG = -td
+endif
+ifndef ASFILE
+       ASFILE=../../../as/$(UNITNAME).casl
+endif
+ifdef INFILE
+       IN= <$(INFILE)
+endif
+LOGFILE = ../test.log
+define report
+  @echo -n "$(UNITNAME): Test " >$@
+  @if test ! -s $^; then \
+    echo -n "Success " >>$@; \
+  else \
+    echo -n "Failure " >>$@; \
+  fi
+  @echo `date +"%F %T"` >>$@
+endef
+
+.PHPNY: all check ocheck prepare oprepare testclean otestclean orgclean oorgclean
+check: testclean logadd
+ocheck: otestclean ologadd
+all: check ocheck
+prepare: orgclean testclean 0.txt
+oprepare: oorgclean otestclean 0.o 0.o.txt
+orgclean:
+       @rm -f 0.txt
+oorgclean:
+       @rm -f 0.o 0.o.txt
+testclean:
+       @rm -f 1.txt diff.txt report.txt
+otestclean:
+       @rm -f 1.o 1.o.txt diff.o.txt report.o.txt
+0.txt 1.txt: $(CASL2) $(ASFILE) $(INFILE)
+       @-$(CASL2) $(CASL2FLAG) $(ASFILE) $(IN) >res.txt 2>err.txt; \
+      cat res.txt err.txt >$@; \
+      rm res.txt err.txt
+diff.txt: 1.txt
+       @-diff 0.txt 1.txt >$@ 2>&1
+report.txt: diff.txt
+       $(report)
+logadd: report.txt
+       @cat $^ >>$(LOGFILE)
+0.o 1.o: $(CASL2) $(ASFILE)
+       @-$(CASL2) -o $@ $(ASFILE)
+0.o.txt: $(COMET2) 0.o
+       @-$(COMET2) $(COMET2FLAG) 0.o >0.o.txt
+1.o.txt: $(COMET2) 1.o
+       @-$(COMET2) $(COMET2FLAG) 1.o >1.o.txt
+diff.o.txt: 1.o.txt
+       @-diff 0.o.txt 1.o.txt >>$@ 2>&1
+report.o.txt: diff.o.txt
+       $(report)
+ologadd: report.o.txt
+       @cat $^ >>$(LOGFILE)
diff --git a/test/astest/add/0.o.txt b/test/astest/add/0.o.txt
new file mode 100644 (file)
index 0000000..711b3d5
--- /dev/null
@@ -0,0 +1,143 @@
+
+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 : 512 = #0200 = 0000001000000000
+#0000: PR : 0 = #0000 = 0000000000000000
+#0000: FR (OF SF ZF): 0000000000000000
+#0000: Memory::::
+#0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0000: 0000: 1010 0005 2010 0006 8100 0003 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0010: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0020: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0040: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0060: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+
+#0002: Register::::
+#0002: GR0: 0 = #0000 = 0000000000000000
+#0002: GR1: 3 = #0003 = 0000000000000011
+#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 : 512 = #0200 = 0000001000000000
+#0002: PR : 2 = #0002 = 0000000000000010
+#0002: FR (OF SF ZF): 0000000000000000
+#0002: Memory::::
+#0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0002: 0000: 1010 0005 2010 0006 8100 0003 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0010: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0020: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0040: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0060: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+
+#0004: Register::::
+#0004: GR0: 0 = #0000 = 0000000000000000
+#0004: GR1: 4 = #0004 = 0000000000000100
+#0004: GR2: 0 = #0000 = 0000000000000000
+#0004: GR3: 0 = #0000 = 0000000000000000
+#0004: GR4: 0 = #0000 = 0000000000000000
+#0004: GR5: 0 = #0000 = 0000000000000000
+#0004: GR6: 0 = #0000 = 0000000000000000
+#0004: GR7: 0 = #0000 = 0000000000000000
+#0004: SP : 512 = #0200 = 0000001000000000
+#0004: PR : 4 = #0004 = 0000000000000100
+#0004: FR (OF SF ZF): 0000000000000000
+#0004: Memory::::
+#0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0004: 0000: 1010 0005 2010 0006 8100 0003 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0010: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0020: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0040: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0060: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+
diff --git a/test/astest/add/0.txt b/test/astest/add/0.txt
new file mode 100644 (file)
index 0000000..ab58ad2
--- /dev/null
@@ -0,0 +1,174 @@
+
+Assemble ../../../as/add.casl (0)
+../../../as/add.casl:1:MAIN    START
+../../../as/add.casl:2:BEGIN   LD      GR1,A
+../../../as/add.casl:3:        ADDA    GR1,B
+../../../as/add.casl:4:    RET
+../../../as/add.casl:5:A       DC      3
+../../../as/add.casl:6:B       DC      1
+../../../as/add.casl:7:        END
+
+Label::::
+A ---> #0005
+B ---> #0006
+BEGIN ---> #0000
+MAIN ---> #0000
+
+Assemble ../../../as/add.casl (1)
+../../../as/add.casl:1:MAIN    START
+../../../as/add.casl:2:BEGIN   LD      GR1,A
+       #0000   #1010
+       #0001   #0005
+../../../as/add.casl:3:        ADDA    GR1,B
+       #0002   #2010
+       #0003   #0006
+../../../as/add.casl:4:    RET
+       #0004   #8100
+../../../as/add.casl:5:A       DC      3
+       #0005   #0003
+../../../as/add.casl:6:B       DC      1
+       #0006   #0001
+../../../as/add.casl:7:        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:     512 = #0200 = 0000001000000000
+#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 0005 2010 0006 8100 0003 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0010: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0020: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0040: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0060: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+
+#0002: Register::::
+#0002: GR0:      0 = #0000 = 0000000000000000
+#0002: GR1:      3 = #0003 = 0000000000000011
+#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:     512 = #0200 = 0000001000000000
+#0002: PR:       2 = #0002 = 0000000000000010
+#0002: FR (OF SF ZF): 000
+#0002: Memory::::
+#0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0002: 0000: 1010 0005 2010 0006 8100 0003 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0010: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0020: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0040: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0060: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+
+#0004: Register::::
+#0004: GR0:      0 = #0000 = 0000000000000000
+#0004: GR1:      4 = #0004 = 0000000000000100
+#0004: GR2:      0 = #0000 = 0000000000000000
+#0004: GR3:      0 = #0000 = 0000000000000000
+#0004: GR4:      0 = #0000 = 0000000000000000
+#0004: GR5:      0 = #0000 = 0000000000000000
+#0004: GR6:      0 = #0000 = 0000000000000000
+#0004: GR7:      0 = #0000 = 0000000000000000
+#0004: SP:     512 = #0200 = 0000001000000000
+#0004: PR:       4 = #0004 = 0000000000000100
+#0004: FR (OF SF ZF): 000
+#0004: Memory::::
+#0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0004: 0000: 1010 0005 2010 0006 8100 0003 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0010: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0020: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0040: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0060: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+
diff --git a/test/astest/add/Makefile b/test/astest/add/Makefile
new file mode 100644 (file)
index 0000000..4b45b46
--- /dev/null
@@ -0,0 +1,3 @@
+UNITNAME = add
+CASL2FLAG = -tadls
+include ../Test.mk
diff --git a/test/astest/add_err/0.txt b/test/astest/add_err/0.txt
new file mode 100644 (file)
index 0000000..e04003d
--- /dev/null
@@ -0,0 +1,8 @@
+
+Assemble ../../../as/add_err.casl (0)
+../../../as/add_err.casl:1:MAIN        START   BEGIN
+../../../as/add_err.casl:2:BEGIN       LD      GR1,A
+../../../as/add_err.casl:3:    ADEA    GR1,B
+Assemble error - 110: ADEA: not command of operand "r,adr[,x]"
+ ../../../as/add_err.casl:3:   ADEA    GR1,B
+
diff --git a/test/astest/add_err/Makefile b/test/astest/add_err/Makefile
new file mode 100644 (file)
index 0000000..d4fcdc9
--- /dev/null
@@ -0,0 +1,2 @@
+UNITNAME = add_err
+include ../Test.mk
diff --git a/test/astest/add_labelerr/0.txt b/test/astest/add_labelerr/0.txt
new file mode 100644 (file)
index 0000000..80a528e
--- /dev/null
@@ -0,0 +1,12 @@
+
+Assemble ../../../as/add_labelerr.casl (0)
+../../../as/add_labelerr.casl:1:MAIN   START   BEGIN
+../../../as/add_labelerr.casl:2:BEGIN  LD      GR1,A
+../../../as/add_labelerr.casl:3:       ADDA    GR1,B
+../../../as/add_labelerr.casl:4:    ST GR1,C
+../../../as/add_labelerr.casl:5:    RET
+../../../as/add_labelerr.casl:6:A      DC      3
+../../../as/add_labelerr.casl:7:A      DC      1
+Assemble error - 101: A: label already defined
+ ../../../as/add_labelerr.casl:7: A    DC      1
+
diff --git a/test/astest/add_labelerr/Makefile b/test/astest/add_labelerr/Makefile
new file mode 100644 (file)
index 0000000..64932fb
--- /dev/null
@@ -0,0 +1,2 @@
+UNITNAME = add_labelerr
+include ../Test.mk
diff --git a/test/astest/add_opdspc_err/0.txt b/test/astest/add_opdspc_err/0.txt
new file mode 100644 (file)
index 0000000..7cba9c7
--- /dev/null
@@ -0,0 +1,7 @@
+
+Assemble ../../../as/add_opdspc_err.casl (0)
+../../../as/add_opdspc_err.casl:1:MAIN START   BEGIN
+../../../as/add_opdspc_err.casl:2:BEGIN        LD      GR1, A
+Assemble error - 121: cannot get operand token
+ ../../../as/add_opdspc_err.casl:2: BEGIN      LD      GR1, A
+
diff --git a/test/astest/add_opdspc_err/Makefile b/test/astest/add_opdspc_err/Makefile
new file mode 100644 (file)
index 0000000..ee529ea
--- /dev/null
@@ -0,0 +1,2 @@
+UNITNAME = add_opdspc_err
+include ../Test.mk
diff --git a/test/astest/add_p/0.txt b/test/astest/add_p/0.txt
new file mode 100644 (file)
index 0000000..b2a0871
--- /dev/null
@@ -0,0 +1,395 @@
+
+Assemble ../../../as/add_p.casl (0)
+../../../as/add_p.casl:1:MAIN  START
+../../../as/add_p.casl:2:BEGIN LD      GR1,A
+../../../as/add_p.casl:3:      ADDA    GR1,B
+../../../as/add_p.casl:4:    CALL      ITOA
+../../../as/add_p.casl:5:    RET
+../../../as/add_p.casl:6:A     DC      999
+../../../as/add_p.casl:7:B     DC      998
+../../../as/add_p.casl:8:C     DS      1
+../../../as/add_p.casl:9:      END
+
+Assemble ../../../as/itoa.casl (0)
+../../../as/itoa.casl:1:;GR1に格納された数値を表示
+../../../as/itoa.casl:2:ITOA   START
+../../../as/itoa.casl:3:       PUSH 0,GR2
+../../../as/itoa.casl:4:       PUSH 0,GR3
+../../../as/itoa.casl:5:       PUSH 0,GR4
+../../../as/itoa.casl:6:    LAD        GR0,0
+../../../as/itoa.casl:7:    LAD        GR2,0
+../../../as/itoa.casl:8:    AND GR1,GR1
+../../../as/itoa.casl:9:    JPL ILOOP
+../../../as/itoa.casl:10:    JZE ILOOP
+../../../as/itoa.casl:11:    LAD GR0,1
+../../../as/itoa.casl:12:    CALL INV
+../../../as/itoa.casl:13:ILOOP CPA     GR1,TEN
+../../../as/itoa.casl:14:      JMI     INEXT
+../../../as/itoa.casl:15:      CALL    DIV
+../../../as/itoa.casl:16:    ADDA      GR4,ZCHAR
+../../../as/itoa.casl:17:    ST        GR4,STR,GR2
+../../../as/itoa.casl:18:    LAD       GR2,1,GR2
+../../../as/itoa.casl:19:    LD        GR1,GR3
+../../../as/itoa.casl:20:    JUMP      ILOOP
+../../../as/itoa.casl:21:INEXT ADDA    GR1,ZCHAR
+../../../as/itoa.casl:22:      ST      GR1,STR,GR2
+../../../as/itoa.casl:23:      LAD     GR2,1,GR2
+../../../as/itoa.casl:24:    CPA GR0,=1
+../../../as/itoa.casl:25:    JPL       PRT
+../../../as/itoa.casl:26:    JMI       PRT
+../../../as/itoa.casl:27:    LD        GR1,MINUS
+../../../as/itoa.casl:28:      ST      GR1,STR,GR2
+../../../as/itoa.casl:29:      LAD     GR2,1,GR2
+../../../as/itoa.casl:30:PRT   ST      GR2,LEN
+../../../as/itoa.casl:31:      LAD     GR1,STR
+../../../as/itoa.casl:32:    LD        GR2,LEN
+../../../as/itoa.casl:33:    CALL REV
+../../../as/itoa.casl:34:      OUT     STR,LEN
+../../../as/itoa.casl:35:      POP GR4
+../../../as/itoa.casl:36:      POP GR3
+../../../as/itoa.casl:37:      POP GR2
+../../../as/itoa.casl:38:      RET
+../../../as/itoa.casl:39:TEN   DC      10
+../../../as/itoa.casl:40:ZCHAR DC '0'
+../../../as/itoa.casl:41:MINUS DC '-'
+../../../as/itoa.casl:42:STR   DS      6
+../../../as/itoa.casl:43:LEN   DS      1
+../../../as/itoa.casl:44:    END
+../../../as/itoa.casl:45:;GR1を10で割ったときの商をGR3、剰余をGR4に格納
+../../../as/itoa.casl:46:DIV   LD      GR4,GR1
+../../../as/itoa.casl:47:      LAD     GR3,0
+../../../as/itoa.casl:48:DLOOP CPA     GR4,TEN
+../../../as/itoa.casl:49:      JMI     DFIN
+../../../as/itoa.casl:50:    SUBL GR4,TEN
+../../../as/itoa.casl:51:    LAD       GR3,1,GR3
+../../../as/itoa.casl:52:    JUMP      DLOOP
+../../../as/itoa.casl:53:DFIN RET
+../../../as/itoa.casl:54:      END
+../../../as/itoa.casl:55:;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+../../../as/itoa.casl:56:;例: 12345 -> 54321
+../../../as/itoa.casl:57:REV   START
+../../../as/itoa.casl:58:      PUSH    0,GR3
+../../../as/itoa.casl:59:    PUSH      0,GR4
+../../../as/itoa.casl:60:    PUSH      0,GR5
+../../../as/itoa.casl:61:      LAD     GR3,1
+../../../as/itoa.casl:62:RPU   CPA     GR2,GR3
+../../../as/itoa.casl:63:      JMI     RNEXT
+../../../as/itoa.casl:64:    LD        GR4,GR1
+../../../as/itoa.casl:65:    ADDA      GR4,GR3
+../../../as/itoa.casl:66:    LD        GR4,-1,GR4
+../../../as/itoa.casl:67:      PUSH 0,GR4
+../../../as/itoa.casl:68:    LAD       GR3,1,GR3
+../../../as/itoa.casl:69:    JUMP      RPU
+../../../as/itoa.casl:70:RNEXT    LAD  GR3,1
+../../../as/itoa.casl:71:RPO   CPA     GR2,GR3
+../../../as/itoa.casl:72:      JMI     RFIN
+../../../as/itoa.casl:73:    POP GR4
+../../../as/itoa.casl:74:    LD GR5,GR1
+../../../as/itoa.casl:75:    ADDA GR5,GR3
+../../../as/itoa.casl:76:    ST GR4,-1,GR5
+../../../as/itoa.casl:77:    LAD       GR3,1,GR3
+../../../as/itoa.casl:78:    JUMP RPO
+../../../as/itoa.casl:79:RFIN POP GR5
+../../../as/itoa.casl:80:      POP     GR4
+../../../as/itoa.casl:81:    POP       GR3
+../../../as/itoa.casl:82:      RET
+../../../as/itoa.casl:83:      END
+../../../as/itoa.casl:84:;GR1の内容をマイナス値にする
+../../../as/itoa.casl:85:;例: 10 -> -10, -20 -> 20
+../../../as/itoa.casl:86:INV   START
+../../../as/itoa.casl:87:      XOR     GR1,=#FFFF
+../../../as/itoa.casl:88:    LAD       GR1,1,GR1
+../../../as/itoa.casl:89:    RET
+../../../as/itoa.casl:90:      END
+
+Label::::
+STR ---> #005F
+DFIN ---> #0073
+ITOA ---> #000A
+A ---> #0007
+B ---> #0008
+C ---> #0009
+RNEXT ---> #0089
+MINUS ---> #005E
+RFIN ---> #0097
+ILOOP ---> #001D
+DIV ---> #0066
+REV ---> #0074
+BEGIN ---> #0000
+PRT ---> #003E
+ZCHAR ---> #005D
+MAIN ---> #0000
+INEXT ---> #002C
+INV ---> #009B
+RPO ---> #008B
+RPU ---> #007C
+DLOOP ---> #0069
+LEN ---> #0065
+TEN ---> #005C
+
+Assemble ../../../as/add_p.casl (1)
+../../../as/add_p.casl:1:MAIN  START
+../../../as/add_p.casl:2:BEGIN LD      GR1,A
+       #0000   #1010
+       #0001   #0007
+../../../as/add_p.casl:3:      ADDA    GR1,B
+       #0002   #2010
+       #0003   #0008
+../../../as/add_p.casl:4:    CALL      ITOA
+       #0004   #8000
+       #0005   #000A
+../../../as/add_p.casl:5:    RET
+       #0006   #8100
+../../../as/add_p.casl:6:A     DC      999
+       #0007   #03E7
+../../../as/add_p.casl:7:B     DC      998
+       #0008   #03E6
+../../../as/add_p.casl:8:C     DS      1
+       #0009   #0000
+../../../as/add_p.casl:9:      END
+
+Assemble ../../../as/itoa.casl (1)
+../../../as/itoa.casl:1:;GR1に格納された数値を表示
+../../../as/itoa.casl:2:ITOA   START
+../../../as/itoa.casl:3:       PUSH 0,GR2
+       #000A   #7002
+       #000B   #0000
+../../../as/itoa.casl:4:       PUSH 0,GR3
+       #000C   #7003
+       #000D   #0000
+../../../as/itoa.casl:5:       PUSH 0,GR4
+       #000E   #7004
+       #000F   #0000
+../../../as/itoa.casl:6:    LAD        GR0,0
+       #0010   #1200
+       #0011   #0000
+../../../as/itoa.casl:7:    LAD        GR2,0
+       #0012   #1220
+       #0013   #0000
+../../../as/itoa.casl:8:    AND GR1,GR1
+       #0014   #3411
+../../../as/itoa.casl:9:    JPL ILOOP
+       #0015   #6500
+       #0016   #001D
+../../../as/itoa.casl:10:    JZE ILOOP
+       #0017   #6300
+       #0018   #001D
+../../../as/itoa.casl:11:    LAD GR0,1
+       #0019   #1200
+       #001A   #0001
+../../../as/itoa.casl:12:    CALL INV
+       #001B   #8000
+       #001C   #009B
+../../../as/itoa.casl:13:ILOOP CPA     GR1,TEN
+       #001D   #4010
+       #001E   #005C
+../../../as/itoa.casl:14:      JMI     INEXT
+       #001F   #6100
+       #0020   #002C
+../../../as/itoa.casl:15:      CALL    DIV
+       #0021   #8000
+       #0022   #0066
+../../../as/itoa.casl:16:    ADDA      GR4,ZCHAR
+       #0023   #2040
+       #0024   #005D
+../../../as/itoa.casl:17:    ST        GR4,STR,GR2
+       #0025   #1142
+       #0026   #005F
+../../../as/itoa.casl:18:    LAD       GR2,1,GR2
+       #0027   #1222
+       #0028   #0001
+../../../as/itoa.casl:19:    LD        GR1,GR3
+       #0029   #1413
+../../../as/itoa.casl:20:    JUMP      ILOOP
+       #002A   #6400
+       #002B   #001D
+../../../as/itoa.casl:21:INEXT ADDA    GR1,ZCHAR
+       #002C   #2010
+       #002D   #005D
+../../../as/itoa.casl:22:      ST      GR1,STR,GR2
+       #002E   #1112
+       #002F   #005F
+../../../as/itoa.casl:23:      LAD     GR2,1,GR2
+       #0030   #1222
+       #0031   #0001
+../../../as/itoa.casl:24:    CPA GR0,=1
+       #00A0   #0001
+       #0032   #4000
+       #0033   #00A0
+../../../as/itoa.casl:25:    JPL       PRT
+       #0034   #6500
+       #0035   #003E
+../../../as/itoa.casl:26:    JMI       PRT
+       #0036   #6100
+       #0037   #003E
+../../../as/itoa.casl:27:    LD        GR1,MINUS
+       #0038   #1010
+       #0039   #005E
+../../../as/itoa.casl:28:      ST      GR1,STR,GR2
+       #003A   #1112
+       #003B   #005F
+../../../as/itoa.casl:29:      LAD     GR2,1,GR2
+       #003C   #1222
+       #003D   #0001
+../../../as/itoa.casl:30:PRT   ST      GR2,LEN
+       #003E   #1120
+       #003F   #0065
+../../../as/itoa.casl:31:      LAD     GR1,STR
+       #0040   #1210
+       #0041   #005F
+../../../as/itoa.casl:32:    LD        GR2,LEN
+       #0042   #1020
+       #0043   #0065
+../../../as/itoa.casl:33:    CALL REV
+       #0044   #8000
+       #0045   #0074
+../../../as/itoa.casl:34:      OUT     STR,LEN
+       #0046   #7001
+       #0047   #0000
+       #0048   #7002
+       #0049   #0000
+       #004A   #1210
+       #004B   #005F
+       #004C   #1020
+       #004D   #0065
+       #004E   #F000
+       #004F   #0002
+       #0050   #1210
+       #0051   #00A1
+       #00A1   #000A
+       #0052   #1220
+       #0053   #0001
+       #0054   #F000
+       #0055   #0002
+       #0056   #7120
+       #0057   #7110
+../../../as/itoa.casl:35:      POP GR4
+       #0058   #7140
+../../../as/itoa.casl:36:      POP GR3
+       #0059   #7130
+../../../as/itoa.casl:37:      POP GR2
+       #005A   #7120
+../../../as/itoa.casl:38:      RET
+       #005B   #8100
+../../../as/itoa.casl:39:TEN   DC      10
+       #005C   #000A
+../../../as/itoa.casl:40:ZCHAR DC '0'
+       #005D   #0030
+../../../as/itoa.casl:41:MINUS DC '-'
+       #005E   #002D
+../../../as/itoa.casl:42:STR   DS      6
+       #005F   #0000
+       #0060   #0000
+       #0061   #0000
+       #0062   #0000
+       #0063   #0000
+       #0064   #0000
+../../../as/itoa.casl:43:LEN   DS      1
+       #0065   #0000
+../../../as/itoa.casl:44:    END
+../../../as/itoa.casl:45:;GR1を10で割ったときの商をGR3、剰余をGR4に格納
+../../../as/itoa.casl:46:DIV   LD      GR4,GR1
+       #0066   #1441
+../../../as/itoa.casl:47:      LAD     GR3,0
+       #0067   #1230
+       #0068   #0000
+../../../as/itoa.casl:48:DLOOP CPA     GR4,TEN
+       #0069   #4040
+       #006A   #005C
+../../../as/itoa.casl:49:      JMI     DFIN
+       #006B   #6100
+       #006C   #0073
+../../../as/itoa.casl:50:    SUBL GR4,TEN
+       #006D   #2340
+       #006E   #005C
+../../../as/itoa.casl:51:    LAD       GR3,1,GR3
+       #006F   #1233
+       #0070   #0001
+../../../as/itoa.casl:52:    JUMP      DLOOP
+       #0071   #6400
+       #0072   #0069
+../../../as/itoa.casl:53:DFIN RET
+       #0073   #8100
+../../../as/itoa.casl:54:      END
+../../../as/itoa.casl:55:;アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
+../../../as/itoa.casl:56:;例: 12345 -> 54321
+../../../as/itoa.casl:57:REV   START
+../../../as/itoa.casl:58:      PUSH    0,GR3
+       #0074   #7003
+       #0075   #0000
+../../../as/itoa.casl:59:    PUSH      0,GR4
+       #0076   #7004
+       #0077   #0000
+../../../as/itoa.casl:60:    PUSH      0,GR5
+       #0078   #7005
+       #0079   #0000
+../../../as/itoa.casl:61:      LAD     GR3,1
+       #007A   #1230
+       #007B   #0001
+../../../as/itoa.casl:62:RPU   CPA     GR2,GR3
+       #007C   #4423
+../../../as/itoa.casl:63:      JMI     RNEXT
+       #007D   #6100
+       #007E   #0089
+../../../as/itoa.casl:64:    LD        GR4,GR1
+       #007F   #1441
+../../../as/itoa.casl:65:    ADDA      GR4,GR3
+       #0080   #2443
+../../../as/itoa.casl:66:    LD        GR4,-1,GR4
+       #0081   #1044
+       #0082   #FFFF
+../../../as/itoa.casl:67:      PUSH 0,GR4
+       #0083   #7004
+       #0084   #0000
+../../../as/itoa.casl:68:    LAD       GR3,1,GR3
+       #0085   #1233
+       #0086   #0001
+../../../as/itoa.casl:69:    JUMP      RPU
+       #0087   #6400
+       #0088   #007C
+../../../as/itoa.casl:70:RNEXT    LAD  GR3,1
+       #0089   #1230
+       #008A   #0001
+../../../as/itoa.casl:71:RPO   CPA     GR2,GR3
+       #008B   #4423
+../../../as/itoa.casl:72:      JMI     RFIN
+       #008C   #6100
+       #008D   #0097
+../../../as/itoa.casl:73:    POP GR4
+       #008E   #7140
+../../../as/itoa.casl:74:    LD GR5,GR1
+       #008F   #1451
+../../../as/itoa.casl:75:    ADDA GR5,GR3
+       #0090   #2453
+../../../as/itoa.casl:76:    ST GR4,-1,GR5
+       #0091   #1145
+       #0092   #FFFF
+../../../as/itoa.casl:77:    LAD       GR3,1,GR3
+       #0093   #1233
+       #0094   #0001
+../../../as/itoa.casl:78:    JUMP RPO
+       #0095   #6400
+       #0096   #008B
+../../../as/itoa.casl:79:RFIN POP GR5
+       #0097   #7150
+../../../as/itoa.casl:80:      POP     GR4
+       #0098   #7140
+../../../as/itoa.casl:81:    POP       GR3
+       #0099   #7130
+../../../as/itoa.casl:82:      RET
+       #009A   #8100
+../../../as/itoa.casl:83:      END
+../../../as/itoa.casl:84:;GR1の内容をマイナス値にする
+../../../as/itoa.casl:85:;例: 10 -> -10, -20 -> 20
+../../../as/itoa.casl:86:INV   START
+../../../as/itoa.casl:87:      XOR     GR1,=#FFFF
+       #00A2   #FFFF
+       #009B   #3210
+       #009C   #00A2
+../../../as/itoa.casl:88:    LAD       GR1,1,GR1
+       #009D   #1211
+       #009E   #0001
+../../../as/itoa.casl:89:    RET
+       #009F   #8100
+../../../as/itoa.casl:90:      END
+1997
diff --git a/test/astest/add_p/Makefile b/test/astest/add_p/Makefile
new file mode 100644 (file)
index 0000000..38af5a4
--- /dev/null
@@ -0,0 +1,4 @@
+UNITNAME = add_p
+CASL2FLAG = -als
+ASFILE = ../../../as/add_p.casl ../../../as/itoa.casl
+include ../Test.mk
diff --git a/test/astest/adda_overflow/0.txt b/test/astest/adda_overflow/0.txt
new file mode 100644 (file)
index 0000000..640f0cd
--- /dev/null
@@ -0,0 +1,93 @@
+
+Assemble ../../../as/adda_overflow.casl (0)
+../../../as/adda_overflow.casl:1:MAIN  START   BEGIN
+../../../as/adda_overflow.casl:2:BEGIN LD      GR0,A
+../../../as/adda_overflow.casl:3:      ADDA    GR0,B
+../../../as/adda_overflow.casl:4:      ST      GR0,C
+../../../as/adda_overflow.casl:5:      RET
+../../../as/adda_overflow.casl:6:A     DC      32766
+../../../as/adda_overflow.casl:7:B     DC      29
+../../../as/adda_overflow.casl:8:C     DS      1
+../../../as/adda_overflow.casl:9:      END
+
+Label::::
+A ---> #0007
+B ---> #0008
+C ---> #0009
+BEGIN ---> #0000
+MAIN ---> #0000
+
+Assemble ../../../as/adda_overflow.casl (1)
+../../../as/adda_overflow.casl:1:MAIN  START   BEGIN
+../../../as/adda_overflow.casl:2:BEGIN LD      GR0,A
+       #0000   #1000
+       #0001   #0007
+../../../as/adda_overflow.casl:3:      ADDA    GR0,B
+       #0002   #2000
+       #0003   #0008
+../../../as/adda_overflow.casl:4:      ST      GR0,C
+       #0004   #1100
+       #0005   #0009
+../../../as/adda_overflow.casl:5:      RET
+       #0006   #8100
+../../../as/adda_overflow.casl:6:A     DC      32766
+       #0007   #7FFE
+../../../as/adda_overflow.casl:7:B     DC      29
+       #0008   #001D
+../../../as/adda_overflow.casl:8:C     DS      1
+       #0009   #0000
+../../../as/adda_overflow.casl:9:      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:     512 = #0200 = 0000001000000000
+#0000: PR:       0 = #0000 = 0000000000000000
+#0000: FR (OF SF ZF): 000
+
+#0002: Register::::
+#0002: GR0:  32766 = #7FFE = 0111111111111110
+#0002: GR1:      0 = #0000 = 0000000000000000
+#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:     512 = #0200 = 0000001000000000
+#0002: PR:       2 = #0002 = 0000000000000010
+#0002: FR (OF SF ZF): 000
+
+#0004: Register::::
+#0004: GR0:  32795 = #801B = 1000000000011011
+#0004: GR1:      0 = #0000 = 0000000000000000
+#0004: GR2:      0 = #0000 = 0000000000000000
+#0004: GR3:      0 = #0000 = 0000000000000000
+#0004: GR4:      0 = #0000 = 0000000000000000
+#0004: GR5:      0 = #0000 = 0000000000000000
+#0004: GR6:      0 = #0000 = 0000000000000000
+#0004: GR7:      0 = #0000 = 0000000000000000
+#0004: SP:     512 = #0200 = 0000001000000000
+#0004: PR:       4 = #0004 = 0000000000000100
+#0004: FR (OF SF ZF): 110
+
+#0006: Register::::
+#0006: GR0:  32795 = #801B = 1000000000011011
+#0006: GR1:      0 = #0000 = 0000000000000000
+#0006: GR2:      0 = #0000 = 0000000000000000
+#0006: GR3:      0 = #0000 = 0000000000000000
+#0006: GR4:      0 = #0000 = 0000000000000000
+#0006: GR5:      0 = #0000 = 0000000000000000
+#0006: GR6:      0 = #0000 = 0000000000000000
+#0006: GR7:      0 = #0000 = 0000000000000000
+#0006: SP:     512 = #0200 = 0000001000000000
+#0006: PR:       6 = #0006 = 0000000000000110
+#0006: FR (OF SF ZF): 110
+
diff --git a/test/astest/adda_overflow/Makefile b/test/astest/adda_overflow/Makefile
new file mode 100644 (file)
index 0000000..d57a278
--- /dev/null
@@ -0,0 +1,3 @@
+UNITNAME = adda_overflow
+CASL2FLAG = -alsT
+include ../Test.mk
diff --git a/test/astest/addl/0.txt b/test/astest/addl/0.txt
new file mode 100644 (file)
index 0000000..303fc20
--- /dev/null
@@ -0,0 +1,93 @@
+
+Assemble ../../../as/addl.casl (0)
+../../../as/addl.casl:1:MAIN    START   BEGIN
+../../../as/addl.casl:2:BEGIN   LD  GR0,A
+../../../as/addl.casl:3:        ADDL    GR0,B
+../../../as/addl.casl:4:        ST  GR0,C
+../../../as/addl.casl:5:        RET
+../../../as/addl.casl:6:A   DC  32766
+../../../as/addl.casl:7:B   DC  29
+../../../as/addl.casl:8:C   DS  1
+../../../as/addl.casl:9:        END
+
+Label::::
+A ---> #0007
+B ---> #0008
+C ---> #0009
+BEGIN ---> #0000
+MAIN ---> #0000
+
+Assemble ../../../as/addl.casl (1)
+../../../as/addl.casl:1:MAIN    START   BEGIN
+../../../as/addl.casl:2:BEGIN   LD  GR0,A
+       #0000   #1000
+       #0001   #0007
+../../../as/addl.casl:3:        ADDL    GR0,B
+       #0002   #2200
+       #0003   #0008
+../../../as/addl.casl:4:        ST  GR0,C
+       #0004   #1100
+       #0005   #0009
+../../../as/addl.casl:5:        RET
+       #0006   #8100
+../../../as/addl.casl:6:A   DC  32766
+       #0007   #7FFE
+../../../as/addl.casl:7:B   DC  29
+       #0008   #001D
+../../../as/addl.casl:8:C   DS  1
+       #0009   #0000
+../../../as/addl.casl:9:        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:     512 = #0200 = 0000001000000000
+#0000: PR:       0 = #0000 = 0000000000000000
+#0000: FR (OF SF ZF): 000
+
+#0002: Register::::
+#0002: GR0:  32766 = #7FFE = 0111111111111110
+#0002: GR1:      0 = #0000 = 0000000000000000
+#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:     512 = #0200 = 0000001000000000
+#0002: PR:       2 = #0002 = 0000000000000010
+#0002: FR (OF SF ZF): 000
+
+#0004: Register::::
+#0004: GR0: -32741 = #801B = 1000000000011011
+#0004: GR1:      0 = #0000 = 0000000000000000
+#0004: GR2:      0 = #0000 = 0000000000000000
+#0004: GR3:      0 = #0000 = 0000000000000000
+#0004: GR4:      0 = #0000 = 0000000000000000
+#0004: GR5:      0 = #0000 = 0000000000000000
+#0004: GR6:      0 = #0000 = 0000000000000000
+#0004: GR7:      0 = #0000 = 0000000000000000
+#0004: SP:     512 = #0200 = 0000001000000000
+#0004: PR:       4 = #0004 = 0000000000000100
+#0004: FR (OF SF ZF): 010
+
+#0006: Register::::
+#0006: GR0: -32741 = #801B = 1000000000011011
+#0006: GR1:      0 = #0000 = 0000000000000000
+#0006: GR2:      0 = #0000 = 0000000000000000
+#0006: GR3:      0 = #0000 = 0000000000000000
+#0006: GR4:      0 = #0000 = 0000000000000000
+#0006: GR5:      0 = #0000 = 0000000000000000
+#0006: GR6:      0 = #0000 = 0000000000000000
+#0006: GR7:      0 = #0000 = 0000000000000000
+#0006: SP:     512 = #0200 = 0000001000000000
+#0006: PR:       6 = #0006 = 0000000000000110
+#0006: FR (OF SF ZF): 010
+
diff --git a/test/astest/addl/Makefile b/test/astest/addl/Makefile
new file mode 100644 (file)
index 0000000..0731dd0
--- /dev/null
@@ -0,0 +1,2 @@
+UNITNAME = addl
+include ../Test.mk
diff --git a/test/astest/addl_overflow/0.txt b/test/astest/addl_overflow/0.txt
new file mode 100644 (file)
index 0000000..8828022
--- /dev/null
@@ -0,0 +1,114 @@
+
+Assemble ../../../as/addl_overflow.casl (0)
+../../../as/addl_overflow.casl:1:MAIN  START   BEGIN
+../../../as/addl_overflow.casl:2:BEGIN LD      GR1,A
+../../../as/addl_overflow.casl:3:      ADDL    GR1,B
+../../../as/addl_overflow.casl:4:      ADDL    GR1,C
+../../../as/addl_overflow.casl:5:    ADDL      GR1,D
+../../../as/addl_overflow.casl:6:      RET
+../../../as/addl_overflow.casl:7:A     DC      32765
+../../../as/addl_overflow.casl:8:B     DC      4
+../../../as/addl_overflow.casl:9:C     DC      32764
+../../../as/addl_overflow.casl:10:D    DC      7
+../../../as/addl_overflow.casl:11:     END
+
+Label::::
+A ---> #0009
+B ---> #000A
+C ---> #000B
+D ---> #000C
+BEGIN ---> #0000
+MAIN ---> #0000
+
+Assemble ../../../as/addl_overflow.casl (1)
+../../../as/addl_overflow.casl:1:MAIN  START   BEGIN
+../../../as/addl_overflow.casl:2:BEGIN LD      GR1,A
+       #0000   #1010
+       #0001   #0009
+../../../as/addl_overflow.casl:3:      ADDL    GR1,B
+       #0002   #2210
+       #0003   #000A
+../../../as/addl_overflow.casl:4:      ADDL    GR1,C
+       #0004   #2210
+       #0005   #000B
+../../../as/addl_overflow.casl:5:    ADDL      GR1,D
+       #0006   #2210
+       #0007   #000C
+../../../as/addl_overflow.casl:6:      RET
+       #0008   #8100
+../../../as/addl_overflow.casl:7:A     DC      32765
+       #0009   #7FFD
+../../../as/addl_overflow.casl:8:B     DC      4
+       #000A   #0004
+../../../as/addl_overflow.casl:9:C     DC      32764
+       #000B   #7FFC
+../../../as/addl_overflow.casl:10:D    DC      7
+       #000C   #0007
+../../../as/addl_overflow.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:     512 = #0200 = 0000001000000000
+#0000: PR:       0 = #0000 = 0000000000000000
+#0000: FR (OF SF ZF): 000
+
+#0002: Register::::
+#0002: GR0:      0 = #0000 = 0000000000000000
+#0002: GR1:  32765 = #7FFD = 0111111111111101
+#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:     512 = #0200 = 0000001000000000
+#0002: PR:       2 = #0002 = 0000000000000010
+#0002: FR (OF SF ZF): 000
+
+#0004: Register::::
+#0004: GR0:      0 = #0000 = 0000000000000000
+#0004: GR1:  32769 = #8001 = 1000000000000001
+#0004: GR2:      0 = #0000 = 0000000000000000
+#0004: GR3:      0 = #0000 = 0000000000000000
+#0004: GR4:      0 = #0000 = 0000000000000000
+#0004: GR5:      0 = #0000 = 0000000000000000
+#0004: GR6:      0 = #0000 = 0000000000000000
+#0004: GR7:      0 = #0000 = 0000000000000000
+#0004: SP:     512 = #0200 = 0000001000000000
+#0004: PR:       4 = #0004 = 0000000000000100
+#0004: FR (OF SF ZF): 010
+
+#0006: Register::::
+#0006: GR0:      0 = #0000 = 0000000000000000
+#0006: GR1:  65533 = #FFFD = 1111111111111101
+#0006: GR2:      0 = #0000 = 0000000000000000
+#0006: GR3:      0 = #0000 = 0000000000000000
+#0006: GR4:      0 = #0000 = 0000000000000000
+#0006: GR5:      0 = #0000 = 0000000000000000
+#0006: GR6:      0 = #0000 = 0000000000000000
+#0006: GR7:      0 = #0000 = 0000000000000000
+#0006: SP:     512 = #0200 = 0000001000000000
+#0006: PR:       6 = #0006 = 0000000000000110
+#0006: FR (OF SF ZF): 010
+
+#0008: Register::::
+#0008: GR0:      0 = #0000 = 0000000000000000
+#0008: GR1:      4 = #0004 = 0000000000000100
+#0008: GR2:      0 = #0000 = 0000000000000000
+#0008: GR3:      0 = #0000 = 0000000000000000
+#0008: GR4:      0 = #0000 = 0000000000000000
+#0008: GR5:      0 = #0000 = 0000000000000000
+#0008: GR6:      0 = #0000 = 0000000000000000
+#0008: GR7:      0 = #0000 = 0000000000000000
+#0008: SP:     512 = #0200 = 0000001000000000
+#0008: PR:       8 = #0008 = 0000000000001000
+#0008: FR (OF SF ZF): 100
+
diff --git a/test/astest/addl_overflow/Makefile b/test/astest/addl_overflow/Makefile
new file mode 100644 (file)
index 0000000..032261a
--- /dev/null
@@ -0,0 +1,3 @@
+UNITNAME = addl_overflow
+CASL2FLAG = -alsT
+include ../Test.mk
diff --git a/test/astest/binout/0.txt b/test/astest/binout/0.txt
new file mode 100644 (file)
index 0000000..6b55278
--- /dev/null
@@ -0,0 +1,7390 @@
+
+Assemble ../../../as/binout.casl (0)
+../../../as/binout.casl:1:BINOUT       START
+../../../as/binout.casl:2:     LAD     GR1,#09CD
+../../../as/binout.casl:3:     LAD     GR2,1
+../../../as/binout.casl:4:     PUSH    0,GR1
+../../../as/binout.casl:5:     PUSH    0,GR2
+../../../as/binout.casl:6:     PUSH    0,GR3
+../../../as/binout.casl:7:     PUSH    0,GR4
+../../../as/binout.casl:8:     LAD     GR2,0
+../../../as/binout.casl:9:     LAD     GR3,15
+../../../as/binout.casl:10:    LD      GR4,GR1
+../../../as/binout.casl:11:    JZE     OUT1
+../../../as/binout.casl:12:LOOP1       JMI     ONE
+../../../as/binout.casl:13:    LAD     GR3,-1,GR3
+../../../as/binout.casl:14:    SLL     GR1,1
+../../../as/binout.casl:15:    JUMP    LOOP1
+../../../as/binout.casl:16:LOOP2       JMI     ONE
+../../../as/binout.casl:17:ZERO        LAD     GR0,48
+../../../as/binout.casl:18:    JUMP    STORE
+../../../as/binout.casl:19:ONE LAD     GR0,49
+../../../as/binout.casl:20:STORE       ST      GR0,OBUF,GR2
+../../../as/binout.casl:21:    LAD     GR2,1,GR2
+../../../as/binout.casl:22:    LAD     GR3,-1,GR3
+../../../as/binout.casl:23:    CPA     GR3,NZERO
+../../../as/binout.casl:24:    JMI     OUT2
+../../../as/binout.casl:25:    SLL     GR1,1
+../../../as/binout.casl:26:    JUMP    LOOP2
+../../../as/binout.casl:27:OUT1        LAD     GR0,48
+../../../as/binout.casl:28:    ST      GR0,OBUF,GR2
+../../../as/binout.casl:29:    LAD     GR2,1,GR2
+../../../as/binout.casl:30:OUT2        ST      GR2,OLNG
+../../../as/binout.casl:31:    OUT     OBUF,OLNG
+../../../as/binout.casl:32:    POP     GR4
+../../../as/binout.casl:33:    POP     GR3
+../../../as/binout.casl:34:    POP     GR2
+../../../as/binout.casl:35:    POP     GR1
+../../../as/binout.casl:36:    RET
+../../../as/binout.casl:37:OBUF        DS      16
+../../../as/binout.casl:38:OLNG        DS      1
+../../../as/binout.casl:39:NZERO       DC      0
+../../../as/binout.casl:40:    END
+
+Label::::
+LOOP1 ---> #0013
+LOOP2 ---> #001B
+ONE ---> #0021
+OLNG ---> #0060
+OBUF ---> #0050
+ZERO ---> #001D
+STORE ---> #0023
+OUT1 ---> #0031
+OUT2 ---> #0037
+BINOUT ---> #0000
+NZERO ---> #0061
+
+Assemble ../../../as/binout.casl (1)
+../../../as/binout.casl:1:BINOUT       START
+../../../as/binout.casl:2:     LAD     GR1,#09CD
+       #0000   #1210
+       #0001   #09CD
+../../../as/binout.casl:3:     LAD     GR2,1
+       #0002   #1220
+       #0003   #0001
+../../../as/binout.casl:4:     PUSH    0,GR1
+       #0004   #7001
+       #0005   #0000
+../../../as/binout.casl:5:     PUSH    0,GR2
+       #0006   #7002
+       #0007   #0000
+../../../as/binout.casl:6:     PUSH    0,GR3
+       #0008   #7003
+       #0009   #0000
+../../../as/binout.casl:7:     PUSH    0,GR4
+       #000A   #7004
+       #000B   #0000
+../../../as/binout.casl:8:     LAD     GR2,0
+       #000C   #1220
+       #000D   #0000
+../../../as/binout.casl:9:     LAD     GR3,15
+       #000E   #1230
+       #000F   #000F
+../../../as/binout.casl:10:    LD      GR4,GR1
+       #0010   #1441
+../../../as/binout.casl:11:    JZE     OUT1
+       #0011   #6300
+       #0012   #0031
+../../../as/binout.casl:12:LOOP1       JMI     ONE
+       #0013   #6100
+       #0014   #0021
+../../../as/binout.casl:13:    LAD     GR3,-1,GR3
+       #0015   #1233
+       #0016   #FFFF
+../../../as/binout.casl:14:    SLL     GR1,1
+       #0017   #5210
+       #0018   #0001
+../../../as/binout.casl:15:    JUMP    LOOP1
+       #0019   #6400
+       #001A   #0013
+../../../as/binout.casl:16:LOOP2       JMI     ONE
+       #001B   #6100
+       #001C   #0021
+../../../as/binout.casl:17:ZERO        LAD     GR0,48
+       #001D   #1200
+       #001E   #0030
+../../../as/binout.casl:18:    JUMP    STORE
+       #001F   #6400
+       #0020   #0023
+../../../as/binout.casl:19:ONE LAD     GR0,49
+       #0021   #1200
+       #0022   #0031
+../../../as/binout.casl:20:STORE       ST      GR0,OBUF,GR2
+       #0023   #1102
+       #0024   #0050
+../../../as/binout.casl:21:    LAD     GR2,1,GR2
+       #0025   #1222
+       #0026   #0001
+../../../as/binout.casl:22:    LAD     GR3,-1,GR3
+       #0027   #1233
+       #0028   #FFFF
+../../../as/binout.casl:23:    CPA     GR3,NZERO
+       #0029   #4030
+       #002A   #0061
+../../../as/binout.casl:24:    JMI     OUT2
+       #002B   #6100
+       #002C   #0037
+../../../as/binout.casl:25:    SLL     GR1,1
+       #002D   #5210
+       #002E   #0001
+../../../as/binout.casl:26:    JUMP    LOOP2
+       #002F   #6400
+       #0030   #001B
+../../../as/binout.casl:27:OUT1        LAD     GR0,48
+       #0031   #1200
+       #0032   #0030
+../../../as/binout.casl:28:    ST      GR0,OBUF,GR2
+       #0033   #1102
+       #0034   #0050
+../../../as/binout.casl:29:    LAD     GR2,1,GR2
+       #0035   #1222
+       #0036   #0001
+../../../as/binout.casl:30:OUT2        ST      GR2,OLNG
+       #0037   #1120
+       #0038   #0060
+../../../as/binout.casl:31:    OUT     OBUF,OLNG
+       #0039   #7001
+       #003A   #0000
+       #003B   #7002
+       #003C   #0000
+       #003D   #1210
+       #003E   #0050
+       #003F   #1020
+       #0040   #0060
+       #0041   #F000
+       #0042   #0002
+       #0043   #1210
+       #0044   #0062
+       #0062   #000A
+       #0045   #1220
+       #0046   #0001
+       #0047   #F000
+       #0048   #0002
+       #0049   #7120
+       #004A   #7110
+../../../as/binout.casl:32:    POP     GR4
+       #004B   #7140
+../../../as/binout.casl:33:    POP     GR3
+       #004C   #7130
+../../../as/binout.casl:34:    POP     GR2
+       #004D   #7120
+../../../as/binout.casl:35:    POP     GR1
+       #004E   #7110
+../../../as/binout.casl:36:    RET
+       #004F   #8100
+../../../as/binout.casl:37:OBUF        DS      16
+       #0050   #0000
+       #0051   #0000
+       #0052   #0000
+       #0053   #0000
+       #0054   #0000
+       #0055   #0000
+       #0056   #0000
+       #0057   #0000
+       #0058   #0000
+       #0059   #0000
+       #005A   #0000
+       #005B   #0000
+       #005C   #0000
+       #005D   #0000
+       #005E   #0000
+       #005F   #0000
+../../../as/binout.casl:38:OLNG        DS      1
+       #0060   #0000
+../../../as/binout.casl:39:NZERO       DC      0
+       #0061   #0000
+../../../as/binout.casl:40:    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:     512 = #0200 = 0000001000000000
+#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: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0000: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0000: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0000: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0000: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0000: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0000: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+
+#0002: Register::::
+#0002: GR0:      0 = #0000 = 0000000000000000
+#0002: GR1:   2509 = #09CD = 0000100111001101
+#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:     512 = #0200 = 0000001000000000
+#0002: PR:       2 = #0002 = 0000000000000010
+#0002: FR (OF SF ZF): 000
+#0002: Memory::::
+#0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0002: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0002: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0002: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0002: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0002: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0002: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0002: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+
+#0004: Register::::
+#0004: GR0:      0 = #0000 = 0000000000000000
+#0004: GR1:   2509 = #09CD = 0000100111001101
+#0004: GR2:      1 = #0001 = 0000000000000001
+#0004: GR3:      0 = #0000 = 0000000000000000
+#0004: GR4:      0 = #0000 = 0000000000000000
+#0004: GR5:      0 = #0000 = 0000000000000000
+#0004: GR6:      0 = #0000 = 0000000000000000
+#0004: GR7:      0 = #0000 = 0000000000000000
+#0004: SP:     512 = #0200 = 0000001000000000
+#0004: PR:       4 = #0004 = 0000000000000100
+#0004: FR (OF SF ZF): 000
+#0004: Memory::::
+#0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0004: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0004: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0004: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0004: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0004: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0004: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0004: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+
+#0006: Register::::
+#0006: GR0:      0 = #0000 = 0000000000000000
+#0006: GR1:   2509 = #09CD = 0000100111001101
+#0006: GR2:      1 = #0001 = 0000000000000001
+#0006: GR3:      0 = #0000 = 0000000000000000
+#0006: GR4:      0 = #0000 = 0000000000000000
+#0006: GR5:      0 = #0000 = 0000000000000000
+#0006: GR6:      0 = #0000 = 0000000000000000
+#0006: GR7:      0 = #0000 = 0000000000000000
+#0006: SP:     511 = #01FF = 0000000111111111
+#0006: PR:       6 = #0006 = 0000000000000110
+#0006: FR (OF SF ZF): 000
+#0006: Memory::::
+#0006: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0006: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0006: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0006: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0006: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0006: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0006: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0006: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 09CD
+
+#0008: Register::::
+#0008: GR0:      0 = #0000 = 0000000000000000
+#0008: GR1:   2509 = #09CD = 0000100111001101
+#0008: GR2:      1 = #0001 = 0000000000000001
+#0008: GR3:      0 = #0000 = 0000000000000000
+#0008: GR4:      0 = #0000 = 0000000000000000
+#0008: GR5:      0 = #0000 = 0000000000000000
+#0008: GR6:      0 = #0000 = 0000000000000000
+#0008: GR7:      0 = #0000 = 0000000000000000
+#0008: SP:     510 = #01FE = 0000000111111110
+#0008: PR:       8 = #0008 = 0000000000001000
+#0008: FR (OF SF ZF): 000
+#0008: Memory::::
+#0008: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0008: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0008: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0008: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0008: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0008: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0008: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0008: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#000A: Register::::
+#000A: GR0:      0 = #0000 = 0000000000000000
+#000A: GR1:   2509 = #09CD = 0000100111001101
+#000A: GR2:      1 = #0001 = 0000000000000001
+#000A: GR3:      0 = #0000 = 0000000000000000
+#000A: GR4:      0 = #0000 = 0000000000000000
+#000A: GR5:      0 = #0000 = 0000000000000000
+#000A: GR6:      0 = #0000 = 0000000000000000
+#000A: GR7:      0 = #0000 = 0000000000000000
+#000A: SP:     509 = #01FD = 0000000111111101
+#000A: PR:      10 = #000A = 0000000000001010
+#000A: FR (OF SF ZF): 000
+#000A: Memory::::
+#000A: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#000A: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#000A: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#000A: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#000A: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#000A: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#000A: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000A: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#000C: Register::::
+#000C: GR0:      0 = #0000 = 0000000000000000
+#000C: GR1:   2509 = #09CD = 0000100111001101
+#000C: GR2:      1 = #0001 = 0000000000000001
+#000C: GR3:      0 = #0000 = 0000000000000000
+#000C: GR4:      0 = #0000 = 0000000000000000
+#000C: GR5:      0 = #0000 = 0000000000000000
+#000C: GR6:      0 = #0000 = 0000000000000000
+#000C: GR7:      0 = #0000 = 0000000000000000
+#000C: SP:     508 = #01FC = 0000000111111100
+#000C: PR:      12 = #000C = 0000000000001100
+#000C: FR (OF SF ZF): 000
+#000C: Memory::::
+#000C: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#000C: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#000C: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#000C: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#000C: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#000C: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#000C: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000C: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#000E: Register::::
+#000E: GR0:      0 = #0000 = 0000000000000000
+#000E: GR1:   2509 = #09CD = 0000100111001101
+#000E: GR2:      0 = #0000 = 0000000000000000
+#000E: GR3:      0 = #0000 = 0000000000000000
+#000E: GR4:      0 = #0000 = 0000000000000000
+#000E: GR5:      0 = #0000 = 0000000000000000
+#000E: GR6:      0 = #0000 = 0000000000000000
+#000E: GR7:      0 = #0000 = 0000000000000000
+#000E: SP:     508 = #01FC = 0000000111111100
+#000E: PR:      14 = #000E = 0000000000001110
+#000E: FR (OF SF ZF): 000
+#000E: Memory::::
+#000E: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#000E: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#000E: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#000E: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#000E: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#000E: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#000E: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#000E: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0010: Register::::
+#0010: GR0:      0 = #0000 = 0000000000000000
+#0010: GR1:   2509 = #09CD = 0000100111001101
+#0010: GR2:      0 = #0000 = 0000000000000000
+#0010: GR3:     15 = #000F = 0000000000001111
+#0010: GR4:      0 = #0000 = 0000000000000000
+#0010: GR5:      0 = #0000 = 0000000000000000
+#0010: GR6:      0 = #0000 = 0000000000000000
+#0010: GR7:      0 = #0000 = 0000000000000000
+#0010: SP:     508 = #01FC = 0000000111111100
+#0010: PR:      16 = #0010 = 0000000000010000
+#0010: FR (OF SF ZF): 000
+#0010: Memory::::
+#0010: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0010: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0010: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0010: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0010: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0010: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0010: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0010: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0011: Register::::
+#0011: GR0:      0 = #0000 = 0000000000000000
+#0011: GR1:   2509 = #09CD = 0000100111001101
+#0011: GR2:      0 = #0000 = 0000000000000000
+#0011: GR3:     15 = #000F = 0000000000001111
+#0011: GR4:   2509 = #09CD = 0000100111001101
+#0011: GR5:      0 = #0000 = 0000000000000000
+#0011: GR6:      0 = #0000 = 0000000000000000
+#0011: GR7:      0 = #0000 = 0000000000000000
+#0011: SP:     508 = #01FC = 0000000111111100
+#0011: PR:      17 = #0011 = 0000000000010001
+#0011: FR (OF SF ZF): 000
+#0011: Memory::::
+#0011: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0011: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0011: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0011: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0011: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0011: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0011: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0011: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0013: Register::::
+#0013: GR0:      0 = #0000 = 0000000000000000
+#0013: GR1:   2509 = #09CD = 0000100111001101
+#0013: GR2:      0 = #0000 = 0000000000000000
+#0013: GR3:     15 = #000F = 0000000000001111
+#0013: GR4:   2509 = #09CD = 0000100111001101
+#0013: GR5:      0 = #0000 = 0000000000000000
+#0013: GR6:      0 = #0000 = 0000000000000000
+#0013: GR7:      0 = #0000 = 0000000000000000
+#0013: SP:     508 = #01FC = 0000000111111100
+#0013: PR:      19 = #0013 = 0000000000010011
+#0013: FR (OF SF ZF): 000
+#0013: Memory::::
+#0013: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0013: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0013: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0013: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0013: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0013: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0013: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0015: Register::::
+#0015: GR0:      0 = #0000 = 0000000000000000
+#0015: GR1:   2509 = #09CD = 0000100111001101
+#0015: GR2:      0 = #0000 = 0000000000000000
+#0015: GR3:     15 = #000F = 0000000000001111
+#0015: GR4:   2509 = #09CD = 0000100111001101
+#0015: GR5:      0 = #0000 = 0000000000000000
+#0015: GR6:      0 = #0000 = 0000000000000000
+#0015: GR7:      0 = #0000 = 0000000000000000
+#0015: SP:     508 = #01FC = 0000000111111100
+#0015: PR:      21 = #0015 = 0000000000010101
+#0015: FR (OF SF ZF): 000
+#0015: Memory::::
+#0015: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0015: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0015: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0015: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0015: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0015: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0015: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0017: Register::::
+#0017: GR0:      0 = #0000 = 0000000000000000
+#0017: GR1:   2509 = #09CD = 0000100111001101
+#0017: GR2:      0 = #0000 = 0000000000000000
+#0017: GR3:     14 = #000E = 0000000000001110
+#0017: GR4:   2509 = #09CD = 0000100111001101
+#0017: GR5:      0 = #0000 = 0000000000000000
+#0017: GR6:      0 = #0000 = 0000000000000000
+#0017: GR7:      0 = #0000 = 0000000000000000
+#0017: SP:     508 = #01FC = 0000000111111100
+#0017: PR:      23 = #0017 = 0000000000010111
+#0017: FR (OF SF ZF): 000
+#0017: Memory::::
+#0017: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0017: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0017: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0017: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0017: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0017: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0017: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0019: Register::::
+#0019: GR0:      0 = #0000 = 0000000000000000
+#0019: GR1:   5018 = #139A = 0001001110011010
+#0019: GR2:      0 = #0000 = 0000000000000000
+#0019: GR3:     14 = #000E = 0000000000001110
+#0019: GR4:   2509 = #09CD = 0000100111001101
+#0019: GR5:      0 = #0000 = 0000000000000000
+#0019: GR6:      0 = #0000 = 0000000000000000
+#0019: GR7:      0 = #0000 = 0000000000000000
+#0019: SP:     508 = #01FC = 0000000111111100
+#0019: PR:      25 = #0019 = 0000000000011001
+#0019: FR (OF SF ZF): 000
+#0019: Memory::::
+#0019: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0019: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0019: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0019: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0019: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0019: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0019: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0013: Register::::
+#0013: GR0:      0 = #0000 = 0000000000000000
+#0013: GR1:   5018 = #139A = 0001001110011010
+#0013: GR2:      0 = #0000 = 0000000000000000
+#0013: GR3:     14 = #000E = 0000000000001110
+#0013: GR4:   2509 = #09CD = 0000100111001101
+#0013: GR5:      0 = #0000 = 0000000000000000
+#0013: GR6:      0 = #0000 = 0000000000000000
+#0013: GR7:      0 = #0000 = 0000000000000000
+#0013: SP:     508 = #01FC = 0000000111111100
+#0013: PR:      19 = #0013 = 0000000000010011
+#0013: FR (OF SF ZF): 000
+#0013: Memory::::
+#0013: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0013: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0013: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0013: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0013: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0013: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0013: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0015: Register::::
+#0015: GR0:      0 = #0000 = 0000000000000000
+#0015: GR1:   5018 = #139A = 0001001110011010
+#0015: GR2:      0 = #0000 = 0000000000000000
+#0015: GR3:     14 = #000E = 0000000000001110
+#0015: GR4:   2509 = #09CD = 0000100111001101
+#0015: GR5:      0 = #0000 = 0000000000000000
+#0015: GR6:      0 = #0000 = 0000000000000000
+#0015: GR7:      0 = #0000 = 0000000000000000
+#0015: SP:     508 = #01FC = 0000000111111100
+#0015: PR:      21 = #0015 = 0000000000010101
+#0015: FR (OF SF ZF): 000
+#0015: Memory::::
+#0015: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0015: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0015: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0015: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0015: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0015: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0015: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0015: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0017: Register::::
+#0017: GR0:      0 = #0000 = 0000000000000000
+#0017: GR1:   5018 = #139A = 0001001110011010
+#0017: GR2:      0 = #0000 = 0000000000000000
+#0017: GR3:     13 = #000D = 0000000000001101
+#0017: GR4:   2509 = #09CD = 0000100111001101
+#0017: GR5:      0 = #0000 = 0000000000000000
+#0017: GR6:      0 = #0000 = 0000000000000000
+#0017: GR7:      0 = #0000 = 0000000000000000
+#0017: SP:     508 = #01FC = 0000000111111100
+#0017: PR:      23 = #0017 = 0000000000010111
+#0017: FR (OF SF ZF): 000
+#0017: Memory::::
+#0017: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0017: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0017: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0017: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0017: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0017: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0017: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0017: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0019: Register::::
+#0019: GR0:      0 = #0000 = 0000000000000000
+#0019: GR1:  10036 = #2734 = 0010011100110100
+#0019: GR2:      0 = #0000 = 0000000000000000
+#0019: GR3:     13 = #000D = 0000000000001101
+#0019: GR4:   2509 = #09CD = 0000100111001101
+#0019: GR5:      0 = #0000 = 0000000000000000
+#0019: GR6:      0 = #0000 = 0000000000000000
+#0019: GR7:      0 = #0000 = 0000000000000000
+#0019: SP:     508 = #01FC = 0000000111111100
+#0019: PR:      25 = #0019 = 0000000000011001
+#0019: FR (OF SF ZF): 000
+#0019: Memory::::
+#0019: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0019: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0019: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0019: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0019: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0019: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0019: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0019: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0013: Register::::
+#0013: GR0:      0 = #0000 = 0000000000000000
+#0013: GR1:  10036 = #2734 = 0010011100110100
+#0013: GR2:      0 = #0000 = 0000000000000000
+#0013: GR3:     13 = #000D = 0000000000001101
+#0013: GR4:   2509 = #09CD = 0000100111001101
+#0013: GR5:      0 = #0000 = 0000000000000000
+#0013: GR6:      0 = #0000 = 0000000000000000
+#0013: GR7:      0 = #0000 = 0000000000000000
+#0013: SP:     508 = #01FC = 0000000111111100
+#0013: PR:      19 = #0013 = 0000000000010011
+#0013: FR (OF SF ZF): 000
+#0013: Memory::::
+#0013: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+#0013: 0000: 1210 09CD 1220 0001 7001 0000 7002 0000 7003 0000 7004 0000 1220 0000 1230 000F
+#0013: 0010: 1441 6300 0031 6100 0021 1233 FFFF 5210 0001 6400 0013 6100 0021 1200 0030 6400
+#0013: 0020: 0023 1200 0031 1102 0050 1222 0001 1233 FFFF 4030 0061 6100 0037 5210 0001 6400
+#0013: 0030: 001B 1200 0030 1102 0050 1222 0001 1120 0060 7001 0000 7002 0000 1210 0050 1020
+#0013: 0040: 0060 F000 0002 1210 0062 1220 0001 F000 0002 7120 7110 7140 7130 7120 7110 8100
+#0013: 0050: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0060: 0000 0000 000A 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0070: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0080: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0090: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 00F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0100: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0110: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0120: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0130: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0140: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0150: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0160: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0170: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0180: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 0190: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01A0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01B0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01C0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01D0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01E0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
+#0013: 01F0: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 09CD
+
+#0015: Register::::
+#0015: GR0:      0 = #0000 = 0000000000000000
+#0015: GR1:  10036 = #2734 = 0010011100110100
+#0015: GR2:      0 = #0000 = 0000000000000000
+#0015: GR3:     13 = #000D = 0000000000001101
+#0015: GR4:   2509 = #09CD = 0000100111001101
+#0015: GR5:      0 = #0000 = 0000000000000000
+#0015: GR6:      0 = #0000 = 0000000000000000
+#0015: GR7:      0 = #0000 = 0000000000000000
+#0015: SP:     508 = #01FC = 0000000111111100
+#0015: PR:      21 = #0015 = 0000000000010101
+#0015: FR (OF SF ZF): 000
+#0015: Memory::::
+#0015: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F