I found this while building RustyGrue, a from-scratch Z-machine/Glulx interpreter in Rust. When my parser didn’t recognize a word I expected it to, I checked it against dfrotz and Bocfel, and discovered they don’t recognize it either. It turns out all three of us were wrong, and Infocom was right. I’m not sure if this has been talked about before on the forum (The Zork V1/V2 issue. I did find something on the forum about V3 Zork 1, which is a different issue) (let me know!), but here’s what I found.
Here’s what the easter egg looks like: In Zork I, the machine in the Machine Room, the coal-to-diamond contraption “shaped somewhat like a clothes dryer”, answers to the synonym PDP10. Infocom named it after the machine ZIL itself was compiled on. It’s not a throwaway response; it’s a full noun synonym, and you can solve the entire diamond puzzle without ever saying “machine”:
Machine Room
This is a large room which seems to be air-conditioned. In one corner there is a
machine (?) which is shaped somewhat like a clothes dryer. On the ‘panel’ there is
a switch which is labelled in a dialect of Swahili…
> examine pdp10
> The machine is closed.
> open pdp10
> The lid opens.
> put coal in pdp10
> Done.
> close pdp10
> The lid closes.
> turn switch with screwdriver
> The machine comes to life (figuratively) with a dazzling display of colored lights
> and bizarre noises. After a few moments, the excitement abates.
> open pdp10
> The lid opens, revealing a huge diamond.
> destroy pdp10
> What do you want to destroy the pdp10 with?
That last one is my favorite: the parser takes pdp10 as a noun phrase, echoes it back with an article, and asks for an instrument.
None of those commands works in dfrotz or Bocfel 2.4. On the V1 (zork1-r2) and V2 (zork1-r15) releases, both answer:
> open pdp10
> I don’t know the word ‘pdp10’.
The word is in the dictionary — entry #385 in both releases, a synonym of object #15, alongside dryer and lid.
Here’s the cause: In the spec section 3.7.1: “In Versions 1 and 2 only, when encoding text for dictionary words, shift-lock Z-characters 4 and 5 are used instead of the single-shift Z-characters 2 and 3 when the next two characters come from the same alphabet.”
ZILCH did exactly that. The real entries:
V1 zork1-r2 : 55 35 95 07 → z-chars [21, 9, 21, 5, 8, 7] p d p LOCK 1 0
V2 zork1-r15: 55 35 95 28 → z-chars [21, 9, 21, 5, 9, 8] p d p LOCK 1 0
Six Z-chars, end bit set, and correctly sorted. The shift-lock is what makes pdp10 fit: the adjacent 1 and 0 are both in A2, so one lock covers both. Encoding with single shifts instead needs seven Z-chars (p d p shift 1 shift 0), so it truncates at six, and it can never match. To type PDP10 at Zork you must implement section 3.7.1.
Bocfel derives its shift character as shiftbase = zversion <= 2 ? 1 : 3, which yields Z-chars 2/3 for V1/V2. It single shifts and never locks. I tried running Zork 1 through Frotz, and it also outputs “I don’t know the word ‘pdp10’”.
Note also that V1 and V2 encode the same word to different bytes — V1’s A2 alphabet row differs per section 3.5.4, putting 0 at A2 slot 7 — so a fix needs both the lock rule and the V1 alphabet row.
This doesn’t actually affect hardly anything. A Z-char 4 or 5 in the body of a V1/V2 entry is a lock, so you can count the affected words straight out of the story file. I checked the Zork I/II V1/V2 stories I have:
Zork I r2 (V1): 618 entries, 1 lock encoded (“pdp10”)
Zork I r15 (V2): 617 entries, 1 lock encoded (“pdp10”)
Zork II r7 (V2): 625 entries, 0 lock encoded
Words with an isolated A2 character (trap-door, h2o, the . sentence separator) are unaffected, because a single shift and a lock encode identically there. The rule only bites on two or more adjacent same-alphabet characters, and exactly one word qualifies.
It also only ever worked in V1/V2. By r88 (V3) shift-locks were gone from the format, ZILCH truncated pdp10 into a malformed entry with a dangling shift and no end bit, and every interpreter, including mine, correctly says it doesn’t know the word.
It’s a small thing, but it’s a clear sentence in the spec, the fix is a few lines, and there’s a fun result at the end of it.