リロケータブルアセンブラを使ってプログラミングすることの利点のひとつに,
「すでに一度作成したサブルーチン(モジュール)の使い回しがきく」
ということがあります。しかし,手持ちのモジュールが多くなると今度は,リロケータブルファイルても管理に困り始めます。
理屈のうえでは,WZDとWLKがあれば,リロケータブルアセンブラを用いたプログラム開発は可能なのですが,リンクするファイルが多くなってくると,非常に面倒なことになってきます。ましてや,それが毎回毎回同じようなファイルだったりしたら,プログラムを作っているのか,それともキー入力の反復練習をしているのかわからなくなってしまいかねません(拡張すればS-OS“SWORD"でも,バッチ処理ができますが)。
●どんなに小さなモジュールでもディスクに収めれば必ず,1クラスタ(4Kバイト相当)を占有する。ただでさえ,あまり容量の大きくない2Dのシステムに,このことはたいへん不利である。
●1つひとつのモジュールに対していちいちファイルのオープン&クローズを行っていたのでは,速度的に不経済である。
●末葉的なモジュールは人間が手動で管理するよりも,なんらかの抽象的なシンボルでまとめて管理したほうが,OOPS(Object Oriented Programming System?)していて,カッコイイじゃないかい?などの理由により,モジュールを(半ば)自動的に管理してくれるようなシステムがほしくなってくるわけで,そこでライブラリアンの御登場となるわけです。
起動を終えてプロンプト‘*'が表示されているのを確認してください。次に,ひとつに束ねてしまいたいファイル(リロケータブルファイルであっても,ライブラリファイルであっても構いません)の名前をポコポコと入力します。このとき,ファイル名は1つひとつ入力してリターンキーを押してもよいし,いくつかのファイル名を,‘,'で区切りつつ,まとめて入力してリターンキーを押しでも構いません。
ファイル名の拡張子が省略された場合,まず‘.REL'でファイルを探し,そのファイルが存在しない場合には‘.LIB'を探します。
そして,束ねてしまいたいファイルの名前をすべて入力し終わったら,それらを出力します。出力したいファイルの名前をタイプし,その後ろに‘/E'をつけてリターンキーを押します。
たとえば,AAA.RELとBBB.RELをくっつけてCCC.LIBというライブラリファイルを作ろうとします。このときは以下のようにします。
#LWLB
#J3000 (WLBを起動する)
*AAA (AAAを読み込む)
*BBB (BBBを読み込む)
*CCC/E (CCCを書き出す)
#SHIFT+BREAKキーを押す
これで,ディスク上にはCCC.LIBというファイルができあがっているはずです。
WLBは,作業中にカレントディスクに$$$$$$$$.TMPというテンポラリファイルを作成し,作業の終了と共に消去します。したがって,$$$$$$$$.TMPという名のファイルをカレントディスクに持っていると自動的に消去されてしまいますので,注意してください。同様の理由により,作業中にSHIFT+BREAKで強制的にWLBを抜け出した場合,カレントディスクに$$$$$$$$.TMPというファイルが残ってしまう場合がありますので,そのときは,S-OSのKコマンドで消去してください。
また,RAMディスクをお持ちの方は,カレントディスクにRAMディスクを指定しておくと作業が早まります。
WLBはすべての入力が終わった時点で束ねる処理を行います。入力ファイルの名前が入力されると,ディスク上に存在するか否か,そして,それらのファイルサイズを記憶しておきます。入力ファイルがライブラリファイルの場合には含まれるモジュールすべても記憶しておきます(表1参照)。
そして出力ファイルが指定されると,いままでの記憶した情報をもとに,実際の束ねる作業を行います。これは,S-OS上で使用できるメモリがかなり限られているためです。
この方法にしたため以下のような欠点がでてきてしまいました。
- 同じファイルを2度もオープンするので処理速度が遅い
- 束ねる作業中にディスクを交換できない。つまり,ディスクを2ドライブしか持っていないユーザーは,リロケータブルファイルを2枚以内に集めておかなくてはならない。
まあ,1)の欠点はしょうがないにしても,2)の欠点は,困ったものです。
とりあえず,WLBはライブラリファイルも入力ファイルとして受け付けますので,ディスクごとにライブラリファイルを作って,最後にまとめるなどの方法で逃げてください(この欠点はWLKにも共通です。リンカにそんなに多くのファイルを読み込ませることはないので意識する必要はないと思いますが)。
最後にWZD&WLKを使って作成したプログラムを,Oh!X1987年11月号で発表されたファイルアロケータ&ローダのフォーマットに変換する方法を紹介します。
わかってしまえばなんのことはない,オブジェクトプログラムを2種類作ってしまえばよいのです。
具体的にいうと,いまPROG.ASMというソースファイルをアセンブルするとします。
# WLK/P:0000,PROG,PROG1/N
として,アドレス0000Hから始まるPROGl1.OBJを用意します。次に,
# WLK/P:1234,PROG,PROG2/N
として,アドレス1234Hから始まるPROG2.OBJを用意します。あとはもう,説明の必要がないでしよう。
などというプログラムに対しては,対応していませんので注意してください(アドレス情報を掛けたり,割ったりすることはないと思いますが,念のため)。
01H,[ファイルサイズ(2バイト)],"フアイル名",00H
RELファイルを読み込む。
02H,"ファイル名",00H
03H,[ファイルサイズ(2バイト)],[シークアドレス(2バイト)],"モジュール名",00H
モジュールを読み込む
04H,[ファイルサイズ(2バイト)],"ファイル名",00H
消去された01コマンド
05H,[ファイルサイズ(2バイト)],[シークアドレス(2バイト)],"モジュール名",00H
消去された03コマンド
FFH
コマンドの終わり |
です。この動作の繰り返しによって,組み込みたいモジュールやライブラリファイルなどを指定していきます。そして,組み込みたいモジュールをすべて指定し終わったら,
とすると,いままで指定してきたモジュールを組み込んだライブラリファイルが[ファイル名]で表されたファイル名で作成されます。
LlBファイルとして,[ファイル名]を出力する。省略時の拡張子は‘.LIB'である。
WLBの一切の作業を中断して,S-OSのコマンドレベルに戻る。
●File Access Error On [ファイル名]
[ファイル名]のファイルにアクセス中にエラーが発生した。
与えられたファイルはリロケータブルファイルでも,ライブラリファイルでもない。
そのほかは,“SWORD"のエラーメッセージに準じています。
(C)1990 Tatsuya Ishigami(original)
(C)1997 Junji Okazaki(edited)
(C)2024 Oh!Ishi,Nibbles Lab.(formatted)