\input texinfo @c -*-texinfo-*-
@c %**start of header
-@setfilename yacasl2
-@settitle YACASL2 -Linux上のCASL2処理系-
+@setfilename yacasl2.info
+@settitle YACASL2 - Linux上のCASL2処理系
@c %**end of header
+@exampleindent 2
+
@copying
Copyright @copyright{} 2010 j8takagi
@end copying
@titlepage
@title
@end titlepage
+@node Top
+
+@menu
+* YACASL2の概要:about.
+* YACASL2のインストール:install.
+* YACASL2の使い方:tutorial.
+@end menu
+
@c Output the table of contents at the beginning.
@contents
@insertcopying
+@node about, install, Top, Top
@chapter YACASL2の概要
@cindex chapter, first
実行時のメモリの内容
@end itemize
-出力された動作内容は、GNU/Linuxのさまざまなツール、たとえば@command{head}、@command{tail}、@command{grep}、@command{diff}などを使って解析できます。
+出力された動作内容は、GNU/Linuxのさまざまなツール、たとえば@command{cat}、@command{less}、@command{grep}、@command{wc}などを使って解析できます。
@unnumberedsec 要件
-YACASL2は、Linux上で動作します。インストール時に、@command{tar}、@command{gcc}、@command{make}が必要です。
-
-現在動作を確認しているのは、次のディストリビューションです。
+YACASL2は、Linux上で動作します。現在動作を確認しているのは、次のディストリビューションです。
@itemize @bullet
Vine Linux 4.2
@end itemize
+インストール時に、@command{tar}、@command{gcc}、@command{make}が必要です。
+
+@node install, tutorial, about, Top
@chapter YACASL2のインストール
YACASL2をインストールするには、Linux上で次の作業をします。
@section @file{yacasl2.tar.gz}のダウンロード
(詳細未定)
+@cartouche
@example
$ @b{cd}
$ @b{wget somewhere/yacasl2.tar.gz}
$ @b{wget somewhere/yacasl2.tar.gz.md5sum}
@end example
+@end cartouche
@section @file{yacasl2.tar.gz}の検証
+
(PGPを使った検証も導入予定)
ダウンロードが完了したら、@command{md5sum}と@command{diff}で正しくファイルがダウンロードができているかを検証します。
+@cartouche
@example
$ @b{md5sum yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -}
Files yacasl2.tar.gz.md5sum and - are identical
@end example
+@end cartouche
@section @file{yacasl2.tar.gz}の展開
+
@file{yacasl2.tar.gz}をダウンロードしたら、次のコマンドで展開します。
+@cartouche
@example
$ @b{tar xvzf yacasl2.tar.gz}
@end example
+@end cartouche
@section @command{casl2}、@command{comet2}、@command{dumpword}のビルド
+
展開したら、次のコマンドで@command{casl2}、@command{comet2}、@command{dumpword}をビルドします。
+@cartouche
@example
$ @b{cd yacasl2}
$ @b{make}
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.ocmd.o exec.o dump.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
+@end cartouche
@section @command{casl2}の実行テスト
+
ビルドしたら、次のコマンドが正常に実行できるかを確認します。
正常に実行された場合は、「Hello, World!」と表示されます。
+@cartouche
@example
$ @b{./casl2 as/hello.casl}
Hello, World!
@end example
+@end cartouche
@section 詳細なテスト
+
次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。
+
+@cartouche
@example
$ @b{make check}
+194 / 194 tests passed. Details in /home/kazubito/yacasl2/test/integra
+tion/casl2/Test.log
+All tests are succeded.
+149 / 149 tests passed. Details in /home/kazubito/yacasl2/test/integra
+tion/comet2/Test.log
+All tests are succeded.
+4 / 4 tests passed. Details in /home/kazubito/yacasl2/test/integration
+/dumpword/Test.log
+All tests are succeded.
@end example
+@end cartouche
@section 環境設定@var{PATH}の設定
+
環境変数@var{PATH}にYACASL2のディレクトリーを追加すると、どのディレクトリーでも@command{casl2}、@command{comet2}、@command{dumpword}を実行できます。
-環境変数の設定方法は使っているシェルによって異なります。現在もっとも多く使われているシェルは、Bashでしょう。次のコマンドで使っているシェルを確認できます。
+環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。現在もっとも多く使われているのは、BASHでしょう。
+
+@cartouche
@example
$ @b{echo $SHELL}
/bin/bash
@end example
+@end cartouche
-シェルがBashの場合、次のコマンドを実行すると環境変数@var{PATH}にYACASL2のディレクトリーが追加されます。
+シェルがBASHの場合、次のコマンドを実行すると環境変数@var{PATH}にYACASL2のディレクトリーが追加されます。
+
+@cartouche
@example
$ @b{PATH=$PATH:~/yacasl2 && export PATH}
@end example
+@end cartouche
+
+シェルの初期設定ファイルに上記のコマンドを追加すれば、今後ログインした後は自動的にどのディレクトリーでも @command{casl2}、@command{comet2}、@command{dumpword}を実行できるようになります。BASHの場合はホームディレクトリーにある@file{.bashrc}が初期設定ファイルのため、コマンドは次のようになります。
-シェルの初期設定ファイルに上記のコマンドを追加すれば、今後ログインした後は自動的にどのディレクトリーでも @command{casl2}、@command{comet2}、@command{dumpword}を実行できるようになります。Bashの場合はホームディレクトリーにある@file{.bashrc}が初期設定ファイルのため、コマンドは次のようになります。
+@cartouche
@example
$ @b{echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc}
@end example
+@end cartouche
+@node tutorial,, install, Top
@chapter YACASL2 の使い方
+
YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリーの中にある@file{as}ディレクトリーからコピーして作成することもできます。
@section 実行結果の出力だけを表示
-@subsection @file{hello.casl}
インストール時にコマンド実行の確認に使った@file{hello.casl}は、次のような内容です。CASL IIのマクロ命令OUTは、文字列を出力します。
+
+@cartouche
@example
$ @b{cat hello.casl}
MAIN START
LEN DC 13
END
@end example
+@end cartouche
次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。
+
+@cartouche
@example
$ @b{casl2 hello.casl}
Hello, World!
@end example
+@end cartouche
-@subsection @file{addl.casl}
-3 と 1 の和を求める@file{addl.casl}は、次のような内容です。
+@file{addl.casl}は、3と1の和を求めます。
+
+@cartouche
@example
$ @b{cat addl.casl}
;;; ADDL r,adr
B DC 1
END
@end example
+@end cartouche
このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。
+
+@cartouche
@example
$ @b{casl2 addl.casl}
$
@end example
+@end cartouche
実行内容を確認するには、後述のようにCPU 内にあるレジスターやメモリーの内容を表示するか、結果を出力するための処理を追加する必要があります。
+@file{sum_10.casl}は、1から10までの整数の和を求めます。
+
+@cartouche
+@example
+$ @b{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
+@end cartouche
+
+このプログラムも、オプションなしで実行した場合には結果が出力されません。
+@cartouche
+@example
+$ @b{casl2 sum_10.casl}
+$
+@end example
+@end cartouche
+
@section アセンブル結果の確認
casl2の処理途中で行われるアセンブルの結果を表示するには、オプション@option{-a}を指定します。また、ラベルとアドレスの対応表を表示するには、オプション@option{-l}を指定します。
-@subsection @file{hello.casl}
-次のコマンドでは、@file{hello.casl}のラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。
+次のコマンドでは@file{hello.casl}の、ラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。
+@cartouche
@example
$ @b{casl2 -a -l hello.casl}
hello.casl: 6: END
Hello, World!
@end example
+@end cartouche
-@subsection @file{addl.casl}
-@file{addl.casl}のラベルとアドレスの対応表と、アセンブル結果は、次のようになります。
+@file{addl.casl}の、ラベルとアドレスの対応表と、アセンブル結果は、次のようになります。
+@cartouche
@example
$ @b{casl2 -a -l addl.casl}
#0006 #0001
addl.casl: 8: END
@end example
+@end cartouche
-ã\81ªã\81\8aã\80\81ã\82ªã\83\97ã\82·ã\83§ã\83³@option{-A}ã\82\92æ\8c\87å®\9aã\81\99ã\82\8bã\81¨ã\80\81ã\82¢ã\82»ã\83³ã\83\96ã\83«çµ\90æ\9e\9cã\81 ã\81\91ã\81\8c表示ã\81\95ã\82\8cã\80\81仮想マシンCOMET II での実行は行われません。
+ã\81ªã\81\8aã\80\81ã\82ªã\83\97ã\82·ã\83§ã\83³@option{-A}ã\82\92æ\8c\87å®\9aã\81\99ã\82\8bã\81¨ã\80\81ã\82¢ã\82»ã\83³ã\83\96ã\83«çµ\90æ\9e\9cã\81\8c表示ã\81\95ã\82\8cã\82\8bæ\99\82ç\82¹ã\81§å\87¦ç\90\86ã\81\8cçµ\82äº\86ã\81\97ã\81¾ã\81\99ã\80\82仮想マシンCOMET II での実行は行われません。
@section 実行時のレジスターとメモリーを表示
YACASL2では実行中のCPUのレジスターとメモリーの内容をそれぞれ、@option{-t}と@option{-d}を指定することで表示できます。
また、@option{-M}で、仮想マシンCOMET II のメモリー容量を語(16 ビット)単位で指定できます。小さいプログラムを実行するときは、メモリー容量を小さくすれば結果が見やすくなります。
-@subsection @file{addl.casl}
@file{addl.casl}に必要なメモリー容量は8語のため、次のようにCPUのレジスターとメモリーの内容を表示できます。
+@cartouche
@example
$ @b{casl2 -t -d -M8 addl.casl | less}
#0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007
#0004: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
@end example
+@end cartouche
+
+@subsection 特定のレジスターを表示
@file{addl.casl}のレジスターやメモリーの中で、実行中に値が変化しているのはGR1だけです。こうした場合は、@command{grep}を使って表示される内容を絞り込むことで動作を検証しやすくなります。
+@cartouche
@example
$ @b{casl2 -t addl.casl | grep 'GR1:'}
#0000: GR1: 0 = #0000 = 0000000000000000
#0002: GR1: 3 = #0003 = 0000000000000011
#0004: GR1: 4 = #0004 = 0000000000000100
@end example
+@end cartouche
-ã\81\93ã\81\93ã\81§ã\80\81å\85\88ã\81«å®\9fè¡\8cã\81\97ã\81\9f@file{addl.casl}ã\81®ã\82¢ã\82»ã\83³ã\83\96ã\83«çµ\90æ\9e\9cã\82\92ã\82\82ã\81\86ä¸\80度è¦\8bてください。
+ã\81\93ã\81®å\86\85容ã\82\92ã\80\81å\85\88ã\81«å\87ºå\8a\9bã\81\97ã\81\9fã\82¢ã\82»ã\83³ã\83\96ã\83«çµ\90æ\9e\9cã\81¨å¼\95ã\81\8dæ¯\94ã\81¹てください。
次の表のように、PRとGR1、命令行が対応していることがわかります。
@multitable @columnfractions .3 .3 .4
@tab #0004
@tab @code{ADDL GR1,B}
@end multitable
+
+@subsection プログラム終了時の値を表示
+
+@command{grep}と@command{tail}を組み合わせれば、プログラム終了時の値を表示できます。
+
+@cartouche
+@example
+$ @b{casl2 -t addl.casl | grep 'GR1:' | tail -1}
+#0004: GR1: 4 = #0004 = 0000000000000100
+@end example
+@end cartouche
+
+@cartouche
+@example
+$ @b{casl2 -t sum_10.casl | grep 'GR0:' | tail -1}
+#0010: GR0: 55 = #0037 = 0000000000110111 = '7'
+@end example
+@end cartouche
+
+@subsection プログラムのステップ数を表示
+
+@command{grep}と@command{wc}を組み合わせれば、プログラムのステップ数を表示できます。
+
+@cartouche
+@example
+$ @b{casl2 -t hello.casl | grep 'GR1:' | wc -l}
+11
+@end example
+@end cartouche
+
+@cartouche
+@example
+$ @b{casl2 -t addl.casl | grep 'GR1:' | wc -l}
+3
+@end example
+@end cartouche
+
+@file{sum_10.casl}はプログラム内にループがあるため、ステップ数が大きくなります。
+
+@cartouche
+@example
+$ @b{casl2 -t sum_10.casl | grep 'GR0:' | wc -l}
+54
+@end example
+@end cartouche
+
+@section アセンブルと実行を別に行う
+
+@command{casl2}に@option{-O}<@file{ファイル名}>を指定すると、オブジェクトファイルを作成できます。
+
+@cartouche
+@example
+$ @b{casl2 -Ohello.o hello.casl}
+@end example
+@end cartouche
+
+作成されたオブジェクトファイルの内容は、@command{od}を使って確認できます。テキストファイルではないため、@command{cat}などでは確認できません。
+
+@cartouche
+@example
+$ @b{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
+@end cartouche
+
+オブジェクトファイルの実行には、@command{comet2}を使います。
+
+@cartouche
+@example
+$ @b{comet2 hello.o}
+Hello, World!
+@end example
+@end cartouche
+
+@section 1語を解析する
+
+CASL2では、1語(16ビット)を単位としてデータが処理されます。
+@command{dumpword}は、指定した1語を10進数、16進数、2進数で表示します。
+
+@cartouche
+@example
+$ @b{dumpword 72}
+ 72: 72 = #0048 = 0000000001001000 = 'H'
+@end example
+@end cartouche
+
+マイナスの数は、次のように指定します。
+
+@cartouche
+@example
+$ @b{dumpword -- -72}
+ -72: -72 = #FFB8 = 1111111110111000
+@end example
+@end cartouche
+
+16進数で指定する場合は、次のように指定します。
+
+@cartouche
+@example
+$ @b{dumpword '#0048'}
+ #0048: 72 = #0048 = 0000000001001000 = 'H'
+@end example
+@end cartouche
@bye