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