Profile

 Dormouse
 DORMOUSE SOFT代表にして、専属プログラマー。生まれてはじめて取った資格は、今年取った第二種情報処理技術者。絶対落ちたと思ったのに受かってた。これじゃありがたみもないわな。いまだにC言語は苦手なので、選択問題は全部アセンブリ言語で解きました。バカです。
 パソコンをいじりはじめたのは、親父のPC−8001が最初ですね。ハチハチじゃないよ、ハチマルよ。CRTはグリーンディスプレイっつって、灰色の地の画面に、緑色に光る字が表示されるというものでした。もちろんキャラクタ表示だけ。外部記憶装置はカセットテープ。テープレコーダーをつないでセーブ・ロードするのだ。
 次がMSX。結局、買ってもらえなかったけど、小学校高学年から中学にかけて、友人の家に入り浸ってBASICをみっちりやりました。そんでもって、マシン語の壁に突き当たる。「マシン語」なんて今どき言わねえもんなぁ。当時はアセンブリ言語と同義とされていたんだね。ハンド・アセンブルって知ってる?ニーモニックよ?CPU命令と一対一対応よ?C言語なんてメじゃないでしょ。
 高校に入って、やっと買ってもらいました。PC−9821Ae。「98MATE」シリーズの最初の機体。「98MUlTI」に続く9821シリーズの第二弾でもあるという。一応、メインプロセッサは486SXというCPUだけど、486とは名ばかりで、実質的には386にコ・プロセッサが付いただけというCPUだった。なにが98 「21」なのかっつーと、まあ256色表示ができることくらいがウリだった。あとは640×480ドット(ピクセル、などとはいわない)の解像度。一応、VGAという規格と見た目は同じなのだが、原理は98のVRAMをムリヤリ拡張したものだったりする。まぁ、その辺はあとで説明しましょう。いまだに、PC−9821専用のCD−ROM版のエロゲー、というえらく中途半端な物が売られてたりするんだけど。まあ、そういう中途半端な機種だったわけだ。俺的には、アリスソフトの『夢幻泡影』が256色専用だったのが、唯一9821で良かったと思った瞬間だったかな。
 そう、高校へ入ってエロゲーというものに接したのが、現在の俺の直接のルーツだね、やっぱり。『バックアップ活用テクニック』という雑誌があって、今の『ゲームラボ』の前身なんだけど、投稿プログラムを圧縮したファイルの16進ダンプリストを、メチャメチャ小さい字で数ページに渡って掲載するというムチャをやってました。読者はバイナリエディタで、16進数をひたすら打ち込んでファイルを作り、しかる後に解凍して使うわけです。この発想がスゴイ。おまけCD−ROMがあたりまえの現在では考えられないことだ。そこに載ってた「CGカッター」という投稿プログラムが当時あって、常駐していて、あるキーを押すことで割り込み、画面を保存するというプログラム。つまり常駐させておいて、エロ画面が表示されたらキーを押して起動、ビットマップファイルに保存されるという仕掛けです。ちなみに、98のビットマップファイルというのは、当時ベタ形式と呼ばれていたんだけど、拡張子が「.B1」「.R1」「.G1」ともう一つ(忘れた)、計4つのファイルに分かれていたんです。というのも、98のグラフィックビデオRAMは特殊な構成で、4枚のビットマップを重ねて表示しているイメージになっています。えーと、88では3枚で、1ドットにつき3ビットの情報、つまり8色だったわけですが、98ではさらに拡張ビデオRAMを一枚追加し、計4ビット、つまり16色の同時発色が可能になったわけです。その各色について、RGB各4ビットずつの輝度をパレット情報として設定でき、計12ビットの情報で、4096色から選べたことになります。余談だけど、98のビデオRAMでもうひとつ特殊だったのは、「テキスト画面」と「グラフィック画面」が分かれていたこと。全角文字がROM内に用意されているのが、国内でDOS/V機に勝てる最大の要因と一応、言われていた時代だ。テキスト画面というのは半角80字×25行のレイアウトになっていて、全角の場合は一文字につき2バイト+2バイト、半角・全角識別のためのヘッダをつけてシフトJISコードを変な風に変えたコードをいれてやるわけだ。さらにエスケープシーケンスみたいな情報を入れる領域もあったっけ。ようするに、最初から80×25字に区分けされたテキスト画面というのがあって、常にグラフィック画面の上に重ねて表示されているイメージなのだ。グラフィックとテキストは、理論上別の画面に分かれていたというわけ。逆にいえば、DOS/V機は、文字の形もグラフィック情報として(フォントといえば分かりやすいか)画面に配置してやるという方式。たしかにテキストの制御は圧倒的に98の方が単純といえる。これが98最大の強みだっただけど、今では扱う情報量のケタが変わっちゃって、フォントデータも何十種類もディスク上に用意して使い分けるのが当たり前の時代になってしまいました。あっというまにこんなことになるとは、NECでも誰も想像できなかったんでしょう。
 話は前後しますが、プログラマとしては、「常駐」、「割り込み」っていうのが、やはり当時一つの壁だったわけです。ところが、これを必死に勉強せざるをえないことになりました。
 というのも、まず、当時のPC−9801では、I/O命令の仕様上、パレット情報を読み出すことができなかったのです。GDCというLSI、今でいうグラフィックボードにあたると言えばわかると思うんだけど、そこへビデオRAMのビットマップ情報と、CPUからパレット情報を送って、そこからディスプレイへ表示する情報を出力していたわけです。CPUからI/Oポートを通してGDCに送ったパレット情報は、なぜかINPUT命令で読み出すことができない仕様になってました。つまり、一度出力してしまえばそれっきりで、「現在表示されている画像のパレット情報」をCPUに取得することはできなかったのです。よって当時の98のCGカッターは、ビットマップ情報のみでパレット情報がなく、自分でゲットした絵の「色合わせ」をする必要がありました。つまり、パレットを変更しながら、元の絵と同じ色を探す、という作業。しかしこれが極めて困難。たかが16色、されど4096色、なのだ。これを解決するための、常駐パレットというシステムがあるにはあった。CPUを監視して、プログラムがパレットを書き換える瞬間にその情報を横取りしようという概念なんだけど、やっぱり不完全なものでした。
 ところが、ある時、「PC−9821では、パレット情報の取得が可能だ」という情報を小耳に挟んだ俺は、あわてて調べてみたんですよ。すると果たして、できるらしい。つまり、完全なCGをゲットすることが、ハード的には可能なわけです。でも、当時ですらマイナーだったPC−9821専用のそんなプログラムを作ってる人なんていないわけです。当時はネットにもつなげてないし。そもそもネットといったら、ニフティサーブとPC−VANとASCIIネット以外は、いわゆる草の根ネット、という時代でした。もちろん個人がインターネットに接続するなんて思いもよらなかった。とにかく自力でやるしかなかった。幸い、ある程度の素地はある。
 また話は戻るんだけど、高校に入った俺はコンピュータ研みたいな部に入り、MASMすなわちMicrosoft Macro Assemblerを入手した。入学前の春休みからMASMの解説書を読んでたんだけど、ソフトは買ってもらえなかった。というか、父親の理解がなかったうえに当のソフトが売っていなかったので、QuickBasicなどというものを掴まされる始末。9821には、それ以前の98に付属していたDisk-Basicすら付いてなかったので、八方ふさがりの状態だった俺を、部の先輩が救ってくれたのだ。でも、先輩がくれたMASMには、デバッガが入ってなかった…。私は高校3年間、デバッガなしでアセンブラのプログラムを組み続けたのだ。デバッグ作業は、まず走らせてみて、しかる後に問題点を想像し、改正する。たいていは暴走で、しかもハングアップするだけだからどこが間違ってるのかなんてさっぱりわからない。結局は丹念にソースを読み直すしかないんだ。いやー、当時は根気というか執念みたいなものがあった。物事を学ぶにはこうでなくてはいけない。
 ついでに書くと、exe2binというツールもなかった。これは、アセンブル、リンクを経て.EXEファイルになったプログラムのヘッダ部を切り取って、.COMファイルを作るツール。今でも俺は、.COMファイルこそ、最もシンプルかつ純粋なプログラム形式だと思っている。ヘッダなどない。セグメントなんてものもない。1バイト目から、CPU命令のコードだ。当時たいていのCコンパイラでは、この.COMファイルの形式、TINYモデルをサポートしていなかったので、.COMファイルを作ることは、多くの素人プログラマにとって夢だったんですよ。俺はわざわざ、.EXEファイルの先頭756バイトのヘッダを取っ払うツールを自作して、.COMファイルを作ってた。もちろん、あらかじめ決められた形式でソースを書く必要があるんだけど。
 いま思ったんだけど、このへんの話って、そうとう古い、当時の事情に精通している昔気質のプログラマにしかわからないネタなんだよね。そんな方が読んでたらぜひメール下さい(笑)。
 まあ、それはさておき、そろそろ話を戻してもいいかな。パレット読み出しの話をしてたんだけど、憶えてる?大枚はたいて、ハード関係の資料は良いのを買ったから、問題のI/O命令に関してはわかる。パレットの読み出しなんて、ホントに単純なINPUT命令だし。でも、常駐部と割り込み部に分かれた構造で、それぞれ別々に制御を行う プログラムの全体の構成なんて、ちょっと手に負えない。
 先に書いた、例のCGカッター。幸い、あれのアーカイブに、アセンブラ版のソースというものが付いていた。正確には、それは「サンプルプログラム」で、もともとCで書いたプログラムを、作者が試しに、同じアルゴリズムでアセンブリ言語で書いてみたというものだったみたいだ。ふつうでは考えられないようなバグもあったけど、なんとか動くようにして、CGカットの部分のルーチンに、パレットを読み出してファイルに保存するモジュールを追加。見事、パレットまで吸い出せる、完全版CGカッターができました。人のプログラムを改造しただけなんだけど、スゴイ達成感があったのを覚えてます。もともと「同級生2」のタイトル画面を吸い出して、色合わせがさっぱりできなくてムカついたのが、これを作る原動力になったんだよね。エロの力は偉大だ。同級生は1のほうが好きだったけれど、98版の2のタイトルCGは絶品だったよね。音楽も好きだった。そうそう、MIDIもやりたいなぁ。
 で、同級生2のタイトルCGをゲットして喜んでた俺に、次なる試練が訪れた。さっきもチラっと書いたんだけど、PC−9821では640×480ドット、256色同時発色という、見かけ上はVGAと同等の表示機能を持っていました。ところが、V−RAMの構造自体は、98に毛が生えた程度のものだったんです。あたりまえだけど。256色モードでは、98式の重ねビットマップを16枚重ねる形式と、1ドットにつき1バイト(256色)のデータがずーっと並んでるイメージと、ビデオRAMの使い方を二種類に切り替えられたわけです。400←480ドットに増えた分も、どう見てもビデオRAMの余ってた領域を使ってるだけ、というアーキテクチャになかなか無理が感じられて面白い。
 そこで俺は、またまたさっきのCGカッターを流用して、256色版・CGカッターを作っちまいました。今度はかなり大幅にルーチンを入れ替えることになったんだけど、ようするにビデオRAMをそのままファイルに落とすだけ。圧縮なんて知らないから、一枚につき約300kbというバカでかいファイルになっちゃった。今でこそ、300kbなんて全く大したことないじゃんと思うかもしれないけど、当時はフロッピーに4枚しか入らないCGなんて驚異的だったんだ。MAGとかP4とか、圧縮率が勝負だった時代だから。Windowsの壁紙が、無圧縮のビットマップファイルだなんて、頭がクラクラするよね。必死になって圧縮しまくってたあの頃は、いったいなんだったんだろう?
 結局、その256色版CGカッター(勝手にウルトラCGカッターとか呼んでた)は、一度割り込みをかけるとゲームに復帰できないシロモノになっちゃったんだけど、原因はとうとうわからずじまいで、一枚CG取り込むたびにソフトウェアリセットかけてた。
 と、まあ、こんなことばっかりやってる俺です。


もどる