仮想環境でMS-C/C++ 7.0を動かしてみる。

MS-C/C++ 7.0を引っ張り出してVirtualBoxのPCDOS環境にセットアップした。

カッコイイセットアップ画面でFD18枚の入れ替えが始まる。

Microsoft C/C++ 7.0のDOS/V版。Windows 3.0/3.1、DOS対応でMS初のC++コンパイラ。今では似ても似つかない姿になっている後のVisual C++の中核になるMFC(Microsoft Foundation Class Library)も初登場。

VirtualBox+PCDOS2000の環境だと思ったより素直に動く。ビデオドライバは標準VGAでないとCodeView for Windowsが動かない仕様なので素直にVGAのままにしておく。大学の卒研もこれでプログラムを作った思い出。当時はDOSプログラムだけできれば十分だった。

DOS/V、VESA対応のグラフィックライブラリも完備。

いちいちコンパイラひとつ動かすのにブログエントリひとつ用意するのもどうかと思うが、MSC7はいろいろやっかいで、ただでさえ面倒なDOS/Vを仮想マシンに構築してその上でDOSエクステンダ仕様のコンパイラを安定して動かすなんてことがいかに面倒であるか、しかしやってできなくはないということを64ビットな今の世でDOS/Win16プログラムを作りたい方々にお知らせしたい。

いちばん面倒なのがコンパイラ本体がDOSエクステンダ仕様で32ビットDPMIを要求するところ。しかもDOSのDPMIサーバが付いてなくてピュアDOSだと動かない。だからWindows3.x用のDPMI補助ドライバが付いているのでそれを使ってWindows3.x上で動かせと。DOSのコンパイラが欲しくてわざわざMSC7を買ったのにDOSだけでは使えないとかどんだけ。

DOSで使いたいのにフリーのcwsdpmiだとエラーでストップして動かないし、QEMMで使えると聞いてQEMM9を買ってみて、QEMMのマニュアルにもDPMIで動くソフトの例としてMicrosoft C/C++が挙げられてるのに、やっぱりエラーで動かないし、いろいろ試して結局ピュアDOS環境でMSC7がきちんと動くDPMIサーバは当時のBorland C++(4.0/5.0)に付いている32rtm.exeと、OpenDOS 7.01(DR-DOS)に附属の仮想EMSドライバだけだった。使えるのが敵対する他社製だけとはね。今回は面倒なんでWindows3.1を使ったけど。それとコンパイラ本体は32ビットDPMIで動くのにそれで吐けるコードは32ビットDPMIはおろか16ビットDPMIすら対応していないとかどんだけ。

Quick CのDOS/V版があればそれでよかったんだけど、Quick CはPC-9801版しかなくてDOSプログラムはQuick C 2.0のセットアップが作るCL環境(コマンドラインツールが一式入った実行用FD)をDOS/Vに持ってきて、グラフィックライブラリだけMSC7から持ってきて差し替えた変な環境で十分だった。まわりは三流ながらも理系私大だけありPC98あがりの人が多くてTurbo Cが多数派。肩身が狭かった。その後ボーランドは迷走をはじめてWindowsの開発環境はVisual Studio一択になっていく状況だったからMSC7で得た意味不明な苦労もそれなりに役に立った。



感想だけ述べていてもしかたがないから環境も載せる。VirtualBoxでPCDOS2000/7用。VMwareでも$DISP.SYS /HS=OFFにすれば動くし、DOSDATA=UMBを消せばPC DOS 6.3でも動くはず。

●CONFIG.SYS

BUFFERS=10
FILES=30
STACKS=9,256
DOS=HIGH,UMB
DOSDATA=UMB
COUNTRY=081,932,C:\DOS\COUNTRY.SYS
SHELL=C:\DOS\COMMAND.COM /P /E:1024 /H
DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE RAM
DEVICEHIGH=C:\DOS\SETVER.EXE
DEVICEHIGH=C:\DOS\$FONT.SYS
DEVICEHIGH=C:\DOS\$DISP.SYS /HS=LC
DEVICEHIGH=C:\DOS\$IAS.SYS
DEVICEHIGH=C:\DOS\ANSI.SYS /X
DEVICEHIGH=C:\DOS\POWER.EXE
DEVICEHIGH=C:\UTY\OAKCDROM.SYS /D:CDROM1
INSTALLHIGH=C:\DOS\IBMMKKV.EXE /M=S /Z=4 /C /L /J=90 /S=C:\DOS\MULTDICT.PRO /U=C:\$USRDICT.DCT


●AUTOEXEC.BAT

@ECHO OFF
PROMPT $P$G
PATH=C:\C700\BIN;C:\WINDOWS;C:\DOS
SET COMSPEC=C:\DOS\COMMAND.COM
SET TEMP=C:\TEMP
SET TMP=C:\TEMP
SET LIB=C:\C700\LIB;C:\C700\MFC\LIB
SET INCLUDE=C:\C700\INCLUDE;C:\C700\MFC\INCLUDE
SET HELPFILES=C:\C700\HELP*.HLP
SET INIT=C:\C700\INIT
LH C:\DOS\KEYB.COM JP,932,C:\DOS\KEYBOARD.SYS
LH C:\DOS\DOSKEY.COM /INSERT
LH C:\DOS\MSCDEX /D:CDROM1
LH C:\DOS\SMARTDRV.EXE
LH C:\DOS\MOUSE


