msdos-player icon indicating copy to clipboard operation
msdos-player copied to clipboard

MS-DOS Player for Win32-x64 console 2/18/2024

----- What's This

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

This emulator inherits the environment variables from the host Windows, and a target command can access the host's file path directly.

So 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.

This emulator aims to support character user interface utilities, for example file converters, compilers, assemblers, debuggers, and text editors.

NOTE: This emulator DOES NOT support graphic/sound hardwares and DOES NOT aim to support game softwares. I recommend DOSBOx for this purpose.

----- How To Use

Start a command prompt and run this emulator with a target command file and any options.

For example, compile a sample.c with LSI C-86 and execute the compiled binary:

> msdos lcc sample.c
> msdos sample.exe

----- Options

Usage:

MSDOS [-b] [-c[(new exec file)] [-p[P]]] [-d] [-e] [-i] [-m] [-n[L[,C]]] [-s[P1[,P2[,P3[,P4]]]]] [-sd] [-sc] [-vX.XX] [-wX.XX] [-x] [-a] [-l] (command) [options]

-b	stay busy during keyboard polling
-c	convert command file to 32bit or 64bit execution file
-p	record current code page when convert command file
-d	pretend running under straight DOS, not Windows
-e	use a reduced environment block
-i	ignore invalid instructions
-m	restrict free memory to 0x7FFF paragraphs
-n	create a new buffer (25 lines, 80 columns by default)
-s	enable serial I/O and set host's COM port numbers
-sd	enable DTR/DSR flow control
-sc	enable RTS/CTS flow control
-v	set the DOS version
-w	set the Windows version
-x	enable XMS and LIM EMS
-a	disable ANSI.SYS
-l	draw box lines with ank characters

ISH.COM contains any invalid instructions and it cause an error. Please specify the option '-i' to ignore the invalid instructions.

> msdos -i ish.com

EDIT.COM does not work correctly when a free memory space is large. Please specify the option '-m' to restrict free memory to 0x7FFF paragraphs.

> msdos -m edit.com

"Windows Enhanced Mode Installation Check" API (INT 2FH, AX=1600H) and "Identify Windows Version and Type" API (INT 2FH, AX=160AH) return the Windows version number 4.10. If you want to change the version number, please specify the option '-wX.XX'.

> msdos -w3.10 command.com

Or if you want to pretend that Windows is not running, specify the option '-d'.

> msdos -d command.com

"Get Version Number" API (INT 21H, AH=30H) returns the version number 7.10. If you want to change the version number, please specify the option '-vX.XX'.

> msdos -v3.30 command.com

NOTE: "Get True Version Number" API (INT 21H, AX=3306H) always returns the version number 7.10 and '-v' option is not affected.

NOTE: the Windows version 4.10 and the DOS version 7.10 are same as Windows 98,

To enable XMS (i286 or later) and LIM EMS, please specify the option '-x'. In this time, the memory space 0C0000H-0CFFFFH are used for EMS page frame, so the size of UMB is decreased from 224KB to 160KB.

To enable the serial I/O, please specify the option '-s[P1[,P2[,P3[,P4]]]]'. If you specify '-s', the virtual COM1-COM4 are connected to the host's COM ports found by SetupDiGetClassDevs() API. You can specify the host's COM port numbers connected to the virtual COM ports by adding numbers to '-s' option, for example '-s3,4,1,2'.

If you specify '-sd', DTR/DSR flow control is enabled. In this time, MS-DOS Player sets/gets DTR and DSR pins of the host's COM port. Otherwise, virtual DTR pin is internally connected to virtual DSR pin, and DTR pin of the host's COM port is always active.

If you specify '-sc', RTS/CTS flow control is enabled. In this time, MS-DOS Player sets/gets RTS and CTS pins of the host's COM port. Otherwise, virtual RTS pin is internally connected to virtual CTS pin, and RTS pin of the host's COM port is always active.

NOTE: The maximum baud rate is limited to 9600bps.

----- Environment Variable Table

Basically, the environment variable table on the host Windows is copied to the table on the virtual machine (hereinafter, referred to as "virtual table"), and in this time, APPEND/MSDOS_PATH/PATH/TEMP/TMP values are converted to short path.

Some softwares (for example DoDiary Version 1.55) expect that the environment variable table should be less than 1024 bytes. On the Windows OS, there are too many variables and the environment variable table size will be more than 1024 bytes and it causes an error.

In this case, please specify the option '-e' and only the minimum environment variables (APPEND/COMSPEC/LASTDRIVE/MSDOS_PATH/PATH/PROMPT/TEMP/TMP/TZ) are copied to the virtual table.

> msdos -e dd.com

The environment variable COMSPEC is not copied from the host Windows, and its value on the virtual table is always "C:\COMMAND.COM".

If a program tries to open the "C:\COMMAND.COM" file, the file is redirected to the path in the environment variable MSDOS_COMSPEC on the host Windows. If MSDOS_COMSPEC is not defined, it is redirected to the COMMAND.COM file that does exist:

  • in the same directory as the target program file,
  • in the same directory as the running msdos.exe,
  • in the current directory,
  • in the directory that is in MSDOS_PATH and PATH environment variables

You may have a directory that contains 16bit command files, and you may want not to add this path to PATH on the host Windows but want to add it to PATH on the virtual table.

In this case, please define MSDOS_PATH on the host Windows, and its value is copied to the top of PATH on the virtual table. In other words, the value of PATH on the virtual table is MSDOS_PATH;PATH on the host Windows, so a program searches files in directories in MSDOS_PATH before files in directories in PATH.

You can also define MSDOS_APPEND on the host Windows, and its value is copied to the top of APPEND on the virtual table.

