To:   Users
From: Peter Schorn
Subj: AltairZ80 Simulator Usage
Date: 05-Apr-2005

      COPYRIGHT NOTICE

The following copyright notice applies to both the SIMH source and binary:

  Copyright (c) 2002-2005, Peter Schorn

  Permission is hereby granted, free of charge, to any person obtaining a
  copy of this software and associated documentation files (the "Software"),
  to deal in the Software without restriction, including without limitation
  the rights to use, copy, modify, merge, publish, distribute, sublicense,
  and/or sell copies of the Software, and to permit persons to whom the
  Software is furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  PETER SCHORN BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

  Except as contained in this notice, the name of Peter Schorn shall not
  be used in advertising or otherwise to promote the sale, use or other dealings
  in this Software without prior written authorization from Peter Schorn.

  Based on work by Charles E Owen (c) 1997

This memorandum documents the Altair 8800 Simulator with Z80 support.

1. Simulator Files

sim/scp.h
    sim_console.h
    sim_defs.h
    sim_fio.h
    sim_rev.h
    sim_sock.h
    sim_timer.h
    sim_tmxr.h
    scp.c
    sim_console.c
    sim_fio.c
    sim_sock.c
    sim_timer.c
    sim_tmxr.c

sim/AltairZ80/altairz80_defs.h
    altairz80_cpu.c
    altairz80_dsk.c
    altairz80_hdsk.c
    altairz80_sio.c
    altairz80_sys.c


2. Revision History

- 05-Apr-2005, removed bogus t-state stepping support
- 24-Jul-2004, Peter Schorn (updated CP/M 2 and SPL packages)
- 12-Apr-2004, Peter Schorn (added MAP/NOMAP capability to switch off
                             key mapping)
- 26-Jan-2004, Peter Schorn (added support for t-state stepping)
- 25-Feb-2003, Peter Schorn (added support for real time simulation)
-  9-Oct-2002, Peter Schorn (added support for simulated hard disk)
- 28-Sep-2002, Peter Schorn (number of tracks per disk can be configured)
- 19-Sep-2002, Peter Schorn (added WARNROM feature)
- 31-Aug-2002, Peter Schorn (added extended ROM features suggested
                             by Scott LaBombard)
-  4-May-2002, Peter Schorn (added description of MP/M II sample software)
- 28-Apr-2002, Peter Schorn (added periodic timer interrupts and three
                             additional consoles)
- 15-Apr-2002, Peter Schorn (added memory breakpoint)
-  7-Apr-2002, Peter Schorn (added ROM / NOROM switch)
Original version of this document written by Charles E Owen


3. Background.

  The MITS (Micro Instrumentation and Telemetry Systems) Altair 8800 was
announced on the January 1975 cover of Popular Electronics, which boasted
you could buy and build this powerful computer kit for only $397. The kit
consisted at that time of only the parts to build a case, power supply,
card cage (18 slots), CPU card, and memory card with 256 *bytes* of memory.
Still, thousands were ordered within the first few months after the
announcement, starting the personal computer revolution as we know it
today.

  Many laugh at the small size of the that first kit, noting there were no
peripherals and the 256 byte memory size.  But the computer was an open
system, and by 1977 MITS and many other small startups had added many
expansion cards to make the Altair quite a respectable little computer. The
"Altair Bus" that made this possible was soon called the S-100 Bus, later
adopted as an industry standard, and eventually became the IEE-696 Bus.


4. Hardware

  We are simulating a fairly "loaded" Altair 8800 from about 1977, with the
following configuration:

  device    simulates
  name(s)

  CPU       Altair 8800 with Intel 8080 CPU board, 62KB
            of RAM, 2K of EPROM with start boot ROM.
  SIO       MITS 88-2SIO Dual Serial Interface Board. Port 1
            is assumed to be connected to a serial "glass
            TTY" that is your terminal running the Simulator.
  PTR       Paper Tape Reader attached to port 2 of the 2SIO board.
  PTP       Paper Tape Punch attached to port 2 of the
            2SIO board.  This also doubles as a printer port.
  DSK       MITS 88-DISK Floppy Disk controller with up
            to eight drives.


4.1 CPU

  We have 2 CPU options that were not present on the original machine but
