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ページ

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



2016/6/24
16bitのコマンドファイルをmsdos.exeに埋め込む処理を改良しました。

PEフォーマットに従って、実行ファイルに新たなセクションを追加して、そこにコマンドファイルを
格納するようにしました。
従来よりも、ウイルスとして誤検出される危険が減っているといいなあと思います(苦笑)

実行時に、埋め込まれたコマンドファイルを展開する際、できるだけ元と同じファイル名で
カレントディレクトリに展開するようにしました。
例えば、VZエディタでは、コマンドファイルと同じファイル名の定義ファイルを読みに行くように
なっていますので、そのようなケースを考慮した修正です。
ただし、カレントディレクトリに、同じファイル名のファイルがある場合は、上書きしないように、
テンポラリなファイル名で展開されます。
なお、展開したコマンドファイルは、終了時に自動的に削除されるようになっています。

また、実行時のコードページを記録するかどうかを、-pオプションで指定できるようにしました。

メモリ管理系のサービスの実行時に、Memory Control Blockが壊れているのを検出した場合、
また、プロセスの終了時に、PSPが書き換わってしまったなどの理由で、プロセス管理データを
取得できなかった場合、従来は、問答無用でMS-DOS Playerを終了するようになっていましたが、
しかるべきエラーコードを返して、処理を続行するように修正しました。
(どのみち致命的な状況なので、素直に強制終了しておいた方がいいかもしれませんが…)

コンソールウィンドウが閉じられた、またはエミュレータ内部で致命的なエラーが発生したなど、
正常に終了できない場合に、newやmallocで確保したリソースを、出来る限り開放するようにしました。

int 2ehで起動したプロセスが終了したときに、または、プロセスの起動に失敗した場合に、
axにステータスを格納するように修正しました。

BIOSデータエリアの0040:0010や、int 11hで取得される、Equipment List Flagsの値を修正しました。
フロッピードライブ数の情報を追加するようにしました。(A:およびB:のみチェック)

16bitのコマンドファイルが格納されているディレクトリがあったとして、ホスト環境のPATHでは
参照したくないけど、MS-DOS PlayerのPATHでは参照したい場合があるかと思います。
このような場合のために、MSDOS_PATHという環境変数にディレクトリを登録しておくと、
ホスト環境のMSDOS_PATH;PATHが、MS-DOS PlayerのPATHにコピーされるようにしました。
このため、MS-DOS Player上では、MSDOS_PATH内のファイルが先に検索されるようになります。



2016/6/22

16bitのコマンドファイルをmsdos.exeに埋め込んで、単体で動作する32bit/64bitの実行ファイルを
生成する仕組みをサポートしました。

例えば、msdos.exe -cMARS32.EXE MARS.EXEのように実行すると、MARS.EXEを埋め込んだ、
MARS32.EXEという実行ファイルが生成されます。
このとき、MARS32.EXEは、msdos.exeなしで単体動作することができます。

-c以外のオプションを指定すると、実行時に、それらのオプションが指定された状態になります。
例えば、msdos.exe -ccommand32.exe -v6.22 -x command.comのように指定すると、
バージョンが6.22、XMS/EMSが有効な状態で、command.comが起動する実行ファイルになります。


EXDEB起動時に、Machineの表示が乱れる問題を修正しました。

int 21h, ah=30hにおいて、bhだけでなく、blおよびcxを更新するようにしました。
EXDEBでは、bl=00hだとPC-98、bl=01hだとPC-AT、bl=02hだとFRMと表示します。
Windows 98 SEで確認したところ、bl=00hが返るようなので、それに合わせました。

int 15h, ax=5000h/5001hを修正しました。
int 15h, ax=5000hを実行して、エラーが返らないと、DOS/Vと判定しているようです。



2016/6/21
CTRL-Cを押したときの処理を修正しました。
int 21hの、一部コンソール系のサービスを実行中に押した場合、int 23hが実行されます。
CTRL-Breakについては、従来通り、即エミュレータが終了するようになっています。

