1981 mainframe Zork built from MDL source code

Hello,

It’s now possible to build and run the final 1981 version of mainframe Zork. The MDL compiler and libraries for the PDP-10 ITS operating system has been recovered from MIT backup tapes and been brought back to life on a PDP-10 emulator.

14 Likes

Great progress!

Are MDL 55 released by MIT now?

Are this version making its way into the master branch?

3 Likes

Yes on all accounts. Although this is just the first step to make Zork build and run again. There should be further submissions in the future to update MDL and build libraries and tools from sources. But that will not affect Zork, so from an intfic history perspective, this is the main event.

4 Likes

Arrg! The PiDP-10 isn’t done yet!

1 Like

There have been some stumbling blocks since the project started, but some progress was made last year. I believe Oscar is now satisfied a close model of the tricky bevels can be made, so he’s motivated to make a nice looking replica.

1 Like

I suggest this can be the inofficial logotype for “mainframe/MDL Zork”. It’s from the 1978 map.


Source: Zarf Updates: A treasury of Zork maps

5 Likes

Is this something a layman can do? I looked at the Github page but was quickly bewildered.

1 Like

Yes. What platform are you on? I, just now, built it on Ubuntu 20.04.2 LTS. The process as below:

1. Start terminal window.

2. Packets needed (sudo apt-get install [packet]):
	gcc
	libsdl2-dev
	libpcap-dev
	libvdeplug-dev
	libncurses-dev
	expect

3. sudo git clone https://github.com/PDP-10/its its

4. cd its

5. sudo make EMULATOR=simh
	(takes long time... 2 h, at least)

I’ve done it in CygWin too (running under Windows). It’s a little bit more complicated:

1. Install CygWin with following libraries:
	+autoconf
	+libusb 1.0-devel
	+gcc-g++
	+make
	+git
	+gcc-fortran (only to compile Fortran Dungeon 3.2b)

2. Start CygWin and position yourself in your home.

3. git clone https://github.com/PDP-10/its.git

4. cd its

4. make EMULATOR=simh
	needs to run 2 times
	1st time ends in error 2 after about 30 min
	2nd time installs and takes a fairly long time (2h)
	2nd time also end in error 2 (curses.h tools/supdup)

The errors when istalling in CygWin are certainly some libraries missing, but I havn’t figured out which ones yet (maybe libsdl2-dev is one of them).

2 Likes

Depends if you just want to play the game, which case you can follow Henrik’s instructions, or if you really want to build Zork from source code. If the latter, the TCL/expect script its/zork.tcl at master · PDP-10/its · GitHub can be a guide, and in turn it calls two other scripts its/comp.xxfile at master · PDP-10/its · GitHub and its/zork.xxfile at master · PDP-10/its · GitHub They may be somewhat cryptic, but it’s possible to see each and every step there.

1 Like

Really I just want to get a couple of answers about minutiae. (Maybe one of you could tell me?)

  1. What is the response when you type VERSION?
  2. What is the response when you read the newspaper?

I’ve played what I think is a very close version, a port of the final 1981 code by Jeff Claar:
https://bitbucket.org/jclaar3/zork/

However, that port has some alterations, and I’m curious what the “original” responses were.

2 Likes
:zork
This Zork created March 3, 2023.
West of House
This is an open field west of a white house, with a boarded front door.
There is a small mailbox here.
A rubber mat saying 'Welcome to Zork!' lies by the door.
>version
This Zork created March 3, 2023.
>n
North of House
You are facing the north side of a white house.  There is no door here,
and all the windows are barred.
>e
Behind House
You are behind the white house.  In one corner of the house there
is a small window which is slightly ajar.
>open
With great effort, you open the window far enough to allow entry.
>w
Kitchen
You are in the kitchen of the white house.  A table seems to have
been used recently for the preparation of food.  A passage leads to
the west and a dark staircase can be seen leading upward.  To the
east is a small window which is open.
On the table is an elongated brown sack, smelling of hot peppers.
A bottle is sitting on the table.
The glass bottle contains:
 A quantity of water
>w
Living Room
You are in the living room.  There is a door to the east, a wooden
door with strange gothic lettering to the west, which appears to be
nailed shut, and a large oriental rug in the center of the room.
There is a trophy case here.
A battery-powered brass lantern is on the trophy case.
There is an issue of US NEWS & DUNGEON REPORT dated 7/22/81 here.
On hooks above the mantelpiece hangs an elvish sword of great
antiquity.
>read paper
Taken.
                US NEWS & DUNGEON REPORT
7/22/81                                        Last G.U.E. Edition

This version of ZORK is no longer being supported on this or any other
machine.  In particular, bugs and feature requests will, most likely, be
read and ignored.  There are updated versions of ZORK, including some
altogether new problems, available for PDP-11s and various
microcomputers (TRS-80, APPLE, maybe more later).  For information, send
a SASE to:

                Infocom, Inc.
                P.O. Box 120, Kendall Station
                Cambridge, Ma. 02142

