＜BASIC言語の書式＞
BASICプログラムの記述は、行番号式、ラベル式、その混合、いずれの方法でも構
いません。以下、仕様について述べます。

＜利用可能な変数型＞
利用できる変数の型は、32ビット符号付整数(-2147483648 以上 +2147483647 以
下)と、文字列型の２種類です。文字列の末端部には0x00が付加されます。

A-Zの２６個の整数型変数が利用可能です。文字列として扱う場合はA$のように記
述します。ただし、A（整数型）とA$（文字列型）を同時に使用することは出来ま
せん。

整数型の定数は、１０進法で記述します。１６進法を使う場合、「$1200」のよう
に、頭に「$」を付加するか、「0x1200」の様に表記して下さい。

文字列型の定数は、「"」で囲って記述してください。「"」を使用する場合は、
「CHR$($22)」のように記述することが出来ます。

＜命令＞
以下、x, y, z等は整数値を、x$, y$, z$は文字列を、x#, y#, z#は浮動
小数点型実数値指します。xxx, yyy, zzz, www等は任意のステートメントを指
します。[ ]は省略可能である事を示します。

命令同士を「:」で区切ることにより、一行で複数のコマンドを処理すること
が出来ます。

BGCOLOR r,g,b
	背景色指定。
BREAK
	FOR-NEXT, DO-LOOP, WHILE-WENDループから抜け出す。
CDATA x[,y[,z[...]]]
	データー列を8ビット整数値で指定する。
CLEAR
	すべての文字列型変数と整数型配列を破棄し、整数値を０とする。また、
	PCGの使用をやめ、表示キャラクターをリセットする。
CLS
	スクリーン消去。
COLOR x
	テキスト色指定。
CURSOR x,y
	カーソル位置指定。
DATA xxx[,yyy[,zzz[...]]]
	データー列を整数値もしくは文字列で指定する。
DIM xxx [, yyy [, zzz [, ... ]]]
	整数型の一次元配列を割り当てる。
	xxx,yyy,zzzは、例えば「A(10)」のように記述する。この場合、A(0)から
	A(10)までの１１個の整数型変数が確保される。
DO WHILE x
LOOP
	x が0以外の場合、DO文からLOOP文までのステートメントを繰り返し実行する。
DO UNTIL x
LOOP
	x が0の場合、DO文からLOOP文までのステートメントを繰り返し実行する。
DO
LOOP WHILE x
	DO文からLOOP文までのステートメントを実行し、x が0以外の場合、繰り返す。
DO
LOOP UNTIL x
	DO文からLOOP文までのステートメントを実行し、x が0の場合、繰り返す。
DRAWCOUNT
	DRAWCOUNT値を指定する。DRAWCOUNT値に付いては、DRAWCOUNT()関数を
	参照。
END
	BASICプログラムを停止する。
EXEC x[,y[,z[...]]]
	機械語を実行する。ただし、x,y,zは32ビット整数値。
FOR x=yyy TO zzz [ STEP www ]
NEXT
	yyyで示された計算結果をxに代入し、xの値がzzzになるまで次のNEXT文
	までのステートメントを、繰り返し実行する。繰り返しのたび、xの値は
	wwwずつ増加する（省略された場合は１ずつ）。「NEXT」の次に何も記述
	しないことに注意。
GOSUB xxx [, yyy [, zzz [, ... ]]]
	現在の実行位置を記憶し、xxx行目(もしくはラベル)に移動する。yyy, zzz
	等は、サブルーチンに引き継がれる引数（ARGS()関数を参照）。
GOTO xxx
	xxx行目(もしくはラベル)に移動する。
IF x THEN yyy [ ELSE zzz ]
	xが0以外のとき、yyyを、0のときzzzを実行。yyyおよびzzzは、複数のステート
	メントを「:」で挟んで記述可能。
IF x THEN
xxx
[ELSEIF y THEN
yyy]
[ELSE
zzz]
ENDIF
	xが0以外の時xxxを、それ以外で且つyが0以外の時（記述された場合）yyyを、
	それ以外の場合にzzzを実行。ELSEIFステートメントは、複数記述可。THENス
	テートメントの次には何も記入しないことに注意。
