Merge branch 'master' of dragon:/home/dav/yacasl2
[YACASL2.git] / doc / yacasl2.texi
1 \input texinfo   @c -*-texinfo-*-
2 @c %**start of header
3 @ifnottex
4 @documentlanguage ja_JP
5 @end ifnottex
6 @setfilename yacasl2.info
7 @documentencoding UTF-8
8 @settitle YACASL2 - Linux上のCASL II処理系
9 @firstparagraphindent none
10 @paragraphindent 1
11 @c @iftex
12 @c @usedvipdfmx
13 @c @end iftex
14 @c %**end of header
15
16 @copying
17 Copyright @copyright{} 2010 j8takagi
18 @end copying
19
20 @exampleindent 2
21
22 @dircategory Basics
23 @direntry
24 * YACASL2: (yacasl2).
25 @end direntry
26
27 @titlepage
28 @title YACASL2
29 @subtitle UNIX/Linuxのコマンドラインインターフェイスで動作するCASL II処理システム
30 @author j8takagi
31 @insertcopying
32 @end titlepage
33
34 @ifnottex
35 @node Top, About, (dir), (dir)
36 @end ifnottex
37
38 @menu
39 * About::
40 * Install::
41 * Usage::
42 * Command Manual::
43 * CASL2LIB Manual::
44 @end menu
45
46 @contents
47
48 @node About, Install, Top, Top
49 @chapter YACASL2の概要
50
51 YACASL2は、UNIX/Linuxのコマンドラインインターフェイスで動作するオープンソースのCASL II処理システムです。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。
52
53 @iftex
54 @cartouche
55 @end iftex
56 @quotation
57 @uref{http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf, 試験で使用する情報処理用語・プログラム言語など(2008年10月版)}[PDFファイル]
58 別紙 1 アセンブラ言語の仕様
59 @end quotation
60 @iftex
61 @end cartouche
62 @end iftex
63
64 YACASL2は、CASL IIアセンブラ言語で記述されたファイルをアセンブルし、仮想マシンCOMET II上で実行します。アセンブルと実行は、連続で行うことも別々に行うことも可能です。
65 YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試験の問題をはじめ各種参考書やサイトに記載されたCASL IIのプログラムをそのままアセンブルして実行できます。また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。
66
67 YACASL2は、「ふつうの処理系」として動作します。ほかの多くのCASL IIエミュレータと違い、デバッガとして動作したり、コンピュータ内部の模式図を表示したりすることはありません。そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。
68
69 @itemize @bullet
70
71 @item
72 ラベルとアドレスの対応
73
74 @item
75 アセンブル結果
76
77 @item
78 実行時のレジスタの内容
79
80 @item
81 実行時のメモリの内容
82 @end itemize
83
84 出力された動作内容は、GNU/Linuxのさまざまなツール、たとえば@kbd{cat}、@kbd{less}、@kbd{grep}、@kbd{wc}などを使って解析できます。
85
86 YACASL2の操作は、端末を開いてコマンドを入力・実行することで行います。
87
88 @unnumberedsec 要件
89 YACASL2は、LinuxやMac OS Xなど、UNIX系のOS上で動作します。現在動作を確認しているのは、次の環境です。
90
91 @itemize @bullet
92
93 @item
94 Ubuntu Linux 10.04
95
96 @item
97 Vine Linux 5.2
98
99 @item
100 Mac OS X 10.6.5
101 @end itemize
102
103 インストール時に、@kbd{tar}、@kbd{gcc}、@kbd{make}が必要です。Linuxの場合は、標準でインストールされていることが多いと思います。Mac OS Xの場合、@code{Xcode}をインストールしてください。
104
105 @node Install, Usage, About, Top
106 @chapter YACASL2のインストール
107 YACASL2をインストールするには、Linux上で次の作業をします。
108
109 @menu
110 * Download::    YACASL2ファイルのダウンロード
111 * Verify::    YACASL2ファイルの検証
112 * Expand::    YACASL2ファイルの展開
113 * Build::    @kbd{casl2}、@kbd{comet2}、@kbd{dumpword}のビルド
114 * Simple Test::    @kbd{casl2}の実行テスト
115 * Detail Test::    詳細なテスト
116 * Environment::    環境変数の設定
117 @end menu
118
119 @node Download, Verify, Install, Install
120 @section YACASL2ファイルのダウンロード
121
122 次の場所から最新版の@file{tar.gz}ファイルをダウンロードします。
123 @iftex
124 @cartouche
125 @end iftex
126 @quotation
127 @uref{http://github.com/j8takagi/YACASL2, GitHub/j8takagi/YACASL2}の@uref{http://github.com/j8takagi/YACASL2/downloads, ダウンロードページ}
128 @end quotation
129 @iftex
130 @end cartouche
131 @end iftex
132
133 続けて、対応する@file{md5sum}ファイルをダウンロードします。
134
135 @node Verify, Expand, Download, Install
136 @section YACASL2ファイルの検証
137
138 ダウンロードが完了したら、@kbd{md5sum}と@kbd{diff}で正しくファイルがダウンロードができているかを検証します。
139
140 @example
141 $ @kbd{md5sum yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -}
142 Files yacasl2.tar.gz.md5sum and - are identical
143 @end example
144
145 @node Expand, Build, Verify, Install
146 @section YACASL2ファイルの展開
147
148 YACASL2ファイルをダウンロードしたら、次のコマンドで展開します。
149
150 @example
151 $ @kbd{tar xvzf yacasl2.tar.gz}
152 @end example
153
154 @node Build, Simple Test, Expand, Install
155 @section @kbd{casl2}、@kbd{comet2}、@kbd{dumpword}のビルド
156
157 展開したら、次のコマンドで@kbd{casl2}、@kbd{comet2}、@kbd{dumpword}をビルドします。
158
159 @example
160 $ @kbd{cd yacasl2}
161 $ @kbd{make}
162 make -C src
163 make[1]: Entering directory ‘/home/kazubito/yacasl2/src’
164 gcc -c -g -Wall -I ../include casl2.c
165 gcc -c -g -Wall -I ../include word.c
166 gcc -c -g -Wall -I ../include hash.c
167 gcc -c -g -Wall -I ../include cerr.c
168 gcc -c -g -Wall -I ../include struct.c
169 gcc -c -g -Wall -I ../include cmd.c
170 gcc -c -g -Wall -I ../include assemble.c
171 gcc -c -g -Wall -I ../include token.c
172 gcc -c -g -Wall -I ../include label.c
173 gcc -c -g -Wall -I ../include macro.c
174 gcc -c -g -Wall -I ../include exec.c
175 gcc -c -g -Wall -I ../include dump.c
176 gcc -g -Wall -I ../include -o ../casl2 casl2.o word.o hash.o cerr.o st
177 ruct.o cmd.o assemble.o token.o label.o macro.o exec.o dump.o
178 gcc -c -g -Wall -I ../include comet2.c
179 gcc -g -Wall -I ../include -o ../comet2 comet2.o word.o hash.o cerr.o
180 struct.o cmd.o exec.o dump.o
181 gcc -c -g -Wall -I ../include dumpword.c
182 gcc -g -Wall -I ../include -o ../dumpword dumpword.o word.o cerr.o
183 make[1]: Leaving directory ‘/home/kazubito/yacasl2/src’
184 @end example
185
186 @node Simple Test, Detail Test, Build, Install
187 @section @kbd{casl2}の実行テスト
188
189 ビルドしたら、次のコマンドが正常に実行できるかを確認します。
190 正常に実行された場合は、「Hello, World!」と表示されます。
191
192 @example
193 $ @kbd{./casl2 as/hello.casl}
194 Hello, World!
195 @end example
196
197 @node Detail Test, Environment, Simple Test, Install
198 @section 詳細なテスト
199
200 次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。
201
202 @example
203 $ @kbd{make check}
204 195 / 195 tests passed. Details in /home/username/yacasl2/test/integra
205 tion/casl2/Test.log
206 All tests are succeded.
207 149 / 149 tests passed. Details in /home/username/yacasl2/test/integra
208 tion/comet2/Test.log
209 All tests are succeded.
210 4 / 4 tests passed. Details in /home/username/yacasl2/test/integration
211 /dumpword/Test.log
212 All tests are succeded.
213 @end example
214
215 @node Environment,  , Detail Test, Install
216 @section 環境変数の設定
217
218 環境変数を設定することで、YACASL2が使いやすくなります。環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されます。
219 するときは、
220 環境変数@code{PATH}にYACASL2のディレクトリを追加すると、どのディレクトリでも@kbd{casl2}、@kbd{comet2}、@kbd{dumpword}を実行できます。また、
221
222
223
224 @unnumberedsubsec シェルの確認
225
226 環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。
227
228 @example
229 $ @kbd{echo $SHELL}
230 /bin/bash
231 @end example
232
233 現在もっとも多く使われているシェルは、BASHでしょう。以下、BASHでの設定方法を記載します。
234
235 @unnumberedsubsec @code{PATH}にYACASL2のディレクトリを追加
236
237 @code{PATH}にYACASL2のディレクトリを追加すると、どのディレクトリでもディレクトリを指定せずに@kbd{casl2}、@kbd{comet2}、@kbd{dumpword}を実行できます。YACASL2をホームディレクトリ@code{~}にインストールしたときは、次のコマンドで設定できます。
238
239 @example
240 $ @kbd{PATH=$PATH:~/yacasl2 && export PATH}
241 @end example
242
243 BASHではホームディレクトリにある@file{.bashrc}が初期設定ファイルです。次のコマンドで追加できます。
244
245 @example
246 $ @kbd{echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc}
247 @end example
248
249
250 @unnumberedsubsec @code{CASL2LIB}の設定
251
252 環境変数@code{CASL2LIB}を設定しておけば、後述するCASL2LIBを利用するときの手間が小さくなります。YACASL2をホームディレクトリ@code{~}にインストールしたときは、次のコマンドで設定できます。
253
254 @example
255 $ @kbd{CASL2LIB=~/yacasl2/as/casl2lib && export CASL2LIB}
256 @end example
257
258 BASHの初期設定ファイル@file{.bashrc}には、次のコマンドで追加できます。
259
260 @example
261 $ @kbd{ echo 'CASL2LIB=~/yacasl2/as/casl2lib && export CASL2LIB' >>~/.bashrc}
262 @end example
263
264
265 @node Usage, Command Manual, Install, Top
266 @chapter YACASL2の使い方
267 YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリの中にある@file{as}ディレクトリからコピーして作成することもできます。
268
269
270 @menu
271 * Simple Output::               実行結果の出力だけを表示
272 * Assemble Result::             アセンブル結果の確認
273 * Register and Memory::         実行時のレジスタとメモリを表示
274 * Only Assemble::               アセンブルと実行を別に行う
275 * Analyze Word::                1語の解析
276 * CASL2lib::                    CASL2LIBマニュアル
277 @end menu
278
279 @node Simple Output, Assemble Result, Usage, Usage
280 @section 実行結果の出力だけを表示
281
282 インストール時にコマンド実行の確認に使った@file{hello.casl}は、次のような内容です。CASL IIのマクロ命令OUTは、文字列を出力します。
283
284 @example
285 $ @kbd{cat hello.casl}
286 MAIN     START
287          OUT     OBUF,LEN
288          RET
289 OBUF     DC      'Hello, World!'
290 LEN      DC      13
291          END
292 @end example
293
294 次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。
295
296 @example
297 $ @kbd{casl2 hello.casl}
298 Hello, World!
299 @end example
300
301 @file{addl.casl}は、3と1の和を求めます。
302
303 @example
304 $ @kbd{cat addl.casl}
305 ;;; ADDL r,adr
306 MAIN     START
307          LD      GR1,A
308          ADDL    GR1,B
309          RET
310 A        DC      3
311 B        DC      1
312          END
313 @end example
314
315 このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。
316
317 @example
318 $ @kbd{casl2 addl.casl}
319 $
320 @end example
321
322 実行内容を確認するには、後述のようにCPU 内にあるレジスタやメモリの内容を表示するか、結果を出力するための処理を追加する必要があります。
323
324 @node Assemble Result, Register and Memory, Simple Output, Usage
325 @section アセンブル結果の確認
326
327 casl2の処理途中で行われるアセンブルの結果を表示するには、オプション@option{-a}を指定します。また、ラベルとアドレスの対応表を表示するには、オプション@option{-l}を指定します。
328
329 次のコマンドでは@file{hello.casl}の、ラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。
330
331 @example
332 $ @kbd{casl2 -a -l hello.casl}
333
334 Assemble hello.casl (0)
335
336 Label::::
337 MAIN.LEN ---> #0020
338 MAIN ---> #0000
339 MAIN.OBUF ---> #0013
340
341 Assemble hello.casl (1)
342 hello.casl:    1:MAIN    START
343 hello.casl:    2:        OUT     OBUF,LEN
344     #0000   #7001
345     #0001   #0000
346     #0002   #7002
347     #0003   #0000
348     #0004   #1210
349     #0005   #0013
350     #0006   #1220
351     #0007   #0020
352     #0008   #F000
353     #0009   #0002
354     #000A   #1210
355     #000B   #0021
356     #0021   #000A
357     #000C   #1220
358     #000D   #0022
359     #0022   #0001
360     #000E   #F000
361     #000F   #0002
362     #0010   #7120
363     #0011   #7110
364 hello.casl:    3:        RET
365     #0012   #8100
366 hello.casl:    4:OBUF    DC      'Hello, World!'
367     #0013   #0048
368     #0014   #0065
369     #0015   #006C
370     #0016   #006C
371     #0017   #006F
372     #0018   #002C
373     #0019   #0020
374     #001A   #0057
375     #001B   #006F
376     #001C   #0072
377     #001D   #006C
378     #001E   #0064
379     #001F   #0021
380 hello.casl:    5:LEN     DC      13
381     #0020   #000D
382 hello.casl:    6:        END
383 Hello, World!
384 @end example
385
386 @file{addl.casl}の、ラベルとアドレスの対応表と、アセンブル結果は、次のようになります。
387
388 @example
389 $ @kbd{casl2 -a -l addl.casl}
390
391 Assemble addl.casl (0)
392
393 Label::::
394 MAIN.A ---> #0005
395 MAIN.B ---> #0006
396 MAIN ---> #0000
397
398 Assemble addl.casl (1)
399 addl.casl:    1:;;; ADDL r,adr
400 addl.casl:    2:MAIN    START
401 addl.casl:    3:        LD      GR1,A
402     #0000   #1010
403     #0001   #0005
404 addl.casl:    4:        ADDL    GR1,B
405     #0002   #2210
406     #0003   #0006
407 addl.casl:    5:        RET
408     #0004   #8100
409 addl.casl:    6:A       DC      3
410     #0005   #0003
411 addl.casl:    7:B       DC      1
412     #0006   #0001
413 addl.casl:    8:        END
414 @end example
415
416 なお、オプション@option{-A}を指定すると、アセンブル結果が表示される時点で処理が終了します。仮想マシンCOMET II での実行は行われません。
417
418 @node Register and Memory, Only Assemble, Assemble Result, Usage
419 @section 実行時のレジスタとメモリを表示
420
421 YACASL2では実行中のCPUのレジスタとメモリの内容をそれぞれ、@option{-t}と@option{-d}を指定することで表示できます。
422
423 また、@option{-M}で、仮想マシンCOMET II のメモリ容量を語(16 ビット)単位で指定できます。小さいプログラムを実行するときは、メモリ容量を小さくすれば結果が見やすくなります。
424
425 @menu
426 * Register Specify::            特定のレジスタを表示
427 * Ending Value::                プログラム終了時の値を表示
428 * Step Count::                  プログラムのステップ数を表示
429 @end menu
430
431 @file{addl.casl}に必要なメモリ容量は8語のため、次のようにCPUのレジスタとメモリの内容を表示できます。
432
433 @example
434 $ @kbd{casl2 -t -d -M8 addl.casl | less}
435
436 Assemble addl.casl (0)
437
438 Assemble addl.casl (1)
439
440 Executing machine codes
441 #0000: Register::::
442 #0000: GR0:      0 = #0000 = 0000000000000000
443 #0000: GR1:      0 = #0000 = 0000000000000000
444 #0000: GR2:      0 = #0000 = 0000000000000000
445 #0000: GR3:      0 = #0000 = 0000000000000000
446 #0000: GR4:      0 = #0000 = 0000000000000000
447 #0000: GR5:      0 = #0000 = 0000000000000000
448 #0000: GR6:      0 = #0000 = 0000000000000000
449 #0000: GR7:      0 = #0000 = 0000000000000000
450 #0000: SP:       8 = #0008 = 0000000000001000
451 #0000: PR:       0 = #0000 = 0000000000000000
452 #0000: FR (OF SF ZF): 000
453 #0000: Memory::::
454 #0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007
455 #0000: 0000: 1010 0005 2210 0006 8100 0003 0001 0000 
456 #0002: Register::::
457 #0002: GR0:      0 = #0000 = 0000000000000000
458 #0002: GR1:      3 = #0003 = 0000000000000011
459 #0002: GR2:      0 = #0000 = 0000000000000000
460 #0002: GR3:      0 = #0000 = 0000000000000000
461 #0002: GR4:      0 = #0000 = 0000000000000000
462 #0002: GR5:      0 = #0000 = 0000000000000000
463 #0002: GR6:      0 = #0000 = 0000000000000000
464 #0002: GR7:      0 = #0000 = 0000000000000000
465 #0002: SP:       8 = #0008 = 0000000000001000
466 #0002: PR:       2 = #0002 = 0000000000000010
467 #0002: FR (OF SF ZF): 000
468 #0002: Memory::::
469 #0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007
470 #0002: 0000: 1010 0005 2210 0006 8100 0003 0001 0000 
471 #0004: Register::::
472 #0004: GR0:      0 = #0000 = 0000000000000000
473 #0004: GR1:      4 = #0004 = 0000000000000100
474 #0004: GR2:      0 = #0000 = 0000000000000000
475 #0004: GR3:      0 = #0000 = 0000000000000000
476 #0004: GR4:      0 = #0000 = 0000000000000000
477 #0004: GR5:      0 = #0000 = 0000000000000000
478 #0004: GR6:      0 = #0000 = 0000000000000000
479 #0004: GR7:      0 = #0000 = 0000000000000000
480 #0004: SP:       8 = #0008 = 0000000000001000
481 #0004: PR:       4 = #0004 = 0000000000000100
482 #0004: FR (OF SF ZF): 000
483 #0004: Memory::::
484 #0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007
485 #0004: 0000: 1010 0005 2210 0006 8100 0003 0001 0000 
486 @end example
487
488 @node Register Specify, Ending Value, Register and Memory, Register and Memory
489 @subsection 特定のレジスタを表示
490
491 @file{addl.casl}のレジスタやメモリの中で、実行中に値が変化しているのはGR1だけです。こうした場合は、@kbd{grep}を使って表示される内容を絞り込むことで動作を検証しやすくなります。
492
493 @example
494 $ @kbd{casl2 -t addl.casl | grep 'GR1:'}
495 #0000: GR1:      0 = #0000 = 0000000000000000
496 #0002: GR1:      3 = #0003 = 0000000000000011
497 #0004: GR1:      4 = #0004 = 0000000000000100
498 @end example
499
500 この内容を、先に出力したアセンブル結果と引き比べてください。
501 次の表のように、PRとGR1、命令行が対応していることがわかります。
502
503 @multitable @columnfractions .3 .3 .4
504 @item PR @tab GR1 @tab 命令行
505 @item #0000
506 @tab #0000
507 @item #0002
508 @tab #0003
509 @tab @code{LD GR1,A}
510 @item #0004
511 @tab #0004
512 @tab @code{ADDL GR1,B}
513 @end multitable
514
515 @node Ending Value, Step Count, Register Specify, Register and Memory
516 @subsection プログラム終了時の値を表示
517
518 @kbd{grep}と@kbd{tail}を組み合わせれば、プログラム終了時の値を表示できます。
519
520 @file{addl.casl}でプログラム終了時の値を確認するには、次のようにします。
521
522 @example
523 $ @kbd{casl2 -t addl.casl | grep 'GR1:' | tail -1}
524 #0004: GR1:      4 = #0004 = 0000000000000100
525 @end example
526
527 @file{sum_10.casl}は、1から10までの整数の和を求めます。
528
529 @example
530 $ @kbd{cat sum_10.casl}
531 ;;; sum_10.casl
532 ;;; 出力 GR0: 1から10までの整数をすべて加算した値
533 MAIN    START
534         PUSH    0,GR1
535         LAD     GR0,0           ; GR0を初期化
536         LD      GR1,FST         ; GR1に初項を転送
537 LOOP    ADDL    GR0,GR1         ; ループ先頭
538         ADDL    GR1,STEP        ; GR1 <- GR1 + 公差
539         CPL     GR1,LST         ; GR1が末項より大きい場合は終了
540         JPL     FIN             ; ↓
541         JUMP    LOOP            ; ループ終端
542 FIN     POP     GR1
543         RET
544 FST     DC      1               ; 初項
545 LST     DC      10              ; 末項
546 STEP    DC      1               ; 公差
547         END
548 @end example
549
550 @file{sum_10.casl}でファイル終了時の値を確認するには、次のようにします。
551
552 @example
553 $ @kbd{casl2 -t sum_10.casl | grep 'GR0:' | tail -1}
554 #0010: GR0:     55 = #0037 = 0000000000110111 = '7'
555 @end example
556
557 @node Step Count,  , Ending Value, Register and Memory
558 @subsection プログラムのステップ数を表示
559
560 @kbd{grep}と@kbd{wc}を組み合わせれば、プログラムのステップ数を表示できます。
561
562 @example
563 $ @kbd{casl2 -t hello.casl | grep 'GR1:' | wc -l}
564 11
565 @end example
566
567 @example
568 $ @kbd{casl2 -t addl.casl | grep 'GR1:' | wc -l}
569 3
570 @end example
571
572 @file{sum_10.casl}はプログラム内にループがあるため、ステップ数が大きくなります。
573
574 @example
575 $ @kbd{casl2 -t sum_10.casl | grep 'GR0:' | wc -l}
576 54
577 @end example
578
579 @node Only Assemble, Analyze Word, Register and Memory, Usage
580 @section アセンブルと実行を別に行う
581
582 @kbd{casl2}に@option{-O}@file{ファイル名}を指定すると、オブジェクトファイルを作成できます。
583
584 @example
585 $ @kbd{casl2 -Ohello.o hello.casl}
586 @end example
587
588 作成されたオブジェクトファイルの内容は、@kbd{od}を使って確認できます。テキストファイルではないため、@kbd{cat}などでは確認できません。
589
590 @example
591 $ @kbd{od -t x2 hello.o}
592 0000000 7001 0000 7002 0000 1210 0013 1220 0020
593 0000020 f000 0002 1210 0021 1220 0022 f000 0002
594 0000040 7120 7110 8100 0048 0065 006c 006c 006f
595 0000060 002c 0020 0057 006f 0072 006c 0064 0021
596 0000100 000d 000a 0001
597 0000106
598 @end example
599
600 オブジェクトファイルの実行には、@kbd{comet2}を使います。
601
602 @example
603 $ @kbd{comet2 hello.o}
604 Hello, World!
605 @end example
606
607 @node Analyze Word, CASL2lib, Only Assemble, Usage
608 @section 1語の解析
609
610 CASL IIでは、1語(16ビット)を単位としてデータが処理されます。
611 @kbd{dumpword}は、指定した1語を10進数、16進数、2進数で表示します。
612
613 @example
614 $ @kbd{dumpword 72}
615     72:     72 = #0048 = 0000000001001000 = 'H'
616 @end example
617
618 マイナスの数は、次のように@kbd{--}を付けて指定します。
619
620 @example
621 $ @kbd{dumpword -- -72}
622    -72:    -72 = #FFB8 = 1111111110111000
623 @end example
624
625 16進数は、次のように次のように@kbd{'}で囲み@kbd{#}を付けて指定します。
626
627 @example
628 $ @kbd{dumpword '#0048'}
629  #0048:     72 = #0048 = 0000000001001000 = 'H'
630 @end example
631
632 @node CASL2lib,  , Analyze Word, Usage
633 @section CASL2ライブラリの使用
634
635 YACASL2の@file{as/casl2lib}ディレクトリには、CASL IIで記述されたライブラリファイルが格納されています。
636
637 このフォルダには、たとえば次のようなプログラムが含まれています。
638
639 @table @option
640 @item OUTL
641 @file{outl.casl}。GR1に格納された値を、0〜65535の数値として出力します。
642
643 @item OUTA
644 @file{outa.casl}。GR1に格納された値を、-32767〜32767の数値として出力します。
645
646 @item MULL
647 @file{mull.casl}。GR1とGR2に格納された値を0〜65535の整数と見なし、積をGR3に格納します。
648
649 @item DIVL
650 @file{divl.casl}。GR1とGR2に格納された値を0〜65535の整数と見なし、商をGR3、剰余をGR0に格納します。
651 @end table
652
653 @subsection 数値を出力する
654
655 3と1の和を求める@file{addl.casl}で演算結果を出力するには、まず@file{addl.casl}を編集します。CASL IIの@kbd{CALL}命令で@kbd{OUTL}を副プログラムとして呼び出します。
656
657 @example
658 $ @kbd{cat addl_outl.casl}
659 MAIN    START
660         LD      GR1,A
661         ADDL    GR1,B
662         @emph{CALL    OUTL}
663         RET
664 A       DC      3
665 B       DC      1
666         END
667 @end example
668
669 変更したら@kbd{casl2}を、複数のファイルを指定して実行します。
670
671 @example
672 $ @kbd{casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl}
673 4
674 @end example
675
676 @node Command Manual, CASL2LIB Manual, Usage, Top
677 @chapter YACASL2コマンドマニュアル
678
679 @cindex YACASL2コマンドマニュアル
680
681 YACASL2のコマンドとオプションについて解説します。
682
683 @menu
684 * casl2::
685 * comet2::
686 * dumpword::
687 @end menu
688
689 @node casl2, comet2, Command Manual, Command Manual
690 @section @kbd{casl2}
691
692 @pindex casl2
693 @cindex casl2
694
695 @kbd{casl2}は、引数として指定されたCASLファイルをアセンブルし、仮想マシンCOMET II上で実行します。CASLファイルは、アセンブラ言語CASL IIで記述されたテキストファイルです。引数が指定されない場合は、エラーメッセージを表示して終了します。
696
697 @example
698 $ @kbd{casl2 hello.casl}
699 @end example
700
701 複数のCASLファイルを指定することで、副プログラムを呼び出せます。
702
703 @example
704 $ @kbd{casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl}
705 @end example
706
707 @unnumberedsubsec オプション
708
709 @kbd{casl2}は、次のオプションを指定できます。
710
711 @table @option
712 @item -s
713 @itemx --source
714 CASLファイルの内容を表示します。
715
716 @item -l
717 @itemx --label
718 ラベルの一覧を次の形式で表示します。表示後、ほかの作業を続行します。
719
720 @example
721 <プログラム名>.<ラベル名> ---> <アドレスの16進数表現>
722 @end example
723
724 @item -L
725 @itemx --labelonly
726 @option{-l}と同じ形式でラベルの一覧を表示します。表示後、ほかの作業は続行せず、終了します。
727
728 @item -a
729 @itemx --assembledetail
730 アセンブル詳細結果を表示し、ほかの作業を続行します。
731
732 @item -A
733 @itemx --assembledetailonly
734 アセンブル詳細結果を表示して終了します。
735
736 @item -o<OBJECTFILE>
737 @itemx --assembleout<OBJECTFILE>
738 アセンブル結果をオブジェクトファイル@file{<OBJECTFILE>}に出力し、ほかの作業を続行します。出力されたオブジェクトファイルは、@kbd{comet2}で実行できます。オブジェクトファイルを指定しない場合、出力先は@file{a.o}です。オブジェクトファイルは1つだけ指定できます。
739
740 @item -O[<OBJECTFILE>]
741 @itemx --assembleoutonly[<OBJECTFILE>]
742 アセンブル結果をオブジェクトファイル@file{<OBJECTFILE>}に出力し、終了します。出力されたオブジェクトファイルは、@kbd{comet2}で実行できます。オブジェクトファイルを指定しない場合、出力先は@file{a.o}です。オブジェクトファイルは1つだけ指定できます。
743
744 @item -t
745 @itemx --trace
746 @itemx --tracearithmetic
747 プログラム実行中のレジスタの値を次の形式で表示します。
748
749 @example
750 <PR値の16進数表現>: <レジスタ>: <値の10進数表現> =
751 <値の16進数表現> = <値の2進数表現>[ ='文字']
752 @end example
753
754 @itemize
755 @item
756 @code{<PR値の16進数表現>}と@code{<レジスタ>}、@code{<値の16進数表現>}は、4けたの16進数で表されます。@code{<PR値の16進数表現>}と@code{<値の16進数表現>}には、先頭に@code{#}が付きます。範囲は@code{#0000}から@code{#FFFF}です
757
758 @item
759 @code{<値の10進数表現>}は符号の付いた10進数です。範囲は-32768から32767です。
760
761 @item
762 @code{<値の2進数表現>}は、16けたの2進数で表されます。範囲は、@code{0000000000000000}から@code{1111111111111111}です
763
764 @item
765 @code{[ ='文字']}は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。
766 @end itemize
767
768 表示されるレジスタには、次の種類があります。
769
770 @table @code
771 @item GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7
772 汎用レジスタ
773
774 @item SP
775 スタックポインタ
776
777 @item PR
778 プログラムレジスタ
779
780 @item FR
781 フラグレジスタ
782 @end table
783
784 例えば、次のように表示されます。
785
786 @example
787 #0002: GR1:      3 = #0003 = 0000000000000011
788 @end example
789
790 @item -T
791 @itemx --tracelogical
792 @option{-t}と同じように、プログラム実行中のレジスタの値を表示します。ただし、@option{-t}と異なり、@code{<値の10進数表現>}は符号の付かない10進数です。値の範囲は0から65535です。
793
794 @item -d
795 @itemx --dump
796 メモリの内容をすべて表示します。
797
798 @item -M <MEMORYSIZE>
799 @itemx --memorysize <MEMORYSIZE>
800 アセンブルおよび実行時のメモリサイズ@option{<MEMORYSIZE>}を0から65535の範囲で指定します。指定しない場合、512です。
801
802 @item -C <CLOCKS>
803 @itemx --clocks <CLOCKS>
804 実行時のクロック周波数@option{<CLOCKS>}を0より大きい整数で指定します。指定しない場合、クロック周波数は5000000です。
805
806 @item -h
807 @itemx --help
808 @kbd{casl2}の使用方法を表示して終了します。
809 @end table
810
811 @node comet2, dumpword, casl2, Command Manual
812 @section @kbd{comet2}
813
814 @pindex comet2
815 @cindex comet2
816
817 @kbd{comet2}は、引数として指定されたオブジェクトファイルを仮想マシンCOMET II上で実行します。オブジェクトファイルは、@kbd{casl}に@option{-o}または@option{-O}を指定して出力します。
818
819 @example
820 $ @kbd{comet2 hello.o}
821 @end example
822
823 引数で指定できるオブジェクトファイルは1つだけです。引数が指定されない場合は、エラーメッセージを表示して終了します。複数の引数を指定した場合、2番目以降の引数は無視されます。
824
825 @unnumberedsubsec オプション
826
827 @kbd{comet2}は、次のオプションを指定できます。
828
829 @table @option
830
831 @item -t
832 @itemx --trace
833 @itemx --tracearithmetic
834 プログラム実行中のレジスタの値を次の形式で表示します。@code{<値の10進数表現>}は符号の付いた10進数です。範囲は-32768から32767です。
835
836 @example
837 <PR値の16進数表現>: <レジスタ>: <値の10進数表現> = <値の16進数表現> = <値の2進数表現>[ ='文字']
838 @end example
839
840 @itemize
841 @item
842 @code{<PR値の16進数表現>}と@code{<値の16進数表現>}は、先頭に@code{#}が付いた4けたの16進数で表されます。範囲は、@code{#0000}から@code{#FFFF}です
843
844 @item
845 @code{<値の2進数表現>}は、16けたの2進数で表されます。範囲は、@code{0000000000000000}から@code{1111111111111111}です
846
847 @item
848 @code{[ ='文字']}は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。
849 @end itemize
850
851 例えば、次のように表示されます。
852
853 @example
854 #0002: GR1:      3 = #0003 = 0000000000000011
855 @end example
856
857 表示されるレジスタには、次の種類があります。
858
859 @table @code
860 @item GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7
861 汎用レジスタ
862
863 @item SP
864 スタックポインタ
865
866 @item PR
867 プログラムレジスタ
868
869 @item FR
870 フラグレジスタ
871 @end table
872
873 @item -T
874 @itemx --tracelogical
875 @option{-t}と同じように、プログラム実行中のレジスタの値を表示します。ただし、@option{-t}と異なり、@code{<値の10進数表現>}は符号の付かない10進数です。値の範囲は0から65535です。
876
877 @item -d
878 @itemx --dump
879 メモリの内容をすべて表示します。
880
881 @item -M <MEMORYSIZE>
882 @itemx --memorysize <MEMORYSIZE>
883 実行時のメモリサイズ@option{<MEMORYSIZE>}を0から65535の範囲で指定します。指定しない場合、512です。
884
885 @item -C <CLOCKS>
886 @itemx --clocks <CLOCKS>
887 実行時のクロック周波数@option{<CLOCKS>}を0より大きい整数で指定します。指定しない場合、5000000です。
888
889 @item -h
890 @itemx --help
891 @kbd{comet2}の使用方法を表示して終了します。
892 @end table
893
894 @node dumpword,  , comet2, Command Manual
895 @section @kbd{dumpword}
896
897 @pindex dumpword
898 @cindex dumpword
899
900 @kbd{dumpword}は、引数として指定された数値を、整数、#0000〜#FFFFの範囲の16進数、2進数で表示します。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。引数は、10進数または先頭に「#」の付いた16進数で指定します。表示される整数は、オプションにより符号付きか符号なしかを指定します。オプションなしの場合は符号付きです。整数の範囲は、符号付きの場合は-32768から32767、符号なしの場合は0から65535です。
901
902 @example
903 $ @kbd{dumpword 10}
904 @end example
905
906 引数で指定できる1つだけです。引数が指定されない場合は、使い方を表示して終了します。複数の引数を指定した場合、2番目以降の引数は無視されます。
907
908 @unnumberedsubsec オプション
909
910 @kbd{dumpword}は、次のオプションを指定できます。
911
912 @table @option
913
914 @item -a
915 @itemx --arithmetic
916 出力される整数の範囲を-32,768〜32,767にします。オプションなしの場合と同じです。
917
918 @item -l
919 @itemx --logical
920 出力される整数の範囲を0〜65,535にします。
921
922 @item -h
923 @itemx --help
924 @kbd{dumpword}の使用方法を表示して終了します。
925 @end table
926
927 @node CASL2LIB Manual,  , Command Manual, Top
928 @chapter CASL2LIBマニュアル
929
930 @menu
931 * ABS::
932 * DIVA::
933 * DIVL::
934 * INL::
935 * L2STR::
936 * MAX::
937 * MINIM::
938 * MULA::
939 * MULL::
940 * OUTA::
941 * OUTB::
942 * OUTD_Q15::
943 * OUTL::
944 * REV::
945 * STR2L::
946 @end menu
947
948 @node ABS, DIVA, CASL2LIB Manual, CASL2LIB Manual
949 @section @kbd{ABS} - @file{abs.casl}
950 GR1を符号付き整数とみなし、絶対値に変換
951
952 @unnumberedsubsec 入力
953 @table @code
954 @item GR1
955 符号付き整数
956 @end table
957
958 @unnumberedsubsec 出力
959 @table @code
960 @item GR1
961 入力された値の絶対値
962
963 @item OF
964 入力された値が-32768の場合、1
965
966 @item SF
967 入力された値が負数(-32767から-1)の場合、1
968 @end table
969
970 @unnumberedsubsec 依存する副プログラム
971 なし
972
973 @unnumberedsubsec 使用例
974 @example
975 @verbatiminclude casl2lib/abs/call_abs.casl
976 @end example
977
978 @example
979 $ @kbd{casl2 call_abs.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/outa.casl \
980   $CASL2LIBDIR/divl.casl $CASL2LIBDIR/rev.casl}
981 1
982 @end example
983
984 @node DIVA, DIVL, ABS, CASL2LIB Manual
985 @section @kbd{DIVA} - @file{diva.casl}
986 符号付き整数の割算を筆算方式で行う
987
988 @unnumberedsubsec 入力
989 @table @code
990 @item GR1
991 被除数
992
993 @item GR2
994 除数
995 @end table
996
997 @unnumberedsubsec 出力
998 @table @code
999 @item GR0
1000
1001
1002 @item GR3
1003 剰余
1004
1005 @item OF
1006 次の場合、1
1007 @itemize
1008 @item
1009 GR2が0
1010
1011 @item
1012 GR1が-32768
1013
1014 @item
1015 GR2が-32768
1016 @end itemize
1017
1018 @item SF
1019 商が負数(-32767から-1)の場合、1
1020
1021 @item ZF
1022 商が0の場合、1
1023 @end table
1024
1025 @unnumberedsubsec 依存する副プログラム
1026 @itemize
1027 @item @code{DIVL}
1028 @end itemize
1029
1030 @unnumberedsubsec 使用例
1031 @example
1032 @verbatiminclude casl2lib/diva/call_diva.casl
1033 @end example
1034
1035 @example
1036 $ @kbd{casl2 call_diva.casl $CASL2LIBDIR/diva.casl $CASL2LIBDIR/divl.casl \
1037   $CASL2LIBDIR/outa.casl $CASL2LIBDIR/abs.casl $CASL2LIBDIR/rev.casl}
1038 -128
1039 -127
1040 @end example
1041
1042 @node DIVL, INL, DIVA, CASL2LIB Manual
1043 @section @kbd{DIVL} - @file{divl.casl}
1044 符号なし整数の割算を筆算方式で行う
1045
1046 @unnumberedsubsec 入力
1047 @table @code
1048 @item GR1
1049 被除数
1050
1051 @item GR2
1052 除数
1053 @end table
1054
1055 @unnumberedsubsec 出力
1056 @table @code
1057 @item GR0
1058
1059
1060 @item GR3
1061 剰余
1062
1063 @item OF
1064 GR2が0の場合、1
1065
1066 @item SF
1067 商が32768から65535の場合、1
1068
1069 @item ZF
1070 商が0の場合、1
1071 @end table
1072
1073 @unnumberedsubsec 依存する副プログラム
1074 なし
1075
1076 @unnumberedsubsec 使用例
1077 @example
1078 @verbatiminclude casl2lib/divl/call_divl.casl
1079 @end example
1080
1081 @example
1082 $ @kbd{casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl \
1083   $CASL2LIBDIR/rev.casl}
1084 256
1085 254
1086 @end example
1087
1088 @node INL, L2STR, DIVL, CASL2LIB Manual
1089 @section @kbd{INL} - @file{inl.casl}
1090
1091 符号なし整数の入力を受け付ける
1092
1093 @unnumberedsubsec 入力
1094 @table @code
1095 @item 標準入力
1096 符号なし整数
1097 @end table
1098
1099 @unnumberedsubsec 出力
1100 @table @code
1101 @item GR1
1102 入力された符号なし整数
1103
1104 @item GR0
1105 文字列の長さ。数字以外が入力された場合は@code{#FFFF}
1106 @end table
1107
1108 @unnumberedsubsec 依存する副プログラム
1109 @itemize
1110 @item
1111 @code{STR2L}
1112 @end itemize
1113
1114 @unnumberedsubsec 使用例
1115 @example
1116 @verbatiminclude casl2lib/divl/call_divl.casl
1117 @end example
1118
1119 @example
1120 $ @kbd{casl2 call_divl.casl $CASL2LIBDIR/divl.casl $CASL2LIBDIR/outl.casl \
1121   $CASL2LIBDIR/rev.casl}
1122 256
1123 254
1124 @end example
1125
1126 @node L2STR, MAX, INL, CASL2LIB Manual
1127 @section @kbd{L2STR} - @file{l2str.casl}
1128
1129 @node MAX, MINIM, L2STR, CASL2LIB Manual
1130 @section @kbd{MAX} - @file{max.casl}
1131
1132 @node MINIM, MULA, MAX, CASL2LIB Manual
1133 @section @kbd{MINIM} - @file{minim.casl}
1134
1135 @node MULA, MULL, MINIM, CASL2LIB Manual
1136 @section @kbd{MULA} - @file{mula.casl}
1137
1138 @node MULL, OUTA, MULA, CASL2LIB Manual
1139 @section @kbd{MULL} - @file{mull.casl}
1140
1141 @node OUTA, OUTB, MULL, CASL2LIB Manual
1142 @section @kbd{OUTA} - @file{outa.casl}
1143
1144 @node OUTB, OUTD_Q15, OUTA, CASL2LIB Manual
1145 @section @kbd{OUTB} - @file{outb.casl}
1146
1147 @node OUTD_Q15, OUTL, OUTB, CASL2LIB Manual
1148 @section @kbd{OUTD_Q15} - @file{outd_q15.casl}
1149
1150 @node OUTL, REV, OUTD_Q15, CASL2LIB Manual
1151 @section @kbd{OUTL} - @file{outl.casl}
1152
1153 @node REV, STR2L, OUTL, CASL2LIB Manual
1154 @section @kbd{REV} - @file{rev.casl}
1155
1156 @node STR2L,  , REV, CASL2LIB Manual
1157 @section @kbd{STR2L} - @file{str2l.casl}
1158
1159 @bye