Fact-checked by Grok 2 weeks ago

Z-machine

The Z-machine is a developed by Joel Berez and in autumn 1979 for , Inc., designed to interpret (known as Z-code) compiled from the Zork Implementation Language (ZIL) and enable portable execution of games across diverse computer platforms without requiring recompilation. Its core purpose was to adapt the mainframe-based Zork for early personal computers, such as the and , by abstracting hardware differences into a unified interpretive environment. Over its active development period from 1979 to 1989, the Z-machine evolved through six primary versions, each enhancing capabilities like memory management, text compression, object handling, and input/output operations to support increasingly complex games. Versions 1 through 3 focused on basic text adventures with features such as a stack-based instruction set, a dictionary for parsing commands, and an object tree for game world modeling, while later iterations (4 through 6) introduced support for graphics, sound effects, mouse input, and larger file sizes to accommodate titles like Zork Zero. This progression allowed Infocom to release over 30 commercial games, including classics such as The Hitchhiker's Guide to the Galaxy and Trinity, all encoded in Z-code files that could be run via platform-specific interpreters like ZIP for early versions or YZIP for graphical ones. Following Infocom's closure in 1989, the Z-machine's legacy was preserved and expanded through community efforts, notably the reverse-engineering and formal standardization led by Graham Nelson and Mark Howell between 1994 and 1995. Nelson's Z-machine Standards Document (first released in 1995 and updated through version 1.1 in 2006) meticulously defined the machine's opcodes, memory layout, and behaviors across all eight versions (including non-Infocom extensions 7 and 8 for larger programs), ensuring full interpreter compatibility and portability. This built upon Nelson's earlier creation of the authoring system in 1993, which had initiated reverse-engineering of the Z-machine and compiles modern to Z-code, resulting in thousands of additional games and sustaining the format's use in interpreters today.

Overview

Definition and purpose

The Z-machine is a stack-based developed by Joel Berez and for in 1979 to execute games, particularly text-based adventures like . It interprets compiled from game , allowing programs to operate as if on a dedicated hardware platform regardless of the host system. The primary purpose of the Z-machine was to enable portability of Infocom's games across diverse hardware environments without requiring recompilation for each platform, such as the , , and systems. By abstracting hardware differences through interpretation, it addressed the challenges of limited memory (often 32K or less) and incompatible architectures prevalent in the late personal computing landscape, ensuring games could reach a broad audience efficiently. In the context of interactive fiction, the Z-machine supports parser-driven narrative experiences where players input natural language commands to interact with a simulated world, managing operations, story logic, object interactions, and within constrained environments. This design facilitated immersive, text-only adventures that emphasized exploration and puzzle-solving, with the machine handling the underlying to maintain consistency across play sessions. The Z-machine's initial development was tied to the porting of , originally created as a mainframe between 1977 and 1979, with formalizing the system for commercial release by 1980 and stabilizing its core design around 1981.

Key features

The Z-machine employs a stack-based to manage state, object manipulation, and routine calls, enabling efficient handling of recursive operations and local variables within constrained environments. This design includes packed addressing schemes, such as 2-byte packing in early versions, which optimize usage by compressing routine and string addresses into fewer bytes. Text output in the Z-machine is facilitated through ZSCII encoding, a 10-bit character system that supports ASCII-like values alongside extensions for international characters and control codes, allowing for compact storage of game narratives. Dynamic vocabulary tables enable flexible of player input by storing word dictionaries in memory, while built-in save and restore mechanisms in all versions, with added from version 5, preserve the execution state—including the , , and dynamic memory—for seamless game resumption. Portability is a core strength of the Z-machine, achieved through its format (Z-code), which remains independent of the host operating system, with interpreters responsible for platform-specific operations like screen and handling. This abstraction layer allowed games to run across diverse hardware without recompilation. The system incorporates multimedia features starting from Version 3, including sound effects via dedicated opcodes that support volume control and repetition; Version 6 adds capabilities for displaying images and menu systems for user navigation. Early versions impose a 64KB limit on low memory (dynamic and static), supporting story files up to 128KB overall, though later iterations expand this up to 512KB. Error handling is integrated into the Z-machine's design, with mechanisms to detect and halt on invalid operations like or illegal opcodes, alongside debugging hooks such as verification routines for integrity checks during execution. These features ensure robust performance in , a design later adopted and extended by tools like for broader development.

Development history

Origins at Infocom

Infocom was founded on June 22, 1979, by a group of graduates including Tim Anderson, Joel Berez, , Mike Broos, Scott Cutler, Stu Galley, and , primarily to commercialize interactive adventure games stemming from their work on at MIT's Dynamic Modeling Group. The company emerged from the need to adapt mainframe-based software for emerging personal computers, with serving as the foundational project. In the pre-Z-machine era, Zork I, II, and III were developed between 1977 and 1979 in the MDL (MUDDLE) programming language for the DEC PDP-10 mainframe, resulting in a sprawling game exceeding 1 MB that was distributed via ARPANET. Porting this code to microcomputers like the Apple II and TRS-80 proved challenging, as the games far exceeded the typical 16-32 KB memory limits of these systems, necessitating extensive manual rewriting and truncation that consumed months of effort per platform and introduced inconsistencies across versions. These portability issues highlighted the limitations of direct code translation from a mainframe environment to diverse, resource-constrained hardware. To address these challenges, decided around 1979-1981 to develop the , a architecture designed to generate a single, platform-agnostic story file that could be interpreted by lightweight, machine-specific executables, thereby automating and streamlining the . The debuted with the 1980 release of Zork I for personal computers, but its full implementation appeared in 1982 titles such as Deadline, a adventure by , and Starcross, a game by , marking the first productions fully leveraging the system for efficient cross-platform deployment. Infocom's business model centered on releasing high-quality text adventures simultaneously across dozens of platforms—over 30 by the mid-1980s—including the , 8-bit, 64, and IBM PC, which drove strong sales, with Zork I exceeding 400,000 copies. The Z-machine drastically reduced times from months of manual labor to mere days, as developers compiled once into a universal format while interpreters handled hardware variations, enabling rapid market expansion and cost efficiencies that sustained Infocom's growth through the early 1980s. A key milestone was the maturation of Z-machine Version 3 by the mid-1980s, which became the standard for most of Infocom's classic titles, supporting up to 255 rooms and 255 objects to accommodate more complex narratives and interactions within memory constraints. This version powered iconic games like The Hitchhiker's Guide to the Galaxy and , solidifying the Z-machine's role in enabling sophisticated without platform-specific rework.

