===========================================================================

MZ-1200,80K/C
整数型 BASIC COMPILER
操作説明書

1983年12月


===========================================================================


 本コンパイラはMZ−1200,80K/C上で動作する整数型のBASICコンパイラです.
 メモリは32K,48Kどちらでも変更なしで動作します.
 本コンパイラはBASIC用のエディタを内蔵しており,このエディタで打ち込んだソース・プログラムのみを対象にコンパイルを行なう独立システムとなっています.
 SP−5030,Hu−BASICなどで打ち込んだプログラムはコンパイルできません.
 BASIC言語仕様は現在流通しているパソコン用のインターブリタと互換性を保つため,マイクロソフト系の言語仕様に準拠しています.


【使い方】
 コンパイラの起動はMZのモニタSP-1002から,LOADで行ないます.
 ソース・プログラムの入力は通常のBASICと同様に行番号付きで打ち込みます.1行は80文字までです.キーはすべてオート・リピートとなっています.スクリーン・エディットも可能です.

【コマンド】
 本コンパイラで使用するコマンドは次のとおりです.
@NEW
 ソース・プログラム,オブジェクトの消去
ALIMIT MAX/LIMIT アドレス
 コンパイラの使用するメモリ上限を設定.
 起動直後,またはNEWされているときのみ有効です.
BLIST〔行番号〕〔−〔行番号〕〕/LLIST〔行番号‥
 指定範囲のソース・プログラムの画面,またはプリンタへのリスト出力.
CSAVE“ファイル・ネーム”
 ソース・プログラムをカセット・テープにセーブします.
DLOAD〔“ファイル・ネーム”〕
 カセット・テープからソース・プログラムをロードします.
ECOMPIL/LCOMPIL
 ソース・プログラムをコンパイルし,オブジェクトを生成します.
 コンパイル時のエラーを画面,またはプリンタに出力します.
FMAP/LMAP
 オブジェクトのメモリ・マップを画面,またはプリンタに出力します.
GRUN
 オブジェクトを実行します.
HCONT
 STOP文実行,またはSHIFT+BREAKキーにより停止しているオブジェクトの実行を再開します.
IBSAVE“ファイル・ネーム”
 オブジェクトをカセット・テープにセーブします.テープにセーブしたオブジェクトはモニタSP-1002にて直接口ード実行可能です(コンパイラではロードできません).
JON/OFF
 オブジェクト生成時,SHIFT+BREAKキーのセンス処理ルーチンを,オブジェクト中に落とし込むか,落とし込まないかの指定をします.
 COMPILEコマンドに先立って入力された方が有効になります.起動時はOFF側です.
KSTRLEN(n)n:0−253
 文字変数に格納する最大文字数をnに設定します.
 本コンパイラでは文字変数領域を固定して扱いますのでその長さを指定します.MAXは253です.0〜9を指定したときは10になります.
 COMPILEコマンドに先立って入力された値が有効になります.
 起動時は30に設定しています.
LBYE
 モニタSP-1002に戻ります.
 コンパイラのスタート番地は次のとおりです.
 コールド・スタート &H1280
 ホット・スタート &H1200
MBELL
 キー入力時の確認ベル音のトグル・スイッチ.起動時はOFFです.ONになっていてもリピート中はベルは鳴りません.
図1 グラフィック・キー(キーボード右側)の16進キー割り付け
CDEF
89AB
4567
0123
CR
NKEY
 キーボード右側のグラフィック・キーを16進キーに変更します.BELLと同様,トグル・スイッチになっています.
 起動時はグラフィック側です.
 キー割り当ては図1のとおりです.
Oその他
 プリンタ出力ルーチンでは,プリンタ側のレデイ・フラグの確立を待つあいだBREAKキーのセンスを行ないます.プリンタ異常時はSHIFT+BREAKでコンパイラに戻れます.
 LIST,COMPILE,MAPのコマンド実行中はSPACEキーにPAUSE機能をもたせています.リスト出力の一時停止などはSPACEキーを利用します.

