\input texinfo @c -*-texinfo-*-
@c %**start of header
@setfilename p11.info
@settitle p11 @value{EDITION}
@setchapternewpage odd
@iftex
@afourpaper
@end iftex
@c %**end of header

@set EDITION 1.2
@set VERSION 2.8
@set UPDATED 1 December 2000
@set UPDATE-MONTH December 2000

@ifinfo

This file documents the PDP-11 emulator p11 version @value{VERSION}.

Copyright (c) 1994-2000 Begemot Computer Associates. All rights reserved.

Redistribution of this software and documentation and use in source
and binary forms, with or without modification, are permitted provided
that the following conditions are met:

@enumerate
@item
Redistributions of source code or documentation must retain the above copyright
notice, this list of conditions and the following disclaimer.

@item
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.

@item
All advertising materials mentioning features or use of this software
must display the following acknowledgement:
@end enumerate

This product includes software developed by Begemot Computer Associates
and its contributors.

@enumerate 4
@item
The name of Begemot Computer Associates or its contributors may not be
used to endorse or promote products derived from this software without
specific prior written permission.
@end enumerate

THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY BEGEMOT COMPUTER
ASSOCIATES AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
NO EVENT SHALL BEGEMOT COMPUTER ASSOCIATES OR ITS CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.

@end ifinfo

@titlepage
@title p11
@subtitle A PDP-11 emulator
@subtitle Edition @value{EDITION}
@subtitle @value{UPDATE-MONTH}
@author Hartmut B. Brandt

@page
@vskip 0pt plus 1filll
Copyright @copyright{} 1994-2000 Begemot Computer Associates.
All rights reserved.

Redistribution of this software and documentation and use in source
and binary forms, with or without modification, are permitted provided
that the following conditions are met:

@enumerate
@item
Redistributions of source code or documentation must retain the above
copyright notice, this list of conditions and the following disclaimer.

@item
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.

@item
All advertising materials mentioning features or use of this software
must display the following acknowledgement:
@end enumerate

This product includes software developed by Begemot Computer Associates
and its contributors.

@enumerate 4
@item
The name of Begemot Computer Associates or its contributors may not be
used to endorse or promote products derived from this software without
specific prior written permission.
@end enumerate

THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY BEGEMOT COMPUTER
ASSOCIATES AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
NO EVENT SHALL BEGEMOT COMPUTER ASSOCIATES OR ITS CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.

@end titlepage

@dircategory Begemot software
@direntry
* p11: (p11).   The Begemot PDP-11 emulator.
@end direntry

@node Top, Introduction, (dir), (dir)
@comment  node-name,  next,  previous,  up
@top p11

@menu
* Introduction::                
* Running p11::                 
* Configuration files::         
* Emulated hardware::           
* Boot PROM::                   
* p11 implementation::          
* Miscellaneous programs and scripts::  
* Building and porting::        
* Performance and compatibility::  
* Acknowledgements::            
* Concept index::               

@detailmenu
 --- The Detailed Node Listing ---

Running the emulator

* Command line options::        
* The monitor::                 

The monitor

* KDJ11A monitor commands::     
* Memory monitor commands::     
* RLV12 monitor commands::      
* RHV70 monitor commands::      
* RK11 monitor commands::       
* KL11 monitor commands::       
* LP monitor commands::         
* TM11 monitor commands::       
* MRV12 monitor commands::      
* DEQNA monitor commands::      

Configuration files

* Configuration syntax::        
* Fixed devices::               
* Configurable devices::        

Fixed devices

* KDJ11A configuration::        
* Memory configuration::        

Configurable devices

* RLV12 configuration::         
* RHV70 configuration::         
* RK11 configuration::          
* KL11 configuration::          
* LP configuration::            
* TM11 configuration::          
* MRV12 configuration::         
* DEQNA configuration::         
* TOY clock configuration::     

KL11 serial line controller configuration

* xterm terminal driver::       
* Serial line terminal driver::  
* Telnet terminal driver::      
* FIFO terminal driver::        

Emulated hardware description

* KDJ11A emulation::            
* Memory emulation::            
* RLV12 emulation::             
* RHV70 emulation::             
* RK11 emulation::              
* KL11 emulation::              
* LP emulation::                
* TM11 emulation::              
* MRV12 emulation::             
* DEQNA emulation::             

The Begemot boot PROM

* HELP command::                
* BOOT command::                
* MEMORY command::              
* Boot PROM implementation::    

p11 implementation notes

* Instruction tables::          
* Device interface::            
* KL11 serial line drivers::    
* DEQNA ethernet drivers::      
* LP drivers::                  
* Memory interface::            

Miscellaneous programs and scripts

* Disk format program::         

Building and porting p11

* Building for supported architectures::  
* Porting to unsupported architectures::  

@end detailmenu
@end menu

@c ======================================================================
@node Introduction, Running p11, Top, Top
@comment  node-name,  next,  previous,  up
@chapter Introduction


@c ======================================================================
@node Running p11, Configuration files, Introduction, Top
@comment  node-name,  next,  previous,  up
@chapter Running the emulator

@menu
* Command line options::        
* The monitor::                 
@end menu

@c ----------------------------------------------------------------------
@node Command line options, The monitor, Running p11, Running p11
@comment  node-name,  next,  previous,  up
@section Command line options

@c ----------------------------------------------------------------------
@node The monitor,  , Command line options, Running p11
@comment  node-name,  next,  previous,  up
@section The monitor

@menu
* KDJ11A monitor commands::     
* Memory monitor commands::     
* RLV12 monitor commands::      
* RHV70 monitor commands::      
* RK11 monitor commands::       
* KL11 monitor commands::       
* LP monitor commands::         
* TM11 monitor commands::       
* MRV12 monitor commands::      
* DEQNA monitor commands::      
@end menu