ZIL and compilation tools

The (ZIL) was a developed by for authoring games targeted at the virtual machine. Derived from MDL, a of used in early development on the mainframe, ZIL adopted a prefix notation and parenthetical syntax to define game elements such as rooms, objects, actions, and parser behaviors. It supported routines for procedural logic, properties for object attributes, and global variables for state management, enabling developers to model complex worlds with interconnected elements like inventories, locations, and verb-object interactions. Prior to ZIL, prototyped games in MDL, but ZIL streamlined the process by stripping unnecessary features for more efficient code generation. ZIL's syntax emphasized declarative structures; for instance, objects were defined using the <OBJECT> form with properties like LOC for location, DESC for descriptions, FLAGS for attributes (e.g., TAKEBIT for portable items), and ACTION for custom routines triggered by player input. Routines followed the form <ROUTINE NAME (ARG1 ARG2) <body>>, where the body could include conditionals via COND, output with TELL, and returns with RTRUE or RFALSE. Global states were managed through variables prefixed with commas (e.g., ,HERE for the current room), and the parser tokenized input into semantic units like PRSA (action verb), PRSO (direct object), and PRSI (indirect object) for processing commands. Technical conventions in ZIL included Easter eggs like "zorkmid" as a unit of currency in object properties, reflecting Infocom's playful nomenclature while maintaining consistent property numbering across objects within a game. A representative example of ZIL code for handling a basic movement command like "go north" involves room properties and a generic walk routine. A room might be defined as <ROOM LIVING-ROOM (DESC "You are in the living room.") (NORTH TO [KITCHEN](/page/Kitchen)) (FLAGS LIGHTBIT)>, where the parser sets PRSA to V?WALK and PRSO to P?NORTH. The movement routine then checks: <ROUTINE GO? (DIRECTION) <COND (<GETP ,HERE ,DIRECTION> <GOTO .?>) (T <TELL "You can't go that way." CR> <RFALSE>)>>, executing the transition if the directional property (e.g., NORTH) exists. This structure allowed for conditional exits, such as (NORTH TO [KITCHEN](/page/Kitchen) IF UNLOCKED ELSE "The door is locked."). The compilation pipeline for ZIL began with source files written in the language, which were processed by ZILCH, the primary , to generate Z Assembly Language (often in .ZAP files). ZILCH handled macro expansion, optimization, and , producing that could be manually edited for . The Z Assembly Language was then assembled by ZAP (Zork Assembler Program) into the final Z-code story file, a compact, machine-independent for the Z-machine. ZILCH also included utilities for generating headers and managing build configurations, though it was tightly integrated with the environment initially. This formed a closed at , requiring developers to optimize memory usage manually due to ZIL's verbose syntax and the constraints of early Z-machine versions, such as limited object counts and string storage. ZIL and its tools remained proprietary to throughout the company's operation, used exclusively by in-house authors for all 32 major releases from to 1989. The language's reliance on Lisp-like evaluation and manual interventions for packing objects into memory slots made it powerful for narrative depth but demanding for efficiency, often necessitating iterative compilation to fit within Z-machine limits like 64 KB for version 3 games. 's shutdown in 1989 marked the end of active ZIL development, leaving the tools inaccessible until leaks and reverse-engineering efforts in the .

Expansion via Inform

Following Infocom's acquisition by in 1986 and the subsequent closure of its operations in 1989, the Z-machine entered a period of dormancy, with no new official developments or tools emerging from the company. This changed in 1993 when Graham Nelson created as a modern authoring system specifically targeting the Z-machine, enabling hobbyists and independent developers to produce in the established format. Inform 6, released in 1996, further standardized Z-machine Versions 1 through 8 by incorporating extensions for larger story files in Versions 7 and 8 while maintaining compatibility with earlier versions. Key features of Inform included a simplified, higher-level syntax that was more intuitive and accessible than Infocom's proprietary , reducing the need for low-level programming through an extensive of predefined objects, actions, and rules; support for modular extensions to customize ; and the Z-machine as the primary output format. The Z-machine remained Inform's default target until 2006, when support for the —designated informally as Version 10—was added in Inform 7 to accommodate larger games and modern features beyond Z-machine limits. Nelson's standardization efforts culminated in the Z-machine Standards Document (version 1.0 released in 1996 and updated to version 1.1 in 2006), which formally documented opcodes, memory organization, the ZSCII , and other technical details, providing a comprehensive reference that facilitated community-driven implementations and ensured long-term portability. This specification, building on earlier drafts from 1995, helped establish de facto standards within the emerging community, enabling consistent interpreter development and game creation without proprietary restrictions. The adoption of revitalized the Z-machine in the 1990s and 2000s, leading to the creation of thousands of free games, such as Curses! (1993) by himself and later works like Anchorhead (1998) by Michael Gentry, which leveraged the format's portability and the tools' ease of use to foster a vibrant, non-commercial scene. As of 2025, remains actively maintained, with the latest Inform 7 release (version 10.1.2) in September 2024 supporting Z-machine output alongside Glulx.

Technical architecture

Versions and standards

The Z-machine evolved through eight versions developed primarily by between 1979 and 1988, with versions 7 and 8 added later by Graham Nelson to support larger games created using the system. , introduced in autumn 1979 by Joel Berez and , provided basic text handling capabilities, including a header, divided layout, variables and , object , , and format, along with "shift lock" characters for text compression. followed as a minor update, introducing a 32-word abbreviation bank and a six-digit in the header. Version 3, established by March 1982 and used until November 1987, became the most common format for games such as Deadline and Zork I, dropping shift lock compression in favor of 96 abbreviation entries, adding the "verify" for checksums, and supporting status line reprinting; it limited story files to 128 total, with approximately 64 allocated to dynamic . Version 4, released in August 1985 with , enhanced handling to address size restrictions of prior versions, while expanding the maximum story file size to 256 . Version 5, introduced in September 1987 for titles like Beyond Zork and Border Zone, incorporated calculated addresses, character graphics, real-time keyboard input, additional opcodes, and support for 9-letter words in the , maintaining the 256 file limit. Version 6, deployed in 1988 for games including Zork Zero and , added graphics support via opcodes such as @picture, mouse input, menus, sound, and a computationally advanced parser, doubling the story file size to 512 KB. Versions 7 and 8, devised by in 1995, extended the 512 KB limit of version 6 but were otherwise similar to version 5, with version 7 rarely used and version 8 applied nichely to large Inform-generated games requiring packed address scaling (e.g., byte address B = 8P for version 8). These versions introduced compatibility levels where interpreters must handle earlier formats, with dynamic and static memory combined not exceeding 64 KB across all versions, though total file sizes varied. Infocom maintained informal specifications for the Z-machine internally, without public documentation, until Nelson formalized them in The Z-Machine Standards Document, first released in draft form (version 0.2) in November 1995 and updated to version 1.0 around 1996, and version 1.1 in May 2006 (revised February 2014). This document standardized elements across versions 1 through 8, including header formats (e.g., release number and serial code in YYMMDD format like 970619), behaviors, organization, and expansion provisions for features like . Community extensions, such as the save-file format (version 1.4, November 1997), further standardized portable save states across interpreters by defining (IFF) chunks for and stack data, addressing Infocom's proprietary save incompatibilities.

