トホホな疑問(63) FreeDOS、DOS/4GW上のDPMIバージョン知りて~

Joseph Halfmoon

前回OpenWatcom Cコンパイラを使って、FreeDOSのプロンプトから起動できる「プロテクト・モード」プログラムを作成してみました。お手軽。ツールが自動でDPMIサーバをオブジェクトに組み込んでくれているみたい。さて、DPMIといってもどんなバージョンが組み込まれているの?APIでご本人に問いかけてみます。

※「トホホな疑問」投稿順Indexはこちら

※当方、テストに使っているFreeDOS環境は現物ではありませぬ。屋上屋を重ねた以下のような「仮想なやつ」っす。

    1. Windows 11 (64 bit) のパソコン上の
    2. WSL2上の
    3. Ubuntu 24.04オペレーティングシステム上の
    4. QEMUエミュレータ(x86_64のシステムモード)上の
    5. 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, &regs, &regs );
    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);
}
実行結果

上記プログラムをビルドして実行した結果が以下に。dpmiVer

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だと分かって動いているみたいだし。

トホホな疑問(62) FreeDOSのプログラムがプロテクトモードで走っているの確認して~ へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です