@c ......................................................................
@node KDJ11A monitor commands, Memory monitor commands, The monitor, The monitor
@comment  node-name,  next,  previous,  up
@subsection KDJ11A monitor commands

@cindex KDJ11A monitor commands
@cindex switch register
@cindex display register

The KDJ11A device implements the following commands:

@table @code

@item ? [@var{command}]
@itemx h[elp] [@var{command}]
Print a list of available commands (if no @var{command} is given) or
short help on the given command.

@item i[nfo]
Print the state of the processor internal registers.

@item  c[sw]
@itemx c[sw] on
@itemx c[sw] off
@itemx c[sw] @var{value}
Without any argument the @code{csw} command prints the contents of the
switch and display registers and the enabled/disabled state of the
register. An argument of @code{on} enables the register, @code{off}
disables it. If a numeric @var{values} is given it is entered into the
switch register and can be red by the program (if the register is
enabled).

@end table

@c ......................................................................
@node Memory monitor commands, RLV12 monitor commands, KDJ11A monitor commands, The monitor
@comment  node-name,  next,  previous,  up
@subsection Memory system monitor commands

@cindex memory monitor commands

The memory subsystem implementes the following commands that
are accessible through the @key{I} monitor command:

@table @code

@item ? [@var{command}]
@itemx h[elp] [@var{command}]
Print a list of available commands (if no @var{command} is given) or
short help on the given command.

@item i[nfo]
Print internal status information. The output depends on the type of
memory system.

@end table

@c ......................................................................
@node RLV12 monitor commands, RHV70 monitor commands, Memory monitor commands, The monitor
@comment  node-name,  next,  previous,  up
@subsection RLV12 monitor commands

@cindex RLV12 monitor commands

The RLV12 emulator implements the following commands that can be accessed
through the @key{I} monitor command:

@table @code

@item ? [@var{command}]
@itemx h[elp] [@var{command}]
Print a list of available commands (if no @var{command} is given) or
short help on the given command.

@item i[nfo]
Print the state of the RLV12.

@cindex Loading RL02 disks
@item l[oad] drive file
Load @var{file} into drive @var{drive} and spin-up. If the file cannot
be written the write lock bit is set. The image file should have the right
size, if not it is extended (if it can be written).

@cindex Unloading RL02 disks
@item u[nload] drive
Spin-down drive @var{drive} and unload the disk pack.

@item wl[ock] drive
Write lock the drive.

@item wu[nlock] drive
Unlock the drive. This is possible only if the image file can be
written.

@end table

@c ......................................................................
@node RHV70 monitor commands, RK11 monitor commands, RLV12 monitor commands, The monitor
@comment  node-name,  next,  previous,  up
@subsection RHV70 monitor commands

The RLV12 emulator implements the following commands that can be accessed
through the @key{I} monitor command:

@table @code

@item ? [@var{command}]
@itemx h[elp] [@var{command}]
Print a list of available commands (if no @var{command} is given) or
short help on the given command.

@item i[nfo]
Print the state of the RHV70..

@cindex Loading RP06 disks
@item l[oad] drive file
Load @var{file} into drive @var{drive} and spin-up. If the file cannot
be written the write lock bit is set. The image file should have the right
size. If is has not it is extended (if it can be written).

@cindex Unloading RP06 disks
@item u[nload] drive
Spin-down drive @var{drive} and unload the disk pack.

@item wl[ock] drive
Write lock the drive.

@item wu[nlock] drive
Unlock the drive. This is possible only if the image file can be
written.

@item d[ebug] [on|off]
Switches debugging on or off. If no argument is given print the current
debugging state. If debugging is on a message is printed when the disk
image is red or written.

@end table

@c ......................................................................
@node RK11 monitor commands, KL11 monitor commands, RHV70 monitor commands, The monitor
@comment  node-name,  next,  previous,  up
@subsection RK11 monitor commands

@c ......................................................................
@node KL11 monitor commands, LP monitor commands, RK11 monitor commands, The monitor
@comment  node-name,  next,  previous,  up
@subsection KL11 monitor commands

@c ......................................................................
@node LP monitor commands, TM11 monitor commands, KL11 monitor commands, The monitor
@comment  node-name,  next,  previous,  up
@subsection Line printer interface monitor commands

@c ......................................................................
@node TM11 monitor commands, MRV12 monitor commands, LP monitor commands, The monitor
@comment  node-name,  next,  previous,  up
@subsection TM11 monitor commands

@c ......................................................................
@node MRV12 monitor commands, DEQNA monitor commands, TM11 monitor commands, The monitor
@comment  node-name,  next,  previous,  up
@subsection MRV12 monitor commands

@c ......................................................................
@node DEQNA monitor commands,  , MRV12 monitor commands, The monitor
@comment  node-name,  next,  previous,  up
@subsection DEQNA monitor commands

@c ----------------------------------------------------------------------
@node Configuration files, Emulated hardware, Running p11, Top
@comment  node-name,  next,  previous,  up
@chapter Configuration files

@menu
* Configuration syntax::        
* Fixed devices::               
* Configurable devices::        
@end menu

@c ----------------------------------------------------------------------
@node Configuration syntax, Fixed devices, Configuration files, Configuration files
@comment  node-name,  next,  previous,  up
@section Configuration file syntax

@c ----------------------------------------------------------------------
@node Fixed devices, Configurable devices, Configuration syntax, Configuration files
@comment  node-name,  next,  previous,  up
@section Fixed devices

@menu
* KDJ11A configuration::        
* Memory configuration::        
@end menu