are useful in the simulator.  We also allow you to select memory sizes, but
be aware that some sample software requires the full 64K (i.e. CP/M) and
the MITS Disk Basic and Altair DOS require about a minimum of 24K.

  SET CPU 8080  Simulates the 8080 CPU (normal)
  SET CPU Z80   Simulates the Z80 CPU. Note that some software (e.g. most
      original Altair software such as 4K Basic) requires an 8080 CPU and
      will not or not properly run on a Z80. This is mainly due to the use
      of the parity flag on the 8080 which has not always the same
      semantics on the Z80.

  SET CPU ITRAP  Causes the simulator to halt if an invalid opcode
      is detected (depending on the chosen CPU).
  SET CPU NOITRAP  Does not stop on an invalid Opcode.  This is
      how the real 8080 works. Note that some software such as 4K Basic
      apparently tries to execute nonexistent 8080 instructions. Therefore
      it is advisable in this case to SET CPU NOITRAP.

  SET CPU 4K
  SET CPU 8K
  SET CPU 12K
  SET CPU 16K
    ...... (in 4K steps)
  SET CPU 64K  All these set various CPU memory configurations.

  SET CPU BANKED Enables the banked memory support. The simulated memory
      has eight banks with address range 0..'common' (see registers below)
      and a common area from 'common' to 0xfff which is common to all
      banks. The currently active bank is determined by register 'bank'
      (see below). You can only switch to banked memory if the memory
      is set to 64K. The banked memory is used by CP/M 3.

  SET CPU NONBANKED Disables banked memory support.

  SET CPU ROM Enables the ROM from address 'ROMLOW' to 'ROMHIGH'
      (see below under CPU Registers) and prevents write access
      to these locations. This is the default setting.

  SET CPU NOROM Disables the ROM.

  SET CPU ALTAIRROM Enables the slightly modified but downwards compatible
      Altair boot ROM at addresses 0FF00 to 0FFFF. This is the default.

  SET CPU NOALTAIRROM Disables standard Altair ROM behavior.

  SET CPU WARNROM Enables warning messages to be printed when the CPU
      attempts to write into ROM or into non-existing memory. Also prints
      a warning message if the CPU attempts to read from non-existing
      memory.

  SET CPU NOWARNROM Suppresses all warning message of "WARNROM". Note that
      some software tries on purpose to write to ROM in order to detect
      the available RAM.

  The BOOT EPROM card starts at address 0FF00 if it has been enabled by
'SET CPU ALTAIRROM'.  Jumping to this address will boot drive 0 of the
floppy controller (CPU must be set to ROM or equivalent code must be
present).  If no valid bootable software is present there the machine
crashes.  This is historically accurate behavior.

  The real 8080, on receiving a HLT (Halt) instruction, freezes the
processor and only an interrupt or CPU hardware reset will restore it.  The
simulator is a lot nicer, it will halt but send you back to the simulator
command line.

CPU Registers include the following:

  Name  Size  Comment

  PC      16  The Program Counter
  AF      16  The accumulator and the flag register
              F = S Z - AC - P/V N C
                S    = Sign flag.
                Z    = Zero Flag.
                AC   = Auxiliary Carry flag.
                P/V  = Parity flag on 8080
                       Parity / Overflow flag on Z80
                -    = not used (undefined)
                N    = Internal sign flag
                C    = Carry flag.
  BC      16  The BC register pair.
              Register B is the high 8 bits, C is the lower 8 bits
  DE      16  The DE register pair.
              Register D is the high 8 bits, E is the lower 8 bits.
  HL      16  The HL register pair.
              Register H is the high 8 bits, L is the lower 8 bits.
  AF1     16  The alternate AF register (on Z80 only)
  BC1     16  The alternate BC register (on Z80 only)
  DE1     16  The alternate DE register (on Z80 only)
  HL1     16  The alternate HL register (on Z80 only)
  IX      16  The IX index register     (on Z80 only)
  IY      16  The IY index register     (on Z80 only)
  IFF      8  Interrupt flag            (on Z80 only)
  INT      8  Interrupt register        (on Z80 only)

  SR      16  The front panel switches (use D SR 8 for 4k Basic).
  WRU      8  The interrupt character.  This starts as 5
              (ctrl-E) but some Altair software uses this
              keystroke so best to change this to something
              exotic such as 035 (which is Ctl-]).

  BANK     3  The currently active memory bank (if banked memory
              is activated - see memory options above)
  COMMON  16  The starting address of common memory. Originally set
              to 0xc000 (note this setting must agree with the
              value supplied to GENCPM for CP/M 3 system generation)
  ROMLOW  16  The starting address of the ROM. Default is 0FF00.
  ROMHIGH 16  The final address of the ROM. Default is 0FFFF.
  CLOCK   32  The clock speed of the simulated CPU in kHz or 0 to run
              at maximum speed. To set the clock speed for a typical
              4 MHz Z80 CPU, use D CLOCK 4000. The CP/M utility SPEED
              measures the clock speed of the simulated CPU.


4.2 The Serial I/O Card (2SIO)

  This simple programmed I/O device provides 2 serial ports to the outside
world, which could be hardware jumpered to support RS-232 plugs or a TTY
current loop interface.  The standard I/O addresses assigned by MITS was
10-11 (hex) for the first port, and 12-13 (hex) for the second. We follow
this standard in the Simulator.

  The simulator directs I/O to/from the first port to the screen. The
second port reads from an attachable "tape reader" file on input, and
writes to an attachable "punch file" on output.  These files are considered
a simple stream of 8-bit bytes.

  The SIO can be configured in SIMH with the following commands:

  SET SIO TTY      Bit 8 is set to zero on console output
  SET SIO ANSI     Bit 8 is not touched on console output

  SET SIO ALL      Console input remain unchanged
  SET SIO UPPER    Console input is transformed to upper case characters only
                   (This feature is useful for most Altair software)
                   SET SIO MAP must also have been executed for this
                   option to take effect - otherwise no mapping occurs.

  SET SIO BS       Map the delete character to backspace
                   SET SIO MAP must also have been executed for this
                   option to take effect - otherwise no mapping occurs.
  SET SIO DEL      Map the backspace character to delete
                   SET SIO MAP must also have been executed for this
                   option to take effect - otherwise no mapping occurs.

  SET SIO QUIET    Do not print warning messages
  SET SIO VERBOSE  Print warning messages (useful for debugging)
                   The register SIOWL determines how often the same warning
                   is displayed. The default is 3.

  SET SIO MAP      Enable mapping of characters
                   (see also SET SIO ALL/UPPER/BS/DEL)
  SET SIO NOMAP    Disable mapping of characters
                   (see also SET SIO ALL/UPPER/BS/DEL)

  You can also attach the SIO to a port:

  ATTACH SIO 23    Console IO goes via a Telnet connection on port 23
  DETACH SIO       Console IO goes via the regular SIMH console


