MS-DOS Player

Since the last time I reviewed it, the MS-DOS Player, by Takeda Toshiya has come a long way!. He’s fleshed out more of the MS-DOS emulation, and updated the CPU core.

I’ve now been able to run the Microsoft C 5.1 compiler under Windows 7:

MS-DOS Player running Microsoft C 5.1

MS-DOS Player running Microsoft C 5.1

Check it out!

The MS-DOS Player is similar in nature to DOSBox, except that it’s not interactive, but rather built for CLI batch based operation. The MS-DOS Player seems to have some 80286 capabilities, but it’s BIOS/DOS emulation doesn’t seem to have the protected mode interface to allow dos extenders to work.

It’s certainly great for people that still have ANCIENT cli based programs that you’d want to call & capture their output. This is a life saver for some of us that still rely on dbaseIII & some ancient i8085 micro controller.

*EDIT updates from the future

Well Looking back at this post, it really is a snapshot of life back in 2011. Since those many years later DPMI support was added, along with the ability to ‘bind’ old programs allowing you to have a ‘Win32/Win64’ native exe that’ll run the old program inside. This is incredibly valuable for ancient toolchains where the source was either lost, or never provided, but now you can run them! This saves things like the Nintendo toolchain, although you can cross build the compiler, and assembler as they are GNU standard, the linker is a special one that will output cartridge images. And now you can run the MS-DOS DPMI version under Win64. Awesome!

Qemu 0.14.0 rc1 released!

Back on the heels of the 0.14.0 rc0 release, it’s rc1!

Still nothing on the official changelog

Also I ran into this snag while building under windows..

LINK i386-softmmu/qemu.exe
../qemu-timer.o: In function `host_alarm_handler’:
C:/msys/1.0/src/qemu-0.14.0-rc1/qemu-timer.c:188: undefined reference to `qemu_next_alarm_deadline’

I moved the “#ifndef _WIN32” below the definition of `qemu_next_alarm_deadline’, and all was well.

So here is the x86, x86_x64 build, what 99% of you want. And here is the RISC version for the 0.01%.

Qemu 0.14.0 rc1 and Windows NT October 1992

Qemu 0.14.0 rc1 and Windows NT October 1992

I know this may not look like much, or seem different from much of any version of Qemu but it’s 0.14.0 rc!!!!

Qemu 0.14.0 rc0 released!

Whoa I didn’t see that coming along so quick…

I was anxiously awaiting some VM/386 diskettes I ordered from Amazon to show up.

The main changelog hasn’t been updated since 0.12.5 so I really don’t know what to expect in this release.

One thing that is new, is QMP, the The QEMU Monitor Protocol.

Another interesting thing at a glance, is that 0.14 seems to have far more modes for the i386-softmmu..

pc         Standard PC (alias of pc-0.14)

pc-0.14    Standard PC (default)

pc-0.13    Standard PC

pc-0.12    Standard PC

pc-0.11    Standard PC, qemu 0.11

pc-0.10    Standard PC, qemu 0.10

isapc      ISA-only PC

The NE2000 still has a conflict on 0x300 IRQ 9, so removing it from hw/pc.c will allow the ISA NE2000 to function…

I also see the addition of the Intel HD Audio Controller, or hda, not to be confused with the first hard disk.

So for those of you who wish to give it a shot, here is the x86/x86_64 only version (what 99% of you want), and for the 1% crowd, the ‘other’ version which has all the OTHER cpu’s (mips,m68k,sh4,ppc).

And for some shameless google juice, here is the options for the new version of qemu-i386softmmu:

QEMU emulator version 0.13.90, Copyright (c) 2003-2008 Fabrice Bellard
usage: qemu [options] [disk_image]

‘disk_image’ is a raw hard disk image for IDE hard disk 0