●SYSTEM.INI (抜粋)

[386Enh]
device=*vmcpd
device=C:\C700\BIN\vpfd.386
device=C:\C700\BIN\vmb.386


設定のポイントとして、ツール類は環境変数を参照するだけなのでPATH、INCLUDE、LIBが設定されていればコンパイラとリンカは動く。環境変数は値が長くなるのでSHELL=の環境変数のサイズは/E:1024とか多めに指定する。空きメモリが足りずにPWBでヘルプが参照できないときはCD-ROMデバイスドライバなんかを削除するか、EMM386.EXEにX=xxxx-xxxxやI=xxxx-xxxxパラメータを追加してUMBを調整する。SYSTEM.INIは32ビットDPMI補助ドライバを組み込んでおく。Win9x/NT以降ならそのまま動くから要らなかったはず。

Windows3.1の場合セットアップはDisk2のsetup.exeで始める。Disk1のsetupはWindows3.0用。ピュアDOS用にセットアップする場合はDiskのcsetup.exeを使う。ただしピュアDOSで動かす場合はDPMIサーバを用意する必要があり、一番手っ取り早い方法はBorland C++から32RTM.EXE、DPMI32.OVLを持ってきてCL.EXEやLINK.EXEを動かす前に実行すること。このときコンパイルやリンクが終わったら速やかに32rtm -u でアンロードする。先に32rtmを実行してそのうえでPWBを動かすと、DPMIの制約でマウスが使えないとかわけのわからないところで落ちるとかで困ることになるから、NMAKE処理を横取りするNMAKE.BATを作成しておくとピュアDOSでもPWBからシームレスにビルドできる。ビルド中にCtrl+Cで止めるとおかしくなるので注意。

●ピュアDOSで使うnmake.bat (nmake.exeはnmake_.exeにリネームしておく)

32rtm
nmake_ %1 %2 %3 %4 %5 %6 %7 %8 %9
32rtm -u
騙されてnmake.batが呼ばれる。


・PWBのキーリピートが早すぎる問題の解決。
VirtualBoxではそこまで気にならないもののPentium100MHzクラスの実機だとリピートが早すぎて壊滅的に使えない。PWBのメニューでOptions→Editor Settings…でSwitch Owner:PWB、Switch Type:Textでfastfunc: の項目をすべてonからoffに変更する。TOOLS.INIを直接変更してもよい。

●TOOLS.INI

[pwb]
fastfunc: cdelete off
fastfunc: delete off
fastfunc: emacscdel off
fastfunc: graphic off
fastfunc: insert off
fastfunc: mlines off
fastfunc: mpage off
fastfunc: mpara off
fastfunc: mword off
fastfunc: plines off
fastfunc: ppage off
fastfunc: ppara off
fastfunc: pword off
fastfunc: sdelete off
fastfunc: select off
fastfunc: sinsert off
color: text 0f
color: desktop 07

テキストと背景色も黒に変更した。これで少しはまともに使えるようになる。

・グラフィックライブラリのヘッダ修正
graph.hのVGAを超える解像度や色数に関する次の部分がコメントアウトされているので必要に応じてコメントを外す。

/* the following 8 modes require VESA SuperVGA BIOS extensions */
//#define	_ORES256COLOR	0x0100	/* 640 x 400, 256 color */
//#define	_VRES256COLOR	0x0101	/* 640 x 480, 256 color */

/* WARNING: DO NOT attempt to set the following modes without ensuring that
   your monitor can safely handle that resolution.  Otherwise, you may risk
   damaging your display monitor!  Consult your owner's manual for details.
   Note: _MAXRESMODE and _MAXCOLORMODE never select SRES, XRES, or ZRES modes */

/* requires NEC MultiSync 3D or equivalent, or better */
//#define	_SRES16COLOR	0x0102	/* 800 x 600, 16 color */
//#define	_SRES256COLOR	0x0103	/* 800 x 600, 256 color */

/* requires NEC MultiSync 4D or equivalent, or better */
//#define	_XRES16COLOR	0x0104	/* 1024 x 768, 16 color */
//#define	_XRES256COLOR	0x0105	/* 1024 x 768, 256 color */

/* requires NEC MultiSync 5D or equivalent, or better */
//#define	_ZRES16COLOR	0x0106	/* 1280 x 1024, 16 color */
//#define	_ZRES256COLOR	0x0107	/* 1280 x 1024, 256 color */

- 中略 -

//#define _HGC		0x0020	/* Hercules Graphics Card	      (HGC)  */
//#define _OCGA		0x0042	/* Olivetti Color Graphics Adapter    (OCGA) */
//#define _OEGA		0x0044	/* Olivetti Enhanced Graphics Adapter (OEGA) */
//#define _OVGA		0x0048	/* Olivetti Video Graphics Array      (OVGA) */
//#define _SVGA		0x0088	/* Super VGA with VESA BIOS support   (SVGA) */

取説に使えると載っているのにヘッダファイルのコメントアウトのことがどこにも書いてなくてハマった。VirtualBoxで_ZRES256COLORが使えることを確認。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中