********************************************************************** ** NOTE - This code is still under development and may be UNSTABLE *** ********************************************************************** The current version of the CPU emulator, as of dosemu-1.1.x, has been rewritten from scratch, and is now called simx86. Dosemu started to introduce the emulator in version 0.97. The first step was to port the vm86 kernel interface in November 1997. At that time, I was only able to boot DOS (up to the C:> prompt) in plain console mode. One year later, I implemented the DPMI interface and 32-bit code. In dosemu-0.99 I ported part of the TWIN library from Willows Software (http://www.willows.com). In Twin, only a very small fraction of the time is spent emulating CPU instructions; most of the time is taken by API calls. OTOH, in dosemu most of the work is done by the emulated CPU, and a totally high-level language approach, while good for portability, is unacceptably slow on any CPU <1GHz. Two approaches remain: 1) scan the instruction flow for sensitive instructions and put breakpoints on them, executing the rest of the code natively. This is the fastest way but it is not portable. Please have a look at plex86 (http://www.plex86.org), it runs DOS. 2) try to speed up things with a binary compiler. Porting it to other architectures requires only to rewrite the backend. This is the way I choose for simx86. The purposes of this emulator are: 1) porting dosemu on other CPUs (Alpha,PPC,...) The need for such a port is decreasing with time; first, who cares anymore about DOS programs today?; then, the only successful non- Intel platform out there is the iMac, where AFAIK no one ever asked for dosemu... 2) allowing us to run 'ring-0' protected-mode programs ... up to Win95? Hmmm, wine will be there LONG before us, and there is no way of doing this from user mode without a very slow explicit tasking+paging emulation. It will be feasible to run single-task programs, like DPMI servers, in pseudo-ring0 mode, by letting Linux do the paging in hardware; however, having more than one task will require _at_least_ a kernel module. IMHO it is better to switch to plex86. 3) being a debugging tool for DOS programs and for dosemu itself this is still the main reason for emulating an ix86 on an ix86 machine :-) 4) replacing Bart Oldemans instremu (part of vgaemu) with a more complete CPU emulation. The only feasible solution, which is here partially implemented, is to start dosemu in cpuemu mode and call vm86() and run_dpmi() from INSIDE the emulator (and not the other way as everyone thinks). ********************************************************************** As of Jun 1,2001, I'm developing on a 350MHz Pentium II and an 800MHz Athlon. The programs I saw working under the emulator include: - IBM PC DOS 7.0 - ezedit - Borland tasmx - Norton Commander 5 - some djggp test pgms - gcc (djgpp) - doom[2] - Norton Diagnostics - WinOS2 (Win 3.1), more or less (mouse and timing problems?) What will probably never work: - serial code, sound code, and all sort of fast,realtime stuff (but who knows, 1GHz+ CPUs are already available) Note that FPU diagnostic programs will likely always fail, because all the FP instructions are emulated with double (64-bit) precision, instead of long double (80-bits) as in the real FPU. ********************************************************************** How to start dosemu with cpu-emu: Set $_cpu = "emulated" in your dosemu.conf file. This _enables_ the use of the CPU emulator but doesn't _start_ it, unless you undefine DONT_START_EMU in cpu_emu.h (don't do it unless you want do debug DOS itself!). This was done to skip the (long and tiresome) boot phase of DOS and to make dosemu compatible with the normal (non-cpuemu) usage without the need of using extra parameters or editing dosemu.conf every time. In the default cpuemu configuration, then, dosemu behaves in the normal (real CPU) way until you explicitly switch it into CPU emulation mode. The commands to switch the cpuemu on/off are ecpuon.com and ecpuoff.com Put them in your autoexec.bat where necessary. They are an interface to int0xe6 functions 0x90 and 0x91 (see src/base/async/int.c). You can directly call these functions from inside a program. You can edit the file src/include/cpu-emu.h to modify the emulator configuration parameters before compiling dosemu. Please do not change these settings unless you know what you are doing; see the included comments. There is an added debug option ('e') for the cpuemu. Note that using 'a' enables all debug options BUT this one, if you really want a full debug trace you must use -Dae instead of -Da. Any setting of 'e' greater than 2 is VERY HEAVY both for your CPU and for the space on your hard disk, use this option with care if you need it (but... do you really _need_ it? :-) There are also some undocumented options, mainly for debugging cpuemu itself, so they'll better stay undocumented. Happy emulating. Alberto Vignani - Jun.11,2001 Warning: the emulator will crash and burn on a cpu without a "prefetch" instruction, such as the K6 and the Pentium I and lower. To correct this you have to remove them from src/emu-i386/simx86/codegen-x86.c and src/emu-i386/simx86/codegen-arch.c Bart Oldeman - 2001/Nov/7