>

(Version report the date of the compilation. I built the system yesterday and the Zork source was built then to a run-time.)

4 Likes

Thank you!

1 Like

Do the HELP and INFO commands work in the version you’re describing?

(I’ve been running the game under Confusion, but HELP and INFO respond with “File not found”.)

1 Like

Yes they do now. (I’ll should probably extract the texts and fix the version for Confusion.)

Help text:

>help

ZORK User Information

I. Getting a ZORK

    a. ITS:  Say ZORK^K to DDT rather than :ZORK to get a zork. 
    b. 10X/20X:  Invoke the local dungeon (usually ZORK.EXE)

II. Bugs, comments, suggestions...

    Always welcome and encouraged.  All mail should be sent to
    ZORK@MIT-DMS.  ZORK has a BUG command, in addition, which
    may be used to report strange happenings.  Its use is described
    below.  Please note that for 10X/20X systems, net mail to ZORK
    will be acted on much more quickly than BUG command reports.

    If, in making a bug report, you know what symptoms were exhibited
    by the program, PLEASE, PLEASE!!!!! include them.  It is at best
    extremely irritating and at worst useless to receive a bug report
    like 'mumble frotz' loses, or 'try saying \"mumble frotz\"'.  With
    such reports, we have no way of knowing the situation when your
    'mumble frotz' lost, and no way of knowing if any bug we manage
    to reproduce (if we do) is the same one you saw.  In consequence,
    everyone's time is wasted.

III. Typing to Zork.

    A number of characters in Zork have special effects.  These
    include a number of line editing commands.  The characters are:

     <rubout> or <backspace>:  delete the last character typed
     <ctrl-W>:  delete the last word typed
     <ctrl-U> or <ctrl-X> or <ctrl-@>:  delete the entire buffer
     <ctrl-D>:  redisplay the buffer
     <ctrl-L>:  redisplay the buffer.  Sometimes this also clears the
                screen.
     <altmode/cr>:  terminate commands
     <ctrl-S>:  flush long typeouts
     <ctrl-G>:  like the QUIT command (vide infra)
     <semicolon>:  Causes the remainder of the command line to be ignored.
        This may be useful for annotating hard copies/scripts of games.

IV.  Garbage Collection

    Zork may occasionally type out a message 'GIN FREE STORAGE-
    <long pause> GOUT TIME=10.92'.  This indicates that a garbage
    collection is occurring.  We have attempted to prevent this, since it
    may take a significant amount of real time on a loaded system; should
    it ever occur, please send mail to ZORK@MIT-DMS describing the
    circumstances -- how many moves have been made, whether a RESTORE has
    been done, and so on.  THIS IS NOT FATAL:  after the GOUT message is
    printed, you may continue playing.

V.  User Commands

    The following commands may prove useful for the playing of Zork.
They are not, however, game commands (i.e. they have no side effects
in the current game).

 a. Verbosity

   Verbose:      The default:  print long room descriptions on first
                 visit, 20% of the time thereafter.

   Brief:        Supresses printing of long room descriptions for rooms
                 which have been visited.  Short object descriptions
                 are also used in such rooms.

   Super(brief): Suppresses printing of all long descriptions, even
                 on the first visit.  Short object descriptions are
                 always used.

   Noobj:        Suppresses printing of object descriptions in rooms
                 already visited.  See the 'object' command.

Note that the maximally verbose description (that printed on the
first visit to a room in verbose mode) may always be obtained by
saying 'look'.  See also the 'room' and 'object' commands.

 b. Help

    Info:        Prints a file which might give some idea of
                 what the game is about.

    Help:        Prints a short summary of useful commands.

    Doc:         Prints this.

 c. Progress

    Quit:        Prints your score, and asks whether you wish to
                 continue playing.

    Score:       Deflate your ego.

    Time:        Describe how much of eternity you have injured.

    Versi(on):   Describe the current version.

 d. Hard copy (directory owners only!)

    Scrip(t):    Script to a file ZORK.SCRIPT 

    Unscr(ipt):  End scripting

 e. Save/restore  (directory owners only!)

    Save:        Save the game for future continuation (to ZORK.SAVE)

    Resto(re):   Restore a saved game (from ZORK.SAVE)
                 Only the player who created the save file can restore
                 it at a later time!  You are warned.

 f. Bugs, etc.

    Bug:         Although the best way to report bugs is to send mail
                 to ZORK@MIT-DMS, there is a 'bug' and command
                 built in to the game.  This generates files which 
                 must, alas, be manually transmitted to the
                 maintainers.  It is, however, better than nothing.

    Featu(re):   Like Bug, to make a suggestion for a feature.

 g. General

    Again:       Repeat the last input.

    Look:        Describe the current surroundings. 'L' is equivalent.

    Room:        Print the verbose description of the room, without
                 mentioning any objects.

    Rname:       Print the short description of the room.

    Object:      Print the verbose description of all the objects in
                 the room, without describing the room.  'Look' is
                 equivalent to a 'room' command followed by an
                 'object' command.

    Inven(t):    Describe your possessions. 'I' is equivalent.

    Diagn(ose):  Describe your state of health.

    Wait:        Causes 'time' to pass.

    Oops:        Corrects a misspelled word:  As an example,
                 for 'I don't know the word TORHC' -> say 'OOPS TORCH'.

