Document the evolution of MDL Zork

Is there anyway in MDL to ‘decompile’ functions?

E.g. in Common Lisp, if we define a function:

CL-USER> (defun foofunc (x y) (* x y))
FOOFUNC

Then if we try to eval it, we just get:

CL-USER> (eval #'foofunc)

#<FUNCTION FOOFUNC>

But there are other functions we can apply, e.g. function-lambda-expression:

CL-USER> (function-lambda-expression #'foofunc)
(LAMBDA (X Y) (BLOCK FOOFUNC (* X Y)))
T
FOOFUNC

(There’s also things like inspect.)
I don’t know MDL well enough to know if there could be equivalents.

I’m certainly no expert on MDL but my understanding is that almost everything in the end are what’s called an ATOM.

Example:

If you define a FUNCTION (and assign it to an ATOM, it is possible to have FUNCTIONs that’s not assigned to ATOMs. Lets not get into that.).

<DEFINE HELLO ()
  <PRINT "Hello, world!">
>

The ATOM HELLO is assigned the specified code. If you look at the ATOM it look something like this:

,HELLO
#FUNCTION (() <PRINT "Hello, world!">)

I.e an ATOM of the TYPE FUNCTION.

Unfortunately when, on the PDP-10 ITS, the MDL code is compiled the functions becomes machine language and are no longer available. They become just like the built-in functions and only display their call sign.

,SPARSE
%<RSUBR-ENTRY '[REMOVE-OBJECT SPARSE #DECL ("VALUE" <OR ATOM FALSE VECTOR> <
VECTOR [REST STRING]> <OR ATOM FALSE>)] 9902>

It should be possible to reverse engineer that into some psuedo-code, but that is far beyond my knowledge.

Have a look at the issues over at the PDP-10 IRS project. There are some knowledgeable person there that was at MIT during the 70s and sometimes even some old imp gives some insight.

1 Like

I see. I suppose the PDP-10 keeping the uncompiled version of the function around would eat up extra memory, and is not done for that reason (and compiling-on-demand would make things slower).

Exactly. If you try to feed the full 616 points version of Zork the MDL interpreter starts to complain about memory and garbage collection problems.

I think one user have access to a compiler to MDL version 55 that works and that he has successfully compiled it. Unfortunately MIT hasn’t released this version of MDL with its compiler yet, but hopefully they will, soon. The compiler for the MDL version 54 & 56 havn’t been found as far as I know.

1 Like

MIT have released some new source code and some new compiled games from July 1977, March 1978 & March 1979. I’ve extracted the new issues of “US News & Dungeon Report” and updated the fifth post in this thread with the relevant information.

The source from July 1977 is incomplete but is from the 387 points version and the source from March 1978 look nearly complete and is the first with the complete end-game so it’s the 500 points version + 100 points end-game.

According to @larsbrinkhoff this exhaust all the Zork material that have been located on old backup tapes for the ITS.

I intend to revisit this subject now that Mini-Zork 2 is almost finished.

2 Likes

Both the source code for Zork 3 & MDL Zork have this remark before the “Zork Royal Puzzle” section:

"SUBTITLE CHINESE PUZZLE SECTION (COURTESY OF WILL WENG)"

MDL Zork also have this ASCII-art for the gold card:

 ____________________________________________________________
|							                                 |
|              FROBOZZ MAGIC SECURITY SYSTEMS	             |
|    Door Pass                  Royal Zork Puzzle Museum     |
|							                                 |
|                     #632-988-496-XTHF			             |
|							                                 |
|							                                 |
|     USE OF THIS PASS BY UNAUTHORIZED PERSONS OR AFTER	     |
|   EXPIRATION DATE WILL RESULT IN IMMEDIATE CONFISCATION    |
|							                                 |
|							                                 |
|                              (approved)		             |
|                              Will Weng		             |
|                               789 G.U.E.		             |
|							                                 |
|                                        Expires 792 G.U.E.  |
|____________________________________________________________|

The “Will Weng” mentioned here surely must refer to Will Weng who was the crossword puzzle editor in New York Times, 1969-77?

