一方FM-7が正64角形を描いていた頃...

(語呂が良いので頂いたブックマークコメントをタイトルに活用させてもらいました)

一方FM-7はCIRCLE命令で正64角形を描いた

何と!自分もかつての少年時代、FM-7(正確には、FM new 7)を所有していたことを思い出した。FM-7では散々遊ばせてもらった。懐かしさが込み上げてきた。

どうゆう経緯でパソコンを買ってもらうことになったか思い出せないが、ある日、親と一緒にパソコン売り場に行って、その店員さん曰く「世間一般的にはNECのPC-88シリーズやZ80系(8080系)CPUが人気ですが、FM-7の方が拡張性が高く、使い込んでいくと面白いです」というようなこと(遠い記憶によると)を話してくれた。結局勧められるままにFM-7を購入することになった訳だ。キーボード一体型の本体、CRTディスプレイ、それからデータレコーダの必要最小限の3点セット。

当時、まだFD(フロッピーディスク)は高級品(たしかFM-7本体より高かった?)だった。しかも、FDは5.25インチのでかくてペラペラの奴が主流だった。データレコーダとは、つまりカセットテープに音でプログラムやデータを記録する奴。ビープ音の連続(FAXの通信音と似ている)を録音して書き込み、それを再生して読み取ったのだ。頭出しに失敗して、別のファイルを読み込んでしまったり、散々「ビー、ビビー...」音を聞かされた後、エラーが出て読み取れなかったり、とにかく、えらく時間がかかった。それでも、そうゆうものだと思い込んでいた当時は、気長に待って、どうにか楽しく使っていたのだ。古き良き時代と言える。

最初、パソコンとは何か、どうゆう仕組みで動いているのか、少年だった自分に理解できる能力も無く、単なるゲーム機だった気がする。よく、雑誌に掲載されているBASICのコードや、マシン語のダンプリストを入力していた。ダンプリストというのは、ただひたすら、16進数コードでマシン語が印刷されている奴。縦横の合計チェックサムは表示してあるものの、運悪くチェックサムに引っかからない間違えをすることもあった。そしたらもう、最初から1バイトずつチェックするしか無く、今考えるとよくもまあそんなご苦労なことをしていたと、笑ってしまう...。

でも、一文字も間違えずに入力できた時に魔法のように動き出す瞬間の嬉しさを知ると、何だか自分でも作りたくなってくる。最初はBASICを見よう見まねで書いて、FORループとか、IF文の使い方を覚えて、少しずつ理解が深まっていった。当時、CPUの動作クロックは2MHzと超スロー(現在のGHzとは単位が違う、=0.002GHz)、BASICのサポートする機能も限定的で、少し凝ったことをしようとすると必然的にマシン語を使って、FM-7のハード性能をすべて引き出す必要があった。そうゆうわけで、購入して何年かはチンプンカンプンだったが、そのうち自然とマシン語も利用しながら、プログラムを書いて遊ぶようになった。

思い出

今思い返すと、あの時店員さんが言っていた「使い込んでいくと面白いです」というのは真実だったと思える。

ビデオカード
  • FM-7には、モートローラの6809(MBL 68B09 = MC 68B09)というCPUが2つも使われていた。(メインCPUとビデオ表示用のサブCPU)
  • サブCPUは、今で言うビデオカードのような役割を果たし、これは当時としては画期的な仕様だったのかもしれない。
  • また、キャラクタ(文字)とグラフィック(図形)の区別は無く、同一のVRAMを利用して、ビデオ表示されていた。
  • 偶然にも、Macintoshに始まるGUIなパソコンに通じる仕組みと同じであったのだ。
拡張ポート
  • 拡張ポートも3つあった。
    • そのひとつにZ-80カードを挿入すれば、当時広く使われていた8080系CPUのプログラムも動いたようだ。(CP/M OS環境も利用できたらしい)
    • 残りの二つのポートには、モデムやFD、漢字ROMなどを接続することもできた。
    • Oh!FM-7:周辺機器カタログ
  • OS-9AppleのMacOS9とは違う)という、優れたOS環境を利用することもできた。
  • しかし、少年では、たいした資金もなく、本体・CRTディスプレイ・データレコーダの3点セットで、地道に使い続けた。
メモリマップ
  • ハードウェアの性能は、メモリマップに16進数アドレスと供に詳細に解説されていた。
  • BASICから利用できない機能も、マシン語を少し使うだけで引き出すことが可能だった。
裏RAM
  • 普段はF-BASICで利用されている32KBのROM部分は、バンク切替で32KBのRAM(裏RAMと呼ばれていた)として利用することもできた。
    • 当時の8ビットCPUでは、一度に64KB(単位はMBではない、=0.0625MB)のメモリを認識するのが限界だった。
    • それを超えるメモリが必要な場合は、バンク切替などの技が必要になった。
    • 裏RAMは32KB(64KBの50%)もあり、貴重なメモリ領域として大活躍するのである。
