top of page
loading_reduced.jpg

11325 / 13-01-2025

MS-DOS Player for Windows

Accuracy

Performance

Features

average rating is null out of 5
average rating is null out of 5
average rating is null out of 5
competition

MS-DOS Player is a MS-DOS emulator running on Windows (32/64-bit) command prompt. Its 16-bit MS-DOS compatible commands can be executed on Win32/x64 environments.

It basically inherits the environment variables from the host Windows, and a target command can access the host's file path directly. As such, you can execute 16bit MS-DOS compatible commands on your 64bit Windows in the same sence as you did on 32bit Windows, and you do not need to copy any files to/from a virtual machine (VMware, Virtual PC, XP mode, or others).


Note: This emulator DOES NOT support Win16 execution files. It aims to support character user interface utilities, for example file converters, compilers, assemblers, debuggers, and text editors. For now, doesn't support graphic/sound hardwares nor is intended to support game softwares.

...

Most Recent Changes (all translated)

--2025/01/13--

  • For MGetVdmPointer and VdmMapFlat, modified to respect the mode argument. If real mode is specified, always convert addresses as real mode. If protected mode is specified, address conversion is performed according to the current CPU mode. (Because the address conversion process in the CPU refers to the current mode.)

  • Normally, the current CPU mode is obtained with getMSW and the arguments are specified accordingly. This may not make much sense. When you look at the relevant process in ReactOS, is it always converting in real mode, ignoring the arguments?

  • VDDDeInstallMemoryHook, VDDDeInstallMemoryHook, VDDAllocMem, VDDFreeMem, VDDIncludeMem, VDDIncludeMem, VDDDFreeMem, VDDIncludeMem, VDDExcludeMem, so that DLLs containing them can be loaded, I implemented a dummy function that always fails. I would like to implement it properly, but I think it would slow down memory accesses in the hook process, I am a little hesitant to implement it properly.



--2025/01/12--

  • Added partial support for VDD (Virtual Device Driver). Based on cracyc's fork, with some modifications. Only available for i386 or later and 32bit binaries. Please use the included ntvdm.exe in the same folder as msdos.exe.

  • In conjunction with this, the version of DOS that returns INT 21H, AH=30H is 5.00, the version of true DOS returned by INT 21H, AX=3306H has been changed to 5.50. 

  • This is the same version as NTVDM in Windows NT. Also, INT 2Fh, AX=122Fh, DX=0000h to return to 5.00.


  • We have confirmed that the vddtest here works. We have not yet confirmed that it will work in practical applications that use VDD.



--2024/12/14--

  • The DOS version is now automatically recognized when starting COMMAND.COM. Any version of COMMAND.COM can be started without specifying -vX.XX. This is applicable to COMMAND.COM for MS-DOS, PC-DOS, and Windows95/98/Me. If automatic recognition does not work, specify -vX.XX as before.

  • INT 2Fh and AH=2Eh were modified to meet the specifications of MS-DOS Ver.5 or later. The dummy error table added on 10/24/2024 is obsolete.

  • INT 2Fh, AH=2Fh, DX=0000h were corrected. The DOS version returned by INT 21h, AH=30h is now restored to the true DOS version. (We had mistakenly assumed that the true DOS version was the one returned by DX.)

  • Added support for INT 21h, AX=33FAh/33FCh.

  • FreeDOS services to get CPU family and change DOS version.

  • I'll support them just in case they might be used by FreeCOM or peripheral tools.

  • We have imported the modifications from cracyc's fork. Pipe connection with 32/64bit programs started as child processes is now supported.

  • Other improvements are around VCPI, display of CP437 symbols, and pasting long strings.



--2024/10/31--

  • By reading the VRAM or virtual text buffer in CGA/MDA text mode, the contents of the console screen display can now be retrieved.

  • When descending to the prompt with [ESC]E in the VZ editor, the DOS screen is restored.

  • File names containing wildcards are now supported with INT 21h, AH=13h/17h.

  • FCB-based file deletion and renaming services. It was used in the DEL/REN command of COMMAND.COM in MS-DOS V6.22.



