Top

ASCII誌(1979年)連載した自作のTiny Basic Interpreter
NAKAMOZU(ナカモズ)Tiny Basic の紹介


Haruo Yamashita   since 14,May,2016
ascii197904

初歩のラジオに連載したアナログシンセの製作記事(1977年1月号~1978年3月号)に続いて、当時まだ黎明期(1977年創刊)でありながらこの分野ではI/O誌と双璧をなしていたASCII誌に連載(1979年4月号~7月号)した「NAKAMOZU Tiny Basic」と呼ぶTiny Basic インタプリタの製作記事を紹介します。

「なぜアナログシンセ連載の直後にTiny Basicなのか」と言うと、
初ラ連載の前には既に山西一啓氏製作のアナログシーケンサを使用しており、次はマイコンを使って一曲丸ごと演奏できるシーケンサを作りたいと考えていました。
初ラ連載が終わり本格的にマイコンの開発を始めると、それはそれは刺激的で面白く、当初の目的はさておきマイコンのハード・ソフトの開発に突っ走ってしまいました。(結果的にシーケンサはできておりません)
その結果、アナログシンセに関しては長い長いブランクになりました。

ASCII誌への私の連載は4回で終わりましたが、大阪府立大学仲間の乾謙一氏が私のTiny Basicのデバッグをかねて様々なアプリソフトを作成してくれており、ASCII誌の「Tiny Basic News letter」というコーナーにその後も続々と素晴らしいゲームソフトを公開されました。(NAKAMOZU Tiny Basicそのものよりもこちらの方が注目されるようになった程です)

私の方はASCII連載後には、次はコンパイラという意気込みで1年くらいで構造化Basicのコンパイラが完成、仲間内ではグラフィックを使ったゲームや、アセンブラの代わりに使われておりましたが、既に社会人の身のため雑誌に発表する時間も無く、残念ながらその存在そのものが消えてしまいました。(時間があれば発掘したいとは思いますが・・)

◆Tiny Basic とは

1970年代後半、NMOSプロセスの8bit CPUの双璧(Intel 8080とMotorola 6800)が日本橋のパーツ店でも入手可能になり、80系、68系と呼ばれそれぞれ信者を獲得していました。それらのCPUにSRAM や I/O(PIAやACIA他)を配線してコンピュータが自作できる時代になり、そうして完成したコンピュータのことは「マイコン」、作る人たちはホビーストと呼ばれていました。
いちから自作する以外に、CPUのチップメーカが評価用に開発したワンボードマイコンを拡張する方法もありました。(後に、各社から登場する完成したパーソナルコンピュータは、32KB程度のMicro Soft のBASICインタプリタがROMに搭載され電源オンですぐ使える製品でしたが、その少し前の時代です)

当時のマイコンでは、機械語よくてアセンブリ言語でプログラムを作るのが普通でしたが、プログラムサイズが僅か2KB程度で当時のマイコンのリソースにフィトしたTiny Basicと呼ばれる高級(?)言語が登場し注目を集めていました。当時ミニコンで作られていたスタートレックのようなゲームが作れる最小限の仕様(16bit 整数固定)でした。

Tiny Basic は開発された地域名を冠することが通例で、
元々ユーザの多い80系では、米DDJ誌にソースが載ったPalo Alto Tiny BASICが有名で、日本ではこれを東大が移植して東大版として公開、68系では少し遅れて電気通信大学が電大版を開発しました。

