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