このプロジェクトはNIFTY SERVEにおけるFZAURUS
2周年企画、アドインコ
ンテストに向けて開発環境を提供する事を目的にスタートさせました。
■プロジェクト概要
ザウルスのPI4500,5000,6000,7000に搭載されているアドインは、ザウルス
に新たな機能を追加する機能として注目されましたが開発用ソフトを購入する必
要があるなど、気軽にプログラムを組むというわけには行きません。
このことがアドイン開発者/公開が増えない原因の一つと思われます。(NIFTY
FZAURUSでの調査)
ZauBASEを作りながら、ザウルスのアドインの構造を調査した結果、開発キ
ット等を利用しなくてもアドイン(シャープが定めたアドイン開発規則に準拠で
き、FZAURUSのライブラリでも公開可能なもの)を作成することができる方法を
考案しました。
これは、以前から言われていたテキストタイプのアドイン(アドインソース
そのもの)をザウルスに転送して実行することができることを利用したものです
。
■ザウルスのアドイン機能の基礎知識
残念ながら、私自身アドインに取り組んだのはPI5000からであり、それまでのザウルス上で実行できるプログラム開発手段のBASIC カード関連の知識に疎いところがあります。
そこで、参考になるのがザウルスパーフェクトマニュアル(通称ZPM:赤本)です。(マルチうちやまさん、みのたんさん著)
この本によれば、ザウルスのアドイン機能は、PI3000, 4000用のBASICカード(PI-3C95) がベースになっているようです。
BASIC カードそのものは、BASIC エディタを含む独立した開発系を持ち、ザウルス上での開発が可能でした。
ところが、アドイン機能としてザウルスに搭載された時に、このエディタ部分は搭載されませんでした。
そのため、正式なアドインの開発はパソコン上でプログラムソースを書き、アドイン開発キットに含まれるPCT(PCTV) により、BASIC 中間コードに変換してからザウルスに転送しなければなりません。
■BASICに関する基礎知識
ザウルス用アドインBASIC プログラムは以下のように書きます。
1 REM テストプログラム
10 PRINT "Hello BAIC WORLD"
20 A$ = INKEY$ 1
30 GOTO 10
これは、プログラムソースと呼ばれ、人間にとってわかりやすい表現なのですが、コンピュータにとっては、処理速度やメモリ使用効率の面で適切ではありません。
PRINT(表示)やGOTO (ジャンプ)などの命令は、プログラム中に何度も登場するもので、もし、この文字のままメモリ上に格納すると、GOTOなら毎回4バイトのメモリを消費することになります。
また、ザウルスのアドイン機能はインタプリタ型BASICという、プログラムを1命令づつ実行するものです。
この場合、プログラムソースのままだと、毎回1文字づつ読んでは、どのような命令なのかを判定しなければなりません。
例えばGOTOとGOGOを判定するには、少なくとも先頭から3文字(バイト)読まなければならず、処理速度を低下させる原因になります。
そこで、少ないメモリ消費である程度高速に処理するために、BASICのソースプログラムをコンピュータ向けの中間言語というものに変換します。
例えば、GOTOを1文字(バイト)で表現できればメモリ上で3バイト節約できるだけでなく、どのような命令なのかの判定も1回の比較で済みます。
■テキストタイプアドインとは
こちらもFENOTEで得た知識ですが、アドイン開発キット(CE-KT1)が登場する以前に何とかアドインを使えるようにならないかと試行錯誤された結果、BASIC ソース(テキスト)をそのまま転送することで使えるようになることが発見されました。
これは、アドイン機能にテキストタイプのアドインを実行できる機能(=BASICエディタの名残)が残されていたためです。
◆動作原理
プログラムソースをザウルス自身のアドイン機能が中間言語に変換してから実行するというシンプルなものです。
ただし、このため起動速度が遅く、メモリ消費量という面からも不利になることは否めません。
■テキストタイプアドインを作るには
BASIC言語仕様をある程度理解していればプログラムそのものは、簡単に記述できます。
言語仕様としては、N88-BASIC にザウルス特有のタッチオペレーション機能を付加したようなものです。
個別のコマンド等に関しては、別連載の「ZauBASE Addin Maker で作るアドイン」というもので説明したいと思います。
【余談】数年前からのPC98系パソコンユーザーならある程度BASIC がわかると思うのですが、Windows 3.1や95 がプリインストールされるようになってからのユーザーにとって、BASIC というのは初対面の言語になるのでしょうか(^_^?
■テキストタイプアドインをザウルスに転送するには
シャープ(株)提供のDOS版ダウンローダJSFREE1.EXE やZauBASE ではアドインチェックを行っており、中間言語タイプのアドインしか転送できないようになっています。(プログラムの先頭、数バイトをチェックすればアドインか、それ以外かはわかります)
そこで、FENOTEなどで公開されているダウンローダを利用する事になりますが、使用に際して各種パラメータを必要とする、やや上級者向けのMS-DOS版であり、Windows ユーザーにとっては、DOS 窓で実行する時の通信安定性という問題も生じます。
また、もう一点問題があり、テキストタイプのアドインを単純に転送しただけではアドインとして認識されません。
これは、私も最初に引っかかったのですが、プログラムソースの最後を表すEOF(End Of File = 1Ah) を付加しなければならないのです。
通常のエディタではこのコードを付加しません(このコードそのものがファイルの終わりを表すので下手に挿入すると誤動作します)ので、作成したソースに後から追加する必要があります。
そこで、転送に関しては、EOF の付加を含めたものを作成する事にしました。
■テキストタイプのアドインの実行
転送が正しくできれば、ザウルスのアドインリストに表示されます。
選択して、実行すれば良いことになりますが、慣れていてもプログラム記述ミスが多発しますので、何度か修正(デバッグ)を繰り返すことになります。
■アドインをNIFTY SERVEのFZAURUS で公開するには
テキストタイプのアドインでも、自分だけで楽しむなら問題は無いのですが、これをNIFTY SERVEのFZAURUS で公開しようと思うと、アドイン開発規則というものが壁となって立ちふさがります。
アドイン開発規則には、公開するため(本来はザウルスの内部データに悪影響を与えないための規則)の基本的な事項が記述されています。
開発規則には、ファイル名の付け方、拡張子の付け方、使用してはいけないBASIC命令、プログラム1行目の制限、プログラムのサイズ(PI4500とそれ以外)、ドライブ名、『プログラムは実行形式でダウンロード』、アドインダウンローダで転送する
ために必要なファイル、プログラミングで配慮すべき点、が記述されています。
当然、テキストタイプのアドインは開発規則から逸脱しているため、FZAURUS では公開できません。
◆開発規則を厳密に解釈すると、あらゆるアドインに関して製作時点から守るべき規則となりますが、自分が使うものを作る上ではある程度の逸脱が許されると思います。(自己責任/自己リスクにおいてですが(^_^; )今考えるとFZAURUSにおける過剰なまでの制限がアドイン製作の楽しみを奪ったとも言えるのですが...
■テキストタイプから中間言語タイプのアドインへ
開発規則の最初の壁をクリアするには、中間言語に変換する必要があるのですが、前述した通りザウルス内部では中間言語に変換してから実行しています。
中間言語化されたファイルを作成するためには、"SAVE"命令をプログラムに埋め込んでそのプログラムをザウルスに転送して、実行すれば簡単にできます。
1 REM テストプログラム
10 SAVE "ZAUBMAKE.BAS"
20 PRINT "Hello BAIC WORLD"
30 A$ = INKEY$ 1
40 GOTO 20
ただし、このようにして保存した中間言語プログラムは、実際には何の役にも立ちません。
中間言語化しても、SAVE "ZAUMAKE.BAS"の部分が有効になってしまうためです。
この部分を回避する方法については、前述のザウルスパーフェクトマニュアルに記述されていますが、ここでは別の方法をとります。
■中間言語に変換されたアドインをパソコンに抜き出す
これは、これまでundocumented ZAURUS で解説してきた通り、バイナリファイルのアップロードを使い、中間言語化されたアドインをパソコンに抜き出します。
■中間言語の構造解析
1 REM テストプログラム
10 SAVE "ZAUBMAKE.BAS"
20 PRINT "Hello BAIC WORLD"
30 A$ = INKEY$ 1
40 GOTO 20
◆ザウルスに転送後、実行してできる"ZAUBMAKE.BAS"のバイナリダンプリスト
FF 00 00 00 34 00 00 95 00 00 00 00 00 00 00 00 | ...4........... |
00 00 0D 00 01 15 FE 59 1E 12 83 65 83 58 83 67 | .......Y..テスト |
83 76 83 8D 83 4F 83 89 83 80 0D 00 0A 11 FE 23 | プログラム.....# |
22 5A 41 55 42 4D 41 4B 45 2E 42 41 53 22 0D 00 | "ZAUBMAKE.BAS".. |
14 15 FE 60 22 48 65 6C 6C 6F 20 42 41 49 43 20 . | ..`"Hello BAIC |
57 4F 52 4C 44 22 0D 00 1E 10 41 24 20 3D 20 FE | WORLD"....A$ = . |
E9 1D 00 00 10 00 00 00 00 0D 00 28 06 FE 2B 1F | ...........(..+. |
00 14 0D FF | .... |
◆解析結果
FF 00 00 00 34 00 | アドインヘッダ |
95 00 | 総データ長 0095h = 149 |
以下に続く総バイト数 + 41 | |
00 00 00 00 00 00 00 00 00 00 | ?だが、10バイトの 00 |
0D | プログラムの先頭 |
00 01 | 行番号 1 |
15 | 1行の長さ |
FE 59 | REM を表す中間コード |
1E 12 | 12h=18バイト読み飛ばし |
83 65 83 58 83 67 83 76 83 8D 83 4F 83 89 83 80 | テ ス ト プ ロ グ ラ ム |
0D | 行の終わり |
◆SAVE 命令を含むブロック | 行番号 10 (000Ah) |
00 0A | 1行の長さ |
11 | SAVEを表す中間コード |
FE 23 | |
22 5A 41 55 42 4D 41 4B 45 2E 42 41 53 22 | " Z A U B M A K E . B A S " |
0D | 行の終わり |
00 14 | 行番号 20 (0014h) |
15 | |
FE 60 | PRINT を表す中間コード |
22 48 65 6C 6C 6F 20 42 41 49 43 20 57 4F 52 4C 44 22 | " H e l l o B A S I C W O R L D " |
0D | 行の終わり |
00 1E | 行番号 30 (001Eh) |
10 | |
41 24 20 3D 20 | A $ = |
FE E9 | INKEY$を表す中間コード |
1D 00 00 10 00 00 00 00 | 数字の1を表す内部表現 |
0D | 行の終わり |
00 28 | 行番号 40 (0028h) |
06 | |
FE 2B | GOTOを表す中間コード |
1F 00 14 | 跳び先 14h=20 |
0D | 行の終わり |
FF | プログラムの最後 |
■中間言語の不要データを削除する
構造解析から明らかなように、中間言語に変換されたプログラムから10 SAVE "ZAUBMAKE.BAS" に該当する部分を削除するのは簡単です。
プログラムの先頭から順次読み込み、該当する1行分のデータを丸ごと削除して総データ長を矛盾が出ないように修正すれば良いことになります。
このようにして修正されたプログラムは、他人から見ればアドイン開発キットを利用したのと区別することができません。(たぶん(^_^? ) 実際は中間言語化時の空白をみるとわかっちゃいます。
■アドインを公開するまでの手続き
アドインをNIFTY のFZAURUS で正式に公開するためには、プログラム以外の様々なドキュメントの作成とLHA による圧縮作業が必要になります。
XXXXXX.ZRS:ファイル構成記述ファイル アドインを構成するファイルを記述
XXXXXX.DOC:プログラム説明ファイル
アップロード時の補足説明:ダウンロードするときに表示されるプログラムの内容を説明したもの
この部分は結構面倒なので、対話型で自動作成等を行う支援ツールをZauBASEAddin Maker に含めたいと考えています。
■BASIC言語説明をどうするか?
いくら開発環境があったとしても、BASICの言語説明(マニュアル)がなければプログラムは組めません。
マニュアルに関しては、開発キットの記述を流用すると完全に著作権を侵害しますので、これを回避するために、プログラムソースを解説する形で命令やの使い方や構文について記述できるのではないかと考えています。
■画像やアイコンなどのリソースをどうするか
この部分が最も難しい点で、アドイン開発キット(CE-KT1)を購入する価値の大半はアイコンや画像エディタにあると言えます。
Addin Maker でもこの部分を提供しようかと考えたのですが、プログラム作成量が膨大なため省略しました。
ライブラリのアドインを見ていると、アイコンや画像を使わずに製作されているものも数多くありますので、要はアイディア次第だと思います。(言い訳(^x^; )
■お約束のご注意
この解析は「まると」が独自に行ったもので、内容についての保証はありません。
また、メーカー等に問い合わせることはしないようにお願いしますm(_
_)m