@c ......................................................................
@node KDJ11A configuration, Memory configuration, Fixed devices, Fixed devices
@comment  node-name,  next,  previous,  up
@subsection KDJ11A configuration

@cindex KDJA11
@cindex processor device

The processor (KDJ11A) is implemented as a pseudo device. It is
automatically plugged into the emulator -- there is no need to mention
it in the configuration file. It is, however, possible to set the option
jumpers and the line clock rate in the configuration file, and to
disable the console switch register.

@example

cpu_options = <value>
clock_rate = <rate>
csw_enable = 1|0

@end example

If the options are not set, the default value is 2. Note, that the
given value is masked with 0177016 -- the other bits are not fixed.
The default line clock rate is 50 Hz. The console switch register is
enabled by default.

@c ......................................................................
@node Memory configuration,  , KDJ11A configuration, Fixed devices
@comment  node-name,  next,  previous,  up
@subsection Memory configuration

The memory is implemented as a pseudo device. It is automatically plugged
into the emulator -- there is no need to mention it in the configuration file.

It is possible to have different kinds of memory. The memory type is
selected at compile time (@pxref{Memory interface}).

Memory size is currently determined at compile time. The constant
@code{PHYSMEM} in @file{proc.h} controls the amount of memory in bytes.

[TODO: 16/18/22 bit ...]


@c ----------------------------------------------------------------------
@node Configurable devices,  , Fixed devices, Configuration files
@comment  node-name,  next,  previous,  up
@section Configurable devices

@menu
* RLV12 configuration::         
* RHV70 configuration::         
* RK11 configuration::          
* KL11 configuration::          
* LP configuration::            
* TM11 configuration::          
* MRV12 configuration::         
* DEQNA configuration::         
* TOY clock configuration::     
@end menu

@c ......................................................................
@node RLV12 configuration, RHV70 configuration, Configurable devices, Configurable devices
@comment  node-name,  next,  previous,  up
@subsection RLV12 disk controller configuration

The rl device implements a RLV12 disk controller with up to 4 disks.
Register addresses and the interrupt vector are configurable so more
than one controller can be used at the same time in the same emulator.

The configuration syntax for the RLV12 is:

@example

ctrl rl @var{csr-base} @var{vector} @var{irq-level} @var{sync-interval}
   @var{disk-no} @var{image-file}
   ...
end

@end example

@var{csr-base} is the base address of the register block (usually
017774400), @var{vector} the interrupt vector (usually 0160) and
@var{irq-level} the interrupt request level (4). @var{sync-interval}
is the interval in milliseconds between flushes to the disk images.
4000 is a good value.

Each of the following lines loads a disk image into a drive. These lines
consist of two fields: the drive number (0...3) and the name of the image
files. If the image file is read-only the write lock flag is set for that
drive.

A typical example would be:

@example

ctrl rl 017774400 0160 4 4000
  0 ../disks/sysimage.rl
end

@end example

This plugs a RLV12 controller with the default jumper settings into the
bus and loads a disk into drive 0. The disk is flushed every 4 seconds.

Disk image files must be formattet with @code{fmt}
(@pxref{Disk format program}). This program creates an image file of
the right size and writes pack number information.

@c ......................................................................
@node RHV70 configuration, RK11 configuration, RLV12 configuration, Configurable devices
@comment  node-name,  next,  previous,  up
@subsection RHV70 disk controller configuration

The rp device emulates a RHV70 controller with up to eight disk drives.
I/O addresses and vectors are configurable so more than one controller
can be used in the same emulator. Note, that it may not be possible to load
more that 8 or 10 disks. The disk images are mapped into the emulators
virtual memory which is limited (depending on the operating system).

The configuration syntax for the RHV70 is:

@example

ctrl rp @var{csr-base} @var{vector} @var{irq-level} @var{sync-interval}
   @var{disk-no} @var{image-file} @var{serial-number}
   ...
end

@end example

@var{csr-base} is the base address of the register block (usually
017776700), @var{vector} is the interrupt vector address (254) and
@var{irq-level} the interrupt priority level (5). @var{sync-interval} is
the interval in milliseconds between flushes to the disk images.  4000
is a good value.

Each of the following lines loads a disk image into a drive. These lines
consist of three fields: the drive number (0...7), the name of the image
files and the pack serial number. If the image file is read-only the
write lock flag is set for that drive. The serial number can be red by
the program in the serial number register.

A typical example would be:

@example

ctrl rp 017776700 0254 5 4000
  0 ../disks/sysimage.rp 7708
end

@end example

This plugs a RHV70 controller with the default jumper settings into the
bus and loads a disk into drive 0. The disk is flushed every 4 seconds.

Disk image files must be formattet with @code{fmt}
(@pxref{Disk format program}). This program creates an image file of
the right size and writes pack number information.

@c ......................................................................
@node RK11 configuration, KL11 configuration, RHV70 configuration, Configurable devices
@comment  node-name,  next,  previous,  up
@subsection RK11 disk controller configuration

The rk device emulates a RK11 controller with up to eight disk drives.
I/O addresses and vectors are configurable so more than one controller
can be used in the same emulator. Note, that the RK11 is a 18-bit
controller. Therefor it may crash operating systems, that need a UNIBUS
map on 22-bit systems (like RSX-11M).

The configuration syntax for the RK11 is:

@example

ctrl rk @var{csr-base} @var{vector} @var{irq-level} @var{sync-interval}
   @var{disk-no} @var{image-file}
   ...
end

@end example

@var{csr-base} is the base address of the register block (usually
017777400), @var{vector} is the interrupt vector address (220) and
@var{irq-level} the interrupt priority level (5). @var{sync-interval} is
the interval in milliseconds between flushes to the disk images. 4000
is a good value.

