diff --git a/colordemo.wb b/colordemo.wb new file mode 100644 index 0000000..bd98f09 --- /dev/null +++ b/colordemo.wb @@ -0,0 +1,11 @@ +100 rem draw random characters +110 if hardarch = 0 then print "Try in WonerSwanColor":a=wait:end +120 colormode 128 +200 for i=0 to 1000 +300 locate rnd(28), rnd(17):color rnd(4), rnd(4):print chr(rnd(256)); +400 next +450 locate 0,0:color 3,0:print "Push START to exit...." +500 rem palette random +600 palette rnd(4), rnd(16), rnd(16), rnd(16) +700 waitvb 30 +800 goto 500 diff --git a/keywords.h b/keywords.h index f64fb7d..902eed1 100644 --- a/keywords.h +++ b/keywords.h @@ -34,12 +34,15 @@ #define KEYWORD_INT 0x9b #define KEYWORD_TRON 0x9c #define KEYWORD_TROFF 0x9d +#define KEYWORD_COLORMODE 0x9e +#define KEYWORD_PALETTE 0x9f +#define KEYWORD_COLOR 0xa0 -#define KEYWORD_AND 0xa0 -#define KEYWORD_OR 0xa1 -#define KEYWORD_XOR 0xa2 +#define KEYWORD_AND 0xb0 +#define KEYWORD_OR 0xb1 +#define KEYWORD_XOR 0xb2 -#define KEYWORD_NOT 0xb0 +#define KEYWORD_NOT 0xb8 #define KEYWORD_SCAN 0xc0 #define KEYWORD_WAIT 0xc1 #define KEYWORD_RND 0xc2 @@ -62,6 +65,7 @@ #define KEYWORD_SCAN_Y2 0xd7 #define KEYWORD_SCAN_Y3 0xd8 #define KEYWORD_SCAN_Y4 0xd9 +#define KEYWORD_HARDARCH 0xda #define KEYWORD_AX 0xe0 #define KEYWORD_BX 0xe1 @@ -79,9 +83,9 @@ #define KEYWORD_STEP 0xf3 #define KEYWORDS_STATEMENT_FROM 0x80 -#define KEYWORDS_STATEMENT_TO 0x9d -#define KEYWORDS_2OP_FROM 0xa0 -#define KEYWORDS_2OP_TO 0xa2 +#define KEYWORDS_STATEMENT_TO 0xa0 +#define KEYWORDS_2OP_FROM 0xb0 +#define KEYWORDS_2OP_TO 0xb2 /* WONBE 中間言語フォーマット @@ -93,6 +97,7 @@ WONBE  1行の構造 WORD 行番号 (1-32767) +WORD 行の長さ 任意の中間コードの列 BYTE 0x0d 行末ターミネータ diff --git a/makefile b/makefile index db89204..c9936e7 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ INCLUDE=C:\vshare\ww\dev\WWitch\include LIB=..\COMMON -LIBS=libww.lib runtime.lib +LIBS=libww.lib libwwc.lib runtime.lib LINKER=..\..\vc15\bin\link CC=..\..\vc15\bin\cl diff --git a/makefile.tc b/makefile.tc new file mode 100644 index 0000000..d126588 --- /dev/null +++ b/makefile.tc @@ -0,0 +1,23 @@ + +# start up routine +C0WW_JAPANESE2=..\common\c0wwjpn2.obj + +C0WW=$(C0WW_JAPANESE2) + +LIBWW=@..\common\libww.rsp + +CFLAGS=-DWW -ms -zPCGROUP -zSDGROUP -zGDGROUP + +all: wonbe.fx + +wonbe.fx: wonbe.bin + mkfent wonbe.cf + +wonbe.bin: wonbe.obj + tlink /m /c $(C0WW) wonbe, wonbe, wonbe, $(LIBWW) + exe2fbin wonbe.exe wonbe.bin + +wonbe.obj: wonbe.c + tcc -c $(CFLAGS) $(DEFINES) -IC:\vshare\ww\dev\WWitch\include wonbe.c + + diff --git a/wonbe.c b/wonbe.c index 6121777..49ccc99 100644 --- a/wonbe.c +++ b/wonbe.c @@ -21,6 +21,7 @@ #include #include #include +#include #define assert(x) #endif #include "keywords.h" @@ -33,7 +34,7 @@ #include #endif -char myVersion[] = "0.05"; +char myVersion[] = "0.06"; #ifdef WW #define NEWLINE "\xa\xd" @@ -90,6 +91,13 @@ void fatalExit( const char * msg ) } #endif +#ifdef WW +BOOL isWonderSwanColor() +{ + return wwc_get_hardarch() != HARDARCH_WS; +} +#endif + BOOL commonPrint( FILE FAR * fp, const char * msg,... ) { #ifdef WW @@ -184,6 +192,8 @@ KEYWORDITEM keywordsC[] = { { KEYWORD_CALL, "call" }, { KEYWORD_CSEG, "cseg" }, { KEYWORD_CX,"cx" }, + { KEYWORD_COLORMODE,"colormode" }, + { KEYWORD_COLOR,"color" }, { 0,NULL } }; @@ -216,6 +226,11 @@ KEYWORDITEM keywordsG[] = { { 0,NULL } }; +KEYWORDITEM keywordsH[] = { + { KEYWORD_HARDARCH,"hardarch" }, + { 0,NULL } +}; + KEYWORDITEM keywordsI[] = { { KEYWORD_IF,"if" }, { KEYWORD_INT, "int" }, @@ -250,6 +265,7 @@ KEYWORDITEM keywordsP[] = { { KEYWORD_PLAY,"play" }, { KEYWORD_PEEK, "peek" }, { KEYWORD_POKE, "poke" }, + { KEYWORD_PALETTE, "palette" }, { 0,NULL } }; @@ -309,7 +325,7 @@ KEYWORDITEM keywordsX[] = { KEYWORDITEM * keywordsIndex[26] = { keywordsA, keywordsB, keywordsC, keywordsD, - keywordsE, keywordsF, keywordsG, NULL, + keywordsE, keywordsF, keywordsG, keywordsH, keywordsI, NULL, NULL, keywordsL, keywordsM, keywordsN, keywordsO, keywordsP, NULL, keywordsR, keywordsS, keywordsT, @@ -506,14 +522,14 @@ void cantContinue() void saveError() { - commonPrint(NULL, "Save Erroor in %d\x7" NEWLINE, currentLineNumber ); + commonPrint(NULL, "Save Error in %d\x7" NEWLINE, currentLineNumber ); bForceToReturnSuper = TRUE; requestNextAction = REQUEST_INTERACTIVE; } void paramError() { - commonPrint(NULL, "Parameter Erroor in %d\x7" NEWLINE, currentLineNumber ); + commonPrint(NULL, "Parameter Error in %d\x7" NEWLINE, currentLineNumber ); bForceToReturnSuper = TRUE; requestNextAction = REQUEST_INTERACTIVE; } @@ -1002,6 +1018,12 @@ SHORT calcValue() return 1024; case KEYWORD_SCAN_Y4: return 2048; + case KEYWORD_HARDARCH: +#ifdef WW + return wwc_get_hardarch(); +#else + return 0; /* DUMMY VALUE */ +#endif case KEYWORD_DEFSEG: return defseg; case KEYWORD_DSEG: @@ -1961,6 +1983,96 @@ void st_troff() traceFlag = FALSE; } +void st_colormode() +{ + SHORT newmode; + newmode = expr(); + if( bForceToReturnSuper ) return; +#ifdef WW + if( isWonderSwanColor() ) { + /*SHORT result;*/ + /*result =*/ wwc_set_color_mode( newmode ); + /*if( result != newmode ) {*/ + /* paramError();*/ /* 値の設定に失敗したとき */ + /* return;*/ + /*}*/ + } +#else + printf("colormode: %d\n", newmode ); +#endif +} + +void st_palette() +{ + SHORT index, r, g, b; + BYTE ch; + index = expr(); + if( bForceToReturnSuper ) return; + while( TRUE ) { + ch = *executionPointer++; + if( ch != ' ' && ch != '\t' ) break; + } + if( ch != ',' ) { + syntaxError(); + return; + } + r = expr(); + if( bForceToReturnSuper ) return; + + while( TRUE ) { + ch = *executionPointer++; + if( ch != ' ' && ch != '\t' ) break; + } + if( ch != ',' ) { + syntaxError(); + return; + } + g = expr(); + if( bForceToReturnSuper ) return; + + while( TRUE ) { + ch = *executionPointer++; + if( ch != ' ' && ch != '\t' ) break; + } + if( ch != ',' ) { + syntaxError(); + return; + } + b = expr(); + if( bForceToReturnSuper ) return; + +#ifdef WW + if( isWonderSwanColor() ) { + wwc_palette_set_color(0, index, ((r << 8)&0xf00) | ((g << 4)&0xf0) | (b&0xf) ); + } +#else + printf("palette: %d (%d,%d,%d)\n", index, r, g, b ); +#endif +} + +void st_color() +{ + SHORT fore, back; + BYTE ch; + fore = expr(); + if( bForceToReturnSuper ) return; + while( TRUE ) { + ch = *executionPointer++; + if( ch != ' ' && ch != '\t' ) break; + } + if( ch != ',' ) { + syntaxError(); + return; + } + back = expr(); + if( bForceToReturnSuper ) return; +#ifdef WW + font_set_color( (fore & 0x03) | ((back << 2) & 0x0c)); +#else + printf("color: %d %d\n", fore & 3, back & 3 ); +#endif +} + /* 行エディタ */ void editLine() { @@ -2243,7 +2355,10 @@ NEARPROC statements[KEYWORDS_STATEMENT_TO-KEYWORDS_STATEMENT_FROM+1] = { st_call, st_int, st_tron, - st_troff + st_troff, + st_colormode, + st_palette, + st_color }; void interpreterMain() diff --git a/wonbe.exe b/wonbe.exe index ed662f8..a212bc9 100644 Binary files a/wonbe.exe and b/wonbe.exe differ diff --git a/wonbe.fx b/wonbe.fx index ff8530b..3b30327 100644 Binary files a/wonbe.fx and b/wonbe.fx differ diff --git a/wonbe.txt b/wonbe.txt index 8ab2572..a96c450 100644 --- a/wonbe.txt +++ b/wonbe.txt @@ -1,6 +1,6 @@ ワンべぇ: WONBE, WonderWitch BASIC Environment - 暫定マニュアル Ver 0.05 - 2000年12月10日 + 暫定マニュアル Ver 0.06 + 2001年1月29日 株式会社ピーデー 川俣 晶 This software is distributed under GNU General Public License @@ -9,8 +9,9 @@  ワンべぇは、WonderWitch上で使用できる小型BASICインタプリタです。  WonderWitch上ですべての機能が稼働し、シリアルケーブル経由で接続された一般の通信ソフトで操作します。デバッグ済みのプログラムを実行する場合は、シリアルケーブルも通信ソフトも必要ありません。  WonderWitchのテキスト画面を扱う最小限度のステートメント(cls,locate,print)と、最小限度のボタン入力機能(wait,scan)を持ち、簡易なミニゲームが書けます。 + WonderSwan Color使用時には4色カラーモードが可能です。  動作テスト用にWin32上で動くバイナリーもありますが、これは、BASIC本体の動作確認用と割り切ってください。 - ドキュメントは、ちょっと見難いと思いますが、暫定版とします。 + ドキュメントは、ちょっと見難いかもしれませんが、有志が見やすいものを作ってくれることを期待します。 ●必要なもの ・開発時 @@ -187,6 +188,25 @@ tron troff  トレースモードをオフにします。 +colormode 式 + カラーモードを設定します。WonderSwan Colorでのみ使用できます。 + 式の値は以下の通りです。 +0x00 モノクロモード +0x80 4色モード +0xC0 16色モード (設定できますがワンべぇの機能からは描画できません) +0xE0 16色PACKEDモード (設定できますがワンべぇの機能からは描画できません) + Win32版では機能しません。 + +color 式,式 + 描画する文字の色を指定します。最初の式が前景色のインデックス、2番目の式が背景色のインデックスです。それぞれ、0〜3のみ指定できます。 + 実行開始時の初期状態はcolor 3,0に相当する状態です。 + Win32版では機能しません。 + +palette 式,式,式,式 + パレットを指定します。最初の式が設定するパレットのインデックス(0〜3)を指定します。2番目から4番目の式が、それぞれ、R,G,Bの値を示します。R,G,Bの値はそれぞれ0〜15の範囲内です。 + Win32版では機能しません。 +例: palette 0,15,0,0 + ● 2項演算子  + - * / < > = <= >= <> and or xor @@ -258,6 +278,10 @@ sseg  実行中のSSセグメントレジスタの値を返します。マシン語スタックがこのセグメントにあります。  Win32版では機能しません。 +hardarch + 現在実行中のWonderSwanがColorモデルかどうかを返します。モノクロWonderSwanなら0。WonderSwan Colorなら1になります。 + Win32版では機能しません。 + ● ファイル保存時の拡張子  ワンべぇのソースフィルは、".wb"で終わるファイル名にしておいて下さい。loadなどのコマンドでは拡張子に関係なく読み込めますが、エントランスメニューに表示されるのは".wb"で終わるファイル名だけです。 @@ -270,8 +294,54 @@ sseg  要するに、誰でも、どんな目的にも使用して良いということです。ただし、本ソフトを売ってはいけません。また、ソースコードは必ず公開しなければなりません。商品の中に収録することは可ですが、本ソフトを利用者が自由にコピーして配布することを妨げてはなりません。  2000年12月現在、ソースコードは株式会社ピーデーの川俣晶(autumn@piedey.co.jp)が管理しています。有益なソースコードの修正をフィードバックしてくれれば、こちらのソースツリーに反映します。 +● 余談 + ワンべぇは、私こと川俣が、20世紀への感謝と決別の気持ちで作ったものです。つまり、私にとって、マイコン/パソコンに出会ったという事件こそが、20世紀最大のイベントであり、そこで大きな役割を果たした超小型インタプリタ言語達、Tiny BASIC、VTL、GAME、TL/1は大きな印象を私の中に残したのです。そして、当時、私はプログラム言語を自分で作りたくて、一生懸命研究を重ねていたのも、また事実です。結局、いくつものトイ言語を開発しました。必要とあれば実用言語も作りました。ENIXのTOKYOナンパストリートをFM-7からPC-8801に移植するときにはメモリ効率を上げるために整数型の小型インタプリタを作ったりもしました。しかし、最終的に構造化アセンブラの匂いを微かに含んだ自作のZ-80用アセンブラ開発システムAZASをもって自作言語の世界は終着駅を迎えたわけです。この時点で、明らかに、Tiny BASICのような言語を開発する意味がなかったのです。必要な性能を得るためには、アセンブラレベルの開発が不可欠だったためです。作ることはできたけれど、作る意味は既に無かったのです。そして、時代が16bitの時代に移ると共に、私も自作言語を使うのはやめて、出来の良い既存の処理系を使うようになりました。MASM 1.27〜, Turbo Pascal 3.0, Turbo C 1.5〜2.0, MS-C 6.0〜, Visual BASIC 1.0〜, JDK 1.02〜などなど。しかし、ふと20世紀も終わる頃に振り返ると、右も左も分からない少年時代に憧れたあのシンプルなTiny BASICが思い出されたわけです。だから、これこそが私にとっての20世紀そのもの、という気持ちを込めて作ったのです。 + そのような訳で、これにはある種の世代性があります。BASICでゲームを作るというと、MSXとかベーマガという世代もいるようですが、はっきり言って、この世代にはワンべぇは理解できないと思います。MSXに搭載されたBASICは、超高機能巨大BASICであって、Tiny BASICとはまったく世代が違うのです。PC-8801やFM-7まで遡れる世代でも、まだ分からないでしょう。結局のところ、これが分かるためには、パソコンがパソコンと呼ばれる前、マイコンと呼ばれ、ケースに収まっておらず基板が剥き出しの状態で売られていた時代まで遡る必要があります。つまりは、そういう時代、何かを得ようとすれば手作りの要素が入り込んで当たり前の時代のロマンへ捧げるものが、このワンべぇと言うことになります。そして、そのロマンを再現するにふさわしい土台として、WonderWitchという製品がこの時代に登場したことも、不思議な縁だと思います。 + というわけで、私がワンべぇ利用者に言いたいことは一つです。このロマンを分かち合ってくれ。つまり、気に入らないところは、どんどん改造してくれ。好き勝手に改造して使えることを保証するために、ソースはGPLにしてあります。 + +● 同梱ワンべぇプログラム +▼デモ +colordemo.wb + カラー機能のデモ (これのみWonderSwanColor用) +▼ゲーム +ctb.wb + 落ち物ゲーム +janken.wb + ジャンケンゲーム +shoot.wb + シューティングゲーム +star.wb + STAR TREK風ゲーム"STAR WITCH" (同梱star.txt参照) + プログラムの書き方の参考にどうぞ +▼テスト +test.wb + 簡単なインタプリタの動作テスト +testcall.wb + callステートメントの動作テスト +testcont.wb + contステートメントの動作テスト +testfor.wb + forステートメントの動作テスト +testgosub.wb + gosubステートメントの動作テスト +testif.wb + ifステートメントの動作テスト +testint.wb + intステートメントの動作テスト +testlocate.wb + locateステートメントの動作テスト +testlongloop.wb + STARTキーによる中断のテスト +testpeekpoke.wb + peek関数pokeステートメントのテスト + ● 変更履歴 +2001年1月29日 Ver 0.06 +・WonderSwan Colorの開発キットに移行 +・colormode, palette, colorステートメント、hardarchシステム変数を追加 +・ドキュメントに余談を追加 + 2000年12月10日 Ver 0.05 ・Hirotaka JOE Ohkuboさんの差分(0.04j4)をマージ play文が使用可能に (要sound.il) ・?をキーワードdebugと見なす