ASCII誌で、大西博氏により。TinyBASICのステートメントを記号にしたインタープリタ言語が発表された。
6800用が大西氏のオリジナル。1978年ごろであっただろうか???
まだ、パソコンというものが無かったマイコン時代、日本の大抵の若者達(当時)は、GAMEを使った。
当時、メモリが極小(1KB~4KBytes)であった。
ちなみに、TK-80は標準で 512Bytes(0.5KB!)であった。
6800から、6502, 8080,Z80, 6809などへと移植されていった。
(ちなみに、Z80版と8080版は、符号付きの大小比較ができていない。符号無しの比較(キャリーのみ見る)を行っており、かなり恥ずかしい。GAME言語のオリジナルは6800で作られ、元来、数値の大小比較は二の補数の符号付き比較しか持っていない言語)
C言語のポインタ(配列)と同じやり方で、メモリを操作できた。6800はメモリ・マップドI/Oだから、それでI/Oポートも叩けた。
OSもメモリ保護も何も無い裸のハードウェアの時代。若者は、すべてをアクセスできた。
機械語モニタでは、なにもできず。高級言語のコンパイラを動かす方法も無い時代。
GAME言語は、現在のUNIXのshellのようなものだった。
shellスクリプトを書くように、使い捨ての短いプログラムを打ち込んで、マイコンを駆動した。
セーブするストレージも無かったが、打ち込んだ方が短いプログラムをよく使った。
僕も、クラブのMZ80K(テープで処理系を読ませないと何もできない機械)を起動すると、まずGAMEを読み込ませてから、何をするかを考えた。
ちなみに、クラブには、Apple][もあったが、6502の機械語は憶える気がしなかったので、そちらでもGAMEを使った。(Apple][では、Integer BASICも愛用したが)
言語の意味的なものは、BASICと同一だった。しかし、do~while() があったりして、BASICより偉い面もあった。
メモリの間接参照は、C言語でp[x] と書くのと同様に、p(x)と書けば、参照も代入もできた。
ただし、型は、まったく整数しか無い言語なので、メモリ・アクセスする時に、
p:x)で1Byte, p(x)で2Bytes という風に、型を明示した。
通常の変数は、すべて整数(2Bytes)。
コマンド(BASICでいう「ステートメント」も、GAMEでは「コマンド」と呼ぶ)は、
;=がIFであったり、?=がPRINTであったりで、楽しい。
I=1,10 ?=I @=I+1
は
FOR I=1TO10;PRINT I,;NEXT I
である。
インタープリタなので、対話的に使用する。
A=$FF80 ?$=A:0)
とやって、0xFF80番地のI/Oポートから入力して、その値を読む。
A:1)=$55
とやって、0xFF81番地のポートへ0x55を出力する、とか、日常的にやっていた。
当然、ループも回せるので、LEDをチカチカさせることなんて、瞬間芸だ。
GAMEが発表された頃は、ハンダ付けして作った自作機に、フルキーボードを接続するのが流行りだしたころであった。
また、Apple][に続いてPET-2001, TRS-80 model1, MZ-80K などが順次出始めた頃であった。
当然、当時は、ハッカーであってもキーボードには不慣れなであったので、タイプ数が少なくて済むGAMEは大人気であった。
GAMEはコンパイラも出た。
http://www.mztn.org/rvtl/game80.html
失礼だが、上をASCII誌で見て、「えっ、コンパイラってこんなのでいいの?」と思った。
そして、あたしも、6809版GAMEインタープリタが出て、すぐにGAMEの6809のコンパイラは独自に作った。(うーん、探しても出てこないな)
ま、ただの変換器でとてもコンパイラとは呼べないが、6809版は、アルバイトで使って好評であった。
あたくし独自の8080用コンパイラが出てきた。(C言語で記述。GAMEからの書き直しなので、あまりCらしくない)
ftp://www.takeoka.org/pub/micro/gc80.tgz
上の8080版は、同梱のランタイム・ルーチンがよく書けていると自負している。乗除算はZ80でも、このコードになるはずだ。
16進数のプリントは、Z80の方がORによるHalfCarryの操作とDAAが違うので、8080の方が少し長いか。
また、あたくしが、スクラッチからC言語で書いたGAMEインタープリタが出てきた。
32bit拡張してある。
Linux, BSDならmakeすれば動くであろう。(Windowsなんか知らん)
ftp://www.takeoka.org/pub/micro/game-int.20110901.tgz
GAMEの文法は、このページが詳しい。
GAME86 Compiler for MS-DOS 1.00C http://www.mztn.org/game86/
ただし、
#=<式> <式>の値以上の行番号の行へジャンプ(GOTO)
!=<式> <式>の値以上の行番号の行へサブルーチン・コール(GOSUB)
?=<式> <式>の結果を左詰め10進数で表示
??=<式> <式>の結果を16進4桁で表示
?$=<式> <式>の結果の最下位バイトを16進2桁で表示
?(<式1>)=<式2> <式1>の値の桁数で、<式2>の値を右詰め10進数表示
$=<式> <式>の値の最下位バイトを文字コードとする1文字を表示
.=<式> <式>の値の数だけ空白を表示
'=<式> 乱数の種(シード)を<式>の値として設定
あと、プロンプトで"0"を入力すると、プログラム・リストの表示。
他には、対話モードで特殊なものは無い。
実行の開始は、#=1 とやれば、プログラムの先頭へGOTOして、実行が始まる。
--