※ここで見ているERCACHEのバージョンは0209です。
いきさつ:
メルコのハイパーメモリCPUを入れ、16Mのメモリも入れた。買ってから気が付いたのだがこのメモリはメモリ先頭から見て16Mから32Mの領域に張り付くようだ。どうやらERCACHEは1M〜の連続領域にメモリがないとまずいようで、入れたメモリを使ってくれない。
そこでERCACHE.EXEを16M〜のメモリを使うように書き換えてみたのだが、/OVER16を付けても画像がちゃんとセーブされない。ERCACHEGでディスクに保存しても、真っ白な画面になってしまう。保存中に出てくる画面も真っ白なまま。グラフィックのセーブ用領域が16M超の領域から始まるときのみの問題だと思え、おそらくパレット情報などを得る時のEMSページがちゃんとセットできていないためだと思うのだが。。。
ERCACHEは http://www.vector.co.jp/
から持ってきたと思います。今もあるのだろうか?
で、次の書き換えを行うと16M超メモリも使えることがわかりました。
この書き換えの後では1M〜に仮想86モニタやHMA、UMBなどが置かれ、16M〜に画像セーブ領域などが割りつくようになるようです。(従って1M〜のメモリも必要です。DAは元から内蔵していますが。)
また、この書き換えは16M〜の16Mメモリのみに対応しています。それ以上あっても16M分しか使われません。
各ファイル名と、ファイル先頭からの位置、書き換え内容を順に書きます。
ERCACHE.EXE
24B1 7605→9090
24B6 70→80
16M超の量を設定する。ソースではERC_INI.Cの40行目、
if (extend_memory > 0x70){
extend_memory = 0x70;
}
の判定を必ずTRUEにし、0x80ページあることにする。この値を変えればもっと多いメモリも使えるようになるはずである。
267B 08→80
2712 08→80
27A8 08→80
2831 08→80
各領域の先頭を1M+αから16M+αに変更する。コンパイラで変なビットシフトに展開されているため、おかしな変更に見えるが、16倍の値ということである。
ソースではERC_INI.Cの164行目などの
erc1.gsavetop = (unsigned long)(0x1000 + extend_memory * 0x200);
を、
erc1.gsavetop = (unsigned long)(0x10000 + extend_memory * 0x200);
にすることになる。ちなみに4つあるのは、メモリ保存機能、仮想バンク機能、画像セーブ機能、仮想86セーブ機能のためである。
15D8 7406→9090
ERC_OPT1.Cの357行目
if (zeroseg[0x60*16+0x34] > 0){
erc1.umbflag3 |= 0x40;
} else {
の判定をTRUEにして、/OVER16を必ず有効にする。これがないと/OVER16オプションは16M超のメモリがないと思って無効となってしまう。
ERCACHE1.EXE
373C 08→0A
本来、8ビット右シフトしていたものを、10ビットに変更する。
ソースではERC1_V86.ASMの2669行目の、
shl eax,8
を
shl eax,10
にすることになる。
ERCACHEG.EXE
44A 9983E2→C1E902
44D 0F03C2→80CD40
451 F8→E8
457 06→04
それぞれアセンブラでは
CWD
AND DX,0FH
ADD AX,DX
を
SHR CX,2
OR CH,40H
に、
SAR AX,04
を
SHR AX,04 に、
SHL AX,06
を
SHL AX,04
にしている。最初の部分は何をやっている部分かわかっていないが、不要そうなので書き換えに使っている。これで問題のビット(17ビット目)をONにして、2ビット右シフトした状態にしている。 2番目はなくてもいいのかもしれない。3番目は6ビットシフトを4ビットシフトに押さえて結果として2ビット右シフト状態にしている。
この部分、ソースでいえばERCACHEG.Cの187行目、
_outpw(paging,(unsigned int)(inpw(ErcInfoPort)) + bankno * 0x40);
を、
_outpw(paging,(unsigned int)(inpw(ErcInfoPort)+0x10000)>>2 + bankno * 0x10));
に変えたことになる。この0x10000の部分が16M超をあらわしている。
以上の計17バイトを書き換えれば動くようになったのであった。ふう。