【BASIC 言語仕様】
<<定数>>
 数値定数 10進定数 -32,768〜32,767,0〜65,535
      16進定数  &HO〜&HFFFF
 文字定数(“)で囲った任意の文字列
 文字定数はソース・プログラム上では,1行80文字以内に制限されますが,文字変数の代入にあたっては,STRLENコマンドで指定した長さに制限を受けます.

<<変数>>
 変数名は英字で始まる英数2文字です.文字型は$を付けます.配列は2次元まで許されます.添字は0から始まります.BASICでの予約語は変数名として使用できません.

<<式>>
 演算の優先順位は次のとおりです(高一低〉.
イ. ()の中
ロ. *(乗算),/(除算),MOD(除算の余り)
ハ. +(加算),-(減算〉
ニ. =,><,<>,>,>=,=>,<,<=,=<(比較演算)
ホ. NOT(論理否定)
へ. AND(論理積)
ト. OR (論理和)
 文字式は“+”の加算のみです.文字式どおしの比較演算は可能です.

<<ステートメント>>
使用できるステートメントは次のとおりです.
DIMDATACALL
TEMPOMUSICCLS
BEEPPSET(X,Y)PRESET(X,Y)
LOCATE X,YPRINTLPRINT
INPUTREADRESTORE
GOTOGOSUBRETURN
FOR〜TO〜STEPNEXTON〜GOTO〜
ON〜GOSUB〜ON〜RESTORE〜POKE
IF〜THEN〜ELSEIF〜GOTO〜ELSEREM(’も可)
STOPENDLET(省略可)
TIME
注意
●DIM,DATAはIF文中ではエラーになります.
●DIMでの配列宣言は,正定数で明確に行なう必要があります.
●DATA文はマルチ・ステートメントの中では必ず行末に記述します.
●BEEPは瞬間だけベルを鳴らします.
●PSET,PRESETはMZのセミグラフィックのセット,リセットです.
●INPUTはプロンプト・メッセージが使用できます.INPUTの入力でRETURNのみのときは,変数は元の値のままとなります.
●RESTOREで行番号指定がないときは一番最初のDATA文をポイントします.
●GOTOでは,GO TOの代用はできません.
●FORの制御変数として配列要素を使用できます.
●NEXTは複数の制御変数を“,”でくくることができます.
 1つのFOR文に対応するNEXTは複数記述できます(条件NEXT可能).
●IFのTHENまたはELSE以降に別のIF文が記述可能です.
●REMは行末まで注釈とみなします.マルチ・ステートメントで"'"を使用するときは必ず":"のセパレータを必要とします.
●STOPの実行後はCONTによる再開が可能です(ただし,コンパイラが存在するとき).
●TEMPO,MUSICはSP-5030に同じです.
●CALLはマシン語サブルーチンのコールです.アドレスはCALLに続けて式で与えます.スタック・ポインタ以外のレジスタは破壊してもかまいません.
●TIMEは“TIME=数値式”で表現し,内蔵時計の設定をします.単位は秒です.時間は文字型ではなく数値型にしています.

<<関数>>
■数値関数
ABS(X)ASC(X$)LEN(X$)
SGN(X)VAL(X$)RND(X)
PEEK(X)CSRLINPOS(0)
TIME
注意
●RNDは0〜X-1までの乱数値を与えます.乱数系列の変更はできません.
●POSの()内はダミーですが,コンパイラは式チェックを行ないます.
●TIMEは内蔵時計の現在時刻を与えます.
■文字型関数
CHR$(X)HEX$(X)INKEY$
LEFT$(X$,Y)RIGHT$(X$,Y)MID$(X$,Y,Z)
STR$(X)SPC(X)TAB(X)
注意
●SPC,TABはPRINT/LPRINT文中でしか使用できません.
    、
<<エラーメッセージなど>>
本コンパイラの出力メッセージは次のとおりです.
●コマンド入力時のエラー
 ●SYNTAX ERROR
  未定義のコマンドが入力された.STRLEN,LIMITの値が規定外であるなど.
 ●lLLEGAL DIRECT
  BASICステートメントが入力された(コンパイラなので直接実行できません〉.
 ●CAN NOT RUN(CONTINUE,LIMIT,MAP)
  コマンド実行できる状態でない.
 ●0UT OF MEMORY
  ソース・プログラムを格納するメモリがない.
■コンパイル時のエラー
 コンパイル時のエラーは,“エラー名”lN行番号の形で出力され,エラーがあると,その行のコンパイルは中止し,次の行のコンパイルを行ないます.
 マルチ・ステートメントなどでエラーが複数あってもひとつしか表示しません.
 ●SYNTAX ERROR
 ●TYPE MISMATCH
 ●UNDEFINE LINE NUMBER
 ●UNDEFINE DATA
 ●DUPLICATE DEFINlT10N
 ●0UT OF MEMORY
   オブジェクトの格納,または変数領域を確保するメモリがない(行番号はつきません).
 ●RANGE OVER
   非常に大きな配列を宣言している.
■オブジェクト実行時のエラー
 オブジェクト実行中のエラーは“エラー名”lN行番号(またはオブジェクト・アドレス)の形で出力されます.コンパイラのもとで実行しているときは,エラーの発生した行番号が出力され,BSAVEにてテープにセーブしたオブジェクトをモニタのもとで実行しているときは,エラーの発生したオブジェクトのアドレスを表示します.
 エラーメッセージを出力したあとは,コンパイラのコマンド待ちとなります.モニタでは“RETURN?”のメッセージを出力して,再実行待ちとなります.Yキーで再実行します.
 ●lLLEGAL FUNCTlON CALL
 ●ZERO DlVIDE
 ●0VER FLOW
 ●NEXT WlTHOUT FOR
 ●RETURN WlTHOUT GOSUB
   行番号が正常に出力されない場合があります.オブジェクト・アドレスの場合はすべて信用できないアドレスになっています.
 ●FOR−NEXT NESTING OVER
   FOR〜NEXTのネステイング・レベルは16レベルまでです.
 ●TYPE MISMATCH
 ●STRING TOO LONG
   STRLEN(n)コマンドで指定した長さを越えて,文字列の代入,または演算を行なおうとした.
 ●STRING FORMULER TOO COMPLEX
   文字式の()が多すぎる.
 ●0UT OF DATA
 ●lNPUT ERROR(行番号なし)
   INPUT文実行時,数値変数に不正データを入力しようとした.再入力待ちになります.
  ●BREAK
   STOP文の実行,またはSHIFT+BREAKキーが入力された.

【オブジェクトの展開】
 リスト2はオブジェクトの一部を逆アセンブルしたものですが,本コンパイラはオブジェクト展開を,スタック・マシン的な実行形式に展開します.
 オブジェクトの実行にあたっては,PUSH,POP命令の実行回数が多く,速度の方は今ひとつという感じです(インタープリタと比較すれば随分速いのですが).

<<最後に>>
メモリマップ  本コンパイラのメモリ・マップを図2に示します.
デモ・プログラムとしてリスト3“8-QUEEN”のソースを付けておきます.
 SP-5030で実行すると20数分かかりますが,コンパイラで走らせると約90秒ほどで実行を終えます.

【参考文献】
 コンパイラの構造ならびに式評価の手法などの設計で
1)“コンパイラの設計手法”インターフェース,80年6月号
2〉“MZ-80のFDOS詳細解明とBASICコンパイラ”,インターフェース’81年5月号
3)“PC-6001EXAS BASICコンパイラ”,I/O,82年11月号
4)“FORM”.“BASICコンパイラ”,MZ−80活用研究

 言語仕様の決定にあたっては,
5)FUJITSU MICRO8 F-BASIC文法書
6)Hu-BASIC reference book
7)MZ-1200 Basic Manual

 その他エディタ,コンパイラの基本ルーチン,I/Oルーチンのプログラム作成にあたって,
8)“MZ-80C/Kモニタのサブルーチン全公開”,インターフェース’81年6月号
9)MZ-12000 OWNERS MANUAL
 ならびに上記4)の各プログラム製作記事,7)を参考,一部修正引用しています.