Memory organization

The Z-machine employs a contiguous block of memory divided into distinct regions to support the execution of interactive fiction games, with the entire story file typically loaded into memory at startup. The layout begins with a fixed 64-byte header at address 0, which contains essential metadata including the machine version, memory configuration pointers, and a checksum for integrity verification. Following the header is dynamic memory, a writable region starting immediately after byte 63 and extending to the address specified in header word $0E (multiplied by 2 for byte addressing), used for mutable game state such as the object table and global variables. Static memory, which is read-only, occupies the subsequent region up to the start of high memory (indicated by header word $04 multiplied by 2), housing permanent data structures like the vocabulary dictionary and grammar tables. High memory, accessed indirectly, holds read-only code and resources including routines, Z-strings, and the call stack, extending to the end of the allocated memory block. Addressing in the Z-machine distinguishes between direct byte or word addresses in the lower memory regions and packed addresses for high memory to optimize space in the compact story files. Byte addresses are straightforward unsigned values for accessing dynamic and static , while word addresses represent even byte locations (multiplied by 2). Packed addresses, encoded in 1 to 4 bytes depending on the version, are unpacked via version-specific multipliers—such as multiplying by 2 for versions 1–3 or by 4 for versions 4–5—to compute locations in high memory, with versions 6–7 adding header-based offsets and version 8 using multiplication by 8. This scheme enables efficient referencing of routines and strings while limiting total memory; for example, version 3 supports up to 128 overall, with dynamic memory configurable but often around half that size in practice. Key data structures are allocated within these regions to manage game elements efficiently. The object table resides in dynamic memory (starting at the address in header word $0A), forming a hierarchical tree where each object entry includes attributes (bit flags for state, up to 48 in later versions), links to parent, sibling, and child objects, and pointers to property lists containing numerical or textual data; versions 1–3 limit objects to 255 with 9-byte entries, while versions 4+ expand to 65,535 objects using 14-byte entries. The dictionary, located in static memory (at header word $08), stores hashed vocabulary words as Z-character encoded strings for input parsing, typically supporting hundreds of entries sorted alphabetically, with entry sizes of 4 bytes in early versions increasing to 6 in later ones. Routine frames are pushed onto the call stack in high memory during execution, each comprising the return program counter, 0–15 local variables, and an evaluation stack for temporary values; the evaluation stack supports up to 256 entries across frames, though the overall call stack depth is limited only by available memory. Resource management in the Z-machine relies on manual allocation by game authors, as no automatic collection is provided, requiring careful packing of to minimize fragmentation and fit within constraints. Dynamic serves as a for runtime modifications, such as updating object attributes or allocating temporary , but authors must pre-arrange layouts to avoid exhaustion during play. File I/O is handled by loading the complete story file into upon initialization, with save states preserving the dynamic region; interpreters manage high access transparently, but fragmentation from growth or property additions can necessitate compression techniques in . Version-specific sizes influence these limits, such as 128 total for version 3 compared to 256 for version 5. To illustrate the conceptual memory map:
  • Header (0–63 bytes): Configuration and pointers.
  • Dynamic Memory (~64 bytes to ~32–64 KB): Writable heap (objects, globals); grows/shrinks via game logic.
  • Static Memory (~32–64 KB to ~64–128 KB): Read-only data (dictionary, grammar); fixed at compile time.
  • High Memory (~64–128 KB to end): Code and stack (routines, strings); indirect access via packing.
This organization ensures portability across hardware while constraining resource use for the era's computing limitations.

Instruction set and execution