シリアルポートの改良を行いました。
指定されたボーレートが、Windows側でサポートしているかチェックするようにしました。
ブレーク信号を、最低限200msecはオンにしたままにするようにしました。
また、フロー制御を、Windows側に任せるようにしました。
DSR/CTS信号については、I/Oポートに出力したDTR/RTS信号がそのまま読み込まれます。

タイマーの改良を行いました。
タイマーをtimeGetTime()で駆動しているため、従来は、カウント中の値を取得すると、
1msecはずっとそのままの値が返ってきていました。
これを、1msec後のカウント値を下回らない範囲で、値を取得する毎に-1するようにしました。

IO.SYSの空間(0070:0000)に、更にダミードライバを追加しました。
また、各ドライバのStrategy/Interruptに、ダミーのルーチンを指定しました。
余り意味はないですが、わざわざドライバヘッダを検索して、Strategy/Interruptルーチンを
直接呼び出すようなソフトがあれば、いきなり暴走はしなくなっているかと思います。

BIOSデータエリアの0040:0010や、int 11hで取得される、Equipment List Flagsの値を修正しました。
ポインティングデバイスの有無や、シリアル・パラレルポート数の情報を追加しています。

フロッピードライブ数の情報はどうしましょうか?
GetDriveType()はリムーバブルか否かしか判断できないし、DeviceIoControl()は大げさですし。
A:/B:ドライブ限定でGetDriveType()が無難かな、とは思うのですが。
実際、わざわざ設定するほど重要な情報でもないような気がするんですよね(苦笑)



2016/6/17

シリアルポートの実装を行いました。
安定性にはまだ難があるかもしれません、テストにご協力お願いいたします。

仮想マシンのCOM1, COM2を、ホスト側の任意のCOMポートに接続することができます。
ホスト側のCOMポートは、USB接続のシリアルポートを使用可能です。
(今回のテストでは、I/OデータのUSB-RSAQ5を使用しました)
-sオプションで、ホスト側で見つかったCOMポートの順に、COM1, COM2に割り付けられます。
-s3,4のように、オプションで、ホスト側のCOMポートの番号を指定することも可能です。

なお、通信速度は、9600bpsまでに制限しています。
3F88h, 2F8h辺りのI/Oポートを直叩きすることも、int 14h経由で操作することも可能です。