@eriktorbjorn pointed out that in earlier versions you can fight with the cyclops. This feature dissappeared between 1/28/78 and 12/11/79 but the messages are still there in the later versions (they are still there in Zork 1). It’s not clear if it’s intentional that the possibility of fighting dissappeared or some sort of bug. It’s a shame, though, because the messages are sometimes witty and always brutal but the end is always the same, you die! (Cyclops strength is 10,000, the troll, for comparison has the strength 2).

Examples:

"The Cyclops rushes you, but runs into the wall."
"The Cyclops gets a good grip and breaks your arm."
"The monster smashes his huge fist into your chest, breaking several
ribs." 
"A flying drop kick breaks your jaw."
"The Cyclops seems unable to decide whether to broil or stew his
dinner."
"The Cyclops, no sportsman, dispatches his unconscious victim."

In the later games the message is always:
"The cyclops ignores all injury to his body with a shrug."

2 Likes

Just to add to the confusion, not only are the cyclops fight messages still in Zork I, the cyclops is still in the table of “villains” which makes it look like you should be able to fight him. But apparently the code that loops through it skips the last entry, so he won’t. In the buggy, unreleased 1984 version of Mini-Zork I the cyclops entry was removed (probably to save space), so there it’s the thief who won’t fight you.

From what I remember (it’s been some time since I tried), if you do try to enable the cyclops fight in Zork I you’ll automatically win because he’s unarmed and thus considered defenseless. So it’s a little bit more work than it first seems.

1 Like

I don’t know if it was mentioned before, or if I just missed it, but another thing that changed was how the game handles death. In earlier versions:

>SOUTH
Oh, no!  A fearsome grue slithered into the room and devoured you.
Do you want me to try to patch you?YES
Now, let me see...
Well, we weren't quite able to restore your state.  You can't have
everything.

Or, if you answer no:

What?  You don't trust me?  Why, only last week I patched a running ITS
and it survived for over 30 seconds.  Oh, well.
Your score is 25 [total of 500 points], in 13 moves.
This score gives you the rank of Amateur Adventurer.

This chatty form of resurrection reminds me of Colossal Cave, which is perhaps why later versions changed it into something more elaborate: Turning you into a ghost. (Unless you’re in the endgame?)

>SOUTH
Oh, no!  A fearsome grue slithered into the room and devoured you.

As you take your last breath, you feel relieved of your burdens. The
feeling passes as you find yourself before the gates of Hell, where
the spirits jeer at you and deny you entry.  Your senses are
disturbed.  The objects in the dungeon appear indistinct, bleached of
color, even unreal.

I think the way Zork I handles it is an improvement: Early on, the game resurrects you and moves you to the forest, but once you have found the temple it turns you into a ghost instead. (There’s also a special case for if you die while you’re a ghost, but I never figured out any way to trigger that.)

It’s quite unclear what was intended. Back as far as 771212, the cyclops “ignores all injury to his body with a shrug” if the action is MUNG. But MUNG doesn’t seem to actually be an action in the 77 version. In 780124 it appears to be an action distinct from ATTACK, but for some reason the special cyclops action doesn’t get run; the regular melee code does. For some of the other cyclops actions, the special action does get run – e.g. “throw sword at cyclops” results in the “ignores all injury” message. This seems wrong.

For 791211 it’s the other way around. The special cyclops action gets run, preventing the regular action from running, thus preventing the fight with the cyclops. You can still fight him – do the lunch-and-water solution, then wake him up. He’ll be in a fighting mood.

It’s possible some of these are Confusion bugs.

I believe the reason the cyclops doesn’t fight in Zork I is unrelated and probably a mistake in translating a MAPR to an explicit loop.

I think @larsbrinkhoff (or actually @eswenson1) have a workable version of the 791211 running on pdp-10 ITS. There is also a binary from 790317 available. Unfortunately they need muddle v55 to run and that version isn’t cleared for release (yet?). Running these could determine if it’'s related to Confusion.

Thread on pdp-10 github.

I just found this thread and read it eagerly. Thank you for your excellent work in documenting your findings! Really interesting stuff.