The Z-machine employs an opcode-based instruction set where each instruction is encoded as a variable-length sequence ranging from 1 to 9 bytes, with opcodes numbered from 0 to 255. These opcodes are divided into forms based on the number and types of operands: zero-operand (0OP), one-operand (1OP), two-operand (2OP), (VAR), and extended opcodes (EXT, introduced via a special prefix in Version 5 and later). Common categories include stack operations such as @add (adds two values and stores the result) and @sub (subtracts one value from another), branching instructions like (jumps if the first operand equals any subsequent operand) and @jl (jumps if the first operand is less than the second), object manipulation opcodes including (retrieves a property value from an object), and input/output commands such as @print (outputs a literal ) and @call (invokes a routine with arguments). The execution model follows a classic fetch-decode-execute cycle within an interpreter loop, where the (PC) points to the current in the high memory region containing the game's code. The interpreter fetches the and operands from at the PC location, decodes them to determine the operation and data types (such as small constants of 0-255, large constants of 0-65535, or variables), executes the , and then advances the PC to the next byte position unless occurs. Branching uses a 1- or 2-byte after the operands; the high bit of the first byte (bit 7) is 0 to branch if the condition is false or 1 to branch if true. If the branch is taken, for a 1-byte offset O (0 to 63): if O=0, execute rfalse; if O=1, execute rtrue; otherwise, set PC to the position immediately after the branch data plus (O - 2). For 2-byte offsets, the offset is a signed 14-bit value with analogous special cases and adjustment by -2. Stack operations form a core part of the instruction set, supporting zero-operand instructions that implicitly use the evaluation (a last-in, first-out structure for temporary values), one-operand forms that take a single and often or pop from the , two-operand instructions that operate on two explicit values, and forms that specify the number of operands in a following byte. For instance, @store (opcode 13 in 2OP form) takes a and a value, storing the latter into the former to update game state such as player location or flags, while implicitly managing pushes for intermediate results in expressions. Operand types are encoded efficiently: are referenced by a 1-byte (0 for the stack top, 1-255 for or variables), allowing compact representation without . Flow control is managed through dedicated opcodes for subroutine calls, unconditional s, and . Routine calls like @call (VAR form, opcode 224) push the return and up to three arguments (or more in extended versions) onto the before transferring control to the routine's , with results optionally stored upon return. Loops and unconditional branches use @jump (1OP, opcode 140), which sets the PC to the current position plus a signed offset for arbitrary . In Versions 5 and later, error handling is supported by @catch (0OP, opcode 185 in V5/6), which pushes the current frame pointer for later use, and @throw (2OP, opcode 28), which unwinds the to a specified and returns a value. Unique to the Z-machine is its lack of interrupts, ensuring uninterrupted execution except for explicit operations like sound completion callbacks in later versions, which promotes predictable behavior. This deterministic model facilitates save and restore functionality: saves capture the full state and , while restores resume from the saved PC with an empty , guaranteeing identical execution paths across interpreters. The following summarizes the opcodes by form and category, with numbers, equivalents, store/branch capabilities (St for result storage, Br for conditional branching), and representative assembly syntax for clarity. Illegal opcodes in a given cause interpreter errors. The extended opcodes (EXT, prefixed by 190) are listed separately for versions 5+, including only defined ones.
FormDecimal RangeHex RangeSt/BrCategory Examples (Opcode: Name - Syntax)
2OP (Long form, small/variable operands)0-31 (small const, small const)
32-63 (small const, variable)
64-95 (variable, small const)
96-127 (variable, variable)
0x00-0x1F
0x20-0x3F
0x40-0x5F
0x60-0x7F
VariesBranch: 1: je a b ?L; 2: jl a b ?L; 3: jg a b ?L; 6: jin obj1 obj2 ?L; 7: test bitmap flags ?L; 10: test_attr obj attr ?L
Object: 11: set_attr obj attr; 12: clear_attr obj attr; 14: insert_obj obj dest; 17: get_prop obj prop -> r; 18: get_prop_addr obj prop -> r; 19: get_next_prop obj prop -> r
Stack/Math: 8: or a b -> r; 9: and a b -> r; 13: store var val; 15: loadw arr idx -> r; 16: loadb arr idx -> r; 20: add a b -> r; 21: sub a b -> r; 22: mul a b -> r; 23: div a b -> r; 24: mod a b -> r
Flow: 25: call_2s rout arg -> r; 26: call_2n rout arg; 27: set_colour fg bg (V5+); 28: throw val frame (V5+)
Check: 4: dec_chk var val ?L; 5: inc_chk var val ?L
1OP (Short form, large/small/variable operands)128-143 (large const)
144-159 (small const)
160-175 (variable)
0x80-0x8F
0x90-0x9F
0xA0-0xAF
VariesBranch/Object: 128: jz a ?L; 129: get_sibling obj -> r ?L; 130: get_child obj -> r ?L
Object: 131: get_parent obj -> r; 132: get_prop_len addr -> r
Stack: 133: inc var; 134: dec var; 142: load var -> r; 143: not val -> r (V3/4; VAR in V5+)
I/O: 135: print_addr addr; 141: print_paddr paddr
Flow/Object: 136: call_1s rout -> r; 137: remove_obj obj; 138: print_obj obj; 139: ret val; 140: jump ?L
0OP (No operands)176-191 (except 190=EXT)0xB0-0xBFNone (except Br on some)Flow/I/O: 176: rtrue; 177: rfalse; 178: print "str"; 179: print_ret "str"; 180: nop; 183: restart; 184: ret_popped; 186: quit; 187: new_line; 188: show_status (V3+); 191: piracy ?L (V5+)
Stack: 185: pop (V1-4; catch in V5/6)
Save: 181: save ?L (V1-4); 182: restore ?L (V1-4); 189: verify ?L (V5; unused in V1-4)
VAR (Variable operands, types in next 1-2 bytes)192-223 (2OP)
224-255 (VAR/EXT prefix)
0xC0-0xDF (2OP)
0xE0-0xFF (VAR)
VariesBranch: 193: call_1n rout ?L (V4+; illegal V1-3); 194: remove_obj obj ?L (V4+); 195: print_obj obj ?L (V4+); 196: ret val ?L (V4+); 197: jump ?L (V4+); 198: print_paddr paddr ?L (V4+)
Store: 199: load var -> r ?L (V4+); 200: not val -> r ?L (V5/6)
I/O: 201: call rout -> r ?L (V4+); 202: store var val ?L (V4+); 203: insert_obj obj dest ?L (V4+); 204: loadw arr idx -> r ?L (V4+); 205: loadb arr idx -> r ?L (V4+); 206: get_prop obj prop -> r ?L (V4+); 207: get_prop_addr obj prop -> r ?L (V4+); 208: get_next_prop obj prop -> r ?L (V4+); 209: add a b -> r ?L (V4+); 210: sub a b -> r ?L (V4+); 211: mul a b -> r ?L (V4+); 212: div a b -> r ?L (V4+); 213: mod a b -> r ?L (V4+)
Flow: 214: call_vs rout -> r (V4+); 215: store var val (V5+); 216: insert_obj obj dest (V5+); 217: loadw arr idx -> r (V5+); 218: loadb arr idx -> r (V5+); 219: get_prop obj prop -> r (V5+); 220: get_prop_addr obj prop -> r (V5+); 221: get_next_prop obj prop -> r (V5+); 222: set_attr obj attr ?L (V5+); 223: clear_attr obj attr ?L (V5+); 224: call_vs rout -> r (V5+); 225: store var val (V6+); 226: insert_obj obj dest (V6+); 227: loadw arr idx -> r (V6+); 228: read table parse (V5+; aread in Inform); 229: print_char ch (V5+); 230: print_num val (V5+); 231: random num -> r (V5+); 232: split_window lines (V4+); 233: set_window win (V4+); 234: output_stream num table (V5+; - in V4); 235: input_stream num (V5+); 236: call_vs2 rout -> r (V6+); 237: erase_window win (V6+); 238: erase_line value (V6+); 239: set_cursor_line row (V6+); 240: set_cursor_column col (V6+); 241: set_cursor_position row col (V6+); 242: buffer_mode on/off (V6+); 243: output_stream num table (V6+); 244: input_stream num (V6+); 245: set_font font -> r (V5+); 246: draw_picture pic y x (V6+); 247: picture_data table pic (V6+); 248: not val -> r (V6+); 249: call_vn rout (V6+); 250: call_vn2 rout (V7/8); 251: tokenise dict text parse (V5+); 252: encode_text dest src len (V5+); 253: copy_table dest src size (V5+); 254: print_table addr size table (V7+); 255: check_arg_count num ?L (V7+)
EXT (Byte 190 prefix + 0-255 number; V5+)N/A (second byte 0-255)N/AVaries0: save table bytes name prompt -> (result) (V5); 1: restore table bytes name prompt -> (result) (V5); 2: log_shift number places -> (result) (V5); 3: art_shift number places -> (result) (V5+); 4: set_font font -> (result) (V5+); 5: draw_picture picture-number y x (V6); 6: picture_data picture-number array ?(label) (V6); 7: erase_picture picture-number y x (V6); 8: set_margins left right window (V6); 9: save_undo -> (result) (V5); 10: restore_undo -> (result) (V5); 11: print_unicode char-number (V5+); 12: check_unicode char-number -> (result) (V5+); 13: set_true_colour foreground background (V5+); 16: move_window window y x (V6); 17: window_size window y x (V6); 18: window_style window flags operation (V6); 19: get_wind_prop window property-number -> (result) (V6); 20: scroll_window window pixels (V6); 21: pop_stack items stack (V6); 22: read_mouse array (V6); 23: mouse_window window (V6); 24: push_stack value stack ?(label) (V6); 25: put_wind_prop window property-number value (V6); 26: print_form formatted-table (V6); 27: make_menu number table ?(label) (V6); 28: picture_table table (V6); 29: buffer_screen mode -> (result) (V6+). Opcodes 14-15, 30-255 are reserved or undefined in the standard (50-127 reserved, 128-255 user-defined).

