MSX の思い出
MSX 30周年だそうで。
そういえば、数年前に mixi に MSX 等の思い出話を書いたことがあったなぁと思い出したので、数日分まとめて転載*1してみる。
うちは父親が大学に勤めている関係上、かなり早い時期からパソコンが家にあった。
父親の部屋に緑のディスプレイがあり、蒸気機関車の走るデモプログラムを見せてもらったのを覚えている。
ぼく自身が初めてパソコンに触れたのは中三の時。
機械は MSX2・FS-A1F。
定価 54,800 円のところを 39,800 円で売っていたもの。
3.5 インチ FDD×1 付き、ディスプレイ別。
当時としては画期的な低価格だった。
同時代の真面目なパソコン、PC-9801VM2(5インチ FDD×2 付き)は定価 433,300 円。
それに 20MB の HDD がついた VM4 に至っては 693,000円。 *2
とはいっても、MSX シリーズにはちゃんと BASIC(当時主流のプログラミング言語)が搭載されていて、中学生が触るのには十分だった。
当時専門の雑誌があり、それに載っている投稿プログラムを手で入力することでゲームが遊べるようになっていた。
長いものは何千行にもなる。打ち込むだけで数日かかることもざら。
気が長いことをやっていたものだ。
最初は、それらのゲームの数字をいじったりして、ゲームを簡単にしたり難しくしたりというだけだった。
そんな時期に、ある日デパート屋上のゲームコーナーで衝撃的に面白いゲームに出会った。
それが「テトリス」。
ゲームの仕組み自体はとても単純。
これなら作れるかもしれない…。
何より、1回 50円のゲーム代が惜しかった。
ブロックの絵を適当に書いて、それを上から下に落とすようにする。
最初は、ブロックの画像を描画する時、背景を消さないでブロックだけ描くこと、ブロックが移動した後にそれが前あった場所の画像を消すことだけでも一苦労だった(「XOR」という論理演算で描く必要があった)。
その次は、キーボードの操作でブロックを移動させること。
ここは特に難しくない。
最後に、ブロックが壁にぶつかったら進まないようにして、床に着いたら固定して次のブロックを出す、一列揃ったら消えるようにする…なのだが、当時の自分には難問だった。
だが、ゲームは遊びたい。どうするか…
そこで考えたのが、「スペースキーを押したら床に着いたことにして、ブロックを固定する。
その後に数字キーを押したら、列が消えるようにする」という解決策。
壁にぶつかったらどうするか、というのは「そもそもそんな操作はしない」。
とんでもないテトリスだけど、これはこれで結構遊べた。
横を空けているところに縦棒が来たら、やった!と思いつつ、床に着いたところでバシッとスペース。
0、1、2、3 と入力して 1ラインずつ消していく。
名付けて「セルフサービステトリス」。
速くなってくると、ちゃんと床で止めるのが難しくなってくる。
押し損なうと興を削がれること甚だしいので、集中してタイミングを見計らう。
ある意味スリリング。
セルフサービステトリスも面白かったが、やはり本物の面白さとは質が違った。
着地判定・ライン消し判定は頑張れば作れる自信はあったが、どうにもならないだろうな、という点があった。
それが「速度」。
当時一世を風靡し、ぼくを魅了したテトリスはアーケード版という、ゲームセンターにあるようなバージョンだった。
ファミコン版との大きな違いは、最大秒速 60 ブロックという速度と、落ちた後固定するまでにわずかな時間差があり、その間にブロックを操作できること。
時間差はともかく、速度となると BASIC でグラフィックを動かすという方式では限界があった。秒速 10 ブロックがせいぜい。
そこで知ったのが、「マシン語」というものの存在。
それを使うと、CPU(中央処理装置・コンピュータが計算などを行う部分) に直接命令ができて、ずっと速いスピードでプログラムが実行できるらしい。
また、「スプライト」というものを使うと、画像を直接描画するよりもずっと速く移動ができる。これはファミコンにもあるもので、マリオやドラクエの主人公などはこれで描かれている。MSX はゲーム向けのパソコンだったのでこの機能があったが、PC-9801 等にはないものだった。
本を買ってきて、試しにスプライトをマシン語を使って動かしてみようと思い、まず比較のために BASIC で作ってみる。
正方形を 1 ドットずつ動かすような処理をさせると、画面を左から右へすーっと横切るように動き、また左から出てくる。
次にマシン語。
歪んだ平行四辺形のようなものがチカチカ点滅している。
画面更新の間隔は 1/60 秒なのに、それよりずっと速く動いているため形が歪んでいたのだ。
これはいける。
マシン語は 内部的には ON か OFF かの電気信号。
一般的には、少しでもわかりやすいように 16進数で表記され、「3E 10 CD 60 2B 21 00 80 …」のようになる。
ただ、これではやはり扱いにくい、というわけで、英語風にしたものが「ニーモニック」。
LD A, 10H CALL 2B60H LD HL, 8000H
のようになる。
これなら、多少勉強したらなんとか覚えられる。
さて、ニーモニックでプログラムを書くと、それをマシン語に直さないとコンピュータは理解してくれない。
ニーモニックとマシン語は対応表があるので、それを見ながら紙と鉛筆で変換していくという手段もあり、「ハンドアセンブル」と呼ばれている。
最初のうちはもっぱらその方法に頼っていて、その時に Z80(MSX2 の CPU)のマシン語表を暗記した。つまり、16進数を見たらそれがどういう命令かわかったということだ。
今ではほとんど忘れたが、C9, C3, CD, 3E, 21 等の特によく使うものだけは頭に残っている。
その当時、なぜか変なものを暗記するのが好きで、ドラえもんの大長編をまるごと一冊暗記して、ページ数とコマの指定に応じて暗唱するなんてこともやっていたが、それはまた別の話。
そのようにして、手でマシン語を書いてプログラミングをしていたけれど、やはり面倒だった。
そんな時、ある本に「アセンブラ」(ニーモニックをマシン語に直すプログラム)が載っているのを見つけた。
フロッピーが付属しているというわけではなく、文字通り 16進数のリストが長々と載っている。10ページもあっただろうか。
それを入力すれば、アセンブラが使えるようになるというわけだ。
しかし、当時パソコンができる時間は限られていた。
貴重な時間なので、できれば 16進数の入力には使いたくない。
それに、少しでも早くアセンブラを使いたい。
そこで、夜中に部屋の中で入力しようと思いついた。
ただ、パソコンとディスプレイを両方持って上がるのは大変だ。
軽い MSX2 だけなら、部屋に持っていくのは簡単なのだが…
その時に考えた方法が、ディスプレイなしで入力するということ。
ただ 16進数は間違えやすいので、1行ごとに画面を見て「チェックサム」(正しく入力されているかどうかを確認するための数字)を確かめながらでないとひどいことになる。
そこで、"Caps Lock"のランプを利用することにした。
1行入力した後、続けてその行のチェックサムを入力する。
合っていれば、Caps Lockのランプの状態が変わる(点灯→消灯、あるいはその逆)。
合っていなければ変わらないので、その行をもう一度入力し直し。
というプログラムを BASIC で作った。
そのプログラムもディスプレイなしで、紙に書いてから入力。
そうして、何時間も Caps Lock の点滅を見ながら、真夜中に暗い部屋の中で電気スタンドの光を頼りに黙々と入力していた。
数日後、入力がやっと終わって、昼間に動かそうとしてみる。が、動かない。
よく見ると、入力アドレスが 256 バイトずれているところがあった。
そのチェックサムはアドレスの下位 8ビット(256 までの数を表す)だけを使っていたので、それだけずれているとわからないのだ。
幸いなことに、修正は難しくない。
そうして、やっとアセンブラが使えるようになった。
そのようにして、同じ本に載っていた他のツールも入力していくことになる。
そのころ、ぼくは親の都合で引っ越しし、横浜の T学園中学校(私立)から兵庫県の K東高校に入学した(年度末に合わせて引っ越したので編入ではない)。
新しい学校でも、紙にアセンブラを書いてプログラムを推敲したり、「スプライト」で作ることにしたブロックのデザインを考えたりしていた。
ちなみに、MSX2 では 1枚のスプライトでは 1色しか使えず、2枚組み合わせることで3色(1枚目の色、2枚目の色、重なった部分の色)使えるようになっていたので、方眼紙にドットを描いて、それぞれのスプライトがどういう形になるかを考え、それをまた16進数に直していた。
そんな変わり者のぼくだったが、K東高校のみんなは結構面白がってくれて仲良くしてくれ、中でも席順で後ろだった Y君とはよく話し、作っているテトリスについて説明したりもしていた。
そうこうするうちに何とか動くようになった。
しかし、よく見るとちょっと画像がおかしい。
変なところに筋が入っている。
その時は深く考えなかったが、後で Y君が教えてくれたところによると、紙に書いていた 16進数の"F"を、いたずらで"E"に書き換えていたらしい。
"F"は"1111"なのに対し、"E"は"1110"なので、1ドット空白ができていたというわけだ。
「とりあえず動く」という段階から、ゲームとしてちゃんと遊べるようになるにはいろいろ調整が必要だった。
念願の「着地後の余裕」はもちろん、「落ちてくる前に左右にキー入力していると、出てきたとたんにその方向に移動する」という機能(これも最高速で遊ぶためには必須)も実装。
最高速は、1/60秒ごとに起こる画面の走査線割り込みというものを使えばちょうどアーケード版と同じ早さになった。
ラインを消したときの画面効果、着地時の効果音なども地道に追加。
また、その時買っていた MSX 雑誌(MSX-FAN)にテトリスの BGM のリストが載っていたので、それも入力して追加。
FM 音源(本体の音源よりもいい音が出る拡張パック。ぼくは買っていた)用だったので、アーケード版とほとんど変わらない音が出た。
このようにして、最終的にはアーケード版と同じようなゲーム感覚のテトリスになった。
やっと、心おきなく好きなだけ本場のテトリスができるようになったわけだ。
そのころ、ぼくは「数学研究同好会(数研)」という、聞いた人に引かれるような名前の同好会に所属していた。
「数学研究」とは名前だけ、実際は置いてあるパソコンで遊ぶだけ。
いや、パソコン以外にも、トランプやカード麻雀で遊んだりもしたな。
ぼくは少女漫画をその部屋に隠していて、見つかって没収されたりもしたっけ。
(その後返してもらった)要は、「遊ぶための場所」だった。
変人が多かったなぁ。
ぼくが所属する場所は変人の巣窟であることが多いな。
「物以類聚,人以群分」(類は友を呼ぶ)ってやつだな。
中でも、Y先輩(女性)は変わっていたな。
そのせいか、ぼくとはけっこう仲がよく、卒業後も数年間は時々連絡したりしていた。
今はどうしているだろうか。*3
元々そこにあったパソコンは FM-7 や FM-77 といった富士通系のものだったのだが、ぼくはそこに MSX2 の後継機、MSX-2+ を自費で買って持ち込んでいた。
(今から思うと、よくそこまでしたなぁという感じだ)もちろんテトリスで遊んだり、微調整したりもしていた。
さて、その時期はテトリスの大流行を受け、二匹目のどじょうを狙って、いわゆる「落ちゲー」が雨後の筍のようにあふれかえっていたころだった。
その中の一つで、ぼくがハマったのが「コラムス」。
(結構好きだったんだけど、今ではすっかり見なくなったなぁ)縦に並んで 3つずつ落ちてくる宝石を並べ替えながら置いていって、同じ宝石が縦・横・斜めにそろったら消えるという、テトリス以上に単純なゲームだった。
もちろん、これは作るしかない。
その当時、「BASICコンパイラ」というものがあった。
元々、プログラムを一行ずつコンピュータが解釈して実行する BASIC は実行速度が遅い。
それをマシン語に一気に変換して、それを実行するという夢のようなツールだった。
しかし別売りで、定価は4500円。
ぼくにはそのお金が惜しかった。
その時、Y先輩が BASICコンパイラ内蔵の MSX2+ を持っていることを思い出した。
なんとか、内蔵の ROM からデータを吸い出して、ディスクに入れて、自分の MSX2 上のRAM に入れて動作させられないだろうか。 *4
というわけで、先輩に機械を持ってきてもらって、アセンブラと一緒に本に収録されていた逆アセンブラ(マシン語をニーモニックに変換する)を使って、どこをどういじると別の機械のメモリ上で動くようになるか、日が暮れるまで格闘して、なんとか成功した。
先輩もよく付き合ってくれたな。
先輩にもらった BASICコンパイラでコラムスを作ることにしたぼくは、授業中によく紙に書いてプログラミングをしていた。
不真面目な生徒だ。
物理の授業中にこっそり英語の本を読んでいて、先生に頭をはたかれたこともあった。
当時から、したいことしかできない人間だったんだな。
コラムスは無事完成した。
その次にはまったのは、有名な「ぷよぷよ」。
これも作るか…と思ったが、アルゴリズム(プログラムの流れ)が当時のぼくには難しかった。それまでの 2本と違って、敵の思考ルーチンまで作らないといけない。
そのころぼくは、型落ちになっていた PC-9801DA を中古で買った。
定価 50万円ぐらいのところが 10万円を切っていた。
今にも増して、コンピュータの進化が日進月歩な時代だった。
その後、ぷよぷよは結局市販のもので遊ぶことにした。
ほとんどアーケード版と同じゲーム感覚だった。
こうしてぷよぷよを作る動機はなくなってしまった。
Quick-C を使い始めたのもこのころ。
これは、「C言語」というものをマシン語にする「コンパイラ」を始め、実行可能なプログラムを作るためのいろいろなツールが揃っているものだった。
C言語は BASIC とは比べものにならないほどすっきりしていて、美しかった。
「構造化プログラミング」という方式で、プログラムを細分化して、「関数」というものに分割していくことで、見通しのいいプログラムが書けるようになっていた。
当時ぼくが感じたC言語の魅力を語れば、とてもここには収まりきらない。
だが、あまりプログラミングはしなかったな。
ソフトウェアを取り巻く環境が豊かになるにつれ、「自分で作らないと遊べない」というケースが減っていったからということもあるかもしれない。
そういう状況だったが、そのころは Windows の黎明期にあたり、親戚の家で遊んではまったマインスイーパは、Windows を持っていないぼくにはできなかったので自作した。
構造化プログラミングを活用し、関数に分割して作っていく。
特に問題なく完成し、そのままでも面白かったのだが、マインスイーパをやったことがある人なら誰でも知っている、ある問題が気になった。
「明らかに地雷がある/ないことがわかる」場所が多いのだ。
いちいちクリックするのが面倒になったぼくは、そういう場所を自動で開くようにプログラムを作った。ここで、C言語の利点を生かして「再帰」という方法を使った。
その結果、一つのパネルをクリックするとばーっとパネルが開き、時によってはそれだけでクリアになってしまうこともあった。ゲームの意味がない。
大学で外国語をすることになったぼくは、自然とプログラミングからは遠ざかっていた。
パソコンすら持っていない時期があったほどだ。
大学 1年が終わってから中国に留学。
ここも詳しく書けばきりがないが、プログラミングと関係ないので省略。
ルームメイトが韓国人で、中国語よりも韓国語のほうがうまくなって帰ってきた。
その後、インターネット用に中古 Windows95 機を購入、メールやサイト閲覧にオンラインゲーム(といっても、麻雀やトランプ)、それに ICQ やYahoo などのメッセンジャーと、ごく普通のパソコンライフを送っていた。
ある日、図書館で「プログラミング言語 C++」という本を見つけた。
プログラミングから離れていたぼくだったが、何気なく手に取って読むと「オブジェクト指向」という、刺激的な新しい概念が紹介されていた。
現実世界にいろんな「実体」があり、それらの実体が相互作用するように、ソフトウェアの世界でも、全てを実体に当たる「オブジェクト」と、行為に当たる「メソッド」というもので記述するという考え方だ。
ぼくはすっかり夢中になってしまった。この考え方さえあれば、何もかもが可能のような気すらした。
今では、オブジェクト指向が万能でないこともわかっているし、単なるプログラミングの一手法として捉えているが、時代の熱気のようなものがあった。
オブジェクト指向を徹底した言語、Java が出てきたのもこのころだ。
だが、当時の Java はさまざまな問題を抱えていた。
互換性を重視するあまり、Windows や Mac といった OS ごとの機能がろくに使えない、中間言語方式を取っているため当時の貧弱なパソコンでは効率が落ちすぎる等。何より、ぼくにはその「理想主義」が鼻についた。
そのころ、ぼくは精神的にダウンしてしまって 3年が終わった後 1年間休学し、次の 1年で卒業するつもりが単位が足りずもう 1年留年することになった。
自宅でのんびりして外出は最低限、人間関係といえばネットだけだったが、それでもこの時期にのんびりできたおかげで精神的にだいぶ安定したような気がする。
この期間、プログラミングはほとんどしていない。
"Dev-C++"というフリーの開発環境で、Windows API というものを使って簡単なダイアログボックスを出して遊んでみる程度。
以降、mixi のほうには会社に就職してからのことなども書いてあるが、主なところはここまで。
尻切れトンボ感が半端ないが、まあ現実とはそんなものだろう。
つくづくオリジナリティがないなぁとも思う。
テトリスやコラムスなど、既存の簡単なゲームをコピーするだけ。
それでも、一パソコン少年であったことは確かだと思う。
その後、プログラミングに関して、あんまりガチな方向には行かなかったな。
「外国語(言語)」というもうひとつの趣味があることもあって、どちらも中途半端になってしまっているかもしれない。
まあ、元パソコン少年の思い出話ということで。