スクリーンショットは、株式会社エイテックのSmart-Writer SW-1のコントロールソフトです。
シリアルポートのテスト用に、ヤフオクで調達しました(を
スーパーカセットビジョンの、ドラゴン大秘境のROMを吸い出しています。

int 21h, ah=65h, al=23h/a0h/a1h/a2hをサポートしました。
int 2fh, ah=14h, al=00h/01h/02h/03h/04hをサポートしました。
主に、NLSFUNC.COM関係のサービスです。

その他、ダミーのDMAコントローラやパラレルI/Oを実装したり、IO.SYSの空間(0070:0000)に、
ダミーのCON/CLOCK$ドライバのヘッダを置いたりしています。
ダミードライバを追加してみたものの、まだMEM.EXEが認識してくれないんですよねえ。



2016/6/10

マウスの実装を行いました。
MS-DOS Playerはコンソールアプリのみサポートしていますが、DOSSHELLやEDITなど、
DOS標準のツールの中にも、マウスを使用するものもあるようです。

DOSSHELLでは、選択したプログラムの実行のため、TEMP以下にバッチファイルを作ります。
Windowsでは、TEMPは"C:\User\(User Name)\AppData\Local\Temp"のようなパスになりますが、
バッチファイルのパスが長くなり過ぎて、正しく動作しない場合があります。
この対処として、ホスト側でMSDOS_TEMPという環境変数(例えば、"C:\TEMP")があれば、
その値が、仮想環境のTEMP/TMPの値として使われるようにしました。

COMMAND.COM上で、"COPY (file) (directory)"の実行に失敗する不具合を修正しました。
COMMAND.COMは、コピー先のパスを、int 21h, ah=6chでファイルとして開いてみて、
失敗したら、コピー先のパスがディレクトリであるか判断しているようです。
このとき、int 21h, ah=6chで、ファイルを開くのに失敗したときに返るエラーコードは、
ファイルはあるけど何故か開くのに失敗した場合と、ファイルがないから失敗した場合とで、
ことなる値になるべきです。
従来の実装では、_access()関数を使って、ファイルの存在チェックをしていましたが、
この関数は、ファイルだけでなくディレクトリの存在もチェックしてしまいます。
このため、FindFirstFile()関数を使って、アトリビュートをチェックしてやることで、
ファイルかディレクトリかをチェックするように修正しました。
まだこんなバグが残っていたのかと、個人的にちょっとショックだったりします(苦笑)

その他、int 21h, ah=29hにおいて、ドライブ付のファイルパスのパースに失敗するように
エンバグしてしまっていたのを修正したり、雑多なサービスの実装をしたりしました。



2016/6/8
FreeDOS関係の動作確認中です。
COMMAND.COMでCOPYに失敗する問題、MORE.EXEでキーを受け付けない問題を修正しました。

COPYの方は、int 21h, ah=40hで、cx=0000hを指定したときのaxの返り値の問題でした。
cx=0000hの場合、現在のシーク位置にファイルサイズを変更します。
現在のシーク位置が、現在のファイルサイズより先にある場合、00hを付け足すことで、
シーク位置までファイルを大きくしますが、このとき付け足したバイト数をaxに返していました。
この場合、ax=0000hを返すのが正しかったようです。

MOREの方ですが、例えばTYPE (file) | MOREを実行すると、MORE.EXE上では、
ファイルハンドル複製/多重化の果てに、ファイルハンドル0番にstderrが割り当てられいて、
コンソール系のAPIが正しく動作しなくなっていたみたいです。
ファイルハンドル0番がattyで入力なデバイスでない場合は、コンソール系のAPIではなく、
_kbhit()や_getch()などの関数を使用するように修正しました。
これらの関数だと、ファイルハンドルの状態によらず、キーボードを読んでくれるようです。

また、コンソール系のAPIで使用するハンドルは、起動時にGetStdHandle()で取得したものを
ずっと使いまわしていましたが、ファイルハンドル複製/多重化の影響を受けて、
ハンドルが無効になってしまう場合があるようです。
そのため、コンソール系のAPIを使うたびに、GetStdHandle()で取得するように修正しました。

その他、DOS Swappable Data Areaやその中のInDOSフラグの取得(int 21h, ah=34h/ax=5d06h)、
拡張国別情報の小文字テーブルの取得(int 21h, ax=6503h)をサポートしました。



2016/6/7
PITの動作タイミングの精度向上を図りました。
CPUBENCHなどで、結果のバラつきが減っているかと思います。

int 21h, ah=44h(IOCTRL関係)やint 21h, ax=71aah(SUBST)をサポートしました。
SUBSTが動くようになっていますが…余り意味はないですかね(苦笑)

デバッグ用のコード整理を行いました。
その結果見つかった、これまで未実装だったサービスを幾つか実装しています。
但し、大半は、単に該機能が未サポートだとのエラーを返すだけです。



2016/6/3
更にEMS/XMSの実装を進めました。
int 67h, ah=4fhを新規にサポートしました。
また、XMS call ah=04h/05/06hの、A20マスク周り(主にローカル関係)を改良しました。
動作検証は出来ていないけど、実装としてはこれで一段落?
int 67hには、VCPI周りの機能も入っているのですが、流石にこれは要らないですよね?

起動時、ファイルハンドルの3番(AUX)と4番(PRN)用に、NULをオープンするようにしました。
COMMAND.COM上で、TYPEで内容を表示したファイルが、DEL出来なくなる不具合が修正されています。
TYPEコマンドでは、自分で開いたファイルハンドルを覚えておいて、終了時にそれを閉じるなんて
まどろっこしい事はせずに、5〜19番を片っ端からクローズするという豪快なことをしていまして。
そのため、3〜4番で開かれたファイルがクローズされませんでした。

システムファイルテーブル周りの実装を進めました。
int 2fh, ax=1216h/1220hを新規にサポートしました。
また、ファイルのオープン時と、int 2fh, ax=1216h時に、テーブルを更新するようにしました。

その他、int 15h, ah=89hの処理の改良や、int 15h, ah=8ah, int 21h, ax=440ahをサポートするなど、
引き続き細々とした修正をしています。



2016/6/2
EMSの実装を進めました。
int 67h, ah=4eh/50h/52h/57h/58h/5ahを新規にサポートしています。
また、EMMXXXX0をファイルオープンすることで、EMSの存在判定をする場合に対応しました。

EMS/XMSで通常使用しそうなサービス類は、これで大体サポートできたかと思います。
引き続き、テストにご協力お願いいたします。


ファイルI/Oにおいて、指定されたファイルハンドルをそのまま使うのではなく、
PSP内のファイルテーブルから、実際のファイルハンドルを取得するように修正しました。
また、子プロセス起動時に、親プロセスのPSPのファイルテーブルを引き継ぐように修正しました。

COMMAND.COM上で、リダイレクトやパイプが動作するようになりました。
int 21h, ah=45h/46hの、ファイルハンドル複製/多重化を使っていると思っていたのですが、
PSPのファイルテーブルの0〜1番(標準入出力)に、リダイレクト先のファイルのハンドルを
入れてやることで、リダイレクトを実現していたみたいです。

上記の例では、stdin.txtに記載したコマンドをSYMDEBで実行して、結果をstdout.txtに出力します。
そして、TYPEコマンドでstdout.txtを表示して、パイプでMOREに渡しています。

こちらの修正で、ファイルI/O周りをもりっと書き換えています。
影響範囲が広いので、こちらもテストにご協力いただけますと幸いです。

ところで上記の例、地味に、制御コードを^Zみたいに表示できるように修正しています。
行入力時に、バックスペースで^Zを削除するのも大丈夫です。
従来は記号が表示されてしまっていたのですが、スクリーンショットを撮ってて気になりまして(苦笑)

その他、DOS INFOのundocumentedなパラメータの処理をDOSBoxから取り込んだり、
int 21h, ah=29hの改良や、int 2fh, ax=168fhのサポートなど、細々とした修正をしています。



2016/5/29
EMSとXMSをサポートしました。
-xオプションを付けて起動すると、EMS,XMSが有効となります。
ただし、XMSはi286以降でのみサポートします。

また、コンベンショナルメモリとUMBのメモリチェインの接続をサポートしました。

十分な検証ができていませんので、テストにご協力お願いいたします。
一応、VZエディタでEMSを認識したり、X8MAPでEMS/XMSの領域を参照できるようです。



int 21h, ah=38hで取得する国別情報で参照されている、大文字変換ルーチンをサポートしました。
こちらに含まれるzip.exeを起動したとき、クラッシュせずにオプション一覧が表示されるようになりました。



システムコールのフック用のIRETテーブルを、MCBで管理されたメモリブロック内に配置するようにしました。
int 2ehの割り込みベクタのセグメントから、MCBを取得する場合のための修正です。

内蔵のi386の逆アセンブラを修正しました。
これは開発用であり、配布しているバイナリには含まれません。



2016/5/24
タイマー値を、int 1ahを使わず、直接BIOSデータエリアから取得する場合の処理を改良しました。
Turbo Pascalで作成したツールが動作するようになっているかと思います。
また、タイマー値の更新処理を高速化しました。

int 24h/25hで、32MB以上のボリュームにアクセスできるように修正しました。



2015/12/28
Windows 2000で起動しなくなっていた問題を修正しました。
コマンドプロンプトから起動したか、実行ファイルをダブルクリックして起動したかの判定に、
GetConsoleProcessList()を使用するように、2015/10/17の更新で変更していましたが、
これはWindows 2000ではサポートされないようです。
今回、LoadLibrary()でGetConsoleProcessList()をロードして使用するようにしました。
ロードできない場合は、別の方法で判定するようになっています。

現在、環境変数COMSPECの指すパスはC:\COMMAND.COMに固定されています。
その上で、MS-DOS Player上で動作するアプリがC:\COMMAND.COMにアクセスしようとしたら、
実際のCOMMAND.COMのパスにリダイレクトされるようになっています。
この実際のCOMMAND.COMのパスを、環境変数MSDOS_COMSPECで指定できるようにしました。
MSDOS_COMSPEC自体は、MS-DOS Player上で動作するアプリからは認識されません。
MSDOS_COMSPECが存在しない場合は、従来通り、COMMAND.COMを
の順に検索して、最初に見つかったパスにリダイレクトされます。



2015/11/7
sava様にご提供頂いたパッチを取り込みました。
主な修正点は以下になります。
いつもお世話になっております、多謝多謝です。



2015/10/20-2
DJGPPの動作確認をしてみました。


最新のバイナリだとクラッシュしてしまいました。
.SファイルはDJGPP/TMPに生成されていましたので、アセンブラの問題でしょうか?


ちょっと古い目のバイナリだとうまくいきました。
ダウンロードしたのは以下のファイルです。
環境構築は、こちらのサイトを参考にさせていただきました。



2015/10/20
int 21h, ah=14h/15h/17h/23h/24h/27h/28hを実装しました。
FCBを用いたファイル操作関係になりますが、使っているソフトがあるのかどうか(苦笑)

int 10h, ax=1118hを実装しました。
V-TEXTの縦長モードですが、コンソールを80x50に変更する形で実装しています。

CPUモデルにNEC V30を追加しました。
あわせて、msdos.vcprojに80186, V30, Pentium/PRO/MMX/2/3/4, MediaGXのConfigurationを追加しました。
こちらではバイナリのリリースはしませんので、必要に応じてmsdos.vcprojをビルドしてください。



2015/10/18
一部コードを整理しました。
機能的な変更はありません。



2015/10/17
今回はかなり大規模な変更が入っています。
今まで動いていたソフトが動かなくなっているかもしれません。
動作確認ご協力お願いいたします。

Jason Hood様から頂いた、大規模なパッチを取り込みました。
(DOS界隈では、ANSICONとかDOSLFNで著名な方です。突然メールを頂いてびっくり)

こちらでは未確認ですが、DJGPPやDOS4GWなども動くようになっているみたいです。
DOSエクステンダが動くようになると、色々と夢が膨らみますね。

主だった修正点は以下の通りです。

コンソール周りやINT 10H/16Hの改良の成果として、Konno版のVZエディタが動くようになりました。
従来、V-TEXT使用時は画面サイズが80桁x25行固定でしたが、起動時のコンソールのサイズにあわせて、
任意の画面サイズで動作するようになっています。
オプションで画面サイズを指定することもできるようになりましたので、
msdos -n64,160 vzibmj
とやって、SXGAサイズ(160桁x64行)で起動することも可能です。

なお、BIOS領域内のキーバッファを直接参照しているソフト向けに、該メモリを読んだときに、
適宜Sleep()を入れるようになっています。
この影響で、CPUBENCHの結果がやや遅くなってしまっていますのでご注意ください。


FILMTNやFMで、プログラムの実行やファイルの閲覧ができない問題を修正しました。
子プロセスとしてCOMMAND.COMを起動するとき、コマンドラインが指定されていない場合は、
呼び出し元プロセスのDTAにあるコマンドラインを使うようにしています。

バッチファイルの実行に仮対応しました。
参照可能なところにあるCOMMAND.COMを起動して、そちらでバッチファイルを実行します。
なお、VZエディタに入っているVZ.BATでは、nulデバイスに出力をリダイレクトしています。
これを削除しないと、途中で止まってしまうようです。



2015/6/25
えむけい様にご提供頂いたパッチを取り込みました。
取り込みが遅くなってしまい申し訳ありません、多謝多謝です。



2015/4/24
i386コアに、MAME 0.160までの変更を適用しました。
SSE命令などの対応が中心なので、MS-DOS Playerでは余り意味はなさそうです。



2015/1/28
8086版のバイナリを追加しました。
i286版より更に高速に動作するかと思います。



2015/1/21
int 21h, ah=40hを修正しました。
書き込むバイト数に0を指定した際に、現在のファイルポインタの位置に切り詰める処理をサポートしました。

また、int 10h関係を実行した際、強制的にウィンドウサイズを80x25に変更するようになっていますが、
MS-DOS Playerの終了後に、元のサイズに戻すようにしました。

今回の更新は、sava様にご提供頂いたパッチが基になっております。
日頃より、DR-DOS System and Programmers Guide(日本語訳)を大いに参考にさせて頂いております。
まことに多謝多謝です。



2015/1/15

int 10h, ah=1bhにエラーを返さないようにしました。
int 10h, ah=efhをサポートしました。
Hercules互換ボードではないと返すようになっています。

int 2ih, ah=3ch/3dh/6chについて、CONデバイスを開く処理を改良しました。
C:\HOGE\CONのようなパスを、CONデバイスと認識するようになっています。

i286/i386コアにおいて、割り込み発生時にm_irq_stateをクリアするようにしました。

Mr. Daniel Zingaroの開発された、DroneというテキストRPGが動作するようになりました。
QBASICで開発されたソフトとのことです。



2015/1/14
i386コアに、MAME 0.157までの変更を再適用しました。
これで完全に0.157相当の動作になっている筈です。



2015/1/8
i386コアに、MAME 0.157までの変更を適用しました。
従来はオミットしていたTLB周りも、Generic virtual TLBを使用した実装になっています。
ただし、処理速度が少々低下しています。


msdos.exeをダブルクリックして起動したときに、コマンドプロンプトから起動するように、
警告メッセージを表示するようにしました。
キーを押すまで、コンソールウィンドウが閉じないようになっています。



2014/12/6

VZエディタ付属のGAME.DEFマクロが動作するようになりました。
CRTCのステータスレジスタの垂直同期信号をチェックしていたようです。
3dahと、念のため3bahから、ステータスレジスタを読み込めるようにしました。
垂直同期信号は、仮に60Hzで変化するようにしています。


-vオプションで、int 21h, ah=30hが返す、MS-DOSのバージョンの値を指定できるようにしました。

また、COMMAND.COMを検索して、環境変数COMSPECの値にファイルパスを入れるようにしました。
実行対象のプログラムファイルと同じディレクトリ、msdos.exeと同じディレクトリ、カレントディレクトリ、
またはパスの通っているディレクトリにあるCOMMAND.COMを検索します。
見つからなかった場合は、ホスト環境のCOMSPECの値が使われます。


i386/i486版の高速化を図りました。
従来、RDTSC命令のために、各命令を実行するごとにサイクル数を計算していたのですが、
i386/i486ではRDTSC命令をサポートしていないため、サイクル数の計算をしないようにしました。
CPUBENCHで確認した限りでは、26%程度は高速化されているようです。



2014/12/4
「はじめて読む486」のサンプルプログラムのうち、TESTTASK, HARDINT, INTMONが動作するようになりました。


TESTTASKでは、データを表示するために、テキストVRAMに直接データを書き込んでいますが、
このとき、テキストVRAMのアドレスをビデオBIOSで取得せず、B8000Hを決め打ちしています。

このため、B8000H-BFFFFHをテキストVRAMとして、データを書き込むとすぐ画面に反映するようにしました。
ただし、V-TEXTの仮想バッファは従来通り、F80000Hにあるものとしています。
VZエディタなどにおいて、仮想バッファとテキストVRAMのアドレスが同じ場合、VRAMに書きっ放しで、
ビデオBIOSでバッファを画面に反映する動作を行わなくなるためです。

なお、テキストVRAMを追加したことで、コンベンショナルメモリが992KBから736KBに減少しました。
その分、アッパーメモリの空き部分の224KBをUMBに割り当てるようにしています。
Windows98 SE付属のCOMMAND.COMで、UMBからのメモリ確保が動作することを確認しました。


HARDINTは、ハードウェア割り込みのモニタを行うものです。
このため、キーを押した場合に、キー割り込みを発生するようにしました。
また、I/Oを操作しなくてもタイマを常に駆動して、定期的にタイマ割り込みを発生するようにしました。
あわせて、タイマの実装を整理、単純化しています。
ログを取って確認した限りでは、期待した周期でタイマ割り込みが発生することを確認できました。


INTMONでは、環境変数のCOMSPECからCOMMAND.COMのパスを取得して実行します。
このため、実行するプログラムと同じ、またはパスが通っているディレクトリにCOMMAND.COMがある場合、
そのパスをCOMSPECに指定するように修正しました。

なお、最近のWindows上では、環境変数が多すぎてメモリ不足でCOMMAND.COMの起動に失敗するため、
msdos -e INTMONのように、-eオプションをつけて起動するようにご注意ください。


タイマの実装を見直したついでに、CPUBENCHの動作確認を行いました。
私の開発環境では、i286版で80486DXの257MHz相当、i386版で102MHz相当の速度が出ているようです。



2014/11/30

キーボードコントローラによるA20ラインの操作をサポートしました。
「はじめて読む486」のサンプルプログラムが幾つか動作するようになっています。
これに合わせて、折角なので80486のバイナリもビルドするようにしました。

int 21h, ax=5800h/5801h/5802h/5803hを一応サポートしました。
ただし、UMBはサポートしていません。
アロケーションストラテジに40h/41h/42hが選択されていると、常にメモリの確保に失敗します。
実際のところ、これらのサービスでエラーを返さなくしただけです。
そもそも、f8000hまでコンベンショナルメモリ扱いなので、UMBを確保する隙間がないんですよね(苦笑)



2014/11/19
BUPDATEでファイルを更新した際に、タイムスタンプが正しく更新されない不具合を修正しました。

SetFileTime()でタイムスタンプを変更するには、Writeモードでファイルを開く必要があるのですが、
BUPDATEではReadモードでファイルを開いていたのが原因です。
ファイルを開く際に、Readモードが指定されていても、Read/Writeモードで開くように修正しています。

あわせて、int 21h, ax=5704h/5705h/5706h/5707hもサポートしました。
Windows95でサポートされた機能で、ファイルの作成日時や最終アクセス日時を取得、変更します。



2014/11/7

ヤフオクでVZエディタを入手できましたので、一先ず文章を編集できる程度まで対応してみました。
VTDOSで動かす方が快適かと思いますが、まあ折角ですので。

IMEから漢字を正しく入力できない不具合を修正しました。
int 16h, ah=11hでキー入力を検出して、int 16h, ah=10hでキーコードを取得しているのですが、
マルチバイト文字の場合、2バイト目を何故かint 21h, ah=07hで取得していました。

また、カーソルキーのリピートがうまく処理できない不具合を修正しました。
int 16h, ah=11hでキー入力を検出する際、リピート時は入力なしを挟むようにしています。



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試食版のみの対応です。
他のアプリケーションの対応は反響次第ということで。