# Software X386 emulation

This section written in a hurry by Alberto Vignani <vignani@mbox.vol.it> , Oct 20, 1997

## The CPU emulator

The CPU emulator has been derived from <the Twin Willows libraries>. Only the relevant parts of the library, namely the /intp32 subdirectory and the needed include files, have been extracted from the Twin sources into the src/twin directory. The Twin reference version is 3.1.1. In the Twin code, changes needed for the dosemu interface have been marked with

        #ifdef DOSEMU

Here is a summary of the changes I made in the Twin libraries:

- I added vm86 mode, and related exception handling.

- I made a first attempt to entry-point symmetry; the final goal is to have an 'invoke_code32' in interp_32_32.c, which can reach the 16-bit code using 0x66,0x67 prefixes, the same way the 16-bit code is currently doing the other way. The variables 'code32' and 'data32' are used for prefix control.

- some optimizations to memory access and multiplication code for little-endian machines and GNU compiler.

- dosemu-style debug output; this is the biggest part of the patch

- bugfixes. These are NOT marked with #ifdef DOSEMU!

The second part of the cpuemu patch is the interface to dosemu, which is controlled by the X86_EMULATOR macro. This macro was probably part of a very old attempt to interface dosemu with Bochs, I deleted the old code and replaced it with the Twin interface.

The X86_EMULATOR macro enables the compilation of the two files (cpu-emu.c and emu-utils.c) in the src/emu-i386/intp32 directory, which contain the vm86 emulator call (taken from the kernel sources) and some utility/debug functions. These files are kept separate from the Twin directory but need it to compile.

For controlling the emulator behaviour, the file include/cpu-emu.h provides three macros:

DONT_START_EMU

- if undefined, the emulator starts immediately; otherwise, a call to int 0xe6 al=0x90 is required to switch from the standard vm86 to it. To switch in and out from the emulator, the small utilities 'ecpuon.com' and 'ecpuoff.com' are provided.

TRACE_HIGH

- controls the memory areas you want to include into the debug trace. The default value excludes the video BIOS and the HMA, but feel free to change it following your needs.

VT_EMU_ONLY

- if defined, use of the emulator forces VT console mode, by ignoring the 'console' and 'graphics' statements in the video config line.

To enable the CPU emulator add

        cpuemu on

to compiletime-settings, or pass

        --enable-cpuemu

to configure.

To use the emulator, put

        cpu emulated

into /etc/dosemu.conf. Or start dosemu with -I 'cpu emulated'.

The 'e' flag was added to the debug control string, it has currently a value range from 1 to 4 and controls the level of detail the emulator writes into the dosemu debug log. WARNING - logs greater than 100Mbytes are the rule with cpu-emu!!!. As a safety measure, 'e' is not automatically added to the debug flags when you use 'a'; the 'e' parameter must be explicitly added. In addition, there is a new configuration parameter for /etc/dosemu.conf:

        logfilesize value

This will limit the file size of the logfile. Once the limit is reached, it truncates the file to zero and continues writing to it.