Standard options:
-h or -help display this help and exit
-version display version information and exit
-M machine select emulated machine (-M ? for list)
-cpu cpu select CPU (-cpu ? for list)
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]
set the number of CPUs to ‘n’ [default=1]
maxcpus= maximum number of total cpus, including
offline CPUs for hotplug, etc
cores= number of CPU cores on one socket
threads= number of threads on one CPU core
sockets= number of discrete sockets in the system
-numa node[,mem=size][,cpus=cpu[-cpu]][,nodeid=node]
-fda/-fdb file use ‘file’ as floppy disk 0/1 image
-hda/-hdb file use ‘file’ as IDE hard disk 0/1 image
-hdc/-hdd file use ‘file’ as IDE hard disk 2/3 image
-cdrom file use ‘file’ as IDE cdrom image (cdrom is ide1 master)
-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
[,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]
[,cache=writethrough|writeback|none|unsafe][,format=f]
[,serial=s][,addr=A][,id=name][,aio=threads|native]
[,readonly=on|off]
use ‘file’ as a drive image
-set group.id.arg=value
set parameter for item of type
i.e. -set drive.$id.file=/path/to/image
-global driver.property=value
set a global default for a driver property
-mtdblock file use ‘file’ as on-board Flash memory image
-sd file use ‘file’ as SecureDigital card image
-pflash file use ‘file’ as a parallel flash image
-boot [order=drives][,once=drives][,menu=on|off]
‘drives’: floppy (a), hard disk (c), CD-ROM (d), network (n)
-snapshot write to temporary files instead of disk image files
-m megs set virtual RAM size to megs MB [default=128]
-mem-path FILE provide backing storage for guest RAM
-k language use keyboard layout (for example ‘fr’ for French)
-audio-help print list of audio drivers and their options
-soundhw c1,… enable audio support
and only specified sound cards (comma separated list)
use -soundhw ? to get the list of supported cards
use -soundhw all to enable all of them
-usb enable the USB driver (will be the default soon)
-usbdevice name add the host or guest USB device ‘name’
-device driver[,prop[=value][,…]]
add device (based on driver)
prop=value,… sets driver properties
use -device ? to print all possible drivers
use -device driver,? to print all possible properties
File system options:
-fsdev local,id=id,path=path,security_model=[mapped|passthrough|none]
Virtual File system pass-through options:
-virtfs local,path=path,mount_tag=tag,security_model=[mapped|passthrough|none]

-name string1[,process=string2]
set the name of the guest
string1 sets the window title and string2 the process name (on Linux)
-uuid %08x-%04x-%04x-%04x-%012x
specify machine UUID

Display options:
-nographic disable graphical output and redirect serial I/Os to console
-no-frame open SDL window without a frame and window decorations
-alt-grab use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)
-ctrl-grab use Right-Ctrl to grab mouse (instead of Ctrl-Alt)
-no-quit disable SDL window close capability
-sdl enable SDL
-spice enable spice
-portrait rotate graphical output 90 deg left (only PXA LCD)
-vga [std|cirrus|vmware|qxl|xenfb|none]
select video card type
-full-screen start in full screen
-g WxH[xDEPTH] Set the initial graphical resolution and depth
-vnc display start a VNC server on display

1 target only:
-win2k-hack use it when installing Windows 2000 to avoid a disk full bug
-no-fd-bootchk disable boot signature checking for floppy disks
-no-acpi disable ACPI
-no-hpet disable HPET
-balloon none disable balloon device
-balloon virtio[,addr=str]
enable virtio balloon device (default)
-acpitable [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_co
mpiler_id=str][,asl_compiler_rev=n][,data=file1[:file2]…]
ACPI table description
-smbios file=binary
load SMBIOS entry from binary file
-smbios type=0[,vendor=str][,version=str][,date=str][,release=%d.%d]
specify SMBIOS type 0 fields
-smbios type=1[,manufacturer=str][,product=str][,version=str][,serial=str]
[,uuid=uuid][,sku=str][,family=str]
specify SMBIOS type 1 fields

Network options:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
create a new Network Interface Card and connect it to VLAN ‘n’
-net user[,vlan=n][,name=str][,net=addr[/mask]][,host=addr][,restrict=y|n]
[,hostname=host][,dhcpstart=addr][,dns=addr][,tftp=dir][,bootfile=f]
[,hostfwd=rule][,guestfwd=rule] connect the user mode ne
twork stack to VLAN ‘n’, configure its
DHCP server and enabled optional services
-net tap[,vlan=n][,name=str],ifname=name
connect the host TAP network interface to VLAN ‘n’
-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]
connect the vlan ‘n’ to another VLAN using a socket connection
-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port[,localaddr=addr]]
connect the vlan ‘n’ to multicast maddr and port
use ‘localaddr=addr’ to specify the host address to send packets
from
-net dump[,vlan=n][,file=f][,len=n]
dump traffic on vlan ‘n’ to file ‘f’ (max n bytes per packet)
-net none use it alone to have zero network devices. If no -net option
is provided, the default is ‘-net nic -net user’
-netdev [user|tap|socket],id=str[,option][,option][,…]

