diff --git a/janken.wb b/janken.wb new file mode 100644 index 0000000..8fa52a9 --- /dev/null +++ b/janken.wb @@ -0,0 +1,95 @@ +100 rem じゃんけんゲーム for ワンべぇ +110 rem Nov.6,2000 by autumn +200 T=40 'waitvbする長さ +900 randomize tick +1000 cls +1010 print " ■  ■              ■" +1020 print " ■ ■ ■             ■" +1030 print " ■  ■              ■" +1040 print " ■  ■■   ■ ■■     ■" +1050 print " ■       ■ ■      ■" +1060 print " ■       ■ ■■■    ■" +1070 print " ■       ■■   ■  ■ ■  ■" +1080 print " ■      ■■    ■  ■■■   ■" +1090 print " ■      ■■    ■  ■ ■   ■" +1100 print " ■    ■   ■ ■■  ■  ■   ■" +1110 print " ■    ■   ■■■   ■   ■ ■■" +1120 print " ■   ■■   ■     ■   ■ ■" +1130 print " ■■■■■    ■    ■    ■■■" +1140 print "   ■■      ■        ■" +1200 waitvb T +2000 cls +2010 print "       ■        ■" +2020 print "  ■    ■        ■" +2030 print "  ■    ■       ■" +2040 print " ■■    ■       ■" +2050 print " ■  ■■■■■■■    ■" +2060 print " ■  ■■■■      ■" +2070 print " ■     ■      ■■■   ■" +2080 print " ■     ■     ■■■■    ■" +2090 print " ■     ■     ■  ■    ■" +2100 print " ■     ■     ■  ■■  ■" +2110 print " ■     ■    ■    ■  ■" +2120 print "  ■    ■    ■    ■ ■■" +2130 print " ■    ■■    ■    ■■■" +2140 print "      ■           ■" +2200 waitvb T +3000 a=rnd(3) +3010 goto 4000+(a*1000) +4000 cls +4010 print "              ■" +4020 print "      ■ ■     ■■■■■■" +4030 print "     ■■  ■      ■■■■" +4040 print "    ■■ ■  ■" +4050 print "   ■■   ■" +4060 print "   ■     ■     ■■■■■" +4070 print "  ■          ■■■■■■■" +4080 print " ■■          ■     ■■" +4090 print " ■■                ■■" +4100 print "  ■■               ■■" +4110 print "   ■■              ■■" +4120 print "    ■              ■" +4130 print "    ■■            ■■" +4140 print "     ■■         ■■■" +4150 print "      ■■       ■■■" +4160 print "               ■" +4200 goto 7000 +5000 cls +5010 print "                 ■" +5020 print "  ■              ■" +5030 print " ■               ■  ■" +5040 print " ■ ■■          ■■■■■■" +5050 print "■■■■■     ■    ■■ ■" +5060 print " ■        ■       ■ ■■" +5070 print " ■        ■    ■■■■■■" +5080 print " ■        ■■■  ■■  ■" +5090 print " ■■■■■    ■        ■" +5100 print " ■■  ■    ■     ■■■■■" +5110 print "■■    ■   ■    ■■   ■" +5120 print "■     ■ ■■■■   ■" +5130 print "     ■  ■ ■■■  ■" +5140 print "   ■■■  ■ ■  ■ ■■" +5150 print "  ■■■   ■■      ■■■■" +5160 print "                 ■■■" +5200 goto 7000 +6000 cls +6010 print "         ■■■    ■" +6020 print " ■     ■■■ ■    ■" +6030 print "  ■    ■ ■ ■    ■" +6040 print "  ■     ■ ■  ■■■■■■■" +6050 print "  ■ ■■■■■■■  ■■■    ■" +6060 print " ■■ ■■■■■      ■  ■" +6070 print " ■      ■      ■■■■■" +6080 print " ■      ■      ■■■■■■" +6090 print " ■      ■     ■■  ■  ■" +6100 print " ■      ■    ■■ ■ ■  ■" +6110 print " ■   ■■■■    ■  ■■   ■" +6120 print " ■  ■■  ■■   ■  ■■   ■" +6130 print " ■  ■   ■■■  ■  ■    ■" +6140 print " ■■  ■■■  ■  ■ ■■■  ■■" +6150 print "     ■■       ■■  ■■■" +6160 print "                  ■" +7000 locate 0,16:print " **PUSH START TO EXIT**"; +7010 locate 0,17:print "**ANOTHER BUTTON TO AGAIN**"; +7100 d=wait +7200 goto 1000 diff --git a/keywords.h b/keywords.h new file mode 100644 index 0000000..c07a66b --- /dev/null +++ b/keywords.h @@ -0,0 +1,59 @@ +/* WONBE predefined keyword IDs */ +/* First Created: Nov.3,2000 by Nashiko */ +/* Copyright 2000 (c) by Pie Dey Co.,Ltd. */ + +#define KEYWORD_IF 0x80 +#define KEYWORD_PRINT 0x81 +#define KEYWORD_LOCATE 0x82 +#define KEYWORD_CLS 0x83 +#define KEYWORD_GOTO 0x84 +#define KEYWORD_GOSUB 0x85 +#define KEYWORD_RETURN 0x86 +#define KEYWORD_FOR 0x87 +#define KEYWORD_NEXT 0x88 +#define KEYWORD_END 0x89 +#define KEYWORD_BREAK 0x8a +#define KEYWORD_REM 0x8b +#define KEYWORD_NEW 0x8c +#define KEYWORD_LIST 0x8d +#define KEYWORD_RUN 0x8e +#define KEYWORD_CONT 0x8f +#define KEYWORD_SAVE 0x90 +#define KEYWORD_LOAD 0x91 +#define KEYWORD_MERGE 0x92 +#define KEYWORD_RANDOMIZE 0x93 +#define KEYWORD_EXIT 0x94 +#define KEYWORD_DEBUG 0x95 +#define KEYWORD_WAITVB 0x96 +#define KEYWORD_FILES 0x97 +#define KEYWORD_AND 0xa0 +#define KEYWORD_OR 0xa1 +#define KEYWORD_XOR 0xa2 +#define KEYWORD_NOT 0xb0 +#define KEYWORD_SCAN 0xc0 +#define KEYWORD_WAIT 0xc1 +#define KEYWORD_RND 0xc2 +#define KEYWORD_ABS 0xc3 +#define KEYWORD_TICK 0xc4 +#define KEYWORD_SCAN_A 0xd0 +#define KEYWORD_SCAN_B 0xd1 +#define KEYWORD_SCAN_X1 0xd2 +#define KEYWORD_SCAN_X2 0xd3 +#define KEYWORD_SCAN_X3 0xd4 +#define KEYWORD_SCAN_X4 0xd5 +#define KEYWORD_SCAN_Y1 0xd6 +#define KEYWORD_SCAN_Y2 0xd7 +#define KEYWORD_SCAN_Y3 0xd8 +#define KEYWORD_SCAN_Y4 0xd9 +#define KEYWORD_THEN 0xf0 +#define KEYWORD_CHR 0xf1 +#define KEYWORD_TO 0xf2 +#define KEYWORD_STEP 0xf3 + +#define KEYWORDS_STATEMENT_FROM 0x80 +#define KEYWORDS_STATEMENT_TO 0x97 +#define KEYWORDS_2OP_FROM 0xa0 +#define KEYWORDS_2OP_TO 0xa2 + + +/* end of keywords.h */ diff --git a/makefile b/makefile new file mode 100644 index 0000000..d126588 --- /dev/null +++ b/makefile @@ -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 4c21afb..916428b 100644 --- a/wonbe.c +++ b/wonbe.c @@ -18,7 +18,7 @@ #include "win32text.h" #endif -char myVersion[] = "0.02"; +char myVersion[] = "0.03"; #ifdef WW #define MEMMOVE mymemmove @@ -795,7 +795,7 @@ SHORT calcValue() return -1; } -SHORT expr() +SHORT expr4th() { SHORT acc; acc = calcValue(); @@ -808,12 +808,6 @@ SHORT expr() if( ch != ' ' && ch != '\t' ) break; } switch( ch ) { - case '+': - acc = acc + calcValue(); - break; - case '-': - acc = acc - calcValue(); - break; case '*': acc = acc * calcValue(); break; @@ -828,15 +822,54 @@ SHORT expr() } } break; - case KEYWORD_AND: - acc = acc & calcValue(); + default: + executionPointer--; /* unget it */ + return acc; + } + if( bForceToReturnSuper ) return -1; + } +} + +SHORT expr3nd() +{ + SHORT acc; + acc = expr4th(); + if( bForceToReturnSuper ) return -1; + + while( TRUE ) { + BYTE ch; + while( TRUE ) { + ch = *executionPointer++; + if( ch != ' ' && ch != '\t' ) break; + } + switch( ch ) { + case '+': + acc = acc + expr4th(); break; - case KEYWORD_OR: - acc = acc | calcValue(); - break; - case KEYWORD_XOR: - acc = acc ^ calcValue(); + case '-': + acc = acc - expr4th(); break; + default: + executionPointer--; /* unget it */ + return acc; + } + if( bForceToReturnSuper ) return -1; + } +} + +SHORT expr2nd() +{ + SHORT acc; + acc = expr3nd(); + if( bForceToReturnSuper ) return -1; + + while( TRUE ) { + BYTE ch; + while( TRUE ) { + ch = *executionPointer++; + if( ch != ' ' && ch != '\t' ) break; + } + switch( ch ) { case '>': { BYTE ch2; @@ -845,10 +878,12 @@ SHORT expr() if( ch2 != ' ' && ch2 != '\t' ) break; } if( ch2 == '=' ) { - acc = (acc >= calcValue()); + acc = (acc >= expr3nd()); + if( acc != 0 ) acc = -1; } else { executionPointer--; - acc = (acc > calcValue()); + acc = (acc > expr3nd()); + if( acc != 0 ) acc = -1; } } break; @@ -860,17 +895,51 @@ SHORT expr() if( ch2 != ' ' && ch2 != '\t' ) break; } if( ch2 == '=' ) { - acc = (acc <= calcValue()); + acc = (acc <= expr3nd()); + if( acc != 0 ) acc = -1; } else if( ch2 == '>' ) { - acc = (acc != calcValue()); + acc = (acc != expr3nd()); + if( acc != 0 ) acc = -1; } else { executionPointer--; - acc = (acc < calcValue()); + acc = (acc < expr3nd()); + if( acc != 0 ) acc = -1; } } break; case '=': - acc = (acc == calcValue()); + acc = (acc == expr3nd()); + if( acc != 0 ) acc = -1; + break; + default: + executionPointer--; /* unget it */ + return acc; + } + if( bForceToReturnSuper ) return -1; + } +} + +SHORT expr() +{ + SHORT acc; + acc = expr2nd(); + if( bForceToReturnSuper ) return -1; + + while( TRUE ) { + BYTE ch; + while( TRUE ) { + ch = *executionPointer++; + if( ch != ' ' && ch != '\t' ) break; + } + switch( ch ) { + case KEYWORD_AND: + acc = acc & expr2nd(); + break; + case KEYWORD_OR: + acc = acc | expr2nd(); + break; + case KEYWORD_XOR: + acc = acc ^ expr2nd(); break; default: executionPointer--; /* unget it */ @@ -982,7 +1051,7 @@ void printOrDebug( BOOL bPrint ) break; default: { - WORD val; + SHORT val; #ifdef WW static #endif @@ -1183,6 +1252,20 @@ void st_next() } /* count step and loop again */ *(stacks[stackPointer-1].pvar) += stacks[stackPointer-1].step; + /* counter overflow? */ + if( stacks[stackPointer-1].step > 0 ) { + if( stacks[stackPointer-1].limit < *(stacks[stackPointer-1].pvar) ) { + /* loop done */ + stackPointer--; + return; + } + } else { + if( stacks[stackPointer-1].limit > *(stacks[stackPointer-1].pvar) ) { + /* loop done */ + stackPointer--; + return; + } + } executionPointer = stacks[stackPointer-1].returnPointer; } @@ -1456,7 +1539,7 @@ void editLine() delta = from-target; MEMMOVE( target, from, (WORD)(dataTop-(from-wa)) ); dataTop -= delta; - clearRuntimeInfo(); + /*clearRuntimeInfo();*/ } else { WORD len; len = skipToEOL(waCoockedLine+2)-waCoockedLine+1; @@ -1472,7 +1555,7 @@ void editLine() MEMMOVE( target+len, target, (WORD)(dataTop-(target-wa)) ); MEMMOVE( target, waCoockedLine, len ); dataTop += len; - clearRuntimeInfo(); + /*clearRuntimeInfo();*/ } else { /* replace line */ WORD lost; @@ -1488,7 +1571,7 @@ void editLine() MEMMOVE( nextline+delta, nextline, (WORD)(dataTop-(nextline-wa)) ); MEMMOVE( target, waCoockedLine, len ); dataTop += delta; - clearRuntimeInfo(); + /*clearRuntimeInfo();*/ } } } @@ -1540,14 +1623,36 @@ BOOL convertInternalCode( BYTE * waCoockedLine, const BYTE * waRawLine ) acc *= 10; acc += *src - '0'; src++; - } - if( acc < 0 ) { /* overflow case */ - syntaxError(); - return FALSE; + if( acc < 0 ) { /* overflow case */ + syntaxError(); + return FALSE; + } } *((SHORT*)dst) = acc; dst += 2; } +#if 0 +/* 以下のコードは、2項演算子の-を負数と解釈することがあるので使えない */ + } else if( *src == '-' && (*(src+1) >= '0' && *(src+1) <= '9' ) ) { + WORD acc; + /* 負数の10進のとき */ + *dst++ = 0x01; + src++; + acc = *src-'0'; + src++; + while( TRUE ) { + if( *src < '0' || *src > '9' ) break; + acc *= 10; + acc += *src - '0'; + src++; + if( acc > 32768 ) { /* overflow case */ + syntaxError(); + return FALSE; + } + } + *((SHORT*)dst) = -((SHORT)acc); + dst += 2; +#endif } else if( (*src >= 'a' && *src <= 'z') || (*src >= 'A' && *src <= 'Z') ) { BYTE next = *(src+1); if( (next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z') ) { @@ -1701,7 +1806,7 @@ void interpreterMain() void interactiveMain( FILE FAR * fp ) { if( fp == NULL ) { - commonPrint(NULL,"*Ready\n"); + commonPrint(NULL,"OK\n"); } while( TRUE ) { BOOL b; @@ -1737,6 +1842,9 @@ void interactiveMain( FILE FAR * fp ) if( waCoockedLine[0] == 0x01 ) { /* 行エディタを呼び出す */ editLine(); + if( fp == NULL ) { + clearRuntimeInfo(); + } } else { /* その行を実行する */ executionPointer = waCoockedLine; @@ -1785,6 +1893,7 @@ BOOL do_merge( const BYTE * filename ) } interactiveMain( fp ); fclose( fp ); + clearRuntimeInfo(); if( bForceToReturnSuper ) return FALSE; return TRUE; } diff --git a/wonbe.exe b/wonbe.exe index d7042a3..bc30775 100644 Binary files a/wonbe.exe and b/wonbe.exe differ diff --git a/wonbe.fx b/wonbe.fx index 2b85941..cd0bd9d 100644 Binary files a/wonbe.fx and b/wonbe.fx differ diff --git a/wonbe.txt b/wonbe.txt index 81a2017..f4ac7fd 100644 --- a/wonbe.txt +++ b/wonbe.txt @@ -1,5 +1,5 @@ ワンべぇ: WONBE, WonderWitch BASIC Environment - 暫定マニュアル Ver 0.02 + 暫定マニュアル Ver 0.03 2000年11月7日 株式会社ピーデー 川俣 晶 @@ -44,12 +44,12 @@  ごく軽いBASIC言語です。  昔あったTiny BASICに近い構文を持っています。  データ型は、符号付き16bit整数だけです。 - 定数は、-32768〜32767の10進数か、0x0000〜0xffffの16進数で記述できます。 + 定数は、-32767〜32767の10進数か、0x0000〜0xffffの16進数で記述できます。-32768は変数には記憶できますが、ソースには書けません。(-32767-1のように書いてください)  変数は、グローバル変数として、A〜Zのアルファベット大文字1文字のものが26個あります。  ローカル変数として、a〜zのアルファベット子文字1文字のものが26個あります。ローカル変数はgosubステートメントを実行したときに新しい領域が割り当てられ、returnステートメントを実行したときにgosubする前の領域が戻ってきます。  配列変数は@(インデックス)という形式の1次元配列だけが使用できます。使用可能なサイズは、プログラム記憶領域(48Kバイト)の残りサイズに等しくなります。インデックスは0から始まります。(例: for i=0 to 9:print @(i):next) - 演算子の優先順位はありません。(1+2*3は9になります) - 計算順序は、括弧()を使って明示的にコントロールしてください。 + 演算子の優先順位は「単項演算子 > */ > +- > 比較演算子 > and,or,xor」となります。(比較演算子は、<と>と=で記述する演算子すべて) + 計算順序は、括弧()を使って明示的に変更できます。  オーバーフロー、アンダーフローのチェックはありません。溢れは無視されます。ただしゼロ除算はエラーになります。  ステートメントなどのキーワードはすべてアルファベット小文字で入力します。大文字を使っても小文字になります。 @@ -96,7 +96,7 @@ return for 変数=式 to 式 for 変数=式 to 式 step 式  変数の値を変化させながらnextまで繰り返します。 - 終了値は厳密であることに注意が必要です。for i=1 to 2 step 2:nextは、無限ループになります。なぜなら変数iは永遠に2にならないからです。このような仕様にしておかないと、終了値を超えたら終わるという判定だと、ループの終値が32767のときに機能しないためです。 + 最後の変数の値が終値に一致せず、終値+ステップ値がオーバーフローする場合は無限ループする可能性があります。そのような値は指定しないように注意してください。 例: for i=0 to 10 step 2 next @@ -220,6 +220,13 @@ tick  自作ソフトを配布するためにwonbe.fxを一緒に渡すことを許可します。アーカイブへの同梱、CD-Rメディアなどへの焼き込み、通信ケーブルによる転送、どれも可です。ただし、ワンべぇの動作に関しては何も保証はできませんので、リスクは自分で負ってください。利用にあたっては、ロイヤリティなどはありませんので、報告も送金も必要ありません。 ● 変更履歴 + +2000年11月7日 Ver 0.03 +・演算子の優先順位 単項演算子 > */ > +- > 比較演算子 > and,or,xor +・比較演算子成立時の値を1から-1に変更 +・プロンプトをOKに変更 +・print/debugで負数が正数として出力されていたバグを解消 +・forの終値がピッタリ一致しなくてもnextでループ脱出するように変更 2000年11月7日 Ver 0.02 scan_XXが機能しないバグを取った 2000年11月6日 Ver 0.01 最初のバージョン