DOSVAXJ3でVisual C++ 1.5を使ってMS-C開発環境を構築
16ビットDOSアプリケーションのデバッグ環境を再セットアップしようとして、以前DOSVAXを作るときにやっていた方法をど忘れして、少し手間取ってしまった。今後使うか分からんけど、備忘録として残しておく。
やることはVisual Studio 2019のNative Tools コマンドプロンプトやそれ以前のバージョンに入っている同等のバッチファイルと同じ。実行ファイルのパスをPATH環境変数に追記して、ヘッダーファイルのパスをINCLUDE環境変数、ライブラリファイルのパスをLIB環境変数にセットする。
セットアップ
DOSVAXJ3 JP190820を使用して環境作りから始めるとする。まず、適当な作業用フォルダー(例えばD:\Temp)を作る。dosboxj.confのautoexecセクションに次のように記述する。
[autoexec]
mount c D:\Temp
c:
これで、DOSVAXJ3を起動した時点で作業用フォルダーがCドライブのルートディレクトリかつカレントディレクトリになる。以降、これをディレクトリの基準とする。
Visual C++ 1.5のCDから、\MSVC15\BIN, \MSVC15\INCLUDE, \MSVC15\LIBの3つのフォルダーを作業用フォルダーにコピーする。Visual C++ 1.5は英語版は単体製品として存在するが、日本語版は単体では発売されず、Visual C++ 2.0とVisual C++ 4.x(Standardを除く)に収録されている。
環境変数セット用のバッチファイルを作る
テキストエディタでバッチファイル vcvars.bat を以下の内容で作成して、作業用フォルダーに置く。DOSVAXJ3を起動したらこれを手動で実行するか、先のdosboxj.confのautoexecセクションに記述しても良い。
set PATH=%PATH%;C:\MSVC15\BIN
set INCLUDE=C:\MSVC15\INCLUDE
set LIB=C:\MSVC15\LIB
一応、これは付属のマニュアル(英語)の通りに設定している。これでいいだろうか。試しに以下のようなHello Worldプログラムをコンパイラに通してみる。
#include <stdio.h>
int main(void)
{
printf("Hello world!\tこんにちは世界.\r\n");
return 0;
}
CLコマンドに突っ込めば、自動でリンクまで行われるはず。
C:\>cl hello.c
This program requires DOSXNT.EXE to be in your path.
DOSXNT.EXEがパスに見つからないとのエラーが出た。BINフォルダーを見ると中にDOSVとNECというサブフォルダーがあって、そこに入っていた。DOSVはDOS/V用、NECはPC-98用の環境依存コンポーネントということか。PATHにC:\MSVC15\BIN\DOSVを追加して再度実行してみる。
C:\>cl hello.c
Microsoft (R) C/C++ Optimizing Compiler Version 8.03
Copyright (c) Microsoft Corp 1984-1995. All rights reserved.
hello.c
Microsoft (R) Segmented Executable Linker Version 5.63.220 Nov 29 1994
Copyright (C) Microsoft Corp 1984-1995. All rights reserved.
Object Modules [.obj]: hello.obj
Run File [hello.exe]: "hello.exe" /noi
List File [nul.map]: NUL
Libraries [.lib]:
Definitions File [nul.def]: ;
LINK : warning L4051: SLIBCE.lib : ライブラリが見つかりません。
Enter new file spec:
LINK : warning L4021: スタック セグメントがありません。
hello.obj(hello.c) : error L2029: '__acrtused' : 未解決の外部シンボル
hello.obj(hello.c) : error L2029: '__aNchkstk' : 未解決の外部シンボル
hello.obj(hello.c) : error L2029: '_printf' : 未解決の外部シンボル
LINK : warning L4038: プログラムに開始アドレスがありません。
エラーが 3 個ありました。
コンパイラは実行できたが、必要なライブラリファイルがないとのこと。INCLUDEとLIBを見てみると、これも中にDOSVというサブフォルダーがある。結局、vcvars.batを次のように書き換えた。
set PATH=%PATH%;C:\MSVC15\BIN;C:\MSVC15\BIN\DOSV
set INCLUDE=C:\MSVC15\INCLUDE;C:\MSVC15\INCLUDE\DOSV
set LIB=C:\MSVC15\LIB;C:\MSVC15\LIB\DOSV
これでCL.EXEに通す。ここで付けている/Z7はCodeView(デバッガー)用のシンボル情報を埋め込むスイッチ。
C:\>cl /Z7 hello.c
Microsoft (R) C/C++ Optimizing Compiler Version 8.03
Copyright (c) Microsoft Corp 1984-1995. All rights reserved.
hello.c
Microsoft (R) Segmented Executable Linker Version 5.63.220 Nov 29 1994
Copyright (C) Microsoft Corp 1984-1995. All rights reserved.
Object Modules [.obj]: hello.obj /co
Run File [hello.exe]: "hello.exe" /noi
List File [nul.map]: NUL
Libraries [.lib]:
Definitions File [nul.def]: ;
エラー無し。ひとまず、DOSBox上にMS-Cコンパイラの環境が整った。Visual C++ 1.5にはMS-DOS用のCodeViewも付属しているが、こちらはDOSBoxで使うには難がある。
DOSBox上でのCodeViewはマウス操作に難あり
まず、ショートカットキーのうちCTRLキーの組み合わせがDOSBoxのキー割り当てと被るが、これはCTRL+1キーでDOSBox側のキー割り当てを変更すれば回避可能。問題は、マウスカーソルの表示上の位置と実際の位置が一致しないこと。
マウスカーソルを一番下まで動かそうとしても、表示上はこの位置までしか下がらない。しかし、実際にはこの位置でクリックすると、一番下がクリックされたことになる。画面モード3におけるマウスドライバの仮想画面は640×200となっているが、DOSBoxに実装されているマウスドライバがDOS/Vの日本語テキストモードの座標に対応できていないと思われる。
CHEV USで英語環境に切り替えてからCodeViewを実行すると、マウスは正常に使えるようになるが、文字は化け化けになる。
CodeViewが使いにくいのは惜しいが、とりあえず、外部のテキストエディターを使ってDOSアプリケーションを構築する環境は整った。