Re: MIT.の電脳遊園地

といっても某工科大学のことじゃないですよ。

ハイパー・グラフィック・ツール LALF (その2) -技術編-

MIT.です。

2つ前のエントリの続きです。まあ懐古趣味の記事ですが、備忘録として。
技術的なこだわりの部分について覚えていることを書いておきます。

 

当時のグフィックツールとしては「ダ・ビンチ」と「MagicPaint」が2強でしたが、どちらも使ってみて「ツールとしては使えない」という結論でした。で、実はそう考えたポイントをそのままLALFで解消するようにしたのです。

詳細はだいぶ忘れてますが、それぞれのツールの特徴は以下の様なものでした。

 

ダ・ビンチ

画面全体に表示される十字ラインカーソル(クロスカーソル)が特徴。GプレーンのXORでカーソル描画していたため描画は速いけどちらつきが激しく、とても見にくかった。マウスドライバがタコで、手で丸を描いたら画面上では縦長の円になった。(画面解像度が640 x 200で、1pixelが縦長だったため)
更にキャラクタプレーンを使った1文字=1ピクセルのルーペモードがあり、これが邪魔で見にくかった。
色は基本8色のみ。アナログRGB非対応。

色を塗るには指定座標のカラーが続いているところまでを塗りつぶすペイント機能しか使えなかった。このため「輪郭線のない塗り」をしたい場合は1)特定の色で輪郭線を描く、2)その輪郭線と同じ色で塗りたい領域を塗りつぶす、3)最終的に塗りたい色(タイルパターン含む)で塗りつぶす、という手順を踏まないといけなかった。データは描画過程をコマンドと座標で記憶するタイプでデータサイズは小さい代わりに1枚書き終わるのにものすごく時間がかかった。RGB各プレーンをドット情報で持つ方法もあったが圧縮しないためにデータサイズがとても大きく、結局1枚表示し終わるのに何十秒も待たないといけなかった。

 

※描画の実際は以下をみるとよくわかります。PC-88ではなくX1ですが動作は同じです。(掲載許可済み)


80年代PCによる当時のアニメCGデモ Part2 (Animation Characters demo for old PC)

80年代PCによる当時のアニメCGデモ Part3 (Animation Characters demo for old PC)

 

MagicPaint

ルーペモードはドットの切れ目が判るようにマス目に切れていたのが見やすかったが2倍拡大しかできず、微妙な作業に向かなかった。
アナログRGBに対応。ただしパレット調整はRGBのみ。肌色を出したい時には赤と緑の値を上げていくやり方しかできなかった。
マウスドライバはちゃんとピクセル比を考慮した設計になっていた。ただしバスマウスしか対応していなかった(はず)。
データは圧縮してたはず(詳細失念)だけどロード/セーブはけっこう遅かった記憶が。
BASICとマシン語の組み合わせで作られていたので、ペイント機能で色を塗っている時、輪郭が閉じていなくて溢れてしまった時に慌ててBREAKキーを押すとアプリが終了してしまった。 

 

これらを参考に、LALFでは以下をコンセプトにしました。

 

  • 反応速度
    UIに関わる部分の応答速度は極限まで速い方がいいです。
    マウスカーソルが手の動きより遅れてくるようなのは論外。でも当時はそういうのが普通でした。Win95が出た頃もそういうのがよくありましたね。
    とにかくすべての動作がキビキビと動くこと。
    ペイントルーチンは描画ラインが目で追えるようではいけない。
    画像データは圧縮する。圧縮率はどのツールよりも高く、ロード/セーブも最速を目指すこと。

    →ということでプログラム本体はオールアセンブラで作ることに。
    アクションゲームと同様の超高速化手法を使いまくってます。ループの展開とかショートジャンプのみにするとか自己書換えとか。

 

  • マウスドライバ
     グラフィックツールの命の部分として一番気合を入れて作りました。(というより作ってもらった)
    バスマウスが主流でしたがシリアルポートにつなぐマウスにも対応してます。
    円を描けば画面上でも円になるのはもちろん、マウスを動かす速さによって加速度を微妙に変化させて狭い範囲でも思い通りに動かせるようにするとか、 ある速度以下では加速を切って細かい動きにリニアに反応するようにするとか。とにかく自分ともう一人の絵描き協力者が使ってみて一番しっくりくるようにチューニングしました。ガチユーザーが一番いいと思う感覚に合わせることで、それまでの「機能を実装しました」というのとは一線を隠した使い心地になっていたはずです。

 

  • ユーザーの根本的な要求
    絵を描く側の立場としては、ペイント機能で色を塗るときに輪郭線が切れていて色が溢れてしまうのがとにかく嫌でした。
    この頃の画像描画ワークフローは必ず 1)輪郭 2)色塗り 3)ドット修正 といった流れでした。輪郭は手で描いた紙をスキャンするか(当時のスキャナは白黒でしかも高価でしたが)、サランラップなどに輪郭線を描いたものをディスプレイに貼り付け、それをトレースする「ラップスキャン(ラップトレース)」という手法を使うのが普通でした。ただ、どちらも輪郭線が閉領域で構成されることはまずないため、輪郭線を描いた後、目を皿のようにして ドット抜けを探すことになるのです。そうして頑張って作った輪郭線に色をぬる作業に入ると、チェックしきれなかった隙間から色があふれだすのです。UNDO機能など標準でない時代。これは本気で凹みます

    メインプログラマーとこの話をしていた時、「ワークフロー的にはアニメーションのセル画を描く時と同じようなものだ」ということになり「じゃあ仮想的に裏画面を作って輪郭線を描けるようにしよう。色を塗るのは表画面だけにすれば輪郭線は保護できる。裏画面はペイント機能のマスク情報だけだから1プレーン分(白黒2値)のみにすればメモリ消費も抑えられる。」ということでセル(Photoshopでいうところのαチャンネル)機能が誕生しました。
    とはいえ、それでもペイント溢れの恐怖があるので、UNDO/REDO機能とも言うべき「クイックセーブ/クイックロード」が実装されたのです。 ただしこれはメモリ上に展開することは無理だったためシステムディスクへの書き込みとなりました。

 

  • データ圧縮
    画像データは圧縮して保存することにより高価なフロッピーディスクの消費を抑え、ロード/セーブの高速化を目指しました。ロード/セーブの時間を短くするためにデータ圧縮率は高く、しかも圧縮/展開(解凍)も高速に行いたいという要求に、アルゴリズムマニアとでも言うべきメンバーがいて、「そんなの3日で作れますよ」とかいうもんだから任せてみたら、本当に3日で今までのツールとは比べ物にならないくらいの圧縮率で高速にロード/セーブするルーチンを作って来ました。

 

