This is based on AI: SYS2; TS XXFILE, which was compiled by TAA on
1979-08-23 from XXFILE MTA220, and on @larsbrinkhoff's reconstruction.
After modifying the XXFILE MTA224 source to match (remove the OASC in
CTTYB, and the three .CLOSEs in CQUIT), this compiles into an identical
binary.
The UUO handlers look like they're based on the ones from DIRED, so I've
preserved the DIRED comments where possible, but otherwise adjusted to
match the style used in XXFILE.
The PURIMP routine splits the page map into three parts: writable data
at the bottom, a large gap in the middle (which the GC will manage
later), and read-only code/data at the top. There's one CORBLK call for
each of these.
The final call, which gave pages BOT/2000 to 400 as the range, failed
with %EROPG when it hit the first unmapped page after the end of the
pure data. Experimentation shows that, at least with current ITS, this
is how CORBLK normally behaves.
Fix by calculating the final page from RHITOP rather than assuming 400.
The MDL 54/104 and 55/105 manuals give the name SYS:TS MDL for the
interpreter, and a comment in MAIN says it was TS MUDDLE, so install
links for both.
On ITS, ILOOP in INITM fails because it runs out of address space;
it overruns by about 2000 words. There's a comment in MUDDLE suggesting
that BOT was originally 600000, so move it back to there (although we
could get away with a higher value if necessary in the future).
On TENEX, TXPURE would be used instead.
This is checking whether the transfer vector has overflowed the
compile-time space allocated for it -- but the test is backwards, so the
.LOP .VALUE always fires.
These are analogous to TENEX's ASSEM ALL and MUD105 STINK.
This is version 56 for ITS, because the TENEX binary claimed to be
version 106, and the 54/104 and 55/105 manuals suggest that the ITS
version number tracked the TENEX one. Zork tests whether ,MUDDLE is less
than 100 to see if it's on ITS.
Most versions of MIDAS emit a 76 directive for each EXPUNGE, even if the
symbol being EXPUNGEd didn't exist. However, STINK treated a 76
directive for a symbol it didn't know about as an error.
Make it ignore the directive instead, skipping the next word to stay in
sync.
Linking Muddle showed various unresolved symbols of the form
"$ 42". These are used by MIDAS when it wants to refer to something in
a CONSTANTS area, but doesn't know the location at assembly time (for
example, because it's the other side of a LOC X where X is a global).
At the start of a CONSTANTS area, MIDAS defines this symbol as .;
however, it was defining it with the wrong name.
There's a special case in RPWRD1 to output references to these symbols
as squoze rather than symbol table numbers, but the code in CNST2 that
defines the symbol was using PDEFPT, which always outputs the number.
Make it output the squoze instead.
When:
- MIDAS is writing a "standard data" block to a REL file;
- it wants to write a 76 (local-to-global/rename/expunge) directive,
which needs two words of data;
- and there's only one word of space left in the block;
it wrote the first one to the current block, and the second word to the
start of the next block. STINK 1/201 doesn't understand this, and treats
the second word as codebits for the next block, misinterpreting the
directives for that block; this results in missing symbols or junk being
loaded into memory.
For other two-word directives, MIDAS sets the IRCONT flag for all words
except the last one, to prevent the block from being flushed until the
directive is complete. Do the same for 76 directives.
Also fix CNSTA, which unset IRCONT *after* its last word; this was
probably harmless because it will be the first directive in a block so
can't be split.
It looks like Muddle was historically built with an early MIDAS: the
1973 Muddle source included a copy of MIDAS 73, and the MDL 106
source included a TENEX MIDAS binary of similar vintage.
Later versions of MIDAS have differences in their REL output which break
Muddle's low/high-segment linking. We don't have source for MIDAS 73.
MIDAS 323 is the latest version we have that supports this scheme
correctly, at least with Muddle's version of STINK.
Two things to note: the compiled Muddle was called MDL106.EXE, and the
MIDAS binary was earlier than MIDAS 76.
I've left the TENEX build scripts and TENEX-specific files in place;
the TENEX/ITS code is conditional, so it should be possible to build the
code on TENEX/TOPS-20 in the future.