BREAKキー
  • BREAKキーの割り込みを乗っ取り、ゲームを操作するキーとして利用した。
    • FM-7のキー入力方式では、キーを押したという情報が、キーコードのバッファに残り続けてしまう。
    • これは、何かキーを押してキャラが動き始めたら、別のキーが押されるまで、そのキャラは動き続けてしまうことを意味する。
    • BREAKだけは、特殊な割り込み処理が発生して、キーを離した瞬間の情報も取得できるので、いろいろ役に立ったのだ。
TESTコマンド
  • 通常、メインCPUとビデオ表示用のサブCPUは128バイトの共有RAMを介して、データのやり取りを行っていた。
  • しかし、一方が共有RAMにアクセスしている間は、他方はCPUの動作を止める必要があり、共有RAMが小さいこともあり、やり取りするデータが増えると、処理スピードが問題になってくる。
  • そこで、普段はサブ側のROMにあるプログラムがビデオ表示を処理しているが、独自のプログラムコードを渡して、直接サブ側で実行することもできた。
  • FM-7にはデバッグ用のTESTコマンドが用意されていて、送信したプログラムコードをサブルーチンとして実行したり、ジャンプして完全に処理を乗っ取ったりすることが出来たのだ。
    • TESTコマンドには8バイトのキーワードが必要だった。
    • 16進数で「$59 $41 $4D $41 $55 $43 $48 $49」
    • 文字では「YAMAUCHI」となるので、ヤマウチ コマンドと呼ばれていた。

こんなことまでオープンにマニュアルに載せているFM-7て素敵だと思った。

  • FM-7のお部屋
    • 開発者がヤマウチさんだったらしい。しかし、その後、後輩の技術者が自分の名前もキーワードにしたいという欲求を抑えるのが大変だったらしい。
スクロール
  • サブ側にはVRAMオフセットアドレスというのがあって、ビデオ表示する時に、そこに書き込まれた値を加算した位置に表示することが出来た。
  • つまり、VRAMの内容をほとんど書き換えること無く、高速で滑らかにスクロールすることが出来たのだ。
  • 書き換えるのは、スクロールによって追加される部分だけでOK。
音声録音
  • データレコーダとやり取りする時は、特定のアドレスの1ビットが、1と0に変化することで、読み取りや書き込みを行っている。
  • ある時、自分の声を録音したテープを読み取って記録したらどうなるか、実験してみたことがあった。
  • すると、数秒で保存データはメモリを一杯にしてしまったが、そのデータを再生してみると、何と、FM-7が自分の声を出力した!
  • さらに、メモリに記録する時、1が20個、0が25個のように、シンプルな圧縮処理を追加すると、自分の声を十数秒記録できた!
肌色を描く
  • 当時のカラーと言えば、8色が普通だった。光の3原色 赤・青・緑をON・OFFの2値で組み合わせると、2の3乗=8通りの色が発色するのだ。
  • 8色の内訳は、赤・紫・青・水・緑・黄・白・黒。
  • たったこれだけの色で自由に絵も描けますと言われても、普通はかなり困る。
  • 人物を描く時の人肌はどうしよう?桜の花びらの色は?みかんの色は?
  • しかし、達人が描いたCGを見ると、それなりに発色している。いったい何故...。
  • 1画素ごとは2値でも、隣り合う2画素まとめて考えれば、赤・青・緑それぞれ3通りの輝度(00・11・10or01)の組み合わせが生まれる。
  • すると、3の3乗=27通りの色が発色する計算になる。そんなごまかし技で大丈夫なのかと最初は思うが...
  • 横方向は640画素と細かい、ブラウン管の解像度も悪く画素の周囲もぼやけ気味に発色していた等の条件で、意外にも自然な発色に見えてしまうのだ。
  • 工夫次第で、さらに多くの色表現も可能だった。

起動

こんなことを思い出しながら書いていると、ふと、FM-7はまだ実家にあることに気付いた。自分で捨てた記憶は無い。きっと、どこかにあるはず。探し始めると、あっけなく見つかった。押し入れの奥底に、キーボード一体型の本体・CRTディスプレイ・データレコーダの3点セットが見つかった。ちゃんと接続ケーブルもある。マニュアルと参考書籍もほぼ揃っていた。こんな状態で見つかると、もう起動してみるしかない。とりあえず、本体とCRTディスプレイを接続して、電源を入れてみた...。

懐かし過ぎる...。記憶が時を駆け抜けて戻ってきた感覚。一瞬にしてブートは完了し、コマンド入力待ちの画面が現れる。(さすが、ROM搭載のBASICマシン)製造から25年以上経過しているにも関わらず、何の問題も無く起動してしまうことに驚く!

