
前回OpenWatcom Cコンパイラを使って、FreeDOSのプロンプトから起動できる「プロテクト・モード」プログラムを作成してみました。お手軽。ツールが自動でDPMIサーバをオブジェクトに組み込んでくれているみたい。さて、DPMIといってもどんなバージョンが組み込まれているの?APIでご本人に問いかけてみます。
※「トホホな疑問」投稿順Indexはこちら
※当方、テストに使っているFreeDOS環境は現物ではありませぬ。屋上屋を重ねた以下のような「仮想なやつ」っす。
-
- Windows 11 (64 bit) のパソコン上の
- WSL2上の
- Ubuntu 24.04オペレーティングシステム上の
- QEMUエミュレータ(x86_64のシステムモード)上の
- FreeDOS 1.3
OpenWatcom C コンパイラの使いわけ
FreeDOS上のコマンドプロンプトから起動できるプログラムの作成ですが、16bitのプログラムと、DOSエクステンダ上の32bitプログラムのコンパイルではコマンドライン(コンパイラドライバ)が異なります。
-
- 16ビットのDOSアプリケーションの場合
wcl /l=dos なんたら.c
-
- 32ビットのDOS/4GWアプリケーションの場合
wcl386 /l=dos4g ホニャララ.c
見た目クリソツなソースでも、コンパイラとスイッチ一つでどちらの環境にも生成できるっと。お手軽デス。
そして生成された実行ファイルには密かに「プロテクトモードのランタイム」が組み込まれており、後者の場合、DPMIのAPIを使ってプロテクトモードのナンヤカンヤをお願いすることができるみたいデス。
とりあえずDPMIのAPI呼び出し、やってみて~。ついでに組み込まれているDPMIサーバのバージョンを知りて~。
素人老人が簡単なプログラムを作成してみました。
DPMIバージョンを知るためのプログラム
テキトーにAPI呼び出しのみをコーディングしたものが以下に。PICの設定なども返ってくるのですが、メンドイので無視。
#include <stdio.h> #include <i86.h> void main() { union REGS regs; regs.w.ax = 0x0400; int386( 0x31, ®s, ®s ); printf("DPMI Major version: %02x\n", regs.h.ah); printf("DPMI Minor version: %02x\n", regs.h.al); printf("DPMI Flags : %04x\n", regs.w.bx); printf("DPMI Processor : %02x\n", regs.h.cl); }
実行結果
Majorバージョンに0が返ってきてますが、DPMI 0.9の場合は、AHには0が返るということで良いみたい。なにやら DPMIの場合、1.0になる前に 0.9(いろいろ不足していた) で普及してしまった(1.0待たずに各社不足部分は御勝手実装した?)らしいので、0.9はフツーなのかな。知らんけど。
また、マイナーバージョンは0x5aっすけど、やはりDPMI 0.9の場合はこの数字で良いみたいです。
FLAGSの1ビット立っているところは 32bit DPMI(80386以降で動いている)であることを示し、仮想記憶なし。といっても仮想記憶の方はV86モードとEMMとVCPIを支配しているJEMMEXの方が仕切っているのだと想像。
プロセッサタイプの0x0fは、実在するチップのタイプでなく、他のものを指すみたい。今回はQEMUを示しているのか?まあ、FreeDOSもQEMUだと分かって動いているみたいだし。