wonbe.txt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. ワンべぇ: WONBE, WonderWitch BASIC Environment
  2. 暫定マニュアル Ver 0.05
  3. 2000年12月10日
  4. 株式会社ピーデー
  5. 川俣 晶
  6. This software is distributed under GNU General Public License
  7. ●これは何か?
  8.  ワンべぇは、WonderWitch上で使用できる小型BASICインタプリタです。
  9.  WonderWitch上ですべての機能が稼働し、シリアルケーブル経由で接続された一般の通信ソフトで操作します。デバッグ済みのプログラムを実行する場合は、シリアルケーブルも通信ソフトも必要ありません。
  10.  WonderWitchのテキスト画面を扱う最小限度のステートメント(cls,locate,print)と、最小限度のボタン入力機能(wait,scan)を持ち、簡易なミニゲームが書けます。
  11.  動作テスト用にWin32上で動くバイナリーもありますが、これは、BASIC本体の動作確認用と割り切ってください。
  12.  ドキュメントは、ちょっと見難いと思いますが、暫定版とします。
  13. ●必要なもの
  14. ・開発時
  15.  WonderWitchのカートリッジとシリアルケーブル。38400bpsの無手順通信が可能な通信ソフトを持つパソコン等。
  16. ・実行時
  17.  ワンべぇと実行したプログラムを入れてあるWonderWitchのカートリッジのみ
  18. ●準備
  19. ・TransMagicなどでワンべぇ(fonbe.fx)をWonderWitchに転送します。
  20. ・TransMagicなどの接続を切り、通信ソフトから38400bpsの無手順通信を開始します
  21. ・WonderWitch上でワンべぇを実行します
  22. ・エントランスメニュー画面でY2を押します
  23. ・通信ソフトに、ワンべぇの名前が表示され、"*Ready"と出ます
  24. ・これで準備完了です
  25. ・print "hello!"リターンと打ってWonderWitchの画面を見てください。文字が出ていれば正常です。
  26. ●開発済みプログラムの実行
  27. ・WonderWitch上でワンべぇを実行します
  28. ・エントランスメニュー画面で実行したいファイルを選んでAボタンを押します
  29. ●開発環境の概要
  30.  通常の行番号ベースのエディタが使えます。
  31.  行番号に引き続いて1行を入力してリターンを押すと、プログラムに記録されます。
  32.  行番号だけを入力してリターンを押すとその行は削除されます。
  33.  行番号無しで命令を入力すると即座に実行されます。
  34.  編集はバックスペースによる1文字削除しか使えません。通信ソフトからホスト上のエディタにCOPY&PASTEして、エディタ上で編集してから、通信ソフトに貼り付けてワンべぇに送ると便利です。ただし、フロー制御が無いので、複数行まとめて貼り付けると文字落ちが生じます。張り付けは1行単位で行ってください。プログラムはホスト上で編集してあらかじめTransMagicなどで送信しておくのも有効な手段です。
  35.  現状では2Kバイト以上のプログラムを作成してもsaveコマンドで保存できません。listコマンドを実行してから通信ソフト上でCOPY&PASTEしてホスト上に保存してください。
  36.  実行中は、STARTボタンを押すといつでも対話モードに戻れます。その後、contステートメントで実行を継続できます。
  37.  中間言語に翻訳してから処理するため、中間言語に翻訳できない場合は、入力直後にエラーが出ます。
  38. ●言語の概要
  39.  ごく軽いBASIC言語です。
  40.  昔あったTiny BASICに近い構文を持っています。
  41.  データ型は、符号付き16bit整数だけです。
  42.  定数は、-32767~32767の10進数か、0x0000~0xffffの16進数で記述できます。-32768は変数には記憶できますが、ソースには書けません。(-32767-1のように書いてください)
  43.  変数は、グローバル変数として、A~Zのアルファベット大文字1文字のものが26個あります。
  44.  ローカル変数として、a~zのアルファベット小文字1文字のものが26個あります。ローカル変数はgosubステートメントを実行したときに新しい領域が割り当てられ、returnステートメントを実行したときにgosubする前の領域が戻ってきます。
  45.  配列変数は@(インデックス)という形式の1次元配列だけが使用できます。使用可能なサイズは、プログラム記憶領域(48Kバイト)の残りサイズに等しくなります。インデックスは0から始まります。(例: for i=0 to 9:print @(i):next)
  46.  演算子の優先順位は「単項演算子 > */ > +- > 比較演算子 > and,or,xor」となります。(比較演算子は、<と>と=で記述する演算子すべて)
  47.  計算順序は、括弧()を使って明示的に変更できます。
  48.  オーバーフロー、アンダーフローのチェックはありません。溢れは無視されます。ただしゼロ除算はエラーになります。
  49.  ステートメントなどのキーワードはすべてアルファベット小文字で入力します。大文字を使っても小文字になります。
  50. ● ステートメント一覧
  51. 変数 = 式
  52.  式を計算して変数に代入します。letキーワードはサポートしていません。
  53. 例: a=b+c
  54. if 式 then ステートメント列
  55.  式が0でなければステートメント列を実行します。0なら次の行から実行を継続します。elseはありません。
  56. 例: if (a=0) and (b=1) then goto 200
  57. print [文字列|式|chr(式)][,|;]...
  58.  WonderWitchのテキスト画面の現在のカーソル位置から文字を表示します。
  59.  式の前後に空白文字が入ることはありません。
  60.  chr(式)は、式の値を文字コードと見なして表示します。
  61.  制御コードは扱いませんので、WonderWitchのキャラクタージェネレータにあるすべての文字が表示できます。
  62.  区切り文字の;は何もしません。,はタブストップ位置までカーソルを進めます。
  63.  print文の最後は;または,で終わった場合は改行しません。
  64. 例: print "計算結果=",chr(34);1+2;chr(34)
  65. locate 式,式
  66.  WonderWitchのテキスト画面の現在のカーソル位置を設定します。引数はx,yの順番です。
  67. 例: locate 10,10
  68. cls
  69.  WonderWitchのテキスト画面を消去します。
  70. 例: cls
  71. goto 式
  72.  式の行番号に飛びます。計算型goto文が可能です。つまり、goto A*100とすると、Aが1のきは100行目に。2のときは200行目に飛びます。
  73. 例: goto 100
  74. gosub 式
  75.  スタックに現在位置とローカル変数を積んで、式の行番号に飛びます。gotoと同じく計算型gosubが可能です。
  76.  スタックはforと合わせて8レベルまでです。
  77. 例: gosub 100
  78. return
  79.  gosubがスタックに積んだ情報を取り出して、そこに処理を戻す。ローカル変数も戻る。
  80. 例: return
  81. for 変数=式 to 式
  82. for 変数=式 to 式 step 式
  83.  変数の値を変化させながらnextまで繰り返します。
  84.  最後の変数の値が終値に一致せず、終値+ステップ値がオーバーフローする場合は無限ループする可能性があります。そのような値は指定しないように注意してください。
  85. 例: for i=0 to 10 step 2
  86. next
  87.  forステートメントの位置に戻って動作を繰り返します。forステートメントで示した条件が満たされた場合は、nextの次に動作が進みます。nextの後に変数名を書くとエラーになります。
  88. 例: next
  89. end
  90.  プログラムの実行を終了します。
  91. break
  92.  その位置で一時的に実行を中断します。contステートメントで実行を継続できます。
  93. rem 文字列
  94. '文字列
  95.  コメントを記述します。後ろに:を置いてステートメントを続けることはできません。
  96. 例: rem これはテストプログラムです。
  97. 例: 'この式が座標を計算します
  98. new
  99.  メモリ上のプログラムを消去します。
  100. list [行番号][-][行番号]
  101.  指定範囲の行番号のプログラムをリストします。すべて省略すると全行をリストします。
  102. run
  103. run 式
  104. run 文字列
  105.  プログラムを実行します。それに先だって変数やスタックがクリアされます。
  106.  runはメモリ上のプログラムを先頭から。run 式は、式の行番号から。run 文字列は文字列のファイルを読み込んでそれを実行します。
  107. 例: run
  108. 例: run 100
  109. 例: run "test.wb"
  110. cont
  111.  breakステートメントやSTARTボタンによるブレークによって停止した位置から実行を再開します。
  112. save 文字列
  113.  文字列をファイル名としてメモリ上のプログラムを保存します。保存されるのは内部表現ではなくテキスト形式です。
  114.  現在はWonderWitchのファイルシステムの制約上、2Kバイトを超えるファイルを保存できません。listコマンドで端末にリストを送ってそれをCOPY&PASTEして保存してください。
  115. 例: save "hello.wb"
  116. load 文字列
  117.  文字列をファイル名としてファイルからプログラムを読み込みます。読み込むのはテキスト形式で、改行はCRLFとLFのどちらでも可です。中間言語に翻訳できない行がある場合はそこで読み込みが中断されます。プログラムの実行中に使用した場合は実行は中断されます。
  118. 例: load "hello.wb"
  119. merge 文字列
  120.  メモリ上のプログラムにファイル上のプログラムを混ぜ合わせます。同じ行番号の行は読み込まれる方が優先されます。中間言語に翻訳できない行がある場合はそこで読み込みが中断されます。プログラムの実行中に使用した場合は実行は中断されます。
  121. 例: load "merge.wb"
  122. randomize 式
  123.  乱数の初期値を指定します。これを使わないと必ず同じ順序で乱数が発生します。引数には、システム変数tickを指定すると最適です。
  124. 例: randomize tick
  125. exit
  126.  ワンべぇを抜けてOSに戻ります。
  127. debug [文字列|式|chr(式)][,|;]...
  128.  printステートメントと同等ですが、WonderWitchの画面ではなく、シリアルポートに送ります。単体で実行する場合には使えないデバッグ専用の機能です。
  129. waitvb 式
  130.  式の回数だけVBLANKを待ちます。待っている間はSTARTボタンによるブレークを受け付けなくなるので、指定できる値は750までと制限されています。750を超える値を指定するとエラーになります。
  131. 例: waitvb 75
  132. files
  133.  カレントディレクトリのファイル一覧をシリアルポートに送ります。単体で実行する場合には使えないデバッグ専用の機能です。
  134. play 文字列
  135.  引数の文字列をMMLとして再生します。使用可能にするには「● playステートメントを有効にする方法」を参照してください。
  136. 例: play "cde"
  137. poke 式,式
  138.  最初の式をオフセット、2番目の式を値と見なし、システム変数defsegのセグメントに1バイトのメモリ書き込みを行います。
  139.  Win32版では機能しません。
  140.  注意:csegのセグメントはフラッシュメモリなのでpokeでは書き込めません。
  141. call 式
  142.  式をオフセットと見なし、システム変数defsegのセグメントにマシン語レベルのサブルーチンコール(FAR)を行います。コールする前にシステム変数AX,BX,CX,DX,SI,DI,DS,ESがそれぞれのレジスタに設定されます。リターン後のレジスタ状態はシステム変数AX,BX,CX,DX,SI,DI,ESに保存されます。(注:DSは戻りません)
  143.  Win32版では機能しません。
  144. int 式
  145.  式を割り込み番号と見なし、マシン語レベルのシステム割り込み(int)を行います。WonderWitchのBIOSを呼び出すことができます。コールする前にシステム変数AX,BX,CX,DX,SI,DI,DS,ESがそれぞれのレジスタに設定されます。リターン後のレジスタ状態はシステム変数AX,BX,CX,DX,SI,DI,ESに保存されます。(注:DSは戻りません)
  146.  Win32版では機能しません。
  147. tron
  148.  トレースモードをオンにします。トレースモードに入ると、新しい行の実行始めるごとに、行番号をデバッグコンソールに送信します。
  149. troff
  150.  トレースモードをオフにします。
  151. ● 2項演算子
  152.  + - * / < > = <= >= <> and or xor
  153. ● 単項演算子
  154.  - not
  155. ● 関数
  156. rnd(式)
  157.  0から式-1までの範囲の乱数を返します。
  158. abs(式)
  159.  式の絶対値を返します。
  160. varptr(変数)
  161.  指定した変数のオフセットを返します。
  162.  Win32版では機能しません。
  163. varseg(変数)
  164.  指定した変数のセグメントを返します。
  165.  Win32版では機能しません。
  166. peek(式)
  167.  式をオフセットと見なし、システム変数defsegのセグメントから1バイトのメモリ読み出しを行います。
  168.  Win32版では機能しません。
  169. ● システム変数 (読み書き可能)
  170. ax,bx,cx,dx,si,di,ds,es
  171.  callおよびintステートメントを使用する際にレジスタの値を指定したり、リターン後のレジスタの値を保存するために使用します。
  172. defseg
  173.  peek関数、poke,callステートメントで使用されるセグメント値を保持します。初期値はdsegの値となります。
  174. ● システム変数 (読み出しのみ)
  175. scan
  176.  WonderSwanのボタンの状態を調べ、1個の整数値として返します。SCAN_で始まるシステム変数とandを取ることで、どのボタンが押されているかどうか判定できます。STARTボタンは実行中断になるので、これは扱えません。
  177. wait
  178.  WonderSwanのボタンが押されるまで待ち、その状態を1個の整数値として返します。SCAN_で始まるシステム変数とandを取ることで、どのボタンが押されたか判定できます。STARTボタンは実行中断になるので、これは扱えません。
  179. scan_a
  180. scan_b
  181. scan_x1
  182. scan_x2
  183. scan_x3
  184. scan_x4
  185. scan_y1
  186. scan_y2
  187. scan_y3
  188. scan_y4
  189.  それぞれのボタンのマスク値を示す定数を返します。
  190.  Aボタンが押されているかどうかを調べるには、下記の例のように記述します。
  191. 例: if scan and scna_a then print "Aボタンが押さている"
  192. tick
  193.  システムタイマーのtickを返します。ただし、本来のtick値は符号無し32bit整数であり、ここで得られるのは16bit符号あり整数であることに注意が必要です。はみ出たbitは捨てられます。
  194. dseg
  195.  実行中のDSセグメントレジスタの値を返します。変数やワンべぇプログラムの中間言語コードはすべてこのセグメントにあります。
  196.  Win32版では機能しません。
  197. cseg
  198.  実行中のCSセグメントレジスタの値を返します。ワンべぇのプログラム本体がこのセグメントにあります。
  199.  Win32版では機能しません。
  200. sseg
  201.  実行中のSSセグメントレジスタの値を返します。マシン語スタックがこのセグメントにあります。
  202.  Win32版では機能しません。
  203. ● ファイル保存時の拡張子
  204.  ワンべぇのソースフィルは、".wb"で終わるファイル名にしておいて下さい。loadなどのコマンドでは拡張子に関係なく読み込めますが、エントランスメニューに表示されるのは".wb"で終わるファイル名だけです。
  205. ● playステートメントを有効にする方法
  206.  sound.ilを、/rom0に転送しておいてください。このファイルが無いとplayステートメントを使用しても音が出ません。sound.ilが無ければ音が出ないだけで、プログラムは実行されます。
  207.  Win32版では、クジラ飛行机さん作の"テキスト音楽「サクラ」"に含まれるdsakura.dllを用いてMMLを再生することができます。このソフトは、http://www.text2music.com/より入手できます。dsakura.dllは環境変数pathの通ったディレクトリならどこに置いても構いません。必要ファイルはこのDLLのみです。dsakura.dllが無ければ音が出ないだけで、プログラムは実行されます。ただし、MMLの仕様が完全に同じではないことに注意してください。なお、Win32版ではplayステートメント実行時にカレントディレクトリに$$$.midというファイルを生成します。実行終了後には削除して構いません。
  208. ● 配布規則
  209.  このバージョンより、本ソフトは、GNU General Public License (GPL)に従うものとしました。詳細はhttp://www.gnu.org/にあります。
  210.  要するに、誰でも、どんな目的にも使用して良いということです。ただし、本ソフトを売ってはいけません。また、ソースコードは必ず公開しなければなりません。商品の中に収録することは可ですが、本ソフトを利用者が自由にコピーして配布することを妨げてはなりません。
  211.  2000年12月現在、ソースコードは株式会社ピーデーの川俣晶(autumn@piedey.co.jp)が管理しています。有益なソースコードの修正をフィードバックしてくれれば、こちらのソースツリーに反映します。
  212. ● 変更履歴
  213. 2000年12月10日 Ver 0.05
  214. ・Hirotaka JOE Ohkuboさんの差分(0.04j4)をマージ play文が使用可能に (要sound.il)
  215. ・?をキーワードdebugと見なす
  216. ・then直後が10進整数値ならgotoの省略を許す
  217. ・マシン語関連機能の追加
  218. ・tron/troffコマンドの追加(実行行番号の表示)
  219. 2000年11月12日 Ver 0.04
  220. ・13など0x0dを含む行番号を削除しようとするとプログラムが壊れたバグを取った
  221. ・処理系をTurbo C2.0からVisual C++ 1.51に変更
  222. ・ロード速度を大幅に改善
  223. ・エントランスメニューは.wbのみ表示
  224. ・サンプルゲームSTAR WITCH(star.wb, star.txt)を添付
  225. 2000年11月7日 Ver 0.03
  226. ・演算子の優先順位 単項演算子 > */ > +- > 比較演算子 > and,or,xor
  227. ・比較演算子成立時の値を1から-1に変更
  228. ・プロンプトをOKに変更
  229. ・print/debugで負数が正数として出力されていたバグを解消
  230. ・forの終値がピッタリ一致しなくてもnextでループ脱出するように変更
  231. 2000年11月7日 Ver 0.02 scan_XXが機能しないバグを取った
  232. 2000年11月6日 Ver 0.01 最初のバージョン
  233. ● 問い合わせ先
  234. 株式会社ピーデー http://www.piedey.co.jp/
  235. 川俣 晶 autumn@piedey.co.jp
  236. 以上