キー入力もちゃんと出来るし、試しに、ブレゼンハムのアルゴリズムのBASICプログラムを入力して、実行してみると、円も描いてくれた!ただし、描画は相当ゆっくり。円の8箇所から一気に描き始める様子が手に取るように分かる。

今日まで、コンピュータの進化は処理スピード追求の歴史ではあった。しかし、ここまでのんびり処理してくれると、処理の経過をじっくり観察できて、仕組みが分かり易い。そんなところが逆に良い。

  • 左側がCIRCLE命令で描画
  • 右側はブレゼンハムのアルゴリズムで描画

正64角形と言われてよーく見ると、CIRCLE命令の方は少しカクカクしている(2時から4時の円弧の部分)ような気がしてくる。右のブレゼンハムのアルゴリズムの方が滑らかさがある。しかし、比べてみてやっと分かる誤差だ。

正64角形の描き方

BASICのCIRCLE命令でも描画してみると、3時の位置から、一筆書きで時計回りに描画しているのが確認できる。見た目は問題なく円。当時の640x200の画素サイズにおいては、64角形≒円なのである。

  • しかし、正64角形と言えども、円周上の各頂点の座標を計算する必要がある。
  • 単純に考えると、それにはsin・cosが必要な気がする。
  • sin・cosを高精度に計算で求めるのは、8ビットCPUにとってはかなりの負担なはずだ。

それではどうやっているのか想像すると...

  • あらかじめ計算済みのsin・cosの値をテーブルとして持っているのではないだろうか?
  • sin・cosは、通常0から1の範囲で変化する。(半径1の円周上の座標になるのだ。)
  • しかし、スピードを追求すると小数点の計算も避けたい。
  • それなら、sin・cosを2のn乗倍した値を保持しておけば良さそう。
  • sin・cosの計算する時は、2のn乗倍で割り算すれば、良いのだ。
  • 2のn乗倍なら、割り算も単純なビットをシフトする操作だけで計算できるので、このスピードは問題ないはず。
  • 円は対称性を持っているので、ブレゼンハム同様、1/8の正64角形の8個の頂点を計算するだけで良い。
  • つまり、8個の頂点を求めるために、sin・cosで一回ずつ、計16回の掛け算(半径 x テーブル値)を実行すればOK。
  • あとは、x,yの座標を入れ替えたり、正負を変化させ、求めた64個の座標を順にLINE命令で繋いで完成。
  • たぶん、LINE命令を使って頂点を順に繋ぐ必要があるので、一筆書きのように円を描いているのだと思う。

時代背景

FM-7を起動したのは何年ぶりだったのだろうか?たぶん20年近く真っ暗な押し入れで眠っていたのではないだろうか。最後に起動したのはいつだったか思い出せない。PRINT DATE$で内蔵時計の日付が表示される。やってみると、84/04/01と表示された。マニュアルの発行日も確認してみると、1984年 4月となっていた。

あれあれ、1984年というのはMacintoshが発売された年ではないか!その当時の少年(自分)が諸々の時代背景を知る由もなく、今更ながらに気が付いた。そこで、時代背景を時系列に並べてみた。

1977年    Apple II発売
1979年    VisiCalc発売
1981年5月  QuickDrawにRoundRect実装
1981年5月  FM-8発売
1982年    FM-7発売
1983年    Lisa発売
1983年7月  ファミリーコンピュータ発売
1984年1月  初代Macintosh発売
1984年    FM-new 7・77発売
1985年9月  スーパーマリオブラザーズ発売

このように見直してみたら、いくつかのことに気付く。

  • QuickDrawがビルの技で高速に円を描いていた頃、F-BASICは正64角形を描いていた。
  • 自分がパソコンを使い始めた頃、既にGUIMacintoshが発売されていた。

何も無いけど素晴らしい環境

思い返すと、当時のFM-7にはキラーアプリケーションと呼べるものは無かった気がする。しかし、十分魅力的なマシンではあった。

  • ソフトウェアは無かったが、マシン語でダイレクトに操作する方法を覚えた。
  • ドライバさえ無い状態でダイレクトに操作できるので、根本的な動作原理が理解できた。
  • マニュアルにはハードウェアの仕様も詳細に解説されているので、性能を100%引き出すことが出来た。
  • 操作するマシン語のサンプルコードまで載っていたりする。
  • デバッグ用のTESTコマンドの説明まであり、サブCPUも完全に乗っ取り、独自に制御することもできた。(自分には出来なかったけど)
  • やる気になれば、ファイルのフォーマット仕様を決めて、独自の作業環境、つまりOSだって作れるのだ。(自分には出来なかったけど)

