EMUL.DOC        as of 12/07/85          version 2.20


This is version 2.20 of EMUL.CMD, an 8080 emulator for use with the NEC
uPD70116 and uPD70108 series CPUs (also known as the V30 and V20,
respectively).

NOTE:   UPDATE INFO APPENDED TO END OF FILE

       This copyrighted program has been released to the Public Domain
       for NONCOMMERCIAL uses only. Users wishing to use this utility
       for ANY purpose other than personal use must first obtain written
       authorization. Commercial distribution of this utility is
       strictly forbidden without authorization and a $20.00 royalty fee
       per distributed copy.
       The above does not apply to distribution via "SIG-M library"!

       The author assumes no liability of any kind for damages arising
       from the use or inability to use this utility.


Background:

The NEC V20 and V30 are direct hardware replacements for Intel's 8088
and 8086 CPU chips, respectively, and in most cases just drop in and
make life SLIGHTLY faster.  The speed improvement is in many cases nothing
to lose sleep about, certainly not worth the twenty bucks you'll have to
shell out for the chip!  I have run a series of "average" programs and
found that they USUALLY run about 5% faster.  A popular Public Domain
CPU speed test for MSDOS clocked the V30 at 7.85MHz and the 8086 at 7.95!!!!

There are 3 reasons, however, why you might want to spend the twenty anyway.
First, the little critters are 80186/80188 instruction compatible. This means
you can do your PUSHAs and POPAs and your string out a'la Z80's OTIR.  Note
that the V-series, unlike the 80186, does not mask the shift/rotate count,
so there is no easy way of telling the chip is not an 8086/88...
Second, NEC crammed a number of unique instructions into the chip, giving
you basically the same type bit handling like the Z80, as well as BCD
shift/rotate. Here a note to BCD: the manual does not explain, but fact is
that a BCD shift/rotate wipes out the high nybble of AL. As if that mattered,
anyway...
Third, and now we're at the bottom of all THIS, NEC has added a mode bit
which, when reset, makes that chip think it's an 8080 with 4 afterburners.
You'll see shortly why afterburners.

Foreground:
Picture yourself sitting in front of some CP/M-86 or 16 bit TurboDOS machine
wanting, like I have for YEARS now, to be able to run you favorite text
editor which is unavailable outside the CP/M-80 world.  Frustrating that
you have to put up with old WordPlanet or somesuch, where you could, for
example run MINCE (the king of editors, yea!!!) if you only had something to
run it on!!!!
Now, in the TurboDOS world there is a neat Z80 simulator called TZ80 which
runs nearly every program that would ordinarily run under 8 bit TurboDOS.
Unfortunately, it is a SIMULATOR, and instructions have to be decoded one
at a time and executed. It is SLLLLLLLLLOOOOOOOOOOOOOW. Also, aside from
some inferior Public Domain "emulators", there is no such beast available
for CP/M-86 that runs reliably.

Enter EMUL.CMD.
EMUL is a true emulator which only works with NEC's V20 and V30 CPUs and
EXECUTES 8080 instructions. It allows you to run just about ANY CP/M-80
program with the following exceptions:

1. The CP/M-80 program MUST be 8080-only (no Z80 code) or the HCF (halt
  and catch fire) instruction will obliterate every byte of RAM!
2. You must be running a NEC CPU, either V20 (uPD70108) or V30 (uPD70116);
  EMUL tries to do some checking but may not be able to tell in all cases!
3. Your 8080 program must not attempt any BIOS calls other than for
  console I/O. All other calls are IGNORED.

EMUL has been tested with the following software:
MBASIC 5.21
MINCE 2.6
WordStar 3.3
SID 3.0
M80
LINK-80
BDS C 1.50A


Internals:
To TurboDOS programmers, the source code may be readable. Those used to
ASM-86 or RASM may find it a bit weird. Sorry, that's what I use around
here.   The only real confusion will arise in the fact that in EMUL ver
2, the 8080 environment is compacted so as not to take up 64k of mostly
empty space. Since the environment is ORGed in the data segment and the
8086 data segment includes base page.    Therefore, all offsets used in
the 8080 environment must not only be adjusted for theit actual running
location, but also for their relative location at load time.    This is
why you see equates like "BDOS-0X100",  or in the base page setup code,
"DFCB1-0X100" is used.   End effect is, that EMUL works.   The programs
hardest to please in regard to base page setup were M80 and MBASIC, and
they both work flawlessly now.



The afterburner:

I wrote a timing proram with the following core:

       MVI     E,50
       LXI     B,0
LOOP:   XTHL
       XTHL
       DCX     B
       MOV     A,B
       ORA     C
       JNZ     LOOP
       DCR     E
       JNZ     LOOP

The program, running on a 6MHz Z80 under TurboDOS 1.41 executed
in 35.84 seconds, including time to access the clock.
The same program running on an 8MHz V30 under EMUL executed
in 24.88 seconds, making execution speed equivalent to an 8.64MHz Z80!

I have also run the following speed tests under the following conditions:
Z80 TurboDOS, 6MHz CPU, 800k RAM disk on 16 bit slave
8086 TurboDOS, 8MHz V30, 800k RAM disk on slave

Times:                          Z80             V30/EMUL
WordStar: ^Q^C on 180k file:    0:59            0:17
WordStar: ^F last line:         1:05            0:21
M80 assemble 64k source:        1:36            0:59
Compile+link RBBS4 (BDS C):     2:59            1:58

Ever seen ANY 8080 THAT FAST????!!!!!?????

have fun 8080ing!!!!!!!!


-------------------------- UPDATE INFORMATION ---------------------------

VERSION 2.10  11/25/85
       CP/M-86 returns a  version number which may be objectionable to some
       programs. Therefore, the equate "CPMVER" in the source file has been
       added, which should be customized for your system if you do not have
       CP/M-86. It is currently set to return a CP/M version of 2.2,  which
       should work in most cases.  If you run this under either  MP/M-86 or
       TurboDOS, you may want to set it to return 3.0 and/or MP/M.
       To do this, load EMUL.CMD into a debugger (in edit mode,  not trace)
       and change the word at DS:6AF from 22 00 to 30 01.   The low byte is
       the version number and the high byte is the MP/M flag (0 or 1).
       NOTE that EMUL simply routes  ALL other function requests through to
       the host operating system, so no further changes are required to run
       programs that do MP/M record locking.
       TurboDOS  users should always set the  CP/M version to 30 01 and add
       MPMSUP to the slave GEN file.   TurboDOS users may change the CPMVER
       equate and reassemble with TASM and link with TLINK (use -1 option).

VERSION 2.11  11/28/85
       Changed default message to show TPA size. Noticed the following:
       If the 8080 stack pointer points to an ODD address, all stack
       operations will be degraded. If possible, check programs and adjust
       stack pointer to point to an EVEN address. Example: A small program
       using CALL and RET ran in 6.4 seconds with even stack pointer and
       8.68 seconds with odd stack pointer.

VERSION 2.20  12/07/85
       Minor cosmetic changes.  Also changed error check after opening file
       to work correctly under CP/M-86.  EXPERIMENTALLY trapping the emulator
       BDOS calls now since I suspect certain BDOS functions destroy BP
       (which serves as SP for the 8080).
requests through to
       the host