ものすごーく久しぶりに――具体的には6年ぶりぐらいに――偽アセンブラであるCASL IIを触ってみようと思い立ったのだけど、WindowsはともかくLinux上で使えそうなシミュレータがなかなか見当たらない。
「Linux CASL」等でググってもIPAのサイトで公開されているCASL IIシミュレータ(以下、JavaCASL2)しか引っかからない。Javaで実装されているので動くには動くけど*1、実際にLinux上で環境を構築して動かした云々のネタは見つからない。なのでドキュメント片手に自分で環境構築しようとしたら、付属のドキュメントもサンプルもイマイチで、一見して参考になるようで結構当てにならない*2。
そんなことがあったのでメモを残しておこうと思う。まあJavaCASL2をLinux上で使う人なんて基本的に物好き以外の何者でもないので、ある程度分かっている人向けの内容となっている。
後のほうでWindows XPでの環境構築の話も書いているけど、他にグラフィカルなシミュレータが色々あるなかでJavaCASL2を使う人なんてコマンドプロンプト大好きな物好き以外の何者でもないので、やはりある程度分かっている人向けの内容となっている。
Ubuntuでの環境構築 その1
JavaCASL2はIPAのサイトで公開されている。IPAの情報処理技術者試験のページから辿っていけば見つかるはず。このエントリを書いている時点ではZIP書庫と自己解凍書庫の2つが存在する。
ZIP書庫の中身はこんな感じ。解凍ツールによっては、空ディレクトリの中で解凍するようにしないとカレントディレクトリに中身がぶちまけられてしまうので注意。
javaCASL2_2.0 | casl2.jar | Readme.pdf | readme.txt | run.jar | +---TestProgram CASL2.bat count1.cas ExplanatoryNote.txt extern.cas gsub1.cas gsub11.cas gsub2.cas Javas.bat RUN.bat sample1.cas sample2.cas sample3.cas sample4.cas smain.cas
今回は$HOME直下にディレクトリjavaCASL2_2.0を作成し、その中に書庫の中身を展開した。
実際に動かすには、展開したファイル中のcasl2.jarとrun.jarを使う。手順はこんな感じ:
- casl2.jarを使ってCASL IIのソースファイルをオブジェクトファイルに変換する。
- run.jarを使ってオブジェクトファイルを実行する。
付属のサンプルコードは動作確認に使うには微妙だったので、ハローワールドを用意してみた。
; hello.cas MAIN START OUT MSG,LEN RET MSG DC 'hello, world' LEN DC 12 END
まずはこのhello.casをオブジェクトファイルに変換する。
java -jar ~/javaCASL2_2.0/casl2.jar hello.cas
するとhello.objという名前でオブジェクトファイルが生成されるので、これを実行する。
java -jar ~/javaCASL2_2.0/run.jar hello.obj
Ubuntu 10.04のopenjdk-6-jreで動作した。但し、run.jarには実行時に指定したラベル名のサブルーチンが見つからなかった場合に外部のオブジェクトファイルの中を探す機能があるのだけど、うまく動作しなかった。Windows XPのJRE 1.6.0_30では機能しているので、JREの違いかOSの違い*3に起因するとは思うものの、面倒なので調べてはいない。
他のJREでは試していない。
Ubuntuでの環境構築 その2
毎回JARを指定して実行するのは面倒だ。実際、付属のファイルにはラッパー用のバッチファイルもあったりする。
もう一つ不便なことに、casl2.jarやrun.jarにはヘルプ表示のオプションが存在しないようだ。なので付属のドキュメントReadme.pdfを参照しなくてはならない。
そこで引数無しか引数が `-h' ないし `--help' の場合に簡単なオプションの説明を表示するようなラッパーのシェルスクリプトを用意してみた。
まずはcasl2.jarのラッパー。
#!/bin/sh # cas.sh readonly JC2DIR=$HOME/javaCASL2_2.0 usage() { cat <<- EOT > "$1" assemble CASL2 source file (using JavaCASL2) usage: `basename $0` <src-file> [dst-name] [option] option: -L show label information -S show source list -A show source list with object information (same as \`-L -S') EOT } if [ $# -eq 0 -o $# -gt 5 ]; then usage /dev/stderr exit 1 fi if [ $# -eq 1 ]; then case "$1" in -h | --help ) usage /dev/stdout exit 0 ;; esac fi java -jar $JC2DIR/casl2.jar "$@"
そしてrun.jarのラッパー。
#!/bin/sh # cr.sh readonly JC2DIR=$HOME/javaCASL2_2.0 usage() { cat <<- EOT > "$1" execute CASL2 object file (using JavaCASL2) usage: `basename $0` <obj-file> [option] option: -L show program dump after loading -M show program map -T execute with system trace -S step mode -Bxxxx break at xxxx and start debug mode debug command: Bxxxx set break point at address xxxx E exit program G[xxxx] run from address xxxx, or continue M[xxxx[,yyyy]] show memory dump from xxxx to yyyy (or all) R show register information Sxxxx[=yyyy] set value yyyy to address xxxx EOT } if [ $# -eq 0 -o $# -gt 6 ]; then usage /dev/stderr exit 1 fi if [ $# -eq 1 ]; then case "$1" in -h | --help ) usage /dev/stdout exit 0 ;; esac fi java -jar $JC2DIR/run.jar "$@"
どちらもヘルプの英語は無茶苦茶だと思う。
これでアセンブル && 実行の手順はこうなる。
./cas.sh hello.cas ./cr.sh hello.obj
私の環境では$HOME/binにPATHを通してあるので、恒久的に使うのならこのスクリプトを$HOME/binに放り込んでおくと思う。
Windows XPの場合
Windowsでの環境構築方法はJavaCASL2付属のドキュメントに書かれているものの、次のようなツッコミ所がある。
- ファイルの配置先の指定がJ2SDK 1.4.2_06ベッタリ。というかJDKのインストール先フォルダにファイルをコピーするの?
- そもそも実行するだけなのだからJREで十分なはずなのに、なぜJDK?
- 途中で出てくるjavas.batってどこで使うの? 何の為にどこで使うかは何となく想像がつくけど、ドキュメントには書いてないよね……。
この辺りを変更した手順はこんな感じ。
- JREをインストールしておく。現時点ではJRE 6が無難。
- JavaCASL2の書庫を展開する。以下の例ではフォルダC:\javaCASL2_2.0を作成し、その中に展開している。
- ラッパーのバッチファイルとしてcas.batとcr.batを用意し、どこか適当なPATHの通ったフォルダに置いておく。
- cas.batでオブジェクトファイルを生成し、cr.batで実行。もちろんコマンドプロンプトで*4。
cas.batとcr.batはこんな感じ。
@echo off setlocal :: cas.bat set JC2DIR=C:\javaCASL2_2.0\ if "%1" == "" ( goto HELPMSG ) if "%1" == "/?" ( goto HELPMSG ) java -jar "%JC2DIR%casl2.jar" %* exit /b %ERRORLEVEL% :HELPMSG ( echo assemble CASL2 source file ^(using JavaCASL2^) echo usage: %~nx0 ^<src-file^> [dst-name] [option] echo option: echo -L show label information echo -S show source list echo -A show source list with object information ^(same as `-L -S'^) ) 1>&2 exit /b 1
@echo off setlocal :: cr.bat set JC2DIR=C:\javaCASL2_2.0\ if "%1" == "" ( goto HELPMSG ) if "%1" == "/?" ( goto HELPMSG ) java -jar "%JC2DIR%run.jar" %* exit /b %ERRORLEVEL% :HELPMSG ( echo execute CASL2 object file ^(using JavaCASL2^) echo usage: %~nx0 ^<obj-file^> [option] echo option: echo -L show program dump after loading echo -M show program map echo -T execute with system trace echo -S step mode echo -Bxxxx break at xxxx and start debug mode echo debug command: echo Bxxxx set break point at address xxxx echo E exit program echo G[xxxx] run from address xxxx, or continue echo M[xxxx[,yyyy]] show memory dump from xxxx to yyyy ^(or all^) echo R show register information echo Sxxxx[=yyyy] set value yyyy to address xxxx ) 1>&2 exit /b 1
JavaCASL2付属のCASL2.bat及びRUN.batには少し不満があるので、cas.shないしcr.sh相当のものを作ってみた。
アセンブル && 実行の手順はLinuxの場合と似たような感じ。
cas.bat hello.cas cr.bat hello.obj
なおWindows XP上でしか動かしていない。Vistaや7、あと64bit環境で動くか否かは不明。