Implementations and interpreters

Original hardware and software interpreters

The original Z-machine interpreters developed by were primarily software implementations designed to run on specific hardware platforms of the , enabling the execution of Z-code files across diverse personal computers and systems. These interpreters emulated the Z-machine virtual architecture directly in , prioritizing performance on resource-constrained environments. The first such interpreters emerged for early microcomputers, with the inaugural versions created for the Model I by Scott Cutler and for the by Bruce K. Daniels around 1980-1981, written in platform-specific languages (Z80 for the Model I and 6502 for the ) to handle the initial ports of . These early efforts focused on text-based , mapping Z-machine opcodes to native instructions for efficient execution. Subsequent software interpreters expanded to other platforms, each optimized for the target system's processor and I/O capabilities. For instance, the interpreter, released in 1982, was coded in Z80 to support systems like the and Osborne 1. By 1983, an 8086 version arrived for on PCs, followed in 1984 by a 68000 for the Macintosh, which integrated with the system's Pascal-based tools and handled hierarchical file systems. The ST received its interpreter in 1985, also in 68000 , emphasizing non-PC ports that extended reach to and hobbyist markets. Development typically involved writing core logic in assembly for speed, with managed through platform-specific system calls, such as serial transfers from DEC-20 mainframes during testing. This approach ensured low overhead but tied interpreters tightly to hardware, limiting portability without recompilation. While predominantly software-based, some later implementations incorporated hardware-specific optimizations, such as the Amiga interpreter from around 1986-1987, which used 68000 assembly and C for audio handling to leverage the system's custom chips for sound effects. Similarly, ports to the Japanese PC-98 in 1987 adapted the Z-machine for its 8086-compatible architecture, though still as software emulation. Early interpreters supported only versions 1-5 of the Z-machine, restricting features to text adventures with no graphics; graphics and sound capabilities were not added until version 6 interpreters in 1987, as seen in games like The Lurking Horror. Distribution of these interpreters occurred alongside Infocom's games, bundled on floppy disks within physical game packages or included in collections like the Masterpieces of Infocom series starting in 1986. Standalone interpreters were occasionally sold separately for users to play multiple titles. By 1989, Infocom had developed interpreters for over 30 distinct platforms, including Commodore 64, , and TI-99/4A, demonstrating the Z-machine's role in achieving broad compatibility without altering game code. In November 2023, the source code for many of these original interpreters was publicly released, enabling further analysis and ports to modern systems.

Modern and portable interpreters

Modern interpreters for the Z-machine emphasize portability across contemporary platforms, leveraging open-source development to support a wide array of devices from desktops to and web browsers. These tools emulate the original specifications while incorporating enhancements for modern hardware, such as text rendering and integration, ensuring compatibility with legacy titles. One of the foundational modern interpreters is Frotz, originally developed by Stefan Jokisch in 1995 for Unix and systems. Written , Frotz complies with the Z-machine Standard 1.1 and provides full support for versions 1 through 8, with extensions for and sound through the Blorb resource format. Blorb, standardized in 1996, packages Z-machine stories with images and OGG audio files, allowing interpreters like Frotz variants (e.g., sfrotz) to display pictures and play sounds without proprietary tools. Bocfel, introduced in the early by Chris Spiegel, extends portability further as a multi-platform C-based interpreter supporting Z-machine versions 1-5, 7, and 8 fully, with partial version 6 compatibility. It features optimizations for low-end devices and integrates output for international text handling. Bocfel's lightweight design facilitates cross-compilation to various operating systems, including embedded systems like the . Web-based options like , launched in 2008 by Paul Thomas, enable browser play using JavaScript engines such as Quixe. supports Z-machine games directly in HTML5 environments, promoting accessibility without downloads, and integrates with the Interactive Fiction Database (IFDB) for seamless online playback. Its JavaScript foundation allows deployment on any device with a modern browser, including mobile. Save file compatibility across interpreters relies on the standard, formalized in 1997 by as an IFF-based format for portable game states. This ensures saves from one interpreter, such as Frotz, load in another like Bocfel, preserving progress in multi-platform play. Sound support in these tools often includes OGG via Blorb, with some legacy MIDI handling for older resources. Community-driven mobile adaptations include the port of Frotz, released in 2008, which adds touch-friendly interfaces while maintaining core Z-machine . Performance tweaks in interpreters like Bocfel target resource-constrained devices, reducing memory usage for smoother execution on smartphones and tablets. Recent advancements include Lectrote, developed by Andrew Plotkin starting in 2016 and updated through 2021, which wraps Z-machine (via the ZVM engine) in an app for desktop cross-platform use. Lectrote supports versions 3, 4, 5, and 8, with features like automatic transcripting for preservation. Preservation efforts benefit from archives like the Archive on archive.org, hosting Z-machine files for emulator access. A key challenge for modern interpreters remains full support for version 6 games, which rely on proprietary graphics formats not natively emulated on current hardware. While Blorb extensions address some V6 picture handling, complete fidelity requires specialized mappings, limiting seamless playback compared to text-only versions. As of 2025, interpreters like Bocfel remain actively integrated into and projects, with no major new developments reported since 2021.