The environment variables TEMP and TMP on the host Windows may be very long, in usually, it is "C:\User(Your User Name)\AppData\Local\Temp". DOSSHELL.EXE tries to create a batch file in the TEMP directry to start the selected program, and it may not work correctly because of the too long batch file path. In this case, please define MSDOS_TEMP on the host Windows, for example "C:\TEMP", and its value is copied to TEMP and TMP on the virtual table.

If the environment variable MSDOS_LASTDRIVE is defined on the host Windows, its value is copied to LASTDRIVE on the virtual table. If both MSDOS_LASTDRIVE and LASTDRIVE are not defined on the host Windows, LASTDRIVE=Z is automatically defined on the virtual table.

If the environment variable PROMPT is not defined on the host Windows, PROMPT=$P$G is automatically defined on the virtual table.

If the environment variable MSDOS_TZ is defined on the host Windows, its value is copied to TZ on the virtual table. If both MSDOS_TZ and TZ are not defined on the host Windows, and if your timezone is in the following table, TZ is automatically defined on the virtual table, for example TZ=JST-9 in Japan.

NOTE: This table is from: https://science.ksc.nasa.gov/software/winvn/userguide/3_1_4.htm

------- Greenwich Mean Time --------------------------------------------------- +00:00 GMT Standard Time GMT BST GB London +00:00 GMT Standard Time GMT IST IE Dublin +00:00 GMT Standard Time WET WES PT Lisbon +00:00 Greenwich Standard Time GMT GST IS Reykjavik ------- Fernando De Noronha Std ----------------------------------------------- -02:00 Mid-Atlantic Standard Time FST FDT BR Noronha -02:00 UTC-02 FST FDT BR Noronha ------- Brazil Standard Time -------------------------------------------------- -03:00 Bahia Standard Time BST BDT BR Bahia -03:00 SA Eastern Standard Time BST BDT BR Fortaleza -03:00 Tocantins Standard Time BST BDT BR Palmas ------- Eastern Standard (Brazil) --------------------------------------------- -03:00 E. South America Standard Time EST EDT BR Sao Paulo ------- Greenland Standard Time ----------------------------------------------- -03:00 Greenland Standard Time GST GDT GL Godthab ------- Newfoundland Standard Time -------------------------------------------- -03:30 Newfoundland Standard Time NST NDT CA St.Johns ------- Atlantic Standard Time ------------------------------------------------ -04:00 Atlantic Standard Time AST ADT CA Halifax ------- Western Standard (Brazil) --------------------------------------------- -04:00 Central Brazilian Standard Time WST WDT BR Cuiaba -04:00 SA Western Standard Time WST WDT BR Manaus ------- Chile Standard Time --------------------------------------------------- -04:00 Pacific SA Standard Time CST CDT CL Santiago ------- Eastern Standard Time ------------------------------------------------- -05:00 Eastern Standard Time EST EDT US New York -05:00 Eastern Standard Time (Mexico) EST EDT MX Cancun -05:00 US Eastern Standard Time EST EDT US Indianapolis ------- Acre Standard Time ---------------------------------------------------- -05:00 SA Pacific Standard Time AST ADT BR Rio Branco ------- Cuba Standard Time ---------------------------------------------------- -05:00 Cuba Standard Time CST CDT CU Havana ------- Central Standard Time ------------------------------------------------- -06:00 Canada Central Standard Time CST CDT CA Regina -06:00 Central Standard Time CST CDT US Chicago -06:00 Central Standard Time (Mexico) CST CDT MX Mexico City ------- Easter Island Standard ------------------------------------------------ -06:00 Easter Island Standard Time EST EDT CL Easter ------- Mountain Standard Time ------------------------------------------------ -07:00 Mountain Standard Time MST MDT US Denver -07:00 Mountain Standard Time (Mexico) MST MDT MX Chihuahua -07:00 US Mountain Standard Time MST MDT US Phoenix ------- Pacific Standard Time ------------------------------------------------- -08:00 Pacific Standard Time PST PDT US Los Angeles -08:00 Pacific Standard Time (Mexico) PST PDT MX Tijuana ------- Alaska Standard Time -------------------------------------------------- -09:00 Alaskan Standard Time AKS AKD US Anchorage ------- Hawaii Standard Time -------------------------------------------------- -10:00 Aleutian Standard Time HST HDT US Aleutian -10:00 Hawaiian Standard Time HST HDT US Honolulu ------- Samoa Standard Time --------------------------------------------------- +13:00 Samoa Standard Time SST SDT US Samoa ------- New Zealand Standard Time --------------------------------------------- +12:00 New Zealand Standard Time NZS NZD NZ Auckland ------- Guam Standard Time ---------------------------------------------------- +10:00 West Pacific Standard Time GST GDT GU Guam ------- Eastern Australian Standard ------------------------------------------- +10:00 AUS Eastern Standard Time EAS EAD AU Sydney +10:00 E. Australia Standard Time EAS EAD AU Brisbane +10:00 Tasmania Standard Time EAS EAD AU Hobart ------- Central Australian Standard ------------------------------------------- +09:30 AUS Central Standard Time CAS CAD AU Darwin +09:30 Cen. Australia Standard Time CAS CAD AU Adelaide ------- Japan Standard Time --------------------------------------------------- +09:00 Tokyo Standard Time JST JDT JP Tokyo ------- Korean Standard Time -------------------------------------------------- +09:00 Korea Standard Time KST KDT KR Seoul +09:00 North Korea Standard Time KST KDT KP Pyongyang ------- China Coast Time ------------------------------------------------------ +08:00 China Standard Time CCT CDT CN Shanghai +08:00 Taipei Standard Time CCT CDT TW Taipei ------- Hong Kong Time -------------------------------------------------------- +08:00 China Standard Time HKT HKS HK Hong Kong ------- Singapore Standard Time ----------------------------------------------- +08:00 Singapore Standard Time SST SDT SG Singapore ------- Western Australian Standard ------------------------------------------- +08:45 Aus Central W. Standard Time WAS WAD AU Eucla +08:00 W. Australia Standard Time WAS WAD AU Perth ------- North Sumatra Time ---------------------------------------------------- +07:00 SE Asia Standard Time NST NDT ID Jakarta ------- Indian Standard Time -------------------------------------------------- +05:30 India Standard Time IST IDT IN Calcutta ------- Iran Standard Time ---------------------------------------------------- +03:30 Iran Standard Time IST IDT IR Tehran ------- Moscow Winter Time ---------------------------------------------------- +03:00 Belarus Standard Time MSK MSD BY Minsk +03:00 Russian Standard Time MSK MSD RU Moscow ------- Eastern Europe Time --------------------------------------------------- +02:00 E. Europe Standard Time EET EES MD Chisinau +02:00 FLE Standard Time EET EES UA Kiev +02:00 GTB Standard Time EET EES RO Bucharest +02:00 Kaliningrad Standard Time EET EES RU Kaliningrad ------- Israel Standard Time -------------------------------------------------- +02:00 Israel Standard Time IST IDT IL Jerusalem ------- Central European Time ------------------------------------------------- +01:00 Central Europe Standard Time CET CES HU Budapest +01:00 Central European Standard Time CET CES PL Warsaw +01:00 Romance Standard Time CET CES FR Paris +01:00 W. Europe Standard Time CET CES DE Berlin ------- West African Time ----------------------------------------------------- +01:00 Namibia Standard Time WAT WAS NA Windhoek +01:00 W. Central Africa Standard Time WAT WAS NG Lagos