--2024/10/24--

  • In the previous update, when I put the error table in the same memory area as the IRET table. I forgot to shift the segment of the subsequent MCB by the error table.

  • Fixed INT 21h, AH=0Fh/10h/11h/12h/13h/16h/17h/23h/29h.

  • Added setting of extended error codes when a service using FCB fails.

  • V6.22's COMMAND.COM no longer displays an error when executing DIR.

  • Fixed INT 21h, AH=4Eh/AX=714Eh. The appropriate error code is now returned when the first entry is not found. INT 2Fh, AX=0502h now returns an extended error message. It should be a parameter error, but COMMAND.COM seems to expect an extended error.

  • Added error table to get on INT 2Fh, AX=122Eh, DL=00h/02h/04h/06h. However, all types are the same and refer to a single empty table. Also, the address of the error table can be changed by DL=01h/03h/05h/07h.

  • The code for allocating memory at process startup has been reorganized. Whenever there is insufficient conventional memory, UMB is used automatically. Failed to start COM model when 64KB of memory is not available. At process exit, repair when the MCB of the memory to be released is corrupt.

  • Support for INT 2Fh,AX=4810h has been removed.

  • DOSKEY one-line input, but DOSKEY has always been treated as uninstalled. Because COMMAND.COM of Windows 98 used it without installation check, It had been supported, but it was getting in the way of VZ resident, so we decided to discontinue it.

  • On Windows 98's COMMAND.COM, when a batch file is executed with VZ resident, When launching a child process from a batch file, the free space in conventional memory 0 when launching a child process from the batch file. 

  • When resident, please start VZIBMJ.COM directly instead of via VZ.BAT. (Such a problem does not occur with COMMAND.COM in V6.22...)

  • When MS-DOS Player is started, if it is passed argv with spaces, pass it to the virtual machine. Add it to the command line enclosed in double quotation marks.



--2024/10/21--

  • The I386 core of NP21/W has been updated to ver0.86 rev92 equivalent.

  • Support for SSSE3, SSE4, and SSE4a has been added.

  • I don't think you'll ever use these CPU extension instructions in DOS applications (smiles).



--2024/10/18--

  • When a codepage was specified with the -p option, the process to change the codepage to the actually specified codepage was missing.

  • Fixed a missing process to change to the specified code page when a codepage is specified with the -p option. Hiding the cursor on the virtual machine is not reflected in the actual display, though, (See item 8/25/2017 for the reason) The -h option is now used to reflect the cursor hiding.

  • When performing GetDriveTypeA() on a disconnected remote drive, GetDriveTypeA() on a disconnected remote drive may cause it to freeze for a long time. If WNetGetConnectionA() is executed first and it is a remote drive, GetDriveTypeA() is not executed if it is a remote drive. I expect that WNetGetConnectionA() only looks at the share settings and does not access anything to the actual drive. I expect that it will not access anything to the actual drive.



--2024/10/7--

  • The interrupt vectors for INT DCh and INT DDh have been modified to have the same value. If these are different values, there is a method to determine that it is PC-98x1.

  • The ATOK interrupt for the J-3100 was no longer functioning. The mistake was made the other day when changing the interrupt number used in the internal process.



--2024/10/6--

  • Corrected INT 2Fh, AX=1703h,1709h.

  • The data length specification, which for some reason was SI:DI, has been corrected to SI:CX.

  • Fixed INT 2Fh, AX=1705h.

  • AX and DX are now cleared when the data length in the clipboard fails to be obtained. INT 2Fh, AX=1704h,1705h has been improved.

  • Data length is now obtained by strlen() instead of GlobalSize(). 

  • INT 2Fh, AX=1700h-1705h,1708h-1709h are now supported.

  • Older versions of Windows have a clipboard read/write service.

  • I heard that it can be used with VZ editor, so I implemented it for the time being. I have not tested it on my side, so please test it if you like. >Dear Mr. Kaneno



--2024/09/23--

  • INT 2Fh and AX=1689h are now supported. This is an API to idle the process in Windows 3.x.Maybe you are using it in a console application for DOS windows.

  • Changed the interrupt number used in internal processing from 6xh to 4xh.This is a form of changing the number that may be used by the user to a reserved number for the system.

  • Fixed for Takahashi version of VZ editor.

  • INT 21h, AH=3Dh, although the existence check is done by opening $IBMAIAS, device name was not null terminated.

  • Corrected to force paths starting with $IBMAIAS to be cut off at up to 8 characters. INT 21h, AX=4400h to return DX=8080h for device information in $IBMAIAS. The Takahashi version of the VZ editor seems to check if DL=80h.

  • Referring to the DOSVAXJ3 implementation, we have organized the implementation of INT 16h, AH=13h and INT 6Fh. This process turns on/off the IME and gets/changes the mode.

  • Also, made $IBMAFNT/$IBMADSP/$IBMAIAS pretend to exist (Added dummy driver and made it possible to open with INT 21h, AH=3Dh) I heard that DOSVAXJ3 can control the IME well with VZ, so I'll try this and see how it goes.

  • I made it possible to read the output of Ch.1/2 of the timer at bit4 and bit5 of the system port. They are used for the RAM refresh signal and the beep signal, respectively. The former toggles at 15us intervals, but I can't manage the time with such high precision, We made it so that each successive reading toggles up to 66 times during 1 ms. ...I don't think there is a CLI tool that checks for this kind of thing... (chuckles)