LABEL xxx
	GOTO/GOSUBのジャンプ先を登録する。xxxは、英数字６文字以内の文字列。
[LET] x=yyy
	yで示された計算結果を、xに代入する。「LET」は省略可。
[LET] x$=yyy
	yyyで示された文字列（もしくは連結結果;連結演算子は「+」）を、x$に
	代入する。「LET」は省略可。
MUSIC x$
	BGMを演奏する。詳細は、下記<MUSIC>の項を参照。
VAR xxx [, yyy [, zzz [, ... ]]]
	サブルーチン内で使う、ローカル変数を指定する。xxx, yyy等は、A-Zの
	アルファベットで指定する。
WHILE x
WEND
	x が0以外の場合、WHILE文からWEND文までのステートメントを繰り返し実行する。
PALETTE n,r,g,b
	パレット指定。
PCG x,y,z
	ASCIIコードがxの文字の表示キャラクターを変更する。y,zは、キャラク
	ターデーター。詳細は、下記<PCG>の項を参照。
POKE x,y
	xで示される物理的アドレスに、yで示される値(１バイト値)を書き込む。
PRINT [ xまたはx$ [ ,または; [ yまたはy$ [ ... ]]]]
	ディスプレイに、整数値または文字列を表示する。「;」を使用した場
	合、次の表示が続けて行われる。「,」を使用した場合、１０文字ずつ
	に区切って表示される。どちらも使用しない場合、次の表示は行を変え
	て行われる。
REM xxx
	何も実行しない
RESTORE xxx
	DATA読み出し開始位置を指定。xxxは行番号もしくはラベル。
RETURN
	最後に実行されたGOSUB文の次のステートメントに移動する。戻り値を指
	定することがができる。この場合の戻り値はGOSUB()関数にて取得が可能。
SCROLL x,y
	画面を横方向、もしくは縦方向(斜めも可)に動かす。動かす方向と大きさ
	は、x, yでそれぞれ、横方向の移動度、縦方向の移動度として指定する。
SOUND xxx
	効果音を再生する。詳細は、下記<SOUND>の項を参照。xxxは行番号もしく
	はラベル。
SYSTEM x , y
	様々なシステム値の設定を行なう。＜SYSTEM＞の項を参照。
USEGRAPHIC [x]
	グラフィックディスプレイを使用、もしくは使用停止する。x=0で使用停止、x=1で使用、
	x=2でキャラクターをリセットして使用、x=3でグラフィック領域を確保するがキャラクター
	ディスプレイのまま。xを省略した場合は、x=1と同じ。
USEPCG [x]
	PCGを使用、もしくは使用停止する。x=0で使用停止、x=1で使用、x=2で
	キャラクターをリセットして使用。xを省略した場合は、x=1と同じ。

WAIT x
	xで示された時間、プログラムの実行を停止する。xが60の場合、約１秒間
	停止。

＜グラフィック関連命令＞

BOXFILL x1,y1,x2,y2,c
	座標(x1,y1),(x2,y2)を対角線とするカラーcで塗られた長方形を描画。
CIRCLE x,y,r,c
	座標(x0,y0)を中心に、半径r、カラーcの円を描画。
CIRCLEFILL x,y,r,c
	座標(x0,y0)を中心に、半径r、カラーcで塗られた円を描画。
GPRINT x,y,c,bc,s$
	座標(x,y)にカラーcで文字列s$を表示、bc:背景色（負数の場合背景色指定なし）。
LINE x1,y1,x2,y2,c
	座標(x1,y1)から(x2,y2)にカラーcで線分を描画。
PSET x,y,c
	座標(x,y)の位置にカラーcで点を描画。
PUTBMP x,y,m,n,bbb
	横m*縦nドットのキャラクター(bbbで指定)を座標(x,y)に表示。
	サイズm*nの配列bmpに、単純にカラー番号を並べる。
	ただし、カラーが0の部分は透明色として扱う。

