v.com でVRAMの判定がエミュ3種で違っているのが気になって、
どう判定しているのか逆汗してみました。
ソーサーでも全部は逆汗できず、SYMDEB でアセンブルした部分を張ります。
2AA1:0145 6A40 PUSH 40 ;'@'
2AA1:0147 07 POP ES
2AA1:0148 BEA603 MOV SI,03A6 ; 09[00]
2AA1:014B 26A04900 MOV AL,ES:[0049] ; Video mode
2AA1:014F 32E4 XOR AH,AH
2AA1:0151 8904 MOV [SI],AX ; [si]=00xx vmode
2AA1:0153 26A14A00 MOV AX,ES:[004A] ; 桁数
2AA1:0157 894402 MOV [SI+02],AX ; [si+2]= column
2AA1:015A 26A08400 MOV AL,ES:[0084] ; 行数 line
2AA1:015E 32E4 XOR AH,AH
2AA1:0160 40 INC AX
2AA1:0161 894404 MOV [SI+04],AX ; [si+4]= line+1
2AA1:0164 26A18500 MOV AX,ES:[0085] ; font H
2AA1:0168 894406 MOV [SI+06],AX ; [si+6]= font H
2AA1:016B 6800B8 PUSH B800 ; B800h
2AA1:016E 07 POP ES ; ES=B800h
2AA1:016F 33FF XOR DI,DI ; DI=0
2AA1:0171 26833DFF CMP Word Ptr ES:[DI],-01 ; [B800:0]=ffffh なら ES=A000h
2AA1:0175 7508 JNZ 017F ; not FFFF --> 017f jump
2AA1:0177 6800A0 PUSH A000 ; A000h
2AA1:017A 07 POP ES ; ES=A000h
2AA1:017B 83440804 ADD Word Ptr [SI+08],+04 ; [si+8]=[si+8]+04
017f:
2AA1:017F B4FE MOV AH,FE ; ah=FEh 擬似テキストバッファ先頭アドレス取得
2AA1:0181 CD10 int 10 ; int 10h, 擬似テキストバッファ先頭アドレス取得
2AA1:0183 8C440A MOV [SI+0A],ES
2AA1:0186 897C0C MOV [SI+0C],DI
2AA1:0189 8CC0 MOV AX,ES
2AA1:018B 3C00 CMP AL,00
2AA1:018D 7404 JZ 0193
2AA1:018F 83440E05 ADD Word Ptr [SI+0E],+05
2AA1:0193 BBDC02 MOV BX,02DC
2AA1:0196 E83800 CALL 01D1
2AA1:0199 B8004C MOV AX,4C00
2AA1:019C CD21 INT 21
これでわかったことは、CGA VRAM B800h の先頭2バイトが 'FF FF' かどうかチェックしてるんですね。
え? と思って、DOSVAXJ3 のコマンドラインで DUMPマクロで見たら
B800h から 8000h の間が FFh で埋まっていました。
VTDOS は B800h から 00h で埋まってる、というか、ゴミもあるので普通のメモリ領域のようです。
MS-DOS Player は B800h から 1C20h の間が 20h 17h で埋まっていました。
つまり、MS-DOS Player だけ B800h の領域をVRAMとして初期化しているということでしょうか。
これを踏まえて私の理解を纏めると
DOSVAXJ3
VRAM Mode = APA ; B800h == FF FF の時
VRAM Address = C679:0000 (Virturl VRAM) ; 仮想VRAM と認識
VTDOS
VRAM Mode = A/N ; B800h != FF FF == 00 00 の時
VRAM Address = D000:0000 (Real VRAM) ; リアルVRAM と認識
MS-DOS Player
VRAM Mode = A/N ; B800h != FF FF == 20 17 の時
VRAM Address = F800:0000 (Real VRAM) ;リアルVRAM と認識し、B800h が仮想VRAMとなる?
もしもこの考えが合っているとしたら、B800h を FF,FFか 00,00 で初期化すれば うまくいきそうな気がします。
その場合、仮想VRAMは、上のチェックルーチンを見ると、 VGA A000h に設定すれば良さそうに思えます。
VTEXTは画面モードは03で、実際は 70h になっていますが、03 は本来 CGA モードだと思うので
この辺の辻褄をうまく合わせてやればいいのかなと素人考えで思いました。
武田さん、この考えどう思いますでしょうか。