1994 · Psygnosis

About this page

This minisite was contributed by air, Nico-van-der-Zijden. It’s agent-generated and needs a human editor. Clone https://github.com/gamesexplained/gamesexplained and follow kit/START.md to curate games/c64/lemmings with me to Gold.

Footprint

Every byte of the C64's 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.

This game is in 5 parts. The map is of Resident: the loader and the variables, which stays in memory; the band marked as varying holds whichever of the 4 parts loaded over it is there. The Source tab has the listing of each part that has one.

Status

Tiersilver
Coverage100 % of the bytes the game uses have a description
Comments checkedNot audited. No audit has checked every comment, and the last sample of 60 comments had 7 wrong, so between 6 and 22 % of the listing’s comments are likely wrong. How listings are checked
Build analysedPAL disk release, three disks (Psygnosis 1994), the boot disk unpatched; five parts: the resident loader, the intro, the menu, the game at level 1 of Fun's briefing, and the end sequence
Copyagent-draft
Toolshost: Linux 6.18 x86_64 (WSL2) on Windows 11, Ubuntu 26.04.1, Intel Core i7-3770, eight threads, display through WSLg, emulator: own build of github.com/barryw/vice-mcp, release v3.13.2, commit 1e83aab134, built with tools.py get-vice build; driven through kit/c64/vice.py; check-emulator 57 of 57, disassembler: regenerator2000 0.9.20, publication: Python 3 and Node.js; symbols_export.py, listing.py, frame.py; work/levels.js, maps.js, mkmusic.js and mktunes.js unpack the levels and tunes on the kit's 6502
Modelclaude-opus-5-5
Kit version0.0.204

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-5Looked the game up online (its manual, reviews or wiki pages) before reading its code.
Annotationclaude-opus-5-5Wrote the listing’s comments.
Sample 1claude-opus-5-57 of 60 comments wrong, so between 6 and 22 % of the listing is likely wrong. All 7 were then corrected.
Annotationclaude-opus-5-5[1m]Wrote the listing’s comments. 100 % of the program is described, in 1,970 comments.
the picture bitmap's buffer, a stream header and the terrain shapes past a label described; the end sequence's first 15 bytes excluded with the reason

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. Every address names its part.

Sources:

Credits, from the title scroller ($5A49, menu part), which the C64-Wiki and the diary agree with: "Lemmings by DMA Design", "C64 Version by E&E SOFTWARE", programmed by Thomas Mittelmeyer, graphics by Leon van Rooy, Alain Janssen and Nikaj Eyk, audio by Jeroen Tel (Maniacs of Noise), additional graphics by Remi Ebus and Thomas Mittelmeyer, produced by Greg Duddle, project management by Remi Ebus, "Copyright 1993 Psygnosis". The manual also credits Jeff Culshaw with testing. The play engine's sound driver carries the text "(C) 1993 JEROEN TEL / MANIACS OF NOISE" ($3009, game part). The disks are printed © Psygnosis 1994.

Features