4.3 The SIMH pseudo device

  The SIMH pseudo device facilitates the communication between the
simulated ALTAIR and the simulator environment. This device defines a
number of (most R/O) registers (see source code) which are primarily useful
for debugging purposes.

  The SIMH pseudo device can be configured with

  SET SIMH QUIET    Do not print warning messages
  SET SIMH VERBOSE  Print warning messages (useful for debugging)

  SET SIMH TIMERON  Start periodic timer interrupts
  SET SIMH TIMEROFF Stop the periodic timer interrupts

  The following variables determine the behavior of the timer:

  TIMD    This is the delay between consecutive interrupts in milliseconds.
          Use D TIMD 20 for a 50 Hz clock.
  TIMH    This is the address of the interrupt handler to call for a
          timer interrupt.


4.4 The 88-DISK controller.

  The MITS 88-DISK is a simple programmed I/O interface to the MITS 8-inch
floppy drive, which was basically a Pertec FD-400 with a power supply and
buffer board built-in.  The controller supports neither interrupts nor DMA,
so floppy access required the sustained attention of the CPU. The standard
I/O addresses were 8, 9, and 0A (hex), and we follow the standard.  Details
on controlling this hardware are in the altairz80_dsk.c source file.

  The only difference is that the simulated disks may be larger than the
original ones: The original disk had 77 tracks while the simulated disks
support up to 254 tracks (only relevant for CP/M). You can change the
number of tracks per disk by setting the appropriate value in TRACKS[..].
For example "D TRACKS[0] 77" sets the number of tracks for disk 0 to the
original number of 77. The command "D TRACKS[0-7] 77" changes the highest
track number for all disks to 77.

  For debugging purposes you can set the trace level of some disk I/O
functions. To do so the following bits in TRACE (a register of the disk)
have been defined with the following meaning:

  1 Trace all IN and OUT instructions on the disk ports 8 and 9
  2 Trace all read and writes to full sectors on the disk
  4 Print a message whenever an unnecessary step-in or step out of the
    disk head occurs (often an indication of an infinite loop)
  8 Print a message whenever the disk head appears to be waiting for a
    sector which does not show up (often an indication of an infinite
    loop)

For example the command "D TRACE 10" will trace options 2+8 from above.

  The DSK device can be configured with

  SET DSK<n> QUIET         Do not print warning messages for disk <n>
  SET DSK<n> VERBOSE       Print warning messages for disk <n>
                           (useful for debugging)
                           The register DSKWL determines how often the
                           same warning is displayed. The default is 3.

  SET DSK<n> WRITEENABLED  Allow write operations for disk <n>
  SET DSK<n> LOCKED        Disk <n> is locked, i.e. no write operations
                           will be allowed.


4.5 The simulated hard disk

  In order to increase the available storage capacity, the simulator
features 8 simulated hard disks with a capacity of 8MB (HDSK0 to HDSK7).
Currently only CP/M supports two hard disks as devices I: and J:.

  For debugging purposes one can set the trace flag by executing the
command "D HDTRACE 1". The default for "HDTRACE" is 0 (no trace).

  The HDSK device can be configured with

  SET HDSK<n> QUIET         Do not print warning messages for hard disk <n>
  SET HDSK<n> VERBOSE       Print warning messages for hard disk <n>
                            (useful for debugging)

  SET HDSK<n> WRITEENABLED  Allow write operations for hard disk <n>
  SET HDSK<n> LOCKED        Hard disk <n> is locked, i.e. no
                            write operations will be allowed.


5. Sample Software

  Running an Altair in 1977 you would be running either MITS Disk Extended
BASIC, or the brand new and sexy CP/M Operating System from Digital
Research.  Or possibly, you ordered Altair DOS back when it was promised in
1975, and are still waiting for it to be delivered in early 1977.

  We have samples of all three for you to check out.  We can't go into the
details of how they work, but we'll give you a few hints.


5.1 CP/M Version 2.2

  This version is my own port of the standard CP/M to the Altair. There
were some "official" versions but I don't have them.  None were endorsed or
sold by MITS to my knowledge, however.

  To boot CP/M:

  sim> attach dsk cpm2.dsk
  sim> boot dsk

  CP/M feels like DOS, sort of.  DIR will work.  I have included all the
standard CP/M utilities, plus a few common public-domain ones.  I also
include the sources to the customized BIOS and some other small programs.
TYPE will print an ASCII file.  DUMP will dump a binary one.  LS is a
better DIR than DIR.  ASM will assemble .ASM files to Hex, LOAD will "load"
them to binary format (.COM).  ED is a simple editor, #A command will bring
the source file to the buffer, T command will "type" lines, L will move
lines, E exits the editor.  20L20T will move down 20 lines, and type 20.
Very DECish.  DDT is the debugger, DO is a batch-type command processor. A
sample batch file that will assemble and write out the bootable CP/M image
(on drive A) is "SYSCPM2.SUB".  To run it, type "DO SYSCPM2".

  In order to efficiently transfer files into the CP/M environment use the