＜整数型関数＞
以下、x, y, zは整数値を、x$, y$, z$は文字列を指します。[ ]は省略可能である事
を示します。

ABS(x)
	xの絶対値を返す。
ARGS()
	サブルーチン中で、GOSUBに渡された引数を整数値として取り出す。
ASC(x$)
	文字列の最初の一文字の、アスキーコードを返す。
DRAWCOUNT()
	DRAWCOUNT値を得る。DRAWCOUNTは１６ビット整数値で、1/60秒ごとに１ずつ
	増える。
GOSUB(xxx [, y [, z [, ... ]]])
	GOSUB命令と同じだが、戻り値(RETURNを参照)を得ることが出来る。xxxは、
	ラベルもしくは行番号。。yyy, zzz 等は、サブルーチンに引き継がれる引数（
	ARGS()関数を参照）。
INKEY([x])
	xを指定しない場合、現在押されているキーのASCII値を返す。押されていな
	い場合は、０。ASCII値でxを指定した場合、そのキーが押されているかどう
	かを返す。
INT(x#)
	実数値x#を整数値に変換して返す。
KEYS([x])
	キー入力を得る。xの値は以下の通り。xを指定しない場合は、x=63と同じ。
		KEYUP:    1
		KEYDOWN:  2
		KEYLEFT:  4
		KEYRIGHT: 8
		KEYSTART: 16
		KEYFIRE:  32
LEN(x$)
	文字列の長さを返す。
MUSIC()
	BGMの演奏の残り数を返す。
NOT(x)
	x=0の場合に１を、そうでない場合に０を返す。
PEEK(x)
	xで示される物理アドレスから１バイト読み取り、返す。
READ()
	DATA文の後から、一つずつデーター（整数値）を読み出す。
RND()
	0から32767までの擬似乱数を返す。
SGN(x)
	xの符号(-1, 0, または1)を返す。
STRNCMP(x$,y$,z)
	２つの文字列のうちz文字分を比較し、結果を返す。同じ文字列の場合は０。
TVRAM([x])
	ビデオRAMのx番目の内容を、バイト値で返す。xを省略した場合、ビデオ
	RAMの開始位置の物理アドレスを返す。
VAL(x$)
	１０進数もしくは１６進数文字列としてのx$の値を、整数値で返す。

＜浮動小数点型関数＞
ACOS#(x#)
	x# の逆余弦を実数値で返す。
ASIN#(x#)
	x# の逆正弦を実数値で返す。
ATAN#(x#)
	x# の逆正接を実数値で返す。
CEIL#(x#)
	x# 以上の最小の整数を実数値で返す。
COS#(x#)
	x# の余弦を実数値で返す。
COSH#(x#)
	x# の双曲線余弦を実数値で返す。
EXP#(x#)
	eを底とする x# の指数関数値を実数値で返す。
FABS#(x#)
	x# の絶対値を実数値で返す。
FLOAT#(x)
	整数値 x を浮動小数点型実数値に変換して返す。
FLOOR#(x#)
	x# 以下の最大の整数を実数値で返す。
FMOD#(x#,y#)
	x# を y# で割った剰余を実数値で返す。
LOG#(x#)
	x# の自然対数を実数値で返す。
LOG10#(x#)
	x# の常用対数を実数値で返す。
MODF#(x#)
	x# の整数部を実数値で返す。
PI#
	3.14159265を返す。
POW#(x#,y#)
	x# の y# 乗を実数値で返す。
SIN#(x#)
	x# の正弦を実数値で返す。
SINH#(x#)
	x# の双曲線正弦を実数値で返す。
SQRT#(x#)
	x# の平方根を実数値で返す。
TAN#(x#)
	x# の正接を実数値で返す。
TANH#(x#)
	x# の双曲線正接を実数値で返す。
VAL#(x$)
	１０進数文字列としてのx$の値を、実数値で返す。

＜文字列型関数＞
A$(x [,y])など
	xの値が０の場合、文字列全体を返す。
	xの値が正の場合、xで示される位置より右側の文字列を返す。
	xの値が負のとき、文字列の右側x文字を返す。
	yが指定された場合、y文字分の文字列を返す。
ARGS$()
	サブルーチン中で、GOSUBに渡された引数を文字列として取り出す。
CHR$(x)
	xをアスキーコードとする文字を返す。
DEC$(x)
	xの値を、１０進数の文字列として返す。
FLOAT$(x#)
	実数値x#を、１０進数の文字列として返す。
GOSUB$(xxx [, y [, z [, ... ]]])
	GOSUB命令と同じだが、戻り値(RETURNを参照)を文字列として得ることが出来る。
	xxxは、ラベルもしくは行番号。。yyy, zzz 等は、サブルーチンに引き継がれる引数
	（ARGS()関数を参照）。
HEX$(x [,y])
	xの値を、１６進数の文字列として返す。yが指定された場合、yバイト長の
	文字列になる。
INPUT$()
	文字列入力状態になり、入力が終了すると(Enterが押されると)文字列を返す。
SPRINTF$(x$,y#)
	x$で示される書式に従って、実数y#の内容を文字列として返す。
READ$()
	DATA文の後から、一つずつ文字列データーを読み出す。

＜整数演算子＞
-x
	符号を反転
x + y
	整数加算
x - y
	整数減算
x * y
	整数乗算
x / y
	整数除算
x % y
	整数剰余
x >> y
	xの値をyビット左シフト
x << y
	xの値をyビット右シフト
x = y
	２つの整数値が等しい場合に１、そうでないときに０
x != y
	２つの整数値が等しい場合に０、そうでないときに１
x < y
	xがyより小さい場合に１、そうでないときに０
x <= y
	xがyより小さいか等しい場合に１、そうでないときに０
x > y
	xがyより多きい場合に１、そうでないときに０
x >= y
	xがyより多きいか等しい場合に１、そうでないときに０
x AND y
	xとyの値のビットごとの AND（論理積でないことに注意）
x OR y
	xとyの値のビットごとの OR
x XOR y
	xとyの値のビットごとの XOR

なお、整数演算子の優先順位は、優先度が高いものから以下の順です。

+ - (単項演算子)
* / %
+ - (加算・減算)
<< >>
< <= > >=
= !=
XOR
AND
OR

＜文字列演算子＞
x$ + y$
	文字列の連結

＜浮動小数点型演算子＞
-x#
	符号を反転
x# + y#
	実数加算
x# - y#
	実数減算
x# * y#
	実数乗算
x# / y#
	実数除算
x# = y#
	２つの実数値が等しい場合に１、そうでないときに０
x# != y#
	２つの実数値が等しい場合に０、そうでないときに１
x# < y#
	xがyより小さい場合に１、そうでないときに０
x# <= y#
	xがyより小さいか等しい場合に１、そうでないときに０
x# > y#
	xがyより多きい場合に１、そうでないときに０
x# >= y#
	xがyより多きいか等しい場合に１、そうでないときに０
x# AND y#
	xとyの値の論理積（ビットごとの AND でないことに注意）
x# OR y#
	xとyの値の論理和（ビットごとの OR でないことに注意）

なお、実数演算子の優先順位は、優先度が高いものから以下の順です。

+ - (単項演算子)
* /
+ - (加算・減算)
< <= > >=
= !=
AND
OR

＜MUSIC＞
MUSIC命令では、BGM用のデーターを文字列で指定します。文字列の書式は、ABC 
notationに準拠しています。ただし、すべての記法が使えるわけではありません。
なお、キーや速度などのデフォルト設定値は以下の通りです。

Q: 1/4=90
L: 1/8
K: C

BGM演奏時に一度に設定できる音の数は、31迄です。これを超えて音楽を再生したい
場合は、MUSIC()関数の戻り値を調べ、その値が十分小さくなってから、次のMUSIC命
令を実行するようにします。

添付のmusic.basに、使い方に関するサンプルがありますので、参考にして下さい。

＜SOUND＞
SOUND命令では、DATA列のデーターを、行番号もしくはラベルで指定します。SOUND命
令による効果音再生中は、BGMは再生されません。また、前の効果音が終わる前に次
のSOUND命令を実行すると、前の効果音の再生は停止し、新しい効果音がすぐに再生
されます。

DATA列では、３２ビット整数値として、交換音を表現します。この整数値の下位１６
ビットは周波数の指定です。2048が440Hz(ラの音)に対応します。値が大きくなるほ
ど、より低い音が出ます。上位１６ビットは、音の長さです。1が、1/60秒に相当し
ます。最後に、65535以下の値で、効果音の繰り返し回数を指定します。これらのデー
ターの数は、32を超えないようにして下さい。

添付のsound.basに、使い方に関するサンプルがありますので、参考にして下さい。

＜PCG＞
PCG(Programmable Character Generator)を用いると、ASCIIコードごとにフォント
を指定して、疑似グラフィックスとして表示させることが出来ます。使用する場合
は、まず

USEPCG

とします。フォントの変更は、PCGステートメントを用いて、

PCG 0x80,0x80402010,0x08040201

の様に設定します。この例では、ASCIIコード0x80の文字のフォントを設定してい
て、バックスラッシュの様な記号(左上から右下に向かう斜め線)が表示されるよう
になります。PCGの利用を停止し、オリジナルのフォントに戻す場合は、

USEPCG 0

とします。再度PCGを使用したい場合は、

USEPCG

として下さい。先に設定したフォントデーターが、復活します。なお、先に設定し
たフォントデーターを破棄してPCGの使用を始めたい場合は、

USEPCG 2

として下さい。

＜ヒント＞
FOR文では、TOステートメントの次に書かれた値に合致する場合（超えた時ではなく）
に、ループから抜ける仕様です。また、FOR-NEXTループの途中で、GOTO文でループの
外に飛んだり、RETURN文を実行したりすると、予期せぬ結果（機器のリセット等）を
引き起こします。ただし、GOSUB文でサブルーチンを呼んだり、別のFOR-NEXTをネス
トして使う事は可能です。

ON GOTO分やON GOSUB文はサポートしていません。ただし、例えば次のように記述す
ることで、同様の動作をさせることは可能です。
 GOSUB 10000+A
 ....
 10000 PRINT "A=0" : RETURN
 10001 PRINT "A=1" : RETURN
 10002 PRINT "A=2" : RETURN

一行中で連続して文字列を扱うと、"String too complexed"というエラーがでて、
停止することがあります。この場合は、文字列を扱う命令を独立した行するか、文
字列関連の演算を幾つかのステップに分けて、それぞれ１行ずつの記述にして試し
てみて下さい。

＜バージョン履歴＞
・KM-1120 2016年2月公開。
　１．PCG機能を追加。
　２．SCROLL命令を追加。
　３．WAIT命令を追加。
　４．「Ctrl+Break」キーによる実行停止に対応。
　５．FOR無しでNEXTを実行した場合、GOSUB無しでRETURNを実行した場合にエラー
　　　を表示して停止するようにした。

・Ver 1.1.0 (KM-1110) 2015年12月公開。
　１．2015年11月21日に変更されたPIC32TVGSの仕様に対応。
　２．PS/2キーボードに対応。
　３．INKEY() INPUT$() VAL() DEC$() の４つの関数を追加。
　４．TVRAM() ASC() PEEK()が、0x80-0xFFの値に関して負の数を返していた不具合
　　　を修正。
　５．DIMステートメントにより配列を定義した際、すべての要素がゼロになるよう
　　　にした。
　６．単項演算子、「-」「+」を追加。
　７．LABEL定義されていない飛び先にGOTOするとリセットされる不具合を修正。
　８．同一のLABELを複数回使用している場合に、コンパイルエラーが出るように修
　　　正。
　９．引数を持たないPRINT文に対応。

・Ver 1.0.5 (KM-1100) 最初の正規公開バージョン。
