Multitasking MS-DOS 4.00 SMT Goupil OEM version

SMT Goupil OEM version
Build of Multitasking MS-DOS 4.0
Multitasking-MS-DOS-4-Goupil.png
Architecturex86 16-bit
Compiled1986-03-26
Works in

The SMT Goupil OEM version of Multitasking MS-DOS 4.00 was released in May 1986. Goupil was one of the few computer manufacturers that licensed the multitasking MS-DOS 4.0, while most vendors ended up skipping this version over IBM's lack of interest in it. Larry Osterman and another engineer have flown to Paris in early 1986 to fix bugs for Goupil while the rest of Microsoft was shut down in the midst of the move to the Redmond campus.

Most of the operating system is identical to internal revision 6.7, although some parts have been recompiled on 26 March 1986. Compared to the earlier revision, it adds various extra utilities, which include PS.EXE (a Unix-style process status command), DEBUGDD.SYS (the kernel debugger), and DOSSIZE.exe (a utility to determine the layout of conventional memory and the amount taken up by DOS). The session manager (SM.EXE) is absent in this release and so there is no way to visually multitask, although the one from the earlier revision works fine if set as the default shell via the SHELL= statement in CONFIG.SYS.

This version was found and uploaded by a reader of the OS/2 Museum blog on 9 April 2014.

Utilities exclusive to this release[edit | edit source]

PS.EXE (Process Status)[edit | edit source]

The output of the ps -lp command, showing multiple process running.

A Unix-style "Process Status" utility; it may be a direct port from XENIX or some other Unix distribution, as it exclusively uses Unix-style command-line switches (-) and does not even recognize MS-DOS style ones (/).

By default, only process ID, process status (which can be Run (currently running), Ready (ready to run), Wait, processes that are waiting for a scheduler timeslice, Froze, usually for "old" processes that are not swapped in, Dead, for processes that have crashed, and [ Swapped ] , used for processes currently swapped to disk), and process name are shown for every process running on the system except the POPUP.EXE DLL, which runs at all times and is started by the kernel's boot code (with a static Process ID of 0).

Command-line options
Option Result
-S Detach PS.EXE; run fullscreen and take exclusive use of the current console device.
-s Adds timeslice information (Slice), process priority (Pri), "Bmod", "Upri", "Use", and "Deny" (currently unknown), screen number (Scrn), and tics use, TicsUsed, to every process.
-l Adds child process ID, Csid (command subgroup ID), priority (again), screen group (as opposed to screen number - screen number is the number of console devices, screen group is a logical kernel concept), segment address of the processes' PTDA, command-line (Cmd) and Misc (unknown).
-t Seems to provide all command-line options provided to an app, instead of just the first one; requires -s or -t to have any visual effect.
-q Seems to have something to do with printing the process type (new or old), but no visual effect has been identified; definitely implemented in the code.

DOSSIZE.EXE (DOS Size)[edit | edit source]

The output of dossize, showing the current memory layout.

Prints the amount of memory currently taken up by DOS and running programs, across various parts of the system, how much space is free, and how much total RAM exists in the system.

DOSSIZE.EXE categories
Category Purpose
"BIOS size" Amount of space taken up by the bootloader and drivers contained within IBMBIO.COM.
"DOS size" Amount of space taken up by the kernel.
"DOS tables" Amount of space taken up by the kernel's internal system structures, such as the scheduler and list of lists (which has a somewhat non-standard layout).
"Old exe program space" Amount of space taken up by non-native NE binaries; this is usually equivalent to the memory reserved for them using the MEMSET command.
"New exe program space" Amount of space taken up by all native MDOS4 apps running on the system.
"Free space size" The amount of space free on the system.
"Total space size" The total amount of system memory.

Note that the total amount of system memory cannot exceed 640 kilobytes due to the system's real-mode nature and the fact that 360 kilobytes of the memory map is taken up by various peripherals.


Kernel debugger[edit | edit source]

This version includes a kernel debugger (DEBUGDD.SYS), which can be enabled by installing it via a DEVICE statemenet in CONFIG.SYS. When enabled, the debugger will listen on port COM2 and the system will automatically break into the debugger on boot, requiring a g command to be entered in order to continue execution; after that, the system will automatically break into the debugger upon executing an int3 instruction, trying to execute an invalid instruction or by pressing Ctrl+C on the serial console.

The debugger appears to be based on MS-DOS DEBUG, although it also shares some similarities with Windows SYMDEB and OS/2 KDB, the latter of which is the direct successor of this debugger. Only 808x instructions are supported, like the MS-DOS debugger. Most of the command set is also similar to the MS-DOS debugger, although disk I/O and quit commands have been removed. On the other side, commands to manage up to 10 breakpoints have been added. Near/far qualifiers are now shown when a pointer is being used. Support for assigning types (such as floating point numbers) to variables has also been introduced. There appears to be no command to bring up a command list or any other type of online help.

The debugger identifies itself as "System Debug 070185", suggesting a build date of 1 July or 7 January 1985.

Breakpoints[edit | edit source]

Breakpoints can be managed by the following commands:

  • bp <seg:off> creates a new debug breakpoint at the specified address.
  • bl lists all breakpoints, including their number, status (enabled or disabled), offset.
  • bd <num> disables specified debug breakpoints.
  • be <num> enables specified debug breakpoints.
  • bc <num> clears specified debug breakpoints.

The bd, be and bc accept one or more breakpoints numbers separated by space, or a * wildcard which will act on all current breakpoints.

Miscellaneous observations[edit | edit source]

Parts of DEBUGDD.SYS use high bit set terminated strings, while other parts use traditional MS-DOS $ string terminators. The former method sets the most significant bit of the last character high to terminate strings, and was primarily used on machines made prior to 1980 before becoming obsolete by the transition from 7-bit to 8-bit ASCII-based character sets. The command list itself is stored with all bytes having their high bit set, which was likely done to save space as it saves one byte per string. However, this encoding has the side effect of making the strings unreadable in modern editors. The traditional terminator is only used on strings that needed to be duplicated substantially, such as instruction names and register names; this is also done by the original MS-DOS DEBUG.

The kernel debugger additionally seems to hook INT 31H, which if executed while DEBUGDD.SYS is loaded to the system and attached causes an immediate system reboot. However, executing this without prior setup restarts the system unexpectedly and leaves it in a corrupted state where it will likely immediately crash.