included program R <filename.ext>. If you have a file named foo.ext in the
current directory (i.e. the directory where SIMH is), executing R FOO.EXT
under CP/M will transfer the file onto the CP/M disk. Transferring a file
from the CP/M environment to the SIMH environment is accomplished by
W <filename.ext> for text files or by W <filename.ext> B for binary files.
The simplest way for transferring multiple files is to create a ".SUB"
batch file which contains the necessary R resp. W commands.

  If you need more storage space you can use a simulated hard disk on
drives I: and J:. To use do "attach HDSK0 hdi.dsk" and issue the
"XFORMAT I:" resp.  "XFORMAT J:" command from CP/M do initialize the disk
to an empty state.

The disk "cpm2.dsk" contains the following files:
Name    Ext  Size   Comment
ASM     .COM   8K ; CP/M assembler
BDOS    .MAC  68K ; Basic Disk Operating System assembler source code
BOOT    .COM   1K ; transfer control to boot ROM
BOOT    .MAC   2K ; source for BOOT.COM
BOOTGEN .COM   2K ; put a program on the boot sectors
CBIOSX  .MAC  48K ; CP/M 2 BIOS source for Altair
CCP     .MAC  26K ; Console Command Processor assembler source code
COPY    .COM   2K ; copy disks
CPMBOOT .COM  12K ; CP/M operating system
CPU     .COM   2K ; get and set the CPU type (8080 or Z80)
CPU     .MAC   2K ; source for CPU.COM
CREF80  .COM   4K ; cross reference utility
DDT     .COM   6K ; 8080 debugger
DDTZ    .COM  10K ; Z80 debugger
DIF     .COM   4K ; determine differences between two files
DO      .COM   2K ; batch processing
DSKBOOT .MAC   8K ; source for boot ROM
DUMP    .COM   2K ; hex dump a file
ED      .COM   8K ; line editor
ELIZA   .BAS  10K ; Eliza game in Basic
EX8080  .COM  12K ; exercise 8080 instruction set
EXZ80DOC.COM  12K ; exercise Z80 instruction set, No undefined status bits
EXZ80ALL.COM  12K ; exercise Z80 instruction set, Undefined status bits
EX      .MAC  54K ; source for EX8080.COM, EXZ80DOC.COM, EXZ80ALL.COM
EX      .SUB   2K ; benchmark execution of EX8080.COM,EXZ80DOC.COM,EXZ80ALL.COM
FORMAT  .COM   2K ; format disks
GO      .COM   0K ; start the currently loaded program at 100H
HDSKBOOT.MAC   6K ; boot code for hard disk
L80     .COM  12K ; Microsoft linker
LADDER  .COM  40K ; game
LADDER  .DAT   2K ; high score file for LADDER.COM
LIB80   .COM   6K ; library utility
LOAD    .COM   2K ; load hex files
LS      .COM   4K ; directory utility
LU      .COM  20K ; library utility
M80     .COM  20K ; Microsoft macro assembler
MBASIC  .COM  24K ; Microsoft Basic interpreter
MC      .SUB   2K ; assemble and link an assembler program
MCC     .SUB   2K ; read, assemble and link an assembler program
MCCL    .SUB   2K ; assemble, link and produce listing
MEMCFG  .LIB   2K ; defines the memory configuration
MOVER   .MAC   2K ; moves operating system in place
OTHELLO .COM  12K ; Othello (Reversi) game
PIP     .COM   8K ; Peripheral Interchange Program
PRELIM  .COM   2K ; preliminary CPU tests
PRELIM  .MAC   6K ; source code for PRELIM.COM
R       .COM   4K ; read files from SIMH environment
RSETSIMH.COM   2K ; reset SIMH interface
RSETSIMH.MAC   2K ; assembler source for RSETSIMH.COM
SHOWSEC .COM   3K ; show sectors on a disk
SID     .COM   8K ; debugger for 8080
SPEED   .COM   2K ; utility to measure the clock speed of the simulated CPU
STAT    .COM   6K ; provide information about currently logged disks
SURVEY  .COM   2K ; system survey
SURVEY  .MAC  16K ; assembler source for SURVEY.COM
SYSCOPY .COM   2K ; copy system tracks between disks
SYSCPM2 .SUB   2K ; create CP/M 2 on drive A:
TIMER   .COM   2K ; perform various timer operations
TIMER   .MAC   2K ; source code for TIMER.COM
UNCR    .COM   8K ; un-crunch utility
UNERA   .COM   2K ; un-erase a file
UNERA   .MAC  16K ; source for UNERA.COM
USQ     .COM   2K ; un-squeeze utility
W       .COM   4K ; write files to SIMH environment
WM      .COM  12K ; word master screen editor
WM      .HLP   3K ; help file for WM.COM
WORM    .COM   4K ; worm game for VT100 terminal
XFORMAT .COM   2K ; initialize a drive (floppy or hard disk)
XSUB    .COM   2K ; support for DO.COM
ZAP     .COM  10K ; SuperZap 5.2 disk editor configured for VT100
ZSID    .COM  10K ; debugger for Z80
ZTRAN4  .COM   4K ; translate 8080 mnemonics into Z80 equivalents


