From 3e59a8a847dcd7110a48d22ee2ce6e65c4811cbb Mon Sep 17 00:00:00 2001 From: j8takagi Date: Thu, 1 Nov 2012 09:41:08 +0900 Subject: [PATCH] =?utf8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3?= =?utf8?q?=E3=83=88=E3=82=92=E3=83=9E=E3=83=8B=E3=83=A5=E3=82=A2=E3=83=AB?= =?utf8?q?=E3=81=A8=E3=82=A4=E3=83=B3=E3=82=B9=E3=83=88=E3=83=BC=E3=83=AB?= =?utf8?q?=E3=81=AE=E8=AA=AC=E6=98=8E=E3=81=AB=E5=88=86=E5=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit マニュアルは、HTML(全体で1ファイル)、HTML、info、PDF インストールの説明は、HTML(全体で1ファイル)、テキストファイルINSTALL --- doc/Makefile | 75 +-- doc/install.texi | 232 ++++++++ doc/manual.texi | 1125 +++++++++++++++++++++++++++++++++++++++ doc/yacasl2.texi | 1322 ---------------------------------------------- 4 files changed, 1399 insertions(+), 1355 deletions(-) create mode 100644 doc/install.texi create mode 100644 doc/manual.texi delete mode 100644 doc/yacasl2.texi diff --git a/doc/Makefile b/doc/Makefile index 9eb81c3..3cde90f 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,7 +1,9 @@ -DOCNAME = yacasl2 -SRC = $(DOCNAME).texi +MANUAL = manual +INSTALLDOC = install +MANUALSRC = $(MANUAL).texi +INSTALLDOCSRC = $(INSTALLDOC).texi CSS = style.css -HTMLDIR = html +MANUALHTMLDIR = manual_html MV ?= mv CP ?= cp @@ -13,51 +15,58 @@ DVI2PDF ?= dvipdfmx MAKEINFO ?= gmakeinfo INSTALL ?= install INSTALL-INFO ?= ginstall-info +GZIP = gzip prefix ?= ~ infodir ?= $(prefix)/share/info -.PHONY: all info htmlnosplit html pdf install-info clean clean-docs clean-tex-tmp +.PHONY: all install-manual uninstall-manual clean clean-manual clean-installdoc clean-textmp -.INTERMEDIATE: $(DOCNAME).dvi +.INTERMEDIATE: $(MANUAL).dvi -all: info html htmls pdf +all: $(MANUAL).info $(MANUAL).html $(MANUALHTMLDIR) $(MANUAL).pdf $(INSTALLDOC).html ../INSTALL -info: $(DOCNAME).info +$(MANUALHTMLDIR): $(MANUALSRC) $(CSS) + $(INSTALL) -d $@ + $(INSTALL) $(CSS) $@/ + $(MAKEINFO) -o $@ --html --css-ref=$(CSS) $< -html: $(DOCNAME).html - $(MV) $< index.html +$(MANUAL).html: $(MANUALSRC) $(CSS) + $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $< -htmls: $(SRC) $(CSS) - $(INSTALL) -d $(HTMLDIR) - $(INSTALL) $(CSS) $(HTMLDIR)/ - $(MAKEINFO) -o $(HTMLDIR) --html --css-ref=$(CSS) $(SRC) +$(MANUAL).pdf: $(MANUAL).dvi + $(DVI2PDF) $< -pdf: $(DOCNAME).pdf +$(MANUAL).dvi: $(MANUALSRC) + TEX=$(PTEX) $(TEXI2DVI) -q --texinfo=@afourpaper -o $@ $< + @$(MAKE) clean-textmp -$(DOCNAME).html: $(SRC) $(CSS) - $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $(SRC) +$(MANUAL).txt: $(MANUALSRC) + $(MAKEINFO) --no-headers -o $@ $(MANUALSRC) -$(DOCNAME).pdf: $(DOCNAME).dvi - $(DVI2PDF) $^ +install-manual: $(MANUAL).info + $(INSTALL) -d $(infodir) + $(INSTALL) $(MANUAL).info $(infodir)/ + $(INSTALL-INFO) $(infodir)/$(MANUAL).info $(infodir)/dir + $(GZIP) $(infodir)/$(MANUAL).info -$(DOCNAME).dvi: $(SRC) - TEX=$(PTEX) $(TEXI2DVI) -q --texinfo=@afourpaper -o $@ $< - @$(MAKE) clean-tex-tmp +uninstall-manual: $(MANUAL).info + $(INSTALL-INFO) --delete $(infodir)/$(MANUAL) $(infodir)/dir + $(RM) $(infodir)/$(MANUAL)* -install-info: $(DOCNAME).info - $(INSTALL) -d $(infodir) - $(INSTALL) $(DOCNAME).info $(infodir)/$(DOCNAME) - $(INSTALL-INFO) $(infodir)/$(DOCNAME) $(infodir)/dir +$(INSTALLDOC).html: $(INSTALLDOCSRC) $(CSS) + $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $< + +../INSTALL: $(INSTALLDOCSRC) + $(MAKEINFO) -o $@ --no-headers $< -uninstall-info: $(DOCNAME).info - $(INSTALL-INFO) --delete $(infodir)/$(DOCNAME) $(infodir)/dir - $(RM) $(infodir)/$(DOCNAME) +clean: clean-manual clean-installdoc clean-textmp -clean: clean-docs clean-tex-tmp +clean-manual: + @$(RMRF) html $(MANUALHTMLDIR) $(MANUAL).info $(MANUAL).pdf $(MANUAL).html $(MANUAL).txt -clean-docs: - @$(RMRF) html $(DOCNAME).info $(DOCNAME).pdf index.html +clean-textmp: + @$(RMRF) $(MANUAL).aux $(MANUAL).cp $(MANUAL).cps $(MANUAL).fn $(MANUAL).ky $(MANUAL).log $(MANUAL).pg $(MANUAL).pgs $(MANUAL).tmp $(MANUAL).toc $(MANUAL).tp $(MANUAL).vr -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 +clean-installdoc: + @$(RMRF) install.html ../INSTALL diff --git a/doc/install.texi b/doc/install.texi new file mode 100644 index 0000000..07aa820 --- /dev/null +++ b/doc/install.texi @@ -0,0 +1,232 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@ifnottex +@documentlanguage ja_JP +@end ifnottex +@setfilename yacasl2_install +@documentencoding UTF-8 +@settitle YACASL2のインストール +@firstparagraphindent insert +@paragraphindent 1 +@ifhtml +@exampleindent 0 +@end ifhtml +@c %**end of header + +@copying +Copyright @copyright{} 2010-2012 j8takagi +@end copying + +@titlepage +@title YACASL2のインストール +@author j8takagi +@insertcopying +@end titlepage + +@node Top, Require, (dir), (dir) + +@menu +* Require:: 要件 +* Download:: YACASL2ファイルのダウンロード +* Verify:: YACASL2ファイルの検証 +* Expand:: YACASL2ファイルの展開 +* Build:: @file{casl2} @file{comet2} @file{dumpword}のビルド +* Simple Test:: @file{casl2}の実行テスト +* Detail Test:: 詳細なテスト +* Environment:: 環境変数の設定 +@end menu + +@contents + +@node Require, Download, Top, Top +@chapter 要件 + +YACASL2は、LinuxやMac OS Xなど、UNIX系のOS上で動作します。現在動作を確認しているのは、Ubuntu LinuxとVine Linux、Mac OS Xです。 + +インストール時に、@command{tar} @command{gcc} @command{make}が必要です。Linuxでは多くの場合、標準でインストールされています。Mac OS Xの場合、Xcodeの「Command Line Tools」に含まれます。 + +@node Download, Verify, Require, Top +@chapter YACASL2ファイルのダウンロード + +@uref{http://www.j8takagi.net/yacasl2/, YACASL2のサイト}から、@file{tar.gz}または@file{tar.xz}ファイルと、対応する検証用ファイルをダウンロードします。@uref{http://github.com/j8takagi/YACASL2/downloads/, githubのダウンロードページ}から@file{tar.gz}などのファイルをダウンロードすることもできます。 + +@node Verify, Expand, Download, Top +@chapter YACASL2ファイルの検証 + +ダウンロードが完了したら、圧縮ファイルが改竄されていないか検証します。検証にはGnuPG分離署名か、MD5ハッシュ値を使います。 + +@section GnuPG分離署名での検証 + +GnuPGの@command{gpg}で圧縮ファイルを検証します。この検証を行うには、GnuPGがインストールされ、自分の秘密鍵と公開鍵のペアが作成されている必要があります。 + +@example +$ @kbd{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 +$ @kbd{gpg --recv-keys 25B62DD1} +gpg: requesting key 25B62DD1 from hkp server keys.gnupg.net +gpg: key 25B62DD1: public key "j8takagi " imported +gpg: Total number processed: 1 +gpg: imported: 1 (RSA: 1) + +$ @kbd{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 + + +pub 2048R/25B62DD1 created: 2012-09-29 expires: never usage: SC + trust: unknown validity: full + Primary key fingerprint: ... + + .* <.*@@.*> + +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) @kbd{y} + +You need a passphrase to unlock the secret key for +user: ".* <.*@@.*>" +2048-bit RSA key, ID ........, created 20..-..-.. + + @kbd{password} + +$ @kbd{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 " +@end example + +@section MD5ハッシュ値での検証 + +@command{openssl}と@command{diff}で圧縮ファイルを検証します。 + +@example +$ @kbd{openssl md5 yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -} +Files yacasl2.tar.gz.md5sum and - are identical +@end example + +@node Expand, Build, Verify, Top +@chapter YACASL2ファイルの展開 + +YACASL2ファイルをダウンロードしたら、@command{tar}コマンドで展開します。 + +@example +$ @kbd{tar xvzf yacasl2.tar.gz} +@end example + +@node Build, Simple Test, Expand, Top +@chapter @file{casl2} @file{comet2} @file{dumpword}のビルド + +展開したら、@command{make}コマンドで@file{casl2} @file{comet2} @file{dumpword}をビルドします。 + +@example +$ @kbd{cd yacasl2} +$ @kbd{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’ +@end example + +@node Simple Test, Detail Test, Build, Top +@chapter @file{casl2}の実行テスト + +ビルドしたら、次のコマンドが正常に実行できるかを確認します。 +正常に実行された場合は、「Hello, World!」と表示されます。 + +@example +$ @kbd{./casl2 as/hello.casl} +Hello, World! +@end example + +@node Detail Test, Environment, Simple Test, Top +@chapter 詳細なテスト + +次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。 + +@example +$ @kbd{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. +@end example + +@node Environment, , Detail Test, Top +@chapter 環境変数の設定 + +環境変数@code{PATH}や@code{CASL2LIB}を設定することで、YACASL2が使いやすくなります。環境変数は、使っているシェルを確認してから設定します。 + +@section シェルの確認 + +環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。 + +@example +$ @kbd{echo $SHELL} +/bin/bash +@end example + +現在もっとも多く使われているシェルは、BASHでしょう。以下、BASHでの設定方法を説明します。 + +@section @code{PATH}にYACASL2のディレクトリを追加 + +@code{PATH}にYACASL2実行ファイルをインストールしたディレクトリを追加すると、ディレクトリの指定を省略して@command{casl2} @command{comet2} @command{dumpword}を実行できます。例えば、実行ファイルを@file{~/bin}にインストールしたときは、次のコマンドで設定できます。 + +@example +$ @kbd{PATH=$PATH:~/bin && export PATH} +@end example + +環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されるようになります。BASHではホームディレクトリにある@file{.bashrc}が初期設定ファイルです。次のコマンドで追加できます。 + +@example +$ @kbd{echo ’PATH=$PATH:~/bin && export PATH’ >>~/.bashrc} +@end example + + +@section @code{CASL2LIB}の設定 + +環境変数@code{CASL2LIB}を設定しておけば、CASL IIプログラム作成時に共通ライブラリを呼び出す手間が小さくなります。例えば、CASL2LIBを@code{~/yacasl2/casl2lib}にインストールしたときは、次のコマンドで設定できます。 + +@example +$ @kbd{CASL2LIB=~/yacasl2/casl2lib && export CASL2LIB} +@end example + +BASHの初期設定ファイル@file{.bashrc}には、次のコマンドで追加できます。 + +@example +$ @kbd{ echo 'CASL2LIB=~/yacasl2/casl2lib && export CASL2LIB' >>~/.bashrc} +@end example + +@bye diff --git a/doc/manual.texi b/doc/manual.texi new file mode 100644 index 0000000..92298b0 --- /dev/null +++ b/doc/manual.texi @@ -0,0 +1,1125 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@ifnottex +@documentlanguage ja_JP +@end ifnottex +@setfilename yacasl2 +@documentencoding UTF-8 +@settitle YACASL2 - CASL II 処理システム +@firstparagraphindent insert +@paragraphindent 1 +@ifhtml +@exampleindent 0 +@end ifhtml +@c %**end of header + +@copying +Copyright @copyright{} 2010-2012 j8takagi +@end copying + +@dircategory Programming +@direntry +* YACASL2: (yacasl2). CASL II 処理システム +* casl2: (yacasl2)casl2 invocation. casl2の呼び出し +* comet2: (yacasl2)comet2 invocation. comet2の呼び出し +* dumpword: (yacasl2)dumpword invocation. dumpwordの呼び出し +@end direntry + +@titlepage +@title YACASL2 +@subtitle コマンドラインインターフェイスで動作するオープンソースのCASL II処理システム +@author j8takagi +@insertcopying +@end titlepage + +@node Top, Overview, (dir), (dir) + +@menu +* Overview:: YACASL2の概要 +* Sample usage:: YACASL2の使用例 +* casl2 invocation:: casl2の呼び出し +* comet2 invocation:: comet2の呼び出し +* dumpword invocation:: dumpwordの呼び出し +* CASL2LIB Manual:: CASL2LIBマニュアル +@end menu + +@contents + +@node Overview, Sample usage, Top, Top +@chapter YACASL2の概要 + +YACASL2は、UNIXやLinuxのコマンドラインインターフェイスで +動作するオープンソースのCASL II処理システムです。 +CASL IIは情報処理試験で用いられるアセンブラ言語で、 +次の資料により仕様が公開されています。 + +@iftex +@cartouche +@end iftex +@quotation +@uref{http://www.jitec.jp/1_13download/shiken_yougo_ver2_2.pdf, 試験で使用する情報処理用語・プログラム言語など Ver 2.2(平成24年5月22日)}[PDFファイル] +別紙 1 アセンブラ言語の仕様 +@end quotation +@iftex +@end cartouche +@end iftex + +YACASL2は、CASL IIアセンブラ言語で記述されたファイルをアセンブルし、 +仮想マシンCOMET II上で実行します。 +アセンブルと実行は、連続で行うこともできますし、 +アセンブル結果をファイルに保存してあらから実行することもできます。 +YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試験の問題を +はじめ各種参考書やサイトに記載されたCASL IIのプログラムを +そのままアセンブルして実行できます。 +また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。 + +YACASL2は、「ふつうの処理系」として動作します。 +ほかの多くのCASL IIエミュレータと違い、デバッガとして動作したり、 +コンピュータ内部の模式図を表示したりすることはありません。 +そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。 + +@itemize @bullet + +@item +ラベルとアドレスの対応 + +@item +アセンブル結果 + +@item +実行時のレジスタの内容 + +@item +実行時のメモリの内容 +@end itemize + +出力された動作内容は、GNU/Linuxのさまざまなツール、 +たとえば、@command{cat} @command{less} @command{grep} @command{wc}などを使って解析できます。 + +YACASL2の操作は、端末上のコマンドラインインターフェイスで行います。 + +@node Sample usage, casl2 invocation, Overview, Top +@chapter YACASL2の使用例 +YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。 +以下の例で用いられるCASLプログラムのファイルは、 +テキストエディタなどで作成するか、インストールしたディレクトリの +中にある@file{as}ディレクトリからコピーしてください。 + +@menu +* Simple output:: 実行結果の出力だけを表示 +* Assemble result:: アセンブル結果の確認 +* Register and memory:: 実行時のレジスタとメモリを表示 +* Only assemble:: アセンブルと実行を別に行う +* Analyze word:: 1語の解析 +* Use CASL2LIB:: CASL2ライブラリの使用 +@end menu + +@node Simple output, Assemble result, Sample usage, Sample usage +@section 実行結果の出力だけを表示 + +インストール時にコマンド実行の確認に使った@file{hello.casl}は、次のような内容です。 +CASL IIのマクロ命令OUTは、文字列を出力します。 + +@example +$ @kbd{cat hello.casl} +MAIN START + OUT OBUF,LEN + RET +OBUF DC 'Hello, World!' +LEN DC 13 + END +@end example + +次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。 + +@example +$ @kbd{casl2 hello.casl} +Hello, World! +@end example + +@file{addl.casl}は、3と1の和を求めます。 + +@example +$ @kbd{cat addl.casl} +;;; ADDL r,adr +MAIN START + LD GR1,A + ADDL GR1,B + RET +A DC 3 +B DC 1 + END +@end example + +このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。 + +@example +$ @kbd{casl2 addl.casl} +$ +@end example + +実行内容を確認するには、後述のようにCPU 内にあるレジスタやメモリの内容を表示するか、結果を出力するための処理を追加する必要があります。 + +@node Assemble result, Register and memory, Simple output, Sample usage +@section アセンブル結果の確認 + +casl2の処理途中で行われるアセンブルの結果を表示するには、オプション@option{-a}を指定します。 +また、ラベルとアドレスの対応表を表示するには、オプション@option{-l}を指定します。 + +次のコマンドでは@file{hello.casl}の、ラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。 +OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。 + +@example +$ @kbd{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! +@end example + +@file{addl.casl}の、ラベルとアドレスの対応表と、アセンブル結果は、次のようになります。 + +@example +$ @kbd{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 +@end example + +なお、オプション@option{-A}を指定すると、アセンブル結果が表示される時点で処理が終了します。 +仮想マシンCOMET II での実行は行われません。 + +@node Register and memory, Only assemble, Assemble result, Sample usage +@section 実行時のレジスタとメモリを表示 + +YACASL2では実行中のCPUのレジスタとメモリの内容をそれぞれ、@option{-t}と@option{-d}を指定することで表示できます。 + +また、@option{-M}で、仮想マシンCOMET II のメモリ容量を語(16 ビット)単位で指定できます。 +小さいプログラムを実行するときは、メモリ容量を小さくすれば結果が見やすくなります。 + +@menu +* Register specify:: 特定のレジスタを表示 +* End value:: +* Step count:: プログラムのステップ数を表示 +@end menu + +@file{addl.casl}に必要なメモリ容量は8語のため、次のようにCPUのレジスタとメモリの内容を表示できます。 + +@example +$ @kbd{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 +@end example + +@node Register specify, End value, Register and memory, Register and memory +@subsection 特定のレジスタを表示 + +@file{addl.casl}のレジスタやメモリの中で、実行中に値が変化しているのはGR1だけです。 +こうした場合は、@command{grep}を使って表示される内容を絞り込むことで動作を検証しやすくなります。 + +@example +$ @kbd{casl2 -t addl.casl | grep 'GR1:'} +#0000: GR1: 0 = #0000 = 0000000000000000 +#0002: GR1: 3 = #0003 = 0000000000000011 +#0004: GR1: 4 = #0004 = 0000000000000100 +@end example + +この内容を、先に出力したアセンブル結果と引き比べてください。 +次の表のように、PRとGR1、命令行が対応していることがわかります。 + +@multitable @columnfractions .3 .3 .4 +@item PR @tab GR1 @tab 命令行 +@item #0000 +@tab #0000 +@item #0002 +@tab #0003 +@tab @code{LD GR1,A} +@item #0004 +@tab #0004 +@tab @code{ADDL GR1,B} +@end multitable + +@node End value, Step count, Register specify, Register and memory +@subsection プログラム終了時の値を表示 + +@command{grep}と@command{tail}を組み合わせれば、プログラム終了時の値を表示できます。 + +@file{addl.casl}でプログラム終了時の値を確認するには、次のようにします。 + +@example +$ @kbd{casl2 -t addl.casl | grep 'GR1:' | tail -1} +#0004: GR1: 4 = #0004 = 0000000000000100 +@end example + +@file{sum_10.casl}は、1から10までの整数の和を求めます。 + +@example +$ @kbd{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 +@end example + +@file{sum_10.casl}でファイル終了時の値を確認するには、次のようにします。 + +@example +$ @kbd{casl2 -t sum_10.casl | grep 'GR0:' | tail -1} +#0010: GR0: 55 = #0037 = 0000000000110111 = '7' +@end example + +@node Step count, , End value, Register and memory +@subsection プログラムのステップ数を表示 + +@command{grep}と@command{wc}を組み合わせれば、プログラムのステップ数を表示できます。 + +@example +$ @kbd{casl2 -t hello.casl | grep 'GR1:' | wc -l} +11 +@end example + +@example +$ @kbd{casl2 -t addl.casl | grep 'GR1:' | wc -l} +3 +@end example + +@file{sum_10.casl}はプログラム内にループがあるため、ステップ数が大きくなります。 + +@example +$ @kbd{casl2 -t sum_10.casl | grep 'GR0:' | wc -l} +54 +@end example + +@node Only assemble, Analyze word, Register and memory, Sample usage +@section アセンブルと実行を別に行う + +@command{casl2}に@option{-O}@file{ファイル名}を指定すると、オブジェクトファイルを作成できます。 + +@example +$ @kbd{casl2 -Ohello.o hello.casl} +@end example + +作成されたオブジェクトファイルの内容は、@command{od}を使って確認できます。 +テキストファイルではないため、@command{cat}などでは確認できません。 + +@example +$ @kbd{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 +@end example + +オブジェクトファイルの実行には、@command{casl2}を使います。 + +@example +$ @kbd{comet2 hello.o} +Hello, World! +@end example + +@node Analyze word, Use CASL2LIB, Only assemble, Sample usage +@section 1語の解析 + +CASL IIでは、1語(1 word、16ビット)を単位としてデータが処理されます。 +@command{dumpword}は、指定した1語を10進数、16進数、2進数で表示します。 + +@example +$ @kbd{dumpword 72} + 72: 72 = #0048 = 0000000001001000 = 'H' +@end example + +@node Use CASL2LIB, , Analyze word, Sample usage +@section CASL2ライブラリの使用 + +YACASL2の@file{as/casl2lib}ディレクトリには、CASL IIで記述されたライブラリファイルが格納されています。 + +このフォルダには、たとえば次のようなプログラムが含まれています。 + +@table @option +@item OUTL +@file{outl.casl}。 +GR1に格納された値を、0以上65535以下の整数として出力します。 + +@item OUTA +@file{outa.casl}。 +GR1に格納された値を、-32767以上32767以下の整数として出力します。 + +@item MULL +@file{mull.casl}。 +GR1とGR2に格納された値を0以上65535以下の整数と見なし、積をGR3に格納します。 + +@item DIVL +@file{divl.casl}。 +GR1とGR2に格納された値を0以上65535以下の整数と見なし、商をGR3、剰余をGR0に格納します。 +@end table + +@subsection 数値を出力する + +3と1の和を求める@file{addl.casl}で演算結果を出力するには、まず@file{addl.casl}を編集します。 +CASL IIの@command{CALL}命令で@command{OUTL}を副プログラムとして呼び出します。 + +@example +$ @kbd{cat addl_outl.casl} +MAIN START + LD GR1,A + ADDL GR1,B + @emph{CALL OUTL} + RET +A DC 3 +B DC 1 + END +@end example + +変更したら@command{casl2}を、複数のファイルを指定して実行します。 + +@example +$ @kbd{casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl} +4 +@end example + +@node casl2 invocation, comet2 invocation, Sample usage, Top +@chapter @command{casl2}の呼び出し + +@pindex casl2 +@cindex casl2 +@cindex invoking +@cindex options +@cindex usage +@cindex help + +@command{casl2}は、引数として指定されたCASLファイルをアセンブルし、仮想マシンCOMET II上で実行します。 +CASLファイルは、アセンブラ言語CASL IIで記述されたテキストファイルです。 +引数が指定されない場合は、エラーメッセージを表示して終了します。 + +@example +$ @kbd{casl2 hello.casl} +@end example + +複数のCASLファイルを指定することで、副プログラムを呼び出すこともできます。 + +@example +$ @kbd{casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl} +@end example + +@unnumberedsubsec オプション + +@command{casl2}は、次のオプションを指定できます。 + +@table @option +@item -s +@itemx --source +CASLファイルの内容を表示します。 + +@item -l +@itemx --label +ラベルの一覧を次の形式で表示します。 +表示後、ほかの作業を続行します。 + +@example +<プログラム名>.<ラベル名> ---> <アドレスの16進数表現> +@end example + +@item -L +@itemx --labelonly +@option{-l}と同じ形式でラベルの一覧を表示します。 +表示後、ほかの作業は続行せず、終了します。 + +@item -a +@itemx --assembledetail +アセンブル詳細結果を表示し、ほかの作業を続行します。 + +@item -A +@itemx --assembledetailonly +アセンブル詳細結果を表示して終了します。 + +@item -o +@itemx --assembleout +アセンブル結果をオブジェクトファイル@file{}に出力し、ほかの作業を続行します。 +出力されたオブジェクトファイルは、@command{comet2}で実行できます。 +オブジェクトファイルを指定しない場合、出力先は@file{a.o}です。 +オブジェクトファイルは1つだけ指定できます。 + +@item -O[] +@itemx --assembleoutonly[] +アセンブル結果をオブジェクトファイル@file{}に出力し、終了します。 +出力されたオブジェクトファイルは、@command{comet2}で実行できます。 +オブジェクトファイルを指定しない場合、出力先は@file{a.o}です。 +オブジェクトファイルは1つだけ指定できます。 + +@item -t +@itemx --trace +@itemx --tracearithmetic +プログラム実行中のレジスタの値を次の形式で表示します。 + +@example +: <レジスタ>: <値の10進数表現> = +<値の16進数表現> = <値の2進数表現>[ ='文字'] +@end example + +@itemize +@item +@code{}と@code{<レジスタ>}、@code{<値の16進数表現>}は、4けたの16進数で表されます。 +@code{}と@code{<値の16進数表現>}には、先頭に@code{#}が付きます。 +範囲は@code{#0000}から@code{#FFFF}です + +@item +@code{<値の10進数表現>}は符号の付いた10進数です。 +範囲は-32768から32767です。 + +@item +@code{<値の2進数表現>}は、16けたの2進数で表されます。 +範囲は、@code{0000000000000000}から@code{1111111111111111}です + +@item +@code{[ ='文字']}は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 +@end itemize + +表示されるレジスタには、次の種類があります。 + +@table @code +@item GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7 +汎用レジスタ + +@item SP +スタックポインタ + +@item PR +プログラムレジスタ + +@item FR +フラグレジスタ +@end table + +例えば、次のように表示されます。 + +@example +#0002: GR1: 3 = #0003 = 0000000000000011 +@end example + +@item -T +@itemx --tracelogical +@option{-t}と同じように、プログラム実行中のレジスタの値を表示します。 +ただし@option{-t}と異なり、@code{<値の10進数表現>}は符号の付かない10進数です。 +値の範囲は0から65535です。 + +@item -d +@itemx --dump +メモリの内容をすべて表示します。 + +@item -M +@itemx --memorysize +アセンブルおよび実行時のメモリサイズ@option{}を0から65535の範囲で指定します。 +指定しない場合、512です。 + +@item -C +@itemx --clocks +実行時のクロック周波数@option{}を0より大きい整数で指定します。 +指定しない場合、クロック周波数は5000000です。 + +@item -v +@itemx --version +@command{casl2}のバージョンを表示して終了します。 + +@item -h +@itemx --help +@command{casl2}の使用方法を表示して終了します。 +@end table + +@node comet2 invocation, dumpword invocation, casl2 invocation, Top +@chapter @command{comet2}の呼び出し + +@pindex comet2 +@cindex comet2 +@cindex invoking +@cindex options +@cindex usage +@cindex help + +@command{comet2}は、引数として指定されたオブジェクトファイルを仮想マシンCOMET II上で実行します。 +オブジェクトファイルは、@command{casl}に@option{-o}または@option{-O}を指定して出力します。 + +@example +$ @kbd{comet2 hello.o} +@end example + +引数で指定できるオブジェクトファイルは1つだけです。 +引数が指定されない場合は、エラーメッセージを表示して終了します。 +複数の引数を指定した場合、2番目以降の引数は無視されます。 + +@unnumberedsubsec オプション + +@command{comet2}は、次のオプションを指定できます。 + +@table @option + +@item -t +@itemx --trace +@itemx --tracearithmetic +プログラム実行中のレジスタの値を次の形式で表示します。 +@code{<値の10進数表現>}は符号の付いた10進数です。 +範囲は-32768から32767です。 + +@example +: <レジスタ>: <値の10進数表現> = <値の16進数表現> = <値の2進数表現>[ ='文字'] +@end example + +@itemize +@item +@code{}と@code{<値の16進数表現>}は、先頭に@code{#}が付いた4けたの16進数で表されます。 +範囲は、@code{#0000}から@code{#FFFF}です + +@item +@code{<値の2進数表現>}は、16けたの2進数で表されます。 +範囲は、@code{0000000000000000}から@code{1111111111111111}です + +@item +@code{[ ='文字']}は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 +@end itemize + +例えば、次のように表示されます。 + +@example +#0002: GR1: 3 = #0003 = 0000000000000011 +@end example + +表示されるレジスタには、次の種類があります。 + +@table @code +@item GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7 +汎用レジスタ + +@item SP +スタックポインタ + +@item PR +プログラムレジスタ + +@item FR +フラグレジスタ +@end table + +@item -T +@itemx --tracelogical +@option{-t}と同じように、プログラム実行中のレジスタの値を表示します。 +ただし、@option{-t}と異なり、@code{<値の10進数表現>}は符号の付かない10進数です。 +値の範囲は0から65535です。 + +@item -d +@itemx --dump +メモリの内容をすべて表示します。 + +@item -M +@itemx --memorysize +実行時のメモリサイズ@option{}を0から65535の範囲で指定します。 +指定しない場合、512です。 + +@item -C +@itemx --clocks +実行時のクロック周波数@option{}を0より大きい整数で指定します。 +指定しない場合、5000000です。 + +@item -v +@itemx --version +@command{comet2}のバージョンを表示して終了します。 + +@item -h +@itemx --help +@command{comet2}の使用方法を表示して終了します。 +@end table + +@node dumpword invocation, CASL2LIB Manual, comet2 invocation, Top +@chapter @command{dumpword}の呼び出し + +@pindex dumpword +@cindex dumpword +@cindex invoking +@cindex options +@cindex usage +@cindex help + +@command{dumpword}は引数として指定された数値を、整数、#0000から#FFFFまでの範囲の16進数、2進数で表示します。 +文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。 +引数は、10進数または先頭に「#」の付いた16進数で指定します。 +表示される整数は、オプションにより符号付きか符号なしかを指定します。 +オプションなしの場合は符号付きです。 +整数の範囲は、符号付きの場合は-32768以上32767以下、符号なしの場合は0以上65535以下です。 + +@example +$ @kbd{dumpword 10} + 10: 10 = #000A = 0000000000001010 = '\n' +@end example + +引数が指定されない場合は、使い方を表示して終了します。 +複数の引数を指定した場合、1つ目の引数だけが表示され、2つ目以降の引数は無視されます。 + +@unnumberedsubsec 注意 + +マイナスの数や16進数はシェルの仕様により、そのままでは指定できません。 + +マイナスの数を指定するときは、次のように@option{--}を付けます。 + +@example +$ @kbd{dumpword -- -72} + -72: -72 = #FFB8 = 1111111110111000 +@end example + +先頭に「#」を付けて16進数を指定するときは、次のように「'」で囲みます。 + +@example +$ @kbd{dumpword '#0048'} + #0048: 72 = #0048 = 0000000001001000 = 'H' +@end example + +@unnumberedsubsec オプション + +@command{dumpword}は、次のオプションを指定できます。 + +@table @option + +@item -a +@itemx --arithmetic +出力される整数の範囲を-32,768以上32,767以下にします。 +オプションなしの場合と同じです。 + +@item -l +@itemx --logical +出力される整数の範囲を0以上65,535以下にします。 + +@item -v +@itemx --version +@command{dumpword}のバージョンを表示して終了します。 + +@item -h +@itemx --help +@command{dumpword}の使用方法を表示して終了します。 +@end table + +@node CASL2LIB Manual, , dumpword invocation, Top +@chapter CASL2LIBマニュアル + +@menu +* ABS:: @kbd{ABS} - @file{abs.casl} +* DIVA:: @kbd{DIVA} - @file{diva.casl} +* DIVL:: @kbd{DIVL} - @file{divl.casl} +* INL:: @kbd{INL} - @file{inl.casl} +* L2STR:: @kbd{L2STR} - @file{l2str.casl} +* MAX:: @kbd{MAX} - @file{max.casl} +* MINIM:: @kbd{MINIM} - @file{minim.casl} +* MULA:: @kbd{MULA} - @file{mula.casl} +* MULL:: @kbd{MULL} - @file{mull.casl} +* OUTA:: @kbd{OUTA} - @file{outa.casl} +* OUTB:: @kbd{OUTB} - @file{outb.casl} +* OUTD_Q15:: @kbd{OUTD_Q15} - @file{outd_q15.casl} +* OUTL:: @kbd{OUTL} - @file{outl.casl} +* REV:: @kbd{REV} - @file{rev.casl} +* STR2L:: @kbd{STR2L} - @file{str2l.casl} +@end menu + +@node ABS, DIVA, CASL2LIB Manual, CASL2LIB Manual +@section @kbd{ABS} - @file{abs.casl} +GR1を符号付き整数とみなし、絶対値に変換 + +@unnumberedsubsec 入力 +@table @code +@item GR1 +符号付き整数 +@end table + +@unnumberedsubsec 出力 +@table @code +@item GR1 +入力された値の絶対値 + +@item OF +入力された値が-32768の場合、1 + +@item SF +入力された値が負数(-32767から-1)の場合、1 +@end table + +@unnumberedsubsec 依存する副プログラム +なし + +@unnumberedsubsec 使用例 +@example +@verbatiminclude casl2lib/abs/call_abs.casl +@end example + +@example +$ @kbd{casl2 call_abs.casl $CASL2LIB/abs.casl $CASL2LIB/outa.casl \ + $CASL2LIB/divl.casl $CASL2LIB/rev.casl} +1 +@end example + +@node DIVA, DIVL, ABS, CASL2LIB Manual +@section @kbd{DIVA} - @file{diva.casl} +符号付き整数の割算を筆算方式で行う + +@unnumberedsubsec 入力 +@table @code +@item GR1 +被除数 + +@item GR2 +除数 +@end table + +@unnumberedsubsec 出力 +@table @code +@item GR0 +商 + +@item GR3 +剰余 + +@item OF +次の場合、1 +@itemize +@item +GR2が0 + +@item +GR1が-32768 + +@item +GR2が-32768 +@end itemize + +@item SF +商が負数(-32767から-1)の場合、1 + +@item ZF +商が0の場合、1 +@end table + +@unnumberedsubsec 依存する副プログラム +@itemize +@item @code{DIVL} +@end itemize + +@unnumberedsubsec 使用例 +@example +@verbatiminclude casl2lib/diva/call_diva.casl +@end example + +@example +$ @kbd{casl2 call_diva.casl $CASL2LIB/diva.casl $CASL2LIB/divl.casl \ + $CASL2LIB/outa.casl $CASL2LIB/abs.casl $CASL2LIB/rev.casl} +-128 +-127 +@end example + +@node DIVL, INL, DIVA, CASL2LIB Manual +@section @kbd{DIVL} - @file{divl.casl} +符号なし整数の割算を筆算方式で行う + +@unnumberedsubsec 入力 +@table @code +@item GR1 +被除数 + +@item GR2 +除数 +@end table + +@unnumberedsubsec 出力 +@table @code +@item GR0 +商 + +@item GR3 +剰余 + +@item OF +GR2が0の場合、1 + +@item SF +商が32768から65535の場合、1 + +@item ZF +商が0の場合、1 +@end table + +@unnumberedsubsec 依存する副プログラム +なし + +@unnumberedsubsec 使用例 +@example +@verbatiminclude casl2lib/divl/call_divl.casl +@end example + +@example +$ @kbd{casl2 call_divl.casl $CASL2LIB/divl.casl $CASL2LIB/outl.casl \ + $CASL2LIB/rev.casl} +256 +254 +@end example + +@node INL, L2STR, DIVL, CASL2LIB Manual +@section @kbd{INL} - @file{inl.casl} + +符号なし整数の入力を受け付ける + +@unnumberedsubsec 入力 +@table @code +@item 標準入力 +符号なし整数 +@end table + +@unnumberedsubsec 出力 +@table @code +@item GR1 +入力された符号なし整数 + +@item GR0 +文字列の長さ。 +数字以外が入力された場合は@code{#FFFF} +@end table + +@unnumberedsubsec 依存する副プログラム +@itemize +@item +@code{STR2L} +@end itemize + +@unnumberedsubsec 使用例 +次のコマンドを実行すると、数値の入力が受け付けられ、入力された数値が表示される。 + +@example +@verbatiminclude casl2lib/inl/call_inl.casl +@end example + +@example +$ @kbd{casl2 -M1024 call_inl.casl $CASL2LIB/inl.casl $CASL2LIB/str2l.casl $CASL2LIB/mull.casl \ + $CASL2LIB/outl.casl $CASL2LIB/divl.casl $CASL2LIB/rev.casl} +@end example + +@node L2STR, MAX, INL, CASL2LIB Manual +@section @kbd{L2STR} - @file{l2str.casl} + +符号なし整数を文字列に変換する + +@unnumberedsubsec 入力 +@table @code +@item GR1 +符号なし整数 + +@item GR2 +変換した文字列を格納するアドレス +@end table + +@unnumberedsubsec 出力 +@table @code +@item GR0 +文字列の長さ +@end table + +@unnumberedsubsec 依存する副プログラム +@itemize +@item +@code{DIVL} +@end itemize + +@node MAX, MINIM, L2STR, CASL2LIB Manual +@section @kbd{MAX} - @file{max.casl} + +連続した複数のWORDを符号付き整数とみなして最大値を返す + +@unnumberedsubsec 入力 +@table @code +@item GR1 +WORD値を格納したアドレス + +@item GR2 +値の個数 +@end table + +@unnumberedsubsec 出力 +@table @code +@item GR0 +最大値 +@end table + +@unnumberedsubsec 依存する副プログラム +なし + +@node MINIM, MULA, MAX, CASL2LIB Manual +@section @kbd{MINIM} - @file{minim.casl} + +連続した複数のWORDを符号付き整数とみなして最小値を返す + +@unnumberedsubsec 入力 +@table @code +@item GR1 +WORD値を格納したアドレス + +@item GR2 +値の個数 +@end table + +@unnumberedsubsec 出力 +@table @code +@item GR0 +最小値 +@end table + +@unnumberedsubsec 依存する副プログラム +なし + +@node MULA, MULL, MINIM, CASL2LIB Manual +@section @kbd{MULA} - @file{mula.casl} + +@node MULL, OUTA, MULA, CASL2LIB Manual +@section @kbd{MULL} - @file{mull.casl} + +@node OUTA, OUTB, MULL, CASL2LIB Manual +@section @kbd{OUTA} - @file{outa.casl} + +@node OUTB, OUTD_Q15, OUTA, CASL2LIB Manual +@section @kbd{OUTB} - @file{outb.casl} + +@node OUTD_Q15, OUTL, OUTB, CASL2LIB Manual +@section @kbd{OUTD_Q15} - @file{outd_q15.casl} + +@node OUTL, REV, OUTD_Q15, CASL2LIB Manual +@section @kbd{OUTL} - @file{outl.casl} + +@node REV, STR2L, OUTL, CASL2LIB Manual +@section @kbd{REV} - @file{rev.casl} + +@node STR2L, , REV, CASL2LIB Manual +@section @kbd{STR2L} - @file{str2l.casl} + +@bye diff --git a/doc/yacasl2.texi b/doc/yacasl2.texi deleted file mode 100644 index 74906ea..0000000 --- a/doc/yacasl2.texi +++ /dev/null @@ -1,1322 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@ifnottex -@documentlanguage ja_JP -@end ifnottex -@setfilename yacasl2.info -@documentencoding UTF-8 -@settitle YACASL2 - CASL II処理システム -@firstparagraphindent insert -@paragraphindent 1 -@ifhtml -@exampleindent 0 -@end ifhtml -@c %**end of header - -@copying -Copyright @copyright{} 2010-2011 j8takagi -@end copying - -@dircategory Basics -@direntry -* YACASL2: (yacasl2). -@end direntry - -@titlepage -@title YACASL2 -@subtitle UNIX系OSのコマンドラインで動作するオープンソースのCASL II処理システム -@author j8takagi -@insertcopying -@end titlepage - -@ifinfo -@node Top, About, (dir), (dir) - -@menu -* About:: YACASL2の概要 -* Install:: YACASL2のインストール -* Usage:: YACASL2の使い方 -* Command Manual:: YACASL2コマンドマニュアル -* CASL2LIB Manual:: CASL2LIBマニュアル - -@detailmenu - --- The Detailed Node Listing --- - - - -* About:: YACASL2の概要 -* Install:: YACASL2のインストール -* Usage:: YACASL2の使い方 -* Command Manual:: YACASL2コマンドマニュアル -* CASL2LIB Manual:: CASL2LIBマニュアル - -YACASL2のインストール - -* Download:: YACASL2ファイルのダウンロード -* Verify:: YACASL2ファイルの検証 -* Expand:: YACASL2ファイルの展開 -* Build:: @kbd{casl2}、@kbd{comet2}、@kbd{dumpword}のビルド -* Simple Test:: @kbd{casl2}の実行テスト -* Detail Test:: 詳細なテスト -* Environment:: 環境変数の設定 - -YACASL2の使い方 - -* Simple Output:: 実行結果の出力だけを表示 -* Assemble Result:: アセンブル結果の確認 -* Register and Memory:: 実行時のレジスタとメモリを表示 -* Only Assemble:: アセンブルと実行を別に行う -* Analyze Word:: 1語の解析 -* Use CASL2LIB:: CASL2ライブラリの使用 - -実行時のレジスタとメモリを表示 - -* Register Specify:: 特定のレジスタを表示 -* Ending Value:: プログラム終了時の値を表示 -* Step Count:: プログラムのステップ数を表示 - -YACASL2コマンドマニュアル - -* casl2:: @kbd{casl2} -* comet2:: @kbd{comet2} -* dumpword:: @kbd{dumpword} - -CASL2LIBマニュアル - -* ABS:: @kbd{ABS} - @file{abs.casl} -* DIVA:: @kbd{DIVA} - @file{diva.casl} -* DIVL:: @kbd{DIVL} - @file{divl.casl} -* INL:: @kbd{INL} - @file{inl.casl} -* L2STR:: @kbd{L2STR} - @file{l2str.casl} -* MAX:: @kbd{MAX} - @file{max.casl} -* MINIM:: @kbd{MINIM} - @file{minim.casl} -* MULA:: @kbd{MULA} - @file{mula.casl} -* MULL:: @kbd{MULL} - @file{mull.casl} -* OUTA:: @kbd{OUTA} - @file{outa.casl} -* OUTB:: @kbd{OUTB} - @file{outb.casl} -* OUTD_Q15:: @kbd{OUTD_Q15} - @file{outd_q15.casl} -* OUTL:: @kbd{OUTL} - @file{outl.casl} -* REV:: @kbd{REV} - @file{rev.casl} -* STR2L:: @kbd{STR2L} - @file{str2l.casl} - -@end detailmenu -@end menu - -@end ifinfo - -@ifnotinfo -@node Top, About - -@menu -* About:: YACASL2の概要 -* Install:: YACASL2のインストール -* Usage:: YACASL2の使い方 -* Command Manual:: YACASL2コマンドマニュアル -* CASL2LIB Manual:: CASL2LIBマニュアル -@end menu - -@contents -@end ifnotinfo - -@node About, Install, Top, Top -@chapter YACASL2の概要 - -YACASL2は、UNIX/Linuxのコマンドラインインターフェイスで動作するオープンソースのCASL II処理システムです。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。 - -@iftex -@cartouche -@end iftex -@quotation -@uref{http://www.jitec.jp/1_13download/shiken_yougo_ver2_2.pdf, 「試験で使用する情報技術に関する用語・プログラム言語など」Ver2.2(2012年5月版)}[PDFファイル] -別紙 1 アセンブラ言語の仕様 -@end quotation -@iftex -@end cartouche -@end iftex - -YACASL2は、CASL IIアセンブラ言語で記述されたファイルをアセンブルし、仮想マシンCOMET II上で実行します。アセンブルと実行は、連続で行うことも別々に行うことも可能です。 -YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試験の問題をはじめ各種参考書やサイトに記載されたCASL IIのプログラムをそのままアセンブルして実行できます。また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。 - -YACASL2は、「ふつうの処理系」として動作します。ほかの多くのCASL IIエミュレータと違い、デバッガとして動作したり、コンピュータ内部の模式図を直接表示したりすることはありません。そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。 - -@itemize @bullet - -@item -ラベルとアドレスの対応 - -@item -アセンブル結果 - -@item -実行時のレジスタの内容 - -@item -実行時のメモリの内容 -@end itemize - -出力された動作内容は、GNU/Linuxのさまざまなツール、たとえば、@kbd{cat} @kbd{less} @kbd{grep} @kbd{wc}などを使って解析できます。 - -YACASL2の操作は、端末を開いてコマンドを入力・実行することで行います。 - -@unnumberedsec 要件 -YACASL2は、LinuxやMac OS Xなど、UNIX系のOS上で動作します。 - -インストール時に、@kbd{tar} @kbd{gcc} @kbd{make}(@kbd{gmake})が必要です。Linuxでは多くの場合、標準でインストールされています。Mac OS Xの場合、@code{Xcode}のcommand line toolsをインストールすれば使えるようになります。 - -@node Install, Usage, About, Top -@chapter YACASL2のインストール -YACASL2をインストールするには、Linux上で次の作業をします。 - -@menu -* Download:: YACASL2ファイルのダウンロード -* Verify:: YACASL2ファイルの検証 -* Expand:: YACASL2ファイルの展開 -* Build:: @kbd{casl2} @kbd{comet2} @kbd{dumpword}のビルド -* Simple Test:: @kbd{casl2}の実行テスト -* Detail Test:: 詳細なテスト -* Environment:: 環境変数の設定 -@end menu - -@node Download, Verify, Install, Install -@section YACASL2ファイルのダウンロード - -@uref{http://www.j8takagi.net/yacasl2/, YACASL2のサイト}から、@file{tar.gz}または@file{tar.xz}ファイルと、対応する検証用ファイルをダウンロードします。@uref{http://github.com/j8takagi/YACASL2/downloads/, githubのダウンロードページ}から@file{tar.gz}などのファイルをダウンロードすることもできます。 - -@node Verify, Expand, Download, Install -@section YACASL2ファイルの検証 - -ダウンロードが完了したら、圧縮ファイルが改竄されていないか検証します。検証にはGnuPG分離署名か、MD5ハッシュ値を使います。 - -@subsection GnuPG分離署名での検証 - -GnuPGの@kbd{gpg}で圧縮ファイルを検証します。この検証を行うには、GnuPGがインストールされ、自分の秘密鍵と公開鍵のペアが作成されている必要があります。 - -@example -$ @kbd{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 -$ @kbd{gpg --recv-keys 25B62DD1} -gpg: requesting key 25B62DD1 from hkp server keys.gnupg.net -gpg: key 25B62DD1: public key "j8takagi " imported -gpg: Total number processed: 1 -gpg: imported: 1 (RSA: 1) - -$ @kbd{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 - - -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 - -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..-..-.. - - - -$ @kbd{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 " -@end example - -@subsection MD5ハッシュ値での検証 - -@kbd{md5sum}と@kbd{diff}で圧縮ファイルを検証します。 - -@example -$ @kbd{openssl md5sum yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -} -Files yacasl2.tar.gz.md5sum and - are identical -@end example - -@node Expand, Build, Verify, Install -@section YACASL2ファイルの展開 - -YACASL2ファイルをダウンロードしたら、次のコマンドで展開します。 - -@example -$ @kbd{tar xvzf yacasl2.tar.gz} -@end example - -@node Build, Simple Test, Expand, Install -@section @kbd{casl2} @kbd{comet2} @kbd{dumpword}のビルド - -展開したら、次のコマンドで@kbd{casl2} @kbd{comet2} @kbd{dumpword}をビルドします。 - -@example -$ @kbd{cd yacasl2} -$ @kbd{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’ -@end example - -@node Simple Test, Detail Test, Build, Install -@section @kbd{casl2}の実行テスト - -ビルドしたら、次のコマンドが正常に実行できるかを確認します。 -正常に実行された場合は、「Hello, World!」と表示されます。 - -@example -$ @kbd{./casl2 as/hello.casl} -Hello, World! -@end example - -@node Detail Test, Environment, Simple Test, Install -@section 詳細なテスト - -次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。 - -@example -$ @kbd{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. -@end example - -@node Environment, , Detail Test, Install -@section 環境変数の設定 - -環境変数@code{PATH}や@code{CASL2LIB}を設定することで、YACASL2が使いやすくなります。環境変数は、使っているシェルを確認してから設定します。 - -@unnumberedsubsec シェルの確認 - -環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。 - -@example -$ @kbd{echo $SHELL} -/bin/bash -@end example - -現在もっとも多く使われているシェルは、BASHでしょう。以下、BASHでの設定方法を説明します。 - -@unnumberedsubsec @code{PATH}にYACASL2のディレクトリを追加 - -@code{PATH}にYACASL2のディレクトリを追加すると、どのディレクトリでもディレクトリを指定せずに@kbd{casl2}、@kbd{comet2}、@kbd{dumpword}を実行できます。YACASL2をホームディレクトリ@code{~}にインストールしたときは、次のコマンドで設定できます。 - -@example -$ @kbd{PATH=$PATH:~/yacasl2 && export PATH} -@end example - -環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されるようになります。BASHではホームディレクトリにある@file{.bashrc}が初期設定ファイルです。次のコマンドで追加できます。 - -@example -$ @kbd{echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc} -@end example - - -@unnumberedsubsec @code{CASL2LIB}の設定 - -環境変数@code{CASL2LIB}を設定しておけば、後述するCASL2LIBを利用するときの手間が小さくなります。YACASL2をホームディレクトリ@code{~}にインストールしたときは、次のコマンドで設定できます。 - -@example -$ @kbd{CASL2LIB=~/yacasl2/as/casl2lib && export CASL2LIB} -@end example - -BASHの初期設定ファイル@file{.bashrc}には、次のコマンドで追加できます。 - -@example -$ @kbd{ echo 'CASL2LIB=~/yacasl2/as/casl2lib && export CASL2LIB' >>~/.bashrc} -@end example - - -@node Usage, Command Manual, Install, Top -@chapter YACASL2の使い方 -YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリの中にある@file{as}ディレクトリからコピーして作成することもできます。 - - -@menu -* Simple Output:: 実行結果の出力だけを表示 -* Assemble Result:: アセンブル結果の確認 -* Register and Memory:: 実行時のレジスタとメモリを表示 -* Only Assemble:: アセンブルと実行を別に行う -* Analyze Word:: 1語の解析 -* Use CASL2LIB:: CASL2ライブラリの使用 -@end menu - -@node Simple Output, Assemble Result, Usage, Usage -@section 実行結果の出力だけを表示 - -インストール時にコマンド実行の確認に使った@file{hello.casl}は、次のような内容です。CASL IIのマクロ命令OUTは、文字列を出力します。 - -@example -$ @kbd{cat hello.casl} -MAIN START - OUT OBUF,LEN - RET -OBUF DC 'Hello, World!' -LEN DC 13 - END -@end example - -次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。 - -@example -$ @kbd{casl2 hello.casl} -Hello, World! -@end example - -@file{addl.casl}は、3と1の和を求めます。 - -@example -$ @kbd{cat addl.casl} -;;; ADDL r,adr -MAIN START - LD GR1,A - ADDL GR1,B - RET -A DC 3 -B DC 1 - END -@end example - -このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。 - -@example -$ @kbd{casl2 addl.casl} -$ -@end example - -実行内容を確認するには、後述のようにCPU 内にあるレジスタやメモリの内容を表示するか、結果を出力するための処理を追加する必要があります。 - -@node Assemble Result, Register and Memory, Simple Output, Usage -@section アセンブル結果の確認 - -casl2の処理途中で行われるアセンブルの結果を表示するには、オプション@option{-a}を指定します。また、ラベルとアドレスの対応表を表示するには、オプション@option{-l}を指定します。 - -次のコマンドでは@file{hello.casl}の、ラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。 - -@example -$ @kbd{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! -@end example - -@file{addl.casl}の、ラベルとアドレスの対応表と、アセンブル結果は、次のようになります。 - -@example -$ @kbd{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 -@end example - -なお、オプション@option{-A}を指定すると、アセンブル結果が表示される時点で処理が終了します。仮想マシンCOMET II での実行は行われません。 - -@node Register and Memory, Only Assemble, Assemble Result, Usage -@section 実行時のレジスタとメモリを表示 - -YACASL2では実行中のCPUのレジスタとメモリの内容をそれぞれ、@option{-t}と@option{-d}を指定することで表示できます。 - -また、@option{-M}で、仮想マシンCOMET II のメモリ容量を語(16 ビット)単位で指定できます。小さいプログラムを実行するときは、メモリ容量を小さくすれば結果が見やすくなります。 - -@menu -* Register Specify:: 特定のレジスタを表示 -* Ending Value:: プログラム終了時の値を表示 -* Step Count:: プログラムのステップ数を表示 -@end menu - -@file{addl.casl}に必要なメモリ容量は8語のため、次のようにCPUのレジスタとメモリの内容を表示できます。 - -@example -$ @kbd{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 -@end example - -@node Register Specify, Ending Value, Register and Memory, Register and Memory -@subsection 特定のレジスタを表示 - -@file{addl.casl}のレジスタやメモリの中で、実行中に値が変化しているのはGR1だけです。こうした場合は、@kbd{grep}を使って表示される内容を絞り込むことで動作を検証しやすくなります。 - -@example -$ @kbd{casl2 -t addl.casl | grep 'GR1:'} -#0000: GR1: 0 = #0000 = 0000000000000000 -#0002: GR1: 3 = #0003 = 0000000000000011 -#0004: GR1: 4 = #0004 = 0000000000000100 -@end example - -この内容を、先に出力したアセンブル結果と引き比べてください。 -次の表のように、PRとGR1、命令行が対応していることがわかります。 - -@multitable @columnfractions .3 .3 .4 -@item PR @tab GR1 @tab 命令行 -@item #0000 -@tab #0000 -@item #0002 -@tab #0003 -@tab @code{LD GR1,A} -@item #0004 -@tab #0004 -@tab @code{ADDL GR1,B} -@end multitable - -@node Ending Value, Step Count, Register Specify, Register and Memory -@subsection プログラム終了時の値を表示 - -@kbd{grep}と@kbd{tail}を組み合わせれば、プログラム終了時の値を表示できます。 - -@file{addl.casl}でプログラム終了時の値を確認するには、次のようにします。 - -@example -$ @kbd{casl2 -t addl.casl | grep 'GR1:' | tail -1} -#0004: GR1: 4 = #0004 = 0000000000000100 -@end example - -@file{sum_10.casl}は、1から10までの整数の和を求めます。 - -@example -$ @kbd{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 -@end example - -@file{sum_10.casl}でファイル終了時の値を確認するには、次のようにします。 - -@example -$ @kbd{casl2 -t sum_10.casl | grep 'GR0:' | tail -1} -#0010: GR0: 55 = #0037 = 0000000000110111 = '7' -@end example - -@node Step Count, , Ending Value, Register and Memory -@subsection プログラムのステップ数を表示 - -@kbd{grep}と@kbd{wc}を組み合わせれば、プログラムのステップ数を表示できます。 - -@example -$ @kbd{casl2 -t hello.casl | grep 'GR1:' | wc -l} -11 -@end example - -@example -$ @kbd{casl2 -t addl.casl | grep 'GR1:' | wc -l} -3 -@end example - -@file{sum_10.casl}はプログラム内にループがあるため、ステップ数が大きくなります。 - -@example -$ @kbd{casl2 -t sum_10.casl | grep 'GR0:' | wc -l} -54 -@end example - -@node Only Assemble, Analyze Word, Register and Memory, Usage -@section アセンブルと実行を別に行う - -@kbd{casl2}に@option{-O}@file{ファイル名}を指定すると、オブジェクトファイルを作成できます。 - -@example -$ @kbd{casl2 -Ohello.o hello.casl} -@end example - -作成されたオブジェクトファイルの内容は、@kbd{od}を使って確認できます。テキストファイルではないため、@kbd{cat}などでは確認できません。 - -@example -$ @kbd{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 -@end example - -オブジェクトファイルの実行には、@kbd{comet2}を使います。 - -@example -$ @kbd{comet2 hello.o} -Hello, World! -@end example - -@node Analyze Word, Use CASL2LIB, Only Assemble, Usage -@section 1語の解析 - -CASL IIでは、1語(16ビット)を単位としてデータが処理されます。 -@kbd{dumpword}は、指定した1語を10進数、16進数、2進数で表示します。 - -@example -$ @kbd{dumpword 72} - 72: 72 = #0048 = 0000000001001000 = 'H' -@end example - -マイナスの数は、次のように@kbd{--}を付けて指定します。 - -@example -$ @kbd{dumpword -- -72} - -72: -72 = #FFB8 = 1111111110111000 -@end example - -16進数は、次のように次のように@kbd{'}で囲み@kbd{#}を付けて指定します。 - -@example -$ @kbd{dumpword '#0048'} - #0048: 72 = #0048 = 0000000001001000 = 'H' -@end example - -@node Use CASL2LIB, , Analyze Word, Usage -@section CASL2ライブラリの使用 - -YACASL2の@file{as/casl2lib}ディレクトリには、CASL IIで記述されたライブラリファイルが格納されています。 - -このフォルダには、たとえば次のようなプログラムが含まれています。 - -@table @option -@item OUTL -@file{outl.casl}。GR1に格納された値を、0〜65535の数値として出力します。 - -@item OUTA -@file{outa.casl}。GR1に格納された値を、-32767〜32767の数値として出力します。 - -@item MULL -@file{mull.casl}。GR1とGR2に格納された値を0〜65535の整数と見なし、積をGR3に格納します。 - -@item DIVL -@file{divl.casl}。GR1とGR2に格納された値を0〜65535の整数と見なし、商をGR3、剰余をGR0に格納します。 -@end table - -@subsection 数値を出力する - -3と1の和を求める@file{addl.casl}で演算結果を出力するには、まず@file{addl.casl}を編集します。CASL IIの@kbd{CALL}命令で@kbd{OUTL}を副プログラムとして呼び出します。 - -@example -$ @kbd{cat addl_outl.casl} -MAIN START - LD GR1,A - ADDL GR1,B - @emph{CALL OUTL} - RET -A DC 3 -B DC 1 - END -@end example - -変更したら@kbd{casl2}を、複数のファイルを指定して実行します。 - -@example -$ @kbd{casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl} -4 -@end example - -@node Command Manual, CASL2LIB Manual, Usage, Top -@chapter YACASL2コマンドマニュアル - -@cindex YACASL2コマンドマニュアル - -YACASL2のコマンドとオプションについて解説します。 - -@menu -* casl2:: @kbd{casl2} -* comet2:: @kbd{comet2} -* dumpword:: @kbd{dumpword} -@end menu - -@node casl2, comet2, Command Manual, Command Manual -@section @kbd{casl2} - -@pindex casl2 -@cindex casl2 - -@kbd{casl2}は、引数として指定されたCASLファイルをアセンブルし、仮想マシンCOMET II上で実行します。CASLファイルは、アセンブラ言語CASL IIで記述されたテキストファイルです。引数が指定されない場合は、エラーメッセージを表示して終了します。 - -@example -$ @kbd{casl2 hello.casl} -@end example - -複数のCASLファイルを指定することで、副プログラムを呼び出せます。 - -@example -$ @kbd{casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl} -@end example - -@unnumberedsubsec オプション - -@kbd{casl2}は、次のオプションを指定できます。 - -@table @option -@item -s -@itemx --source -CASLファイルの内容を表示します。 - -@item -l -@itemx --label -ラベルの一覧を次の形式で表示します。表示後、ほかの作業を続行します。 - -@example -<プログラム名>.<ラベル名> ---> <アドレスの16進数表現> -@end example - -@item -L -@itemx --labelonly -@option{-l}と同じ形式でラベルの一覧を表示します。表示後、ほかの作業は続行せず、終了します。 - -@item -a -@itemx --assembledetail -アセンブル詳細結果を表示し、ほかの作業を続行します。 - -@item -A -@itemx --assembledetailonly -アセンブル詳細結果を表示して終了します。 - -@item -o -@itemx --assembleout -アセンブル結果をオブジェクトファイル@file{}に出力し、ほかの作業を続行します。出力されたオブジェクトファイルは、@kbd{comet2}で実行できます。オブジェクトファイルを指定しない場合、出力先は@file{a.o}です。オブジェクトファイルは1つだけ指定できます。 - -@item -O[] -@itemx --assembleoutonly[] -アセンブル結果をオブジェクトファイル@file{}に出力し、終了します。出力されたオブジェクトファイルは、@kbd{comet2}で実行できます。オブジェクトファイルを指定しない場合、出力先は@file{a.o}です。オブジェクトファイルは1つだけ指定できます。 - -@item -t -@itemx --trace -@itemx --tracearithmetic -プログラム実行中のレジスタの値を次の形式で表示します。 - -@example -: <レジスタ>: <値の10進数表現> = -<値の16進数表現> = <値の2進数表現>[ ='文字'] -@end example - -@itemize -@item -@code{}と@code{<レジスタ>}、@code{<値の16進数表現>}は、4けたの16進数で表されます。@code{}と@code{<値の16進数表現>}には、先頭に@code{#}が付きます。範囲は@code{#0000}から@code{#FFFF}です - -@item -@code{<値の10進数表現>}は符号の付いた10進数です。範囲は-32768から32767です。 - -@item -@code{<値の2進数表現>}は、16けたの2進数で表されます。範囲は、@code{0000000000000000}から@code{1111111111111111}です - -@item -@code{[ ='文字']}は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 -@end itemize - -表示されるレジスタには、次の種類があります。 - -@table @code -@item GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7 -汎用レジスタ - -@item SP -スタックポインタ - -@item PR -プログラムレジスタ - -@item FR -フラグレジスタ -@end table - -例えば、次のように表示されます。 - -@example -#0002: GR1: 3 = #0003 = 0000000000000011 -@end example - -@item -T -@itemx --tracelogical -@option{-t}と同じように、プログラム実行中のレジスタの値を表示します。ただし、@option{-t}と異なり、@code{<値の10進数表現>}は符号の付かない10進数です。値の範囲は0から65535です。 - -@item -d -@itemx --dump -メモリの内容をすべて表示します。 - -@item -M -@itemx --memorysize -アセンブルおよび実行時のメモリサイズ@option{}を0から65535の範囲で指定します。指定しない場合、512です。 - -@item -C -@itemx --clocks -実行時のクロック周波数@option{}を0より大きい整数で指定します。指定しない場合、クロック周波数は5000000です。 - -@item -h -@itemx --help -@kbd{casl2}の使用方法を表示して終了します。 -@end table - -@node comet2, dumpword, casl2, Command Manual -@section @kbd{comet2} - -@pindex comet2 -@cindex comet2 - -@kbd{comet2}は、引数として指定されたオブジェクトファイルを仮想マシンCOMET II上で実行します。オブジェクトファイルは、@kbd{casl}に@option{-o}または@option{-O}を指定して出力します。 - -@example -$ @kbd{comet2 hello.o} -@end example - -引数で指定できるオブジェクトファイルは1つだけです。引数が指定されない場合は、エラーメッセージを表示して終了します。複数の引数を指定した場合、2番目以降の引数は無視されます。 - -@unnumberedsubsec オプション - -@kbd{comet2}は、次のオプションを指定できます。 - -@table @option - -@item -t -@itemx --trace -@itemx --tracearithmetic -プログラム実行中のレジスタの値を次の形式で表示します。@code{<値の10進数表現>}は符号の付いた10進数です。範囲は-32768から32767です。 - -@example -: <レジスタ>: <値の10進数表現> = <値の16進数表現> = <値の2進数表現>[ ='文字'] -@end example - -@itemize -@item -@code{}と@code{<値の16進数表現>}は、先頭に@code{#}が付いた4けたの16進数で表されます。範囲は、@code{#0000}から@code{#FFFF}です - -@item -@code{<値の2進数表現>}は、16けたの2進数で表されます。範囲は、@code{0000000000000000}から@code{1111111111111111}です - -@item -@code{[ ='文字']}は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 -@end itemize - -例えば、次のように表示されます。 - -@example -#0002: GR1: 3 = #0003 = 0000000000000011 -@end example - -表示されるレジスタには、次の種類があります。 - -@table @code -@item GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7 -汎用レジスタ - -@item SP -スタックポインタ - -@item PR -プログラムレジスタ - -@item FR -フラグレジスタ -@end table - -@item -T -@itemx --tracelogical -@option{-t}と同じように、プログラム実行中のレジスタの値を表示します。ただし、@option{-t}と異なり、@code{<値の10進数表現>}は符号の付かない10進数です。値の範囲は0から65535です。 - -@item -d -@itemx --dump -メモリの内容をすべて表示します。 - -@item -M -@itemx --memorysize -実行時のメモリサイズ@option{}を0から65535の範囲で指定します。指定しない場合、512です。 - -@item -C -@itemx --clocks -実行時のクロック周波数@option{}を0より大きい整数で指定します。指定しない場合、5000000です。 - -@item -h -@itemx --help -@kbd{comet2}の使用方法を表示して終了します。 -@end table - -@node dumpword, , comet2, Command Manual -@section @kbd{dumpword} - -@pindex dumpword -@cindex dumpword - -@kbd{dumpword}は、引数として指定された数値を、整数、#0000〜#FFFFの範囲の16進数、2進数で表示します。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。引数は、10進数または先頭に「#」の付いた16進数で指定します。表示される整数は、オプションにより符号付きか符号なしかを指定します。オプションなしの場合は符号付きです。整数の範囲は、符号付きの場合は-32768から32767、符号なしの場合は0から65535です。 - -@example -$ @kbd{dumpword 10} -@end example - -引数で指定できる1つだけです。引数が指定されない場合は、使い方を表示して終了します。複数の引数を指定した場合、2番目以降の引数は無視されます。 - -@unnumberedsubsec オプション - -@kbd{dumpword}は、次のオプションを指定できます。 - -@table @option - -@item -a -@itemx --arithmetic -出力される整数の範囲を-32,768〜32,767にします。オプションなしの場合と同じです。 - -@item -l -@itemx --logical -出力される整数の範囲を0〜65,535にします。 - -@item -h -@itemx --help -@kbd{dumpword}の使用方法を表示して終了します。 -@end table - -@node CASL2LIB Manual, , Command Manual, Top -@chapter CASL2LIBマニュアル - -@menu -* ABS:: @kbd{ABS} - @file{abs.casl} -* DIVA:: @kbd{DIVA} - @file{diva.casl} -* DIVL:: @kbd{DIVL} - @file{divl.casl} -* INL:: @kbd{INL} - @file{inl.casl} -* L2STR:: @kbd{L2STR} - @file{l2str.casl} -* MAX:: @kbd{MAX} - @file{max.casl} -* MINIM:: @kbd{MINIM} - @file{minim.casl} -* MULA:: @kbd{MULA} - @file{mula.casl} -* MULL:: @kbd{MULL} - @file{mull.casl} -* OUTA:: @kbd{OUTA} - @file{outa.casl} -* OUTB:: @kbd{OUTB} - @file{outb.casl} -* OUTD_Q15:: @kbd{OUTD_Q15} - @file{outd_q15.casl} -* OUTL:: @kbd{OUTL} - @file{outl.casl} -* REV:: @kbd{REV} - @file{rev.casl} -* STR2L:: @kbd{STR2L} - @file{str2l.casl} -@end menu - -@node ABS, DIVA, CASL2LIB Manual, CASL2LIB Manual -@section @kbd{ABS} - @file{abs.casl} -GR1を符号付き整数とみなし、絶対値に変換 - -@unnumberedsubsec 入力 -@table @code -@item GR1 -符号付き整数 -@end table - -@unnumberedsubsec 出力 -@table @code -@item GR1 -入力された値の絶対値 - -@item OF -入力された値が-32768の場合、1 - -@item SF -入力された値が負数(-32767から-1)の場合、1 -@end table - -@unnumberedsubsec 依存する副プログラム -なし - -@unnumberedsubsec 使用例 -@example -@verbatiminclude casl2lib/abs/call_abs.casl -@end example - -@example -$ @kbd{casl2 call_abs.casl $CASL2LIB/abs.casl $CASL2LIB/outa.casl \ - $CASL2LIB/divl.casl $CASL2LIB/rev.casl} -1 -@end example - -@node DIVA, DIVL, ABS, CASL2LIB Manual -@section @kbd{DIVA} - @file{diva.casl} -符号付き整数の割算を筆算方式で行う - -@unnumberedsubsec 入力 -@table @code -@item GR1 -被除数 - -@item GR2 -除数 -@end table - -@unnumberedsubsec 出力 -@table @code -@item GR0 -商 - -@item GR3 -剰余 - -@item OF -次の場合、1 -@itemize -@item -GR2が0 - -@item -GR1が-32768 - -@item -GR2が-32768 -@end itemize - -@item SF -商が負数(-32767から-1)の場合、1 - -@item ZF -商が0の場合、1 -@end table - -@unnumberedsubsec 依存する副プログラム -@itemize -@item @code{DIVL} -@end itemize - -@unnumberedsubsec 使用例 -@example -@verbatiminclude casl2lib/diva/call_diva.casl -@end example - -@example -$ @kbd{casl2 call_diva.casl $CASL2LIB/diva.casl $CASL2LIB/divl.casl \ - $CASL2LIB/outa.casl $CASL2LIB/abs.casl $CASL2LIB/rev.casl} --128 --127 -@end example - -@node DIVL, INL, DIVA, CASL2LIB Manual -@section @kbd{DIVL} - @file{divl.casl} -符号なし整数の割算を筆算方式で行う - -@unnumberedsubsec 入力 -@table @code -@item GR1 -被除数 - -@item GR2 -除数 -@end table - -@unnumberedsubsec 出力 -@table @code -@item GR0 -商 - -@item GR3 -剰余 - -@item OF -GR2が0の場合、1 - -@item SF -商が32768から65535の場合、1 - -@item ZF -商が0の場合、1 -@end table - -@unnumberedsubsec 依存する副プログラム -なし - -@unnumberedsubsec 使用例 -@example -@verbatiminclude casl2lib/divl/call_divl.casl -@end example - -@example -$ @kbd{casl2 call_divl.casl $CASL2LIB/divl.casl $CASL2LIB/outl.casl \ - $CASL2LIB/rev.casl} -256 -254 -@end example - -@node INL, L2STR, DIVL, CASL2LIB Manual -@section @kbd{INL} - @file{inl.casl} - -符号なし整数の入力を受け付ける - -@unnumberedsubsec 入力 -@table @code -@item 標準入力 -符号なし整数 -@end table - -@unnumberedsubsec 出力 -@table @code -@item GR1 -入力された符号なし整数 - -@item GR0 -文字列の長さ。数字以外が入力された場合は@code{#FFFF} -@end table - -@unnumberedsubsec 依存する副プログラム -@itemize -@item -@code{STR2L} -@end itemize - -@unnumberedsubsec 使用例 -次のコマンドを実行すると、数値の入力が受け付けられ、入力された数値が表示される。 - -@example -@verbatiminclude casl2lib/inl/call_inl.casl -@end example - -@example -$ @kbd{casl2 -M1024 call_inl.casl $CASL2LIB/inl.casl $CASL2LIB/str2l.casl $CASL2LIB/mull.casl \ - $CASL2LIB/outl.casl $CASL2LIB/divl.casl $CASL2LIB/rev.casl} -@end example - -@node L2STR, MAX, INL, CASL2LIB Manual -@section @kbd{L2STR} - @file{l2str.casl} - -符号なし整数を文字列に変換する - -@unnumberedsubsec 入力 -@table @code -@item GR1 -符号なし整数 - -@item GR2 -変換した文字列を格納するアドレス -@end table - -@unnumberedsubsec 出力 -@table @code -@item GR0 -文字列の長さ -@end table - -@unnumberedsubsec 依存する副プログラム -@itemize -@item -@code{DIVL} -@end itemize - -@node MAX, MINIM, L2STR, CASL2LIB Manual -@section @kbd{MAX} - @file{max.casl} - -連続した複数のWORDを符号付き整数とみなして最大値を返す - -@unnumberedsubsec 入力 -@table @code -@item GR1 -WORD値を格納したアドレス - -@item GR2 -値の個数 -@end table - -@unnumberedsubsec 出力 -@table @code -@item GR0 -最大値 -@end table - -@unnumberedsubsec 依存する副プログラム -なし - -@node MINIM, MULA, MAX, CASL2LIB Manual -@section @kbd{MINIM} - @file{minim.casl} - -連続した複数のWORDを符号付き整数とみなして最小値を返す - -@unnumberedsubsec 入力 -@table @code -@item GR1 -WORD値を格納したアドレス - -@item GR2 -値の個数 -@end table - -@unnumberedsubsec 出力 -@table @code -@item GR0 -最小値 -@end table - -@unnumberedsubsec 依存する副プログラム -なし - -@node MULA, MULL, MINIM, CASL2LIB Manual -@section @kbd{MULA} - @file{mula.casl} - -@node MULL, OUTA, MULA, CASL2LIB Manual -@section @kbd{MULL} - @file{mull.casl} - -@node OUTA, OUTB, MULL, CASL2LIB Manual -@section @kbd{OUTA} - @file{outa.casl} - -@node OUTB, OUTD_Q15, OUTA, CASL2LIB Manual -@section @kbd{OUTB} - @file{outb.casl} - -@node OUTD_Q15, OUTL, OUTB, CASL2LIB Manual -@section @kbd{OUTD_Q15} - @file{outd_q15.casl} - -@node OUTL, REV, OUTD_Q15, CASL2LIB Manual -@section @kbd{OUTL} - @file{outl.casl} - -@node REV, STR2L, OUTL, CASL2LIB Manual -@section @kbd{REV} - @file{rev.casl} - -@node STR2L, , REV, CASL2LIB Manual -@section @kbd{STR2L} - @file{str2l.casl} - -@bye -- 2.18.0