初期のパソコンのプログラミング経験

私は大学生の頃はパソコン用のゲームプログラムや解説書を書いて印税で暮らしていた.そこに至る前の初期のプログラミング経験の話である.

日本初の一般向けマイクロコンピュータ TK-80 は NEC から1976年に発売された.(当時はマイクロコンピュータ,略してマイコンというのが普通の呼び方だった.) うちでは機械マニアだった父が1977年の1月ごろに買ってきた.私が中学2年生の終わりごろである.これはキットであり部品がばらばらのまま売られていたので弟がはんだごてで組み立てたのだが,出来上がってからはもっぱら私が使っていた.この機械にはディスプレーもキーボードもなく,入力は16進キーボード,出力は16進8桁の LED だけであった.(こちらに写真がある.) 私はこれでプログラミングを学んだので,私が最初に使ったプログラミング言語は 8080 機械語である.これでプログラミングするにはまずニーモニックと呼ばれるものを書く.例えばCレジスタ(8ビット)の値をBレジスタに代入する命令は MOV B, C である.まずこれを紙に書いて,次にこれを対応する機械語(16進数)41に表を見て変換し,手で入力する.よく使う命令の機械語はだんだん覚えてくる.たとえば今でも覚えているが,サブルーチンを呼びだす CALL は CD, そこから戻る RET は C9 である.見ての通りとても面倒である.さらに16進数(0〜9の10個に加え,A〜Fを10〜15を表す数字として使う)の加減算も必要であった.たとえば 3C+18=54 といったものがすぐにできなければならない.メモリーは512バイトだったと思う.ギガでもメガでもキロでさえないただのバイトである.そのうち BASIC 言語が使える TK-80BS が発売され,さらにもっとまともな BASIC を備えた PC-8001 が発売されて入手した.しかし BASIC はかなり遅く,ちょっとしたゲームでも不満が残ったので,高速なプログラムを書くにはやはり機械語が必須であった.PC-8001 は 8080 の上位互換である Z80 が CPU として使われていた.ニーモニックは少し 8080 と違っており,たとえば MOV B, C の代わりに Z80 では LD B, C と書く.最初は依然プログラムを紙に書いて16進数に変換していたが,これは間違いやすいうえにデバッグ(修正)が極めて困難である.たとえばプログラムを修正するには1バイト(16進数2桁)余計に必要だとしよう.この場合プログラムを1バイトずらすと,Z80 では GOTO にあたるジャンプ先のアドレスを絶対値で指定しているのでこれがずれてしまう.8233番地にジャンプするには JP 8233 で C3 33 82 と書いてあるのだが,1バイトずらすにはこれを C3 34 82 に書き換えなくてはならない.(アドレスは2バイト=16ビットで指定される.機械語でプログラムを書くときは下のバイトを先に書く.) こういうものがたくさんあちこちにあるのでとうていやっていられない.これを避ける一つの方法はいったん遠くのアドレスにジャンプし,そちらで新しい処理をして元のアドレスに戻ってくることである.しかしこれを繰り返しているとプログラムはジャンプだらけのぐしゃぐしゃなものになってしまう.抜本的な解決法はニーモニックからなるソースファイルを機械語に変換するアセンブラというソフトを使うことである.アセンブラでは通常ジャンプ先のアドレスに名前を付けてたとえば JP ESTIMATE などと書ける.ESTIMATE というのはプログラムの一部に自分でつけた名前でありアセンブラがこれを正しいアドレスの16進数に換算して機械語にするのである.これだとデバッグの際にはソースファイルを書き換えてから再びアセンブラを通せばよいのである.アドレスを手で数える必要がないのは極めて魅力的であった.そのようなアセンブラをぜひ入手したいと思ったのだが,当時はマイクロソフトなどのアメリカ製のものを輸入したものしかなく,それは10万円くらいしたので高校生に買えるものではなかった.そこで自分で作ることにした.このアセンブラを作る段階では当然まだアセンブラはないので,100枚以上の紙に手書きでプログラムを書いた.

本当は高級なアセンブラはそれなりにいろいろな機能があるのだが,私が自作した Z80 アセンブラは,ニーモニックのソースファイルを機械語に変換する,アドレスに名前が付けられるというだけのものであった.しかしそれでもとても便利に使えた.ソースファイルを入力するまともなテキストエディタもなかったのでアセンブラの一部としてこれも自作した.Z80 の完全なニーモニック表ですら入手は容易でなく,私は秋葉原で買ってきた英語の本を使っていた.またファイルの外部記憶装置はカセットテープである.当時フロッピーディスクはとても高価なものであった.私は将棋や麻雀のソフトを作りたかったのだがこれらは当時の技術水準では極めて困難だったので,オセロやポーカーのプログラムを作っていた.ポーカーの役判定やオセロの終盤の完全読みはプログラミングの良い演習問題である.Z80 でスタックポインタを使ってレジスタを PUSH しながらサブルーチンを再帰的に呼び出すことによって完全読み切りを実現した.最終盤10手くらいは容易にしらみつぶしの完全読みができるのだが,これをさらに高速化するには無駄な手の読みを省くαβ枝刈りという手法を用いる.これはよい手から先に読むことによって無駄を省くのだが,何がよい手かをあらかじめ判定することは容易ではない.当時としてはかなりいろいろがんばったつもりだったが今から見るとおもちゃのようなソフトである.このほかにも友人の買った Apple II なども使っていた.高速プログラミングには機械語が必須だったので,その CPU である 6502 の機械語も覚えた.さらにあとでは富士通の FM-8 の 6809 もやってみた.機械語は一つ知っていると他のものも容易にマスターできる.(当時のパソコンは各社ばらばらの機械を出しており,その間の互換性は全然なかった.)

高校生の頃はこれらのソフトを月刊「アスキー」に投稿して何度か載せてもらっていた.当時のパソコン雑誌は一般読者の作った投稿プログラムを載せていたのである.初期のものは16進数のリストを印刷して載せて,読者はそれを手で入力するというものだった.ものすごく面倒で間違いやすいものである.その後大学に入学してからアスキー社からうちで仕事をしないかと誘われて働くようになった.機械語でプログラムを書ける大学生がとても貴重な存在だったのである.当時はプログラムの簡単な部分を BASIC で書いて,速さが要求される中核部分は機械語で書くというのが主流だった.最初は PC-6001, PC-8801, パソピアなどの仕事をしていた.これらの CPU は Z80 であった.その後 NEC の PC-9801 が発売され,16ビットの 8086 が主流になった.私はこの 8086 やそれに付随する数値演算コプロセッサ 8087 などのプログラムを書いていた.この頃の話は「数理科学」2021年3月号の記事に書いたのでここでは繰り返さないが,かなりどっぷりとプログラミングに染まった生活をしていた.最後の大きな仕事は大学3年生の秋に終えた.そこからあとはほぼ数学だけやっているのでプログラミングはほとんどやっていない.現在のメジャーなプログラミング言語はほとんど使ったことがなく,C (C++ ではない)がそこそこ書けるくらいである.現在の仕事は純粋数学の研究なので,インターネットや TeX はもちろん使うがプログラミングは全然出てこない.ちょっと寂しい気もするが,まあ私は数学の方が好きなのでこんなものかなとも思う.

どうでもよい記事に戻る. 河東のホームページに戻る.