Character device options:
-chardev null,id=id[,mux=on|off]
-chardev socket,id=id[,host=host],port=host[,to=to][,ipv4][,ipv6][,nodelay]
[,server][,nowait][,telnet][,mux=on|off] (tcp)
-chardev socket,id=id,path=path[,server][,nowait][,telnet],[mux=on|off] (unix)
-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]
[,localport=localport][,ipv4][,ipv6][,mux=on|off]
-chardev msmouse,id=id[,mux=on|off]
-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]]
[,mux=on|off]
-chardev file,id=id,path=path[,mux=on|off]
-chardev pipe,id=id,path=path[,mux=on|off]
-chardev console,id=id[,mux=on|off]
-chardev serial,id=id,path=path[,mux=on|off]

Bluetooth(R) options:
-bt hci,null dumb bluetooth HCI – doesn’t respond to commands
-bt hci,host[:id]
use host’s HCI with the given name
-bt hci[,vlan=n]
emulate a standard HCI in virtual scatternet ‘n’
-bt vhci[,vlan=n]
add host computer to virtual scatternet ‘n’ using VHCI
-bt device:dev[,vlan=n]
emulate a bluetooth device ‘dev’ in scatternet ‘n’

Linux/Multiboot boot specific:
-kernel bzImage use ‘bzImage’ as kernel image
-append cmdline use ‘cmdline’ as kernel command line
-initrd file use ‘file’ as initial ram disk

Debug/Expert options:
-serial dev redirect the serial port to char device ‘dev’
-parallel dev redirect the parallel port to char device ‘dev’
-monitor dev redirect the monitor to char device ‘dev’
-qmp dev like -monitor but opens in ‘control’ mode
-mon chardev=[name][,mode=readline|control][,default]
-debugcon dev redirect the debug console to char device ‘dev’
-pidfile file write PID to ‘file’
-singlestep always run in singlestep mode
-S freeze CPU at startup (use ‘c’ to start execution)
-gdb dev wait for gdb connection on ‘dev’
-s shorthand for -gdb tcp::1234
-d item1,… output log to /tmp/qemu.log (use -d ? for a list of log items)
-hdachs c,h,s[,t]
force hard disk 0 physical geometry and the optional BIOS
translation (t=none or lba) (usually qemu can guess them)
-L path set the directory for the BIOS, VGA BIOS and keymaps
-bios file set the filename for the BIOS
-enable-kvm enable KVM full virtualization support
-xen-domid id specify xen guest domain id
-xen-create create domain using xen hypercalls, bypassing xend
warning: should not be used when xend is in use
-xen-attach attach to existing xen domain
xend will use this when starting qemu
-no-reboot exit instead of rebooting
-no-shutdown stop before shutdown
-loadvm [tag|id]
start right away with a saved state (loadvm in monitor)
-option-rom rom load a file, rom, into the option ROM space
-clock force the use of the given methods for timer alarm.
To see what timers are available use -clock ?
-rtc [base=utc|localtime|date][,clock=host|vm][,driftfix=none|slew]
set the RTC base and clock, enable drift fix for clock ticks (x86 only)
-icount [N|auto]
enable virtual instruction counter with 2^N clock ticks per
instruction
-watchdog i6300esb|ib700
enable virtual hardware watchdog [default=none]
-watchdog-action reset|shutdown|poweroff|pause|debug|none
action when watchdog fires [default=reset]
-echr chr set terminal escape character instead of ctrl-a
-virtioconsole c
set virtio console
-show-cursor show cursor
-tb-size n set TB size
-incoming p prepare for incoming migration, listen on port p
-nodefaults don’t create default devices
-prom-env variable=value
set OpenBIOS nvram variables
-semihosting semihosting mode
-old-param old param mode
-readconfig
-writeconfig
read/write config file
-nodefconfig
do not load default config files at startup

