PIC

KM-BASIC for MIPSの紹介

2015年4月14日

KM-BASIC for MIPSは、PIC32MX上で動く整数型BASICコンパイラーです。ケンケンさん作成のPIC32テレビゲームシステム(以下、PIC32TVGS)上で動くアプリケーションとして作成しました。表示はテキストのみですが、カラーでの表示が可能です。BASICプログラムを機械語コードにコンパイルしてから実行するので、高速な動作が特徴です。SDカードに複数のBASICプログラムを入れておき、PIC32TVGSの選択画面で選択して実行することが可能です。SDカード上のファイルの配置方法については、ダウンロードファイルのreadme.txtを参照して下さい。記事の最後に、ダウンロードのためのリンクがあります。

文法について

以下は、readme.txtからです。基本的には、MZ-80K用に作成したKM-BASICと同じですが、データー幅が32ビットになったこと、演算子に優先順位を付けたこと、文字列の結合がどこでも出来るようになったことなど、若干の機能向上があります。
<BASIC言語の書式>
BASICプログラムの記述は、行番号式、ラベル式、その混合、いずれの方法でも構
いません。以下、仕様について述べます。


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

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

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

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


<命令>
以下、x, y, z等は整数値を、x$, y$, z$は文字列を指します。xxx, yyy, zzz, 
www等は任意のステートメントを指します。[ ]は省略可能で有る事を示します。

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

REM xxx
	何も実行しない
[LET] x=yyy
	yで示された計算結果を、xに代入する。「LET」は省略可。
[LET] x$=yyy
	yyyで示された文字列(もしくは連結結果)を、x$に代入する。「LET」
	は省略可。
DIM xxx [, yyy [, zzz [, ... ]]]
	整数型の一次元配列を割り当てる。
	xxx,yyy,zzzは、例えば「A(10)」のように記述する。この場合、A(0)から
	A(10)までの11個の整数型変数が確保される。
CLEAR
	すべての文字列型変数と整数型配列を破棄し、整数値を0とする。
PRINT [ xまたはx$ [ ,または; [ yまたはy$ [ ... ]]]]
	ディスプレイに、整数値または文字列を表示する。「;」を使用した場
	合、次の表示が続けて行われる。「,」を使用した場合、10文字ずつ
	に区切って表示される。どちらも使用しない場合、次の表示は行を変え
	て行われる。
POKE x,y
	xで示される物理的アドレスに、yで示される値(1バイト値)を書き込む。
EXEC x[,y[,z[...]]]
	機械語を実行する。ただし、x,y,zは32ビット整数値。
IF x THEN yyy [ ELSE zzz ]
	xが0以外のとき、yyyを、0のときzzzを実行
FOR x=yyy TO zzz [ STEP www ]
NEXT
	yyyで示された計算結果をxに代入し、xの値がzzzになるまで次のNEXT文
	までのステートメントを、繰り返し実行する。繰り返しのたび、xの値は
	wwwずつ増加する(省略された場合は1ずつ)。「NEXT」の次に何も記述
	しないことに注意。
LABEL xxx
	GOTO/GOSUBのジャンプ先を登録する。xxxは、英数字6文字以内の文字列。
GOTO xxx
	xxx行目に移動する。
GOSUB xxx
	現在の実行位置を記憶し、xxx行目に移動する。
RETURN
	最後に実行されたGOSUB文の次のステートメントに移動する。戻り値を指
	定することがができる。この場合の戻り値はGOSUB()関数にて取得が可能。
END
	BASICプログラムを停止する。
SOUND xxx
	効果音を再生する。詳細は、下記<SOUND>の項を参照。xxxは行番号もしく
	はラベル。
MUSIC x$
	BGMを演奏する。詳細は、下記<MUSIC>の項を参照。

RESTORE xxx
	DATA読み出し開始位置を指定。xxxは行番号もしくはラベル。

DATA x[,y[,z[...]]]
	データー列を整数値で指定する。

CURSOR x,y
	カーソル位置指定。

CLS
	スクリーン消去。

COLOR x
	テキスト色指定。

PALETTE n,r,g,b
	パレット指定。

BGCOLOR r,g,b
	背景色指定。

DRAWCOUNT
	DRAWCOUNT値を指定する。DRAWCOUNT値に付いては、DRAWCOUN()関数を
	参照。


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

PEEK(x)
	xで示される物理アドレスから1バイト読み取り、返す。
RND()
	0から32767までの擬似乱数を返す。
ABS(x)
	xの絶対値を返す。
SGN(x)
	xの符号(-1, 0, または1)を返す。
NOT(x)
	x=0の場合に1を、そうでない場合に0を返す。
ASC(x$)
	文字列の最初の一文字の、アスキーコードを返す。
