SSブログ

孤独へ向って突っ走れ (35) [  PC-98x1(補完計画)]

戦士にさえ休息は必要だ。ましてやヘロヘロのおじさんは。



EGC。懐かしい響きだ。GRCGそしてEGCと、グラフィック関係の拡張機能がPC-9801(のある時期以降の機種)にはあった。

おおまかな意味で、GRCGはGVRAMプレーン4面同時書き込み機能が特徴で、EGCはそれに加えてラスタオペレーション機能も備えている、という感じで良いだろうか?

悲しいかな、長年の間に私はその詳細を忘れてしまった。昔買って読み古したあの本が今あったらなあ、と思う。わずかに残っているのは、私が若いころに本を読んで書いたC用のライブラリのコードだ。数十年の人生の喜怒哀楽の間に、若いころの記憶は大波にさらわれるように消えてしまった。ハードディスクに保存しておいた昔のデータを見ると、まるで自分ではない知らない子がひょっこりと自分の目の前に現れてコードを見せているかのようだ。(以前の記事に書いた「ウルトラマンのように昔の自分が助けに来てくれた」というのは、誇張でも何でもない、私の本心だ。)



話は遡る。前回の記事に出した画像があのように暗かったので、それについてハッキリさせるべく、私はその画像のデータであるpicファイルを展開した後のコードを調べ始めた。

でもこのへんで正直に書いておこう。この作業を始めてから1か月あまりが経つ。好きな物には打ち込む性格の私は無茶苦茶にやってきた。それがここに来て、後遺症を出しつつある。平たく言えば、作業の大変さに息切れがしてきた。今後は作業のペースが落ちるだろうし、ある時期にピタリと何の記事も出なくなるかもしれない。それでも私は、いつの日か、この「自分でやり始めた作業」を完結させたいと思っている。

閑話休題、私がコードを調べ始めてどうなったかというと、OUT 04A0というものが出てきた。「なんじゃいこりゃあぁぁぁ!」と私は思った。この作業をやり始めた頃の私なら、何が出てきてもなんのその、ガンガン調べまくっただろうに。それができないほど息切れがしている自分に、私はハッと気づいた。休息をとる時期が来てしまった、と。

でもキリのいい所までは頑張ろう。私は調べた。これは懐かしいEGCのためのI/Oポートだった。その部分の逆アセンブル結果を少し出そう。でもこれは逆アセンブル結果だから、EGCの設定のうちの一部がサブルーチン化している場合はcallとなってしまい、コードは出てこない。

CALL 68C5
EGCの設定

MOV AX,FFF0
MOV DX,04A0
OUT DX,AX
EGC、4プレーンとも書き込み有効

MOV AX,0FFF
MOV DX,04A2
OUT DX,AX
EGC、パターンレジスタ使用

MOV AX,28F0
MOV DX,04A4
OUT DX,AX
EGC、コンペアリードしない、ラスタオペレーションの演算結果をライト、GVRAMのデータを入力、ライト・リードともパターンレジスタの変更なし

MOV AX,0000
MOV DX,04A6
OUT DX,AX
EGC、フォアグラウンドカラー設定

MOV AX,FFFF
MOV DX,04A8
OUT DX,AX
マスクレジスタ設定

ここでちょっと待った。ネット上に、
http://www.webtech.co.jp/company/doc/undocumented_mem/io_egc.txt
という有難い情報がある。こういう、非公開の部分を含む情報をテストしながら作るのに、どれほどの苦労があったことか。このサイトの情報を参考にさせてもらう時は、とにかく頭の中で感謝しようと私は思っている。

さて、その中に「ROPのP入力にパターンレジスタを割り当てる場合は、このポートに0000hを 指定しなくてはならない」と書いてある。可能性は2つだ。私はもう作業に息切れがしているから、パターンレジスタを実際には使わないのにコード解析時に使うと勘違いしてしまったかもしれない。(実際に私のミスは多すぎるんだ。)もしそうでなければ、このソフトのようにffffhとするのが推奨されることになる。

参考までに、大昔に私が作ったCライブラリからEGCの初期化部分を挙げておく。これはきっと合っている。当時出版されていた本を参考に書いただけでなく、これをコードの一部として趣味でゲームソフトも作り、それは動いたから。

void egc_enable( void )
{
unsigned char far *grcg_statusflg = (unsigned char far *)0x00000495L;

/* GRCGをON */
_disable(); /* マウス割り込み等が入らないように */
outp( 0x7c, 0x80 );
*grcg_statusflg = 0xc0; /* マウス割り込み等が参照できるように */
/* EGCモード変更許可 */
outp( 0x6a, 0x07 );
/* EGC拡張モード */
outp( 0x6a, 0x05 );
/* EGCモード変更禁止 */
outp( 0x6a, 0x06 );
_enable();

/* 初期設定:アクティブプレーン=全プレーン */
outpw( 0x04a0, 0xfff0 );
/* 初期設定:リードプレーン=パターンレジスタの全プレーン */
outpw( 0x04a2, 0x00ff );
/* 初期設定:マスクレジスタ=マスクなし */
outpw( 0x04a8, 0xffff );
/* 初期設定:ブロック転送 */
outpw( 0x04ac, 0 );
/* 初期設定:ビット長=15 */
outpw( 0x04ae, 15 );
}



MOV AX,0000
MOV DX,04AA
OUT DX,AX
EGC、バックグラウンドカラー設定

MOV AX,0000
MOV DX,04AC
OUT DX,AX
EGC、ビットシフトなし

MOV AX,013F
MOV DX,04AE
OUT DX,AX
転送のビット長



とっくに息切れしている私はそろそろ引っ込もう。この記事を見に来てくださった有難い方は間違いなくプログラミング関連で見に来てくださったのだが、最後にゲームの絵の色について、少しだけ書かせてほしい。昨夜、私は疲れて帰ってきた。人は疲れている時には地道な思考はできない。短絡的になる。それで寝る前に、私のWindowsに入れてある画像処理ソフトXn View for Windowsを起ち上げて、あの画像を読み込み、「暗いから明るくなってくれー」という呪文のつもりでメニューの「画像」から「画像データ値の変換」を選び、「自動コントラスト」を選んだ。そうしたら、あ・・・ええ?おお!!

私は「人」としては喜んだ。「プログラマー」としてはガックリと落胆した。だって考えてもみてくれ。毎日毎日努力して、まだ成功していないっていうのに、「このソフトを使うとチョチョイのチョイで成功ですよ」と言われたとしたら、一体どのプログラマーが喜ぶだろう。



追記
寝ていたら地震があって目が覚めました。そうしたらふと、パレット実現の件で思いついたことがありました。PC-98って1677万色中16色だっけ?と。なんかもっと少なかったみたいな。きっとこれでうまく行きます。今は布団の中で、スマホを使ってこの追記を書いていますが、どうせ眠れないからこれから起きてデバッグしようと思います。

コメント(0) 

コメント 0

コメントの受付は締め切りました