Legacy and influence

Impact on interactive fiction

The Z-machine played a pivotal role in the commercial golden age of during the , enabling to release over 30 titles that standardized the parser-based text adventure genre. These games, such as and Deadline, leveraged the Z-machine's portability to reach diverse platforms, achieving peak annual sales of $10 million in 1984 through 725,000 units sold. This success established sophisticated natural-language parsing as a core mechanic, influencing competitors like On-Line to incorporate similar parser systems in their graphical adventures using the engine. The Z-machine's legacy extended into the 1990s revival of , where Graham Nelson's compiler—targeting the Z-machine—democratized game creation and sparked an explosion of free titles. This led to the inaugural XYZZY Awards in 1996, celebrating community-driven works, with over 1,000 Z-code games available by 2000 through archives and competitions like IFComp. Notable examples include Michael Gentry's (1998), a adventure that won Best Setting at the XYZZY Awards and exemplified the format's narrative depth. In terms of design, the Z-machine's strict memory constraints—typically 128 KB or less—fostered concise, evocative storytelling that prioritized implication over exposition, shaping the genre's emphasis on player imagination. enhanced this with "feelies," physical artifacts like maps and props included in game packages to extend the narrative beyond the screen, often integrating with save mechanics for immersive clues. The Z-machine's influence permeated , inspiring studies on procedural narrative where games like demonstrated dynamic, branching stories generated through code. In , has been used to teach logic and , as in classroom exercises where students map commands to simulate programming problem-solving. As of 2025, the Interactive Fiction Database lists over 600 games created with Inform for the Z-machine or compatible formats, underscoring its enduring role in indie .

Preservation and extensions

Efforts to preserve the Z-machine have centered on archiving story files and emulating the original hardware platforms that ran its interpreters. The Interactive Fiction Archive, established in 1993, serves as a primary repository for interactive fiction works, hosting thousands of Z-machine-compatible files in its /games/zcode directory, including both Infocom originals and community-created games. Emulation projects like MAME preserve the experience of running Z-machine interpreters on period hardware, such as the Apple II or Commodore 64, by replicating the underlying systems that Infocom targeted in the 1980s. The Z-machine specification was detailed in a document released by Graham Nelson in 1993, which is freely available under an open license, enabling open development and widespread preservation without legal barriers to the technical standard. The Interactive Fiction Technology Foundation (IFTF) has maintained and updated the standards document, with version 1.2 released in 2014, supporting continued development and interpreter compatibility as of 2025. Extensions to the Z-machine have enhanced its capabilities while maintaining , often through -driven standards. The Blorb format, introduced by Andrew Plotkin in 1998, bundles Z-code story files with multimedia resources like images and sounds into a single archive, simplifying distribution for interpreters supporting Versions 5 and 6. Standardized features such as and quicksave, defined in the Z-machine standards document, allow interpreters to store and revert game states efficiently, with undo implemented via the for rapid access during play. efforts have also expanded support for Version 6's native color capabilities, with interpreters like Frotz providing robust implementation of the 16-color palette for enhanced visual storytelling in compatible games. Modern adaptations integrate the Z-machine into contemporary environments, bridging text-based with graphical and immersive technologies. Tools like Andrew Plotkin's Ztools suite enable validation, disassembly, and analysis of Z-code files, aiding developers in maintaining and extending legacy works. Experimental projects in the 2020s have embedded Z-machine interpreters within , allowing hybrid that combines classic text adventures with 3D visuals or elements for more dynamic player experiences. Preservation faces challenges from restrictions and inherent design limitations. While the Z-machine specification is open, copyrights to Infocom's original games remain with , limiting legal distribution of those titles despite free access to the emulator ecosystem. The architecture lacks native networking support, confining it to single-player, offline scenarios and requiring external extensions for any multiplayer or online features. Looking ahead as of 2025, the Z-machine's modular design positions it for potential revival in AI-driven , where its lightweight could serve as a backend for procedurally generated narratives, though such applications remain exploratory.