NOTE: MSDOS_(APPEND/COMSPEC/LASTDRIVE/TEMP/TZ) are not copied to the virtual table, but MSDOS_PATH is copied to, because some softwares may refer it.

----- Recommended Configurations

Create C:\DOS and C:\TEMP folders. Copy COMMAND.COM (I recommend the Windows 98's COMMAND.COM Version 7.10) and other DOS command files (ex. MORE.COM) into C:\DOS folder.

Set the environment variables listed below on the host Windows:

MSDOS_COMSPEC = C:\DOS\COMMAND.COM MSDOS_PATH = C:\DOS MSDOS_TEMP = C:\TEMP

----- Convert Command File To 32bit Or 64bit Execution File

You can convert a 16bit command file to a single 32bit or 64bit execution file by embeding a command file to the msdos.exe.

For exmaple, you can convert LIST.COM by this command:

> msdos -cLIST32.EXE LIST.COM

and you can simply run LIST32.EXE without msdos.exe.

NOTE: Please specify a target command file with its extension, and specify a new execution file name other than "msdos.exe". If a new execution file name is not specified (only "-c" is specified), it is "new_exec_file.exe".

Other options' value are also stored to a new execution file, for example:

> msdos -cCOMMAND32.EXE -v6.22 -x COMMAND.COM

When you run COMMAND32.EXE, it starts COMMAND.COM with the version 6.22 and XMS/EMS option enabled.

The active code page can be also stored with '-p' option, for example:

> msdos -cSW1US32.EXE -p437 -s SW1US.EXE

> chcp 437
> msdos -cSW1US32.EXE -p -s SW1US.EXE

When you run SW1US32.EXE, it starts SW1US.EXE with the code page 437 and serial I/O option enabled.

At the execution time, an embedded command file will be extracted with the original command file name in the current directory. But if the original command file exists, it will be extracted with the temporary command file name not to overwrite the original command file. The extracted command file will be removed when the execution is finished.

----- Binaries

This archive contains 12 executable binaries:

i86_x86 	Emulates 8086 and supports both 32bit/64bit Windows
i86_x64 	Emulates 8086 and supports only 64bit Windows
i286_x86	Emulates 80286 and supports both 32bit/64bit Windows
i286_x64	Emulates 80286 and supports only 64bit Windows
i386_x86	Emulates 80386 and supports both 32bit/64bit Windows
i386_x64	Emulates 80386 and supports only 64bit Windows
i486_x86	Emulates 80486 and supports both 32bit/64bit Windows
i486_x64	Emulates 80486 and supports only 64bit Window
pentium4_x86	Emulates Pentium4 and supports both 32bit/64bit Windows
pentium4_x64	Emulates Pentium4 and supports only 64bit Window
v30_x86 	Emulates NEC V30 and supports both 32bit/64bit Windows
v30_x64 	Emulates NEC V30 and supports only 64bit Windows
ia32_x86	Emulates IA32 and supports both 32bit/64bit Windows
ia32_x64	Emulates IA32 and supports only 64bit Windows

8086 binaries are much faster than 80286/80386/80486/Pentium4/IA32 binaries. If you don't need the protected mode or new mnemonics added after 80286, I recommend i86_x86 or i86_x64 binary.

NEC V30 binaries support 8080 emulation mode. If you try CP/M-80 emulator using 8080 emulation mode, use these binaries.

IA32 binaries include Neko Project 21/W i386c core and support FPU/MMX/SSE/2/3. These binaries will emulate the protected mode more correctly.

The VC++ project file "msdos.vcproj/vcxproj" also contains the configurations for 80186, Pentium/PRO/MMX/2/3, and Cyrix MediaGX. You can build all binaries for several cpu models by running build9_all.bat or build15_all.bat. (You need VC++ 2008 with Service Pack 1 or VC++ 2017)

----- Internal Debugger

MS-DOS Player contains the internal debugger for developers, but it is disabled on the binaries in the archive. To enable the internal debugger, please remove the comment out of definition "//#define USE_DEBUGGER" in common.h and build the binary.

MS-DOS Player opens the telnet port. The port number is 23 in default, but if it is already used, 9000 or later. When you start your telnet client and connect to MS-DOS Player, the virtual cpu is suspended and you can start the debugger.

If you see the messsage "waiting until cpu is suspended...", the internal DOS service is running, for example waiting your key inputs. The virtual cpu will be suspended when exit the internal DOS service, and you can start the debugger.

If Tera Term PRO, PuTTY, or Windows telnet client (telnet.exe) is installed, it is automatically started and connected to MS-DOS Player. When you use Tera Term PRO or PuTTY, I recommend to disable "Line at Time" and enable "Character at Time".

NOTE: When you run 32bit version of MS-DOS Player on Windows x64, MS-DOS Player will try to start 32bit version of telnet.exe in SysWOW64, but it is not usually installed.

Please enter ? command to show the debugger commands. They are very similar to DEBUG command, and some break point functions (break at memory access (*), I/O port access, and interrupt) are added.

(*) break does not occur when DOS service/BIOS emulation codes access.

----- Supported Hardwares

This emulator provides a very simple IBM PC-like hardware emulation:

CPU 8086/286/386/486/Pentium4, RAM 1MB/16MB/32MB, LIM EMS 32MB (Hardware EMS), PC BIOS, DMA Controller (dummy), Interrupt Controller, System Timer, Parallel I/O (LPT1-3), Serial I/O (COM1-4), Real Time Clock + CMOS Memory, MDA/CGA CRTC + Status Register, Keyboard Controller (A20 Line Mask, CPU Reset), and 2-Button Mouse

NOTE:

  • Graphic/Sound hardwares are NOT implemented.
  • DMA Controller is implemented, but FDC and HDC are not connected.
  • Parallel I/O is implemented and the output data is written to the file "Year-Month-Day_Hour-Minute-Second.PRN" created in the TEMP directory.
  • Serial I/O is implemented and can be connected to the host's COM ports.

----- Memory Map

000000H - Conventional Memory (704KB) 0B0000H - MDA Text Video RAM (32KB) 0B8000H - CGA Text Video RAM (32KB)

0C0000H - Upper Memory Block (224KB) --- Or --- 0C0000H - EMS Page Frame (64K) 0D0000H - Upper Memory Block (160KB)

0F8000H - V-TEXT Shadow Buffer (32KB-64B) 0FFFC0H - Dummy BIOS/DOS/Driver Service Routines 0FFFF0H - CPU Boot Address 100000H - Upper Memory (15MB/31MB)

----- Supported System Calls

INT 08H PC BIOS - System Timer

INT 10H PC BIOS - Video

00H	Set Video Mode
01H	Set Text-Mode Cursor Shape
02H	Set Cursor Position
03H	Get Cursor Position And Size
05H	Select Active Display Page
06H	Scroll Up Window
07H	Scroll Down Window
08H	Read Character And Attribute At Cursor Position
09H	Write Character And Attribute At Cursor Position
0AH	Write Character Only At Cursor Position
0CH	Write Graphics Pixel
0DH	Read Graphics Pixel
0EH	Teletype Output
0FH	Get Current Video Mode
1100H	Load User-Specified Patterns
1101H	Load ROM 8x14 Monochrome Patterns
1102H	Load ROM 8x8 Dbl-Dot Patterns
1104H	Load ROM 8x16 Character Set
1110H	Load User-Specified Patterns
1111H	Load ROM 8x14 Monochrome Patterns
1112H	Load ROM 8x8 Dbl-Dot Patterns
1114H	Load ROM 8x16 Character Set
1118H	Set V-TEXT Vertically Long Mode
1130H	Get Font Information
12H	Alternate Function Select (BL=10H)
130*H	Write String
1310H	Read Characters And Standard Attributes
1311H	Read Characters And Extended Attributes
1312H	Write Characters And Standard Attributes (???)
1313H	Write Characters And Extended Attributes (???)
1320H	Write Characters And Standard Attributes
1321H	Write Characters And Extended Attributes
1A00H	Get Display Combination Code
1BH	Perform Gray-Scale Summing
8200H	Get/Set Scroll Mode
8300H	Get Video RAM Address
90H	Get Physical Workstation Display Mode
91H	Get Physical Workstation Adapter Type
EFH	Get Video Adapter Type And Mode (*1)
FEH	Get Shadow Buffer
FFH	Update Screen From Shadow Buffer

INT 11H PC BIOS - Get Equipment List

INT 12H PC BIOS - Get Memory Size

INT 13H PC BIOS - Disk I/O

00H	Reset Disk System
01H	Get Status Of Last Operation
02H	Read Sectors Into Memory
03H	Write Disk Sectors (*2)
04H	Verify Disk Sectors
08H	Get Drive Parameters
0AH	Read Long Sectors
0BH	Write Long Sectors
0DH	Reset Hard Disks
10H	Check If Drive Ready
15H	Get Disk Type

INT 14H PC BIOS - Serial I/O

00H	Initialize Port
01H	Write Character To Port
02H	Read Character From Port
03H	Get Port Status
04H	Extended Initialize
0500H	Read Modem Control Register
0501H	Write Modem Control Register

INT 15H PC BIOS

2300H	Get CMOS Data
2301H	Set CMOS Data
2400H	Disable A20 Gate
2401H	Enable A20 Gate
2402H	Get A20 Gate Status
2403H	A20 Support
49H	Get BIOS Type
5000H	Get Address Of "Read Font" Function
5001H	Get Address Of "Write Font" Function
84H	Joystick Support (*3)
86H	Wait
87H	Copy Extended Memory
88H	Get Extended Memory Size
89H	Switch To Protected Mode
8AH	Get Big Memory Size
C0H	Get Configuration
C200H	Pointing Device BIOS Interface (PS) - Enable/Disable
C201H	Pointing Device BIOS Interface (PS) - Reset
C202H	Pointing Device BIOS Interface (PS) - Set Sampling Rate
C203H	Pointing Device BIOS Interface (PS) - Set Resolution
C204H	Pointing Device BIOS Interface (PS) - Get Type
C205H	Pointing Device BIOS Interface (PS) - Initialize
C206H	Pointing Device BIOS Interface (PS) - Extended Commands
C207H	Pointing Device BIOS Interface (PS) - Set Device Handler Addr
C208H	Pointing Device BIOS Interface (PS) - Write To Pointer Port
C209H	Pointing Device BIOS Interface (PS) - Read From Pointer Port
C9H	Get CPU Type And Mask Revision
CA00H	Read CMOS Memory
CA01H	Write CMOS Memory
E801H	Get Memory Size For >64M Configurations
E820H	Get System Memory MAP
E881H	Get Memory Size For >64M Configurations

INT 16H PC BIOS - Keyboard

00H	Get Keystroke
01H	Check For Keystroke
02H	Get Shift Flags
05H	Store Keystroke In Keyboard Buffer
09H	Get Keyboard Functionality
0AH	Get Keyboard ID
10H	Get Enhanced Keystroke
11H	Check For Enhanced Keystroke
12H	Get Extended Shift States
51H	AX (Japanese AT) Keyboard - Read Shift Key Status

INT 17H PC BIOS - Printer

00H	Write Character
01H	Initialize Port
02H	Get Status
03H	AX (Japanese AT) Printer - Output String Without Conversion
5000H	AX (Japanese AT) Printer - Set Printer Country Code
5001H	AX (Japanese AT) Printer - Get Printer Country Code
51H	AX (Japanese AT) Printer - JIS To Shift-JIS Conversion
52H	AX (Japanese AT) Printer - Shift-JIS To JIS Conversion
84H	AX (Japanese AT) Printer - Output Character Without Conversion
85H	AX (Japanese AT) Printer - Enable/Disable Character Conversion

INT 1AH PC BIOS - Timer

1A00H	Get System Timer
1A02H	Get Real Time Clock Time
1A04H	Get Real Time Clock Date
1A0AH	Read System-Timer Day Counter

INT 20H Program Terminate

INT 21H MS-DOS System Call

00H	Program Terminate
01H	Keyboard Input
02H	Console Output
03H	(Auxiliary Input)
04H	(Auxiliary Output)
05H	(Printer Output)
06H	Direct Console I/O
07H	Direct Console Input
08H	Console Input Without Echo
09H	Print String
0AH	Buffered Keyboard Input
0BH	Check Console Status
0CH	Character Input With Buffer Flush
0DH	Disk Reset
0EH	Select Disk
0FH	Open File With FCB
10H	Close File With FCB
11H	Search First Entry With FCB
12H	Search Next Entry With FCB
13H	Delete File With FCB
14H	Sequential Read With FCB
15H	Sequential Write With FCB
16H	Create New File With FCB
17H	Rename File With FCB
18H	Null Function For CP/M Compatibility
19H	Current Disk
1AH	Set Disk Transfer Address
1BH	Get Allocation Information For Default Drive
1CH	Get Allocation Information For Specified Drive
1DH	Null Function For CP/M Compatibility
1EH	Null Function For CP/M Compatibility
1FH	Get Drive Parameter Block For Default Drive
20H	Null Function For CP/M Compatibility
21H	Random Read With FCB
22H	Randome Write With FCB
23H	Get File Size With FCB
24H	Set Relative Record Field With FCB
25H	Set Vector
26H	Create New Program Segment Prefix
27H	Random Block Read With FCB
28H	Random Block Write With FCB
29H	Parse File Name
2AH	Get Date
2BH	Set Date
2CH	Get Time
2DH	Set Time
2EH	Set/Reset Verify Switch
2FH	Get Disk Transfer Address
30H	Get Version Number (*4)
31H	Keep Process
32H	Get DOS Drive Parameter Block
3300H	Get Ctrl-Break Checking State
3301H	Set Ctrl-Break Checking State
3302H	Get/Set Ctrl-Break Checking State
3305H	Get Boot Drive
3306H	Get True Version Number (*5)
3307H	Windows95 - Set/Clear DOS_FLAG
34H	Get Address Of InDOS Flag
35H	Get Vector
36H	Get Disk Free Space
3700H	Get Switch Character
3701H	Set Switch Character
3702H	Get AvailDev Flag
3703H	Set AvailDev Flag
38H	Get Country Specific Information
39H	Create Subdirectory
3AH	Remove Subdirectory
3BH	Change Current Directory
3CH	Create File
3DH	Open File Handle
3EH	Close File Handle
3FH	Read From File Or Device
40H	Write To File Or Device
41H	Erase File From Directory
42H	Move File Read/Write Pointer
4300H	Get File Attribute
4301H	Set File Attribute
4302H	MS-DOS 7 - Get Compressed File Size
43FFH	Windows98 - Extended-Length File Name Operations
4400H	Get Device Information
4401H	Set Device Information
4402H	Read From Character Device Control Channel
4406H	Get Input Status
4407H	Get Output Status
4408H	Device Removable Query
4409H	Device Local Or Remote Query
440AH	Handle Local Or Remote Query
440CH	Generic Character Device Request
440DH	Generic Block Device Request
4410H	Query Generic IOCTRL Capability (Handle)
4411H	Query Generic IOCTRL Capability (Drive)
45H	Duplicate File Handle
46H	Force Duplicate Of Handle
47H	Get Current Directory
48H	Allocate Memory
49H	Free Allocated Memory
4AH	Modify Allocated Memory Blocks
4B00H	Load And Execute Program
4B01H	Load Program
4B03H	Load Overlay
4CH	Terminate Process
4DH	Get Subprocess Return Code
4EH	Find First Matching File
4FH	Find Next Matching File
50H	Set Program Segment Prefix Address
51H	Get Program Segment Prefix Address
52H	Get DOS Info Table
53H	Translate BIOS Parameter Block To Drive Param Bock
54H	Get Verify State
55H	Create Child Program Segment Prefix
56H	Rename File
5700H	Get Last Written Date And Time
5701H	Set Last Written Date And Time
5704H	Windows95 - Get Last Access Date And Time
5705H	Windows95 - Set Last Access Date And Time
5706H	Windows95 - Get Creation Date And Time
5707H	Windows95 - Set Creation Date And Time
5800H	Get Memory Allocation Strategy
5801H	Set Memory Allocation Strategy
5802H	Get UMB Link State
5803H	Set UMB Link State
59H	Get Extended Error Information
5AH	Create Unique File
5BH	Create New File
5CH	Lock/Unlock File Access
5D00H	Server Function Call
5D06H	Get Address Of DOS Swappable Data Area
5D0AH	Set Extended Error Information
5E00H	Get Machine Name
5F02H	Get Redirection List Entry
5F05H	Get Extended Redirection List Entry
5F07H	Enable Drive
5F08H	Disable Drive
60H	Canonicalize Filename Or Path
61H	Reserved Fnction
62H	Get Program Segment Prefix Address
6300H	Get DBCS Vector
6500H	Windows95 OSR2 - Set General Internationalization Info
6501H	Get General Internationalization Info
6502H	Get Upper Case Table
6503H	Get Lower Case Table
6504H	Get File Name Upper Case Table
6505H	Get File Name Lower Case Table
6506H	Get Collating Sequence Table
6507H	Get DBCS Vector
6520H	Character Capitalization
6521H	String Capitalization
6522H	ASCIIZ Capitalization
6523H	Determine If Character Represents Yes/No Response
65A0H	Character Capitalization
65A1H	String Capitalization
65A2H	ASCIIZ Capitalization
6601H	Get Global Code Page Table
6602H	Set Global Code Page Table
67H	Set Handle Count
68H	Commit File
6900H	Get Disk Serial Number
6AH	Commit File
6BH	Null Function
6CH	Extended Open/Create
7002H	Windows95 - Set General Internationalization Info
710DH	Windows95 - Reset Drive
7139H	Windows95 - LFN - Create Subdirectory
713AH	Windows95 - LFN - Remove Subdirectory
713BH	Windows95 - LFN - Change Current Directory
7141H	Windows95 - LFN - Erase File From Directory
7143H	Windows95 - LFN - Get/Set File Attribute
7147H	Windows95 - LFN - Get Current Directory
714EH	Windows95 - LFN - Find First Matching File
714FH	Windows95 - LFN - Find Next Matching File
7156H	Windows95 - LFN - Rename File
7160H	Windows95 - LFN - Canonicalize Filename Or Path
716CH	Windows95 - LFN - Extended Open/Create
71A0H	Windows95 - LFN - Get Volume Information
71A1H	Windows95 - LFN - Terminate Directory Search
71A6H	Windows95 - LFN - Get File Information By Handle
71A7H	Windows95 - LFN - Convert File Time/DOS Time
71A8H	Windows95 - LFN - Generate Short File Name
71A9H	Windows95 - LFN - Extended Server Open/Create
71AAH	Windows95 - LFN - Create/Terminate/Query SUBST
7300H	Windows95 - FAT32 - Get Drive Locking
7302H	Windows95 - FAT32 - Get Extended DPB
7303H	Windows95 - FAT32 - Get Extended Free Space On Drive
DBH	Novell NetWare - Workstation - Get Number Of Local Drives
DCH	Novell NetWare - Connection Services - Get Connection Number

INT 23H Ctrl-Break Address

INT 24H Critical Error Handler

INT 25H Absolute Disk Read

INT 26H Absolute Disk Write (*2)

INT 27H Terminate And Stay Resident

INT 28H DOS Idle

INT 29H DOS Fast Character I/O

INT 2EH Pass Command To Command Interpreter For Execution

INT 2FH Multiplex Interrupt

0500H	DOS 3.0+ Critical Error Handler - Installation Check
0502H	DOS 3.0+ Critical Error Handler - Expand Error Into String
1200H	DOS 3.0+ internal - Installation Check
1202H	DOS 3.0+ internal - Get Interrupt Address
1203H	DOS 3.0+ Internal - Get DOS Data Segment
1204H	DOS 3.0+ internal - Normalize Path Separator
1205H	DOS 3.0+ internal - Output Character To Standard Output
120DH	DOS 3.0+ internal - Get Date And Time
1211H	DOS 3.0+ internal - Normalize ASCIZ Filename
1212H	DOS 3.0+ internal - Get Length Of ASCIZ String
1213H	DOS 3.0+ internal - Uppercase Character
1214H	DOS 3.0+ internal - Compare Far Pointers
1216H	DOS 3.0+ internal - Get System File Table Entry
1217H	DOS 3.0+ internal - Get Current Directory Structure For Drive
121AH	DOS 3.0+ internal - Get File's Drive
121BH	DOS 3.0+ internal - Set Year/Length Of February
121EH	DOS 3.0+ internal - Compare Filenames
121FH	DOS 3.0+ internal - Build Current Directory Structure
1220H	DOS 3.0+ internal - Get Job File Table Entry
1221H	DOS 3.0+ internal - Canonicalize File Name
1222H	DOS 3.0+ internal - Set Extended Error Info
1225H	DOS 3.0+ internal - Get Length Of ASCIZ String
1226H	DOS 3.3+ internal - Open File
1227H	DOS 3.3+ internal - Close File
1228H	DOS 3.3+ internal - Move File Pointer
1229H	DOS 3.3+ internal - Read From File
122BH	DOS 3.3+ internal - IOCTL
122CH	DOS 3.3+ internal - Get Device Chain
122DH	DOS 3.3+ internal - Get Extended Error Code
122EH	DOS 4.0+ internal - Get Error Table Addresses
122FH	DOS 4.0+ internal - Set DOS Version Number To Return
1400H	NLSFUNC.COM - Installation Check
1401H	NLSFUNC.COM - Change Code Page
1402H	NLSFUNC.COM - Get Extended Country Info
1403H	NLSFUNC.COM - Set Code Page
1404H	NLSFUNC.COM - Get Country Info
150BH	CD-ROM v2.00+ - Drive Check
150DH	CD-ROM v2.00+ - Get CD-ROM Drive Letters
1600H	Windows - Windows Enhanced Mode Installation Check (*6)
1605H	Windows - Windows Enhanced Mode & 286 DOSX Init Broadcast
160AH	Windows - Identify Windows Version And Type (*6)
1680H	Windows, DPMI - Release Current Virtual Machine Time-Slice
1683H	Windows 3+ - Get Current Virtual Machine ID
1A00H	ANSI.SYS - Installation Check
1A01H	ANSI.SYS - Set/Get Display Information
4000H	Windows 3+ - Get Virtual Device Driver (VDD) Capabilities
4300H	XMS - Installation Check
4308H	HIMEM.SYS - Get A20 Handler Number
4310H	XMS - Get Driver Address
4810H	Read Input Line From Console
4A01H	DOS 5.0+ - Query Free HMA Space
4A02H	DOS 5.0+ - Allocate HMA Space
4A03H	Windows95 - (De)Allocate HMA Memory Block
4A04H	Windows95 - Get Start Of HMA Memory Chain
AD00H	DISPLAY.SYS - Installation Check
AD01H	DISPLAY.SYS - Set Active Code Page
AD02H	DISPLAY.SYS - Get Active Code Page
AD03H	DISPLAY.SYS - Get Code Page Information
4F00H	BILING - Get Version
4F01H	BILING - Get Code Page
AE00H	Installable Command - Installation Check
AE01H	Installable Command - Execute

INT 33H Mouse

0000H	Reset Driver And Rest Status
0001H	Show Mouse Cursor
0002H	Hide Mouse Cursor
0003H	Return Position And Button Status
0004H	Position Mouse Cursor
0005H	Return Button Press Data
0006H	Return Button Release Data
0007H	Define Horizontal Cursor Range
0008H	Define Vertical Cursor Range
0009H	Define Graphics Cursor
000AH	Define Text Cursor
000BH	Read Motion Counters
000CH	Define Interrupt Sub Routine Parameters
000FH	Define Mickey/Pixel Ratio
0011H	Get Number Of Buttons
0014H	Exchange Interrupt Sub Routines
0015H	Return Driver Storage Requirements
0016H	Save Driver State
0017H	Restore Driver State
0018H	Set Alternate Mouse User Handler
0019H	Return User Alternate Interrupt Vector
001AH	Set Mouse Sensitivity
001BH	Return Mouse Sensitivity
001DH	Define Display Page Number
001EH	Return Display Page Number
001FH	Disable Mouse Driver
0020H	Enable Mouse Driver
0021H	Software Reset
0022H	Set Language For Messages
0023H	Get Language For Messages
0024H	Get Software Version, Moouse Type, And IRQ Number (*7)
0025H	Get General Driver Information
0026H	Get Maximum Virtual Coordinates
0027H	Get Screen/Cursor Masks And Mickey Counts
0028H	Set Video Mode
0029H	Enumerate Video Modes
002AH	Get Cursor Host Spot
0031H	Get Current Minimum/Maximum Virtual Coordinates
0032H	Get Active Advanced Functions
004DH	Return Pointer To Copyright String
006DH	Get Version String

INT 65H-66H (Used For Dummy LIM EMS/XMS Service Routines)

INT 67H LIM EMS

40H	LIM EMS - Get Manager Status
41H	LIM EMS - Get Page Frame Segment
42H	LIM EMS - Get Number Of Pages
43H	LIM EMS - Get Handle And Allocate Memory
44H	LIM EMS - Map/Unmap Memory
45H	LIM EMS - Release Handle And Memory
46H	LIM EMS - Get EMM Version (*8)
47H	LIM EMS - Save Mapping Context
48H	LIM EMS - Restore Mapping Context
4BH	LIM EMS - Get Number Of EMM Handles
4CH	LIM EMS - Get Pages Owned By Handle
4DH	LIM EMS - Get Pages For All Handles
4E00H	LIM EMS - Get Page Map
4E01H	LIM EMS - Set Page Map
4E02H	LIM EMS - Get And Set Page Map
4E03H	LIM EMS - Get Page Map Array Size
4F00H	LIM EMS 4.0 - Get Partial Page Map
4F01H	LIM EMS 4.0 - Set Partial Page Map
4F02H	LIM EMS 4.0 - Get Partial Page Map Array Size
50H	LIM EMS 4.0 - Map/Unmap Multiple Handle Pages
51H	LIM EMS 4.0 - Reallocate Pages
52H	LIM EMS 4.0 - Get/Set Handle Attributes
5300H	LIM EMS 4.0 - Get Handle Name
5301H	LIM EMS 4.0 - Set Handle Name
5400H	LIM EMS 4.0 - Get Handle Directory
5401H	LIM EMS 4.0 - Search For Named Handle
5402H	LIM EMS 4.0 - Get Total Handles
55H	LIM EMS 4.0 - Alter Page Map And Jump
56H	LIM EMS 4.0 - Alter Page Map And Call
5602H	LIM EMS 4.0 - Get Page Map Stack Space Required
5700H	LIM EMS 4.0 - Move Memory Region
5701H	LIM EMS 4.0 - Exchange Memory Region
5800H	LIM EMS 4.0 - Get Mappable Physical Address Array
5801H	LIM EMS 4.0 - Get Mappable Physical Address Array Entries
5900H	LIM EMS 4.0 - Get Hardware Configuration Array
5901H	LIM EMS 4.0 - Get Unallocated Raw Page Count
5A00H	LIM EMS 4.0 - Allocate Standard Pages
5A01H	LIM EMS 4.0 - Allocate Raw Pages
5B00H	LIM EMS 4.0 - Get Alternate Map Register Set
5B01H	LIM EMS 4.0 - Set Alternate Map Register Set
5B02H	LIM EMS 4.0 - Get Alternate Map Save Array Size
7000H	EMS - Get Page Frame Status (NEC PC-9801 Only ???)
7001H	EMS - Enable/Disable Page Frame (NEC PC-9801 Only ???)
DE00H	VCPI - Installation Check
DE01H	VCPI - Get Protected Mode Interface
DE02H	VCPI - Get Max Physical Memory Address
DE03H	VCPI - Get Number Of Free 4KB Pages
DE04H	VCPI - Allocate 4KB Page
DE05H	VCPI - Free 4KB Page
DE06H	VCPI - Get Physical Address Of Page In First MB
DE07H	VCPI - Read CR0
DE08H	VCPI - Read Debug Registers
DE09H	VCPI - Write Debug Registers
DE0AH	VCPI - Get 8259 Interrupt Vector Mapping
DE0BH	VCPI - Set 8259 Interrupt Vector Mapping
DE0CH	VCPI - Switch To Protected Mode

INT 68H-6FH (Used For Dummy BIOS/DOS/Driver Service Routines)

CALL FAR XMS

00H	XMS - Get XMS Version Number (*9)
01H	XMS - Request High Memory Area
02H	XMS - Release High Memory Area
03H	XMS - Global Enable A20
04H	XMS - Global Disable A20
05H	XMS - Local Enable A20
06H	XMS - Local Disable A20
07H	XMS - Query A20 State
08H	XMS - Query Free Extended Memory
09H	XMS - Allocate Extended Memory Block
0AH	XMS - Free Extended Memory Block
0BH	XMS - Move Extended Memory Block
0CH	XMS - Lock Extended Memory Block
0DH	XMS - Unlock Extended Memory Block
0EH	XMS - Get Handle Information
0FH	XMS - Reallocate Extended Memory Block
10H	XMS - Request Upper Memory Block
11H	XMS - Release Upper Memory Block
12H	XMS 3.0 - Reallocate Upper Memory Block
88H	XMS 3.0 - Query Free Extended Memory
89H	XMS 3.0 - Allocate Any Extended Memory
8EH	XMS 3.0 - Get Extended EMB Handle Information
8FH	XMS 3.0 - Reallocate Any Extended Memory Block

(*1) Not a Hercules-compatible video adapter (*2) Support only floppy disk drive (*3) Joysticks are not connected (*4) MS-DOS Version: 7.10 (default) or specified version with -v option (*5) MS-DOS Version: 7.10, -v option is not affected (*6) Windows Version: 4.10 (default) or specified version with -w option (*7) Mouse Version: 8.05 (*8) EMS Version: 4.0 (*9) XMS Version: 3.95

----- INT 29H Limitations

When INT 21H/2FH service outputs a character to console, INT 29H service (DOS Fast Character I/O) is called.

If INT 21H/2FH service that outputs a character to console is called again in INT 29H handler, INT 29H is not called again to prevent an infinite loop.

In usual, the virtual CPU is running while waiting inputs from console in INT 21H, AH=01H/0AH/3FH service and a timer interrupt can be raised. If INT 29H handler is hooked by your software, the virtual CPU is suspended while waiting inputs from console, and a timer interrupt never be raised.

----- Win32/64 Child Process

When we run a Win32/64 program on usual MS-DOS environment, we will see an error message "This program cannot be run in DOS mode."

When a Win32/64 program file is called by INT 21H, AX=4B00H, INT 2EH, or INT 2FH, AX=AE01H services, for example the case we run it on COMMAND.COM, it is executed as a Win32/64 child process by Win32 system() API and waits until the child process is terminated. In this time, any characters output to the console by this Win32/64 child process is not hooked by INT 29H service.

When you run a Win32/64 program with pipe, it may not work as you expect. For example, you may run Win32/64 version of more.com with pipe as follows:

msdos command.com type foo.txt | more (more.com is Win32/64 program in C:\Windows\System32)

MS-DOS Player starts more.com as a Win32/64 child process and will wait until the child process is terminated. While waiting until the child process is terminated, the virtual CPU is suspended and outputs of "type foo.txt" never be sent to the child process.

--- License

The copyright belongs to the author, but you can use the source codes under the GNU GENERAL PUBLIC LICENSE Version 2.

See also COPYING.txt for more details about the license.

----- Thanks

8086/80286 code is based on MAME 0.149 and applied fixes in MAME 0.150-0.185. NEC V30 instructions code is based on MAME 0.128. 8038/80486 code is based on MAME 0.152 and applied fixes in MAME 0.154-0.185. IA32 code is based on Neko Project 21/W.

INT 15H AH=84H (Joystick Support), INT 15H AH=87H (Copy Extended Memory), INT 15H AH=89H (Switch To Protected Mode), INT 15H AX=C209H (Read From Pointer Port) INT 21H AX=4402H (Read From Character Device Control Channel), INT 33H AX=001FH (Disable Mouse Driver), INT 33H AX=0020H (Enable Mouse Driver), INT 67H AX=DE01H (Get Protected Mode Interface), INT 67H AX=DE0CH (Switch To Protected Mode), and some DOS info block improvements are based on DOSBox.

Imported many fixes from Mr.cracyc's fork hosted at: https://github.com/cracyc/msdos-player

Patched by Mr.Sagawa, Mr.sava (lukewarm), Mr.Kimura (emk), Mr.Jason Hood, Mr.N2583ZYOB6, Mr.Fujita, Mr.Mark Ogden, Mr.cacyc, and Mr.roytam


TAKEDA, toshiya [email protected] http://takeda-toshiya.my.coocan.jp/