Image: 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側のキー割り当てを変更すれば回避可能。問題は、マウスカーソルの表示上の位置と実際の位置が一致しないこと。

Image: CodeView on DOSVAXJ3

マウスカーソルを一番下まで動かそうとしても、表示上はこの位置までしか下がらない。しかし、実際にはこの位置でクリックすると、一番下がクリックされたことになる。画面モード3におけるマウスドライバの仮想画面は640×200となっているが、DOSBoxに実装されているマウスドライバがDOS/Vの日本語テキストモードの座標に対応できていないと思われる。

CHEV USで英語環境に切り替えてからCodeViewを実行すると、マウスは正常に使えるようになるが、文字は化け化けになる。

Image: CodeView on DOSVAXJ3

CodeViewが使いにくいのは惜しいが、とりあえず、外部のテキストエディターを使ってDOSアプリケーションを構築する環境は整った。


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい.