30年前のパソコンってこんな感じ
最近の若いプログラマと話をしていると、中学生の頃からプログラミングをしています、という人が結構います。物心ついたころからコンピュータとインターネットは普通に身の回りにあった、という世代がちゃくちゃくと社会に出てきているわけで、考えてみるとすごい話です。しかしながら、自分も振り返ってみると初めてパソコンに触れたのが30年前の中学生の頃だったし、やっぱりふつーなのかな、とも思います。
というわけで今回は、30年前にどんなパソコンを使っていたのかという話をしようと思います。
私が初めて触れたパソコンはNECのPC-6001でした。すっかりパソコンに魅了されてしまった私は、誕生日に親を説得してPC-8001を買ってもらいました。なんで6001じゃなくて8001だったかというと、当時放送していたNHKの「マイコン入門」という番組にPC-8001が登場していたからです。当時のパソコンでやることといえば、毎月発売されるパソコン雑誌に掲載されるゲームを、手で入力して遊ぶことでした。当時はインターネットどころかパソコン通信も存在せず、紙に印刷されたプログラムを見ながら、キーボードから入力して実行していたのです。ちなみに当時はHDDも存在せず、HDDどころかフロッピーディスクさえなく、プログラムはカセットテープに録音して保存していました。プログラム言語はBASICでした。ベーマガという雑誌が非常によく売れていました。5、6ページのゲームプログラムがたくさん掲載された、中高生プログラマには欠かせない雑誌だったのです。ベーマガには時折マシン語のプログラムも載っていました。マシン語の場合、16進ダンプとごく簡単なチェックサムだけでプログラムを入力しなければならず、打ち間違えて動かないということもよくありました。当時私が愛読していたのは、ベーマガ、月刊ASCII、月刊I/Oなどで、たしかOh! PCなんて雑誌もあったと思います。
さて雑誌のゲームを入力して遊ぶのも楽しいのですが、それだけではつまりません。PC-8001にはBASIC以外にも使える言語がありました。月刊ASCIIにはいくつものコンパイラやインタプリタが発表されていましたが、私が特に好きだったのがTL/Iという言語でした。というのもモナコ・グランプリという名作ゲームが、このTL/Iで書かれていたからです。TL/IはPascalライクな構造化言語で、使える変数は1バイト整数型(と配列)だけでしたが、いっちょまえにprocedureを定義でき、構造化プログラムの基本を学ぶにはとてもよい言語でした。TL/Iはコンパイラのみでエディタは持っていません。プログラムは面白いことに、BASICのREM文(コメント)で書き、TL/Iコンパイラを起動するとBASICのプログラム領域を解析してマシン語を出力するという方式になっていました。PC-8001にはRAMが32KBしかなく、さらにVRAMやワーク領域を引くと20KB程度しかありませんでした。TL/Iのコンパイラを置くとさらにメモリは少なくなり、ソースプログラムとコンパイル後のマシン語のことを考えると、ごく小さなプログラムしか書けませんでしたが、それでもゲームを作ったりするには十分なパワーを持っていました。
高校生になる頃には、BASICのほかにもマシン語を覚えてプログラムを書くようになりました。BASICはインタプリタで、実行速度は非常に遅かったので、高速に行いたい計算や、ゲームの画面書き換えなどはマシン語で書き、BASICからサブルーチンのようにしてそれをコールするというのが普通でした。PC-8001はZ-80(互換)のCPUが搭載されていました。インストラクション表を生徒手帳の間に挟んで持ち歩き(だいたい10ページぐらいで収まっちゃいます)、それを見ながら授業中にハンドアセンブルして、家に帰ってからパソコンに入力するみたいなことをやっていました。たしかPC-9801には簡単なアセンブラが搭載されていたと思うのですが、PC-8001にはそんなものは存在しませんでしたので、手でアセンブルするしかなかったのです。ただ、ものぐさな私は相対アドレスジャンプの計算が苦手で、やはり月刊ASCIIに掲載されていたPROTというマクロアセンブラを使っていました。PROTはとてもよくできたアセンブラで、ラベルジャンプも書けるため、プログラムの再配置も(アセンブルしなおすことで)簡単にできる利点がありました。ただ、PROTのようなアセンブラを使っていると、部活(もちろんパソコン部です)の先輩が見咎めて「男は黙ってハンドアセンブルだろ」と叱られたものでした。まあ構わずPROTを使い続けていましたが、実はPROTを使ってプログラムを書くにも問題がありました。
PROTというアセンブラは、メモリ上ではN-BASICのソースプログラム領域(だいたい8000Hぐらいから始まります)に配置されていました。PROTは自前のラインエディタを備え、RAMの特定領域にソースを格納し、これをアセンブルして後方のメモリへ出力していました。つまり、PROTを使っているとN-BASICが使えないのです。ただ、N-BASICにもトリックがあって「BASICのソースプログラムの開始アドレス」を指定できるようになっていました。そこでN-BASICのソースの開始位置を、PROTやアセンブルしたマシン語の邪魔にならない位置へずらし、そこでBASICのコードを書いていたのです。たかだか20KBのメモリに、アセンブラ、マシン語のソース、マシン語のコード、BASICのソース、実行のためのワーク領域を詰め込んでいたのですから大変です。ちょっと間違えるとプログラムを壊してしまうのですが、プログラムの保存にはカセットテープしかないので時間もかかるし、壊さないように注意しながらコードを書くしかなかったのでした。
そんなにしてまで、いったいどんなプログラムを書いていたかというと、高校生の頃はパラパラマンガを作ったりしていました。PC-8001のグラフィック表示能力は160x100ピクセルしかなく、VRAMはたったの2KBでしたが、普通に描画していると書き換え速度が遅くてアニメーションになりません。なにしろ線を一本引くだけでも目で追えるぐらい遅いのです。ところがPC-8001ではVRAMの開始位置も変更することができたので、表側に描画済みのコマを表示している間に、裏側でプログラムが次のコマを描画し、描画が完了したらVRAMの位置を裏側へずらしてやることで、瞬時に書き換えたように見せるテクニックというのがありました(OLIONというゲームで詳細に解説されていたので、そのテクニックをいただきました)。パラパラマンガの場合、あらかじめ用意したコマを順番に表示するだけなので、VRAMを次々に切り替えるだけで済みます。しかしRAMは結局20KBぐらいしかないので、制御用のBASICのコードとパラパラさせるマシン語コードのほか、せいぜい5、6コマを表示するのが精一杯なのでした。というわけで書いたプログラムは、
- コマを作成するための画像エディタ。ラインを引いたりドットを打ったりして1枚絵を仕上げ、セーブする
- セーブしたコマを再配置するためのメモリ転送プログラム。RAM上にコマを並べるために使う
- 並べたコマを順番に、ループ表示するプログラム。キーを押すと一時停止やコマ送りができた
の3つから構成されていました。3番目のプログラムがデモの中心なのですが、3つの機能を同時に持たせるにはメモリが足りず、それぞれ別に実行しつつデータをカセットテープにセーブしていくという、実に面倒くさいことをやっていたのです。これで簡単なアニメーションを作り、学園祭の出し物として展示したりしていました。
当時のパソコンはPC-8001に限らず、だいたい似たような環境でプログラムを書いていたものでした。そもそもパソコンにはOSが存在していませんでした。パソコンを起動するといきなりBASICのインタプリタが動き出し、プログラムのロードやセーブはBASICのコマンドを実行することで行っていたからです。複数のプログラムの管理や実行は、現代であればOSがやってくれます。HDDを自在に使えるファイルシステムとプログラムを自由に呼び出せるシェルがあるだけで、僕にとっては十分使いやすい夢のような環境と感じられるのでした。
以上が、私の高校生のころのパソコン・ライフの一部です。このあとMS-DOSからUnixを使うようになるまでにいろいろあるんですが、それはまた別の機会にしたいと思います。