1985 · Gremlin Graphics
Every byte of the Commodore 16's 16 KB of RAM, one pixel each, 128 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.
| Tier | platinum |
|---|---|
| Coverage | 100 % of the bytes the game uses have a description |
| Comments checked | Not 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 analysed | Gremlin Graphics cassette, Novaload, from the TOSEC raw tape (2016-11-11) |
| Copy | agent-draft |
| Tools | emulator: plus4emu 1.2.11 (git 939e652) with kit/c16/codemap.patch, built without libsndfile, in the kit's server, disassembler: regenerator2000 0.9.20, python: 3.13.16, host: Linux (Ubuntu 24.04), x86_64, browser: Chromium 141 through Playwright (node), for the page checks |
| Model | claude-opus-5-5[1m] |
| Kit version | 0.0.212 |
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.
| Step | By | What it found | Of the listing |
|---|---|---|---|
| Research | claude-opus-5-5[1m] | Looked the game up online (its manual, reviews or wiki pages) before reading its code. | |
| Annotation | claude-opus-5-5[1m] | Wrote the listing’s comments. 100 % of the program is described, in 466 comments. | |
| Sample 1 | claude-opus-5-5[1m] | 7 of 60 comments wrong, so between 6 and 22 % of the listing is likely wrong. All 7 were then corrected. | |
| Play tab | claude-opus-5-5[1m] | Ported the whole game to JavaScript for the Play tab and corrected 0 comments it showed wrong. every routine ported and checked against the game's code, alone and in lockstep; no comment in the listing needed correcting |
likely wrong the sample’s range corrected right, or likely right not yet measured
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.
Sources:
reference/web-cover-side.jpg and reference/web-cover-front.jpg)reference/web-hiscore-*)reference/*.png)| Feature | Status | Where |
|---|---|---|
| Follow the pipeline from left to right; the ground and skyline scroll as Tex moves (inlay; HCW) | live | move_tex, set_speed, scroll_pipe, scroll_skyline; holding right scrolls the scene and adds to the score |
| The faster Tex moves, the quicker the oil pressure builds (inlay) | differs | the pressure never rises in a level: it falls an eighth every 24, 19 or 14 main-loop passes (main_loop, drain_rates). Speed raises % COMPLETED (completed_rates) and the score |
| A break in the pipeline must be jumped; falling in costs a life (inlay; Retro Gamer) | live | check_hole, tex_death; running right into the first break, Tex lies down and a life goes (reference/level1-fallen.png) |
| Jumping a break makes the pressure drop quickly; at zero the game ends (inlay) | differs | jumping costs nothing: the pressure falls with time and when a bomb or a crash explosive breaks the pipe, 4 eighths (lose_pressure, break_pipe). At zero the game ends, whatever the lives (pressure_out; live) |
| A completed pipeline moves on to the next level; a "% completed" bar (inlay; the HUD) | live | add_completed, level_complete; running right from the start of level 2 filled the bar and completed the level after 5,462 frames on EASY |
| 99 levels (inlay) | differs | the level is two decimal digits (next_level); after 99 it becomes 00 and play goes on, with nothing to end the game (live, level 99 completed with the $9D poke) |
| Desert, ice and surface pipe scenes (inlay; HCW names desert and "the frozen north") | live | next_level, scene_colours: the desert on levels 1, 4, 7..., the ice on 2, 5, 8..., the grey surface pipe on 3, 6, 9... (levels 2 to 4 seen) |
| Parallax: parts of the screen scroll at different rates (HCW) | confirmed | pipe_speeds, skyline_speeds: the skyline moves at about half the pipe's speed, in its own band of the raster interrupt (irq_skyline, irq_pipe) |
| Enemies: jet plane and its bombs, bouncy bomb, crash explosives, arrows; "surface missiles" on the cover | confirmed | enemy_mask has four kinds and nothing else: arrow, bouncy bomb, jet (with its bomb) and crash explosive (next_level, move_arrow_and_jet, move_bombs). Nothing in the code matches the cover's surface missiles beyond these. Jet, bouncy bomb, crash explosive and arrow seen on levels 1 to 4 |
| Shoot with the sixgun (inlay) | live | fire_bullet, move_bullet; fire puts a bullet in front of Tex |
| Scores: jet plane bombs 250, crash explosive 200, bouncy bomb 50, arrow 25 (inlay) | confirmed | move_bullet adds exactly these. The jet itself flies above the highest row the gun reaches and cannot be shot |
| Score goes up as Tex moves right | live | main_loop: 1 point every 24 passes while his speed is above 0 (15 points in 1,500 frames on EASY) |
| End-of-level bonus: the oil pressure left (inlay) | live | level_complete: a point for each eighth of pressure left, and one more; 207 points after an immediate finish of level 1 |
| 6 lives (inlay); the menu offers "NO. OF LIVES" | differs | the menu counts 1 to 6 and round, 3 as loaded (menu_choose, lives_setting); a life comes every 10,000 points, up to 9 (add_score) |
| Keys: K or J chooses keyboard or joystick; Z left and slow down, X right and speed up, ; up and jump, / down (also used to enter a name in the high-score table) (inlay) | live | menu_keys, read_keys: K, J, Z, X and ; tested; RETURN is fire. Down is read only at the menu and in name entry (menu_input, enter_hiscore): in play nothing tests it |
| Joystick: right moves on, up jumps, fire shoots | live | read_controls: port 2, or port 1 when port 2 shows nothing; tested on port 1 |
| Sound on and off (inlay; menu "SOUND: OFF" by default) | confirmed | menu_choose, sound_on: every sound routine returns at once while it is off |
| Selection screen: up and down bring an option into the highlighted window, FIRE executes (inlay) | live | menu_input, menu_choose; fire or RETURN starts the game |
| Menu: PLAY THE GAME, WATCH THE DEMO, difficulty (EASY, HARD and IMPOSSIBLE in the Hall of Fame pictures), NO. OF LIVES, SOUND | confirmed | menu_items, difficulty_text; the difficulty sets the main loop's pace and the pressure's drain (next_level, loop_paces, drain_rates) |
| High-score table "THE TYCOONS!", 8 entries, with name entry (inlay; the menu) | live | check_hiscore, enter_hiscore, draw_hiscores; a score of 207 went in eighth, 200,000 went in first |
| A scrolling message along the bottom of the menu and the play screen | live | scroll_message, message_text: TYCOON-TEX (C) 1985, ANOTHER CLASSIC FROM GREMLIN GRAPHICS BY THE TYCOONS AT MICRO-PROJECTS LTD. TRY OUR OTHER GAMES - XARGON WARS AND THE PETALS OF DOOM. AS USUAL THANKS TO MATTHEW,JASON,MARK,IAN AND EVERYONE AT GREMLIN ! ** HI TO KATH,JOHN,CHRIS,DAVE AND THE OTHERS ! |
| "GO!" in large letters at the start of play, "THE END" at game over | live | countdown, the_end; reference/level1-go.png, reference/game-over.png |
| Pause with SPACE, continue with C=; quit the game with ESC (Plus/4 World, "Undocumented Options") | live | check_play_keys; the score stood still for 100 frames while paused |
Found in the code, not in the manual.
add_score). Live.main_loop, pressure_out). A full bar lasts about six minutes standing still on EASY, three on HARD and 72 seconds on IMPOSSIBLE. Live.loop_paces, drain_rates, move_bombs). Live: the passes.next_level, enemy_delays). Live.next_level). Live.next_level). Live, by poke.enter_hiscore). Live.read_keys, read_controls). Live.countdown). Live.menu); its Tex jumps at the edge of a break and fires at random (demo_controls).tick_shot_sound).phone_text).orientation.md, "The loader"); the loader is not annotated, by policy.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.