ソフトな忘却力(55) FreeDOS、DOS4GW、32ビット・オブジェクトを実行

Joseph Halfmoon

MS-DOS互換の「魔改造OS」FreeDOSを、Armコアのラズパイ4上でCPUエミュレータQEMU使って動かしてます。前回はMS-DOSのメンドイ・メモリ管理と互換性があることを見てきました。今回は「推し」のDOSイクステンダ、DOS4GWを使って「フラットでリニアな」メモリ空間が使えることを確かめてみます。

※「 ソフトな忘却力」投稿順 Index はこちら

※実機動作確認には以下を使用しております。

    •  Raspberry Pi 4 model B、Cortex-A72コア(ARMv8-A)
    •  Raspberry Pi OS (64bit) bullseye
    •  QEMU 5.2.0
    •  FreeDOS 1.3
DOSイクステンダ

DOSイクステンダは、1Mバイトのメモリ空間に束縛されているMS-DOSで、1Mバイトを超える大きなプログラムを走らせるためのプログラムです。物理的には80286であれば16Mバイト、80386以降(64ビット機以前)であれば4Gバイトの主記憶空間にアクセスできるので、これを使いて~ということで開発されたプログラムだと思います。IBM-PC/AT互換機の世界ではそれなりのプレゼンスがあったと思うのですが、日本独自仕様のPCではあまり普及しなかったような気がします。日本製PCで唯一ともいえるDOSイクステンダに頼った機種が、

富士通 FM-TOWNS

です。FM-TOWNSは、当時まだ出始めだったCD-ROMを前面に打ち出し、500Mバイトを超える容量のプログラムデータと、80386のプロテクトモードを活用した「フラットでリニアで巨大な」メモリ空間でプログラムを走らせられるのが売りでした。まあ、主目的はグラフィック使ったゲームね。

なお、前にもどこかに書いたけど、FM-TOWNSのTOWNSは、レーザーの研究でノーベル賞をとられたTOWNS先生のお名前からとったのだ、と当時の富士通の偉い人から直々に聞きました。「TOWNSって誰?」などと言って、「TOWNS知らんのか」と怒られたのですが。。。(CD-ROMが実用化できたのはレーザーのお陰です。念のため。)

さて、FM-TOWNSが搭載していたDOSイクステンダは当時一番人気のPharLap社製でした。DOS上では

RUN386 <DOSイクステンダ用のプログラム名>

などとやって動作させていたハズ。RUN386がPharLap製DOSイクステンダです。

一方、FreeDOSでは、「DOSイクステンダ」といっても上記とは異なる DOS4GWというプログラムが「推し」になっています。多分FreeDOS環境にRUN386を持ち込んでも動作するとは思います。知らんけど。FreeDOSの「推し」の開発環境であるOpenWatcom C/C++コンパイラがDOS4GWに依存しているので、OpenWatcomをインストールすれば自然とDOS4GWが使えるようになります。なお、OpenWatcomはスイッチでPharLap用のオブジェクトも生成できるようです。確かめてないケド。

386用のオブジェクトコードの生成

さて、C言語で386の「フラットでリニアな」空間を享受しようとする場合、ソースを改造するようなメンドイことは不要なようです。第48回で作成した吉例 Hello world.のプログラムなど、コンパイルしなおすだけでOKです。

まずはDOS4GW付属の PMINFO というツールで使えるメモリ空間など確認しておきます。こんな感じ。PMINFO

前回実行した FreeDOSのMEMプログラムと表示される容量が異なりますが、ソフトにより見え方が異なる?みたい。まあともかく60MバイトくらいのExtended memoryが使えるように見えているです。

ただし、とんでもない速度が報告されているのは御愛嬌かと。CPUエミュレータQEMU上でx86コードをソフトウエアでエミュレーションしている(実体はArm)ので、そんな速度が出るハズありませぬ。なにか数字のマジックじゃろ、と。

さて、DOS4GW用にコンパイルする場合は以下です(なお、16bit版のプログラムとハッキリ識別できるようにソース名をhello2.cにしてあります。)

> wcl386 /l=dos4g hello2.c

コンパイルの様子が以下に。wcl386

上記により、以下の実行可能ファイルとオブジェクトファイルが生成されます。

    • HELLO2.EXE
    • HELLO2.OBJ

PharLap版だと .EXPという拡張子になる筈なので簡単に判別できるのですが、こちらで生成されるのは .EXE なので16ビットのEXEと見分けがつきませぬ(実際にはEXE内部でDOS4GWを勝手に立ち上げて、32ビット処理してくれるのでお楽。)

念のため wdis ディスアセンブラで逆アセンブルしてみるとこんな感じ。wdisHello

赤枠のようにUSE32(32ビット)属性が付加されており、赤下線などみるとちゃんと32ビット命令が生成されていることが明らかです。

これをFreeDOSのコマンドラインから走らせると以下のようです。DOS4GW_HELLO

DOS4GW上で動作しておるようです。なお、環境変数をセットするとDOS4GWが動くたびに出力されるグリーティングメッセージをサプレスすることもできるみたい。こちらは分かった方が良いのでしないけど。

FreeDOS上では、呼吸をするように「リニアでフラットな」空間が使えると。

ソフトな忘却力(54) FreeDOS、MS-DOSを継承するメモリ管理のあれこれ へ戻る

ソフトな忘却力(56) FreeDOS、WSL2上のUbuntu24.04 LTSで実行 へ進む