Each of the following lines loads a disk image into a drive. These lines
consist of two fields: the drive number (0...7) and the name of the
image file. If the image file is read-only the write lock flag is set
for that drive.

A typical example would be:

@example

ctrl rk 017777400 0220 5 4000
  0 ../disks/sysimage.rk
end

@end example

This plugs a RK11 controller with the default jumper settings into the
bus and loads a disk into drive 0. The disk is flushed every 4 seconds.

@c ......................................................................
@node KL11 configuration, LP configuration, RK11 configuration, Configurable devices
@comment  node-name,  next,  previous,  up
@subsection KL11 serial line controller configuration

The KL11 controller (kl) emulates up to 4 serial lines. I/O addresses
and vectors are configurable so that more than one controller can be
used in one system. The connection to a real device is done by an
external program (the terminal driver). There are different terminal
drivers to connect the emulated serial line to different real devices.

The configuration syntax for the KL11 is:

@example

ctrl kl
   @var{csr-base} @var{ivector} @var{ovector} @var{irq-level} @var{cmd} @var{args ...}
   ...
end

@end example

@var{csr-base} is the base address of the four register block in the i/o
space. @var{ivector} is the interrupt vector address for the keyboard
interrupt and @var{ovector} is the vector address for the display
interrupt. @var{irq-level} is the interrupt priority level. @var{cmd} is
the name of the external terminal driver followed by arguments for the
driver program (See the following sections).

A typical example would be:

@example

ctrl kl
  017777560  060  064 4 tty_xterm -7 -t p11-console
  017776500 0300 0304 4 tty_tty -7 /dev/ttyd1
  017776510 0310 0314 4 tty_net -7 -t 10000
  017776520 0320 0324 4 tty_net -7 -t 10001
end

@end example

This configures a KL11 controller with four serial lines. The first one
is the standard PDP-11 console and opens an xterm in 7 bit mode. The second
line is connected to the serial line /dev/ttyd1 of the host computer. A real
terminal could be connected there. The other two emulated lines are connected
to listening TCP sockets so it's possible to use telnet to connect to the
emulator.

@c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@menu
* xterm terminal driver::       
* Serial line terminal driver::  
* Telnet terminal driver::      
* FIFO terminal driver::        
@end menu

@node xterm terminal driver, Serial line terminal driver, KL11 configuration, KL11 configuration
@comment  node-name,  next,  previous,  up
@subsubsection xterm terminal driver

@pindex tty_xterm

The xterm serial line driver @code{tty_xterm} opens a pseudo terminal
and starts a xterm on the slave side. The program then relays all output
and input between the xterm and p11.

The format of the @code{tty_xterm} command line is:

@example

tty_xterm [@var{options}] [-x @var{args ...}]

@end example

All options begin with a @code{-}. @code{tty_xterm} understands
the following options:

@table @code

@item -7
Mask out the highest bit of each character on output. On the PDP-11 this
bit was used as the parity bit. Modern displays often have 8 bit
character sets and bytes with the parity bit on may produce funny
characters.

@item -g@var{geometry}
Specify the geometry of the xterm window as @var{columns}@code{x}@var{rows}.
The default format is @code{24x80}.

@item -p@var{position}
Specify the position of the xterm window. This is specified as
@code{-/+}@var{y-pos}@code{-/+}@var{x-pos}. The @code{-} or @code{+}
indicate position relative to the bottom resp. right side of the screen (if
@code{-}) or the left resp. top (if @code{+}). @var{y-pos} and
@var{x-pos} are the distances in characters sizes from the screen
border. There is no default for the position.

The arguments to the @code{-p} and @code{-g} switch together form a standard
X11 geometry string.

@item -t@var{title}
Use @var{title} in the title bar of the xterm window. The default is
@code{p11-tty}.

@item -i
Start the xterm in iconic state.

@item -x
Pass the remaining arguments to the xterm.

@end table

@c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@node Serial line terminal driver, Telnet terminal driver, xterm terminal driver, KL11 configuration
@comment  node-name,  next,  previous,  up
@subsubsection Serial line terminal driver

The serial line terminal driver @code{tty_tty} may be used to connect an
emulated serial line to a real one. The format of the call is:

@example

tty_tty [@var{options}] @var{file}

@end example

@code{tty_tty} understands the following options:

@table @code

@item -7
Mask out the highest bit of each character on output. On the PDP-11 this
bit was used as the parity bit. Modern displays oftern have 8 bit
character sets and bytes with the parity bit on may produce funny
characters.

@end table

The @var{file} argument is the name of the device file for the real
serial line. Currently there is no way to change the parameters of
this line. @code{tty_tty} should pass the remaining arguments to
a stty(1).

@c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@node Telnet terminal driver, FIFO terminal driver, Serial line terminal driver, KL11 configuration
@comment  node-name,  next,  previous,  up
@subsubsection Telnet terminal driver

@code{tty_net} is kind of a network terminal. It enables the user to
telnet to an emulated PDP-11 serial line. In this way the emulator can
be used across the internet. @code{tty_net} has the following syntax:

@example

tty_net [@var{options}] @var{tcp-port}

@end example

The following options are supported:

@table @code

@item -7
Mask out the highest bit of each character on output. On the PDP-11 this
bit was used as the parity bit. Modern displays oftern have 8 bit
character sets and bytes with the parity bit on may produce funny
characters.

@item -t
Telnet mode. Emulate some features of a telnetd.

@item -l@var{file}
Log connects and disconnects to the given file.

@end table

@var{tcp-port} is the port number where the program should listen for
incoming connection requests.

