tmp/機種判定

(作業用メモ)

パソ通時代はけっこう話題になってた記憶があるけどさすがにもうログが見当たらんなあ…

PC-98 と IBM PC の判定はとりあえず int 10h, ah=0fh あたりで行うのが無難。
IBM 系の場合は AH に画面の桁数が返される。
http://wiki.fdiary.net/dos/?i100f.htm
http://www.delorie.com/djgpp/doc/rbinter/id/13/1.html

98系はだいたい不変らしい。 画面の横幅が 15 桁のディスプレイというのはあまりないのでほぼこれで判定できる。
http://www2.ocn.ne.jp/~inu_inu/kai/pc9821.htm#PC98AThttp://darudarudan.syuriken.jp/kai/pc9821.htm#PC98AT

…ただし、非常に古い(8086/V30)PC-9801 の場合、int 10h はプリンタ割り込み用の PIC ハンドラのコードが実装されており、何も考えずに実行すると別の割り込みを取りこぼす可能性がある。うーん、メモリ内容で判定するしかないかな…。

(20160406補足) fdformat のブートセクタで、ためしに int 1Ah AH=0 による判定を使ってみた。IBM PC だと CX:DX にインターバルタイマのカウントが入るが PC-98 だと CMT BIOS でかつ「何もしない」らしい。

他の方法(FM-R 系の判定も含めて)

  • I/O ポートを読む
  • メモリ(ROM 領域、割り込みベクタやワークエリアの RAM)の値を調べる

など。 FM-R 系は上述の int 10h が使えないようなので事前に判定して弾いておく。

メモリ内容による判定 (ROM, 割り込みベクタ) http://tamaneko.world.coocan.jp/bbs/wforum.cgi?mode=allread&fsize=&no=4628#4638
メモリ内容 (BIOS作業域) http://elm-chan.org/works/pgal/report.html
I/O ポート http://read.pudn.com/downloads2/sourcecode/embed/5144/SRC/NOINT.C__.htm
master.lib のソースだと確か ROM 領域を読んで FM-R 系を事前に判定してた気がする…

その他メモ:

Borland C++ 5.0 日本語版のランタイムソースでは、PC-98/IBM の判別に int 1Ah, AH=04h を使い、CMOS RTC が19世紀か20世紀なら IBM PC 系と判別していた(例:SOURCE\RTL\SOURCE\CONIO\COMMON16\CONIOINI.CAS)。その後、21世紀に対応した修正版が出たかどうかは知らない。

CWSDPMIではROM領域のメモリ内容を読んでPC-98か否かを判定している (control.c)

  if(*(word16 far *)MK_FP(0xf000, 0xfff3) == 0xfd80) {
    hard_slave_lo = 0x10;		/* PC98 slave */
    mtype = PC98;
  }