5.2 CP/M Version 3 with banked memory

  CP/M 3 is the successor to CP/M 2.2. A customized BIOS (BIOS3.MAC) is
included to facilitate modification if so desired. The defaults supplied in
GENCPM.DAT for system generation can be used. BOOTGEN.COM is used to place
the CP/M loader (LDR.COM) on the boot tracks of a disk.

  Running CP/M 3 with banked memory:
  sim> attach dsk cpm3.dsk
  sim> reset cpu
  sim> set cpu banked
  sim> set cpu itrap
  sim> boot dsk

  Executing "DO SYSCPM3" will re-generate the banked version of CP/M 3. You
can boot CP/M 3 with or without a Z80 CPU. The Z80 CPU is needed for both
sysgens due to the use of BOOTGEN.COM which requires it.

The disk "cpm3.dsk" contains the following files:
ASM     .COM   8K ; CP/M assembler
ASSIGN  .SYS   2K
BDOS3   .SPR  10K
BIOS3   .MAC  28K ; CP/M 3 BIOS source for Altair SIMH
BIOS3   .SPR   4K
BNKBDOS3.SPR  14K
BNKBIOS3.SPR   4K
BOOT    .COM   2K ; transfer control to boot ROM
BOOTGEN .COM   2K ; put a program on the boot sectors
CCP     .COM   4K
COPYSYS .COM   2K
CPM3    .SYS  18K
CPMLDR  .MAC  38K ; CP/M 3 loader assembler source
DATE    .COM   4K ; date utility
DDT     .COM   6K ; 8080 debugger
DDTZ    .COM  10K ; Z80 debugger
DEFS    .LIB   2K ; include file for BIOS3.MAC to create banked CP/M 3
DEVICE  .COM   8K
DIF     .COM   4K ; determine differences between two files
DIR     .COM  16K ; directory utility
DO      .COM   6K ; batch processing
DUMP    .COM   2K
ED      .COM  10K
ERASE   .COM   4K
GENCOM  .COM  16K
GENCPM  .COM  22K
GENCPM  .DAT   4K ; CP/M generation information for banked version
GENCPMNB.DAT   4K ; CP/M generation information for non-banked version
GET     .COM   8K
HELP    .COM   8K ; help utility
HELP    .HLP  62K ; help files
HEXCOM  .CPM   2K
HIST    .UTL   2K
INITDIR .COM  32K
L80     .COM  12K ; Microsoft linker
LDR     .COM   4K ; CP/M loader with optimized loader BIOS
LDRBIOS3.MAC  14K ; optimized (for space) loader BIOS
LIB     .COM   8K ; Digital Research librarian
LINK    .COM  16K ; Digital Research linker
LOAD    .COM   2K
M80     .COM  20K ; Microsoft macro assembler
MC      .SUB   2K ; assemble and link an assembler program
MCC     .SUB   2K ; read, assemble and link an assembler program
PATCH   .COM   4K
PIP     .COM  10K ; Peripheral Interchange Program
PROFILE .SUB   2K ; commands to be executed at start up
PUT     .COM   8K
R       .COM   4K ; read files from SIMH environment
RENAME  .COM   4K
RESBDOS3.SPR   2K
RMAC    .COM  14K ; Digital Research macro assembler
RSETSIMH.COM   2K ; reset SIMH interface
SAVE    .COM   2K
SCB     .MAC   2K
SET     .COM  12K
SETDEF  .COM   6K
SHOW    .COM  10K
SHOWSEC .COM   4K ; show sectors on a disk
SID     .COM   8K ; 8080 debugger
SYSCOPY .COM   2K ; copy system tracks between disks
SYSCPM3 .SUB   2K ; create banked CP/M 3 system
TRACE   .UTL   2K
TSHOW   .COM   2K ; show split time
TSTART  .COM   2K ; create timer and start it
TSTOP   .COM   2K ; show final time and stop timer
TYPE    .COM   4K
UNERA   .COM   2K ; un-erase a file
W       .COM   4K ; write files to SIMH environment
XREF    .COM  16K ; cross reference utility
ZSID    .COM  10K ; Z80 debugger


5.3 MP/M II with banked memory

  MP/M II is an acronym for MultiProgramming Monitor Control Program for
Microprocessors. It is a multiuser operating system for an eight bit
microcomputer. MP/M II supports multiprogramming at each terminal. This
version supports four terminals available via Telnet. To boot:

  sim> attach dsk mpm.dsk
  sim> set cpu itrap
  sim> set cpu z80
  sim> set cpu rom
  sim> set cpu banked
  sim> attach sio 23
  sim> d common b000
  sim> boot dsk

  Now connect a Telnet session to the simulator and type "MPM" at the "A>"
prompt. Now you can connect up to three additional terminals via Telnet to
the Altair running MP/M II. To re-generate the system perform "DO SYSMPM"
in the CP/M environment (not possible under MP/M since XSUB is needed).