--2024/09/19--

  • Corrected processing of INT 21h and AH=49h. After a block of memory is released, it is no longer combined with the subsequent free memory. Processing of INT 21h, AH=4Ah has been modified.

  • When the size of a specified memory block is successfully changed, the owner of the memory block is changed to the calling process. the owner of the memory block to the calling process. If the resizing fails, it will still be resized to the largest size possible.

  • As far as the DOS 4.0 source is concerned, the behavior is as follows. The size is increased as much as possible by combining it with the subsequent free memory block. If the size exceeds the specified size, divide the memory block up to the specified size (regardless of whether the original owner is another process or a free memory block). The owner of the memory block is set to its own process. If the size of the memory block is not enough, it returns to the BX how much the size of the memory block has been increased. At this time, the memory block is not restored to its original size. It seems that there is a process in the VZ editor that resizes the memory block that was released. I think this may have improved the behavior.



--2024/09/11--

  • Corrected INT 13h, AH=15h. In addition to correcting the reversed return of disk types for hard disks and floppy disks, the identification of 2D and 2DD/2HD has also been changed.

  • Also, the number of blocks on a disk is now returned in CX:DX.



--2024/9/8--

  • For executing internal commands with “COOMAND.COM /C” in the absence of COMMAND.COM, TRUENAME and VER are now also executed by MS-DOS Player's internal process.

  • As for TRUENAME, it is not supported by Windows NT's cmd.exe in the first place, As for VER, we want to display the MS-DOS version, not Windows.

  • For INT 13h, AH=08h, the number of floppy drives connected to DL, BH is now modified to set 0. However, only A: and B: are checked for floppy drive connections.



--2024/9/7--

  • We have reorganized the code around process startup. There are some changes that may have a large impact, so please help us test them.

  • When executing an internal command in a child process, such as “COMMAND.COM /C TYPE (file), A-Z:/CHDIR/PATH/SET should be executed in the internal process of MS-DOS Player. This is because executing these commands in the child process is not reflected in the caller. Other commands are executed by starting COMMAND.COM as a child process. If COMMAND.COM is not present, though, they are passed to cmd.exe via system() and processed on the Windows side, TYPE command is executed by MS-DOS Player's internal process so that it goes through INT 29h.

  • If you try to start “COMMAND.COM /C executable” and there is no COMMAND.COM, Executable file directly, but at this time, update the first and second FCBs of the new process, In this case, the first and second FCBs of the new process are updated to include the arguments specified in the executable file.

  • When displaying characters on the screen with INT 10h or INT 21h via INT 29h, (Only when INT 29h is hooked, it is now via INT 29h.)

  • Fixed a problem in which control codes were displayed as symbols as if INT 29h was called directly.

  • When searching for COMMAND.COM at startup, the paths specified in PATH and MSDOS_PATH

  • Fixed a problem where the path specified in PATH and MSDOS_PATH was not searched when looking for COMMAND. It appears that when we were reorganizing the code in the past, we accidentally changed the order of the processes.



--2024/9/4--

  • When trying to launch “COMMAND.COM /C executable argument” as a child process, If COMMAND.COM is not found, the executable file specified by /C will be started directly.

  • In this case, though, only the “argument” part will be set in the PSP of the new process, I put a space at the beginning of the argument. Kobayashi-sama's ported GREP seems to expect the argument to be prefixed with a space.

  • Fixed to set ES-1 to AX if INT 21h, AH=49h process succeeds. This is an Undocumented specification, but looking at the DOS 4.0 source, it certainly seems to be the case.

  • When ^G (bell) is output to the console, INT 29h is not called. When invoking a child process, set 0x0d at the end of the command argument. This is a workaround for the problem pointed out by Mr. Suzuki when calling GREP from an older version of VZ.