【番外】

  • コピープロテクト
    当時ゲームを中心に多くのプログラムはフロッピーディスクコピープロテクトをかけていました。 ところがほとんどは発売日かその次の日にはプロテクトが破られてコピーツールのパラメータ集(通称ファイラー)が出回っていたのです。
    その不毛な攻防(?)を見るにつけ、「そんな暇とディスクスペースとメモリがあるなら今の機能をbrushupするのに使え」と 思っていました。
    また上記のようにクィックセーブ/クイックロード機能はディスクの入れ替えが発生する可能性のあるデータディスクではなく、システムディスクに書き込む必要がありました。そのためLALFは購入後最初にディスクバックアップをすることを前提としています。
    ちなみにこのディスクバックアップツールも独自で作っていますが、ノンプロテクトディスクの超高速コピーツールとしてそのまま使えました。 こういうユーティリティの一機能まで、すべての動作の高速化を目指したのです。

 

そうしてテストサンプルができるたびに私が使ってみて、バグ出しと修正点の指摘をするというループを回していったのです。今で言えばプロトタイピングとかラビッドタイピングとかアジャイルとかといわれるような開発スタイルでした。

 

メインプログラマーはZ80ニーモニックをそれぞれ何サイクルで完了するかまで覚えていて、マシン語を16進ダンプを見ながらハンド逆アセンブルできるような人間でした。最終的にオールアセンブラで組んだおかげで、すべての機能はマシンサイクルレベルで最高速に仕上げられています。(と本人が言ってました)
結局64KBの本体メモリをすべて使い尽くして残りは2バイトだか4バイトだかといったところ。
DOSなど一般的ではない時代(CP/Mはありましたが)、フロッピーディスクの起動すらも速くするためにIPLも自力で全部書いてました。ディスク管理機構はN-88BASICのFAT構造に合わせたため、BASIC側からローダーを呼ぶことで独自プログラムから画像データの表示ができました。

サブプログラマーは自信過剰で大口をたたくやつでしたが、その大口に違わず要求通りのものを素早く仕上げてきたので、私は文字通りに舌を巻いたものです。データ圧縮ルーチンの出来に味をしめて(?)、彼にはスキャナー取り込みルーチンとかプリンター(当時はドットインパクトプリンターしかなかった)の濃淡つき印刷ルーチンとか、考えるだけで面倒くさそうなところを中心にやってもらいました。

ちなみにLALFは同じ学校の先輩が作ったZEAS-88というアセンブラ&エディター(技術評論社から本が出ていました)で作られていました。ついでにいうとこのアセンブラも超強力ツールでした。エディターは高機能だしアセンブルは超高速。そういう意味では私はすごい人たちに恵まれていたんだと思います。

 

そんなこんなでスーパープログラマー2名と私(企画/ディレクション)で作り上げ、もう1名の協力者(本家漫研)とでLALFは出来上がったのです。そこでCopyright表示するとき、この4人の頭文字を合わせて MASK Projectとしたのです。

 

---

■蛇足

この記事を描いてる時にこんなのも見つけたの一緒にリンク。LALFが発売された頃のテクノポリス誌の表紙です。

テクノポリス 1988年10月号~1994年3月号(最終号)表紙スライドショー

実はこのころテクノポリス誌がリニューアルされ、それまでは技術的な内容もある、それなりに硬派な雑誌だったのが一気に軟弱な雑誌になってしまいました。これをみたとき私は「なんじゃこりゃー!」と思ってしまったのは今だから言える秘密です ^^)

でも表紙がいのまたむつみ先生だったのでそれはそれ、これはこれ。個人的には問題なしでした (爆)

 

---

※初稿up後に一部追加・修正しました。 (マウスの項目追加)