The disk "mpm.dsk" contains the following files:
Name    Ext  Size   Comment
ABORT   .PRL   2K ; abort a process
ABORT   .RSP   2K
ASM     .PRL  10K ; MP/M assembler
BNKBDOS .SPR  12K ; banked BDOS
BNKXDOS .SPR   2K ; banked XDOS
BNKXIOS .SPR   4K ; banked XIOS
BOOTGEN .COM   2K ; copy an executable to the boot section
CONSOLE .PRL   2K ; print console number
CPM     .COM   2K ; return to CP/M
CPM     .MAC   2K ; source for CPM.COM
DDT     .COM   6K ; MP/M DDT
DDT2    .COM   6K ; CP/M DDT
DDTZ    .COM  10K ; CP/M DDT with Z80 support
DIF     .COM   4K ; difference between two files
DIR     .PRL   2K ; directory command
DO      .COM   2K ; CP/M submit
DSKRESET.PRL   2K ; disk reset command
DUMP    .MAC   6K ; source for DUMP.PRL
DUMP    .PRL   2K ; dump command
ED      .PRL  10K ; MP/M line editor
ERA     .PRL   2K ; erase command
ERAQ    .PRL   4K ; erase command (verbose)
GENHEX  .COM   2K
GENMOD  .COM   2K
GENSYS  .COM  10K
L80     .COM  12K ; Microsoft linker
LDRBIOS .MAC  14K ; loader BIOS
LIB     .COM   8K ; library utility
LINK    .COM  16K ; linker
LOAD    .COM   2K ; loader
M80     .COM  20K ; Microsoft macro assembler
MC      .SUB   2K ; assemble and link an assembler program
MCC     .SUB   2K ; read, assemble and link an assembler program
MPM     .COM   8K ; start MP/M II
MPM     .SYS  26K ; MP/M system file
MPMD    .LIB   2K ; define a banked system
MPMLDR  .COM   6K ; MP/M loader without LDRBIOS
MPMSTAT .BRS   6K ; status of MP/M system
MPMSTAT .PRL   6K
MPMSTAT .RSP   2K
MPMXIOS .MAC  26K ; XIOS for MP/M
PIP     .PRL  10K ; MP/M peripheral interchange program
PIP2    .COM   8K ; CP/M peripheral interchange program
PRINTER .PRL   2K
PRLCOM  .PRL   4K
R       .COM   4K ; read a file from the SIMH environment
RDT     .PRL   8K ; debugger for page relocatable programs
REN     .PRL   4K ; rename a file
RESBDOS .SPR   4K ; non-banked BDOS
RMAC    .COM  14K ; Digital Research macro assembler
RSETSIMH.COM   2K ; reset SIMH interface
SCHED   .BRS   2K ; schedule a job
SCHED   .PRL   4K
SCHED   .RSP   2K
SDIR    .PRL  18K ; fancy directory command
SET     .PRL   8K ; set parameters
SHOW    .PRL   8K ; show status of disks
SPOOL   .BRS   4K ; spool utility
SPOOL   .PRL   4K
SPOOL   .RSP   2K
STAT    .COM   6K ; CP/M stat command
STAT    .PRL  10K ; MP/M stat command
STOPSPLR.PRL   2K ; stop spooler
SUBMIT  .PRL   6K ; MP/M submit
SYSCOPY .COM   2K ; copy system tracks
SYSMPM  .SUB   2K ; do a system generation
SYSTEM  .DAT   2K ; default values for system generation
TMP     .SPR   2K
TOD     .PRL   4K ; time of day
TSHOW   .COM   2K ; show split time
TSTART  .COM   2K ; create timer and start it
TSTOP   .COM   2K ; show final time and stop timer
TYPE    .PRL   2K ; type a file on the screen
USER    .PRL   2K ; set user area
W       .COM   4K ; write a file to SIMH environment
XDOS    .SPR  10K ; XDOS
XREF    .COM  16K ; cross reference utility
XSUB    .COM   2K ; for CP/M DO


5.4 CP/M application software

  There is also a small collection of sample application software
containing the following items:

- SPL:        a Small Programming Language with a suite of sample programs
- PROLOGZ:    a Prolog interpreter written in SPL with sources
- PASCFORM:   a Pascal pretty printer written in Pascal
- Pascal MT+: Pascal language system needed to compile PASCFORM

The sample software comes on "app.dsk" and to use it do

  sim> attach dsk1 app.dsk

before booting CP/M.

