MS-DOS Player for Win32-x64

This is MS-DOS emulator running on Win32-x64 command prompt.
16bit MS-DOS compatible commands can be executed on Win32-x64 envrionment.

Download



MS-DOS Player for Win32-x64 謎WIPページ

私が開発するネタとしては、珍しく実用的かもしれませんね。
まあ、自分が必要で作っただけなんですが(苦笑)



2014/8/28
i386コアについて、メモリリークが発生していたのを修正しました。
また、x87のFPREM/FPREM命令について、MAME 0.154にあわせてフラグの処理を修正しました。



2014/7/10
ビルドオプションを変更して、もう少しほんのりと高速化しました。
i286版のx64バイナリで、前回の変更とあわせて30%程度は速くなっているかと思います。



2014/7/8
i286版を、ほんのり高速化しました。
また、PSP用に確保したメモリのMCBに、プロセス名をコピーするようにしました。



2014/4/15
i286版とi386版のソースを統合しました。
また、i286版において、int 10h/16hのサポートを追加しました。

i286コアをMAME 0.149相当に、i386コアをMAME 0.152相当に差し替えました。
ただし、i386コアについては、TLB周りをオミットしています。



2014/4/8
i286版もまだ需要があるようですので、久しぶりに更新しました。
i386版の最近の変更を反映していますが、速度優先ということで、int 10h/16h周りは未実装のままです。



2014/4/7

COMMAND.COMを起動する場合、環境変数のCOMSPECに、そのCOMMAND.COMのパスを指定するようにしました。
また、PATH/TMP/TEMPに指定されているパスを、すべてショートパスに変換するようにしました。

先日公開された、MS-DOS V2.0のCOMMAND.COMが起動するようになっています。
こいつは、COMSPECに登録されているパスを頼りに、自分自身をメモリにロードしているみたいです。
まあ起動するというだけで、実用的価値は皆無なんですが(苦笑)



2014/3/27

BLOGの方でご指摘いただいていた、EXDEBでカーソルキーが正しく効かない不具合を修正しました。

このソフトでは、int 16h, ah=11hでキー入力を検出して、int 21h, ah=08hでキーコードを取得しています。
従来は、int 16h, ah=11hでキー入力を検出すると、int 16h, ah=10hでキーコードを取得することを前提に、
int 16h用のキーバッファにキーコードを移していました。
そのため、int16h, ah=11h実行後、int 21h, ah=08hでキーコードを正しく取得できなかったようです。

その他、int 21h, ah=52hで取得するDOS内部情報を、従来より正確に設定するようにした他、
ここから参照される、システムファイルテーブル、CDS、FCBテーブルを初期化するようにしました。
この修正で、何か動くようになったかは不明です。



2014/3/13

Windows 98 Second Edition用のCOMMAND.COMが動作するようになりました。
int 21h, ah=59h(拡張エラーコード取得)、int 2fh, ah=aeh(プログラム起動)などを実装しています。



2014/3/12

JR運賃計算システム MARS for MS-DOSが動作するようになりました。

従来動かなかったのは、int 21h, ah=3chで、CONデバイスを開くのに失敗していたのが原因です。
失敗していたのは、Turbo Paacalのランタイム内部の処理ですので、Turbo Pascalで開発された、
他のソフトも動くようになっているかもしれません。



2014/3/7
int 10h(ビデオ)、int 16h(キーボード)など、PC/ATのBIOSの実装を進めました。
FDやDoDiaryなど、PC/AT用のソフトが色々動くようになっているかと思います。


FDは一応ちゃんと動いてる感じです。
開発中、ファイルのリネームに失敗する問題がありましたが、これは解決済みです。
あまり使い込んでないので、どこかしらで未実装のサービスを叩いてしまって、
落ちてしまう箇所があるかもしれません。


FILMTNは一見動いてるっぽいのですが、プログラムを実行しようとすると、
そこで正常終了してしまいます。
なおFILMTNでは、ファイル一覧の取得に、FCBを使ったファイル検索を実行しています。
FCB絡みの処理は未実装だったので、ファイル検索とファイル削除だけ実装しました。


