1
0
mirror of https://github.com/PDP-10/klh10.git synced 2026-05-04 06:58:18 +00:00

Initial import of klh10-2.0a.tgz

dated Nov 19  2001.
Source: http://klh10.trailing-edge.com/
This commit is contained in:
Olaf Seibert
2015-04-27 22:54:12 +02:00
commit 742b43d025
123 changed files with 80046 additions and 0 deletions

167
doc/Intro.txt Normal file
View File

@@ -0,0 +1,167 @@
/* INTRO.TXT - Introduction to the KLH10
*/
/* $Id: Intro.txt,v 2.4 2001/11/19 12:11:30 klh Exp $
*/
/* Copyright © 1997,2001 Kenneth L. Harrenstien
** All Rights Reserved.
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
CONTENTS
========
All KLH10 documentation is online in ASCII text files for
simplicity and portability. The contents, in suggested order of
perusal, are as follows:
Intro.txt - General intro
news.txt - Changes from previous versions
install.txt - Build, install, & configuration instructions
usage.txt - General usage instructions
klt20.txt - KL10 TOPS-20 installation and startup
klt10.txt - KL10 TOPS-10 installation and startup
kst20.txt - KS10 TOPS-20 installation and startup
kst10.txt - KS10 TOPS-10 installation and startup
ksits.txt - KS10 ITS installation and startup
backgrnd.txt - Background comments
coding.txt - Coding guidelines
cmdref.txt - Command reference
cmdsum.txt - Command summary cheat sheet
dfkfb.txt - KL10 timing diagnostic
dvhost.txt - Special host device
history.txt - Historical notes
kldiff.txt - Differences from real KL10
utils.txt - KLH10 Utilities
vtape.txt - Virtual tape details
GENERAL INFORMATION
===================
"KLH10" is an emulator for the PDP-10 series of machines from
Digital Equipment Corporation. The most important thing to know is
that this is a MACHINE emulator. It emulates a specific PDP-10 CPU
and all necessary I/O devices, running a site's existing operating
system (monitor) binary without change -- which then runs user-mode
application programs just as if they were on a real PDP-10. Even
floating-point results are bit-identical.
This means sites must continue to manage the virtual system in
the same way as a real one, without the old hardware. However, the
emulator doesn't monopolize the actual platform, and runs as a set of
simple user processes that co-exist with other software on the native
system. It is possible to configure it so that no actual CPU time is
used while the virtual system is idle.
The KLH10 emulator is extremely portable and flexible -- it is
written in ANSI C so that it can be ported to new platforms quickly,
and new "virtual hardware" can readily be added. The following
describes the currently supported versions:
Emulation Target: KL
CPU: KL10B with extended addressing
Memory: 4MW MF20 (22 bits - 8192 pages of 512 words)
Microcode: v.442 (supports final versions of TOPS-10 or TOPS-20)
Devices available:
DTE - one CTY
RH20 - up to 8 (7 if using a NI20)
Disk - 8 RP06 or RP07 drives per RH20
Tape - 8 TM02/3 formatters per RH20, with one TU45/TU77 each
Network - one NI20 (KLNI/NIA20) ethernet interface
Emulation Target: KS
CPU: KS10
Memory: 512KW (19 bits - 1024 pages of 512 words)
Microcode: ITS v.262 (supports final version of KS10 ITS)
DEC v.130 (supports final versions of KS TOPS-10/20)
Devices available:
FE - one CTY
RH11 - up to 2
Disk - 8 RP06 or RP07 drives per RH11
Tape - 8 TM02/3 formatters per RH11, with one TU45/TU77 each
Network - one "ACC LH-DH" IMP interface (ITS only)
Supported Host Platforms:
Compaq/DEC Alpha with Tru64 (formerly Digital Unix, formerly OSF/1)
SUN Sparc with Solaris
Any x86 with FreeBSD, NetBSD, or Linux
Plus: Any system providing equivalents to basic Unix system calls.
WNT/W2K ports are possible.
Requirements:
Memory: KL: 35MB (3MB program, 32MB emulated PDP-10 memory)
KS: 6MB (2MB program, 4MB emulated PDP-10 memory)
Disk: .2-.3 GB per RP06, .5-.9 GB per RP07, 50+GB per dynamic RPxx
Tape: optional, can use any variable-record-length drive
Network: optional, LAN interface advised (can share single interface
with native OS, but a second may be desirable)
Performance:
Varies with job mix and platform architecture, but general
observations suggest the following ratios relative to a
real PDP-10 (where 1.0 = KL10 speed):
SPARC: (MHz / 200)
Alpha: (MHz / 250)
x86: (MHz / 200)
Thus, a 450MHz x86 would provide slightly over 2x KL speed.
IMPLEMENTATION
==============
The KLH10 internals are organized in a fashion roughly similar
to that of actual hardware. There is a "KN10" process equivalent to a
KS10 or KL10 processor that carries out all CPU operations and is
continuously running, except when the KLH10 user-interface command
parser has control. Most importantly, each hardware device is
implemented as a separate subprocess, with optional direct access to
main PDP-10 memory for data transfers.
This architecture has several advantages:
- It can take advantage of multi-processor host platforms.
- The emulated CPU never needs to wait for I/O. This considerably speeds
up operation, compared to a non-threaded emulator which must
block on disk I/O.
- It can directly use very slow physical devices such as magtape drives
(half-inch, 8mm, 4mm, DLT, etc). Virtual tapes (i.e. tape images
on disk) are also supported.
- The sub-process implementation is more portable and robust than
a threaded implementation.
- Device failures need not be fatal. The NIA20 network device for example
can be reloaded and restarted without stopping the KN10 or the
TOPS monitor.
TERMINOLOGY
===========
There are two terms used in the documentation and source that
may cause confusion: KLH10 and KN10.
"KLH10" refers to the entire software product covered by the license.
This is theoretically a proper name ("KLH10 has") but is
often used as an object name ("the KLH10 has").
"KN10" refers to the virtual PDP-10 created at runtime by the
"kn10" executable image. It is specifically intended to
serve as an object name alongside the physical PDP-10s
KA10, KI10, KL10, and KS10.
Nearly all software products are referred to like people (ITS, Emacs,
Oracle, Solaris, etc) and the same can be done with "KLH10". However,
to emphasize that it emulates a hardware device, it is often still
referred to as an object -- "the KLH10". In fact this objectification
urge is so strong that it is actually difficult to avoid using the
articles "the" and "a". The term "KN10" was invented to help maintain
the distinction between the product and the virtual machine/object.
I will let others speculate on why English is this way.

402
doc/backgrnd.txt Normal file
View File

@@ -0,0 +1,402 @@
/* BACKGRND.TXT - KLH10 Background Commentary
*/
/* $Id: backgrnd.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
FAIR WARNING:
You don't need to read this file. It has nothing of
interest to most users. Hackers, however, may like it.
It is mostly a rambling commentary on the KLH10 code that attempts
to explain why things are the way they are, and speculate on how
they might be.
And like the code itself, this is an incomplete work in progress.
As you read the source you will notice that some parts are
rather simplistic and specific, while others are too complex and
generalized. Many things are not fully implemented, and many others
are over-implemented. Sometimes there are good reasons for this and
other times that's just how it ended up when I ran out of time during
one development phase or another.
A little history may help set the context:
HISTORY
=======
From an outside viewpoint there have been essentially two
major KLH10 versions: the first being a "toy" KS10 emulator (V0.x),
and the second a commercial KL10B emulator (V1.x). Internally, of
course, many more versions have existed as part of a long incremental
development process.
[XXX: Flesh out later]
Roots - PDP-10 arithmetic package for KCC cross-compiling.
First version - KS10 running ITS, then TOPS-20.
Synchronous device model.
DEC intervention - KL10B version on Alpha, commercial use.
Extended addressing, KL devices.
Device subprocess model.
Merged version - KS and KL, shared devices. Intended for
Public ITS systems.
Source release - cleanups, multiple tape format support, etc.
PRIORITIES
==========
Once the decision was made to pursue a commercial KL10B
emulator, KLH10 design and implementation was driven by four main
priorities, in the following order of importance:
[1] Accuracy
[2] I/O Performance
[3] Stability & reliability
[4] Portability
[1] Accuracy
------------
The most important goal was implementing an accurate
emulation, with two facets. Not only did the emulator have to run
existing TOPS-10 and TOPS-20 monitor binaries as-is, it also had to
emulate a KL10B accurately enough for users to run their applications
and get exactly the same answers as before. Otherwise, it would be
worthless as a product.
This is a matter of judgement since perfect emulation is impossible,
but there is a huge difference between the initial "toy" KLH10 that
first ran ITS and the current one. By far the vast bulk of the work
went into the task of making the emulator behave correctly, certainly
much more than into making it "fast".
There were many problems. Some were difficult simply because of their
complexity, but the hardest were the ones where the documentation was
simply wrong or ambiguous in describing how a real KL10B behaved.
Even access to the microcode was not much of a help, since much of the
KL logic was actually implemented in hardware.
Some of the issues encountered:
- Extended addressing idiosyncracies, esp with PXCT
- EXTEND instructions - many ambiguities
- Floating point - hardware garbage
- RH20 and DC10 emulation (more "Adventures in RH20-Land")
- DTE 10-11 device emulation
- NI20 emulation
- Monitor race conditions
The DTE and NI20 are particularly complex since in reality those
devices were self-contained processors in their own right.
Of course, for practical reasons not everything could be emulated; see
the file "kldiff.txt" for details on the differences between the KN10
and a real KL10B.
[2] Stability & reliability
---------------------------
For this kind of product to be worth something, it has to work
and keep working. The more problems I ran into while developing it,
the more paranoid I became about making possibly destabilizing
changes. In particular, once it was deployed to clients I tried to
make only those changes that were absolutely necessary for one reason
or another.
I did build a large battery of tests to help verify whether or not the
internal KN10 processor was accurately emulating a real KL10B, as well
as a variety of device operations. These regression tests are still
very helpful, but they do not catch everything; they are good only up
to a point.
As a result, once code was proven to work, it tended to remain
relatively static from there on. Only with the KLH10 source release
and its availability to many more potential testers did I feel safe in
finally starting many long delayed cleanups.
What this means is that the V2.x sources you have are not the same as
the commercial V1.x versions. They are intended to be better, but
have not undergone anything close to the same amount of testing and
verification. At some point, of course, V2.x should be stable enough
that it can replace V1.x with minimal perturbations.
[3] I/O Performance
-------------------
The biggest problem with the initial toy KLH10 was its lack of
asynchronous I/O; this meant that any device I/O would always be
"instantaneous" in the sense that all CPU operations would block
completely until the I/O was finished. The CPU blockage is okay for a
single-user personal system, but unacceptable for a true time-sharing
system and completely prohibitive if trying to support real magnetic
tape drives.
The solution adopted was to implement devices as separate Unix child
processes (the DP filename prefix stands for "Device Process"), allowing
them all to run independently and asynchronously.
[XXX: flesh out a bit more]
[4] Portability
---------------
While always desirable on general principles, portability is a
somewhat idealistic goal -- there is no absolute requirement for it,
unlike the other issues. The main reason the emulator remains
portable is because I wanted it that way in preparation for the day
when it could be distributed.
There is nothing in the KLH10 code that requires an integer
type larger than 32 bits, nor does it require any features not found
in ANSI C. In fact, for a long time it did not even rely on ANSI
features either.
At the time it was first written, this was an inescapable requirement
because 64-bit types, not to mention ANSI compilers, were few and far
between; even GCC's "long long" had early bugs. With the Alpha
version 64-bit code became possible, but nothing has ever relied on
it.
This is why every reference to a PDP-10 word or value is done by means
of a macro. Even on platforms that support 64-bit types, the
architecture sometimes works better when restricted to 32 bits.
From the viewpoint of OS (rather than CPU) portability, the code again
tries to rely on ANSI C library functions rather than UNIX system
calls, but it is fair to say that most of the existing OS-dependent
support is Unix oriented, especially for the real-time asynchronous
version. Fortunately with the advent of true operating systems for
both MacOS (X) and Windows (NT, 2K, XP), this should less of a problem
in the future.
Non-issue: CPU speed
--------------------
It may seem odd to people who have not run a business or
service, but the speed of the emulated PDP-10 has never been a real
issue. In practice clients have just picked a hardware platform that
provides acceptable performance, and as soon as their systems are up
and working, they prefer to see as little change as possible. There
is little compulsion to upgrade with faster or more featureful versions
unless something is actually broken, which should only happen if the
platform OS is upgraded to yet another incompatible release.
MAJOR DESIGN ISSUES
===================
C vs Assembler
--------------
The notion of a PDP-10 emulator had been bouncing around for
some time before I decided to embark on the project, and performance
was always the number one issue; it was not clear whether it could be
made to execute PDP-10 code fast enough to be useful. A typical
workstation was a 33MHz SPARC-2, and the x86 PCs were still 386s.
Several people felt the best way to achieve this was to pick a host
architecture (SPARC or the forthcoming Alpha) and code in assembly
language.
As a long time PDP-10 assembler fan, this approach appealed to me as
well, but eventually I came to the conclusion that this would be best
attempted in C, for two major reasons:
- Portability. After having engineered a major porting effort
from TOPS-20 to Unix while at SRI, I never wanted to be locked
into a specific machine architecture again. Oracle's
extremely impressive porting system provided additional
conviction that this was the right approach.
- Implementation time. It was much faster to write in C than
assembler, especially for RISC-based machines.
There was also a third, subjective reason -- at the time, Stu Grossman
was writing a simple prototype in C called "KX10". While I was unable
to use anything from it, it did convince me that C was the right way
to go, and as far as I know Stu was the first to attempt it.
As it turned out, this decision also proved to be the right one in
terms of performance. I had anticipated that keeping the code
portable would eventually lead to "free" performance gains as hardware
improved over the years, and that was in fact the case. But one other
factor surprised me: C code was sometimes faster than assembly code!
It took a while to realize that for the new RISC-based machines with
pipelines and caches, new rules applied; often the C compiler provided
with a machine would know about tricks or scheduling rules that not
only were difficult for a human to code by hand, they also could
change from one machine to the next. While doing timing tests on
initial versions of the emulator, I found performance so sensitive to
tiny and logically unrelated changes that I finally gave up worrying
about it.
In retrospect all this may seem obvious, but it was not so at the
time.
Instruction Execution Loop
--------------------------
The decision to use C posed some problems with respect to
control flow. The microcode of real machines is like a huge plate of
extremely sticky spaghetti where every "instruction" has a jump
address that can go anywhere else, plus a bunch of chopsticks stirring
the mess up with external interrupts and asynchronous device
operations.
By contrast, C favors the use of separately defined functions with a
stack-based calling convention, and control flow strongly favors using
the normal call-return mechanism. It is possible to bypass the latter
with "longjmp" type invocations, but you can only jump to pre-existing
contexts and the mechanism can be very expensive. For someone used
to the freedom of assembly language, this is very frustrating.
Without going into all possible ways of implementing a PDP-10 emulator
in C, there appeared to be two main choices:
- Stuffing as much as possible inside a single huge function.
Normally this would involve using a large switch() statement
for instruction dispatch, plus assorted gotos to accomodate
weird control flow issues.
- Looping within a small function and dispatching to each
instruction as a function call.
(Note that the PDP-10 has one characteristic that makes things a
little easier -- every instruction must always calculate an effective
address regardless of whether it is used or not, so this naturally
leads to building an instruction execution loop with the EA
calculation as its central focus.)
The KN10 code uses the latter approach for a number of reasons, some
of which no longer apply. When it was first written, compilers still
existed that had problems with very large switch statements, and even
now it is still considered easier for them to optimize a function if
it does not contain "goto" statements. Keeping instructions in
separate routines also made it easier to invoke them explicitly as
needed (for XCT, PXCT, etc), examine their assembler output to see
what was being produced, and step through them with a debugger.
This is almost certainly not an optimal design for speed.
PDP-10 Word Representation
--------------------------
[XXX - some stuff about the tradeoffs, from word10.h]
FUTURE DIRECTIONS
=================
Since the odds of new commercial applications showing up are
essentially nil, whatever happens next will be entirely up to the
PDP-10 hacker community. It will either evolve with their help or
quietly go away without it.
Recently a number of other PDP-10 emulators have finally appeared,
most or all of which have the KS10 as a target. I have not yet looked
at them (partly to avoid contamination) and so have no basis for
comparison, but in general I think multiple KS implementations are a
good thing, and as software tools improve it should become easier.
The KS is a fairly clean yet respectable machine that would make an
excellent semester project, and was fun to do. The more people who
can get their hands dirty, the better.
The KL10 by contrast was much harder, and definitely not fun. I hope
that with the KLH10 release no one else will have to go through that
nightmare, or at least will be able to start from a far better place.
FUTURE KLH10 IMPROVEMENTS
=========================
The wish-list stack has always been a mile high. Here's a bunch of
stuff off the top of my head, in no particular order.
- Multi-processing extensions:
- Decouple FE from KN10.
- Allow other user processes to examine KN10 state and manipulate
devices (especially virtual magtapes) without requiring
console access.
- Re-investigate threading (very carefully; very unportable).
- The UI sucks:
- Improve present UI, add editing.
- Allow input scripts to feed OS console at startup.
- Add GUI interfaces:
- 340 display (Spacewar lives!)
- FE/Console (KA10 panel with blinkenlights!)
- Magtape UI
- CPU and device visualizations
- Accuracy improvements:
- Get rid of the last low-bit FDV divergence, even
though that may reduce mathematical accuracy.
- Implement address break (optional - very slow).
- Raw performance:
- Develop better performance metrics (TenStones? DECmarks?).
- Speed up floating point (DFDV is far and away the
slowest instruction).
- Alternative word representations.
- EA calculation and memory mapping (most of the CPU is burned
on this, I believe).
- Characterize workload to determine true bottlenecks.
- Alternative instruction loops:
- Hybrid switch & dispatch
- Hand-coded assembler (x86 primarily)
- Locality improvements; must match to host cache setup.
- Autoconf mechanism to run tests on host and automatically
select optimal build configuration.
- Network support:
- Add AN10 device, couple with IP tunnels like "tun".
- Determine OS mods to allow self-connection for systems that
currently can't do it (Linux, FreeBSD, Solaris).
Get mods incorporated in standard releases.
- Magtape support:
- Finalize tape naming conventions.
- Non-console access (cf UI above).
- Finish in-memory support.
- Add update capability.
- Emulator extensions:
- Finish KA10, KI10 versions. TENEX pager. WAITS?
- Emulate SC-40 and/or XKL (more "physical" memory).
- Additional devices (many!)
- DH11 (KS10), or extend DTE (KL10)
- AN10 (IMP interface)
- DX20, CI, ...
- Emulate NCP with IMP interface for older OSes.
- PDP-10 software:
- Public ITS support.
- Further KN10-conditionalized OS mods.
- Resurrect older KA/KI OSes.
- GCC on KL (Lars).
- Distribution:
- Add HTML versions of doc.
- Better build mechanism.
- Permission for Public ITS distribution (legal hoops).
- Packaged ITS filesystems.
- Packaged DEC OS filesystems.
- Packaged NIC/Stanford filesystem.

547
doc/cmdref.txt Normal file
View File

@@ -0,0 +1,547 @@
/* CMDREF.TXT - KLH10 Command Reference documentation
*/
/* $Id: cmdref.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 1994-1999, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
KLH10 COMMAND SYNTAX:
The KLH10 command parser is extremely simple-minded, since
normally very little user interaction is needed. In particular, it is
not intended to be a general-purpose debugger, although it does have
various commands to help debug the "hardware".
Each command is one complete line, and command verbs need only
a unique initial substring. Case is not significant anywhere in KLH10
commands, except for filenames that must be given to the native OS.
The various parts of a command must be separated by spaces or
tabs. The backslash (\) character can be used to quote the next
character, but if you think you need this, you are probably trying
something funny that may not work. Lines cannot be continued with
backslash; just keep typing.
KLH10 COMMAND REFERENCE: (in ASCII lexical order)
^\, CONTROL-\, ASCII "FS"
This is not exactly a KLH10 command; it is the command escape
character, which can be typed anytime the KN10 is running.
It should halt the KN10 immediately with the message
[HALTED: FE interrupt]
Followed by the KLH10 command parser prompt:
KLH10>
Typing ^\ while in the command parser should have no effect,
although this depends on the native OS.
1-STEP
Single-steps the KN10 by executing one instruction. For debugging.
This is the same as "proceed 1".
BREAKPT <addr>
Set PC breakpoint to <addr>. For debugging.
Only one PC breakpoint can be set. It does not modify memory
in any way. Use an <addr> of 0 to turn it off.
Execution is slower when the PC breakpoint is active, so don't
leave it on if you don't need it.
Currently, only the in-section part of the address is significant
(low 18 bits). The KN10 will be stopped whenever the low 18 bits
of PC match the specified value, whether the CPU is in user or
exec mode.
CONTINUE
Continues the KN10 at the current PC.
This is the normal method of continuing after interrupting the
KN10 with ^\.
DEPOSIT <addr> <value>
Deposits the word value at the given address. For debugging.
See the description of the LOAD command for the format of <addr>.
The <value> should be one or two octal constants of the form <RH>
or <LH>,,<RH>. Instruction mnemonics are not recognized, sorry.
DEV <devid> <device-command-line>
Execute a device-dependent command.
<devid> must be already defined by the DEVDEFINE command.
This is provided as a way for device drivers, especially dynamically
loaded ones, to accept arbitrary commands if they wish to do so.
No current driver uses this.
DEVDEBUG [<devid> [<debugval>]]
Set or show device debug values.
DEVDEBUG - Shows values for all known devices.
DEVDEBUG <devid> - Shows value for that device.
DEVDEBUG <devid> 0 - Turns off debug tracing for device.
DEVDEBUG <devid> 1 - Turns on basic debug tracing for device.
DEVDEBUG <devid> 3 - May turn on verbose tracing for device.
<devid> must be already defined by the DEVDEFINE command.
Each device may have a different interpretation of a non-zero
debug value. In general, when debug tracing is turned on, activity
on that device will cause messages to be printed on the standard
error stream, which is normally the KLH10 CTY.
Note that devices may output error messages at any time whether or
not debug tracing is in effect.
DEVDEFINE <new-devid> <dev#> <driver> <optional-parameters>
Define, bind, and initialize a KN10 device or controller unit.
See the file "install.txt" for more details.
<devid> - A short (6-character) name of your choice to
uniquely identify this device. Examples might be
dsk0, dsk1, mta0, etc. These names are meaningful
only to you; the KLH10 doesn't care, nor are they
passed to the KN10 in any way.
The <devid> is how you can refer to the device
when using other KLH10 commands such as DEVMOUNT.
<dev#> - The KN10 device number you are binding.
For all machines but the KS10, this is normally
an octal device number such as would be used in
I/O instructions (DATAI/DATAO, etc). For example,
use 200 for DTE#0, 540 for RH20 #0, and so on.
The <dev#> is how the KN10 can refer to the device.
<drivername> - Specifies what the device actually is, by
identifying the "emulator driver" you are binding
this device to. The driver is a software module that
is invoked to support all references to the device,
whether from you or from the KN10.
Giving the "devshow" command will list all of the known
drivers (currently DTE, RH20, RP, TM03, NI20). External
(dynamically linked) drivers are supported but untested;
see the "devload" command.
<optional-parameters> - Various parameters specific to the
device driver type, usually optional. Their syntax is
normally of the form <keyword>=<value>, but sometimes
just the <keyword> is sufficient.
The ordering of these parameters does not matter; nor
does the case of the keywords.
NOTE!!! There is currently no way to undefine a device.
Once defined, a <devid> lasts until the user quits the KLH10.
DEVEVSHOW [<devid>]
Show device event registration info. Primarily for debugging.
<devid> must be already defined by the DEVDEFINE command.
DEVLOAD <new-drivername> <path> <initsym> <comments>
Load a DLL device driver.
This command allows device emulator drivers to be loaded dynamically
at runtime rather than being linked into the KLH10 binary at
compile time.
Warning: This almost certainly WILL NOT WORK yet for your platform.
It is intended to provide a way for people to write their own
device emulator drivers independently of those provided
or built into the KN10.
DEVMOUNT <devid> <path> [<options>]
Mount device media.
<devid> must be already defined by the DEVDEFINE command.
<options> are device dependent.
Note that this command can only make a polite request to the device,
which may respond with a failure message. If the device is busy,
the request may be ignored immediately with an error message; try again
later. Any currently mounted media will be automatically unmounted,
but it's best to explicitly DEVUNMOUNT a device before trying
to DEVMOUNT something on it.
DEVMOUNT is used primarily for mounting virtual tapes on the
TM02/TM03 driver, although it is intended to work for disks as well.
The options for the TM02/TM03 depend on whether you are mounting
a virtual tape or a physical tape drive.
For a physical drive, you must specify:
HARD - <path> is a physical tape drive. No other
options will be recognized, not even RO.
If HARD is not specified, a virtual tape is assumed.
For virtual tapes, there are several options:
FMT=<format> - Tape format (RAW, TPS, TPC, etc; see vtape.txt)
MODE=<mode> - One of READ, CREATE, or UPDATE.
FSKIP=<#> - Skip <#> files/tapemarks when mounted.
UNZIP[=<bool>] - TRUE to allow uncompression if <path> suggests it.
plus for convenience:
RO, READ - same as MODE=READ (read-only)
RW, CREATE - same as MODE=CREATE
UPDATE - same as MODE=UPDATE
and for debugging:
DEBUG[=<bool>] - TRUE for debug output from vmtape.
PATH=<path> - Overrides command <path>
CPATH=<path> - Overrides control path derivation
RPATH=<path> - Overrides data (raw) path derivation
The normal defaults are now FMT=TPS and MODE=READ.
(Formerly they were RAW and RW)
Example:
@assign mta0: ; At T20 EXEC
@i dev
Devices assigned to/opened by this job: MTA0, TTY105
@[HALTED: FE interrupt] ; ^\ typed here
KLH10> devmo mta0 mybackup create ; Mount virtual R/W tape
Mount requested: "mybackup" ; Request sent to device
KLH10> [mta0: Tape online] ; Asynch response looks OK
; (Typed CR for fresh prompt)
KLH10> c ; Continue KN10
Continuing KN10 at loc 01117513...
@dumper ; Back at T20 EXEC
DUMPER>tape mta0:
DUMPER>save ps:<KLH>*.*.* (AS)
[...etc...]
Note in the above example that the <devid> "mta0" only happens to
look like the TOPS-20 device designator "mta0:" because a KLH10
DEVDEFINE command at startup defined it thusly for convenience.
Don't confuse them.
DEVSHOW [<devid>]
Show information about device definitions.
<devid> must be already defined by the DEVDEFINE command.
If no device is specified, all are shown; this can be useful.
If a <devid> is specified, it is queried for whatever information
it wants to show. Currently none show anything, so this form isn't
very interesting.
DEVUNMOUNT <devid>
Unmount device media.
<devid> must be already defined by the DEVDEFINE command.
This is particularly useful for magtape devices, but is intended
to also work for disks someday.
IMPORTANT! This command, like DEVMOUNT, can only make a polite
request to the device.
If the device is busy, the request is ignored immediately
with an error message; try again later.
Example:
DUMPER>quit ; Leaving T20 DUMPER pgm
@[HALTED: FE interrupt] ; ^\ typed at T20 EXEC
KLH10> devunmount mta0 ; KLH10 cmd given
Unmount requested ; Request looks OK
KLH10> c ; Continue KN10
Continuing KN10 at loc 01117511...
@ ; Back at T20 EXEC
DEVWAIT [<devid>] [<secs>]
Waits until device sub-process(es) are ready to accept new
requests.
If <devid> is specified, only that device is waited for.
Otherwise, all devices are waited for.
If <secs> is specified, the command will only wait for that
many seconds. Otherwise, it waits indefinitely.
This is primarily intended for use in startup scripts, before
(or after) a mount or unmount request is made to a disk or
magtape device. It ensures that further commands are not
executed until the devices are ready for them.
The likelihood that this will ever be needed is small, but
the command exists anyway.
DUMP <file>
Dump binary from KN10 memory into a native OS file. This is the
inverse of LOAD.
Only the first 256K of memory is dumped; the data-format used is
the same as the current LD_FMT setting, and the load-format is SAV.
Zero words are not written out.
EXAMINE [<addr>]
Show word at address. For debugging.
Sets the current location ("dot") to the specified address; if no
address is given, the current location is used.
The PDP-10 word value is printed out. If it appears to be a
valid PDP-10 instruction, it is shown in instruction format as well.
The <addr> may be "local" or "global"; if in the form <LH>,,<RH>
it is assumed to be global. This can be specified explicitly by
prefixing the address with either of the letters:
L - Address is "local" (relative to some section)
G - Address is "global"
The <addr> can also be prefixed with one of the following letters
to specify the memory mapping to use:
C - Current mode's memory map (the default)
E - Exec mode memory map
U - User mode memory map
P - Physical address
A - AC address, interpreted as <AC block #>,,<AC>
Not all combinations are meaningful in all situations.
EXAMINE is always safe; you cannot cause a page fault with
an EXAMINE reference. "??" will be printed if no mapping exists.
GO [<addr>]
Start KN10 at address.
Ignores the current PC and sets it to the address, if one is given.
If no address is given, the start address from the most recent
"load" command is used.
Example:
KLH10> go
Starting KN10 at loc 040000...
BOOT V11.0(315)
BOOT>
HALT
Halt KN10 immediately.
Currently this is a no-op because if you're in the KLH10 command
parser that means the KN10 is already halted!
When the KLH10 allows concurrent execution this will become a
meaningful command.
HELP [<cmd>]
HELP - Shows brief help for all commands.
HELP <cmdprefix> - Same for all matching commands.
The HELP command is intended more for remembering commands than
for documenting them, so don't expect much. Keep this reference
file handy.
LOAD <file>
Load binary into KN10, sets start-addr if specified by file.
This is how a PDP-10 bootstrap is initially loaded. The KLH10
uses the native OS filesystem as its "front-end" filesystem and
can load any required bootstrap directly from ordinary files.
The binary file must, of course, be formatted correctly with
respect to both its data-format (how PDP-10 words are stored in
8-bit bytes) and its load-format (typically EXE).
The default data-format is core-dump, "c36" ("u36" for KSITS version).
This can be changed with the command SET LD_FMT=<fmt> if necessary.
Provided the selected data-format correctly matches that of the file,
LOAD is able to determine the load-format automatically (SBLK, SAV,
EXE) and determine the start address of the program. However, if
the data-format is wrong, LOAD will blindly load garbage; check
to see if the start address it reports looks reasonable.
Example:
KLH10> load boot.sav
Using word format "c36"...
Loaded "boot.sav":
Format: DEC-CSAV
Data: 4632, Symwds: 0, Low: 040000, High: 054641, Startaddress: 040000
Entvec: JRST (120 ST: 00, 124 RE: 00, 137 VR: 0,,0)
KLH10>
NEXT-EXAMINE
Show next word, for debugging.
Increments the current location ("dot") by 1 and then does "examine".
PROCEED <#>
Single-steps the KN10 by the specified number of instructions.
Most useful with TRACE-TOGGLE.
QUIT
Quit emulator. Asks for confirmation, since this kills the
program entirely. You should never kill or exit a KLH10
process except with QUIT, or there will be a lot of leftover
subprocesses and memory segments littering the native system.
For an example, see the SHUTDOWN command. You don't have to
use SHUTDOWN prior to QUIT if you don't care about stopping your
PDP-10 monitor gracefully.
RESET
Reset KN10. For debugging.
SET [<var>[=<val>]]
Set/show KLH10 variables, primarily for debugging.
SET - Shows all known variables
SET <var> - Shows value of that variable
SET <var>=<val> - Sets variable to specified value. No spaces!
Showing all known variables produces a long list; most of that
information is of use only when debugging. The variables
that a user might plausibly want to set follow below.
SET SW=<word-value> - Set KN10 data switches
This is sometimes needed for diagnostics or bootstrap loaders,
which read the data switches as a crude form of input.
Example:
KLH10> set sw=20
sw: 0,,0 => 0,,20
KLH10>
SET LD_FMT=<data-format> - Set data-format for LOAD/DUMP
LD_FMT is a bit of a misnomer; it may be renamed. It actually
refers to the data format.
The data format specifies how 36-bit words are read from or
written into a sequence of 8-bit bytes. When 9-track tape drives
were introduced a variety of formats were created to address this
issue, and these formats have all been provided as options
for KLH10 I/O as well.
C36 - "Core-Dump" - Default.
H36 - "High-Density" - Most compact format, same as FTP Image.
A36 - "Ansi-Ascii" - Weird handling of low bit.
S36 - "SIXBIT" - used for 7-track tapes.
U36 - "Unixified" - Alan Bawden's archival format
See "Tape Formats" in VTAPE.TXT for more details.
SET MEM_LOCK=<boolean> - Set "ON" to lock emulator in memory
If set TRUE, the emulator and all of its subprocesses call
mlockall() to ensure that none of them are ever swapped out.
You must be running the emulator as root for this to do anything.
If used, this should be set prior to defining any devices.
This results in locking down about 34M of RAM (6M for a KS10)
so the overall system should have at least 64M and preferably more.
!!! WARNING: there is a kernel bug in Digital Unix (up to at
least version 4.0B) which can cause the entire system to eventually
hang up when mlockall() is used in this way. It's unclear whether this
has been (or will be) fixed in 4.0D or later versions.
Solaris does not suffer from this problem.
FreeBSD does not implement mlockall().
SET PROC_PRI=<pri> - Set to increase emulator process priority
The PROC_PRI parameter gives its argument to the setpriority()
call; the valid values range from -20 (highest priority) to 20 (lowest
priority). You may need to experiment with this setting to find the
value that gives you the best combination of emulator and general Unix
system response; I suggest starting with -10.
You must be running the emulator as root for this to do anything.
Note that the DPNI20 subprocess always runs at -20 to ensure
fast network response; to avoid interfering with this, you should not
set PROC_PRI to its "maximum" of -20. -19 is quite enough to give the
emulator so much priority that all other Unix system processes are
noticeably slower.
SET CLK_ITHZFIX=<hz> - Set to specify interval timer clock resolution
The CLK_ITHZFIX parameter fixes the KN10 clock tick rate in
Hz (ie ticks per second). This originally defaulted to 30Hz as a
compromise designed to allow the emulator to run on slower hardware
platforms without spending all its time processing clock interrupts.
However, faster platforms can now handle the full clock rate that
TOPS-10 or TOPS-20 expects, so the default is now 60Hz. You have the
option of changing this parameter to either enforce a different rate,
or (by setting it to 0) allowing the monitor to change the rate as it
pleases.
Recommendations:
- If running on slow hardware you may need to set this back
to 30 in order to get useful work done, regardless of
the PDP-10 system being used.
- For stand-alone processor diagnostics, set (or leave) this at 60.
This is particularly true for the DFKFB timing test.
- For ITS set (or leave) this at 60. This is the normal clock rate.
- For TOPS-20 try setting this to 0. The monitor's desired
rate is 1000 and system response on a fast machine may
improve since the scheduler will be invoked much more often
and its overall behavior will be closer to that of a real KL10.
If things seem slower, use a smaller value like 100 or 60.
- For TOPS-10 set (or leave) this at 60. This is the monitor's
normal clock rate, and it is NOT recommended to let it
free-run with 0.
The reason is that the TOPS-10 monitor twiddles the interval
incessantly in a futile attempt to compensate for what it
thinks are deviations when compared to the real-time base
clock. "Fixing" the rate at 60 keeps it stable.
SHUTDOWN
Halt OS gracefully.
This only works with a moderately healthy PDP-10 monitor. It
deposits -1 into location 30 and continues the KN10. The monitor
is supposed to notice this, carry out final shutdown operations, and
then execute a HALT instruction, which returns control to the
KLH10 command loop.
Example:
Shutdown complete ; Printed by PDP-10 OS
[HALTED: FE interrupt] ; ^\ typed to get FE int
KLH10> shutdown ; Now can give SHUTDOWN cmd
Continuing KN10 at loc 01117511...
**HALTED**
[HALTED: Program Halt, PC = 1120252]
KLH10> quit ; Now give QUIT to leave KLH10
Are you sure you want to quit? [Confirm]
Shutting down...Bye!
%
TRACE-TOGGLE
Toggle execution trace printout. For debugging.
VIEW
View KN10 status (PC, etc). Primarily for debugging, but
harmless for the curious.
Example:
KLH10> view
KN10 status: EXEC
PC: 1117506 [JPC: 1117513 UJPC: 30144 EJPC: 6126407]
Flags: 704040
Next: OCcID 1117506/ SKIPE 333013 333013/ 0
KLH10>
A little explanation: the JPC is the PC of the last jump instruction.
UJPC and EJPC hold the JPC as of the last transition out of user
or exec mode, respectively. The flags are the left-half PC flags;
the "Next:" line shows the next instruction that will be executed
when the KN10 is continued.
ZERO
Zero the first 256K of memory. For debugging.
^-EXAMINE
Show previous word, for debugging.
Decrements the current location ("dot") by 1 and then does "examine".

58
doc/cmdsum.txt Normal file
View File

@@ -0,0 +1,58 @@
/* CMDSUM.TXT - KLH10 Command Summary
*/
/* $Id: cmdsum.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 1994-1999, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
This is a cheat-sheet summary of all KLH10 commands, grouped roughly
by functional category. See "cmdref.txt" for more details on each.
BASIC:
help [<cmd>] Shows help for all matching commands (defaults to all)
load <file> Load binary into KN10, sets start-addr
go [<addr>] Start KN10 at address (defaults to start-addr)
continue Continue KN10 (resume execution after ^\ or halt)
shutdown Halt OS gracefully (set loc 30 to -1, then continue)
quit Quit emulator
DEBUGGING:
set [<var>[=<val>]] Set/show KLH10 variables (if no args, show all)
view View KN10 status (PC, etc)
examine [<addr>] Show word at address
next-examine Show Next word
^-examine Show Previous word
deposit <addr> <val> Deposit value at address
breakpt <addr> Set PC breakpoint to <addr>
1-step Single-step KN10
proceed <#> Single-step # instrs
trace-toggle Toggle execution trace printout
continue Continue KN10
dump <file> Dump binary from KN10
halt Halt KN10 immediately
reset Reset KN10
zero Zero first 256K memory
DEVICE CONFIG/CONTROL:
devdefine <devid> <dev#> <driver> [<params>] Define/init device
devshow [<devid>] Show defined device info
devmount <devid> <path> [<options>] Mount device media
devunmount <devid> Unmount device media
DEVICE MISC:
devdebug <devid> [<debugval>] Set device debug value (0=off)
devevshow [<devid>] Show device event reg info
dev <devid> <device-command-line> Execute device-dep command
devload <driver> <path> <initsym> <comments> Load DLL dev driver

195
doc/coding.txt Normal file
View File

@@ -0,0 +1,195 @@
/* CODING.TXT - General coding rules for KLH10
*/
/* $Id: coding.txt,v 2.4 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 1992, 1993, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
KLH10 General coding rules
STYLE AND STANDARDS
===================
The style rule is simple: use the existing style. There is no
religious reason for this particular style, but it is always best for
edits and additions to remain consistent with what's already there.
All code should conform to the first ANSI C Standard (ANS X3.159-1989,
also called the 1990 Standard). Do not use or assume features from
later versions of the C Standard, or from any specific compiler,
unless conditionalized such that everything will still build without
those features. This specifically includes pragmas; none are
currently used. Similarly, the "long long" datatype cannot be assumed
to exist.
Do not use C++. Eventually this may become unavoidable for GUI
wrappers, but the existing core code must remain in C.
Simply using ANSI C is not enough to ensure code is portable. You
must also be careful about any assumptions regarding the host CPU:
little-endian vs big-endian, integer type sizes, printf arguments, and
so on. This is a long and complex topic that boils down to "don't do
stupid things".
PORTING AND OSD CODE
====================
OSD means "Operating System Dependent". To make it easier to
port the KLH10 to new platforms, all system calls or non-ANSI library
facilities should be encapsulated within one or more of the OSD*.C
modules, and accessed only by facilities with an "os" name prefix.
The bulk of this code is presently in OSDSUP.H and OSDSUP.C, which is
dedicated to the KN10 component and not used by any other programs.
The only exceptions are DPSUP.C and the separate DP* programs that use
it, but even those may be changed in the future to follow the same
conventions.
This should be done even for system calls that are considered
"standard" for all Unix systems, such as read(), because of the
existence of certain popular non-Unix platforms.
New platforms will almost certainly require new Makefiles. Try to
follow the scheme already in place.
WORD MANIPULATION
=================
NEVER, ever, operate on a PDP-10 word (w10_t) except with the
macros provided from k10ops.h and word10.h. The only things you can
do to words without macros are pointing to them (&) or copying (by
assignment or parameter passing).
The KLH10 is designed to be portable to environments where the longest
native integer type is 32 bits, so a w10_t may actually be a structure
or union rather than an integer.
An important ramification of this is that any arithmetic done on
values that might exceed 32 bits must always provide special handling;
you cannot merrily assume that a sufficiently large "long long" will
always be available. Even when it is, the "native" arithmetic may not
be as efficient as a 32-bit algorithm!
ARG/RET CHECKS
==============
An important rule for macros and functions:
Arguments are always *assumed* to be correctly formatted or masked.
Results are always *guaranteed* to be correctly formatted or masked.
This is important in order to maintain consistency and avoid redundant
operations. The rule permits incorrect values to be generated or
maintained, as long as they are corrected before being given to other
facilities.
There are only two known exceptions to this rule: mr_PC and E.
* mr_PC is not masked during the normal execution loop, to save time.
This may change for the KLX version.
* E is not masked when provided to instruction routines, also to
save time where the mask isn't needed.
FLOATING POINT
==============
Do not use it. No native implementation corresponds exactly
with that of the PDP-10, and floating point results are inherently
unportable, especially for extreme operands that may even trap.
In theory it may be possible to accelerate some PDP-10
floating point operations with carefully selected uses of native FP
operations or libraries, but this will take a VERY large amount of
work to verify that the results remain bit-identical with those of a
real PDP-10.
CODING INSTRUCTION ROUTINES
===========================
All instruction routines must be declared in this way:
insdef(i_xxx)
{ /* Function code */
}
The "insdef" macro declares the function with the following three args:
int op; /* 9-bit opcode of instruction */
int ac; /* 4-bit AC field of instruction */
vaddr_t e; /* Effective Address calculated from I(X)Y */
(WARNING! for KS10 may have junk in high bits!)
The op and ac values have already been masked.
Note that someday "op" may go away.
All memory references should be checked BEFORE anything is modified
either in memory or the ACs! Actually, it is good practice to verify
the memory reference before even starting the computation, especially
if there's a chance that PC flags such as TRAP1 might be set.
This ensures that abnormal termination (due to page failure or PI
interrupt) doesn't leave anything messed up.
Exceptions are BLT and IDBP/ILDB which know how to back out.
Normal memory operand reads and writes should be done with:
word = vm_read(e); - Read word, may page-fail!
vm_write(e, word); - Write word, may page-fail!
Halfword variants vm_{read,write}{lh,rh}() also exist, but note
that they operate on h10_t integer values, not w10_t words.
If the same memory location is to be read-modified (both read and
written) then these should be used:
vmptr_t p;
p = vm_modmap(e); - Get phys mem ptr (may page-fail!)
word = vm_pget(p); - Read word from phys mem (won't fail)
vm_pset(p, word); - Write word to phys mem (won't fail)
BLT, Stack, and Byte operations do special-case memory referencing to
allow for previous-context mappings by PXCT.
AC reads and writes are done with:
word = ac_get(ac); - Read AC
ac_set(ac, word); - Set AC
Halfword AC reads and writes have ac_{set,get}{lh,rh}()
but note that they operate on h10_t integer values, not w10_t words.
Multi-word operations (in particular the double-word instructions) must
reference each word individually, because AC+1 may wrap around (modulo 020)
and E+1 may likewise either wrap or cross a page boundary.
The return value is added to the PC, so normally this will be 1
except for jumps (0) and skips (2). The macro definitions PCINC_n
are used for this purpose; someday they may have different values.
Instructions which set any of the PC flags should do so with the macro
PCFSET(flags)
to ensure that various transition subtleties are handled properly.
PRINTF ARGS
===========
This is a generic portability tidbit. All printf-style
references to integer variables of unknown size (that is, defined by
typedefs) must promote the value to long and use %l in the format
string. In particular, h10_t and vaddr_t types require this.
MISCELLANY
==========
To keep some strict compiler modes happy, all functions with
external linkage must have a prototype declaration prior to their
definition. This is not needed for static functions, unless of course
they are referenced prior to their definition.

119
doc/dfkfb.txt Normal file
View File

@@ -0,0 +1,119 @@
/* DFKFB.TXT - README for DFKFB KL timing diagnostic
*/
/* $Id: dfkfb.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
NOTE:
DFKDB is not KLH10 software; it is a KL10 instruction timing
diagnostic written by DEC and may only be used with a valid TOPS-10 or
TOPS-20 license. If present in the distribution, it is included
purely as a convenience for developers.
People with a weakness for instant gratification, which is most of us,
will like DFKFB. As soon as you have built a KN10-KL, you can
immediately run DFKFB without spending any time on installation or
configuration, and get an idea of how it compares with a real KL.
[1] Build a KN10-KL for your native platform.
$ cd <distrib>/bld/<platform>
$ make base-kl
[2] Go to the DFKFB directory, if present, and run it.
$ cd ../../run/dfkfb
$ ../../bld/<platform>/kn10-kl dfkfb.ini
[3] Compare output with other configurations, platforms, etc.
Strut or sulk as appropriate.
As with all benchmarks, the DFKFB output must be taken with large
grains of salt. Its results will be strongly influenced by the cache
behavior of your platform; with modern hardware it will usually run
entirely in the cache and thus will represent tne best speed you can
get. When running a PDP-10 OS with real applications, you will get
many more cache misses and the following factors become more
important:
- PDP-10 instruction mix. Floating point is slow.
- I/O response (fast physical disks make a difference).
- Non-KLH10 processes competing for the native platform's CPU.
Still, it's fun to see how many multiples of a real KL you can run at.
THE REAL THING
==============
Unfortunately, although I have output logs of DFKFB runs for a
variety of platforms, I do not have one for a real KL10 itself!
Hopefully someone will be able to contribute this from their archives.
The best information I can provide comes from a user-mode timing test
program I wrote called "ZOTZ"; the results I have are for a DEC-2065,
which is a KL10B with MCA25 cache. Even though this is a user-mode
program rather than exec-mode as for DFKFB, these numbers should be
within a few percent of the real thing. Copying this data into the
format of DFKFB gives the following simulated output, with "??"
inserted where nothing was available:
1 - BASIC CLOCK CYCLE IS ?? NSEC.
2 - INDEXING TAKES 36 NSEC.
3 - INDIRECT TAKES 269 NSEC.
4 - INDEXING AND INDIRECT TAKES 336 NSEC.
5 - MOVEI TAKES 269 NSEC.
6 - MOVE FROM AC TAKES 374 NSEC.
7 - MOVE FROM MEMORY TAKES 402 NSEC.
8 - HRR FROM MEMORY TAKES 443 NSEC.
9 - SETOM 0 TAKES 571 NSEC.
10 - JRST TAKES 303 NSEC.
11 - JSR TAKES 642 NSEC.
12 - PUSHJ TAKES 708 NSEC.
13 - ADD FROM MEMORY TAKES 438 NSEC.
14 - MUL (9 ADD/SUB - 18 SHIFTS) TAKES 2.42 USEC.
15 - DIV TAKES 4.70 USEC.
16 - FIX A FLOATING POINT ONE TAKES 874 NSEC.
17 - FLTR AN INTERGER ONE TAKES 881 NSEC.
18 - FAD (1 RIGHT SHIFT) TAKES 1.59 USEC.
19 - FAD (8 SHIFT RIGHT - 3 LEFT) TAKES 1.81 USEC.
20 - FMP (7 ADD/SUB - 14 SHIFTS) TAKES 2.56 USEC.
21 - FDV TAKES 4.82 USEC.
22 - DMOVE FROM MEMORY TAKES 608 NSEC.
23 - DFAD (1 RIGHT SHIFT) TAKES 2.06 USEC.
24 - DFAD (8 SHIFT RIGHT - 1 LEFT) TAKES 2.06 USEC.
25 - DFMP (7 ADD/SUB - 32 SHIFTS) TAKES 4.25 USEC.
26 - DFDV TAKES 8.71 USEC.
27 - CONO PI TAKES ?? NSEC.
28 - CONI PI TAKES ?? NSEC.
29 - DATAO APR TAKES ?? NSEC.
30 - DATAI APR TAKES ?? NSEC.
31 - MOVE TO MEMORY TAKES 573 NSEC.
32 - LOGICAL SHIFT (35 PLACES LEFT) TAKES 439 NSEC.
33 - LOGICAL SHIFT (35 PLACES RIGHT) TAKES 470 NSEC.
34 - LOGICAL SHIFT COMBINED (71 PLACES LEFT) TAKES 743 NSEC.
35 - LOGICAL SHIFT COMBINED (71 PLACES RIGHT) TAKES 745 NSEC.
36 - INCREMENT BYTE POINTER TAKES 924 NSEC.
37 - INCREMENT AND LOAD BYTE TAKES 1.21 USEC.
38 - INCREMENT AND DEPOSIT BYTE TAKES 1.60 USEC.
39 - JFCL TAKES 404 NSEC.
40 - CAI TAKES 272 NSEC.
41 - JUMP TAKES 342 NSEC.
42 - CAM TAKES 376 NSEC.
43 - EQV AC TO AC TAKES 402 NSEC.
44 - EQV MEMORY TO AC TAKES 742 NSEC.
45 - SETOB TAKES 571 NSEC.
46 - AOS TO MEMORY TAKES 539 NSEC.
47 - EXCHANGE AN AC WITH AN AC TAKES 545 NSEC.
48 - EXCHANGE AN AC WITH MEMORY TAKES 706 NSEC.
49 - EXECUTE TAKES 471 NSEC.
50 - BLT MEMORY TO MEMORY TAKES 1.58 USEC.
51 - BLT AC TO MEMORY TAKES 1.48 USEC.
52 - DATAI TAKES ?? NSEC.
53 - DATAO TAKES ?? NSEC.

118
doc/dvhost.txt Normal file
View File

@@ -0,0 +1,118 @@
/* DVHOST.TXT - The special HOST device
*/
/* $Id: dvhost.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 1997-1999, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
THE "HOST" DEVICE
This is not a real device, nor is it anything that ever
existed on a real PDP-10. Rather, it is a pseudo-device which serves
as a simple API to request services or information from the emulator.
It is called "HOST" to emphasize that its status or I/O represents
communication with the native host platform that the emulator is
running on.
"HOST" DEVICE CONFIGURATION
As for other devices, the DEVDEFINE command must be used
(typically as a line in "klh10.ini") to associate the HOST device with
either a unibus address (for the KS10) or a PDP-10 device number (for
all other models). This needs to be a device number or address that
is not otherwise used by something else, and any monitor modifications
that refer to this device must use the same number or address.
KL10 example:
devdefine idler 700 host ; PDP-10 device 700
where "host" specifies the HOST device; "idler" is a name
of your own choosing, and 700 is simply a device number that
does not conflict with any standard DEC devices.
KS10 example:
devdef idler ub3 host addr=777000
where "host" specifies the HOST device; "idler" is a name
of your own choosing, and "ub3" plus "addr=777000" specifies
a unibus address that should not conflict with any standard
DEC devices.
There are currently no configuration parameters associated with the HOST
device, and only one such device can be defined.
KL10 "HOST" DEVICE USAGE
Although any of the four basic PDP-10 I/O instructions (CONI,
CONO, DATAI, DATAO) can be used with this device, only one specific
instance is currently meaningful, and its use is very simple.
IDLE FUNCTION: CONO <hstdev>,1
The emulator process will enter an "idle" state with respect to the
host system, until a PI (priority interrupt) event occurs. During
this state no host CPU time is consumed emulating PDP-10 instructions,
although device subprocesses are still free to run. Instruction
execution will resume with a dispatch to the appropriate PI
interrupt handler, which should eventually return to the next
instruction following the CONO.
All other I/O instructions will behave as if the device was
non-existent. A CONO with an E != 1 will be a no-op, as will DATAO;
CONI and DATAI simply read a zero word. However, new functions can
obviously be readily added as the need arises.
KS10 "HOST" DEVICE USAGE
To invoke the "idle function" on the KS10, just write the
value "1" to the device's unibus address. The exact IO instruction
used to do this should not matter.
MONITOR PATCHES FOR THE "IDLE" FUNCTION:
In order to effectively use the HOST "idle" function, you must
determine the right place to patch your monitor to use it -- the point
in the scheduler where the system decides there isn't anything it can
do and begins to run the "null job".
For a TOPS-20 V7 monitor the most appropriate patch is to replace the
instruction at SCDNL1-1 in SCHED.MAC (a JRST SCDNL2) with the "IDLE"
function instruction. In context:
SCDNUL: SETOM NULJBF
SCDNL2: ...
<null job stuff>
JRST SCDNL1 ; Something to do.
JRST SCDNL2 ; Replace with CONO <hstdev>,1
; which will fall through when there's
; any PI activity.
SCDNL1: <start of sched cycle>
...
For a TOPS-10 monitor I would suggest replacing the instruction at
NULCOD+1 in CLOCK1.MAC (a SOJG 6,1) with the "IDLE" function
instruction. However, this has not been well tested and there may be
a more appropriate place.
You can verify whether this function is working by observing the
process CPU usage on the host system. As long as the KN10 is not
running the monitor's null job, the emulator will be using as much CPU
time as possible -- as much as 95% on an otherwise lightly loaded
single-CPU system. But when the monitor has nothing to run and the
KN10 is effectively idle, the emulator's CPU usage should drop to
perhaps 5%. It will never be completely zero because all monitors
always maintain a clock interrupt that drives periodic updates and
scheduler checks.

426
doc/history.txt Normal file
View File

@@ -0,0 +1,426 @@
/* HISTORY.TXT - KLH10 Historical notes
*/
/* $Id: history.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
The following two messages were sent when the first version of the
emulator was announced. Although I always cringe a bit on reading
things from my younger self, I've included them as historical
documentation because of the glimpse they provide back into a more
innocent time when this was all just terrific fun. No kids, no gray,
no NDAs, no licenses, and no lawyers.
Date: Mon, 20 Jul 1992 23:51:04 BST
From: Ken Harrenstien <klh@us>
To: its-lovers@mc.lcs.mit.edu, tops-20@wsmr-simtel20.army.mil
Cc: klh
Subject: One small step, one giant leap
Message-Id: <CMM.0.88.711701464.klh@churchy.us.oracle.com>
On this anniversary of a truly historic moment, I would like to announce
a somewhat smaller event which may loom the larger for being closer to
our hearts.
stealth.us.oracle.com% telnet nx.us.oracle.com
Trying 139.185.5.134 ...
Connected to mit-nx.us.oracle.com.
Escape character is '^]'.
Unknown ITS PDP-10
NX ITS.1645. DDT.1545.
TTY 11
2. Lusers, Fair Share = 136%
klh$u
*peek^K!
NX ITS 1645 Peek 629 7/20/92 23:02:48 Up time = 2:15
Memory: Free=381 Runnable Total=83 Out=71 Users: High=6 Runnable=1
Index Uname Jname Sname Status TTY Core Out %Time Time PIs
0 SYS SYS SYS HANG ? 51 0 0% 4
1 CORE JOB CORE UUO ? 0 0 0%
2 KLH0 HACTRN SYS TTYI T0 30 9 1%
3 11TLNT TELSER 202405 SLEEP ? 1 0 0%
4 KLH HACTRN KLH HANG > 30 9 0%
5 KLH PEEK KLH +TTYBO T11 C 83 71 7%
Fair Share 135% Totals: 195 9% 7
Logout time = 2 Lost 0% Idle 98% Null time = 2:14
A
NX ITS 1645 Peek 629 7/20/92 23:02:50 Up time = 2:17
IMP is up. TCP/IP is available.
Ix Usr Uname Jname State RWnd Ibf SWnd ReTxQ Lclprt Fgnprt Fgnhst
34 3 11TLNT TELSER OPEN 5170 0 10000 0 0 27 10107 139.185.5.5
4 buffers (4 free)
STY Map
Idx STY owner Idx STY user Host
T11 3 11TLNT TELSER 5 KLH PEEK 139.185.5.5 (TCP)
Q
:KILL
*$$u
NX ITS 1645 Console 11 Free. 23:03:13
telnet> q
Connection closed.
stealth.us.oracle.com%
Yes, NX is a real, live, internet-host ITS assembled from the final
snapshot of AI. So here's the punch line...
***There is no KS-10.*** NX is running on a "KLH-10" -- a virtual PDP-10.
Over the past two months I was finally able to put everything together
to create a complete PDP-10 emulator, including all necessary devices
(RP06, TM03, console, IMP); to distinguish it from a real DEC machine
I'm calling it a KLH-10 per Alan Bawden's suggestion. The current
version is completely in C and should eventually be portable to most
platforms, but at the moment NX's host machine is a 33Mhz SUN Sparc-2
workstation sitting on my desk.
It's a long story with many more details and ramifications, all of which
I'll put off for later. Although I wrote it entirely on my own, it would
never have happened without many people who I'd like to thank here:
Stu Grossman, for convincing me with his KX-10 that a hardware
emulation in C was feasible.
Alan Bawden & Dave Moon, who (apart from their already legendary
roles in ITS) helped as much as they could without actually being there.
Jay Verkler (JLV), who with his group has re-created an AI lab
work environment within Oracle. It's called the Network Products Division
and made this hack possible.
Plus everyone else on these lists whose messages and actions
have helped keep the PDP-10 alive in spirit and reality a little
longer... may it now live as long as we wish!
--Ken
23-Jul-92 20:25:01-GMT,15781;000000000001
Received: by churchy.us.oracle.com (5.59.11/37.7)
id AA19272; Thu, 23 Jul 92 21:24:48 BST
Date: Thu, 23 Jul 1992 21:24:47 BST
From: Ken Harrenstien <klh@us>
To: its-lovers@mc.lcs.mit.edu, tops-20@wsmr-simtel20.army.mil
Cc: klh
Subject: KLH10 info
Message-Id: <CMM.0.88.711951887.klh@churchy.us.oracle.com>
OK, here are some more details about the KLH10. I've been a bit
overwhelmed by the many private responses and hope this answers most of
the questions.
First, the FAQs I've been getting:
* "When/How can I get a copy?"
Ouch, probably not until after Interop (Oct). It kills me to say
this, but my time *is* limited. (The usual bribes might help :-)
RMS has suggested distributing it via GNU/FSF, and I like that idea.
* "Will it run <my favorite PDP-10 OS>?"
Anything based on the KS10 should run with minor mods.
The 166, KA and KI will require moderate I/O instruction changes.
The KL10/20 (extended addressing, DTE20, etc) would require
major surgery -- without anesthetic.
* "How fast is it?"
That depends mostly on the host platform. Using a 33 MHz Sparc-2,
very roughly 0.2 MIPS, perhaps 50% of a KA.
More about this farther on.
* "Why can't I connect to NX?"
Oracle uses firewalls to prevent full Internet access to their
internal networks. We are trying to set up an ITS turist machine
but it needs to be done very carefully. Wait for an announcement.
* "Thanks!"
You're welcome!!
The rest of this message talks about various aspects at more length:
specifics of the target machine & devices, the emulator, and various
other thoughts. It is a bit long for one message, but I figure it's
better to get it all out of the way. My apologies to any uninterested
people.
Summary:
-------
Target machine: KS10 with MIT ITS microcode
Target config: 512K memory, RH11/RP06, RH11/TM03, FE console,
ACC LH/DH & IMP
Current speed: ~0.2 MIPS
Current host: 33 MHz Sparcstation-2 with internal disk, SunOS 4.1.1
Compiler: GCC 2.1
Misc: Sources .5MB, runtime memory 4.3MB, disk lotsaMB
About the Target Machine:
------------------------
The decisions I made while coding the emulator all boil down to
a simple desire to get something useful and interesting up as quickly
as possible. Among other things this meant using an ITS-microcode
KS10 as the target machine, because:
[1] I don't have official access to TOPS-20 binaries or sources,
and didn't want to worry about licensing hassles. Ditto TOPS-10.
I also am lacking the voluminous documentation about installation
and operating procedures.
[2] The most recent ITS binaries and sources are all archived
online (thanks to Alan), and all are for the KS10 version. All
documentation is likewise online, and in any case I have a
somewhat more intimate understanding of ITS.
[3] The KS10 has a simpler architecture than the KL10, which
allows an emulator to run much faster. If not for [2] I might
have started with the KA10 for this reason.
It is important to realize that the KLH10 is emulating the ITS
microcode, which is slightly different from that for TOPS-10 or
TOPS-20. The primary differences have to do with the pager and the
absence of the extended-instruction set (the noteworthy ITS features
such as one-proceed, JPC, and CIRC are of course supported).
In order to bring up TOPS-10 or TOPS-20, minor changes would be needed
to the pager code (somewhat more for TOPS-20, owing to its more complex
design). The extended string instructions are ugly but straightforward
for anybody with a strong stomach (and weak mind?).
Everything else is fully supported, including the double-precision
floating point instructions. I took pains to verify that all results
and PC flags are identical to the real hardware, even for wildly
unnormalized operands. This was *not* one of the fun parts.
With respect to a KA or KI version, the I/O instructions would also
need to be modified and a number of things changed in the APR and PI
system, but not a great deal. Bringing up TENEX should be relatively
easy given a complete description of the BBN pager. WAITS, however,
would be up to a true SAILor.
I know many people are going to wish for a KL10 they can run a
full-grown TOPS-20 on. Of course this is theoretically possible, but
it is not going to be easy to get something that runs at a useful speed
without a superfast host. Remember the KL10 is an oversexed mutant
with these strange bulging growths oozing out of random body parts, all
of which have to be duplicated no matter how bizarre. Just dealing
with extended addressing is going to slow down the basic instructions
as well as requiring much more pager overhead; this is one area where
the hardware parallelism is hard to beat. The additional device cruft
(DTE20s, meters, address breaks, etc) doesn't help. Personally I won't
try it without some concrete incentives.
P.S. Just for grins I included the KA10 and PDP-6 arithmetic ops,
although I don't have a reference machine for verification (ha). Who
knows, maybe a 340 will come along! Spacewar, yeah!
I/O Devices:
-----------
A great deal of the work consisted not of emulating the 10 but
rather emulating a basic set of peripherals. The KS10's use of Unibus
devices made it somewhat more painful than the old I/O device scheme,
because instead of a small matrix of devices and I/O instruction
opcodes, there's a long list of bus addresses to check, each of which
has completely arbitrary meanings. Not to mention the Unibus adapters
with their individual Unibus page maps, all of which are emulated as
well.
DSK: Currently one RH11/RP06 is supported as a virtual disk. The
actual implementation uses a standard Unix disk file (not a raw disk)
to hold the "RP06" contents; this is so all blocks that haven't been
written will simply not exist (also known as a holey file), thus taking
up much less space than a full raw disk would. Formatting the disk is
obviously unnecessary; sector headers are not written or read. Errors
are pretty much limited to those caused by garbage written into the
registers, so the interface is a bit simpler than the real thing. It's
possible that an OS which can't leave well enough alone will insist on
using some weird maintenance bits, in which case the device code will
need work. Mods for multiple drives or other RH-controlled drive types
are trivial.
MTA: Similar considerations apply to the RH11/TM03 magtape interface.
>From the "FE" (front-end controller interface) one can mount or unmount
"tapes" that consist of either binary tape images or virtual tapes
built on the fly from lists of unix files. Hooking up a real magtape
drive would probably have been easier, but loading virtual dump tapes
into the filesystem is very fast, actually -- much faster than the real
devices would be. In fact I found one race condition in the ITS
bootstrap loader that required slowing down disk I/O until I was able
to reassemble a fixed version.
NET: The network interface is an emulation of the ACC LH/DH that some
MIT machines used to have, as well as a virtual IMP. Putting this one
together was a major project in network hacking, not to mention deceit.
Using Sun's NIT (Network Interface Tap) and various trickery, I was
able to set up NX with its own IP address, independent of its
platform's address and thus permitting me to run ITS without
interfering with the other network stuff I'm doing on my workstation.
For efficiency, the virtual IMP is actually a "Simple IMP" that doesn't
bother sending RFNMs, and the virtual LH/DH does I/O in PDP-10 byte
order (not Unibus order) -- this all required changes to the ITS IMP
driver. For a while I considered munging the packets within the
virtual IMP to pretend that the local net was the ARPANET, but finally
decided it was better to fix ITS itself, and did so; ITS can now be
configured for non-ARPA subnets. Geez, I never thought after I did ITS
TCP/IP that I'd be hacking the code again ten years later!
TTY: The FE console TTY "interface" is emulated, tho the 8080 FE
commands aren't -- no need. There is also a dummy DZ11 driver that
merely reads and writes registers without doing anything. This (and an
equally empty Chaosnet driver) was needed because that's what the last
AI ITS binary image was configured for, and I had to get that up before
I could reassemble a new system (oh the joys of bootstrapping). The
DZ11 won't be hard to finish off, but I'm not sure it's worthwhile;
it's a horribly inefficient device and it's much faster to telnet in
over the network. If realio trulio serial-line I/O is needed, I'd
recommend going for a DH11 if the OS supports it. (It isn't as if
it still costs three times as much as a DZ :-)
About the emulator:
-----------------
The KLH10 is written in C for a vanilla Unix OS, largely so it
can be readily ported to other platforms; in particular, those of the
future as well as those of today. Although re-coding critical sections
in assembler would readily double or triple the basic instruction
speed, it is much easier to simply recompile it on a faster machine.
Although I use the GCC compiler for its efficiency, I don't use any
of its non-standard language constructs, again for portability.
The most fundamental design decision had to do with the method of
representing 36-bit words on a 32-bit architecture. I wound up coding
around a halfword-based scheme, with each 18-bit PDP-10 halfword
right-justified in a 32-bit host word; thus each PDP-10 word uses 8
octets. The same format is used for memory, ACs, and disk storage;
basically I traded off space for speed.
On a machine with a word size larger than 36, or a C compiler that
supported an equivalent integer type (such as double-word ints), many
things become easier, and I'd want to re-do a fair amount of the
arithmetic code. Not because the current version won't work -- it will
-- but because it won't be as efficient. I decided early on that the
differences between optimal code on a 32-bit and +36-bit machine were
just too great to easily combine with the primitive tools available in
C.
The arithmetic emulation relies only on well-defined native integer
operations; native floating point is never used, both because it is
non-portable (formats vary) and because it is very difficult to
precisely emulate the PDP-10's behavior without actually carrying out
the same internal operations "by hand". This is by far the slowest
part of the KLH10. I checked it out by compiling it on a real 20
(using KCC, of course!) and running it for hours under a test program
that generated various operand bit patterns and compared the results
with those for real instructions.
The current implementation is being used as a testbed for threads, and
includes code for both a non-threaded and threaded version. (I
figured, what better test of software parallelism than to emulate
hardware parallelism?) This means that running on a true
multi-processor platform could produce somewhat better performance,
although the main APR execution thread is still serial and will impose
an upper bound on the speedup. Let's not talk about pipelining just
now.
To clear up one thing that has caused confusion: the emulator is *not*
running standalone on my Sparc. Except for the net device it uses the
usual Unix system calls and burns 100% of the CPU, running flat out. I
don't really notice it since the amount of CPU I use most of the time
is typically a negligible fraction of the Sparc's capability; for
example, I'm writing this note in one window while ITS runs in the
other, and everything's cool.
The NEED for SPEED:
------------------
In the summary I mentioned a speed of 0.2 MIPS, or about 5 usec
per instruction. This is probably the number people are most avidly
interested in, but at the same time it's also one of the hardest to
measure. PDP-10 speeds have always been tricky, mainly because it all
depends on the precise mix of instructions and operands. Now it's even
fuzzier because so much of the KLH10 is variable.
Of course, the host platform speed is an overriding factor. But I've
seen that even minor changes in the main loop can produce noticeable
differences in response time, as can the exact nature of memory
references. For example, the SPARC is a register-window machine and
it's faster to pass arguments to functions than to set and read global
variables; it's also faster to use C structure members than globals!
Another machine could have precisely the opposite behavior. I should
add here that the compiler is also tremendously important; using
GCC results in code that is 40% faster than Sun's CC! Yow!
Anyway, I haven't really buckled down and tried to tune or measure its
performance, so take the 0.2 MIPS loosely. My back-of-the-envelope
calculations before I started suggested that an assembler-coded SPARC
implementation could achieve a KA performance level; the current C
version appears to get perhaps half that speed. Assembling the entire
ITS OS takes about 26 minutes of real time, but I don't know if anyone
remembers how long it took on a real KS10, much less a KA10.
The Sparc is already a slowpoke compared with some of the new
workstations and chipsets coming out, so it's just a matter of time
before someone cracks the KS10 speed limit on reasonably cheap
personal hardware. I can't help but wonder if might be worth paying
serious attention to a high-speed version, one that would represent a
cost-effective solution for those places still committed to PDP-10
software. Systems Concepts probably doesn't need to worry -- yet!
Future improvements:
-------------------
The obvious one is speed. Then more machine variants, more
devices. More instrumentation & profiling. A nicely packaged
distribution with your choice of OS and initial filesystem included.
The usual embellishments. Whatever people suggest.
There's also the possibility of evolving a new virtual machine, one
which realizes more closely whatever the ideal PDP-10 is conceived to
be. (That itself is an interesting question.) For example, the real
KS10 ITS microcode does not actually support JPC, which was a feature
of Holloway's MAC-10 pager; the KLH10 does it trivially and in that
sense is more than a simple KS10. Its pager could support 2048K as
easily as 512K. And so on, all of which implies reconfiguring a real OS
to run on an unreal machine. The first step down this road has already
been taken with NX ITS, assembled to use a non-existent net interface.
And I've always thought it would be lovely to have a window displaying
a KA-style console panel with a full bank of lights and clickable
switches. I know the KS10 never had one, but that doesn't mean it has
to stay that way, and besides, the KL10 cheated with a 11/40 panel, so
it's down to either the KA or KI. Of course it's just for fun, what
else is this all about?
Final thoughts:
--------------
I was going to close with the last paragraph, but realized
there's one more thing I want to say. It's just that, um, well,
this will sound silly, but it feels so... weird? ... eerie?
... just plain literally *mind-blowing* to watch this system boot up
and run happily, utterly unaware that it's not on a real machine, or
that anything odd happened since the last time it ran, or that its
earthly incarnation of a noisy roomful of huge cabinets and washing
machines is now entirely self-contained within a small innocuous pizza
box holding up my ITS manuals. Do systems have wathans? I've gotten a
bit more used to it, but every now and then I still sit back, realize
once again what the hell is going on, and hold on to something while
the chills pass. I didn't expect this at all. A side effect of being
imprinted at a tender young age, or something...
--Ken

1269
doc/install.txt Normal file

File diff suppressed because it is too large Load Diff

191
doc/kldiff.txt Normal file
View File

@@ -0,0 +1,191 @@
/* KLDIFF.TXT - Differences between KLH10 and KL10
*/
/* $Id: kldiff.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 1994-1999, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
This file attempts to summarize the known visible differences between
the KLH10 emulator's "KN10" processor and an actual DEC KL10,
specifically a Model B CPU running version 442 of the microcode.
It is important to remember that it is very difficult to stumble
across these differences unless you are looking hard. As a practical
matter, for users there is far less of a difference between the KN10
and a KL10 than there were between different releases of the KL10
microcode.
As one illustration of this point, DEC diagnostics are mentioned in
several places, but their reports must be taken with large grains of
salt. Many stopped working for the latest KL10s, and some only worked
when loaded with older microcode; in order to run those, the KLH10 must
be built with a "hybrid" KN10.
USER MODE DIFFERENCES
=====================
[U1] No Public mode.
The KN10 does not implement public mode; it was considered to
have little real use (the KS10 does not implement it), and would make
execution slower. This is discussed in more detail in the exec mode
section.
[U2] Floating point results with normalized operands.
Some floating-point results may differ by a single low-order
bit, particularly FDV with negative operands.
This is noticed by the diagnostic DFKCA.
[U3] Floating point results with unnormalized operands.
There are certain cases where unnormalized operands may
produce different results in the low-order bits, apparently due to
sloppiness in the KL10 hardware.
DFDV is the most notable example; when given wildly
unnormalized operands, some low-order bits are cleared by the KN10 to
produce logically correct results, but these same bits are filled with
mysterious garbage on the KL10. Note that the same operands on a KS10
produce "clean" results that exactly match those of the KN10!
Diagnostics don't notice this as they never use unnormalized
operands.
[U4] Extended instruction set (string ops)
These instructions have so many undefined aspects, and their
microcode implementation changed so often, that it is difficult to say
much here beyond acknowledging that certain esoteric failure cases may
well produce different results. "Normal" cases should all be
identical.
The diagnostic DFKCC detects no differences except for the
intermediate AC values of an interrupted CVTBDx, where a KL10 saves a
fractional quantity and the KN10 saves an integral quantity; but
nothing should actually be examining this intermediate value.
[U5] Traps (1,2,3), PC, Page Fault.
Traps on the KN10 are handled in subtly different ways than
traps on a KL10. For the most part there is no observable difference,
but peculiar cases do exist.
In general, the PC seen by a trap instruction may be different
from that on a KL10 if the offending instruction (which set the trap
flags) was a jump or skip. However, either of these are problematical
for a KL10 trap handler as well.
On the KN10, an instruction that sets any trap flags will
trap as soon as the instruction is complete, with the PC pointing to
the next instruction (and backed up before executing the trap
instruction).
This differs from a KL10 where it is possible for the
next-instruction c(PC) fetch to cause a page fault before the trap is
handled. The diagnostic DFKEA notices this. N.B.: This is not the
same as a page fault during execution of either the offending
instruction or the trap instruction, both of which are correctly
handled.
EXEC MODE DIFFERENCES
=====================
Most of these are hidden from the user altogether.
[E1] No Public or Supervisor modes.
The KN10 does not implement public mode; it was considered to
have little real use, and would make execution slower. The KN10 does
keep the Public bit in page map entries, but never actually sets
Public when fetching instructions from a Public page, nor does it
verify whether an operation is permitted if in Public/Supervisor mode.
Note that the DEC KS10 does not implement this either, so the
functionality is presumably not terribly important.
However, this confuses and ultimately crashes the diagnostic
DFKEB which tests specifically for the operational differences between
user, public, kernel, and supervisor modes.
[E2] No Previous-Context-Public PC flag.
The KN10 always treats PC flag bit 0 as being "overflow",
which means that anything that stores the PC flags in exec mode will
get the state of the overflow flag, rather than the PCP flag as on a
real KL10.
This mildly irritates some diagnostics when run in exec mode,
specifically DFKCA, DFKCB, and DFKDA, which expect bit 0 to stay clear.
[E4] Page fail in interrupt instruction (IO Page Fail)
The KN10 implements the documented behavior for this, which
is to trigger an IO-Page-Fail interrupt rather than taking a page fail
trap. However, according to the diagnostic DFKEA, a real KL10 should
take the trap, contrary to the Processor Reference Manual (p.3-65).
It is unclear whether DFKEA's interpretation is correct or corresponds
to old versions of the KL10. In any case, a monitor should never let
this happen in the first place.
[E5] PXCT in non-zero section
The problem is that no one is sure any more exactly how PXCT
is *supposed* to work, or even how it *does* work on the KL10! The
original KN10 implementation conformed to the available
documentation, and passed the PXCT diagnostic DFKEC perfectly, but
caused page faults when used with real monitors and certain user
programs. The current modified implementation works for all TOPS-10
and TOPS-20 software tested to date, but now triggers two failure
cases in DFKEC.
CPU HARDWARE DIFFERENCES
========================
There are several things about the KL10 hardware that are not
implemented at all in the KN10, either because the features are
never used by a monitor or would be too impractical to implement.
Without going into unnecessary detail, here are the main items.
[C1] Interrupt Instructions - no BLKI, BLKO
Only JSR and XPCW are supported.
(plus AOSE, SKIPE, and JSP to keep diagnostics happy).
[C2] Interrupt Functions - only those needed are implemented.
[C3] CONI/CONO PI, - bits <18:20> not implemented.
The diagnostic DFKDA notices this.
[C4] No Cache
All of the "Sweep Cache" instructions are no-ops that merely
clear Sweep Busy and set Sweep Done. The cache strategy bits <18:19>
in a CONI/CONO PAG, are ignored.
[C5] No Address Break
DATAO APR, remembers the break information for a DATAI APR,
but the actual functionality is not implemented, and will probably
never be, for efficiency reasons.
The diagnostic DFKDA notices this.
[C6] Time Base doubleword - not updated except by RDTIME.
[C7] Interval Counter - not as precise.
[C8] No Execution Account counter
[C9] No Memory Account counter
[C10] No Performance Analysis counter
[C11] SBDIAG partially implemented
Only the SBDIAG functions necessary to keep the TOPS-10 and TOPS-20
monitors happy are implemented. The emulated machine pretends to
have a MF20 that responds to the entire range of 22-bit physical
memory (4096K).

93
doc/klt10.txt Normal file
View File

@@ -0,0 +1,93 @@
/* KLT10.TXT - KL TOPS-10 system startup on KLH10
*/
/* $Id: klt10.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 1997, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
[NOTE: Eventually this will describe how to install a TOPS-10 system
from an installation tape. For the time being it merely describes
startup using a ready-made filesystem that I may someday package
for distribution. Four monitors are included:
704NON.EXE - TOPS-10 V7.04 no network, won't try to load KLNI.
704DCN.EXE - TOPS-10 V7.04 with DECnet and LAT
704LAT.EXE - TOPS-10 V7.04 with just LAT (untested)
SYSTEM.EXE - TOPS-10 V7.04 for the KS.
You will need to specify an appropriate monitor from this list when
prompted by BOOT>.]
In the transcript that follows, all notes are prefaced by
triple semicolons (;;;), and user input is presented in lowercase
where possible -- note that the monitor sometimes echoes typein in
uppercase. Where there might be some confusion, a note such as "Type
CR" will identify what you need to type.
-----------------------------------------
;;; Here we go...
;;;
% ./kn10-kl klt10-img.ini ;;; Invoke KLH10
[usual output banners]
KLH10> ; KLH10 configuration for TOPS-10 test system
KLH10>
KLH10> ; DTE requires ackdly to avoid T10 race condition
KLH10> devdef dte0 200 dte master ackdly=5
KLH10> devdef rh0 540 rh20
KLH10> devdef rh1 544 rh20
KLH10> devdef dsk0 rh0.0 rp type=rp06 sn=4747 format=raw path=T10.RP06.0
KLH10> devdef dsk1 rh0.1 rp type=rp06 sn=1026 format=raw path=T10.RP06.1
KLH10> devdef mta0 rh1.0 tm02 type=TU77 fmtr=TM03
KLH10>
KLH10> ; NI: new param "c3dly" to see if it helps T10.
KLH10> ; NI: new param "rdtmo" to avoid system hangups with OSF/1 V3.0
KLH10> ;
KLH10> ; Decnet node TWONKY, 9.429
KLH10> devdef ni0 564 ni20 dedic=0 decnet=1 doarp=0 enaddr=aa:00:04:00:ad:25 dpdelay=12 c3dly=2 rdtmo=3
KLH10>
KLH10> load klboot.exe
Using word format "c36"...
Loaded "klboot.exe":
Format: DEC-PEXE
Data: 0, Symwds: 0, Low: 01000000, High: 00, Startaddress: 0703667 Entvec: 00 wds at 00
KLH10> [EOF on klt10-img.ini]
KLH10> go ;;; Type "go" to start KN10!
Starting KN10 at loc 0703667...
BOOT V4(100)
BOOT>704non ;;; Enter desired monitor, then CR
[Loading from DSKA:704NON.EXE[1,4]]
TOPS-10 704 No Network 11-Nov-93
Why reload: sa ;;; "sa" or whatever
Date: ;;; Just enter CR
Time: ;;; Just enter CR
Startup option: no ;;; Example; could say "go".
[Rebuilding the system search list from the HOM blocks]
[Rebuilding the active swapping list from the HOM blocks]
[Rebuilding the system dump list from the HOM blocks]
TOPS-10 704 No Network Thursday 24-Apr-97 3:00:25
.log 1,2/by ;;; Log in like this to bypass accting
Job 1 TOPS-10 704 No Network CTY
03:07 24-Apr-97 Thursday
. ;;; Ready to futz around...
;;; ... do whatever, then when OK to bring down:
.[HALTED: FE interrupt] ;;; Type ^\ (CTRL-\) to return to KLH10
KLH10> q ;;; OK to quit KLH10 now! TOPS-10 not fussy.
Are you sure you want to quit? [Confirm]
Shutting down...Bye!
% ;;; Back at unix shell prompt

628
doc/klt20.txt Normal file
View File

@@ -0,0 +1,628 @@
/* KLT20.TXT - KL TOPS-20 system installation on KLH10
*/
/* $Id: klt20.txt,v 2.5 2001/11/19 12:14:54 klh Exp $
*/
/* Copyright © 1997, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
Once you have installed the KLH10 binaries, you will need to
install a PDP-10 operating system on the KN10's virtual disks. This
file documents the basic procedure for TOPS-20 on a KL10B.
The TOPS-20 installation procedures are described in a Digital
document titled "TOPS-20 KL Model B Installation Guide", available
online as a file called "install.mem" from some sites. Some of the
steps on a KN10 (aside from the obvious lack of hardware) may be
different, however.
You will need an "installation" tape or tape image to get started, and
almost certainly will want to install the accompanying sources and
tools. You should already have a valid TOPS-20 license (personal or
otherwise) in order to use them.
These are the tapes containing the last known DEC TOPS-20 distribution
for the KL10B (DEC-2065), which was TOPS-20 V7.0:
BB-H137F-BM TOPS-20 V7.0 INSTL 16MT9
BB-EV83B-BM TCP/IP-20 V4.0 DISTR 16MT9
BB-H138F-BM T20 V7.0 DIST 16MT9 TAPE 1OF2
BB-LW55A-BM T20 V7.0 DIST 16MT9 TAPE 2OF2
BB-M780D-SM TOPS-20 V7.0 MONITOR SRC 16MT
BB-GS97B-SM TOPS-20 EXEC SRC 16MT9
BB-M080Z-SM T20 V7.0 #04 MON SRC MOD 16MT
BB-M081Z-SM T20 V7.0 #04 EXEC SRC MOD 16M
BB-PENEA-BM TOPS-20 V7.0 TSU04 TP 1 OF 2
BB-KL11M-BM TOPS-20 V7.0 TSU04 TP 2 OF 2
BB-M836D-BM TOPS-20 V7.0 TOOLS 16MT9
It should be possible to obtain these from www.trailing-edge.com. In
particular, start with the first of these, which is the installation
tape:
ftp://ftp.trailing-edge.com/pub/pdp10/bb-h137f-bm.tap.gz
The script that follows assumes you have uncompressed this into
"bb-h137f-bm.tap" in your $KLH10_HOME.
NOTE: the installation tape does not contain a TCP/IP monitor
image. Before you can use the network, you will need to also restore
the files from the tape "BB-EV83B-BM TCP/IP-20 V4.0 DISTR 16MT9"
(there was more than one version; only the latest has monitor
images).
In the transcript that follows, all notes are prefaced by triple
semicolons (;;;), and user input is presented in lowercase where
possible -- note that the monitor sometimes echoes typein in
uppercase. Where there might be some confusion, a note such as "Type
CR" will identify what you need to type.
=====================================================
QUICK SUMMARY:
$ ./kn10-kl inst-klt20.ini ;;; Configure and load tape bootstrap
KLH10> go
MTBOOT>/l ;;; Load rest of monitor
MTBOOT>/g143 ;;; Start at FS-creation entry point
;;; After quiets down, ^C to get MEXEC, and carry on
;;; After installation finished:
$ ./kn10-kl klt20.ini ;;; Configure and load disk bootstrap
KLH10> go
BOOT> ;;; Type CR to load and start MONITR.EXE
=====================================================
FULL SCRIPT:
;;; Here we go...
;;;
$ ./kn10-kl inst-klt20.ini ;;; You type this
KLH10 V2.0 beta (MyKL) built Nov 10 2001 02:14:29
Copyright © 2001 Kenneth L. Harrenstien -- All Rights Reserved.
This program comes "AS IS" with ABSOLUTELY NO WARRANTY.
Compiled for LINUX on I386 with word model USEHWD
Emulated config:
CPU: KL10-extend SYS: T20 Pager: KL APRID: 1
Memory: 8192 pages of 512 words (SHARED)
Time interval: INTRP Base: OSGET
Interval default: 60Hz
Internal clock: OSINT
Other: MCA25 JPC DEBUG PCCACHE CTYINT EVHINT
Devices: DTE RH20 RPXX(DP) TM03(DP) NI20(DP)
[MEM: Allocating 8192 pages shared memory, clearing...done]
KLH10> ; Sample KLH10.INI for initial installation
KLH10>
KLH10> ; Define basic device config - one DTE, one disk, one tape.
KLH10> ; Use two RH20s because TOPS-10 doesn't like mixing disk and tape on
KLH10> ; the same controller (TOPS-20 is fine).
KLH10>
KLH10> devdef dte0 200 dte master
KLH10> devdef rh0 540 rh20
KLH10> devdef rh1 544 rh20
KLH10> devdef dsk0 rh0.0 rp type=rp06 format=dbd9
[Creating RP06 disk file "RH20.RP06.1"]
KLH10> devdef mta0 rh1.0 tm03 type=tu45
KLH10>
KLH10> ; Need KLNI to avoid LAPRBF BUGCHKs - use valid address if known
KLH10> ;
KLH10> devdef ni0 564 ni20 ipaddr=10.0.0.51
KLH10>
KLH10> ; Mount installation tape (no ucode or boot to skip)
KLH10> devmount mta0 bb-h137f-bm.tap
Mount requested: "bb-h137f-bm.tap"
KLH10>
KLH10> ; Load tape bootstrap directly
KLH10> load mtboot.sav
Using word format "c36"...
Loaded "mtboot.sav":
Format: DEC-CSAV
Data: 4067, Symwds: 0, Low: 040000, High: 054641, Startaddress: 040000
Entvec: JRST (120 ST: 0, 124 RE: 0, 137 VR: 0,,0)
KLH10>
KLH10> ; Now ready to GO
KLH10> [EOF on inst-klt20.ini]
KLH10>
[mta0: Tape online] ;;; Init file now done.
KLH10> go ;;; Boot is loaded, type "go" to start KN10!
Starting KN10 at loc 040000...
BOOT V11.0(315)
MTBOOT>/l ;;; Type "/l" to load monitor
[BOOT: Loading] [OK]
MTBOOT>/g143 ;;; Now type "/g143" to start monitor
;;; at the filesystem-create entry address.
;;; Answer the following questions as shown,
;;; unless you know what you're doing.
[FOR ADDITIONAL INFORMATION TYPE "?" TO ANY OF THE FOLLOWING QUESTIONS.]
DO YOU WANT TO REPLACE THE FILE SYSTEM ON THE SYSTEM STRUCTURE? Y ;;;
DO YOU WANT TO DEFINE THE SYSTEM STRUCTURE? Y ;;;
HOW MANY PACKS ARE IN THIS STRUCTURE: 1 ;;;
ON WHICH "CHANNEL,CONTROLLER,UNIT" IS LOGICAL PACK # 0 MOUNTED? 0,-1,0 ;;;
DO YOU WANT THE DEFAULT SWAPPING SPACE? Y ;;;
DO YOU WANT THE DEFAULT SIZE FRONT END FILE SYSTEM? Y ;;;
DO YOU WANT THE DEFAULT SIZE BOOTSTRAP AREA? Y ;;;
DO YOU WANT TO ENABLE PASSWORD ENCRYPTION FOR THE SYSTEM STRUCTURE? Y ;;;
WHAT IS THE NAME OF THIS STRUCTURE? PS ;;;
[STRUCTURE "PS" SUCCESSFULLY DEFINED]
[PS MOUNTED]
?PS UNIT 0 HAS NO BAT BLOCKS.
DO YOU WANT TO WRITE A SET OF PROTOTYPE BAT BLOCKS? Y
%%NO SETSPD.
System restarting, wait...
DATE AND TIME IS: SATURDAY, 29-SEPTEMBER-2001 10:40PM
WHY RELOAD? NEW ;;; Type "new" or whatever.
PROBLEM WITH <SYSTEM>ACCOUNTS-TABLE.BIN
CANNOT FIND ERROR MESSAGE FILE - ACCOUNT VALIDATION IS DISABLED
RUNNING DDMP
NO SYSJOB
;;; Unless you have fixed up the NI20 definition
;;; in the klh10.ini file, you will probably see
;;; a few KNI BUGCHKs which are harmless at this
;;; point, such as the following:
********************
*BUGCHK "KNICFF" AT 29-SEP-2001 22:40:28
*PHYKNI - CANNOT RELOAD THE KLNI
*JOB: 0, USER: OPERATOR
*ADDITIONAL DATA: 600104
********************
;;; After you get "NO SYSJOB" you can type either
;;; a CR or ^C to get to the MEXEC prompt ("MX>").
NO EXEC
MX>GET FILE MTA0: ;;; Type just "g" then "mta0:" and CR.
? ;;; Monitor will read an EOF and do nothing.
MX>GET FILE MTA0: ;;; Repeat, to read EXEC.EXE from tape.
MX>START ;;; Type just "s" then CR.
TOPS-20 Command processor 7(4143)
@TER NO RAI ;;; Success! Let's stop uppercasing our input,
@ena ;;; and must get enabled.
$run mta0: ;;; Now read and start DLUSER.EXE from tape.
DLUSER>load mta0: ;;; Now read DLUSER data to set up directories.
DONE.
DLUSER>exit ;;; Get out.
$run mta0: ;;; Now read and start DUMPER.EXE from tape.
DUMPER>tape mta0: ;;; Point to tape drive and start restoring files!
;;; Note in the next command it is important to
;;; explicitly specify "<system>", otherwise the
;;; files will be restored into "<NEW-SYSTEM>".
DUMPER>restore <*>*.*.* (TO) <system>*.*.*
Saveset "SYSTEM Files for TOPS-20 V7.0" 22-Jun-88 2035
Loading files into PS:<SYSTEM>
End of Saveset.
Total files restored: 26
Total pages restored: 1765
;;; Note in the next command it is important to
;;; explicitly specify "<subsys>", otherwise the
;;; files will be restored into "<NEW-SUBSYS>".
DUMPER>restore <*>*.*.* (TO) <subsys>*.*.*
Saveset "SUBSYS Files for TOPS-20 V7.0" 22-Jun-88 2037
Loading files into PS:<SUBSYS>
End of Saveset.
Total files restored: 176
Total pages restored: 4535
;;; Note in the next command it is important to
;;; explicitly specify "<subsys>", otherwise it
;;; will try and fail to restore the files into
;;; "<GALAXY-SUBSYS>".
DUMPER>restore <*>*.*.* (TO) <subsys>*.*.*
Saveset "GALAXY SUBSYS Files for TOPS-20 V7.0" 22-Jun-88 2043
Loading files into PS:<SUBSYS>
End of Saveset.
Total files restored: 25
Total pages restored: 586
;;; The last saveset is optional and can be skipped.
;;; If you want the UETP stuff, do:
DUMPER>
DUMPER>restore <*>*.*.* (TO) <*>*.*.*
Loading files into PS:<UETP.LIB>
End of Saveset.
Total files restored: 54
Total pages restored: 477
DUMPER>exit ;;; Done, with or without UETP.
$conn <system>
$vdir ;;; Check out what we have in <SYSTEM>
PS:<SYSTEM>
2060-MONBIG.EXE.1;P777752 597 305664(36) 26-May-88 17:05:33 BROOKS
2060-MONMAX.EXE.1;P777752 597 305664(36) 26-May-88 17:28:27 BROOKS
7-PTYCON.ATO.1;P777752 1 823(7) 2-Jun-88 22:29:16 BROOKS
7-SETSPD.EXE.1;P777752 14 7168(36) 28-May-88 02:21:05 BROOKS
7-SYSJOB.EXE.1;P777752 7 3584(36) 28-May-88 03:11:07 BROOKS
.RUN.1;P777752 1 158(7) 2-Jun-88 21:41:35 BROOKS
BOOT.EXB.1;P777752 12 11658(18) 27-May-88 21:36:22 BROOKS
BUGS.MAC.1;P777752 155 395399(7) 23-May-88 18:14:48 BROOKS
BUGSTRINGS.TXT.1;P777752 22 54680(7) 26-May-88 17:28:13 BROOKS
CHECKD.EXE.1;P777752 22 11264(36) 27-May-88 21:42:19 BROOKS
ERRMES.BIN.1;P777752 24 12013(36) 28-May-88 01:48:31 BROOKS
EXEC.EXE.1;P777752 125 64000(36) 27-May-88 11:40:08 BROOKS
FEDDT.EXE.1;P777752 9 4608(36) 14-Feb-79 20:37:17 BROOKS
IPALOD.EXE.1;P777752 28 14336(36) 28-May-88 00:53:56 BROOKS
KNILDR.EXE.1;P777752 26 13312(36) 28-May-88 00:58:59 BROOKS
MTBOOT.EXB.1;P777752 11 10247(18) 27-May-88 21:37:31 BROOKS
PROGRAM-NAME-CACHE.TXT.1;P777752 1 78(7) 9-Mar-81 15:24:00 BROOKS
RP2DBT.EXB.1;P777752 18 17687(18) 27-May-88 21:38:15 BROOKS
RP2MBT.EXB.1;P777752 16 16276(18) 27-May-88 21:39:26 BROOKS
RSX20F.MAP.1;P777752 29 74007(7) 22-Mar-88 14:17:44 BROOKS
SYSJOB.HLP.1;P777752 3 5679(7) 29-Mar-82 15:47:02 BROOKS
SYSTEM.CMD.1;P777752 1 598(7) 24-Feb-84 20:01:23 BROOKS
TGHA.EXE.1;P777752 29 14848(36) 28-May-88 03:20:32 BROOKS
.HLP.1;P777752 1 214(7) 11-Nov-86 20:49:44 BROOKS
TOPS20.BWR.1;P777752 3 1425(36) 1-Jun-88 18:17:20 BROOKS
.DOC.1;P777752 13 6432(36) 21-Jun-88 15:25:11 LOMARTIRE
Total of 1765 pages in 26 files
$
$ ;;; For convenience, now is a good time to
;;; make MONITR.EXE be your desired monitor!
$renAME (EXISTING FILE) 2060-monbig.EXE.* (TO BE) monitr.exe
2060-MONBIG.EXE.1 => MONITR.EXE.1 [OK]
$^Ecease now ;;; OK, now we can try a disk boot.
TOPS20 Will be shut down IMMEDIATELY
[Confirm]
$
[Timesharing is over]
OPERATOR - Wait for the message "Shutdown complete" before
entering commands to PARSER.
Shutdown complete ;;; When you see this, type ^\ (CTRL-\)
[HALTED: FE interrupt] ;;; to return to KLH10
KLH10> shutdown ;;; Then give "shutdown" command.
Continuing KN10 at loc 01047523...
**HALTED**
[HALTED: Program Halt, PC = 1050257]
KLH10> q ;;; OK to quit KLH10 now!
Are you sure you want to quit? [Confirm]
Shutting down...Bye!
$ ;;; Back at unix shell prompt
$
$ ./kn10-kl klt20.ini ;;; Fire it up again, with different ini file
KLH10 V2.0 beta (MyKL) built Nov 10 2001 02:14:29
Copyright © 2001 Kenneth L. Harrenstien -- All Rights Reserved.
This program comes "AS IS" with ABSOLUTELY NO WARRANTY.
Compiled for LINUX on I386 with word model USEHWD
Emulated config:
CPU: KL10-extend SYS: T20 Pager: KL APRID: 1
Memory: 8192 pages of 512 words (SHARED)
Time interval: INTRP Base: OSGET
Interval default: 60Hz
Internal clock: OSINT
Other: MCA25 JPC DEBUG PCCACHE CTYINT EVHINT
Devices: DTE RH20 RPXX(DP) TM03(DP) NI20(DP)
[MEM: Allocating 8192 pages shared memory, clearing...done]
KLH10> ; Sample KLH10.INI for initial installation
KLH10>
KLH10> ; Define basic device config - one DTE, one disk, one tape.
KLH10> ; Use two RH20s because TOPS-10 doesn't like mixing disk and tape on
KLH10> ; the same controller (TOPS-20 is fine).
KLH10>
KLH10> devdef dte0 200 dte master
KLH10> devdef rh0 540 rh20
KLH10> devdef rh1 544 rh20
KLH10> devdef dsk0 rh0.0 rp type=rp06 format=dbd9
KLH10> devdef mta0 rh1.0 tm03 type=tu45
KLH10>
KLH10> ; Need KLNI to avoid LAPRBF BUGCHKs - use valid address if known
KLH10> ;
KLH10> devdef ni0 564 ni20 ipaddr=10.0.0.51
KLH10>
KLH10> ; Load disk bootstrap directly
KLH10> load boot.sav
Using word format "c36"...
Loaded "boot.sav":
Format: DEC-CSAV
Data: 4630, Symwds: 0, Low: 040000, High: 054641, Startaddress: 040000
Entvec: JRST (120 ST: 0, 124 RE: 0, 137 VR: 0,,0)
KLH10>
KLH10> ; Now ready to GO
KLH10> [EOF on klt20.ini]
KLH10> go
Starting KN10 at loc 040000...
BOOT V11.0(315)
BOOT> ;;; Type just CR, will default to MONITR.EXE
[BOOT: Loading] [OK]
[PS MOUNTED]
System restarting, wait...
DATE AND TIME IS: SATURDAY, 29-SEPTEMBER-2001 10:46PM
WHY RELOAD? NEW ;;; Or whatever reason you want
PROBLEM WITH <SYSTEM>ACCOUNTS-TABLE.BIN
CANNOT GET A JFN FOR <SYSTEM>ACCOUNTS-TABLE.BIN - ACCOUNT VALIDATION IS
DISABLED
RUN CHECKD? N ;;; Type "n". Shouldn't be necessary yet.
RUNNING DDMP
SYSJOB 7(78) STARTED AT 29-SEP-2001 2246
RUN SYS:INFO
RUN SYS:MAPPER
JOB 0 /LOG OPERATOR XX OPERATOR
ENA
^ESET LOGIN PSEUDO
^ESET LOGIN CONSOLE
^ESET OPERATOR
PTYCON
GET SYSTEM:7-PTYCON.ATO
/
SJ 0: @LOG OPERATOR OPERATOR
SJ 0: JOB 1 ON TTY172 29-SEP-2001 22:46:51, LAST LOGIN NEVER
SJ 0:
[dpni20: Using default interface "eth0"]
[KNILDR: LOADING MICROCODE VERSION 1(172) INTO ETHERNET CHANNEL 0
]
@ENA
SJ 0: $^ESET LOGIN PSEUDO
SJ 0: $^ESET LOGIN CONSOLE
SJ 0: $^ESET OPERATOR
SJ 0: $PTYCON
SJ 0: PTYCON> GET SYSTEM:7-PTYCON.ATO
SJ 0: PTYCON> SILENCE
SJ 0: PTYCON> W ALL
SJ 0: GAL(0) 2 OPERATOR EXEC TI 0:0:0
SJ 0: BAT(1) 3 OPERATOR EXEC TI 0:0:0
SJ 0: NEB(2) 4 OPERATOR EXEC TI 0:0:0
SJ 0: OPR(3) 5 OPERATOR EXEC TI 0:0:0
SJ 0: MAILS(4) 6 OPERATOR MX RN 0:0:0
SJ 0: PTYCON> CONN OPR
SJ 0: [CONNECTED TO SUBJOB OPR(3)]
;;; When things seem quiet, type CR to get an EXEC.
TOPS-20 Big System, TOPS-20 Monitor 7(21017)
@TER NO RAI
@log operator ;;; Try logging in, pwd "DEC-20"
Job 7 on TTY145 29-Sep-2001 22:47:24, Last Login 29-Sep-2001 22:46:57
@ena
$ ;;; Now do whatever you wish...
=====================================================
Other things you probably want to do at some point:
$copy tty: monnam.txt ;;; Set the system name
MyKL TOPS-20 System
^Z
$copy tty: 4-1-config.cmd ;;; Set timezone here for now
timezone 8
^Z
$^Ecreate <operator> ;;; Change operator password
$$password tqbfjotld ;;; (use something better)
$$
$^Ecreate <me> ;;; Create your account
$$password nittfagmtc2taotp ;;; (or something better)
$$wheel
$$working 10000
$$permanent 10000
$$
$
There are large manuals devoted to TOPS-20 system maintenance, but
this is enough to make you dangerous.
TOPS-20 TCP/IP INSTALLATION
===========================
This aspect is probably the one that many KLH10 users will be
most interested in. Unfortunately I ran out of time to provide a full
script, but this should be enough to get you going:
(1) Install all of the V7 install tape (as above)
(2) Restore all files from the following tape:
BB-EV83B-BM TCP/IP-20 V4.0 DISTR 16MT9
This one is a pain, because the DLUSER.DAT on the install tape doesn't
set up the necessary directories beforehand, so you will have to create
them all by hand (make sure they are files-only!).
(3) Assign a valid IP address for your system, if you don't already have
one. This should be something consistent with your physical subnet.
(4) Create the file <SYSTEM>INTERNET.ADDRESS with either an editor or
a COPY from the TTY:, in the following format (replacing the
"192 168 0 201" with your desired IP address):
$vd internET.*.*
PS:<SYSTEM>
INTERNET.ADDRESS.1;P777752 1 57(7) 5-Oct-2001 22:06:55 OPERATOR
$ty internET.ADDRESS.1
IPNI#0,192 168 0 201,PACKET-SIZE:1500,DEFAULT,PREFERRED
$
Keep the packet size at 1500. I found it set to 1504 once and
that was breaking things.
(4) Now reboot, with this devdefine added to your KLH10 config file:
devdef ni0 564 ni20 ipaddr=192.168.0.201
(Again, use your correct IP address here)
(5) Manually specify this to the BOOT> prompt:
<NEW-SYSTEM>AN-MONMAX
Or you can just copy or rename that file to <SYSTEM>MONITR.EXE to
make it the default.
(6) After system comes up, telnet in from ANOTHER machine. Depending on
your platform it's unlikely you will be able to telnet in from the
same host that the emulator is running on, unless you are using
a separate dedicated interface.
If this succeeds, take a break and have a <favorite beverage here>.
(7) About now you will start to get really annoyed by periodic bleats that
look like this:
SJ 0: [SCHEDULER]: Waiting for UPS:
SJ 0: **** OPR(3) 22:18:48 ****
SJ 0: **** MAILS(4) 22:19:48 ****
This can be permanently turned off by removing its invocation from
the 7-PTYCON.ATO startup file, but a good temporary fix is simply
to kill the offending job.
Do a SYS to find the job called MX, then forcibly log it out:
$sys
Fri 5-Oct-2001 23:05:45 Up 0:53:26
0+8 Jobs Load av 0.03 0.03 0.03
Job Line Program User Origin
1 206 PTYCON OPERATOR
2 207 EXEC OPERATOR
3 210 EXEC OPERATOR
4 211 EXEC OPERATOR
5 212 EXEC OPERATOR
6 213 MX OPERATOR
7* 205 SYSTAT OPERATOR
8 270 EXEC OPERATOR 192.168.0.33(TCP)
$
$logo 6
User OPERATOR on TTY213, running MX
[Confirm]
$
TOPS-20 TCP/IP - OTHER NOTES
============================
These are miscellaneous notes from my files. I have not verified
whether they apply to the vanilla DEC TCP/IP system.
SYSTEM:KNILDR.EXE -- utility that can be used to restart the NI20.
The useful commands are "HALT 0" and "START 0" which will stop and
start the KLNI in case something went wrong during startup (timing
races) or the KLH10 DPNI20 subprocess needs to be replaced with a new
version without bringing the system down. Run this from the console,
or you'll saw off the branch you're sitting on.
---- SYSTEM:INTERNET.ADDRESS -----
---- Read on system startup; no provision I can see for re-reading any
other time.
;;;Internet addresses for system
IPNI#0, 16 151 16 13,DEFAULT,PREFERRED,PACKET-SIZE:1504
---- SYSTEM:INTERNET.GATEWAYS -----
---- Read on system startup, also with "^Einit gateways"
; IP addresses of local prime gateway; if only one, not clear if
; its args matter, but provide something plausible.
PRIME 192 33 33 3, 128 18 1 1
---- SYSTEM:HOSTS.TXT -----
---- Read on system startup, also with "^Einit hosts"
; Arbitrarily long, but basically defines local nets and hosts
; we need to know about in absence of DNS (CHIVES) info.
---- SYSTEM:HOSTNAME.TXT -----
---- Can't find anything in the monitor that reads this file, but this
---- should be similar to MONNAM.TXT except for containing the FULL domain
---- name of the system. E.g.:
BOOTSTRAP.SRI.COM
---- SYSTEM:MONNAM.TXT -----
---- Now *this* definitely is read on system startup.
BOOTSTRAP
---- SYSTEM:INTERNET-ETHERNET-MAPPINGS.BIN
---- Read on system startup; can also be reloaded by running IPHOST
with a command (ETHER INIT?)
This is apparently generated by the IPHOST program using the
command BUILD, which takes SYSTEM:INTERNET-ETHERNET-MAPPINGS.TXT
and translates it into .BIN.
TXT file format *appears* to be:
HOST xx-xx-xx-xx-xx-xx ddd.ddd.ddd.ddd [/ARP] [/NOARP]
BIN file format is documented in ANAUNV.MAC.
Current file is basically empty, contains one zero entry;
apparently this just makes everything use ARP.
---- SYSTEM:NETSRV.RUN -----
---- File of NETSRV commands, executed by NETSRV.EXE (started by SYSJOB)
This basically determines what TCP/IP servers will be started.
Note: NETSRV is not a DEC program; it is one of many non-DEC utilities
produced by the ARPANET user community, in this case Mark Crispin
and Kevin Paetzold.
---- SYS:FTSCTT.EXE -----
---- In a vanilla DEC setup this is the FTP server program. You can
put the line "RUN SYS:FTSCTT" in <SYSTEM>7-SYSJOB.RUN to start it
up automatically. You may also want to set the protection of
FTPSRT.EXE from 777700 to 777752 to allow general use.
---- System:INTERNET-LOGIN-MESSAGE.TXT -----
---- Contains initial login banner presented to users. May be a feature
of the SRI-NIC EXEC only.
General stuff, not network specific:
SYSTEM:7-CONFIG.CMD
File of commands for SYSTEM:SETSPD.EXE, which is executed by
monitor at startup (prior to running SYSJOB).
SYSTEM:SYSJOB.RUN
File of commands for SYSTEM:SYSJOB.EXE, which is also run by
monitor at startup.

81
doc/ksits.txt Normal file
View File

@@ -0,0 +1,81 @@
/* KSITS.TXT - KS ITS system installation on KLH10
*/
/* $Id: ksits.txt,v 2.4 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 1999, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
This is mainly a placeholder until distribution issues are resolved
for the starter ITS file system copy.
The run/ksits directory contains the boot files developed for the
Public ITS project, which had 3 systems called PI, DU, DX. These are
for PI:
klh10-pi.ini - KLH10 configuration for PI.
@.its-647pi-u - ITS. Normally you would just load this.
@.ddt-u - DDT stand-alone.
@.nsalv-260-u - SALV stand-alone. Start at 200000 !!
itsbin.647pi-u - ITS binary, without DDT or SALV.
Note: All binaries by default are in U36 format, as opposed
to the C36 format of all other KN10 configurations.
Eventually I hope to be able to distribute the actual filesystem image
as well, and then will include a large bunch of stuff containing
nearly everything I've discovered or written about ITS software
porting issues, machine names and addresses, dumps, utilities, bug
fixes, etc.
THE FIRST TIME
==============
Once you have installed the binaries per install.txt in a $KLH10_HOME
corresponding to an instance of run/ksits (don't forget to make
dpimp setuid root, or run as root) it should work to just do:
./kn10-ks klh10-kn.ini ;;; or whichever system you prefer)
[gubbish]
KLH10> go
After the dust settles, type ^Z.
The first time, ITS will complain that the time is not known.
Run PDSET.
To correctly set the date in the new millenium, you must use the
undocumented command "C", as in "20C".
-------------------------------------------------
pdset^K(Please Log In) ;;; or :pdset
!
___002 PDSET IOTLSR
PDSET.114
Please don't use this program unless you know how.
You are certain to break something if you happen to hit the wrong key.
Type Control-Z to exit, or ? for a reminder of the commands.
20C ;;; You type "20C"
011110D ;;; You type YYMMDD and D. YY=01 for 2001.
131012T ;;; Ditto for time, HHMMSS and T.
!. ;;; Finish with "!."
141425/ 765361,,514221 763707,,355545 ___002
IT IS NOW 1:10:12 PM EST, SATURDAY, NOV 10,2001
IT IS NOW 1:10:14 PM EST, SATURDAY, NOV 10,2001
Q ;;; Get out with "Q"
:KILL
*
-------------------------------------------------
From here on, ITS should always know the time. If it ever gets totally
out of whack, delete the file $KLH10_HOME/APR.TIMEBASE and reboot,
running PDSET again.

16
doc/kst10.txt Normal file
View File

@@ -0,0 +1,16 @@
/* KST10.TXT - KS TOPS-10 system startup on KLH10
*/
/* $Id: kst10.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
[NOTE: Eventually this will describe how to install a KS TOPS-10 system
from an installation tape. For the time being, see
klt10.txt instead.]

587
doc/kst20.txt Normal file
View File

@@ -0,0 +1,587 @@
/* KST20.TXT - KS TOPS-20 system installation on KLH10
*/
/* $Id: kst20.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
This file contains several sections:
KS TOPS-20 INSTALLATION (including tape and disk boot scripts)
KS T20 BOOT BUG NOTES
KS T20 MONITOR BUG
KS TOPS-20 INSTALLATION
=======================
Once you have installed the KLH10 binaries, you will need to
install a PDP-10 operating system on the KN10's virtual disks. This
file documents the basic procedure for TOPS-20 on a KS10 (2020).
Although the TOPS-20 installation procedures were certainly listed
somewhere in Digital's documentation, I'm not sure what references to
provide; they may be difficult or impossible to find. In any case,
some of the steps on a KN10 will be different.
(NB: the field service documentation files "red20.hlp" and "red20.mem"
helped me, but they were not intended for customers.)
You will need an "installation" tape or tape image to get started, and
almost certainly will want to install the accompanying sources and
tools. You should already have a valid TOPS-20 license (personal or
otherwise) in order to use them.
These are the tapes containing the last known DEC TOPS-20 distribution
for the KS10 (DEC-2020), which was TOPS-20 V4.1:
BB-D867E-BM TOPS-20 V4.1 2020 INSTL 16MT9 1983
BB-D868E-BM T-20 V4.1 2020 DIST 16MT9 1/2 1983
BB-V895A-BM T-20 V4.1 2020 DIST 16MT9 2/2 1983 ("1/9/85")
BB-J710B-BM TOPS-20 V4.1 TOOLS 16MT9 1983 ("3/27/85")
Tops-20 V4.1 TP#12 "Exec Src Mod" Gidney TU78 21-Nov-85
Tops-20 V4.1 TP#12 "Monitor Sources" Gidney TU78 21-Nov-85
It should be possible to obtain these from www.trailing-edge.com. In
particular, start with the first of these, which is the installation
tape:
ftp://ftp.trailing-edge.com/pub/pdp10/bb-d867e-bm_tops20_v41_2020_instl.tap.gz
The script that follows assumes you have uncompressed this into the
somewhat more manageable name of "bb-d867e-bm.tap" in your $KLH10_HOME.
In the transcript that follows, all notes are prefaced by triple
semicolons (;;;), and user input is presented in lowercase where
possible -- note that the monitor sometimes echoes typein in
uppercase. Where there might be some confusion, a note such as "Type
CR" will identify what you need to type.
=====================================================
QUICK SUMMARY:
$ ./kn10-ks inst-kst20.ini ;;; Configure and load tape bootstrap
;;; (normally smmtbt-k.sav, entry 40000)
KLH10> go
MTBOOT>/l ;;; Load rest of monitor
MTBOOT>/g143 ;;; Start at FS-creation entry point
;;; (/g147 if a filesystem already exists)
;;; After quiets down, ^C to get MEXEC, and carry on
;;; After installation finished:
$ ./kn10-ks klh10.ini ;;; Configure and load disk bootstrap
KLH10> go
BOOT> ;;; Type CR to load and start MONITR.EXE
=====================================================
FULL SCRIPT:
;;; Here we go...
;;;
$ ./kn10-ks inst-kst20.ini ;;; You type this
KLH10 V2.0 beta (MyKS) built Nov 10 2001 02:14:29
Copyright © 2001 Kenneth L. Harrenstien -- All Rights Reserved.
This program comes "AS IS" with ABSOLUTELY NO WARRANTY.
Compiled for LINUX on I386 with word model USEHWD
Emulated config:
CPU: KS10 SYS: T20 Pager: KL APRID: 759
Memory: 1024 pages of 512 words (SHARED)
Time interval: INTRP Base: OSGET
Interval default: 60Hz
Internal clock: OSINT
Other: JPC DEBUG PCCACHE CTYINT IMPINT EVHINT
Devices: RH11 RPXX(DP) TM03(DP)
[MEM: Allocating 1024 pages shared memory, clearing...done]
KLH10> ; This is a sample KLH10 config file for a KS10 running TOPS-20.
KLH10>
KLH10> ; Define basic KS10 device config - two RH11s each on its own Unibus
KLH10>
KLH10> devdef rh0 ub1 rh11 addr=776700 br=6 vec=254
KLH10> devdef rh1 ub3 rh11 addr=772440 br=6 vec=224
KLH10>
KLH10> ; Provide one disk, one tape in config T20 expects
KLH10>
KLH10> devdef dsk0 rh0.0 rp type=rp06 format=dbd9 path=T20-RP06.0-dbd9 iodly=0
KLH10> [dprpxx: WARNING! sigpend 37, 40, 43, 44, 45, 46, 47, 48, 49, 63]
[Creating RP06 disk file "T20-RP06.0-dbd9"]
devdef mta0 rh1.0 tm03 fmtr=tm03 type=tu45
KLH10>
KLH10> ; Mount installation tape, skipping past ucode and defective boot
KLH10> devmount mta0 bb-d867e-bm.tap fskip=2
Mount requested: "bb-d867e-bm.tap"
[dptm03: WARNING! sigpend 33, 35, 37, 39, 40, 42, 44, 46, 48, 50, 63]
KLH10>
[mta0: Tape online]
KLH10> ; Load fixed tape bootstrap directly
KLH10> load smmtbt-k.sav
Using word format "c36"...
Loaded "smmtbt-k.sav":
Format: DEC-CSAV
Data: 1017, Symwds: 0, Low: 040000, High: 044010, Startaddress: 040000
Entvec: JRST (120 ST: 0, 124 RE: 0, 137 VR: 0,,0)
KLH10>
KLH10> ; Now ready to GO
KLH10> [EOF on inst-kst20.ini] ;;; Init file now done.
KLH10> go ;;; Boot is loaded, type "go" to start KN10!
Starting KN10 at loc 040000...
MTBOOT>/l ;;; Type "/l" to load monitor
MTBOOT>/g143 ;;; Now type "/g143" to start monitor
uba_read: Bad unibus IO addr: 760540 ;;; KN10 reports probes of non-ex
uba_read: Bad unibus IO addr: 760010 ;;; devices; these are harmless.
[FOR ADDITIONAL INFORMATION TYPE "?" TO ANY OF THE FOLLOWING QUESTIONS.]
DO YOU WANT TO REPLACE THE FILE SYSTEM ON THE PUBLIC STRUCTURE? Y
DO YOU WANT TO DEFINE THE PUBLIC STRUCTURE? Y
HOW MANY PACKS ARE IN THIS STRUCTURE: 1
ON WHICH "CHANNEL,UNIT" IS LOGICAL PACK # 0 MOUNTED: 0,0
DO YOU WANT THE DEFAULT SWAPPING SPACE? Y
DO YOU WANT THE DEFAULT SIZE FRONT END FILE SYSTEM? Y ;;; Unnec but OK
DO YOU WANT THE DEFAULT SIZE BOOTSTRAP AREA? Y
[STRUCTURE "PS" SUCCESSFULLY DEFINED]
[PS MOUNTED]
?PS UNIT 0 HAS NO BAT BLOCKS.
DO YOU WANT TO WRITE A SET OF PROTOTYPE BAT BLOCKS? Y
uba_read: Bad unibus IO addr: 775400
uba_read: Bad unibus IO addr: 777160
%%NO SETSPD
System restarting, wait...
ENTER CURRENT DATE AND TIME: 30-SEP-2001 0605 ;;; Must enter time, sigh
YOU HAVE ENTERED SUNDAY, 30-SEPTEMBER-2001 6:05AM,
IS THIS CORRECT (Y,N) Y
WHY RELOAD? NEW ;;; Type "new" or whatever.
<SYSTEM>ACCOUNTS-TABLE.BIN NOT FOUND - ACCOUNT VALIDATION IS DISABLED
uba_read: Bad unibus IO addr: 760540
RUNNING DDMP
NO SYSJOB
;;; After you get "NO SYSJOB" you can type either
;;; a ^C to get to the MEXEC prompt ("MX>").
NO EXEC
MX>GET FILE MTA0: ;;; Type just "g" then "mta0:" and CR.
INTERRUPT AT 0 ;;; Monitor will read an EOF and do nothing.
MX>GET FILE MTA0: ;;; Repeat, to read EXEC.EXE from tape.
MX>START ;;; Type just "s" then CR.
TOPS-20 Command processor 5.1(1354)
@TER NO RAI ;;; Success! Let's stop uppercasing our input,
@ena ;;; and must get enabled.
$run mta0: ;;; Now read and start DLUSER.EXE from tape.
DLUSER>load mta0: ;;; Now read DLUSER data to set up directories.
DONE.
DLUSER>exit ;;; Get out.
$run mta0: ;;; Now read and start DUMPER.EXE from tape.
DUMPER>tape mta0: ;;; Point to tape drive and start restoring files!
;;; Note in the next command it is important to
;;; explicitly specify "<system>", otherwise the
;;; files will be restored into "<NEW-SYSTEM>".
DUMPER>restore <*>*.*.* (TO) <system>*.*.*
DUMPER tape # 1, "SYSTEM files for TOPS-20 V4.1", Thursday, 7-Apr-83 17
21
Loading file(s) into PS:<SYSTEM>
End of saveset
;;; Note in the next command it is important to
;;; explicitly specify "<system>", otherwise the
;;; files will be restored into "<NEW-SYSTEM>".
DUMPER>restore <*>*.*.* (TO) <subsys>*.*.*
DUMPER tape # 1, "SUBSYS files for TOPS-20 V4.1", Thursday, 7-Apr-83 17
23
Loading file(s) into PS:<SUBSYS>
End of saveset
;;; The last saveset is optional and can be skipped.
;;; If you want the UETP stuff, do:
DUMPER>restore <*>*.*.* (TO) <*>*.*.*
DUMPER tape # 1, "UETP files for TOPS-20 V4.1", Thursday, 7-Apr-83 1726
Loading file(s) into PS:<UETP.LIB>
End of saveset
DUMPER>exit ;;; Done, with or without UETP.
$conn <system>
$vdir ;;; Check out what we have in <SYSTEM>
PS:<SYSTEM>
2020-ARPA-MONMED.EXE.1;P777700 321 164352(36) 6-Apr-83 00:28:29 PURRET
TA
2020-ARPA-MONSML.EXE.1;P777700 321 164352(36) 6-Apr-83 00:24:37 PURRET
TA
2020-MONMED.EXE.1;P777700 326 166912(36) 5-Apr-83 23:37:27 PURRETTA
2020-MONSML.EXE.1;P777700 326 166912(36) 5-Apr-83 23:34:00 PURRETTA
4-1-SETSPD.EXE.1;P777700 10 5120(36) 7-Dec-82 16:19:35 PURRETTA
BUGS.MAC.1;P777700 50 127461(7) 10-Nov-82 23:09:16 PURRETTA
BUGSTRINGS.TXT.1;P777700 10 24240(7) 6-Apr-83 00:28:24 PURRETTA
CHECKD.EXE.1;P777700 17 8704(36) 7-Dec-82 16:53:16 PURRETTA
DUMP.EXE.1;P777700 1025 524800(36) 13-Feb-80 17:44:06 PURRETTA
ERRMES.BIN.1;P777752 16 7717(36) 20-Dec-82 16:18:48 PURRETTA
ERROR.SYS.1;P777752 1 23(36) 30-Sep-2001 06:05:03 OPERATOR
EXEC.EXE.1;P777752 102 52224(36) 1-Dec-82 02:17:14 PURRETTA
FTPSER.EXE.1;P777700 17 8704(36) 15-Apr-82 10:14:40 PURRETTA
GALAXY.BWR.1;P777700 2 818(36) 20-Dec-82 16:40:58 PURRETTA
.DOC.1;P777700 3 1402(36) 14-Jan-83 22:30:20 WING
HSTNAM.TXT.1;P777700 4 9974(7) 12-Aug-82 14:36:51 PURRETTA
KS10.RAM.1;P777700 12 6144(36) 20-May-82 10:46:56 PURRETTA
.ULD.1;P777700 42 21186(36) 1-Mar-82 16:27:00 PURRETTA
MTBOOT.RDI.1;P777700 6 3072(36) 20-May-82 10:47:30 PURRETTA
NETSRV.RUN.1;P777700 1 234(7) 3-Nov-81 16:32:05 PURRETTA
PROGRAM-NAME-CACHE.TXT.1;P777700 1 78(7) 9-Mar-81 15:24:00 PURRETTA
PTYCON.ATO.1;P777700 1 333(7) 29-Mar-82 15:46:43 PURRETTA
REAPER.CMD.1;P777700 1 537(7) 22-Aug-79 19:53:37 PURRETTA
SMBOOT.EXE.1;P777700 3 1175(36) 13-May-82 12:17:47 PURRETTA
SMFILE.EXE.1;P777700 42 21504(36) 19-Feb-79 15:58:00 PURRETTA
.HLP.1;P777700 1 163(36) 19-Feb-79 15:42:00 PURRETTA
SMMTBT.EXE.1;P777700 3 1030(36) 13-May-82 12:18:15 PURRETTA
SYSJOB.EXE.1;P777700 7 3584(36) 20-Dec-82 17:43:24 PURRETTA
.HLP.1;P777700 3 5679(7) 29-Mar-82 15:47:02 PURRETTA
.RUN.1;P777700 1 340(7) 29-Mar-82 15:46:54 PURRETTA
SYSTEM.CMD.1;P777700 1 725(7) 8-May-79 14:46:35 PURRETTA
TOPS20.BWR.1;P777700 6 2669(36) 6-Apr-83 16:12:07 PURRETTA
.DOC.1;P777700 3 1255(36) 6-Apr-83 16:04:44 PURRETTA
Total of 2685 pages in 33 files
$ ;;; For convenience, now is a good time to
;;; make MONITR.EXE be your desired monitor!
$ren 2020-monmed.EXE.* (TO BE) monitr.exe
2020-MONMED.EXE.1 => MONITR.EXE.1 [OK]
$^Ecease +1 ;;; OK, now we can try a disk boot.
[System going down in one minute!!]
$ ;;; It really does take a minute. Patience...
[System down]
Shutdown complete ;;; When you see this, type ^\ (CTRL-\)
[HALTED: FE interrupt] ;;; to return to KLH10
KLH10> shutdown ;;; Then give "shutdown" command.
Continuing KN10 at loc 03...
**HALTED**
[HALTED: Program Halt, PC = 10754]
KLH10> q ;;; OK to quit KLH10 now!
Are you sure you want to quit? [Confirm]
Shutting down...Bye!
$ ;;; Back at unix shell prompt
$ ./kn10-ks kst20.ini ;;; Fire it up again, with different ini file
KLH10 V2.0 alpha (MyKS) built Sep 30 2001 05:01:44
Copyright © 1992-2001 Kenneth L. Harrenstien -- All Rights Reserved.
Proprietary and Confidential; the copyright notice does not indicate
actual or intended publication.
This software is provided under a license agreement described by the
accompanying file "LICENSE". USE OF THIS SOFTWARE CONSTITUTES
ACCEPTANCE OF THE TERMS OF THE LICENSE AGREEMENT.
This program comes "AS IS" with ABSOLUTELY NO WARRANTY.
Compiled for LINUX on I386 with word model USEHWD
Emulated config:
CPU: KS10 SYS: T20 Pager: KL APRID: 759
Memory: 1024 pages of 512 words (SHARED)
Time interval: INTRP Base: OSGET
Interval default: 60Hz
Internal clock: OSINT
Other: JPC DEBUG PCCACHE CTYINT IMPINT EVHINT
Devices: RH11 RPXX(DP) TM03(DP)
[MEM: Allocating 1024 pages shared memory, clearing...done]
KLH10> ; This is a sample KLH10 config file for a KS10 running TOPS-20.
KLH10>
KLH10> ; Define basic KS10 device config - two RH11s each on its own Unibus
KLH10>
KLH10> devdef rh0 ub1 rh11 addr=776700 br=6 vec=254
KLH10> devdef rh1 ub3 rh11 addr=772440 br=6 vec=224
KLH10>
KLH10> ; Provide one disk, one tape in config T20 expects
KLH10>
KLH10> devdef dsk0 rh0.0 rp type=rp06 format=dbd9 path=T20-RP06.0-dbd9 iodly=0
KLH10> [dprpxx: WARNING! sigpend 37, 40, 43, 44, 45, 46, 47, 48, 49, 63]
devdef mta0 rh1.0 tm03 fmtr=tm03 type=tu45
KLH10>
KLH10> ; Define HOST device hackery if monitor supports it
KLH10> ;devdef idler 700 host
KLH10>
KLH10> ; For convenience, load up disk bootstrap
KLH10> load smboot-k.sav
Using word format "c36"...
Loaded "smboot-k.sav":
Format: DEC-CSAV
Data: 1162, Symwds: 0, Low: 040000, High: 044010, Startaddress: 040000
Entvec: JRST (120 ST: 0, 124 RE: 0, 137 VR: 0,,0)
KLH10> [EOF on kst20.ini] ;;; Init file now done.
KLH10> go ;;; Boot is loaded, type "go" to start KN10!
Starting KN10 at loc 040000...
BOOT> ;;; Type just CR, will default to MONITR.EXE
uba_read: Bad unibus IO addr: 760540
uba_read: Bad unibus IO addr: 760010
[PS MOUNTED]
uba_read: Bad unibus IO addr: 775400
uba_read: Bad unibus IO addr: 777160
System restarting, wait...
ENTER CURRENT DATE AND TIME: 30-SEP-2001 0611 ;;; Must enter time AGAIN!
YOU HAVE ENTERED SUNDAY, 30-SEPTEMBER-2001 6:11AM,
IS THIS CORRECT (Y,N) Y
WHY RELOAD? OTHER
<SYSTEM>ACCOUNTS-TABLE.BIN NOT FOUND - ACCOUNT VALIDATION IS DISABLED
RUN CHECKD? Y ;;; "Y" for first time is good idea
[CHECKING FILE CONSISTENCY]
[WORKING ON STRUCTURE - PS:]
LOCAL COUNT OF FILE PAGES: 8035
LOCAL COUNT OF OVERHEAD PAGES: 5402
LOCAL COUNT OF USED PAGES: 13437
SYSTEM COUNT BEFORE CHECKD: 13437
SYSTEM COUNT AFTER CHECKD: 13437
THERE ARE NO LOST PAGES.
********************
*BUGINF "UXXFIT" AT 30-SEP-2001 06:11:10
*CHECKPOINT FILE NOT IN CORRECT FORMAT FOR THIS SYSTEM, REBUILDING...
*JOB: 0, USER: OPERATOR
********************
uba_read: Bad unibus IO addr: 760540
RUNNING DDMP
SYSJOB 5(20) STARTED AT 30-SEP-2001 0611
RUN SYS:ORION
RUN SYS:QUASAR
RUN SYS:MOUNTR
RUN SYS:INFO
RUN SYS:MAILER
RUN SYS:MAPPER
RUN SYS:LPTSPL
RUN SYS:LPTSPL
RUN SYS:CDRIVE
RUN SYS:SPRINT
JOB 0 /LOG OPERATOR XX OPERATOR
ENA
^ESET LOGIN PSEUDO
^ESET LOGIN CONSOLE
^ESET OPERATOR
PTYCON
GET SYSTEM:PTYCON.ATO
/
JOB 1 /LOG OPERATOR XX OPERATOR
ENA
RUN SYS:BATCON
/
SJ 0: @LOG OPERATOR OPERATOR
SJ 1: @LOG OPERATOR OPERATOR
SJ 0: JOB 1 ON TTY43 30-SEP-2001 06:11:20
SJ 0: @ENA
SJ 0: $^ESET LOGIN PSEUDO
SJ 0: $^ESET LOGIN CONSOLE
SJ 0: $^ESET OPERATOR
SJ 0: $PTYCON
SJ 1: JOB 2 ON TTY44 30-SEP-2001 06:11:21
SJ 1: @ENA
SJ 1: $RUN SYS:BATCON
SJ 0: PTYCON> GET SYSTEM:PTYCON.ATO
SJ 0: PTYCON> SILENCE
[From OPERATOR on line 45 to all: SYSTEM IN OPERATION]
SJ 0: PTYCON.LOG.1
SJ 0: PTYCON> W ALL
SJ 0: OPR(0) 3 OPERATOR OPR TI 0:0:0
SJ 0: PTYCON> CONN OPR
SJ 0: [CONNECTED TO SUBJOB OPR(0)]
;;; When things seem quiet, type CR to get an EXEC.
TOPS-2020 MEDIUM SYSTEM, TOPS-20 Monitor 4.1(5471)
@TER NO RAI
@log operator ;;; Try logging in, pwd "DEC-20"
Job 4 on TTY42 30-Sep-2001 06:11:53
@ena
$ ;;; Now do whatever you wish...
=====================================================
Other things you probably want to do at some point:
$copy tty: monnam.txt ;;; Set the system name
MyKS TOPS-20 System
^Z
$copy tty: 4-1-config.cmd ;;; Set timezone here for now
timezone 8
^Z
$^Ecreate <operator> ;;; Change operator password
$$password tqbfjotld ;;; (use something better)
$$
$^Ecreate <me> ;;; Create your account
$$password nittfagmtc2taotp ;;; (or something better)
$$wheel
$$working 10000
$$permanent 10000
$$
$
There are large manuals devoted to TOPS-20 system maintenance, but
this is enough to make you dangerous.
KS T20 BOOT BUG NOTES
=====================
BOOT
----
The magtape bootstrap source is BOOT.MAC, which was still used
to build both KL and KS bootstraps as of V4.1 of TOPS-20 (but at some
point thereafter, and certainly as of V6.0, there were big changes --
the KS code no longer exists in the last TOPS-20 BOOT.MAC).
For the KS10, BOOT is assembled into either SMBOOT.EXE (for
booting from disk) or SMMTBT.EXE (for booting from tape), both in
CSAVE format. There is also SMBOOT.I?? which is SMBOOT.EXE converted
into FE-loadable format, which the KLH10 does not use.
Unfortunately the KS10 BOOT cannot be used as-is without either
patching it or playing tricks in the emulator. It has at least
three bugs:
[1] The most serious is the following:
40120/ J3+6/ WRCSTM [77B5]
should be: WRCSTM [77B5]-ENT(16)
(or better yet set up with a MOVSI 1,770000 ? WRCSTM 1)
This fails because at the time it is executed it has been
moved into high core and the literal is no longer at that
address! It ends up loading the CST mask with 0 which
causes an infinite page failure loop when the code turns
paging on for the first time.
It is not clear how a real KS10 managed to get past this bug.
For now, this has been patched:
40120/ 702540,,40127 => 702540,,774127
(Start address remains 40000.)
[2] In the code starting at FNDDEV there is the instruction
SETZM KLIOWD (zeros loc 35, KLINIK output word)
which causes a page trap because at this point page 0 is unmapped.
This instruction should either be done before turning paging on,
or after low pages have been mapped.
It was probably never noticed because the page fault handler
merely continues at .+1.
[3] The disk bootstrap (SMBOOT) also has a bug of its own:
CHKCHN: CAIG P,MAXCHN1 (CAIG 17,2)
should be: CAIG P1,MAXCHN-1 (CAIG 10,1)
Note there are two independent typo bugs in that one instruction!
Geez. First, the compare to P instead of P1 is clearly wrong.
Second, MAXCHN1 is undefined; the assembler does not distinguish
symbols beyond the first 6 characters so MAXCHN is silently being
used, with a value of 2. This causes the loop to check 3 channels
(0,1,2) but only 2 channels are provided for in the RH11CH table!
Trying to check the 3rd channel results in referencing the wrong
words of a valid channel, or worse.
This probably worked in real life because the first RH11
always existed and was always used for the boot.
For now, this has been patched:
SMMTBT: 41335/ 307740,,2 => 307400,,1
SMBOOT: 41441/ 307740,,2 => 307400,,1
FIXED VERSIONS
--------------
The patched versions of these binaries have been dumped out as:
SMBOOT: smboot-k.sav (c36 CSAVE format)
SMMTBT: smmtbt-k.sav (c36 CSAVE format)
MONITOR BOOT BUG
----------------
There is a T20 monitor bug with the G/143 boot code that
prevents simply loading monitr.exe directly into the KLH10 and
starting it.
When the monitor gets around to executing its first PXCT at
KISLOD+2 to set up the user ACs, it actually clobbers its own ACs.
The reason for this is that no WRUBR was ever done to set the
previous-context AC block; the emulator initializes both contexts to
AC block 0. Several WRUBRs have been executed prior to this, but none
of them ever set the AC block fields. One of them (at PGRON+3)
doesn't even set the base address either; they mostly seem to be used
as the CLHWPT macro to clear the cache and paging hardware, and refer
to an argument of KIPGW0 or KIPGWD which in the source (APRSRV.MAC)
don't have the set-ac-block flag set.
This appears to have worked in the past because BOOT, which
is expected to load monitr.exe, has already set the previous-context-AC
block to 6.
For now, this can be avoided by always using SMBOOT or SMMTBT.
One solution would be for the KLH10 FE to provide a "monitor load"
command that did this previous-context AC block setting (and any other
setup that might be found necessary) in addition to doing a normal
binary load.
KS T20 MONITOR BUG
------------------
There seems to be a timing race condition when outputting to
the CTY. Normally the KLH10 responds instantly to a KS->FE interrupt
request by gobbling a valid output char and sending a FE->KS interrupt.
This causes output to wedge after the first bufferful until another
FE->KS interrupt is given.
This happens because of the code in the tty driver that
tries to turn interrupts off and then on while initiating output of the
first char. It actually doesn't do any good and the entire buffer is
emptied at interrupt level before the first call returns!
KS T20 MONITOR SOURCE GLITCH
----------------------------
My copy of the "Monitor Sources" tape has a bad record data
header which resulted in problems with the "sources.cmd" file; it
either has its last page clobbered or has 444 zero words appended.
Shoppa's copy may not have this problem. Fortunately it isn't
an essential file.

39
doc/news.txt Normal file
View File

@@ -0,0 +1,39 @@
/* NEWS.TXT - KLH10 Change Summaries and other news
*/
/* $Id: news.txt,v 2.1 2001/11/19 12:13:12 klh Exp $
*/
/* Copyright © 2001 Kenneth L. Harrenstien
** All Rights Reserved.
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
KNOWN BUGS
==========
Still outstanding:
- KS TOPS-10 7.03 install from tape periodically hangs on MT.
- KS TOPS-10 7.03 disk boot produces:
KLH10 PANIC: rh11_iobeg: drv/ctrlr mismatch: 7/0
(Of course, this will never be a complete list!)
KLH10 CHANGES
=============
KLH10 2.0A: 19-Nov-2001
- Revised ARP code in dpimp.c to fix problems with Linux port;
ITS networking now supported on Linux!
- Cleaned up Solaris port. Two Makefiles now provided, one for
GCC and the other for SUN C. Compiles and runs, but actual network
operation not yet verified.
- Fixed bug with writing TPS format tape images (caught by John Wilson).
- Added "port-ks" target to Makefile to help porters.
KLH10 2.0: 10-Nov-2001
Initial Distribution release.

311
doc/usage.txt Normal file
View File

@@ -0,0 +1,311 @@
/* USAGE.TXT - KLH10 Usage Instructions
*/
/* $Id: usage.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 1994-1999, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
This file provides basic pointers for using the KLH10.
See "install.txt" for information on installing and configuring the KLH10.
KLH10 STARTUP:
You should not start the KLH10 unless you have installed it in
its "home directory" and are connected to that directory (see the file
"install.txt" if necessary). Then simply give the following shell
command:
% klh10
The KLH10 will start up, allocate and clear KN10 memory, and begin
reading commands from the default file "klh10.ini". If you wish to
use a different init file, you can specify it on the command line, for
example:
% klh10 test.ini ; Use "test.ini" instead of "klh10.ini"
% klh10 /dev/null ; Use nothing
Or you can simply edit or delete "klh10.ini" itself.
KLH10 COMMAND PARSER:
After starting the KLH10 you will be talking to the command
parser. This serves a function very similar to that of the RSX20F
PARSER front-end program for a real KL10. However, the KLH10 commands
are nothing like PARSER commands. For a list of the commands, see
the files "cmdsum.txt" and "cmdref.txt".
Normally the only reason you will be talking to the command
parser is to get the KN10 configured, load a bootstrap program, and
start it; from there on you interact only with the KN10. This can all
be done automatically by commands in the "klh10.ini" file, and it is
highly advisable to at least configure the KN10 devices this way,
using the information in "install.txt".
KLH10 BOOTSTRAPPING:
The KLH10 is capable of loading PDP-10 binary files directly
into its KN10 memory with the "load" command. The KLH10 uses the
native OS filesystem as its "front-end filesystem", and does not
require a special area on a virtual disk. Ordinarily you will use
this capability to load a PDP-10 bootstrap program, which when started
will then load either the TOPS-10 or TOPS-20 monitor. For example:
KLH10> load boot.exe
will load "boot.exe" from the native filesystem, producing this output:
Using word format "c36"...
Loaded "boot.exe":
Format: DEC-CSAV
Data: 4630, Symwds: 0, Low: 040000, High: 054641, Startaddress: 040000
Entvec: JRST (120 ST: 00, 124 RE: 00, 137 VR: 0,,0)
KLH10>
Once the bootstrap is loaded, you can start it by giving the
"go" command:
KLH10> go
Starting KN10 at loc 040000...
BOOT V11.0(315)
BOOT>
And from this point on, you are talking to the PDP-10 software, and the
remaining procedures for bringing up the monitor should be the same as
for a real system. In particular, typing CR should spur the bootstrap
into loading and starting the default of <SYSTEM>MONITR.EXE.
Note that there are two TOPS-20 boot programs included with
the KLH10 distribution: "boot.exe" which boots from disk, and
"mtboot.exe" which boots from tape. There is also a TOPS-10 boot
program, "klboot.exe". These are exact copies of the Digital
bootstraps by those names, provided only as a convenience to users who
already have a TOPS-10 or TOPS-20 license.
The details of a complete boot and filesystem rebuild from
tape, using "mtboot.exe", are too intricate for a few paragraphs.
Suffice to say here that once you get to the BOOT> prompt of MTBOOT,
you can proceed just as for a real KL10, with the exception that
building a "front-end filesystem" area is not necessary. See the file
"klt20.txt" for an example of a TOPS-20 system installation.
KLH10 COMMANDS vs KN10 EXECUTION:
It is very important to understand that the KLH10 is always
doing only one of two things. It is either reading and executing
commands typed to it, or it is running the KN10 which is executing
PDP-10 instructions. There is no way to enter KLH10 commands without
temporarily suspending KN10 execution.
While the KLH10 is reading commands, nothing else is
happening, and your typein is seen only by the KLH10 command parser.
The KN10 does not run until you give an explicit command to start or
resume execution.
While the KN10 is running, your typein is seen only by the
PDP-10, as CTY input. You can return to the KLH10 command parser at
any time by typing the command escape character (^\, CONTROL-\, ASCII
"FS", octal 034), which suspends KN10 execution. Control also returns
to the command parser if the KN10 halts for any reason.
Future versions of the KLH10 may allow concurrent execution so
that KLH10 commands can be given while the KN10 continues to run,
similar to the way a real KL system works with its front-end PDP-11
independent of the KL10 CPU. For now, simplicity is stability.
STOPPING THE KLH10:
Normally, you will be running a PDP-10 monitor. Bring it down
as you would for a real KL10, except that at the point where you type
^\ to return to the RSX20F PARSER, instead you are returned to the
KLH10 command parser and the KN10 is stopped. You can give the
"shutdown" command, which deposits -1 in location 30 and continues
the KN10; this should cause the monitor to execute a HALT instruction,
which returns control back to the KLH10 command parser.
You can then give the "quit" command (which asks for
confirmation) to leave the KLH10 program completely. This command
performs essential cleanups of the various device processes and shared
memory areas, and should always be done.
Alternatively, if the monitor is wedged or you don't care
about the PDP-10 filesystem consistency, you can blow everything away
immediately by returning to the command parser with ^\ and using "quit"
right away.
A word about restarting. Although it may work to use "reset"
and then load the PDP-10 bootstrap in order to restart a monitor without
actually quitting the KLH10 program, this is not recommended; it is much
safer to quit entirely and invoke the KLH10 again from scratch.
IF THE KLH10 CRASHES:
If the KLH10 process dies accidentally or is killed in any way
other than via the "quit" command, then you will probably find some
leftover device processes (DPs) littering your host system. If this
happens, you can clean up as follows:
Use the shell command "ps ax" (on Solaris, "ps -eaf") to find
the processes.
They will be called "dprpxx", "dptm03", or "dpni20".
You will notice a -DPM:<#> argument to the DP; this
identifies the shared memory segment ID it's using.
Kill each DP with "kill <pid>" where <pid> is the process ID.
Find the active shared memory segments with "ipcs".
Those with segment IDs belonging to the killed processes
(the numbers in the -DPM: args)
must be flushed; use "ipcrm -m <#>" for each one.
Yes, this is tedious, isn't it? Blame AT&T SYSV's moronic IPC
facilities. And next time, use "quit" if you can...
RUNNING THE KLH10 IN BACKGROUND MODE:
As of V1.1 the emulator can now be run as a background process, which
for example makes it possible to start it up automatically, without
manual intervention, whenever the hardware system is rebooted.
This feature is very simple but has the disadvantage that once the
background process has started, you cannot talk to the emulator's CTY.
The procedure is as follows:
(1) Create a klh10.ini file for monitor auto-start, perhaps distinguishing
it with a different filename such as klh10.ini-q.
The exact details will vary depending on the monitor; for TOPS-20
an auto-start can be done as follows:
KLH10>load boot.exe
KLH10>dep 0 400000,,0
KLH10>go 40001
(2) Invoke the KLH10 using the "-background" switch and auto-start
initialization file, with output redirected to a log file, and
running in the background.
Examples:
Bourne Shell (/bin/sh):
$ ./klh10 -background klh10.ini-q > logfile 2>&1 &
C Shell (/bin/csh, /bin/tcsh, etc):
% ./klh10 -background klh10.ini-q >& logfile &
Note and remember the process ID that the shell prints out, for use
when bringing the system/emulator down.
In order to bring down the system and emulator when running in the
background:
(1) Bring down the monitor in the usual way (e.g. on TOPS-20 you
would use the ^ECEASE command).
(2) Find the process ID of the emulator if you didn't already note it,
by using "ps".
(3) Terminate the emulator by sending a SIGTERM signal, e.g.
% kill <pid>
Check the log file to make sure that everything went OK. This file
simply records all output to the emulated CTY. If you wish to observe
it while the emulator is running, do "tail -f logfile".
Again, UNIX unfortunately provides no mechanism for re-attaching a
terminal to a background process, so there is currently no way to provide
input to the emulated CTY in this situation. Eventually this feature
will be provided by a front-end daemon that can be connected to at will.
USING VIRTUAL TAPES:
A useful feature of the KLH10 is its "virtual tape" mechanism,
which allows PDP-10 programs to believe they are reading and writing
magtapes when in fact they are merely doing I/O to a disk file in the
native filesystem. This is very fast and convenient.
Unfortunately, the process of "mounting" and "unmounting" virtual
tapes is not as convenient as it should be, and is the major interface
quirk that remains to be fixed. What follows documents the current
procedure, warts and all. This should be read in conjunction with the
descriptions of DEVMOUNT and DEVUNMOUNT in the "cmdref.txt" file, as
well as "vtape.txt" for further details.
To CREATE a virtual tape, use the DEVMOUNT command with the
name of a non-existent file and the parameter MODE=CREATE
(or just "RW"; for the full list of parameters see cmdref.txt).
When done writing and reading the tape, use DEVUNMOUNT to
"unmount" it from the virtual drive and finalize the tape file(s).
To READ an existing virtual tape, use DEVMOUNT with the
filename of the existing tape file; it will default to MODE=READ
which will make the drive appear to be write-locked.
For safety, the tape code will not allow you to mount an existing
virtual tape for writing (a mode known as "update"). If you try to do
this, you will see something like the following:
@[HALTED: FE interrupt] ; ^\ typed at T20 EXEC
KLH10> devmount mta0 klhbackup rw ; Try to mount existing tape
DPTM03: vmt_xmount: Tape file "klhbackup" already exists
[dptm03: Couldn't mount read/write virtual tape: klhbackup]
Mount requested: "klhbackup"
KLH10>
Note that the command parser doesn't have a clean way to know if the
mount request succeeded or failed; it can only say that a request was
made. Any failure or success reports come directly from the tape device.
USING HARDWARE TAPES:
The KLH10 has the capability of using physical ("hard") tape
drives to read and write actual, not virtual, tapes. Normally a hard
mount will be made at the time the tape device is first defined with
DEVDEFINE, but it is also possible to use DEVMOUNT to change this
later.
Usage is the same as for virtual tapes, except that in the DEVMOUNT
command, the option "hard" must be specified:
@[HALTED: FE interrupt]
KLH10> devmo mta0 /dev/rmt0a hard
Mount requested: "/dev/rmt0a"
KLH10>
Do NOT use either the block (/dev/mt0a) or non-rewind (/dev/nrmt0a)
forms of the physical device pathnames. No other options are
recognized when "hard" is set; they will be ignored. In particular,
"ro" has no effect, because the binding established by a hard mount is
between the KN10 device and an external device, not between the KN10
and a particular tape. In order to write-lock physical types, you
must use their physical write-lock mechanism.
In general physical tapes can be loaded and unloaded from the drive
manually and all should operate as if the drive was a real TU45, TU77,
or whatever. My favorite example of this is the "UNLOAD" command in
the TOPS-20 EXEC, which will eject the physical tape if the host
system supports that capability.
An error message will be printed if any problem is detected; for
example, the following can happen if the drive is powered off:
@[HALTED: FE interrupt]
KLH10> devmo mta0 /dev/rmt0a hard
Mount requested: "/dev/rmt0a"
KLH10> [dptm03: Cannot mount device "/dev/rmt0a": I/O error]
KLH10>
When using hardware drives, there may be some lag between the time of
physical events (like going offline or online) and the time the KN10
finds out about the new status. This is primarily due to the overly
thick insulation that the native OS interposes between the KN10 and
the actual hardware.

245
doc/utils.txt Normal file
View File

@@ -0,0 +1,245 @@
/* UTILS.TXT - KLH10 Utilities
*/
/* $Id: utils.txt,v 2.2 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
This file attempts to provide a quick guide to the various utility
programs provided with this Distribution (or its Auxiliary
Distribution). There are no man pages nor GnuEmacs INFO files.
In rough order of utility:
wxtest - Test word10.h macros (used only to verify build configuration)
wfconv - 36-bit Word File conversion
tapedd - Tape copy & conversion (real or virtual)
vdkfmt - Virtual Disk initialization and conversion
enaddr - Ethernet interface configuration
read20 - (TOPS-20) Read & extract DUMPER format tapes & tape images
uexbconv - (TOPS-20) Convert .EXB files to .SAV format
udlconv - (ITS) Convert Alan's DIR.LIST into an ITSDUMP virtual tape
supdup - (ITS) SUPDUP client and server for Unix
More details, in alphabetical order:
ENADDR
------
Usage: enaddr [-v] [<ifc> [default | <ifaddr>] [+<addmcast>] [-<delmcast>]]
-v Outputs debug and config info for all interfaces
<ifc> Specific interface to read or modify
default Reset ether addr to HW default, if known
<ifaddr> Set ether addr to this (form x:x:x:x:x:x)
+<mcast> Add multicast addr (same form)
-<mcast> Delete multicast addr (same form)
This program exists primarily to help test and verify the
operation of some basic osdnet.c code while porting. In theory it is
not needed to run a correctly configured KN10 if the osdnet.c
implementation is correct, but is provided as a utility because its
manual functions have been useful in the past, especially when getting
non-IP protocols like DECNET to work.
This can be built individually with "make enaddr".
READ20
------
Usage: read20 [switches] [patterns]
Switches must be separated.
Patterns are simple substrings of the filenames to select.
-f <file> Specify tapefile. '-' uses stdin. Default is /dev/rmt8
-x Extract files
-t List contents (one of -t or -x must be given)
-tl Show tape locations in listing
-S <n> Only process saveset <n>
-e <regexp> Only process filenames matching <regexp> (one -e only)
-F <n> ... Only process files numbered <n> ...
-V Show FDB info for files extracted or listed
-s <loc> Start reading at this byte loc in tapefile (seeks)
-q Say using QIC (1/4") cartridge tape
-v Verbose feedback
-g Keep generation # in extracted filename
-n <n> Use numeric filenames for extracts, starting with <n>
-W Treat all files as 36-bit. Otherwise, 7-bit files
are treated as ascii, 8-bit as 8-bit binary, and
all others as 36-bit (direct copy of tape data).
-T Treat 0 or 36-bit files as 7-bit ascii
-B Treat 0 or 36-bit files as 8-bit binary
-c Keep CRs in CRLF pairs for ascii files
-d<n> Debug level (>0,>5,>10,>99) (default 0)
This program is part of the Auxiliary Distribution and the
source lives in the "contrib" directory. It appears to have
originated with Jim Guyton and was further modified by Jay Lepreau,
Charles Hedrick, Stu Grossman, and possibly others before undergoing a
substantial upgrade by Ken Harrenstien. Other versions may still
exist.
READ20 is used to list and extract files on Unix from a TOPS-20 DUMPER
tape image. This can be either a real tape, read directly as a
sequence of records, or a virtual tape image using the KLH10 RAW
format. It does NOT directly handle any other virtual tape formats,
but could do so indirectly by using the TAPEDD utility as an input
filter.
No Makefile is provided; just compile read20.c with your
favorite C invocation and install the binary. e.g.
cc -O -o read20 read20.c
SUPDUP
------
This is of interest mainly to ITS users. SUPDUP is a protocol
similar to TELNET which was primarily supported by ITS. However, at
least one Unix server was written.
This program is part of the Auxiliary Distribution and the
source lives in the "contrib" directory. It was originally written
by David Bridgham and modified by a few people since then.
I have only used the client program from this package, not the server.
You will have to hope that the Makefile included with it works for you,
or modify it to suit.
TAPEDD
------
Usage: tapedd <params>
itX=<path> (Required) Input Tape device, where 'X' is optional
drive spec: (defaults to 'h')
h - Half-inch magtape drive (default)
q - QIC (quarter-inch cartridge) drive
8 - 8mm drive
4 - 4mm DAT drive
vF - Virtual tape & drive, where 'F' is optional
format spec: (defaults based on file extension)
r - Raw format, paired with control file
s - TPS format
e - TPE format
c - TPC format
i - (read-only) ITS DUMP tapedir
otX=<path> (Required) Output Tape device, X as above
{i,o}c=<path> alternate tape Control file (old id=,od=)
{i,o}f=<path> alternate raw data file
{i,o,}bs=<n> Block size (record length)
log=<path> Log filespec (defaults to stderr)
rskip=<#> Skip # input records
fskip=<#> Skip # input files/tapemarks
rcnt=<#> Max # records to write
Fcnt=<#> Max # files/tapemarks to write
peot Use physical EOT, ignore logical EOT (double tapemark)
test Parse control file, output result to stdout
verbose Verbose
TAPEDD is a tape version of DD, used to copy magtapes.
Normally it will convert them from one format to another in the
process; for example, from a physical magtape to a virtual tape image,
in a variety of formats.
This can be built individually with "make tapedd".
UDLCONV
-------
Usage: ./udlconv [switches] < DIR.LIST > DIR.tpk
-p <prefixpath> - Prefix this path to all host filenames
This is of interest only to ITS users.
Standard input is assumed to be a DIR.LIST file from Alan Bawden's ITS
archives. The resulting standard output is a tape-control (.tpk) file
in ITSDUMP format, suitable for mounting as a virtual tape.
The reason this is far preferable to unpacking the files and FTPing them
into ITS is because this method preserves all of the available file
meta-information (symlinks, creation timestamps, authors, etc).
Note that the output can be fed into TAPEDD to generate a tape image
in some other format, if desired.
This can be built individually with "make udlconv".
UEXBCONV
--------
Usage: uexbconv [-v] < infile.exb > outfile.sav
(input file must be in core-dump (C36) format, as the
output file will be.)
The KL10 FE is a PDP-11 that stores its PDP-10 binaries,
particularly the bootstraps "boot.exe" and "mtboot.exe", in a format
called "RSX-BINARY". These files sometimes exist on the KL filesystem
with the extension .EXB.
The KL10 program RSXFMT.EXE converts from .SAV to .EXB but does not
furnish the opposite conversion; hence this utility, which was used to
obtain some of the KL10 bootstrap images.
This can be built individually with "make uexbconv".
VDKFMT
------
Usage: vdkfmt <params>
ip=<path> Input disk device/file:
op=<path> Output disk device
ifmt=<fmt> format of input pack data
ofmt=<fmt> format of output pack data
dt=<type> Type of drive (RP06, etc)
log=<path> Log filespec (optional, defaults to stderr)
verbose Verbose (optional)
This utility is similar to TAPEDD; it is used to copy virtual
disk images from one format to another. It is rarely needed, but a
lifesaver when it is.
This can be built individually with "make vdkfmt".
WFCONV
------
Usage: wfconv -io <infile >outfile
where 'i' and 'o' are chars specifying the input and output formats:
c - Core-dump (std tape format, 4 8-bit, 1 4-bit bytes = 36 bits)
h - High-density (FTP 36-bit image, 9 8-bit bytes = 72 bits)
a,7 - Ansi-Ascii (4 7-bit, 1 8-bit byte = 36 bits)
s,6 - Sixbit (6 6-bit bytes = 36 bits)
u - Unixified (Alan Bawden format, various = 36 bits)
t - Text-Newline (CRLF-NL conversion; 5 7-bit bytes = 35 bits ONLY)
d - Debug (output only - show word values)
D - Debug (like -d with offsets)
Note: EOF on input always zero-pads up to a PDP-10 word boundary.
This is one of the handiest utilities, used to convert PDP-10
word data from one representation to another. No filenames are given;
it always reads from standard input and writes to standard output.
The format names are similar to those for magtape formats.
This can be built individually with "make wfconv".
WXTEST
------
Usage: wxtest -[qvh]
-q Quiet
-v Verbose
-h Help (this stuff)
This "utility" is actually a diagnostic used to verify that a
particular port configuration is correctly defining the macros used to
manipulate PDP-10 words. While most people will never need to worry
about such things, this is an extremely useful regression test when
porting to a new machine architecture or trying out a new method of
representing a PDP-10 word.
This can be built individually with "make wxtest".

493
doc/vtape.txt Normal file
View File

@@ -0,0 +1,493 @@
/* VTAPE.TXT - KLH10 Virtual Tape Format
*/
/* $Id: vtape.txt,v 2.3 2001/11/10 21:24:21 klh Exp $
*/
/* Copyright © 1994-1999, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
*/
One of the methods used by the KLH10 to emulate PDP-10
magnetic tape devices is to provide support for "virtual tapes".
These virtual tapes are in reality disk files on the native host
system which have a specific format. Because they are native disk
files, it is far easier and faster to manipulate these virtual tape
images (for reading, writing, copying, archival, and transport over
networks) than would be the case for real physical tapes.
The purpose of this description is to allow users to generate or
maintain virtual tapes using their own tools in addition to the ones
provided in the KLH10 distribution. In most cases these tools can be
nothing more than a text editor and a simple copy program such as Unix
"dd".
VIRTUAL TAPE FORMATS
====================
Several virtual tape formats exist, developed more or less
independently. The KLH10 software can handle most of them and others
could be added if necessary. These formats are:
"RAW" - original KLH10 format
"TPS" - Wilson & Supnik format
"TPC" - DECUS/Shoppa format
"ITSDUMP" - special KLH10 format for ITS
"RAW" VIRTUAL TAPE: Directory and Data files
==================
Each RAW-format virtual tape consists of two native files, one
for the actual tape data and the other to describe that data. For
example, a virtual tape with the name "kosh" would consist of these
two files:
Virtual tape "kosh":
kosh - Tape directory (text; defines structure of data)
kosh.tap - Tape data (binary; one byte per tape frame)
"RAW" DATA FILE FORMAT (.TAP)
The tape data file is simply a continuous sequence of 8-bit bytes
corresponding to the logical stream of 8-bit tape data frames. There is
nothing in this file except tape data; there are no record boundaries or
tapemarks. Because this is a binary data file, all operations on this
file must preserve the data exactly.
"RAW" DIRECTORY FILE FORMAT (.TDR)
The tape directory is a text file that describes the contents of
its associated tape data file; it defines how the tape is structured in
terms of record boundaries, tapemarks, length, and internal format. It
can be used to describe anything about the tape in an easily readable
and editable form.
The directory is formatted as a set of logical text lines. Each
line begins with a keyword, optionally followed by data. Comments are
introduced by a semi-colon character (';') and continue to the end of
that physical line. Blank lines are ignored. Whitespace is also
ignored except at the start of a line, where indentation may be used
only when continuing a logical <filedesc> line over several physical
lines.
Keywords:
TF-Format: <fmtword> [<filename>]
; Tape datafile format and optional filename
<#>: <filedesc> ; File/Record descriptors
<indentation> <filedesc> ; optional continuation of above
EOT: ; Physical End of Tape, remaining text ignored.
<fmtword> - REQUIRED. Describes how the tape file data is stored on
disk. Currently only one keyword is fully supported:
"raw" - 8-bit bytes, one per frame.
<filename> - DEPRECATED. Optional name of tape data file, a feature
no longer used (ie ignored on input, not generated on output).
The tape data filename is either specified at mount time or
dynamically generated using ".tap" as an extension to the name of
the tape directory file. This extension replaces ".tdr" if it
exists, otherwise ".tap" is simply appended.
<#> - location in data file of 1st record beginning next file. For "raw"
format this corresponds to the logical frame # on tape as well, but
for other formats this may serve a realignment purpose.
The string "BOT" is considered equivalent to "0".
<filedesc> - a list of <recdesc> record descriptors composing the file,
separated by whitespace. The list may be empty, as is normally
the case for two consecutive tapemarks that signal a logical EOT.
<recdesc> - A record descriptor, with the format
<len>[*<cnt>][E[<type>]]
where:
<len> - decimal record length, in frames (8-bit bytes)
<cnt> - # times this record length recurs.
E - indicates error when reading this record (or the last of a
series). <type> is an optional # and specifies additional
information, if any, as to nature of the error.
The string "EOF" is a special <recdesc> that signals a tape mark.
TAPE DIRECTORY EXAMPLE:
Here is an example of a tape directory file for a small dump:
; DUMPER saveset of PS:<SYSTEM> ; Human-readable comment
TF-Format: raw ; Required, and must be "raw"
0: 2590*8407 EOF ; First file
21774130: EOF ; Second file (empty == logical EOT)
EOT: ; Physical EOT
Note that comments can exist, that the data file format is RAW, and
that it starts at frame 0 with a 2590-byte record which is repeated
8407 times, followed by an EOF tapemark, then another EOF tapemark.
The emulator software generates the second EOF using a new line so
that the tape location (21774130) can serve as a validity cross-check;
this is a compromise between putting everything on a single line or
putting each record on its own line, either of which is equally valid.
"TPS" FILE FORMAT (.TAP, .TPS, .TPE)
====================================
This is the format used by Bob Supnik's SIMH emulators. It is
almost the same as John Wilson's E11 format, which it was intended to
resemble.
A TPS file is assumed to consist of 8-bit bytes.
Each record starts with a 4-byte header in little-endian order.
The high bit of this 32-bit header is set to indicate an error of
some kind (similar to the 'E' flag in a RAW-format control file) and
the remaining 31 bits contain the record length N.
This header is followed by N data bytes plus, if N is odd, a padding
byte (of undefined value) at the end. Following this is a copy of the
4-byte record header.
Tapemarks are represented by a single header with N=0.
The reason for having the record length both before and after the
record data is so tape motion in the reverse direction can be more
easily simulated.
The E11 (.TPE) format is identical except there are no padding bytes.
"TPC" FILE FORMAT (.TPC)
========================
This format is not as flexible as the others but was
apparently quite commonly used for DECUS tape images, and Tim Shoppa
has a "couple thousand" TPC images stashed away.
A TPC file is assumed to consist of 8-bit bytes.
Each record starts with a 2-byte header in little-endian order,
containing 16 bits of record length N.
This header is followed by N data bytes plus, if N is odd, a padding
byte (of undefined value) at the end. Unlike TPS format, there is no
trailing header.
Tapemarks are represented by a single header with N=0.
Obviously it is difficult to use this format directly when reverse
tape motion is desired; an internal representation must be built.
TAPE GENERATION
There are three principal ways to create virtual tapes:
(1) Using the emulator to write tapes.
(2) Copying from real PDP-10 tapes.
(3) Creating synthesized tapes "by hand".
TAPE GENERATION [1]: Using the emulator
=======================================
Method [1] is described in the documentation for the emulator
proper; see the section "Using Virtual Tapes" in USAGE.TXT.
TAPE GENERATION [2]: Copying a real tape
========================================
This is likely to be the most common use of virtual tapes for a
new installation. This is also the only way to move data in and out of
a virtual system if there is no network support.
The simplest method for copying a real tape is to use the TAPEDD utility
provided with the emulator, as follows:
<Mount the physical tape on a drive such as /dev/rmt0a>
% tapedd it=/dev/rmt0a otv=kosh
This will copy the tape into a virtual tape named "kosh" with whatever
extension is appropriate for the format. Note that the TAPEDD
arguments have a form similar to that of the standard Unix DD utility,
but are not the same. Invoking TAPEDD without arguments will cause it
to list the possible options, most of which are never needed.
If you want to copy a virtual tape back onto a physical tape, then
the counterpart to the above command would be:
% tapedd itv=kosh ot=/dev/rmt0a
If for some reason TAPEDD is not available or you want to build a virtual
tape that isn't a direct copy of an existing physical tape, you will need
to get your hands dirty with method [3].
TAPEDD allows specifying the virtual tape format with a letter following
the "v". For example:
% tapedd it=/dev/rmt0a otvs=kosh
will copy a tape into a TPS format file called "kosh.tps".
TAPE GENERATION [3]: Creating a synthesized tape
================================================
One of the primary reasons for implementing virtual tapes as a
RAW-format pair of files (data and directory) was to simplify the
process of creating and managing these tapes by hand in an extremely
portable way, without using any special software tools.
To generate the tape directory file, all you need is a text editor.
To generate the tape data file, normally it suffices to use the Unix
utility "dd" or equivalent device-to-device copying program. You simply
need to append every byte of tape data into a sequential binary file.
For example, the tape data file corresponding to the sample tape
directory above could have been read with a command like this:
% dd if=/dev/rmt0a of=kosh.tap bs=126b
0+8407 records in
0+8407 records out
Note that to use this technique properly you must have some prior
knowledge of the record sizes on the tape. For one thing, the blocksize
specified must be larger than the largest possible record size, to avoid
record truncation (hence the bs=126b); but more importantly, without
knowing the record size you don't know what to put in the tape directory
(TDR) file. In this case, we know that TOPS-20 DUMPER records are <518
words * 5 bytes/word> = 2590 bytes and so the appropriate <recdesc> is
2590*8407. But if the records were of different lengths then DD
provides no way for you to tell what these lengths were; this is one
reason TAPEDD is easier.
[Aside: TOPS-20 DUMPER could actually use a blocking factor of up to 15,
so that records could be 15*518*5 = 38850 bytes long, but for virtual
tapes the blocking is irrelevant and a factor of 1 always works for
DUMPER.]
To read multiple files from a tape using DD you must use a non-rewind
device specification, such as "/dev/nrmt0a", and invoke DD once for
each file. Remember to insert "EOF"s at appropriate places in the
descriptor file.
Although there is an UNIX utility called READ20 that can extract
native files from TOPS-20 DUMPER format tapes (real or virtual), there
is currently none for the inverse operation. In order to transport
native files into the virtual system without a network, pretty much
your only option is to synthesize a virtual tape where the contents
are simple data files.
WFCONV is a handy utility included with the emulator that will help
prepare such files. It acts as a conversion filter, copying the
standard input to the standard output and converting the data from one
PDP-10 tape format to another. In order to fully understand why this is
needed, you need to understand something about PDP-10 tape formats; for
now, just note the following examples, and see the appendix for details.
Example 1: transferring an ASCII text file:
# Make NL -> CRLF and convert into core-dump format
% wfconv -tc > temp.tap
# Find size of file
% ls -l temp.tap
-rw-rw-r-- 1 klh klh10 18641 Apr 1 1994 temp.tap
# Use size to compute number of 512-byte records
# 18641/512 = 36, plus leftover record of 209
% cat > temp
TF-Format: raw
0: 512*36 209 EOF EOF ; 36 records plus a short 37th
EOT:
^D
%
;; Then in TOPS-20 after mounting the tape "temp":
;; Note default format is CORE-DUMP, default reclen is 512.
@copY (FROM) mta0: (TO) temp.txt
MTA0: => TEMP.TXT.1 [OK]
@vd temp.txt
PS:<OPERATOR>
TEMP.TXT.1;P777700 8 3729(36) 20-Apr-97 01:00:59 OPERATOR
@
Example 2: transferring a binary file of 8-bit bytes (no conversion needed):
% cp temp.dat temp.tap
% ls -l temp.tap # Find size of file
-rw-rw-r-- 1 klh klh10 18641 Feb 13 1994 temp.tap
% cat > temp
TF-Format: raw
0: 2560*7 721 EOF EOF
EOT:
^D
%
;; Then in TOPS-20 after mounting the tape "temp":
@set taPE rECORD-LENGTH (TO) 2560
@set taPE fORMAT (TO) iNDUSTRY-COMPATIBLE
@copY (FROM) mta0: (TO) temp.dat,
@@byTE (SIZE) 8
@@
MTA0: => TEMP.DAT.1 [OK]
@vd temp.dat
PS:<OPERATOR>
TEMP.DAT.1;P777700 10 18641(8) 19-Apr-97 23:57:46 OPERATOR
@
Example 3: building a TOPS-20 installation tape
If you already have a TOPS-20 system, especially one with local
modifications (which pretty much includes everyone), you may wish to
build your own installation tape. The following illustrates what the
tape directory of the V7.0 TOPS-20 installation tape looks like. Note
it does not have an initial bootstrap on it since MTBOOT is assumed to
be already loaded in the PDP-10 memory.
; Tape directory for V7.0 TOPS-20 installation tape
; Bytes: 22519060, Records: 8704, Files(EOF marks): 7
TF-Format: raw
0: 2560*597 EOF ; MONITR.EXE
1528320: 2560*125 EOF ; EXEC.EXE
1848320: 2560*8 EOF ; DLUSER.EXE
1868800: 1270 EOF ; DLUSER data
1870070: 2560*36 EOF ; DUMPER.EXE
1962230: 2590*7937 EOF ; DUMPER savesets for <SYSTEM>, etc.
22519060: EOF
EOT:
All of these files must be in core-dump format. You can generate the
tape either by:
(1) creating it on a real TOPS system and then using it directly
or using TAPEDD to copy it into a virtual tape.
(2) copying the necessary files over, converting them into core-dump
format, and concatenating them to form a virtual tape.
See "klt20.txt" for more details on how such an installation tape is
actually used.
Quick lesson in tape formats:
A PDP-10 word is 36 bits. The 8-bit bytes ("frames" on 9-track
drives) that are now universal for tape don't fit exactly into 36 bits,
which opens a Pandora's Box of packing options. The basic formats
offered at one time or another on Digital systems are as follows:
WFCONV mode TOPS-20 name
----------- ------------------
a ANSI-ASCII
c CORE-DUMP
h HIGH-DENSITY
i INDUSTRY-COMPATIBLE
s SIXBIT
Only CORE-DUMP and INDUSTRY-COMPATIBLE are universally supported; the
others are features of older or newer formatters. In general, the TOPS-20
monitor expects CORE-DUMP format so that should be your normal choice.
Tape_Coredump (5 tape bytes per word)
B0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
0 0 0 0 32 33 34 35
Tape_Indust (4 tape bytes per PARTIAL word)
B0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 ; Bits 32-35 are unused!
Tape_Sixbit (6 tape bytes per word)
0 0 B0 1 2 3 4 5
0 0 6 7 8 9 10 11
0 0 12 13 14 15 16 17
0 0 18 19 20 21 22 23
0 0 24 25 26 27 28 29
0 0 30 31 32 33 34 35
Tape_Ascii (5 tape bytes per word)
0 B0 1 2 3 4 5 6
0 7 8 9 10 11 12 13
0 14 15 16 17 18 19 20
0 21 22 23 24 25 26 27
35 28 29 30 31 32 33 34
Tape_Hidens (9 tape bytes per 2 words)
B0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 B0 1 2 3
4 5 6 7 8 9 10 11
12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35
WFCONV operation notes
======================
Invoking WFCONV without arguments will print out a summary similar to
the following:
Usage: wfconv -io <infile >outfile\n\
where 'i' and 'o' are chars specifying the input and output formats:
c - Core-dump (std tape format, 4 8-bit, 1 4-bit bytes = 36 bits)
h - High-density (FTP 36-bit image, 9 8-bit bytes = 72 bits)
a,7 - Ansi-Ascii (4 7-bit, 1 8-bit byte = 36 bits)
s,6 - Sixbit (6 6-bit bytes = 36 bits)
u - Unixified (Alan Bawden format, various = 36 bits)
t - Text-Newline (CRLF-NL conversion; 5 7-bit bytes = 35 bits ONLY)
d - Debug (for output only)
Note: EOF on input always causes zero-padding up to a PDP-10 word boundary.
Typical uses of WFCONV would be as follows:
1. Examining a PDP-10 text file copied from a tape:
# Convert from core-dump to ansi-ascii (preserve CRs)
$ wfconv -ca < file.tap > file.asc
or:
# Convert from core-dump to text-newline (convert CRLFs to NLs)
$ wfconv -ct < file.tap > file.txt
2. Preparing a text file for writing to tape:
# Convert from ansi-ascii to core-dump (preserve NLs)
$ wfconv -ac < file.asc > file.tap
or:
# Convert from text-newline to core-dump (convert NLs to CRLFs)
$ wfconv -tc < file.txt > file.tap
3. Preparing a file for tape after transferring it from a real PDP-10
using FTP 36-bit Image mode:
# Convert from high-density (FTP Image) to core-dump
$ wfconv -hc < file.ftp > file.tap
Note:
Due to the fact that PDP-10 words are used as the canonical input
conversion target (and output conversion source), input is always
effectively rounded up to a word boundary.
This can cause the addition of a few trailing zero bytes when converting
from Text-Newline or Ansi-ASCII format, so WFCONV is not a
general-purpose text-to-text conversion program. For that, one can use:
# To insert CR (must use ^V or equiv to quote the ^M)
$ sed 's/$/\^M/' temp.nls > temp.crlfs
# To delete CR (must use ^V or equiv to quote the ^M)
$ sed 's/\^M$//' temp.crlfs > temp.nls