30 年前(1994年)に「はじめて読む486」という本(リンクは Amazon です)が出版されました。
Intel 486 CPU とオペレーティングシステムの関係を、C 言語と少しのアセンブリ言語で示しながら1から分かりやすく解説している本です。
Intel 486 CPU は現在の Intel core シリーズの CPU の基礎(x86アーキテクチャの基礎)となった CPU ですので、Intel 486 CPU を学べば、現在の CPU の基礎を学んだことになります。
同書にはサポートサイトがあり、この本の17個のサンプルプログラムが提供されています。
サポートサイトでは現代の Windows 10、11 などの最新の OS 上で動かす方法も案内されています。
大変ありがたいです。
しかし、サポートサイトの案内の通りに環境を作ってもすべてのサンプルプログラムを動かすことができない状況なのです。(下表)
<> (動作確認表1) VirtualBox + FreeDOS 1.3 + OpenWatcom 1.9
# | 同書 | ファイル名 | 動作可否(BIN\AT) | 動作可否(SOURCE) |
---|---|---|---|---|
1 | P31 | SIEVE_C.EXE | (.exe ファイルの提供なし) | ○ |
2 | P113 | TESTPROT.EXE | ○ | ○ |
3 | P135 | RMSEG.EXE | ○ | ○ |
4 | P162 | PMSEG.EXE | ○ | ○ |
5 | P175 | PUTPMEM.EXE | ○ | ○ |
6 | P175 | GETPMEM.EXE | ○ | ○ |
7 | P187 | SIEVE32.EXE | ○ | ○ |
8 | P213 | TESTGATE.EXE | × !without CLTS !FreeDOS 0xFD | × !without CLTS !FreeDOS 0xFD |
9 | P254 | HARDINT.EXE | ○ | × !WASM |
10 | P258 | FAULT.EXE | ○ | ○ |
11 | P291 | TESTTASK.EXE | × !without CLTS !FreeDOS 0xFD | × !without CLTS !WASM !STACK |
12 | P333 | VSIEVE.EXE | ○ | ○ |
13 | P399 | INTMON.EXE | × !without CLTS !FreeDOS 0xFD | × !without CLTS !WASM |
14 | P423 | DPMIINFO.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
15 | P428 | DPMISIEV.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
16 | P446 | REVFILE.EXE | ○ | ○ |
17 | P451 | IOMON.EXE | × !without CLTS !FreeDOS 0xFD | × !without CLTS !WASM |
○で示したものは動作するものです。×は動作中にシステムが停止したり、エラーメッセージを出して終了します。
カラフルなマークは、抱えている問題を模式的に表したものです。
時代の変化と、過去の環境を再現するのが難しいことなどが原因で、上表のようにいくつかのサンプルプログラムは動作しません。
そこで、いろいろ調査を行って、すべてのサンプルプログラムを動かす方法を見つけましたので、ここに紹介したいと思います。
サンプルプログラムが動かないことについては、サポートサイトで解決して頂くのがベスト(知識が足りない私よりも良いアプロ―チがあると思う)ですが、解決されるまでのあいだは私のこのページを参考にしていただければと思います。
…実は Yahoo 知恵袋で、「IT 業界では分かりやすい書籍が少ない」という内容のご質問を受けて、それなら「はじめて読む486」がおすすめだと私が回答したのですが、サンプルプログラムが一部動かないことが気になってしまい、このページの作成に踏み切った、というところもあります。
以降で説明している手順は だいぶ長い のですが、説明を省くことなく分かりやすく説明しました。
このページの最後まで説明の通りの作業を行って、そのとき初めて完全な状態のサンプル実行環境が整います。
手順を追った動画もあります。
(ただし、VirtualBox はバージョンアップ前の 7.0.20 を使用しています。おおむね同じですが、多少の差異があります)
動画は 33 個あり、すべての作業を収めています。
その 33 個の合計時間は、1 時間 33 分です。
何も問題が起こらなければ、少なくともそれだけの時間がかかると考えてください。
(説明を読んで分からない場合に動画を参考にする、という使い方のために用意した動画です。綺麗な動画ではありません)
初心者から上級者まで誰でも実践できる内容だと思います。さっそく始めましょう!
2024年 4月 2日 作成
2024年 8月 16日 全体を作り直し
2024年10月26日 Oracle VirtualBox のバージョンアップ(7.0.20 → 7.1.4)に対応しました。(図を新しいものに更新)
通常の「スラッシュ」は、右上から左下へ線が引かれたような記号 / です。
そして、「バック・スラッシュ 」と呼ばれる記号は、スラッシュとは逆向きの記号\です。
「バック・スラッシュ」\は、古くからフォルダとフォルダのあいだの区切り文字として使われてきました。
しかし、欧米と日本との「文字コード」(コンピューター内で文字を扱う際に各文字に振られた番号)の相違の関係で、欧米フォントの「バック・スラッシュ」は、日本語フォントでは¥記号が相当しています。
そのため、日本では、フォルダとフォルダのあいだの区切り文字は¥記号となっています。
以降の説明では、スクリーンショットの画面上では\になっているけど、説明文では¥記号で表記しています。
また、仮想マシンで\を入力するためには、日本語キーボード上では「¥」キーを押します。
あらかじめご了承ください。
サポートサイトで提供されているサンプルプログラム集「486-master.zip」内には、「IBM PC/AT 互換機用」(BIN\AT)と、「PC-9801 用」(BIN\98)の2種類があります。
「IBM PC/AT 互換機」は海外から入ってきた、いわゆる Windows PC です。
「PC-9801」はそれが入ってくる前に日本で 95% くらいのトップシェアを誇っていた、かつての人気パソコンです。
このページでは基本的に 「IBM PC/AT 互換機用」(BIN\AT)を前提にして説明しています。
「PC-9801用」の .exe ファイルを実行したり、.c や .asm ファイルをコンパイル、アセンブルするためには、PC-9801 用の「DOS」(OS)がまず必要になります。
無料の DOS である『FreeDOS』に PC-9801 用は一応ありますが開発が止まっているようです。
ちょっと使ってみたところ、実用するにはちょっと難しい感じがしました。
そのため基本的には「PC-9801用 MS-DOS」をオークションなどで購入する必要があると思います。
また、PC-9801 には無料のコンパイラやアセンブラがありません。
(「LSI-C86 試食版」という無料のコンパイラがありますが、同書サポートサイトでちょっと言及されている通り、少し手間がかかるようです)
そのため、「PC-9801用 Borland C++ 3.1 以上」、「PC-9801用 Borland Turbo Assember 3.2 以上」もオークションなどで購入しなければなりません。
結局、PC-9801 のためには、以下のものを用意する必要があります。
なお、PC-9801 用の .exe 形式のサンプルプログラムは、「Neko Project II」(98エミュレータ)+「MS-DOS 3.3D」の環境で、すべて正常に動作できました。
MS-DOS も PC-DOS も、同じ Intel x86 CPU 上で動くものなので、「PC-DOS でコンパイルした実行ファイルは、MS-DOS でも使える…」ということも多いです。
そこで、『FreeDOS 上でオプション "-DPC98" を付けてコンパイルして作った .exe を、PC-9801 エミュレーターへ持っていけば動作するんじゃないか…』と思ってやってみました。
しかし、PC-9801 独自の C 言語命令を使っているようで、コンパイルの時点でエラーが出て .exe は作成できませんでした。
やはり PC-9801 では、競売で上記3つともそろえる必要があるようです。
ところで、PC-9801 ユーザー(レトロPCユーザー)の方でも以降の説明の手順に従えば 486 CPU について学ぶことができます。
486 CPU を学ぶために PC-9801 にこだわる必要はないのではと思います。
私も もともとは PC-9801 ユーザー100%(30年以上前)でしたが、今回のことがきっかけで PC/AT互換機も身近になってしまいました。
すべてのサンプルプログラムを動かすための要点を先に示します。
問題が複数(4つ)あるので、問題ごとに『!FreeDOS 0xFD』のような名前を付けて管理します。
下表「◎」は入手可能を確認できているものです。
用途 | ソフトウェア | Win | mac | Linux |
---|---|---|---|---|
仮想マシン作成 | VirtualBox (CPU に Vt-x または AMD-V などの仮想化技術が搭載されていることと、その有効化が必要です) |
◎ | ◎ | ◎ |
ディスクイメージファイルへアクセス | DiskExplorer | ◎ | ▲ | ▲ |
.lzh 形式解凍 | +Lhaca | ◎ | ▲ | ▲ |
DOS | FreeDOS 1.3 | ○ | ○ | ○ |
コンパイル/アセンブル | OpenWatcom 1.9 DOS版 | ○ | ○ | ○ |
アセンブル | Microsoft Macro Assembler(MASM)5.10 | ○ | ○ | ○ |
基本的に Windows で説明しているので、使用するソフトウェアも Windows 用です。
どれも一般的なソフトウェアなので、他の OS でも同様のソフトウェアは手に入ると思います。(▲印)
なお、DOS と、コンパイル/アセンブルのソフトウェアは、すべて仮想マシン上で動作するものなので、仮想マシン作成ソフトさえあれば、OSの種類(ホスト OSの種類)は問いません。(○印)
※「ホスト OS」とは VirtualBox などを動かすパソコンのこと、つまり目の前のパソコンのことを言います。また、VirtualBox などで作成された仮想マシンの中で動く OS のことを「ゲスト OS」と呼びます。
↓↓↓ ここからが作業開始です。
この作業の動画(動画 1 本目、1分41秒、8MB)
ここでは!FreeDOS 0xFDの問題について作業します。
この左のバーの色 も合わせてありますので目印にしてください。
このバーが終了したとき、この作業の終了を意味します。
FreeDOS のダウンロードページにアクセスします。
すると左上図のようなページが表示されます。(2024年7月5日現在)
左上図赤枠の中の LiveCD というボタンを押します。
するとダウンロードが始まります。
FD13-LiveCD.zip(374MB)
ダウンロードしたら、
右クリック>すべて展開... しておきます。
FreeDOS 1.3 LiveCD を使って FreeDOS のインストールは行いません。
この2点のためだけに使用します。
…次に Oracle VirtualBox を用意します。
この作業の動画(動画 2 本目、3分34秒、79MB)
VirtualBox のページにアクセスします。
https://www.virtualbox.org/wiki/Downloads
すると左上図のようなページが表示されます。(2024年10月26日現在)
Windows と macOS、Linux など主要な OS はカバーされています。
host とは、エミュレーターを動かす OS のことです。
エミュレーターの中の OS のことを guest と呼びます。
上図の赤枠から、自分のパソコンの OS のリンクをクリックします。
するとダウンロードが始まります。
Windows の場合は、VirtualBox-7.1.4-165100-Win.exe(105MB)
VirtualBox-7.1.4-165100-Win.exe をダブルクリックすると、「ユーザー アカウント制御」の画面が表示されます。
正規のページからダウンロードしていることと、表示されているアプリの名称や発行元を確認して、「はい」ボタンを押します。
『ようこそ、Oracle VM VirtualBox をインストールします』
…と書かれています。
「Next >」ボタンを押します。
『以下のライセンス同意事項を注意して読んでください』
…と書かれています。
I accept the terms in the License Agreement
(ライセンス契約の条件に同意します)
を選んでから、「Next >」ボタンを押します。
『何をインストールするのか、どこにインストールするのか』
…と聞かれています。
基本的に変更の必要はありません。
「Next >」ボタンを押します。
『一時的にネットワークが切断される』
…と書かれています。(詳細な翻訳は下記です)
だいたいは「Yes」で問題ありません。
警告:
ネットワーク インターフェイス
Oracle VM VirtualBox 7.1.4 のネットワーク機能をインストールすると、ネットワーク接続がリセットされ、一時的にネットワークから切断されます。
今すぐインストールを続行しますか?
『Python を使って VirtualBox を操作したい場合は、Python とその拡張モジュールをインストールする必要がある』
…と書かれています。(詳細な翻訳は下記です)
ここではその必要は無いので、そのまま「Yes」ボタンを押します。
依存関係が不足しています
Python Core / win32api
Oracle VM VirtualBox 7.1.4 Python バインディングをインストールするには、まず Python Core パッケージと win32api バインディングをインストールする必要があります。
Oracle VM VirtualBox 7.1.4 Python バインディングのインストールを続行する場合、後で手動で設定する必要があります。詳細については、Oracle VM VirtualBox 7.1.4 SDK マニュアルを参照してください。
今すぐインストールを続行しますか?
『オプションを選択してください』
スタートメニューに登録
デスクトップにショートカットを作成
クイックランチバーにショートカットを作成
ファイルの関連付け
…と書かれています。
そのままでも特に問題はありません。
「Next >」ボタンを押します。
『インストールの準備が出来ました』
…と書かれています。(詳細な翻訳は下記です)
問題なければ、「Install」ボタンを押します。
すると、早ければ 30 秒程度でインストールが終わります。
『インストールが完了しました。「Finish」ボタンを押して終了してください』
…と書かれています。
Start Oracle VirtualBox ... のチェックは、この後すぐに起動して作業するのでチェックは入れます。
「Finish」ボタンを押します。
この作業の動画(動画 3 本目、2分34秒、53MB)
VirtualBox を起動すると左上図のように、「VirtualBox マネージャー」画面が表示されます。
「新規(N)」アイコン(左上図赤枠)をクリックします。
「仮想マシンの作成」ウィンドウが表示されます。
名前(N): | 名前(N) はフォルダ名にもなります。 記入してください。 ここでは、vm486 にしましょう。 |
フォルダー(F): | そのままで良いです。 |
ISO イメージ(I): | FreeDOS 1.3 の LiveCD を指定します。 ダウンロードフォルダで展開してできたフォルダ FD13-LiveCD の中に FD13LIVE.iso というファイルがあるので、それを指定してください。 たとえば、 C:\Users\<ユーザー名>\Downloads\FD13-LiveCD\FD13LIVE.iso です。 |
エディション(E): | ※ ここはグレーアウトしています。 |
タイプ(T): | Other を選びます。 |
バージョン(V): | DOS を選びます。 |
上記設定をすべて行うと左上図のようになると思います。
青色の > ハードウェア(A) のバーをクリックして開きます。
LiveCD はディスク上ではなくメモリ上にシステムを構築して起動するものです。
メインメモリー(M) は、32MB だと少なくて起動できないので、余裕を見て 256MB にします。
スライダを動かすか、右端の入力欄に「256MB」 と記入してください。
次に、下の > ハードディスク(K) のバーをクリックして開きます。
仮想ハードディスクは余裕を見て 1.00GB にしましょう。
「完了(F)」ボタンを押します。
すると左上図のような画面が表示されます。
これは作成した仮想マシンの管理を行う画面です。
以上で仮想マシンを作成できました。
以降は以下の手順を踏みます。
ここで言う「ハードディスク」とは、実際のハードディスクではなく、「仮想ハードディスク」(ハードディスクイメージファイル)のことです。
実際のハードディスクのパーティションを切ったり、フォーマットしたりはしないので安心してください。
この作業の動画(動画 4 本目、1分38秒、7MB)
仮想マシンを作成すると、VirtualBox マネージャーの画面が左上図のようになります。
FreeDOS 1.3 LiveCD が光学ドライブ(CD, DVDドライブ)にセットされている状態です。
「起動(T)」(左上図赤枠)ボタンを押します。
しばらくすると、別ウィンドウが開き、その中で VirtualBox の仮想マシンが動き始めます。
そして、FreeDOS 1.3 LiveCD の青い Welcome 画面が表示されます。
左上図の下の赤枠を見ると、自動起動するためにカウントダウンされてますが、↑↓ボタンを押せばカウントダウンは解除されます。
上の赤枠「Use FreeDOS 1.3 in Live Environment mode」を選択した状態で、Enter キーを押します。(この翻訳は下記)
FreeDOS 1.3 をライブ環境モードで使用する
VirtualBox を使用する上で基本的で、なおかつ 重要 な操作があるので、ここで覚えておきましょう。
試しに仮想マシンの画面をクリックしてください。
もし、左上図のように、画面の右側に灰色の領域があるときは、そこではなく、青枠の領域をクリックしてください。
すると、左上図のような画面で、
… という状態になってしまいます。
このとき、、
キーボードの右側の CTRL キーを押してください。
元に戻り、Windows 全体で使えるようになります。
この操作は VirtualBox を使用する上で基本的で、なおかつ重要な操作ですので、よく覚えておいてください。
仮想マシンを作成するソフトウェアでは、1つの画面上でホストとゲストの2つの OS が同時動作する性格上、このような何らかの特殊な(不可解な)対応が行われています。
(なお、「右側の CTRL キー」は VirtualBox で「ホストキー」と呼ばれていますが、設定で別のキーに変更できます)
…すると、FreeDOS が起動します。
画面の右側に灰色っぽいエリアが出現しています。
この灰色のエリアには、エミュレーターとしての状況が変わったことを伝えるメッセージが表示されます。
左上図では「マウス統合..」と表示されており、これをクリックすると、「マウス機能がインストールされたが、マウスの動きはこの画面へ伝わっていない。マウスを使うにはキャプチャーを行ってください」というようなメッセージが表示されます。
閉じるには「青いフキダシに "!"」のアイコン をクリックします。
上図左下の赤枠部分には、R:\>
と表示されています。(\ は画面ではバックスラッシュで表示)
DOS というものは、ここにコマンドを打ち込んで操作します。
Windows の「コマンド プロンプト」とほぼ同じ環境です。
以上で、LiveCD から FreeDOS が起動されました。
見た目、難しく感じる方もいらっしゃるかもしれませんが、説明の通りに操作していただければこれから DOS 環境を作成することができると思います。
出来なかったときはごめんなさい m(_ _)m
この作業の動画(動画 5 本目、1分49秒、5MB)
現在、FreeDOS が FreeDOS LiveCD から起動しています。
fdisk と入力します。
すると、英語でメッセージが出ます。
『2GB を超えるディスク作成を行いますか?』
と聞いています。(詳細な翻訳は下記です)
入力は [Y] で問題ないので、
そのまま Enter キーを押します。
Free FDISK は、大容量ディスク サポートを使用して、FAT32 パーティションを使用して 2,048 MB を超えるパーティションを作成できます。大容量ディスク サポートを有効にすると、512 MB を超えるパーティションまたは論理ドライブは FAT32 を使用して作成されます。
重要: 大容量ディスク サポートを有効にすると、一部のオペレーティング システムは、サイズが 512 MB を超えるパーティションおよび論理ドライブにアクセスできなくなります。
大容量ディスク (FAT32) サポートを使用しますか (Y/N)。[Y]?
画面が変わり、
『固定ディスク(ハードディスク)に対して以下から選択してください』
…と書かれています。
1. Create DOS partition or Logical DOS Drive
(パーティション作成、または論理ドライブ作成)
を行いたいので、
[1] のまま Enter キーを押します。
『固定ディスク(ハードディスク)に対して以下から選択してください』
…と書かれています。
1. Create Primary DOS Partition
(プライマリ・パーティション作成)
を行いたいので、
1 を入力して、Enter キーを押します。
『最大サイズでパーティションを作成し、それから有効化も行いますか?』
…と書かれています。
[Y] のまま Enter キーを押します。
『1000MB でパーティションを作成しました』
…と書かれています。
ESC キーを押します。
すると画面は戻ります。
『固定ディスク(ハードディスク)に対して以下から選択してください』
…と書かれています。
ESC キーを押します。
『設定は再起動後に有効となります。作成・変更したドライブはフォーマットしてから使ってください』
…と書かれています。
ESC キーを押します。
では書かれていた通り再起動、リセットしましょう。
「仮想マシン」メニューから「リセット」を選びます。
すると、
「本当にリセットしますか?」
と聞いてくるので、
「リセット」ボタンを押してください。
以上でディスクにパーティションを作成できました。
この作業の動画(動画 6 本目、1分20秒、5MB)
つづいて、LiveCD の最初の青い画面が出たら、
そのまま Enter キーを押します。
すると FreeDOS が起動します。
画面左下に R:\>
(\ は画面ではバックスラッシュで表示)と表示されたら、
format c: と入力します。
現在、英語モードなので、「c:」の : を入力するには、SHIFT + ; を押してください。
すると、英語で、
『データは消えるけどフォーマットしていいか?』
と聞かれます。(詳細な翻訳は下記です)
YES と3文字入力し、Enter キーを押します。
警告: 非リムーバブル ディスク ドライブ C: のすべてのデータが失われます。確認してください。
フォーマットを続行しますか (はい/いいえ)?
『ディスクはフォーマットされていません。ディスクサイズは 997 MB、ファイル記録方式は FAT32』
と書かれています。(詳細な翻訳は下記です)
そして、『ボリュームラベルはどうしますか?』と聞かれています。ディスクに付ける名前のことです。
無くてもいいのですが、
たとえば、VM486 と入力します。
すると、フォーマットされ、左上図のような画面になります。
クイックフォーマット (メタデータのフラッシュのみ)
警告: 不良クラスタ マークがある場合はリセットします。
FAT 領域を準備しています...
100% 完了しました。
クイックフォーマットが完了しました。
合計ディスク容量 1,023,088.5 kバイト (ディスク サイズ)
ディスクで使用可能なバイト数 1,021,060.0 バイト (空きクラスタ)
各割り当て単位に 4.0 kバイト。
ディスク上の割り当て単位数は 255,265 です。
ボリューム シリアル番号は 2072-1C19 です。
以上でディスクのフォーマットが完了しました。
これでディスクは使える状態ですが、何も入っていない空の状態なので、パソコンとしてはまだ使えません。
DOS にはパソコンの起動時にロードされる「システムファイル」があります。
いろいろな会社、組織による DOS がありますが、それぞれ…
Microsoft MS-DOS |
IO.SYS | … 機種依存する部分 |
---|---|---|
MSDOS.SYS | … 機種依存しない共通部分 | |
IBM PC-DOS |
IBMBIO.COM | … 機種依存する部分 |
IBMDOS.COM | … 機種依存しない共通部分 | |
フリーウェア FreeDOS |
KERNEL.SYS | …1つのファイルにまとまっている |
FreeDOS はいろいろな人の協力が組み合わさって完成されているソフトウェアですが、システムファイル「KERNEL.SYS」の部分は、Jeremy Davis という人がメンテナンス(維持・管理)しているようです。
「KERNEL.SYS」には以下のバージョンがあります。
公・私 | バージョン名 | Jeremy Davis 氏コメント |
---|---|---|
公的バージョン | "0xFD" | 「FreeDOS カーネル - 現在の 0xFD バージョンは 2.43 (2043) です」 (この README 英文の一番上で発言) |
私的バージョン | "0xDC" | 「元の移植性の側面とその他のサポート機能を統合する作業が行われている私の 0xDC カーネル」 (この README 英文の一番下で発言) |
「はじめて読む486」のサンプルプログラムは、0xFD だと動作しないものが多いですが、0xDC だとそれが改善されます。
なぜ 0xFD ではダメで、0xDC だと動くのかはわかりません。
たぶん互換としての再現度が違っているのだと思います。
0xFD は FreeDOS をインストールすると自然に導入されますが、0xDC は手動で導入しなければなりません。
そのため以下の①~⑤の手順を行うことになります。
手順まで来て 0xDC バージョンのシステムファイルの手動インストールが終わったら、つづいて「FreeDOS 1.3 のツール類」もコピーし、それで最後にリセットをかけ、DOS の起動を確認したら DOS のセットアップは完了です。
図を見ると大変そうに見えますが、1つ1つやればできますからやってみましょう。
この作業の動画(動画 7 本目、1分42秒、38MB)
すると左上図のようなページが表示されます。(2024年7月5日現在)
ke20xx_f32.zip(左上図赤枠)のリンクをクリックします。
するとダウンロードが始まります。
ke2043_86f32.zip(160KB)
ダウンロードしたら、 右クリック>すべて展開... しておきます。
以上で、KERNEL.SYS(0xDC 版)のダウンロードができました。(①完了)
この作業の動画(動画 8 本目、2分32秒、48MB)
VirtualBox の仮想マシンの画面にて、
デバイス メニュー>フロッピードライブ>Choose/Create a Disk Image...(ディスクイメージを選択/作成...)を選びます。
すると、「フロッピーディスク選択」画面が表示されます。
左上から2番目の「作成」アイコンをクリックします。
すると、「フロッピーディスクの作成」画面が表示されます。
このまま「Create」ボタンを押します。
すると、もとの画面に戻ります。
右下の「空のままにする」ボタンを押します。
すると、仮想マシンの画面に戻ります。
右側のCTRL + P キーを押します。
すると、画面にインターレース(暗転)がかかり「一時停止」となります。
※ 仮想マシンが動いているあいだは CPU の使用率が高くなるので、何か別の作業を行う場合はこうやって停止しておくと良いです。(下図)
▼一時停止することで CPU の使用率が大幅に下がります。
Windows の後ろにある「VirtualBox マネージャー」画面を前に出します。
左側のリストの、「vm486」を右クリックして、「エクスプローラーに表示(H)」を選びます。
すると、この仮想マシンのための各種ファイルがおさめられているフォルダが開かれます。
この中の、
「vm486_1.img」
が、先ほど作成したフロッピーディスクイメージファイルです。
以上で、フロッピーディスクイメージファイルを新規作成できました。(②完了)
この作業の動画(動画 9 本目、5分26秒、108MB)
「実験室:P」というページにアクセスします。
http://hp.vector.co.jp/authors/VA013937/
すると左上図のようなページが表示されます。(2024年7月5日現在)
「Softwares」ボタンをクリックします。
すると左上図のように展開されます。
「DiskExplorer」のリンクをクリックします。
すると左上図のようなページが表示されます。(2024年7月5日現在)
editd169.lzh (270,194 bytes) Ver1.69(左上図赤枠)のリンクをクリックします。
するとダウンロードが始まります。
editd169.lzh(270KB)
… .lzh 形式なので、別途、専用の解凍ツールが必要です。
「Vector」の「+Lhaca」のページにアクセスします。
https://forest.watch.impress.co.jp/library/software/pluslhaca/
すると左上図のようなページが表示されます。(2024年7月5日現在)
緑色の「窓の杜からダウンロード」ボタンをクリックします。
するとダウンロードが始まります。
Lhaca076.EXE(120KB)
ダウンロードした「Lhaca076.EXE」をダブルクリックすると、「ユーザー アカウント制御」の画面が表示されます。
表示されている発行元は不明ですが、正規のページ(有名な「窓の杜」)からダウンロードしているので「まぁ、大丈夫でしょう」と考えます。
「はい」ボタンを押します。
すると、小さな画面が出ます。
この場所は覚えておいた方が良いかもしれません。
「OK」ボタンを押します。
すると、+Lhaca の readme.txt が自動で開かれます。
必要なければ閉じましょう。
デスクトップの「+Lhaca」のアイコンをダブルクリックする等して、+Lhaca を起動します。
すると、「+Lhaca Version0.76 設定」という画面が表示されます。
左上図赤枠で示すとおり設定します。
最後に「OK」ボタンを押します。
これで、.lzh のファイルをダブルクリックすると、その場所のフォルダに新しいフォルダが作成され、そこへ解凍されるようになります。
ではダウンロードした editd169.lzh をダブルクリックしてみましょう。
圧縮が解凍されて、「editd169」というフォルダが作成されます。
このフォルダを開きます。
すると、フォルダの中はこのようになっています。
editdisk.exe が「DiskExplorer」です。
以上で、「DiskExplorer」をダウンロードして、その解凍もできました。(③完了)
この作業の動画(動画 10 本目、2分32秒、38MB)
前の手順で作成したフロッピーディスクイメージファイルを、ダウンロードフォルダの editd169 フォルダの中のeditdisk.exe へドラッグアンドドロップします。
すると、小さな画面が表示されます。
「plain image」のまま、「OK」ボタンを押します。
すると、「vm486_1.img - DiskExplorer」というウィンドウが表示されます。
この画面はエクスプローラーと似たような操作ができます。
前述 の手順で「ke2043_86f32.zip」をダウンロードして解凍してできたフォルダの中を見ると doc フォルダと bin フォルダがあります。
bin フォルダのほうを開いて、その中身をすべて選択して、DiskExplorer のウィンドウへドラッグアンドドロップします。
すると、DiskExplorer のウィンドウにコピーされます。
右上の × ボタンを押して閉じてください。
以上で、KERNEL.SYS とその他のファイルがフロッピーディスクイメージへ書き込みされました。(④完了)
この作業の動画(動画 11 本目、5分37秒、126MB)
仮想マシンのウィンドウを前に出して、
右側のCTRL + P キーを押します。
すると、画面のインターレース(暗転)がなくなり、「一時停止」が解除されます。
「デバイス」メニュー>フロッピードライブ を選んで…
左上図のように、「履歴部分」に前の手順で新規作成したディスクイメージファイルのファイル名「vm486_1.img」が載っているなら、それを選んでください。その方が早いです。
履歴の部分にファイル名が載っていないときは、Choose a Disk File...(ディスクイメージファイルを選択...)を選んで、「vm486_1.img」を選択してください。
R:\>
となっているところに、b:
と入力します。
現在、英語モードなので「 : 」 は SHIFT + ; で入力します。
面倒ですが、そのように入力してください。
これは後で改善されます。
つづいて、sys c:
と入力します。
すると、英語でメッセージが表示されます。
『B ドライブの COMMAND.COM は開けませんでした。
R ドライブの COMMAND.COM で試します。
システムが転送されました』
という意味です。
これで、C ドライブに、0xDC 版の KERNEL.SYS がコピーされました。
B:\>
となっているところに、c:
と入力します。
現在、英語モードなので : は SHIFT + ; で入力します。
つづいて、dir
と入力します。
すると、C ドライブに COMMAND.COM と KERNEL.SYS がコピーされているのが分かります。
つづいて、
d:
cd freedos
cd bin
と入力します。
左上図と同じになっていることを確認してください。
そして、FreeDOS 1.3 のツールをコピーします。
xcopy *.* c:\freedos\bin /y /s /i
と入力します。大変ですが、
英語モードなので…
: |
SHIFT + ; |
\ |
] |
* |
SHIFT + 8 |
…で入力します。
\ は画面上ではバックスラッシュ\で表示されています。
入力が間違っていないか Enter を押す前に、確認してください。
特に : が ; になっていないか、
正しくは d:\freedos\bin のはずが、間違って d:/freedos/bin になっていないか等。
xcopy を実行すると、c:\freedos\bin というディレクトリが自動で作成され、そこへ FreeDOS 1.3 の各種ツールがコピーされます。
現在3つの不便があります。
以下のファイルをダウンロードします。
web6047_first.img(1.44MB)
デバイス メニュー>フロッピードライブ>ディスクファイルを選択... を選びます。
ダウンロードフォルダの web6047_first.img を選択します。
D:\FREEDOS\BIN>
となっているところに、b:
と入力します。
現在、英語モードなので : は SHIFT + ; で入力します。
つづいて、dir
と入力します。
すると、5つのファイルがあるのが分かります。
次のように入力して、拡張子が .bat のファイルだけ C: へコピーします。
copy *.bat c:\
現在、英語モードなので、以下のように入力します。
: | SHIFT + ; |
\ | ] |
* | SHIFT + 8 |
実行すると、
と表示されます。
「デバイス」メニュー>光学ドライブ>レの入っている「FD13LIVE.iso」を選択します。
そうすることでレが外れて、LiveCD を取り外したことになります。
同様に、「デバイス」メニュー>フロッピードライブ>レの入っている「web6047_first.img」を選択します。
そうすることでレが外れて、フロッピーディスクを取り外したことになります。
そして、「リセット」します。
表示される小さい画面の「リセット」ボタンを押します。
…ここでもし、起動システムが入っていないデータ CD や、データフロッピーがドライブに残っていると…
リセットの途中で、このようなエラー画面が出てきてしまいます。
こうなった場合は、右下の「キャンセル」ボタンを押します。
続いて、「デバイス」メニューから「光学ドライブ」や、「フロッピードライブ」に何かデータだけのディスクに「レ」が入っていないか探して、すべて外したら、もう一度リセットを行ってください。
正常にリセットされると、C ドライブから起動されます。
以上で、3つの不便を改善しました。
xcopy
で xcopy コマンドの使い方が表示されます。at
src
以上で DOS のセットアップは完了です。お疲れさまでした。
この作業の動画(動画 12 本目、1分35秒、35MB)
書籍『はじめて読む486』のサンプルプログラム集のページにアクセスします。
すると左上図のようなページが表示されます。(2024年7月5日現在)
緑色の「<> Code▼」ボタン(左上図赤枠)をクリックして開いてから、一番下の「Download ZIP」(左上図青枠)をクリックします。
するとダウンロードが始まります。
486-master.zip(299KB)
ダウンロードフォルダにて 486-master.zip を右クリックして、「すべて展開(T)...」を選び、表示される画面で「展開(E)」ボタンを押します。
すると「486-master」というフォルダが作成されます。
以上で、サンプルプログラムをダウンロードできました。
この作業の動画(動画 13 本目、2分01秒、39MB)
繰り返しの説明になりますが、フロッピーディスクイメージファイルをまた新たに作成します。
VirtualBox の画面にて、
デバイス メニュー>フロッピードライブ>Choose/Create a Disk Image...(ディスクイメージを選択/作成...)を選びます。
すると、「フロッピーディスク選択」画面が表示されます。
左上の2番目の「作成」アイコンをクリックします。
すると、「フロッピーディスクの作成」画面が表示されます。
ファイルのパスは、前回のファイル名とかぶらないように自動的に「~_2.img」となっています。
このまま「Create」ボタンを押します。
すると、もとの画面に戻ります。
右下の「空のままにする」ボタンを押します。
すると、仮想マシンの画面に戻ります。
右側のCTRL + P キーを押します。
すると、画面にインターレース(暗転)がかかり一時停止します。
仮想マシンが動いているあいだは CPU の使用率が高くなるので、何か別の作業を行う場合はこうやって停止しておくと良いです。
「VirtualBox マネージャー」画面で、左側のリストの、「vm486」を右クリックして、「エクスプローラーに表示(H)」を選びます。
すると、この仮想マシンのための各種ファイルがおさめられているフォルダが開かれます。
この中の、
「vm486_2.img」
が、先ほど作成したフロッピーディスクイメージファイルです。
以上で、フロッピーディスクイメージファイルを新規作成できました。
この作業の動画(動画 14 本目、1分58秒、34MB)
前の手順で作成したフロッピーディスクイメージファイル vm486_2.img を、ダウンロードフォルダの editd169 フォルダの中の editdisk.exe へドラッグアンドドロップします。
すると、小さな画面が表示されます。
「plain image」のまま、「OK」ボタンを押します。
すると、「vm486_2.img - DiskExplorer」というウィンドウが表示されます。
この画面はエクスプローラーと似たような操作ができます。
前の手順で「486-master.zip」をダウンロードして解凍してできたフォルダの中を見ると SOURCE フォルダと BIN フォルダがあります。
これら2つを選択して、DiskExplorer のウィンドウへドラッグアンドドロップします。
すると、DiskExplorer のウィンドウにコピーされます。
書き込みはできたので、このウィンドウは右上の × ボタンを押して閉じてください。
以上で、サンプルプログラムがフロッピーディスクイメージへ書き込みされました。
この作業の動画(動画 15 本目、2分29秒、55MB)
仮想マシンのウィンドウを前に出して、
右側のCTRL + P キーを押します。
すると、画面のインターレース(暗転)がなくなり、「一時停止」が解除されます。
VirtualBox の仮想マシンの画面にて、
「デバイス」メニュー>フロッピードライブ を選んで、
履歴の部分の「vm486_2.img」を選択してください。
a:
と入力し、
続いて、dir
と入力します。
(前の手順でキーボードは日本語モードにしてあるので、: は : で入力できます)
すると、SOURCE と BIN のディレクトリがあるのが分かります。
続いて、
xcopy *.* c:\486 /y /s /i
と入力します。
(前の手順でパスを通したので xcopy などのコマンドが実行しやすくなっています)
実行すると c:\486 というディレクトリが自動的に作成され、そこへサンプルプログラムがコピーされます。
c:
と入力し、
続いて、dir
と入力します。
すると、486 のディレクトリができているのが分かります。
続いて、
cd 486
cd bin
cd at
(または、単に、at
と入力してもよいです)
と入力して最後に、dir /w
と入力すると、サンプルプログラムの .exe 形式の実行ファイルが16個表示されます。
以上で、サンプルプログラムをハードディスクへコピーできました。
この作業の動画(動画 16 本目、6分23秒、145MB)
「はじめて読む486」の各ページを参考にして各 .exe ファイルを実行してみてください。
▼例題プログラムの実行
<> (動作確認表2) VirtualBox + FreeDOS 1.3(0xDC)
# | 同書 | ファイル名 | 動作可否(BIN\AT) | 動作可否(SOURCE) |
---|---|---|---|---|
1 | P31 | SIEVE_C.EXE | (.exe ファイルの提供なし) | 未 |
2 | P113 | TESTPROT.EXE | ○ | 未 |
3 | P135 | RMSEG.EXE | ○ | 未 |
4 | P162 | PMSEG.EXE | ○ | 未 |
5 | P175 | PUTPMEM.EXE | ○ | 未 |
6 | P175 | GETPMEM.EXE | ○ | 未 |
7 | P187 | SIEVE32.EXE | ○ | 未 |
8 | P213 | TESTGATE.EXE | ○ !without CLTS !FreeDOS 0xFD | 未 !without CLTS !FreeDOS 0xFD |
9 | P254 | HARDINT.EXE | ○ | 未 !WASM |
10 | P258 | FAULT.EXE | ○ | 未 |
11 | P291 | TESTTASK.EXE | ○ !without CLTS !FreeDOS 0xFD | 未 !without CLTS !WASM !STACK |
12 | P333 | VSIEVE.EXE | ○ | 未 |
13 | P399 | INTMON.EXE | ○ !without CLTS !FreeDOS 0xFD | 未 !without CLTS !WASM |
14 | P423 | DPMIINFO.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
15 | P428 | DPMISIEV.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
16 | P446 | REVFILE.EXE | ○ ※下記コラムを参照して下さい。 | 未 |
17 | P451 | IOMON.EXE | ○ !without CLTS !FreeDOS 0xFD | 未 !without CLTS !WASM |
FreeDOS のシステムファイルを通常とは違うものにしたことで、表中の!FreeDOS 0xFDのマークは消えました(点線マーク部分)。
サンプルプログラムの BIN\AT 以下の .exe ファイルはすべて実行できる状態です。
!without CLTSの表示は、その .exe 自体の実行は問題ありません(期待する動きをして正しく終了します)が、実行後に「プロテクトモードに移行するソフトウェア」(wasm.exe など)を実行すると、そのソフトウェアがハングアップするという問題があることを示しています。
これは、ソースコードを修正すれば直りますが、.exe 形式で提供されているものはコンパイル済みですから今からの修正はできません。
なので、BIN\AT の .exe ファイルを実行した後は、wasm.exe などを実行しないように気を付けてください。
フロッピーディスクイメージの web6047_first.img の中に PERSONS.TXT というファイルが入っています。
これは同書 P446 で使用しているテキストファイルを私が自作したものです。
PERSONS.TXT を C:\486\AT
フォルダと、C:\486\BIN\SOURCE
フォルダにそれぞれコピーして使ってください。
デバイス メニュー>フロッピードライブ で web6047_first.img を選択してから、
A:
DIR
COPY PERSONS.TXT C:\486\BIN\AT
COPY PERSONS.TXT C:\486\SOURCE
以上のようにコピーします。
最後に元の場所に戻っておきます。
AT
PERSONS.TXT では、
1行目には、「最初 英一 Eiichi Saisho」
最終行には、「最後 英一 Eiichi Saigo」
と書かれています。
日本語部分は文字化けしますが気にしないでください。
type persons.txt
として、最後に「Eiichi Saigo」が来ているのを確認します。次に、
revfile.exe persons.txt
を実行します。再度、
type persons.txt
として、最後に「Eiichi Saisho」が来ているのを確認します。
revfile はテキストファイルの前行を逆順に並べ替えます。
Saisho と Saigo が目印になるので、逆になったことを確認できます。
サンプルプログラムの DPMIINFO.EXE と DPMISIEV.EXE は『Windows 3.1 の「DOS プロンプト」上で実行させるもの』です。
しかし、Windows 3.1 はもう 30 年以上も前の OS なので今の時代に手に入れるのは簡単ではありません。
そこで私のほうで手に入れて用意したので、どんな様子で動くのか見てみましょう。
仮想マシンのハードディスクに PC-DOS をインストールし、そこへ Windows 3.1 をインストールします。
DOS の黒い画面から win
とコマンドを打ち込むと、Windows 3.1 が起動します。(左上図)
Main ウィンドウの「MS-DOS プロンプト」を起動します。
すると、画面全体が左上図のようになります。
Windows 10, 11 の「コマンド プロンプト」に相当する画面です。
サンプルの1つ DPMIINFO.EXE を実行したところです。
DPMI サーバーの情報が表示されています。
「はじめて読む486」の一連のサンプルプログラムでは、「32ビット CPU」の恩恵である、
といった各機能を直接 C 言語やアセンブリ言語を使って実験しています。
DPMI ではサーバー/クライアント、つまり、DPMI サーバーから DPMI クライアントへ、、という形で上記の機能を提供します。
Windows 3.1 はこの DPMI サーバーの機能を持っています。
そして、DPMIINFO.EXE と DPMISIEV.EXE は DPMI クライアント、ということです。
サンプルの1つ DPMISIEV.EXE を実行したところです。
ところで、ハードディスクに『FreeDOS 1.3』をインストールし、そこへ Windows 3.1 をインストールしても、Windows 3.1 の起動はできませんでした。
これはネット上でも問題になっていて、いろいろな策が講じられているようですが、簡単にはいかないようです。
そのため、現実的には、正規の PC-DOS をオークションなどで購入してインストールした上で Windows 3.1 をインストールする必要があります。
以上で、!FreeDOS 0xFDの問題は解決されました。
ここでは!WASMの問題について作業します。
この左のバーの色 も合わせてありますので目印にしてください。
このバーが終了したとき、この作業の終了を意味します。
(!STACKの問題も途中で直しています)
この作業の動画(動画 17 本目、1分04秒、28MB)
Open Watcom 1.9 release のページにアクセスします。
https://github.com/open-watcom/open-watcom-1.9/releases/tag/ow1.9
すると左上図のようなページが表示されます。(2024年7月5日現在)
表「Version 1.90 Installer for C/C++」の「DOS」の行のリンク open-watcom-c-dos-1.9.exe をクリックしてください。
するとダウンロードが始まります。
open-watcom-c-dos-1.9.exe(80.1MB)
以上で OpenWatcom をダウンロードすることができました。
この作業の動画(動画 18 本目、3分08秒、60MB)
ダウンロードした open-watcom-c-dos-1.9.exe は実は、Windows 10 や 11 では実行できません。
DOS 用(16bit)の実行ファイルなので、FreeDOS へコピーしてから実行します。
しかし、ファイルサイズが 80MB あり、フロッピーディスク(1.44MB)ではコピーできません。
仮想マシンをネットワーク接続してファイル共有すれば早いですが、ちょっと時間をかけて調べましたができませんでした。
そこで、CD-ROM イメージを使ってコピーすることを考えます。
仮想マシンの画面のデバイス メニュー>光学ドライブ>Choose/Create a Disk Image...(ディスクイメージを選択/作成...)を選びます。
すると、「光学ディスク選択」画面が表示されます。
左上の2番目の「作成」アイコンをクリックします。
すると、「VISOクリエイター」画面が表示されます。
画面左側で、「C:/Users」に移動します。
そして自分のユーザー名に移動し、Downloads フォルダに移動します。
Downloads フォルダには、open-watcom-c-dos-1.9.exe があるはずなので、選択します。
もし、無い場合はユーザー名を間違えていないでしょうか。
選択したら、画面中央の縦に3つ並んだアイコンの一番上の「書類 2 枚に水色の右向き三角」 のアイコンをクリックします。
すると、画面右側へ登録されます。
続いて、画面一番左上の「Preferences」アイコンをクリックします。
すると、画面下部に「VISO名:」という入力欄が現れます。
ここに、出力したい CD-ROM イメージファイルのファイル名を記入します。
watcom
と入力しましょう。
そして右下の「Save and Close」ボタンを押します。
すると、画面が消えて元の画面に戻ります。
リストの Not Attached のグループに、作成した watcom.viso ファイルが登録されています。
サイズが 0B となっていますが問題ありません。
画面右下の「選択」ボタンを押します。
「VirtualBox マネージャー」画面で、左側のリストの、「vm486」を右クリックして、「エクスプローラーに表示(H)」を選びます。
すると、この仮想マシンのための各種ファイルがおさめられているフォルダが開かれます。
この中の、
「watcom.viso」
が、作成した CD-ROM イメージファイルです。
以上で、CD-ROM イメージの作成ができました。
この作業の動画(動画 19 本目、3分35秒、69MB)
私が作成した『CD-ROM 環境あり/なし切り替えツール(各種バッチファイル)』がありますので使ってください。
以下のリンクをクリックしてください。
ダウンロードが始まります。
web6047_CDROM.img(1.44MB)
仮想マシンの画面のデバイス メニュー>Choose a Disk File...(フロッピードライブ>ディスクイメージファイルを選択...)を選びます。
そして、ダウンロードフォルダの web6047_CDROM.img ファイルを選択します。
a:
と入力し、
続いて、dir
と入力します。
すると、web6047_CDROM.img の中身が表示されます。
続いて、
xcopy *.* c:\ /y /s /i
と入力します。
すると、c:\ に6つのファイルがコピーされます。
c:
cd \
chg
すると、
to CD-ROM
Restart your computer.
と表示されます。
ただし、リセットする前に、デバイス メニュー>フロッピードライブ>web6047_CDROM.img のレを外しておきます。
光学ドライブのほうも「watcom.viso」にレが入っているので外しておきましょう。
仮想マシン メニュー>リセット を選びます。
すると、以前とは少し異なる様子で起動が行われます。
等々の機能が盛り込まれています。
右側の灰色の領域は、マウスが使えるようになったことを知らせています。
フキダシに「!」の水色のアイコン を押して閉じましょう。
デバイス メニュー>光学ドライブ>watcom.viso を選びます。
d:
と入力し、
続いて、dir
と入力します。
すると、watcom.viso の中身が表示されます。
以上で、FreeDOS で CD-ROM ドライブ(仮想)が読めるようになりました。
この作業の動画(動画 20 本目、4分06秒、100MB)
引き続き、
openwa~2
と入力します。
すると、青い画面で OpenWatcom のライセンス同意書が表示されます。
マウスで画面をクリックしてマウスを動かすと、素朴な■状のマウスカーソルが動きます。
マウスで「I Agree」ボタンを押しましょう。
(※ このとき、Windows のほうの操作に戻したいときは、キーボードの 右側のCTRL キーを押します)
すると、どこにインストールするのかを聞かれます。
そのまま、「Next >>」ボタンを押します。
マウスが面倒なときは、ALT+ そのボタンの大文字キーを押します。
次に、フルインストールするのか、それとも選択してインストールするのかを聞かれます。
そのまま、「Next >>」ボタン("選択してインストール")を押します。
いろいろありますが、
そのまま、「Next >>」ボタンを押します。
ちなみに、以下のように設定されます。
「セットアップはコピーを開始します。」と表示されています。
「Next >>」ボタンを押します。
ゲージが上がってインストールが進みます。
早ければ30秒くらいで終わります。
「セットアップは AUTOEXEC.BAT と CONFIG.SYS の修正を必要とします」
…と書かれています。
このまま「OK」ボタンを押します。
「セットアップにより、元の AUTOEXEC.BAT および CONFIG.SYS ファイルのコンテンツが次のバックアップ ファイルに保存されます:」
C:\AUTOEXEC.000
C:\CONFIG.000
…と書かれています。
「OK」ボタンを押します。
ALT+ O で代用できないときはEnterキーを押してください。
「セットアップでソフトウェアのインストールが完了しました。
AUTOEXEC.BAT と CONFIG.SYS への変更を有効にするには、コンピュータを再起動する必要があります」
…と書かれています。
「OK」ボタンを押します。
すると、DOS の画面に戻ります。
デバイス メニュー>光学ドライブ>watcom.viso を選んでレを外します。
フロッピードライブのほうもレがないか確認しましょう。
仮想マシン メニュー>リセット
すると、リセットされます。
wcl
と入力します。
すると、OpenWatcom の C コンパイラの使用方法が表示されます。
何度か、Enter キーを押して表示を終了させます。
繰り返しになりますが、「はじめて読む486」では、サンプルプログラムの実行環境について指定がされています。
ここでは CD-ROM を使うために、HIMEMX.EXE(フリーウェアのメモリ管理ドライバ)を使用しています。
なので…
CD-ROM の対応は、OpenWatcom のインストールが終わって用は済んでいるので、対応を取り外しましょう。
chg
と入力します。
すると、
to no CD-ROM
Restart your computer.
と表示されます。
デバイス メニューで何もディスクが入っていないことを確認したら、仮想マシン メニュー>リセット を選びましょう。
リセットすると、CD-ROM は使えなくなっています。
wcl
と入力します。
すると、OpenWatcom の C コンパイラの使用方法が表示されます。 何度か、Enter キーを押して表示を終了させます。
CD-ROM が無いほうでも OpenWatcom が使えることを確認できました。
以上で、OpenWatcom のインストールは完了しました。
この作業の動画(動画 21 本目、1分22秒、38MB)
では、OpenWatcom のコンパイラとアセンブラを使って、各ソースコードから実行ファイルを作成してみましょう。
cd 486
cd source
wmake -f makefile.ow
と入力します。
すると、全ファイルのコンパイル、アセンブルが行われます。
途中、
Warning! W138: No newline at end of file
と何度も表示されますが、
「テキストの一番最後が改行で終わっていない」
と言っているだけで、大きな問題ではありません。
しかし、このメッセージを消したいときは、そのテキストを FreeDOS のテキストエディタの edit.exe で開き、保存しなおします。
以上で、OpenWatcom を使ってビルドすることができました。
この作業の動画(動画 22 本目、7分23秒、185MB)
作成された .exe ファイルを実行すると、下表のような結果となります。
at
や src
で目的のディレクトリへすばやく移動できるようにしてありますので利用してください。(at.bat, src.bat)<> (動作確認表3) VirtualBox + FreeDOS 1.3(0xDC) + OpenWatcom 1.9
# | 同書 | ファイル名 | 動作可否(BIN\AT) | 動作可否(SOURCE) |
---|---|---|---|---|
1 | P31 | SIEVE_C.EXE | (.exe ファイルの提供なし) | ○ |
2 | P113 | TESTPROT.EXE | ○ | ○ |
3 | P135 | RMSEG.EXE | ○ | ○ |
4 | P162 | PMSEG.EXE | ○ | ○ |
5 | P175 | PUTPMEM.EXE | ○ | ○ |
6 | P175 | GETPMEM.EXE | ○ | ○ |
7 | P187 | SIEVE32.EXE | ○ | ○ |
8 | P213 | TESTGATE.EXE | ○ !without CLTS | ○ !without CLTS |
9 | P254 | HARDINT.EXE | ○ | × !WASM |
10 | P258 | FAULT.EXE | ○ | ○ |
11 | P291 | TESTTASK.EXE | ○ !without CLTS | × !without CLTS !WASM !STACK |
12 | P333 | VSIEVE.EXE | ○ | ○ |
13 | P399 | INTMON.EXE | ○ !without CLTS | × !without CLTS !WASM |
14 | P423 | DPMIINFO.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
15 | P428 | DPMISIEV.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
16 | P446 | REVFILE.EXE | ○ | ○ |
17 | P451 | IOMON.EXE | ○ !without CLTS | × !without CLTS !WASM |
SOURCE の各ソースコードを OpenWatcom 1.9 でビルドした状態です。
いくつかの .exe ファイルは正常に動作しません。
以上で、ビルドされた各 .exe ファイルの動作を確認することができました。
よくはわかりませんが、int_a.asm というアセンブリプログラムを wasm でアセンブルすると、割り込み処理の中でシステムを停止させるような結果になってしまうようです。
wasm 以外のアセンブラである、「Borland Turbo Assembler(TASM)」や「Microsoft Macro Assembler(MASM)」ではそのような問題は起きません。
以降は難しい話となります。
具体的には、何らかの割り込みが発生すると、int_a.asm の中の IntEntry(マクロ)が呼ばれます。
そのとき受け取った引数の n の値がどこかで不正な値になってしまっていて、その後、以下の IntCaller へ進みます。
前段階で、割り込みが発生した時点で割り込み関係の値4つ eflags, f1, cs, eip がスタック(専用メモリ)へ push されています。
さらに、IntEntry(マクロ)の段階で n がスタックへ push されており、
そして IntCaller に来たところで ds, es と、pusha により、ax, cx, dx, bx, sp, bp, si, di の値がスタックに push されています。
合計 15 個の値がスタックに push されており、その状態で IntHandler が呼ばれます。
IntHandler はスタックに入っている 15 個の値を引数として受け取ります。
INT.C の中で IntHandler = RealModeInt; が行われているので、IntHandler の呼び出しは、RealModeInt 関数(下記)の実行ということです。
RealModeInt 関数で不正な値の n を受け取り、そして int86(n,&r,&r); を実行するので、システム停止になるのかな、、と思います。
このデバッグとして、IntEntry(マクロ)の中の jmp IntCaller の手前で、変数 n の値を調べるために、空いているレジスタ、たとえば di レジスタなどに n を代入すると、その代入をきっかけに n の値がコロっと変わる、、というおかしな挙動を見せました。
これは tasm.exe や masm.exe ではそのような問題は起こらないので、wasm.exe の互換性の問題ではないかと思います。(それか私が何か間違ったことをやっている)
tasm.exe や masm.exe(ver 5.10)は 16bit の時代のアセンブラであり、wasm.exe は 16bit 対応だけど、32bit、64bit を視野に入れた現代のアセンブラなので、その関係で何か違いが出てるのかなという気がします。
念のため、OpenWatcom 1.9 ではなく、OpenWatcom V2 でも確認しましたが、同じ結果でした。
それ以上のことはちょっと私にはできず、原因究明はあきらめました。
以上で、仮想マシンに OpenWatcom をインストールすることができました。
!WASMで表示した問題の具体的な原因は私の知識ではわかりません。
しかし、TASM か MASM では、!WASMで表示した問題は起こらないようです。
MS-DOS がオープンソース化され、その構成ファイルとして含まれる MASM.EXE(ver 5.10、16bit版)が無料で使えるようになりました。
というわけで MASM を使わせてもらうことにします。
(TASM の無料版はありません)
この作業の動画(動画 23 本目、1分47秒、37MB)
Git-Hub の microsoft/MS-DOS のページにアクセスします。
https://github.com/microsoft/MS-DOS/tree/main
すると左上図のようなページが表示されます。(2024年8月12日現在)
中央のリストから「v4.0」をクリックします。
すると左上図のような画面になります。
中央のリストから「src」をクリックします。
すると左上図のような画面になります。
中央のリストからフォルダの一番下「TOOLS」をクリックします。
すると左上図のような画面になります。
下から5番目の「MASM.EXE」をクリックします。
すると左上図のような画面になります。
下部の「View raw」をクリックします。
するとダウンロードが始まります。
MASM.EXE(109KB)
以上で MASM をダウンロードすることができました。
この作業の動画(動画 24 本目、1分39秒、30MB)
ダウンロードしたファイル MASM.EXE をフロッピーディスクイメージを使って仮想マシンへコピーする手順を説明します。
3 度目の繰り返しの説明となりますがじっくり繰り返すことで身に付くと思います。
VirtualBox の画面にて、
デバイス メニュー>フロッピードライブ>Choose/Create a Disk Image(ディスクイメージを選択/作成...)を選びます。
すると、「フロッピーディスク選択」画面が表示されます。
左上の右隣りの「作成」アイコンをクリックします。
すると、「フロッピーディスクの作成」画面が表示されます。
ファイルのパスは、前回のファイル名とかぶらないように自動的に「~_3.img」となっています。
このまま「Create」ボタンを押します。
すると、もとの画面に戻ります。
右下の「空のままにする」ボタンを押します。
すると、仮想マシンの画面に戻ります。
右側のCTRL + P キーを押します。
すると、画面にインターレース(暗転)がかかり一時停止します。
仮想マシンが動いているあいだは CPU の使用率が高くなるので、何か別の作業を行う場合はこうやって停止しておくと良いです。
「VirtualBox マネージャー」画面で、左側のリストの、「vm486」を右クリックして、「エクスプローラーに表示(H)」を選びます。
すると、この仮想マシンのための各種ファイルがおさめられているフォルダが開かれます。
この中の、
「vm486_3.img」
が、先ほど作成したフロッピーディスクイメージファイルです。
以上で、フロッピーディスクイメージファイルを新規作成できました。
この作業の動画(動画 25 本目、1分26秒、23MB)
前の手順で作成したフロッピーディスクイメージファイルを、ダウンロードフォルダの「editd169」フォルダの中にある editdisk.exe へドラッグアンドドロップします。
すると、小さな画面が表示されます。
「plain image」のまま、「OK」ボタンを押します。
すると、「vm486_3.img - DiskExplorer」というウィンドウが表示されます。
この画面はエクスプローラーと似たような操作ができます。
ダウンロードフォルダの「MASM.EXE」を DiskExplorer のウィンドウへドラッグアンドドロップします。
すると、DiskExplorer のウィンドウにコピーされます。
書き込みはできたので、このウィンドウは右上の × ボタンを押して閉じてください。
以上で、サンプルプログラムがフロッピーディスクイメージへ書き込みされました。
この作業の動画(動画 26 本目、2分41秒、50MB)
仮想マシンのウィンドウを前に出して、
右側のCTRL + P キーを押します。
すると、画面のインターレース(暗転)がなくなり、「一時停止」が解除されます。
VirtualBox の仮想マシンの画面にて、
「デバイス」メニュー>フロッピードライブ を選んで、
履歴の部分の「vm486_3.img」を選択してください。
a:
と入力し、
続いて、dir
と入力します。
すると、MASM.EXE があるのが分かります。
続いて、
xcopy *.* c:\msdos4 /y /s /i
と入力します。
実行すると c:\msdos4 というディレクトリが自動的に作成され、そこへ MASM.EXE がコピーされます。
c:
cd \
dir
と入力します。
すると、msdos4 のディレクトリができているのが分かります。
続いて、
cd msdos4
dir /w
と入力すると、MASM.EXE がコピーされているのが確認できます。
なお、c:\msdos4 にはパスを通してありますので、どのディレクトリからでも MASM.EXE を呼び出すことができます。
試しに、
cd \
masm
と入力すると、
Source filename [.ASM]:
と表示され、入力待ちになります。
ここで困ったことに、何度未入力にしてEnterキーを押しても、キャンセルができません。
CTRL+Cキーを押せば、キャンセルができます。
以上で、MASM をインストールすることができました。
この作業の動画(動画 27 本目、3分21秒、64MB)
まずは『wmake -f ...』というコマンドの意味を知っておきましょう。
サポートサイトでも案内されている通り、ソースコードから .exe ファイルを作成するには、
wmake -f makefile.ow
と入力します。(↑これは今は入力しないでください)
wmake のデフォルトでは、"makefile" という拡張子無しのファイルを読み込もうとしますが、-f オプションに続いてファイル名を記入するとそのファイルを代わりに読み込ませることができます。
そういう意味のコマンドだということです。
一部のアセンブリプログラム(int_a.asm)を wasm.exe ではなく、masm.exe でアセンブルさせるためには、makefile.ow の内容を少し変更する必要があります。
makefile.ow はオリジナルとしてそのまま取っておくことにして、makefile.ow2 という名前でコピーを取り、そのコピーの方を変更することにします。
しかし、変更には手間がかかるので、私があらかじめ変更済みにしたものを作りましたので、ダウンロードして使ってください。(右クリックして「名前を付けてリンク先を保存」)
makefile.ow2(4KB)
これをダウンロードして、フロッピーディスクイメージを使って、仮想マシンの C:\486\SOURCE へコピーしてください。
もう3度もフロッピーディスクイメージを使った受け渡しを説明しているので、もう大丈夫ですよね。
おさらいで?次の手順を踏んでください。
2か所変更しています。
1. コンパイラオプションを変更(MASM とは関係ありませんが、ついでです)
この変更により、!STACKの問題が解決されます。
BEFORE:
↓ ↓ ↓
AFTER:
wcc のコマンドラインオプションに -s と -DDEBUG を追加しました。
-s | remove stack overflow checks スタックオーバーフローチェックを削除する。 同書 P464 に書かれている chkstk.asm に関係しているのかなと思います。 chkstk.asm の編集はできそうにないので、代わりにオプションで対応した形になっていると思います。 TESTTASK.EXE で発生していた!STACKの問題が解決されます。 |
-DDEBUG | (P468)「9章ページング」の例題プログラム vsieve で、ページングの様子が表示されるようになります。 |
-s を付けないでコンパイルした場合、サンプルプログラムの testtask.exe は、実行すると Stack Overflow! というエラーメッセージを出します。
2. int_a.asm のみ masm を使ってアセンブルするようにします。
BEFORE:
↓ ↓ ↓
AFTER: (行を追加します)
これで int_a.asm のみ masm でアセンブルされます。
同書に記載(P471)の MASM のオプションも付けます。
/t | Suppress messages for successful assembly アセンブリ成功時のメッセージを抑制する |
/Zi | Generate symbolic information for CodeView CodeView のシンボリック情報を生成する |
/M{lxu} | Preserve case of labels: l-All, x-Globals, u-Uppercase Globals ラベルの大文字と小文字を保持: l-すべて、x-グローバル、u-大文字のグローバル |
/t は同書には記載されていませんでしたが、余計な表示を抑制します。
"CodeView" とは Microsoft が当時開発していたマルチウィンドウ型のデバッガーだそうです。
masm のコマンドラインの末尾の ,,,;
は、これを書かないと、wmake の途中で masm が動くたびに入力待ちになってしまいます。
以上の変更を、makefile.ow2 の中で行っています。
ex. 別のバージョン
上記は wasm を主体にして、int_a.asm のみ masm を使っていますが、
これを逆にして、
masm を主体にして、sieve_a.asm のみ wasm を使う、という方法もあります。
makefile.ow3(4KB)
アセンブル結果の機械語は多少変わる思いますが、どちらにしても動作でき、以降の説明に特別変わりはありません。
以上で、一部で MASM を使うように設定変更できました。
この作業の動画(動画 28 本目、1分43秒、39MB)
src
wmake -f makefile.ow2
と実行しましょう。
…しかし、ちょっとコマンドのタイトルみたいなものが表示されるだけで、何も行われません …
… wmake は元ファイルの .c や .asm から、生成ファイルである .obj や .exe を作るコマンドです。
wmake は元ファイルの .c や .asm の更新日付と、生成ファイルの .obj や .exe の更新日付を比較して、.c や .asm の更新日付のほうが新しいときだけそのファイルのコンパイルやアセンブルを行います。
つまりファイルの更新日付だけを見ているので、「新しく makefile.ow2 が使われた」というだけでは、更新は行われないのです。
そこで、
wmake -a -f makefile.ow2
とします。
すると、更新日付の比較をせずに無条件ですべて更新します。
左上図のようにビルドは完了するはずです。
以上で一部 MASM を使ってビルドすることができました。
この作業の動画(動画 29 本目、5分56秒、132MB)
作成された .exe ファイルを実行すると、下表のような結果となります。
at
や src
で目的のディレクトリへすばやく移動できるようにしてありますので利用してください。(at.bat, src.bat)<> (動作確認表4) VirtualBox + FreeDOS 1.3(0xDC) + OpenWatcom 1.9 + MASM 5.10
# | 同書 | ファイル名 | 動作可否(BIN\AT) | 動作可否(SOURCE) |
---|---|---|---|---|
1 | P31 | SIEVE_C.EXE | (.exe ファイルの提供なし) | ○ |
2 | P113 | TESTPROT.EXE | ○ | ○ |
3 | P135 | RMSEG.EXE | ○ | ○ |
4 | P162 | PMSEG.EXE | ○ | ○ |
5 | P175 | PUTPMEM.EXE | ○ | ○ |
6 | P175 | GETPMEM.EXE | ○ | ○ |
7 | P187 | SIEVE32.EXE | ○ | ○ |
8 | P213 | TESTGATE.EXE | ○ !without CLTS | ○ !without CLTS |
9 | P254 | HARDINT.EXE | ○ | ○ !WASM |
10 | P258 | FAULT.EXE | ○ | ○ |
11 | P291 | TESTTASK.EXE | ○ !without CLTS | ○ !without CLTS !WASM !STACK |
12 | P333 | VSIEVE.EXE | ○ | ○ |
13 | P399 | INTMON.EXE | ○ !without CLTS | ○ !without CLTS !WASM |
14 | P423 | DPMIINFO.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
15 | P428 | DPMISIEV.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
16 | P446 | REVFILE.EXE | ○ | ○ |
17 | P451 | IOMON.EXE | ○ !without CLTS | ○ !without CLTS !WASM |
wasm から masm に変えたことで、!WASMとの問題の表示は消えました(上表 点線部)。
また、!STACKの問題も一緒に解決されました。
これで、一応すべてのサンプルプログラムが動作する状態となっています。
しかしまだ、8, 11, 13, 17 のサンプルプグラムは!without CLTSの問題が残っています。
この問題は、サンプルプログラムの実行の後に「プロテクトモードに移行するタイプのソフトウェア」(例えば wasm.exe)を実行するとシステムが停止する、というものです。
たとえば、TESTGATE.EXE を実行した後に、wasm.exe を実行すると、コマンドラインで改行された直後にシステムが停止します。
左上図ではこの状態で停止(フリーズ)しています。
これが、!without CLTSの現象です。
停止してしまったら、システムを再起動するには、右側のCTRL+Rキーを押します。
この問題の対処は次で説明します。
以上で、!WASMと!STACKの問題は解決されました。
ここでは!without CLTSの問題について作業します。
この左のバーの色 も合わせてありますので目印にしてください。
このバーが終了したとき、この作業の終了を意味します。
(この作業ですべての作業が終了となります)
この作業の動画(動画 30 本目、1分50秒、38MB)
C:\486\SOURCE に移動します。
src
テキストエディタで task_a.asm を開きます。
edit task_a.asm
するとテキストエディタ edit.exe が起動します。
このテキストエディタは FreeDOS 1.3 に同梱されているもので、最近開発されたソフトウェアなので、Windows でよく使うような操作を だいたい 期待できます。
ただし、FreeDOS は初期状態では日本語表示に対応していないので、日本語部分は文字化けしています。
日本語を表示する方法はあるにはあるのですが、大変なので、文字化けは気にしないで進めましょう。
アセンブリプログラムの最初のほうに、
と書かれた行(23行目)があり、C言語風の表記でここに関数があることを示しています。
; で始まる行はコメントです。
カーソル位置の行数は画面下部右側に表示されています。
この SwitchTask() 関数の中の、
と書かれた行(27行目)の末尾でEnterを押して改行して新しい行を作り、TABを 2 回押してインデントして
clts
と書きます。
結果的に以下のようになります。
ALT+Fキーを押して、ファイルメニューを開き、Exit を選びます。
すると「保存していないファイルを保存するか?」と聞いてくるので、Yes を選びます。
Yes が白くハイライトされているので、そのままEnterキーを押せば Yes を押したことになります。
以上で task_a.asm を修正できました。
この作業の動画(動画 31 本目、1分32秒、31MB)
テキストエディタで proto_a.asm を開きます。
edit proto_a.asm
するとテキストエディタ edit.exe が起動します。
アセンブリプログラムの一番最後に目的の関数が書かれています。PageDownキーを押すと早く下の方へ行けます。
と書かれた行(77行目)があり、これはアセンブリプログラムで書かれた関数であることを示しています。
この ProtoToReal() 関数の中の一番最後のほう、
このセミコロンだけの行(105行目)の末尾でEnterを押して改行して新しい行を作り、TABを 2 回押してインデントして、
clts
と書きます。
結果的に以下のようになります。
ALT+Fキーを押して、ファイルメニューを開き、Exit を選びます。
すると「保存していないファイルを保存するか?」と聞いてくるので、Yes を選びます。
Yes は白くハイライトされているので、そのままEnterキーを押します。
以上で proto_a.asm を修正できました。
この作業の動画(動画 32 本目、0分45秒、19MB)
wmake をします。
修正したのは2つのファイルだけなので、そこだけをビルドしてくれることを期待します。
前回の -a は付けないで wmake を行います。
wmake -f makefile.ow2
修正した2つのファイルが関係する .obj や .exe だけが再度作成されます。
左上図のようにビルドは完了するはずです。
時間的には、フルで行う場合の 1/3 くらいにはなったと思います。
これがいろいろなプログラミング言語で使われている make コマンドの恩恵です。
(私もそんなに詳しく make を知っていて活用しているわけではありません)
以上で2つの .asm ファイルを修正してのビルドができました。
この作業の動画(動画 33 本目、5分04秒、110MB)
ビルドを行ったところで、各 .exe ファイルを実行してみます。
at
や src
で目的のディレクトリへすばやく移動できるようにしてありますので利用してください。(at.bat, src.bat)<> (動作確認表5) VirtualBox + FreeDOS 1.3(0xDC) + OpenWatcom 1.9 + MASM 5.10 + .asm修正
# | 同書 | ファイル名 | 動作可否(BIN\AT) | 動作可否(SOURCE) |
---|---|---|---|---|
1 | P31 | SIEVE_C.EXE | (.exe ファイルの提供なし) | ○ |
2 | P113 | TESTPROT.EXE | ○ | ○ |
3 | P135 | RMSEG.EXE | ○ | ○ |
4 | P162 | PMSEG.EXE | ○ | ○ |
5 | P175 | PUTPMEM.EXE | ○ | ○ |
6 | P175 | GETPMEM.EXE | ○ | ○ |
7 | P187 | SIEVE32.EXE | ○ | ○ |
8 | P213 | TESTGATE.EXE | ○ !without CLTS | ○ !without CLTS |
9 | P254 | HARDINT.EXE | ○ | ○ |
10 | P258 | FAULT.EXE | ○ | ○ |
11 | P291 | TESTTASK.EXE | ○ !without CLTS | ○ !without CLTS |
12 | P333 | VSIEVE.EXE | ○ | ○ |
13 | P399 | INTMON.EXE | ○ !without CLTS | ○ !without CLTS |
14 | P423 | DPMIINFO.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
15 | P428 | DPMISIEV.EXE | ○ ※ PC-DOS + Windows 3.1 にて | ○ ※ PC-DOS + Windows 3.1 にて |
16 | P446 | REVFILE.EXE | ○ | ○ |
17 | P451 | IOMON.EXE | ○ !without CLTS | ○ !without CLTS |
2つの .asm ファイルを修正したことで、表右側の SOURCE の!without CLTSの表示は消えました。
表左側の BIN\AT の!without CLTSはコンパイル済みのファイルなので、修正はできません。
以上で、!without CLTSの問題は解決されました。
…………………な、……………長かったなぁ。
4月の初めごろから始めて、今は8月の中旬だから、4カ月半くらい、この調査に付きっ切りだったことになります。
自分の本来の趣味も全然やってなかったです。
でも、これで同書「はじめて読む486」を読むにあたってサンプルプログラムの問題は無くなったのではと思います。
ただし、あくまでも FreeDOS は互換 OS ですし、OpenWatcom も本来同書が想定していた開発環境ではないので、他にも問題はあるかもしれません。
みなさんのプログラミングの勉強のお役に立てれば幸いです。