1980 · Infocom

About this page

This minisite was contributed by air. It’s agent-generated and needs a human editor. Clone https://github.com/gamesexplained/gamesexplained and follow kit/START.md to curate games/apple2/zork-i with me to Gold.

Footprint

Every byte of the Apple II's main 64 KB, one pixel each, 512 to a row. Lit pixels are what this game is: its code, graphics, level data, sound, text, tables and variables, exactly where they sit in memory. Dim areas are screen and working memory; dark is unused.

Status

Tiersilver
Coverage100 % of the 27,048 bytes in memory, and none of the 63,488 bytes of its program the game reads from the disk during play: in all, 30 % of the bytes the game uses have a description
Comments checkedNot audited. No audit has checked every comment, and the last sample of 80 comments had 7 wrong, so between 4 and 17 % of the listing’s comments are likely wrong. How listings are checked
Build analysedInfocom's original disk, release 15, serial number UG3AU5: Zork I r15-UG3AU5.woz (SHA-1 f76f5449...d87a2) from archive.org's A Woz A Day collection, item wozaday_Zork_I_r15; analysed at the Z-machine's start, when the interpreter has read the story's first $48 pages (orientation.md)
Copyagent-draft
Toolsemulator: Apple2TS 3.7.0 (git c900979), bundled by the kit into its server (kit/apple2), a 128K enhanced Apple IIe; check-emulator 42 passed, 0 failed, on 19 October 2026, disassembler: regenerator2000 0.9.20 in its Apple II mode, driven through kit/apple2/r2000.py, host: Linux 6.18 x86_64, Ubuntu 24.04, a hosted cloud session with no display, python: 3.13.16, node: 22.22.0
Modelclaude-opus-5-5[1m]
Kit version0.0.202

How the listing was checked

Every step that measured the Source tab’s comments or made them more accurate, in the order it happened, with the models that did it. Accuracy of the Source explains each step and what the row above makes of them.

StepByWhat it foundOf the listing
Researchclaude-opus-5-5[1m]Looked the game up online (its manual, reviews or wiki pages) before reading its code.
Annotationclaude-opus-5-5[1m]Wrote the listing’s comments. 100 % of the program is described, in 927 comments.
Sample 1claude-opus-5-5[1m]7 of 80 comments wrong, so between 4 and 17 % of the listing is likely wrong. All 7 were then corrected.
60 of the 330 comments written by hand and 20 of the 597 a decoder of the story file wrote; seven by hand wrong in a detail, all corrected with the three comments that said the same

likely wrong the sample’s range corrected right, or likely right not yet measured

Contributors

Other places to love this game

What the game does, and where we found it

Read this before annotating code. What the game is documented to do, with verification status against the binary. Statuses: open (documented, not found yet), traced (in the code, could not be exercised; say what was tried), confirmed (in the code, consistent with the emulator), live (observed directly), differs (the code does something else). "Absent" is not a status.

The game is two programs. Infocom's interpreter, 6502 code on tracks 0 to 2 of the disk, runs the machine: the screen, the keyboard, the disk, the printer. The story, Z-machine code and data on tracks 3 to 22, is the game itself: the parser, the rooms, the objects and every sentence. A feature of the machine is found in the interpreter; a feature of the game is found in the story, which the interpreter runs.

Sources:

Features

The machine: loading, screen, keyboard, disk, printer