VI.  Zork Command Parser

       A command is one line of text terminated by a carriage return or
    altmode.  For reasons of simplicity all words are distinguished by
    their first five letters.  All others are ignored.  For example,
    typing 'DISASSEMBLE THE ENCYLOPEDIA', while meaningless, is also
    creating excess finger motion.  Note also that ambiguities can be
    introduced by this:  'unscr' is 'UNSCRipt', not 'UNSCRew'.

       You are talking to a moderately stupid parser, which understands
    the following types of things.

 Actions:       

     Among the more obvious of these, TAKE, DROP, etc.  Fairly general
     forms of these may be used:  PICK UP, PUT DOWN, etc.

 Directions:

     NORTH, SOUTH, UP, DOWN, etc. and their various abbreviations.
     Other more obscure directions (LAND, CLIMB) are appropriate in
     only certain situations.  Because words are only five letters,
     you must say 'nw' for 'northwest':  the latter is truncated to
     'north', which isn't quite what you had in mind.

 Objects: 

     Most objects have names, and can be referenced by them.  At most,
     two objects can be specified in one command.

 Adjectives:

     Some adjectives are understood and are required when there are
     two objects which can be referenced with the same 'name' (e.g.
     DOORs, BUTTONs)

 Prepositions:

     It may be necessary in some cases to include prepositions, but
     the parser attempts to handle cases which aren't ambiguous
     without.  Thus 'Give car to demon' will work, as will 'Give demon
     car.'  When a preposition is used, it should be appropriate:
     'Give car with demon' does not parse.

 Sentences:

     The parser understands a reasonable number of things.  Rather
     than listing them, we advise you to do reasonable things.  Note
     that several sentences may be typed on the same line, separated
     by periods or by 'and':  'n.e.s.w.open mailb and read' will [try
     to] do just that.

 Multiple Objects:

     Sentences of the following forms will parse:
        Put A and B and C in trophy case
        Put A, B, and C in trophy case
        Give A and B to the troll
     The following will not:
        Put A B in case
        Take A B C
     The point is that an AND or a <period> are required so as not
     to hopelessly confuse the parser.
     Special objects named 'everything' and 'valuables' exist; one
     may, for example, say 'take everything' and 'put valuables in
     trophy case'. 

 Multiple commands:

     Several commands may be included on a single line.  They must be
     separated by 'then' or '.'.  Thus:
        TAKE BOOK. N. DROP BOOK AND CANDLE
     is correct.  Note that the use of a comma between commands will
     cause the command line to be parsed incorrectly:  comma should
     only be used between multiple objects.

 Ambiguity:

     The parser tries to be clever about what to do in the case of
     actions which require objects in the case that the object is not
     specified.  If there is only one possible object, the parser will
     assume that it should be used.  Otherwise, the parser will ask.
     Most questions asked by the parser can be answered (e.g. With
     what?).  

 Errors:        

     There are a number of errors which the parser may find in an input 
     sentence.  Some of the more common ones are listed here:

    1. 'I don't know the word ZROK'.  Probably the most common parser
        error.  To correct the spelling of a work, use the OOPS command.
        In this case, 'OOPS ZORK' would be the correct thing.

    2. 'I can't make sense out of that.'.  This error means that there
        is no known syntax that matches the input.  For example, saying
        'PUT X WITH Y' does not match any known form for the verb 'PUT'.
        This error never implies that the idea of the command was not
        good, but rather that the parser doesn't know that form of the
        verb.  It's usually best to try another way of saying the same
        thing.

    3. 'Huh?'.  A command usually without a noun or a verb.  Sometimes
        this is confusing, because a word thought to be a noun was really
        an adjective.  This is the case with, for example, 'GOLD'.
        Other commands which cause this are: 'WITH' and 'THE'.

    4. 'I can't see any <thing> here.'.  An object represented by
        'thing' was not found within the room or on your person.

    5. 'It's too dark in here to see.'.  A reference was made to
        an object within an unlighted room.

    6. 'I can't reach the <thing> from within the <vehicle>'.  This
        means that the <thing> referenced was within the room proper,
        while you are in a vehicle within that room.  Some vehicles
        will not allow access to objects outside of themselves.

    7. 'That doesn't make any sense.'  Usually this will mean that
        something like 'TAKE THE COIL OF KEYS' instead of the 'SET'
        of keys.  In the general case, 'THE <x> of <y>' is legal only
        if <x> and <y> are names for the same thing.

    8. 'Two verbs in command?'  The parser believes that two verbs
        were in the command.  If you check carefully, you will find
        that one of the words is really a verb, and not a noun as
        supposed.

    9. 'Double preposition?'  Try 'TAKE WITH IN MAILBOX'.

   10. 'Multiple inputs cannot be used with <verb>'.  It is only
        legal to use multiple inputs with certain verbs.  The ones
        which come to mind are TAKE, DROP, and PUT.

   11. 'Too many objects specified?'  A legal command may contain
        at most two object references.

   12. 'Beg pardon?'.  A null input was parsed.

