(zaddinを使った) ZAURUS での Addin プログラムの作り方 1995/11/11 小笠原博之 ● Addin 機能とは PI-4500/5000 以降の ZAURUS に搭載された Addin 機能は、外付けのオプションは 一切不要ながら、本体の可能性を広げることがができるというたいへんユニークなも のです。関数演算がしたければ関数電卓を、ゲームをしたければゲームを、といった ようにユーザーのニーズに合わせた ZAURUS のカスタマイズが可能となります。 この Addin のプログラムのほとんどは、実は BASIC 言語で記述されています。そ のため、Addin プログラムのローダーが動くコンピュータと ZAURUS を繋ぐケーブル さえあれば、比較的容易に Addin プログラムを作ることができます。 なお Addin プログラムの中には、BASIC でなくアセンブラを使ったもっと高性能 なプログラムも存在します。ただしアセンブラを使った場合、プログラムのちょっと したミスで本体内の他のデータ内容をも破壊してしまう可能性があり、プログラミン グにはそれなりの覚悟が必要です。BASIC ならそのような心配はありませんし、ほと んどの場合は BASIC だけで十分事が足りると思いますので、無理してアセンブラに 手を出す必要はないでしょう。 以下、説明中で Addin プログラム、と表記しているものは、すべて BASIC のプロ グラムを意味します。 ● Addin プログラムの2つの形式 ZAURUS の Addin プログラムの形式は2種類あります。どちらでも区別なく実行す ることができます。 ・テキスト形式(アスキー形式またはソースリスト) ・バイナリ形式(中間コード形式) この両者の違いは、ちょうど Emacs でいう el と elc の関係に似ているでしょう。 テキスト形式は、通常のテキストエディタで BASIC 命令を書いたそのまま、いわ ばソースリストです。バイナリ形式はソースリストを実行しやすい形に変換を行った ものになります。どちらの形式であっても、ZAURUS に実際に転送する段階では .BAS という拡張子をつけなければならないことに注意して下さい。 テキスト形式であればプログラムの作成には特に何も必要なものはありません。 Addin ローダさえあれば、即プログラムを書いて動かすことができます。例えばこ のようなテキストファイルを作り --------------------- TEST.BAS 1 REM 簡易電卓 2 WIDTH,A,P 3 INPUT A 4 PRINT A 5 GOTO 3 --------------------- zaddin -t -q TEST.BAS と実行して ZAURUS に転送すれば、そのまま実行できるはずです。 (注意: ZAURUS の漢字コードは SJIS のみです。WS で使用される方はご注意を) ただしこのようにテキスト形式のまま転送してしまうと、ZAURUS 内で実行のたび に毎回変換が行われ、ロードに時間がかかるので動作を始めるまでしばらく待たされ てしまうことになります。 そのため、通常は起動を速くするためにソースリストを予めバイナリに変換してし まい、一般の配布もその形で行われているようです。この テキスト->バイナリ 変換 のコンバータとして、加古さんの作られた bacon があります。(→後述) 注意: テキスト形式とバイナリ形式の違いは、あくまで実行までに待たされるロード 時間の差だけです。一度実行が始まってしまえば、機能、動作速度共に違いは ありません。 ● Addin BASIC の概要 漢字が使用できる、画面タッチによる入力ができる、などなど機能拡張が行われて いますが、基本的に SHARP の PC-E500 系ポケコンの BASIC と全く同じです。 ・プログラムの基本的な書き方 各行は必ず行番号で始まります。番号は任意の数値で構いません。ただし必ず、下 の行は上の行より大きな番号でなければなりません。 命令はすべて1行の中に記述します。行番号で始まり、改行までが1行となります。 1行の中に命令を複数記述する場合は':'で区切ります。 ・ZAURUS の Addin BASIC だけでの約束事 1行目の行番号は必ず 1 で、REM のあとにプログラムのタイトル名を書きます。こ のタイトル名が、ZAURUS の Addin モードの選択時に表示されることになります。 --------------------- 例 1 REM ASCIIコードを調べる 10 WIDTH,A,P:CLS 20 PRINT "ASCIIコードを調べる" 30 INPUT "1文字入力して下さい";N$ 40 PRINT "コード=";ASC N$;" 0x";HEX$ ASC N$ 50 GOTO 30 --------------------- ・命令の詳細 実際の個々の命令について詳しい説明は、ポケコンをお持ちの方はそのマニュアル をぜひ参考にして下さい。 この BASIC はある意味で非常に高性能であるといえるでしょう。数値演算はすべ て内部では実数で行われています。しかも2進数演算を行うパソコンとは違い、この BASIC では当たり前のように10進演算を行います。単精度で10進数10桁の精度をも ち、倍精度では20桁の演算が可能ですから、演算能力に関してはまさにポケコン譲り です。 また、数値を書くところでは常に式評価が、文字列を書くところでは常に文字列の 評価が行わます。どうしてここには変数しか書けないのか、どうしてここは定数でな ければならないのか、という不条理さで悩むことはありません。かなりしっかり作ら れている BASIC です。 ●バイナリへの変換 BASIC のソーステキストは、そのままでも転送して実行できることは説明しました。 しかし起動の遅さはいまいち実用的ではありません。ここではバイナリへの変換方法 して転送するまでの流れを説明します。 1. ますプログラムを通常のテキストエディタで記述します。そのファイル名は仮に smpl.asc としておきましょう。 2. 加古さんのコンバータプログラム bacon で変換します。「bacon smpl.asc」と 実行すると smpl.bac というファイルができます。 この段階で、 smpl.asc <<= テキスト形式の Addin プログラム smpl.bac <<= バイナリ形式の Addin プログラム となります。 3. ZAURUS へ転送するプログラムの拡張子を .bas に変更します。この場合はバイナ リ形式で転送するので「cp smpl.bac smpl.bas」と実行して smpl.bas を作って 下さい。 4. ZAURUS をパソコンリンクの待機状態にしたのち「zaddin -q smpl.bas」と実行し てプログラムを転送します。この場合は -t をつけてはいけません。 ●プログラムを組む時のポイント(?) ・行番号の管理がたいへん 普通のテキストエディタで BASIC プログラムを書いても、おいそれとリナンバー できませんので行番号の管理はかなり面倒です。そこで、飛び先はすべてラベルジャ ンプにしてしまい、行番号はあとから適当なプログラムでつけるようにすると非常 に楽です。ラベルは '*' で始まる文字列で、GOTO などで行番号の代わりに使うこ とができます。 ---------------------- 例 1 REM GOTO SMPL 20 *LOOP 25 PRINT "こんな感じ" 30 GOTO *LOOP ---------------------- ・実行したのにすぐ終わってしまう PRINT してすぐ END というようなプログラムの場合、実行しても何も表示されず にすぐ Addin のタイトル選択画面に戻ってしまうことがあります。最初のうちは バグかと思っていろいろ悩みましたが、ただ単に表示がすぐ切り替ってしまうので、 表示内容が見えなかっただけのようです。そういう場合は END の前に「CALL @11」 という命令を入れておくといいようです。これは画面にタッチするまで停止する命 令です。(CALL @番号、はシステムコールの一種らしい) ---------------------- 例 1 REM GOTO SMPL 20 *LOOP 25 PRINT "こんな感じ" 50 CALL @11 60 END ---------------------- ● ZRS ファイルの書き方 今まで zaddin の -q オプションを使った簡単な転送方法を使ってきました。しか し、いろいろと配布されている Addin プログラムでは、.ZRS という拡張子のファイ ルがついてきます。この .ZRS は、Addin プログラムを転送する時にローダーが参照 する Makefile だと思って下さい。 ---------------------- smpl.zrs ZRS,P,"プログラムタイトル" smpl.doc smpl.bas ---------------------- ここまで さきほどの smpl.bas に .ZRS ファイルを書くとすると、上記のようになります。 1行目はタイトル行ですが、この内容はあくまで Addin ローダーが参照するものであっ て、実際の転送には何の意味も持ちません。 2行目に書いてある smpl.doc は、Addin ローダーが転送前に表示するプログラム の説明が書かれたドキュメントです。このファイルは Addin プログラムの配布時には 必ず用意しなければなりません。が、これもあくまでローダーが説明を表示するため に使うだけであって、実際の転送には関係ありません。 3行目以降に、実際に転送するファイル名を書き記します。この場合は .bas を1本 だけ転送すればいいので、1行しかありません。プログラムによっては他にデータファ イルがついてくるので、それらを一緒に転送させる場合はこのあとにデータファイル 名の行が来ます。 ● ZAURUS と Addin プログラムのメモリ PI-5000 や PI-6000 での ZAURUS のメモリは、A と B に分かれています。このう ち転送した Addin プログラムは B のメモリに格納されることになります。ZAURUS 内部のメモリは RAMDISK として管理が行われていて、Addin プログラム内からも、 この B のメモリは SX: というデバイス名でアクセスすることができます。つまり転 送したプログラムは、SX: のデバイス上にファイルとして格納されています。 Addin プログラムが実行される時は、SX: からプログラムを BASIC 専用のメモリ 領域にロードしたのち、それが実行されることになります。この Addin BASIC の実 行のための専用メモリは PI-5000/6000 では 128Kbyte あります。そのため動かすこ とのできるプログラムの最大サイズは、およそ 128Kbyte ということになります。 (データ領域込みで128Kbyte) ちなみにこのメモリは、Addin プログラムの実行以外には使われません。Addin 機 能を使わなければ、この 128Kbyte は常に遊んでいることになります。カタログを見 ると、メインメモリ 1M byte なのになぜかユーザーエリアは 717Kbyte しかありま せん。残りの 300K は何に使っているんだろうと不思議に思っていましたが、そのう ち 128Kbyte は Addin BASIC 実行のための専用領域だったというわけです。 ●本体だけでプログラムは組めるのか? できます。いくつかの方法があるようです。究極の技はひとまず置いといて、私が 考えたのは、こんな方法です。 -------------------------- scrun.asc 1 REM SC-RUN v1.0 5 CLS:CLEAR:WIDTH,,N:BREAK OFF 10 PRINT "SC-RUN v1.0 COR." 20 PRINT "スケジュール内からプログラム検索中" 30 OPEN "SX:SCHEDUL1.BOX" FOR INPUT AS #1,B:O=&80:L=LOF(1) 40 OPEN "SX:SCRUNX.BAS" FOR OUTPUT AS #2:PRINT #2,"1 "; 60 *NS:SEEK 1,O:IS$=INPUT$(255,#1):P=INSTR(IS$,"###"):IF P<>0 THEN *FD 70 O=O+&FA:IF O13 THEN *LP 200 PRINT @B,#2,10:PRINT #2,MID$(STR$(L),2,9);" ";:L=L+1:GOTO *LP 210 *NF:PRINT "見つかりませんでした" 300 *DE:PRINT #2,"END" 310 CLOSE #1,#2 400 PRINT "終了しました 画面にタッチして下さい":CALL @11 900 BREAK ON:CLS:WIDTH,,N:END --------------------------- ここまで このプログラムをあらかじめ Addin に転送しておきます。できればバイナリに変 換してから転送して下さい。 次にスケジュール機能に切り替えて、新規入力をします。時間は入力しなくて構い ません。スケジュールのメモ内容の部分にプログラムを書き込みます。プログラムの 1行目は必ず「###REM」で始めて下さい。 ----<入力例>----------------------------- ###REM プログラムタイトル CLS PRINT "適当な文字列" CALL @11 ----------------------------------------- 行番号は不要です。GOTO や GOSUB で飛び先を指定する場合はラベルを使用して 下さい。また行の終わりには必ず改行を入れて下さい。最終行だと改行を忘れやすい ので注意。命令の記述は省略形でもかまいません。( PRINT -> P. など) スケジュールにプログラムを登録したら、Addin モードに切り替えます。先程転送 した SC-RUN のプログラムを実行すると、スケジュールデータ内から "###" で始まる データを捜し出し、プログラムファイルとして切り出します。 成功すれば、切り出したプログラムが Addin に加わっているはずです。もちろん 実行できます。 なお、この切り出したプログラムはテキスト形式であるため、実行時に変換のため の時間がかかります。またスケジュールの登録が多数行われていると、とんでもなく 切り出しが遅くなる可能性があります。 とにかく「遅い」はずなので、実用性はいまいち、といったところでしょう。 ●アセンブラ(マシン語)で Addin を作るにはどうしたらいいのか? この辺りのノウハウは加古さんに頼ることにします。 ●クロスコンパイラってないの? すでに誰からも忘れ去られたクロスコンパイラが2本ばかり、うちの X68000 の HD に眠っておりました。気が向いたら発掘しておくことにしましょう。 -- 小笠原博之 oga@dgw.yz.yamagata-u.ac.jp