DoDiaryは、環境変数テーブルが1KB以下である必要があります。
最近のWindowsでは環境変数が大幅に増えていて、環境変数テーブルも大きくなりがちです。
そのため、msdos -e dd.comのように、-eオプションを付けることで、必要最低限の環境変数のみ
ホスト環境から読み込む仕組みを追加しました。


LIST.COMも、今回の更新で動くようになっています。
このソフトは、int 10h, ah=ffhで仮想テキストVRAMを画面に反映する処理をしていません。
そのため、仮想テキストVRAMにデータが書き込むと、すぐ画面に反映する仕組みを入れました。



2012/12/23

int 21h(ディスクのRAWライト)をサポートしました。
marucopyでのディスクへの書き込みがちゃんと動作するようになっています。
ただし、安全のためフロッピーディスクのみライト可としています。

この関係で、DPB中のメディアの種類を正しく取得できるように修正しました。
USBメモリなどはハードディスク扱いとしています。
また、int 21h, ah=1bh/1ch(FAT情報の取得)をサポートしました。

int 21h, ah=0ehで、不正なドライブが指定されるとクラッシュする問題を修正しました。
LIST.COMで起動時にクラッシュする問題が解決しています。
(LIST.COM自体はPC/ATの画面モードを前提にしているみたいで、現状では動作はしません)

その他、int 21h, ah=66h(コードページの取得、変更)をサポートしたり、
int 21h, ah=67h(最大ファイル数の指定)をサポートしたり、
使うかどうか分からないようなサービスやPC BIOSを幾つかサポートしたり、
色々修正していますが、細かいことは忘れちゃいました(苦笑)



2012/8/23
CPUコアを、MAME 0.146u3ベースのi386に差し替えました。
また、int 21h ah=52h(DOSの内部ワークエリアアドレスの取得)をサポートしました。
これによって、要i386だったDDEBが動作するようになっています。

DOS-EXTENDER対応については、今のところ未定です。



2010/11/13
今回は色々と修正を行っています。
従来動いていたソフトが動かなくなってましたら、ご報告お願いいたします。


ロングファイルネームに対応しました。
Windows95で追加された、int 21h ah=71hのシステムコールが大体サポートされています。
(ただし、SUBSTとネットワーク関係は未実装です)
これにより、MGやFMのロングファイルネーム対応版が動作するようになりました。


また、ディレクトリの検索時に、ボリュームラベルも列挙するように修正しました。
FMでボリュームラベルが正しく表示されるようになっています。
ついでに、ファイルの時間がUTCのままだったのを、ローカル時間に変換するように修正しています。

その他、細かい修正を色々と行っています。

従来は日本語環境を決めうちにしていましたが、ホスト環境のコードページを参照して、
DBCSテーブルを初期化するようにしました。
漢字などマルチバイト文字の判定も、こちらのテーブルを参照して行います。

int 21h ah=5ch(ファイルロック)、ah=6ch(拡張ファイルオープン)に対応しました。
また、隠しシステムコールであるint 2fhも部分的にサポートしています。
こちらは、主にデバイスドライバやWindowsのインストールチェック用です。

PITエミュレーションを、PITにアクセスがあったときのみ行うようにしました。
これで、PITを直接操作するソフト以外で、多少高速化しているかと思います。
また、カウントを16bitで読み込む際に、常に下位8bitが読み込まれる不具合を修正しています。



2010/11/10
blogの方でa様からご指摘を頂きました、int 21h ah=3fhの不具合の件について、
今回も佐川様よりご提供頂きましたパッチを取り込みました。 どうもありがとうございます>お二方


int 21h ah=1fh/32h(DPBの取得)およびint 25h(ドライブの物理リード)をサポートした結果、
ディスクのイメージ化ツールであるMARUCOPYが動作するようになりました。


