From 7d4a34e4053497c5a6b02e3854b5312edcc13fe6 Mon Sep 17 00:00:00 2001 From: Kawamata Akira Date: Mon, 29 Jan 2001 12:00:00 +0900 Subject: [PATCH] - Transfer to WonderSwan Color development kit - Add colormode, palette, color statement, hardarch system variable - Add a digression to the document Version 0.06 - from wonbe006.lzh --- colordemo.wb | 11 +++++ keywords.h | 19 +++++--- makefile | 2 +- makefile.tc | 23 ++++++++++ wonbe.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++++--- wonbe.exe | Bin 61440 -> 61440 bytes wonbe.fx | Bin 14884 -> 15332 bytes wonbe.txt | 76 +++++++++++++++++++++++++++++-- 8 files changed, 240 insertions(+), 16 deletions(-) create mode 100644 colordemo.wb create mode 100644 makefile.tc 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 ed662f83a0cb8c6671804869c63f6bde4ee523d8..a212bc93a7b92d93fc8c37ca417aced044b12ae0 100644 GIT binary patch delta 13055 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 VquW^%mB#3nkw&D|Y3F7S`#-BXlOX^A delta 12545 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 WxE1kh;_dO<<829|d0MxYEcrh;VP8i8 delta 6879 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 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と見なす