この投稿は、俺ことブログ主の考える、最高のプログラミング遍歴ではないかと思われることをつらつら書いたものです。事実に基づくようにも見えますし、妄想の産物かも知れませんが、そのへんは読まれる方にご判断をおまかせします。
あ、でもできるだけ役に立つことを書こうと思ったので、そう思って読んでいただければ幸いです。
今回は、高校生時代の続きです。高校生編が3回目になってしまいました。長いですね。2回目はこちらです。高校生編は、今回で終わりです。
オセロゲームにチャレンジ
さて、ちまちま小さなプログラムを書くことに慣れてきた俺は、ちょっと大きめのプログラムにチャレンジしてやろうと腹を決めました。そこで考えたのが「オセロゲーム」です。
いきなり思考ルーチンのレベルへ? まぁムリでしょうね。技量的にもコンピュータのスペック的にも。やろうとしたのはただの盤面、オセロ盤です。つまり、プレイヤーは交互に操作して、駒をひっくり返すとか、どっちが勝者であるとかの判定は、プログラムに任せてしまおうというわけです。
ここで関門。画面に駒を出すってどうやるんだ? それに、プレイヤーがどこに駒を置くのかって、どうやって指定するんだ? 俺は悩みました。
足し算のときは、プログラム中の数値を書き換えてしまえば良かったのですが、そんなことをやってられません。プレイヤーの指定は毎回違うのですから、外から指定できるようにする方法を考える必要があります。つまり、UI(ユーザインタフェース)の問題ですね。そうそう、EX-80にはキーパッドというものがアルジャナイか、それを使わせてもらおう、ということになりました。
ここでまた困るのが、キーパッドからどうやって押されたことを読み取るの? ということです。当時の俺は、「入出力」という概念が頭の中になく、そういえばプログラムを打ち込むのもプログラムだろうし、画面に何か出るのもそうだけど、どうなっているんだろうと疑問に思っている程度でした。
結論から書いてしまうと、キーパッドからの読み取りはマトリックススキャンという方式で行われていたのでした。キーパッドの読み取りが必要なときには、「入力ポート」からIN命令(Inputの意)でキーパッドの横方向、縦方向の情報を読み取り、ちょうど碁盤の目に置かれた黒石を探すように判定してやるのです。
場所の指定は、数字を2回入れてやる、ということで解決しました。余談ですが、入出力はInput/Outputの略であるI/O(アイ・オー)と呼ばれます。当時の雑誌「I/O」の名称がこれに由来しているのは極秘中の極秘です。
また、画面に駒を出すには、特定のメモリ位置に何か文字を書き込んでやるのです。前の回で、決まり事には従おう、ということを書きました。EX-80の決まり事では、画面に表示する内容は8100H番地からに対応することになっていました。8100H番地に文字を書き込んでやると、横0文字、縦0文字の位置に文字が現れます。これは単純明快な方式でした。今に思えば、テキストVRAM(Text Video RAM)という方式ですね。
さて文字とは? 文字だからと文字の形を書き込むわけもなく、実際には文字コードなるものを書き込みます。今でこそ文字コードというとUnicodeやらEUCやらシフトJISなど乱立していますが、当時は文字コードと言えばASCII(アスキー)かEBCDIC(エビスディック)ぐらいでした。当時の雑誌「ASCII」の名称がこれに由来しているのは極秘中の極秘ですので、他言無用でお願いします。ちなみにEBCDICは、IBMなどの大型計算機で使われている文字コードでした。
このASCIIは、アメリカ合衆国の制定したもので、すべての英数字と記号が網羅されています。EX-80では漢字などの表示など考える余地もありませんでしたから、ASCIIを理解しておけば十分でした。ちなみにASCIIの文字コード表はEX-80のマニュアルにもしっかり載っており、たとえば文字Aを表示させたければ41Hをメモリに書き込む、それだけです。
なお、オセロの駒は黒い●と白い○ですが、対応する文字はASCIIにはありませんでしたので、アルファベット大文字のO(オー)とX(エックス)で代用しました。画面上では、○と×が並んでいるように見えます。
これで、盤面の表示とキーパッドからの読み取りはクリアされました。あとは、置かれた駒を見て必要があればひっくり返し(O⇒X、X⇒Oの書き換え)、勝負あればゲーム終了とするだけのプログラムを書けばいいのですが、これは純粋にロジックの話ですので、割愛しますね。たかが盤面といえど、指定された位置に置けるのか、置いてからひっくり返しを判定する、勝負の判定をするなど、結構ややこしい処理を必要とするので大変でしたね。
一つだけ書いておくと、盤の状態を見るには、VRAMを覗けばいいのです。
プログラムは紙に書く
これくらいのプログラムになると長編になり、最初からコンピュータに打ち込むなどということはしません。適当なノートにプログラムを書いていきました。現在のように、テキストエディタを使って自由自在に編集するなんてことはできませんから、書いては消し、書き直しての繰り返しです。なので、あらかじめプログラムのイメージを頭の中に描いてから、ノートに書いていきました。
このころは本当にプログラミングにのめり込んでいて、授業中でも家でもプログラムを書いている始末でした。あるときなど、音楽の授業中にプログラムを書いているのを音楽の教諭に見つかって、「楽しいですか?」とイヤミを言われても「はい!」と返事をしてしまうKYな高校生でした。すいません。
野球盤にチャレンジ
このオセロ盤とは別に、野球盤も作りました。この頃になると、相当複雑で長いプログラムも書けるようになってきていました。脅威の適応能力と言えましょう。さすがわ俺様。
野球盤もオセロ盤のように思考ルーチンはなく、単にプレイヤーに盤面を提供するだけです。9回、表と裏を交互でボールを投げてバットを振ります。が、そんな精緻なグラフィックが表現できるわけもなく、ピッチャーは数種の球種をキーパッドで選んで投げると、ボールをイメージした文字が移動してきますので、それをタイミング良くキーパッドを押して打つという感じです。バッターも、ピッチャーの球種を読んでうまく当たればアウト、1B、2B、3B、HRというように決められてランナーが進んで行くという感じです。
ここまで書いて、これってとんねるずが正月にやっているヤツじゃん?と思いましたが、アレがもろ野球盤ですね、失礼しました。
後輩の平井和正フリークのH君が、「これ、雑誌に投稿しないッスか?」と無謀なフリをしてきましたが、奥手の俺は断固拒否。するとH君、「勝手にやっちゃいますよ先輩、いいっすか?」って、それはダメだろ。当時は割とおおらかだったんでしょうが、今ならとんでもないよねという余談でした。
これらのプログラムは文化祭で展示し、好評を博したことを付け加えておきます。
まとめ
このあとになると、BASICが使えるようになったTK-80BSを装備した強力なライバルが登場したり、アマチュア無線や電子工作の方にのめり込んだり、大学受験でそれどころじゃなくなってきたりで、高校生時代のプログラミングはそろそろ終焉を迎えます。
実は、NECからPC-8001とかすでに発売されていたのですが、こういった高級機に触ることができるのは大学に入ってからになります。
続きは大学生時代の話になるのですね、多分。
(鋭意執筆中)