FeatureStatusWhere
Runs on any Apple II with 32K and one 16-sector drive (the card; the disk's own description)liveboots on the kit's 128K IIe to West of House in 25 s of the machine's time
Boots from drive 1 with the power on; an autostart ROM spins the disk, otherwise 6 CTRL-P (the card)livethe IIe's boot ROM reads track 0 sector 0; orientation.md
A language card or 16K RAM board makes it faster (the card)differsrelease 15's interpreter never switches a language card on: the only references to $C080-$C08F in the code it runs are indexed by the slot, for the disk drive, and the top of RAM it looks for is $BF00 at most ($1B6F), so a 64K machine gets the same 76 page buffers as a 48K one. 56 dead bytes at $2BC8 would write-enable the card, but nothing runs them. The card may describe a later interpreter
The story is fetched from disk as it is needed, and more memory means fewer disk reads (the 1980 manual)livethe story's first $48 pages stay at $2C00-$73FF; every other page is read into one of the buffers from $7400 up to the top of RAM, 76 with 48K and 12 with 32K ($08C8), and the buffer used longest ago is reused ($1752, $1801). At West of House fourteen buffers hold pages the first turn needed
Type up to two full lines; the left arrow erases; RETURN ends the line (the card)livethe Monitor's GETLN1 reads the line ($1D42), so the left arrow rubs out; 99 characters reach the parser, the text buffer's size of 100 less the RETURN: 95 spaces and frobozz gave I DON'T KNOW THE WORD 'FROB'.
[MORE] in the bottom left when a description will not fit; the space bar shows the rest (the card)livelook. look. look. look. look fills the window and stops at [MORE] in inverse; a key shows the rest ($1C5B). Any key will do, not only the space bar
Status line at the top, updated after every move: the room's name, then SCORE: score/moves (the card)liveWest of House shows SCORE: 0/0, the cellar SCORE: 35/11; the words in inverse video, the spaces between them normal
SCRIPT and UNSCRIPT start and stop a transcript on a printer card in slot 1 (the card)tracedthe story sets bit 0 of header byte $11; while it is set each line goes through the slot 1 hook at $C100 as well as to the screen ($1BE2, $1BF2), and the first line is preceded by CONTROL-I 80N. The kit's IIe has no printer card, so it was not run
SAVE: up to eight positions, 0 to 7, on a storage diskette; prompts for position, slot (default 6) and drive (default 2), then -PRESS 'RETURN' KEY TO BEGIN-; OK or FAILED (the card)livein the cellar, save to position 1 in drive 2 printed OK.; a position is four tracks from track 3 + 4 × position, so eight fill tracks 3-34 ($2064, $1DC1)
RESTORE takes the same steps (the card)liveafter walking north to the troll, restore from position 1 printed OK. and look was back in the cellar ($20FD)
A one-drive player swaps disks: PLEASE RE-INSERT GAME DISKETTE (the card)tracedafter a save or restore that used slot 6, drive 1, $201E prints PLEASE RE-INSERT GAME DISKETTE, and waits for RETURN
Storage diskettes are initialised as standard Apple disks, DOS 3.3 or Pascal (the card)tracedthe disk routines find each sector by its address field ($2544), so the disk must be formatted already; the format routine at $2AAF is in memory but nothing calls it. A save writes whole data fields with its own D5 AA BC, so a save to position 3 (tracks 15-18) writes over a DOS 3.3 disk's catalog, which starts on track 17 (apple2-reference, "The disk")
The game diskette runs only from the main drive (the card)tracedthe story is read through the parameter block at $1DAC, which start-up sets to slot 6, drive 1 and $201E puts back after every save and restore
A mild copy protection: the data fields of tracks 1 to 22 begin D5 AA BC, where DOS writes D5 AA AD; 4am's crack changes two bytes of track 0 sector 2 from BC to AD (the crack's notes)confirmedthe disk routines read only D5 AA BC ($24DC) and write it too ($242A); disk.py info reads tracks 1-22 only with --data D5AABC. The two bytes are the BC of the write and read routines, the operands of LDA #$BC at $245C and CMP #$BC at $24FB, in page $24, which the boot reads from track 0 sector 2 (DOS's numbering; physical sector 11)

The game: the parser

FeatureStatusWhere
Words are known by their first six letters; case does not matter (the 1980 manual)livethe dictionary holds six Z-characters a word (across, advert, ancien); typed in lower case, the game answers in capitals
Several hundred words (the 1980 manual)live617 dictionary entries, punctuation included
Multiple objects with AND or a comma; ALL, ALL BUT, EXCEPT (the 1980 manual)live (ALL, ALL BUT)take all took the leaflet and answered for the mailbox and the door, each by name; drop all but mailbox dropped the leaflet
Several sentences on one line, separated by THEN or a full stop (the 1980 manual)liveopen mailbox then take leaflet and drop leaflet. take all each did both. The dictionary marks then, . and , as words of their own
Two kinds of question: WHERE IS (find) and WHAT IS (examine) (the 1980 manual)livewhat is a grue describes the grue; where is the zorkmid answers
A missing object is guessed and announced, (with the rope), or asked for, With what? (the 1980 manual)live (asking)take alone: WHAT DO YOU WANT TO TAKE?; read leaflet with the leaflet in the open mailbox: (TAKEN)
Complaints: I don't know the word, I can't use the word ... here, You must supply a verb!, There is a noun missing in that sentence, Too many noun clauses, Multiple objects cannot be used with, I don't understand that sentence, Beg pardon?, It's too dark to see, I can't see any ... here (the 1980 manual)live (five)frobnicate, open the take, an empty line, and put the troll in the basket with the shovel give the first, second, eighth and fifth; release 15 prints TOO MANY NOUN CLAUSES?? with two question marks
Talking to characters, GNOME, GIVE ME THE KEY, and quoted speech (the 1983 manual only)differsthe 1980 manual does not mention it, and release 15's dictionary has no say, tell, ask or answer: say "hello" gave I DON'T KNOW THE WORD 'SAY'. and mailbox, open gave YOU MUST SUPPLY A VERB! (live)