FeatureStatusWhere
Copy protection: a number from one of sixteen tables in the manual, picked by the lemming picture beside itlivecode_sheet ($A0D8, menu part). The page (0-15) and line (0-19) come from mixing the raster line ($9EF6); every number is the page's first ($A070/$A080) plus 23,171 per line, less 56,831 when the sum reaches it. All 320 match the game's code (test_code_sheet.js); the manual's tables checked by eye on pages 15 and 18
Title menu: 1 starts the game, 2 the intro, 3 enters an access code, 4 switches music and sound effects, cursor up and down the ratinglive (1, 3, 4), traced (2, cursor)title_screen ($9195, menu part). 1, 3 and 4 tried on 20 October 2026 (work/menurun.py); cursor down left the rating at Fun as the run drove the keyboard, so the rating keys are traced only
Four ratings, Fun, Tricky, Taxing and Mayhem, 25 levels eachconfirmedthe names at $9D64 (menu part); one disk side each, 25 level files a side; level_number ($CB48, resident part) runs 0-99
100 levels ("100 brain-teasing levels", title scroller)confirmedall 100 level files unpacked with the game's own code and drawn (levels.html, work/levels.js, work/maps.js). The diary's 120 was a plan
An access code for each levelliveten letters in each level's header ($E005, game part) and in a table of all 100 (access_codes, $9701, menu part). the access code prompt answered WANNABFREE (reference/cheat-mode.png); the end screen prints the next level's code (reference/cheat-level-end.png). Another level's code typed at the prompt was not checked on screen
Each level's briefing: number of lemmings, percentage to save, release rate, time, ratinglivefrom the level header at $E000 (game part); level 1: "Just dig!", 10 lemmings, 10 % to be saved, release rate 50, 5 minutes, Fun (reference/briefing-fun1.png). All 100 in levels.html
Eight skills with a count each: climber, floater, bomber, blocker, builder, basher, miner, diggerconfirmedthe counts at $E044/$E04C in the header, in the panel's order; the eight routines that give a skill from $15BA/$15C2 (game part); 21 action handlers from $1E6A
Keys 1-8 pick a skill, + and - change the release rate, fire gives the skill to the lemming under the cursortracedread_keys ($0A5A) and key_action ($0AB4, game part): 1-8, +, -, SHIFT, DEL and the back arrow; the rate goes no lower than the level's own and no higher than step 23
SHIFT pauses; DEL twice blows up every lemminglive (pause), traced (nuke)key_action ($0AB4); pause used live on 20 October 2026
Run/Stop returns to the menu (C64-Wiki)differsthe play engine reads no RUN/STOP; the back arrow ends the level, and only while paused ($0AF5, game part). Live, 20 October 2026
Mouse or joysticktracedjoystick on port 2 (read_joystick, $0B3C); a 1351 mouse through the SID's paddle registers (read_mouse, $1704, game part; the menu's test at $A279). No mouse was attached in VICE
The panel shows the type under the cursor, lemmings out, saved percentage and time leftlivedraw_panel_text ($29B5, game part); reference/play-fun1.png
A five-second count over a bomber before it explodestracedcount digits drawn above a lemming whose fuse burns ($48D4, $1CD2, game part); the nuke gives every lemming a fuse of $BF. The count was not timed
The play area scrolls left and right at the cursor; levels are two screens wideconfirmedscroll_view ($0C90) and read_mouse's edges (game part). A level is 312 multicolour pixels, 624 screen pixels, wide, and the play area shows 168 screen pixels of it
The scenery is drawn with sprites, the lemmings in characters (the diary)liveone recorded frame redrawn to the pixel (index.html, section 2): eight sprites side by side, moved down every 21 lines by raster interrupts; the lemmings ORed into fresh characters each pass (draw_lemming, $1AA2, game part)
Up to about 100 lemmings on screen (the diary), 30 at most (Commodore Format via a search summary)differsthe tables of play hold 50 lemmings (lemming_action, $0424, resident part), and the most any level has is 50
Digitised "Let's go" and "Oh no" (the diary)openthe play engine's driver writes the three voices only, and the NMI vector in play is an RTI ($0B56), so a sample would need another way; none was found. The six effects are SID notes (facts.md, "Sound"). The ending has a sample channel (sample_nmi, $0938, ending part)
Music by Jeroen Tel, "10 pieces of music" (title scroller)confirmedeleven tunes: the intro's (intro part), nine level tunes in the files SA-SI and the end tune (ending part); index.html plays them all on the game's own players
A multiloadliveeach level is a file on its rating's disk side; starting the game asks for disk 2 side A (reference/insert-disk-2a.png)
Messages at the end of a level, by how well it wentlivechoose_message ($53CF, game part) by the lemmings saved against the level's count and the number to save; reference/cheat-level-end.png
A message for finishing all 100 levels, then an end sequencetraced"You are one of the very few players who will complete all the levels" ($DACA, game part); the file IC, run at $C400 (ending part): a picture and a tune with a sampled applause, 2,592 frames or until fire. Live: reached in VICE by setting the level number ($CB48, resident part) to 99 at level 1's briefing and winning that level (work/toend.py); level 100 itself was not played
Skills that last (climber and floater; both make an "Athlete") (manual)tracedflags in lemming_flags ($0456, resident part): bit 1 climber, bit 2 floater
Metal that cannot be dug or blown away (manual)tracedthe level's map of special cells, two bits a cell: 1 steel, 2 and 3 one-way walls (cell_kind, $2E07, game part)

Beyond the documentation

Found in the code, not in the manual.

Open questions

Each part of the game has its own symbol map and listing: Resident: the loader and the variables, symbols.json and listing.json; The intro, symbols.json and listing.json; Intro, code sheet and title menu, symbols.json and listing.json; The game, symbols.json and listing.json; The end sequence, symbols.json and listing.json. Write-ups, facts and symbol maps are CC BY-SA 4.0. The game itself is not hosted here.