+@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 <j8takagi@@nifty.com>" 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 <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>
+
+$ @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 <j8takagi@@nifty.com>"
+@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