int 26h(物理ライト)については、危険防止のため常にエラーを返すようにしています。
処理の実装はしてあるのですが、Windows Vista/7では管理者権限がないと動作しないようです。


ようやくISH.COMが動作するようになりました。
ISH.COMには不正な命令が含まれているようで、従来はエラー終了するようになっていたのを、
そのまま次の命令に進むように修正しました。
その他、int 21h ah=4eh/4fh(ファイルの検索)の属性チェックの厳密化やエラーコードの修正、
スペースが含まれるファイル名の補正処理などを追加しています。



2010/7/1
佐川様よりご提供頂きました、int 21h ah=29hの修正およびmingw32対応のパッチを取り込みました。
また、blogの方でdosanko様よりご指摘頂きました、環境変数が大きい場合の不具合修正を行いました。
どうもありがとうございます>お二方

先日新たにご指摘いただいた、symdebのrコマンドの件はまた後日にでも。



2009/12/18

標準入出力のリダイレクトをサポートしました。
SYMDEBの<コマンドや>コマンドが動作するようになっています。


パイプを使って、TYPEコマンドから受け取ったコマンドをSYMDEBに渡して、
更にSYMDEBの出力をMOREコマンドに渡す、なんてことも可能です。


WEXが動作するようになりました。
FMをサポートした際に、int 21h ax=4b00hをエンバグしてしまっていたのを修正しています。
(肝心のLSI C-86まで動かなくなっていたのも直っています)

コマンドのファイルが存在しなかったとき、そのままsystem()コマンドに渡していましたが、
これだと*.COMをまず起動しようとして、失敗したら*.EXEとして実行する、というように
コマンド起動が失敗し得ることを想定した処理でうまくいかなくなっていました。
このため、COMMAND.COM /C付きで起動しようとしたときのみ、system()コマンドに渡すように
修正しました。

また、int 21h, ax=4406hの処理も修正しています。
渡されたファイルが入力モードか出力モードかの判定をするものだと解釈していたのですが、
更に入力モード時に、読み込み可能なデータがあるかかどうかも判定しているんですね。
(例えば、kbhit()もこのコマンドを使って実行されるのかな?)



2009/12/10

今更ながらLHAが動作するようになりました。
Windows用のツールが幾らでもありますが、これが動かないとみっともない気がして。

これが今まで動いていなかったのは、int 21h ah=4eh/4fhのファイル検索において、
検索結果を格納する際にアトリビュートをコピーし忘れていたという、これまたみっともない。
その他、解凍時に使用している、int 21h ah=60h(真のパスを取得)を追加しています。


DOS汎用のファイルマネージャであるFMが動作するようになりました。
int 21h ah=47hで現在のパス取得する際、ドライブ文字と最初の\を削除するように修正したり、
int 21h ax=4b00hで、直接プログラムを起動するのではなく、"COMMAND.COM /C (program)"と
わざわざCOMMAND.COMやCMD.EXEを経由して起動するような場合に対応したり、
コンソール出力において、Console系APIを使って自前でエスケープシーケンスに対応したり、
その他にも色々と修正しています。
ドライブのボリューム名や空き容量が正しく取得できてないのは、また後日にでも。



2009/12/08
ハードウェアのエミュレーションは行わないという方針で今まで実装してきましたが、
CPUBENCHが動かないのもなあ、ということで、PICとPITを実装してみました。


PITは、カウント値を周波数で割ってmsecの値にして、CPUコアが1024ステップ実行する毎に、
timeGetTime()の値と比較する、といった感じで駆動しています。
精度もまあそれなりなので、CPUBENCHの結果をどう評価するか難しいところですね(苦笑)

で、ついでにCPUコアを80286にしてみました。
あわせてプロテクトモード用にメモリを16MBにしたり、A20ラインの制御をサポートしたり、
リアルモード復帰に必要なRTCのCMOSメモリとか、キーボードコマンドのCPUリセットとか、
その辺のI/Oも追加しています。
その他、PC BIOS(int 15h)のうち、プロテクトメモリ絡みの87h, 88h, 89hにも対応しました。
全然確認はできていないのですが、80286のプロテクトモードを使うアプリも動くかもしれません。