During emulation, the following keys are useful:
ctrl-alt-f toggle full screen
ctrl-alt-n switch to virtual console ‘n’
ctrl-alt toggle mouse and keyboard grab

When using -nographic, press ‘ctrl-a h’ to get some help.

And because some people wanted it, here is *every* version of qemu I’ve found… in source!

PC-MOS/386

PC-MOS/386 print ad

PC-MOS/386 print ad

PC-MOS/386 was another multi-user MS-DOS Operating system. And they had some great ads, like above.

I was able to track down a few disks but of them all only the version 5 one seemed to run to some degree under Qemu. Or at least the $386.sys memory driver.

pc-mos 1.02

pc-mos 1.02

This is about as much as I got out of PC-MOS/386 1.0

pc-mos 3.00

pc-mos 3.00

While PC-MOS/386 3.0 loads, if you try to load the protected mode $386.sys driver it just hangs.

pc-mos 5.01

pc-mos 5.01

And PC-MOS/386 5.0 not only loads, but will load up with the protected mode driver on Qemu.

pc-mos 5.01 protected mode

pc-mos 5.01 protected mode

I’ve managed to get a serial ‘terminal’ to run, and for anyone who ever needs the hint, here is the config.sys, autoexec.bat and user01.bat file to make it boot up…. Neither VirtualPC, nor VMWare can boot up with the drivers.

config.sys

memdev = \mos\$386.sys /p
device = \mos\pcterm.sys
device = \mos\$serial.sys /ad=03f8,in=4,hs=x,ib=2048,ob=2048
smpsize = 80k
buffers = 40

autoexec.bat

echo off
rem
rem turns dot prefix command syntax off
rem
rem
rem issue path command
rem
path c:\;c:\mos
rem
rem configure for terminal(s), each addtask line is for a terminal…
rem
addtask 300k,1,,user01,pcterm,1,19200
rem addtask 300k,2,,user02,pcterm,3,19200
rem addtask 300k,3,,user03,pcterm,4,19200
rem addtask 300k,4,,user04,pcterm,5,19200
rem
rem set up printer
rem
addtask 032k,6,,printer
rem
rem make print spooler directory, note this example uses a
rem virtual disk.
rem
rem md d:\spool
rem
rem issue command for spooler
rem
spool c:\spool\ /t05
rem
rem define operating system prompt
rem
prompt $h0$p $

user01.bat

path c:\;c:\mos
prompt $h1$p $a
spool c:\spool\ /t5

So what is it like? Under emulation lots of keystrokes are lost, and it feels slow. I’m sure it’s a COMPLETELY different story on actual hardware. PC-MOS 5.0 also cannot run DPMI programs, which is a shame. Then again DPMI was a ‘new and exciting’ thing in 1992 so I guess it’s not that surprising. I’m not aware of any support to run Windows 3.1 but again 1992 was when the tide really started to turn to Windows.

As they mention on wiki memory costs, and slow disks of the time certainly made things like PC-MOS really slow.

Concurrent DOS/386

Concurrent DOS/386

Concurrent DOS/386

Concurrent DOS/386 was a successor to MP/M, from Digital Research.

I’ve been able to track down a few versions:

  • version 2, released November 17, 1987
  • version 3, released February 23, 1988

What is interesting is that these versions include a CP/M 8086 emulator. I would imagine that would be a ‘big deal’ for users of the older MP/M to migrate into a newer 80386 environment. From what I’ve seen in other places these were compatible with MS-DOS 3.0 . It can also read extended dos partitions! Since they predate VCPI/DPMI there is no way to run protected mode applications. Concurrent DOS/386 is later followed up with Digital Research Multiuser DOS. It is interesting, well to me that DR-DOS was basically a single user, single tasking version of the Multiuser DOS.

Multiuser DR-DOS

I was able to install this on Qemu 0.13.0. Although this includes some IPX/SPX stuff from the later purchase of Digital Research by Novell, it still remains a largely MS-DOS 3.3 compatible OS. Because it uses protected mode, and the v86 mode, it is still incapable of running VCPI/DPMI programs. Also absent is the CP/M emulator. I think there was a DR-DOS 6 equivalence sold as a multiuser, but by the time of DR-DOS 7, the product had been forked and several VARS started to sell their own versions based on Multiuser DR-DOS. These included (but probably not a complete list)

  • REAL/32
  • System Manager
  • DR-Multiuser-DOS

