MS−DOSはインテルCPUの優位を決定したすばらしいOSでしたが、日本ではNECが 採用することにより急速に広まりました。IBMとは全く違うハードを有するNECのPCシリーズ にMS−DOSが搭載されたのは IO.SYS というハードの違いを吸収するしくみがあった為です。
OSがハードウェアを吸収するしくみを作っても、ユーザは使い勝手を求めるので、ソフトベンダーも その方向に走ってしまい。結局はハードウェアを選ぶソフトが出来てしまいます。 これは使い勝手を優先するあげく、システムROM内のBIOSルーチンを直接呼ぶのが一般的に なってしまった事が原因しています。最も多く用いられたのは画面のカーソル移動などの表示関係です。 結果的に日本ではNECのPC−9801シリーズの独占状態となり、IBMで動作するソフトは入手が困難な状態になりました。
NECの天下は長く続きましたが、ついに終わりの時がやってきました。NECがハイレゾに対して高付加価値をつけている 間にDOS/Vと呼ばれるMS−DOSのバージョンアップで画面を大きくしてIBM系が攻勢をかけてきたのです。 結果としてNECは競争力を失いました。IBM,コンパック,DELLなどのDOS/Vマシンがシェアを急拡大し、 ソフトも多く出回るようになりました。
同じMS−DOSマシンでありながら違うソフトしか実行できない事をふびんに思った私は、どちらのマシンでも動作する
実行形式を作成する為のライブラリを製作しました。動作の詳細は以下の通りです
・プログラムの最初の部分で、IBMにしかないシステムコールを実行し、AHレジスタが変化したかどうかでフラグをセットする。
// NEC or IBM 機種判別 union REGS unionRegsIn; // レジスタ共用体 union REGS unionRegsOut; // レジスタ共用体 int iIsIbm = 0; // 0:NEC PC-9801 ,1:IBM DOS/V int iIbmVideoMode = 0; // IBMビデオモード unionRegsIn.h.ah = 0x0F; // IBMBIOSビデオモード読み込み int86( 0x10 , &unionRegsIn , &unionRegsOut ); if( unionRegsOut.h.ah != 0x0F ){ iIsIbm = 1; iIbmVideoMode = unionRegsOut.h.al; // 現在のビデオモード番号 } |
・セットされたフラグにより実行されるシステムコールを動的に変更する。
// キーボ−ドバッファにデータがあるかチェックする関数 int funcCheckKeyboardBuffer(void) { union REGS unionRegsIn; // レジスタ共用体 union REGS unionRegsOut; // レジスタ共用体 if( iIsIbm ){ // IBMの処理 unionRegsIn.h.ah = 0x11; int86( 0x16 , &unionRegsIn , &unionRegsOut ); // 入力状況 if( unionRegsOut.x.flags & 0x40 ) return 0; // Z=1でバッファが空 else return 1; } else{ // NECの処理 unionRegsIn.h.ah = 0x01; int86( 0x18 , &unionRegsIn , &unionRegsOut ); // 入力状況 if( unionRegsOut.h.bh == 0 ) return 0; // BH=0でバッファが空 else return 1; } } |
これだけで、NEC,DOS/Vの両方で動作する実行形式ファイルが作成できました。 両方の動作コードを含むのでオーバヘッドと思われがちですが、実際にはシステムコールがほとんど仕事をしてくれるので、 サイズはほとんど変わらなかった覚えがあります。今回のWinuxプロジェクトはこの時の経験を生かしたものといえます。
私は上記の方法でNEC,DOS/Vの両方で動作するプログラムを多数開発しましたが、機種の混在する私のofficeでは非常に重宝しました。
ただ本当の成果はPC−9801が完全に消えた現在思い知る事になりました。 PC−9801を使ったシステムのクレームで出張したときの事です。 どうもPC−9801の調子が悪いらしく、ハード交換しようにも交換する物がないのです。 導入当時は周辺にPC−9801が多数ありましたが、今はすべてDOS/V互換のWindowsパソコンに置き換わっています。 その時、私はPC−9801に入っていた実行形式ファイルをそのままWindowsパソコンにコピーし、DOS窓で実行させる事で、その場を切り抜けることができたのです。
うわべだけを見て価値を判断する人がいますが、(自分の思想を通す為の作戦かもしれないが)
「本当の価値というものは窮地に追い込まれてはじめて分かるものだ」
という事を勉強したと思います。