8ビットCPUのシンプルなマシン語で、I/Oアドレスを読み書きするだけと言う原始的な方法は、ある意味素晴らしかった。複雑怪奇になってしまったハードやソフトで満たされた現在のパソコンとは比べ物にならないくらい、少ない知識で全体を見渡すことが出来たのだ。(FM-7に限らず、8ビットCPUのパソコン全般において)

すべてがシンプルな仕組みで成り立っていたが、ハードウェアの構成は考え抜かれていたと思う。ビデオ用のサブとメインの2CPUや、一般のメモリ領域と同等にアクセスできるI/O領域、究極の8ビットCPUと呼ばれる6809マシン語の使い勝手の良さ等、このあとの進化を先取りしていたと思う。いかにも、マシン語から利用することを前提にした設計だった。

ビルはなぜ正多角形方式やsin・cosをテーブルに収納する方式を選択しなかったのか?

QuickDraw
  • 仮想的なグラフ用紙GraphPortの縦・横は、最大 32768x32768 ピクセルもの巨大なサイズを想定していた。
  • 出力は画面にも、プリンタにも自在に拡大縮小して、任意の範囲を出力可能だった。
  • 狭いモニタの表示エリアであっても、大きな絵を自由にスクロールすることで、任意の部分を連続して詳細に確認できた。
  • 描くラインの太さやピクセルパターンも指定できた。
FM-7 CIRCLE命令
  • 一方、FM-7は 640x200 ピクセルのモニタサイズに描画することしか、たぶん想定していない。
  • ラインの太さも1ピクセル固定だった。


以上の特徴を見ると、目指す描画出力、成果物のレベルが違っていたのだと思う。正多角形方式やsin・cosをテーブルに収納する方式では、当時のモニタサイズ・解像度では円と区別できないかもしれない。しかし、拡大してスクロールすれば、あるいは紙に印刷すれば、すぐに円でないことは分かってしまう。逆に言えば、ビルは、それくらいのレベルで出力したかった。円も正64角形も正確に描画して、その違いがちゃんと認識できる出力をしたかったのだろう。

そして、ビルは、MacPaintというQuickDrawを活用したアプリケーションも同時並行して開発していた。そのMacPaintは、その後すべてのアプリケーションのお手本になった、と言われている。自分は実際に使ったことはないが、当時のスクリーンショットを見つけた。


  • 1984年からMacPaintのような環境がMacintoshでは使えていたのだ。
  • とても25年以上前に開発されたアプリケーションとは思えない...。
  • ビル・アトキンソンが目指していたレベルの高さが伝わってくる。
  • 一方、少年(自分)はFM-7マシン語に格闘して、遊んでいた...。

スーパーマリオGUI環境である

時代背景を見直してみると、軽く100万円を超えるLisaが発売された1983年には、1万5千円のファミリーコンピュータも発売されている。象徴的な価格差である。

パソコンとゲーム機では、出来ること・目指すところも違うので単純には比較できないが、GUIを快適に操作することを視点にしてみると、ゲーム機も立派なGUI環境である。そして振り返ってみれば、2年後の1985年に発売されたスーパーマリオブラザーズは、その後のゲームに大きな影響を与えた。パソコンのMacPaintと同じく、ゲーム機のお手本となるGUIアプリケーションだったのかもしれない。

  • 8ビットCPUが、256x224画素・25色のCGを作り出し、滑らかにスクロールしながら、キャラクターがその世界を自由に動き回る。
  • マリオの世界は現実と同じ物理法則が支配している。
    • マリオの動き始めは遅く、徐々に加速する。
    • 加速したマリオはすぐには止まれない。
    • 走る方向とボタンを押す強さ(長さ)によって、マリオは放物線を描いてジャンプする。
  • このリアルな操作感は心地良くて、ゲームする人はマリオの世界に一気に引き込まれてしまう。
  • 操作するときの心地良さ、この点においては、MacintoshGUI環境に決して引けを取らない魅力がある。
  • この操作感を、8ビットCPUを含む本体とゲームカセットが、超低価格で造り上げている。奇蹟のような価格性能バランスだと思う。
  • ファミリーコンピュータは累計で6000万台以上、スーパーマリオは4000万本以上販売された。
  • そして、最新のDSやWiiの中で今もなお、マリオは生き続けている。
  • ビル・アトキンソンGUI環境のすべてをソフトウェアの力で実現した。
  • 一方、任天堂はよく練られたハードウェアとマシン語でマリオの世界を実現した。
  • 一方、FM-7は剥き出しのハード性能にダイレクトにアクセスする環境を与えてくれた。

アプローチの仕方に違いはあるが、出来上がった成果物はどれも、人々を感動させてくれたのだった。

参考ページ

上記文中のリンク先と、以下のページをたいへん興味深く読んで、記憶を辿ることが出来ました。感謝です!