The game: commands

FeatureStatusWhere
Directions N, S, E, W, NE, NW, SE, SW, U, D (the 1980 manual); IN and OUT in places (the 1983 manual)live (some)north, east, west and down walk from West of House to the cellar
VERBOSE, BRIEF and SUPERBRIEF (the 1980 manual)liveMAXIMUM VERBOSITY., BRIEF DESCRIPTIONS., SUPER-BRIEF DESCRIPTIONS.
LOOK or L, INVENTORY or I, DIAGNOSE (the 1980 manual)live (inventory, diagnose)YOU ARE EMPTY HANDED.; YOU ARE IN PERFECT HEALTH.
SCORE with a rank (the 1980 manual)liveYOUR SCORE WOULD BE 0 (TOTAL OF 350 POINTS), IN 0 MOVES. and the rank BEGINNER
QUIT or Q, RESTART (the 1980 manual)liveq and y print the score and -- END OF SESSION --, and the interpreter stops in a loop ($21BD); restart and y print the banner and West of House again, read afresh from the disk ($1B69)
WAIT, VERSION, AGAIN (the 1980 manual)live (version, again)VERSION prints the banner with RELEASE 15 / SERIAL NUMBER UG3AU5
BUG: "it may have a different opinion" (the 1980 manual)liveIF THERE IS A PROBLEM HERE, IT IS UNINTENTIONAL.
Command files with @ (the 1980 manual, PDP-11 only)openthe card does not mention it

The game: the world

FeatureStatusWhere
Treasures score when found and again when put in the trophy case; points for actions and for visiting places; a penalty for dying (the 1980 manual)liveentering the kitchen and the cellar raised the score to 35; the egg put in the trophy case raised it by 5; dying in the dark cellar took 10 away. Property 13 pays for finding a thing or a place (story $61EA), property 12 for each treasure in the case (story $898C), and story $6467 takes the 10 (facts.md, "The score")
350 points in alllivethe SCORE command
Nineteen treasures (Wikipedia, of the game in general)confirmed21 objects carry a property 12, the points they are worth in the trophy case. Two are the broken canary and the broken egg, which take the place of the canary and the egg, so nineteen treasures can be in the case at once, worth 129 (story $898C). Live, the egg in the case scored 5, its property 12
Time passes only when the player moves, a tick a move (the 1980 manual)open
The thief, a pickpocket interested only in valuables (the 1980 manual)open
Containers that open and close, transparent or not, with a capacity; objects have sizes; surfaces (the 1980 manual)open
Characters fight back and may attack unprovoked; DIAGNOSE shows the wounds (the 1980 manual)live (diagnose)YOU CAN BE KILLED BY A SERIOUS WOUND.
Vehicles carry the player to places out of reach on foot (the 1980 manual)open
Passages twist: north then south need not lead back (the 1980 manual)livewest from West of House is a forest, and east from there is the Forest Path. Every exit is a room's property, read by story $6808, so nothing makes an exit lead back (facts.md, "Exits")
Dark places need a light, or a grue eats the player (Wikipedia; the game's answer to what is a grue)livein the cellar without the lamp, east, where the cellar has no exit, gave OH, NO! YOU HAVE WALKED INTO THE SLAVERING FANGS OF A LURKING GRUE!. In the dark, a direction with no exit rolls random 100 and kills on 1-74 (story $68B9)
The lamp, the sword that glows near enemiesliveTHE LAMP IS NOW ON.; YOUR SWORD IS GLOWING WITH A FAINT BLUE GLOW. in the cellar

Beyond the documentation

Found in the code or the dictionary, not in the manuals. Each is in facts.md with the routine it comes from.

Open questions

The symbol map for this game is symbols.json; the listing behind the Source tab is listing.json. Write-ups, facts and symbol maps are CC BY-SA 4.0. The game itself is not hosted here.