VTL系言語の歴史
現在ではインターネット上で検索しても資料が見つかりませんが、私の知って いる範囲でVTL系言語の仕様をまとめてみました。表の最初にある拙作の rvtl 以外は不正確な部分もあるかもしれません。 基本的には BASIC ですが、コマンドが記号に代入する形式となっています。
オリジナルは VTL (Very Tiny Language) という768バイトで書かれた ALTAIR 680b 用の Tiny BASIC です。日本では, 1980年前後に GAME III (General Algorithmic Micro Expressions) というVTL系言語が流行しました。 メモリが 4 キロバイト程度しかない環境でも BASIC という高級言語を使って みたいという切実な思いが背景にあったと思います。どれもエディタ機能まで も持っていました。
おそらく VTL は、1976年9月頃に使われ始めた 8080で動作する CASUAL (Chicago Area Small Users Algorithmic Language) を参考にして開発された ものと思われます。VTL のソースを入手することは困難ですが、CASUAL (の移植版) は今でも Simtel CP/M User's Group Volumes 18 (cpmug018.ark) の中に見ることができます。
cpmug018.ark は
https://www.retroarchive.org/cpm/cdrom/SIMTEL/CPMUG/CPMUG018.ARK や
https://custom.lab.unb.br/pub/emulators/cpm/cpmug/cpmug018.arkから
入手可能です。CP/M で使われていたらしい ark 形式のアーカイブは ark101.zip
という MS-DOS で動作するプログラムで解凍することができます。
「ark101.zip」を Google で
検索
すると簡単に見つけることができます。
GAME-IIIは1978年7月号の月刊アスキーで6800用のインタプリタ (機能的にはBASIC)として大西博氏によってアセンブリのソースリスト とともに公開されました。バイナリのサイズが約1.5Kバイトと小さく, サイズの割に高機能でアセンブリソースも公開されたことから,8080, z80, 6809, 6502 と多くのCPUに移植されました。さらに中島 聡氏によって GAME自身で記述された8080用のGAMEコンパイラがアスキー誌上で発表され, コンパイラも多くの機種で動作するようになりました。
表中で A は変数、e と n は式を、x.x はファイル名を表しています。
言語 | rvtl64 | rvtl | CASUAL | VTL | VTL/K | GAME III | VTL98 |
---|---|---|---|---|---|---|---|
CPU | x86-64 Arm64 RISC-V | 80386+ ARM PowerPC | 8080 | 6800 | 6800 | 6800他 | 8086+ |
OS | Linux | Linux | altair | Mikbug | 多種 | PC-98 | |
発表年 | 2010-2024 | 2002-2005 | 1976 | 1976? | 1978 | 1978 | 1988 |
プログラムサイズ(KB) | 10 - 28 | 8 - 16 | 1.6 | 0.75 | 1.25 | 1.5 | 3.4 |
行番号 | 1-21億 | 1-65534 | 1-65535 | 1-65535 | 1-65535 | 1-65535 | |
コメント | : | .=e | ) | ) \ | Line#X | ; | |
ラベル | ^ABC | ||||||
単純変数 | A-Za-z | A-Z | A-Z | A-Z | A-Z | A-Za-z+ | |
単純変数ビット数 | 64 | 32 | 16 | 16 | 16 | 16 | 16 |
単純変数範囲 | -900京~ +900京 | -21億~ +21億 | 0-65535 | 0-65535 | 0-65535 | 0-65535 | 0-65535 |
単純変数スタック PUSH | +ABC | ]ABC | |||||
単純変数スタック POP | -CBA | [ABC | |||||
文字定数 | 'Abcdefgh' | 'Abcd' | 'A' | 'A' | |||
16進定数 | $ | ] | $ | $ | |||
1バイト配列 (8bit) | A(0) | '[0] | A:0) | A(0) | |||
2バイト配列 (16bit) | A{0} | "[0] | :0) | :0) | A(0) | A[0] | |
4バイト配列 (32bit) | A[0] | ||||||
8バイト配列 (64bit) | A;0] or A;0; | ||||||
数値入力 | A=? | A=? | A=? | A=? | A=? | A=? | |
数値出力 10進左詰 | ?=e | ?e | ?=e | ?=e | ?=e | ?=e | |
数値出力 10進右詰n桁 | ?(n)=e | ?(n)=e | |||||
数値出力 10進右詰 0埋め | ?[n]=+e | ||||||
数値出力 16進2桁 | ?$=e | ?$=e | ?B=e | ||||
数値出力 16進4桁 | ?#=e | ??=e | ?W=e | ||||
数値出力 16進8桁 | ??=e | ||||||
数値出力 16進16桁 | ?%=e | ||||||
数値出力 無符号10進 | ?*=e | ||||||
数値出力 8進n桁 | ?{n}=e | ||||||
数値出力 2進n桁 | ?!n!=e | ||||||
文字入力 | A=$ | A=$ | A=?' | ||||
リアルタイム文字入力 | A=@ | ||||||
文字出力 | $=e | $=e | $=e | $=e | ?'=e | ||
文字出力 2byte | $$=e | ||||||
文字出力 4byte | $#=e | ||||||
文字出力 8byte | $%=e | ||||||
文字列出力 | "STR" | ?/STR/ | ?="STR" | ?="STR" | "STR" | "STR" | |
改行 | / | ?=" " | / | ||||
改行の阻止 | ; | ; | ; | ||||
ページ移行 | <= | #= | |||||
GOTO | #=e | .=e | #=e | #=e | #=e | #=e | |
GOSUB | !=e | $=e | #=e | !=e | #=e | ||
MACHINE GOSUB | >= | >= | >= | >= | |||
RETURN | ] | .=$ | #=! | ] | ! | ||
STOP | #=-1 | .=-1 | #=MAX+ | #=MAX+ | #=-1 | . | |
IF | ;=n | ;=n | |||||
FOR | A=1,10 | A=1,10 | |||||
NEXT | @=n+1 | @=n+1 | |||||
DO | @ | @ | |||||
UNTIL | @=(n) | @=(n) | |||||
PEEK | 配列 | ! | A=@(n) | 配列 | 配列 | ||
POKE | 配列 | &=e | @(n)=e | 配列 | 配列 | ||
SLEEP | _=n | ||||||
NEW | &=0 | N | &=0 | &=0 | &=0 | }={ | |
LIST | 0 20- 20+ | L | 0 | 0 | 0 | 0 | |
式の優先順位 | 無 () | 有 () | 無 () | 無 () | 無 () | 有 ()[] | |
算術演算子 | + - * / | +-*/ | +-*/ | +-*/^ | +-*/ | +-*/ | |
& \ ^ | | .(AND) | ||||||
>> << | .(OR) | ||||||
単項演算子 | - + < | - + | - | - | -+%# | - ! & | |
比較演算子 | = < > | = < > | = < > | = < > | = < > | = < > | |
>= <= | # | >= <= | >= <= | ||||
<> | <> | ||||||
変数のアドレス | & | ||||||
システム (return address) | $ | ! | ^ | ||||
システム (剰余) | % | % | % | % | % | % | |
システム (セグメント) | = 配列 | ||||||
システム (行番号) | # | . | # | ||||
システム (ページポインタ) | = | < | = | { | |||
システム (テキスト先頭) | , | < | - | ||||
システム (テキスト末) | & | & | } | ||||
システム (RAM末) | *(可変) | * | * | + | |||
システム (乱数) | ` | ' | ' | ~ | |||
システム (ファイル先頭) | { | ||||||
システム (ファイル最終+1) | } | ||||||
システム (秒, マイクロ秒) | _ % | ||||||
システム (エラーコード) | | | ||||||
システム (ウィンドウサイズ) | . | ||||||
実行 | #=1 | R | #=1 | #=1 | #=1 | #=1 | |
編集 | 10! 行 | 行置換 | 行置換 | 行置換 | 行置換 | Screen | |
ソースファイル入力 | >="x.x" | ||||||
ソースファイル出力 | <="x.x" | ||||||
外部コマンドの実行 | ,="x.x" | ||||||
プログラム終了 | ~ | ||||||
ファイル読み込み | )="x.x" | ||||||
ファイル書き出し | (="x.x" |
参考文献
ほとんど入手不可能かも知れませんが、一応。
- Bob Van Valzah, It's CASUAL!, Dr. Dobb's Journal, 1976(Dec), p19
- IEE Corp., 768バイトで何ができるか?, マイコン徹底研究, 工学社, 1977, p214
- 末広 祥二, 6800用TinyBASIC VTL/K, インターフェース, CQ出版社, 1978(4), p83
- 大西 博, GAME, ASCII, アスキー,1978(7), p66
- 大西 博, GAME, ASCII, アスキー,1978(8), p42
- 大西 博, GAME, ASCII, アスキー,1978(9), p68
- 大西 博, GAME, ASCII, アスキー,1978(10), p66
- 中島 聡,GAME80コンパイラ, ASCII, アスキー,1979(7), p26
- 塚越一雄, オリジナル言語入門, 電波新聞社, 1988, ISBN4-88554-158-1