5 Undocumented Z-Machine Opcodes

Studying the source code of Infocom’s ZAP assembler has revealed 5 previously unknown (to me, at least) opcodes from the file zdata.c:

{ "PRINTMOVE",  ST_VAL,         267,    zo_xop },
{ "RTIME",      ST_VAL,         268,    zo_xop },
{ "SEND",       ST_VAL,         269,    zo_xop },
{ "SERVER",     ST_VAL,         270,    zo_xop },
{ "ENDMOVE",    ST_VAL,         271,    zo_xop },

Does anyone have any information?

Unfortunately they’d fall right in the range of the EXT:11, EXT:12 and EXT:13 used in z-spec 1.0 and 1.1 but EXT:14 and 15 still seem to be open to add without a conflict.


One has to accept that the Z-machine specification that was produced by reverse engineering existing Infocom games couldn’t take opcodes that were never used in any games into account. In theory these opcode could be added in free EXT slots, but then no existing Z-code interpreters would know what to do with them.

I’m curious as to what they were supposed to do, but I doubt it will ever make sense to add support for them in the standard or in interpreters.

1 Like

They’re also not listed in any of the known ZIL documentation. So it’s not like ZIL always had them and we just didn’t notice; they’re in some genuinely new category.

1 Like

SEND and SERVER, perhaps also RTIME, can be related to boggle and trek, the two multiplayer games on the drafting table, circa 1987-8 ?

Best regards from Italy,
dott. Piergiorgio.


If that’s true the PRINTMOVE is for debugging and ENDMOVE is for EOF marker or some such.

J.C.R. Licklider was Will Crowther’s boss while Crowther was both creating the net’s original routing protocol and inventing the medium of interactive fiction. And Licklider was one of the founding partners of Infocom.

So what I’m saying is that these censored opcodes clearly have something to do with the secret history of how interactive fiction is deeply and inexorably entwined with the architecture of our entire digital world.


In other words, we now know what the UNIX network admin tool ifconfig is really configuring.

– Jim

1 Like

ok seems that the point was fully missed:

I apply humanities to old sources, namely philology and textual criticism. And history.

in the last days of (true, that is, pre-activi$ion) Infocom, there was debate around the possibility of develop a multi-player game, and in the Test-Dev folder of the archives we gain from “The Drive” we have these sources, boggle and trek, whose seems to me proof-of-concept of this multiplayer game idea.

now, if we consider the variety of protocols and even networks back in mid-late 1980s, looks logical, at least to me, that the networking side of a multiplayer game is handled by the Z machine. hence, developing z-code instruction seems the logical step. hence the traces found in zdata.c

hope to have clarified my nudge above. A good starting point for looking into the hypotesis seems Boggle/server.zil, vintage 1987 (ok, this is more a push than a nudge, but anyway… :wink: )

Best regards from Italy,
dottor Piergiorgio d’ Errico.


As a small mea culpa for my digression into fictitious conspiracy theory, I can confirm that the following exists in boggle’s source:

% egrep -i '<(printmove|rtime|send|server|endmove)' *.zil
main.zil:        <COND (<EQUAL? <SERVER 0> 1> ;"am I the server?"
main.zil:               <COND (<SETG PLMAX <SERVER <- ,MAX-PLAYERS 1>>>
move.zil:               <SEND ,M-QUIT>
move.zil:                      <ENDMOVE <GETP .P ,P?ID>>
move.zil:                      <SERVER <- <GETP .P ,P?ID>>>)>)
move.zil:                             <ENDMOVE <GETP .P ,P?ID>>
move.zil:                             <SERVER <- <GETP .P ,P?ID>>>)>)
player.zil:             <COND (<SETG ID <SEND ,M-JOIN>>
player.zil:                    <PRINTMOVE>
player.zil:                    <SEND ,M-QUIT>
player.zil:      <COND (<SEND ,M-MOVE> <PRINTMOVE>)
player.zil:            (ELSE <SERVER-DEAD> <RFALSE>)>>
server.zil:      <RTIME T>
server.zil:                     <SERVER <- .ID>>)>
server.zil:             <SET TIME-LEFT <- ,DELAY-TIME <RTIME 0>>>)>
server.zil:             <ENDMOVE .ID>)
server.zil:             <ENDMOVE .ID>)