=========================================================================== 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になっていて もリピート中はベルは鳴りません. NKEY  キーボード右側のグラフィック・キーを16進キーに変更します.BELLと同様,ト グル・スイッチになっています.  起動時はグラフィック側です.  キー割り当ては図1のとおりです.  図1 グラフィック・キー(キーボード右側)の16進キー割り付け 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 (論理和)  文字式は“+”の加算のみです.文字式どおしの比較演算は可能です. <<ステートメント>> 使用できるステートメントは次のとおりです. DIM DATA CALL TEMPO MUSIC CLS BEEP PSET(X,Y) PRESET(X,Y) LOCATE X,Y PRINT LPRINT INPUT READ RESTORE GOTO GOSUB RETURN FOR〜TO〜STEP NEXT ON〜GOTO〜 ON〜GOSUB〜 ON〜RESTORE〜 POKE IF〜THEN〜ELSE IF〜GOTO〜ELSE REM(’も可) STOP END LET(省略可) TIME 注意 ●DIM,DATASは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) CSRLIN POS(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に示します. デモ・プログラムとして“8-QUEEN”のソースを付けておきます.  SP-5030で実行すると20数分かかりますが,コンパイラで走らせると約90秒ほどで 実行を終えます. 図2 BASICコンパイラ・メモリ・マップ 【参考文献】  コンパイラの構造ならびに式評価の手法などの設計で 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)を参考,一部修正引用しています. リスト2 オブジェクト展開例 10 B=100:C=300:D=2:E=3 20 A=B+C/(D+E)*20 30 PRINT A 4061 21 C6 40 LD HL,40C6H 4064 E5 PUSH HL 4065 21 64 00 LD HL,0064H 4069 CD 03 36 CALL 3603H 406C 21 C8 40 LD HL,40C8H 406F E5 PUSH HL 4070 21 2C 01 LD HL,012CH 4073 E5 PUSH HL 4074 CD 03 36 CALL 3603H 4077 21 CA 40 LD HL,40CAH 407A E5 PUSH HL 407B 21 02 00 LD HL,0002H 407E E5 PUSH HL 407F CD 03 36 CALL 3603H 4082 21 CC 40 LD HL,40CCH 4085 E5 PUSH HL 4086 21 03 00 LD HL,0003H 4089 E5 PUSH HL 408A CD 03 36 CALL 3603H 408D 21 CE 40 LD HL,40CEH 4090 E5 PUSH HL 4091 2A C6 40 LD HL,(40C6H) 4094 E5 PUSH HL 4095 2A C8 40 LD HL,(40C8H) 4098 E5 PUSH HL 4099 2A CA 40 LD HL,(40CAH) 409C E5 PUSH HL 409D 2A CC 40 LD HL,(40CCH) 40A0 E5 PUSH HL 40A1 CD DC 32 CALL 32DCH 40A4 CD 87 33 CALL 3387H 40A7 21 14 00 LD HL,0014H 40AA E5 PUSH HL 40AB CD 34 33 CALL 3334H 40AE CD DC 32 CALL 32DCH 40B1 CD 03 36 CALL 3603H 40B4 3E 00 LD A,00H リスト3 8QUEENソースリスト 10 CLS:TIME=0 20 LOCATE 12,7:PRINT "-----------" 30 LOCATE 12,8:PRINT " 8-QUEEN " 40 LOCATE 12,9:PRINT "-----------" 50 DIM BD(8):I=1 60 ' 100 J=0 200 J=J+1:IF J=9 THEN 800 210 K=1 300 C=BD(K):D=I-K:IF D=0 THEN 400 310 IF C=J OR C=J+D OR C=J-D THEN 200 320 K=K+1:GOTO 300 400 BD(I)=J 410 I=I+1:IF I<9 THEN 100 420 IF Q=0 THEN Q=Q+1:GOTO 500 430 Q=Q-1 440 ' 500 Z=Z+1:LOCATE 4,2:CALL &H3E:PRINT "(";Z;")" 510 PRINT SPC(9);"┌┬┬┬┬┬┬┬┐" 520 FOR L=1 TO 8 530 PRINT SPC(9);"|" 540 FOR A=1 to 8 550 IF A=BD(L) THEN PRINT "Q|";ELSE PRINT " |"; 560 NEXT 570 PRINT:IF L=8 THEN 600 580 PRINT SPC(9);"├┼┼┼┼┼┼┼┤"; 590 NEXT 600 PRINT SPC(9);"└┴┴┴┴┴┴┴┘" 610 ' 700 FOR I=1 TO 8 710 LOCATE 26,I+I+2:PRINT BD(I) 720 NEXT 730 PRINT:PRINT TIME 740 ' 800 I=I-1:J=BD(I) 810 IF I<>0 THEN 200 820 PRINT:PRINT " FINISH" 830 END