- Operator precedence order Unary operator> * /> + -> Comparison operator> and, or, xor

- Change the value when the comparison operator is established from 1 to -1
 - Change prompt to OK
 - Fixed a bug that negative numbers were output as positive numbers by print / debug
 - Changed so that loop can escape in next even if for closing price does not match exactly

Version 0.03 - from wonbe003.lzh
This commit is contained in:
Kawamata Akira 2000-11-07 17:00:00 +09:00 committed by Godzil
parent ee82c35364
commit 3a44094757
7 changed files with 328 additions and 35 deletions

95
janken.wb Normal file
View File

@ -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

59
keywords.h Normal file
View File

@ -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 */

23
makefile Normal file
View File

@ -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

163
wonbe.c
View File

@ -18,7 +18,7 @@
#include "win32text.h" #include "win32text.h"
#endif #endif
char myVersion[] = "0.02"; char myVersion[] = "0.03";
#ifdef WW #ifdef WW
#define MEMMOVE mymemmove #define MEMMOVE mymemmove
@ -795,7 +795,7 @@ SHORT calcValue()
return -1; return -1;
} }
SHORT expr() SHORT expr4th()
{ {
SHORT acc; SHORT acc;
acc = calcValue(); acc = calcValue();
@ -808,12 +808,6 @@ SHORT expr()
if( ch != ' ' && ch != '\t' ) break; if( ch != ' ' && ch != '\t' ) break;
} }
switch( ch ) { switch( ch ) {
case '+':
acc = acc + calcValue();
break;
case '-':
acc = acc - calcValue();
break;
case '*': case '*':
acc = acc * calcValue(); acc = acc * calcValue();
break; break;
@ -828,15 +822,54 @@ SHORT expr()
} }
} }
break; break;
case KEYWORD_AND: default:
acc = acc & calcValue(); 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; break;
case KEYWORD_OR: case '-':
acc = acc | calcValue(); acc = acc - expr4th();
break;
case KEYWORD_XOR:
acc = acc ^ calcValue();
break; 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 '>': case '>':
{ {
BYTE ch2; BYTE ch2;
@ -845,10 +878,12 @@ SHORT expr()
if( ch2 != ' ' && ch2 != '\t' ) break; if( ch2 != ' ' && ch2 != '\t' ) break;
} }
if( ch2 == '=' ) { if( ch2 == '=' ) {
acc = (acc >= calcValue()); acc = (acc >= expr3nd());
if( acc != 0 ) acc = -1;
} else { } else {
executionPointer--; executionPointer--;
acc = (acc > calcValue()); acc = (acc > expr3nd());
if( acc != 0 ) acc = -1;
} }
} }
break; break;
@ -860,17 +895,51 @@ SHORT expr()
if( ch2 != ' ' && ch2 != '\t' ) break; if( ch2 != ' ' && ch2 != '\t' ) break;
} }
if( ch2 == '=' ) { if( ch2 == '=' ) {
acc = (acc <= calcValue()); acc = (acc <= expr3nd());
if( acc != 0 ) acc = -1;
} else if( ch2 == '>' ) { } else if( ch2 == '>' ) {
acc = (acc != calcValue()); acc = (acc != expr3nd());
if( acc != 0 ) acc = -1;
} else { } else {
executionPointer--; executionPointer--;
acc = (acc < calcValue()); acc = (acc < expr3nd());
if( acc != 0 ) acc = -1;
} }
} }
break; break;
case '=': 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; break;
default: default:
executionPointer--; /* unget it */ executionPointer--; /* unget it */
@ -982,7 +1051,7 @@ void printOrDebug( BOOL bPrint )
break; break;
default: default:
{ {
WORD val; SHORT val;
#ifdef WW #ifdef WW
static static
#endif #endif
@ -1183,6 +1252,20 @@ void st_next()
} }
/* count step and loop again */ /* count step and loop again */
*(stacks[stackPointer-1].pvar) += stacks[stackPointer-1].step; *(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; executionPointer = stacks[stackPointer-1].returnPointer;
} }
@ -1456,7 +1539,7 @@ void editLine()
delta = from-target; delta = from-target;
MEMMOVE( target, from, (WORD)(dataTop-(from-wa)) ); MEMMOVE( target, from, (WORD)(dataTop-(from-wa)) );
dataTop -= delta; dataTop -= delta;
clearRuntimeInfo(); /*clearRuntimeInfo();*/
} else { } else {
WORD len; WORD len;
len = skipToEOL(waCoockedLine+2)-waCoockedLine+1; len = skipToEOL(waCoockedLine+2)-waCoockedLine+1;
@ -1472,7 +1555,7 @@ void editLine()
MEMMOVE( target+len, target, (WORD)(dataTop-(target-wa)) ); MEMMOVE( target+len, target, (WORD)(dataTop-(target-wa)) );
MEMMOVE( target, waCoockedLine, len ); MEMMOVE( target, waCoockedLine, len );
dataTop += len; dataTop += len;
clearRuntimeInfo(); /*clearRuntimeInfo();*/
} else { } else {
/* replace line */ /* replace line */
WORD lost; WORD lost;
@ -1488,7 +1571,7 @@ void editLine()
MEMMOVE( nextline+delta, nextline, (WORD)(dataTop-(nextline-wa)) ); MEMMOVE( nextline+delta, nextline, (WORD)(dataTop-(nextline-wa)) );
MEMMOVE( target, waCoockedLine, len ); MEMMOVE( target, waCoockedLine, len );
dataTop += delta; dataTop += delta;
clearRuntimeInfo(); /*clearRuntimeInfo();*/
} }
} }
} }
@ -1540,14 +1623,36 @@ BOOL convertInternalCode( BYTE * waCoockedLine, const BYTE * waRawLine )
acc *= 10; acc *= 10;
acc += *src - '0'; acc += *src - '0';
src++; src++;
}
if( acc < 0 ) { /* overflow case */ if( acc < 0 ) { /* overflow case */
syntaxError(); syntaxError();
return FALSE; return FALSE;
} }
}
*((SHORT*)dst) = acc; *((SHORT*)dst) = acc;
dst += 2; 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') ) { } else if( (*src >= 'a' && *src <= 'z') || (*src >= 'A' && *src <= 'Z') ) {
BYTE next = *(src+1); BYTE next = *(src+1);
if( (next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z') ) { if( (next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z') ) {
@ -1701,7 +1806,7 @@ void interpreterMain()
void interactiveMain( FILE FAR * fp ) void interactiveMain( FILE FAR * fp )
{ {
if( fp == NULL ) { if( fp == NULL ) {
commonPrint(NULL,"*Ready\n"); commonPrint(NULL,"OK\n");
} }
while( TRUE ) { while( TRUE ) {
BOOL b; BOOL b;
@ -1737,6 +1842,9 @@ void interactiveMain( FILE FAR * fp )
if( waCoockedLine[0] == 0x01 ) { if( waCoockedLine[0] == 0x01 ) {
/* 行エディタを呼び出す */ /* 行エディタを呼び出す */
editLine(); editLine();
if( fp == NULL ) {
clearRuntimeInfo();
}
} else { } else {
/* その行を実行する */ /* その行を実行する */
executionPointer = waCoockedLine; executionPointer = waCoockedLine;
@ -1785,6 +1893,7 @@ BOOL do_merge( const BYTE * filename )
} }
interactiveMain( fp ); interactiveMain( fp );
fclose( fp ); fclose( fp );
clearRuntimeInfo();
if( bForceToReturnSuper ) return FALSE; if( bForceToReturnSuper ) return FALSE;
return TRUE; return TRUE;
} }

BIN
wonbe.exe

Binary file not shown.

BIN
wonbe.fx

Binary file not shown.

View File

@ -1,5 +1,5 @@
ワンべぇ: WONBE, WonderWitch BASIC Environment ワンべぇ: WONBE, WonderWitch BASIC Environment
暫定マニュアル Ver 0.02 暫定マニュアル Ver 0.03
2000年11月7日 2000年11月7日
株式会社ピーデー 株式会社ピーデー
川俣 晶 川俣 晶
@ -44,12 +44,12 @@
 ごく軽いBASIC言語です。  ごく軽いBASIC言語です。
 昔あったTiny BASICに近い構文を持っています。  昔あったTiny BASICに近い構文を持っています。
 データ型は、符号付き16bit整数だけです。  データ型は、符号付き16bit整数だけです。
 定数は、-3276832767の10進数か、0x00000xffffの16進数で記述できます。  定数は、-3276732767の10進数か、0x00000xffffの16進数で記述できます。-32768は変数には記憶できますが、ソースには書けません。(-32767-1のように書いてください)
 変数は、グローバル変数として、AZのアルファベット大文字1文字のものが26個あります。  変数は、グローバル変数として、AZのアルファベット大文字1文字のものが26個あります。
 ローカル変数として、azのアルファベット子文字1文字のものが26個あります。ローカル変数はgosubステートメントを実行したときに新しい領域が割り当てられ、returnステートメントを実行したときにgosubする前の領域が戻ってきます。  ローカル変数として、azのアルファベット子文字1文字のものが26個あります。ローカル変数はgosubステートメントを実行したときに新しい領域が割り当てられ、returnステートメントを実行したときにgosubする前の領域が戻ってきます。
 配列変数は@(インデックス)という形式の1次元配列だけが使用できます。使用可能なサイズは、プログラム記憶領域(48Kバイト)の残りサイズに等しくなります。インデックスは0から始まります。(例: for i=0 to 9:print @(i):next)  配列変数は@(インデックス)という形式の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 式
for 変数=式 to 式 step 式 for 変数=式 to 式 step 式
 変数の値を変化させながらnextまで繰り返します。  変数の値を変化させながらnextまで繰り返します。
 終了値は厳密であることに注意が必要です。for i=1 to 2 step 2:nextは、無限ループになります。なぜなら変数iは永遠に2にならないからです。このような仕様にしておかないと、終了値を超えたら終わるという判定だと、ループの終値が32767のときに機能しないためです  最後の変数の値が終値に一致せず、終値+ステップ値がオーバーフローする場合は無限ループする可能性があります。そのような値は指定しないように注意してください
例: for i=0 to 10 step 2 例: for i=0 to 10 step 2
next next
@ -220,6 +220,13 @@ tick
 自作ソフトを配布するためにwonbe.fxを一緒に渡すことを許可します。アーカイブへの同梱、CD-Rメディアなどへの焼き込み、通信ケーブルによる転送、どれも可です。ただし、ワンべぇの動作に関しては何も保証はできませんので、リスクは自分で負ってください。利用にあたっては、ロイヤリティなどはありませんので、報告も送金も必要ありません。  自作ソフトを配布するために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月7日 Ver 0.02 scan_XXが機能しないバグを取った
2000年11月6日 Ver 0.01 最初のバージョン 2000年11月6日 Ver 0.01 最初のバージョン