@code{tty_net} creates a listening TCP socket on the given port. When
a connection request comes in @code{tty_net} accepts the request and
forks. The child handles the connection between the emulator and the
remote user, whereas the parent waits for other connection requests.
If a new request arrives, while the old one is still beeing served
@code{tty_net} accepts the new request, sends a string explaining that
the port is busy and closes the connection.

If the program was started in telnet mode the child tries to switch the
remote telnet into binary mode and remote echo by sending: WILL_SGA,
WILL_ECHO, WILL_BINARY and DO_BINARY. The telnet state machine is
implemented only partial -- @code{tty_net} never expects the remote
telnet to start any option negotiation. All received options are
expected to be answers.  If the expected state is not achieved after a
reasonable amount of time (3 ticks of 10 seconds each) @code{tty_net}
gives up, sends a warning to the remote site and tries to continue with
the state it has.

The child then enters a loop, relaying the data stream between the remote
user and the emulator. If the TCP connection is closed the child exits and
the parent can accept a new connection.

@c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@node FIFO terminal driver,  , Telnet terminal driver, KL11 configuration
@comment  node-name,  next,  previous,  up
@subsubsection FIFO terminal driver

The @code{tty_fifo} program can be used to connect an emulated serial
line to a fifo file (which is assumed to be bi-directional). The call
syntax is:

@example

tty_fifo [@var{options}] @var{fifo-name}

@end example

The following options are supported:

@table @code

@item -7
Mask out the highest bit of each character on output. On the PDP-11 this
bit was used as the parity bit. Modern displays oftern have 8 bit
character sets and bytes with the parity bit on may produce funny
characters.

@end table

@var{fifo-name} is the name of the fifo-file. The fifo is created by
@code{tty_fifo} with mode 0666.

@c ......................................................................
@node LP configuration, TM11 configuration, KL11 configuration, Configurable devices
@comment  node-name,  next,  previous,  up
@subsection Line printer parallel interface configuration

@c ......................................................................
@node TM11 configuration, MRV12 configuration, LP configuration, Configurable devices
@comment  node-name,  next,  previous,  up
@subsection TM11 tape controller configuration

@c ......................................................................
@node MRV12 configuration, DEQNA configuration, TM11 configuration, Configurable devices
@comment  node-name,  next,  previous,  up
@subsection MRV12 boot PROM configuration

@c ......................................................................
@node DEQNA configuration, TOY clock configuration, MRV12 configuration, Configurable devices
@comment  node-name,  next,  previous,  up
@subsection DEQNA ethernet controller configuration

@c ......................................................................
@node TOY clock configuration,  , DEQNA configuration, Configurable devices
@comment  node-name,  next,  previous,  up
@subsection TOY clock controller configuration

The toy clock driver emulates the PDP-11/9x toy (time of the year) clock. This
is a battery-buffered clock, that keeps the current time when the computer is
switched off. Configuration of the toy clock is done in the configuration file
via:

@example

ctrl toy @var{csr}
   <options>
end

@end example

The toy clock has three local options:

@deftypevr Option bool localtime
If this option is set to true, the toy clock reports the time with adjustments
resulting from the current time zone and daylight saving time. If it is set to
false the time is reported as UTC. Note, that there is no standard way to
convert UTC values between various C time formats. Because of this the used
algorithm may fail during the daylight saving shifts.
@end deftypevr

@deftypevr Option int offs_year
At initial toy clock set-up the amount given in the option is added to
the year as reported by the operating system. This allows one to move
the pdp to another epoch.
@end deftypevr

@deftypevr Option string settoy
Set the initial toy clock value to the given time and date. The format of the
string should be ``HH:MM:SS MM/DD/YY''. Note, that @var{offs_year} is applied
after @var{settoy}.
@end deftypevr

A typical example is:

@example

ctrl toy 01777

@end example

@c ======================================================================
@node Emulated hardware, Boot PROM, Configuration files, Top
@comment  node-name,  next,  previous,  up
@chapter Emulated hardware description

@menu
* KDJ11A emulation::            
* Memory emulation::            
* RLV12 emulation::             
* RHV70 emulation::             
* RK11 emulation::              
* KL11 emulation::              
* LP emulation::                
* TM11 emulation::              
* MRV12 emulation::             
* DEQNA emulation::             
@end menu

@c ----------------------------------------------------------------------
@node KDJ11A emulation, Memory emulation, Emulated hardware, Emulated hardware
@comment  node-name,  next,  previous,  up
@section KDJ11 emulation

The processor implements the following registers:

@table @code

@cindex PSW
@cindex processor status word
@item 017777776
processor status word

@cindex PIRQ
@cindex programmed interrupt request
@item 017777772
programmed interrupt request register

@cindex CPU error register
@item 017777766
cpu error register

@cindex maintenance register
@cindex processor options
@item 017777750
maintenance register

@cindex console switch register
@item 017777570
console switch register

@cindex line clock
@item 017777546
line clock control register

@end table

These registers are at fixed addresses that cannot be changed without
recompilation. Not all bits in all registers are implemented. The following
paragraphs give a short description of each of the registers.

@cindex PSW
@cindex processor status word
The processor status word has the following format:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|CurMode|PrvMode|RGS| . | . | . |InterrLevel| T | N | Z | V | C |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

@code{CurMode} is the current processor mode and @code{PrvMode} the
previous mode. For both fields a value of @code{00} denotes kernel mode,
@code{01} supervisor mode and @code{11} user mode. @code{10} is illegal
and traps to 10 if set in the @code{CurMode} field. @code{CurMode}
selects also one of three different stack pointers
(@code{R6}/@code{SP}). @code{RGS} selects one of two sets of the
registers @code{R0}...@code{R5}.  @code{InterrLevel} is the current
processor priority. Interrupts with the same or lower priority are
blocked. @code{T} is the trace trap bit. If set the processor traps to
location @code{014}. @code{N}, @code{Z}, @code{V} and @code{C} are the
arithmetic flags.

