<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Time Reshared</title>
    <link>https://timereshared.com/</link>
    <description>  Time Reshared</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 01 Mar 2026 09:20:00 +0900</lastBuildDate>
    <atom:link href="https://timereshared.com/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Reconstructing OPL: Joseph Weizenbaum&#39;s Online Programming Language</title>
      <link>https://timereshared.com/reconstructing-joseph-weizenbaums-opl/</link>
      <pubDate>Sun, 01 Mar 2026 09:20:00 +0900</pubDate>
      <guid>https://timereshared.com/reconstructing-joseph-weizenbaums-opl/</guid>
      <description>
&lt;p&gt;
Joseph Weizenbaum joined MIT in 1963 and is most famous for creating
&lt;a href=&#34;https://github.com/rupertl/eliza-ctss&#34;&gt;ELIZA&lt;/a&gt;, the world&amp;#39;s first chatbot. One of his other projects was OPL,
the Online Programming Language, which used his &lt;a href=&#34;https://en.wikipedia.org/wiki/SLIP_(programming_language&#34;&gt;SLIP&lt;/a&gt; list processing
library to implement an interpreted, interactive language that could
take advantage of the new facilities provided by time-sharing
operating systems like &lt;a href=&#34;https://timereshared.com/ctss/&#34;&gt;CTSS&lt;/a&gt;. First conceived in 1963, it was a
contemporary of such languages as &lt;a href=&#34;https://en.wikipedia.org/wiki/JOSS&#34;&gt;JOSS&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/BASIC&#34;&gt;BASIC&lt;/a&gt; and interpreted &lt;a href=&#34;https://www-formal.stanford.edu/jmc/history/lisp/node5.html&#34;&gt;LISP&lt;/a&gt;. It
was even combined with a later version of ELIZA to provide probably the
first embedded scripting language.&lt;/p&gt;
&lt;p&gt;
Based on a &lt;a href=&#34;https://dome.mit.edu/handle/1721.3/201709&#34;&gt;printout&lt;/a&gt; of source code found among Weizenbaum&amp;#39;s papers
archived by MIT Libraries, I have reconstructed the language so it can
live again for the first time in nearly sixty years on a IBM 7094
emulator running CTSS. I&amp;#39;m calling this a reconstruction as although
the main logic of the interpreter was in the printout, the I/O
routines and some utility functions were missing. I have written these
in &lt;a href=&#34;https://en.wikipedia.org/wiki/MAD_(programming_language)&#34;&gt;MAD&lt;/a&gt; (Michigan Algorithm Decoder), which is the source language of
OPL. Around 18% of the project is new code.&lt;/p&gt;
&lt;p&gt;
Source code and further details on &lt;a href=&#34;https://github.com/timereshared/opl&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;OPL printout and execution&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/ctss/opl.png&#34; alt=&#34;/images/ctss/opl.png&#34; title=&#34;/images/ctss/opl.png&#34;/&gt;
&lt;em&gt;OPL printout and code execution under emulation. Source: &lt;a href=&#34;https://dome.mit.edu/handle/1721.3/201709&#34;&gt;MIT Libraries&lt;/a&gt; and Rupert Lane. License: MIT&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
The origins of OPL
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The first reference to OPL is in &lt;a href=&#34;https://dspace.mit.edu/handle/1721.1/149332&#34;&gt;OPL-I An Open Ended Programming
System Within CTSS&lt;/a&gt;. a Project MAC technical report written by
Weizenbaum in April 1964. He notes the shared observation that new
time-sharing operating systems like CTSS allow programmers to attack
problems in new ways that traditional high-level languages like
Fortran do not allow.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The whole point of time-sharing is to enlarge the opportunities for
carrying out truly significant man-machine dialogue — not to merely
reduce turn-around-time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
with a longer term goal&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is to be expected that in many problem areas the computer will
begin to help man by doing only the most obvious in mechanical parts
of his problem but that, as the man-machine dialogue extends over a
long period of time, more and more of the previously fussy issues over
which man retained authority will become clear and finally be turned
over to the computer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
(which rings true today with the advent of LLM based coding agents).&lt;/p&gt;
&lt;p&gt;
But Weizenbaum does draw the line somewhere - &amp;#34;The goal is to give to
the computer those tasks which it can best do and leave to man that
which requires (or seems to require) his judgement.&amp;#34; - the fundamental
difference between humanity and machines would be something he
increasingly feel strongly about as he became more disillusioned with
AI in the 1970s and wrote his book &lt;a href=&#34;https://en.wikipedia.org/wiki/Computer_Power_and_Human_Reason&#34;&gt;&lt;em&gt;Computer Power and Human Reason&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
But turning to the details on the language itself. OPL-I, as it was
called then,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;permits the user to augment both his program and his data base during
widely separated successive sessions at his terminal. Facilities are
provided which make it possible for the user to operate on his already
established data base both by means of built-in operators and in terms
of operators (functions) which the user has previously defined in the
language of the system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
The OPL system is written in a high level language and uses the SLIP list
processing library for its internal workings; the same SLIP functions
are exposed to the user for their programs. Users can build up their
own lists and functions that operate on them, and can run small
fragments of code to interrogate their data. These queries are
discarded after running them, but the data and functions remain.&lt;/p&gt;
&lt;p&gt;
Persistence over sessions is afforded by a facility in CTSS which is
not really available on modern operating systems. At any time while
running OPL, the user can press the Interrupt key on their typewriter
console and it will return them to the CTSS command level. The user
can then type &lt;code&gt;SAVE&lt;/code&gt; and a complete record of their core memory - the
OPL program and the user functions and data - is stored to a disk
file. At any point later they can &lt;code&gt;RESTORE&lt;/code&gt; that core image file and
pick up where they were before they pressed Interrupt, without the
need to load in data and code again.&lt;/p&gt;
&lt;p&gt;
As a concrete example, Weizenbaum gives code for a function that
calculates the mean of a list of numbers.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
(DEFINE)
(MEAN (L)
          (S = SEQRDR(L))  (SUM = 0.0)  ((COUNT = 0.0)
BEGIN     (C = SEQLR(S,F))
          IF(F)MORE,MORE,DONE
MORE      (COUNT = (COUNT + 1.0))
          (SUM = (SUM + C))  GOTO BEGIN
DONE      ( (SUM/COUNT))  )
&lt;/pre&gt;
&lt;p&gt;
Here, the SLIP primitive &lt;code&gt;SEQRDR&lt;/code&gt; is used to start an iterator over
the list &lt;code&gt;L&lt;/code&gt;. Each call to &lt;code&gt;SEQLR&lt;/code&gt; brings in the next element,
travelling left to right over the list&amp;#39;s contents. The flag &lt;code&gt;F&lt;/code&gt;
denotes what has been read: this will be 1 at the end of the list, so
the Fortran II style &lt;code&gt;IF&lt;/code&gt; statement is used to branch to the label &lt;code&gt;DONE&lt;/code&gt;
at this point, where the mean is returned. This could be called by
something like:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
        (X = MEAN(SET))
&lt;/pre&gt;
&lt;p&gt;
Weizenbaum gives an example of a use for OPL. An organisation can
define its management hierarchy as a set of lists arranged into a
tree, and write functions to do tasks such as compute the budget at an
arbitrary level based on money allocated to sub-organisations,
&amp;#34;What-if&amp;#34; scenarios could be run by temporarily changing the data.&lt;/p&gt;
&lt;p&gt;
He also looks ahead to a potential multi-terminal version of OPL
(which as far as I can tell was never built) where several people
could play a business game, sharing the same data and seeing the
impact of changes performed by one player on the other terminals.&lt;/p&gt;
&lt;p&gt;
Weizenbaum compares OPL to LISP and &lt;a href=&#34;https://en.wikipedia.org/wiki/Information_Processing_Language&#34;&gt;IPL-V&lt;/a&gt;, and states &amp;#34;OPL-I is of a
character quite similar to the LISP program mode and of about
equivalent power.&amp;#34; IPL-V was falling out of use at this time, and LISP
was growing its number of users. The AI lab at MIT was using LISP on
the PDP-1 and PDP-6, and I would speculate that there was an
interchange of ideas between the groups.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
The marriage of OPL and ELIZA
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The next sighting of OPL is a talk Weizenbaum gave at UCLA in the
spring of 1965, reproduced in a 1966 paper &lt;a href=&#34;https://drive.google.com/file/d/1tgsW8t1n46cQqVy2vCJQJ6nDQbzzQ13w&#34;&gt;On-Line User Languages&lt;/a&gt;.
This does not add much technical detail, but Weizenbaum puts OPL in
the context of wider interpreter development at MIT. He views the
command line environment in CTSS as an ad hoc interpreter to solve
problems, and mentions other CTSS interpreters such as &lt;a href=&#34;https://en.wikipedia.org/wiki/COGO&#34;&gt;COGO&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
But the really interesting news came in the &lt;a href=&#34;https://apps.dtic.mil/sti/tr/pdf/AD0681342.pdf&#34;&gt;Project MAC progress
report&lt;/a&gt; for 1966-7. Weizenbaum had turned OPL into an evaluator that
could be called by ELIZA to do arbitrary computation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The difficulty with the early ELIZA system alluded to above was that
the system could do no computation in any significant sense. […] In
order to enhance the ability of ELIZA in this direction it was
necessary to design and build an evaluator, that is, an interpretive
program, to which computational and logical tasks could be given for
execution. Such an evaluator was built.&lt;/p&gt;
&lt;p&gt;
The composition of this evaluator proved to be an interesting task
with ramifications extending beyond its immediate utility as a
subsystem to ELIZA. An effort was made to design the program in a way
such that it would prove a useful tool for the teaching of a number of
deep issues in the field of programming languages. The resulting
program is essentially an interpreter version of SLIP with
approximately the power of LISP but with very considerably simpler
syntactic conventions than LISP.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&lt;strong&gt;Note the source code for this combination of ELIZA and OPL has not
been found&lt;/strong&gt;. What we do have is the stand alone version of OPL
from 1967.&lt;/p&gt;
&lt;p&gt;
But there are several documents that show ELIZA+OPL being used. Paul
Hayward&amp;#39;s 1967 bachelor&amp;#39;s thesis &lt;a href=&#34;https://dspace.mit.edu/handle/1721.1/142746&#34;&gt;Flexible Discussion Under Student
Control in the ELIZA Computer Program&lt;/a&gt; describes creating a system to
have a computer interactively discuss a physics problem with a
student, and gives his scripts at the end of the document. Two papers
by Edwin Taylor from the Science Teaching Group at MIT: &lt;a href=&#34;https://drive.google.com/file/d/1TEp8xk12GFWcGHuxRAPlmiPjQR0BeiEi/view?usp=sharing&#34;&gt;The ELIZA
Program: Conversational Tutorial&lt;/a&gt; and &lt;a href=&#34;https://drive.google.com/file/d/1bVp1_EDLPSwvTo3jkPnDLNDsSxtWMitu/view?usp=sharing&#34;&gt;Automated Tutoring and Its
Discontents&lt;/a&gt; describe the experience of building teaching scripts using
ELIZA+OPL.&lt;/p&gt;
&lt;p&gt;
Of most interest is Hayward&amp;#39;s 1968 &lt;a href=&#34;https://www.computerhistory.org/collections/catalog/102683842/&#34;&gt;Eliza Scriptwriter&amp;#39;s Manual&lt;/a&gt; which
contains a description of how ELIZA and OPL work together, including
an appendix on the OPL language and its functions. This is the sole
documentation we have on OPL.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
The source code
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The &lt;a href=&#34;https://dome.mit.edu/handle/1721.3/201709&#34;&gt;printout&lt;/a&gt; of source code we have is for a standalone version of OPL
without its ELIZA embeddings. The document contains&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Three pages of what looks like a larger manuscript about OPL,
describing how it uses description lists to store symbol tables.&lt;/li&gt;
&lt;li&gt;A listing of the file &lt;code&gt;DI MAD&lt;/code&gt;. This is the main entry point for the
stand alone program. It accepts commands from the user&amp;#39;s terminal
and sends them to &lt;code&gt;EVAL&lt;/code&gt; for evaluation. It has some debug
facilities the user can turn on or off, such as printing how much
free space is left.&lt;/li&gt;
&lt;li&gt;A listing for the file &lt;code&gt;EVAL MAD&lt;/code&gt;. This is an external function that
takes a list expression as input and returns the result of its
evaluation. It contains a parser and run time support for OPL&amp;#39;s statements.&lt;/li&gt;
&lt;li&gt;A listing of a CTSS ARCHIV file called &lt;code&gt;FAP FAP&lt;/code&gt; that contains several
FAP assembly language files that support OPL. An example of these is
&lt;code&gt;OBEY FAP&lt;/code&gt; which has a jump table that matches OPL function names with
their entry points. This had to be done in assembly language as MAD
lacks function pointers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In total there are 48 pages or 2654 lines of code in the printout.&lt;/p&gt;
&lt;p&gt;
The printout is dated &amp;#34;06/30&amp;#34; and I think the year is 1967 based on
the internal dates on the files in the &lt;code&gt;FAP FAP&lt;/code&gt; archive. The user ID
printed on top of the printout is &lt;code&gt;T0109 2531&lt;/code&gt; which from other
printouts we know is Weizenbaum&amp;#39;s.&lt;/p&gt;
&lt;p&gt;
Having studied his &lt;a href=&#34;https://sites.google.com/view/elizagen-org/original-eliza?authuser=0&#34;&gt;1965 ELIZA code&lt;/a&gt; for that &lt;a href=&#34;https://github.com/rupertl/eliza-ctss&#34;&gt;reconstruction&lt;/a&gt;, it&amp;#39;s
instructive to compare the two.&lt;/p&gt;
&lt;p&gt;
Like the 1965 code, Weizenbaum uses playful names for variables and
functions: &lt;code&gt;APRIL&lt;/code&gt;, &lt;code&gt;JULY&lt;/code&gt;, &lt;code&gt;VIRGIN&lt;/code&gt;, &lt;code&gt;OBEY&lt;/code&gt;, &lt;code&gt;RID&lt;/code&gt;. One distinctive
trait is seen in his use of &lt;code&gt;EQUIVALENCE&lt;/code&gt; statements. These are
similar to C&amp;#39;s &lt;code&gt;union&lt;/code&gt;, where one location in memory can be accessed
by two variable names with different types. Weizenbaum often uses a
German and an English word with similar meanings to name these, as in
this example:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
           EQUIVALENCE (PLATZ,THERE)
&lt;/pre&gt;
&lt;p&gt;
Based on the non-contiguous line numbers and non-code file separators
in ELIZA, it was likely originally prepared on punched cards and then
loaded into CTSS for use under time-sharing. The 1967 code has
perfectly regular line numbers, probably indicating it was entered
online using an editor such as &lt;code&gt;ED&lt;/code&gt;, which manages line numbers
automatically as you edit a file. The 1967 code also has more comments
and more blank lines, which is something you&amp;#39;d avoid on punched cards
as it would make the deck physically larger.&lt;/p&gt;
&lt;p&gt;
Weizenbaum also uses more CTSS subroutines rather than relying solely
on facilities in the MAD language. For example, he uses CTSS&amp;#39;s
&lt;code&gt;PRMESA&lt;/code&gt; to print a message on the typewriter without a terminating
carraige return.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
The reconstruction
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The first task was to OCR the PDF to extract machine readable text.
Luckily recent LLMs do an amazing job on OCR, avoiding the
hallucinations common even in mid 2025, and making around one
mistake per page.&lt;/p&gt;
&lt;p&gt;
Then, the code was loaded into CTSS and compiled. This shook out the
last of the OCR issues, some of them subtle. IBM in their wisdom used
&lt;code&gt;=&lt;/code&gt; to define decimal constants in assembly code and &lt;code&gt;=O&lt;/code&gt; for octal
constants, so &lt;code&gt;=020&lt;/code&gt; means decimal 20 but &lt;code&gt;=O20&lt;/code&gt; means octal 20, ie
decimal 16, so this needed careful checking. No syntax errors were
detected in the code, but when it came time to link/load (using the
&lt;code&gt;L&lt;/code&gt; command below) there was a problem:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
l di eval (libe) opllib
W 1126.2
 NEED BOT    BRKEY  CNTSPC INITAS INLSTL IRARDR LEMPTY
      LIST   MTLIST NTHTOP ONELIN POPTOP RDLONL READER
      REMOVE SDBC   TODAY  TOP    LSLCPY LSSCPY LSTMRK
      MANY   MRKLST NAMTST NTHBOT NULSTL NULSTR OEPRNT
      POPBOT TXTPRT VCTLST NUCELL RCELL  ATEND  ATOMIC
      CONCAT TIME   REST   HIRANK CONS   REPLAC CALLS
      ADDKEY WASKEY NTOP   NBOT   MAX    MIN    FIRST
      SECOND INLSTR DSKLST DSKCLS LSTEQL NODLST LINLST
      STRLST YMATCH ASSMBL GETLIN FNDKEY
R .316+.033
&lt;/pre&gt;
&lt;p&gt;
61 functions were missing.&lt;/p&gt;
&lt;p&gt;
23 of these were SLIP primitives like &lt;code&gt;BOT&lt;/code&gt; or &lt;code&gt;LIST&lt;/code&gt;. We had a
complete SLIP library on hand from the ELIZA reconstruction and its
interface had been fairly stable since its first publication, so we
could drop in the ELIZA-SLIP library easily.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-5&#34;&gt;
Input/Output
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
More problematic were the input/output routines that were missing. The
key ones here were &lt;code&gt;RDLONL&lt;/code&gt; to read lines of input from the terminal
and convert to a list, and &lt;code&gt;TXTPRT&lt;/code&gt; to print a list to the terminal.
We had similar code from ELIZA&amp;#39;s &lt;code&gt;TREAD&lt;/code&gt; and &lt;code&gt;TXTPRT&lt;/code&gt; but they would
not work directly with OPL. ELIZA really just cares about text but OPL
needs support for numbers and symbols needed to express code in the
language. So I chose to write these from scratch in MAD.&lt;/p&gt;
&lt;p&gt;
String handling on the IBM 7094 is deeply unfamiliar to modern
programmers. The machine pre-dated ASCII and the 8-bit character:
instead it uses 6-bit BCD characters, packed 6 to a 36-bit word. Even
worse, there is no built-in facility to manipulate data at the
character level, either in the MAD language or in assembly. Instead,
characters need to be masked and bit-shifted to or from a word. Input
and output also only occurs at a word level, so to output &lt;code&gt;A B&lt;/code&gt; you
have to prepare a word of 6 blanks, poke in the characters at bits
1-6 and 13-18, and then send the encoded word &lt;code&gt;&amp;#34;A B   &amp;#34;&lt;/code&gt; to the
CTSS output subroutine.&lt;/p&gt;
&lt;p&gt;
By seeing what the &lt;code&gt;EVAL&lt;/code&gt; function was expecting, it was possible to
build working code for these functions. But lacking detailed examples
of OPL code running, we do not know exactly how this looked. For
example, we can see &lt;code&gt;EVAL&lt;/code&gt; trying to output a list of two floating
point numbers separated by a comma. To what precision should the
numbers be printed? Should there be a space before or after the comma?
Although the functionality of OPL is working as it did in 1967. how it
looks on the terminal may be slightly different.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-6&#34;&gt;
Data types
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
The next problem was data types. Each element of a SLIP list - called
the datum - is a single 36-bit word and OPL allows text, symbols like
&lt;code&gt;*&lt;/code&gt;, integer and floating point numbers to be stored here. However,
there is no unified way to tag what type the datum represents. Text
data uses the SLIP indicator, which is two unused bits on the pointer
to the next word in the list. Symbols are encoded as text but with
the indicator turned off and padded with spaces, for example
&lt;code&gt;&amp;#34;     *&amp;#34;&lt;/code&gt;.  Numbers also have no indicator, and Weizenbaum appeared to
use a heuristic&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
           WHENEVER 77777K6 .A. DATUM .E. 0
              (treat datum as integer)
           OTHERWISE
              (treat datum as floating point)
           END OF CONDITIONAL
&lt;/pre&gt;
&lt;p&gt;
which basically means see if none of the bits marked as &amp;#34;x&amp;#34; in the word
&lt;code&gt;...xxxxxxxxxxxxxxx..................&lt;/code&gt; are set. FP numbers have the
IBM 7094 equivalent of the exponent set here (note this is not the
&lt;a href=&#34;https://en.wikipedia.org/wiki/IEEE_754&#34;&gt;IEEE 754&lt;/a&gt; floating point representation used today), whereas integers
will not have these bits set unless they are very large.&lt;/p&gt;
&lt;p&gt;
The overlapping nature of this type detection was not documented in
the code and had to be worked out by trial and error when developing
the I/O routines: it&amp;#39;s probable that there are still some mistakes
in the reconstruction here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-7&#34;&gt;
Lambda function support
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
The printout had several instances where someone, presumably
Weizenbaum, had made hand-written annotations.&lt;/p&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;Example of an annotation to the OPL source code.&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/ctss/opl-annotation.png&#34; alt=&#34;/images/ctss/opl-annotation.png&#34; title=&#34;/images/ctss/opl-annotation.png&#34;/&gt;
&lt;em&gt;Example of an annotation to the OPL code.Source: &lt;a href=&#34;https://dome.mit.edu/handle/1721.3/201709&#34;&gt;MIT Libraries&lt;/a&gt;. License: MIT&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
These seem to concentrate around lines of code enabling lambda
functions and the ability to create and call new anonymous functions.
This feature does not appear in any of the OPL documentation and seems
not to be fully working. I chose not to apply any of the hand written
changes to the source code and left it as is.&lt;/p&gt;
&lt;p&gt;
There may be a connection here to the work Weizenbaum did on the
&lt;a href=&#34;https://en.wikipedia.org/wiki/Funarg_problem&#34;&gt;funargs problem&lt;/a&gt; for his 1968 paper, though that only mentions the
problem in the context of LISP. Joel Moses&amp;#39; 1970 paper &lt;a href=&#34;https://dl.acm.org/doi/10.1145/1093410.1093411&#34;&gt;The function
of FUNCTION in LISP&lt;/a&gt; does provide some historical background that
explicitly mentions OPL:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Joseph Weizenbaum got sufficiently interested in Landin&amp;#39;s work that he
implemented a subset of [the ISWIM lambda calculus] based on his
SLIP-OPL system. The tree structure of the resulting stack was made
quite vivid to me when Weizenbaum encountered difficulty in
implementing the backward pointers necessary in the general case. The
reason for this difficulty is that one could not then garbage collect
the circular SLIP structures which are created in a straight-forward
implementation. This is what motivated Weizenbaum to finally introduce
classical garbage collection into SLIP [in 1969].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
This would be a good topic for further research.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-8&#34;&gt;
OPL utility functions
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
The above took care of most of the missing functions, but there were
still several functions not used by the interpreter directly, but
available to be called by the user&amp;#39;s OPL program. Many of these were
trivial to implement - eg &lt;code&gt;MAX&lt;/code&gt; and &lt;code&gt;MIN&lt;/code&gt; - so I have included
implementations for around 15 of these. 18 functions remain
unimplemented at this point, mainly either because the documentation
is not clear on what they should do or if they are used by ELIZA but
we lack the main ELIZA+OPL code so they would not be useful on
stand-alone OPL.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-9&#34;&gt;
Using OPL
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the &lt;a href=&#34;https://github.com/timereshared/opl&#34;&gt;GitHub repo&lt;/a&gt; for details on setting up the emulator and
compiling the code.&lt;/p&gt;
&lt;p&gt;
Once done, you start OPL by typing &lt;code&gt;R OPL&lt;/code&gt;. It responds with a
greeting, the current date/time and a prompt of a line number. You can
then enter one or more lines of text, ending your input with two
carriage returns in a row.&lt;/p&gt;
&lt;p&gt;
In the below, my input is in lower case, OPL&amp;#39;s is in capitals. Simple
variable assignment and calculation:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
r opl
W 1818.1
EXECUTION.
OPL AT YOUR SERVICE
DATE  02/16  TIME 1818.1
     1      a = 21, b = 2, c = a*b, type(c)

C               42
&lt;/pre&gt;
&lt;p&gt;
List manipulation&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
     2      x = &amp;#39;(10.0 20.0 30.0),
newtop(5.0, x),
popbot(x),
txtprt(x, 0)

5 10 20
&lt;/pre&gt;
&lt;p&gt;
Reproducing the &lt;code&gt;mean&lt;/code&gt; example from the original paper&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
     3      define(mean(lst) =
      count = 0, total = 0,
      r = seqrdr(lst),
*loop item = seqlr(r),
      if item .e. &amp;#39;nil then goto end :
      count = count + 1, total = total + item,
      goto loop, 
*end  total / count)

     4      type(mean(x))

MEAN(X)               11.66667
&lt;/pre&gt;
&lt;p&gt;
The logic is mostly the same, but note that parentheses are not needed
and statements are separated by commas. &lt;code&gt;seqlr&lt;/code&gt; does not return a
flag, instead taking the value &lt;code&gt;&amp;#39;nil&lt;/code&gt; at the end of the list. Goto
targets are now prefixed by &lt;code&gt;*&lt;/code&gt;, and the &lt;code&gt;IF&lt;/code&gt; statement is now a
Fortran 66 style logical IF rather than the Fortran II three-way
branch version. &lt;code&gt;IF&lt;/code&gt; also needs to be terminated with a &lt;code&gt;:&lt;/code&gt; as the
&lt;code&gt;THEN&lt;/code&gt; clause could have multiple statements separated by commas.&lt;/p&gt;
&lt;p&gt;
Sessions can be saved by pressing Interrupt (Control-Backslash under emulation)
and then using the &lt;code&gt;SAVE&lt;/code&gt; and &lt;code&gt;RESTORE&lt;/code&gt; commands.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
     5       QUIT,
R .133+.066

save myopl
W 1825.5
R .000+.033

r myopl
W 1825.6

     5      type(a, b, c)

A               21
B                2
C               42
&lt;/pre&gt;
&lt;p&gt;
The interpreter has some built in meta commands which start with a
&lt;code&gt;.&lt;/code&gt;. For example, &lt;code&gt;.clock on&lt;/code&gt; enables display of how long an
expression takes to complete evaluation.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
     1      define(fac(n) = if n .le. 1 then 1 else n * fac(n - 1) )

     2      .clock on

     2      type(fac(10))

FAC(10)                3628800
TIME      66 MILLISECONDS
&lt;/pre&gt;
&lt;p&gt;
OPL will also detect missing definitions of variables and functions,
and prompt for them to be supplied when needed.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
     1      a1 = 10, a3 = 20, type(a1 + a2 + a3)

A1 + A2 + A3      IDENTIFIER  A2     UNDEFINED
      12

          42
&lt;/pre&gt;
&lt;p&gt;
It&amp;#39;s important to mention that this is a snapshot of Weizenbaum&amp;#39;s
work, not a finished product. For example, undefined math results are
not handled correctly and missing keywords, like &lt;code&gt;DO&lt;/code&gt; in the &lt;code&gt;IF&lt;/code&gt;
statement below, can cause the program to crash.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
     1      type(1/0)

1 / 0            0
     2      for j = 1 step 1 until j .e. 5 type(j)

J                1
 PROTECTION MODE VIOLATION AT 20163.
 INS.=050000063400, RI.=000000000000, PI.=053422000000
R .050+.050
&lt;/pre&gt;
&lt;p&gt;
I&amp;#39;ve put some more code examples in the &lt;code&gt;samples&lt;/code&gt; directory of the
&lt;a href=&#34;https://github.com/timereshared/opl&#34;&gt;Github repo&lt;/a&gt;, along with some details on known issues.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
OPL&amp;#39;s impact
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I think it&amp;#39;s fair to say that OPL did not have much of a direct
impact. Weizenbaum never published OPL and it did not spread outside
of MIT. A lot of different approaches were tried in computer aided
instruction at this time, and the ELIZA+OPL scripting approach did not
take off: more successful were ventures elsewhere such as the &lt;a href=&#34;https://en.wikipedia.org/wiki/PLATO_(computer_system)&#34;&gt;PLATO&lt;/a&gt;
system and the &lt;a href=&#34;https://en.wikipedia.org/wiki/Logo_(programming_language)&#34;&gt;Logo&lt;/a&gt; language. Weizenbaum himself spent less time on
programming, instead working on his book &lt;em&gt;Computer Power and Human
Reason&lt;/em&gt; and getting involved in the political turmoil of the early
1970s.&lt;/p&gt;
&lt;p&gt;
It&amp;#39;s always difficult to identify firsts in computer science history,
as many people have similar ideas at the same time. I think the idea
of a library (SLIP) having bindings in both a compiled (MAD) and an
interpreted (OPL) language is a first, and embedding a scripting
language like OPL in a domain specific language like ELIZA is also
novel for its time. Certainly the ideas developed by Project MAC and
CTSS were shared across the community and as a collection of ideas it
would show its influence on later generations of time-sharing
operating systems and interactive languages.&lt;/p&gt;
&lt;p&gt;
OPL remains interesting as one of the last examples of Weizenbaum&amp;#39;s
technical achievements, and it&amp;#39;s interesting to think what could have
happened had he developed it further.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-11&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-11&#34;&gt;
Acknowledgements
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-11&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Thanks to Anthony Hay, Arthur Schwarz, David Berry, Jeff Shrager, Mark
Marino and everyone on &lt;a href=&#34;https://sites.google.com/view/elizaarchaeology/team?authuser=0&#34;&gt;RetroAI/Team ELIZA&lt;/a&gt; for their help and advice.&lt;/p&gt;
&lt;p&gt;
Thanks to MIT Libraries for preserving and scanning this code, and
making it publicly available.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-12&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-12&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-12&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>TOPS-10: Jobs</title>
      <link>https://timereshared.com/tops-10-jobs/</link>
      <pubDate>Sun, 22 Feb 2026 08:31:00 +0900</pubDate>
      <guid>https://timereshared.com/tops-10-jobs/</guid>
      <description>
&lt;p&gt;
TOPS-10 is able to run multiple jobs (processes) per user, and has a
flexible set of commands to control them, including the ability to
pause a job and resume it on another terminal. It also has a batch job
facility. But we&amp;#39;ll start with a question on how to run jobs.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Why do I sometimes need to type &lt;code&gt;R command&lt;/code&gt; and other times type &lt;code&gt;command&lt;/code&gt;?
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
When you login to TOPS-10, you are in monitor mode - you are actually
running shared code that is part of the system kernel. Some simple
commands, like &lt;code&gt;RESOURCES&lt;/code&gt;, are part of the monitor and can be
executed directly. Other commands need to be loaded from disk first.
To signal this, you type &lt;code&gt;RUN command&lt;/code&gt; if the command is in your
directory, or &lt;code&gt;R command&lt;/code&gt; if it is a system command. &lt;code&gt;R&lt;/code&gt; looks for
&lt;code&gt;EXE&lt;/code&gt; and &lt;code&gt;SAV&lt;/code&gt; files to run in &lt;code&gt;SYS:&lt;/code&gt;, so &lt;code&gt;R PIP&lt;/code&gt; is the same as &lt;code&gt;RUN
SYS:PIP.EXE&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;
A program loaded from disk remains in memory - your &lt;strong&gt;core image&lt;/strong&gt; -
even after the program exits. This image is only replaced when you
load a new command. As a demonstration, type &lt;code&gt;R PIP&lt;/code&gt; to load and run
the PIP command. The prompt will change to &lt;code&gt;*&lt;/code&gt;. Press Control-C and
you will be back at the monitor level with the &lt;code&gt;.&lt;/code&gt; prompt. Type
&lt;code&gt;RESOURCES&lt;/code&gt; and after that has finished, type &lt;code&gt;START&lt;/code&gt; - you will find
yourself back in PIP again.&lt;/p&gt;
&lt;p&gt;
One other complication is that the system administrator can declare an
alias for some common commands. An example here is the SOS editor,
which you can run with just &lt;code&gt;SOS&lt;/code&gt;. Behind the scenes, the system does
a &lt;code&gt;R SOS&lt;/code&gt; for you to load and start &lt;code&gt;SYS:SOS.EXE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
In practice you will remember what to type, but to check if a command
is part of the monitor look at the &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10/AA-0916C-TB_DEC10_Operating_Systems_Command_Manual_Ver_6_03_Aug77.pdf&#34;&gt;Operating Systems Command Manual&lt;/a&gt;
chapter 2. If the write up for a command says it &amp;#34;replaces core&amp;#34; then
it is a disk loaded command that you either need to start via &lt;code&gt;R&lt;/code&gt; or
know that there is an alias declared.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Detaching and attaching jobs
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
You can log in more than one terminal under the same ID, and hence have
more than one job running.&lt;/p&gt;
&lt;p&gt;
It is possible to pause execution of a job on one terminal and pick it
up again on another. Let&amp;#39;s say you are running this horribly
inefficient way to print all prime numbers between 1 and 2 million:&lt;/p&gt;
&lt;div class=&#34;src src-fortran&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fortran&#34; data-lang=&#34;fortran&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;DO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; J &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1000000&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;DO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; K &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,J&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; ((J&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;K)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;K .EQ. J) &lt;span style=&#34;color:#66d9ef&#34;&gt;GOTO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;CONTINUE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;TYPE&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;, J
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;CONTINUE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(I)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Run this with &lt;code&gt;EXECUTE&lt;/code&gt; and press Control-C twice to interrupt it.
Then type &lt;code&gt;DETACH&lt;/code&gt; to detach the job&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.exec primes.for
LINK:	Loading
[LNKXCT PRIMES Execution]

       1000003
       1000033
       1000037
       1000039
       1000081
       1000099^C^C

.det
From job 5
&lt;/pre&gt;
&lt;p&gt;
As you are detached, you are also logged out. You could &lt;code&gt;LOGIN&lt;/code&gt; again
and start a new job if you wished.&lt;/p&gt;
&lt;p&gt;
But let&amp;#39;s start a new terminal. Login as normal and then type &lt;code&gt;ATTACH&lt;/code&gt;
with the job number from the previous &lt;code&gt;DETACH&lt;/code&gt;. Then type &lt;code&gt;CONT&lt;/code&gt; to
continue execution from where you left off.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.login 100,100
JOB 13 KA603 TTY1
Password: 
[LGNJSP Other jobs same PPN:5,12]
1055	31-Jan-79	Tue

.at 5
From job 13

.cont


       1000117
       1000121
       1000133
...
&lt;/pre&gt;
&lt;p&gt;
You can also run jobs in the background - after you press Control-C
type &lt;code&gt;CCONT&lt;/code&gt; to continue the job in the background before &lt;code&gt;DETACH&lt;/code&gt;.
However, if the job does terminal input or output it will pause until
it is attached to a terminal again.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Job information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
You can get an idea of what jobs are running through &lt;code&gt;SYSTAT&lt;/code&gt;. Giving
a job ID as a parameter shows just one job.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.sys 5
 5   100,100	TTY1	SYSTAT	7+SPY	RN	       5 $
&lt;/pre&gt;
&lt;p&gt;
I have not found a way to kill a job that is running apart from
attaching to it and then doing a Control-C.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Batch jobs
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The closest equivalent to shell scripts is the batch job. Here you can
prepare a file with a list of commands and send it for execution via
&lt;code&gt;SUBMIT&lt;/code&gt;. This places it on the batch job queue (which could also
contain jobs submitted via punched cards) and it is run
asynchronously. Here we create a new batch file &lt;code&gt;TEST.JOB&lt;/code&gt; to run the
&lt;code&gt;DIR&lt;/code&gt; and &lt;code&gt;SYS&lt;/code&gt; commands.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.sos test.job
Input: TEST.JOB
00100	dir
00200	sys
00300	$
*es

[DSKB:TEST.JOB]

.submit test.job
&lt;/pre&gt;
&lt;p&gt;
After you submit it you will see some activity on the operator&amp;#39;s
console when it is started. To see the results, check the line printer
output (which is in host file &lt;code&gt;units/printer.txt&lt;/code&gt; if you are using the
&lt;a href=&#34;https://timereshared.com/tops-10-quick-tour-simh/&#34;&gt;TOPS-10 Quickstart&lt;/a&gt;). There will also be a log file created in your
directory, by default with the extension &lt;code&gt;.LOG&lt;/code&gt;. &lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.type test.log

13:24:26 BAJOB	BATCON version 13(1071) running TEST sequence 2 in strea
m 1 for DEMONSTRATIO
13:24:26 BAFIL	Input from DSKB3:TEST.JOB[100,100]
13:24:26 BAFIL	Output to  DSKB0:TEST.LOG[100,100]
13:24:26 BASUM	Job parameters
		Time:00:05:00	Unique:YES	Restart:NO
 
13:24:26 MONTR	
13:24:26 MONTR	.LOGIN 100/100
13:24:26 USER	JOB 14 KA603 TTY15
13:24:26 USER	[LGNJSP Other jobs same PPN:5,12,13]
13:24:26 USER	1324	31-Jan-79	Tue
13:24:27 MONTR	
13:24:27 MONTR	.dir
13:24:27 USER	
13:24:27 USER	CTEST	CBL	2  &amp;lt;057&amp;gt;   21-Apr-78
13:24:27 USER	HELLO	MAC	1  &amp;lt;057&amp;gt;   21-Apr-78
...
&lt;/pre&gt;
&lt;p&gt;
You can also interleave commands and data for the commands by preceding
commands with &lt;code&gt;.&lt;/code&gt; and data with &lt;code&gt;*&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10/AA-0916C-TB_DEC10_Operating_Systems_Command_Manual_Ver_6_03_Aug77.pdf&#34;&gt;Operating Systems Command Manual&lt;/a&gt; on Bitsavers for full
documentation of TOPS-10 commands. The &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10/1972_PDP-10_Users_Handbook/03_beginningBatch.pdf&#34;&gt;Beginner&amp;#39;s Guide to
Multiprocessing Batch&lt;/a&gt; may be useful for batch jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>TOPS-10: Getting data in and out</title>
      <link>https://timereshared.com/tops-10-getting-data-in-and-out/</link>
      <pubDate>Sun, 15 Feb 2026 08:51:00 +0900</pubDate>
      <guid>https://timereshared.com/tops-10-getting-data-in-and-out/</guid>
      <description>
&lt;p&gt;
On a real PDP-10 running TOPS-10, you&amp;#39;d likely to have several
peripherals to allow data to enter and leave the system: line
printers, card punches and readers, paper tape and magnetic tape. One
other alternative we&amp;#39;ve not seen before is &lt;a href=&#34;https://en.wikipedia.org/wiki/DECtape&#34;&gt;DECtape&lt;/a&gt; which were magnetic
tapes with a smaller form factor and a block structured, allowing
random access to files. This meant they could be used as a slow
substitute for hard disks, eg for user files.&lt;/p&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;PDP-10 with DECtapes&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/pdp-10/pdp-10-with-dectapes.jpg&#34; alt=&#34;/images/pdp-10/pdp-10-with-dectapes.jpg&#34; title=&#34;/images/pdp-10/pdp-10-with-dectapes.jpg&#34;/&gt;
&lt;em&gt;PDP-10 with several DECtapes. Source: &lt;a href=&#34;https://commons.wikimedia.org/wiki/File:DEC_PDP-10_Minicomputer_(sometimes_classified_Mainframe)_in_Living_Computer_Museum_(strongly_edited)_).jpg&#34;&gt;Wikipedia&lt;/a&gt;/Jason Scott. License: &lt;a href=&#34;https://en.wikipedia.org/wiki/en:Creative_Commons&#34;&gt;CC0&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
On an emulated system your concerns are different: you want to get
data to and from your host computer. Small amounts of text can be
transferred using copy/paste in your terminal, but this is not
practical for large amounts - especially for pasting, as the console
was expected to be a typewriter and cannot accept text that fast.&lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s look at ways to do this using emulated devices under simh.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Device access
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
As a large computer running time-sharing for many users, one important
concern for the operating system is how to mediate access to
peripheral devices. There are essentially two options on TOPS-10&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Spoolers&lt;/strong&gt; allow several people to share a device. The operating
system maintains a queue of jobs entered by different users, and
processes them one at a time. These spooler jobs are run under the
operator&amp;#39;s ID via a system called OPSER, which you can see running on
the operator&amp;#39;s console after you boot the system. The line printer is
an example of a spooled device.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Assignable&lt;/strong&gt; devices allow you to request sole access to a device,
giving it a logical device name you can use instead of the real
physical device. This is useful for magnetic tape drives, where there
may be several allocated on an as-needed basis to users.&lt;/p&gt;
&lt;p&gt;
The choice of how to share devices was up to each site and can be
configured in the monitor; we&amp;#39;ll just use how it is set up on the
quickstart disk images without changing these.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Printing
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The line printer is a good way to get text data out of the system.
This is a spooled device available as device &lt;code&gt;LPT:&lt;/code&gt;. To print a single
file, use the &lt;code&gt;PRINT&lt;/code&gt; command&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.print hworld.for
Total of 1 block in 1 file in LPT request
&lt;/pre&gt;
&lt;p&gt;
You&amp;#39;ll see a message on the operator&amp;#39;s console saying this is being
processed.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
!11:34:52(L\7)
        Job HWORLD file DSKB1 :HWORLD.FOR   [64,64] for [64,64] started 
        D:HWORLD.FOR   [64,64] Done
&lt;/pre&gt;
&lt;p&gt;
Then look in the file &lt;code&gt;units/printer.txt&lt;/code&gt; on the host
system to find your output. You&amp;#39;ll see the name of the file you
requested to be printed in large letters (on a physical printer this
would allow easy identification of jobs) followed by the file&amp;#39;s text.&lt;/p&gt;
&lt;p&gt;
You can also use the device name where a file would be normally used.
For example, to print all the Fortran files in your directory:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
copy lpt:=*.for
&lt;/pre&gt;
&lt;p&gt;
Note when using the device, the files will not be printed until your
job terminates, ie you log out.&lt;/p&gt;
&lt;p&gt;
In simh, where printer output goes on the host is controlled by the
&lt;code&gt;attach lpt&lt;/code&gt; command in the configuration file. On the quickstart, see
&lt;code&gt;common.ini&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
at lpt  -n units/printer.txt
&lt;/pre&gt;
&lt;p&gt;
The &lt;code&gt;-n&lt;/code&gt; switch will start a new file each time the system is booted.
If you&amp;#39;d prefer to keep the contents of the file over each session and
append to it, replace &lt;code&gt;-n&lt;/code&gt; with &lt;code&gt;-a&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Extracting files to your PC via virtual tape
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
If you want to extract several files from TOPS-10, here is a method
using emulated tapes and the TOPS-10 backup program.&lt;/p&gt;
&lt;p&gt;
You will need to get the &lt;a href=&#34;https://www.pdc.kth.se/~bygg/tops/&#34;&gt;back10&lt;/a&gt; utility by Johnny Eriksson running on
your PC. Download the file &lt;code&gt;back10.tar&lt;/code&gt; from the linked page, untar t
an empty directory and run &lt;code&gt;make&lt;/code&gt; to compile the binary &lt;code&gt;back10&lt;/code&gt;.
Place this on your PATH somewhere.&lt;/p&gt;
&lt;p&gt;
Next, on the simh console, we will create a blank tape file on your PC
&lt;code&gt;backup.tap&lt;/code&gt; and attach it to the emulated tape drive &lt;code&gt;MTA1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Press Control-E to enter simh command mode and then type the following
&lt;code&gt;at&lt;/code&gt; and &lt;code&gt;set&lt;/code&gt; commands, then ~c` to resume TOPS-10.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
Simulation stopped, PC: 000001 (SOJG 6,1)
sim&amp;gt; at mta1 backup.tap
%SIM-INFO: MTA1: creating new file
%SIM-INFO: MTA1: Tape Image &amp;#39;backup.tap&amp;#39; scanned as SIMH format
sim&amp;gt; set mta1 write
sim&amp;gt; c
&lt;/pre&gt;
&lt;p&gt;
Switch to your TOPS-10 login. We will assign the tape to logical name
&lt;code&gt;TAP:&lt;/code&gt; and run &lt;code&gt;BACKUP&lt;/code&gt; . The prompt will change to a &lt;code&gt;/&lt;/code&gt;. We&amp;#39;ll then
use the following &lt;code&gt;BACKUP&lt;/code&gt; commands&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tape&lt;/code&gt; to select the tape drive&lt;/li&gt;
&lt;li&gt;&lt;code&gt;save&lt;/code&gt; to add files - below we add all Fortran files in our home directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unload&lt;/code&gt; to finalise the tape&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Press Control-C to get back to the command level. and finally deassign
the logical tape name. The session will look something like this:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.assign mta1: tap:
MTA001 assigned

.r backup

/tape tap:
/save *.for
!100,100	DSKB

&amp;#34;Done

/unload

[MTA001: WRITE(C/H/S) = 10880/0/0]
/^C

.deassign tap:
&lt;/pre&gt;
&lt;p&gt;
You may get a message &amp;#34;Tape write locked–add write ring then type
&amp;#34;GO&amp;#34;&amp;#34; - just type GO as suggested in this case.&lt;/p&gt;
&lt;p&gt;
On your host PC, use &lt;code&gt;back10&lt;/code&gt; with the &lt;code&gt;-l&lt;/code&gt; switch to list the
contents of the tape file&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
$ back10 -lf backup.tap
  21-Apr-1978 11:13:59  &amp;lt;057&amp;gt;  dskb:[100,100]ftest.for
  17-Jan-1979 14:40:59  &amp;lt;057&amp;gt;  dskb:[100,100]hworld.for
&lt;/pre&gt;
&lt;p&gt;
Use the &lt;code&gt;-x&lt;/code&gt; option to extract files. Here I use &lt;code&gt;-R&lt;/code&gt; and a wildcard
to extract everything. &lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
$ back10  -xf backup.tap  -R &amp;#39;.&amp;#39;  &amp;#39;*.*&amp;#39;
  dskb:[100,100]ftest.for
  dskb:[100,100]hworld.for
&lt;/pre&gt;
&lt;p&gt;
Adding the &lt;code&gt;-b&lt;/code&gt; option will create a directory tree, ie create files
named like &lt;code&gt;dskb/100,100/hworld.for&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Uploading files
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
To upload files from your PC to TOPS-10, we can use the same technique
bur in reverse. First, use &lt;code&gt;back10&lt;/code&gt; with the &lt;code&gt;-c&lt;/code&gt; option to create a
backup tape file. Here we create the tape &lt;code&gt;transfer.tap&lt;/code&gt; containing a
single file &lt;code&gt;test.for&lt;/code&gt;. Note we provide destination disk and user
information using the &lt;code&gt;-U&lt;/code&gt; switch which will help simplify things when
we extract the files later.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
$ back10 -cf transfer.tap -U dskb:100,100 tesr.for
&lt;/pre&gt;
&lt;p&gt;
Switch back to the simh console, press Control-E and attach the new
file.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
sim&amp;gt; at mta1 transfer.tap
%SIM-INFO: MTA1: Tape Image &amp;#39;transfer.tap&amp;#39; scanned as SIMH format
sim&amp;gt; c
&lt;/pre&gt;
&lt;p&gt;
Go to your TOPS-10 login and use &lt;code&gt;BACKUP&lt;/code&gt; with the &lt;code&gt;RESTORE&lt;/code&gt; command
to get all the files in the archive:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
assign mta1: tap:

.r backup

/tape tap:
/restore *.*
!100,100	DSKB

&amp;#34;Done

/^C
&lt;/pre&gt;
&lt;p&gt;
There are several other &lt;code&gt;BACKUP&lt;/code&gt; commands available at the &lt;code&gt;/&lt;/code&gt; prompt.
Type &lt;code&gt;HELP&lt;/code&gt; for more information. One is &lt;code&gt;PRINT&lt;/code&gt;, which will print a
listing of the tape on the line printer&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Other methods
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
One potential way to interchange files is &lt;a href=&#34;https://www.kermitproject.org/pdp10.html&#34;&gt;Kermit&lt;/a&gt;, which allows you to
send and receive files interactively over your terminal connection.
There is a version on the TOPS-10 v6.03 disk images that we are using,
but it only works for download of files from TOPS-10 to your local
machine, uploads do not work. A &lt;a href=&#34;https://groups.google.com/g/pidp-10/c/4bPfRGxhy6M/m/Eg1qbvO9BgAJ&#34;&gt;thread&lt;/a&gt; on the PiDP-10 group indicates
that there is a newer version of Kermit that does work, but it is only
compatible with TOPS-10 v7.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10/AA-0916C-TB_DEC10_Operating_Systems_Command_Manual_Ver_6_03_Aug77.pdf&#34;&gt;Operating Systems Command Manual&lt;/a&gt; on Bitsavers for full
documentation of TOPS-10 commands such as &lt;code&gt;PRINT&lt;/code&gt; and &lt;code&gt;BACKUP&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;A draft version of this article was publushed in error on
8-Feb-2026.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>TOPS-10: The SOS text editor</title>
      <link>https://timereshared.com/tops-10-sos-editor/</link>
      <pubDate>Sun, 08 Feb 2026 09:02:00 +0900</pubDate>
      <guid>https://timereshared.com/tops-10-sos-editor/</guid>
      <description>
&lt;p&gt;
In this post we&amp;#39;ll look at the simple but powerful SOS text editor on
TOPS-10.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Starting SOS
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Type &lt;code&gt;sos file.ext&lt;/code&gt;: if this is a new file SOS will print INPUT and
put you in a mode where you can type lines. If it is an existing file
it will print EDIT and you will be in command mode.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Inputting text
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
SOS will automatically assign numbers to each line which you will see
on the left. You can type each line normally, making corrections using
Delete, Control-U like on the &lt;a href=&#34;https://timereshared.com/tops-10-quick-tour-simh/&#34;&gt;command line&lt;/a&gt;. When you have finished
inserting text, press Escape; SOS will print &lt;code&gt;$&lt;/code&gt; and return you to
command mode.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
SOS command format
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
At the &lt;code&gt;*&lt;/code&gt; prompt, SOS accepts commands which are generally single
letters followed by which lines to work on.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prints around 16 lines around the current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prints just the current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p 500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prints line 500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p 600:700&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prints lines 600-700&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p ^:*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print from first line to last line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Let&amp;#39;s load up and print our hello world program from before.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.sos hworld.for
Edit: HWORLD.FOR
*p
00100		DO 1 J=1,5
00200	1	WRITE(5, 2)
00300	2	FORMAT(&amp;#39; HELLO, WORLD&amp;#39;)
00400		END
*
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Quick navigation
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Once you select a line (eg via &lt;code&gt;p 500&lt;/code&gt; above) you can quickly move up
and down by pressing Escape to move up one line and Control-J to move
down one line; SOS will print the line it has moved to.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Replace, Insert, Delete
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The &lt;code&gt;R&lt;/code&gt;, &lt;code&gt;I&lt;/code&gt; and &lt;code&gt;D&lt;/code&gt; commands replace, insert and delete lines. Each
take a line specification like above. &lt;code&gt;R&lt;/code&gt; will prompt you to enter the
new line to replace it. &lt;code&gt;I&lt;/code&gt; will insert a line after the one you
specified, giving it an appropriate line number. An example of
changing our hello world program to print a different message twice:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
*r300
00300	2	FORMAT(&amp;#39; GOODBYE, WORLD&amp;#39;)
1 Lines (00300/1) deleted
*i100
00150		WRITE(5,2)
*p^:*
00100		DO 1 J=1,5
00150		WRITE(5, 2)
00200	1	WRITE(5, 2)
00300	2	FORMAT(&amp;#39; GOODBYE, WORLD&amp;#39;)
00400		END
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Exiting SOS
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
At the &lt;code&gt;*&lt;/code&gt; prompt, type &lt;code&gt;E&lt;/code&gt; to save and exit, &lt;code&gt;ES&lt;/code&gt; to save without
line numbers and exit, and &lt;code&gt;EQ&lt;/code&gt; to exit without saving changes. Some
programs do not accept line numbers hence the &lt;code&gt;ES&lt;/code&gt; option; even if you
do remove them, if you edit the file in SOS again it will add them
back.&lt;/p&gt;
&lt;p&gt;
Those are all the commands you need to do most editing tasks. But read
on for additional features that make life easier. Alternatively, you
can type &lt;code&gt;H&lt;/code&gt; at the prompt to view the help file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Find and replace
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The &lt;code&gt;F&lt;/code&gt; command finds the next line with the specified text. You type
&lt;code&gt;F&lt;/code&gt;, then the text to find, then Escape and finally Return and it will
print out the matching line. Note that SOS prints &lt;code&gt;$&lt;/code&gt; when you type
Escape.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
*fgoodbye$
00400	2	FORMAT(&amp;#39;GOODBYE, WORLD&amp;#39;)
&lt;/pre&gt;
&lt;p&gt;
After the Escape, but before the Return, you could also type a line
number range.&lt;/p&gt;
&lt;p&gt;
To find the next instance of the same text, just type &lt;code&gt;F&lt;/code&gt; on its own
again.&lt;/p&gt;
&lt;p&gt;
To replace part of text without retyping the whole line, use the &lt;code&gt;S&lt;/code&gt;
command. Type &lt;code&gt;S&lt;/code&gt;, the old text to replace, Escape, the new text and
then Escape. You then must add a line range before pressing Return, so
to replace on the current line you could use &lt;code&gt;.&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
00400	2	FORMAT(&amp;#39;GOODBYE, WORLD&amp;#39;)
*sGOODBYE$HELLO$.
00400	2	FORMAT(&amp;#39;HELLO, WORLD&amp;#39;)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Alter mode
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
This is a special mode where you can edit a line using interactive
commands. Type &lt;code&gt;A&lt;/code&gt; and your line number (or &lt;code&gt;.&lt;/code&gt;) and SOS will print
the line number. You can then type Space to move forwards one
character, Delete to move back one character. SOS will print character
by character as you do this navigation so you can see where you are.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;D&lt;/code&gt; will delete the next character; &lt;code&gt;I&lt;/code&gt; will allow you to insert text
until you press Escape. Commands take prefixes to say how many
characters to operate on.&lt;/p&gt;
&lt;p&gt;
In the example below I wanted to change HELLO to GOODBYE. I pressed
Space until I got to the start of the word then pressed  &lt;code&gt;5D&lt;/code&gt; to
delete HELLO. I then pressed &lt;code&gt;I&lt;/code&gt;, typed GOODBYE, then Escape, then
finally Return to accept the rest of the line.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
*p400
00400	2	FORMAT(&amp;#39; HELLO, WORLD&amp;#39;)
*a.
00400	2	FORMAT(&amp;#39; \\HELLO\\GOODBYE, WORLD&amp;#39;)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-9&#34;&gt;
Quit-and-go, renumbering files
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Instead of saving and exiting with &lt;code&gt;E&lt;/code&gt;, you can type &lt;code&gt;G&lt;/code&gt; and it will
save and then execute (compile, load, run) the file - more precisely,
it will remember the last command you ran and execute that. But this
allows rapid edit-compile-run-edit loops.&lt;/p&gt;
&lt;p&gt;
The &lt;code&gt;N&lt;/code&gt; command will renumber your lines - useful if you have done a
lot of inserts into existing text.&lt;/p&gt;
&lt;p&gt;
There&amp;#39;s more, such as the ability to take editing commands from a file
and to cut/copy text to move it around the file: see the Reference
Guide linked below for details.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
Summary of commands
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Alter mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Copy text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;Delete lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;Save and exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES&lt;/td&gt;
&lt;td&gt;Save without line numbers, exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EQ&lt;/td&gt;
&lt;td&gt;Exit without saving&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;Find&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;td&gt;Save and execute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;Help&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;Insert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;J&lt;/td&gt;
&lt;td&gt;Join lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jc&lt;/td&gt;
&lt;td&gt;Justify lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;td&gt;Delete page mark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;List to line printer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;Set page mark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;Renumber lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P&lt;/td&gt;
&lt;td&gt;Prints lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;Replace lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Substitute text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;Cut text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;Case inversion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;Save, but do not exit.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;Extend (append) to a line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-11&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-11&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-11&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10_softwareNotebooks/vol01/DEC-10-USOSA-A-D_SOS_Users_Guide_Jul75.pdf&#34;&gt;SOS User&amp;#39;s Guide&lt;/a&gt; and the &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10_softwareNotebooks/vol03/AA_D598A_SOS_Reference_Manual_Jul78.pdf&#34;&gt;SOS Reference Manual&lt;/a&gt; on Bitsavers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-12&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-12&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-12&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>TOPS-10: Files and directories</title>
      <link>https://timereshared.com/tops-10-files-and-directories/</link>
      <pubDate>Sun, 01 Feb 2026 09:11:00 +0900</pubDate>
      <guid>https://timereshared.com/tops-10-files-and-directories/</guid>
      <description>
&lt;p&gt;
In this post we&amp;#39;ll look at how TOPS-10 handles files and directories,
along with the commands to manipulate them.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Files
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Files are named &lt;code&gt;file.ext&lt;/code&gt; where &lt;code&gt;file&lt;/code&gt; is 1-6 characters long and
&lt;code&gt;ext&lt;/code&gt; 0-3. The extension is used to identify the type of file, eg
&lt;code&gt;HELLO.FOR&lt;/code&gt; would be a Fortran source code file.&lt;/p&gt;
&lt;p&gt;
The &lt;code&gt;*&lt;/code&gt; and &lt;code&gt;?&lt;/code&gt; wildcards operate like we are used to now, &lt;code&gt;?&lt;/code&gt;
matching one character and &lt;code&gt;*&lt;/code&gt; matching any number of characters. An
example using the &lt;code&gt;DIR&lt;/code&gt; command:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.dir hworld.*

HWORLD	FOR     1  &amp;lt;057&amp;gt;   12-Jan-79	DSKB:	[100,100]
HWORLD	REL     1  &amp;lt;057&amp;gt;   12-Jan-79
  Total of 2 blocks in 2 files on DSKB: [100,100]
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Manipulating files
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;code&gt;COPY&lt;/code&gt;, &lt;code&gt;RENAME&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; do what you&amp;#39;d expect, but note that for
the first two you put the new name first followed by an &lt;code&gt;=&lt;/code&gt;. For
example, to copy &lt;code&gt;HWORLD.FOR&lt;/code&gt; to &lt;code&gt;H2.FOR&lt;/code&gt; and then rename it to
&lt;code&gt;H#.FOR&lt;/code&gt; you&amp;#39;d do:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.copy h2.for=hworld.for

.rename h3.for=h2.for
Files renamed:
H2.FOR 

.dir h*.for

HWORLD	FOR     1  &amp;lt;057&amp;gt;   12-Jan-79	DSKB:	[100,100]
H3	FOR     1  &amp;lt;057&amp;gt;   15-Jan-79
  Total of 2 blocks in 2 files on DSKB: [100,100]
&lt;/pre&gt;
&lt;p&gt;
Many of these commands are implemented using the PIP utility, which
I&amp;#39;ll look at in a later post.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Users and directories
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Users are identified by a project number and a programmer number.
These are both octal values (ie they consist of the digits 0-7), and
values for both lower than 7 are reserved by the operating system. If
you followed the &lt;a href=&#34;https://timereshared.com/tops-10-quick-tour-simh/&#34;&gt;quick start&lt;/a&gt; you logged in as project 100,
programmer 100.&lt;/p&gt;
&lt;p&gt;
This is tied together with the concept of the directory. There is a
Master File Directory and below that a User File Directory for each
valid project/programmer pair. These are enclosed in square brackets
when referencing files, for example:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.dir [100,100]hworld.for

HWORLD	FOR     1  &amp;lt;057&amp;gt;   12-Jan-79	DSKB:	[100,100]
&lt;/pre&gt;
&lt;p&gt;
Project/programmer numbers can also be wirldcarded.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;[1,1]&lt;/code&gt; is also the Master File Directory, so you can see a list of
all User File Directories by:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.dir [1,1]

     1,1	1  &amp;lt;555&amp;gt;   21-Apr-78	DSKB:	[1,1]
     1,4	4  &amp;lt;775&amp;gt;   21-Apr-78
     3,3	0  &amp;lt;777&amp;gt;   21-Apr-78
...
&lt;/pre&gt;
&lt;p&gt;
You can create sub-directories using the &lt;code&gt;CREDIR&lt;/code&gt; command. For
example, to create a sub-directory &lt;code&gt;test&lt;/code&gt; under my user directory I
would run &lt;code&gt;CREDIR&lt;/code&gt; and at the prompt give the response &lt;code&gt;[,,test]&lt;/code&gt;. I
could have typed &lt;code&gt;[100,100,test]&lt;/code&gt; but as this is my current log on it
allows me to omit it. Running this looks like the below:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.r credir

Create directory: [,,test]
  Created DSKB1:[100,100,TEST].SFD/PROTECTION:775
Create directory: ^C
&lt;/pre&gt;
&lt;p&gt;
I can then use this in commands.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.dir [,,test]

%WLDDEM Directory DSK:[100,100,TEST] is empty
&lt;/pre&gt;
&lt;p&gt;
It is possible to change your current directory, but it is a little
more involved then typing &lt;code&gt;cd&lt;/code&gt; on modern systems. Use the &lt;code&gt;SETSRC&lt;/code&gt;
program and give it the &lt;code&gt;CP&lt;/code&gt; command followed by the desired directory
at the &lt;code&gt;*&lt;/code&gt; prompt. The &lt;code&gt;TP&lt;/code&gt; command will list your current directory.
Type Control-C to exit.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.r setsrc

*tp
[100,100]/NOSCAN
*cp [,,test]

*tp
[100,100,TEST]/NOSCAN
*^C
&lt;/pre&gt;
&lt;p&gt;
To delete a sub-directory, ensure it is empty and then use &lt;code&gt;DELETE&lt;/code&gt; on
the SFD file representing the directory. So for our example here,
&lt;code&gt;test&lt;/code&gt;, you would do &lt;code&gt;DELETE TEST.SFD&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Devices
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Physical devices, such as tape drives, disks and the terminal, are
referred to by device names which are 1-3 characters long, an optional
digit followed by a colon. Some examples:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Device&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CDP:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Card punch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CDR:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Card reader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DTA000:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DECTape unit #0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DTA001:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DECTape unit #1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LPT:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Line printer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SYS:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TTY:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
You can see a list of physical devices on the system by typing
&lt;code&gt;RESOURCES&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
These can be referred to in commands. To type the contents of
&lt;code&gt;HWORLD.FOR&lt;/code&gt; to your terminal you&amp;#39;d normally do &lt;code&gt;TYPE HWORLD.FOR&lt;/code&gt; but
you could also do &lt;code&gt;COPY TTY:=HWORLD.FOR&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
There are also device names pointing to directories. An example is
&lt;code&gt;SYS:&lt;/code&gt;, the location on disk where system executable files are stored.
We can see from the &lt;code&gt;DIR&lt;/code&gt; command below that &lt;code&gt;SYS~&lt;/code&gt; points to user
&lt;code&gt;[1,4]&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.dir sys:pip.exe

PIP	EXE    44  &amp;lt;155&amp;gt;    8-Nov-76	33B(260)	DSKB:	[1,4]
&lt;/pre&gt;
&lt;p&gt;
You can create logical device names. Say your program was reading from
a DECTape where the unit may change depending on what is in use.
Rather than hard-coding the physical name, you can set up a logical
name with &lt;code&gt;ASSIGN&lt;/code&gt; - for example &lt;code&gt;ASSIGN DTA000: ABC:&lt;/code&gt; - and then use
&lt;code&gt;ABC:&lt;/code&gt; to refer to the tape. &lt;code&gt;DEASSIGN&lt;/code&gt; will remove the logical name.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Protection
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
A file has a protection code which is 3 octal digits enclosed in angle
brackets like &lt;code&gt;&amp;lt;O57&amp;gt;&lt;/code&gt;. Each digit applies to a different class of user.. &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Digit&lt;/th&gt;
&lt;th&gt;Applies to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;First&lt;/td&gt;
&lt;td&gt;You&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Second&lt;/td&gt;
&lt;td&gt;Users with the same project number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third&lt;/td&gt;
&lt;td&gt;All users&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
The values for each digit and their meaning:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&#34;align-right&#34;&gt;Digit&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;7&lt;/td&gt;
&lt;td&gt;No access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;6&lt;/td&gt;
&lt;td&gt;Execute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;5&lt;/td&gt;
&lt;td&gt;Read and execute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;4&lt;/td&gt;
&lt;td&gt;Append and everything in 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;3&lt;/td&gt;
&lt;td&gt;Update and everything in 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;2&lt;/td&gt;
&lt;td&gt;Write and everything in 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1&lt;/td&gt;
&lt;td&gt;Rename and everything in 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;0&lt;/td&gt;
&lt;td&gt;Change protection and everything in 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
So a code of &amp;lt;057&amp;gt;, which is the default, means you can do anything,
people in your project can read/execute, and all other users have no
access.&lt;/p&gt;
&lt;p&gt;
Protection can be applied using the &lt;code&gt;PROTECT&lt;/code&gt; command:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
protect hworld.for&amp;lt;025&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Or directly at file creation time, eg via copy&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
copy world.for&amp;lt;000&amp;gt;=hworld.for
&lt;/pre&gt;
&lt;p&gt;
The default protection can be changed with &lt;code&gt;SET DEFAULT PROTECTION&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Disk quota
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Each regular user has an allowance of how much data they can store on
disk. A higher quota is given for when you are logged in compared to
logged out, to allow for creation of temporary files. The &lt;code&gt;QUOLST&lt;/code&gt;
command allows you to see this: the units are 128-word blocks, so 576
bytes per block.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.r quolst

User:	100,100
Str	used   left:(in) (out)	(sys)
DSKB:	  135	99865	99865	132307
&lt;/pre&gt;
&lt;p&gt;
On an emulated system today this is not a concern. On a real system
with small disks and many users, the quota could be set quite low (I
read that some undergraduates were limited to 5 blocks).&lt;/p&gt;
&lt;p&gt;
An alternate way to log out of the system is &lt;code&gt;KJOB&lt;/code&gt;. This will give
options for you to manage your files to get them under quota.&lt;/p&gt;
&lt;p&gt;
The quotas are set via the user administration utility &lt;code&gt;REACT&lt;/code&gt;, which
we&amp;#39;ll look at later.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10/AA-0916C-TB_DEC10_Operating_Systems_Command_Manual_Ver_6_03_Aug77.pdf&#34;&gt;Operating Systems Command Manual&lt;/a&gt; on Bitsavers for full
documentation of TOPS-10 commands.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>TOPS-10: A quick tour using simh</title>
      <link>https://timereshared.com/tops-10-quick-tour-simh/</link>
      <pubDate>Sun, 25 Jan 2026 09:31:00 +0900</pubDate>
      <guid>https://timereshared.com/tops-10-quick-tour-simh/</guid>
      <description>
&lt;p&gt;
In this post I will show how to get TOPS-10 version 6.03 running using
the simh emulator.&lt;/p&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;TOPS-10 startup&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/pdp-10/tops-10-startup.png&#34; alt=&#34;/images/pdp-10/tops-10-startup.png&#34; title=&#34;/images/pdp-10/tops-10-startup.png&#34;/&gt;
&lt;em&gt;Starting up TOPS-10, with the console on top and the user login below. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
The quick start repo
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I have put together a &lt;a href=&#34;https://github.com/timereshared/dec-tops-10-simh-quickstart&#34;&gt;repo&lt;/a&gt; on Github that uses &lt;a href=&#34;https://sky-visions.com/dec/tops10.shtml&#34;&gt;Richard Cornwell&amp;#39;s&lt;/a&gt; KA
PDP-10 KA simh emulator along with a ready-to-use disk image or TOPS-10
6.03 produced by the &lt;a href=&#34;https://github.com/obsolescence/pidp10&#34;&gt;PiDP-10&lt;/a&gt; project, which contains a tested install
of the operating system along with many additional programs such as
compilers.&lt;/p&gt;
&lt;p&gt;
To use this, you will need a Unix-like environment capable of running
a shell, git, make, a C compiler, wget and unzip.&lt;/p&gt;
&lt;p&gt;
You will also need the &lt;code&gt;telnet&lt;/code&gt; command line program or a GUI telnet
client.&lt;/p&gt;
&lt;p&gt;
First, clone the repo and cd into it&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
git clone https://github.com/timereshared/dec-tops-10-simh-quickstart.git
cd dec-tops-10-simh-quickstart
&lt;/pre&gt;
&lt;p&gt;
Then type &lt;code&gt;./build.sh&lt;/code&gt;. This will&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download opensimh using git and compile the pdp10-ka emulator binary.&lt;/li&gt;
&lt;li&gt;Download a copy of the TOPS-10 disk images.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This will take around 2-3 minutes and will only need to be done once.
The virtual disks are stored in &lt;code&gt;disks/&lt;/code&gt; and take up about 310MB of
space.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Start TOPS-10
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Type &lt;code&gt;./run.sh&lt;/code&gt;. The system will boot up and the date/time will be set
automatically using today&amp;#39;s day/month but with the year set to 1979.
as this version of TOPS-10 is not Y2K compliant.&lt;/p&gt;
&lt;p&gt;
Sometimes the system hangs after printing &lt;code&gt;%DPA7 IS OFF-LINE&lt;/code&gt;. In this
case, press Control-E, type &lt;code&gt;q&lt;/code&gt; and then &lt;code&gt;./run.sh&lt;/code&gt; again.&lt;/p&gt;
&lt;p&gt;
If all goes well, you will see it print &lt;code&gt;KA603 (time) CTY system 50&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Using a telnet client, connect to port 10603 (eg via &lt;code&gt;telnet 0
10603&lt;/code&gt;.)&lt;/p&gt;
&lt;p&gt;
You can then login as user &lt;code&gt;100,100&lt;/code&gt; and password &lt;code&gt;demo1&lt;/code&gt;. Type &lt;code&gt;login
100,100&lt;/code&gt; and then enter the password at the prompt. Your screen will
look something like the image at the top of this post.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Using the TOPS-10 CLI
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The command line interface has a &lt;code&gt;.&lt;/code&gt; as its prompt. When you type
commands you can use backspace to correct mistakes, but as the system
was used on teletypes it will not rub out characters,
instead printing what has been deleted between backslashes. For
example, if I typed &lt;code&gt;abcdef&lt;/code&gt;, realised the last three letters were
wrong, deleted them and typed &lt;code&gt;xyz&lt;/code&gt; the screen would look like.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.ABCDEF\FED\XYZ
&lt;/pre&gt;
&lt;p&gt;
If you make several mistakes you can request the whole line to be
retyped by pressing Control-R. Control-U can be used to delete the
entire line.&lt;/p&gt;
&lt;p&gt;
Control-T will print a line of system statistics, including the
current job you are running.&lt;/p&gt;
&lt;p&gt;
You can enter a command of more than a single line by typing &lt;code&gt;-&lt;/code&gt; as
the last character on a line, pressing Enter, and continuing the
command text on the next line.&lt;/p&gt;
&lt;p&gt;
Commands can generally be abbreviated: for example instead of typing
&lt;code&gt;DIRECTORY&lt;/code&gt; to see a list of your files, you can just type &lt;code&gt;DIR&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
There is an online help facility accessed by typing &lt;code&gt;HELP&lt;/code&gt;. You can
view details of a single command by giving its full name as a parameter, eg
&lt;code&gt;HELP DIRECTORY&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Creating a simple program
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Let&amp;#39;s create a simple hello world program using Fortran. We will use
the SOS editor to create the source file then compile it and run it.&lt;/p&gt;
&lt;p&gt;
Type &lt;code&gt;SOS HWORLD.FOR&lt;/code&gt; to create a new file and put us in the
editor. As this is a new file, the editor will allow you enter text
immediately. It will precede each line with a line number (which is not
a Fortran label) automatically. So the screen will look something
like this after you start SOS.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.sos hworld.for
Input: HWORLD.FOR
00100
&lt;/pre&gt;
&lt;p&gt;
Type the following program. Where you see &lt;code&gt;⭾&lt;/code&gt; below you should press
the Tab key rather than typing spaces.&lt;/p&gt;
&lt;div class=&#34;src src-fortran&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fortran&#34; data-lang=&#34;fortran&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;⭾&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;DO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; J&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;⭾&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;WRITE&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;⭾&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; HELLO, WORLD&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;⭾&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Now to exit inserting press Alt-mode - which is Escape on your
keyboard - and SOS will respond with &lt;code&gt;$&lt;/code&gt; and then &lt;code&gt;*&lt;/code&gt; to show you
are back at its prompt. If you have made a mistake, you can replace a
line by typing &lt;code&gt;Rnnn&lt;/code&gt; where &lt;code&gt;nnn&lt;/code&gt; is the line number. &lt;/p&gt;
&lt;p&gt;
When ready, type &lt;code&gt;ES&lt;/code&gt; at the prompt to exit with unsequenced lines (ie
don&amp;#39;t preserve the line numbers).&lt;/p&gt;
&lt;p&gt;
The complete editing session will look like this:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.sos hworld.for
Input: HWORLD.FOR
00100		DO 1 J=1,5
00200	1	WRITE(5, 2)
00300	2	FORMAT(&amp;#39; HELLO, WORLD&amp;#39;)
00400		END
00500	$
*es

[DSKB:HWORLD.FOR]
.
&lt;/pre&gt;
&lt;p&gt;
You can use &lt;code&gt;TYPE&lt;/code&gt; to see the contents of the file:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.type hworld.for
	DO 1 J=1,5
1	WRITE(5, 2)
2	FORMAT(&amp;#39; HELLO, WORLD&amp;#39;)
	END
&lt;/pre&gt;
&lt;p&gt;
Now use &lt;code&gt;EXECUTE&lt;/code&gt; to compile, load and run the program:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.execute hworld
FORTRAN: HWORLD
MAIN. 	
LINK:	Loading
[LNKXCT HWORLD Execution]

HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD

END OF EXECUTION
CPU TIME: 0.00	ELAPSED TIME: 0.00
EXIT
&lt;/pre&gt;
&lt;p&gt;
You can use &lt;code&gt;DIR&lt;/code&gt; with a wildcard to show the files that have been
created.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.DIR HWORLD.*

HWORLD	REL     1  &amp;lt;057&amp;gt;   12-Jan-79	DSKB:	[100,100]
HWORLD	FOR     1  &amp;lt;057&amp;gt;   12-Jan-79
  Total of 2 blocks in 2 files on DSKB: [100,100]
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Logging off and shutting down the system
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
In the telnet window, type &lt;code&gt;R LOGOUT&lt;/code&gt; to end your session.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.R LOGOUT

Job 4, User [100,100]  Logged off TTY0     1047  12-Jan-79
Saved all files (45 blocks)
Runtime 0.57 Sec
&lt;/pre&gt;
&lt;p&gt;
To shut down the system, switch to the simh window, press Control-E
and type &lt;code&gt;do shutdown.ini&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
Simulation stopped, PC: 146766 (JRST 0,146772)
sim&amp;gt; do shutdown.ini
:kill all

 **
BOOTS
Goodbye
$
&lt;/pre&gt;
&lt;p&gt;
When you want to use the system again, type &lt;code&gt;./run.sh&lt;/code&gt; and log in as before.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
In the TOPS-10 Software Notebooks on Bitsavers, &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10_softwareNotebooks/vol01/DEC-XGSDA-A-D_Getting_Started_With_DECsystem-10_Mar75.pdf&#34;&gt;Getting Started with
Decsystem-10&lt;/a&gt; covers similar material.&lt;/p&gt;
&lt;p&gt;
See &lt;a href=&#34;https://sky-visions.com/dec/tops10.shtml&#34;&gt;Richard Cornwell&amp;#39;s&lt;/a&gt; TOPS-10 kit page for other versions of the
operating system. The kits also contain simh scripts to build the
system froms scratch, which is useful if you want to customise it
further.&lt;/p&gt;
&lt;p&gt;
The PiDP-10 project&amp;#39;s &lt;a href=&#34;https://github.com/obsolescence/pidp10&#34;&gt;software&lt;/a&gt; provides an integrated system that can
run TOPS-10, ITS and TOPS-20, even without a physical PiDP-10.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>DEC TOPS-10</title>
      <link>https://timereshared.com/dec-tops-10/</link>
      <pubDate>Sun, 18 Jan 2026 09:22:00 +0900</pubDate>
      <guid>https://timereshared.com/dec-tops-10/</guid>
      <description>
&lt;p&gt;
For background information on the PDP-10, see the &lt;a href=&#34;https://timereshared.com/dec-pdp-10&#34;&gt;previous article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
TOPS-10 (standing for either Time-sharing or Total Operating
System-10) was DEC&amp;#39;s first operating system for the PDP-10 family of
computers. It grew out of the original Monitor for the PDP-6 released
in 1964, with the TOPS-10 name coming around the time the PDP-10 was
launched. It received many updates adding new functionality and
support for newer hardware, with the final release coming in 1988.&lt;/p&gt;
&lt;p&gt;
TOPS-10 drew influences from &lt;a href=&#34;https://timereshared.com/ctss/&#34;&gt;CTSS&lt;/a&gt;, such as project/programmer numbers
to identify users and the load/save model for program images. In turn it
influenced many later operating systems, both from DEC and elsewhere -
its use of three letter file extensions and the / to introduce command
line switches will be familiar to MS-DOS users.&lt;/p&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;PDP-10 Time-sharing handbook&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/pdp-10/pdp-10-time-sharing-handbook.png&#34; alt=&#34;/images/pdp-10/pdp-10-time-sharing-handbook.png&#34; title=&#34;/images/pdp-10/pdp-10-time-sharing-handbook.png&#34;/&gt;
&lt;em&gt;Detail from the cover of the &lt;span style=&#34;text-decoration: underline;&#34;&gt;PDP-10 Time-sharing Handbook&lt;/span&gt; 1970. Source: &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10/1970_PDP-10_Timesharing_Handbook.pdf&#34;&gt;Bitsavers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Versions
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Phil Budne&amp;#39;s &lt;a href=&#34;https://www.ultimate.com/phil/pdp10/tops-10&#34;&gt;guide&lt;/a&gt; to TOPS-10 evolution provides an overview of
release dates and features for each version. Richard Cornwell&amp;#39;s &lt;a href=&#34;https://sky-visions.com/dec/tops10.shtml&#34;&gt;list&lt;/a&gt;
of software kits shows what&amp;#39;s available.&lt;/p&gt;
&lt;p&gt;
In thus series of blog posts we&amp;#39;re going to focus on version 6.03 from
1977, running on the PDP-10 KA processor. We&amp;#39;ll use Richard Cornwell&amp;#39;s
pdp10-ka simh emulator to run this.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
TOPS-10 features
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
TOPS-10 has a resident supervisor which has a dual role: firstly,
providing access to machine resources and scheduling tasks, similar to
a kernel on Unix based OSs. Its second role is to provide the main
interface to user via the command control language - similar to a
shell, but with code shared by users. Scheduling was done via
priority queues, with support for real-time jobs.&lt;/p&gt;
&lt;p&gt;
The system can swap jobs in and out of disk and share code segments
between programs. The particular version we are looking at did not
support virtual memory and paging, however.&lt;/p&gt;
&lt;p&gt;
Users are identified by a project/programmer pair of numbers - eg [10,
11] - and access to the system is controlled by a password for each
user.&lt;/p&gt;
&lt;p&gt;
The file system can span multiple disks. Each user gets their own
directory to store files, and can share files by granting access to
them. It&amp;#39;s also possible for users to create sub-directories.&lt;/p&gt;
&lt;p&gt;
Peripheral devices such as printers, tapes or punched can either by
shared by all users, with spoolers running to marshal access, or can
be allocated to a specific user via a command.&lt;/p&gt;
&lt;p&gt;
The core system provides a set of utilities to manage files - both by
individual commands such as RENAME and the powerful PIP (peripheral
interchange program). Several editors were provided, from the simple
SOS to the more complex TECO. Compilers and interpreters were
available for BASIC, Fortran, COBOL and many other languages.&lt;/p&gt;
&lt;p&gt;
The system has a batch facility that allows jobs to be run at the same
time as time-sharing users are logged in.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Topics
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
In this series of blog posts I plan to cover&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/tops-10-quick-tour-simh/&#34;&gt;A quick start guide&lt;/a&gt; to getting TOPS-10 running under emulation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/tops-10-files-and-directories/&#34;&gt;Files and directories.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/tops-10-sos-editor/&#34;&gt;SOS&lt;/a&gt;, which is a fairly easy-to-use text editor.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/tops-10-getting-data-in-and-out/&#34;&gt;Getting data into and out of the system.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/tops-10-jobs/&#34;&gt;Jobs on TOPS-10&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Utilities: PIP, RUNOFF, FILCOM and SEND.&lt;/li&gt;
&lt;li&gt;Users: getting information, creating new users, security.&lt;/li&gt;
&lt;li&gt;The TECO text editor&lt;/li&gt;
&lt;li&gt;Installing TOPS-10 from scratch  &lt;/li&gt;
&lt;li&gt;Programming under TOPS-10&lt;/li&gt;
&lt;li&gt;A look at each programming language supported.&lt;/li&gt;
&lt;li&gt;The Interactive Query Language database system&lt;/li&gt;
&lt;li&gt;The DECUS software collections&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Bitsavers has a wide collection of documentation: see the &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10/&#34;&gt;TOPS10&lt;/a&gt; and
&lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10_softwareNotebooks/&#34;&gt;TOPS10 Software Notebooks&lt;/a&gt; directories. Note that these cover different
versions of the operating system, so not all features may work - check
the date on each manual. A good place to start is 1974&amp;#39;s &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10_softwareNotebooks/vol01/DEC-10-MZDC-D_Introduction_to_DECsystem-10_Software_Aug74.pdf&#34;&gt;Introduction
to DECsystem-10 Software&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;span style=&#34;text-decoration: underline;&#34;&gt;January 2026&lt;/span&gt;: Lars Brinkhoff pointed out an error I made regarding
the launch date of the PDP-10 and the name change of the OS to be
TOPS-10. The first PDP-10 KAs were shipped in 1967. The name TOPS-10
started being used around that time, but I could not find an exact
date.&lt;/p&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>DEC PDP-10</title>
      <link>https://timereshared.com/dec-pdp-10/</link>
      <pubDate>Sun, 11 Jan 2026 09:17:00 +0900</pubDate>
      <guid>https://timereshared.com/dec-pdp-10/</guid>
      <description>
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;PDP-10 collage&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/pdp-10/pdp-10-reference-handbook-detail.jpg&#34; alt=&#34;/images/pdp-10/pdp-10-reference-handbook-detail.jpg&#34; title=&#34;/images/pdp-10/pdp-10-reference-handbook-detail.jpg&#34;/&gt;
&lt;em&gt;Detail from the cover of the &lt;span style=&#34;text-decoration: underline;&#34;&gt;PDP-10 Reference Handbook&lt;/span&gt; 1970. Source: &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/1970_PDP-10_Ref/&#34;&gt;Bitsavers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
The PDP-10 family of computers (under different names) was
manufactured by Digital Equipment Corporation between 1964 and 1983.
Designed for time-sharing, batch and real-time systems, these
computers were popular with universities, scientific companies and
time-sharing bureaux. Several operating systems were available, some
from DEC and some built by its users.&lt;/p&gt;
&lt;p&gt;
It had a large influence on operating system design, artificial
intelligence (especially at &lt;a href=&#34;https://en.wikipedia.org/wiki/MIT_Computer_Science_and_Artificial_Intelligence_Laboratory&#34;&gt;MIT&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Stanford_University_centers_and_institutes#Stanford_Artificial_Intelligence_Laboratory&#34;&gt;Stanford&lt;/a&gt;), programming languages
(LISP, &lt;a href=&#34;https://en.wikipedia.org/wiki/ML_(programming_language)&#34;&gt;ML&lt;/a&gt;), applications (TeX, Emacs), online communication (ARPANET,
&lt;a href=&#34;https://en.wikipedia.org/wiki/CompuServe&#34;&gt;Compuserve&lt;/a&gt;), games (Advent, Zork) and even helped development of
Microsoft&amp;#39;s &lt;a href=&#34;https://www.gatesnotes.com/microsoft-original-source-code&#34;&gt;first version&lt;/a&gt; of BASIC.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Hardware
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The first computer in the family was the PDP-6 which used germanium
transistors. It had a 36 bit word, up to 256kW of core memory and ran
at approximately 250kHz. It was large (500-700kg), expensive ($300k)
and was not very reliable. Only 23 systems were sold, but the
architecture was well received by its initial customers such as MIT.&lt;/p&gt;
&lt;p&gt;
A very similar architecture but advances in digital logic technology
and a reliable manufacturing process was used for the PDP-10. Several
CPU models were introduced, starting with the KA10 in 1968. This was
replaced by the KI10 using TTL and in 1975 by the ECL based KL10. A
cheaper variant called the KS10 arrived in 1978. DEC marketed the
PDP-10 under the name DECsystem-10 and -20. Xerox PARC and several
startups also experimented with clones of the hardware.&lt;/p&gt;
&lt;p&gt;
During its lifetime, advanced in memory, storage and peripherals were
introduced, and there were also multiprocessor variants.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Operating systems
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
DEC&amp;#39;s original operating system for the PDP-6 was called the Monitor
and used just 6kwords of memory. This was enhanced and renamed as
TOPS-10 (Time-sharing / Total Operating System-10) with the
introduction of the KA processor.&lt;/p&gt;
&lt;p&gt;
Sites would often customise TOPS-10 systems, adding special hardware
and facilities to support them in the OS. One notable version was
Stanford&amp;#39;s WAITS, which evolved to be a separate operating system. The
time-sharing bureau Tymshare developed TYMCOM-X based on TOPS-10.&lt;/p&gt;
&lt;p&gt;
BBN took the KA and added paging hardware which was not compatible
with TOPS-10; they built their own system called TENEX. Eventually,
DEC brought this in-house and released it as a supported OS called
TOPS-20.&lt;/p&gt;
&lt;p&gt;
MIT, as an early PDP-6 customer for their AI lab, went a completely
different direction, developing their own unique operating system
called ITS (Incompatible Time-sharing System, a play of words on &lt;a href=&#34;https://timereshared.com/ctss/&#34;&gt;CTSS&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Preservation status
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There&amp;#39;s a great collection of PDP-10 software and documentation in the
Github PDP-10 &lt;a href=&#34;https://github.com/PDP-10&#34;&gt;organisation&lt;/a&gt;, created by Lars Brinkhoff and around 50
other volunteers.&lt;/p&gt;
&lt;p&gt;
Software kits are available for TOPS-10, TOPS-20, WAITS and ITS: see
the above, the &lt;a href=&#34;https://pdp-10.trailing-edge.com/&#34;&gt;trailing-edge&lt;/a&gt; collection of tapes, and &lt;a href=&#34;https://sky-visions.com/dec/index.shtml&#34;&gt;Richard
Cornwell&amp;#39;s &lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;
There is a large amount of documentation on &lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/&#34;&gt;Bitsavers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
Zane Healy&amp;#39;s &lt;a href=&#34;https://www.avanthar.com/healyzh/decemulation/pdp10emu.html&#34;&gt;The DEC PDP-10 Emulation Webpage&lt;/a&gt; also has a good
collection of links to other PDP-10 sites, some of which you may need
to use the Wayback Machine to access.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Emulation status
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Probably the most comprehensive suite of emulators is Richard
Cornwell&amp;#39;s simh-based &lt;a href=&#34;https://github.com/rcornwell/sims&#34;&gt;emulators&lt;/a&gt; for the PDP-6 and the KA/KI/KL/KS
model PDP-10s. This had been merged into &lt;a href=&#34;https://github.com/open-simh/simh&#34;&gt;opensimh&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
Also of note is Ken Harrenstein&amp;#39;s &lt;a href=&#34;https://klh10.trailing-edge.com/klh10/&#34;&gt;KLH10&lt;/a&gt; for the KS10 and KL10, and Bob
Supnik&amp;#39;s original KS10 emulator for &lt;a href=&#34;https://simh.trailing-edge.com/&#34;&gt;simh&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
The &lt;a href=&#34;https://obsolescence.wixsite.com/obsolescence/pidp10&#34;&gt;PiDP-10&lt;/a&gt; recreates in hardware the PDP-10&amp;#39;s front panel connected to a
Raspberry Pi running simh. A lot of MIT AI Lab hardware is also
demonstratable using this project.&lt;/p&gt;
&lt;p&gt;
The &lt;a href=&#34;https://icm.museum/&#34;&gt;Interim Computer Museum&lt;/a&gt; holds a collection of PDP-10s formerly
exhibited at Seattle&amp;#39;s &lt;a href=&#34;https://www.geekwire.com/2024/seattles-living-computers-museum-logs-off-for-good-as-paul-allen-estate-will-auction-vintage-items/&#34;&gt;Living Computer Museum&lt;/a&gt;. Many of these systems,
along with some emulators, are available online at &lt;code&gt;ssh
menu@tty.sdf.org&lt;/code&gt;:.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Coverage on this site
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I plan to cover each of the below available operating systems, though
probably not all immediately. When a system is added, click the links
below to find out more.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/dec-tops-10/&#34;&gt;TOPS-10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WAITS&lt;/li&gt;
&lt;li&gt;ITS&lt;/li&gt;
&lt;li&gt;TOPS-20&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Further reading
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;a href=&#34;https://en.wikipedia.org/wiki/PDP-10&#34;&gt;Wikipedia&lt;/a&gt;&amp;#39;s page for the PDP-10 is a good place to start.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://en.wikipedia.org/wiki/Gordon_Bell&#34;&gt;Gordon Bell&lt;/a&gt;, who was an architect at DEC for the PDP-6 and other
systems, wrote a paper &lt;a href=&#34;https://dl.acm.org/doi/10.1145/359327.359335&#34;&gt;The Evolution of the DECsystem 10&lt;/a&gt; which gives a
great overview of the system&amp;#39;s hardware and software, along with its
impact.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Site Update</title>
      <link>https://timereshared.com/site-update-20251214/</link>
      <pubDate>Sun, 14 Dec 2025 09:29:00 +0900</pubDate>
      <guid>https://timereshared.com/site-update-20251214/</guid>
      <description>&lt;p&gt;
That brings us to the end of the series of posts about Burroughs MCP. &lt;/p&gt;
&lt;p&gt;
Next update to this blog will be in the new year, where I will look at
our first operating system for the DEC PDP-10, &lt;a href=&#34;https://en.wikipedia.org/wiki/TOPS-10&#34;&gt;TOPS-10&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP: WIPL Programming</title>
      <link>https://timereshared.com/mcp-wipl/</link>
      <pubDate>Sun, 07 Dec 2025 09:09:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-wipl/</guid>
      <description>
&lt;p&gt;
So one of the languages available on the &lt;a href=&#34;https://timereshared.com/mcp-b5500-software-archive/&#34;&gt;CUBE tape&lt;/a&gt; for the Burroughs
B5500 is WIPL. Let&amp;#39;s find out what this is and get it running.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
What is WIPL?
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
From the Algol &lt;a href=&#34;https://github.com/retro-software/B5500-software/blob/master/CUBE-Library-13/Files/WIPL-Z300001.alg&#34;&gt;source code&lt;/a&gt; of the language:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
WIPL - WISCONSIN INTERACTIVE PROBLEM-SOLVING LANGUAGE
    BY  ED HARRIS  AND  BOB JANOSKI
    UNIV. OF WISCONSIN COMPUTING CENTER  (MADISON)
VERSION 1.50 (9/1/70)
&lt;/pre&gt;
&lt;p&gt;
So we know its name and source, but this is not much help - there is
no documentation preserved and an internet search does not turn up
much detail. I did find a UW report about a simulation program written
in WIPL for school administration from 1969 at the &lt;a href=&#34;https://archive.org/details/ERIC_ED039779/&#34;&gt;Internet Archive&lt;/a&gt;.
This includes an instruction manual for running the simulation,
showing how to start WIPL and load the program - looks like this was
run on the DCMCP rather than via CANDE. But no information on the
language itself.&lt;/p&gt;
&lt;p&gt;
However, the CUBE tape also contains an online &lt;a href=&#34;https://github.com/retro-software/B5500-software/blob/master/CUBE-Library-13/Files/HELPFIL-CARDS.wipl&#34;&gt;help file&lt;/a&gt; for the
system which defines its syntax and how to use it. Looking at this,
what stands out is its use of decimal line numbers and references to
&lt;code&gt;PART&lt;/code&gt;, for example in this fragment of a sample program:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
3.0 TYPE &amp;#34;ENTER THE DEGREE OF THE POLYNOMIAL&amp;#34;
3.1 ACCEPT DEGREE
4.0 TYPE &amp;#34;ENTER THE COEFFICIENTS&amp;#34;
4.1 DO PART 30 FOR I=1 TO DEGREE+1
&lt;/pre&gt;
&lt;p&gt;
This makes me think this must be a JOSS clone.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
What is JOSS?
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;a href=&#34;https://en.wikipedia.org/wiki/JOSS&#34;&gt;JOSS&lt;/a&gt; - the JOHNNIAC Open Shop System - was an early time-shared
language created at the RAND corporation in 1963. This ran on the
one-of-a-kind computer JOHNNIAC and offered 20-30 users the ability to
write simple programs that looked like this:&lt;/p&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1.3 Do part 5 for i=1(1)100.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5.1 Type &amp;#34;Hello, Wikipedia!&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5.2 Type &amp;#34;This is JOSS.&amp;#34;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Many places implemented their own version of JOSS under different
names (presumably because RAND held the copyright on the name JOSS) -
for example BBN developed TELCOMP, DEC had FOCAL and the University of
Pittsburgh had &lt;a href=&#34;https://try-mts.com/pil-introduction/&#34;&gt;PIL&lt;/a&gt;. Each version made changes to the syntax but the
core of the language was the same - interactive interpreter, decimal
line numbers, simple loops and conditionals. The intended user was a
scientist or engineer that wanted to do quick calculations but did
not want to have to learn a full programming language.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Getting WIPL running
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
First off, I assume you have the contents of the &amp;#39;extras&amp;#39; tape
installed: if not see this &lt;a href=&#34;https://timereshared.com/mcp-b5500-software-archive/&#34;&gt;article.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
You will need one additional file from the source CUBE tape. Get the
file CUBEB13.BCD from &lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/CUBE-Library-13&#34;&gt;Github&lt;/a&gt; and attach it to your emulator tape
drive, either from the retro-b5500 tape window or via the simh command&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
at mt0 -r -f p7b /path/to/CUBEB13.bcd
&lt;/pre&gt;
&lt;p&gt;
Then switch to the operator&amp;#39;s console, press Escape and type:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
? LOAD FROM CUBEB13 ERRORS/CARDS; END
&lt;/pre&gt;
&lt;p&gt;
This may take a minute or so while the file is located on the tape.&lt;/p&gt;
&lt;p&gt;
Finally, you will need to rename some files. On the operator console,
enter each of these commands:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
? CHANGE WIPL/DISK TO 0WIPL/DISK; END
? CHANGE HELPFIL/CARDS TO WIPLS/HELPFIL; END
? ?CHANGE ERRORS/CARDS TO WIPLS/ERRORS; END
&lt;/pre&gt;
&lt;p&gt;
You can now run WIPL from CANDE via the &lt;code&gt;RUN WIPL/DISK&lt;/code&gt; command. A
quick example of starting WIPL, viewing the first help page and trying
some immediate mode calculations before quitting and returning to
CANDE:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
RUN WIPL/DISK
 RUNNING
        

TYPE HELP IF YOU HAVE QUESTIONS  (WIPL VERSION 1.5)
?HELP
PLEASE WAIT.
      YOU ARE USING WIPL, A B5500 INTERACTIVE LANGUAGE DEVELOPED
      BY THE UNIVERSITY OF WISCONSIN COMPUTING CENTER.  TO OBTAIN
      INFORMATION ON THE USE OF ONE OF THE STATEMENT TYPES, TYPE
      &amp;#34;HELP&amp;#34; FOLLOWED BY THE STATEMENT TYPE, SUCH AS &amp;#34;HELP SET&amp;#34;.
      IF YOU WOULD LIKE TO KNOW ABOUT ANY SPECIFIC AREA OF THE
      LANGUAGE, YOU MAY CHOOSE FROM THE FOLLOWING LIST OF TOPICS:
      (TO SELECT TOPIC 2.00 TYPE &amp;#34;HELP 2)

 2.00 GENERAL INFORMATION
 3.00 CALCULATOR MODE
 4.00 STORED PROGRAM MODE
 5.00 SPECIAL STATEMENTS
 6.00 DEBUGGING AIDS
 7.00 SAMPLE PROGRAM
?SET A = 2
?SET B = 40
?SET C = A + B
?TYPE C
 42 
?QUIT


 END WIPL .0 SEC.
&lt;/pre&gt;
&lt;p&gt;
You can also use &lt;code&gt;SAVE&lt;/code&gt; and &lt;code&gt;LOAD&lt;/code&gt; to store programs in the file system.&lt;/p&gt;
&lt;p&gt;
So with this, we can implement the &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;TPK algorithm&lt;/a&gt; in WIPL.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
TPK in WIPL
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1.000 REM TPK ALGORITHM IN WIPL
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1.010 DIM A[11]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1.020 PRINT &amp;#34;PLEASE ENTER 11 NUMBERS&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1.030 DO PART 2 FOR J = 1 TO 11 BY 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1.040 PRINT &amp;#34;RESULTS ARE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1.050 DO PART 3 FOR J = 11 TO 1 BY -1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1.999 STOP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2.000 REM GET EACH NUMBER AND STORE IN ARRAY
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2.010 ACCEPT A[J]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3.000 REM CALCULATE TPK AND DISPLAY RESULTS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3.010 RESULT = SQRT(ABS(A[J])) + 5 * A[J] ** 3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3.020 IF RESULT GTR 400 PRINT &amp;#34;TOO LARGE&amp;#34; ELSE PRINT RESULT&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
I think this is fairly easy to understand, but here are a few notes.
WIPL (and JOSS) programs are separated into parts (the number before
the decimal point), each of which may have several lines (the number
after the decimal point). A part is like a subroutine with an implicit
return when the next part starts. So here we have part 1 for the entry
point. It calls part 2 using a loop to input numbers, and then part 3
with a reversed loop to calculate TPK.&lt;/p&gt;
&lt;p&gt;
Variables are floating point only. Arrays need to be dimensioned
before use, and are 1-indexed.&lt;/p&gt;
&lt;p&gt;
Source and a transcript of its execution can be found on &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;Github&lt;/a&gt;. I
have also provided a version of the code in JOSS, so you can see how
the syntax has changed for WIPL.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Another JOSS on MCP
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
While researching this post I found &lt;a href=&#34;https://retrocomputingforum.com/t/reviving-joss-running-on-the-johnniac/4354/11&#34;&gt;this message&lt;/a&gt; by Paul Kimpel.
Burroughs had their own version of JOSS, originally called BOSS and
later renamed to INTERP. This is actually installed on disk as part of
MCP Mark XIII set up. as &lt;code&gt;INTERP/DISK&lt;/code&gt;. However, no documentation or
help file is available. I can start it, but get the error message:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
-INVALID USER INTERPS SAVFILE, S = 43, A = 37
&lt;/pre&gt;
&lt;p&gt;
suggesting there may be a step needed to grant access to the program.
The source of INTERP is available on the MCP symbol tapes, however, so
this would be an interesting project to understand the code and get
this version of JOSS working.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;a href=&#34;https://bitsavers.org/pdf/rand/joss/&#34;&gt;Bitsavers&lt;/a&gt; has a collection of original RAND documents about JOSS.
There is an ongoing project to restore RAND&amp;#39;s PDP-6 version of JOSS-II
at &lt;a href=&#34;https://github.com/PDP-6/JOSS-II&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP: The b5500-software archive</title>
      <link>https://timereshared.com/mcp-b5500-software-archive/</link>
      <pubDate>Sun, 23 Nov 2025 08:10:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-b5500-software-archive/</guid>
      <description>
&lt;p&gt;
Apart from the preserved operating system tapes, the other major
source of software for the Burroughs B5500 is
&lt;a href=&#34;https://github.com/retro-software/B5500-software&#34;&gt;retro-software/B5500-software&lt;/a&gt; on Github. This was assembled by Paul
Kimpel, Richard Cornwell, Nigel Williams and many other contributors
from a number of digital and physical sources. It contains around
100MB of compilers, interpreters, utilities and source code routines.&lt;/p&gt;
&lt;p&gt;
The centre of this collection is the CUBE library tape. CUBE, the
Cooperating Users of Burroughs Equipment, was a user group that shared
source code donated by users to other sites - similar to IBM&amp;#39;s SHARE.&lt;/p&gt;
&lt;p&gt;
The other directories contain transcriptions of listings found
elsewhere, along with some modern software.&lt;/p&gt;
&lt;p&gt;
In this article I will describe the highlights of the collection and
show how to get APL and ELIZA working under time-sharing.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Interactive interpreters
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/APL-UW-Kildall&#34;&gt;APL\B5500&lt;/a&gt;, an &lt;a href=&#34;https://en.wikipedia.org/wiki/APL_(programming_language)&#34;&gt;APL&lt;/a&gt; interpreter from the University of Washington
adapted for time-sharing.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/retro-software/B5500-software/blob/master/CUBE-Library-13/Files/WIPL-Z300001.alg&#34;&gt;WIPL&lt;/a&gt;, the (University of) Wisconsin Interactive Problem-solving
Language - a &lt;a href=&#34;https://en.wikipedia.org/wiki/JOSS&#34;&gt;JOSS&lt;/a&gt; clone.&lt;/li&gt;
&lt;li&gt;A &lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/LISP-Fort-Monmouth&#34;&gt;LISP&lt;/a&gt; interpreter reported to come from Fort Monmouth, New Jersey.&lt;/li&gt;
&lt;li&gt;A 1970s era BASIC interpreter called &lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/XBASIC-Paisley-College&#34;&gt;XBASIC&lt;/a&gt; from the University of
West Scotland&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Read on for a brief look at APL. I will cover WIPL in a future
article.&lt;/p&gt;
&lt;p&gt;
For LISP, I could get this running but it crashed on all input. XBASIC
also runs but seems to require a tape to do anything useful. Let me
know if you have success with these. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Other programming languages
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/EULER-Wirth&#34;&gt;EULER&lt;/a&gt;, an early language developed by &lt;a href=&#34;https://en.wikipedia.org/wiki/Niklaus_Wirth&#34;&gt;Niklaus Wirth&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/PASCAL-Heriot-Watt&#34;&gt;PASCAL&lt;/a&gt; as implemented at Heriot-Watt University in around 1975.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/SNOBOL-UW-Chambers&#34;&gt;SNOBOL3&lt;/a&gt; as implemented at the University of Wisconsin.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/retro-software/B5500-software/blob/master/CUBE-Library-13/Files/GTL-L200015.alg&#34;&gt;GTL&lt;/a&gt;, the Georgia Tech Language, created at the university of the
same name. An &lt;a href=&#34;https://softwarepreservation.computerhistory.org/ALGOL/algol60impl.html&#34;&gt;enhanced version&lt;/a&gt; of Algol 60.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://softwarepreservation.computerhistory.org/ALGOL/algol60impl.html&#34;&gt;MCALGOL&lt;/a&gt;, an &lt;a href=&#34;https://softwarepreservation.computerhistory.org/ALGOL/algol60impl.html&#34;&gt;enhanced version&lt;/a&gt; of Burroughs Enhanced Algol, developed at
Westinghouse.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/retro-software/B5500-software/blob/master/CUBE-Library-13/Files/OMNITAB-Z300002.for&#34;&gt;OMNITAB&lt;/a&gt;, a statistics language developed by NIST.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apart from OMBITAB, which is in Fortran, these are all written in
Algol. All were designed to run under batch (although CANDE could be
customised to run them, as Georgia Tech did) so I will not look at
these further.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Other archived software
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
As top level directories in the collection:   &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/RC-Ron-Brody&#34;&gt;R/C&lt;/a&gt; (Remote/Card), a remote job editor/submit package from Burroughs Defence.&lt;/li&gt;
&lt;li&gt;A Burroughs B6500 &lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/B6500-Simulator&#34;&gt;simulator&lt;/a&gt; and accompanying early MCP for the B5500&lt;/li&gt;
&lt;li&gt;Fragments of &lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/Mark-XIV&#34;&gt;Mark-XIV&lt;/a&gt; and &lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/Mark-XVI&#34;&gt;Mark-XVI&lt;/a&gt; MCP&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/KRUNCH-UNKRNCH&#34;&gt;KRUNCH&lt;/a&gt; and UNKRNCH utilities - compress your Algol card deck by
removing whitespace and comments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The CUBE tape has many Algol source code routines. mostly for
mathematical/engineering problems, a computer aided teaching system from
GT, ELIZA, a tic-tac-toe game, an &lt;a href=&#34;https://github.com/retro-software/B5500-software/blob/master/CUBE-Library-13/Files/ALTRAN-L700001.gtl&#34;&gt;Algol to Fortran translator&lt;/a&gt; written
in GTL and many other small programs. The library &lt;a href=&#34;https://github.com/retro-software/B5500-software/blob/master/CUBE-Library-13/CUBELIB.LIST.txt&#34;&gt;index&lt;/a&gt; is a good
place to start exploring these.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
More recent software
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Finally, the archive contains a few more recently developed programs&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Sudoku solver by Paul Cumberworth&lt;/li&gt;
&lt;li&gt;Burroughs B5500-related utility programs for &amp;#34;Emode&amp;#34;&lt;/li&gt;
&lt;li&gt;Utilities from Paul Kimpel and Richard Cornwell&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Installing the software
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
All of the above is in source form. To get them individually installed
on your system you will need to compile them and install associated
files as per the techniques described in the &lt;a href=&#34;https://timereshared.com/mcp-batch-and-operator-console/&#34;&gt;batch&lt;/a&gt; and &lt;a href=&#34;https://timereshared.com/mcp-getting-data-in-and-out/&#34;&gt;data transfer&lt;/a&gt;
posts.&lt;/p&gt;
&lt;p&gt;
However, a much easier way has been provided by Richard Cornwell, who
has made a virtual tape file containing compiled files for many of
the above. This is included in the simh distribution and can also be
installed on retro-b5500 by getting &lt;code&gt;extras.bin&lt;/code&gt; from &lt;a href=&#34;https://sky-visions.com/burroughs/xiii/&#34;&gt;here&lt;/a&gt;, mounting
it on the tape drive as a BCD file and entering the command&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
? LOAD FROM EXTRAS =/=; END
&lt;/pre&gt;
&lt;p&gt;
on the console. The file &lt;a href=&#34;https://sky-visions.com/burroughs/xiii/extra.job&#34;&gt;extra.job&lt;/a&gt; at the same location also contains
a script for building this tape if you want to find out how each
component was constructed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
APL
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
This implementation was created in Burroughs Extended Algol at the
Computer Science Group at the University of Washington by Gary
Kildall, Leroy Smith, Sally Swedine and Mary Zosel. &lt;a href=&#34;https://en.wikipedia.org/wiki/Gary_Kildall&#34;&gt;Gary Kildall&lt;/a&gt;
became famous later as the creator of the CP/M operating system. The
source code was originally found as a printed &lt;a href=&#34;https://github.com/retro-software/B5500-software/tree/master/APL-UW-Kildall&#34;&gt;listing&lt;/a&gt; and transcribed
to a source file; this was supplanted later by a &lt;a href=&#34;https://github.com/retro-software/B5500-software/blob/master/CUBE-Library-13/Files/APL-L200013.alg&#34;&gt;digital copy&lt;/a&gt; found in
the CUBE tapes.&lt;/p&gt;
&lt;p&gt;
This APL was designed to be as compatible as possible with the
original APL for the IBM System/360. As typewriters with the APL
glyphs did not exist for the Burroughs, alphanumerical
transliterations are used, eg Δ is written as &lt;code&gt;$&lt;/code&gt; and ⍴ as &lt;code&gt;RHO&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
If you install the contents of the extras tape as described above, you
can then start APL from a &lt;a href=&#34;https://timereshared.com/mcp-using-cande/&#34;&gt;CANDE&lt;/a&gt; prompt by typing &lt;code&gt;RUN APL/DISK&lt;/code&gt;. Below
is a sample session where I start APL, use calculator mode to do some
work, then quit and return to CANDE.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
RUN APL/DISK
 RUNNING
        
      APL/B5500 UW COMPUTER SCIENCE # 3-05-71 
      
 LOGGED IN THURSDAY 11-05-25  06:33 
      
X := 30
Y := 12
X + Y
42
      
)OFF
      END OF RUN

 END APL .0 SEC.
&lt;/pre&gt;
&lt;p&gt;
I plan to add a &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;project-tpk&lt;/a&gt; run of TPK using APL at a later date.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
ELIZA
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Created by Joseph Weizenbaum at MIT in 1964-6, ELIZA could be called
the world&amp;#39;s first AI chatbot. I was especially interested to see a
version for the Burroughs B5500 having worked on &lt;a href=&#34;https://github.com/rupertl/eliza-ctss&#34;&gt;the reconstruction&lt;/a&gt; of
the CTSS/MAD original.&lt;/p&gt;
&lt;p&gt;
This version is written in Georgia Tech Language which was mentioned
above. GTL incorporated Lisp features into Algol, and the code looks
like it was a port of Cosell&amp;#39;s Lisp version rather than Weizenbaum&amp;#39;s
original. The source code is dated 1970-1 and was written by Charles
Fricks and John Covert, presumably at Georgia Tech..&lt;/p&gt;
&lt;p&gt;
Assuming you have installed the extras tape as per the previous
section, you will have three files on your system&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ELIZA/SYMBOL&lt;/code&gt; - source code&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ELIZA/SCRIPT&lt;/code&gt; - run time script file&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ELIZA/ELIZA&lt;/code&gt; - executable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In order to run under time-sharing, you will need to rename the
executable as CANDE expects runnable code to have a &lt;code&gt;0&lt;/code&gt; as its first
character. Switch over to the operator console, press Escape and type:  &lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
? CHANGE ELIZA/ELIZA TO 0ELIZA/ELIZA; END
&lt;/pre&gt;
&lt;p&gt;
ELIZA can now be run under CANDE by typing &lt;code&gt;RUN ELIZA/ELIZA&lt;/code&gt;. After it
starts up, you can interact with ELIZA by typing single lines of text.
Type &lt;code&gt;*QUIT&lt;/code&gt; to exit. Here&amp;#39;s a sample run, using the conversation in
Weizenbaum&amp;#39;s 1966 ACM paper:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
RUN ELIZA/ELIZA
 RUNNING
        

ONE MOMENT PLEASE...
HELLO. HOW ARE YOU TODAY?
?MEN ARE ALL ALIKE.
HOW?
?THEY ARE ALWAYS BUGGING US ABOUT SOMETHING OR OTHER.
WHAT INCIDENT ARE YOU THINKING OF?
?WELL, MY BOYFRIEND MADE ME COME HERE.
DOES THAT SUGGEST ANYTHING ELSE OF YOURS?
?*QUIT
GOODBYE


 END ELIZA .0 SEC.
&lt;/pre&gt;
&lt;p&gt;
It has some interesting features that distinguish itself from the
original ELIZA:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It saves the recall information to a file for use in subsequent sessions.&lt;/li&gt;
&lt;li&gt;After a certain amount of CPU time is used it will automatically
quit with:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&#34;example&#34;&gt;
I AM VERY SORRY, BUT YOU HAVE USED UP YOUR TIME.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP: COBOL Programming</title>
      <link>https://timereshared.com/mcp-cobol/</link>
      <pubDate>Sun, 16 Nov 2025 09:18:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-cobol/</guid>
      <description>
&lt;p&gt;
It&amp;#39;s time for the final language supported by Burroughs MCP under
time-sharing: COBOL. As always we will implement the &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;TPK algorithm&lt;/a&gt;.
However, this turned out to be quite a challenge.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Two view of COBOL
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
COBOL - the COmmon Business-Orientated Language - is probably the most
successful language originating in the 1950s. Designed by a committee
to standardise business processing, it was adopted by several computer
manufacturers and powered many systems in the finance, retail and
government space. Although not used for much new development today, it
is still widely in use: the &lt;a href=&#34;https://en.wikipedia.org/wiki/COBOL&#34;&gt;Wikipedia&lt;/a&gt; article mentions that as of 2020
&amp;#34;COBOL ran background processes 95% of the time a credit or debit card
was swiped&amp;#34;. It has an English-like syntax intended to make it easy to
read, and has powerful I/O facilities.&lt;/p&gt;
&lt;p&gt;
On the other hand - it had a reputation for being verbose and
over-complicated, with many keywords and quirks in how it processes
code. It is rarely taught or studied in academia, and Jean Sammet,
historian and one of the language&amp;#39;s designers, said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;little attempt was made to cater to the professional programmer, in
fact people whose main interest is programming tend to be very unhappy
with COBOL&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Personally I have never used COBOL nor know anyone who has. I am
intrigued to learn more, but the size of the language makes it rather
daunting. But before we continue, there is another question to answer.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Is this a suitable language to implement TPK?
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;TPK&lt;/a&gt; is a mathematical algorithm: it does floating point calculations
and relies on functions such as &lt;code&gt;sqrt&lt;/code&gt; and exponentiation. This is
rather outside of COBOL&amp;#39;s business-orientated domain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;COBOL uses integer and fixed precision numbers, with floating point
support only standardised in the 1980s.&lt;/li&gt;
&lt;li&gt;Mathematical functions like &lt;code&gt;sqrt&lt;/code&gt; were also not a standard part of
the language until then.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also do not have contemporary documentation for COBOL on the B5500;
the closest is the &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/software/cobol/5001464_B7000_B6000_Series_COBOL_Reference_197708.pdf&#34;&gt;B7000/B6000 Series COBOL Reference Manual&lt;/a&gt;
from 1977. This reserved word table starting on p404 notes
comparability with the B5700, saying that &lt;code&gt;SQRT&lt;/code&gt; was available but
floating point numbers (using the &lt;code&gt;COMP-4&lt;/code&gt; type) were not, which seems
to be confirmed by my testing.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
The plan
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
So to make this a little more tractable, I will do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Given the lack of floating point numbers, only allow positive
integers of two digits as input, and display output as integers.&lt;/li&gt;
&lt;li&gt;Use a LLM to help set up the initial code as a way to get to grips
with the language.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(A note on AI: I do not use AI for writing this blog. I will
experiment sometimes with using AI to write code, but will clearly
mark when it is used).&lt;/p&gt;
&lt;p&gt;
Unsurprisingly, the LLM said it could not write COBOL for that specific
machine, but would write generic COBOL for that era. It knew that
&lt;code&gt;sqrt&lt;/code&gt; was supported, though.&lt;/p&gt;
&lt;p&gt;
The code it produced had some formatting and syntax errors when I
tried it on CANDE. By consulting the 1977 manual, and reading existing
Burroughs batch COBOL programs from the &lt;a href=&#34;https://github.com/retro-software/B5500-software&#34;&gt;CUBE tape&lt;/a&gt; I was able to
get it working - but with no guarantees on the quality of the code.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
TPK in COBOL
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1000 * TPK PROGRAM IN COBOL FOR BURROUGHS MCP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1100 IDENTIFICATION DIVISION.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1200     PROGRAM-ID. TPK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1300     AUTHOR.     RUPERT LANE AND GEMINI
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1400 ENVIRONMENT DIVISION.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1500 CONFIGURATION SECTION.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1600     SOURCE-COMPUTER. B-5500.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1700     OBJECT-COMPUTER. B-5500.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1800 INPUT-OUTPUT SECTION.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1900 FILE-CONTROL.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2000     SELECT PRINT-FILE ASSIGN TO PRINTER.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2100 DATA DIVISION.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2200 FILE SECTION.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2300     FD PRINT-FILE;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2400         DATA RECORDS ARE PRT1.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2500     01 PRT1.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2600          05  PRT2         PIC X(120).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2700 WORKING-STORAGE SECTION.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2800     01 NUMBER-TABLE.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2900         05 INPUT-NUMBER   PIC 99.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3000         05 NUMBER-X       PIC 99 OCCURS 11 TIMES.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3100     01 SUBSCRIPTS.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3200         05 NDX            PIC 99.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3300     01 CALCULATION-FIELDS.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3400         05 CURRENT-NUM    PIC 99.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3500         05 RESULT         PIC 9999999.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3600     01 DISPLAY-FIELDS.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3700         05 DISPLAY-RESULT PIC 999.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3800 PROCEDURE DIVISION.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3900 MAIN SECTION.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4000 000-MAIN-LOGIC.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4100     DISPLAY &amp;#34;PLEASE ENTER 11 NUMBERS&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4200     PERFORM 100-ACCEPT-NUMBERS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4300         VARYING NDX FROM 1 BY 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4400         UNTIL NDX GREATER THAN 11.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4500     DISPLAY &amp;#34;RESULTS ARE&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4600     PERFORM 200-PROCESS-NUMBERS
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4700         VARYING NDX FROM 11 BY -1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4800         UNTIL NDX LESS THAN 1.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4900     STOP RUN.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5000 100-ACCEPT-NUMBERS.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5100     ACCEPT INPUT-NUMBER.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5200     MOVE INPUT-NUMBER TO NUMBER-X(NDX).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5300 200-PROCESS-NUMBERS.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5400     MOVE NUMBER-X(NDX) TO CURRENT-NUM.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5500     COMPUTE RESULT = SQRT(ABS(CURRENT-NUM))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5600         + (5 * (CURRENT-NUM ** 3)).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5700     IF RESULT GREATER THAN 400
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5800         DISPLAY &amp;#34;TOO LARGE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5900     ELSE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6000         MOVE RESULT TO DISPLAY-RESULT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6100         DISPLAY DISPLAY-RESULT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6200     END-IF.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6300 END-OF-JOB.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
So this is indeed quite verbose - about double the size of the other
implementations of TPK I have done. But even without any knowledge of
COBOL it is fairly readable. &lt;/p&gt;
&lt;p&gt;
As in the Algol and Fortran examples, the line numbers are used for
entry to CANDE only and are not used by the program itself.&lt;/p&gt;
&lt;p&gt;
The code is made up of five main divisions - identification,
environment, data and procedure. Each contains one or more sections,&lt;/p&gt;
&lt;p&gt;
The line format is slightly relaxed compared to batch COBOL, with
division and section definitions along with labels having to appear on
column 1 but other lines can be free format.&lt;/p&gt;
&lt;p&gt;
The identification division contains structured comments about the
propose and authorship of the code.&lt;/p&gt;
&lt;p&gt;
The environment division is where machine specific details are
supposed to be put, such as computer type and selection of peripheral
devices. The file-control part sets up the printer as an output
device: although I don&amp;#39;t use this explicitly, the compiler refuses to
work without something being defined here.&lt;/p&gt;
&lt;p&gt;
The data division contains file and working-storage sections. The file
section defines the output format for the printer and is again unused
but required. The working-storage section defines variables - these are
all global. Variables can be grouped into structures, so
&lt;code&gt;NUMBER-TABLE&lt;/code&gt; contains &lt;code&gt;INPUT-NUMBER&lt;/code&gt; and &lt;code&gt;NUMBER-X&lt;/code&gt;. The former is a
single variable, the latter is an array introduced by the &lt;code&gt;OCCURS&lt;/code&gt;
keyword.&lt;/p&gt;
&lt;p&gt;
The &lt;code&gt;PIC&lt;/code&gt; - or picture - keyword defines the variable type. &lt;code&gt;9&lt;/code&gt;
denotes a single digit 0-9, so &lt;code&gt;INPUT-NUMBER PIC 99&lt;/code&gt; means this
variable can accept 00-99. &lt;code&gt;RESULT&lt;/code&gt; contains the output of the TPK
formula so needs to have a capacity of 7 digits to support TPK(99).
&lt;code&gt;DISPLAY-RESULT&lt;/code&gt; is only 3 digits as we results greater than 400 will
not be printed.&lt;/p&gt;
&lt;p&gt;
The program code is in the procedure division, with control starting at
the top. This prompts the user with &lt;code&gt;DISPLAY&lt;/code&gt; and then executes two
loops with &lt;code&gt;PERFORM&lt;/code&gt;, each of which takes a label as the code to
execute.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;100-ACCEPT-NUMBERS&lt;/code&gt; uses &lt;code&gt;ACCEPT&lt;/code&gt; to get numbers (must be two digits)
and store them. &lt;code&gt;ACCEPT NUMBER-X(NDX)&lt;/code&gt; would seem to be the obvious
way to get and store in the array, but this gives a syntax error so I
have to use the simple variable &lt;code&gt;INPUT-NUMBER&lt;/code&gt; and then &lt;code&gt;MOVE&lt;/code&gt; it into
the array.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;200-PROCESS-NUMBERS.&lt;/code&gt; calculates TPK and prints the result. Functions
are not really part of COBOL so we use the &lt;code&gt;COMPUTE&lt;/code&gt; statement, with
&lt;code&gt;SQRT&lt;/code&gt;, &lt;code&gt;ABS&lt;/code&gt; and the exponentiation operator &lt;code&gt;**&lt;/code&gt; being non-standard
Burroughs extensions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Compiling and running the program
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
One interesting observation is that the COBOL compiler takes longer to
run compared to the other languages - on retro-b5500, which runs close
to the original hardware speed, it takes 20s for COBOL to compile and
10s for Algol. (simh runs as fast as possible but the difference is
still noticeable). This probably comes from the size and complexity of
the language, and may partially explain why interactive COBOL was
never a great success on time-sharing systems.&lt;/p&gt;
&lt;p&gt;
The compiler also seems less polished than the Algol one, with several
crashes occurring as I worked on the program. For example, if you
delete the &lt;code&gt;END-OF-JOB.&lt;/code&gt; statement and compile it seems to start
reading uninitialised memory:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
**ERROR @??????: SEQUENCE NUMBER TRUNCATION -??-
**ERROR @??????: CARD TRUNCATION ??????

-EOF NO LABEL 1S002 RUPERT , S = 27, A = 164
&lt;/pre&gt;
&lt;p&gt;
Source and a transcript of its execution can be found on &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Apart from the &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/software/cobol/5001464_B7000_B6000_Series_COBOL_Reference_197708.pdf&#34;&gt;B7000/B6000 Series COBOL Reference Manual&lt;/a&gt; mentioned
above there is also &lt;a href=&#34;https://umedia.lib.umn.edu/item/p16022coll90:1924&#34;&gt;Efficient B6700 COBOL&lt;/a&gt; from 1981 at the Charles
Babbage Institute collection.&lt;/p&gt;
&lt;p&gt;
There is surprising little material about learning COBOL on the
Internet - possibly because of a lack of interest from hobbyists. the
&lt;a href=&#34;https://web.archive.org/web/20200210113931/http://www.csis.ul.ie/cobol/&#34;&gt;University of Limerick&lt;/a&gt; had a COBOL course online once but this is now
only available on archive.org&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP: Getting data in and out</title>
      <link>https://timereshared.com/mcp-getting-data-in-and-out/</link>
      <pubDate>Sun, 09 Nov 2025 09:08:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-getting-data-in-and-out/</guid>
      <description>
&lt;p&gt;
Today we&amp;#39;ll look at how to get data in and out of MCP running under
emulation. This is useful if you want to upload programs or download
listings and data.&lt;/p&gt;
&lt;p&gt;
Using the CANDE terminal window, you can copy and paste small amounts
of data but this does not work for large amounts (especially for input
where the buffer is small). Instead we can reuse some of the
facilities provided by the original hardware in a digital form under
emulation.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Printer output
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
On retro-b5500 the printer has a window where you can view output
directly and copy information to the clipboard.&lt;/p&gt;
&lt;p&gt;
On simh, printer output is to a text file - the quickstart uses
&lt;code&gt;units/printer.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
CANDE provides direct output to the printer via a couple of verbs.
&lt;code&gt;LIST FILES TO PRINTER&lt;/code&gt; will print a directory listing. &lt;code&gt;COPY file TO
PRINTER&lt;/code&gt; will print the contents of &lt;code&gt;file&lt;/code&gt;, which could be source code
or output captured to a file, such as done by the relocation
facilities described in a &lt;a href=&#34;https://timereshared.com/mcp-advanced-cande/&#34;&gt;previous article&lt;/a&gt;. Here&amp;#39;s what a program
listing looks like on retro-b5500:&lt;/p&gt;
&lt;p width=&#34;50%&#34; height=&#34;50%&#34; title=&#34;Burroughs B5500 printer on retro-b5500&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/b5500-printer.png&#34; alt=&#34;/images/mcp/b5500-printer.png&#34; title=&#34;/images/mcp/b5500-printer.png&#34;/&gt;
&lt;em&gt;The B5500 printer window on retro-b5500. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Card punch output
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Using the card punch allows you to get an exact copy of code or data
to a text file, without the pagination and spacing imposed by the line
printer. This could then be edited on your host machine and the
changed file uploaded via the card reader.&lt;/p&gt;
&lt;p&gt;
To punch from CANDE, use the &lt;code&gt;COPY TO&lt;/code&gt; command:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
COPY HELLO TO PUNCH
 WAIT.4 RECORDS COPIED (LAST RECORD COPIED=40)


 END COPY .0 SEC.
&lt;/pre&gt;
&lt;p&gt;
To actually get output, the operator needs to take some action, as on
a real machine they would have to load blank cards for each job.
Switch to the operator console and run the appropriately named job
&lt;code&gt;HARD/CANDE&lt;/code&gt; via the &lt;code&gt;?&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;
This is what it looks like on simh, with input lines preceded by &lt;code&gt;I&lt;/code&gt;
and output by &lt;code&gt;R&lt;/code&gt;. On retro-b5500 there is no prefix.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
I ? EXECUTE HARD/CANDE; END
R 
R  5:HARD/CANDE/SITE= 2 BOJ 1059
R  FILE NAMES?
R #HARD/CANDE= 2: ACCEPT
&lt;/pre&gt;
&lt;p&gt;
The job is asking you a question about whether to list file names
before processing them by prompting &lt;code&gt;FILE NAMES&lt;/code&gt;. The next line
&lt;code&gt;#HARD/CANDE= 2: ACCEPT&lt;/code&gt; means it is waiting for input. Use the &lt;code&gt;AX&lt;/code&gt;
command to answer no, preceding the command by the mix number (process
ID) for the job - this may vary from run to run, but you can see it
from the &lt;code&gt;= 2&lt;/code&gt; on the BOJ line, showing on this run it is 2.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
I 2 AX NO
R  WHATS NEXT?
R #HARD/CANDE= 2: ACCEPT
&lt;/pre&gt;
&lt;p&gt;
To the question &lt;code&gt;WHATS NEXT&lt;/code&gt; answer &lt;code&gt;ALL&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
I 2 AX ALL
R  PUD0010 OUT PNCH:HARD/CANDE= 2
R  3HELLO/GUEST REMOVED
R  HELLO COPIED TO PUNCH
&lt;/pre&gt;
&lt;p&gt;
Now locate the card punch. On retro-b5500 this will be a browser
window where you can copy text from. On the simh quickstart it is in
&lt;code&gt;units/card-punch.txt&lt;/code&gt;. In either case, it will look something like
this:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
FILE: HELLO/GUEST        PUNCHED: 10/11/25
 
FOR I = 1 TO 5                                           00000010
PRINT &amp;#34;HELLO, WORLD&amp;#34;                                     00000020
NEXT I                                                   00000030
END                                                      00000040
&lt;/pre&gt;
&lt;p&gt;
(The above was edited slightly to trim whitespace.)&lt;/p&gt;
&lt;p&gt;
Note that the line numbers are now on the right side of each line,
which is standard for punched cards.&lt;/p&gt;
&lt;p&gt;
You could also do &lt;code&gt;COPY HELLO TO TAPE&lt;/code&gt; and use HARD/CANDE to create a
tape file if you wished.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Card reader input
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
So now we want to do the inverse of the above, provide a text file
from your host system to the card reader which will be read and stored
to a disk file on the guest. However, there seems to be no built in
facility on MCP to do this. Fortunately, Richard Cornwell has written
a program called &lt;code&gt;OBJECT/READER&lt;/code&gt; that can do this. This program is
included in the simh distribution; on retro-b5500 follow these steps
to install it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a href=&#34;https://sky-visions.com/burroughs/reader.card&#34;&gt;https://sky-visions.com/burroughs/reader.card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go to the card reader window, select &lt;code&gt;reader.card&lt;/code&gt; via the browser file
picker and press &lt;code&gt;START&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The operator console will show the job running and the line printer
will show the compiler output.&lt;/li&gt;
&lt;li&gt;Confirm the binary was created by going to the operator window,
pressing Escape then typing &lt;code&gt;PD OBJECT/READER&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now on both systems to use &lt;code&gt;OBJECT/READER&lt;/code&gt;, prepare a ASCII file
representing a batch job that executes it, giving the parameters
&lt;code&gt;COMMON=3&lt;/code&gt; and &lt;code&gt;FILE NEWTAPE&lt;/code&gt; to be a disk file name. For example, to
create a file called &lt;code&gt;BYE&lt;/code&gt; on the CANDE account &lt;code&gt;GUEST&lt;/code&gt; you could make
a file called &lt;code&gt;goodbye.card&lt;/code&gt; on your host machine that looks like:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
?EXECUTE OBJECT/READER
?COMMON = 3
?FILE NEWTAPE = BYE/GUEST DISK SERIAL
?DATA CARD
FOR I = 1 TO 5                                                          00000100
PRINT &amp;#34;GOODBYE, WORLD&amp;#34;                                                  00000200
NEXT I                                                                  00000300
END                                                                     00000400
?END
&lt;/pre&gt;
&lt;p&gt;
On simh, press Control-E on the console to attach the deck and continue; &lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
sim&amp;gt; attach cr0 units/goodbye.card
%SIM-INFO: CR0: 9 card Deck Loaded from units/goodbye.card
sim&amp;gt; continue
&lt;/pre&gt;
&lt;p&gt;
On retro-b5500, load the file into the card reader window and press
START.&lt;/p&gt;
&lt;p&gt;
You will see lines printed on the operator console indicating it is
running:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
R  5:OBJECT/READER= 2 BOJ 1120
R  CRA IN CARD 1:OBJECT/READER= 2
...
&lt;/pre&gt;
&lt;p&gt;
and output on the line printer confirming the file contents.&lt;/p&gt;
&lt;p&gt;
When finished, if you then do &lt;code&gt;LIST FILES&lt;/code&gt; on CANDE you will see the
file, but with a type of &lt;code&gt;UNKNOWN&lt;/code&gt; as this metadata is not part of the
file:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
LIST FILES
10/11/25 GUEST          11:22 AM
NAME    TYPE     RECS SEGS   CREATED   ACCESSED  W/R  W/B  S-F LOCKD BY
BYE     UNKNOWN     4 1000  10/11/25 * 10/11/25   10  150   99
&lt;/pre&gt;
&lt;p&gt;
To fix this, type &lt;code&gt;CHANGE BYE TYPE TO BASIC&lt;/code&gt;. You can then &lt;code&gt;LOAD&lt;/code&gt; or
&lt;code&gt;RUN&lt;/code&gt; the program as normal.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
More information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;code&gt;HARD/CANDE&lt;/code&gt; is documented in the &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1038205_B5500_TS_TerminalUG_196906.pdf&#34;&gt;Time-sharing System User&amp;#39;s Guide&lt;/a&gt; on
bitsavers.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;OBJECT/READER&lt;/code&gt; has other options eg to copy a disk file to the line
printer: see the &lt;a href=&#34;https://sky-visions.com/burroughs/quick/batch.shtml&#34;&gt;documentation&lt;/a&gt; on Richard Cornwell&amp;#39;s site for more
details.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP: BASIC and Fortran 66 Programming</title>
      <link>https://timereshared.com/mcp-fortran-basic/</link>
      <pubDate>Sun, 02 Nov 2025 10:43:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-fortran-basic/</guid>
      <description>
&lt;p&gt;
Previously we looked at &lt;a href=&#34;https://timereshared.com/mcp-algol/&#34;&gt;Algol 60&lt;/a&gt; on Burroughs MCP time-sharing; today
we&amp;#39;ll use both Fortran 66 and BASIC to implement the &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;TPK algorithm&lt;/a&gt;.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
BASIC
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
No documentation for this seems to have been preserved, but it appears
to be close in features to Dartmouth&amp;#39;s 4th edition (1968) BASIC, which
does have a &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/196801_BASIC_4th_Edition.pdf&#34;&gt;manual&lt;/a&gt; on bitsavers. Keywords like GOSUB and ON … GOTO
are supported, but variables are still only floating point. INPUT is
fully supported.&lt;/p&gt;
&lt;p&gt;
The code is very similar to the version we ran on DTSS, with the only
change being the exponentiation operator being &lt;code&gt;**&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;src src-basic&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-basic&#34; data-lang=&#34;basic&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;100  &lt;span style=&#34;color:#75715e&#34;&gt;REM TPK ALGORITHM IN BASIC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;110  &lt;span style=&#34;color:#66d9ef&#34;&gt;REM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;120  &lt;span style=&#34;color:#66d9ef&#34;&gt;DEF&lt;/span&gt; FNT(X) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;SQR&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;ABS&lt;/span&gt;(X)) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;X&lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;130  &lt;span style=&#34;color:#66d9ef&#34;&gt;REM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;140  &lt;span style=&#34;color:#75715e&#34;&gt;REM MAIN PROGRAM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;150  &lt;span style=&#34;color:#66d9ef&#34;&gt;DIM&lt;/span&gt; A(&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;160  &lt;span style=&#34;color:#66d9ef&#34;&gt;LET&lt;/span&gt; N&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;170  &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PLEASE ENTER&amp;#34;&lt;/span&gt;, N, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;NUMBERS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;180  &lt;span style=&#34;color:#66d9ef&#34;&gt;FOR&lt;/span&gt; I &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; N
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;190  &lt;span style=&#34;color:#66d9ef&#34;&gt;INPUT&lt;/span&gt; A(I)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;200  &lt;span style=&#34;color:#66d9ef&#34;&gt;NEXT&lt;/span&gt; I
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;210  &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RESULTS ARE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;220  &lt;span style=&#34;color:#66d9ef&#34;&gt;FOR&lt;/span&gt; J &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; N
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;230  &lt;span style=&#34;color:#66d9ef&#34;&gt;LET&lt;/span&gt; K &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; N &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; J &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;240  &lt;span style=&#34;color:#66d9ef&#34;&gt;LET&lt;/span&gt; R &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; FNT(A(K))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;250  &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; R &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;THEN&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;280&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;260  &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; R
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;270  &lt;span style=&#34;color:#66d9ef&#34;&gt;GOTO&lt;/span&gt; 290
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;280  &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TOO LARGE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;290  &lt;span style=&#34;color:#66d9ef&#34;&gt;NEXT&lt;/span&gt; J
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;300  &lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Note than line 250 has a &lt;code&gt;?&lt;/code&gt; where you&amp;#39;d expect a  &lt;code&gt;&amp;gt;&lt;/code&gt;. Although this
was keyed in as &lt;code&gt;&amp;gt;&lt;/code&gt; it was stored as &lt;code&gt;?&lt;/code&gt; due to the limited number of
characters supported by MCP.&lt;/p&gt;
&lt;p&gt;
Source and a transcript of its execution can be found on &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Fortran 66
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
MCP supports Fortran 66, which brings some improvements over Fortran
II:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The three-way-if &lt;code&gt;IF (RESULT-400.0) 2,2,1&lt;/code&gt; can now be expressed as a
logical test: &lt;code&gt;IF (RESULT .LE. 400) GOTO 2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Function names no longer need to end with the letter &lt;code&gt;F&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Burroughs implementation adds some more conveniences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Strings can be represented in quoted form &lt;code&gt;&amp;#34;HELLO&amp;#34;&lt;/code&gt; rather than
Hollerith form &lt;code&gt;5HHELLO&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Generic input/output can be done with &lt;code&gt;PRINT&lt;/code&gt; / &lt;code&gt;READ&lt;/code&gt; rather than
specifying a unit number.&lt;/li&gt;
&lt;li&gt;More than one statement is allowed per line, if separated by &lt;code&gt;;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The time-sharing version relaxes the fixed column layout to make it
easier to enter programs on a terminal. Comments do need to start with
&lt;code&gt;C-&lt;/code&gt; in columns 1-2, however.&lt;/p&gt;
&lt;p&gt;
Full information can be found in the 1971 &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1051182_B5700_FORTRAN_197101.pdf&#34;&gt;Fortran Manual&lt;/a&gt; on bitsavers.&lt;/p&gt;
&lt;p&gt;
The program now looks like this. The left hand numbers are the line
numbers used for entering programs on CANDE. The middle numbers like
&lt;code&gt;101&lt;/code&gt; are Fortran labels.&lt;/p&gt;
&lt;div class=&#34;src src-fortran&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fortran&#34; data-lang=&#34;fortran&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt; C&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;   TPK ALGORITH IN FORTRAN &lt;span style=&#34;color:#ae81ff&#34;&gt;66&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1100&lt;/span&gt;      FTPK(X) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; SQRT(ABS(X)) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;X&lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1200&lt;/span&gt; C&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;   MAIN &lt;span style=&#34;color:#66d9ef&#34;&gt;PROGRAM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1300&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;DIMENSION&lt;/span&gt; A(&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1400&lt;/span&gt;      N&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1500&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1600&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PLEASE ENTER 11 NUMBERS&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1700&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;READ&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;101&lt;/span&gt;,A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1800&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;101&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(F9.&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1900&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;102&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2000&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;102&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RESULTS ARE&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2100&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;DO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; J &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, N
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2200&lt;/span&gt;      K &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; N &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; J &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2300&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;RESULT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; FTPK(A(K))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2400&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;RESULT&lt;/span&gt; .LE. &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;GOTO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2500&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;103&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2600&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;103&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TOO LARGE&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2700&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;GOTO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2800&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;101&lt;/span&gt;,&lt;span style=&#34;color:#66d9ef&#34;&gt;RESULT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2900&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;CONTINUE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3000&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;STOP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3100&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Source and a transcript of its execution can be found on &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP: Batch and the Operator Console</title>
      <link>https://timereshared.com/mcp-batch-and-operator-console/</link>
      <pubDate>Sun, 26 Oct 2025 08:32:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-batch-and-operator-console/</guid>
      <description>
&lt;p&gt;
Although our main focus is on time-sharing, it&amp;#39;s good to know a bit on
how the batch facility works on MCP. In this post I will give a brief
introduction, along with details on how to use the operator console.&lt;/p&gt;
&lt;p width=&#34;50%&#34; height=&#34;50%&#34; title=&#34;Burroughs B5500 system console on  retro-b5500&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/b5500-spo.png&#34; alt=&#34;/images/mcp/b5500-spo.png&#34; title=&#34;/images/mcp/b5500-spo.png&#34;/&gt;
&lt;em&gt;The B5500 operator console on retro-b5500. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Batch
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The MCP batch facility allows you to compile and run programs, and
manage files on disk. Interestingly it uses a different syntax from
CANDE.&lt;/p&gt;
&lt;p&gt;
Batch instructions are indicated by an invalid character in column 1,
by convention a &lt;code&gt;?&lt;/code&gt;. Multiple instructions per line are allowed if
separated by &lt;code&gt;;&lt;/code&gt;. The end of the batch job is indicated by a &lt;code&gt;END&lt;/code&gt;
instruction.&lt;/p&gt;
&lt;p&gt;
Batch jobs can be submitted via punched cards, tapes, keyed into the
operator console or (if you are not running time-sharing) via the data
terminals.&lt;/p&gt;
&lt;p&gt;
To compile a program you use &lt;code&gt;COMPILE file WITH compiler&lt;/code&gt; where &lt;code&gt;file&lt;/code&gt;
is a file name for the compiled program and &lt;code&gt;compiler&lt;/code&gt; is &lt;code&gt;ALGOL&lt;/code&gt;,
&lt;code&gt;FORTRAN&lt;/code&gt; etc. The source can be an existing file on disk or you can
take it from cards supplied after the compile directive.&lt;/p&gt;
&lt;p&gt;
Putting this together, here is how to submit a simple job using
punched cards on the emulator. Create a plain text file that looks
like this:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
?COMPILE LIFE/DISK WITH ALGOL
?DATA CARD
BEGIN
    FILE OUT PRINTER 4 (2, 15);
    INTEGER J;
    J := 42;
    WRITE(PRINTER, /, J);
END.
?END
&lt;/pre&gt;
&lt;p&gt;
The first line is a batch directive to create &lt;code&gt;LIFE/DISK&lt;/code&gt; using the
Algol compiler. The second line indicates that this file should come
from the following cards. Next is the Algol program which terminates
with &lt;code&gt;END.&lt;/code&gt;. Finally, the batch directive &lt;code&gt;?END&lt;/code&gt; finishes the job.&lt;/p&gt;
&lt;p&gt;
On retro-b6600, switch to the card reader, load this file and press
the REMOTE button. On simh, break into command mode on the main simh
window by pressing Control-E then typing &lt;code&gt;attach cd0 /path/to/file&lt;/code&gt;
and then &lt;code&gt;continue&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
MCP will sense that there are cards to read automatically. On the
operator console you will see work being done as the program is
compiled, executed and the results printed.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
5:ALGOL/LIFE= 2 BOJ 1020
PBD0004 OUT LINE:ALGOL/LIFE= 2
0:PRNPBT/DISK/SITE= 3 BOJ 1020
ALGOL/LIFE= 2,PST= 1 EOJ
4:LIFE/DISK= 2 BOJ 1020
PBD/0004001 REMOVED
PBD/0004001/0000000= 18 SEGS--CREATED 10/05/25 AT 10:20:16:35
PBD0005 OUT PRINTER:LIFE/DISK= 2
PRNPBT FOR ALGOL/LIFE, PST= 1, IOT= 1; EOJ AT 10:20
PRNPBT/DISK/SITE= 3,PST= 1 EOJ
LIFE/DISK= 2,PST= 1 EOJ
0:PRNPBT/DISK/SITE= 2 BOJ 1020
PBD/0005001 REMOVED
PBD/0005001/0000000= 3 SEGS--CREATED 10/05/25 AT 10:20:18:14
PRNPBT FOR LIFE/DISK, PST= 1, IOT= 1; EOJ AT 10:20
PRNPBT/DISK/SITE= 2,PST= 1 EOJ
&lt;/pre&gt;
&lt;p&gt;
Switch over to the printer window on retro-b6600 or the printer file
(&lt;code&gt;units/printer.txt&lt;/code&gt;) on simh and you will see the compiler output and
finally the program running and printing 42. Below is how it looks,
slightly edited to remove whitespace:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
 LABEL  000000000LINE   00125278?COMPILE LIFE/DISK WITH ALGOL   ALGOL  /LIFE
 LABEL  000000000LINE   00125278?COMPILE LIFE/DISK WITH ALGOL   ALGOL  /LIFE
    BURROUGHS B-5700 ALGOL COMPILER MARK XIII.0     MONDAY, 10/05/25,  10:20 AM.

                BEGIN                             0000
                    FILE OUT PRINTER 4 (2, 15);   0000
                    INTEGER J;                    0003
                    J := 42;                      0003
                    WRITE(PRINTER, /, J);         0004
                END.                              0011
                                                   2 IS   14 LONG, NEXT SEG    1

PRT(31) = OUTPUT(W) INTRINSIC, SEGMENT NUMBER =    3.
PRT(5) = BLOCK CONTROL INTRINSIC, SEGMENT NUMBER =    4.
PRT(14) = ALGOL WRITE   INTRINSIC, SEGMENT NUMBER =    5.
PRT(15) = ALGOL READ    INTRINSIC, SEGMENT NUMBER =    6.
PRT(16) = ALGOL SELECT  INTRINSIC, SEGMENT NUMBER =    7.
                             1 IS    2 LONG, NEXT SEG    0
                             8 IS   69 LONG, NEXT SEG    0

NUMBER OF ERRORS DETECTED =   0.  COMPILATION TIME =    1 SECONDS.
PRT SIZE =  26; TOTAL SEGMENT SIZE =    85 WORDS;
                 DISK SIZE =   9 SEGS; NO. PGM. SEGS =   8
ESTIMATED CORE STORAGE REQUIRED =   696 WORDS.
ESTIMATED AUXILIARY MEMORY REQUIRED =     0 WORDS.

 LABEL  000000000LINE   00125278?COMPILE LIFE/DISK WITH ALGOL
           ALGOL  /LIFE
 LABEL  000000000PRINTER00125278?COMPILE LIFE/DISK WITH ALGOL
           LIFE   /DISK
42,
 LABEL  000000000PRINTER00125278?COMPILE LIFE/DISK WITH ALGOL
           LIFE   /DISK
&lt;/pre&gt;
&lt;p&gt;
The above will do a &amp;#39;load and go&amp;#39; compile, not storing the executable
on the disk permanently. If you wish to do this, change the compile
command to be:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
COMPILE LIFE/DISK WITH ALGOL FOR LIBRARY
&lt;/pre&gt;
&lt;p&gt;
and the binary can then later be run with:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
EXECUTE LIFE/DISK
&lt;/pre&gt;
&lt;p&gt;
Other batch commands are:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;REMOVE file&lt;/td&gt;
&lt;td&gt;Delete file from disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DUMP TO tape file&lt;/td&gt;
&lt;td&gt;Save files to a tape in library format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UNLOAD TO tape file&lt;/td&gt;
&lt;td&gt;As above, but deletes file on disk after tape write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LOAD FROM tape file&lt;/td&gt;
&lt;td&gt;Loads file from specified library tape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADD FROM tape file&lt;/td&gt;
&lt;td&gt;As above, but only loads to disk if not already there&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CHANGE file1 TO file2&lt;/td&gt;
&lt;td&gt;Renames file1 to file2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;code&gt;file&lt;/code&gt; in the above can use the &lt;code&gt;=&lt;/code&gt; wildcard: for example, to remove
all files under the time-sharing user guest you could do &lt;code&gt;REMOVE
=/GUEST&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
The Operator Console
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The operator console, or SPO, allows the operator to monitor tasks and
manipulate the running system. It is half-duplex, so it can either be
printing or accepting input. To start giving input, press &lt;code&gt;Esc&lt;/code&gt; and
type the command, terminated by &lt;code&gt;Enter&lt;/code&gt;. To abandon the command, press
&lt;code&gt;Esc&lt;/code&gt; again. simh precedes input with an &lt;code&gt;I&lt;/code&gt; and output with an &lt;code&gt;R&lt;/code&gt;
when printing to the console.&lt;/p&gt;
&lt;p&gt;
Commands are two letters, like &lt;code&gt;MX&lt;/code&gt;. They take optional parameters
which are in most cases given after the command. One special case is
when you need to provide a &amp;#39;mix number&amp;#39; or process id: in this case
you give the number before the command.&lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s look at some commands that are useful on emulation.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;MX&lt;/code&gt; will show what jobs are currently running. For example, if I typed
this while the above batch job was running I would see:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
MX
 0:CANDE/TSHARER= 1
 4:LIFE/DISK= 2
END MX
&lt;/pre&gt;
&lt;p&gt;
If I wanted to kill the job, I would find its mix number -
here 2 - and &amp;#39;deep six&amp;#39; the job with the &lt;code&gt;DS&lt;/code&gt; command:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
2 DS

-OPRTR DS-ED:LIFE/DISK= 2, S= 2, A= 11
 LIFE/DISK= 2,PST= 1 DS-ED
&lt;/pre&gt;
&lt;p&gt;
If I had compiled the file to save on disk, I could run the binary via
the &lt;code&gt;CC&lt;/code&gt; or &lt;code&gt;?&lt;/code&gt; command which takes batch instructions:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
? EXECUTE LIFE/DISK; END

 4:LIFE/DISK/SITE= 2 BOJ 1135
 PBD0009 OUT PRINTER:LIFE/DISK= 2
&lt;/pre&gt;
&lt;p&gt;
&lt;code&gt;PD&lt;/code&gt; will show a listing of files on disk, allowing the &lt;code&gt;=&lt;/code&gt; wildcard.
To see a list of files starting with FORTRAN:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
PD FORTRAN/=
 FORTRAN/TRANS
 FORTRAN/DISK
&lt;/pre&gt;
&lt;p&gt;
The image at the top of this post shows the start of a directory
listing of all files on the disk via &lt;code&gt;PD =/=&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Here is a full list of operator commands; many of these are only of
use when running on real hardware. &lt;code&gt;m&lt;/code&gt; means mix number.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;m AX data&lt;/td&gt;
&lt;td&gt;Send data to program that is waiting for input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BK&lt;/td&gt;
&lt;td&gt;Send break&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BS tu/buf&lt;/td&gt;
&lt;td&gt;Make tu/buf a SPO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC control info&lt;/td&gt;
&lt;td&gt;Supply control information, eg run a program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;? control info&lt;/td&gt;
&lt;td&gt;Supply control information, eg run a program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CD&lt;/td&gt;
&lt;td&gt;Type info on pseudo decks on disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CE&lt;/td&gt;
&lt;td&gt;Start CANDE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI        file&lt;/td&gt;
&lt;td&gt;Change intrinsics file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CL unit&lt;/td&gt;
&lt;td&gt;Stop the job using unit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m CT proc io&lt;/td&gt;
&lt;td&gt;Set limits for processor or I/O for a job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m DS&lt;/td&gt;
&lt;td&gt;Terminate a job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DT mm/dd/yy&lt;/td&gt;
&lt;td&gt;Set the date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ED deck&lt;/td&gt;
&lt;td&gt;Eliminate pseudo card deck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EI&lt;/td&gt;
&lt;td&gt;Was intended to stop all processes, but now prints EIO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES job spec&lt;/td&gt;
&lt;td&gt;Eliminate scheduled job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m FM unit&lt;/td&gt;
&lt;td&gt;Reply to a FM RQD message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m FR&lt;/td&gt;
&lt;td&gt;Tell a job that was the last tape reel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m IL unit&lt;/td&gt;
&lt;td&gt;Designate what unit to find a non-labelled file on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m IN index = int&lt;/td&gt;
&lt;td&gt;Insert a value in the PRT at index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LD dk/mt&lt;/td&gt;
&lt;td&gt;Load CONTROL/DECK from disk or tape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LN&lt;/td&gt;
&lt;td&gt;Start a new log file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LR&lt;/td&gt;
&lt;td&gt;Run LOGOUTR/DISK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MX&lt;/td&gt;
&lt;td&gt;List programs in the mix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m OP&lt;/td&gt;
&lt;td&gt;Specify that a COBOL file is optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m OK&lt;/td&gt;
&lt;td&gt;Resume processing of a job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OL unit&lt;/td&gt;
&lt;td&gt;Print status of units&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m OT index&lt;/td&gt;
&lt;td&gt;Print value of index in memory for job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m OU unit&lt;/td&gt;
&lt;td&gt;Send output to unit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PB unit&lt;/td&gt;
&lt;td&gt;Load a printer backup tape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PD file spec&lt;/td&gt;
&lt;td&gt;List files on disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PG unit&lt;/td&gt;
&lt;td&gt;Purge a magnetic tape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m PR = level&lt;/td&gt;
&lt;td&gt;Set priority of a job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m QT&lt;/td&gt;
&lt;td&gt;Skip a printer backup file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RD #int&lt;/td&gt;
&lt;td&gt;Remove a pseudo card deck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m RM&lt;/td&gt;
&lt;td&gt;Remove file flagged by job as duplicate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RN n&lt;/td&gt;
&lt;td&gt;Specify number of pseudo card decks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RS unit&lt;/td&gt;
&lt;td&gt;Restart a job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RW unit&lt;/td&gt;
&lt;td&gt;Rewind and lock a tape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RY  unit&lt;/td&gt;
&lt;td&gt;Mark a tape as ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RO,SO,TO&lt;/td&gt;
&lt;td&gt;Reset, set and list options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SF factor&lt;/td&gt;
&lt;td&gt;Set multiprocessing factor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SS  SPO  or ALL&lt;/td&gt;
&lt;td&gt;Send message to remote SPOs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m ST&lt;/td&gt;
&lt;td&gt;Suspend a job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SV unit&lt;/td&gt;
&lt;td&gt;Mark a tape as not ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TF&lt;/td&gt;
&lt;td&gt;Show multiprocessing factor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m TI&lt;/td&gt;
&lt;td&gt;Show how much time a job has used&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TR hhmm&lt;/td&gt;
&lt;td&gt;Set time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TS&lt;/td&gt;
&lt;td&gt;List tasks in the scheduler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m UL unit&lt;/td&gt;
&lt;td&gt;Designate unit as source for file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WD&lt;/td&gt;
&lt;td&gt;Print current date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WM&lt;/td&gt;
&lt;td&gt;Print system version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WT&lt;/td&gt;
&lt;td&gt;Print current time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WU&lt;/td&gt;
&lt;td&gt;Print who is logged in where&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m WY&lt;/td&gt;
&lt;td&gt;Print why a job has been suspended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XI file&lt;/td&gt;
&lt;td&gt;Swap intrinsics file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XS job&lt;/td&gt;
&lt;td&gt;Force job to be executed from scheduler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Further Information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
On bitsavers, the &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1024916_B5500_B5700_OperMan_196809.pdf&#34;&gt;Operations Manual&lt;/a&gt; section 4, &amp;#34;Control Information&amp;#34;
starting on PDF page 63, details the batch language and options. The
&lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1031986_B5500_Handbook_197008.pdf&#34;&gt;B5500 Handbook&lt;/a&gt; section &amp;#34;Keyboard Input Messages&amp;#34; on PDF page 37
defines the operator console commands (except a few time-sharing
related ones like &lt;code&gt;CE&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;
Richard Cornwell also has a good &lt;a href=&#34;https://sky-visions.com/burroughs/quick/batch.shtml&#34;&gt;summary&lt;/a&gt; of batch commands.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP: Algol 60 Programming</title>
      <link>https://timereshared.com/mcp-algol/</link>
      <pubDate>Sun, 19 Oct 2025 09:32:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-algol/</guid>
      <description>
&lt;p&gt;
Let&amp;#39;s look at programming using the Algol 60 implementation under
time-sharing on Burroughs MCP.&lt;/p&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;Burroughs MCP Algol Syntax Chart&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/mcp-algol-syntax-chart.png&#34; alt=&#34;/images/mcp/mcp-algol-syntax-chart.png&#34; title=&#34;/images/mcp/mcp-algol-syntax-chart.png&#34;/&gt;
&lt;em&gt;Algol 60 Syntactical Chart. Burroughs Corporation, 1961. Source: &lt;a href=&#34;https://www.softwarepreservation.org/projects/ALGOL/paper/ALGOL_60_Syntactical_Chart.pdf&#34;&gt;softwarepreservation.org&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
MCP had several Algol implementations: the main one which we will
consider here is called Extended Algol and according to the &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1028024_B5500_ExtendedAlgol_196904.pdf&#34;&gt;manual&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In addition to implementing virtually all of ALGOL 60, Extended ALGOL
provides for communication between the processor and input/output
devices, enabling editing of data, and facilitates program debugging.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
There was also Compatible Algol which&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;represents a subset of B 6500 Extended ALGOL and should be useful for
facilitating conversion to a B 6500 System. This language is intended
to be used where character mode manipulation is required without
jeopardising the integrity of the operating system or other
multiprocessing programs&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
which makes Extended Algol sound dangerous, but I think this refers to
stream processors which were rather difficult to use; see the article
&lt;a href=&#34;https://retro-b5500.blogspot.com/2012/04/agony-and-ecstasy-of-stream-procedures.html&#34;&gt;The Agony and the Ecstasy of Stream Procedures&lt;/a&gt; on the retro-b5500
project blog.&lt;/p&gt;
&lt;p&gt;
Beyond that there was ESPOL - Executive System Problem Orientated
language - for programming MCP itself, and TSPOL which had some
extensions for building time-sharing code. We will only look at
Extended Algol here, but it would be an interesting project to find
all the differences.&lt;/p&gt;
&lt;p&gt;
To show how to use Extended Algol we will as always work on an
implementation of the &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;TPK algorithm&lt;/a&gt;.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
TPK in Extended Algol
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div class=&#34;src src-algol&#34;&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-algol&#34; data-lang=&#34;algol&#34;&gt;100 BEGIN
110     COMMENT TPK ALGORITHM IN ALGOL 60;
120 
130     REAL PROCEDURE FN(X);
140     VALUE X;
150     REAL X;
160     BEGIN
170         FN := SQRT(ABS(X)) + 5 TIMES X * 3
180     END;
190 
200     COMMENT MAIN PROGRAM;
210     INTEGER N, J;
220     REAL ARRAY A[1:11];
230     FILE OUT DCO 19 (1, 10);
240     FILE IN DCI 19 (1, 10);
250     FORMAT NUM(R11.4);
260     FORMAT PROMPT(&amp;#34;PLEASE ENTER 11 NUMBERS&amp;#34;);
270     FORMAT RESULTS(&amp;#34;RESULTS ARE&amp;#34;);
280     WRITE(DCO, PROMPT);
290     N := 11;
300     FOR J := 1 STEP 1 UNTIL N DO
310         READ(DCI, NUM, A[J]);
320     WRITE(DCO, RESULTS);
330     FOR J := N STEP -1 UNTIL 1 DO
340     BEGIN
350         REAL RESULT;
360         FORMAT TOOLARGE(&amp;#34;TOO LARGE&amp;#34;);
370         RESULT := FN(A[J]);
380         IF RESULT GTR 400.0 THEN
390             WRITE(DCO, TOOLARGE)
400         ELSE
410             WRITE(DCO, NUM, RESULT);
420     END;
430 END.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The line numbers are for entry on CANDE and are not used by the
program itself. Keywords like &lt;code&gt;INTEGER&lt;/code&gt; are reserved and do not need
to be quoted.&lt;/p&gt;
&lt;p&gt;
On line 170, &lt;code&gt;FN := SQRT(ABS(X)) + 5 TIMES X * 3&lt;/code&gt;, note that the
multiplication operator is the Algol glyph × but we can&amp;#39;t type that so
we use the text equivalent &lt;code&gt;TIMES&lt;/code&gt;. &lt;code&gt;*&lt;/code&gt; here is the exponentiation
operator. Similarly on line 380 we use &lt;code&gt;GTR&lt;/code&gt; to stand in for &lt;code&gt;&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
I/O is not a part of Algol so each implementation does its own thing.
Burroughs did it as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FILE&lt;/code&gt; introduces an I/O channel. The &lt;code&gt;19&lt;/code&gt; refers to the device,
here the data terminal. Other devices are listed on p105 of the
manual. The &lt;code&gt;(1,10)&lt;/code&gt; refers to the buffer size used. Note that input
and output each needs a separate &lt;code&gt;FILE&lt;/code&gt; variable. &lt;code&gt;FILE&lt;/code&gt;
declarations are block-scoped, so here the devices are closed
automatically at the program &lt;code&gt;END&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FORMAT&lt;/code&gt; works like in Fortran to define how input should be parsed
and output presented. We use it here for real numbers (&lt;code&gt;NUM&lt;/code&gt;) and
some string constants (eg &lt;code&gt;PROMPT&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;READ&lt;/code&gt; and &lt;code&gt;WRITE&lt;/code&gt; do the actual I/O, taking the file, format and
data as their parameters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On line 390, I originally had &lt;code&gt;WRITE(DCO, TOOLARGE);&lt;/code&gt; ie with a
semi-colon on the end. This was correctly raised as a syntax error by
the compiler as this is not an end of statement situation as the &lt;code&gt;IF&lt;/code&gt;
clause extends to the &lt;code&gt;ELSE&lt;/code&gt; on the next line. The Dartmouth Algol
compiler allowed this.&lt;/p&gt;
&lt;p&gt;
Apart from this, the rest of the implementation works the same way as
standard Algol.&lt;/p&gt;
&lt;p&gt;
When executing this you need to enter numbers in floating point, eg
&lt;code&gt;1.0&lt;/code&gt; instead of &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
The code and execution transcript for this can be found on &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Other extensions to Algol
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The manual is rather terse, as it is intended as a reference rather
than a tutorial, and also does not list in a single place what
extensions have been added. However, the text follows the format of
the &lt;em&gt;&lt;a href=&#34;https://www.masswerk.at/algol60/report.htm&#34;&gt;Revised Report on the Algorithmic Language Algol&lt;/a&gt;&lt;/em&gt; and when each
part of the language is introduced in Backus-Naur form it prefaces
each of them with a tag:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&#34;text-decoration: underline;&#34;&gt;1&lt;/span&gt; means this is the same as the standard&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;text-decoration: underline;&#34;&gt;2&lt;/span&gt; means this has differences&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;text-decoration: underline;&#34;&gt;3&lt;/span&gt; means this is new syntax&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So this is not a comprehensive list, but some of the interesting
extensions I noted while reading the manual:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conditional expressions:  &lt;code&gt;K := (IF J = 0 THEN 0 ELSE 1 / J);&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fill an array: &lt;code&gt;REAL ARRAY A[1:11]; FILL A WITH 42;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ZIP&lt;/code&gt; to run an external program in the background: &lt;code&gt;ZIP(&amp;#34;HELLO &amp;#34;,
&amp;#34;RUPERT &amp;#34;);&lt;/code&gt; would run the hello world example we did earlier.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TIME(0)&lt;/code&gt; gets the current date.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WHEN(5)&lt;/code&gt; pause for 5s&lt;/li&gt;
&lt;li&gt;Can recover from errors eg divide-by-zero via testing flags&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;CASE&lt;/code&gt; statement&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the reference &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1028024_B5500_ExtendedAlgol_196904.pdf&#34;&gt;manual&lt;/a&gt; from 1969 on bitsavers. The other Algol
material noted on the &lt;a href=&#34;https://timereshared.com/dartmouth-dtss-algol/&#34;&gt;Dartmouth DTSS&lt;/a&gt; article may also be useful.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP: Advanced CANDE</title>
      <link>https://timereshared.com/mcp-advanced-cande/</link>
      <pubDate>Sun, 12 Oct 2025 08:42:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-advanced-cande/</guid>
      <description>
&lt;p&gt;
In the &lt;a href=&#34;https://timereshared.com/mcp-using-cande/&#34;&gt;last post&lt;/a&gt; we looked at using the CANDE command shell for basic
program editing and execution; this time we&amp;#39;ll go into some more
advanced features.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Security
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
By default, files are not visible to other time-sharing users on
CANDE. With the &lt;code&gt;UNLOCK&lt;/code&gt; command you can make them visible and
read-only to others; &lt;code&gt;PUBLIC&lt;/code&gt; makes them read/write. &lt;code&gt;LOCK&lt;/code&gt; returns
files to their default state. You can see the protection on files with
&lt;code&gt;LIST FILES&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
UNLOCK HELLO
#
LIST FILES
09/26/26 RUPERT         02:27 PM
NAME    TYPE     RECS SEGS   CREATED   ACCESSED  W/R  W/B  S-F LOCKD BY
HELLO   BASIC       4   10  09/23/25 * 09/26/25   10  300    7  UNLOCKD
HELLO   OBJ(B)     13   13  09/23/25 * 09/26/25   30   30    7  UNLOCKD
       2  FILES         23  SEGMENTS      17  RECORDS
&lt;/pre&gt;
&lt;p&gt;
Other users can access them by adding a &lt;code&gt;/&lt;/code&gt; then the user name, eg
&lt;code&gt;RUN HELLO/RUPERT&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
It&amp;#39;s also possible to apply more granular permissions with a GUARD
file. You run the interactive &lt;code&gt;GUARD&lt;/code&gt; command to create a list of
names and permissions, then apply via &lt;code&gt;LOCK WITH&lt;/code&gt;. For example, to
grant read only access to a staff group containing FRED and MARY:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
GUARD
 RUNNING
        

NEW OR OLD LOCK FILE??NEW
LOCK FILE NAME??STAFF
READ ONLY NAMES??FRED,MARY
READ/WRITE NAMES??
ADD, DELETE, LIST, SAVE, OR QUIT?
?LIST
(R) FRED
(R) MARY
ADD, DELETE, LIST, SAVE, OR QUIT?
?SAVE
LOCK FILE SAVED.
ADD, DELETE, LIST, SAVE, OR QUIT?
?QUIT
THANK YOU.


 END GUARD .0 SEC.

LOCK HELLO WITH STAFF
#
&lt;/pre&gt;
&lt;p&gt;
Note that this security model only applies to CANDE. Batch jobs can
access any file on the system.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Scheduling
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
You can run a sequence of commands - like a Unix shell script - using
the SCHEDULE facility. First you need to create a DATA file containing
the commands. DATA files do not have line numbers and their contents
can be entered by starting a line with &lt;code&gt;?DATA&lt;/code&gt; and terminating with
&lt;code&gt;?END&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
CREATE HRUN DATA
FILE:HRUN - TYPE:DATA  -- CREATED
?DATA
 OK
LOAD HELLO
LIST
RUN
?END
&lt;/pre&gt;
&lt;p&gt;
You then issue the &lt;code&gt;SCHEDULE&lt;/code&gt; command, giving the file to send output
to as the second parameter. The &lt;code&gt;AFTER time&lt;/code&gt; parameter is optional,
without it the job should be scheduled as soon as possible.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
SCHEDULE HRUN TO HOUT AFTER 1530
&lt;/pre&gt;
&lt;p&gt;
You can then use &lt;code&gt;STATUS&lt;/code&gt; with the output file name to see its status,
or &lt;code&gt;STOP&lt;/code&gt; to cancel it.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
STATUS HOUT
SCHEDULED
&lt;/pre&gt;
&lt;p&gt;
However, in practice I have found that these jobs never get executed -
they stay in state SCHEDULED forever. Let me know if you find a way to
get this working.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Redirection
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
This is a way to make a program send input/output to a different place
without changing the source code. Say you have this simple Algol
program:&lt;/p&gt;
&lt;div class=&#34;src src-algol&#34;&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-algol&#34; data-lang=&#34;algol&#34;&gt;FILE:P42    -10/02/25  6:41 PM.

100  BEGIN
110  FILE OUT TYPEWRITER 19 (1, 10);
120  INTEGER J;
130  J := 42;
140  WRITE(TYPEWRITER, /, J);
150  END.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
which if run prints 42 to the user&amp;#39;s terminal&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
RUN
 RUNNING
        
42,

 END P42 .0 SEC.
&lt;/pre&gt;
&lt;p&gt;
In the code, the &lt;code&gt;FILE&lt;/code&gt; statement defines an output file called
TYPEWRITER to attach to unit 19, which is the user&amp;#39;s terminal. (We&amp;#39;ll
go into I/O on Algol in more detail in a later post).&lt;/p&gt;
&lt;p&gt;
Using the CANDE &lt;code&gt;EQUATE&lt;/code&gt; verb you can redirect this to a file or
another device. The file must already exist before running. So if you
wanted to send output to &lt;code&gt;MYOUT&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
CREATE MYOUT
SAVE
LOAD P42
EQUATE TYPEWRITER=MYOUT
RUN
 RUNNING

 END P42 .0 SEC.

LIST MYOUT 

FILE:MYOUT  -10/02/25  6:37 PM.

 42,

 END QUIKLST .0 SEC.
&lt;/pre&gt;
&lt;p&gt;
Note that the &lt;code&gt;EQUATE&lt;/code&gt; only lasts until the next &lt;code&gt;RUN&lt;/code&gt; command, but
you can stack up more than one &lt;code&gt;EQUATE&lt;/code&gt; before running.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Chat
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There&amp;#39;s a way to send single line messages to other users or the
operator via the &lt;code&gt;TO&lt;/code&gt; command. For example, if It was logged in as
GUEST and wanted to send a message to RUPERT:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
TO RUPERT HELLO
&lt;/pre&gt;
&lt;p&gt;
and if he was logged in he would see:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
 ** FROM GUEST   (03)     HELLO
&lt;/pre&gt;
&lt;p&gt;
With the first parameter set to SPO it gets sent to the operator&amp;#39;s
console.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
TO SPO HELP I LOST MY TAPE
&lt;/pre&gt;
&lt;p&gt;
and they would see:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
R ** FROM GUEST(03) HELP I LOST MY TAPE
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Extensions to CANDE
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
It&amp;#39;s not possible for an end user to add new verbs to CANDE, nor can
they use other compilers beyond those already defined. However, all
Burroughs sites would receive the source code for CANDE so it would be
possible for the system programmers to add these. For example, Georgia
Tech added a &lt;code&gt;CALL&lt;/code&gt; command to execute programs like GPSS or APL.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Command summary
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Finally here&amp;#39;s a list of all commands on CANDE.&lt;/p&gt;
&lt;p&gt;
In the table, &lt;code&gt;f&lt;/code&gt; is a file name; if not given, it assumes the work
file. Note that if you have say a file FOO which you load into
work and then change, COMPILE will compile that working file, but
COMPILE FOO will compile the old version on disk.&lt;/p&gt;
&lt;p&gt;
Several commands have synonyms not listed here: for example DO does
the same as EXECUTE&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;APPEND&lt;/td&gt;
&lt;td&gt;Add a file to the current file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BYE&lt;/td&gt;
&lt;td&gt;Log off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC&lt;/td&gt;
&lt;td&gt;Set line length, SHORT=72, LONG=unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CHANGE PASSWORD&lt;/td&gt;
&lt;td&gt;Change user&amp;#39;s password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CHANGE f TO fn&lt;/td&gt;
&lt;td&gt;Rename file to f2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CHANGE f TYPE TO t&lt;/td&gt;
&lt;td&gt;Change type of file f to t&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CHARGE&lt;/td&gt;
&lt;td&gt;Enter account to charge time to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COMPILE f&lt;/td&gt;
&lt;td&gt;Compile file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COPY f&lt;/td&gt;
&lt;td&gt;Make a copy of f to file or device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CREATE f t&lt;/td&gt;
&lt;td&gt;Create a new file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;Delete all or parts of the work file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DISPLAY&lt;/td&gt;
&lt;td&gt;Like list, but use 8 chars for line number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EQUATE&lt;/td&gt;
&lt;td&gt;Reassign references to I/O devices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXECUTE f&lt;/td&gt;
&lt;td&gt;Execute a file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FILES&lt;/td&gt;
&lt;td&gt;List files in directory, short form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIND f&lt;/td&gt;
&lt;td&gt;Find text in file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIX&lt;/td&gt;
&lt;td&gt;Edit the program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GUARD&lt;/td&gt;
&lt;td&gt;Allow access to files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HELLO&lt;/td&gt;
&lt;td&gt;Log in again without disconnecting line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LIST&lt;/td&gt;
&lt;td&gt;List program lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LIST FILES&lt;/td&gt;
&lt;td&gt;List files in directory, long form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LOAD&lt;/td&gt;
&lt;td&gt;Load a program into the work area&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LOCK&lt;/td&gt;
&lt;td&gt;Restore file security to private&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MERGE f&lt;/td&gt;
&lt;td&gt;Merge a file into the work file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MONITOR f&lt;/td&gt;
&lt;td&gt;Record an audit log of changes to f&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PRINT&lt;/td&gt;
&lt;td&gt;Like LIST, but suppresses the header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUBLIC&lt;/td&gt;
&lt;td&gt;Make a file read/write by all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUNCH&lt;/td&gt;
&lt;td&gt;Punch to terminal paper tape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REMOVE&lt;/td&gt;
&lt;td&gt;Remove a file from disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RENAME f&lt;/td&gt;
&lt;td&gt;Rename work file to f&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RESEQ&lt;/td&gt;
&lt;td&gt;Renumber sequence numbers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RESET&lt;/td&gt;
&lt;td&gt;Clear an option from SET or MONITOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUN&lt;/td&gt;
&lt;td&gt;Compile (if needed) and execute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAVE&lt;/td&gt;
&lt;td&gt;Save work file to disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCHEDULE&lt;/td&gt;
&lt;td&gt;Run a command in batch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEQ&lt;/td&gt;
&lt;td&gt;Set up line numbers for entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SET&lt;/td&gt;
&lt;td&gt;Set options for verbosity and messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STATUS&lt;/td&gt;
&lt;td&gt;Show status of scheduled jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STOP&lt;/td&gt;
&lt;td&gt;Stop a scheduled job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TAPE&lt;/td&gt;
&lt;td&gt;Read a file from terminal paper tape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIME&lt;/td&gt;
&lt;td&gt;Show stats on current session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TO&lt;/td&gt;
&lt;td&gt;Send a message to a user / the operator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TYPE&lt;/td&gt;
&lt;td&gt;Change a file&amp;#39;s type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UNLOCK&lt;/td&gt;
&lt;td&gt;Allow read access to a file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WHATS&lt;/td&gt;
&lt;td&gt;Describes a file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
More information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
On bitsavers, the &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1038205_B5500_TS_TerminalUG_196906.pdf&#34;&gt;Time-sharing System User&amp;#39;s Guide&lt;/a&gt; is the best first
reference; note this is from a different version of MCP so some of the
commands may differ. The Georgia Tech &lt;a href=&#34;https://bitsavers.org/pdf/georgiaTech/Georgia_Tech_B5700_Time_Sharing_System_Manual_Jul72.pdf&#34;&gt;B5700 Time-sharing System Manual&lt;/a&gt;
is a more complete reference, giving examples of each command, but
note this also contains extensions added by Georgia Tech not available
on the base Burroughs system.&lt;/p&gt;
&lt;p&gt;
Also of interest is &lt;a href=&#34;https://umedia.lib.umn.edu/item/p16022coll90:1033&#34;&gt;The Complete CANDE Primer&lt;/a&gt; in the Charles Babbage
Institute Burroughs collection. However this is from 1980 so for a
much enhanced version of CANDE compared to what we have today.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP: Using CANDE</title>
      <link>https://timereshared.com/mcp-using-cande/</link>
      <pubDate>Sun, 05 Oct 2025 08:44:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-using-cande/</guid>
      <description>
&lt;p&gt;
CANDE, (Command And Edit) is the user facing part of time-sharing on
Burroughs MCP, similar to a shell.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Logging on
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
On &lt;a href=&#34;https://timereshared.com/mcp-retro-b5500-quick-tour/&#34;&gt;retro-b5500&lt;/a&gt;. halt/load the system, and enable time-sharing by
entering &lt;code&gt;CE&lt;/code&gt; on the operator console. navigate to the terminal (DCA)
window and click connect.&lt;/p&gt;
&lt;p&gt;
On &lt;a href=&#34;https://timereshared.com/mcp-simh-quick-tour/&#34;&gt;simh&lt;/a&gt;, start the system - time-sharing is already enabled if you
used the quick-start - then use telnet to connect to port 5500 on
localhost. Then give your user name and password.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
B5500 TIME SHARING - 01/00, STATION 02
ENTER USER CODE, PLEASE-RUPERT
AND YOUR PASSWORD
RUPERT@@
09/23/25 12:11 PM.
GOOD AFTERNOON, RUPERT LANE     YOU HAVE STATION 02

#
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
General usage
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Once logged in, you can either edit a work file or issue commands, in
an interface similar to &lt;a href=&#34;https://timereshared.com/dartmouth/&#34;&gt;Dartmouth DTSS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
Input lines should be less than 72 characters long. You can use
backspace to correct mistakes and Enter to terminate a line - this is
a convenience of the emulator; on the real system you&amp;#39;d use &amp;#39; to
backspace and ← to finish a line.&lt;/p&gt;
&lt;p&gt;
A line starting with &amp;#34; is treated as a comment, ie just printed on the
teletype but not saved or processed.&lt;/p&gt;
&lt;p&gt;
More than one command can be given on a single line by separating them
with &lt;code&gt;;&lt;/code&gt;. Commands can usually be abbreviated, eg &lt;code&gt;LIST&lt;/code&gt; can by typed
as &lt;code&gt;L&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
If you get an error message, typing &lt;code&gt;?&lt;/code&gt; will often provide more
details.&lt;/p&gt;
&lt;p&gt;
If you get stuck, eg a program is in an infinite loop, you can
interrupt it back to the command level by pressing break, which is
Control-E on simh or Control-B on retro-b6600.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Selecting a work file
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
CANDE has the concept of a work file which is a temporary copy of a
program on disk. You can make a work file by creating a new file or
loading from an existing disk file.&lt;/p&gt;
&lt;p&gt;
File names in CANDE are 6 characters long and must start with a letter.&lt;/p&gt;
&lt;p&gt;
To create a new work file, use &lt;code&gt;CREATE name type&lt;/code&gt; where &lt;code&gt;name&lt;/code&gt; is the
file name and &lt;code&gt;type&lt;/code&gt; is a programming language: BASIC, ALGOL, FORTRAN,
or COBOL. You can also set type to be SEQ (for general line numbered
files) or DATA (for un-numbered line files).&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
CREATE HELLO BASIC
FILE:HELLO - TYPE:BASIC  -- CREATED
&lt;/pre&gt;
&lt;p&gt;
To load an existing file, use &lt;code&gt;LOAD&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
LOAD HELLO
FILE:HELLO - TYPE:BASIC  -- LOADING
4 RECORDS LOADED.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Editing a program
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Typing a line starting with a number adds to a program or replaces the
line if it already exists. Typing a line number on its own will delete
that line. Lines can be entered in any order.&lt;/p&gt;
&lt;p&gt;
You can use the &lt;code&gt;SEQ&lt;/code&gt; command (or just the abbreviation &lt;code&gt;+&lt;/code&gt;) to
automatically create a line number for each line you enter. Terminate
it by pressing Enter on a blank new line.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
SEQ
100FOR I = 1 TO 5
200PRINT &amp;#34;HELLO, WORLD&amp;#34;
300NEXT I
400END
500
#
&lt;/pre&gt;
&lt;p&gt;
As well as retyping a line, there is also the &lt;code&gt;FIX&lt;/code&gt; command which can
delete or change part of a line.&lt;/p&gt;
&lt;p&gt;
FIX&amp;#39;s syntax is&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    FIX line-number delimiter old delimiter [new]
&lt;/pre&gt;
&lt;p&gt;
So for the line&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    200 PRINT &amp;#34;HELLO, WORLD&amp;#34;
&lt;/pre&gt;
&lt;p&gt;
you can change this to &amp;#34;HELLO, EARTH&amp;#34; with&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    FIX 200 /WORLD/EARTH
&lt;/pre&gt;
&lt;p&gt;
and delete HELLO with&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    FIX 200 /HELLO, /
&lt;/pre&gt;
&lt;p&gt;
The delimiter used above was &lt;code&gt;/&lt;/code&gt;, but this could be any character.
Note that only two delimiters are used, compared to say Unix sed where
you&amp;#39;d do &lt;code&gt;s/world/earth/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Note also that &lt;code&gt;FIX&lt;/code&gt; only makes changes the next time the file is used
(eg on &lt;code&gt;LIST&lt;/code&gt; or &lt;code&gt;RUN&lt;/code&gt;) - so any errors in your &lt;code&gt;FIX&lt;/code&gt; syntax will be
presented then, not immediately.&lt;/p&gt;
&lt;p&gt;
FIX can also be abbreviated to just &lt;code&gt;*&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Compiling and running
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;code&gt;COMPILE&lt;/code&gt; will compile your work file, printing out any errors if
found. &lt;code&gt;EXECUTE&lt;/code&gt; will run the compiled file. Typing &lt;code&gt;RUN&lt;/code&gt; will compile
and execute, skipping the compile if the program has not changed.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
RUN
 WAIT.

 COMPILING.


 END COMPILE .0 SEC.

 RUNNING
        

HELLO, EARTH
HELLO, EARTH
HELLO, EARTH
HELLO, EARTH
HELLO, EARTH


 END HELLO .0 SEC.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Listing
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
You can use &lt;code&gt;LIST&lt;/code&gt; to list out your program; rather than listing the
whole file you can give a single line number or a range as parameters,
eg &lt;code&gt;LIST 200-300&lt;/code&gt;. &lt;code&gt;PRINT&lt;/code&gt; is like &lt;code&gt;LIST&lt;/code&gt; but will omit the banner.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
PRINT 200-300
200 PRINT &amp;#34;HELLO, EARTH&amp;#34;
300 NEXT I
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
File management
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
You can see what files you have in your disk area with &lt;code&gt;FILE&lt;/code&gt; or for
slightly more detail, &lt;code&gt;LIST FILES&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
FILES
 *HELLO  HELLO
#
LIST FILES
09/23/25 RUPERT         12:57 PM
NAME    TYPE     RECS SEGS   CREATED   ACCESSED  W/R  W/B  S-F LOCKD BY
HELLO   BASIC       4   10  09/23/25 * 09/23/25   10  300    7
HELLO   OBJ(B)     13   13  09/23/25 * 09/23/25   30   30    7
       2  FILES         23  SEGMENTS      17  RECORDS


 END LFILES .0 SEC.
&lt;/pre&gt;
&lt;p&gt;
You can manipulate files with &lt;code&gt;COPY&lt;/code&gt;, &lt;code&gt;RENAME&lt;/code&gt; and &lt;code&gt;REMOVE&lt;/code&gt;, as well
as &lt;code&gt;APPEND&lt;/code&gt; and &lt;code&gt;MERGE&lt;/code&gt; to combine several files.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Logging off
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Type &lt;code&gt;BYE&lt;/code&gt; to end your session. If you have modified your work file,
you will get an error; you can either type &lt;code&gt;SAVE&lt;/code&gt; to save it or
&lt;code&gt;DELETE&lt;/code&gt; to discard.&lt;/p&gt;
&lt;p&gt;
When you log off you will see some statistics&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
 ON FOR  3 MIN, 45.2 SEC.
 C&amp;amp;E USE .0 SEC.
 EXECUTE .0 SEC.
 IO TIME .0 SEC.
 OFF AT   6:50 PM.
 GOODBYE GUEST
07/14/25
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-9&#34;&gt;
Some funny responses to commands
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
If you enter &lt;code&gt;?&lt;/code&gt; to find out details of an error before you have
submitted any commands at all, you get:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
?
I AM THE GENIE OF THE DISK--WHAT IS YOUR COMMAND?
&lt;/pre&gt;
&lt;p&gt;
If you halt/load the system while still connected to the terminal you
will see the following when the system comes back up:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
P 
 L 
  o 
   P 
RESTARTING . . PLEASE WAIT
&lt;/pre&gt;
&lt;p&gt;
In the next post I will go into more details on some advanced CANDE commands.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
More information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
On bitsavers, the &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1038205_B5500_TS_TerminalUG_196906.pdf&#34;&gt;Time-sharing System User&amp;#39;s Guide&lt;/a&gt; is the best first
reference; note this is from a different version of MCP so some of the
commands may vary. The Georgia Tech &lt;a href=&#34;https://bitsavers.org/pdf/georgiaTech/Georgia_Tech_B5700_Time_Sharing_System_Manual_Jul72.pdf&#34;&gt;B5700 Time-sharing System Manual&lt;/a&gt;
is a more complete reference, giving examples of each command, but
note this also contains extensions added by Georgia Tech not available
on the base Burroughs system.&lt;/p&gt;
&lt;p&gt;
Also of interest is &lt;a href=&#34;https://umedia.lib.umn.edu/item/p16022coll90:1033&#34;&gt;The Complete CANDE Primer&lt;/a&gt; in the Charles Babbage
Institute Burroughs collection. However this is from 1980 so for a
much enhanced version of CANDE compared to what we have today.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-11&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-11&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-11&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP Architecture</title>
      <link>https://timereshared.com/mcp-architecture/</link>
      <pubDate>Sat, 27 Sep 2025 08:41:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-architecture/</guid>
      <description>
&lt;p&gt;
The Burroughs B5500 machine, along with the Master Control Program
(MCP) operating system, had some novel ideas for a system from the
early 1960s. One of these was that the hardware was developed
side-by-side with the software - compare this to the IBM 709x where
the manufacturer did not provide software until well after the
hardware was released. But at Burroughs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hardware engineers were educated in the intricacies of software
architecture and software designers learned the subtleties of hardware
design. These people were then merged into a single design team.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Source: &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1038205_B5500_TS_TerminalUG_196906.pdf&#34;&gt;Time-sharing System User&amp;#39;s Guide&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
In this article I&amp;#39;ll take a brief look at how the system works,
focusing on some of its innovative features.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Hardware
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The B5500 was a 48 bit machines with 6 bit characters and could have
up to 32 kwords of core memory. It could contain one or two CPUs, with
the second CPU only doing compute rather than I/O. The B5000 only
supported drum storage but the B5500 brought a fast head-per-track
disk. Each stored 48 or 96 Mbytes and in theory up to 20 could be
attached.&lt;/p&gt;
&lt;p&gt;
A dedicated teletype console, called the SPO (supervisory
printer/keyboard), allowed an operator to interact with the system.&lt;/p&gt;
&lt;p&gt;
A data controller allowed up to 15 terminals - initially teletypes -
to be attached for use by time-sharing or other programs.&lt;/p&gt;
&lt;p&gt;
There was also the usual peripherals - magnetic tape drives. card
punch, card reader and line printer.&lt;/p&gt;
&lt;p width=&#34;50%&#34; height=&#34;50%&#34; title=&#34;Burroughs B5500 System Diagram&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/b5500-system-diagram.png&#34; alt=&#34;/images/mcp/b5500-system-diagram.png&#34; title=&#34;/images/mcp/b5500-system-diagram.png&#34;/&gt;
&lt;em&gt;B5000 System Diagram. Note this is for the B5000 so shows a drum
instead of the disk used on the B5500. Source: &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/5000-20002-P_The_Descriptor_-_A_Definition_of_the_B_5000_Information_Processing_System_196102.pdf&#34;&gt;The Descriptor&lt;/a&gt; at bitsavers.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
MCP versions
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
As noted in the &lt;a href=&#34;https://timereshared.com/mcp/&#34;&gt;introductory&lt;/a&gt;, the original drum-based version of MCP
was modified to use disks and called the Disk File MCP (DFMCP);
another version used the data concentrator for terminal access and was
called the DCMCP; finally there was the time-sharing variant of MCP
was called the TSMCP.&lt;/p&gt;
&lt;p&gt;
The TSMCP allowed both batch and time-sharing jobs to be run
simultaneously. The main way that time-sharing users communicate with
the system is a job called CANDE, standing for Command and Edit. This
managed communication with each data line, allowing users to log in,
edit programs and run jobs.&lt;/p&gt;
&lt;p&gt;
Memory was divided into two sections (&amp;#39;the fence&amp;#39;); the MCP and CANDE
run on one side, user programs run on the other. The TSMCP would
schedule time-sharing jobs so they would receive regular short
time-slices, while batch jobs would queue up until they had enough
memory to run for longer time-slices.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Compiler Oriented Hardware
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The system had no assembler - it was programmed entirely in high level
languages. Initially Algol and COBOL was supported, with BASIC and
Fortran being added later. Compilers would generate machine code
directly.&lt;/p&gt;
&lt;p&gt;
This lack of an assembler even extended to system software, with the
entire operating system being written in an extended form or Algol
called ESPOL that could do low level operations not defined in pure
Algol. For example, you could access any position in memory via an
array.&lt;/p&gt;
&lt;p&gt;
This also meant that the machine was never used &amp;#39;bare&amp;#39; - programs
would not run directly on the hardware, they would always be run under
the MCP.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Stack and segmentation
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Machine operations were done with a push down stack, so to add two
numbers you would push the numbers onto the stack and then execute an
add, leaving the result on the top of the stack. This made writing a
compiler much easier as expressions could be translated into stack
operations without having to deal with temporary memory locations.
This also enabled easy relocation of programs and support for
recursion.&lt;/p&gt;
&lt;p&gt;
Larger areas of memory, such as programs or arrays, were arranged into
segments that could be swapped in and out of memory, allowing programs
or data sets larger than core to be handled. Each compiler organised
how it broke down programs into segments, which did mean there was no
facility to link together code from multiple languages.&lt;/p&gt;
&lt;p&gt;
Segments were tagged as either data or code, so it was impossible for
user programs to modify its own code.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Dynamic hardware recognition
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
You may have noticed while installing the system there was no need for
a system generation phase where you tell the OS what hardware it can
access. Instead, the MCP senses what hardware is connected, and can
cope with peripherals, memory and even the second CPU being
temporarily offline without restarting. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
File system
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Files had a two part name separated by a /, such as &lt;code&gt;HELLO/GUEST&lt;/code&gt;. The
second part indicated the grouping of a set of files, in this case the
time-sharing user &lt;code&gt;GUEST&lt;/code&gt;. This is not a directory, however: you could
call a file &lt;code&gt;HELLO/XYZ&lt;/code&gt; without having to create &lt;code&gt;XYZ&lt;/code&gt; first.&lt;/p&gt;
&lt;p&gt;
Magnetic tape files are device independent: if a job wants to read
from a certain tape file, it just needs to call for the tape file
name. MCP senses what tapes are mounted where and will direct the read
to the correct device.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the documents on &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/&#34;&gt;bitsavers&lt;/a&gt;, especially the &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/1038205_B5500_TS_TerminalUG_196906.pdf&#34;&gt;Time-sharing System
User&amp;#39;s Guide&lt;/a&gt; and &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/5000-20002-P_The_Descriptor_-_A_Definition_of_the_B_5000_Information_Processing_System_196102.pdf&#34;&gt;The Descriptor&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>A quick tour of Burroughs MCP using simh</title>
      <link>https://timereshared.com/mcp-simh-quick-tour/</link>
      <pubDate>Sun, 21 Sep 2025 08:20:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-simh-quick-tour/</guid>
      <description>
&lt;p&gt;
In this post we will turn our attention to Richard Cornwell&amp;#39;s B5500
emulator running on &lt;a href=&#34;https://sky-visions.com/burroughs/index.shtml&#34;&gt;simh&lt;/a&gt;. Along with the emulator, Richard has created
a package of tapes, cards and config files to run MCP on it, and even
rebuild the OS from source. Unlike &lt;a href=&#34;https://timereshared.com/mcp-retro-b5500-quick-tour/&#34;&gt;retro-b5500&lt;/a&gt; this is a command line
program; by using the simh core it brings in its flexibility and
automation capabilities. It also supports more than one time-sharing
terminal via telnet.&lt;/p&gt;
&lt;p&gt;
You can follow the instructions on Richard&amp;#39;s site to set this up -
start on &lt;a href=&#34;https://sky-visions.com/burroughs/index.shtml&#34;&gt;this page&lt;/a&gt; and note the PDF link which gives a great summary.&lt;/p&gt;
&lt;p&gt;
I have also created a &lt;a href=&#34;https://github.com/timereshared/burroughs-mcp-simh-quickstart&#34;&gt;quick start&lt;/a&gt; that allows you to build and run the
time-sharing system with two commands.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Before you start
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-2&#34;&gt;
Install required software
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
You will need a Unix-like environment capable of running a shell, git,
make, a C compiler, wget and unzip. You will also need the &lt;code&gt;telnet&lt;/code&gt;
command line program or a GUI telnet client.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-3&#34;&gt;
Clone the quick start repo
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-4&#34;&gt;
&lt;pre class=&#34;example&#34;&gt;
git clone https://github.com/timereshared/burroughs-mcp-simh-quickstart
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-4&#34;&gt;
Get the operating system tape file
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
The MCP operating system is free for non-commercial use under a
license from Unisys, but cannot be redistributed here. You will need
to get it from Paul Kimpel&amp;#39;s site as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to &lt;a href=&#34;https://www.phkimpel.us/B5500/webSite/SoftwareRequest.html&#34;&gt;https://www.phkimpel.us/B5500/webSite/SoftwareRequest.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Select SYSTEM image&lt;/li&gt;
&lt;li&gt;Read and accept the license&lt;/li&gt;
&lt;li&gt;Download the zip file&lt;/li&gt;
&lt;li&gt;Unzip B5500-XIII-SYSTEM-adc00257.zip&lt;/li&gt;
&lt;li&gt;Store B5500-XIII-SYSTEM-adc00257.bcd in the &lt;code&gt;packages/&lt;/code&gt; directory
under this repo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you omit this step, the build command will refuse to continue.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-5&#34;&gt;
Define time-sharing users
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
Edit the file &lt;code&gt;tss-setup.card&lt;/code&gt;. Copy the 4 lines starting with &lt;code&gt;$USER
&amp;#34;GUEST&amp;#34;&lt;/code&gt; and ending with &lt;code&gt;NO CHARGE&lt;/code&gt; and insert just before &lt;code&gt;$END&lt;/code&gt;.
Edit these copied lines to define your own user account. For example,
I might do:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
$USER &amp;#34;RUPERT&amp;#34;
PASSWORD &amp;#34;SECRET&amp;#34;
NAME &amp;#34;RUPERT LANE&amp;#34;
NO CHARGE
&lt;/pre&gt;
&lt;p&gt;
You can add as many users as you want, and remove the &lt;code&gt;GUEST&lt;/code&gt; user if
you like.&lt;/p&gt;
&lt;p&gt;
If you omit this step, the build command will only create the &lt;code&gt;GUEST&lt;/code&gt;
user with password &lt;code&gt;GUEST&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Build the system
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Type &lt;code&gt;./build.sh&lt;/code&gt;. This will download simh and the mcp-kit under
&lt;code&gt;packages/&lt;/code&gt;, build the simh b5500 binary and copy files. The file
structure on your PC will now look like&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bin/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;simh binary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;disks/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;virtual disks for MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tapes/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tape files for MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;units/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;printer and card images&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
It will then proceed to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cold boot the B5500 from a punched card image&lt;/li&gt;
&lt;li&gt;set up the virtual disks and install MCP files&lt;/li&gt;
&lt;li&gt;add &lt;a href=&#34;https://github.com/retro-software/B5500-software&#34;&gt;extra software&lt;/a&gt; that has been collected.&lt;/li&gt;
&lt;li&gt;set up time-sharing and create users  &lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&#34;center&#34; width=&#34;600&#34; title=&#34;simh installing MCP&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/simh-mcp-cold-start.png&#34; alt=&#34;/images/mcp/simh-mcp-cold-start.png&#34; title=&#34;/images/mcp/simh-mcp-cold-start.png&#34;/&gt;
&lt;em&gt;Installing MCP on simh. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
This will take around 5 minutes and will only need to be done once. If
you ever need to rebuild the system, run &lt;code&gt;build.sh&lt;/code&gt; again; it will not
re-download the package files.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Start MCP
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Type &lt;code&gt;./run.sh&lt;/code&gt;. After a few seconds the system will say it is ready
for connection. Using a telnet client, connect to port 5500 (eg via
&lt;code&gt;telnet 0 5500&lt;/code&gt;.)&lt;/p&gt;
&lt;p&gt;
In the telnet session, type your username and password. Your screen
will look something like this, with the window on top being the
console and the one below the user session.&lt;/p&gt;
&lt;p align=&#34;center&#34; width=&#34;600&#34; title=&#34;simh login to CANDE&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/simh-mcp-cande-login.png&#34; alt=&#34;/images/mcp/simh-mcp-cande-login.png&#34; title=&#34;/images/mcp/simh-mcp-cande-login.png&#34;/&gt;
&lt;em&gt;Login to CANDE on MCP under simh. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Create and run a hello world program
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Here&amp;#39;s an example of a complete session.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
$ telnet 0 5500
Trying 0.0.0.0...
Connected to 0.
Escape character is &amp;#39;^]&amp;#39;.


Connected to the B5500 simulator DTC device, line 0


B5500 TIME SHARING - 01/00, STATION 02
ENTER USER CODE, PLEASE-GUEST
AND YOUR PASSWORD
GUEST@@@
09/02/25  6:04 PM.
GOOD EVENING, GUEST USER      YOU HAVE STATION 02

#
CREATE HELLO BASIC
FILE:HELLO - TYPE:BASIC  -- CREATED
100 FOR I = 1 TO 5
200 PRINT &amp;#34;HELLO, WORLD&amp;#34;
300 NEXT I
400 END
RUN
 WAIT.

 COMPILING.


 END COMPILE .0 SEC.

 RUNNING
        

HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD


 END HELLO .0 SEC.

LIST


FILE:HELLO - TYPE:BASIC  --09/02/25  6:08 PM.

100  FOR I = 1 TO 5
200  PRINT &amp;#34;HELLO, WORLD&amp;#34;
300  NEXT I
400  END


 END QUIKLST .0 SEC.

SAVE
FILE:HELLO - TYPE:BASIC  -- SAVED.

BYE
 ON FOR  4 MIN, 00.4 SEC.
 C&amp;amp;E USE .0 SEC.
 EXECUTE .0 SEC.
 IO TIME 2.9 SEC.
 OFF AT   6:08 PM.
 GOODBYE GUEST
09/02/25
&lt;/pre&gt;
&lt;p&gt;
After we login, we create a new BASIC file called HELLO, and type in
the program using line numbers. &lt;code&gt;RUN&lt;/code&gt; will compile and execute it,
&lt;code&gt;LIST&lt;/code&gt; will display a listing.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-9&#34;&gt;
Finishing your session
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Type &lt;code&gt;BYE&lt;/code&gt; to log out. If it complains about unsaved work, you can
either type &lt;code&gt;SAVE&lt;/code&gt; to keep it on disk or &lt;code&gt;DELETE&lt;/code&gt; to discard your work.&lt;/p&gt;
&lt;p&gt;
There is no shutdown process for the operating system itself. Go to
the emulator window and type Control-E to interrupt it, then &lt;code&gt;q&lt;/code&gt; to quit.&lt;/p&gt;
&lt;p&gt;
You can restart MCP with &lt;code&gt;./run.sh&lt;/code&gt; as needed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>A quick tour of Burroughs MCP using retro-b5500</title>
      <link>https://timereshared.com/mcp-retro-b5500-quick-tour/</link>
      <pubDate>Sun, 07 Sep 2025 08:42:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp-retro-b5500-quick-tour/</guid>
      <description>
&lt;p&gt;
The first Burroughs B5500 emulator we will look at is &lt;a href=&#34;https://www.phkimpel.us/B5500/&#34;&gt;retro-b5500&lt;/a&gt; by
Nigel Williams and Paul Kimpel. We&amp;#39;ll get the the system set up,
install the operating system, enable time-sharing and enter a simple
BASIC program interactively.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Using retro-b5500
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
As mentioned in the &lt;a href=&#34;https://timereshared.com/mcp/&#34;&gt;introduction&lt;/a&gt;, retro-b5500 runs in any modern
desktop web browser. It aims to emulate each component of the system
with a graphical user interface so you get a taste of what it would be
like to operate the machine.&lt;/p&gt;
&lt;p&gt;
The project includes some great information on its wiki, starting
&lt;a href=&#34;https://github.com/pkimpel/retro-b5500/wiki&#34;&gt;here&lt;/a&gt;, describing how the system works and what you need to do step by
step. Rather than repeat this here, I will give a summary of the steps
involved along with some screenshots. For a first install I recommend
you use the server code hosted on the web and the default
configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Getting the Burroughs software
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
You will need a copy of the virtual install tapes for MCP. Unisys, the
current owners of the OS, have provided a license to use these
non-commercially. Go to &lt;a href=&#34;https://www.phkimpel.us/B5500/webSite/SoftwareRequest.html&#34;&gt;Burroughs B5500 Mark XIII System Software&lt;/a&gt;,
read and accept the license, download the files, unzip and store them
somewhere.&lt;/p&gt;
&lt;p&gt;
You will also need to download the &lt;a href=&#34;http://www.phkimpel.us/B5500/tools/COLDSTART-XIII.card&#34;&gt;cold start card image&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Power on and set up media
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Go to the &lt;a href=&#34;https://www.phkimpel.us/B5500/webUI/B5500Console.html&#34;&gt;main page&lt;/a&gt; and click Start &amp;amp; Power On. Accept the default
configuration and the emulator front panel will pop up along with
windows for each peripheral. Note that you should keep the main page
visible at all times otherwise the browser may think it&amp;#39;s inactive and
starve resources from the emulator. I have found it OK to arrange
windows I don&amp;#39;t use often, such as the card punch, into tabs instead
of windows.&lt;/p&gt;
&lt;p&gt;
Find the tape drive window and load the uncompressed system tape you
downloaded earlier, then click the REMOTE button.&lt;/p&gt;
&lt;p&gt;
Find the card reader and load the cold start card you downloaded
earlier. Click the START button.&lt;/p&gt;
&lt;p&gt;
On the operator console, click CARD LOAD SELECT.&lt;/p&gt;
&lt;p&gt;
On the SPO (operator console), ensure REMOTE is selected.&lt;/p&gt;
&lt;p&gt;
Arrange the windows so you can see all the above. Your screen should
now look something like this:&lt;/p&gt;
&lt;p align=&#34;center&#34; width=&#34;600&#34; title=&#34;retro-b5500 ready for install&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/retro-b5500-ready-for-install.png&#34; alt=&#34;/images/mcp/retro-b5500-ready-for-install.png&#34; title=&#34;/images/mcp/retro-b5500-ready-for-install.png&#34;/&gt;
&lt;em&gt;retro-b5500 just before starting the install. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Install the operating system
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Follow the wiki instructions on &lt;a href=&#34;https://github.com/pkimpel/retro-b5500/wiki/WebUIGettingStarted#cold-starting-the-system&#34;&gt;cold starting the system&lt;/a&gt;. This will
involve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Booting the system from the card deck.&lt;/li&gt;
&lt;li&gt;The system will start and read from the tape drive, and then
initialise the disk. This is all automatic and you should see console
messages, ending with MCP FILE LOADED.&lt;/li&gt;
&lt;li&gt;It will then reboot and load from disk from the first time.&lt;/li&gt;
&lt;li&gt;You will be prompted to enter the date and time on the SPO.&lt;/li&gt;
&lt;li&gt;More software will be automatically installed to the disk.&lt;/li&gt;
&lt;li&gt;You will then set the intrinsics (system library).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This should all take less than ten minutes. After this is done, you
can shut the system down by pressing the HALT button - there&amp;#39;s no
special shutdown procedure.&lt;/p&gt;
&lt;p&gt;
You can restart by pressing LOAD. The system will ask for the date and
time again and look something like this:&lt;/p&gt;
&lt;p align=&#34;center&#34; width=&#34;600&#34; title=&#34;retro-b5500 first full boot&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/retro-b5500-first-boot.png&#34; alt=&#34;/images/mcp/retro-b5500-first-boot.png&#34; title=&#34;/images/mcp/retro-b5500-first-boot.png&#34;/&gt;
&lt;em&gt;retro-b5500 on first boot. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
The guide has one more section on &lt;a href=&#34;https://github.com/pkimpel/retro-b5500/wiki/WebUIGettingStarted#loading-additional-system-files&#34;&gt;Loading Additional System Files&lt;/a&gt;
which you can follow if you want, but we will basically load the
entire tape as part of the next section so this is not necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Install time-sharing
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
At this point the system can accept and run batch jobs. To add
time-sharing (CANDE) we need to install more components. Switch over
to &lt;a href=&#34;https://github.com/pkimpel/retro-b5500/wiki/WebUIHowToSetUpCANDE&#34;&gt;WebUI Setting Up TSMCP and CANDE&lt;/a&gt; for this.&lt;/p&gt;
&lt;p&gt;
You will need to create two new card files to control terminal line
set up and specify user accounts as part of this. Load each of these
into the card reader and press START, and the system will read and
create these files on disk.&lt;/p&gt;
&lt;p&gt;
You then tell the system to load all files from tape with the &lt;code&gt;CC&lt;/code&gt;
command specified in the above wiki. While this is happening, the
screen will look like this:&lt;/p&gt;
&lt;p align=&#34;center&#34; width=&#34;600&#34; title=&#34;retro-b5500 installing CANDE&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/retro-b5500-installing-cande.png&#34; alt=&#34;/images/mcp/retro-b5500-installing-cande.png&#34; title=&#34;/images/mcp/retro-b5500-installing-cande.png&#34;/&gt;
&lt;em&gt;Installing CANDE on retro-b5500. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
Finally, tell the system about the new install with the &lt;code&gt;CM&lt;/code&gt; and &lt;code&gt;CI&lt;/code&gt;
commands, and halt-load.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Using time-sharing
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
When you next start up, enter date and time as before, and enter one
more operator command &lt;code&gt;CE&lt;/code&gt; to begin time-sharing. (This will need to
be done each time you start the system.)&lt;/p&gt;
&lt;p&gt;
Now find the Datacom window and press CONNECT. You may need to hit
enter to get a login prompt. Type the user name and password you
specified earlier - when the screen prompts for the password it will
type some characters that on a real typewriter would overwrite the
password, but on a screen this will not, and you do need to wait for
the overprint to stop before entering the password.&lt;/p&gt;
&lt;p&gt;
Once you are logged in, try creating a simple program and running it:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
CREATE HELLO BASIC
10 FOR I = 1 TO 5
20 PRINT &amp;#34;HELLO, WORLD&amp;#34;
30 NEXT I
40 END
RUN
&lt;/pre&gt;
&lt;p&gt;
When you type &lt;code&gt;RUN&lt;/code&gt; it will compile and execute the program. The
screen will look like this:&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/mcp/retro-b5500-using-timesharing.png&#34; alt=&#34;/images/mcp/retro-b5500-using-timesharing.png&#34; title=&#34;retro-b5500 using time-sharing&#34; align=&#34;center&#34; width=&#34;600&#34;/&gt;
&lt;p&gt;
Note the tasks you are doing also show up in the SPO.&lt;/p&gt;
&lt;p&gt;
To finish, type &lt;code&gt;SAVE&lt;/code&gt; to store the working copy of the program to
disk, and type &lt;code&gt;BYE&lt;/code&gt; to log out. You can then click HALT on the main
console.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Burroughs MCP</title>
      <link>https://timereshared.com/mcp/</link>
      <pubDate>Sun, 31 Aug 2025 08:51:00 +0900</pubDate>
      <guid>https://timereshared.com/mcp/</guid>
      <description>
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;Burroughs 16mm films collage&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/mcp/mcp-collage-1.png&#34; alt=&#34;/images/mcp/mcp-collage-1.png&#34; title=&#34;/images/mcp/mcp-collage-1.png&#34;/&gt;
&lt;em&gt;Collage of stills from Burroughs 16mm films, 1962-4. Source: &lt;a href=&#34;https://www.youtube.com/@slurn45&#34;&gt;Youtube @slurn45&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
Like IBM, Burroughs was a company originally formed in the 19th
century to produce mechanical calculators and accounting machines. By
the late 1950s it had built several small computers such as the
B220 and also worked on the system for controlling the Atlas ICBM. But
it had no large civilian system such as IBM&amp;#39;s 7090 on offer.&lt;/p&gt;
&lt;p&gt;
This did give one advantage: a blank sheet of paper to design a new
system. This yielded several innovations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The ability to design the hardware and operating system in parallel,
rather than add software after the computer had been designed.&lt;/li&gt;
&lt;li&gt;It was programmed in high level languages only - the system language
was an extension of Algol - and had no assembler.&lt;/li&gt;
&lt;li&gt;It had A stack driven architecture and virtual memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The system the came up with was the B5000 which ran an batch operating
system called the MCP, or Master Control Program. Introduced in 1963,
its first customers included NASA, Dow Chemicals, Stanford University
and Georgia Tech. However, it only sold 33 systems by the end of 1964,
with concerns over performance and the lack of a Fortran compiler; it
was also overshadowed by the launch of IBM&amp;#39;s System/360 in 1964.&lt;/p&gt;
&lt;p&gt;
Later that year Burroughs announced the B5500. Using integrated
circuits instead of transistors, and a disk drive instead of a drum,
it was almost 3 times faster. A Fortran compiler was added, along with
data communication equipment. These supported remote entry of batch
jobs and interaction with programs. However, MCP was tuned for fast
throughput of long running jobs, keeping a few in memory and queuing
the rest, so latency for interactive use was not great.&lt;/p&gt;
&lt;p&gt;
The solution was to add full time-sharing, which it did with the
TSSMCP in 1968. This ran a shell called CANDE (Command &amp;amp; Edit) on up
to 24 terminals, providing an interactive environment reminiscent of
&lt;a href=&#34;https://timereshared.com/dtss/&#34;&gt;DTSS&lt;/a&gt; where users could develop and run programs in Algol, BASIC,
Fortran and COBOL. An early customer for time-sharing was the UK&amp;#39;s
GPO, which used it for telephone network analysis.&lt;/p&gt;
&lt;p&gt;
Its ease of programming and flexibility helped in the market, with 220
B5500s sold by 1970. Burroughs would continue to develop the system
and the MCP, but was always overshadowed by IBM. It merged with
another IBM rival, Sperry, in 1986 to form Unisys. MCP continues to be
supported by Unisys today, now via (paid) emulation on x86 hardware.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Preservation status
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
For software, there are some &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/listing/&#34;&gt;listings&lt;/a&gt; on bitsavers but the most
important artefact is a complete copy of the Mark XIII (1971) release
of MCP, found on a 7 track tape in the collection of Sid McHarg. This
was concerted by Paul Pierce to a tape file and Unisys has allowed
this to be distributed under a non-commercial use license. You can
find it on &lt;a href=&#34;https://www.phkimpel.us/B5500/webSite/SoftwareRequest.html&#34;&gt;Paul Kimpel&lt;/a&gt;&amp;#39;s site. There is also a collection of
miscellaneous &lt;a href=&#34;https://github.com/retro-software/B5500-software&#34;&gt;software&lt;/a&gt; including the CUBE tapes, which was a
user-contributed library of programs from Burroughs users.&lt;/p&gt;
&lt;p&gt;
For documentation, &lt;a href=&#34;https://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/&#34;&gt;bitsavers&lt;/a&gt; has a good collection of manuals for the
hardware, operating system and languages.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Emulation status
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There are two excellent Burroughs B5500 emulators that take quite
different approaches.&lt;/p&gt;
&lt;p&gt;
Paul Kimpel and Nigel Williams developed &lt;a href=&#34;https://www.phkimpel.us/B5500/&#34;&gt;retro-b5500&lt;/a&gt;. This is written
in Javascript and runs in the browser, storing virtual disk files in
the browser&amp;#39;s local files. It has a user interface that presents each
system component - console, printer, tape drive etc - in a form
similar to the original hardware, so you get a great idea of how the
machine was operated. It runs the batch and time-sharing MCP, though
the latter is limited to a single terminal. The &lt;a href=&#34;https://www.phkimpel.us/B5500/webSite/HelpMenu.html&#34;&gt;documentation&lt;/a&gt; is
complete and well written; the &lt;a href=&#34;https://retro-b5500.blogspot.com/2012/03/starting-project.html&#34;&gt;story&lt;/a&gt; of how the project was built is
also a fascinating read.&lt;/p&gt;
&lt;p&gt;
The prolific Richard Cornwell has developed a version of &lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt; for the
architecture. This uses the traditional command line interface,
supports multiple terminals and brings the automation features of simh
which can help with some tasks. Richard&amp;#39;s &lt;a href=&#34;https://sky-visions.com/burroughs/index.shtml&#34;&gt;project page&lt;/a&gt; contains full
information about setting up and using the system; the &lt;a href=&#34;https://sky-visions.com/burroughs/B5500_quick_start.pdf&#34;&gt;quick start&lt;/a&gt;
guide is a good place to start.&lt;/p&gt;
&lt;p&gt;
I believe Unisys used to offer Windows emulators of its contemporary
MCP product under a hobbyist license, but the links I have no longer
work.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Further reading
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The Wikipedia articles on &lt;a href=&#34;https://en.wikipedia.org/wiki/Burroughs_Corporation&#34;&gt;Burroughs&lt;/a&gt; and its &lt;a href=&#34;https://en.wikipedia.org/wiki/Burroughs_Large_Systems&#34;&gt;large systems&lt;/a&gt; are good
places to start.&lt;/p&gt;
&lt;p&gt;
The &lt;em&gt;IEEE Annals of the History of Computers&lt;/em&gt; articles &amp;#34;Before the
B5000&amp;#34; and &amp;#34;After the B5000&amp;#34; give a detailed history of Burroughs
computers around this period.&lt;/p&gt;
&lt;p&gt;
There are several good oral histories about this period. Richard
Waychoff&amp;#39;s &lt;a href=&#34;https://web.archive.org/web/20160304050357/http://www.ianjoyner.name/Files/Waychoff.pdf&#34;&gt;Stories about the B5000&lt;/a&gt; (pdf; archive.org link) gives an
account of the development of the Algol compiler, with a cameo from a
young Donald Knith. The &lt;a href=&#34;https://conservancy.umn.edu/items/f941251f-9eb0-4553-b9a3-9c029c716b8e&#34;&gt;B5000 Conference&lt;/a&gt; brings together many of the
people involved in the system&amp;#39;s design to discuss its origins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Topics
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-5&#34;&gt;
Introduction
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-4&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-retro-b5500-quick-tour/&#34;&gt;A quickstart guide to running MCP on retro-b5500&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-simh-quick-tour/&#34;&gt;A quickstart guide to running MCP on simh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-architecture/&#34;&gt;MCP Architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-6&#34;&gt;
Using the system
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-4&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-using-cande/&#34;&gt;Using CANDE&lt;/a&gt;, the time-sharing &amp;#39;shell&amp;#39; for MCP.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-advanced-cande&#34;&gt;Advanced use of CANDE&lt;/a&gt; - security, scheduling, redirection and chat.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-batch-and-operator-console/&#34;&gt;Batch and the operator&amp;#39;s console&lt;/a&gt;..&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-getting-data-in-and-out/&#34;&gt;Getting data in and out&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-b5500-software-archive/&#34;&gt;The b5500-software archive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-7&#34;&gt;
Programming
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-4&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-algol/&#34;&gt;Extended Algol 60.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-fortran-basic/&#34;&gt;BASIC and Fortran 66.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-cobol/&#34;&gt;COBOL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/mcp-wipl&#34;&gt;WIPL&lt;/a&gt;, a JOSS clone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Which time-sharing operating systems can be run via emulation today?</title>
      <link>https://timereshared.com/os-list/</link>
      <pubDate>Sun, 24 Aug 2025 09:16:00 +0900</pubDate>
      <guid>https://timereshared.com/os-list/</guid>
      <description>
&lt;p&gt;
&lt;img src=&#34;https://timereshared.com/images/vax-sw.png&#34; alt=&#34;/images/vax-sw.png&#34; title=&#34;/images/vax-sw.png&#34; /&gt;
&lt;em&gt;Cover from DEC&amp;#39;s &amp;#34;VMS Language and Tools Handbook&amp;#34;. Source: &lt;a href=&#34;http://bitsavers.org/pdf/dec/vax/handbook/VMS_Language_and_Tools_Handbook_1985.pdf&#34;&gt;bitsavers&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
I reckon there are 39 &lt;em&gt;families&lt;/em&gt; of operating systems with
&lt;em&gt;time-sharing&lt;/em&gt; features first developed &lt;em&gt;before 1983&lt;/em&gt; that you can run
today via &lt;em&gt;freely available emulation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;
See the table below, with links to coverage on this blog on the left,
and links to the emulator, software kits and documentation on the
right. Each of the italic terms above needs qualification, which I
explain in detail after the table.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&#34;align-right&#34;&gt;Year&lt;/th&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Developer&lt;/th&gt;
&lt;th&gt;Emulator&lt;/th&gt;
&lt;th&gt;SW&lt;/th&gt;
&lt;th&gt;Doc&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1963&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://timereshared.com/ctss/&#34;&gt;CTSS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;IBM           709x&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://cozx.com/dpitts/ibm7090.html&#34;&gt;s709&lt;/a&gt;, &lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/rcornwell/ctss&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1964&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://timereshared.com/dartmouth/&#34;&gt;DTSS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;GE            2xx&lt;/td&gt;
&lt;td&gt;Dartmouth&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://dtss.dartmouth.edu/&#34;&gt;dtss&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://dtss.dartmouth.edu/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1964&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://timereshared.com/dec-tops-10/&#34;&gt;TOPS-10&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;DEC           PDP-6/10&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://pdp-10.trailing-edge.com/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS10/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1966&lt;/td&gt;
&lt;td&gt;WAITS&lt;/td&gt;
&lt;td&gt;DEC           PDP-6/10&lt;/td&gt;
&lt;td&gt;Stanford&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://sky-visions.com/dec/waits.shtml&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/PDP-10/waits/tree/master/doc&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1967&lt;/td&gt;
&lt;td&gt;ITS&lt;/td&gt;
&lt;td&gt;DEC           PDP-6/10&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/PDP-10/its&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/PDP-10/its/tree/master/doc&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1967&lt;/td&gt;
&lt;td&gt;TSS/360&lt;/td&gt;
&lt;td&gt;IBM           S/360&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://sdl-hercules-390.github.io/html/&#34;&gt;hercules&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.ibiblio.org/jmaynard/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/ibm/360/tss/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1967&lt;/td&gt;
&lt;td&gt;CP/CMS&lt;/td&gt;
&lt;td&gt;IBM           S/360&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://sdl-hercules-390.github.io/html/&#34;&gt;hercules&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.vm370.org/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/ibm/360/cp67/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1967&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://timereshared.com/mts/&#34;&gt;MTS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;IBM           S/360&lt;/td&gt;
&lt;td&gt;U Michigan&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://sdl-hercules-390.github.io/html/&#34;&gt;hercules&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://archive.org/details/michigan-terminal-system-distribution-documentation-and-files&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/univOfMichigan/mts/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1969&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://timereshared.com/mcp/&#34;&gt;MCP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Burroughs     5000&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;, &lt;a href=&#34;https://www.phkimpel.us/B5500/index.html&#34;&gt;b5500&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.phkimpel.us/B5500/webSite/SoftwareRequest.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://bitsavers.org/pdf/burroughs/LargeSystems/B5000_5500_5700/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1968&lt;/td&gt;
&lt;td&gt;George 3&lt;/td&gt;
&lt;td&gt;ICL           1900&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.icl1900.co.uk/preserve/g3ee.html&#34;&gt;g3ee&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.icl1900.co.uk/preserve/g3ee.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.icl1900.co.uk/preserve/techpub.html&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1968&lt;/td&gt;
&lt;td&gt;TSS/8&lt;/td&gt;
&lt;td&gt;DEC           PDP-8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://simh.trailing-edge.com/software.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp8/tss8/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1969&lt;/td&gt;
&lt;td&gt;Multics&lt;/td&gt;
&lt;td&gt;GE            645&lt;/td&gt;
&lt;td&gt;Multics&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://dps8m.gitlab.io/dps8m/&#34;&gt;dps8m&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://multics-wiki.swenson.org/index.php/Getting_Started&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://multics-wiki.swenson.org/index.php/Main_Page#Multics_Documentation&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1968&lt;/td&gt;
&lt;td&gt;SCOPE/HUSTLER&lt;/td&gt;
&lt;td&gt;CDC           6000&lt;/td&gt;
&lt;td&gt;Michigan St&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/kej715/DtCyber/tree/main/HUSTLER&#34;&gt;dtCyber&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/kej715/DtCyber/tree/main/HUSTLER&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://60bits.net/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1969&lt;/td&gt;
&lt;td&gt;HP TS BASIC&lt;/td&gt;
&lt;td&gt;HP            2100&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://simh.trailing-edge.com/&#34;&gt;simh 3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://simh.trailing-edge.com/hp/#Kits&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.bitsavers.org/pdf/hp/2000TSB&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1969&lt;/td&gt;
&lt;td&gt;BS 3&lt;/td&gt;
&lt;td&gt;Telefunken    TR 440&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://tr440.info/&#34;&gt;tr440&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://tr440.info/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://tr440.info/dokumentationen.html&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1970&lt;/td&gt;
&lt;td&gt;RSTS&lt;/td&gt;
&lt;td&gt;DEC           PDP-11&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://simh.trailing-edge.com/software.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp11/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1971&lt;/td&gt;
&lt;td&gt;Unix&lt;/td&gt;
&lt;td&gt;DEC           PDP-7/11&lt;/td&gt;
&lt;td&gt;Bell Labs&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://simh.trailing-edge.com/software.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.tuhs.org/Archive/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1971&lt;/td&gt;
&lt;td&gt;Kronos&lt;/td&gt;
&lt;td&gt;CDC           6000&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/kej715/DtCyber/tree/main/KRONOS2.1&#34;&gt;dtcyber&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/kej715/DtCyber/tree/main/KRONOS2.1&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/cdc/cyber/instant/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1971&lt;/td&gt;
&lt;td&gt;TSO for MVS&lt;/td&gt;
&lt;td&gt;IBM           S/360&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://sdl-hercules-390.github.io/html/&#34;&gt;hercules&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://wotho.pebble-beach.ch/tk4-/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.bitsavers.org/pdf/ibm/360/os/tso/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1971&lt;/td&gt;
&lt;td&gt;Wang 3300&lt;/td&gt;
&lt;td&gt;Wang          3300&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.wang3300.org/emu.html&#34;&gt;emu3300&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.wang3300.org/emu.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.wang3300.org/docs.html&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1972&lt;/td&gt;
&lt;td&gt;MUSIC/SP&lt;/td&gt;
&lt;td&gt;IBM           S/360&lt;/td&gt;
&lt;td&gt;McGill&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.canpub.com/teammpg/de/sim390/index.htm&#34;&gt;sim390&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.canpub.com/teammpg/de/mcgweb/downloads.htm&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.canpub.com/teammpg/de/mcgweb/downloads.htm&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1973&lt;/td&gt;
&lt;td&gt;RSX-11&lt;/td&gt;
&lt;td&gt;DEC           PDP-11&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.bitsavers.org/bits/DEC/pdp11/discimages/rl01/rsx11m_3.2/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp11/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1973&lt;/td&gt;
&lt;td&gt;Wang 2200&lt;/td&gt;
&lt;td&gt;Wang          2200MVP&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.wang2200.org/emu.html&#34;&gt;wangemu&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.wang2200.org/emu.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.wang2200.org/docs.html&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1973&lt;/td&gt;
&lt;td&gt;CP-V&lt;/td&gt;
&lt;td&gt;SDS           Sigma&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/kenrector/sigma-cpv-kit&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/sds/sigma/cp-v/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1974&lt;/td&gt;
&lt;td&gt;OS/32&lt;/td&gt;
&lt;td&gt;Interdata     32&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/davygoat/simh-os32&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.bitsavers.org/pdf/interdata/32bit/os32/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1974&lt;/td&gt;
&lt;td&gt;MPE&lt;/td&gt;
&lt;td&gt;HP            3000&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://simh.trailing-edge.com/&#34;&gt;simh 3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://simh.trailing-edge.com/hp/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://simh.trailing-edge.com/hp/#Documentation&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1974&lt;/td&gt;
&lt;td&gt;PRIMOS&lt;/td&gt;
&lt;td&gt;Prime         300&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/prirun/p50em&#34;&gt;p50em&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://sysovl.info/downloads_prime_primedist.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://bitsavers.trailing-edge.com/pdf/prime/doc/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1974&lt;/td&gt;
&lt;td&gt;AOS&lt;/td&gt;
&lt;td&gt;Data General  Eclipse&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.novasareforever.org/emulators/emulator-downloads&#34;&gt;simh WH&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.novasareforever.org/archives/software/dg.ne&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.novasareforever.org/archives/documentation/dg.sw/dg.sw.os&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1974&lt;/td&gt;
&lt;td&gt;SITS&lt;/td&gt;
&lt;td&gt;DEC           PDP-11&lt;/td&gt;
&lt;td&gt;NIT&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/pdp11/sits&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/pdp11/sits&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1975&lt;/td&gt;
&lt;td&gt;NOS (+ PLATO)&lt;/td&gt;
&lt;td&gt;CDC           6000&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/kej715/DtCyber/tree/main/NOS2.8.7&#34;&gt;dtcyber&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/kej715/DtCyber/tree/main/NOS2.8.7&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/cdc/cyber/nos/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1976&lt;/td&gt;
&lt;td&gt;XVM/RSX&lt;/td&gt;
&lt;td&gt;DEC           PDP-15&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://simh.trailing-edge.com/software.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp15/XVM/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1976&lt;/td&gt;
&lt;td&gt;TOPS-20&lt;/td&gt;
&lt;td&gt;DEC           PDP-10&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://pdp-10.trailing-edge.com/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/dec/pdp10/TOPS20/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1976&lt;/td&gt;
&lt;td&gt;ETOS&lt;/td&gt;
&lt;td&gt;DEC           PDP-8&lt;/td&gt;
&lt;td&gt;EDUCOMP&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://pop.aconit.org/Programs/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://pop.aconit.org/Programs/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1977&lt;/td&gt;
&lt;td&gt;DX10&lt;/td&gt;
&lt;td&gt;TI            990&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://cozx.com/dpitts/ti990.html&#34;&gt;sim990&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://cozx.com/dpitts/ti990.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.bitsavers.org/pdf/ti/990/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1977&lt;/td&gt;
&lt;td&gt;AMOS&lt;/td&gt;
&lt;td&gt;Alpha Micro   AM-100&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.kicksfortso.com/Am100/&#34;&gt;vam&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.kicksfortso.com/Am100/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.kicksfortso.com/Am100/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1977&lt;/td&gt;
&lt;td&gt;VS&lt;/td&gt;
&lt;td&gt;Wang          VS&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://web.archive.org/web/20221225013412/http://home.planet.nl/~ernest/vs.html&#34;&gt;vs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://web.archive.org/web/20221225013412/http://home.planet.nl/~ernest/vs.html&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/wang/vs/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1978&lt;/td&gt;
&lt;td&gt;VMS&lt;/td&gt;
&lt;td&gt;DEC           VAX&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/bits/DEC/vax/vms/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/dec/vax/vms/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1979&lt;/td&gt;
&lt;td&gt;MP/M&lt;/td&gt;
&lt;td&gt;DR            8080&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://opensimh.org/&#34;&gt;simh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.cpm.z80.de/&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;http://www.cpm.z80.de/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1981&lt;/td&gt;
&lt;td&gt;Domain/OS&lt;/td&gt;
&lt;td&gt;Apollo        Domain&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/mamedev/mame&#34;&gt;mame&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://web.archive.org/web/20250128112217/http://mess.redump.net/howto/apollo&#34;&gt;kit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://bitsavers.org/pdf/apollo/&#34;&gt;doc&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
What is a time-sharing operating system?
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
By  &amp;#34;time-sharing&amp;#34; I mean an operating system which is&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;multi-user&lt;/strong&gt; - more than one person can use the system at the same time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;multi-programming&lt;/strong&gt; - more than one job can appear to run on the
system at the same time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;interactive&lt;/strong&gt; - a user can interact with the system without having
to go through an intermediate step like submitting a batch job.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;general purpose&lt;/strong&gt; - the system can be used to develop and run
programs in more than one language.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I also include virtualised systems like CP/CMS in the list.  &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
A very brief history of time-sharing
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
We start with pioneers such as CTSS and Dartmouth DTSS in the early
1960s, but time-sharing really took off with mainframes in the late
1960s, with IBM&amp;#39;s System/360 and Digital Equipment Corporation&amp;#39;s
PDP-10 having several commercial and academic operating systems. Also
very influential was Multics, built by a consortium for a GE machine.
IBM had many other competitors at this time, and outside the US
several systems were developed. Minicomputers such as the PDP-8 and
-11 started to appear towards the end of the decade, along with the
birth of Unix on the latter machine. As the 70s continued, more
minicomputers arrived, along with later large scale systems like
PRIMOS and VAX VMS. Coming into the 1980s, focus shifted to
microcomputers for personal use, with some outliers like MP/M and the
workstation orientatted Domain/OS.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Families of operating systems
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I have grouped operating systems into families where there is a clear
line linking them together. This may span many years and different
computer hardware. Probably the biggest example is Unix which is
listed once in the table for the original implementation but went on
to appear in many different versions (BSD, commercial Unixes like
Solaris, Linux) across many different platforms.&lt;/p&gt;
&lt;p&gt;
As an operating system evolves, it can take on many names: for
example the OS listed as CP/CMS includes its derivatives VM/370,
VM/SE, VM/SP, VM/XA, VM/ESA, z/VM etc.&lt;/p&gt;
&lt;p&gt;
In some cases this is a judgement call - for example WAITS was
originally based on TOPS-10, but I have included it as it is evolved
to be a quite different system,&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Dates
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
In scope are operating systems first introduced before 1983 - this is
a fairly arbitrary cut off date chosen to focus on the period
time-sharing systems were dominant before the personal computer
started its ascent.&lt;/p&gt;
&lt;p&gt;
The date column indicates the first year an operating system was
introduced: for commercial systems, the year of its first release to
customers; for academic systems, the first year it ran production
workloads.&lt;/p&gt;
&lt;p&gt;
Some operating systems had a lifespan of many years, gaining features
and adding architectures. Some started as batch operating systems and
had time-sharing added later. I have used the year when time-sharing
features were added in that case. Some are still being maintained
today, albeit in quite different forms from the original version, such
as MVS, MCP and VMS.&lt;/p&gt;
&lt;p&gt;
This column was by far the hardest to verify and I would appreciate
any correctiobs.&lt;/p&gt;
&lt;p&gt;
One complication then is, when we look at an operating system which
version should we select? Often the choice is made for us, so for CTSS
we have a single source from around 1969; in other cases like TOPS-10
we have a choice of releases spanning 1972 to 1988.&lt;/p&gt;
&lt;p&gt;
I will generally choose to look at the most recent version of a
system, but this does make a chronological comparison of different
systems more difficult.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Emulators
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I concentrate on running operating systems under emulation here, which
anyone can do if they have a personal computer. The gold standard is
an open-source, cross platform emulator, but I do included single
platform ones (eg emulators running on Windows only) and closed-source
but freely available emulators where this is the only choice. I do not
include commercial, paid-for emulators as the focus for this site is
hobbyists and researchers.&lt;/p&gt;
&lt;p&gt;
Some systems have more than one emulator. I usually choose simh or
hercules if available, if not the most fully features single
architecture emulator. In some cases where there is sufficiently
different functionality or approach to emulation I list more than one.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://en.wikipedia.org/wiki/SIMH&#34;&gt;simh&lt;/a&gt; is the most frequently represented emulator on this list as it
emulates more than 30 different architectures. There are several
different forks, but in most cases a recent version of &lt;a href=&#34;https://github.com/open-simh/simh&#34;&gt;open-simh&lt;/a&gt; is a
good choice.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://en.wikipedia.org/wiki/Hercules_(emulator)&#34;&gt;hercules&lt;/a&gt; also appears several times due to the large number of IBM
System/360 operating systems. Again there are several forks, but SDL
&lt;a href=&#34;https://sdl-hercules-390.github.io/html/&#34;&gt;hercules hyperion&lt;/a&gt; is my current preference.&lt;/p&gt;
&lt;p&gt;
I have not (yet) run all the emulators listed in the table, so it&amp;#39;s
quite possible some do not work fully - please let me know if so.&lt;/p&gt;
&lt;p&gt;
Alternatives to emulation running on your own personal computer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hardware for more recent systems such as PDP-8s or VAXes is
available on sites like ebay, but is getting increasingly
expensive.&lt;/li&gt;
&lt;li&gt;replicas running emulators on hardware like Raspberry Pis, such as
the &lt;a href=&#34;https://obsolescence.wixsite.com/obsolescence/pidp-11&#34;&gt;PiDP-11&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;some museums has put original hardware online where you can get an
account, such as &lt;a href=&#34;https://icm.museum/?recollections&#34;&gt;The Interim Computer Museum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;there also collections of online-accessible emulators such as
&lt;a href=&#34;http://www.nostalgiccomputing.org/index.html&#34;&gt;nostalgiccomputing.org&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Software kits and documentation
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
In the &amp;#34;SW&amp;#34; column I link to the project page or archive site where
software kits can be obtained. Be aware that some kits have specific
licenses attached and others have no obvious current owner so their
licensing status is unknown.&lt;/p&gt;
&lt;p&gt;
The &amp;#34;Doc&amp;#34; column links to the main source of documentation for the
operating system in PDF format: this is usually &lt;a href=&#34;https://bitsavers.org/&#34;&gt;Bitsavers&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
What&amp;#39;s missing
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
This is not a comprehensive list of all time-sharing operating systems
ever produced - to my knowledge, no such list exists but I estimate it
would be at least double this size.&lt;/p&gt;
&lt;p&gt;
In order for a system to be available on emulation, several things
need to happen (or to have already happened)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the original software &lt;strong&gt;and documentation&lt;/strong&gt; needs to have been
preserved, ideally in digital form&lt;/li&gt;
&lt;li&gt;sufficient details of the hardware it ran on need to have been preserved&lt;/li&gt;
&lt;li&gt;someone has made the big effort to write an emulator for the system&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some examples of systems that are not available, at least today, via
emulation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;early systems like AN/FSQ-32, JOHNNIAC or the PDP-1 systems
developed by BBN and MIT, along with British systems like the Titan
Supervisor&lt;/li&gt;
&lt;li&gt;Mainframe operating systems like GE GCOS, RCA TSOS, Univac Exec 8
and ICL VME.&lt;/li&gt;
&lt;li&gt;Academic systems like CAL-TSS, OS-3, CAP or EMAS.&lt;/li&gt;
&lt;li&gt;Many minicomputer systems.&lt;/li&gt;
&lt;li&gt;More recent systems that are only available commercially, eg Tandem
or Stratus VOS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And in many cases, even for those available, not all versions of each
operating system has been preserved.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Please let me know if you think I am missing any systems, or if you
think my methodology is not right. You can email me at
rupert@timereshared.com and if it makes sense I will add it here and
update the main text.&lt;/p&gt;
&lt;p&gt;
&lt;span style=&#34;text-decoration: underline;&#34;&gt;August 2025&lt;/span&gt;: Lars Brinkhoff suggested adding SITS.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Site Update</title>
      <link>https://timereshared.com/site-update-20250720/</link>
      <pubDate>Sun, 20 Jul 2025 08:46:00 +0900</pubDate>
      <guid>https://timereshared.com/site-update-20250720/</guid>
      <description>&lt;p&gt;
That concludes the series of articles on Dartmouth DTSS. If you&amp;#39;d like
to learn more about how it evolved, &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/DTSS_Inc/The_Dartmouth_Time-Sharing_System_1980.pdf&#34;&gt;this book&lt;/a&gt; at bitsavers is a useful
guide. There&amp;#39;s also a &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/197210_A_Users-Guide_to_the_DTSS_Program_Library_197210.pdf&#34;&gt;list&lt;/a&gt; of what user programs were available on the
system in 1972.&lt;/p&gt;
&lt;p&gt;
A book by Joy Lisi Rankin, &lt;a href=&#34;https://www.hup.harvard.edu/books/9780674970977&#34;&gt;A People’s History of Computing in the
United States&lt;/a&gt;, explores at the development of DTSS and BASIC, and its
impact on non-specialist users.&lt;/p&gt;
&lt;p&gt;
Next update to this blog will be in August, where I want to quantify
exactly how many time-sharing systems are runnable via emulation
today, and after that look at the &lt;a href=&#34;https://en.wikipedia.org/wiki/Burroughs_MCP&#34;&gt;Master Control Program&lt;/a&gt; running on
the Burroughs B5500.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dartmouth Time-sharing System: Algol 60</title>
      <link>https://timereshared.com/dartmouth-dtss-algol/</link>
      <pubDate>Sun, 13 Jul 2025 09:32:00 +0900</pubDate>
      <guid>https://timereshared.com/dartmouth-dtss-algol/</guid>
      <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
The Algol family of languages and Algol 60
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Algol was originally designed by a committee of European and American
computer scientists in the 1950s-60s. The first version to be widely
implemented was Algol 60, which is what we will look at here.&lt;/p&gt;
&lt;p&gt;
Dartmouth had experience of implementing subsets of Algol on its
smaller computers before DTSS, and this was the second language to be
introduced on DTSS after BASIC in 1964.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/dtss/ge225-system.png&#34; alt=&#34;/images/dtss/ge225-system.png&#34; title=&#34;A GE-225 system&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;An illustration of a GE-225 system from &amp;#34;GE 200 Series Operation
Manual&amp;#34;, GE, 1966. Source: &lt;a href=&#34;https://bitsavers.org/pdf/ge/GE-2xx/CPB-247C_GE-200-SeriesOperationManual_Nov66.pdf&#34;&gt;bitsavers&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Algol 60 on Dartmouth DTSS
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
One important point when dealing with Algol is different levels or
representations of the language: there is one for the spec, one for
printed programs and one for the machine implementation. As an
example, to raise a to the power b:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spec: a ↑ b&lt;/li&gt;
&lt;li&gt;Printed: a&lt;sup&gt;b&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Machine - Dartmouth: &lt;code&gt;a ^ b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Machine - IBM: &lt;code&gt;a ** b&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#39;ll use the printed form in this article and the Dartmouth machine
form for code examples.&lt;/p&gt;
&lt;p&gt;
Keywords are in bold lower case in the printed form (eg &lt;strong&gt;integer&lt;/strong&gt;).
Dartmouth uses upper case (eg &lt;code&gt;INTEGER&lt;/code&gt;). (IBM used quotes, eg
&lt;code&gt;&amp;#39;INTEGER&amp;#39;&lt;/code&gt;, which must have been a pain to type).&lt;/p&gt;
&lt;p&gt;
Here&amp;#39;s an example program that will print Hello World 5 times&lt;/p&gt;
&lt;div class=&#34;src src-algol&#34;&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-algol&#34; data-lang=&#34;algol&#34;&gt;10 BEGIN
20 INTEGER I;
30 FOR I := 1 STEP 1 UNTIL 5 DO
40     PRINT(&amp;#34;HELLO, WORLD&amp;#34;)
50 END PROGRAM&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The line numbers are not part of Algol but are needed for the Dartmouth
program editor.&lt;/p&gt;
&lt;p&gt;
Statements are grouped into blocks, separated by semicolons; the last
statement in a block does not need a semicolon.&lt;/p&gt;
&lt;p&gt;
Variables are typed (&lt;strong&gt;real&lt;/strong&gt;, &lt;strong&gt;integer&lt;/strong&gt;, &lt;strong&gt;boolean&lt;/strong&gt;); strings are
allowed only as constants.&lt;/p&gt;
&lt;p&gt;
Algol has no standard I/O - reflecting how different each computer was
at that time, it was up to the implementation to add this. Dartmouth
Algol uses &lt;strong&gt;print&lt;/strong&gt; much like BASIC for output. &lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s exercise Algol further by implementing the &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;TPK algorithm&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
TPK in Algol 60
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div class=&#34;src src-algol&#34;&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-algol&#34; data-lang=&#34;algol&#34;&gt;100 BEGIN
110     COMMENT TPK ALGORITHM IN ALGOL 60;
120 
130     REAL PROCEDURE FN(X);
140     VALUE X;
150     REAL X;
160     BEGIN
170         FN := SQRT(ABS(X)) + 5*X^3
180     END PROCEDURE;
190 
200     COMMENT MAIN PROGRAM;
210     INTEGER N, J;
220     REAL ARRAY A[1:11];
230     N := 11;
240     COMMENT READ NUMBERS FROM DATA;
250     FOR J := 1 STEP 1 UNTIL N DO
260         READATA(SAMPLE, A[J]);
270     PRINT(&amp;#34;RESULTS ARE&amp;#34;);
280     FOR J := N STEP -1 UNTIL 1 DO
290     BEGIN
300         REAL RESULT;
310         RESULT := FN(A[J]);
320         IF RESULT &amp;gt; 400.0 THEN
330             PRINT(&amp;#34;TOO LARGE&amp;#34;)
340         ELSE
350             PRINT(RESULT);
360     END LOOP;
370     DATA SAMPLE := 10, -1, 1, 2, 3, 4, 4.3, 4.305, 4.303, 4.302, 4.301;
380 END PROGRAM&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The indentation is for readability only and is not required by the
language. Contemporary users would probably pack more statements per
line so as to use less vertical space on the typewriter output. It&amp;#39;s
not shown here, but you can also spread out statements over several
lines and even include spaces in variable names.&lt;/p&gt;
&lt;p&gt;
In the procedure definition, note that we declare the input parameter
&lt;code&gt;X&lt;/code&gt; as having &lt;strong&gt;real&lt;/strong&gt; type and also &lt;strong&gt;value&lt;/strong&gt; class, so it is passed by
value; the other option is &lt;strong&gt;name&lt;/strong&gt; which is similar to
pass-by-reference.&lt;/p&gt;
&lt;p&gt;
The main program starts on line 200. Note that variables need to be
declared before they are assigned to, and arrays can have arbitrary
indices.&lt;/p&gt;
&lt;p&gt;
The program uses the &lt;strong&gt;readata&lt;/strong&gt; procedure, which is a Dartmouth
extension to read items from the matching &lt;strong&gt;data&lt;/strong&gt; statement, similar to
BASIC &lt;code&gt;READ&lt;/code&gt; and &lt;code&gt;DATA&lt;/code&gt;. &lt;strong&gt;print&lt;/strong&gt; is also a Dartmouth extension.&lt;/p&gt;
&lt;p&gt;
At line 300, note that RESULT is declared in the &lt;strong&gt;for&lt;/strong&gt; block so its
scope lasts until the end of the block only; this was an innovation of
Algol. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Executing this on the emulator
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;See the &lt;a href=&#34;https://timereshared.com/dartmouth-dtss-exe-quick-tour/&#34;&gt;quick tour&lt;/a&gt; on how to get the emulator running.&lt;/li&gt;
&lt;li&gt;Download the source file from &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/programs/Algol 60/tpk_dartmouth_1964.a60&#34;&gt;Github&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you are not on Windows, ensure the file has CR/LF line endings. A
simple way to do this:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;src src-sh&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sub(&amp;#34;$&amp;#34;, &amp;#34;\r&amp;#34;)&amp;#39;&lt;/span&gt; &amp;lt; input_file &amp;gt; output_file&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Store the file as &lt;code&gt;TPKA&lt;/code&gt; (no extension) in the same directory as &lt;code&gt;DTSS.EXE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Start DTSS.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;SYSTEM ALGOL&lt;/code&gt; to switch from BASIC to Algol.  &lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;OLD TPKA&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;LIST&lt;/code&gt; to confirm the source has been loaded.  &lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;RUN&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The DTSS zip file contains &lt;em&gt;An Algol Outline.pdf&lt;/em&gt;.   &lt;/p&gt;
&lt;p&gt;
The &lt;em&gt;&lt;a href=&#34;https://www.masswerk.at/algol60/report.htm&#34;&gt;Revised Report on the Algorithmic Language Algol&lt;/a&gt;&lt;/em&gt; can be considered
as the standard definition of the language.&lt;/p&gt;
&lt;p&gt;
There are some contemporary books on the Internet Archive: Dijkstra&amp;#39;s
&lt;em&gt;&lt;a href=&#34;https://archive.org/details/a_primer_of_algol_60_programming&#34;&gt;A Primer of Algol 60 Programming&lt;/a&gt;&lt;/em&gt; is terse but readable; McCracken&amp;#39;s
&lt;em&gt;&lt;a href=&#34;https://archive.org/details/mccracken1962guide&#34;&gt;A Guide to ALGOL Programming&lt;/a&gt;&lt;/em&gt; is a more traditional text book.&lt;/p&gt;
&lt;p&gt;
I wrote an overview of Algol 60 on the IBM S/360 under MTS &lt;a href=&#34;https://try-mts.com/algol-60-language-features/&#34;&gt;here&lt;/a&gt;, which
goes into more detail on the language and how IBM implemented it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Dartmouth Time-sharing System: BASIC</title>
      <link>https://timereshared.com/dartmouth-dtss-basic/</link>
      <pubDate>Sun, 06 Jul 2025 09:10:00 +0900</pubDate>
      <guid>https://timereshared.com/dartmouth-dtss-basic/</guid>
      <description>
&lt;p&gt;
According to their 1985 book &lt;em&gt;Back to BASIC&lt;/em&gt;, Kemeny and Kurtz had
eight goals in mind when designing the language.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It should be easy to learn for the beginner.&lt;/li&gt;
&lt;li&gt;It should be a general-purpose language, allowing the writing of
any program.&lt;/li&gt;
&lt;li&gt;Advanced features had to be added so that, if there was a price, it
would be paid by the expert, not the novice.&lt;/li&gt;
&lt;li&gt;It should take full advantage of the fact that the user could
interact with the computer.&lt;/li&gt;
&lt;li&gt;It should give error messages that were clear and friendly to the user.&lt;/li&gt;
&lt;li&gt;It should give fast response for small programs.&lt;/li&gt;
&lt;li&gt;No understanding of the hardware should be necessary.&lt;/li&gt;
&lt;li&gt;It should shield the user from the operating system.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let&amp;#39;s take a look at the language in its first implementation on DTSS
in 1964.&lt;/p&gt;
&lt;p width=&#34;50%&#34; height=&#34;50%&#34; align=&#34;center&#34; title=&#34;Dartmouth BASIC manual&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/dtss/basic-manual.png&#34; alt=&#34;/images/dtss/basic-manual.png&#34; title=&#34;/images/dtss/basic-manual.png&#34;/&gt;
&lt;em&gt;Detail from the cover of the original BASIC manual. Source: &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/196410_BASIC.pdf&#34;&gt;Bitsavers&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Dartmouth BASIC
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There are only 15 keywords.&lt;/p&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LET       GOTO      RETURN 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    PRINT     IF        DEF    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    END       FOR       DIM    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    READ      NEXT      REM    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DATA      GOSUB     STOP&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
All variables are floating point numbers, and variables names must be
a single character or a single character followed by a single digit.
You have to use the &lt;code&gt;LET&lt;/code&gt; keyword to assign to variables.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;PRINT&lt;/code&gt; can print numbers or strings enclosed in double quotes.&lt;/p&gt;
&lt;p&gt;
This early version could only write data back to the user running the
program and was unable to take input from the the user. This was
implemented two years later by adding the &lt;code&gt;INPUT&lt;/code&gt; keyword and OS
support. The emulator does support &lt;code&gt;INPUT&lt;/code&gt;, but we&amp;#39;ll be historically
accurate by using the &lt;code&gt;READ&lt;/code&gt; statement to take data from a &lt;code&gt;DATA&lt;/code&gt;
statement in the program.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;GOTO&lt;/code&gt; allows jumps to any line number, &lt;code&gt;GOSUB&lt;/code&gt; also jumps to the
given line number, but when &lt;code&gt;RETURN&lt;/code&gt; is reached it will transfer
execution back to the line after the &lt;code&gt;GOSUB&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Up to 26 functions, containing a single expression only like Fortran,
can be defined with &lt;code&gt;DEF&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
The result of an &lt;code&gt;IF&lt;/code&gt; statement can only be a line number which is
jumped to if the expression is true.&lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s exercise BASIC by implementing the &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;TPK algorithm&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
TPK in BASIC
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div class=&#34;src src-basic&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-basic&#34; data-lang=&#34;basic&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;100 &lt;span style=&#34;color:#75715e&#34;&gt;REM TPK ALGORITHM IN BASIC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;110 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;120 &lt;span style=&#34;color:#66d9ef&#34;&gt;DEF&lt;/span&gt; FNT(X) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;SQR&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;ABS&lt;/span&gt;(X)) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;X&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;130 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;140 &lt;span style=&#34;color:#75715e&#34;&gt;REM MAIN PROGRAM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;150 &lt;span style=&#34;color:#66d9ef&#34;&gt;DIM&lt;/span&gt; A(&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;160 &lt;span style=&#34;color:#66d9ef&#34;&gt;LET&lt;/span&gt; N&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;170 &lt;span style=&#34;color:#75715e&#34;&gt;REM READ NUMBERS FROM DATA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;180 &lt;span style=&#34;color:#66d9ef&#34;&gt;FOR&lt;/span&gt; I &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; N
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;190 &lt;span style=&#34;color:#66d9ef&#34;&gt;READ&lt;/span&gt; A(I)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;200 &lt;span style=&#34;color:#66d9ef&#34;&gt;NEXT&lt;/span&gt; I
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;210 &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RESULTS ARE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;220 &lt;span style=&#34;color:#66d9ef&#34;&gt;FOR&lt;/span&gt; J &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; N
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;230 &lt;span style=&#34;color:#66d9ef&#34;&gt;LET&lt;/span&gt; K &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; N &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; J &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;240 &lt;span style=&#34;color:#66d9ef&#34;&gt;LET&lt;/span&gt; R &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; FNT(A(K))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;250 &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; R &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;THEN&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;280&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;260 &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; R
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;270 &lt;span style=&#34;color:#66d9ef&#34;&gt;GOTO&lt;/span&gt; 290
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;280 &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TOO LARGE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;290 &lt;span style=&#34;color:#66d9ef&#34;&gt;NEXT&lt;/span&gt; J
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;300 &lt;span style=&#34;color:#66d9ef&#34;&gt;DATA&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;-1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4.3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4.305&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4.303&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4.302&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4.301&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;310 &lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
In line 120, we use &lt;code&gt;^&lt;/code&gt; to raise &lt;code&gt;X&lt;/code&gt; to the power of 3.&lt;/p&gt;
&lt;p&gt;
Arrays are zero indexed, but we use 1-11 for the array defined on
line 150.&lt;/p&gt;
&lt;p&gt;
The &lt;code&gt;READ&lt;/code&gt; on line 190 takes values in order from the &lt;code&gt;DATA&lt;/code&gt; on
line 300. You could substitute &lt;code&gt;INPUT A(I)&lt;/code&gt; here to take input from
the user.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Executing this on the emulator
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;See the &lt;a href=&#34;https://timereshared.com/dartmouth-dtss-exe-quick-tour/&#34;&gt;quick tour&lt;/a&gt; on how to get the emulator running.&lt;/li&gt;
&lt;li&gt;Download the source file from &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/programs/BASIC/tpk_dartmouth_1964.bas&#34;&gt;Github&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you are not on Windows, ensure the file has CR/LF line endings. A
simple way to do this:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;src src-sh&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sub(&amp;#34;$&amp;#34;, &amp;#34;\r&amp;#34;)&amp;#39;&lt;/span&gt; &amp;lt; input_file &amp;gt; output_file&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Store the file as &lt;code&gt;TPK&lt;/code&gt; (no extension) in the same directory as &lt;code&gt;DTSS.EXE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Start DTSS.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;OLD TPK&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;LIST&lt;/code&gt; to confirm the source has been loaded.  &lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;RUN&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The results will look like this:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
OLD TPK
RUN

TPK     18:55      JUN 23, 2025

RESULTS ARE
 399.886
TOO LARGE
TOO LARGE
TOO LARGE
  399.609
  322
  136.732
  41.4142
  6
-4
TOO LARGE


TIME 0. SECS
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The DTSS emulator zip file contains &lt;em&gt;A BASIC Outline.pdf&lt;/em&gt;. A 1964
introduction to the system and BASIC can be found on &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/196410_BASIC.pdf&#34;&gt;bitsavers&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Dartmouth Time-sharing System: Architecture</title>
      <link>https://timereshared.com/dartmouth-dtss-architecture/</link>
      <pubDate>Sun, 29 Jun 2025 09:10:00 +0900</pubDate>
      <guid>https://timereshared.com/dartmouth-dtss-architecture/</guid>
      <description>
&lt;p&gt;
As mentioned in the &lt;a href=&#34;https://timereshared.com/dartmouth/&#34;&gt;introduction&lt;/a&gt;, DTSS comprised of two computers, a
GE-235 to run user programs and a DATANET-30 to talk to terminals and
schedule tasks, both sharing a disk drive. Let&amp;#39;s look at how this
worked in more detail. This describes the system at around its launch
in 1964; it was considerably expanded later.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/dtss/dtss-architecture-diagram.png&#34; alt=&#34;/images/dtss/dtss-architecture-diagram.png&#34; title=&#34;DTSS Architecture Diagram&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;Architecture diagram from &amp;#34;DTSS: A Brief Description&amp;#34;, Computation
Center, Dartmouth College, 1964. Source: &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/196410_DTSS_descr.pdf&#34;&gt;bitsavers&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
User interface
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The user interface was much like we saw in the emulator &lt;a href=&#34;https://timereshared.com/dartmouth-dtss-exe-quick-tour/&#34;&gt;quick tour&lt;/a&gt;m
with the addition of a &lt;code&gt;HELLO&lt;/code&gt; command for the user to identify
themselves via a numeric ID; there were no passwords.&lt;/p&gt;
&lt;p&gt;
The user can either be editing their program - indicated by a typing a
number at the start of a line - or submitting commands such as &lt;code&gt;LIST&lt;/code&gt;
or &lt;code&gt;RUN&lt;/code&gt;. The commands are not tied to BASIC, so you could use them if
programming in ALGOL, for example.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
The DATANET-30
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The DATANET-30 was intended by GE to be a smart communication
controller, capable of handling several terminal lines, buffering data
and sending messages. It had 18-bit words and was relatively fast. It
was interrupt driven and had a stored program facility which Dartmouth
used to create an operating system. This was divided into real-time
and spare-time tasks.&lt;/p&gt;
&lt;p&gt;
The real-time part was driven by an interrupt running 110 times per
second. It would scan the lines for activity and store them in
buffers. For commands, it would set up a job entry and store it in the
spare-time queue.&lt;/p&gt;
&lt;p&gt;
The spare-time part ran every second and would examine its queue.
Programs being developed would be sent to the disk. Command such as
&lt;code&gt;RUN&lt;/code&gt; would cause the DN-30 to send a message to the GE-235 to do the
actual work of compiling and running the program.&lt;/p&gt;
&lt;p&gt;
The disk drive stored up to 16 million words of data and was connected
to both the DN-30 and the GE-235.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
The GE-235
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The GE-235 was more powerful than the DN-30 for integer and floating
point arithmetic. It had up to 16,000 words of core memory, each word
having 20 data and 1 check bit.&lt;/p&gt;
&lt;p&gt;
During time-sharing, its operation was controlled by the DN-30. It
held the compilers and execution services in memory. When it receives
a message from the DN-30, it read the user program from the disk and
starts compiling and executing it - so user programs were compiled
every time they were run rather than saving object files. At run-time
user programs had access to 6,000 words of memory.&lt;/p&gt;
&lt;p&gt;
As far as I can tell from the documentation, only one user program
could be in memory at any time: the DN-30 could tell the GE-235 to
write the contents of memory to disk in order to process another user
program. The 1964 documentation states that the system was good at
running a number of short jobs this way, but there could be waits of
5-10s for jobs to be executed. However, longer running jobs were not
really suitable for this system.&lt;/p&gt;
&lt;p&gt;
Peripherals such as tapes and card readers were not used during
time-sharing, but were used for system development purposes,
presumably in a batch execution mode.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
From bitsavers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The 1964 &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/196410_DTSS_descr.pdf&#34;&gt;DTSS System Description&lt;/a&gt; from Dartmouth.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://bitsavers.org/pdf/ge/DATANET-30/CPB-1019_DATANET-30_Programming_Reference_Manual_196401.pdf&#34;&gt;DATANET-30&lt;/a&gt; and &lt;a href=&#34;https://bitsavers.org/pdf/ge/GE-2xx/CPB-252_GE-225_PgmrRef_Oct63.pdf&#34;&gt;GE-225&lt;/a&gt; programmer&amp;#39;s reference manuals from GE.&lt;/li&gt;
&lt;li&gt;A &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/DTSS_Inc/The_Dartmouth_Time-Sharing_System_1980.pdf&#34;&gt;book&lt;/a&gt; from 1980 covers later versions of the operating system.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Dartmouth Time-sharing System: A quick tour using DTSS.EXE</title>
      <link>https://timereshared.com/dartmouth-dtss-exe-quick-tour/</link>
      <pubDate>Sun, 22 Jun 2025 09:31:00 +0900</pubDate>
      <guid>https://timereshared.com/dartmouth-dtss-exe-quick-tour/</guid>
      <description>
&lt;p&gt;
In this post we&amp;#39;ll look at how to get the Dartmouth Time-sharing
System emulator DTSS up and running. As mentioned in the &lt;a href=&#34;https://timereshared.com/dartmouth/&#34;&gt;previous
post&lt;/a&gt;, this is fairly limited in what it can do, but gives a flavour of
what a user of the system in around 1964 would see.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/dtss/dtss-exe-simple-program.png&#34; alt=&#34;/images/dtss/dtss-exe-simple-program.png&#34; title=&#34;Running dtss.exe&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;Running DTSS.EXE. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Set up
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Download the Windows zip file from the &lt;a href=&#34;https://dtss.dartmouth.edu/#download&#34;&gt;dtss.dartmouth.edu&lt;/a&gt; site and
unpack it to a directory. Then just run the &lt;code&gt;DTSS.EXE&lt;/code&gt; program to
start; on non-Windows devices with &lt;a href=&#34;https://www.winehq.org/&#34;&gt;Wine&lt;/a&gt; installed, run &lt;code&gt;wine DTSS.EXE&lt;/code&gt;
instead.&lt;/p&gt;
&lt;p&gt;
There are no user configurable options to adjust the simulator or
interface.&lt;/p&gt;
&lt;p&gt;
Input should all be in upper case. Note that copy/paste does not work,
usually bringing up an error message that ends the emulator. But there
is a way to get programs in and out of the system - see below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Entering a simple BASIC program
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Type &lt;code&gt;NEW HELLO&lt;/code&gt; to start a new program called &lt;code&gt;HELLO&lt;/code&gt;. Then type the
program lines including the starting line number.&lt;/p&gt;
&lt;div class=&#34;src src-basic&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-basic&#34; data-lang=&#34;basic&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10 &lt;span style=&#34;color:#66d9ef&#34;&gt;FOR&lt;/span&gt; I &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20 &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HELLO, WORLD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;30 &lt;span style=&#34;color:#66d9ef&#34;&gt;NEXT&lt;/span&gt; I
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;40 &lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
You can edit the program by retyping any lines. To delete a line, just
type the line number and press Enter.&lt;/p&gt;
&lt;p&gt;
Type &lt;code&gt;RUN&lt;/code&gt; to start the program and &lt;code&gt;LIST&lt;/code&gt; to get a listing.&lt;/p&gt;
&lt;p&gt;
To save the program to disk, type &lt;code&gt;SAVE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
You can then exit the emulator by typing &lt;code&gt;BYE&lt;/code&gt; or just closing the
window. When you come back, load your old program by typing &lt;code&gt;OLD
HELLO&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Program libraries
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There are two libraries, a personal one and a system one. Type &lt;code&gt;CAT&lt;/code&gt; to
see your library: you will see your &lt;code&gt;HELLO&lt;/code&gt; program along with a
number of other demo programs.&lt;/p&gt;
&lt;p&gt;
To see what is in the system library, type &lt;code&gt;OLD LIBCAT***&lt;/code&gt; then
&lt;code&gt;LIST&lt;/code&gt;. To load one of these programs, for example &lt;code&gt;FTBALL&lt;/code&gt;, type
&lt;code&gt;OLD FTBALL***&lt;/code&gt; (note the &lt;code&gt;***&lt;/code&gt; at the end to denote a system
program.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
100 BASIC PROGRAMS
110 
120 AVELOG***   AVERAGE OF 100 LOGARITHMS
130 FTBALL***   DARTMOUTH FOOTBALL
140 GUESS***    GUESS A NUMBER FROM 1 TO 100
150 GCD***      GREATEST COMMON DIVISOR (GCD)
160 GCD3NO***   GCD OF THREE NUMBERS
170 MORT***     CALCULATES LIFE OF A MORTGAGE
180 NORMAL***   PLOT OF THE NORMAL CURVE
190 QUAD***     SOLVE A QUADRATIC EQUATION
200 PIE***      APPROXIMATE PIE
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Getting data in and out
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Programs are stored on the host file system as plain text files, with your
library in the same dierctory as the executable, and the system
library under &lt;code&gt;LIB/&lt;/code&gt;. So to see the text of your &lt;code&gt;HELLO&lt;/code&gt; program, look
for the file named &lt;code&gt;HELLO&lt;/code&gt; without an extension.&lt;/p&gt;
&lt;p&gt;
You can view, edit and create new files outside of the emulator using
this method. Remember to save files in DOS format, ie with CR/LF at
the end of each line.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Other features
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The &lt;code&gt;SPEED&lt;/code&gt; command will adjust the speed of the emulator: &lt;code&gt;SPEED 10&lt;/code&gt;
is approximately the speed of the original system.&lt;/p&gt;
&lt;p&gt;
You can switch from BASIC to ALGOL with &lt;code&gt;SYSTEM ALGOL&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
There is a computer aided learning system called &lt;code&gt;TEACH&lt;/code&gt; available
also.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The DTSS emulator zip file contains three useful documents.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commands.pdf&lt;/li&gt;
&lt;li&gt;A BASIC Outline.pdf&lt;/li&gt;
&lt;li&gt;An Algol Outline.pdf&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A 1964 introduction to the system and BASIC can be found on &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/196410_BASIC.pdf&#34;&gt;bitsavers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
We&amp;#39;ll look at BASIC and ALGOL in more detail in upcoming posts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Dartmouth Time-sharing System</title>
      <link>https://timereshared.com/dartmouth/</link>
      <pubDate>Sun, 15 Jun 2025 08:48:00 +0900</pubDate>
      <guid>https://timereshared.com/dartmouth/</guid>
      <description>
&lt;p&gt;
DTSS, the Dartmouth Time-sharing System, was developed at the
eponymous New England college in 1963/4. Running on a pair of GE
computers, it achieved campus-wide access to computing and was the
origin of the BASIC language.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/dtss/dtss.jpg&#34; alt=&#34;/images/dtss/dtss.jpg&#34; title=&#34;Educating the Computer montage&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;Captures from &amp;#34;Educating the Computer&amp;#34;, a 1969 video by GE. Source: &lt;a href=&#34;https://www.youtube.com/watch?v=wH9xWaNmY4A&#34;&gt;Youtube&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
Dartmouth had experimented with several smaller computers from the
late 1950s but wanted to extend this to all students and faculty. This
had two immediate issues - batch processing was not viable for a large
number of inexperienced users, and existing high level languages like
Fortran or Algol were too complex.&lt;/p&gt;
&lt;p&gt;
Professors John Kemeny and Thomas Kurtz decided to solve the first
problem by building a time-sharing system (famously after Kurtz had
talked to John McCarthy at MIT, who suggested &amp;#34;why don&amp;#39;t you guys do
time-sharing?&amp;#34;). They got funds from the NSF and evaluated several
computers, eventually settling on a large GE-225 computer together
with a GE DATANET-30 communication controller. Their plan was to build
a real time user facing operating system on the D-30 that would talk
to user teletype terminals, and would then send work to the GE-225 for
compilation and execution. Disks drives were shared between both
computers. This combination of systems looked to the end user like a
single time-sharing system.&lt;/p&gt;
&lt;p&gt;
To solve the language issue, they invented the BASIC programming
language specifically for people new to programming: with a small
number of keywords it was ideal for developing programs of 10-100
lines. Over time, the system would also run other languages but BASIC
was the most popular.&lt;/p&gt;
&lt;p&gt;
All the software for both computers had to be written in house - they
enlisted several undergraduates to help, writing code on paper before
the machine arrived. The system went into service for the fall term
of 1964. The GE-225 was soon replaced with a more powerful GE-235.&lt;/p&gt;
&lt;p&gt;
It met their goals, with the system being able to serve tens and later
hundreds of users at the same time. Terminals were installed
throughout the college and the surrounding area, including many
high schools. A library of programs developed by people in different
faculties was built up, including many games.&lt;/p&gt;
&lt;p&gt;
A second version of DTSS came along in 1969 that extended its capacity
and added more features; copies were was installed at at least 10
external sites, and became the basis of several commercial
time-sharing services. BASIC went on to be used on many mini- and
micro-computer systems, and still has users today in products like
Visual BASIC.&lt;/p&gt;
&lt;p&gt;
The &lt;a href=&#34;https://en.wikipedia.org/wiki/Dartmouth_Time-Sharing_System&#34;&gt;Wikipedia&lt;/a&gt; article and its references are a good way to find out
more on the history of DTSS.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Preservation status
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There are code listings for the GE-235 and D-30 executives along with
BASIC and ALGOL compilers from about 1965 available on
&lt;a href=&#34;https://dtss.dartmouth.edu/&#34;&gt;dtss.dartmouth.edu&lt;/a&gt;, but sadly later versions of DTSS or the libraries
of user code have not been found.&lt;/p&gt;
&lt;p&gt;
Bitsavers has manuals from &lt;a href=&#34;https://bitsavers.org/pdf/dartmouth/dtss/&#34;&gt;Dartmouth&lt;/a&gt; for DTSS/BASIC/ALGOL and from
&lt;a href=&#34;https://bitsavers.org/pdf/honeywell/large_systems/&#34;&gt;Honeywell&lt;/a&gt; for the hardware.&lt;/p&gt;
&lt;p&gt;
Lars Brinkhoff has collected known DTSS material, including all the
above, at &lt;a href=&#34;https://github.com/larsbrinkhoff/dtss-backup&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Emulation status
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
A group of people from Dartmouth, including Thomas Kurtz, &lt;a href=&#34;https://dtss.dartmouth.edu/news.php&#34;&gt;came
together&lt;/a&gt; in the early 2000s to scan the listings, create an assembler
and build a simulator (written in &lt;a href=&#34;https://en.wikipedia.org/wiki/True_BASIC&#34;&gt;True BASIC&lt;/a&gt;). This only simulates the
GE-235 part of the system, so is not multi-user, but can run BASIC and
ALGOL code. Only 32 bit Windows and classic Mac binaries are
available, however the former runs fine under Wine.&lt;/p&gt;
&lt;p&gt;
There was also a &lt;a href=&#34;http://www.dtss.org/dtss/&#34;&gt;web based&lt;/a&gt; emulator of the GE-235 and D-30 running
similar era code but including the multi-user executive. Although the
website is still online, as of 2025 logins no longer works and I have
not been able to find a contact address for the owners.&lt;/p&gt;
&lt;p&gt;
We will use the Windows emulator &lt;code&gt;dtss.exe&lt;/code&gt; to explore DTSS further.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Topics covered
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/dartmouth-dtss-exe-quick-tour/&#34;&gt;A quick tour using dtss.exe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/dartmouth-dtss-architecture/&#34;&gt;DTSS architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/dartmouth-dtss-basic/&#34;&gt;BASIC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/dartmouth-dtss-algol/&#34;&gt;Algol&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;span style=&#34;text-decoration: underline;&#34;&gt;June 2025&lt;/span&gt;: correct name for Dartmouth College, clarified use of
GE-225 vs 235.&lt;/p&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Site Update</title>
      <link>https://timereshared.com/site-update-20250601/</link>
      <pubDate>Sun, 01 Jun 2025 08:39:00 +0900</pubDate>
      <guid>https://timereshared.com/site-update-20250601/</guid>
      <description>&lt;p&gt;
That concludes the series of articles on CTSS, at least for now. I
will next be looking at the &lt;a href=&#34;https://en.wikipedia.org/wiki/Dartmouth_Time-Sharing_System&#34;&gt;Dartmouth Time-sharing System&lt;/a&gt; - expect
posts later in June.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: The QED editor</title>
      <link>https://timereshared.com/ctss-qed-editor/</link>
      <pubDate>Sun, 25 May 2025 08:20:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-qed-editor/</guid>
      <description>
&lt;p&gt;
The QED editor has a long &lt;a href=&#34;https://en.wikipedia.org/wiki/QED_(text_editor)&#34;&gt;history&lt;/a&gt;. It was originally created for the
Berkeley Timesharing System running on the SDD 930/940 machine in
1965-6. Ken Thompson, who was part of the Bell Labs contingent working
on Multics, re-implemented it for CTSS in around 3500 lines of FAP
assembly code some time in 1969; he also produced a version for
Multics using BCPL. While working on Unix, the ideas from QED inspired
tools such as ed and sed.&lt;/p&gt;
&lt;p&gt;
Other authors produced implementations of QED for other time-sharing
systems, and you can even find versions for Unix you can run on
current systems.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/qed-session.png&#34; alt=&#34;/images/ctss/qed-session.png&#34; title=&#34;A QED session&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;A session using QED to move text to a new file.. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Setup
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Note that QED only supports 6- and 12-bit line-marked files and ASCII
files, not card image files. If your file is in card image format,
convert it using &lt;code&gt;SQUASH&lt;/code&gt; first.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
An editing session
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
QED has the concept of multiple buffers rather than working on a
single file at a time. In the below I start QED and read in &lt;code&gt;TPK MAD&lt;/code&gt;
to the default buffer using the &lt;code&gt;r&lt;/code&gt; command with the &lt;code&gt;s&lt;/code&gt; option to
mean 6-bit line-marked.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
qed
W 1755.3
QED     
rs tpk mad
&lt;/pre&gt;
&lt;p&gt;
&lt;code&gt;x&lt;/code&gt; will list the buffers in use: here we have the default buffer &lt;code&gt;0&lt;/code&gt;
with 23 lines:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
x
&amp;#34;0&amp;#34; 0023
&lt;/pre&gt;
&lt;p&gt;
The &lt;code&gt;p&lt;/code&gt; command prints lines from the buffer. Like many commands, it
takes an optional range as its first argument. Without a range it
defaults to &lt;code&gt;.&lt;/code&gt; which is the current line, but I can specify line
numbers or ranges of lines:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
p                        
           END OF PROGRAM
10 p                     
           DIMENSION NUM(11)
3,5 p                       
           INTERNAL FUNCTION(X)
           ENTRY TO F.         
           FUNCTION RETURN SQRT.(.ABS.X) + 5 * X.P.3
&lt;/pre&gt;
&lt;p&gt;
&lt;code&gt;1,$ p&lt;/code&gt; would print all lines of the file.&lt;/p&gt;
&lt;p&gt;
Range arguments can also be regular expressions quoted by &lt;code&gt;/&lt;/code&gt; &lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
/th.* input/,/read/ p            
           THROUGH INPUT,FOR J=0,1,J.GE.N
INPUT      READ FORMAT FMT,NUM(J)
&lt;/pre&gt;
&lt;p&gt;
Had we used the &lt;code&gt;d&lt;/code&gt; command instead of &lt;code&gt;p&lt;/code&gt;, it would delete those
three lines.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-3&#34;&gt;
The global command
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
As well as using regular expressions in ranges, we can use them as an
argument to the global command &lt;code&gt;g&lt;/code&gt;. As an example, to find all lines
that match the string &lt;code&gt;11&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
gp/11/
           N = 11
           DIMENSION NUM(11)
           PRINT COMMENT $PLEASE ENTER 11 NUMBERS$
&lt;/pre&gt;
&lt;p&gt;
Here, the range is not specified before the command, so it is
implicitly the whole file. The &lt;code&gt;g&lt;/code&gt; command takes two parameters: the
command to execute (&lt;code&gt;p&lt;/code&gt;) and the regexp to max (&lt;code&gt;/11/&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-4&#34;&gt;
Search and replace
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
The &lt;code&gt;s&lt;/code&gt; command takes two regexps as parameters for the text to find
and the text to replace. So if I wanted to change all 11s to 15s I
could do:    &lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
1,$ s/11/15/
&lt;/pre&gt;
&lt;p&gt;
The range, &lt;code&gt;1,$&lt;/code&gt; needs to be supplied as otherwise this command will
only operate on the current line.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-5&#34;&gt;
Inserting text
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
Position yourself on the line after you want the new text to go and
then use the &lt;code&gt;i&lt;/code&gt; command. Terminate this with the escape character
followed by f, ie &lt;code&gt;\f&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
/other/                  
           OTHERWISE
i                   
           PRINT COMMENT $TRY AGAIN$
\f
&lt;/pre&gt;
&lt;p&gt;
&lt;code&gt;a&lt;/code&gt; will append text directly to the end of the buffer.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-6&#34;&gt;
Moving text
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
Let&amp;#39;s say we want to move the internal function to an separate file,
and make it an external function. We can use the &lt;code&gt;m&lt;/code&gt; command with a
range to determine what lines to move. Here this will move the text to
buffer 1:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
/internal func/,/end of func/ m1
&lt;/pre&gt;
&lt;p&gt;
We can use &lt;code&gt;b&lt;/code&gt; to switch to the other buffer and look at it. We also
change &lt;code&gt;INTERNAL&lt;/code&gt; to &lt;code&gt;EXTERNAL&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
b1                       
1,$p
           INTERNAL FUNCTION(X)
           ENTRY TO F.         
           FUNCTION RETURN SQRT.(.ABS.X) + 5 * X.P.3
           END OF FUNCTION                          
/internal/
           INTERNAL FUNCTION(X)
s/int/ext/                     
p
           EXTERNAL FUNCTION(X)
&lt;/pre&gt;
&lt;p&gt;
Let&amp;#39;s save it as &lt;code&gt;func mad&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
ws func mad
&lt;/pre&gt;
&lt;p&gt;
We then return to buffer 0 and confirm that it has gone by seeing the
&lt;code&gt;?1&lt;/code&gt; error message when searching for &lt;code&gt;sqrt&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
b0                        
/sqrt/
?1
&lt;/pre&gt;
&lt;p&gt;
Save the main file.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
ws tpk mad
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-7&#34;&gt;
Execute system commands
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
QED can execute commands stored in a buffer and then return to the
editor. Let&amp;#39;s set up some compile/load commands in buffer 2:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
b2                       
i
mad tpk
\f
&lt;/pre&gt;
&lt;p&gt;
Return to buffer 0 and execute it.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
b0
e2
LENGTH 00152.  TV SIZE 00006.  ENTRY 00040
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Other QED commands
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;f&lt;/code&gt; will &lt;span style=&#34;text-decoration: underline;&#34;&gt;replace&lt;/span&gt; the contents of the current buffer with
information such as date, time, login details etc.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;k&lt;/code&gt; will sort a range&lt;/li&gt;
&lt;li&gt;&lt;code&gt;l&lt;/code&gt; will list a file to the console&lt;/li&gt;
&lt;li&gt;&lt;code&gt;u&lt;/code&gt; - the audit command - will create a buffer showing the effect of
all edits done since the last read.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-9&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
QED is described more fully in the CTSS &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt; section
AH.3.09 p353.&lt;/p&gt;
&lt;p&gt;
Source code for QED on a number of different systems is collected on
Github at &lt;a href=&#34;https://github.com/arnoldrobbins/qed-archive?tab=readme-ov-file&#34;&gt;arnoldrobbins/qed-archive&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text if needed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: Document production with TYPSET and RUNOFF</title>
      <link>https://timereshared.com/ctss-document-production-with-typset-and-runoff/</link>
      <pubDate>Sun, 11 May 2025 09:24:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-document-production-with-typset-and-runoff/</guid>
      <description>
&lt;p&gt;
The concept of using computers to produce documents was first
demonstrated before CTSS in 1960 with the &lt;a href=&#34;https://en.wikipedia.org/wiki/Colossal_Typewriter&#34;&gt;Colossal Typewriter&lt;/a&gt; project
on the PDP-1. Rather than typing directly to paper, you could store
text and edit it in memory before printing to a typewriter or line
printer. However, in single user mode, it was not a cost-efficient use
of a computer, as alluded to by a similar PDP-1 project &lt;a href=&#34;https://en.wikipedia.org/wiki/Expensive_Typewriter&#34;&gt;Expensive
Typewriter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
On an interactive multi-user system it did make more sense, as the
processing requirements for this is quite small. CTSS had an early
system called DITTO/ROFF, and this was replaced by TYPSET/RUNOFF by
Jerry Saltzer in around November 1964, which we&amp;#39;ll look at today.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/typset-runoff-demo-lc.png&#34; alt=&#34;/images/ctss/typset-runoff-demo-lc.png&#34; title=&#34;Chat on CTSS&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;A version of the above produced with TYPSET/MEMO&amp;#34;. Source: Rupert
Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
TYPSET
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
 &lt;code&gt;TYPSET&lt;/code&gt; is an editor where you can add and change text, including
control codes to specify output formatting. This uses the same editor
commands as &lt;code&gt;EDC&lt;/code&gt; and &lt;code&gt;EDL&lt;/code&gt; (in fact, as described in an earlier
&lt;a href=&#34;https://timereshared.com/ctss-ed-and-friends/&#34;&gt;article&lt;/a&gt;, the design for these editors came from &lt;code&gt;TYPSET&lt;/code&gt;; see that
article for how to use the editor).&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;TYPSET&lt;/code&gt; expects the &lt;em&gt;name2&lt;/em&gt; of a file to be &lt;code&gt;(MEMO)&lt;/code&gt;, so the command
&lt;code&gt;TYPSET abc&lt;/code&gt; will create or edit a file &lt;code&gt;ABC (MEMO)&lt;/code&gt;. It uses 12-bit
line-marked files, so with a suitable typewriter you could enter lower
case and an extended range of symbols. If you are using a recent
version of s709/ctss-kit or my &lt;a href=&#34;https://github.com/timereshared/ctss-s709-quickstart&#34;&gt;quickstart&lt;/a&gt; or &lt;a href=&#34;https://github.com/rupertl/eliza-ctss&#34;&gt;eliza-ctss&lt;/a&gt; released after
22 May 2025 this will support it as well.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Control words
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Control words always start with a &lt;code&gt;.&lt;/code&gt; (dot) in column 1. There are
full and abbreviated forms, eg &lt;code&gt;.center&lt;/code&gt;, which will center the next
line, can be abbreviated as &lt;code&gt;.ce&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
A full list of control words:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abbr&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.ll&lt;/td&gt;
&lt;td&gt;.line length &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set line length to &lt;code&gt;n&lt;/code&gt; characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.in&lt;/td&gt;
&lt;td&gt;.indent &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set indent of each following line to be &lt;code&gt;n&lt;/code&gt; characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.un&lt;/td&gt;
&lt;td&gt;.undent &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reduce indentation by &lt;code&gt;n&lt;/code&gt; characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.pl&lt;/td&gt;
&lt;td&gt;.paper length &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set lines per page, default 66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.ss&lt;/td&gt;
&lt;td&gt;.single space&lt;/td&gt;
&lt;td&gt;This is the default line spacing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.ds&lt;/td&gt;
&lt;td&gt;.double space&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.bp&lt;/td&gt;
&lt;td&gt;.begin page&lt;/td&gt;
&lt;td&gt;Start a new page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.ad&lt;/td&gt;
&lt;td&gt;.adjust&lt;/td&gt;
&lt;td&gt;Justify text by adding spaces (the default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.nj&lt;/td&gt;
&lt;td&gt;.nojust&lt;/td&gt;
&lt;td&gt;Turns off the above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.fl&lt;/td&gt;
&lt;td&gt;.fill&lt;/td&gt;
&lt;td&gt;Justify JJ text by moving words to fill (the default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.nf&lt;/td&gt;
&lt;td&gt;.nofill&lt;/td&gt;
&lt;td&gt;Turns off the above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.pa&lt;/td&gt;
&lt;td&gt;.page (&lt;code&gt;n&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Turns on page number printing, optionally starting at &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.sp&lt;/td&gt;
&lt;td&gt;.space (&lt;code&gt;n&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Inserts &lt;code&gt;n&lt;/code&gt; blank lines. Default for &lt;code&gt;n&lt;/code&gt; is 1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.he&lt;/td&gt;
&lt;td&gt;.header &lt;code&gt;xxxx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sets page header to be &lt;code&gt;xxxx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.br&lt;/td&gt;
&lt;td&gt;.break&lt;/td&gt;
&lt;td&gt;Prevents filling of text before and after this word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.ce&lt;/td&gt;
&lt;td&gt;.center&lt;/td&gt;
&lt;td&gt;Centers the following line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.li&lt;/td&gt;
&lt;td&gt;.literal&lt;/td&gt;
&lt;td&gt;Indicates the following line is not a control word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.hm&lt;/td&gt;
&lt;td&gt;.heading mode &lt;code&gt;P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;P&lt;/code&gt; can be CENTER, MARGIN, FACING, OPPOSED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.op&lt;/td&gt;
&lt;td&gt;.odd page&lt;/td&gt;
&lt;td&gt;Next page number will skip ahead to next odd number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.pm&lt;/td&gt;
&lt;td&gt;.paging mode &lt;code&gt;P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page mumbler mode, eg MARGIN, CENTER&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.ap&lt;/td&gt;
&lt;td&gt;.append &lt;code&gt;A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Include text from file &lt;code&gt;A (MEMO)&lt;/code&gt; here&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Text styles
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
As the output for this system was a typewriter, there was obviously no
concept of bold, italics, different fonts, text size etc. One feature
the typewriter did have that we don&amp;#39;t have today was backspacing. For
example, to get something like &lt;code&gt;Ç&lt;/code&gt; you could enter &lt;code&gt;C&lt;/code&gt;, then
backspace, then &lt;code&gt;,&lt;/code&gt;. The system will move the head back one character
on backspace so the two symbols print in the same space.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
RUNOFF
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The &lt;code&gt;RUNOFF&lt;/code&gt; command takes the input memo file, interprets the control
words and prints the formatted output to the typewriter console. It
prompts the user &lt;code&gt;LOAD PAPER, HIT RETURN&lt;/code&gt; so the paper can be changed
if needed.&lt;/p&gt;
&lt;p&gt;
As an example, the screenshot above was produced by this file:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.ll 80
.ds
.header TIMERESHARED.COM
.hm center
.bp
.center
CTSS: Document production with TYPSET and RUNOFF

The concept of using computers to produce documents was first
demonstrated before CTSS in 1960 with the Colossal Typewriter project
on the PDP-1. Rather than typing directly to paper, you could store
text and edit it in memory before printing to a typewriter or line
printer. However, in single user mode, it was not a cost-efficient use
of a computer, as alluded to by a similar PDP-1 project Expensive
Typewriter.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
TYPSET/RUNOFF are described more fully in the CTSS &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt;
section AH.9.01 p504; there&amp;#39;s an OCR&amp;#39;d &lt;a href=&#34;https://web.mit.edu/saltzer/www/publications/ctss/AH.9.01.html&#34;&gt;version&lt;/a&gt; at multicians.org.&lt;/p&gt;
&lt;p&gt;
These commands was the inspiration for similar text production systems
on Multics and Unix. On a Unix system today you are likely to find
&lt;a href=&#34;https://en.wikipedia.org/wiki/Troff&#34;&gt;troff&lt;/a&gt; which uses very similar control words.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;span style=&#34;text-decoration: underline;&#34;&gt;May 2025&lt;/span&gt;: Updated to point to the newer versions of the s709
emulator/ctss-kit for full support of lower case letters. Thanks to
Dave Pitts for his continued work on this system.&lt;/p&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: The &#34;.&#34; shell, chat and email</title>
      <link>https://timereshared.com/ctss-dot-shell-email-chat/</link>
      <pubDate>Sun, 04 May 2025 09:36:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-dot-shell-email-chat/</guid>
      <description>
&lt;p&gt;
Many people think that command line shells, electronic mail and chat
as something fairly modern. But CTSS had them all 60 years ago. In
this post we&amp;#39;ll look at &amp;#34;&lt;code&gt;.&lt;/code&gt;&amp;#34; (or &amp;#34;dot&amp;#34;), the interactive shell
including a chat facility, along with the &lt;code&gt;MAIL&lt;/code&gt; command.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/ctss-chat.png&#34; alt=&#34;/images/ctss/ctss-chat.png&#34; title=&#34;Chat on CTSS&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;A chat session on CTSS using &amp;#34;dot&amp;#34;. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
&amp;#34;dot&amp;#34;
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The CTSS supervisor contains basic functionality for users to enter
commands. During the design of Multics, this concept was developed
further to create the idea of a shell, a program intended for humans
to enter commands and monitor what is going on. From the Multics
&lt;a href=&#34;https://people.csail.mit.edu/saltzer/Multics/Multics-Documents/MDN/MDN-4.pdf&#34;&gt;design memo&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] unlike a calling program, a user is not assigned once and for
all a predetermined set of instructions. One does not know what he
plans to do next, and he will eventually overlook some yet highly
recommendable checking, if the command does not warn him against any
possible misunderstanding as to what has been performed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
This idea was brought back to CTSS by Tom Van Vleck and Noel Morris in
1965 with the creation of &amp;#34;dot&amp;#34;.&lt;/p&gt;
&lt;p&gt;
&lt;span style=&#34;text-decoration: underline;&#34;&gt;Installation&lt;/span&gt;: &amp;#34;dot&amp;#34; is included on simh. On s709, you will need a
recent version of the CTSS kit to run this - either version 1.0.10 or
later from &lt;a href=&#34;https://cozx.com/dpitts/ibm7090.html&#34;&gt;Dave Pitts&amp;#39; site&lt;/a&gt; or a version of my &lt;a href=&#34;https://github.com/timereshared/ctss-s709-quickstart&#34;&gt;quickstart&lt;/a&gt; or
&lt;a href=&#34;https://github.com/rupertl/eliza-ctss&#34;&gt;eliza-ctss&lt;/a&gt; released after 1 May 2025. Reinstall your system, then
start CTSS and login as user &lt;code&gt;sysdev&lt;/code&gt; password &lt;code&gt;system&lt;/code&gt;. Run the
&lt;code&gt;runcom mkdot&lt;/code&gt; command. This will compile and install &amp;#34;dot&amp;#34; as a
system component.&lt;/p&gt;
&lt;p&gt;
To start it, just type &lt;code&gt;.&lt;/code&gt; You will notice the prompt changes to an
abbreviated form of the R and W notifications. &amp;#34;dot&amp;#34; will reload
itself after you run a command, but in some cases, for example after
an error, it will be suspended, so type &lt;code&gt;RSTAT&lt;/code&gt; to continue&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
.

W 1508.2
R       

hello

W
MIT8C0: 2 USERS AT 05/03/25 1509.3, MAX = 30
R                                           
 
xxx

W
 &amp;#39;XXX&amp;#39; NOT FOUND.
 TYPE RSTART TO IGNORE.
R .100+.150            
           
rstart

W 1509.7
R
&lt;/pre&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-2&#34;&gt;
Multiple commands
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
With &amp;#34;dot&amp;#34; running, you can type more than one command per line,
separating them by commas with whitespace. For example to run &lt;code&gt;hello&lt;/code&gt;
and &lt;code&gt;listf&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
hello , listf * mad

W
MIT8C0: 2 USERS AT 05/03/25 1451.4, MAX = 30
                                            
     3 FILES     5 RECORDS
 NAME1  NAME2 MOD NOREC   USED
 HELLO    MAD 000     1         
BOTTLE    MAD 000     1 04/14/25
  CQA1    MAD 000     3         

R
&lt;/pre&gt;
&lt;p&gt;
You can run several commands on a given parameter, so rather than
typing &lt;code&gt;MAD HELLO , LOADGO HELLO&lt;/code&gt; you can do:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
( mad loadgo ) hello

W
LENGTH 00020.  TV SIZE 00003.  ENTRY 00011
EXECUTION.                                
 HELLO WORLD
  EXIT CALLED. PM MAY BE TAKEN.
R .166+.050
&lt;/pre&gt;
&lt;p&gt;
You can also run one command on multiple parameters: rather than
typing &lt;code&gt;MAD HELLO , MAD BOTTLE&lt;/code&gt; you can do:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
mad ( hello bottle )

W
LENGTH 00020.  TV SIZE 00003.  ENTRY 00011
LENGTH 00155.  TV SIZE 00003.  ENTRY 00070
R
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-3&#34;&gt;
Abbreviations
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
Commonly used commands can be abbreviated using &lt;code&gt;DC&lt;/code&gt;. Existing
abbreviations can be listed with &lt;code&gt;ABBREV COM&lt;/code&gt;. So for forgetful
Unix users who keep typing &lt;code&gt;ls&lt;/code&gt; and &lt;code&gt;cp&lt;/code&gt; you could do:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
dc ls listf cp move
W
R
 
abbrev com
W
 
    LS   LISTF
    CP    MOVE
              
R
 
ls * mad
W
 
     3 FILES     5 RECORDS
 NAME1  NAME2 MOD NOREC   USED
BOTTLE    MAD 000     1 05/03/25
 HELLO    MAD 000     1         
  CQA1    MAD 000     3 04/14/25
                                

R
&lt;/pre&gt;
&lt;p&gt;
Command line parameter can be defined with &lt;code&gt;DP&lt;/code&gt;. Abbreviations are
stored across sessions in the file &lt;code&gt;USER PROFIL&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
There is also a handy built in abbreviation &lt;code&gt;.x&lt;/code&gt; for &lt;code&gt;(CFLx)&lt;/code&gt; so to
list files in common file directory #4 you now just need to type &lt;code&gt;ls
.4&lt;/code&gt; instead of &lt;code&gt;LISTF (CFL4)&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-4&#34;&gt;
Several people are typing
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
&amp;#34;dot&amp;#34; also includes a typewriter-to-typewriter chat facility. Both
ends of the chat need to be running &amp;#34;dot&amp;#34;. Say you are logged in as
&lt;code&gt;guest&lt;/code&gt; and want to chat to &lt;code&gt;sysdev&lt;/code&gt; who is user M!416 5. Use the
&lt;code&gt;write m1416 5&lt;/code&gt; command. On the other end, you will see the messages
and can respond immediately. See the image at the top of this post for
an example.&lt;/p&gt;
&lt;p&gt;
Either end can type Control-C to exit the chat session. The &lt;code&gt;ALLOW&lt;/code&gt;
and &lt;code&gt;FORBID&lt;/code&gt; commands control who can chat to whom.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Electronic mail
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
A separate facility from &amp;#34;dot&amp;#34; was the electronic mail command &lt;code&gt;MAIL&lt;/code&gt;.
The design and history of this is covered by Tom Van Vleck (one of
&lt;code&gt;MAIL&lt;/code&gt;&amp;#39;s original authors) at &lt;a href=&#34;https://multicians.org/thvv/mail-history.html&#34;&gt;multicians.org&lt;/a&gt; which is well worth a
read.&lt;/p&gt;
&lt;p&gt;
A quick demo of how it is used. Say I am logged on as &lt;code&gt;SYSDEV&lt;/code&gt; and I
want to send an email to &lt;code&gt;GUEST&lt;/code&gt;. I put my message in a file, here
&lt;code&gt;HELLO TXT&lt;/code&gt;, and send it using &lt;code&gt;MAIL&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
p hello txt    
W 1924.2
        
HELLO GUEST, WELCOME TO CTSS.
                             
R .000+.033
           
mail hello txt m1416 guest
W 1925.1
R .016+.016
&lt;/pre&gt;
&lt;p&gt;
When &lt;code&gt;GUEST&lt;/code&gt; logs in, they will see&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
YOU HAVE     MAIL   BOX
&lt;/pre&gt;
&lt;p&gt;
and they can view the message by printing the file.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
p mail box
W 1926.8
        
 FROM M1416 6 IN M1416 SYSDEV AT 04/27 1925.1
HELLO GUEST, WELCOME TO CTSS.                
                             

R .016+.033
&lt;/pre&gt;
&lt;p&gt;
The source code for the &lt;code&gt;MAIL&lt;/code&gt; program is in &lt;code&gt;com5/&lt;/code&gt; in the CTSS kit.
As mentioned in the article, the program is simple (only 250 lines of
MAD code) and contains a hard coded list of users who can email &lt;code&gt;* *&lt;/code&gt;,
ie all users:&lt;/p&gt;
&lt;div class=&#34;src src-mad&#34;&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mad&#34; data-lang=&#34;mad&#34;&gt;    INTERNAL FUNCTION(X,Y)
    ENTRY TO USRCHK.
   R
    WHENEVER X.NE.$ M1416$ .OR. (Y.NE.$   385$ .AND. Y
   1  .NE. $  4301$ .AND. Y .NE. $  2962$ .AND. Y .NE.
   2  $  3845$)
   3  , ERROR RETURN&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: Security</title>
      <link>https://timereshared.com/ctss-security/</link>
      <pubDate>Sun, 27 Apr 2025 08:28:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-security/</guid>
      <description>
&lt;p&gt;
Did the concept of computer security exist before CTSS? In the world
of batch processing, access to computer resources was done by
submitting a deck of punched cards or a magnetic tape to the computer
operations staff who would supervise its execution, so only physical
access control was needed. There was also no concept of persistent,
private data residing in the system - any such data would be physical,
on paper or tape, to be held by the user or computer centre offline.&lt;/p&gt;
&lt;p&gt;
CTSS introduced the idea of multiple users accessing the system at the
same time, so now there was the problem of how to prevent one program
interfering with another. Access to the system was from outside the
computer room, via typewriters wired to the computer or even remotely
via modem, so there needed to be some way to control this. Finally,
CTSS had a hard disk where files could be stored and control was
needed over who could access them.&lt;/p&gt;
&lt;p&gt;
File access was covered in &lt;a href=&#34;https://timereshared.com/ctss-files-and-directories/&#34;&gt;CTSS Files &amp;amp; Directories&lt;/a&gt;; in this post we
will look at resource protection and login control.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Resource protection
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
In a multi-user system a programmer should no longer have direct
access to all hardware resources; access needs to be mediated through
the operating system.&lt;/p&gt;
&lt;p&gt;
As several programs can be loaded in core memory at any time, CTSS
prevents direct access to memory that is not part of your program. For
example, take this assembly language program.&lt;/p&gt;
&lt;div class=&#34;src src-asm&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;CLA&lt;/span&gt;     &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;TSX&lt;/span&gt;     &lt;span style=&#34;color:#66d9ef&#34;&gt;CHNCOM&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CHNCOM&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TIA&lt;/span&gt;     &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;HCHNCOM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The important line here is the first one: &lt;code&gt;CLA addr&lt;/code&gt; will clear the
accumulator and load it with the contents of memory at address &lt;code&gt;addr&lt;/code&gt;.
The remaining two lines will cause the program to exit by calling the
&lt;code&gt;CHNCOM&lt;/code&gt; system routine.&lt;/p&gt;
&lt;p&gt;
Compiling and executing this program works fine. But if I change the
address to 7000 it will give a protection error.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
p test fap
W 954.3
       
	CLA	7000
	TSX	CHNCOM,4
CHNCOM	TIA	=HCHNCOM
	END             
           

R .016+.016
           
fap test
W 954.3
     LENGTH     4
R .016+.000      
           
loadgo test
W 954.4
EXECUTION.
 PROTECTION MODE VIOLATION AT 05360.
 INS.=050000015530, RI.=000000000000, PI.=005364000000
R .000+.016
&lt;/pre&gt;
&lt;p&gt;
Internally this is handled by the supervisor setting two protection
registers representing the upper and lower bounds of memory areas the
program can reach, along with a relocation register to map logical to
physical address.&lt;/p&gt;
&lt;p&gt;
There is also protection against trying to change these registers, or
trying to access I/O devices directly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Login control
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Early versions of CTSS had a &lt;code&gt;login&lt;/code&gt; command to identify which user
wanted to start a session: the user would provide their problem and
programmer number but no password was required. The &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide.pdf&#34;&gt;CTSS Programmer&amp;#39;s
Guide&lt;/a&gt; from 1963 states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the future an additional parameter may be required in order to
afford greater security for the user. This will probably be in the
form of a private code given separately; explicit instructions will be
given by the &lt;code&gt;login&lt;/code&gt; command if necessary.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Passwords were probably added around May 1964 according to &lt;a href=&#34;https://people.csail.mit.edu/saltzer/Multics/MHP-Saltzer-060508/bookcases/TSSNs/TSSN-04.pdf&#34;&gt;Time
Sharing System Notes #4&lt;/a&gt;. When the user entered the &lt;code&gt;login&lt;/code&gt; command,
the computer would prompt for the password and turn off the
typewriter&amp;#39;s print head so the user could enter it without it being
displayed. If it matched, the user was logged in.&lt;/p&gt;
&lt;p&gt;
Note the &lt;code&gt;login&lt;/code&gt; command prints different error messages depending on
whether the user name or password was incorrect, which does mean it is
possible to determine whether a user name is valid.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
login nouser  
W 1025.2
Password
NOUSER NOT FOUND IN DIRECTORY
 LOGIN COMMAND INCORRECT     
READY.                  
      
login guest
W 1025.4
Password
 PASSWORD NOT FOUND IN DIRECTORY
 LOGIN COMMAND INCORRECT        
READY.
&lt;/pre&gt;
&lt;p&gt;
User information is stored in the file &lt;code&gt;UACCNT TIMACC&lt;/code&gt; in common files
#2. Passwords are stored in plain text. It is possible to view the
file using the emulated system; in the real system this likely would
have had file protection set so non-system users could not open it.
Here we can see that user &lt;code&gt;guest&lt;/code&gt;&amp;#39;s password is &lt;code&gt;system&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
comfil 2
W 1050.9
R .000+.000
           
p UACCNT TIMACC
W 1050.9
...        
GUEST	 5000001000000GUEST 000001000001000000SYSTEM
000000004000000000000360000360000360000360000360    
...
&lt;/pre&gt;
&lt;p&gt;
Further control was provided by specifying a group of lines the user
could login from, and giving each user a quota of time to access the
system, divided into shifts (for example, shift 1 was Monday to
Friday, 8am to 6pm).&lt;/p&gt;
&lt;p&gt;
Contents of these files were set by operations staff; it is not
possible for the user to change their password online.&lt;/p&gt;
&lt;p&gt;
The structure of the user accounting files is described in the 1969
&lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt; section AD.5.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Access control hacks
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The IEEE put together &lt;a href=&#34;https://history.computer.org/pubs/2011-06-ctss.pdf&#34;&gt;The CTSS Fiftieth Anniversary Commemorative
Overview&lt;/a&gt; which contains many interesting stories about CTSS. There is
one entry by Allan Scherr who was about to lose access to system files
and CPU quota, but wanted to find a way to keep running his program.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Late one Friday night, I submitted a request to print the password
files and very early Saturday morning went to the file cabinet where
printouts were placed and took the listing out of the M1416 folder. I
could then continue my larceny of machine time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
As the passwords were in plain text, the printout of the file was all
that was needed to get access to other accounts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Denial of service   
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Another story in the IEEE overview recounted by Tom Van Vleck recounts
how Bill Mathews noticed an error where the password file had been
mixed up with the message of the day file so all users could see
passwords for other users when they logged in. Bill wanted to limit
the damage by crashing the machine: the way he did this was to enter
the debugger and issue the assembly instruction &lt;code&gt;XEC *&lt;/code&gt;. &lt;code&gt;XEC&lt;/code&gt; means
read the word at the given address and execute it; &lt;code&gt;*&lt;/code&gt; means the
current address, so this is effectively an infinite loop.&lt;/p&gt;
&lt;p&gt;
We can recreate this on the emulated system (using FAP): &lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
edc splat fap
W 1836.2
 FILE  SPLAT   FAP NOT FOUND.
Input:                       
	XEC	*
	END

Edit:
file 

R .016+.016
           
fap splat
W 1836.4
     LENGTH     1
R .016+.033      
           
load splat
W 1836.9
R .000+.016
           
start
W 1836.9
EXECUTION.
&lt;/pre&gt;
&lt;p&gt;
Now the program (and all other user sessions) do not respond to
further input and even the s709 emulator needs to be force killed to
recover from this.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: Assembly Language</title>
      <link>https://timereshared.com/ctss-assembly/</link>
      <pubDate>Sun, 13 Apr 2025 09:36:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-assembly/</guid>
      <description>
&lt;p&gt;
I am not planning to go into too much detail on assembly language in
this blog, but I will take a quick look at some of the features of the
IBM 7x architecture that are different from what we are used to today,
and the assembler available on CTSS.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/ctss-slip-assembly.png&#34; alt=&#34;/images/ctss/ctss-slip-assembly.png&#34; title=&#34;Assembly Listing&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;Part of the assembly language listing of the SLIP library used in
ELIZA. Source: &lt;a href=&#34;https://github.com/jeffshrager/elizagen.org&#34;&gt;Github jeffshrager/elizagen.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
The FAP assembler
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The Fortran Assembly Program was used on batch operating systems to
assemble FORTRAN compiler output and user assembly code. As mentioned
in the article on &lt;a href=&#34;https://timereshared.com/ibm-7x-early-software/&#34;&gt;early software&lt;/a&gt;, this was based on work one by
individual 7x sites and eventually adopted by IBM as part of IBSYS and
FMS. This code was ported to CTSS to run interactively and used for
most of the low level operating system code.&lt;/p&gt;
&lt;p&gt;
Although the opcodes and operands are hardware specific, the format of
code as shown above would be familiar to machine code programmers
today, with labels on the left followed by instructions in column 8,
and then optional comments.&lt;/p&gt;
&lt;p&gt;
To assemble &lt;code&gt;name1 fap&lt;/code&gt; on CTSS, use the command &lt;code&gt;FAP name1&lt;/code&gt;. It takes
the optional argument &lt;code&gt;(LIST)&lt;/code&gt; if you want to produce a listing, and
&lt;code&gt;(SYMB)&lt;/code&gt; to produce a symbol table for debugging.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
The instruction set architecture
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-3&#34;&gt;
1s complement
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
The 7x uses 1s complement for quantities and arithmetic, so that the
left most bit of a word is 0 for positive and 1 for negative. This has
some interesting consequences such as there existing a +0 which is
different from -0.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-4&#34;&gt;
Word addressing
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
Access to memory is via words; there is no concept of byte or sub-word
addressing. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-5&#34;&gt;
Not many general purpose registers
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
There is really only the accumulator as a general purpose register.
There is a multiplier/quotient register that is used when multiplying
two words together where the extra space is needed. But most
operations involve bringing data in from memory and applying it to the
accumulator.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-6&#34;&gt;
Index registers
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-4&#34;&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/7094-sample-instruction.png&#34; alt=&#34;/images/ctss/7094-sample-instruction.png&#34; title=&#34;Sample instruction&#34; width=&#34;75%&#34; height=&#34;75%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;Arrangement of fields in a sample instruction. Source: &lt;a href=&#34;http://bitsavers.org/pdf/ibm/7094/A22-6703-4_7094_PoO_Oct66.pdf&#34;&gt;IBM 7094
Principle of Operations at bitsavers.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
To aid with constructs like looping, there are 3 index registers on
the 7090 and 7 on the 7094. These are selected by means of a 3 bit tag
field in many instructions (shown as T above): on the 7090 you can
select multiple index registers at once, on the 7094 you can do
multiple selection for index registers 1-3 or select any single
register from 1-7 depending on the mode of the machine.&lt;/p&gt;
&lt;p&gt;
Index registers are effectively 15 bits wide, as 2¹⁵ = 32k is the
maximum memory space.&lt;/p&gt;
&lt;p&gt;
The contents of the selected index register(s) are &lt;strong&gt;subtracted&lt;/strong&gt; from
the address specified rather than added. This leads to tables of
values being naturally stored in descending order of memory location,
for example Fortran II does this for arrays. It is however possible to
get the contents of the index registers to be added by storing a 2s
complement value in a index register.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-7&#34;&gt;
Indirect addressing
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
Setting the Flag field (F in the above) indicates indirect addressing.
The CPU goes to the address indicated in the instruction, loads the
value there and then treats that as an address to load the final value
from.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-8&#34;&gt;
Calling convention
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
There is no stack register on this CPU, so a different method is
needed for calling subroutines. For a single parameter/return you
could use the accumulator, but for more than one the convention used
was to place the parameters in the program&amp;#39;s memory just after the
call instruction, use index registers to access these from the
subroutine and then jump back to a fixed location after the callee and
parameters. (&lt;a href=&#34;https://web.archive.org/web/20210424171134/http://www.frobenius.com/linkage.htm&#34;&gt;frobenius.com&lt;/a&gt; has a great example of how this works in
detail.)&lt;/p&gt;
&lt;p&gt;
Supervisor calls are done by branching to a subroutine whose first
instruction is &lt;code&gt;TIA&lt;/code&gt; and contains in the address field the BCD
formatted name of the system call. The machine will trap into an
exception where the supervisor can recognise it and take action.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-9&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
All the below are on bitsavers. The IBM &lt;a href=&#34;http://bitsavers.org/pdf/ibm/7094/A22-6703-4_7094_PoO_Oct66.pdf&#34;&gt;Principles of Operation&lt;/a&gt;
describes the architecture and opcodes for the 7094. This should be
read before the &lt;a href=&#34;http://bitsavers.org/pdf/ibm/7090/C28-6235-2_7090_FAP.pdf&#34;&gt;FAP manual&lt;/a&gt; on how to run the assembler. James Saxon&amp;#39;s
1964 book &lt;a href=&#34;http://bitsavers.org/pdf/ibm/7090/books/Saxon_Programming_the_IBM_7090_1963.pdf&#34;&gt;Programming the IBM 7090&lt;/a&gt; may be an easier way to learn
assembly as it is structured as a series of lessons.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: Lisp</title>
      <link>https://timereshared.com/ctss-lisp/</link>
      <pubDate>Sun, 06 Apr 2025 09:18:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-lisp/</guid>
      <description>
&lt;p&gt;
Two of the oldest programming languages still in use today debuted on
the IBM 7x series of computers in the late 1950s. Last time we looked
at &lt;a href=&#34;https://timereshared.com/ctss-fortran/&#34;&gt;Fortran&lt;/a&gt;, today it&amp;#39;s the turn of Lisp.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Lisp on CTSS
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
John McCarthy and colleagues developed the first version of Lisp at
MIT. It originally targeted the IBM 704 and had its own batch
operating system (called Overlord) and assembler. The first fully
working version was called Lisp 1.5 and documented in the 1962 book
&lt;a href=&#34;https://www.softwarepreservation.org/projects/LISP/lisp15_family#Lisp_15_Programmers_Manual_&#34;&gt;LISP 1.5 Programmer&amp;#39;s Manual.&lt;/a&gt; It was originally developed as an
interpreter but a compiler, written in Lisp, was soon added.&lt;/p&gt;
&lt;p&gt;
At this point in history, the notation for list expressions was not
the universal S-expression we know today. The book uses M-expressions,
which has square brackets. There was also the &amp;#39;doublet form&amp;#39; used to
enter expressions at the top level. For example, take this &lt;code&gt;CONS&lt;/code&gt;
expression which takes as  parameters the symbol &lt;code&gt;A&lt;/code&gt; and the list &lt;code&gt;(B
C)&lt;/code&gt; to form &lt;code&gt;(A B C)&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S-expression&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(CONS (QUOTE A) (QUOTE (B C)))&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M-expression&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cons[A; (B C)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Doublet form&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CONS (A (B C))&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Internally, Lisp stored two 15 bit cells in each 36 bit machine word,
with the left hand cell taking up the space used by the address
portion of the word when viewed as a IBM 7x machine code instruction,
and the right hand cell in the decrement portion. This led to the
primitive functions &lt;code&gt;CAR&lt;/code&gt; and &lt;code&gt;CDR&lt;/code&gt; used to access the address and
decrement portions; these functions are still used today despite the
link to the original hardware being long gone.&lt;/p&gt;
&lt;p&gt;
The version we have today derives from a port of this original code to
CTSS in around 1965. Although the 1969 CTSS Programmer&amp;#39;s Guide
indicates that features specially for CTSS were added, such as a
listen mode where commands could be typed interactively, the version
we have seems to be an earlier one that does not have this.&lt;/p&gt;
&lt;p&gt;
The Lisp binary contains only definitions of fundamental functions
like &lt;code&gt;CONS&lt;/code&gt;, &lt;code&gt;CAR&lt;/code&gt; etc; higher level standard functions such as
&lt;code&gt;REVERSE&lt;/code&gt; or even &lt;code&gt;DEFINE&lt;/code&gt; were done in Lisp as an external library.
This library can be loaded into the interpreter and then core saved to
a new executable file, speeding up invocation of programs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
TPK in Lisp
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Below is an implementation of the &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;TPK algorithm&lt;/a&gt; in Lisp 1.5, taking
into account the limitations mentioned above.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Library functions, namely &lt;code&gt;DEFINE&lt;/code&gt;, &lt;code&gt;APPEND&lt;/code&gt;, &lt;code&gt;REVERSE&lt;/code&gt;, &lt;code&gt;SQRT&lt;/code&gt; and
&lt;code&gt;ABS&lt;/code&gt;, are implemented separately in a &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/programs/Lisp 1.5/lib.lisp&#34;&gt;library&lt;/a&gt;; I took &lt;code&gt;DEFINE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;from existing code and provided implementations for the others based
on the Programmer&amp;#39;s Manual.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As there is no interactive input, the numbers acting as input to TPK&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;are hard coded into the function call.&lt;/p&gt;
&lt;div class=&#34;src src-lisp&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEFINE ((
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (F (LAMBDA (X) (PLUS (SQRT (ABS X)) (TIMES &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt; (EXPT X &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (LIMIT-F (LAMBDA (X) (PROG (RESULT)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (SETQ RESULT (F (CAR X)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         (RETURN (COND
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  ((GREATERP RESULT &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt;) (QUOTE TOO-LARGE))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  (&lt;span style=&#34;color:#66d9ef&#34;&gt;T&lt;/span&gt; RESULT)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (TPK (LAMBDA (NUMS)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 (MAPLIST (REVERSE NUMS) (QUOTE LIMIT-F)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TPK ((&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;-1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.3&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.305&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.303&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.302&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4.301&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;STOP&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
This uses doublet form to invoke functions and the indentation is what
was commonly used at the time.&lt;/p&gt;
&lt;p&gt;
The code should be read from bottom to top.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;TPK&lt;/code&gt; reverses the list and calls &lt;code&gt;MAPLIST&lt;/code&gt; on this, which will call
&lt;code&gt;LIMIT-F&lt;/code&gt; 11 times with lists formed by removing the first item in
turn, ie &lt;code&gt;(10 -1 1 2 ...)&lt;/code&gt;, &lt;code&gt;(-1 1 2 ...)&lt;/code&gt; &lt;code&gt;(1 2 ...)&lt;/code&gt; etc. &lt;code&gt;MAPCAR&lt;/code&gt;
would be a better choice on more modern Lisps.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;LIMIT-F&lt;/code&gt; uses a &lt;code&gt;PROG&lt;/code&gt; and a local variable &lt;code&gt;RESULT&lt;/code&gt; so the function
&lt;code&gt;F&lt;/code&gt; is only called once per number. The &lt;code&gt;COND&lt;/code&gt; checks the result and
returns the symbol &lt;code&gt;TOO-LARGE&lt;/code&gt; if over 400, else the result.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Running TPK
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The first step is to load the &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/programs/Lisp 1.5/lib.lisp&#34;&gt;library&lt;/a&gt; file created for this project
into the base Lisp interpreter, and save the resultant binary to a new
excitable file.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
lisp lib
W 1818.8
06978   
 VALUE
 NIL  
 VALUE
 DEFLIST
 VALUE  
 DEFINE
 VALUE 
 (APPEND REVERSE SQRT ABS)
R .016+.066               
           
save mylisp
W 1818.9
R .000+.066
&lt;/pre&gt;
&lt;p&gt;
This can then be run against the &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/programs/Lisp 1.5/tpk.lisp&#34;&gt;solution&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
r mylisp tpk
W 1819.0
 VALUE  
 (F LIMIT-F TPK)
 VALUE          
 ( 0.39988629E3 TOO-BIG TOO-BIG TOO-BIG  0.39960863E3  0.322E3
  0.13673205E3  0.41414213E2  0.6E1 -0.4E1 TOO-BIG)           
R .016+.050
&lt;/pre&gt;
&lt;p&gt;
Full details on &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/listings/CTSS/lisp_compile.txt&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
A great deal of information on the history of Lisp can be found at
&lt;a href=&#34;https://www.softwarepreservation.org/projects/LISP&#34;&gt;softwarepreservation.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: Fortran II translator</title>
      <link>https://timereshared.com/ctss-fortran/</link>
      <pubDate>Sun, 30 Mar 2025 09:17:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-fortran/</guid>
      <description>
&lt;p&gt;
Fortran became a very popular language for scientific computation on
the IBM 7x series soon after its creation in 1957. Although it could
run as a FMS batch job, it was not available for online users of
CTSS - according to &lt;a href=&#34;https://multicians.org/thvv/7094.html&#34;&gt;Tom Van Vleck&lt;/a&gt; &amp;#39;IBM FORTRAN II would not run in
CTSS foreground, because the FORTRAN compiler was a complex multi-pass
monster.&amp;#39;&lt;/p&gt;
&lt;p&gt;
What was available was a translator from Fortran to MAD called
&lt;code&gt;MADTRN&lt;/code&gt;. This would take a Fortran file as input (with name2 of
&lt;code&gt;MADTRN&lt;/code&gt;), translate it to MAD and then compile it. The 
&lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;CTSS Programmer&amp;#39;s Guide&lt;/a&gt; does provide some warnings on its use,
however:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MADTRN does not always produce perfect results and, therefore, should
not be used unless absolutely necessary. MADTRN assumes a working
Fortran program and therefore MADTRN diagnostics are minimal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
In any case, let&amp;#39;s try this out on CTSS by implementing the &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;TPK algorithm&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/fortran-punched-card.png&#34; alt=&#34;/images/ctss/fortran-punched-card.png&#34; title=&#34;Blank Fortran punched card&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;Blank Fortran punched card. Source: &lt;a href=&#34;https://archive.computerhistory.org/resources/text/Fortran/102653994.05.01.acc.pdf&#34;&gt;IBM 7090/7094 Programming Systems: FORTRAN II Programming&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
TPK in Fortran II
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
This is based on Knuth&amp;#39;s Fortran I version in the &lt;a href=&#34;https://archive.org/details/historyofcomputi0000inte&#34;&gt;original paper&lt;/a&gt;. See
the &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/programs/Fortran%20II/tpk.for&#34;&gt;file&lt;/a&gt; on Github or the annotated version below.&lt;/p&gt;
&lt;p&gt;
The source format, as shown in the illustration above, is fixed, with
&lt;code&gt;C&lt;/code&gt; in column 1 indicating a comment, line numbers in cols 1-85 and
code starting at column 7.&lt;/p&gt;
&lt;div class=&#34;src src-fortran&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fortran&#34; data-lang=&#34;fortran&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  C     TPK ALGORITH IN FORTRAN II
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        FTPKF(X)&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;SQRTF(ABSF(X))&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5.0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;X&lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;                         &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;②&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  C     MAIN &lt;span style=&#34;color:#66d9ef&#34;&gt;PROGRAM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;DIMENSION&lt;/span&gt; A(&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        N&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt;HPLEASE ENTER &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt; NUMBERS)                       &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;⑦&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;READ&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;101&lt;/span&gt;,A                                               &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;⑧&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;101&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(F9.&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;102&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;102&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;HRESULTS ARE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;DO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; J&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,N                                               &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;⑫&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;RESULT&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;FTPKF(A(J))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;RESULT&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.0&lt;/span&gt;) &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;                                  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;⑭&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;103&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;103&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;HTOO LARGE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;GO&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;101&lt;/span&gt;,&lt;span style=&#34;color:#66d9ef&#34;&gt;RESULT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;CONTINUE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;STOP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The function to be called is on line ②, and is an example of a single
expression function. Note that functions have to end with the letter
&lt;code&gt;F&lt;/code&gt;, including built in ones like &lt;code&gt;SQRTF&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Variable types are indicated by the first letter: &lt;code&gt;I&lt;/code&gt; - &lt;code&gt;N&lt;/code&gt; means an
integer, otherwise it is floating point.&lt;/p&gt;
&lt;p&gt;
Strings can be printed, as shown on line ⑦, but need to be
incorporated in the format definition as the string length followed by
&lt;code&gt;H&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Arrays can be read in by a single statement as shown on line ⑧.
However something odd is going on here - see the section &amp;#34;The case of
the reversed &lt;code&gt;READ&lt;/code&gt;&amp;#34; below.&lt;/p&gt;
&lt;p&gt;
Line ⑫ introduces a loop. ⑭ is a &amp;#39;computed if&amp;#39;, with the test
expression being compared against zero and a branch taken to the
first, second or third label if the result is less than, equal to or
greater to the test. So here if &lt;code&gt;RESULT&lt;/code&gt; is &amp;gt; 400 control will
transfer to label &lt;code&gt;1&lt;/code&gt;, otherwise to label &lt;code&gt;2&lt;/code&gt;. This is the only &amp;#39;if&amp;#39;
syntax available in Fortran II.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Compiling the program
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
To compile, run &lt;code&gt;MADTRN TPK&lt;/code&gt;, optionally with the &lt;code&gt;(LIST)&lt;/code&gt; switch.&lt;/p&gt;
&lt;p&gt;
Noe that &lt;code&gt;MADTRN&lt;/code&gt; will create &lt;code&gt;TPK MAD&lt;/code&gt; as its output before compiling
it, so if you already have &lt;code&gt;TPK MAD&lt;/code&gt; from the previous post in your
directory it will be overwritten.&lt;/p&gt;
&lt;p&gt;
As indicated by the warning in the manual, if there is a mistake it is
unlikely to be caught until the MAD program is compiled which means
you need to trace back from the translated source. The only &lt;code&gt;MADTRN&lt;/code&gt;
diagnostic I could get was if I forgot the &lt;code&gt;END&lt;/code&gt; statement:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
****ERROR 20
*****NO END CARD *****
PROBABLE ERROR IN MADTRN FILE.
MAD FILE CREATED,USE AT OWN RISK.
&lt;/pre&gt;
&lt;p&gt;
Otherwise, the &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/listings/CTSS/fortran_compile.txt&#34;&gt;compile and execution&lt;/a&gt; is straightforwards:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
madtrn tpk (list)
W 1905.1
LENGTH 00205.  TV SIZE 00006.  ENTRY 00055
R .033+.066                               
           
loadgo tpk
W 1905.2
EXECUTION.
PLEASE ENTER 11 NUMBERS
...
&lt;/pre&gt;
&lt;p&gt;
The &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/listings/CTSS/fortran_listing.txt&#34;&gt;MAD output&lt;/a&gt; of the translator is reasonably clean so could be used
as a starting point for further development.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
The case of the reversed &lt;code&gt;READ&lt;/code&gt;
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;em&gt;Added May 2025.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
As mentioned above, line ⑧ reads in an entire array. However, &lt;code&gt;MADTRN&lt;/code&gt;
stores this array backwards, ie the first number input is stored in
&lt;code&gt;A(11)&lt;/code&gt;, the second in &lt;code&gt;A(10)&lt;/code&gt; etc. Looking at the generated MAD code
we can see it does this by giving the array backwards:&lt;/p&gt;
&lt;div class=&#34;src src-mad&#34;&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mad&#34; data-lang=&#34;mad&#34;&gt;                 READ FORMAT QQ0004,A(11)...A(1)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
As the array is already read in backwards, there is no need to further
reverse it.&lt;/p&gt;
&lt;p&gt;
Why it does this, I do not know. I was able to get this code running
on a real Fortran II compiler on IBSYS, and the &lt;code&gt;READ&lt;/code&gt; populated the
array from &lt;code&gt;A(1)&lt;/code&gt; to &lt;code&gt;A(11)&lt;/code&gt;. Looking at the Fortran I and II specs
indicate that arrays are &lt;strong&gt;stored&lt;/strong&gt; backwards in memory, due to the
decrement nature of IBM 7090 index registers, but this storage is
transparent to the user and the &lt;code&gt;READ&lt;/code&gt; is done in &lt;strong&gt;natural&lt;/strong&gt;, ie
incremental form. So is this a bug in &lt;code&gt;MADTRN&lt;/code&gt;? If you have more
information, please let me know.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Further information
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The IBM manual &lt;a href=&#34;https://archive.computerhistory.org/resources/text/Fortran/102653994.05.01.acc.pdf&#34;&gt;IBM 7090/7094 Programming Systems: FORTRAN II
Programming&lt;/a&gt; is a short and readable guide to the language.&lt;/p&gt;
&lt;p&gt;
There&amp;#39;s lots of information about early Fortran at
&lt;a href=&#34;https://www.softwarepreservation.org/projects/FORTRAN&#34;&gt;softwarepreservation.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: MAD language</title>
      <link>https://timereshared.com/ctss-mad/</link>
      <pubDate>Sun, 23 Mar 2025 08:11:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-mad/</guid>
      <description>
&lt;p&gt;
MAD - the Michigan Algorithm Decoder - was a ALGOL inspired language
commonly used for scientific programming on the IBM 7x series of
computers. It was conceived by Bernard Galler and colleagues at the
University of Michigan in 1959. A version from around 1963 was ported
to CTSS, where it was used to write many of the system utilities such
as &lt;code&gt;LISTF&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
To demonstrate MAD and how to write programs in it on CTSS, I will
show an implementation of the TPK algorithm.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
What is the TPK algorithm?
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the repo &lt;a href=&#34;https://github.com/timereshared/project-tpk&#34;&gt;project-tpk&lt;/a&gt; for more details, but basically this was
developed by Donald Knuth and Luis Trabb Pardo for a paper about early
(pre-1957) languages. It does the following&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    read 11 numbers to an array
    for each x in in reverse order of the array
        calculate √|x| + 5x³
        print that number if ≤ 400, else print TOO BIG
&lt;/pre&gt;
&lt;p&gt;
which is not supposed to be a useful task, but demonstrates many
typical language features like I/O, loops, arrays, functions and
conditionals.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
TPK in MAD
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Here is the complete program.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
          R TPK ALGORITHM IN MAD                                 ①
          R FUNCTION F                                           
           INTERNAL FUNCTION(X)                                  ③
           ENTRY TO F.                                           
           FUNCTION RETURN SQRT.(.ABS.X) + 5 * X.P.3             
           END OF FUNCTION                                       ⑥
          R MAIN PROGRAM                                         
           INTEGER N,J                                           ⑧
           N = 11                                                
           DIMENSION NUM(11)                                     ⑩
           VECTOR VALUES FMT = $F9.4 *$                          ⑪
           PRINT COMMENT $PLEASE ENTER 11 NUMBERS$               ⑫
           THROUGH INPUT,FOR J=0,1,J.GE.N                        ⑬ 
INPUT      READ FORMAT FMT,NUM(J)                                ⑭
           PRINT COMMENT $RESULTS ARE$                           
           THROUGH CALC,FOR J=N-1,-1,J.L.0                       ⑯
           RESULT = F.(NUM(J))                                   
           WHENEVER RESULT.G.400                                 ⑱
           PRINT COMMENT $TOO LARGE$                             
           OTHERWISE                                             
           PRINT FORMAT FMT,RESULT                                     
CALC       END OF CONDITIONAL                                    ㉒
           END OF PROGRAM
&lt;/pre&gt;
&lt;p&gt;
Numbers in circles (like ①) are for reference below, not part of the
program. You can download the machine readable file from &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/programs/MAD/tpk.mad&#34;&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
The layout is fixed, with&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;columns 1-10 containing an optional line label&lt;/li&gt;
&lt;li&gt;column 11 contains &lt;code&gt;R&lt;/code&gt; if the line should be treated as a comment
(such as line ①), or a digit if it is a continuation line, blank
otherwise&lt;/li&gt;
&lt;li&gt;code is in columns 12-72&lt;/li&gt;
&lt;li&gt;columns 73-80 are optional sequence numbers, useful for punched cards&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lines ③-⑥ contain the function &lt;code&gt;F.&lt;/code&gt; to do the calculation. Functions
can share code have multiple entry points indicated by &lt;code&gt;ENTRY TO&lt;/code&gt;.
Functions are denoted by a dot on the end, eg &lt;code&gt;F.&lt;/code&gt;, &lt;code&gt;SQRT.&lt;/code&gt;, whereas
language operators have dots before and after, like &lt;code&gt;.ABS.&lt;/code&gt; and &lt;code&gt;.P.&lt;/code&gt;
(power).&lt;/p&gt;
&lt;p&gt;
The main program starts at ⑧ with some variable definitions. Default
type for undefined variables is floating point (can be overridden per
program file with eg &lt;code&gt;NORMAL MODE IS INTEGER&lt;/code&gt;). ⑩ introduces an array
of floats called &lt;code&gt;NUM&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
⑪ defines and initialises an array of six-bit BCD characters; the &lt;code&gt;$&lt;/code&gt;
indicates the character type. The contents of ⑪ is a
&lt;a href=&#34;https://people.csail.mit.edu/saltzer/Multics/MHP-Saltzer-060508/bookcases/CC%20Memos/CC-186-11.pdf&#34;&gt;format specification&lt;/a&gt;, similar to a C &lt;code&gt;scanf&lt;/code&gt; string, requesting
floating point.&lt;/p&gt;
&lt;p&gt;
⑬-⑭ is a loop, delimited by the label &lt;code&gt;INPUT&lt;/code&gt;, to read in 11 floating
point numbers from the user.&lt;/p&gt;
&lt;p&gt;
⑯-㉒ is another loop to execute the function on each array item in
reverse order, with a conditional in ⑱-㉒ to display &lt;code&gt;TOO LARGE&lt;/code&gt; or
the result of the function.&lt;/p&gt;
&lt;p&gt;
One other language feature not used here is the ability to abbreviate
keywords: instead of typing &lt;code&gt;WHENEVER&lt;/code&gt; you can use &lt;code&gt;W&amp;#39;R&lt;/code&gt;, or &lt;code&gt;E&amp;#39;M&lt;/code&gt;
instead of &lt;code&gt;END OF PROGRAM&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Compiling and running
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the guides on how to &lt;a href=&#34;https://timereshared.com/ctss-getting-data-in-and-out/&#34;&gt;upload&lt;/a&gt; or &lt;a href=&#34;https://timereshared.com/ctss-ed-and-friends/&#34;&gt;edit&lt;/a&gt; files to enter the program
into the system.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;MAD TPK&lt;/code&gt; will compile this file and create an object file &lt;code&gt;TPK BSS&lt;/code&gt;.
The compiler has two optional arguments&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(LIST)&lt;/code&gt; to produce a full listing file in &lt;code&gt;TPK BCD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(SYMB)&lt;/code&gt; to include symbols in the object file for debugging.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&#34;example&#34;&gt;
mad tpk (list)
W 1831.4
LENGTH 00211.  TV SIZE 00007.  ENTRY 00040
R .016+.016
&lt;/pre&gt;
&lt;p&gt;
Run the program directly with &lt;code&gt;LOADGO TPK&lt;/code&gt;, or save it to an
executable file that can be used later, and run it via&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    LOAD TPK
    SAVE TPK
    R TPK
&lt;/pre&gt;
&lt;p&gt;
(see &lt;a href=&#34;https://timereshared.com/ctss-programming/&#34;&gt;this previous post&lt;/a&gt; on how loading works on CTSS.)&lt;/p&gt;
&lt;p&gt;
When running the program, you need to include a decimal point in each
item to indicate its type, so you&amp;#39;d enter 1 as &lt;code&gt;1.&lt;/code&gt;. An example run:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
loadgo tpk
W 1831.7
EXECUTION.
PLEASE ENTER 11 NUMBERS
10.                    
-1.
1.
2.
3.
4.
4.3
4.305
4.303
4.302
4.301
RESULTS ARE
 399.8863  
TOO LARGE
TOO LARGE
TOO LARGE
 399.6086
 322.0000
 136.7320
  41.4142
   6.0000
  -4.0000
TOO LARGE
  EXIT CALLED. PM MAY BE TAKEN.
R .150+.016
&lt;/pre&gt;
&lt;p&gt;
See github for the &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/listings/CTSS/mad_compile.txt&#34;&gt;compile/run&lt;/a&gt; transcript, and the full &lt;a href=&#34;https://github.com/timereshared/project-tpk/blob/main/listings/CTSS/mad_listing.txt&#34;&gt;listing&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Further reading
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I have not been able to find the language reference for this
particular version of MAD, but this &lt;a href=&#34;https://bitsavers.org/pdf/univOfMichigan/mad/L2-UOI-MAD1-2-RX_MADum_62.pdf&#34;&gt;manual&lt;/a&gt; from the University of
Illinois on bitsavers is close. Also there is Bernard Galler&amp;#39;s
introduction to programming using MAD, &lt;a href=&#34;https://bitsavers.org/pdf/univOfMichigan/mad/Galler_TheLangOfComps_1962.pdf&#34;&gt;The Language of Computers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
CTSS project director Fernando Corbato wrote an abbreviated guide to
MAD in MIT &lt;a href=&#34;https://people.csail.mit.edu/saltzer/Multics/MHP-Saltzer-060508/bookcases/CC%20Memos/CC-213.pdf&#34;&gt;Computer Center Memo 213&lt;/a&gt;, but the print quality is not
great so this is hard to read.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://github.com/rupertl/eliza-ctss&#34;&gt;ELIZA&lt;/a&gt; is a good example of a larger program written in a mix of MAD
and assembly language.&lt;/p&gt;
&lt;p&gt;
I have written about GOM (Good Old MAD), a later version of MAD for
MTS on the System/370 over at &lt;a href=&#34;https://try-mts.com/tags/mad/&#34;&gt;try-mts.com&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: Programming</title>
      <link>https://timereshared.com/ctss-programming/</link>
      <pubDate>Sun, 16 Mar 2025 09:07:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-programming/</guid>
      <description>
&lt;p&gt;
Today we&amp;#39;ll look at languages and other programming facilities on
CTSS. Page numbers listed below are from the CTSS &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;
As in the previous section on CTSS &lt;a href=&#34;https://timereshared.com/ctss-commands/&#34;&gt;commands&lt;/a&gt;, in some cases a command
is described in the guide but is not available on the emulated
systems, which is shown using &lt;del&gt;strike through&lt;/del&gt;. This is because the
CTSS we have today was reconstructed from a listing tape which does
not include every command that was present then.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Languages
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FAP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IBM 7094 Assembler&lt;/td&gt;
&lt;td&gt;p306&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Michigan Algorithm Decoder&lt;/td&gt;
&lt;td&gt;p315&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MADTRN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fortran II to MAD translator&lt;/td&gt;
&lt;td&gt;p318&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LISP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List Processing Language&lt;/td&gt;
&lt;td&gt;p314&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;AED&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;ALGOL Extended for Design&lt;/td&gt;
&lt;td&gt;p293&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;BEFAP&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Bell Laboratories&amp;#39; 7094 Assembler&lt;/td&gt;
&lt;td&gt;p294&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;COGO-90&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Coordinate Geometry Language&lt;/td&gt;
&lt;td&gt;p295&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;COMIT&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;String Processing Language&lt;/td&gt;
&lt;td&gt;p296&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;DYNAMO&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Model Simulation Language&lt;/td&gt;
&lt;td&gt;p303&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;GPSS&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;General Purpose System Simulator&lt;/td&gt;
&lt;td&gt;p313&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;SNOBOL&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;String Manipulation Language&lt;/td&gt;
&lt;td&gt;p319&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;OPS&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Online Programming System&lt;/td&gt;
&lt;td&gt;p320&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;TIP&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Technical Information Program&lt;/td&gt;
&lt;td&gt;p321&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;FOR4&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Fortran IV to MAD Translator&lt;/td&gt;
&lt;td&gt;p322&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;FORMAC&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Desk Calculator&lt;/td&gt;
&lt;td&gt;p324&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
The languages CTSS was developed in (&lt;a href=&#34;https://timereshared.com/ctss-assembly/&#34;&gt;FAP&lt;/a&gt; assembly and &lt;a href=&#34;https://timereshared.com/ctss-mad/&#34;&gt;MAD&lt;/a&gt;) are
available, along with a &lt;a href=&#34;https://timereshared.com/ctss-fortran/&#34;&gt;translator from FORTRAN&lt;/a&gt; to MAD and an early
&lt;a href=&#34;https://timereshared.com/ctss-lisp/&#34;&gt;LISP&lt;/a&gt; implementation.&lt;/p&gt;
&lt;p&gt;
The other languages are not available. I speculate that these were not
maintained by the Computation Center hence were not on the listing
tape used to reconstruct CTSS. The IEEE 50th anniversary retrospective
&lt;a href=&#34;https://people.csail.mit.edu/saltzer/CTSS/CTSS-Documents/CTSS_50th_anniversary_web_03.pdf&#34;&gt;document &lt;/a&gt; has a section on the origin and importance of some of these
languages.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Loading, saving and starting programs
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LOAD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load a program into memory&lt;/td&gt;
&lt;td&gt;p422&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;L&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load a program into memory, providing more table space&lt;/td&gt;
&lt;td&gt;p422&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LOADGO&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load a program into memory and start it&lt;/td&gt;
&lt;td&gt;p422&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VLOAD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load a program into memory, remove the loader&lt;/td&gt;
&lt;td&gt;p422&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NCLOAD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load a program into memory, remove the loader and commons&lt;/td&gt;
&lt;td&gt;p422&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LDABS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load a program into memory without relocation,&lt;/td&gt;
&lt;td&gt;p428&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;USE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Supply missing modules when loading a program&lt;/td&gt;
&lt;td&gt;p422&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SAVE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Save a dormant program&lt;/td&gt;
&lt;td&gt;p341&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MYSAVE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Save a dormant program and the state of its files&lt;/td&gt;
&lt;td&gt;p341&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;START&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start a program in memory&lt;/td&gt;
&lt;td&gt;p430&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RSTART&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restart a chain of programs in memory&lt;/td&gt;
&lt;td&gt;p430&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RESTOR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Loads a program into memory from disk&lt;/td&gt;
&lt;td&gt;p430&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RECALL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;As &lt;code&gt;RESTOR&lt;/code&gt;, but also restores old command line args&lt;/td&gt;
&lt;td&gt;p430&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RESUME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Loads and runs a program. Can be abbreviated to &lt;code&gt;R&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;p430&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CONTIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load and continue a saved chain of programs&lt;/td&gt;
&lt;td&gt;p430&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DO&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute a saved program from common files&lt;/td&gt;
&lt;td&gt;p440&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;LAED&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Loader for the &lt;code&gt;AED&lt;/code&gt; language&lt;/td&gt;
&lt;td&gt;p432&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;PLOAD&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Simulate the loading process&lt;/td&gt;
&lt;td&gt;p441&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;BLIP&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Show a message every few seconds of program execution&lt;/td&gt;
&lt;td&gt;p442&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;RUN&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Used by &lt;code&gt;TIP&lt;/code&gt; to execute programs&lt;/td&gt;
&lt;td&gt;p443&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
The paradigm for creating user programs and running them is different
from modern operating systems. As an example, on Unix if you have a
main program &lt;code&gt;main.c&lt;/code&gt; and two modules &lt;code&gt;a.c&lt;/code&gt; and &lt;code&gt;b.c&lt;/code&gt; you might
compile them to a binary &lt;code&gt;foo&lt;/code&gt; as follows:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    cc -c a.c
    cc -c b.c
    cc -o foo main.c a.o b.o
&lt;/pre&gt;
&lt;p&gt;
The first two commands make object files &lt;code&gt;a.o&lt;/code&gt; and &lt;code&gt;b.o&lt;/code&gt;. The last
command compiles &lt;code&gt;main.c&lt;/code&gt; and then invokes the linker to bind together
the three modules into an executable file called &lt;code&gt;foo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Now let&amp;#39;s say we are on CTSS and programming in MAD instead of C, so
now we have three files &lt;code&gt;A MAD&lt;/code&gt;, &lt;code&gt;B MAD&lt;/code&gt;, and &lt;code&gt;MAIN MAD&lt;/code&gt;. First we
compile each of the components:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    MAD A
    MAD B
    MAD MAIN
&lt;/pre&gt;
&lt;p&gt;
Now we have object files called &lt;code&gt;A BSS&lt;/code&gt;, &lt;code&gt;B BSS&lt;/code&gt;, &lt;code&gt;MAIN BSS&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Instead of linking them to a disk file, we load them into memory:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    LOAD MAIN A B
&lt;/pre&gt;
&lt;p&gt;
At this point you can start the program immediately - without ever
creating an executable file - with&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    START
&lt;/pre&gt;
&lt;p&gt;
The &lt;code&gt;LOADGO&lt;/code&gt; command is basically a &lt;code&gt;LOAD&lt;/code&gt; followed by a &lt;code&gt;START&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Instead of starting, we could save the memory image to a &lt;code&gt;SAVED&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    LOAD MAIN A B
    SAVE FOO
&lt;/pre&gt;
&lt;p&gt;
This creates a file called &lt;code&gt;FOO SAVED&lt;/code&gt;. It can then be loaded and
started with &lt;code&gt;RESUME&lt;/code&gt;, or simply with &lt;code&gt;R&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    R FOO
&lt;/pre&gt;
&lt;p&gt;
&lt;code&gt;SAVE&lt;/code&gt; can be run at any time for a user program. Say you have a
program that on start up reads a configuration file, parses it and
then enters a loop where it prompts for a command and prints a
response. (For example, ELIZA!) If you pressed the interrupt key
after the config file was loaded and then ran &lt;code&gt;SAVE&lt;/code&gt;, the file it
creates would allow you to restart the program at the same point, ie
within the prompt-response loop rather than right at the beginning.
Similarly, if you have a job which does a lot of calculation, you could
interrupt it, save the current state, log off, and come back later and
restart it at the saved point.&lt;/p&gt;
&lt;p&gt;
These are the load/save commands you will use the most often; the
others in the table are useful in specific scenarios. For example, &lt;code&gt;L&lt;/code&gt;
allows more object files to be loaded at the expense of space
available for the program.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Library management
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EXTBSS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extract a BSS file from a &lt;code&gt;COMBIN&lt;/code&gt;-ed library&lt;/td&gt;
&lt;td&gt;p411&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UPDBSS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update a BSS file in a &lt;code&gt;COMBIN&lt;/code&gt;-ed library&lt;/td&gt;
&lt;td&gt;p411&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Libraries of object (BSS) files are created on CTSS by using &lt;code&gt;COMBIN&lt;/code&gt;.
For example, to create  library &lt;code&gt;MYLIB BSS&lt;/code&gt; from two objects &lt;code&gt;A BSS&lt;/code&gt; and
&lt;code&gt;B BSS&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    COMBIN * MYLIB BSS A B
&lt;/pre&gt;
&lt;p&gt;
(the &lt;code&gt;*&lt;/code&gt; means don&amp;#39;t change the line numbers in the object file).&lt;/p&gt;
&lt;p&gt;
Once created, these libraries can be manipulated with the above
commands.&lt;/p&gt;
&lt;p&gt;
Using our example from the previous section, instead of loading each
object file:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    LOAD MAIN A B
&lt;/pre&gt;
&lt;p&gt;
with a library file we can now use the &lt;code&gt;(LIBE)&lt;/code&gt; option:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    LOAD MAIN (LIBE) MYLIB
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Debugging
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FAPDBG&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Symbolic debugger for assembly language programs&lt;/td&gt;
&lt;td&gt;p449&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;MADBUG&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Symbolic debugger for MAD language programs&lt;/td&gt;
&lt;td&gt;p459&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEBUG&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CTSS symbolic debugger&lt;/td&gt;
&lt;td&gt;p486&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print post mortem information about a program&lt;/td&gt;
&lt;td&gt;p473&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;STOPAT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set a breakpoint&lt;/td&gt;
&lt;td&gt;p479&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PATCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modify a program&amp;#39;s memory image&lt;/td&gt;
&lt;td&gt;p479&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TRA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transfer when reaching a certain address&lt;/td&gt;
&lt;td&gt;p479&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SPATCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Absolute program patching&lt;/td&gt;
&lt;td&gt;p477&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;STRACE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Trace a running program&lt;/td&gt;
&lt;td&gt;p480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;SD&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Supervisor debug printing&lt;/td&gt;
&lt;td&gt;p478&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;SP&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Supervisor debug patching&lt;/td&gt;
&lt;td&gt;p478&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;STOMAP&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Print storage (memory) map&lt;/td&gt;
&lt;td&gt;p503&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
The standard library
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
CTSS also had a comprehensive library of functions available to
programmers, both from assembly and high level languages like MAD.
These are documented in the CTSS &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt; section AG (p108
onwards) and cover&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Console I/O&lt;/li&gt;
&lt;li&gt;File I/O and status&lt;/li&gt;
&lt;li&gt;Tapes and pseudo tapes&lt;/li&gt;
&lt;li&gt;Error handling and program status&lt;/li&gt;
&lt;li&gt;Command and subsystem control&lt;/li&gt;
&lt;li&gt;Conversion (eg number to BCD string)&lt;/li&gt;
&lt;li&gt;Timers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#34;Pseudo tapes&amp;#34; here means when a program tries to access a tape - eg
via language constructs like MAD&amp;#39;s &lt;code&gt;READ BCD TAPE&lt;/code&gt; statement - it is
redirected to a disk file, as regular users would not have access to
physical tapes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: RUNCOM and FIB: scripting and background jobs</title>
      <link>https://timereshared.com/ctss-runcom-and-fib-scripting-and-background-jobs/</link>
      <pubDate>Sun, 09 Mar 2025 09:17:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-runcom-and-fib-scripting-and-background-jobs/</guid>
      <description>
&lt;p&gt;
Another first for CTSS was the idea of collecting a sequence of
interactive commands into a script file that could be run as a single
unit, which helped simplify complex or repetitive tasks. The command
that does this is called &lt;code&gt;RUNCOM&lt;/code&gt;, for Run Commands. This influenced
the &lt;a href=&#34;https://multicians.org/shell.html&#34;&gt;Multics shell&lt;/a&gt; and the terminology &lt;a href=&#34;https://en.wikipedia.org/wiki/RUNCOM&#34;&gt;carried over&lt;/a&gt; to Unix in file
names containing the letters &lt;code&gt;rc&lt;/code&gt;, eg &lt;code&gt;/etc/init.rc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Associated with this is &lt;code&gt;FIB&lt;/code&gt;, the Foreground Initiated &amp;#34;Background&amp;#34;
batch job scheduler, which allows you to execute &lt;code&gt;RUNCOM&lt;/code&gt; jobs without
being logged in. Let&amp;#39;s take a look at both. Note that &lt;code&gt;FIB&lt;/code&gt; is different
from the ability to run FMS batch jobs, which existed before CTSS.&lt;/p&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;FIB running a job&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/ctss/running-fib.png&#34; alt=&#34;/images/ctss/running-fib.png&#34; title=&#34;/images/ctss/running-fib.png&#34;/&gt;
&lt;em&gt;FIB running a job submitted by GUEST.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Using &lt;code&gt;RUNCOM&lt;/code&gt;
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
At its simplest, this is just a text file with &lt;em&gt;name2&lt;/em&gt; of &lt;code&gt;RUNCOM&lt;/code&gt;
containing a list of commands to run in order. For example, if I am
editing, printing, compiling and running a program FOO I could write
the following to a file &lt;code&gt;DEV RUNCOM&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
EDL FOO MAD
P FOO MAD
MAD FOO
LOADGO FOO
&lt;/pre&gt;
&lt;p&gt;
and then type &lt;code&gt;RUNCOM DEV&lt;/code&gt; to execute it.&lt;/p&gt;
&lt;p&gt;
By using parameters we can generalise this to work with other source
code files. Parameters are introduced with the &lt;code&gt;CHAIN&lt;/code&gt; statement.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
CHAIN PROG
EDL PROG MAD
P PROF MAD
MAD PROG
LOADGO PROG
&lt;/pre&gt;
&lt;p&gt;
and then executed by typing, for example &lt;code&gt;RUNCOM DEV FOO&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
We can generalise further to allow MAD and FAP code to be developed by
noticing that the &lt;em&gt;name2&lt;/em&gt; and translator can be parameterised as one
item:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
CHAIN PROG TRANS
EDL PROG TRANS
P PROF TRANS
TRANS PROG
LOADGO PROG
&lt;/pre&gt;
&lt;p&gt;
and run as &lt;code&gt;RUNCOM FOO MAD&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;
Optional parameters can be introduced using &lt;code&gt;(NIL)&lt;/code&gt;. Say sometimes I
want to give options to the translator command, like &lt;code&gt;(LIST)&lt;/code&gt;. I can
change the runcom file to be:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
CHAIN PROG TRANS OPT
EDL PROG TRANS
P PROF TRANS
TRANS PROG OPT
LOADGO PROG
&lt;/pre&gt;
&lt;p&gt;
and then invoke as &lt;code&gt;RUNCOM FOO MAD (NIL)&lt;/code&gt; if I don&amp;#39;t want any options,
or &lt;code&gt;RUNCOM FOO MAD (LIST)&lt;/code&gt; if I want the compile command to be &lt;code&gt;MAD
FOO (LIST)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;(END)&lt;/code&gt; is a similar parameter which will end the line at that point
if detected.&lt;/p&gt;
&lt;p&gt;
Finally, a line starting with &lt;code&gt;*&lt;/code&gt; in the runcom file will act as a
comment; a line starting with &lt;code&gt;$&lt;/code&gt; will be echoed to the console.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Using &lt;code&gt;FIB&lt;/code&gt;
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;code&gt;FIB&lt;/code&gt; allows you to submit a runcom file for later execution. It is
invoked as:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
    FIB NAME1 -LIMIT- -TIME- -DAY-
&lt;/pre&gt;
&lt;p&gt;
where &lt;code&gt;NAME1&lt;/code&gt; is the &lt;em&gt;name1&lt;/em&gt; of a runcom file, eg &lt;code&gt;FOO&lt;/code&gt; for &lt;code&gt;FOO
RUNCOM&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
The next three parameters are optional. &lt;code&gt;LIMIT&lt;/code&gt; sets a maximum CPU
time in minutes that the job can run for, with a default of 5. The
last two set a time and date before which the job cannot start.&lt;/p&gt;
&lt;p&gt;
Once you submit a job, you can cancel it with &lt;code&gt;DELFIB&lt;/code&gt; or query it
with &lt;code&gt;PRFIB&lt;/code&gt;. Only one job can be submitted at a time.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
fib make
W 914.1
R .016+.016
           
prfib
W 914.3
       
JOBNAM  LIMIT   DATE  TIME
                          
  MAKE     5   03/09 0914.1
                           
R .016+.016
&lt;/pre&gt;
&lt;p&gt;
In addition to any time/date argument, the job will not run until you
have logged out. Behind the scenes, the FIB job switches to your ID
and executes the job, as can be seen from the screenshot of the
console at the top of this post.&lt;/p&gt;
&lt;p&gt;
This is because CTSS only allows one task per ID to be running at a
time. Had you tried to log in while the job was running, you would see
a warning and if you continued the FIB job would be cancelled.&lt;/p&gt;
&lt;p&gt;
After the job has finished, you will see its console output in a file
called &lt;code&gt;$$$FIB OUTPUT&lt;/code&gt;. This will be in 12-bit mode, so use &lt;code&gt;P&lt;/code&gt; to
view the file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Further details
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the CTSS &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt; p326 for &lt;code&gt;RUNCOM&lt;/code&gt; and p287 for &lt;code&gt;FIB&lt;/code&gt;. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;span style=&#34;text-decoration: underline;&#34;&gt;May 2025&lt;/span&gt;: Tom Van Vleck provided a correction for the name of &lt;code&gt;FIB&lt;/code&gt;,
noted the difference between this and FMS batch jobs and the output
format for &lt;code&gt;FIB&lt;/code&gt; jobs.&lt;/p&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: ED and friends: online editors</title>
      <link>https://timereshared.com/ctss-ed-and-friends/</link>
      <pubDate>Sun, 02 Mar 2025 09:05:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-ed-and-friends/</guid>
      <description>
&lt;p&gt;
&lt;a href=&#34;https://en.wikipedia.org/wiki/Colossal_Typewriter&#34;&gt;Colossal Typewriter&lt;/a&gt; on the PDP-1 was earlier, but the CTSS text
editors were probably the first used for actual work. In this article
we&amp;#39;ll look at how to do simple editing tasks using &lt;code&gt;EDC&lt;/code&gt; and &lt;code&gt;EDL&lt;/code&gt; on
CTSS.&lt;/p&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;Sample ED session&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/ctss/ed-session.png&#34; alt=&#34;/images/ctss/ed-session.png&#34; title=&#34;/images/ctss/ed-session.png&#34;/&gt;
&lt;em&gt;A sample session using EDL, changing two lines in a file.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Historical editors on CTSS
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The first disk-based text editor on CTSS was invoked by either of the
commands &lt;code&gt;INPUT&lt;/code&gt; and &lt;code&gt;EDIT&lt;/code&gt;, the first creating a new file for
insertion and editing, and the second for editing an existing one.
These worked only on card image files and would automatically number
the sequence iDs for you. Actions were limited to entering text and
either replacing or deleting the contents of a card/line by referring
to its sequence number.&lt;/p&gt;
&lt;p&gt;
A more advanced, context aware editor called &lt;code&gt;ED&lt;/code&gt; was introduced
later, based on concepts and commands introduced in the &lt;code&gt;TYPSET&lt;/code&gt; text
processing system (which we will look at it a later post).&lt;/p&gt;
&lt;p&gt;
None of these editors are available on the CTSS we have today,
However, we do have two editors which were developed after &lt;code&gt;ED&lt;/code&gt; with a
similar interface, &lt;code&gt;EDC&lt;/code&gt; for card image files and &lt;code&gt;EDL&lt;/code&gt; for line
marked files.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Invoking
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There are different commands for card image (&lt;code&gt;EDC&lt;/code&gt;) and line marked
(&lt;code&gt;EDL&lt;/code&gt;) files and you need to select the correct one based on the file
you are editing. See &lt;a href=&#34;https://timereshared.com/ctss-files-and-directories/&#34;&gt;Files and Directories&lt;/a&gt; for a discussion of the two
formats; if you are looking at an existing file and are not sure of
the format, try running &lt;code&gt;P&lt;/code&gt; on it: if it shows sequence numbers, use
&lt;code&gt;EDC&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Invoke the editor by giving the name of the file you want to work on,
eg &lt;code&gt;EDL HELLO MAD&lt;/code&gt;. If the file does not exist, it will create it.&lt;/p&gt;
&lt;p&gt;
If you have interrupted a previous editing session you may see a
message like &lt;code&gt;Old file (INPUT     5 --Do you wish to delete it?&lt;/code&gt;; it&amp;#39;s
safe to reply yes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Input and Edit mode
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The editors have two modes, &lt;strong&gt;input&lt;/strong&gt; where you can type lines and
&lt;strong&gt;edit&lt;/strong&gt; where you can give commands. New files being edited will start
up in input mode, existing files in edit mode. Press Enter at the
start of a new line to switch between the two.&lt;/p&gt;
&lt;p&gt;
Edit mode commands have a long form and an abbreviation which we will
show in brackets in the discussion below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Getting in and out
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
In edit mode, typing &lt;code&gt;file&lt;/code&gt; (&lt;code&gt;fl&lt;/code&gt;) will save the file and exit the editor.
Giving a parameter will save it under a new name.&lt;/p&gt;
&lt;p&gt;
The &lt;code&gt;quit&lt;/code&gt; (&lt;code&gt;q&lt;/code&gt;) command will exit without saving.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Example: creating a new file
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Here&amp;#39;s what this looks like when I edit a new file, add text and then
save and exit:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
edl try mad
W 1847.7
 FILE    TRY   MAD NOT FOUND.
Input:                       
	PRINT COMMENT $HELLO FROM ED$
	END OF PROGRAM

Edit:
file 
*
R .016+.016
&lt;/pre&gt;
&lt;p&gt;
Note the blanks at the start of the &lt;code&gt;PRINT&lt;/code&gt; and &lt;code&gt;END&lt;/code&gt; program lines;
these were introduced by pressing Tab. &lt;code&gt;ED&lt;/code&gt; knows the correct
indentation for the languages used on CTSS.&lt;/p&gt;
&lt;p&gt;
The blank line after &lt;code&gt;END OF PROGRAM&lt;/code&gt; tells &lt;code&gt;ED&lt;/code&gt; to go to Edit mode,
after which I give the &lt;code&gt;file&lt;/code&gt; command to return to the command level.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Moving around
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The editor maintains an internal pointer on which line it is on in the
file.    &lt;/p&gt;
&lt;p&gt;
The command &lt;code&gt;top&lt;/code&gt; (&lt;code&gt;t&lt;/code&gt;) and &lt;code&gt;bottom&lt;/code&gt; (&lt;code&gt;b&lt;/code&gt;) move to the start and end
of the file. &lt;code&gt;next&lt;/code&gt; (&lt;code&gt;n&lt;/code&gt;) will move one line down, or you can give it
a numeric parameter to move down a certain number of lines.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;locate&lt;/code&gt; (&lt;code&gt;l&lt;/code&gt;) takes a string as a parameter and finds the first line
starting at the pointer where the string matches. It will print the
line if found and move the pointer, otherwise it will print an error
message.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Printing text
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Type &lt;code&gt;print&lt;/code&gt; (&lt;code&gt;p&lt;/code&gt;) to show the current line you are on. You can give
this a numeric argument to print more than one line.&lt;/p&gt;
&lt;p&gt;
A simple way to print the whole file is to move to the top with &lt;code&gt;t&lt;/code&gt;
and then typing something like &lt;code&gt;p 1000&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Changing text
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Pressing Enter while in edit mode will switch you to input mode. Type
lines of text, which will be inserted after the current line pointer,
and then type Enter at the start of a new line to return to edit mode.&lt;/p&gt;
&lt;p&gt;
While in edit mode, use the command &lt;code&gt;insert&lt;/code&gt; (&lt;code&gt;i&lt;/code&gt;) followed by a line
of text (ie without pressing enter before the text) to insert a single
line and remain in edit mode.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;retype&lt;/code&gt; (&lt;code&gt;r&lt;/code&gt;) followed by a line of text will replace all of the
current line. &lt;code&gt;delete&lt;/code&gt; (&lt;code&gt;d&lt;/code&gt;) will delete it.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;change&lt;/code&gt; (&lt;code&gt;c&lt;/code&gt;) will replace parts of the line by matching text. An
example that will replace the word &amp;#34;from&amp;#34; with &amp;#34;to&amp;#34; on the current line.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
c /from/to/
&lt;/pre&gt;
&lt;p&gt;
The &lt;code&gt;/&lt;/code&gt; are delimiters and can be replaced with any character that is
not in the search or replace text.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;change&lt;/code&gt; takes two parameters: number of lines and &lt;code&gt;g&lt;/code&gt;. The first
specifies how many lines to search forwards and do replacements. The
second is a flag meaning global, if set it will replace all instances
of the from text on each line.&lt;/p&gt;
&lt;p&gt;
So to replace every instance of &amp;#34;before&amp;#34; to &amp;#34;after&amp;#34; in the whole file
you could do:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
c QbeforeQafterQ 1000 g
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-9&#34;&gt;
&lt;code&gt;EDC&lt;/code&gt; and sequence numbers
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;code&gt;EDC&lt;/code&gt; has special handling for card sequence numbers, which normally
occur in columns 76-80. &lt;/p&gt;
&lt;p&gt;
The &lt;code&gt;ncols&lt;/code&gt; (&lt;code&gt;nc&lt;/code&gt;) command determine how many columns are available for non
sequence number text, and is normally set to 72.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;serial&lt;/code&gt; (&lt;code&gt;sr&lt;/code&gt;) normally takes two parameters, &lt;em&gt;m&lt;/em&gt; and &lt;em&gt;n&lt;/em&gt;, indicating the
start sequence number and the increment. Normally these are both set
to 10, so you will get sequence numbers 00010, 00020 etc. &lt;code&gt;serial off&lt;/code&gt;
will turn off sequence number generation; this can be restored with
&lt;code&gt;serial on&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Note the &lt;code&gt;EDC&lt;/code&gt; will automatically resequence the numbers in an
existing file unless you specify &lt;code&gt;serial off&lt;/code&gt; before you start.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
Command summary
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Short&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;bottom&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;Move to bottom of file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;change&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Change a line based on text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delete&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;Delete the current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;file&lt;/td&gt;
&lt;td&gt;f&lt;/td&gt;
&lt;td&gt;Save and exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;insert&lt;/td&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;Insert a line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;locate&lt;/td&gt;
&lt;td&gt;l&lt;/td&gt;
&lt;td&gt;Find a line based on text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ncols&lt;/td&gt;
&lt;td&gt;nc&lt;/td&gt;
&lt;td&gt;(EDC) Set columns to use for text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;next&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Move down one or more lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;print&lt;/td&gt;
&lt;td&gt;p&lt;/td&gt;
&lt;td&gt;Print lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;quit&lt;/td&gt;
&lt;td&gt;q&lt;/td&gt;
&lt;td&gt;Exit without saving&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;retype&lt;/td&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;td&gt;Replace a line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serial&lt;/td&gt;
&lt;td&gt;sr&lt;/td&gt;
&lt;td&gt;(EDC) Set sequence numbering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tabset&lt;/td&gt;
&lt;td&gt;ts&lt;/td&gt;
&lt;td&gt;(EDC) Set tab stops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;top&lt;/td&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;td&gt;Move to top of file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-11&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-11&#34;&gt;
Further details
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-11&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
See the CTSS &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt; p333 for the common set of &lt;code&gt;ED&lt;/code&gt;
commands and then p351 and p372 for adjustments made to &lt;code&gt;EDL&lt;/code&gt; and
&lt;code&gt;EDC&lt;/code&gt; respectively.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-12&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-12&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-12&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: Getting data in and out</title>
      <link>https://timereshared.com/ctss-getting-data-in-and-out/</link>
      <pubDate>Sun, 23 Feb 2025 09:06:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-getting-data-in-and-out/</guid>
      <description>
&lt;p&gt;
There are two approaches to getting data in and out of CTSS - one
involves using the contemporary tools of the operating system, the
other is to use facilities provided by the s709 emulator. We&amp;#39;ll look
at both, but first we need to understand what I/O meant when CTSS
was originally running.&lt;/p&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;IBM 029 Card Punch Montage&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/ctss/ibm-029-card-punch-montage.jpg&#34; alt=&#34;/images/ctss/ibm-029-card-punch-montage.jpg&#34; title=&#34;/images/ctss/ibm-029-card-punch-montage.jpg&#34;/&gt;
&lt;em&gt;Using the IBM 029 Card Punch. Source: &lt;a href=&#34;https://deepblue.lib.umich.edu/handle/2027.42/79594&#34;&gt;deepblue&lt;/a&gt;. Copyright: Board of Regents, University of Michigan.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Data interchange in the 1960s
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
At the time there were basically three media that could be used.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Printed paper&lt;/strong&gt; - as typewriters were used as consoles, a printed
record of what you were doing would be created automatically. But the
print quality was not great, and it would also be slow to print a
large file. So computer facilities like MIT offered ways to print on a
faster and better quality printer.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Punched cards&lt;/strong&gt; can be used for both input and output of programs and
data. A user could punch a set of cards offline on a dedicated key
punch (see image above), and get them loaded into the system. They
could also get the computer to punch out cards and use the resulting
deck as a backup or a way to transfer the data to another computer. At
roughly a line of 80 characters per card, this only made sense with
relatively small amounts of data; they were also slow to read.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Magnetic tapes&lt;/strong&gt; was the choice for large amounts of data needed to be
backed up or transferred elsewhere, but these were more expensive.
Although operators and system programmers would use tape regularly, I
believe end users would be less likely to use tape, at least at the
time of CTSS.&lt;/p&gt;
&lt;p&gt;
(One further option was &lt;strong&gt;paper tape&lt;/strong&gt;, but I believe this was used on
smaller computers like the PDP-1.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Mapping this to emulated systems
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Card punches and magnetic tape drives are things you are very
unlikely to have access to today - even printers are getting more
scarce - so how does this work with an emulated system?&lt;/p&gt;
&lt;p&gt;
Put simply, it maps to files on your host system. Printer output goes
to a single text file. Cards and tape map to binary files whose format
is determined by the emulator, which provides tools to convert them to
PC readable data at the cost of losing the original format.&lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s look at some ways we can use to do data interchange, starting
with facilities provided by CTSS.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Printing and punching files via &lt;code&gt;RQUEST&lt;/code&gt;
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
On the real 7094, printing and card punching was not done online due
to the CPU load it would place on the system. Instead, users could
request files to be printed and punched. Several times a day, the CTSS
operators would collect the files on to a tape and bring this to a
smaller system for printing and punching, and then distribute the
results to users. The command to initiate this on CTSS was &lt;code&gt;RQUEST&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
We can use this facility with the emulator as well.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;While online, type &lt;code&gt;RQUEST PRINT name1 name2&lt;/code&gt; to request printing
of file &lt;code&gt;name1 name2&lt;/code&gt; or &lt;code&gt;RQUEST DPUNCH name1 name2&lt;/code&gt; to request
punching. Wildcards are OK, so you could type &lt;code&gt;RQUEST PRINT * BCD&lt;/code&gt;
to produce a print out of all compile listings.&lt;/li&gt;
&lt;li&gt;Shut down CTSS&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;dskedtctss&lt;/code&gt; on your host&lt;/li&gt;
&lt;li&gt;You will need to press Enter a few times and then `q` when done.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you are running the ELIZA version of ctss-kit, all printer output
will be in &lt;code&gt;output/sysprint.txt&lt;/code&gt; and each punched file will be a
separate file based on the original filename in &lt;code&gt;output&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
For the upstream version of ctss-kit, you will need to convert the
output tapes produced by &lt;code&gt;dskedtctss&lt;/code&gt; as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Printouts&lt;/strong&gt;: Run &lt;code&gt;bcd2txt -p sysprint.bcd sysprint.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Punches&lt;/strong&gt;: Run  &lt;code&gt;punchctss syspunchid.bcd syspunch.bcd .&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Downloading files via the emulator
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
We can use a utility provided by s709 called &lt;code&gt;extractctss&lt;/code&gt; to get
files from inside CTSS to your host machine. Usage is:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
extractctss file-type name1 name2 prob prog local-file
&lt;/pre&gt;
&lt;p&gt;
&lt;code&gt;file-type&lt;/code&gt; should be &lt;code&gt;t&lt;/code&gt; for card image files and &lt;code&gt;l&lt;/code&gt; for listings.&lt;/p&gt;
&lt;p&gt;
Note that the CTSS system should be shut down when you do this.&lt;/p&gt;
&lt;p&gt;
A sample run to get the HELLO MAD source file from the guest user:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
extractctss t hello mad m1416 guest hello.mad
&lt;/pre&gt;
&lt;p&gt;
This will produce &lt;code&gt;hello.mad&lt;/code&gt; in your current directory.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;extractctss&lt;/code&gt; can also download several files in batch mode; see the
ctss-kit README for more details&lt;/p&gt;
&lt;p&gt;
Should you use &lt;code&gt;RQUEST&lt;/code&gt; or &lt;code&gt;extractctss&lt;/code&gt;? I use both and think
&lt;code&gt;RQUEST&lt;/code&gt; is useful when you are logged into CTSS, looking at files and
picking several to print or punch. &lt;code&gt;extractctss&lt;/code&gt; is great for
automated downloading.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Uploading files via the emulator
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
You can also go the other way, uploading files from your host machine
to CTSS. This is a two step process.&lt;/p&gt;
&lt;p&gt;
First, convert the file into a tape format readable by the upload
program using &lt;code&gt;obj2img&lt;/code&gt;. Here&amp;#39;s an example to prepare &lt;code&gt;upload.mad&lt;/code&gt; to
become file &lt;code&gt;UPLOAD MAD&lt;/code&gt; on the guest account:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
obj2img -a &amp;#34; M1416GUEST &amp;#34; -f upload -e mad -t -o upload.img upload.mad
&lt;/pre&gt;
&lt;p&gt;
The &lt;code&gt;-a&lt;/code&gt; flag determines the account to send it to; the problem number
(&lt;code&gt;M1416&lt;/code&gt;) must be right justified into 6 characters, and the
programmer number (&lt;code&gt;GUEST&lt;/code&gt;) must be left justified. Both must be in
capital letters.&lt;/p&gt;
&lt;p&gt;
The &lt;code&gt;-f&lt;/code&gt; and &lt;code&gt;-e&lt;/code&gt; flags determine the &lt;em&gt;name1&lt;/em&gt; and &lt;em&gt;name2&lt;/em&gt; of the file
on CTSS.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;-t&lt;/code&gt; specifies card image format; &lt;code&gt;obj2img&lt;/code&gt; can also do line marked,
binary files and other special formats. See &lt;code&gt;obj2img -h&lt;/code&gt; for options.&lt;/p&gt;
&lt;p&gt;
Second, to get this image file loaded into CTSS, run &lt;code&gt;setupctss&lt;/code&gt; as follows:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
setupctss upload.img 

IBM 7094-CTSS Simulator 2.4.3


 ATTACHING TO  M1416 GUEST                                              
 COPY TO TEXT FILE UPLOAD    MAD                                        
 DISK INITIALIZATION COMPLETE.                                          
 CTSS IS FINISHED. YOU MAY NOW CLEAR CORE.
&lt;/pre&gt;
&lt;p&gt;
You can then remove the &lt;code&gt;.img&lt;/code&gt; file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Areas to explore
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The Disk Editor on the real CTSS system also allowed you to upload
files by giving the operators a card deck, but I don&amp;#39;t believe this is
supported on the s709 virtual system.&lt;/p&gt;
&lt;p&gt;
CTSS provided a number of tape handling commands so you could &lt;code&gt;MOUNT&lt;/code&gt;
a tape and then associate files on there with entries in a UFD to it
can read/written. These commands are available, but are not fully
supported by s709 I believe.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: Commands</title>
      <link>https://timereshared.com/ctss-commands/</link>
      <pubDate>Sun, 16 Feb 2025 09:16:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-commands/</guid>
      <description>
&lt;p&gt;
In this post we&amp;#39;ll run through what commands are available on CTSS.
This is based on the The CTSS &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt; section AH, but is
reordered here for simplicity. A page reference to the PDF is given
for each command.&lt;/p&gt;
&lt;p&gt;
This does not cover programming languages, loading and debugging
facilities; these will be covered in a &lt;a href=&#34;https://timereshared.com/ctss-programming/&#34;&gt;later post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
In some cases a command is described in the guide but is not available
on the emulated systems, which is shown using &lt;del&gt;strike through&lt;/del&gt;. This
is because the CTSS we have today was reconstructed from a listing
tape which does not include every command that was present then. &lt;/p&gt;
&lt;p width=&#34;60%&#34; height=&#34;60%&#34; title=&#34;CTSS Programmer&amp;#39;s Guide&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/ctss/ctss-programmers-guide.png&#34; alt=&#34;/images/ctss/ctss-programmers-guide.png&#34; title=&#34;/images/ctss/ctss-programmers-guide.png&#34;/&gt;
&lt;em&gt;The CTSS Programmer&amp;#39;s Guide with its &amp;#34;candy stripe&amp;#34; cover.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Logging in/out
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LOGIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Login to the system&lt;/td&gt;
&lt;td&gt;p282&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LOGOUT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Log out&lt;/td&gt;
&lt;td&gt;p286&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TTPEEK&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show quotas&lt;/td&gt;
&lt;td&gt;p290&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DIAL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Attach a remote terminal&lt;/td&gt;
&lt;td&gt;p291&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HELLO&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print system message&lt;/td&gt;
&lt;td&gt;p292&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SUBSYS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restrict interactive environment&lt;/td&gt;
&lt;td&gt;p532&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OPTION&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set subsystem options&lt;/td&gt;
&lt;td&gt;p538&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WHO&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prints who is online&lt;/td&gt;
&lt;td&gt;p544&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;code&gt;LOGIN&lt;/code&gt; is the only command available when you first connect to CTSS.
It is also treated as a user level command so you can use it to switch
accounts when logged in.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;TTPEEK&lt;/code&gt; will show how much CPU time and disk space you have used. A
quota for this was established when a user ID was created.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;DIAL&lt;/code&gt; allows a non logged in terminal to be associated with a logged
in session. Once associated it can be used by programs on the logged
in session to send and receive text, but cannot run commands directly.
However none of the existing commands on CTSS use this facility.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;HELLO&lt;/code&gt; gives a simple system summary similar to what you see at
login.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;SUBSYS&lt;/code&gt; and &lt;code&gt;OPTION&lt;/code&gt; restrict what type of operations can be done. It
seems to be intended as a way for a login to be used to run a specific
interactive program rather than issue general commands. These are
selected by the user and can be changed so it is not a security
mechanism.&lt;/p&gt;
&lt;p&gt;
A sample of &lt;code&gt;WHO&lt;/code&gt; output:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
who
W 1815.0
        
MIT8C0 STARTED AT 1127.2 02/15.
                               
 2  USERS AT  1815.0 02/15.
                           
LINE   USER     NAME  GRP UNIT  TUSED TIMEON
 1 C0056 99995 FIBMON  0 (FIB)     .0 1127.2 02/15
 3 M1416    10  ELIZA  1 700000    .0 1815.0      
                                            
R .016+.016
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
File management
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CHMODE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Change the permissions on a file&lt;/td&gt;
&lt;td&gt;p406&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete a file&lt;/td&gt;
&lt;td&gt;p406&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LINK&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Make a link to a file&lt;/td&gt;
&lt;td&gt;p345&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MOVE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copy a file within the same UFD&lt;/td&gt;
&lt;td&gt;p370&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PERMIT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Grant access to another user&lt;/td&gt;
&lt;td&gt;p345&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RENAME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rename a file&lt;/td&gt;
&lt;td&gt;p406&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REVOKE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove link access to a file&lt;/td&gt;
&lt;td&gt;p345&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UNLINK&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove a link to a file&lt;/td&gt;
&lt;td&gt;p345&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;CALL&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;System call wrapper&lt;/td&gt;
&lt;td&gt;p415&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
These have been discussed in the post &lt;a href=&#34;https://timereshared.com/ctss-files-and-directories/&#34;&gt;Files and directories&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
The exception is &lt;code&gt;CALL&lt;/code&gt;, which is a thin wrapper around several system
calls. For example to delete a file &lt;code&gt;A MAD&lt;/code&gt; you could use &lt;code&gt;CALL DELFIL
A MAD&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Show file contents
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quickly print a file in an appropriate format&lt;/td&gt;
&lt;td&gt;p400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PRINT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Type a text file to the console&lt;/td&gt;
&lt;td&gt;p393&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PRBIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dump a file in octal&lt;/td&gt;
&lt;td&gt;p395&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PRBSS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print details of a BSS file to the console&lt;/td&gt;
&lt;td&gt;p397&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SDUMP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print a summary of a SAVED file to teh console&lt;/td&gt;
&lt;td&gt;p398&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;PRINTA&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Print an ASCII file to the console&lt;/td&gt;
&lt;td&gt;p399&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;PRINTF&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Print a card image file to the console&lt;/td&gt;
&lt;td&gt;p392&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;code&gt;P&lt;/code&gt; is a good choice to view any type of text file. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Editing
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;ED&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Older card image file editor&lt;/td&gt;
&lt;td&gt;p333&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EDC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Card image file editor&lt;/td&gt;
&lt;td&gt;p372&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EDL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Line marked file editor&lt;/td&gt;
&lt;td&gt;p351&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;EDB&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Binary file editor&lt;/td&gt;
&lt;td&gt;p352&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;EDA&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;ASCII file editor&lt;/td&gt;
&lt;td&gt;p369&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;QED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Programmable editor&lt;/td&gt;
&lt;td&gt;p353&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
These are all line-orientated editors. The &lt;code&gt;ED&lt;/code&gt; family shares a very
similar command set, documented on the &lt;code&gt;ED&lt;/code&gt; page. &lt;code&gt;QED&lt;/code&gt; is a more
sophisticated editor allowing multiple buffers; it was created by Ken
Thompson of Unix fame. I go into more details in the articles &lt;a href=&#34;https://timereshared.com/ctss-ed-and-friends&#34;&gt;on
EDC/EDL&lt;/a&gt; and &lt;a href=&#34;https://timereshared.com/ctss-qed-editor/&#34;&gt;QED&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
File transformation
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SQUASH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Convert card image to line-marked&lt;/td&gt;
&lt;td&gt;p379&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;XPAND&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Convert line-marked to card image&lt;/td&gt;
&lt;td&gt;p379&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;CRUNCH&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Compress/uncompress BCD files&lt;/td&gt;
&lt;td&gt;p377&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;SQZBSS&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Compress BSS files&lt;/td&gt;
&lt;td&gt;p381&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;PADBSS&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Uncompress BSS files&lt;/td&gt;
&lt;td&gt;p381&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ARCHIV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Archive several files into one&lt;/td&gt;
&lt;td&gt;p374&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;APENDA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Append to an archive&lt;/td&gt;
&lt;td&gt;p383&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;AARCHV&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Version of &lt;code&gt;ARCGIV&lt;/code&gt; for ASCII files&lt;/td&gt;
&lt;td&gt;p382&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;APND&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Append a file&lt;/td&gt;
&lt;td&gt;p370&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;APEND&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Append several files&lt;/td&gt;
&lt;td&gt;p420&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COMBIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Combine several files&lt;/td&gt;
&lt;td&gt;p402&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SPLIT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Spliu a file into several&lt;/td&gt;
&lt;td&gt;p404&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
These exist to translate between text formats and to save space.&lt;/p&gt;
&lt;p&gt;
We looked at &lt;code&gt;SQUASH&lt;/code&gt; and &lt;code&gt;XPAND&lt;/code&gt; in the post &lt;a href=&#34;https://timereshared.com/ctss-files-and-directories/&#34;&gt;Files and directories&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;CRUNCH&lt;/code&gt; was used with the &lt;code&gt;BEFAP&lt;/code&gt; assembler which is also not
available.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;SQZBSS&lt;/code&gt; and &lt;code&gt;PADBSS&lt;/code&gt; works on BSS object files by removing card
sequence numbers and compressing sequences of zero value words.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;ARCHIV&lt;/code&gt; is reminiscent of Unix &lt;code&gt;tar&lt;/code&gt;, bundling a number of files into
a single file so it takes up less space (both in terms of disk and
entries in the directory) and can be un-archived later. Its first
argument is a command like &lt;code&gt;C&lt;/code&gt; for create and &lt;code&gt;X&lt;/code&gt; for extract, also
implying that &lt;code&gt;tar&lt;/code&gt; was modelled on this. The semantics were a bit
different as it generally worked on files with the same &lt;em&gt;name2&lt;/em&gt;. For
example, if you wanted to archive files &lt;code&gt;A MAD&lt;/code&gt; &lt;code&gt;B MAD&lt;/code&gt; and &lt;code&gt;C MAD&lt;/code&gt;
into an archive &lt;code&gt;ARC MAD&lt;/code&gt; you would type &lt;code&gt;archiv arc mad a b c&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;APND&lt;/code&gt; is used as follows:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
APND sub mad main mad
&lt;/pre&gt;
&lt;p&gt;
which will append a copy of &lt;code&gt;SUB MAD&lt;/code&gt; to the end of &lt;code&gt;MAIN mAD&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;APEND&lt;/code&gt; is similar but takes multiple files as input and writes to the
first file as output, so to get &lt;code&gt;SUB1 MAD&lt;/code&gt; and &lt;code&gt;SUB2 MAD&lt;/code&gt; appended to
&lt;code&gt;MAIN MAD&lt;/code&gt; you would do:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
APEND main mad sub1 mad sub2 mad
&lt;/pre&gt;
&lt;p&gt;
&lt;code&gt;COMBIN&lt;/code&gt; is useful for card image files as it can adjust the seqeunce
numbers of the combined file to make them contiguous. It is also used
to create a libary from several BSS files.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Directory management
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LISTF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print files in a directory&lt;/td&gt;
&lt;td&gt;p384&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ATTACH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Change to another user&amp;#39;s directory&lt;/td&gt;
&lt;td&gt;p419&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COMFIL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Change to a common file directory&lt;/td&gt;
&lt;td&gt;p408&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copy a file from a common file directory&lt;/td&gt;
&lt;td&gt;p409&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UPDATE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copy a file to a common file directory&lt;/td&gt;
&lt;td&gt;p409&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
We looked at these in the post &lt;a href=&#34;https://timereshared.com/ctss-files-and-directories/&#34;&gt;Files and directories&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Command execution
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RUNCOM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run a sequence of commands&lt;/td&gt;
&lt;td&gt;p526&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;SAVFIL&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Save a runcom file execution status&lt;/td&gt;
&lt;td&gt;p343&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;RERUN&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Restart from a &lt;code&gt;SAVFIL&lt;/code&gt; file&lt;/td&gt;
&lt;td&gt;p343&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FIB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Submit a backgroud job&lt;/td&gt;
&lt;td&gt;p287&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DELFIB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete a background job&lt;/td&gt;
&lt;td&gt;p287&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PRFIB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print pending background jobs&lt;/td&gt;
&lt;td&gt;p287&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;GENCOM&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Supply non printable args to a command&lt;/td&gt;
&lt;td&gt;p531&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;ECHO&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Prints command before running it&lt;/td&gt;
&lt;td&gt;p546&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;YES&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Like &lt;code&gt;ECHO&lt;/code&gt; but prompts first&lt;/td&gt;
&lt;td&gt;p550&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;WAIT&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Like &lt;code&gt;ECHO&lt;/code&gt; but sleeps first&lt;/td&gt;
&lt;td&gt;p551&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;TIME&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Like &lt;code&gt;ECHO&lt;/code&gt; but prints time first&lt;/td&gt;
&lt;td&gt;p552&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Command interface&lt;/td&gt;
&lt;td&gt;p328&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WRITE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Send chat messages&lt;/td&gt;
&lt;td&gt;p328&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;code&gt;RUNCOM&lt;/code&gt; will run a series of commands stored in a file.&lt;/p&gt;
&lt;p&gt;
The &lt;code&gt;FIB&lt;/code&gt; commands allow you to queue a job to be run the next time
you are logged out.&lt;/p&gt;
&lt;p&gt;
Both of these will be discussed in a &lt;a href=&#34;https://timereshared.com/ctss-runcom-and-fib-scripting-and-background-jobs/&#34;&gt;later post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;ECHO&lt;/code&gt; is like the Unix shell &lt;code&gt;set -x&lt;/code&gt; in that it prints its arguments
and then executes them as a command. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Input/Output
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RQUEST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Request printing or punching&lt;/td&gt;
&lt;td&gt;p412&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;RQASCI&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Request offline ASCII printing&lt;/td&gt;
&lt;td&gt;p421&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MOUNT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Request a tape to be mounted&lt;/td&gt;
&lt;td&gt;p348&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UMOUNT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Request a tape to be unmounted&lt;/td&gt;
&lt;td&gt;p348&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VERIFY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read the label on a tape&lt;/td&gt;
&lt;td&gt;p348&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LABEL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set the label on a tape&lt;/td&gt;
&lt;td&gt;p348&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TAPFIL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add a file to a tape&lt;/td&gt;
&lt;td&gt;p348&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
We&amp;#39;ll look at these in the &lt;a href=&#34;https://timereshared.com/ctss-getting-data-in-and-out/&#34;&gt;next post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-9&#34;&gt;
Text processing and email
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-3&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TYPSET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a formatted text file&lt;/td&gt;
&lt;td&gt;p504&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RUNOFF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print a &lt;code&gt;TYPSET&lt;/code&gt; file&lt;/td&gt;
&lt;td&gt;p504&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;ROFF&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Print an ASCII memo file&lt;/td&gt;
&lt;td&gt;p523&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;PINFO&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Print information files&lt;/td&gt;
&lt;td&gt;p525&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAIL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Send a message to another user&lt;/td&gt;
&lt;td&gt;p521&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;code&gt;PINFO&lt;/code&gt; appears to be like the Unix &lt;code&gt;man&lt;/code&gt; command, showing text files
about each command on the system. Both &lt;code&gt;PINFO&lt;/code&gt; and its files are not
available on the CTSS we have.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
Miscellaneous
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
None of these commands are available on the CTSS we have today. Most
deal with typewriter control.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;PRINTER&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Print error diagnostics&lt;/td&gt;
&lt;td&gt;p542&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;PERROR&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Explains error codes&lt;/td&gt;
&lt;td&gt;p553&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;SPACE&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Insert blank lines&lt;/td&gt;
&lt;td&gt;p545&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;EJECT&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Eject a page&lt;/td&gt;
&lt;td&gt;p545&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;PON&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Turn typewriter printer on&lt;/td&gt;
&lt;td&gt;p548&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;POFF&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Turn typewriter printer off&lt;/td&gt;
&lt;td&gt;p548&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;RED&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Change printer ribbon colour&lt;/td&gt;
&lt;td&gt;p549&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;BLACK&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Change printer ribbon colour&lt;/td&gt;
&lt;td&gt;p549&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;OCT&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Octal to decimal conversion&lt;/td&gt;
&lt;td&gt;p547&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;DEC&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Decimal to octal conversion&lt;/td&gt;
&lt;td&gt;p547&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;del&gt;&lt;code&gt;REMARK&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;Send remarks to operators&lt;/td&gt;
&lt;td&gt;p520&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;code&gt;PRNTER&lt;/code&gt; appears to be used to debug issues communicating with a
typewriter.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;REMARK&lt;/code&gt; allows a user to send comments to the operators: these are
appended to a public file and was then printed out once a day.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-11&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-11&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-11&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;span style=&#34;text-decoration: underline;&#34;&gt;May 2025&lt;/span&gt;: Tom Van Vleck pointed out a typo in the example of using
&lt;code&gt;APND&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: Files and directories</title>
      <link>https://timereshared.com/ctss-files-and-directories/</link>
      <pubDate>Sun, 09 Feb 2025 09:07:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-files-and-directories/</guid>
      <description>
&lt;p&gt;
CTSS was not the first system to have a hard disk - that may have been
the &lt;a href=&#34;https://en.wikipedia.org/wiki/IBM_305_RAMAC&#34;&gt;IBM RAMAC&lt;/a&gt; in 1956 - but as a time-sharing system it pioneered
using the disk for online, multi-user, persistent random-access
storage for user files and programs, as opposed to using the disk as a
fast tape drive or a slow secondary memory.&lt;/p&gt;
&lt;p&gt;
Looking at its features, we can see how it evolved to match what users
wanted. For example, the original filing system only allowed one
person to read a particular file (or a directory) at a time, so there
was no easy way for a group of people to work together on a file
without taking copies of it. Features like common file directories and
links were added to support this.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/ibm-1301.jpg&#34; alt=&#34;/images/ctss/ibm-1301.jpg&#34; title=&#34;The IBM 1301 disk drive&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;The IBM 1301 disk drive. Source: IBM &lt;a href=&#34;http://bitsavers.trailing-edge.com/pdf/ibm/dasd/1301/A22-6785_1301_1302_Disk_Storage_with_IBM_7090_7094.pdf&#34;&gt;manual&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
File names and types
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
As mentioned &lt;a href=&#34;https://timereshared.com/ctss-quick-tour-s709/&#34;&gt;previously&lt;/a&gt;, each file name has two parts, with up to six
characters for each part. (Six characters as a limit comes up a lot in
CTSS, as 6 x 6 bit BCD characters would fit into a 36-bit machine
word.) The two parts of the file name (called &lt;em&gt;name1&lt;/em&gt; and &lt;em&gt;name2&lt;/em&gt;) are
separated by a space when giving them to a command.&lt;/p&gt;
&lt;p&gt;
By convention, the second part of the name indicated the file type, eg
&lt;code&gt;MAD&lt;/code&gt; for MAD source code or &lt;code&gt;BSS&lt;/code&gt; for object files.&lt;/p&gt;
&lt;p&gt;
Metadata on the file directory included the record size and the number
of records, so fixed record data files are supported.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Text files
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Text files evolved over time. Initially &lt;strong&gt;card image&lt;/strong&gt; or
&lt;strong&gt;line-numbered&lt;/strong&gt; files were used: these use 14 machine words (so 84 BCD
characters) per line. This allows interchange with punched cards, with
each card representing a line in the file. Especially at the start of
CTSS, many users would have collections of cards for their programs
and data, and would transfer from these to and from the disk. The
line-numbered name refers to the convention for punched cards of
having a sequence number in columns 73-80 so the order of cards could
be recovered if you accidentally dropped the deck on the floor.&lt;/p&gt;
&lt;p&gt;
Although easy to access specific lines, the problem with this format
is it is inefficient: a completely blank line would be represented by
14 words of space characters. &lt;strong&gt;Line-marked&lt;/strong&gt; files offered a solution,
where each line could have a variable length and the start of each
line would have a marker and its length.&lt;/p&gt;
&lt;p&gt;
Later on - I think as a byproduct of doing Multics development on
CTSS - &lt;strong&gt;ASCII&lt;/strong&gt; format files were supported, with the familiar 8 bit
encoding and variable line length. There was also support for &lt;strong&gt;12-bit&lt;/strong&gt;
BCD files which packed 3 characters into a word and allowed lower case.&lt;/p&gt;
&lt;p&gt;
It is up to each program to decide what type of files it supports. The
MAD and FAP compilers accepted both card image and line-marked files,
but some other compilers only accepted one format. For editing files,
use &lt;code&gt;EDC&lt;/code&gt; for card image and &lt;code&gt;EDL&lt;/code&gt; for line-marked.&lt;/p&gt;
&lt;p&gt;
You can convert a card image file to a line-marked one with the
&lt;code&gt;SQUASH&lt;/code&gt; command and go the other way with &lt;code&gt;XPAND&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
As an example, let&amp;#39;s look at a two-line program stored as a card image
file &lt;code&gt;HWC MAD&lt;/code&gt; and as a line-marked file &lt;code&gt;HWL MAD&lt;/code&gt;. We use &lt;code&gt;PRINT&lt;/code&gt; to
show how the two files look and &lt;code&gt;PRBIN&lt;/code&gt; to show a binary dump.&lt;/p&gt;
&lt;p&gt;
Note that &lt;code&gt;PRINT&lt;/code&gt; puts the line number at the start of the print out.
&lt;code&gt;PRBIN&lt;/code&gt; will print in octal, with each two-digit number representing a
BCD character; for example, &lt;code&gt;60&lt;/code&gt; is space and &lt;code&gt;00&lt;/code&gt; is digit 0.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
print hwc mad
W 1059.9
        
   HWC    MAD      01/11  1059.9
                                
   00010               PRINT COMMENT $HELLO, WORLD$
   00020               END OF PROGRAM              
R .016+.016                          
           
prbin hwc mad
W 1100.0
        
   HWC    MAD  01/11  1100.0
                            
     1 606060606060 606060606047 513145636023 464444254563 605330254343 467360664651
     7 432453606060 606060606060 606060606060 606060606060 606060606060 606060606060
    13 606060000000 010060606060 606060606060 606060606025 452460462660 475146275121
    19 446060606060 606060606060 606060606060 606060606060 606060606060 606060606060
    25 606060606060 606060606060 606060000000 020060606060                          

R .016+.016

print hwl mad
W 1101.7
        
   HWL    MAD      01/11  1101.7
                                
	PRINT COMMENT $HELLO, WORLD$
	END OF PROGRAM              
R .016+.016           
           
prbin hwl mad
W 1101.8
        
   HWL    MAD  01/11  1101.8
                            
     1 777777000005 724751314563 602346444425 456360533025 434346736066 465143245357
     7 777777000003 722545246046 266047514627 512144575757                          

R .000+.016
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Directories and common files
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Directories in CTSS are rooted in the single &lt;strong&gt;Master File Directory&lt;/strong&gt;
(MFD) which contains pointers to several &lt;strong&gt;User File Directories&lt;/strong&gt;
(UFD). Each user would have their own UFD named after their login
project number and name, eg &lt;code&gt;M1416 GUEST&lt;/code&gt;. It is not possible to make
sub-directories under a UFD.&lt;/p&gt;
&lt;p&gt;
You can change to another user&amp;#39;s directory with eg &lt;code&gt;ATTACH M1416
ELIZA&lt;/code&gt; and return to your own directory with just &lt;code&gt;ATTACH&lt;/code&gt;. But you
are only able to do this if the other user has given you access with
&lt;code&gt;PERMIT&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
Common files are UFDs intended for sharing. There are 5, numbered 1-5
and named &lt;code&gt;CMFL01&lt;/code&gt; to &lt;code&gt;CMFL05&lt;/code&gt;. Although you could use &lt;code&gt;ATTACH&lt;/code&gt;, the
simplest way to get to them is type &lt;code&gt;COMFIL n&lt;/code&gt; where &lt;code&gt;n&lt;/code&gt; is a number;
&lt;code&gt;0&lt;/code&gt; will return you to your own directory. On s709/ctss-kit, this is
how they are used&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&#34;align-right&#34;&gt;COMFIL&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1&lt;/td&gt;
&lt;td&gt;Supervisor object code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;2&lt;/td&gt;
&lt;td&gt;System binaries and accounting files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;3&lt;/td&gt;
&lt;td&gt;Unused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;4&lt;/td&gt;
&lt;td&gt;System libraries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;5&lt;/td&gt;
&lt;td&gt;Unused&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
You can also view other directories using &lt;code&gt;LISTF&lt;/code&gt; without changing to
them by giving parameters. Foe example, the MAD compiler is stored as
&lt;code&gt;MAD TSSDC.&lt;/code&gt; in common files 2. Here is two ways to see it.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
listf (cfl2) MAD TSSDC.
W 1122.7
        
   MAD TSSDC. 000    33 01/10/14
                                

R .016+.033
           
comfil 2
W 1122.8
R .000+.000
           
listf MAD TSSDC.
W 1122.8
        
   MAD TSSDC. 000    33 01/10/14
                                

R .016+.000
&lt;/pre&gt;
&lt;p&gt;
&lt;code&gt;COPY&lt;/code&gt; will allow you to take a copy of a file from common files to
your own UFD. Let&amp;#39;s return home and grab that binary.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
comfil 0
W 1123.9
R .016+.000
           
listf mad tssdc.
W 1124.1
        
NAMES NOT FOUND
   MAD TSSDC.  
             
R .016+.016
           
copy 2 mad tssdc.
W 1124.3
R .050+.016
           
listf mad tssdc.
W 1124.4
        
   MAD TSSDC. 000    33 01/11/14
                                

R .033+.016
&lt;/pre&gt;
&lt;p&gt;
&lt;code&gt;UPDATE&lt;/code&gt; does the same in reverse, ie copies a file from your UFD to a
common file directory.&lt;/p&gt;
&lt;p&gt;
However there is no way in general to refer to a file in another
directory, so for example if you want to &lt;code&gt;PRINT&lt;/code&gt; a file you would need
to change directory first rather than referring to a path to access
it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
File management
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;code&gt;RENAME&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; work as expected. &lt;code&gt;MOVE&lt;/code&gt; is used to copy a file
within the same UFD.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Links
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
CTSS also had a way to link a file name to another one. This is what
we&amp;#39;d call a soft link today - there is a record pointing to a file
name rather than multiple directory entries. This was often used to
make files available to other users, for example having a common file
entry point to the real file in a user&amp;#39;s UFD. Links have a maximum
depth of 2.&lt;/p&gt;
&lt;p&gt;
Permission to link must be granted via &lt;code&gt;PERMIT&lt;/code&gt;, even to link to your
own files. So to make &lt;code&gt;HELLO2 MAD&lt;/code&gt; point to &lt;code&gt;HELLO MAD&lt;/code&gt; we could do:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
permit hello mad 0 * *
W 1742.0
R .000+.016
           
link hello2 mad m1416 guest hello
W 1742.2
R .000+.016
           
listf
W 1742.3
        
    10 FILES    14 RECORDS
 NAME1  NAME2 MOD NOREC   USED
PERMIT   FILE 120     1 01/11/14
 HELLO    MAD 000     1
  [...] 
                       
HELLO2    MAD 000  M1416 GUEST   HELLO
                                      
R .016+.016
&lt;/pre&gt;
&lt;p&gt;
Note &lt;code&gt;PERMIT&lt;/code&gt; saves permissions to &lt;code&gt;PERMIT FILE&lt;/code&gt; rather than using
file metadata, and that the new link file is displayed at the end of
&lt;code&gt;LISTF&lt;/code&gt; output in a special format.&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;UNLINK&lt;/code&gt; can be used to remove a link file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Permissions
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
You can see the permissions field in the MOD column of the &lt;code&gt;LISTF&lt;/code&gt;
output above. Like Unix there are three octal digits that can be
OR-ed together but the meaning is different&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Temporary - file will be removed after next read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Secondary - file is being backed up and will be removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-1-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Write-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-2-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Private - file can only be referenced by its owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1--&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Protected - permissions can only be changed by its owner ted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
The effect of making a file both read- and write- only seems to be
neither is permitted.&lt;/p&gt;
&lt;p&gt;
Permissions to delete a file come from whether it can be written to or
not.&lt;/p&gt;
&lt;p&gt;
The command to change permissions is &lt;code&gt;CHMODE&lt;/code&gt; which takes the file
names first and then the new mode at the end.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Further reading
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The CTSS &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt; section AD discusses how the file system
works, and sections AH.3 - 6 have further details on the commands
mentioned in this post.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>The CTSS supervisor</title>
      <link>https://timereshared.com/ctss-supervisor/</link>
      <pubDate>Sun, 02 Feb 2025 09:03:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-supervisor/</guid>
      <description>
&lt;p&gt;
The supervisor is at the heart of the CTSS system and operates
similarly to what we&amp;#39;d call a kernel today. Let&amp;#39;s look at each of its
functions, comparing them to modern systems to get a feel of what is
different.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Hardware
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p width=&#34;100%&#34; height=&#34;100%&#34; title=&#34;CTSS Hardware Diagram&#34;&gt;&lt;img src=&#34;https://timereshared.com/images/ctss/ctss-hardware-diagram.png&#34; alt=&#34;/images/ctss/ctss-hardware-diagram.png&#34; title=&#34;/images/ctss/ctss-hardware-diagram.png&#34;/&gt;
&lt;em&gt;Diagram of CTSS hardware. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
The hardware controlled by CTSS changed over its lifespan. This is the
setup that matches the CTSS source code used in the emulator. Most I/O
work was done by channel controllers which offloads some of the work
from the CPU. Each channel can have up to 10 devices connected to it.
User programs cannot access components directly, they need to go
through supervisor services.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Memory
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There are two separate 32kW banks of memory, known as Core Memory A
and B. Note each word is 36 bits, so that&amp;#39;s the equivalent of around
147 kilobytes in each bank. As the 7094 can only address 32kW at a
time, these are switched between as needed. The supervisor sits in
Core A at all times. User programs are brought into Core B as
requested by the user, and may be swapped out to drum or disk as CTSS
schedules other tasks to run. The maximum memory available to a task
is 32kW and there is no concept of virtual memory; however several
smaller tasks can be in memory at the same time.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Tasks
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
A fixed maximum number of users can be logged in at any time (30 is
the limit on the emulated system). Each user can only have one task
active, so could not login twice simultaneously or create (fork) a new
task while an existing one is running.&lt;/p&gt;
&lt;p&gt;
There is no equivalent to a shell as a separate user program. Logged
in users type in commands which are processed by the supervisor.
Commands and their parameters can each be up to 6 characters long.
Commands can be either system programs (eg &lt;code&gt;LISTF&lt;/code&gt;) or user created
programs and are treated the same way: the supervisor will load the
program into core B and transfer to it. Once a task is completed,
control is returned to the supervisor.&lt;/p&gt;
&lt;p&gt;
Each task can be in a particular state, such as working, waiting for
I/O etc. Two special states refer to the task after it is completed:
&lt;strong&gt;dormant&lt;/strong&gt; means the program has finished but is still in core so can
be restarted or the machine state analysed. &lt;strong&gt;Dead&lt;/strong&gt; means the program
is out of core. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Scheduling
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The scheduling algorithm for CTSS evolved over time as experience was
gained using the system. As of the later system it had nine priority
queues, ordered so that smaller or newer tasks would get a small
amount of CPU time quickly, and longer running tasks would run less
frequently but get more CPU time when it was being run.&lt;/p&gt;
&lt;p&gt;
It is also possible to run background tasks at a lower priority. This
included jobs submitted by users from the online system (called FIB
jobs) as well as non-time-sharing aware jobs, such as batch or
standalone 7090 programs. This ability to run pre-CTSS jobs explains
the &amp;#39;Compatible&amp;#39; in the OS&amp;#39;s name.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Protection
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
CTSS applies relocation to each task so it can be placed anywhere in
memory without the task being aware of its physical position. The
system also keeps track of what areas of memory the program is using,
so any access outside of there leads to a protection violation and the
program being terminated.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Further reading
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The original &lt;a href=&#34;https://dl.acm.org/doi/10.1145/1460833.1460871&#34;&gt;paper&lt;/a&gt; by Fernando Corbato is available at the ACM. It
describes an earlier version of the system we have today, but also
includes information on why the system was developed.&lt;/p&gt;
&lt;p&gt;
The &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;CTSS Programmer&amp;#39;s Guide&lt;/a&gt; section AA gives more detail on the
supervisor.&lt;/p&gt;
&lt;p&gt;
Bob Supnik&amp;#39;s &lt;a href=&#34;https://simh.trailing-edge.com/docs/ctss_hardware.pdf&#34;&gt;analysis&lt;/a&gt; of CTSS hardware was also useful in
understanding how CTSS worked and is emulated.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Early software on the IBM 7x</title>
      <link>https://timereshared.com/ibm-7x-early-software/</link>
      <pubDate>Sun, 26 Jan 2025 09:01:00 +0900</pubDate>
      <guid>https://timereshared.com/ibm-7x-early-software/</guid>
      <description>
&lt;p&gt;
In the beginning, there was nothing. At the launch of the 701 in 1952,
IBM would happily sell (or rent) you a computer, but it came with no
operating system and no high-level compilers, as these did not exist
yet. What you had was machine code and some early assemblers.&lt;/p&gt;
&lt;p&gt;
Indeed, IBM was not really in the business of selling software at all.
IBM would facilitate meetings amongst its customers on ways to program
its computers. Techniques to automatically assemble machine language
programs were discussed, but each site would adapt these for its own
use. Over time, through user groups such as &lt;a href=&#34;https://en.wikipedia.org/wiki/SHARE_(computing)&#34;&gt;SHARE&lt;/a&gt;, assemblers and
subroutine libraries were distributed and improvements suggested. An
example of some of these for the 704 can be seen at Richard Cornwell&amp;#39;s
&lt;a href=&#34;https://sky-visions.com/ibm/ibm704_soft.shtml&#34;&gt;page&lt;/a&gt;.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Using the computer without an operating system
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
How then was the computer used?&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/701-programming-example.png&#34; alt=&#34;/images/ctss/701-programming-example.png&#34; title=&#34;701 Programming Example&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;Sample hand written program for the 701. Source: &lt;a href=&#34;https://archive.org/details/ibmsearlycompute00bash&#34;&gt; IBM&amp;#39;s early
computers by Charles J Bashe&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
According to George F. Ryckman, who worked with a 701 at General
Motors Research Laboratories in the early 1950&amp;#39;s:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Each user was allocated a minimum 15-minute slot, of which time he
usually spent 10 minutes in setting up the equipment to do his
computation. He mounted his own tapes and set up the card reader, card
punch, and printer to carry out his computation. By the time he got
his calculation going, he may have had only 5 minutes or less of
actual computation completed-wasting two thirds of his time slot.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
For the programmer, this was not a great experience as they had
limited time to debug their programs. For the computer &lt;strong&gt;owners&lt;/strong&gt; it was
even worse, given the great expense of the machine, most of the time
the CPU was sitting idle as programmers set up their program and tried
to work out what was going on,&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Early high level languages
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The idea of a programming language operating at a higher level than
assembly had been discussed since the 1940s, with one of the first
fully working ones being &lt;a href=&#34;https://en.wikipedia.org/wiki/Short_Code_(computer_language)&#34;&gt;Short Code&lt;/a&gt; for the UNIVAC. Assembly language
programmers expressed scepticism: running a compiler would add to the
time taken to produce the machine code, and how could code produced by
a compiler compile to their own hand-optimised code?&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/fortran-manual-cover-1956.png&#34; alt=&#34;/images/ctss/fortran-manual-cover-1956.png&#34; title=&#34;Fortran manual cover&#34; width=&#34;75%&#34; height=&#34;75%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;Cover of the 704 Fortran manual. Source: &lt;a href=&#34;http://bitsavers.org/pdf/ibm/704/704_FortranProgRefMan_Oct56.pdf&#34;&gt;IBM Manual at bitsavers.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://en.wikipedia.org/wiki/Fortran&#34;&gt;Fortran&lt;/a&gt;, developed between 1956 and 1957 by John Backus and a team at
IBM, helped answer these questions. It had a syntax that allowed easy
translation of mathematical formulae into code and was fairly quick to
run. Scientists and researcher adopted it quickly, and it spread to
many other contemporary computers.&lt;/p&gt;
&lt;p&gt;
A simple Fortran program to print Hello World 5 times:&lt;/p&gt;
&lt;div class=&#34;src src-fortran&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fortran&#34; data-lang=&#34;fortran&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;C     HELLO WORLD &lt;span style=&#34;color:#66d9ef&#34;&gt;PROGRAM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;DO&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; I&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;WRITE&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;CONTINUE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;STOP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;FORMAT&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;H HELLO, WORLD)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Another early language was &lt;a href=&#34;https://en.wikipedia.org/wiki/MAD_(programming_language)&#34;&gt;MAD&lt;/a&gt;, the Michigan Algorithm Decoder.
Developed at the University of Michigan in 1959 for the 704, it
provided a more English-like syntax inspired by early drafts of the
Algol language, and had a fast compiler.&lt;/p&gt;
&lt;p&gt;
The equivalent of the above program in MAD:&lt;/p&gt;
&lt;div class=&#34;src src-mad&#34;&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mad&#34; data-lang=&#34;mad&#34;&gt;*     HELLO WORLD PROGRAM
      THROUGH LOOP, FOR I=1, 1, I .G. 5
          PRINT COMMENT $HELLO, WORLD$
LOOP  CONTINUE
      END OF PROGRAM&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Batch operating systems
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
High level languages like these helped speed the development process,
but the problem of efficient machine utilisation was still present.&lt;/p&gt;
&lt;p&gt;
The solution to this was &lt;strong&gt;batch processing&lt;/strong&gt;. A series of jobs for
several programmers could be grouped together into a batch of work
that could be executed by the computer in sequence with minimal set up
time. Programmers would submit their code and running instructions to
the operator, who would prepare a set of tapes to load into the
computer and execute. After the batch was run, a tape containing items
to print or punch to cards would be transferred to a smaller computer,
and the physical paper/cards delivered to the programmers.&lt;/p&gt;
&lt;p&gt;
The development of these batch operating systems again started with
customers contributing and sharing code: examples are the &lt;a href=&#34;https://en.wikipedia.org/wiki/SHARE_Operating_System&#34;&gt;SHARE
Operating System&lt;/a&gt; and Bell Labs&amp;#39; &lt;a href=&#34;https://en.wikipedia.org/wiki/BESYS&#34;&gt;BESYS&lt;/a&gt;. Eventually, IBM adapted the
Fortran Monitor System (used at &lt;a href=&#34;https://people.csail.mit.edu/saltzer/Multics/MHP-Saltzer-060508/bookcases/CC%20Memos/CC-170.pdf&#34;&gt;MIT&lt;/a&gt;) and released this as &lt;a href=&#34;https://en.wikipedia.org/wiki/IBM_7090/94_IBSYS&#34;&gt;IBSYS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
An example of a set of control cards to compile the above Fortran
code, run it and produce a listing.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
$JOB           HELLO WORLD
$EXECUTE       FORTRAN
$ID    HELLO
*      XEQ
*      LIST8
&lt;/pre&gt;
&lt;p&gt;
Along with increased utilisation, this helped efficiency as jobs had
to be submitted in a way that was understandable by the computer. The
set up tasks were also done by experienced operators who used the
machine constantly rather than programmers who did not.&lt;/p&gt;
&lt;p&gt;
The disadvantages were latency and lack of debugability. It could take
hours or days for the batch to finish and each programmer to receive
their output. Minor errors in the program that could have been quickly
fixed in the &amp;#34;open shop&amp;#34; method of operation would now have to wait
for the next batch run.&lt;/p&gt;
&lt;p&gt;
The solution to this was time-sharing, of which CTSS was one early
example. Next time we&amp;#39;ll look at CTSS, starting with the supervisor.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Further reading and things to try
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/ibmsearlycompute00bash&#34;&gt;IBM&amp;#39;s early computers by Charles J Bashe&lt;/a&gt; describes the hardware and
software of the IBM 7x and other early computers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/isbn_9780387951133&#34;&gt;Classic operating systems by Per Brinch Hansen&lt;/a&gt; has a chapter on how
the 701 was used in an &amp;#34;open shop&amp;#34; manner at General Motors Research
Laboratory, plus many other details on operating system history.&lt;/li&gt;
&lt;li&gt;Early assemblers such as UASAP can be run on &lt;a href=&#34;https://sky-visions.com/ibm/ibm704_soft.shtml&#34;&gt;simh&lt;/a&gt;, along with a &lt;a href=&#34;https://sky-visions.com/ibm/704/uasap.pdf&#34;&gt;manual&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;IBSYS is available to run on both &lt;a href=&#34;https://cozx.com/dpitts/ibm7090.html&#34;&gt;s709&lt;/a&gt; and &lt;a href=&#34;https://sky-visions.com/ibm/ibsys.shtml&#34;&gt;simh&lt;/a&gt;, with manuals on &lt;a href=&#34;https://bitsavers.org/pdf/ibm/7090/&#34;&gt;bitsavers&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Please email me at rupert@timereshared.com and I will update this
page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>The IBM 7094</title>
      <link>https://timereshared.com/ibm-7094/</link>
      <pubDate>Sun, 12 Jan 2025 09:15:00 +0900</pubDate>
      <guid>https://timereshared.com/ibm-7094/</guid>
      <description>
&lt;p&gt;
Running CTSS under emulation can help us understand the operating
system, but it&amp;#39;s important to put it into context by looking at the
hardware it actually ran on.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/ibm-7094.jpg&#34; alt=&#34;/images/ctss/ibm-7094.jpg&#34; title=&#34;The IBM 7094&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;The IBM 7094. Source: IBM CE &lt;a href=&#34;https://bitsavers.org/pdf/ibm/7094/ce/223-2721-0_7094_II_CE_Instruction_Maintenance_Vol1.pdf&#34;&gt;manual&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Big, fast, expensive
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The IBM 7094 was &lt;strong&gt;big&lt;/strong&gt;, taking up a large room at the MIT computer
centre for its CPU and peripherals.&lt;/p&gt;
&lt;p&gt;
It was one pf the &lt;strong&gt;fastest&lt;/strong&gt; computers available in the early 1960s.&lt;/p&gt;
&lt;p&gt;
It was also very &lt;strong&gt;expensive&lt;/strong&gt;: a typical system sold for $2.9 million
(equivalent to $23 million in 2023) or could be rented for $63,500 a
month (equivalent to $501,000 in 2023) (from &lt;a href=&#34;https://en.wikipedia.org/wiki/IBM_7090#IBM_7094&#34;&gt;Wikipedia&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;
All this meant that very few sites could afford one - mostly
universities and large corporations with extensive need for scientific
computation facilities.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
The 700/7000 range of computers
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
From 1952 IBM had developed a range of computers, first using vacuum
tubes and later transistors. The table below shows how their
scientific range evolved - there were also commercial application
versions that were not completely compatible with the scientific
models.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&#34;align-right&#34;&gt;Year&lt;/th&gt;
&lt;th class=&#34;align-right&#34;&gt;Model&lt;/th&gt;
&lt;th&gt;Logic&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1952&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;701&lt;/td&gt;
&lt;td&gt;Tubes&lt;/td&gt;
&lt;td&gt;2kw Williams tubes&lt;/td&gt;
&lt;td&gt;aka Defence Calculator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1954&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;704&lt;/td&gt;
&lt;td&gt;Tubes&lt;/td&gt;
&lt;td&gt;4-32kw core&lt;/td&gt;
&lt;td&gt;First h/w floating point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1958&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;709&lt;/td&gt;
&lt;td&gt;Tubes&lt;/td&gt;
&lt;td&gt;32kw core&lt;/td&gt;
&lt;td&gt;First indirect addressing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1959&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;7090&lt;/td&gt;
&lt;td&gt;Transistors&lt;/td&gt;
&lt;td&gt;32kw core&lt;/td&gt;
&lt;td&gt;6x faster than 709, ½ the price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1962&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;7094&lt;/td&gt;
&lt;td&gt;Transistors&lt;/td&gt;
&lt;td&gt;32kw core&lt;/td&gt;
&lt;td&gt;2x faster than 7090&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1963&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;7040&lt;/td&gt;
&lt;td&gt;Transistors&lt;/td&gt;
&lt;td&gt;32kw core&lt;/td&gt;
&lt;td&gt;Scaled down version of 7090&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1963&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;7044&lt;/td&gt;
&lt;td&gt;Transistors&lt;/td&gt;
&lt;td&gt;32kw core&lt;/td&gt;
&lt;td&gt;Slightly faster version of 7040&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;1964&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;7094II&lt;/td&gt;
&lt;td&gt;Transistors&lt;/td&gt;
&lt;td&gt;32kw core&lt;/td&gt;
&lt;td&gt;2x faster than 7094&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
MIT had a 704, then a 709 which was the first machine to get CTSS.
They upgraded through 7090 - 7094 - 7094 II and had a second machine
to support Project MAC.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
CPU and memory
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The 7094 had a 36 bit word size and could directly address up to 32kw
of core memory (so around 144kB - bytes as a standard measure of
memory had not yet been standardised).&lt;/p&gt;
&lt;p&gt;
It has a single main accumulator and a multiplier/quotient register
for multiplication and division. It has four index registers allowing
indirect addressing. Numbers were stored in sign/magnitude form, with
the top bit the sign and the remaining 35 bits the number.&lt;/p&gt;
&lt;p&gt;
At the time there was no standard for text encoding like ASCII; the
7094 used 6-bit BCD encoding, allowing only numbers, capital letters
and some punctuation symbols.&lt;/p&gt;
&lt;p&gt;
For CTSS, MIT requested an additional 32kw of memory used in a
bank-switched manner, so one bank was for the supervisor and the other
bank could be fully utilised by the client program.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Storage
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The primary storage mechanism for computers at the time was magnetic
tape. This offered fast sequential read/write but due to the linear
nature of tape could be slow for random-access. Installations would
often have multiple tape drives: for a batch Fortran compile run for
example, there could be one tape for the compiler, one for the input
program, one for scratch storage and one for the output object, all
being used at the same time. CTSS used tapes for user file storage on
early versions before the disk was available; after that it was used
for bulk file input and backup. Each tape could store around 3MB and
could be read at several hundred bytes per second.&lt;/p&gt;
&lt;p&gt;
Random-access storage was done by what IBM called DASDs (direct access
storage devices) and what we&amp;#39;d now call drums and hard disks. The 7320
drum was a cylinder with one head per track that could store 174,000
36 bit words. CTSS used this for swapping and some file storage.&lt;/p&gt;
&lt;p&gt;
The 1301 hard disk was one of the first commercially available hard
disks and could store 28MB of data. It spun at 1800 rpm and could
transfer around 90,000 bytes per second. CTSS used this for file
storage. If you wanted to buy one, it would cost over $100,000 in 1963
dollars.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Input/output
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The console had switches and lights for the operator to toggle in
values, view the state of the computer and start operations. There was
also a line printer for logging.&lt;/p&gt;
&lt;p&gt;
User data could be fed into and out of the machine by punched card.
Each card holds 80 characters. In practice this was not used for
regular user input as it was too costly in CPU cycles; the user would
instead punch data to cards using an off-line punch; the cards would
be transferred to tape via a smaller computer and finally the tape
loaded into the 7094.&lt;/p&gt;
&lt;p&gt;
What is missing here is interactive input/output. MIT purchased from
IBM a data concentrator to handle multiple serial lines and used this
to attach terminals such as the IBM 1050, 2741 and later the TTY37. It
was also possible to connect over the telephone wires using an
acoustic coupler.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/ibm-1052-terminal.jpg&#34; alt=&#34;/images/ctss/ibm-1052-terminal.jpg&#34; title=&#34;IBM 1052&#34; width=&#34;75%&#34; height=&#34;75%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;IBM 1052 Printer-Keyboard, part of a IBM 1050 terminal. Source: &lt;a href=&#34;https://en.wikipedia.org/wiki/IBM_1050#/media/File:IBM_1052.jpg&#34;&gt;Wikipedia/ComputerGeek7066&lt;/a&gt;. License: &lt;a href=&#34;https://creativecommons.org/licenses/by-sa/4.0&#34;&gt;CC BY-SA 4.0&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
There was also an experimental graphical display connected to the IBM
via a PDP-7, but this is not supported by the emulator.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Other peripherals
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There were also a number of other &lt;a href=&#34;https://people.csail.mit.edu/saltzer/Multics/CTSS-Documents/RPQs/RPQs.html&#34;&gt;items&lt;/a&gt; requested from IBM by MIT to
support CTSS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trapping I/O operations to interrupts so they could be handled by
the supervisor&lt;/li&gt;
&lt;li&gt;Memory protection and relocation&lt;/li&gt;
&lt;li&gt;A real time clock and interval timer&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Further reading  
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Much of the information on this page came from Wikipedia. Another
great source is Tom Van Vleck&amp;#39;s &lt;a href=&#34;https://www.multicians.org/thvv/7094.html&#34;&gt;page&lt;/a&gt; on multicians.org about CTSS.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;span style=&#34;text-decoration: underline;&#34;&gt;May 2025&lt;/span&gt;: Tom Van Vleck noted that the data concentrator was
purchased from IBM rather than a special creation for MIT, and pointed
out that IBM 1050/2741 terminals were used initially, followed later
by the TTY33.&lt;/p&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>CTSS: A quick tour using s709</title>
      <link>https://timereshared.com/ctss-quick-tour-s709/</link>
      <pubDate>Sun, 05 Jan 2025 09:05:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss-quick-tour-s709/</guid>
      <description>
&lt;p&gt;
In this post I will show how to get CTSS running using the s709
emulator. &lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/s709-and-login.png&#34; alt=&#34;/images/ctss/s709-and-login.png&#34; title=&#34;Running s709&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;Running s709 and a login session. Source: Rupert Lane. License: &lt;a href=&#34;https://creativecommons.org/public-domain/cc0/&#34;&gt;CC0&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Get the kit
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
We&amp;#39;ll use my &lt;a href=&#34;https://github.com/rupertl/eliza-ctss&#34;&gt;eliza-ctss&lt;/a&gt; repo to get set up as this automates several
of the steps involved. You can also get the components directly from
the &lt;a href=&#34;https://cozx.com/dpitts/ibm7090.html&#34;&gt;s709 page&lt;/a&gt; and set it up following the instructions there - both
methods will yield the same system.&lt;/p&gt;
&lt;p&gt;
You will need a Unix like environment that can compile C code, run
shell scripts etc. You will also need a telnet CLI or GUI client.&lt;/p&gt;
&lt;p&gt;
Start by cloning the repo and changing into its directory. All
commands will be run from there.&lt;/p&gt;
&lt;div class=&#34;src src-sh&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ git clone https://github.com/rupertl/eliza-ctss
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ cd eliza-ctss&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Set up the system
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
(Numbers in square brackets refer to notes below, do not enter these
on your terminal.)&lt;/p&gt;
&lt;div class=&#34;src src-sh&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ source env.sh                    &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ make-binaries                    &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ make-disks                       &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ format-disks                     &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ install-disk-loader              &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;5&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ installctss                      &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;6&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Set up the path and environment variables needed. Run
this before any other commands.&lt;/li&gt;
&lt;li&gt;Compile the s709 and utility binaries, and place them
into &lt;code&gt;ctss/bin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Create files in &lt;code&gt;dasd/&lt;/code&gt; representing the disk and drums
needed for CTSS.&lt;/li&gt;
&lt;li&gt;Format the disks and drums. You will be prompted to press Enter a
few times and type &lt;code&gt;q&lt;/code&gt; and Enter when done. This may take 60s.&lt;/li&gt;
&lt;li&gt;Install a basic disk loader on the disks to prepare for the full
CTSS install.&lt;/li&gt;
&lt;li&gt;Install the base CTSS components on the disks.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Start the system and log in
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div class=&#34;src src-sh&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ source env.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ runctss&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
This will start CTSS and begin accepting logins. The simulator window
will show log in/out activity.&lt;/p&gt;
&lt;p&gt;
In another window, telnet to port 7094 on your local machine. Type
&lt;code&gt;login guest&lt;/code&gt; and at the password prompt type &lt;code&gt;system&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
$ telnet 0 7094
Trying 0.0.0.0...
Connected to 0.
Escape character is &amp;#39;^]&amp;#39;.
s709 2.4.1 COMM tty0 (KSR-37) from 127.0.0.1

MIT8C0: 1 USER AT 12/30/14  852.7, MAX = 30
READY.                                     
      
login guest
W 852.8
Password
 M1416     5 LOGGED IN  12/30/14  852.8 FROM 700000
 LAST LOGOUT WAS  12/25/14 1626.0 FROM 700000      
 HOME FILE DIRECTORY IS M1416 GUEST          
                                   
THIS IS A RECONSTRUCTED CTSS SYSTEM.
IT IS A DEBUG AND NOT FULLY FUNCTIONAL VERSION.
                                               
 CTSS BEING USED IS: MIT8C0
R .050+.000
&lt;/pre&gt;
&lt;p&gt;
Your two windows should now look like the image at the top of this
post.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
Orientation
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;CTSS communicates in upper case, but you can type in lower
case and it will be translated to upper automatically.&lt;/li&gt;
&lt;li&gt;There is no prompt, but you will know CTSS is ready for input when
it prints &lt;code&gt;R&lt;/code&gt; followed by 2 numbers (which represent the CPU time
and swapping time for the last command run).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Delete&lt;/code&gt; will delete the last character and &lt;code&gt;Control-U&lt;/code&gt; will kill a
whole line. This is an affordance of the emulator; on a a real
teletype you&amp;#39;d type &lt;code&gt;#&lt;/code&gt; to delete and &lt;code&gt;@&lt;/code&gt; to kill; these keys still
work as such on the emulator.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Control-C&lt;/code&gt; will interrupt a program and &lt;code&gt;Control-\&lt;/code&gt; (backslash) will quit it.&lt;/li&gt;
&lt;li&gt;Commands are in the familiar format of the program name followed by
parameters. Optional arguments are enclosed in brackets.&lt;/li&gt;
&lt;li&gt;When you enter a command, CTSS will first type something like &lt;code&gt;W
1724.3&lt;/code&gt;. The &lt;code&gt;W&lt;/code&gt; means you are waiting for the command to load and
the numbers are the time of day the command started (using tenths of
minutes after the decimal point).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Looking at directories and files
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
CTSS has the concept of a &lt;strong&gt;Master File Directory&lt;/strong&gt; containing several
&lt;strong&gt;User File Directories&lt;/strong&gt;, one for each user. It is not possible to make
further sub-directories. There is the concept of a &lt;strong&gt;shared directory&lt;/strong&gt;
which we will look at in a later post.&lt;/p&gt;
&lt;p&gt;
To view the contents of your directory, type &lt;code&gt;listf&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
listf 
W 1305.9
        
     9 FILES    90 RECORDS
 NAME1  NAME2 MOD NOREC   USED
  CQA1    MAD 000     3 12/30/14
 HELLO    MAD 000     1         
PRIMES MADTRN 000     2
MYLISP  SAVED 000    77 12/26/14
  FACT   LISP 000     1         
DEFINE   LISP 000     2
 FFACT   LISP 000     1 12/13/14
PROCAL   LISP 000     2         
BOTTLE    MAD 000     1
                       

R .016+.016
&lt;/pre&gt;
&lt;p&gt;
You can give parameters to change the display order and select which
files are printed. For example, to show MAD source code files in
alphabetic order:&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
listf (sna1) * mad
W 1328.5
        
     3 FILES     5 RECORDS
 NAME1  NAME2 MOD NOREC   USED
BOTTLE    MAD 000     1 12/13/14
  CQA1    MAD 000     3 12/30/14
 HELLO    MAD 000     1         
                       

R .016+.016
&lt;/pre&gt;
&lt;p&gt;
File names have two parts, called name1 and name2, each up to six
characters long. Note the first and second parts are not separated by
a dot, so what we&amp;#39;d call &amp;#34;hello.mad&amp;#34; would be &amp;#34;HELLO MAD&amp;#34; on CTSS. The
first part of the name is called &lt;em&gt;name1&lt;/em&gt;, hence the parameter to sort
by name1 is &lt;code&gt;(sna1)&lt;/code&gt;. As shown, you can use &lt;code&gt;*&lt;/code&gt; as a wildcard.&lt;/p&gt;
&lt;p&gt;
You can print a file to the console with &lt;code&gt;P&lt;/code&gt;.  This will include some
blank lines at the end so you will need to scroll up your terminal to
see it.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
p hello mad
W 1332.4
        

	 VECTOR VALUES HELLO = $12H HELLO WORLD*$
	 PRINT FORMAT HELLO                      
	 END OF PROGRAM    


         
R .000+.033
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Compiling and running a program
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Let&amp;#39;s compile and run the above file.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
mad hello (list)
W 1333.7
LENGTH 00020.  TV SIZE 00003.  ENTRY 00011
R .016+.033
&lt;/pre&gt;
&lt;p&gt;
As the name2 of the file was &lt;code&gt;MAD&lt;/code&gt;, we don&amp;#39;t need to give it. If the
file had been called &lt;code&gt;hello mymad&lt;/code&gt; we&amp;#39;d have entered &lt;code&gt;mad hello
mymad&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
The compile did not produce any errors. If you do a &lt;code&gt;listf&lt;/code&gt; for files
you will see two new ones.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
listf hello *
W 855.3
       
     3 FILES     3 RECORDS
 NAME1  NAME2 MOD NOREC   USED
 HELLO    MAD 000     1 01/05/14
 HELLO    BSS 000     1         
 HELLO    BCD 000     1
                       

R .016+.016
&lt;/pre&gt;
&lt;p&gt;
The &lt;code&gt;BCD&lt;/code&gt; file contains a listing of the compilation. The &lt;code&gt;BSS&lt;/code&gt; file
contains object code.&lt;/p&gt;
&lt;p&gt;
There is no separate linker step required to get this in a runnable
state. Instead, the loader will bring this into memory and find any
called routines. By typing &lt;code&gt;LOADGO&lt;/code&gt; you can then run ut immediately.&lt;/p&gt;
&lt;pre class=&#34;example&#34;&gt;
loadgo hello
W 1335.0
EXECUTION.
 HELLO WORLD
  EXIT CALLED. PM MAY BE TAKEN.
R .166+.016
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Logging off
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Type &lt;code&gt;logout&lt;/code&gt;. The system will also log you off after a period of
inactivity. You can start the telnet session again if you want to
login again.&lt;/p&gt;
&lt;p&gt;
CTSS will support up to 30 simultaneous users, but note if you are
already logged in with a certain user ID, you cannot start a second
session.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Shutdown
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
It&amp;#39;s important to shut down CTSS cleanly when finished to avoid
corrupting its disks.&lt;/p&gt;
&lt;p&gt;
You will need to switch back to the &lt;strong&gt;main emulator window&lt;/strong&gt; you started
earlier - this cannot be done from the telnet session.&lt;/p&gt;
&lt;p&gt;
Execute the following, pressing Enter after each non Control-C line.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Press Control-C&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;ek 40017&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;st&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Press Control-C&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;ek 0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;st&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Press Control-C&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;ek 40032&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;st&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;q&lt;/code&gt; and Enter to exit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What is going on here? On the real IBM 7094 the operator would
initiate shutdown by toggling in a value on the front panel (&lt;code&gt;ek&lt;/code&gt;, for
enter keys, in the emulator)&lt;/p&gt;
&lt;p&gt;
You can start CTSS again by running &lt;code&gt;runctss&lt;/code&gt; as before.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-9&#34;&gt;
Dealing with disk errors
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
If you forget to do the above, or your machine crashes, or if there
are any problems starting CTSS again, all is not lost. Run this
command to do the equivalent of a &lt;code&gt;fsck&lt;/code&gt; or &lt;code&gt;chkdsk&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;src src-sh&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ source env.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  $ salvagectss&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
You will need to type &lt;code&gt;st&lt;/code&gt; a couple of times to start the machine.
When the output says &lt;code&gt;QUIT&lt;/code&gt;, type &lt;code&gt;q&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
Further reading
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
The CTSS &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt; section AA.2 has a contemporary
&amp;#34;Time-sharing Primer&amp;#34; showing nee users how to perform simple tasks.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Compatible Time-sharing System</title>
      <link>https://timereshared.com/ctss/</link>
      <pubDate>Sun, 29 Dec 2024 10:12:00 +0900</pubDate>
      <guid>https://timereshared.com/ctss/</guid>
      <description>
&lt;p&gt;
CTSS, the Compatible Time-sharing System, was probably the first
time-sharing system. Developed in the early 1960s at MIT, it ran on a
IBM 7094, supporting up to 30 users on a system with just 64kwords of
memory and a clock speed well under 1MHz.&lt;/p&gt;
&lt;img src=&#34;https://timereshared.com/images/ctss/video-montage-corbato.jpg&#34; alt=&#34;/images/ctss/video-montage-corbato.jpg&#34; title=&#34;Corbató video montage&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&gt;
&lt;p&gt;
&lt;em&gt;CTSS project director Fernando J. Corbató (shown here wearing a bow
tie) demonstrates CTSS in 1963 to a reporter from WGBH. Source: &lt;a href=&#34;https://www.youtube.com/watch?v=Q07PhW5sCEk&#34;&gt;Youtube&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
Some of the key innovations it brought were&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users could develop and run programs interactively using remote keybaors/printer devices.&lt;/li&gt;
&lt;li&gt;They could log in with a user name (later passwords were added) and
run commands, with the operating system interleaving jobs and
protecting against interference beterrn jobs.&lt;/li&gt;
&lt;li&gt;It used a disk drive for storage, with users&amp;#39; work partitioned into
directories and divided into files.&lt;/li&gt;
&lt;li&gt;Users could share files and use facilities such as email and online messages.  &lt;/li&gt;
&lt;li&gt;It enabled the development of ELIZA, the world&amp;#39;s first chatbot, many
different programming languages and document preparation tools, and
supported the work of &lt;a href=&#34;https://en.wikipedia.org/wiki/MIT_Computer_Science_and_Artificial_Intelligence_Laboratory#Project_MAC&#34;&gt;Project MAC&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CTSS eventually ran on two computers at MIT. It was very influential:
many of the CTSS engineers went on to develop Multics, and ideas from
CTSS contributed to other OS. Using it today, it seems very familiar
to those used to the Unix command line.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Preservation status
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
There is a good amount of documentation at &lt;a href=&#34;https://bitsavers.org/&#34;&gt;bitsavers.org&lt;/a&gt; covering the
&lt;a href=&#34;https://bitsavers.org/pdf/ibm/7094/&#34;&gt;machine&lt;/a&gt; and the &lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/&#34;&gt;operating system&lt;/a&gt;. Probably the best reference is the 1969
&lt;a href=&#34;https://bitsavers.org/pdf/mit/ctss/CTSS_ProgrammersGuide_Dec69.pdf&#34;&gt;Programmer&amp;#39;s Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
The original &lt;a href=&#34;https://www.piercefuller.com/library/ctss.html&#34;&gt;source code&lt;/a&gt; for CTSS was found on a backup tape 20 years
ago and has been reconstructed into a version runnable on two
emulators&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://cozx.com/dpitts/ibm7090.html&#34;&gt;s709&lt;/a&gt;, by David Pitts&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/rcornwell/ctss&#34;&gt;simh&lt;/a&gt;, by Richard Cornwell&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will use s709 for most of the work on this site as it is slightly
easier to use.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Topics
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-3&#34;&gt;
Background
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-4&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ibm-7094&#34;&gt;The IBM 700/7000 series of computers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ibm-7x-early-software/&#34;&gt;Early software for these computers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-supervisor&#34;&gt;The CTSS supervisor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-4&#34;&gt;
Using the emulators
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-4&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-quick-tour-s709/&#34;&gt;A quick tour of CTSS using s709&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-getting-data-in-and-out/&#34;&gt;Getting data into and out of the system&lt;/a&gt; using s709&lt;/li&gt;
&lt;li&gt;If you are interested in using simh instead of s709, see my
&lt;a href=&#34;https://github.com/timereshared/ctss-simh-quickstart&#34;&gt;quickstart&lt;/a&gt; repo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-5&#34;&gt;
Using CTSS
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-4&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-files-and-directories/&#34;&gt;Files and directories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-commands/&#34;&gt;System utilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-security&#34;&gt;Security and protection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-ed-and-friends/&#34;&gt;ED and friends: online editors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-runcom-and-fib-scripting-and-background-jobs/&#34;&gt;RUNCOM and FIB: scripting and background jobs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-dot-shell-email-chat/&#34;&gt;The &lt;code&gt;.&lt;/code&gt; shell, chat and email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-document-production-with-typset-and-runoff/&#34;&gt;Document production with TYPSET and RUNOFF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-qed-editor/&#34;&gt;The QED editor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-6&#34;&gt;
Programming
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-4&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-programming/&#34;&gt;CTSS Programming introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-mad/&#34;&gt;MAD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-fortran/&#34;&gt;Fortran&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-lisp/&#34;&gt;Lisp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/ctss-assembly/&#34;&gt;Assembly and system interface&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-7&#34;&gt;
Reconstructions
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-4&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://timereshared.com/reconstructing-joseph-weizenbaums-opl/&#34;&gt;Joseph Weizenbaum&amp;#39;s Online Programming Language&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
Questions, corrections, comments
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
&lt;span style=&#34;text-decoration: underline;&#34;&gt;May 2025&lt;/span&gt;: Tom Van Vleck suggested using &amp;#34;remote keybaors/printer
devices&amp;#34; instead of &amp;#34;teletypwriters&amp;#34;, making changes to the bullet
points and noted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MIT having &lt;strong&gt;two&lt;/strong&gt; 7094s was a height of affluence. Having a big
mainframe computer was sort of like owning an ocean liner: cost to
run, skilled staff required, etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
I welcome any questions or comments, and also especially any
corrections if I have got something wrong. Please email me at
rupert@timereshared.com and I will add it here and update the main
text.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>timereshared.com</title>
      <link>https://timereshared.com/launch/</link>
      <pubDate>Fri, 27 Dec 2024 10:25:00 +0900</pubDate>
      <guid>https://timereshared.com/launch/</guid>
      <description>&lt;p&gt;
I am starting a new blog about time-sharing operating systems.
Covering the mid-1960s to the mid-1980s, this will look at some of the
key OS that allowed many users to share a computer, the innovations
they brought and how to run them today on your own PC via emulation.&lt;/p&gt;
&lt;p&gt;
Some of the OS I am planning to cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CTSS&lt;/li&gt;
&lt;li&gt;TSS/360&lt;/li&gt;
&lt;li&gt;CP/CMS&lt;/li&gt;
&lt;li&gt;TSO for MVS&lt;/li&gt;
&lt;li&gt;TOPS-10 and -20&lt;/li&gt;
&lt;li&gt;ITS&lt;/li&gt;
&lt;li&gt;Multics&lt;/li&gt;
&lt;li&gt;RSTS and RSX-11&lt;/li&gt;
&lt;li&gt;Something called Unix?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please subscribe to the &lt;a href=&#34;https://timereshared.com/index.xml&#34;&gt;RSS feed&lt;/a&gt; to receive updates.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Michigan Terminal System</title>
      <link>https://timereshared.com/mts/</link>
      <pubDate>Fri, 27 Dec 2024 09:00:00 +0900</pubDate>
      <guid>https://timereshared.com/mts/</guid>
      <description>&lt;p&gt;
MTS, the Michigan Terminal System, is an operating system running on
IBM System/360 compatible mainframes dating from the 1960s. It ran at
a number of universities in the US, UK and Canada until the late 90s,
It provided batch and interactive access with a large number of
programs and tools included in the standard distribution.&lt;/p&gt;
&lt;p&gt;
I have written about MTS in much more detail on my other site
&lt;a href=&#34;https://try-mts.com/&#34;&gt;try-mts.com&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