VII.  Theories

     The following 'theories' are fundamental to the game and should
     be noted:

  Containment:  

      Some objects can contain other objects.  Many such containers
      can be opened and closed; the rest are always open.  They may or
      may not be transparent.  For you to access (take, for example)
      an object which is in a container, the container must be open;
      for you to see such an object, the container must either be open
      or transparent.  Containers have a capacity, and objects have
      sizes; the number of objects which will fit therefore depends on
      their sizes.  You may "put" any object you have access to (it
      need not be in your hands) into any other object; at some point,
      the program will attempt to pick it up if you don't already have
      it, which process may fail if you're carrying too much.
      Although  containers can contain other containers, the program
      doesn't access more than one level down.

  Fighting:

      Occupants of the dungeon will, as a rule, fight back when
      attacked; they may in some cases attack you unprovoked.  Useful
      verbs here are 'attack <villain> with <weapon>', 'kill', etc. 
      Knife-throwing may or may not be useful.  The adventurer has a
      fighting strength, which varies with time:  in particular, being
      in a fight, getting killed, and getting injured, all lower it. 
      One's carrying capacity may also be reduced after a fight. 
      Strength is regained with time.  (Thus, it is not a good idea to
      fight someone immediately after being killed.)  Other details
      may become apparent in the course of a few melees.  The
      'diagnose' command describes your state of health.

  Vehicles:

      There are some objects in the labyrinth which are rumoured to have
      the ability to transport the fearless adventurer to mysterious
      regions which are inaccessible on foot.  Needless to say, the
      adventurer faces great personal peril as he encounters these     
      regions.  The 'vehicles' can usually be entered with the 'board'
      command, and can be exited with the 'disembark' command. 

Info text:

>info

Welcome to Zork!

    You are near a large underground labyrinth, which is reputed to
contain vast quantities of treasure.  Naturally, you wish to acquire
some of it. In order to do so, you must of course remove it from the
caverns; to receive full credit for it, you must deposit it safely in
the trophy case in the living room.
   
    In addition to valuables, the cave contains various objects which
may or may not be useful in your attempt to get rich; you may need
sources of light, since caves are often dark, and weapons, since
dungeons often have unfriendly things wandering about.  Reading material
is scattered around as well; some of it is rumoured to be useful.

    To determine how successful you have been, there is a score kept.
When you find a valuable object (i.e., pick it up), you receive a
certain number of points, which depends on the difficulty of finding
it.  You receive extra points for transporting the treasure safely to
the living room, and placing it in the trophy case.  In addition,
some particularly interesting rooms  have a value associated with
your entering them.  The only penalty is for getting yourself killed,
which you may do only twice.

    Of special note is a thief (always carrying a large bag) who likes
to wander around underground (he has never been seen by the light of
day).  He likes to take things; since he steals for pleasure rather than
profit, and is sadistic, he only takes things which you have seen.
Although he prefers valuables, sometimes in his haste he may take
something which is worthless; from time to time, he examines his take
and discards objects which he doesn't like.  He may occasionally stop in
a room you are visiting, but more often he just wanders through and rips
you off (he is a skilled pickpocket).

    Have Fun!
5 Likes

I took an inventory of different info-/help-messages that’s available: Add info/help-doc to mdlzorks · Issue #34 · heasm66/mdlzork · GitHub

When you SAVE in Confusion, the program terminates. I’m curious, is that “authentic” behavior? (If I were playing at MIT in 1981, is that what would have happened?)

Yes.

To elaborate: CPU was a limited resource back in the days. There was lot of restrictions on the original games (both Adventure and Zork) to limit how many and at what hours it was possible to play.

1 Like

Hm. Did the game also delete your save file when you restored? That is, were they going for a “permadeath” style of play, like Nethack?

1 Like

Confusion does not delete the save file after restoring.

1 Like

No. The save file remains, but you need to rename them if you want to keep more than one.

1 Like