--2024/8/31--

  • The process of loading executable files has been improved. When only the program name is specified, the file is read with .COM / .EXE / .BAT, but , COM / .EXE / .BAT, but if there is a file with the same name as the program name without extension (e.g. JGAWK.EXE and JGAWK),

  • EXE / .BAT, but if there was a file with the same name as the program name (e.g. JGAWK.EXE and JGAWK) without extension, that file was loaded first. This has been corrected so that files without extensions are not loaded as executable files.



--2024/7/31--

  • I have reworked it so that it can be built with Visual Studio C++ 6.0 SP6. However, only the MAME core is supported, not the NP21/W core. We have confirmed that the built binaries work on Windows NT 4.0.

  • Starting this time, the x86 version is built with VC++2008 and the x64 version is built with VC++2017. The x86 version built with VC++2008 runs on Windows 2000.



--2024/7/17--

  • Eventually, we also added error messages in home country Portuguese.

  • For non-Brazilian Portuguese, it will be in home country Portuguese.



--2024/7/16--

  • Added Brazilian Portuguese error messages.

  • This is valid for Code Page 850 or 860 and when the language setting is Portuguese-based.

  • However, if the language setting is home country Portuguese, the error message will be in Brazilian Portuguese.

  • Please note that this is in consideration of the population ratio of the speakers.



--2024/07/05--

  • Fixed INT 2Fh, AX=0502h. 

  • Added getting parameter error messages instead of extended error codes.

  • Changed Japanese messages from being hard-coded in SJIS to a const BYTE array. The problem of garbled characters when changing the source encoding has been resolved. 

  • While we are at it, we have added French, German, Spanish, and Korean error messages.

  • Japanese when the active codepage is 932, and Korean when 949, When the active code page is 932, the error message is in Japanese; when the active code page is 949, the error message is in Korean; when the active code page is 850, the error message is in French, German, or Spanish if Windows language setting is French, German, or Spanish, Otherwise, the error message is in English.

  • It seems that the Chinese and Taiwanese versions of Windows 98's COMMAND.COM are not localized.



--2024/07/03--

  • We have reorganized the code around the process of manipulating the IME.

  • I had not checked that the return value of ImmGetDefaultIMEWnd was not null,

  • This may have been a problem in non-Asian Windows environments without an IME.



--2024/07/01--

  • Corrected INT 10h, AX=8200h.

  • When BL is other than FFh, the scroll mode value before the change is returned to AL has been modified.

  • INT 16h, AH=02h/12h/51h has been corrected.

  • The state of the key to be toggled can now be obtained correctly.

  • However, the state of VK_KANA seems to not be acquired properly in Windows 10 due to an IME issue? However, the state of VK_KANA does not seem to be acquired properly on Windows 10 due to IME-related issues.

  • Added support for INT 10h, AX=5000h/5001h, AH=85h.

  • Obtains and changes the cursor mode of the J-3100, and obtains the attribute of the character at the cursor position.

  • Added support for INT 16h, AH=F0h/F1h/F5h/F6h.

  • Beep the J-3100, change the lock status of a key, add to the key buffer or get the status.

  • Added support for INT 6Fh, AH=01h/02h/03h/04h/05h/0Bh/66h.

  • Changes and retrieves the on/off and status of ATOK5/6 used in the J-3100.

  • Also, a dummy driver for ATOK5/6 has been incorporated.

  • Mainly supports services like those used in J31BASIC.

  • Added support for INT 10h/16h, AX=5000h/5001h.

  • Get/change the country code of the video keyboard BIOS for AX.

  • However, changing the value does not affect BIOS operation.

  • Added support for INT 16h, AX=1300h/1301h.

  • Turns the DOS/V IME on/off and changes/gets its status.

  • The new IME in Windows 10 seems to have all sorts of weird behavior on the console app,

  • It is not possible to correctly retrieve the status of romaji/kana input.

  • For this reason, the process to switch between Romaji and Kana input is currently disabled.

  • It seems to be able to determine whether or not a conventional IME is being used, though,

  • We are still investigating how to determine if a user is using an IME other than the Microsoft IME.



--2024/03/02--

  • Fixed a problem in which INT 21h AH=43h and BL=08h had the same behavior as BL=06h.

  • The built-in debugger has been improved.

  • The R command can now change the value of flags in addition to registers.

  • The V30 disassembler has been integrated with the disassembler for i386.

  • Some instructions other than V30-specific instructions that were not recognized correctly have been resolved.

  • Register names are now displayed with standard names.

  • (We plan to do the same for the Common Source Code Project.)

  • We have incorporated further fixes from roytam's fork.

  • We have also incorporated further fixes from the work by roytam.

  • We have improved the anti-crash measures of conhost-v2 and fixed it for Windows NT 3.51/4. ..I have never used NT 3.51...



