211203 PS/55エミュ製作 [6]外字の対応はほぼ完了
まず、日時を取得できない問題はBIOS領域にRTCへアクセスするプログラムを追加して対応した。コードはアセンブリ言語で60行程度。普段プログラムなんて書かない上、NASMなんて使ったのは何年ぶりか。
PS/55のDisplay Adapterには256KBの外字用RAMがあって、特定のI/Oポートを操作するとメモリ空間にそのRAMの一部が出現するようになっている。これはDOSBoxのPageHandlerクラスを継承してRead / Writeの関数をオーバーライドすることで実装できた。初め、コンストラクタに余計なflagsを設定していたせいで手こずってしまった。
class PS55_Gaiji_Handler : public PageHandler {
public:
PS55_Gaiji_Handler() {
flags = PFLAG_NOCODE;
}
//Gaiji RAM placed 2 banks x 128 KB of its memory between 0xA0000 - 0xBFFFF.
// Address Bits: ab bbbb bbbb bbbb bbbb (a = bank select, b = addr)
Bitu readHandler(PhysPt addr) {
addr |= (ps55.gaiji_bank << 17);
return ps55.gaiji_ram[addr];
}
void writeHandler(PhysPt addr, Bit8u val) {
addr |= (ps55.gaiji_bank << 17);
ps55.gaiji_ram[addr] = val;
}
void writeb(PhysPt addr, Bitu val) {
addr = PAGING_GetPhysicalAddress(addr) & 0x1FFFF;
writeHandler(addr + 0, (Bit8u)(val >> 0));
}
void writew(PhysPt addr, Bitu val) {
addr = PAGING_GetPhysicalAddress(addr) & 0x1FFFF;
writeHandler(addr + 0, (Bit8u)(val >> 0));
writeHandler(addr + 1, (Bit8u)(val >> 8));
}
Bitu readb(PhysPt addr) {
addr = PAGING_GetPhysicalAddress(addr) & 0x1FFFF;
return readHandler(addr);
}
Bitu readw(PhysPt addr) {
addr = PAGING_GetPhysicalAddress(addr) & 0x1FFFF;
Bitu ret = (readHandler(addr + 0) << 0);
ret |= (readHandler(addr + 1) << 8);
return ret;
}
};//>
ハンドラーをセットしている部分。VGAが使用するRAMと重複するので、DAの初期化時にもMEM_ResetPageHandlerを呼び出している。ハンドラーは4KB単位でセットできる。今回は128KB分なので32。MEM_SetPageHandlerの中身を見れば分かるが、単純にメモリ空間の4KB単位でハンドラーの枠があるので、そこに上位アドレスへ向けて繰り返しセットしている処理となっている。
#define GAIJI_RAMBASE (0xA0000/4096)
if(val & 0x10)//bit 4: Gaiji RAM Access Enabled
MEM_SetPageHandler(GAIJI_RAMBASE, 32, &gaiji_handler);
else
MEM_ResetPageHandler(GAIJI_RAMBASE, 32);
何も定義していないのでブロックが並んでいるが、外字エディタのコード表を表示できるようになった。
文字パターンの編集画面が何か変。拡張半角文字を使用しているようだが、エミュの方は解釈が未実装のため、通常の半角文字として表示されて文字化けする。ディスクにフォントファイルがあり、DOS起動時に外字RAMにロードされている可能性が高いので、メモリダンプを解析すれば配置アドレスが分かるかも。
テキストモードの実装は完成間近。グラフィックモードは仕様の不明部分がまだ多いことと、私が対応ソフトを持っていないので、あまりやる気しない。OS/2 J1.xを動かすなら必須だと思うけど、さすがに今どき手には入らんよなぁ。そもそも
DOS J5.0は起動時にCPUが暴走するので、これを何とかしたい。