@cindex PIRQ
@cindex programmed interrupt request

The programmed interrupt request register is used to trigger interrupts under
program control:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
`+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|IR7|IR6|IR5|IR4|IR3|IR2|IR1| . |InterrLevel|   |InterrLevel| . |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

The @code{IR1}...@code{IR7} fields can be set under program control and
request an interrupt of the corresponding priority. The two
@code{InterrLevel} fields contain the binary encoding of the highest bit
set in the upper byte and are read-only.

@cindex CPU error register

The CPU error register contains bits that are set when a trap to
location 4 occurres. The bits are accumulativ, i.e. they are cleared
only when the register is written by the processor (Note, that the
register is @emph{always} cleared whatever value is written).

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| . | . | . | . | . | . | . | . |Hlt|Odd|Mem|I/O| . | . | . | . |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

@code{Hlt} indicates the executing of a @code{HALT} instruction in a
mode other then kernel mode.  @code{Odd} is set when an odd address trap
occurres.  @code{Mem} indicates a non-existing memory access.
@code{I/O} is set when a I/O pages address does not respond.

@cindex maintenance register

The maintenance register allows to read in the jumper settings on the
KDJ11A board. The following bits are defined:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|    User Boot Address      |FPA|  Module Ident |Hlt|BootOpt|POK|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

@code{POK} is the power OK bit. This bit is initially set by the
processor and can be cleared by the @key{x} command in the monitor or
when the monitor is entered while the emulator is running in background
mode (this may happen on double traps or @code{HALT} instructions). If
the bit is cleared a trap to location 024 is executed. @code{BootOpt}
determines what should happen on start-up. The following options are
implemented: @code{00} -- vector to 024, @code{01} -- enter the monitor,
@code{10} -- power up to 173000 and @code{11} -- power up to user boot
address. @code{Module Ident} contains the fixed value of @code{0001}.
@code{FPA} is always @code{0} and denotes that no floating point
accelerator is available.  The remaining bits contain the user's boot
address. These bits are loaded directly into the corresponding bits of
the @code{PC}, the lower bits are set to zero to construct the boot
address.

@cindex console switch register

The KDJ11A normally has no console switch register. For convinience, however,
it is implemented but can be disabled (@pxref{KDJ11A monitor commands}). If a
values is written to the register that is different from the current one the
new value is printed in octal on the emulators console. The switches that
are readable under program control can be set from the monitor
(@pxref{KDJ11A monitor commands}).

@cindex line clock

The line clock control register contains only the interrupt enable bit
for the line clock. The clock tick rate is initially set to 50 Hz but can
be changed within the configuration file (@pxref{KDJ11A configuration}):

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| . | . | . | . | . | . | . | . | . |IEN| . | . | . | . | . | . |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

If @code{IEN} is set the clock will interrupt to vector @code{0100}.

@c ----------------------------------------------------------------------
@node Memory emulation, RLV12 emulation, KDJ11A emulation, Emulated hardware
@comment  node-name,  next,  previous,  up
@section Memory emulation

The memory system implements the following registers:

@table @code

@cindex MMR0
@item 017777572
memory management register 0

@cindex MMR1
@item 017777574
memory management register 1

@cindex MMR2
@item 017777576
memory management register 2

@cindex MMR3
@item 017772516
memory management register 3

@item 017777744
memory system error register

@item 017777746
cache control register

@item 017777752
hit/miss register

@item 017772300 - 017772316
kernel I-space page descriptor registers

@item 017772320 - 017772336
kernel D-space page descriptor registers

@item 017772340 - 017772356
kernel I-space page address registers

@item 017772360 - 017772376
kernel D-space page address registers

@item 017772200 - 017772216
supervisor I-space page descriptor registers

@item 017772220 - 017772236
supervisor D-space page descriptor registers

@item 017772240 - 017772256
supervisor I-space page address registers

@item 017772260 - 017772276
supervisor D-space page address registers

@item 017777600 - 017777616
user I-space page descriptor registers

@item 017777620 - 017777636
user D-space page descriptor registers

@item 017777640 - 017777656
user I-space page address registers

@item 017777660 - 017777676
user D-space page address registers

@end table

The addresses of these registers are fixed and can be changed only
at compile time.

@cindex MMR0

The memory management register has the following format:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|ANR|APL|ARO| . | . | . | . |MAI| . |AboMode|Spc|PageNumber |ENB|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

The bits @code{ANR} (abort non-resident), @code{APL} (abort page length)
and @code{ARO} (abort read-only) are set when a memory access error
occures. These bits can also be set under program control. If any of the
abort bits is set the memory management registers are frozen to facilitate
recovery from the abort situation. The maintenance bit @code{MAI} is not
implemented. In case of an abort @code{AboMode}, @code{Spc} and
@code{PageNumber} are set to the current processor mode, the
address space of the access (1 for D-space and 0 for I-space) and
the aborting page number. @code{ENB} enables memory management if set.

@cindex MMR1

MMR1 records the changes made to the general purpose registers
during the current command because of auto-increment and auto-decrement
modes. In the case of a memory access abort this register is frozen to
simplify register backup.

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|    dest-amount    |  dest-reg |   source-amount   | source-reg|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

@code{dest-reg} and @code{source-reg} contain the register numbers
of the registers modified in the last instruction. @code{dest-amount}
and @code{source-amount} are interpreted as 5-bit signed numbers. These
number should be subtracted from the register value to get the value of
the register just before the aborted instruction started. Note,
that changes to the PC are @emph{not} recorded. The PC is backed up by
MMR2.

@cindex MMR2

MMR2 is loaded with the virtual PC of each instruction just before the
instruction starts. If a memory access abort occures the register is
frozen, thus MMR2 points to the offending instruction.

@cindex MMR3

MMR3 controls the 22-bit and seperate I/D space mapping:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| . | . | . | . | . | . | . | . | . | . |IOM|22B| . | K | S | U |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

@code{IOM} is not implemented in the emulator. @code{22B} enables
22-bit mapping (provided that MMR0 bit 0 is also set). If memory
mangement is enabled but @code{22B} is off, 18-bit mapping is used.
@code{K}, @code{S} and @code{U} enable seperate I/D space for
kernel mode, supervisor mode and user mode resp.

@cindex memory system error register

The memory system error register reads as zero, writes are ignored.

@cindex cache control register

The cache control register is implemented in @file{mem_cache}. In
@file{mem_small} bits 03377 can be written and red back but are ignored.

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| . | . | . | . | . | ? | ? |Fls| ? | ? |Ds0|Ds1| ? | ? | ? | ? |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

The following description holds for @file{mem_cache}. If the @code{Fls}
is written as 1 the cache is flushed. If one of the bits @code{Ds0} or
@code{Ds1} are set the cache is disabled. All other bits are ignored.

@cindex hit/miss register

The cache hit/miss register always reads back as zero. Writes are ignored.

@c ----------------------------------------------------------------------
@node RLV12 emulation, RHV70 emulation, Memory emulation, Emulated hardware
@comment  node-name,  next,  previous,  up
@section RLV12 emulation

The RLV12 device emulates a RLV12 controller with up to 4 RL02 disks.
The emulated RLV12 does not try to emulate the timing of the real
drives. Instead it works synchronuosly. This means that for the program
the executing of a command occures almost instantely.

The following i/o space registers are implemented (these are run-time
configurable):

@table @code

@item 017774400
Control/status register.

@item 17774402
Bus address register.

@item 17774404
Disk address register.

@item 17774406
Multipurpose register.

@item 17774410
Bus address extension register.

@end table

The control and status register has the following format:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|ERR|DER|ER2|ER1|ER0|OPI|DrivSel|RDY|IEN| BAExt | Function  |DRY|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

@code{DRY} is the drive ready bit and reads as 1 if the selected drive
is loaded, as 0 if it is not loaded. @code{Function} is the function code
(see next table). @code{BAExt} are bus address bits 16 and 17. If @code{IEN}
is set the controller wil generate interrupts. @code{RDY} is the controller
ready bit. @code{DrivSel} selects one of up to 8 drives. @code{OPI} and
@code{ER0}...@code{ER2} contain an error code in case of an error.
@code{DER} is set on volume-check and write-lock errors. @code{ERR} is set,
if any of the other error bits is set.

The following functions are implemented:

@table @code

@item 000
Maintenance mode. This is a NOP in the emulator.

@item 001
Write check.

@item 010
Get status.

@item 011
Seek.

@item 100
Read header.

@item 101
Write data.

@item 110
Read data.

@item 111
Read data without header check.

@end table

The error bits @code{E0}...@code{E2} and @code{OPI} may be set as follows:

@table @code

@item 0001
Non-existent drive. Illegal sector number. Trying an implicit seek in
mid-transfer. No disk loaded.

@item 1000
Non-existent memory.

@item 0101
Implicit seek.

@end table

The bus address register is read-write except for bit 0, which always
reads as 0 and cannot be written.

The format of the disk address register is different for the seek and
the read, write or write check functions. For the seek function it is:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|        Cylinder Difference        | . | . |HDS| 0 |DIR| 0 | 1 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

The @code{Cylinder Difference} field contains the number of cylinders
to seek. @code{HDS} is the head select bit and @code{DIR} denotes the
direction of the seek (1 - seek to higher cylinders, 0 - seek to lower
cylinders). Bits 3, 1 and 0 must have the indicated value.

For the other functions the register has the following format:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|          Cylinder address         |HDS|     Sector address    |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

@code{Cylinder address} and @code{Sector address} hold the cylinder
resp. sector number; @code{HDS} is the head select bit.

The format of the Multipurpose register depends on the function. For the
Get Status function the following value must be written:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| . | . | . | . | . | . | . | . | 0 | 0 | 0 | 0 |RST| 0 | 1 | 1 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

If @code{RST} is set the drive is reset to status @code{(BHO|HDO|RL2)}
and a load state of 101 (lock on) if no disk is loaded in the selected
drive; to @code{(BHO|RL2)} and load state 000 (loaded) if a disk is loaded.
Bits 0...2 and 4...7 must have the indicated value.

For data transfer commands the word count as the 2's complement should be
written to the MPR.

For the Read Header function three words can be red out from the MPR. The
first contains the current disk address in the same format as the
disk address register for read, write or read header. The second word
is zero and the third word contains a fake CRC of 0123456.

The Get Status returns the following word in the MPR:

@example

 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|WER|HCE|WEL|STO|SPE|WGE|VCH|DSE|RL2|HDS|COO|HDO|BHO| LoadState |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

@end example

Bits 15, 14, 12...10, 8 and 5 always read as 0. @code{WEL} is set if
the write lock is set. @code{VCH} is set if a disk is loaded into a drive,
cleared with a Get Status function with the reset bit set. @code{RL2} reads
always as 1. @code{HDS} is the currently selected head on the drive.
@code{BHO} is set if no disk is loaded. @code{LoadState} is either 101
if no disk is loaded or 000 if it is loaded.

The bus address extension register is a 6-bit register containing
bits 18-21 of the bus address for data transfer functions.

@c ----------------------------------------------------------------------
@node RHV70 emulation, RK11 emulation, RLV12 emulation, Emulated hardware
@comment  node-name,  next,  previous,  up
@section RHV70 emulation

The RHV70 device emulates a RHV70 massbus controller with up to 8 RP06
disks.  The emulated RHV70 does not try to emulate the timing of the
real drives.  Instead it works synchronuosly. This means that for the
program the executing of a command occures almost instantely.

@c ----------------------------------------------------------------------
@node RK11 emulation, KL11 emulation, RHV70 emulation, Emulated hardware
@comment  node-name,  next,  previous,  up
@section RK11 emulation

@c ----------------------------------------------------------------------
@node KL11 emulation, LP emulation, RK11 emulation, Emulated hardware
@comment  node-name,  next,  previous,  up
@section KL11 emulation

@c ----------------------------------------------------------------------
@node LP emulation, TM11 emulation, KL11 emulation, Emulated hardware
@comment  node-name,  next,  previous,  up
@section Line printer parallel interface emulation

@c ----------------------------------------------------------------------
@node TM11 emulation, MRV12 emulation, LP emulation, Emulated hardware
@comment  node-name,  next,  previous,  up
@section TM11 emulation

@c ----------------------------------------------------------------------
@node MRV12 emulation, DEQNA emulation, TM11 emulation, Emulated hardware
@comment  node-name,  next,  previous,  up
@section MRV12 boot PROM emulation

@c ----------------------------------------------------------------------
@node DEQNA emulation,  , MRV12 emulation, Emulated hardware
@comment  node-name,  next,  previous,  up
@section DEQNA emulation

@c ======================================================================
@node Boot PROM, p11 implementation, Emulated hardware, Top
@comment  node-name,  next,  previous,  up
@chapter The Begemot boot PROM

@menu
* HELP command::                
* BOOT command::                
* MEMORY command::              
* Boot PROM implementation::    
@end menu

@c ----------------------------------------------------------------------
@node HELP command, BOOT command, Boot PROM, Boot PROM
@comment  node-name,  next,  previous,  up
@section The HELP command

@c ----------------------------------------------------------------------
@node BOOT command, MEMORY command, HELP command, Boot PROM
@comment  node-name,  next,  previous,  up
@section The BOOT command

@c ----------------------------------------------------------------------
@node MEMORY command, Boot PROM implementation, BOOT command, Boot PROM
@comment  node-name,  next,  previous,  up
@section The MEMORY command

@c ----------------------------------------------------------------------
@node Boot PROM implementation,  , MEMORY command, Boot PROM
@comment  node-name,  next,  previous,  up
@section Boot PROM implementation notes

@c ======================================================================
@node p11 implementation, Miscellaneous programs and scripts, Boot PROM, Top
@comment  node-name,  next,  previous,  up
@chapter p11 implementation notes

@menu
* Instruction tables::          
* Device interface::            
* KL11 serial line drivers::    
* DEQNA ethernet drivers::      
* LP drivers::                  
* Memory interface::            
@end menu

@c ----------------------------------------------------------------------
@node Instruction tables, Device interface, p11 implementation, p11 implementation
@comment  node-name,  next,  previous,  up
@section The instruction table file

@c ----------------------------------------------------------------------
@node Device interface, KL11 serial line drivers, Instruction tables, p11 implementation
@comment  node-name,  next,  previous,  up
@section The device interface

@c ----------------------------------------------------------------------
@node KL11 serial line drivers, DEQNA ethernet drivers, Device interface, p11 implementation
@comment  node-name,  next,  previous,  up
@section KL11 serial line driver programs

@c ----------------------------------------------------------------------
@node DEQNA ethernet drivers, LP drivers, KL11 serial line drivers, p11 implementation
@comment  node-name,  next,  previous,  up
@section DEQNA ethernet driver programs

@c ----------------------------------------------------------------------
@node LP drivers, Memory interface, DEQNA ethernet drivers, p11 implementation
@comment  node-name,  next,  previous,  up
@section LP driver programs

@c ----------------------------------------------------------------------
@node Memory interface,  , LP drivers, p11 implementation
@comment  node-name,  next,  previous,  up
@section Memory interface

@c ======================================================================
@node Miscellaneous programs and scripts, Building and porting, p11 implementation, Top
@comment  node-name,  next,  previous,  up
@chapter Miscellaneous programs and scripts

@menu
* Disk format program::         
@end menu

@c ----------------------------------------------------------------------
@node Disk format program,  , Miscellaneous programs and scripts, Miscellaneous programs and scripts
@comment  node-name,  next,  previous,  up
@section Disk format program @code{fmt}

@c ======================================================================
@node Building and porting, Performance and compatibility, Miscellaneous programs and scripts, Top
@comment  node-name,  next,  previous,  up
@chapter Building and porting p11

@menu
* Building for supported architectures::  
* Porting to unsupported architectures::  
@end menu

@c ----------------------------------------------------------------------
@node Building for supported architectures, Porting to unsupported architectures, Building and porting, Building and porting
@comment  node-name,  next,  previous,  up
@section Building for supported architectures

@c ----------------------------------------------------------------------
@node Porting to unsupported architectures,  , Building for supported architectures, Building and porting
@comment  node-name,  next,  previous,  up
@section Porting to unsupported architectures

@c ======================================================================
@node Performance and compatibility, Acknowledgements, Building and porting, Top
@comment  node-name,  next,  previous,  up
@chapter Performance and compatibility

@c ======================================================================
@node Acknowledgements, Concept index, Performance and compatibility, Top
@comment  node-name,  next,  previous,  up
@chapter Acknowledgements

@c ======================================================================
@node Concept index,  , Acknowledgements, Top
@comment  node-name,  next,  previous,  up
@unnumbered Concept index

@printindex cp

@c ======================================================================
@contents
@bye
