KM-BASIC for MIPS ver 1.1
2015年12月23日
ケンケンさんのSDカードブートローダーのRev.2に対応し、かつ、PS/2キーボードの使用に対応した、KM-BASIC for MIPSのver 1.1を公開しました。ダウンロードの為のリンクは、記事の最後にあります。
(キャプチャー画面は、HTML5によるエミュレーターからのものです。)
現在、ケンケンさんと共同で、PIC32MX250F128Bを用いた、スタンドアローンな1ボードコンピューターを作るべく、作業中です。今回のKM-BASICのver 1.1は、その様な方向性を目指して作られたもので、主な変更点は、以下の通りです。
1.2015年11月21日に変更されたPIC32TVGSの仕様に対応。
2.PS/2キーボードに対応。
3.INKEY() INPUT$() VAL() DEC$() の4つの関数を追加。
4.TVRAM() ASC() PEEK()が、0x80-0xFFの値に関して負の数を返していた不具合を修正。
5.DIMステートメントにより配列を定義した際、すべての要素がゼロになるようにした。
6.単項演算子、「-」「+」を追加。
7.LABEL定義されていない飛び先にGOTOするとリセットされる不具合を修正。
8.同一のLABELを複数回使用している場合に、コンパイルエラーが出るように修正。
9.引数を持たないPRINT文に対応。
以下は、readme.txtから、BASIC言語の文法等に関する記述の抜粋です。
また、readme.txtには、KM-BASICを使用する上でのヒントを書き加えました。この部分は、ユーザーからの質問等があれば、今後も書き加えていくつもりにしています。
私のテスト環境では、ケンケンさんの回路と若干異なる回路を用いていますが、RA1の出力を用いてタクトスイッチとPS/2キーボードとのやりとりを制御する仕様は同じです。
主な変更点は:
・PS/2キーボードを制御するのに、MOSFET-Nを用い、キーボードの電源をオン・オフする様にした。
・リセットスイッチを省略した。
・オーディオのボリュームを、330Ω固定にした。
・RB6の出力(PIC32MX150F128Bのみで、250Fでは使えない)から、390Ωの抵抗を介して、ビデオラインにつないだ。
といったところです。最後のRB6の部分は、この記事で扱っているKM-BASICとは関係ありませんが、KM-Z80 game (ケンケンさんの回路用の、MZ-80Kエミュレーター; SDカードブートローダーrev.2対応のものは、近日中に公開予定)で表示を明るくするために必要です。無くても、KM-BASICは問題なく動きますし、KM-Z80 gameも、表示が若干くらいだけで実行に支障はありません。
実機は、こんな感じです。回路図で+3.3Vのところが+3Vに、+5Vのところが+4.5Vになっていますが、私の環境では問題なく動くようです。
今後の方向性としては、ケンケンさんが、このKM-BASICにテキストエディター機能を追加して下さることになっています。そうなれば、KM-BASICをSDカードブートローダーにロードされた状態で、アプリケーションの変更無しに様々なBASICプログラムを作成・実行・編集する事が可能になると思います。
KM-BASIC for MIPS ver 1.1は、ここからダウンロードできます。
バイナリーのHEXファイルは、2つあります。日本語キーボード(106 キーボード)で使用する場合は、basic106.hexを、USキーボード(101 キーボード)で使用する場合は、basic101.hexを利用して下さい。その他の使用方法は、以前のバージョンと同じです。詳しくは、readme.txtを閲覧して下さい。
(キャプチャー画面は、HTML5によるエミュレーターからのものです。)
現在、ケンケンさんと共同で、PIC32MX250F128Bを用いた、スタンドアローンな1ボードコンピューターを作るべく、作業中です。今回のKM-BASICのver 1.1は、その様な方向性を目指して作られたもので、主な変更点は、以下の通りです。
1.2015年11月21日に変更されたPIC32TVGSの仕様に対応。
2.PS/2キーボードに対応。
3.INKEY() INPUT$() VAL() DEC$() の4つの関数を追加。
4.TVRAM() ASC() PEEK()が、0x80-0xFFの値に関して負の数を返していた不具合を修正。
5.DIMステートメントにより配列を定義した際、すべての要素がゼロになるようにした。
6.単項演算子、「-」「+」を追加。
7.LABEL定義されていない飛び先にGOTOするとリセットされる不具合を修正。
8.同一のLABELを複数回使用している場合に、コンパイルエラーが出るように修正。
9.引数を持たないPRINT文に対応。
以下は、readme.txtから、BASIC言語の文法等に関する記述の抜粋です。
<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等は任意のステートメントを指します。[ ]は省略可能で有る事を示します。 命令同士を「:」で区切ることにより、一行で複数のコマンドを処理すること が出来ます。 BGCOLOR r,g,b 背景色指定。 CLEAR すべての文字列型変数と整数型配列を破棄し、整数値を0とする。 CLS スクリーン消去。 COLOR x テキスト色指定。 CURSOR x,y カーソル位置指定。 DATA x[,y[,z[...]]] データー列を整数値で指定する。 DIM xxx [, yyy [, zzz [, ... ]]] 整数型の一次元配列を割り当てる。 xxx,yyy,zzzは、例えば「A(10)」のように記述する。この場合、A(0)から A(10)までの11個の整数型変数が確保される。 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ずつ増加する(省略された場合は1ずつ)。「NEXT」の次に何も記述 しないことに注意。 GOSUB xxx 現在の実行位置を記憶し、xxx行目に移動する。 GOTO xxx xxx行目に移動する。 IF x THEN yyy [ ELSE zzz ] xが0以外のとき、yyyを、0のときzzzを実行 LABEL xxx GOTO/GOSUBのジャンプ先を登録する。xxxは、英数字6文字以内の文字列。 [LET] x=yyy yで示された計算結果を、xに代入する。「LET」は省略可。 [LET] x$=yyy yyyで示された文字列(もしくは連結結果)を、x$に代入する。「LET」 は省略可。 MUSIC x$ BGMを演奏する。詳細は、下記<MUSIC>の項を参照。 PALETTE n,r,g,b パレット指定。 POKE x,y xで示される物理的アドレスに、yで示される値(1バイト値)を書き込む。 PRINT [ xまたはx$ [ ,または; [ yまたはy$ [ ... ]]]] ディスプレイに、整数値または文字列を表示する。「;」を使用した場 合、次の表示が続けて行われる。「,」を使用した場合、10文字ずつ に区切って表示される。どちらも使用しない場合、次の表示は行を変え て行われる。 REM xxx 何も実行しない RESTORE xxx DATA読み出し開始位置を指定。xxxは行番号もしくはラベル。 RETURN 最後に実行されたGOSUB文の次のステートメントに移動する。戻り値を指 定することがができる。この場合の戻り値はGOSUB()関数にて取得が可能。 SOUND xxx 効果音を再生する。詳細は、下記<SOUND>の項を参照。xxxは行番号もしく はラベル。 <関数> 以下、x, y, zは整数値を、x$, y$, z$は文字列を指します。[ ]は省略可能で有る事 を示します。 ABS(x) xの絶対値を返す。 ASC(x$) 文字列の最初の一文字の、アスキーコードを返す。 DRAWCOUNT() DRAWCOUNT値を得る。DRAWCOUNTは16ビット整数値で、1/60秒ごとに1ずつ 増える。 GOSUB(xxx) GOSUBと同じだが、戻り値(RETURNを参照)を得ることが出来る。xxxは、ラベ ルもしくは行番号。 INKEY() 現在押されているキーのASCII値を返す。押されていない場合は、0。 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の場合に1を、そうでない場合に0を返す。 PEEK(x) xで示される物理アドレスから1バイト読み取り、返す。 READ() DATA文の後から、一つずつデーター(整数値)を読み出す。 RND() 0から32767までの擬似乱数を返す。 SGN(x) xの符号(-1, 0, または1)を返す。 STRNCMP(x$,y$,z) 2つの文字列のうちz文字を比較し、結果を返す。同じ文字列の場合は0。 TVRAM([x]) ビデオRAMのx番目の内容を、バイト値で返す。xを省略した場合、ビデオ RAMの開始位置の物理アドレスを返す。 VAL(x$) 10進数もしくは16進数文字列としてのx$の値を、整数値で返す。 A$(x [,y])など xの値が0の場合、文字列全体を返す。 xの値が正の場合、xで示される位置より右側の文字列を返す。 xの値が負のとき、文字列の右側x文字を返す。 yが指定された場合、y文字分の文字列を返す。 CHR$(x) xをアスキーコードとする文字を返す。 DEC$(x) xの値を、10進数の文字列として返す。 HEX$(x [,y]) xの値を、16進数の文字列として返す。yが指定された場合、yバイト長の 文字列になる。 INPUT$() 文字列入力状態になり、入力が終了すると(Enterが押されると)文字列を返す。 <演算子> -x 符号を反転 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$ 文字列の連結 なお、整数演算子の優先順位は、優先度が高いものから以下の順です。 + - (単項演算子) * / % + - (加算・減算) < <= > >= = != XOR AND OR <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に、使い方に関するサンプルがありますので、参考にして下さい。
また、readme.txtには、KM-BASICを使用する上でのヒントを書き加えました。この部分は、ユーザーからの質問等があれば、今後も書き加えていくつもりにしています。
<ヒント> FOR文では、TOステートメントの次に書かれた値に合致する場合(超えた時ではなく) に、ループから抜ける仕様です。また、FOR-NEXTループの途中で、GOTO文でループの 外に飛んだり、RETURN文を実行したりすると、予期せぬ結果(機器のリセット等)を 引き起こします。ただし、GOSUB文でサブルーチンを呼んだり、別のFOR-NEXTをネス トして使う事は可能です。 ON GOTO分やON GOSUB文はサポートしていません。ただし、例えば次のように記述す ることで、同様の動作をさせることは可能です。 GOSUB 10000+A .... 10000 PRINT "A=1" : RETURN 10001 PRINT "A=2" : RETURN 10002 PRINT "A=3" : RETURN 一行中で連続して文字列を扱うと、"String too complexed"と言うエラーがでて、 停止することがあります。この場合は、文字列を扱う命令を、独立した行にして 試してみて下さい。
私のテスト環境では、ケンケンさんの回路と若干異なる回路を用いていますが、RA1の出力を用いてタクトスイッチとPS/2キーボードとのやりとりを制御する仕様は同じです。
主な変更点は:
・PS/2キーボードを制御するのに、MOSFET-Nを用い、キーボードの電源をオン・オフする様にした。
・リセットスイッチを省略した。
・オーディオのボリュームを、330Ω固定にした。
・RB6の出力(PIC32MX150F128Bのみで、250Fでは使えない)から、390Ωの抵抗を介して、ビデオラインにつないだ。
といったところです。最後のRB6の部分は、この記事で扱っているKM-BASICとは関係ありませんが、KM-Z80 game (ケンケンさんの回路用の、MZ-80Kエミュレーター; SDカードブートローダーrev.2対応のものは、近日中に公開予定)で表示を明るくするために必要です。無くても、KM-BASICは問題なく動きますし、KM-Z80 gameも、表示が若干くらいだけで実行に支障はありません。
実機は、こんな感じです。回路図で+3.3Vのところが+3Vに、+5Vのところが+4.5Vになっていますが、私の環境では問題なく動くようです。
今後の方向性としては、ケンケンさんが、このKM-BASICにテキストエディター機能を追加して下さることになっています。そうなれば、KM-BASICをSDカードブートローダーにロードされた状態で、アプリケーションの変更無しに様々なBASICプログラムを作成・実行・編集する事が可能になると思います。
KM-BASIC for MIPS ver 1.1は、ここからダウンロードできます。
バイナリーのHEXファイルは、2つあります。日本語キーボード(106 キーボード)で使用する場合は、basic106.hexを、USキーボード(101 キーボード)で使用する場合は、basic101.hexを利用して下さい。その他の使用方法は、以前のバージョンと同じです。詳しくは、readme.txtを閲覧して下さい。
コメント
Katsumi (2015年12月23日 18:46:04)
ver 1.1のreadme.txt中の文法説明で、誤植があります。"INKEY$()"ではなく"INKEY()"で、返すのは文字列ではなく整数値です。ブログ中では、修正しました。