LEN(x$)
	文字列の長さを返す。
STRNCMP(x$,y$,z)
	2つの文字列のうちz文字を比較し、結果を返す。同じ文字列の場合は0。
CHR$(x)
	xをアスキーコードとする文字を返す。
HEX$(x [,y])
	xの値を、16進数の文字列として返す。yが指定された場合、yバイト長の
	文字列になる。
A$(x [,y])など
	xの値が0の場合、文字列全体を返す。
	xの値が精の場合、xで示される位置より右側の文字列を返す。
	xの値が負のとき、文字列の右側x文字を返す。
	yが指定された場合、y文字分の文字列を返す。

DRAWCOUNT()
	DRAWCOUNT値を得る。DRAWCOUNTは16ビット整数値で、1/60秒ごとに1ずつ
	増える。

KEYS() or KEYS(x)
	キー入力を得る。xの値は以下の通り。xを指定しない場合は、x=63と同じ。
		KEYUP:    1
		KEYDOWN:  2
		KEYLEFT:  4
		KEYRIGHT: 8
		KEYSTART: 16
		KEYFIRE:  32

TVRAM([x])
	ビデオRAMのx番目の内容を、バイト値で返す。xを省略した場合、ビデオ
	RAMの開始位置の物理アドレスを返す。

MUSIC()
	BGMの演奏の残り数を返す。

GOSUB(xxx)
	GOSUBと同じだが、戻り値(RETURNを参照)を得ることが出来る。xxxは、ラベ
	ルもしくは行番号。
 
READ()
	DATA文の後から、一つずつデーター(整数値)を読み出す。


<演算子>
x + y
	整数加算
x - y
	整数減算
x * y
	整数乗算
x / y
	整数除算
x % y
	整数剰余
x = y
	2つの整数値が等しい場合に1、そうでないときに0
x != y
	2つの整数値が等しい場合に0、そうでないときに1
x < y
	xがyより小さい場合に1、そうでないときに0
x <= y
	xがyより小さいか等しい場合に1、そうでないときに0
x > y
	xがyより多きい場合に1、そうでないときに0
x >= y
	xがyより多きいか等しい場合に1、そうでないときに0
x AND y
	xとyの値のビットごとの AND(論理積でないことに注意)
x OR y
	xとyの値のビットごとの OR
x XOR y
	xとyの値のビットごとの XOR
x$ + y$
	文字列の連結


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

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

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

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


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

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

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

プログラムの作成について

PIC32TVGSにはキーボードがありませんので、BASICプログラムはテキストファイルとして別途作成し、SDカードに書き込んでおく方式です。このBASICプログラムを開発するための簡易環境をHTML5で作成したものを提供しています。開発環境はダウンロードファイルに同梱してありますが、以下のリンクから実行することも可能です。
http://hp.vector.co.jp/authors/VA016157/kmbweb03/index.html

サンプルプログラム

3つのサンプルプログラムを同梱しています。

・shoot.txt
シューティングゲームです。「V」を操作して、下から迫る「A」を撃墜して下さい。「A」は、4秒ごとに上に上がってきます。「A」に最上段まで進入されると、ゲームオーバーです。こちらが弾を撃っている間は、「A」はひるんで進んできませんので、4秒少し前に、列のすべての「A」を打ち落とすのがコツです。
2015-04-14-shoot.png
これは、私が中学生の頃、日立のBASICマスター・レベル2用に即興で作成したゲームです。即興の割には友人の間でウケが良かったので、ここに移植してみました。

・music.txt
BGM演奏のサンプルです。曲を選んで、Fireボタンを押して下さい。
2015-04-14-music.png
クラシック音楽に混じってなぜかスタートレックのテーマ曲が入っていますが、気にしないで下さい(笑)。

・sound.txt
効果音出力のサンプルです。音の種類を選んで、Fireボタンを押して下さい。
2015-04-14-sound.png

サンプルプログラムはすべて、開発環境のエミュレーターでも実行できるので、試してみて下さい。

ダウンロード

KM-BASIC for MIPS ver 1.0.5は、ここからダウンロードできます。

LGPLベースのライセンスの、フリーソフトです。ただし、幾つかのライブラリーを使っている関係上で、純粋なLGPLではなく、ある程度の制約があります。詳しくは、readme.txtを参照して下さい。

コメント

Katsumi (2015年4月14日 18:12:12)

演算子の優先順位実装、文字列対応の実装などを考察した記事は、こちら。
http://www.recfor.net/blog/mycom/index.php?itemid=903

Katsumi (2016年8月10日 17:09:04)

KM-BASIC for MIPSの最新バージョンは、MachiKania BASICとして公開しています。
http://www.ze.em-net.ne.jp/~kenken/machikania/

コメント送信