211208 PS/55エミュ製作 [8]DOS Jx.xが起動できるようになった
利用者定義文字については、BIOSは仕様が分からず未実装ですが、ハードウェア的にはフォントROMからもフォントパターンを読み出せるようになりました。PS/55では外字RAMと同様にフォントROMもA0000h-BFFFFhにバンク切り替えで出現させているようです。ちなみに、上で表示している漢字はJISコードで最も画数が多い字。昔、漢字辞典で画数から区点コードを調べたときに目に焼き付いたのでよく覚えてる。
DOS K3.3では半角文字のフォントはディスク収録のFNTファイルからロードされますが、DOS J4.0以降では同様のフォントファイルがなく、フォントROMからロードしているようだったので、これも解析に苦労しました。フォントROMに64バイトや72バイト毎に何かしらのパターンを書き込んで、正しく表示されたときに1文字当たりのバイト数が判明します。そこで、半角文字のROMアドレスを割り出すために各文字にアドレスを書き込んでDOSを起動し、実際に表示されるドットパターンを2進数に変換すると、表示されている文字のROMアドレスが分かります。
DOS起動時にCPUが暴走する不具合はfar jumpでBIOS ROMのエントリーポイントにジャンプしているとわかり、5550のBIOS ROMを解析した所プリンターBIOS (INT 17h) へのエントリーポイントであることが判明したので、DOSBoxでは該当INTのcallbackへのポインターをセットしてやるだけで済みました。DOS K3.3で日時が取得できない問題も同じ方法で済んだので、アセンブラでRTCを取得するコードを作った苦労は無駄になりました😏
/*
BIOS Entry Points for PS/55 Model 5550-T
FE6F2h, int 15h ax=c501h (INT 19h) Bootstrap Loader ->callback[10]
FE739h, int 15h ax=c502h (INT 14h) Serial port ->callback[3]
FE82Eh, int 15h ax=c503h (INT 16h) Keyboard
FEC59h, int 15h ax=c504h (INT 40h) Diskette
FEFD2h, int 15h ax=c505h (INT 17h) Printer ->callback[5] (*DOS J4.0)
FF065h, int 15h ax=c506h (INT 10h) Video (*DOS J4.0)
FF841h, int 15h ax=c507h (INT 12h) Get memory size ->callback[2]
FF84Dh, int 15h ax=c508h (INT 11h) Get equipment list ->callback[1]
FFE6Eh, int 15h ax=c509h (INT 1Ah) Time ->callback[6] (*DOS K3.3)
*/
rptr = callback[5].Get_RealPointer(); // INT 17H Printer (used by DOS J4.0)
phys_writeb(0xFEFD2 + 0, 0xEA); // FARJMP
phys_writew(0xFEFD2 + 1, RealOff(rptr)); // offset
phys_writew(0xFEFD2 + 3, RealSeg(rptr)); // segment
rptr = callback[6].Get_RealPointer(); // INT 1AH Time (used by DOS K3.3)
phys_writeb(0xFFE6E + 0, 0xEA); // FARJMP
phys_writew(0xFFE6E + 1, RealOff(rptr)); // offset
phys_writew(0xFFE6E + 3, RealSeg(rptr)); // segment
今まではDOS K3.3専用エミュレーターでしたが、これでDOS J4.0, J5.0が起動するようになりました。起動はね。セットアップが起動するとエラーが出たり画面がバグったりするので、まだ何か足りないようです🙁
もうやだこのドスqあwせdrftgyふじこlp