また、オプションを指定せずに起動した場合に、PSPの後半のコマンド列の領域の初期化が
ちゃんとされていなかったのを修正しました。
+80Hの文字列長が0になっていればいいかと思ったのですが、文字列長をまったく参照せず、
いきなり+81Hから文字列の解析をはじめるアプリケーションもあるようです。
この場合、最悪PSPを突き抜けて、ロードしたプログラムの内容を破壊する場合もあり得ます。
この修正で、従来動かなかったソフトで改善されたものがあるかもしれません。



2009/12/06
SYMDEBにおいて、EXEファイルのステップ実行がうまくいかない不具合を修正しました。


従来の実装だと、JMP命令を実行しても、そのまますぐ次の命令に進んでいました。


これが、ちゃんとジャンプ先の命令に進むようになっています。
どうも、int 21h ax=4b01hでパラメータブロックに返るSPの初期値の問題だったようです。
(SPの値の表示が0102から0100に変わっていることに注目)

その他、従来はファイル操作関係の処理にファイルストリームを使用していましたが、
これを下位入出力関数で処理するように修正しました。
機能的には変わりないですが、ソースがすっきりしてバイナリサイズも小さくなっています。



2009/12/05
BLOGのコメントで、動作しないと報告して頂いたプログラムの対応を図りました。
VTDOSという強力なライバル出現にかなり刺激されてたりします(苦笑)


画像コンバータMGが動作するようになりました。
CPUのエミュレーションを、8086からV30に変更しました。
また、int 21h ah=02h/06hで漢字を1バイトずつ出力する際、文字化けしないよう修正しました。


SYMDEBが動作するようになりました。
Lコマンドの実行で使用している、int 21h ax=4b01h(ファイルを読み込むけど起動しない)、
int 21h ah=26h/50h/51h(現在のPSPのコピー作成、PSPアドレスの設定、取得)をサポートしています。


作成したコマンドのデバッグも可能です。


!コマンドで、DOSコマンドを呼び出すことも可能です。
int 21h ax=4b00hで、COMMAND.COMまたはCMD.EXEを/Cオプションを付けて起動しようとしたとき、
system()関数でコマンドを実行するようにしています。

またSYMDEBでは、!コマンド実行時に、COMSPECからインタプリタ名を取得しているようですが、
このとき環境変数名がComSpecと小文字混じりになっていると正しく認識できないようです。
このため、ホスト環境から環境変数をコピーする際、変数名を大文字にするように修正しました。

#SYMDEB.EXEの入手に困って、HANDY98のROMドライブから吸い出したものを使ってたり(を



2009/11/20
環境をWindows VistaかWindows 7のx64環境に移行しようかと思っているのですが、
16bitプログラムが使用できなくなってしまうのが悩みの種だったりします。
実機のROM吸出しや解析ツールの開発に、いまだにLSI C-86試食版を使っているので、
中々踏み切れないんですよね。

Virtual PCなりQEMUなり、仮想環境を使うのも一つの手段ではあるのですが、
ホスト-ゲスト間でいちいちファイルの受け渡しするのが面倒くさくって。
ホストのファイルパスや環境変数をダイレクトに操作できる、コマンドプロンプトから
シームレスに使える、お手軽な方法が欲しいなと。

で、自分で作ってみたと(苦笑)



どういった機能なのかは、上記画面を見れば大体判るかと思いますが。
msdos (コマンド) [オプション]とすると、MS-DOSアプリがx64上で動作します。
エミュレーション対象は、CPU(8086)とメモリと一部のMS-DOSのシステムコールだけで、
ハードウェアを直接操作するようなアプリケーションは実行できません。
純粋なMS-DOS汎用のアプリケーションのみが動作対象となります。

現状ではLSI C-86試食版のみの対応です。
他のアプリケーションの対応は反響次第ということで。