References

  1. [1]
    Appendix D. A short history of the Z-machine - Inform 6
    The original purpose of the Z-machine was simply to implement as much as possible of the mainframe game "Zork" on the first popular wave of home computers.
  2. [2]
    The Z-Machine Standards Document: Preface
    ### Summary of Z-Machine Standardization, Graham Nelson's Role, and Legacy
  3. [3]
    [PDF] The History of Zork First in a Series - samizdat drafting co.
    The key to their design was an imaginary computer chip called the “Z-machine.” This chip would be able to run Zork (or at least part of it) if the program were ...<|control11|><|separator|>
  4. [4]
    The Z-Machine Standards Document: Contents
    - **Z-Machine Confirmation**: Yes, Z-machine is a stack-based virtual machine.
  5. [5]
    ZIL and the Z-Machine - The Digital Antiquarian
    Jan 7, 2012 · ... Infocom's own virtual machine, the Z-Machine. In opting for a virtual machine they would of course have to pay the performance penalty all ...
  6. [6]
    [PDF] The History and Nature of Interactive Fiction - DSpace@MIT
    Infocom developed more than thirty interactive fiction works in its productive decade. The company began by publishing a trilogy based on the mainframe Zork.
  7. [7]
    [PDF] The Z-Machine Standards Document - wolldingwacht
    Aug 26, 1997 · and Graham Nelson, author of the assembly level of Inform. They do not correspond to Info- com's unpublished opcode names. This Standard was ...
  8. [8]
    History of Infocom
    Two of those, sometime early in 1977, that couldn't stop playing were Dave Lebling and his friend Marc Blank from the Massachusetts Institute of Technology, ...
  9. [9]
    Infocom's "Zork," the First Interactive Text Adventure Game to See ...
    Tim Anderson ·, ; Marc Blank ·, ; Bruce Daniels ·, and ; Dave Lebling · of the MIT Dynamic Modeling Group wrote the interactive fiction text adventure game ; Zork ...Missing: authors | Show results with:authors
  10. [10]
    The History of Zork -- First in a Series - The Interactive Fiction Archive
    Infocom was incorporated in 1979 by various people from the DM group, including Marc, Dave, and me. It was not founded to sell ZORK; rather, it was founded to ...<|separator|>
  11. [11]
    Stick to What You Know: Infocom and the Perils of Expansion
    MIT students Marc Blank and Dave Lebling didn't intend to focus on entertainment software when they founded Infocom in 1979. But they'd already developed a text ...
  12. [12]
  13. [13]
    [PDF] Learning ZIL - E BLONG
    Feb 25, 2002 · When writing ZIL code, all global variables, room names, and object names must be preceded by a comma. However, local variables, those defined ...Missing: OPAL | Show results with:OPAL
  14. [14]
    What is ZIL anyway? - Zarf Updates
    Apr 17, 2019 · Infocom would write a game in ZIL, or "Zork Implementation Language" -- a high-level language derived from MDL. A compiler called ZILCH would then compile the ...<|control11|><|separator|>
  15. [15]
    zil-course.fwf - E BLONG
    The Z System is composed of the various modules which are used to create INTERLOGIC games. At the highest level is Z Implementation Language (ZIL), which is an ...<|control11|><|separator|>
  16. [16]
  17. [17]
    The Obsessively Complete Infocom Catalog - E BLONG
    Original Zork, MDL version. The "mainframe" version of Zork/Dungeon, created at MIT between 1977 and 1979. This package, unlike the others on this site, is ...
  18. [18]
    Infocom - IFWiki
    Oct 10, 2025 · The company merged with another game company, Activision, in 1986. In 1989 Activision effectively dissolved what was left of Infocom. Activision ...
  19. [19]
    An Unlikely Savior | The Digital Antiquarian
    Apr 19, 2019 · Six months after Levy had acquired Infocom, the preeminent maker of artsy computer games, in mid-1986, he was forced out by his board. Levy's ...
  20. [20]
    Inform 6
    Inform is a design system for interactive fiction, created in 1993. This home page. Welcome · Resources · Support · ZMachine.
  21. [21]
    Inform - IFWiki
    Inform is an interactive fiction programming language, created by Graham Nelson in 1993 and now one of the most popular IF development systems.<|separator|>
  22. [22]
    Inform 6 - IFWiki
    Oct 2, 2025 · Inform 6 made its debut on April 30th, 1996, and it continues to be one of the most popular IF development systems even after the introduction ...
  23. [23]
    The Z-Machine Standards Document: Preface - Inform 6
    The first vesion of this Standard was drawn up in November 1995, drawing on a rougher description written in 1993 and, before that, sketches of table formats by ...
  24. [24]
    [PDF] The Inform Designer's Manual - The Interactive Fiction Archive
    ... features not present in Informese. §35 Case and parsing noun phrases ... ZSCII; specifying pronouns and descriptors; translating natural languages to ...
  25. [25]
    DM4 Introduction - Inform 6
    Having started as a revival of the then-disused Infocom adventure game format, the “Z-Machine”, Inform came full circle when it produced Infocom's only text ...
  26. [26]
    Inform - EPFL Graph Search
    Early release of Inform 7 did not support Glulx, but in August 2006 Glulx support was released. Inform was originally created by Graham Nelson in 1993. In ...
  27. [27]
  28. [28]
    Search for Games - The Interactive Fiction Database
    IFDB is a game catalog and recommendation engine for Interactive ... Results for format:Z-code. 1–100 of 1804. Search tips. Learn more about search ...
  29. [29]
    Curses - IFWiki
    Release 9 / Serial number 931111 (Compiled by Inform v784) · IFID: ZCODE-9-931111-914E IFID links: IFDB · Released alongside Inform 3. · "Release 9 is the third ...
  30. [30]
  31. [31]
    8. The screen model - The Z-Machine Standards Document
    An interpreter should ideally provide 4 fonts, with ID numbers as follows: 1: the normal font 2: a picture font 3: a character graphics font 4: a Courier-style ...Missing: Menagerie | Show results with:Menagerie
  32. [32]
    Z-machine versions - IFWiki
    Mar 3, 2024 · Graham Nelson made some minor extensions in 1995 to allow for larger story files, creating versions 7 and 8 of the spec. (The immediate ...Missing: 1996 | Show results with:1996
  33. [33]
    The Quetzal Z-Machine Saved Game Standard - Inform 6
    The only required chunks are IFhd, either CMem or UMem, and Stks. The total overhead to a save file is 12 bytes plus 8 for each chunk; in the minimal case (IFhd ...
  34. [34]
    [PDF] The Z-machine, And How To Emulate It
    Nov 28, 1996 · I draw heavily on the definitive guide to the Z-machine and its history, Graham Nelson's “Specification of the. Z-machine” [Nelson]; in fact, ...
  35. [35]
    4. How instructions are encoded - Inform 6
    4.1. A single Z-machine instruction consists of the following sections (and in the order shown): Opcode 1 or 2 bytes (Types of operands) 1 or 2 bytes: 4 or 8 ...
  36. [36]
    14. Complete table of opcodes - The Z-Machine Standards Document
    This table contains all 119 opcodes and, taken with the dictionary in S 15, describes exactly what each should do. In addition, it lists which opcodes are ...
  37. [37]
    The Z-Machine Standards Document
    ### Summary of Z-machine Execution Model
  38. [38]
    Appendix D. A short history of the Z-machine
    ... Z-machine's portability gave Infocom a unique advantage over its competitors. Also, it was an expertly marketed quality brand at a time when standards of ...Missing: ZSCII | Show results with:ZSCII
  39. [39]
    Historical source code for Infocom's Z-machine interpreters - GitHub
    A collection of Infocom's original Z-code interpreters for various home computers of the 1980s. Most of the interpreters are provided as assembly source code.Missing: Language | Show results with:Language
  40. [40]
    All that Infocom interpreter code - Zarf Updates
    Nov 21, 2023 · That's how we got the first open-source IF interpreters and the modern Z-machine specification. Functionally, we know how they work. But we ...
  41. [41]
    Frotz - GitLab
    Nov 23, 2023 · Frotz is an interpreter for Infocom games and other Z-machine games. It complies with the Z-Machine Standard version 1.1. It was written by Stefan Jokisch in ...
  42. [42]
    Blorb: An IF Resource Collection Format Standard - E BLONG
    The Z-machine's graphics and sound capabilities were added late in Infocom's history, but early in the history of data format standardization. As a result, the ...
  43. [43]
    sfrotz - interpreter for Infocom and other Z-Machine games (SDL ...
    Graphics and sound are created through the use of the SDL libraries. AIFF sound effects and music in MOD and OGG formats are supported when packaged in Blorb ...
  44. [44]
    Overview - Bocfel - GitHub Pages
    Overview. Bocfel is an interpreter for the Z-machine. It fully supports versions 1-5, 7, and 8, and contains partial support for ...
  45. [45]
    Bocfel - IFWiki
    Bocfel is an interpreter for the Z-machine, made by Chris Spiegel. It fully supports Z-machine versions 1-5, 7, 8, and contains partial support for version 6.
  46. [46]
    A Pico Z-machine - Raspberry Pi Forums
    I've finished a rough port of the bocfel Z-code interpreter for the Pico. To avoid confusion, I have decided to call it pocfel.
  47. [47]
    Parchment - Google Code
    Parchment is a web interactive fiction interpreter powered by the Gnusto and Quixe engines. Using bleeding-edge Javascript technologies.
  48. [48]
    Introducing Parchment - Toolness
    Jun 15, 2008 · Introducing Parchment. A few weeks ago, I started a small project to create a user interface for something called a Z-Machine: a virtual machine ...
  49. [49]
    Parchment
    Parchment. is an interpreter for ... Or, click here to play a story file on your device. Parchment requires Javascript. Please enable it in your browser.
  50. [50]
    ifrotz/iosfrotz: Frotz for iOS source (formerly at code.google ... - GitHub
    The original Unix Frotz 2.4.3 and the iOS port source are distributed under the GNU GPL V2; see below. Frotz for iOS also uses optional minizip and zlib ...
  51. [51]
    Frotz - App Store - Apple
    Rating 4.8 (252) · Free · iOSFrotz lets you play hundreds of free works of Interactive Fiction (a.k.a. text adventure games) on your iPhone or iPad. Frotz plays titles written in the Z- ...
  52. [52]
    erkyrath/lectrote: The IF interpreter in an Electron shell - GitHub
    It's also not as fast as a native interpreter. Z-code support. Lectrote uses the ZVM interpreter for Z-machine support. (V3/4/5 and V8 only.) Hugo support.
  53. [53]
    Introducing Lectrote, an interpreter - Zarf Updates
    Today I posted the beta of Lectrote, a new IF interpreter application for Mac, Windows, and Linux. This is both more and less exciting than ...
  54. [54]
    Releases · erkyrath/lectrote - GitHub
    Lectrote 1.5.3 (From 1.5.0:) Universal transcript mode! A transcript is saved for every game you play. Select the "Browse Transcripts" menu option to see a ...
  55. [55]
    Index: if-archive/infocom/interpreters/specification
    The Z-Machine Standards Document Version 1.1 (also known as "The Specification of the Z-Machine"), by Graham Nelson. This is the version 1.0 document with ...
  56. [56]
    Games by Infocom
    • Quarterstaff. • Zork Zero. • BattleTech. 1989. • Shogun. • Journey. • Arthur. Releases past 1989 are not included, as on those Infocom is only used as a label ...
  57. [57]
    Down From the Top | The Digital Antiquarian
    Apr 3, 2014 · Infocom had sold 725,000 games worth $10 million in 1984. They judged that their game sales were likely to continue to steadily increase, ...Missing: revenue | Show results with:revenue
  58. [58]
    Sierra AGI Adventure Game Interpreter - jsyang.ca
    Jan 18, 2021 · My holiday project of implementing a Sierra AGI web runtime is coming along nicely. The game engine was revolutionary for its time.Missing: Z- standardization parser influence
  59. [59]
    1993: Curses - by Aaron A. Reed - 50 Years of Text Games
    Jun 10, 2021 · A grad student's side project spawns a text games renaissance, leading to thousands of new games and decades of innovation.Missing: revival | Show results with:revival
  60. [60]
    Index: if-archive/games/zcode
    This directory contains games in Infocom Z-Machine format, not games published by Infocom, and can be played with an Infocom game interpreter.
  61. [61]
    Anchorhead - Details - The Interactive Fiction Database
    Nov 16, 2015 · The original .z8 game file, first published in 1998. This version is still free to play. Play Online. Or download anchor.z8 and ...Missing: machine | Show results with:machine
  62. [62]
    Appendix E. Statistics - The Z-Machine Standards Document
    'Zork I' uses only about 5500 opcodes, but the number rises steeply with later games; 'Hollywood Hijinx' has 10355 and, e.g. 'Moonmist' has 15900 (both these ...
  63. [63]
    Obtaining Infocom games and necessary feelies
    Apr 11, 2023 · I discovered 31 Infocom games were released in five collections, and can be found on ebay. I was wondering if these collections handle feelies well enough.Can Infocom games be downloaded or played for free?Best "modern" way to play old Infocom games?More results from intfiction.org
  64. [64]
    [PDF] Game Lessons: Using Zork to Show Students What Computers Teach
    Steps included working out programming commands at a desk at home with a pencil and paper; going from home to school to type up the handwritten notes on a ...
  65. [65]
    Search for Games
    - **Total Count**: 612 games tagged or using Inform/Z-machine.
  66. [66]
    Z-machines for various 8-bit platforms - Authoring
    Sep 2, 2023 · I'm wondering what z-machine interpreters are available on retro systems of the 80's. Platfom examples: Atari 8-bit, ADAM, Apple IIe, C64, etc.Infocom Z-code interpreters - Page 2How much work is writing a Z-Machine interpreter?More results from intfiction.orgMissing: original hardware software
  67. [67]
    15. Dictionary of opcodes - The Z-Machine Standards Document
    (This call is typically needed once per turn, in order to implement "UNDO", so it needs to be quick.) scan_table. VAR:247 17 4 scan_table x table len form ...
  68. [68]
    zcode-interpreter(6) — frotz — Debian testing
    Nov 14, 2017 · Sets the default background color. <colorname> corresponds to one of the Z-machine colors, which are as follows: black red green yellow blue ...
  69. [69]
  70. [70]
    Z-Machine Tools as Future Narrative Middleware?
    Aug 16, 2021 · Many Unity/Unreal games have a narrative/dialogue middleware library. Some of them use Ink or Yarnspinner for this; others have a custom ...Missing: VR 2020s
  71. [71]
    Infocom - Wikipedia
    Infocom ; June 22, 1979; 46 years ago (1979-06-22) · Tim Anderson; Joel Berez; Marc Blank; Mike Broos; Scott Cutler; Stu Galley; Dave Lebling · J. C. R. Licklider ...
  72. [72]
    CircuitPython Z-Machine for Adafruit Fruit Jam - GitHub
    Sep 24, 2025 · Some advanced Z-machine features may not work; Limited to Z-machine version 3; No networking features. Credits. Based on the A2Z Machine by Dan ...
  73. [73]
    From Infocom to 80 Days: An oral history of text games and ...
    Jun 20, 2024 · And certainly the major games companies aren't now using Inform to sell text adventures. But they do use Inform, in 2024, as a prototyping tool ...