The disk "app.dsk" contains the following files:
Name    Ext  Size   Comment
ACKER   .SPL   4K ; compute the Ackermann function
ACKER   .COM   2K ; compute the Ackermann function, SPL source
BOOTGEN .COM   2K
BOOTGEN .SPL   6K ; SPL source for BOOTGEN.COM
C       .SUB   2K ; batch file for compiling an SPL source file
CALC    .PRO   4K ; Prolog demo program: Calculator
DIF     .COM   4K
DIF     .SPL  10K ; SPL source for DIF.COM
FAC     .COM   4K ; compute the factorial
FAC     .SPL   4K ; compute the factorial, SPL source
FAMILY  .PRO   4K ; Prolog demo program: Family relations
FORMEL  .COM   4K ; calculator
FORMEL  .SPL   6K ; calculator, SPL source
INTEGER .PRO   2K ; Prolog demo program: Integer arithmetic
KNAKE   .PRO   2K ; Prolog demo program: Logic puzzle
LINKMT  .COM  12K ; Pascal MT+ 5.5 linker
MOVE    .MAC   4K ; helper functions for PROLOGZ in assembler
MTERRS  .TXT   6K ; Pascal MT+ error messages
MTPLUS  .000  14K ; Pascal MT+ 5.5 compiler file
MTPLUS  .001  12K ; Pascal MT+ 5.5 compiler file
MTPLUS  .002   8K ; Pascal MT+ 5.5 compiler file
MTPLUS  .003   8K ; Pascal MT+ 5.5 compiler file
MTPLUS  .004  18K ; Pascal MT+ 5.5 compiler file
MTPLUS  .005   8K ; Pascal MT+ 5.5 compiler file
MTPLUS  .006   6K ; Pascal MT+ 5.5 compiler file
MTPLUS  .COM  36K ; Pascal MT+ 5.5 compiler
PASCFORM.COM  36K ; Pascal formatter
PASCFORM.PAS  54K ; Pascal formatter source code
PASCFORM.SUB   2K ; create Pascal formatter
PASLIB  .ERL  24K ; Pascal MT+ 5.5 run time library
PINST   .COM   4K ; terminal installation program for PROLOGZ
PINST   .SPL  16K ; terminal installation program for PROLOGZ, SPL source
PRIM    .COM   2K ; compute prime numbers
PRIM    .SPL   2K ; compute prime numbers, SPL source
PROLOGZ .COM  18K ; PROLOGZ interpreter and screen editor
PROLOGZ .SPL   2K ; SPL source for PROLOGZ
PROLOGZ .TXT  40K ; PROLOGZ documentation in German
QUEEN   .PRO   2K ; Prolog demo program: N-queens problem
READ    .COM   4K
READ    .SPL  10K ; SPL source for R.COM
RELDUMP .COM   4K ; dump a .REL file to the console
RELDUMP .SPL  10K ; dump a .REL file to the console, SPL source
SHOWSEC .COM   2K
SHOWSEC .SPL   6K ; SPL source for SHOWSEC.COM
SIEVE   .COM   2K ; compute prime numbers with a sieve
SIEVE   .SPL   6K ; compute prime numbers with a sieve, SPL source
SPEED   .COM   2K ; utility to measure the clock speed of the simulated CPU
SPEED   .SPL   4K ; SPL source for SPEED.COM
SPL     .COM  28K ; the SPL compiler itself
SPL     .TXT  50K ; SPL language and compiler documentation
SPLERROR.DAT   8K ; error messages of the compiler
SPLRTLB .REL   2K ; SPL runtime library
SYSCOPY .COM   2K
SYSCOPY .SPL   6K ; SPL source for SYSCOPY.COM
WC      .COM   6K ; word count and query facility
WC      .SPL  14K ; word count and query facility, SPL source
WRITE   .COM   4K
WRITE   .SPL   8K ; SPL source for W.COM
XFORMAT .COM   2K
XFORMAT .SPL   6K ; SPL source for XFORMAT.COM


5.5 MITS Disk Extended BASIC Version 4.1

  This was the commonly used software for serious users of the Altair
computer.  It is a powerful (but slow) BASIC with some extended commands to
allow it to access and manage the disk.  There was no operating system it
ran under.  To boot:

  sim> set cpu 8080          ;Z80 will not work
  sim> attach dsk mbasic.dsk
  sim> set sio upper
  sim> go ff00

  MEMORY SIZE? [return]
  LINEPRINTER? [C return]
  HIGHEST DISK NUMBER? [0 return]  (0 here = 1 drive system)
  NUMBER OF FILES? [3 return]
  NUMBER OF RANDOM FILES? [2 return]

  44041 BYTES FREE
  ALTAIR BASIC REV. 4.1
  [DISK EXTENDED VERSION]
  COPYRIGHT 1977 BY MITS INC.
  OK
  [MOUNT 0]
  OK
  [FILES]


5.6 Altair DOS Version 1.0

  This was long promised but not delivered until it was almost irrelevant.
A short attempted tour will reveal it to be a dog, far inferior to CP/M. To
boot:

  sim> d tracks[0-7] 77   ;set to Altair settings
  sim> set cpu altairrom
  sim> attach dsk altdos.dsk
  sim> set sio upper
  sim> go ff00

  MEMORY SIZE? [return]
  INTERRUPTS? N [return]
  HIGHEST DISK NUMBER? [0 return]  (3 here = 4 drive system)
  HOW MANY DISK FILES? [3 return]
  HOW MANY RANDOM FILES? [2 return]

  056449 BYTES AVAILABLE
  DOS MONITOR VER 1.0
  COPYRIGHT 1977 BY MITS INC
  .[MNT 0]

  .[DIR 0]


5.7 Altair Basic 3.2 (4k)

  In order to run the famous 4k Basic, use the following commands (the
trick is to get the Switch Register right).

  sim> set cpu 8080     ;note 4k Basic will not run on a Z80 CPU
  sim> set sio upper    ;4k Basic does not like lower case letters as input
  sim> set cpu noitrap  ;4k Basic likes to execute non 8080 instructions-ignore
  sim> set sio ansi     ;4k Basic produces 8-bit output, strip to seven bits
  sim> d sr 8           ;good setting for the Switch Register
  sim> load 4kbas.bin 0 ;load it at 0
  sim> go 0             ;and start it
  MEMORY SIZE? [return]
  TERMINAL WIDTH? [return]
  WANT SIN? [Y]

  61911 BYTES FREE

  BASIC VERSION 3.2
  [4K VERSION]

  OK