--2024/02/28--

Corrected INT 21h, AX=4404h/4405h/440Ah. The handle was incorrectly handled as BX to specify the handle or BL to specify the drive. AX=440Ah has been corrected to specify handle and AX=4404h/4405h to specify drive.


The built-in debugger has been improved. Processing of code pages in protected mode has been corrected. In addition, the execution trace now records whether each instruction was executed in 16-bit or 32-bit mode. (In the case of V30, whether the 8080 mode is used or not is recorded.) I think that the U and UT commands can now display the instructions correctly.


I put in an anti-crash measure for conhost-v2, referring to roytam's forking. It seems to be easy to crash if the window size is changed when the cursor is on the last line. I have also included a fix to make it work on Windows NT4.0 / 2000, although it has not been tested yet.



--2024/02/19--

When a string longer than the specified buffer length is specified as the copy source in strcpy_s(), exception 0xc0000417 may occur.

I am not sure why, since the function is supposed to copy strings safely in such cases. However, we have taken a countermeasure to use strncpy for the time being.


I have long misunderstood the specification of strcpy_s. I am ashamed of this. I was under the impression that it was supposed to work like strlcpy.



--2023/12/14--

For INT 10h AH=08h, the character code of Kanji characters has been corrected so that the character code can be obtained.

This bug was pointed out to us by Mr. Kinno.


It seems that if you use ReadConsoleOutputCharacterA to get only one Kanji character, 20h is returned.

I think that by retrieving the entire line, both the first and second byte of the Kanji character can be read.



--31/12/2022--

The I386 core of NP21/W has been updated to ver0.86 rev88 beta4.

However, for fpemul_softfloat.c, an exception occurred in testi386.exe, so I haven't taken it in yet this time.



--21/09/2022--

Normally, when an application running on MS-DOS Player tries to access COMMAND.COM,



--30/08/2022--

Changed to set the contents of the 1st and 2nd FCBs for the PSP at process startup. It corresponds to the first process startup and INT 2Eh, INT 2Fh AX=AE01h.



--16/08/2022--

Fixed so that playback does not stop when BEEP sounds are uttered continuously. I am trying to play with double buffer with waveOut API.



--21/07/2022--

Supported the reproduction of BEEP sound.



--21072022--

I needed to run an old ROM writer, so I made improvements around serial communication.


Supported DTR / DSR flow control and RTS / CTS flow control. It is enabled with the -sd and -sc options, respectively.


When shifting from transmission to reception, when DTR and RTS are on and only RTS is off,



--31/12/2021--

I needed to run an old ROM writer, so I made improvements around serial communication.


Supported DTR / DSR flow control and RTS / CTS flow control.


In addition, the flow control is performed by actually reading the DSR / CTS status.



--31/12/2021--

I modified the I386 core of NP21 / W by referring to testi386.exe of QEMU. It is a binary of ia32_x86 version, and the same result as the actual machine can be obtained.

  • The DAA / DAS / AAA / AAS / AAM / AAD instructions have been modified based on the DOSBox implementation.

  • Corrected the processing when shifting 16 bits or more with the SHLD / SHRD instruction.

  • Corrected the values of C1, C2, C3 flags for NaN and INF in the FCOM / FCOMI / FXAM instruction.

  • Fixed to clear C1 with FDECSTP / FINCSTP instruction.

  • Fixed FLD instructions to set and clear C1 with or without stack overflow.

  • Fixed to reflect the data16 prefix in the FSTENV / FLDENV / FSAVE / FLDENV instruction.


In addition, with ia32_x64 version, an exception will occur in the floating point test. It seems that the processing is not equivalent between x86 build and x64 build, it is necessary to investigate.

Show Previous Changes
  • Fixed an issue where standard I / O handles could not be closed properly. For example, the problem that the output cannot be output to a file with the SYMDEB> command has been solved.

--

  • Whether to display control characters as symbols for each of INT10h, INT 21h AH = 02h / 06h / 40h, INT 29h,
    Treated as a control character or separated processing.
    Also, fixed the scan code when pressing keys other than letters while holding down Ctrl or Alt.

  • Fixed the process of reverting the code page when exiting not working properly.
    Also, the process to determine that it was started from the command prompt or Power Shell has been fixed.

  • Supported INT 16h, AH = 51h.

  • Added service to get the shift status of the AX keyboard, which was called by the Windows 3.1 installer.

--

View more here...

bottom of page