ZAURUS (PI-5000/PI-6000) BASIC Tips Copyright(c)1995 E.Kako ザウルスのアドインの高速化 1.ザウルスのCPUについて  「ザウルスってCPUは何を使ってるのだろう?」ということを疑問に思ったことはな いでしょうか。インテルの80x86シリーズの省電力版が使われていると思っている人 も多いようですが、これは違います。実は、ザウルスにはシャープ製のESR−Pという 独自の8ビットCPUが使われています。  このCPUの特徴は、ルーツがポケットコンピュータ用のCPUであることと、省電力 ということ、1MBのメモり空間があること、8ビットCPUにしては処理速度が速いこ とがあります。一般的な16ビットCPUと比べるとこのザウルスのCPUは非力で貧弱 です。携帯情報ツールにはCPUの高速性はそれほど必要ないという意見もありますが、 検索などの速いレスポンスが必要な場合には高速に動作して欲しいものだと思います。し かし、実際にザウルスを使っているとメモリの空きが十分ならば遅くて困るというほどの ことはないです。  あと他に、Z80が手書き認識用サブCPUとして使われています。ザウルスの手書き 認識ソフトは、情報技術開発センターという所が開発したものを採用し、これをザウルス に搭載するためにZ80を搭載しています。これによりメインCPUの負荷を減らしてい ます。また、液晶画面制御用のコントローラーもCPUの負荷を減らすためにチップ内部 にV−RAMを持っており、チップ自体がウィンドウの重ねあわせなどの機能を備えてい ます。ザウルスの場合、メインCPUが貧弱でも周辺チップでこれをある程度は補ってい ると言えるでしょう。 2.アドイン機能について  ザウルスのアドイン機能についてですが、これはザウルス上で動作するBASICイン タプリタです。このBASICは、シャープのポケットコンピュータ(PC−E500シ リーズ)のBASICがルーツになっています。  ザウルス用のオプション機器として、プログラムBASICカード(PI−3C95) というICカードが以前から企業向けに発売されています。アドイン機能はこのICカー ドからプログラム編集機能を取り除いて、アドイン選択メニューを追加したもののようで すが、細かな点が2〜3箇所ほど異なっています。BASICカード開発キット(EN− 7D)も同時期に単体で発売されていました。これのおかげで、アドイン開発キット(C E−KT1)が発売される以前からフリーウェアのアドインソフトが開発され、NIFT Y−ServeのFENOTEフォーラムにて公開されています。私もマインスィーパー (NIFTY FENOTE LIB2−251)などを作成しております。  実際にアドインを作成を経験した人の感想として、「プログラムの実行速度が遅い」と いうのをよく耳にします。例えばFOR〜NEXTで10000回の単純なループを実行 すると約8秒もの時間がかかります。BASICインタプリタなので遅いのは当然なので すが、これほどまでに遅いと、ちょっと凝ったプログラムを作ると処理速度の面で実用に 耐えなくなってしまうことがあります。  ザウルスに内蔵されている手書きメモやインクワープロなどのソフトは実行速度が速い ですが、これはBASICではなく何かコンパイラ言語を用いて作成されていると思われ ます。内蔵ソフトのようなレベルのソフトを作成しようとすると、実際にはBASICで はほとんど無理なので、機械語を用いて根本的な対策をしなければなりません。しかし、 アセンブリ言語でのプログラミングの習得は非常に困難で、一朝一夕ではできません。さ もなくば、そのソフトの作成をあきらめてレベルを下げるしかありませんが、BASIC でもちょっとした工夫により実行速度を改善する余地が若干残っておりますので、以下に 紹介いたします。 3.アドインBASICのテクニック  アドインBASICでプログラムを作成する際に役立つと思われるテクニックを紹介し ます。  アドインBASICは、一見してマイクロソフトやJISのものに似ていますので、そ れらのBASICを使ったことがある人ならばある程度のコツはご存じだと思います。し かし、アドインBASICはポケコンBASICが元になっていますので、従来のポケコ ンのプログラムとの互換性を確保するためにいくつかの独自の仕様を装備しています。そ して、その独自の仕様はマニュアルに記述されていませんので、これらについても紹介し ます。  また、アドインBASICが登場する以前に企業向けに販売されていたBASICカー ドでは、アドインBASICのマニュアルに記述されていないいくつかの命令を持ってい ますので、これも紹介します。 (1)マルチステートメント  一般的なことですが、マルチステートメントを使って1行にたくさんの命令を詰め込む と実行速度が向上し、記憶容量が節約できます。その反面、やりすぎるとプログラムリス トが見づらくなるという欠点もあります。  例)  10 A=0  20 B=0    というプログラムは、  10 A=0:B=0    と書けます。 (2)10進数の定数  アドインBASICの特徴として、中間コード形式のメモリ効率が非常に悪いというの があります。特に定数については1つにつき15バイトもかかっています。このせいでア スキー形式でセーブしたほうが中間コード形式よりもサイズが小さくなるということが起 こり得ます。ザウルスのメモリは大して多くないのでプログラムのサイズが大きくなって しまうのは深刻な問題です。対策として、定数を16進数にするというのがあります。こ のBASICでは16進数は頭に&Hまたは&をつけて定義します。例えば、255とい う定数は、&FFと書けば3バイトですみますので12バイトの節約になります。また、 0という定数は&0と書く代わりに&のみで書くことができます。反面、実行速度が少し 落ちます。  例)  A=0:B=1 は、  A=&:B=&1 と書けます。 (3)括弧の省略  シャープのBASICの構文の特徴の1つとして、関数に括弧が必要ないというのがあ ります。ただし、複数の引数を持つ関数には括弧が必要です。括弧を省略すると実行速度 が向上し、記憶容量が節約できます。  例)  A$=INPUT$(1) は、  A$=INPUT$1 と書けます。 (4)代入文  代入文に限って、区切りにマルチステートメント以外にコンマを使うことができます。 コンマで区切ったほうが実行速度が速くなります。代入文のLETが省略されていますが 、省略されていて見えないLET文を実行する回数が減少するためです。  また、計算結果の代入について、掛け算よりも足し算のほうが速いことを利用すると実 行速度が速くなります。  例)  A=5:B=C*3 は、  A=5,B=C+C+C と書けます。 (5)GOTO文  GOTO文については文法が何種類もあります。まず1つ目は単純に行番号を書くもの です。これが一番実行速度が速いです。2つ目は演算型GOTOと呼ばれるもので、計算 式の結果として得られた数値を行番号とみなし、その行番号に制御が移すことができます 。昔のポケコンにON〜GOTO文が無かったのでその代用として用いられていました。 3つ目はマイクロソフトBASICなどと同様のラベル指定です。ちなみにラベルとして *のみのラベルも使用可能です。4つ目は文字列ラベルを使うものです。アスタリスクの ラベルと同様に使用できます。5つ目は文字列演算型GOTOです。文字列ラベルと演算 型GOTOとをあわせたようなものです。  GOTO文に限らず、GOSUB文やRESTORE文なども同様に書くことができま す。特に文字列演算型RESTORE文と文字列ラベルを用いたDATA文とを組み合わ せると、高速な文字列データ検索として使用することができます。  例)  GOTO 100  GOTO A*10+100  GOTO *LABEL  GOTO ”LABEL”  GOTO B$ (6)IF文  IF文は、THENを省略して直接次の命令を書くことができます。この場合LETは 省略することはできません。IF〜THEN行番号と書いたほうが、IF〜GOTO行番 号と書くよりも実行速度が速いです。ELSE文がIF文の数より多く存在してもエラー にならず、無視されます。  例)  IF A=0 THEN GOTO 100  IF A=0 THEN 100  IF A=0 GOTO 100 (7)FOR文  FOR文において、NEXTの後ろの変数を省略することができますが、省略したほう が実行速度が速くなり、記憶容量が節約できます。その反面、ループの入れ子が深くなる とFOR−NEXTの対応がわかりにくくなります。  あと、一般的なことですが、FORループを使うよりも処理をならべて書いたほうが実 行速度が速くなります。  例)  10 FOR I=0 TO 3  20 D(I)=0  30 NEXT I    というプログラムは、  10 D(0)=0,D(1)=0,     D(2)=0,D(3)=0    と書けます。 (8)EVAL関数  EVAL関数は、シャープのBASICの中でも独特のものですので初めての人は使い 方に悩むと思います。EVAL関数は引数として1つの文字列を持ち、この文字列を式と して評価して、その値を返します。式には数値を返す計算式だけでなく、文字列の計算式 も用いることができます。文字変数に関数を記憶しておいてマイクロソフトBASICの DEFFNと同様の使い方をするのが一般的な使い方です。また、EVAL自身もEVA Lの引数に用いることができます。  例)  PRINT EVAL CHR$(I)+”$”    で、変数A$〜Z$をアクセスする。  A=EVAL”PEEK(ADR)”    で、一般の関数を呼び出す。  A$=”EVAL B$”:EVAL A$    で、EVAL関数自身を呼び出す。 (9)INKEY$  INKEY$というのは現在押されているキーのコードを返すためのものですが、IN KEY$1とするとキーが押されるまで入力待ちになります。INKEY$0というのも ありますが、これは普通のINKEY$と同様の動作をします。INKEY$は、INP UT文などの前でキーバッファをクリアするために次のようなプログラムを書くことがあ りますが、これはKEY文を使ったほうが楽です。  例)  30 IF INKEY$<>””THEN30    というプログラムは、  30 KEY 0,””    と書けます。 (10)GPRINT  GPRINT文は、ポケコンのGPRINT文とはデータのMSB,LSDが逆になっ ていますので、プログラムの移植には注意が必要です。他にも、ポケコンではLINE文 で箱形を塗り潰す場合に16ビットのラインスタイルを指定することができることを利用 して、LINE(0,0)−(3,3),&5A5A,BFなどとして一定のパターンを 描画するというテクニックがありましたが、アドインBASICでは使えませんので注意 が必要です。 (11)BTEXT$  BTEXT$は、現在実行中のプログラムのファイル名”S1:TEXT.BAS”を 得ることができます。これを設定することで他のプログラムに制御を移すことはできませ ん、CHAIN文を使うべきです。ポケコンでは、特別なファイル名”CARD.BAS ”を指定することでオプションのROMカードプログラムの自動実行がサポートされてい ますが、ザウルスではうまく動きません。 (12)BDATA$  BTEXT$は、現在のBASIC変数のファイル名”S1:DATA.BAS”を得 ることができます。これを設定することも可能です。  例)  10 BDATA$=”S1:DATA.BAS”  20 A=99  30 PRINT A ’99  40 BDATA$=”S1:DAT2.BAS”  50 PRINT A ’0  60 A=77  70 BDATA$=”S1:DATA.BAS”  80 PRINT A ’99 (13)CONSOLE  CONSOLEは、プリンタに出力する桁数を設定するためのコマンドです。マイクロ ソフトBASICのCONSOLEとは命令の意味が違うので注意してください。ザウル ス用BASICカードにはこのコマンドがありましたので、たぶんアドインでも使用可能 だと思いますが、筆者の手元にはプリンタがないので確認できませんでした。 (14)TOUCH  TOUCH ON/OFFで、タッチパネル割り込みの許可/禁止ができます。この他 にTOUCH STOPという命令があります。割り込みを一時保留にするための命令だ と思いますが、未確認です。 (15)WAKEUP$  WAKEUP$は、これに日時を文字列で入力しておき、その指定時刻に電源を自動投 入してプログラムを実行するためのものです。ザウルスでは正常に動作しませんでした。 (16)BASIC  BASICというコマンドがあります。TEXTというコマンドと対になっています。 これはエディタに対してモードをBASIC編集モード/テキスト編集モードに移行させ るための命令です。BASICカードでは使用可能なのですが、アドインBASICでは 動作しませんでした。 (17)RESERVED  ポケコンで作成した中間コード形式のプログラムをザウルスのBASICカードにロー ドしたりすると、ザウルスに存在しない命令の部分がRESERVED&H??と表示さ れます。この&H??には中間コードの16進数の値が入ります。BASICのエディタ 上でRESERVED&H60と入力するとPRINT文が入力されます。このとき中間 コードの16進数は必ず&Hをつけて入力しなければなりません。&のみだとエラーにな るので注意が必要です。このRESERVEDは隠しコマンドを探すときに重宝します。  例)  10 PRINT ”A”    というプログラムは、  10 RESERVED&H60”A”    と書けます。 (18)PEEK  PEEKという関数があり、メモリの特定の番地に記録されているデータの値を調べる ことができます。アドレス&0〜&FFは、CPUの内部RAMの内容がアクセスされま す。PEEK@Wを用いると一度に16ビットアクセスできます。これに対してPEEK @Bというコマンドが隠しコマンドとして存在しますが、普通のPEEKと動作は同一で う。他にPOKEやCALL,LOADM,SAVEMといった命令もあります。  例)  A=PEEK &40000    で、40000番地の内容を調べる  B=PEEK #2,&40000    で、メモリバンク2を調べる。  C=PEEK@W &40000    で、ワード単位で内容を調べる。  D=PEEK@B &40000    で、バイト単位で内容を調べる。 (19)IF文(その2)  IF文において文字変数が空であるかどうかをチェックする特殊な構文があります。  例)  10 A$=INKEY$  20 IF A$ PRINT ”*”ELSE     PRINT ” ”  30 GOTO 10 (20)USING  USINGのパラメータの文字列には、従来のポケコンとの互換性のために様々な仕様 が存在します。¥¥は、一部のBASICカードでは日本の通貨記号¥を表示せず$を表 示してしまうことがありましたが、アドインBASICでは正常に動作します。  例)  10 A=−1  20 USING”##”:PRINT A  30 USING”##−”:PRINT A  40 USING”**##”:PRINT A  50 USING”¥¥##”:PRINT A  これらのコマンドは、川久保氏が作成したBasicEditor(NIFTY FE NOTE LIB2−332)を用いてテストしました。アドイン開発ツールキットCE −KT1は、標準的なマイクロソフトBASICのコマンドを中心に限定したコマンドの みに対応しているようですので、今回紹介したコマンドで対応していないものがあります 。 参考文献  プログラムBASICカード開発マニュアルCE−151D,シャープ  プログラムBASICカード開発マニュアルEN−7D,シャープ  PC−E550,PC−1490U活用研究,工学社  ポケコンジャーナル,工学社