また、ASCII誌の創刊号で紹介されたVTL (Very Tiny Language)[http://middleriver.chagasi.com/electronics/vtl.html] と呼ばれるさらに小さな記号言語(768 Byte)やこれをベースにしたGameと呼ばれる言語なども紹介され、多くの人がこの範疇の言語創造を競いを活発に開発し雑誌に発表するという時代でした。

◆当時の私の周りの状況

当時大阪府立大学の学生で、初歩のラジオの連載が(大学4回生~M1)で、ASCII連載は松下電機産業に勤務開始と同時(4月から)でした。当然 NAKAMOZU Tiny Basic の開発は、その前ですのでM2のときです。(今考えるとちゃんと学業をしているとは思えないですね)
大学院で電子工学を専攻していた私は、友人数名と6800 CPUを使ったAltair680のようなミニコンタイプのマシンを製作し研究室に置いていました。
もちろん学業とは無関係で、日々研究室でマイコンばかり触っていました。(モジュラーシンセは自宅です)
最初の内は、パネルのスイッチを使って(DMAでSRAMに)機械語を書き込み実行していましたが、暫くしてキーボード、CRTディスプレイ、カセットテープインターフェースも作り、高級言語が使える環境になりました。
  写真が残ってないのでモデルにしていたAltair680の写真です。 ascii22

最初はASCII誌のVTLを移植しVTL版のスタートレックなどを動かしたり、
ASCII誌にソノシートで付録に付いたSWTPC 4K BASIC(68系)を移植して動かしていました。
このBasic はたった4KBで実数演算の本格的なもので数値演算などの数学的な用途に使える素晴らしいものでしたが、エクセルと同じように実数表現に効率の悪いBCD(10進数)が採用されており、また大型コンピュータからの移植と思われるおおらかな内部構造のため大変遅く、ゲームには全く不向なものでした。
このコードの逆アセンブルリストを通学中に読解しインタプリタの仕組みを勉強させて頂き、これを反面教師としてより高速なTiny Basicを作ることになりました。

◆NAKAMOZU Tiny Basic(NTB ナカモズ・タイニー・ベーシック)

私が開発したこの言語は、同じ68系で当時速いと言われていた電大版を解析して(当時は他人のソフトを解析して参考にすることは気にしておりませんでした。)大いに参考にして開発しました。大阪府立大学のある堺市中百舌鳥(ナカモズ)の地名をとって名付けました。
名前が長いため、知られるようになるにつれ"NTB"と略されることが普通になりました。

ASCII誌上で、しばしば各Tiny Basicのベンチマークが行われており、
開発の目標を、「最速」「多機能」「グラフィックサポート」を目指したもので、当時存在したTiny Basicの中では最高速だったと思います。

ソフトウエアを発表するには、そのハードウエア・プラットフォームが決まっていることが前提になりますが、当時プラットフォームと呼べるものは自作や評価ボードを含めてバラバラで、特定のプラットフォームに限定することは難しい状況でした。 その代わりにプロセッサは80系と68系の二択で、それまで公表されたものは、プロセッサは限定されますが、自分のプラットフォームに合わす部分は自分でコードを作って移植するのが普通でした。(BASICの場合、I/Oルーチンは自分で作るものでした。)

NTBは、私の自宅の環境であり当時68系ではユーザが多かった日立のワンボードであるH68TRを仮のプラットフォームとしました。(当然移植のための情報を公開) しかし、H68TRは当初ディスプレイ・インタフェースが無く、私のシステムでは専業メーカーのキャラクタVRAM(ビデオRAM)を改造して使用していましたので、表示ルーチンは私のシステム依存のものになってしまうのが、発表に際しての悩みでした。

発表時点では、日立のH68純正のVRAMであるH68TVが発売されていたので、それをプラットフォームにすればよかったのですが、私が持っていないのとCPUアクセスに制限がある設計であるため好きではなかったので、H68TVのユーヘザー向けの移植記事は編集部にお任せしました。
特にTiny Basicのなかでは後から発表し、高速高機能に加えてグラフィック機能を持つことが売りでしたので、ディスプレイ・ハードウエアとの関係が密になり、ハードウエアの改造方法などと一体のわかりにくい記事になってしまい、ハードもソフトも分かる人しか相手にしない物になってしまいました。(当時はそれで何が悪いと思っていましたが)そのせいで結果的には、あまり多くの人に使ってもらうことができなかったように思います。

◆新たに発掘 NTBのオリジナル・ソースコード

今年になって、かつてのマイコン6800,6809などをシミュレータでは無く実機で動かそうとするプロジェクトが広がっています。 その中でNTBに興味を持たれる方も増加していますので、できるだけ情報公開してゆきたいと思っています。
ただ、我が家にはNTB発表当時の6800マシンは残っていないだけで無く、当時のマシンが独自の高速カセットテープI/Fを使っていた関係で、テープに入ったソースコードやオブジェクトも読めなくなり廃棄されています。
紙にプリントしたものが唯一の資料ですが、これも何度かの転居時にかなり処分されています。

今回処分時にスキャンしていたものが発掘できました。 少しでもお役に立てることがあるかもしれませんので公開いたします。 (ひょっとするとASCII発表のものと完全に同一では無いかもしれません。) 放電プリンタからのスキャンで見にくいですが、手書きでコメントが記入してありますので、解析したい方のお役に立てるかもしれません。(いつの時点のコメントかは不明です。)
・NTB source code part1
・NTB source code part2
・NTB source code part3
・NTB source code part4
・NTB source code part5
・NTB source code part6



◆ASCIIに掲載された内容

◆第1回 1979年4月号(創刊22号)

・NAKAMOZU Tiny Basic(NTB)とは? / NTBを走らす方法 / 特徴 /
 移植のための変更箇所 / インタプリタの構造と高速化 / I/Oルーチンの作り方

 NTBの特徴のアピールのためにグラフィック系の多くのサンプルプログラムを編集部に送りました。それらが記事の周りに散りばめられたチープな誌面になりました。

・NAKAMOZU Tiny Basic ユーザーズ・マニュアル
 変数・配列・定数 / COMMAND / STATEMENT / FUNCTION / FORMATTER / ERROR MESSAGE

 他のTinyBasicと同様の変数に加えてIX変数(ポインタ)が使えます。
 定数は、10進に加え16進数とASCIIコードが使え、16進数でのプリントもできます。
 FOR-NEXTループ以外に、DO-UNTILループを追加し、IFとGOTOを使用するループを不要にし少しだけ構造化し速度UPしました。
 グラフィック関係の関数を追加し、ゲーム用にリアルタイムのキー入力関数を設けました。

・DUMP LIST ( Object Code)
 DUMPリストはこのようなソフトを入力する普通の形態でした。私のすべてのリストは、自作の放電プリンタでプリントしたものです。8とBなどの読み違えが起こりがちなのでチェックサムを付けています。

・H68/TR・TV用シンプルI/Oルーチン
 純正のディスプレイボードH68・TVのユーザのための移植方法の説明で、私のI/Oルーチンをそのまま使い、純正のTVモニタルーチンに直結するもの。

    ascii22

◆第2回 1979年5月号(創刊23号)

・NTBインタプリタの構造
 インタプリタの構造 / 上位管理ルーチン / 代入処理ルーチン / GOSUB RETURN, DO UNTIL処理 / FOR NEXT処理 / グラフィック用ハードウエア

 スタック処理が弱い代りにメモリアクセスが強い68系の特徴を活かして、ハードウエアスタックの他に、演算用スタック、リターンスタック、FOR-NEXTスタックなどをソフトで構成しています。そのためエラー処理が容易になっています。80系ではひとつのハードウエアスタックですべて処理をすることが多いです。
・H68/TR・TV用I/Oルーチン
 グラフィックを含めて純正のH68・TV用に移植したI/Oルーチンです。

    ascii22

◆第3回 1979年6月号(創刊24号)

・プログラミングとグラフィック・エディタ
 グラフィック用ソフトウエア / NTBによるプログラミング / GRAPHIC EDITOR

 グラフィックキャラクタでありながらドット単位で描画できるグラフィックハードを活かし、ドット単位で描画した画像から自動でグラフィックキャラクタをのプリント文を生成します。
・H68用I/Oルーチン ソースコード
 私が作成した高機能I/Oルーチンです。編集部のミスでこれの掲載が遅れました。
    ascii22

◆第4回 1979年7月号(創刊25号)

・ファイル入出力ルーチンとプログラム例
 カセット入出力 / (Sample)バリケードゲーム / (Sample)πの計算 / 最後に


    ascii22

◆乾謙一氏作のNTBアプリケーションの紹介

NTBアプリケーションとして開発された乾氏のゲームソフトは、あまりのできの良かったため、後のASCII誌上で「乾氏に挑戦」と銘打ってNTB以外に移植するのが流行りました。

・NAKAMOZU TinyChess ( 1979/5 )

・The Othello 必勝手順探索ルーチン付き( 1979/6 )

・NTBゲーム4種 / Space Invader / 3D-MAZE / バレーボール / 無限次ドラゴンカーブ ( 1979/8 )

・NTB 2D-4M HAMLET ( 1979/11 )

・NTBによる連珠 人間に全勝しています( 1980/2 )



◆米誌"68MICRO JOUNAL"に紹介された内容

米 68 Micro Jounal (August 1979, Volume 1 Issue 6)
ASCII連載と並行して68系マニアのためのディープな雑誌「68MICRO JOUNAL 1979年8月号」に、 "Report from JAPAN"という記事が、当時藤沢市にお住まいのTaylor Jacksonさんから投稿されました。NTBやGameについても米国の色々なTiny Basicと比べて優れいると紹介して頂きました。この雑誌のことを知ったのは少し後でした。「yamashitaは将来コンパイラ版をリリースすることを約束している」と書かれているのを見るとズキッときます。
68Micro

◆"Report from JAPAN"の内容

68 Micro Jounal (August 1979, Volume 1 Issue 6)



◆ASCII連載後の活動

◆BASICコンパイラの開発

◆手探りのスタート(1980年~)

幾つかの逆アセンブルリストを読んでインタプリタの構成は身につき、NTBを開発しましたが、インタプリタの内部コードを書いていると、実行時にはとんでも無く回りくどい処理をさせねばならないことにストレスを感じ、コンパイラへの思いは強まってゆきました。
NTBではその無駄を少しずつでも改善した結果インタプリタとしては高速なものになりましたが、それでもアセンブラで書いたのとは比較になりません。まさに2桁,3桁は異なります。 その点コンパイラは、直接アセンブラで書いたものには劣りますが、数倍の違いまで近づけられそうです

当時は、まだ「高級言語=インタプリタ」の時代で、コンパイラというものは名称しか知らない状況でした。実際マイコン用の小さなコンパイラはまだ珍しく、我々がインタプリタのときのように先人のコードから学ぶという機会は無く、どのように作れば良いかは手探りの状況でした。(もちろんbit誌のようなコンピュータサイエンスの雑誌では取り上げられていましたが、あまりに高尚で)

最初のとっかかりとして、コンパイラそのものはブラックボックスとして、NTBのソースコードからこうあって欲しいオブジェクトコードを手動で作る作業をしていました。できるだけ共通ルールで作れそうなコード生成です。6800はレジスタが極めて少なくその代わりアキュムレータが2つあるので、必然的にACCAとACCBを連結してこれをスタックトップと見なしたコードを作り、変数は全て1Byteでアドレス指定できるゼロページメモリを使います。ただ、直接メモリに対する命令も各種あったり、単純な16bitのインクリメントや比較などには一つしか無い16bitのIXレジスタを使った方が速いなど、最適化の余地が大きく、最適化無しではかなり不細工なコードになることが分かります。(アセンブラで書くときには絶対しないような)

後継の6809(素晴らしいCPUです)では、機械的に生成したコードでもかなり良いコードになることに気づきましたが(インタプリタ以上に命令セットの良しあしが直接効いてきます)、今回はNTBのコンパイラなので6800で進めることにしました。

◆課題だらけ

NTBインタプリタでは、インタプリタのコードが2.5KBで、残りはNTBのプログラムと変数・スタックに使用できます。頑張って省略形をつかってプログラムサイズを抑えると8KBのメモリでも動かすことができました。最初は4KBで使っていました。
しかし、コンパイラになるとコンパイラ自身のコードとNTBのソースコードだけでなく、作成されたオブジェクトを格納するメモリも必要です。さらにはソースコード編集用のエディタも使いたい。(既にKY氏のスクリーンエディタが使えました)


◆NAKAMOZU Basic Compiler マニュアル(未発表)

NAKAMOZU Basic Compiler manual






inserted by FC2 system