Of these, REAL/32 seems to be the only one that is still alive, and being sold by Intelligent Micro Software. I’ve located a demo version of REAL/32 here.

REAL/32 logo

REAL/32 certainly feels a lot like DR-DOS (which it is derived from) and what is cool is that it supports DPMI applications. I’ve tested some Borland Pascal stuff, along with DJGPP. Like the others it supports serial terminals to be hooked up.

real32 serial connection

 

Qemu makes it super easy to simple to switch to the serial port, and bring up the ‘second user’. I’m pretty sure you could use qemu to redirect it’s serial port over TCP…

And speaking of networking, the install program also seems to have some kind of networking config built in, so I would imagine each VM can have it’s own IPX/SPX setup? I’ll have to mess some more with it.

If you’ve ever liked DR-DOS, you may want to give real/32 a whirl, it’s certainly more… interesting.

Multiuser DOS

This has been a fun thing to go through, but at one point it was a popular trend to convert big expensive 386 computers from the late 1980’s into multi-user, multi-tasking beasts much like a mainframe. But instead of CICS, and PROFS people ran Dbase III, WordPerfect, and all kinds of email solutions from ccmail, to MS mail, and even some dbase programs, compiled by clipper into being email clients.

In a way things were more ‘simple’ back then, and the 80386 CPU had a card up it’s sleeve v86 mode. v86 mode provides hardware emulation of a 8086, allowing the base OS to spawn dozens of these virtual machines. All that was up to the ‘supervisor’ was to create virtual peripherals, much like how Windows/386 of the day ran multiple MS-DOS VM’s on a single machine that you could see at once, these solutions provide the output to multiple terminals.

While Windows/386 sat on top of MS-DOS, these multitasking DOS’s had the v86 mode multitasking as part of it’s core, and some of the later ones were themselves protected mode operating systems.

But juggling multiple MS-DOS applications at one could be quite a challenge. And of course there was the whole dos extender thing, leading up to VCPI, and DPMI.

While MP/M-86 is a grand daddy to a bunch of Digital Research derived OS’s, it’s not 386 specific so I’m going to omit it for now. I’m sure it’ll be worth doing it’s own write up.

I’m sure I’m going to miss a bunch of these, but let’s have a quick rundown.

  • Concurrent DOS/386
  • DR-Multiuser-DOS 5.0
  • Real/32
  • TSX-32
  • PC-MOS/386
  • VM/386
  • VMOS/3

If anyone knows of any others feel free to give me a shout. It does seem that multiuser DOS was a good market at one point.

An interesting find for all the Xenix fans out there

Back in the day SCO offered eval CD’s but in recent times it’s been harder to find them.

But thanks to a post on the blog Sentinel – The Fix Is Out There, I’ve not only been able to download an eval CD of SCO OpenServer, but I’ve been able to verify that the exe’s I’ve been able to build for Xenix run on OpenServer.

One thing is for sure, if you really really wanted Xenix for whatever reason, OpenServer is really FAR more useful, as it not only runs XOUT binaries without fail, but it supports bigger disks, and includes TCP/IP in the build by default!!

I’ve installed it in Qemu, for some weird reason I couldn’t install the default installation on 0.13.0, however it installed without fail on Qemu 0.10.5. I installed using the AMD PCNet NIC, which the install picks up on PCI Bus #0, device #3, and function #0 … Which will be important to someone who tries to use the NE2000 driver to only find the AMD PCNet driver works far better. I would assume it’ll load up in VMWare as it also emulates the same NIC.

I bought a copy of OpenServer years back, along with UnixWare, and it turns out that the jewel case is empty… Very annoying, but I still have my key codes and stuff. I’m not sure what version it should be for, I think it’s 5.0 as it doesn’t mention a revision on the certs.. If / when I find a dev kit that’d help things along a bit (I have codes for that too!) but in the meantime… I figured installing gcc from xenix, and using xenix 2.3.4’s ld let’s me build and link some x.out stuff. Although it’d require a bunch of work to fix things like irc but I’m not that much of a diehard just yet.

Anyways I know someone will get a kick out of it.

Oh yeah, and my xenix build of dungeon works great!