「はじめて読む486」の実行環境を、FreeDOS+QEMU+OpenWatcomでつくる

最近(でもない?)「32ビットコンピュータをやさしく語る はじめて読む486 (アスキー書籍)」が電子書籍化されていたので、これを機会にとKindleで読み始めました。

他の作業の隙間ではありますが、現状で4割くらい読み進めています。評判のとおり、非常にわかりやすくx86 CPU がどのようにモダンなOSの機能(特にプロテクトモード)をサポートしていくかが理解できます。この段階でリアルモードで実行できるサンプルのCコードなどが掲載されています。

掲載されているコード自体を読むだけでも勉強になっていいのですが、せっかくなので動かして気になったところを自分でいじったりしてみたい。と思っていたところ、ありがたいことに、作者様自身が現代のPC環境でも実行できるように、サンプルコードの改修版と実行環境の情報を公開されているのを発見しました。(神か…)

github.com

ここで紹介されている以下のツールを使って、Winddows 10 上で環境を作成しました。この記事はその作業メモになります。

※なお、自分で構築しなくても上記サンプル置き場サイトのリンクから構築済みの環境を入手することもできます。

適当な実機も手元にないので、FreeDOS用にVM環境を用意することにしました。別記事でも使っているVirtualBoxは手軽でよいのですが割と不安定で、気になっていたQEMUをこの機会に使ってみたいと思います。

QEMUFreeDOSを動作させるのは、こちらの記事が非常に参考になりました。

blog.tiqwab.com

むしろWindowsをホストにしなければ、こちらの記事を参考にされるとよいと思います。環境を作成する目的もまったく同じですし。素晴らしい記事です。


FreeDOSQEMUにインストールする

ここは上記の参考にさせていただいた記事と内容はまったく一緒ですので、そちらを参考にしていただくのがよいと思います。一応プロンプト版で手順だけ簡単に載せておきます。

1. QEMUのダウンロード

Download QEMU - QEMU から環境にあったWindowsインストーラーを入手して、インストールします。

2. FreeDOSをダウンロード

FreeDOS | The FreeDOS Project から「CDROM “standard” installer」をダウンロードしておきます。このとき、QEMUを立ち上げるためのWorking Directoryなどを作成して、そちらに移しておくとよいです。

3. QEMUFreeDOSをインストール

ここでは、ひとつ前の手順で作成したWorking Directoryで作業するものとします。

ハードディスクイメージを作成します。元記事では100MBですが、後でWatcom DOSインストーラを入れて実行するので、200MBにしています。

C:\>qemu-img create -f raw freedos.img 200M

続いてインストールディスクをCDROMにマウントして起動します。

C:\>qemu-system-x86_64 -cpu 486 -rtc base=localtime -drive file=freedos.img,format=raw -cdrom FD12CD.iso -boot d

あとはFreeDOSのUIに従ってインストールを進めることで完了できます。詳細については元記事も参考になると思います。

OpenWatcom for DOSFreeDOS上でセットアップする

1. FreeDOSディスクイメージへのマウント

元記事では環境構築にあたって、ループバックデバイスを用いたマウントで必要なものをFreeDOS側に入れていますが、ここではホストがWindowsですので、同じ操作はできません。なので、別の方法でRaw仮想ディスクイメージにマウントします。

仮想ディスクマウントツールとして、PassMark Software の OSFMount を利用します。OSFMount - Mount Disk Images & Create RAM Drives からダウンロードしてインストールします。

参考: 3 Ways to Mount a RAW Image in Windows

起動すると、以下のような画面が表示されるので、「Mount new...」を選択します。

f:id:tomoyukim:20191018115832p:plain
OSFMount

マウントするターゲットファイルを選択します。先ほどFreeDOSをインストールしたRawイメージファイルを選択して、「Next」を選択します。

f:id:tomoyukim:20191018120157p:plain
OSFMount: select image

マウントするパーティションを選択します。FreeDOSインストールの際にパーティションを分割していなければ1つだけが表示されていると思うので、そちらを選択します。

f:id:tomoyukim:20191018120409p:plain
OSFMount: select partition

最後にマウントオプションから「Read-only drive」のチェックを外して「Mount」を選択します。

マウントに成功すると、最初のOSFMount画面にマウントしたイメージがボリュームとして表示されます。またエクスプローラーからもボリュームとして見えるようになります。

これで、Watcom のインストーラやサンプルコードのコピーができる状態にできました。

2. Watcom DOSのインストール

Open Watcom から「Installer for C/C++」のDOS向けインストーラをダウンロードします。(2019/10/18 現在のVersionは1.9なので、open-watcom-c-dos-1.9.exe)

そして、最初に紹介したGitHub - tkmc/486: 『はじめて読む486』のサンプルプログラム集です。 からコード一式をcloneし、それぞれをマウントしたディスクにコピーします。

コピーが完了したら、OFSMountでマウントを解除します。そして再びQEMUFreeDOSを起動します。 先ほどコピーしたopen-watcom-c-dos-1.9.exeが見えているのが確認できますね。これを実行します。

f:id:tomoyukim:20191018124256p:plain
FreeDOS: install OpenWatcom

あとはインストーラの手順通りです。ホストもターゲットもDOSになっているはずですが、違った場合は変えておきます。16bitコンパイラを含むのも忘れずに。インストールが完了すると、CONFIGやAUTOEXEについて聞かれますが、もし起動時にコンパイラを使えるようにしたい場合は作成しておいてよいと思います。自分はコンパイル用に作成しているつもりなので、作成しました。

コンパイルして、実行

ここまでで環境構築は完了したので、実際にコンパイルと実行ができるか試してみます。

サンプル集のGithubに掲載されているリンクに、OpenWatcomでサンプルコードをビルドする方法について記載されていましたので、その手順を実行してみます。

『はじめて読む486』のサンプルを OpenWatcom でビルドする · GitHub

アセンブル

f:id:tomoyukim:20191018125952p:plain
OpenWatcom: wasm

コンパイル、リンク

f:id:tomoyukim:20191018130025p:plain
OpenWatcom: wcl

すべてうまくいけば、実行ファイルができます。これでサンプルの実行ができました。

f:id:tomoyukim:20191018130458p:plain
FreeDOS: exe

さいごに

以上で「はじめて読む486」の実行環境をWindows 10ホスト上に構築することができました。こちらで紹介させていただいた記事でほとんどのことはできると思いますが、この記事ではWindowsで構築するために、自分が実施した仮想イメージマウントの方法を紹介しました。

また、今後起動を簡単にするために、起動コマンドをBATファイルにしてWorking Directoryに置いておくとよいかもしれません。

@rem freedom.bat
qemu-system-x86_64 -cpu 486 -rtc base=localtime -drive file=freedos.img,format=raw