From 123e1c84b369e6f1c7b28c72e6902e4742628be4 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Tue, 30 Oct 2012 01:01:55 +0900 Subject: [PATCH] =?utf8?q?make=20install=E6=A9=9F=E8=83=BD=E3=82=92?= =?utf8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Makefile | 62 +- as/casl2lib/Makefile | 17 + doc/Makefile | 62 +- doc/index.html | 1670 ------------------------------------------ 4 files changed, 102 insertions(+), 1709 deletions(-) create mode 100644 as/casl2lib/Makefile delete mode 100644 doc/index.html diff --git a/Makefile b/Makefile index 396aeb5..b2f9ba1 100644 --- a/Makefile +++ b/Makefile @@ -1,40 +1,70 @@ -.PHONY: all build gtags check doc doc_inner clean clean_src clean_gtags clean_test clean_doc clean_doc_inner +.PHONY: all build gtags check doc info html doc-inner install uninstall install-info uninstall-info install-casl2lib uninstall-casl2lib clean clean-src clean-gtags clean-test clean-doc clean-doc-inner GTAGS ?= gtags RMF ?= rm -f WHICH ?= which ECHO ?= echo +INSTALL ?= install -all: build doc doc_inner +prefix ?= ~ +bindir ?= $(prefix)/bin +casl2libdir ?= $(prefix)/yacasl2/casl2lib + +all: build info html gtags build: - $(MAKE) -C src + $(MAKE) -C src all gtags: - $(WHICH) $(GTAGS) && $(GTAGS) >/dev/null || $(ECHO) "$(GTAGS): not found" + @$(WHICH) $(GTAGS) >/dev/null && $(GTAGS) || $(ECHO) "$(GTAGS): not found" + +docall: doc + $(MAKE) -C doc all + +info: + $(MAKE) -C doc info + +html: + $(MAKE) -C doc html + +doc-inner: + $(MAKE) -C doc_inner all check: $(MAKE) -sC test/system -doc: - $(MAKE) -C $@ +install: casl2 comet2 dumpword install-info install-casl2lib + $(INSTALL) -d $(bindir) + $(INSTALL) casl2 comet2 dumpword $(bindir)/ + +uninstall: uninstall-info uninstall-casl2lib + $(RMF) $(bindir)/casl2 $(bindir)/comet2 $(bindir)/dumpword + +install-info: + $(MAKE) -C doc install-info -doc_inner: - $(MAKE) -C $@ +uninstall-info: + @$(MAKE) -C doc uninstall-info -clean: clean_src clean_gtags clean_test clean_doc clean_doc_inner +install-casl2lib: + $(MAKE) -C as/casl2lib install-casl2lib -clean_src: +uninstall-casl2lib: + @$(MAKE) -C as/casl2lib uninstall-casl2lib + +clean: clean-src clean-gtags clean-doc clean-doc-inner + +clean-src: @$(MAKE) -sC src clean -clean_gtags: +clean-gtags: @$(RMF) GPATH GRTAGS GSYMS GTAGS -clean_test: - @$(MAKE) -sC test clean - -clean_doc: +clean-doc: @$(MAKE) -sC doc clean -clean_doc_inner: +clean-doc-inner: @$(MAKE) -sC doc_inner clean + +clean-test: + @$(MAKE) -sC test clean diff --git a/as/casl2lib/Makefile b/as/casl2lib/Makefile new file mode 100644 index 0000000..4cd9cce --- /dev/null +++ b/as/casl2lib/Makefile @@ -0,0 +1,17 @@ +.PHONY: install-casl2lib uninstall-casl2lib + +RMF ?= rm -f +RMDIR ?= rmdir +ECHO ?= echo +INSTALL ?= install + +prefix ?= ~ +casl2libdir ?= $(prefix)/yacasl2/casl2lib + +install-casl2lib: *.casl + $(INSTALL) -d $(casl2libdir) + $(INSTALL) $^ $(casl2libdir)/ + +uninstall-casl2lib: + @$(RMF) $(casl2libdir)/*.casl + @$(RMDIR) $(casl2libdir) || if test -e $(casl2libdir); then $(ECHO) "$(casl2libdir): files may be added by others."; fi diff --git a/doc/Makefile b/doc/Makefile index c4dc520..9eb81c3 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,47 +1,63 @@ DOCNAME = yacasl2 SRC = $(DOCNAME).texi CSS = style.css +HTMLDIR = html -MV = mv -CP = cp -MKDIR = mkdir -RMRF = rm -rf -PTEX = ptex -TEXI2DVI = texi2dvi -DVI2PDF = dvipdfmx -MAKEINFO = makeinfo +MV ?= mv +CP ?= cp +MKDIR ?= mkdir +RMRF ?= rm -rf +PTEX ?= ptex +TEXI2DVI ?= texi2dvi +DVI2PDF ?= dvipdfmx +MAKEINFO ?= gmakeinfo +INSTALL ?= install +INSTALL-INFO ?= ginstall-info -.PHONY: doc info htmlnosplit html pdf clean clean_docs clean_tex_tmp +prefix ?= ~ +infodir ?= $(prefix)/share/info + +.PHONY: all info htmlnosplit html pdf install-info clean clean-docs clean-tex-tmp .INTERMEDIATE: $(DOCNAME).dvi -doc: info htmlnosplit html pdf +all: info html htmls pdf info: $(DOCNAME).info -htmlnosplit: index.html - -index.html: $(SRC) $(CSS) - $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $(SRC) +html: $(DOCNAME).html + $(MV) $< index.html -html: $(SRC) $(CSS) - if test ! -e $@; then $(MKDIR) $@; fi; - $(CP) $(CSS) $@/$(CSS) - $(MAKEINFO) -o $@ --html --css-ref=$(CSS) $(SRC) +htmls: $(SRC) $(CSS) + $(INSTALL) -d $(HTMLDIR) + $(INSTALL) $(CSS) $(HTMLDIR)/ + $(MAKEINFO) -o $(HTMLDIR) --html --css-ref=$(CSS) $(SRC) pdf: $(DOCNAME).pdf +$(DOCNAME).html: $(SRC) $(CSS) + $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $(SRC) + $(DOCNAME).pdf: $(DOCNAME).dvi $(DVI2PDF) $^ $(DOCNAME).dvi: $(SRC) TEX=$(PTEX) $(TEXI2DVI) -q --texinfo=@afourpaper -o $@ $< - @$(MAKE) clean_tex_tmp + @$(MAKE) clean-tex-tmp + +install-info: $(DOCNAME).info + $(INSTALL) -d $(infodir) + $(INSTALL) $(DOCNAME).info $(infodir)/$(DOCNAME) + $(INSTALL-INFO) $(infodir)/$(DOCNAME) $(infodir)/dir + +uninstall-info: $(DOCNAME).info + $(INSTALL-INFO) --delete $(infodir)/$(DOCNAME) $(infodir)/dir + $(RM) $(infodir)/$(DOCNAME) -clean: clean_docs clean_tex_tmp +clean: clean-docs clean-tex-tmp -clean_docs: - @$(RMRF) html $(DOCNAME).info $(DOCNAME).pdf $(DOCNAME).html +clean-docs: + @$(RMRF) html $(DOCNAME).info $(DOCNAME).pdf index.html -clean_tex_tmp: +clean-tex-tmp: @$(RMRF) $(DOCNAME).aux $(DOCNAME).cp $(DOCNAME).cps $(DOCNAME).fn $(DOCNAME).ky $(DOCNAME).log $(DOCNAME).pg $(DOCNAME).pgs $(DOCNAME).tmp $(DOCNAME).toc $(DOCNAME).tp $(DOCNAME).vr diff --git a/doc/index.html b/doc/index.html deleted file mode 100644 index fd9f048..0000000 --- a/doc/index.html +++ /dev/null @@ -1,1670 +0,0 @@ - - -YACASL2 - CASL II処理システム - - - - - - - - - - -

YACASL2 - CASL II処理システム

-
- -


-Next:  - -
- - - -
-

Table of Contents

- -
- -
- -


-Next: , -Previous: Top, -Up: Top - -
- -

1 YACASL2の概要

- -

YACASL2は、UNIX/Linuxのコマンドラインインターフェイスで動作するオープンソースのCASL II処理システムです。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。 - -

-「試験で使用する情報技術に関する用語・プログラム言語など」Ver2.2(2012年5月版)[PDFファイル] -別紙 1 アセンブラ言語の仕様 -
- -

YACASL2は、CASL IIアセンブラ言語で記述されたファイルをアセンブルし、仮想マシンCOMET II上で実行します。アセンブルと実行は、連続で行うことも別々に行うことも可能です。 -YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試験の問題をはじめ各種参考書やサイトに記載されたCASL IIのプログラムをそのままアセンブルして実行できます。また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。 - -

YACASL2は、「ふつうの処理系」として動作します。ほかの多くのCASL IIエミュレータと違い、デバッガとして動作したり、コンピュータ内部の模式図を直接表示したりすることはありません。そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。 - -

- -

出力された動作内容は、GNU/Linuxのさまざまなツール、たとえば、cat less grep wcなどを使って解析できます。 - -

YACASL2の操作は、端末を開いてコマンドを入力・実行することで行います。 - -

要件

- -

YACASL2は、LinuxやMac OS Xなど、UNIX系のOS上で動作します。 - -

インストール時に、tar gcc make(gmake)が必要です。Linuxでは多くの場合、標準でインストールされています。Mac OS Xの場合、Xcodeのcommand line toolsをインストールすれば使えるようになります。 - -

- -


-Next: , -Previous: About, -Up: Top - -
- -

2 YACASL2のインストール

- -

YACASL2をインストールするには、Linux上で次の作業をします。 - -

- -
- -


-Next: , -Previous: Install, -Up: Install - -
- -

2.1 YACASL2ファイルのダウンロード

- -

YACASL2のサイトから、tar.gzまたはtar.xzファイルと、対応する検証用ファイルをダウンロードします。githubのダウンロードページからtar.gzなどのファイルをダウンロードすることもできます。 - -

- -


-Next: , -Previous: Download, -Up: Install - -
- -

2.2 YACASL2ファイルの検証

- -

ダウンロードが完了したら、圧縮ファイルが改竄されていないか検証します。検証にはGnuPG分離署名か、MD5ハッシュ値を使います。 - -

2.2.1 GnuPG分離署名での検証

- -

GnuPGのgpgで圧縮ファイルを検証します。この検証を行うには、GnuPGがインストールされ、自分の秘密鍵と公開鍵のペアが作成されている必要があります。 - -

$ gpg --verify yacasl2.tar.xz.asc
-gpg: Signature made Sat Oct 27 02:17:16 2012 JST using RSA key ID 25B62DD1
-gpg: Can't check signature: public key not found
-$ gpg --recv-keys 25B62DD1
-gpg: requesting key 25B62DD1 from hkp server keys.gnupg.net
-gpg: key 25B62DD1: public key "j8takagi <j8takagi@nifty.com>" imported
-gpg: Total number processed: 1
-gpg:               imported: 1  (RSA: 1)
-
-$ gpg --lsign-key 25B62DD1
-
-pub  2048R/25B62DD1  created: 2012-09-29  expires: never       usage: SC
-                     trust: unknown       validity: full
-sub  2048R/92E25C29  created: 2012-09-29  expires: never       usage: E
-[  full  ] (1). j8takagi <j8takagi@nifty.com>
-
-
-pub  2048R/25B62DD1  created: 2012-09-29  expires: never       usage: SC
-                     trust: unknown       validity: full
- Primary key fingerprint: 653A 5D2E 49C3 2ADE 2FE3  87BB AB68 4DDB 25B6 2DD1
-
-     j8takagi <j8takagi@nifty.com>
-
-Are you sure that you want to sign this key with your
-key ".* <.*@.*>"
-
-The signature will be marked as non-exportable.
-
-Really sign? (y/N) y
-
-You need a passphrase to unlock the secret key for
-user: ".* <.*@.*>"
-2048-bit RSA key, ID ........, created 20..-..-..
-
-<input password>
-
-$ gpg --verify yacasl2.tar.xz.asc
-gpg: Signature made Sat Oct 27 02:17:16 2012 JST using RSA key ID 25B62DD1
-gpg: checking the trustdb
-gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
-gpg: depth: 0  valid:   1  signed:   4  trust: 0-, 0q, 0n, 0m, 0f, 1u
-gpg: depth: 1  valid:   4  signed:   0  trust: 4-, 0q, 0n, 0m, 0f, 0u
-gpg: Good signature from "j8takagi <j8takagi@nifty.com>"
-
-

2.2.2 MD5ハッシュ値での検証

- -

md5sumとdiffで圧縮ファイルを検証します。 - -

$ openssl md5sum yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -
-Files yacasl2.tar.gz.md5sum and - are identical
-
-
- -


-Next: , -Previous: Verify, -Up: Install - -
- -

2.3 YACASL2ファイルの展開

- -

YACASL2ファイルをダウンロードしたら、次のコマンドで展開します。 - -

$ tar xvzf yacasl2.tar.gz
-
-
- -


-Next: , -Previous: Expand, -Up: Install - -
- -

2.4 casl2 comet2 dumpwordのビルド

- -

展開したら、次のコマンドでcasl2 comet2 dumpwordをビルドします。 - -

$ cd yacasl2
-$ make
-make -C src
-make[1]: Entering directory ‘/home/kazubito/yacasl2/src’
-gcc -c -g -Wall -I ../include casl2.c
-gcc -c -g -Wall -I ../include word.c
-gcc -c -g -Wall -I ../include hash.c
-gcc -c -g -Wall -I ../include cerr.c
-gcc -c -g -Wall -I ../include struct.c
-gcc -c -g -Wall -I ../include cmd.c
-gcc -c -g -Wall -I ../include assemble.c
-gcc -c -g -Wall -I ../include token.c
-gcc -c -g -Wall -I ../include label.c
-gcc -c -g -Wall -I ../include macro.c
-gcc -c -g -Wall -I ../include exec.c
-gcc -c -g -Wall -I ../include dump.c
-gcc -g -Wall -I ../include -o ../casl2 casl2.o word.o hash.o cerr.o st
-ruct.o cmd.o assemble.o token.o label.o macro.o exec.o dump.o
-gcc -c -g -Wall -I ../include comet2.c
-gcc -g -Wall -I ../include -o ../comet2 comet2.o word.o hash.o cerr.o
-struct.o cmd.o exec.o dump.o
-gcc -c -g -Wall -I ../include dumpword.c
-gcc -g -Wall -I ../include -o ../dumpword dumpword.o word.o cerr.o
-make[1]: Leaving directory ‘/home/kazubito/yacasl2/src’
-
-
- -


-Next: , -Previous: Build, -Up: Install - -
- -

2.5 casl2の実行テスト

- -

ビルドしたら、次のコマンドが正常に実行できるかを確認します。 -正常に実行された場合は、「Hello, World!」と表示されます。 - -

$ ./casl2 as/hello.casl
-Hello, World!
-
-
- -


-Next: , -Previous: Simple Test, -Up: Install - -
- -

2.6 詳細なテスト

- -

次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。 - -

$ make check
-195 / 195 tests passed. Details in /home/username/yacasl2/test/integra
-tion/casl2/Test.log
-All tests are succeded.
-149 / 149 tests passed. Details in /home/username/yacasl2/test/integra
-tion/comet2/Test.log
-All tests are succeded.
-4 / 4 tests passed. Details in /home/username/yacasl2/test/integration
-/dumpword/Test.log
-All tests are succeded.
-
-
- -


-Previous: Detail Test, -Up: Install - -
- -

2.7 環境変数の設定

- -

環境変数PATHやCASL2LIBを設定することで、YACASL2が使いやすくなります。環境変数は、使っているシェルを確認してから設定します。 - -

シェルの確認

- -

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

$ echo $SHELL
-/bin/bash
-
-

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

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

- -

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

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

環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されるようになります。BASHではホームディレクトリにある.bashrcが初期設定ファイルです。次のコマンドで追加できます。 - -

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

CASL2LIBの設定

- -

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

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

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

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


-Next: , -Previous: Install, -Up: Top - -
- -

3 YACASL2の使い方

- -

YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリの中にあるasディレクトリからコピーして作成することもできます。 - -

- -
- -


-Next: , -Previous: Usage, -Up: Usage - -
- -

3.1 実行結果の出力だけを表示

- -

インストール時にコマンド実行の確認に使ったhello.caslは、次のような内容です。CASL IIのマクロ命令OUTは、文字列を出力します。 - -

$ cat hello.casl
-MAIN     START
-         OUT     OBUF,LEN
-         RET
-OBUF     DC      'Hello, World!'
-LEN      DC      13
-         END
-
-

次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。 - -

$ casl2 hello.casl
-Hello, World!
-
-

addl.caslは、3と1の和を求めます。 - -

$ cat addl.casl
-;;; ADDL r,adr
-MAIN     START
-         LD      GR1,A
-         ADDL    GR1,B
-         RET
-A        DC      3
-B        DC      1
-         END
-
-

このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。 - -

$ casl2 addl.casl
-$
-
-

実行内容を確認するには、後述のようにCPU 内にあるレジスタやメモリの内容を表示するか、結果を出力するための処理を追加する必要があります。 - -

- -


-Next: , -Previous: Simple Output, -Up: Usage - -
- -

3.2 アセンブル結果の確認

- -

casl2の処理途中で行われるアセンブルの結果を表示するには、オプション-aを指定します。また、ラベルとアドレスの対応表を表示するには、オプション-lを指定します。 - -

次のコマンドではhello.caslの、ラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。 - -

$ casl2 -a -l hello.casl
-
-Assemble hello.casl (0)
-
-Label::::
-MAIN.LEN ---> #0020
-MAIN ---> #0000
-MAIN.OBUF ---> #0013
-
-Assemble hello.casl (1)
-hello.casl:    1:MAIN    START
-hello.casl:    2:        OUT     OBUF,LEN
-    #0000   #7001
-    #0001   #0000
-    #0002   #7002
-    #0003   #0000
-    #0004   #1210
-    #0005   #0013
-    #0006   #1220
-    #0007   #0020
-    #0008   #F000
-    #0009   #0002
-    #000A   #1210
-    #000B   #0021
-    #0021   #000A
-    #000C   #1220
-    #000D   #0022
-    #0022   #0001
-    #000E   #F000
-    #000F   #0002
-    #0010   #7120
-    #0011   #7110
-hello.casl:    3:        RET
-    #0012   #8100
-hello.casl:    4:OBUF    DC      'Hello, World!'
-    #0013   #0048
-    #0014   #0065
-    #0015   #006C
-    #0016   #006C
-    #0017   #006F
-    #0018   #002C
-    #0019   #0020
-    #001A   #0057
-    #001B   #006F
-    #001C   #0072
-    #001D   #006C
-    #001E   #0064
-    #001F   #0021
-hello.casl:    5:LEN     DC      13
-    #0020   #000D
-hello.casl:    6:        END
-Hello, World!
-
-

addl.caslの、ラベルとアドレスの対応表と、アセンブル結果は、次のようになります。 - -

$ casl2 -a -l addl.casl
-
-Assemble addl.casl (0)
-
-Label::::
-MAIN.A ---> #0005
-MAIN.B ---> #0006
-MAIN ---> #0000
-
-Assemble addl.casl (1)
-addl.casl:    1:;;; ADDL r,adr
-addl.casl:    2:MAIN    START
-addl.casl:    3:        LD      GR1,A
-    #0000   #1010
-    #0001   #0005
-addl.casl:    4:        ADDL    GR1,B
-    #0002   #2210
-    #0003   #0006
-addl.casl:    5:        RET
-    #0004   #8100
-addl.casl:    6:A       DC      3
-    #0005   #0003
-addl.casl:    7:B       DC      1
-    #0006   #0001
-addl.casl:    8:        END
-
-

なお、オプション-Aを指定すると、アセンブル結果が表示される時点で処理が終了します。仮想マシンCOMET II での実行は行われません。 - -

- -


-Next: , -Previous: Assemble Result, -Up: Usage - -
- -

3.3 実行時のレジスタとメモリを表示

- -

YACASL2では実行中のCPUのレジスタとメモリの内容をそれぞれ、-tと-dを指定することで表示できます。 - -

また、-Mで、仮想マシンCOMET II のメモリ容量を語(16 ビット)単位で指定できます。小さいプログラムを実行するときは、メモリ容量を小さくすれば結果が見やすくなります。 - -

- -

addl.caslに必要なメモリ容量は8語のため、次のようにCPUのレジスタとメモリの内容を表示できます。 - -

$ casl2 -t -d -M8 addl.casl | less
-
-Assemble addl.casl (0)
-
-Assemble addl.casl (1)
-
-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:       8 = #0008 = 0000000000001000
-#0000: PR:       0 = #0000 = 0000000000000000
-#0000: FR (OF SF ZF): 000
-#0000: Memory::::
-#0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007
-#0000: 0000: 1010 0005 2210 0006 8100 0003 0001 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:       8 = #0008 = 0000000000001000
-#0002: PR:       2 = #0002 = 0000000000000010
-#0002: FR (OF SF ZF): 000
-#0002: Memory::::
-#0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007
-#0002: 0000: 1010 0005 2210 0006 8100 0003 0001 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:       8 = #0008 = 0000000000001000
-#0004: PR:       4 = #0004 = 0000000000000100
-#0004: FR (OF SF ZF): 000
-#0004: Memory::::
-#0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007
-#0004: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
-
-
- -


-Next: , -Previous: Register and Memory, -Up: Register and Memory - -
- -

3.3.1 特定のレジスタを表示

- -

addl.caslのレジスタやメモリの中で、実行中に値が変化しているのはGR1だけです。こうした場合は、grepを使って表示される内容を絞り込むことで動作を検証しやすくなります。 - -

$ casl2 -t addl.casl | grep 'GR1:'
-#0000: GR1:      0 = #0000 = 0000000000000000
-#0002: GR1:      3 = #0003 = 0000000000000011
-#0004: GR1:      4 = #0004 = 0000000000000100
-
-

この内容を、先に出力したアセンブル結果と引き比べてください。 -次の表のように、PRとGR1、命令行が対応していることがわかります。 - -

PR GR1 命令行 -
#0000 -#0000 -
#0002 -#0003 -LD GR1,A -
#0004 -#0004 -ADDL GR1,B -
- -

- -


-Next: , -Previous: Register Specify, -Up: Register and Memory - -
- -

3.3.2 プログラム終了時の値を表示

- -

grepとtailを組み合わせれば、プログラム終了時の値を表示できます。 - -

addl.caslでプログラム終了時の値を確認するには、次のようにします。 - -

$ casl2 -t addl.casl | grep 'GR1:' | tail -1
-#0004: GR1:      4 = #0004 = 0000000000000100
-
-

sum_10.caslは、1から10までの整数の和を求めます。 - -

$ cat sum_10.casl
-;;; sum_10.casl
-;;; 出力 GR0: 1から10までの整数をすべて加算した値
-MAIN    START
-        PUSH    0,GR1
-        LAD     GR0,0           ; GR0を初期化
-        LD      GR1,FST         ; GR1に初項を転送
-LOOP    ADDL    GR0,GR1         ; ループ先頭
-        ADDL    GR1,STEP        ; GR1 <- GR1 + 公差
-        CPL     GR1,LST         ; GR1が末項より大きい場合は終了
-        JPL     FIN             ; ↓
-        JUMP    LOOP            ; ループ終端
-FIN     POP     GR1
-        RET
-FST     DC      1               ; 初項
-LST     DC      10              ; 末項
-STEP    DC      1               ; 公差
-        END
-
-

sum_10.caslでファイル終了時の値を確認するには、次のようにします。 - -

$ casl2 -t sum_10.casl | grep 'GR0:' | tail -1
-#0010: GR0:     55 = #0037 = 0000000000110111 = '7'
-
-
- -


-Previous: Ending Value, -Up: Register and Memory - -
- -

3.3.3 プログラムのステップ数を表示

- -

grepとwcを組み合わせれば、プログラムのステップ数を表示できます。 - -

$ casl2 -t hello.casl | grep 'GR1:' | wc -l
-11
-
-
$ casl2 -t addl.casl | grep 'GR1:' | wc -l
-3
-
-

sum_10.caslはプログラム内にループがあるため、ステップ数が大きくなります。 - -

$ casl2 -t sum_10.casl | grep 'GR0:' | wc -l
-54
-
-
- -


-Next: , -Previous: Register and Memory, -Up: Usage - -
- -

3.4 アセンブルと実行を別に行う

- -

casl2に-Oファイル名を指定すると、オブジェクトファイルを作成できます。 - -

$ casl2 -Ohello.o hello.casl
-
-

作成されたオブジェクトファイルの内容は、odを使って確認できます。テキストファイルではないため、catなどでは確認できません。 - -

$ od -t x2 hello.o
-0000000 7001 0000 7002 0000 1210 0013 1220 0020
-0000020 f000 0002 1210 0021 1220 0022 f000 0002
-0000040 7120 7110 8100 0048 0065 006c 006c 006f
-0000060 002c 0020 0057 006f 0072 006c 0064 0021
-0000100 000d 000a 0001
-0000106
-
-

オブジェクトファイルの実行には、comet2を使います。 - -

$ comet2 hello.o
-Hello, World!
-
-
- -


-Next: , -Previous: Only Assemble, -Up: Usage - -
- -

3.5 1語の解析

- -

CASL IIでは、1語(16ビット)を単位としてデータが処理されます。 -dumpwordは、指定した1語を10進数、16進数、2進数で表示します。 - -

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

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

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

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

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


-Previous: Analyze Word, -Up: Usage - -
- -

3.6 CASL2ライブラリの使用

- -

YACASL2のas/casl2libディレクトリには、CASL IIで記述されたライブラリファイルが格納されています。 - -

このフォルダには、たとえば次のようなプログラムが含まれています。 - -

-
OUTL
outl.casl。GR1に格納された値を、0〜65535の数値として出力します。 - -
OUTA
outa.casl。GR1に格納された値を、-32767〜32767の数値として出力します。 - -
MULL
mull.casl。GR1とGR2に格納された値を0〜65535の整数と見なし、積をGR3に格納します。 - -
DIVL
divl.casl。GR1とGR2に格納された値を0〜65535の整数と見なし、商をGR3、剰余をGR0に格納します。 -
- -

3.6.1 数値を出力する

- -

3と1の和を求めるaddl.caslで演算結果を出力するには、まずaddl.caslを編集します。CASL IIのCALL命令でOUTLを副プログラムとして呼び出します。 - -

$ cat addl_outl.casl
-MAIN    START
-        LD      GR1,A
-        ADDL    GR1,B
-        CALL    OUTL
-        RET
-A       DC      3
-B       DC      1
-        END
-
-

変更したらcasl2を、複数のファイルを指定して実行します。 - -

$ casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl
-4
-
-
- -


-Next: , -Previous: Usage, -Up: Top - -
- -

4 YACASL2コマンドマニュアル

- -

-YACASL2のコマンドとオプションについて解説します。 - -

- -
- -


-Next: , -Previous: Command Manual, -Up: Command Manual - -
- -

4.1 casl2

- -

-casl2は、引数として指定されたCASLファイルをアセンブルし、仮想マシンCOMET II上で実行します。CASLファイルは、アセンブラ言語CASL IIで記述されたテキストファイルです。引数が指定されない場合は、エラーメッセージを表示して終了します。 - -

$ casl2 hello.casl
-
-

複数のCASLファイルを指定することで、副プログラムを呼び出せます。 - -

$ casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl
-
-

オプション

- -

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

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

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

-
GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7
汎用レジスタ - -
SP
スタックポインタ - -
PR
プログラムレジスタ - -
FR
フラグレジスタ -
- -

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

     #0002: GR1:      3 = #0003 = 0000000000000011
-
-
-T
--tracelogical
-tと同じように、プログラム実行中のレジスタの値を表示します。ただし、-tと異なり、<値の10進数表現>は符号の付かない10進数です。値の範囲は0から65535です。 - -
-d
--dump
メモリの内容をすべて表示します。 - -
-M <MEMORYSIZE>
--memorysize <MEMORYSIZE>
アセンブルおよび実行時のメモリサイズ<MEMORYSIZE>を0から65535の範囲で指定します。指定しない場合、512です。 - -
-C <CLOCKS>
--clocks <CLOCKS>
実行時のクロック周波数<CLOCKS>を0より大きい整数で指定します。指定しない場合、クロック周波数は5000000です。 - -
-h
--help
casl2の使用方法を表示して終了します。 -
- -
- -


-Next: , -Previous: casl2, -Up: Command Manual - -
- -

4.2 comet2

- -

-comet2は、引数として指定されたオブジェクトファイルを仮想マシンCOMET II上で実行します。オブジェクトファイルは、caslに-oまたは-Oを指定して出力します。 - -

$ comet2 hello.o
-
-

引数で指定できるオブジェクトファイルは1つだけです。引数が指定されない場合は、エラーメッセージを表示して終了します。複数の引数を指定した場合、2番目以降の引数は無視されます。 - -

オプション

- -

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

-
-t
--trace
--tracearithmetic
プログラム実行中のレジスタの値を次の形式で表示します。<値の10進数表現>は符号の付いた10進数です。範囲は-32768から32767です。 - -
     <PR値の16進数表現>: <レジスタ>: <値の10進数表現> = <値の16進数表現> = <値の2進数表現>[ ='文字']
-
-
    -
  • <PR値の16進数表現>と<値の16進数表現>は、先頭に#が付いた4けたの16進数で表されます。範囲は、#0000から#FFFFです - -
  • <値の2進数表現>は、16けたの2進数で表されます。範囲は、0000000000000000から1111111111111111です - -
  • [ ='文字']は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 -
- -

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

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

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

-
GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7
汎用レジスタ - -
SP
スタックポインタ - -
PR
プログラムレジスタ - -
FR
フラグレジスタ -
- -
-T
--tracelogical
-tと同じように、プログラム実行中のレジスタの値を表示します。ただし、-tと異なり、<値の10進数表現>は符号の付かない10進数です。値の範囲は0から65535です。 - -
-d
--dump
メモリの内容をすべて表示します。 - -
-M <MEMORYSIZE>
--memorysize <MEMORYSIZE>
実行時のメモリサイズ<MEMORYSIZE>を0から65535の範囲で指定します。指定しない場合、512です。 - -
-C <CLOCKS>
--clocks <CLOCKS>
実行時のクロック周波数<CLOCKS>を0より大きい整数で指定します。指定しない場合、5000000です。 - -
-h
--help
comet2の使用方法を表示して終了します。 -
- -
- -


-Previous: comet2, -Up: Command Manual - -
- -

4.3 dumpword

- -

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

$ dumpword 10
-
-

引数で指定できる1つだけです。引数が指定されない場合は、使い方を表示して終了します。複数の引数を指定した場合、2番目以降の引数は無視されます。 - -

オプション

- -

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

-
-a
--arithmetic
出力される整数の範囲を-32,768〜32,767にします。オプションなしの場合と同じです。 - -
-l
--logical
出力される整数の範囲を0〜65,535にします。 - -
-h
--help
dumpwordの使用方法を表示して終了します。 -
- -
- -


-Previous: Command Manual, -Up: Top - -
- -

5 CASL2LIBマニュアル

- - - -
- -


-Next: , -Previous: CASL2LIB Manual, -Up: CASL2LIB Manual - -
- -

5.1 ABS - abs.casl

- -

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

入力

- -
-
GR1
符号付き整数 -
- -

出力

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

依存する副プログラム

- -

なし - -

使用例

- -
;;; CASL2LIB > ABSを呼び出し、-1の絶対値を表示
-MAIN    START
-        LD      GR1,A
-        CALL    ABS
-        CALL    OUTA
-        RET
-A       DC      -1
-        END
-
-
$ casl2 call_abs.casl $CASL2LIB/abs.casl $CASL2LIB/outa.casl \
-  $CASL2LIB/divl.casl $CASL2LIB/rev.casl
-1
-
-
- -


-Next: , -Previous: ABS, -Up: CASL2LIB Manual - -
- -

5.2 DIVA - diva.casl

- -

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

入力

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

出力

- -
-
GR0
商 - -
GR3
剰余 - -
OF
次の場合、1 -
    -
  • GR2が0 - -
  • GR1が-32768 - -
  • GR2が-32768 -
- -
SF
商が負数(-32767から-1)の場合、1 - -
ZF
商が0の場合、1 -
- -

依存する副プログラム

- - - -

使用例

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


-Next: , -Previous: DIVA, -Up: CASL2LIB Manual - -
- -

5.3 DIVL - divl.casl

- -

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

入力

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

出力

- -
-
GR0
商 - -
GR3
剰余 - -
OF
GR2が0の場合、1 - -
SF
商が32768から65535の場合、1 - -
ZF
商が0の場合、1 -
- -

依存する副プログラム

- -

なし - -

使用例

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


-Next: , -Previous: DIVL, -Up: CASL2LIB Manual - -
- -

5.4 INL - inl.casl

- -

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

入力

- -
-
標準入力
符号なし整数 -
- -

出力

- -
-
GR1
入力された符号なし整数 - -
GR0
文字列の長さ。数字以外が入力された場合は#FFFF -
- -

依存する副プログラム

- - - -

使用例

- -

次のコマンドを実行すると、数値の入力が受け付けられ、入力された数値が表示される。 - -

;;; casl2 -M1024 call_inl.casl $CASL2LIB/inl.casl $CASL2LIB/str2l.casl  $CASL2LIB/mull.casl \
-;;; $CASL2LIB/outl.casl $CASL2LIB/divl.casl $CASL2LIB/rev.casl
-MAIN    START
-LOOP    CALL    INL             ; GR1に数値、GR0に文字列の長さ
-        JOV     OV
-        AND     GR0,GR0
-        JZE     FIN
-        CPL     GR0,=#FFFF
-        JZE     NAN
-        CALL    OUTL
-        JUMP    LOOP
-OV      CPL     GR0,=#FFFF
-        JZE     LENOV
-        OUT     OVMSG,MLEN1
-        JUMP    LOOP
-NAN     OUT     NANMSG,MLEN2
-        JUMP    LOOP
-LENOV   OUT     LENOVMSG,MLEN3
-FIN     RET
-OVMSG   DC      'Over 65535'
-MLEN1   DC      10
-NANMSG  DC      'Not integer'
-MLEN2   DC      11
-LENOVMSG DC     'Str too long. Stop'
-MLEN3   DC      18
-        END
-
-
$ casl2 -M1024 call_inl.casl $CASL2LIB/inl.casl $CASL2LIB/str2l.casl $CASL2LIB/mull.casl \
-  $CASL2LIB/outl.casl $CASL2LIB/divl.casl $CASL2LIB/rev.casl
-
-
- -


-Next: , -Previous: INL, -Up: CASL2LIB Manual - -
- -

5.5 L2STR - l2str.casl

- -

符号なし整数を文字列に変換する - -

入力

- -
-
GR1
符号なし整数 - -
GR2
変換した文字列を格納するアドレス -
- -

出力

- -
-
GR0
文字列の長さ -
- -

依存する副プログラム

- - - -
- -


-Next: , -Previous: L2STR, -Up: CASL2LIB Manual - -
- -

5.6 MAX - max.casl

- -

連続した複数のWORDを符号付き整数とみなして最大値を返す - -

入力

- -
-
GR1
WORD値を格納したアドレス - -
GR2
値の個数 -
- -

出力

- -
-
GR0
最大値 -
- -

依存する副プログラム

- -

なし - -

- -


-Next: , -Previous: MAX, -Up: CASL2LIB Manual - -
- -

5.7 MINIM - minim.casl

- -

連続した複数のWORDを符号付き整数とみなして最小値を返す - -

入力

- -
-
GR1
WORD値を格納したアドレス - -
GR2
値の個数 -
- -

出力

- -
-
GR0
最小値 -
- -

依存する副プログラム

- -

なし - -

- -


-Next: , -Previous: MINIM, -Up: CASL2LIB Manual - -
- -

5.8 MULA - mula.casl

- -
- -


-Next: , -Previous: MULA, -Up: CASL2LIB Manual - -
- -

5.9 MULL - mull.casl

- -
- -


-Next: , -Previous: MULL, -Up: CASL2LIB Manual - -
- -

5.10 OUTA - outa.casl

- -
- -


-Next: , -Previous: OUTA, -Up: CASL2LIB Manual - -
- -

5.11 OUTB - outb.casl

- -
- - -


-Next: , -Previous: OUTB, -Up: CASL2LIB Manual - -
- -

5.12 OUTD_Q15 - outd_q15.casl

- -
- -


-Next: , -Previous: OUTD_Q15, -Up: CASL2LIB Manual - -
- -

5.13 OUTL - outl.casl

- -
- -


-Next: , -Previous: OUTL, -Up: CASL2LIB Manual - -
- -

5.14 REV - rev.casl

- -
- -


-Previous: REV, -Up: CASL2LIB Manual - -
- -

5.15 STR2L - str2l.casl

- - - - -- 2.18.0