戻る 【はじめに】 CASIO製ポケットコンピュータFX−890用のGAMEインタープリッタを作 りました。 記憶をたどりながら作った為、完全互換にはなっていないと思いますので勝手に「G コードインタプリッタ(またはG言語)」と命名し発表します。 GAME言語は大西氏が開発した整数型のタイニーベーシック(^o^)で、10年以 上前、パソコン上でBASICインタープリッタしか動かないような時代に、アスキー 誌上に彗星の如く現れ、その高速性とメモリアドレッシングの柔軟性が高く評価され、 多くのパソコンに移植された言語です。 さらに、中島氏によりGAME言語自信で記述されたGAMEコンパイラが発表され 、大変話題になったものです。 自作のZ80ボードでハンドアセンブルでプログラミングを行っていた当時の私にと ってGAME言語との出逢いは大きなカルチャーショックであり、「ほとんど何も出来 なかったただの箱」を「コンピュータ玉手箱」に変身させる魔法のようなものでした。 同包の COMFX.G は、当時中島氏により発表されたGAME言語で記述された8ビット 用GAMEコンパイラをGコード用に移植したものです。 インタープリッタによるコンパイルの為非常にコンパイル時間がかかりますが、自分 自信(コンパイラ)をコンパイルしてから使用すると驚くほど高速になります。 【実行速度】 同包の素数を求めるプログラム SAMPLE1.BAS SAMPLE1.G で500以下の素数を求め た時の実行速度は +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | 環 境 | 実行時間 | 速度比 | +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ |内蔵のベーシック | 2分56秒(176秒)| 1.00 | |G-CODE | 1分50秒(110秒)| 1.60 | |G-CODE(コンパイル後)| 17秒 | 10.40 | +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ で、コンパイルするとFXに内蔵のベーシックの約10倍程度の速度になります。 【起動方法】 1)インタープリッタ自体は2000H〜332FHのメモリを使用しますが配列データを使用(例 Z=& Z(0)=1234)する場合やコンパイラを使用する場合は、必要に応じてマシン語エリ アを確保して下さい。 コンパイラを使用する場合は、後述の例のように行うとオブジェクトを3330Hから落 としますので大きめに確保して下さい。 例 ベーシックモードで CLEAR 256,32000,33000 2)同包の GFX.BIN をRev氏作成の Z1BIN.EXE 等を使用してメモリにロードして下さ い。 3)同包のCOMFX.G をプログラムファイルにロードして下さい。 4)ベーシックのエディター機能を利用して G-CODE のソースを作成して下さい。G-CODEインタープ リッタは行の始めがベーシックのコメント命令(')の行を実行します。 5)セグメントを0に設定し、2000Hをコールして下さい。 例 ベーシックモードで DEFSEG=0 CALL &H2000 6)作成したプログラムをインタープリッタで実行 例 P1ファイルにG-CODEソースがある場合 0:=1 1:#=1 上記の先頭2文字の n: はG-CODEインタープリッタのプロンプトで実行対象ソースが Fnファイルであることを示しています。 また、コマンド入力状態で入力した文字列はプログラムとして実行されます(上記 の #=1は GOTO 1 の意味)ので A=12 !=100 ?=A のようにディバッグの際に利用して 下さい。 7)プログラムをコンパイルする。 例 P0ファイルにコンパイラ、P1ファイルにソースが入っているとすると 1.ソースファイルの先頭アドレスを確認する。 1:=1 1:??=\\*16+= 2.コンパイラを起動しソースをコンパイルする。 1:=0 0:#=1 GAME PROGRAM:$nnnn START ADRESS:& WORKING AREA:$6000 nnnnは1.で表示されたソース先頭アドレスを入力して下さい。 また、ワークエリアとして入力した値をwwww(上記例では6000H)とすると ( wwww - 4 ) 〜 ( WWWW + 2 x line ) 但し lineはソース行数 の範囲のメモリを使用します。 8)コンパイルしたプログラムを実行する。 例 G-CODEインタープリッタ上からは 0:>=& ベーシックまたはCALモードから起動する場合は 0:??=& pppp 0:Q CALL &Hpppp ppppはフリーエリアのアドレス(&の値) 【言語仕様】 G言語について簡単に説明しますので興味ある人は遊んでみて下さい。 ------------------------------------------------------------------------------ 命 令 フォーマット 具体例 説 明 EXIT Q G-CODEインタープリッタを終了する RUN #=1 プログラムを最初から実行する RUN FROM #=行番号 #=1000 プログラムを指定行から実行する 行挿入 n<statement> 100 #=20 statementの最初の文字がスペース文 字以外の場合はコメント行となる CHANGE PROGRAM =n =1 対象プログラムをPnに設定する 後述の\\と=の値が設定される PRINT LEFT ?=n ?=2+8 nの値を10進数左づめで表示 PRINT RIGHT ?(m)=n ?(8)=A*B nの値を10進m桁右づめで表示 PRINT HEX(2) ?$=n ?$=A+B nの値を16進2桁で表示 PRINT HEX(4) ??=n ??=A nの値を16進4桁で表示 PRINT CHAR $=n $="a" nの値をASCII文字で表示 TAB .=n .=10 n個のスペース文字を表示 PRINT CRLF / //// 改行する PRINT STRING "文字列" /"ab"//"cd" 文字列を表示する INPUT ? A=? 数値を入力する INPUT CHAR $ A=$ ":" ?$=A 1文字を入力する CHECK KEY $$ ;=$$ K=$ *キー入力データチェック (0:データ無し) I/O INPUT [adrs) A=[$60) *I/Oアドレス(adrs)から1バイト入力 I/O OUTPUT [adrs)=n [$60)="A" *I/Oアドレス(adrs)に1バイト出力 LET 変数=n A=123 変数にnを代入する GOTO #=n #=1000 行番号nへジャンプする END #=-1 #=-1 プログラムを終了する GOSUB !=n !=20000 行番号nをサブルーチンコールする RETURN ] ] サブルーチン処理を終了する FOR 代入文,n I=1,10 FOR-NEXTループの先頭を宣言する NEXT @=n @=I+1 FOR-NEXTループの末端を宣言する DO @ DO-UNTILループの先頭を宣言する UNTIL @=(n) @=(A<B) DO-UNTILループの末端を宣言する (n=0の間、繰り返す) IF文 ;=n statement ;=A<10 #=100 nが偽(零)なら行末までスキップする CALL >=adrs >=$2002 マシン語ルーチンをコールする 二項演算子(優先順位無し、左から右に実行) 加算 + A=B+(C*D) 減算 - A=B-C 乗算 * A=B*(C+D) 除算 / A=B/C 除余 % A=B%C * AND & A=B&C * OR | A=B|C * XOR ^ A=B^C * > > A=B>C 真の場合1、偽の場合0 < < A=B<C 同上 <> <> A=B<>C 同上 = = A=B=C 同上 >= >= A=B>=C 同上 <= <= A=(B<=C)|(A=D) 同上 単項演算子 NOT ~ A=~A *ビット反転 ABS + A=+A 絶対値 符号反転 - A=-A 論理反転 # ;=#((A=B)|(A=C)) 除余 %(statement) A=%(B/C) ()内の命令を実行し、直前に行 った割算の余りの値を得る 乱数 'n A='100 0以上(n−1)以下の乱数値 乱数SEED '=n '=1234 乱数(合同法で発生)の種をnに設定 変数 アルファベット文字列 A=COUNT+STEP A-Zの26個,最初の文字のみで認識 配列1 変数:n) A:2)=B:-1) 変数をポインタとした1バイト配列 配列2 変数(n) A(0)=B(1) 変数をポインタとした2バイト配列 プログラムセグメント \\ ??=\\ *プログラム先頭のセグメント値 プログラムオフセット = ??=\\*16+= *プログラム先頭のオフセット値 フリーエリアアドレス & ??=& フリーエリアの先頭を示す定数 定数表現 10進数 decimal A=1234 -32768〜32767 16進数 hex A=$2000 $0000〜$FFFF 文字コード "char" A=" " ?$=A charの文字コード ------------------------------------------------------------------------------ ●説明の項目で'*'印のついているものは今回追加したものでオリジナルの「GAME 言語」の仕様にはないまたは仕様を変更したものです。 ●オリジナルの「GAME言語」にあった プログラムロック &:0)=$F0 プログラムロック解除 &:0)=$FF の機能はサポートしていません。 ●G言語ではメモリエンドポインタ'*'はサポートしていません。 ●変数による配列アクセス時のセグメント値を変更する為の変数'\'を追加しました。 ●プログラムを格納するメモリのセグメント値を変更する為の変数'\\'を追加しました。 例 ??=\\*16+= ●G-CODEの変数領域の先頭番地が2004Hに格納されていますのでコンパイルしたオブジェ クトプログラムをベーシックからコールする時の変数の受け渡しに使用できます。 例 ベーシックから G-CODE の変数 B に 1234H をセットする。 VAD=PEEK(&H2005)*256+PEEK(&H2004):POKE VAD+2,&H34:POKE VAD+3,&H12 ●2002HをコールするとG-CODEの変数 A,B,C,D の値を AX,BX,CX,DX レジスタにセットし BIOSコールを行った後、レジスタ AX,BX,CX,DX の値を変数 A,B,C,D にセットします のでBIOSコールインターフェースとして利用できます。 例 座標(100,10)を中心とした半径8の円を描く Z=$2004 Z=Z(0) Z:1)=$15 Z:2)=100 Z:3)=10 Z:4)=8 Z:6)=0 $=12 >=$2002 ●実行中のプログラムを中止する場合は TABキーを押して下さい。但し、TABキーの センスは、文字列表示命令 "" を実行した時しか行っていません。また実行中にス ペースキーを押すと文字列表示命令実行後プログラムが一時停止します(何等かのキ ー入力があると再開します)。数値入力時点で中断したい場合は " 等を入力すると停 止します。 追記 ◎本プログラムはLSIC86コンパイラを用いて作成しました。 (一部アセンブラ使用) ◎本プログラムはコンパイルされたコードとのインターフェースのため INT F3Hを 使用しています。 ◎本プログラム使用によるいかなる損害に対しても作者は保証の義務がないもの とします。 ◎転載の際は作者(sat.skyriver@gmail.com)まで連絡して下さい。 また転載する場合は、本書庫ファイルの内容を変更しないようにして下さい。 ◎参考文献 Z1/FX−890P活用研究(工学社) 戻る