5.8 Altair 8k Basic
  Running 8k Basic follows the procedure for 4k Basic.

  sim> set cpu 8080     ;note 8k Basic will not run on a Z80 CPU
  sim> set sio upper    ;8k Basic does not like lower case letters as input
  sim> set sio ansi     ;8k Basic produces 8-bit output, strip to seven bits
  sim> d sr 8           ;good setting for the Switch Register
  sim> load 8kbas.bin 0 ;load it at 0
  sim> go 0             ;and start it
  MEMORY SIZE? [A]

  WRITTEN FOR ROYALTIES BY MICRO-SOFT

  MEMORY SIZE? [return]
  TERMINAL WIDTH? [return]
  WANT SIN-COS-TAN-ATN?  [Y]

  58756 BYTES FREE
  ALTAIR BASIC REV. 4.0
  [EIGHT-K VERSION]
  COPYRIGHT 1976 BY MITS INC.
  OK


5.9 Altair Basic 4.0

  Execute the following commands to run Altair Extended Basic:

  sim> set sio upper      ;Extended Basic requires upper case input
  sim> set sio ansi       ;Extended Basic produces 8-bit output, strip to 7 bits
  sim> d sr 8             ;good setting for the Switch Register
  sim> load exbas.bin 0   ;load it at 0
  sim> go 0               ;and start it
  16384 Bytes loaded at 0.

  MEMORY SIZE? [return]
  WANT SIN-COS-TAN-ATN? [Y]

  50606 BYTES FREE
  ALTAIR BASIC REV. 4.0
  [EXTENDED VERSION]
  COPYRIGHT 1977 BY MITS INC.
  OK


5.10 Altair Disk Extended Basic Version 300-5-C

  This version of Basic was provided by Scott LaBombard. To execute use the
following commands:

  sim> d tracks[0-7] 77   ;set to Altair settings
  sim> at dsk extbas5.dsk
  sim> g 0

  MEMORY SIZE? [return]
  LINEPRINTER? [C]
  HIGHEST DISK NUMBER? [0]
  HOW MANY FILES? [3]
  HOW MANY RANDOM FILES? [3]

  42082 BYTES FREE

  ALTAIR DISK EXTENDED BASIC
  VERSION 300-5-C [01NOV78]
  COPYRIGHT 1978 BY MITS INC.

  OK


6. Special simulator feature: Memory access breakpoints

  In addition to the regular SIMH features such as PC queue, breakpoints
etc., this simulator supports memory access breakpoints. A memory access
breakpoint is triggered when a pre-defined memory location is accessed
(read, write or update). To set a memory location breakpoint enter

sim> break -m <location>

  Execution will stop whenever an operation accesses <location>. Note that
a memory access breakpoint is not triggered by fetching code from memory
(this is the job of regular breakpoints). This feature has been implemented
by using the typing facility of the SIMH breakpoints.


7. Brief summary of all major changes to the original Altair simulator
- Full support for Z80. CP/M software requiring a Z80 CPU now runs
  properly. DDTZ and PROLOGZ are included for demonstration purposes.
- Added banked memory support.
- PC queue implemented.
- Full assembler and dis-assembler support for Z80 and 8080 mnemonics.
  Depending on the current setting of the CPU, the appropriate mnemonics
  are used.
- The BOOT ROM was changed to fully load the software from disk. The
  original code basically loaded a copy of itself from the disk and
  executed it.
- ROM and memory size settings are now fully honored. This means that you
  cannot write into the ROM or outside the defined RAM (e.g. when the RAM size
  was truncated with the SET CPU commands). This feature allows programs which
  check for the size of available RAM to run properly (e.g. 4k Basic). In
  addition one can enable and disable the ROM which is useful in special cases
  (e.g. when testing a new version of the ROM).
- The console can also be used via Telnet. This is useful when a terminal is
  needed which supports cursor control such as a VT100. PROLOGZ for example
  has a built-in screen editor which works under Telnet.
- Simplified file exchange for CP/M. Using the READ program under CP/M one
  can easily import files into CP/M from the regular file system. Note that PIP
  does not work properly on non-text files on PTR.
- The WRITE program can be used to transfer files from the CP/M environment to
  the regular environment (binary or ASCII transfer).
- The last character read from PTR is always Control-Z (the EOF character for
  CP/M). This makes sure that PIP (Peripheral Interchange Program on CP/M) will
  terminate properly.
- Fixed a bug in the BIOS warm boot routine which caused CP/M to crash.
- Modified the BIOS for CP/M to support 8 disks.
- Added CP/M 3 banked version as sample software
- Changed from octal to hex
- Made the DSK and SIO device more robust (previously malicious code could
  crash the simulator)
- Added memory access break points
- Added periodic timer interrupts (useful for MP/M)
- Added additional consoles (useful for MP/M)
- Added MP/M II banked version as sample software
