ワンべぇ2 グレイハウンド 暫定マニュアル Ver 0.01 2002年5月12日 株式会社ピーデー 川俣 晶 ●これは何か?  グレイハウンドは、ワンボタンRUN機能を提供するWinderWitchのための開発環境です。します。構造化構文をサポートする超小型BASIC処理系、統合開発環境、ランタイムインタプリタから構成されます。PCとWonderSwanをシリアルケーブルで接続した状態で使用し、ターゲットプログラムの操作以外は全てPC側で操作します。統合開発環境のツールバー上のRUNボタンをクリックすると、中間コードへのコンパイル、WonderWitchカートリッジへの転送、プログラムの起動が自動的に行われます。PC側ソフトウェアはC#で記述され、.NET Framework上で稼働します。  なお、名前はワンべぇを冠していますが、本ソフトは旧ワンべぇを発展させたものではなく、ゼロから新規に書き起こしたものです。 ●必要なもの ・開発時  WonderWitchのカートリッジとシリアルケーブル、.NET FrameworkがインストールされたPC。(注:.NET Frameworkは、WindowsパソコンからWindows Updateを実行することでインストールできます)  シルアルケーブルはPCのCOM1ポートに接続してください。(現バージョンの制限事項です) ・実行時  グレイハウンド・ランタイム、autorun.ghr、Sound.IL、実行したいプログラムを入れてあるWonderWitchのカートリッジのみ 注意: FreyaOSは1.1.6 beta1以上が必要です。これより古いOSだと、すぐに挙動不安定になります。 ●準備  TransMagicなどで以下のファイルをWonderWitchに転送します。 ・グレイハウンド・ランタイム(grayrun.fx) ・エントランスメニュー(autorun.ghr) ・Sound.IL (WonderWitch本体に付属) ・動作確認用プログラム(hello.ghr) (注:必要に応じて)  転送終了後、確実にTransMagicなどの転送ソフトは終了させます。(終了させないとグレイハウンド統合開発環境がCOMポートを利用できません)  WonderWitch上でグレイハウンド・ランタイムを起動し、PC上で、grayide.exeを起動します。(grayide.exeと同じディレクトリにwonbe2.dllと*.wb2lファイルが必要です。また、デフォルトのセキュリティ設定の関係上、ローカルハードディスク上から実行してください)  これ以後の操作は「グレイハウンド簡易入門」をご覧下さい。 ●開発済みプログラムの実行 ・WonderWitch上でグレイハウンドを実行します ・エントランスメニュー画面で実行したいファイルを選んでAボタンを押します ●開発環境の概要  統合開発環境は、MDI形式で、内部に複数の子ウィンドウを持つことができます。通常は、1つのプロジェクトウィンドウと、1つ以上のソースウィンドウを開いて操作します。プロジェクトウィンドウでは、プロジェクトに属するファイルの指定や、参照するライブラリの指定などを行います。ソースウィンドウでは、ソースコードの編集を行います。  ツールバー上のRUNボタンは中間コードへのコンパイル、WonderWitchへの転送、実行開始の三つの機能を連続して実行します。転送と実行は、WonderWitch上でグレイハウンド・ランタイムが実行されている状態でのみ動作します。 ●言語の概要  ごく軽い構造化BASIC言語モドキです。  データ型は、符号付き16bit整数だけです。  定数は、-32767〜32767の10進数か、&h0000〜&hffffの16進数で記述できます。-32768は変数には記憶できますが、ソースには書けません。(-32767-1のように書いてください) 変数にはローカル変数とグローバル変数が存在します。  配列は1次元のみ宣言できます。配列の添え字は[]でくくって記述します。  演算子の優先順位は「単項演算子 > */ > +- > 比較演算子 > and,or,xor」となります。(比較演算子は、<と>と=で記述する演算子すべて)  計算順序は、括弧()を使って明示的に変更できます。  オーバーフロー、アンダーフローのチェックはありません。溢れは無視されます。ただしゼロ除算はエラーになります。  キーワードの大文字小文字は区別されませんが通常は小文字を使用します。 ●Visual Basicとの相違  構文はVisual Basicとやや似ていますが、一部異なります。  end subやend functionなどは、空白を入れず、endsub、endfunctionとします。  データ型の区別はありませんので、指定できません。変数宣言はdim aのように記述巣し、dim a as integerのようにas integerを付けることはできません。byval, byrefもありません。常に値渡しです。  文字列は文字列の先頭アドレスの値を持ちます。  ifに対応するendifが常に必要です。「if 式 then 文」は「if 式 then 文:endif」と書かねばなりません。  subを呼び出す場合は引数全体を囲む括弧が常に必要です。つまり、a 1,2,3ではなく、a(1,2,3)とします。  行末と:記号は等価です。全てのステートメントは行末か:記号のいずれかで区切られます。  functionはreturn文で値を返します。 ● ステートメント一覧 sub 名前 ( 名前, .... ) ステートメント列 endsub function 名前 ( 名前, .... ) ステートメント列 endfunction  subまたはfunctionを定義します。括弧内には引数の名前をカンマ区切りで列挙します。functionで値を返すにはreturn文を使います。 dim 名前,....  名前を変数として宣言します。subまたはfunction内部に記述した場合はローカル変数となります。そうでなければグローバル変数になります。 名前(引数リスト)  名前のsubを呼び出します。 変数 = 式  式を計算して変数に代入します。letキーワードはサポートしていません。 例: a=b+c call 式  式をオフセットと見なし、システム変数defsegのセグメントにマシン語レベルのサブルーチンコール(FAR)を行います。コールする前にシステム変数AX,BX,CX,DX,SI,DI,DS,ESがそれぞれのレジスタに設定されます。リターン後のレジスタ状態はシステム変数AX,BX,CX,DX,SI,DI,ESに保存されます。(注:DSは戻りません) debug 式 debstr 式 debnl  現バージョンでは機能しません。 end  プログラムの実行を終了します。 exit sub exit function exit do exit while exit for  指定された名前のブロックから脱出します。 for 変数=式 to 式 ステートメント列 next for 変数=式 to 式 step 式 ステートメント列 next  変数の値を変化させながらnextまで繰り返します。  最後の変数の値が終値に一致せず、終値+ステップ値がオーバーフローする場合は無限ループする可能性があります。そのような値は指定しないように注意してください。 if 式 then ステートメント列 endif if 式 then ステートメント列 else ステートメント列 endif  式が0でなければステートメント列を実行します。elseがある場合は条件不成立の時、else以降のステートメント列を実行します。 int 式  式を割り込み番号と見なし、マシン語レベルのシステム割り込み(int)を行います。WonderWitchのBIOSを呼び出すことができます。コールする前にシステム変数AX,BX,CX,DX,SI,DI,DS,ESがそれぞれのレジスタに設定されます。リターン後のレジスタ状態はシステム変数AX,BX,CX,DX,SI,DI,ESに保存されます。(注:DSは戻りません) poke 式,式  最初の式をオフセット、2番目の式を値と見なし、システム変数defsegのセグメントに1バイトのメモリ書き込みを行います。  注意:csegのセグメントはフラッシュメモリなのでpokeでは書き込めません。 return return 式  subまたはfunctionを終了します。functionを終了する場合、式がfunctionの値となります。 run 文字列  指定プログラムを実行します。それに先だって変数やスタックがクリアされます。 randomize 式  乱数の初期値を指定します。これを使わないと必ず同じ順序で乱数が発生します。引数には、システム変数tickを指定すると最適です。 waitvb 式  式の回数だけVBLANKを待ちます。待っている間はSTARTボタンによるブレークを受け付けなくなるので、指定できる値は750までと制限されています。750を超える値を指定するとエラーになります。 do ステートメント列 loop do ステートメント列 until 式  式が成立するまでの間ステートメント列の実行を繰り返します。loopの場合は無限ループになります。 while 式 ステートメント列 wend  式が成立している間ステートメント列の実行を繰り返します。 system  グレイハウンド・ランタイム抜けてOSに戻ります。 play 式  Sound.ILを用いて演奏を行います。 playloop 式  Sound.ILを用いて演奏を行います。演奏はループします。 playstop  演奏を停止します。 playfade  演奏をフェードします。 '文字列  コメントを記述します。(remはありません) ● 2項演算子  + - * / < > = <= >= <> and or xor ● 単項演算子  - not ● 関数 rnd(式)  0から式-1までの範囲の乱数を返します。 abs(式)  式の絶対値を返します。 varptr(変数)  指定した変数のオフセットを返します。 varseg(変数)  指定した変数のセグメントを返します。 peek(式)  式をオフセットと見なし、システム変数defsegのセグメントから1バイトのメモリ読み出しを行います。 scan()  WonderSwanのボタンの状態を調べ、1個の整数値として返します。STARTボタンは実行中断になるので、これは扱えません。 wait()  WonderSwanのボタンが押されるまで待ち、その状態を1個の整数値として返します。STARTボタンは実行中断になるので、これは扱えません。 tick()  システムタイマーのtickを返します。ただし、本来のtick値は符号無し32bit整数であり、ここで得られるのは16bit符号あり整数であることに注意が必要です。はみ出たbitは捨てられます。 playing()  演奏が行われているかどうかを返します。 ● システム変数 (読み書き可能) ax,bx,cx,dx,si,di,ds,es  callおよびintステートメントを使用する際にレジスタの値を指定したり、リターン後のレジスタの値を保存するために使用します。 defseg  peek関数、poke,callステートメントで使用されるセグメント値を保持します。初期値はdsegの値となります。 ● システム変数 (読み出しのみ) dseg  実行中のDSセグメントレジスタの値を返します。変数やワンべぇプログラムの中間言語コードはすべてこのセグメントにあります。 cseg  実行中のCSセグメントレジスタの値を返します。ワンべぇのプログラム本体がこのセグメントにあります。 sseg  実行中のSSセグメントレジスタの値を返します。マシン語スタックがこのセグメントにあります。 ● ライブラリ  現在2つのライブラリがあります。 ・text_screen.wb2l  WonderWitchのテキストBIOSを呼び出します。 ・string.wb2l  簡単な文字列処理を行います。  それぞれ普通のWonbe2の言語で記述されているので詳細はファイルを見てください。 ● 配布規則  本ソフトは、まだ発展途上であり、多くの方々の意見を求めるために、自由に配布し、使用して構いません。ただし、これは、今後の全てのバージョンが配布自由であることを意味しません。将来についてはまったく未定です。  本ソフトの品質に関してはいかなる保証もできません。利用者のリスクでご使用下さい。 ● 将来的に付加されるかもしれない機能 ・ エラー発生時にエラー位置にカーソルを飛ばす ・ コンパイラの最適化機能 ・ デバッグ機能 ・ 背景画像、スプライト画像簡易エディタ ・ 各種BIOS対応のライブラリ ● 付録・BNFモドキ for Wonbe2 program := (sub|function|dim)* sub := 'sub' nmtoken '(' [nmtoken [',' nmtoken]*] ')' statements 'endsub' statementsep function := 'function' nmtoken '(' [nmtoken [',' nmtoken]*] ')' statement* 'endfunction' statementsep dim := 'dim' (nmtoken ['(' expr ')']) [ ',' (nmtoken ['(' constexpr ')'])*] statementsep statements := [statement]* statement := (dim|let|call|debug|debstr|debnl|end|exit|for|if|int |poke|return|run|randomize|waitvb|do|while|system|callsub |play|playloop|playstop|playfade |filesystem_chdir|filesystem_getcwd|filesystem_getent) callsub := nmtoken '(' [ expr (',' expr)* ] ')' statementsep let := lval '=' expr statementsep call := 'call' expr statementsep debug := 'debug' expr statementsep debstr := 'debstr' stringexpr statementsep debnl := 'debnl' statementsep end := 'end' statementsep exit := 'exit' ('do'|'sub'|'function'|'for'|'while') statementsep for := 'for' lval '=' expr 'to' expr ['step' expr] statementsep statements 'next' statementsep if := 'if' expr 'then' statementsep? statements ['else' statementsep? statements] 'endif' statementsep int := 'int' expr statementsep poke := 'poke' expr ',' expr statementsep return := 'return' [expr] statementsep run := 'run' stringexpr statementsep randomize := 'randomize' [expr] statementsep waitvb := 'waitvb' [expr] statementsep do := 'do' statements ('loop'|('until' expr)) statementsep while := 'while' expr statementsep statements 'wend' statementsep system := 'system' statementsep play := 'play' stringexpr statementsep playloop := 'playloop' stringexpr statementsep playstop := 'playstop' statementsep playfade := 'playfade' statementsep filesystem_chdir := 'filesystem_chdir' stringexpr statementsep filesystem_getcwd := 'filesystem_getcwd' expr ',' expr statementsep filesystem_getent := 'filesystem_getent' '(' expr ',' expr ',' expr ')' lval := (systemvars|nmtoken ['[' expr']']) statementsep := (':'|'\n') expr := expr2 [('and'|'or'|'xor') expr2]* expr2 := expr3 [('<'|'>'|'='|'<>'|'<='|'>='|'=<'|'=>') expr3]* expr3 := expr4 [('+'|'-') expr4]* expr4 := value [('*'|'/'|'mod') value]* value := (hexValue|integerValue|nmtoken ('[' expr ']'|'(' [ expr (',' expr)* ] ')')?|'(' expr ')'|'-' value'|'not' value |'scan' '(' ')'|'wait' '(' ')'|'tick' '(' ')'|'playing' '(' ')' |'rnd' '(' expr ')'|'abs' '(' expr ')'|'peek' '(' expr ')' |'varptr' '(' lval ')'|'varseg' '(' lval ')' |'filesystem_nument' '(' expr ')' |systemvars|dseg|cseg|sseg|stringconst) systemvars := (defseg|fileerror|ax|bx|cx|dx|si|di|ds|es) stringexpr := expr ● 変更履歴 2002年5月12日 Ver 0.01 ・最初のバージョン ● 問い合わせ先 株式会社ピーデー http://www.piedey.co.jp/ 川俣 晶 autumn@piedey.co.jp 以上