1985 · Mastertronic

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/c16/mr-puniverse with me to Gold.

Footprint

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.

Status

Tierplatinum
Coverage100 % 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 4 wrong, so between 2 and 12 % of the listing’s comments are likely wrong. How listings are checked
Build analysedMastertronic cassette, Novaload, from the TOSEC raw tape (2016-11-11)
Copyagent-draft
Toolsemulator: 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.17, host: Linux (Ubuntu 24.04), x86_64
Modelclaude-opus-5-5[1m]
Kit version0.0.254

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 269 comments.
Sample 1claude-opus-5-5[1m]4 of 80 comments wrong, so between 2 and 12 % of the listing is likely wrong. All 4 were then corrected.
60 hand-written comments and 20 of the 25 room comments
Play tabclaude-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

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.

Sources:

Features

FeatureStatusWhere
Mr Puniverse searches 25 locations for the vitamins that keep him alive (inlay)liveroom_ptr_lo and room_ptr_hi point at 25 room records, each with one vitamin, laid out as a map five rooms by five (facts.md, "The rooms"); all 25 were drawn in the emulator and match a port of draw_room cell for cell. In room 0 the player, put in the shaft above its vitamin, fell past it: VITAM1 went from 00 to 01 and the room's bit in vitamins_got was set
Joystick (inlay); it goes in port 2liveread_input reads port 2 only: from play-room1.p4emu, right on port 2 for 40 frames moved him right, port 1 did nothing
Keyboard: Z left, X right, SHIFT jump (inlay; Plus/4 World)liveread_input with keyboard set: X moved him right, Z left, and SHIFT started a jump
D, "suicide" (Plus/4 World)liveplayer_pass: D in play cost a life (8 to 7)
The game has an end (Plus/4 World)livecollect_vitamin: with the count poked to 24, the 25th vitamin set his lives to 1, started the tune and waited at $2838 for a key; a key ended his game, GAME OVER showed and the title came back
A menu: one or two players, each with the joystick or the keys (own screens)livenew_game, show_menu: F1, F2, F3 and HELP each started a game
Two players take turns, each with his own TIME, VITAM and lives on the panel (own screens)livedeath: in a game started with F3, D cost player 1 a life and player 2's turn began
A TIME clock for the player in play (own screens)liveclock_tick: TIME1 poked to 3.99 ticked to 4.00, his lives became 1 and he died, which ended his game
An EGY bar along the foot of the panel (own screens)liveenergy_tick: in most rooms it drains, in some it refills, at a rate the room sets; poked one step from empty, it ran out and he died
Eight lives, shown as little men (own screens)livenew_game gives each player 8, draw_lives_row draws them; 8 men at the start, 7 after D
Cannons and their shots (own screens)livemake_cannon, update_cannon, move_shot; in room 1, put in the line of the cannon's shots, he died twice in 800 frames
Crushers, which Plus/4 World's cheats call "pulverisers" (own screens)confirmedmake_crusher, update_crusher; they move in all the rooms that have them, and player_pass kills him when one is in his column
Switches that turn force fields and bridges on and off (own screens)liveswitch_off, update_field: in room 2 he touched switch 1, its state went from 1 to 0 and the force field at column 36 went away
Cheats: >3367 BD unlimited lives, >33AB AD unlimited energy, >25C5 60 invulnerability, >281E C9 ## the vitamins needed to finish, >2172 39 "jump left through walls", G 1AF4 restart (Plus/4 World)liveeach poked in play (cheats.md): D cost no life, the bar stayed one step from empty, a force field poked into his cell did not kill him, one vitamin finished the game, and left took him through room 0's wall
Cheat >15F3 B9, "takes out a cannon which levels out 6 pulverisers" (Plus/4 World)traced$15F3 is the low byte of the address of room 14's first object, a cannon; the poke moves it from the right of row 9 into the wall at the left of row 10, where its shots end at once. Its record is changed, as poked in the emulator, but room 14 was not played
Two versions with different endings (Plus/4 World)openthis tape is the later one: Plus/4 World's cheats for it fit its code and those for the older version do not (orientation.md). The older version was not examined

Beyond the documentation

Found in the code, not in the manual.

FeatureStatusWhere
P pauses the game, and P again goes onlivepause_check: PAUSED printed in red under the play area, the program looping at $27BF-$27C3 until P was pressed again
K and M make "up" and "down" from the keyboard, and nothing reads themliveread_input builds the bits; in keyboard mode K and M did nothing
Crumbling floor wears away under him in eight stages, then he fallslivecrumble_step: in room 1 the floor under his feet went $A8, $AC, $AE, $B2, $B6 and then blank, in about 30 frames
Conveyor belts carry him leftliveplayer_move: in room 3, put on the belt, he went six columns left in 60 frames
Room 2's pit drops him into room 0, at the top left of the map, not into room 7 below itliveleave_room, room 2's exit bytes: put above the pit, he fell into room 0
Room 24's ladder climbs into room 14, two rooms up, not into room 19liveroom 24's up exit byte is 14; put on the ladder, he climbed into room 14
A room that refills the EGY bar stops one cell short of the right end, so after any drain the last cell stays empty until the next turnliveenergy_tick stops refilling when bar_pos reaches 33 without filling that cell; in room 6 the cell before it filled and the last stayed empty
Shots, force fields and crushers kill only in the middle cell of the column he stands in, or in its bottom cell when he is low in his blocktracedplayer_pass reads two of the six cells of his block, the left column's facing right and the right column's facing left, and the bottom one only with player_y 3 or more
Room 24's corridor along the foot of the screen leads left into room 0liveroom 24's left exit byte is 0; walking left along it, he came out at the right of room 0. The corridor runs along the foot of rooms 20 to 24, and room 22's vitamin lies in it: walking right from room 22 he took the vitamin and went on through room 23 to the foot of room 24's ladder
Rooms 18 and 19 also have "down" exits to room 0, with a wall or a ladder above eachtracedtheir exit bytes and the drawn rooms: each gap in room 18's floor lies under a block of wall, and room 19's under the foot of a ladder, which holds him when he lands on it. No way down to them was found
Room 18's walls spell REST ROOM, and the room is an easy oneliveplus4emu's screen of room 18: the wall cells make REST on rows 2-6 and ROOM on rows 8-12, five rows high, the two Rs alike. Its record fills the EGY bar a step every pass, and its only objects are three crushers
An unused title: the dotted title routine has a second path that spells WIMPOlivewimpo_path: with title_dot_step's four operands pointed at it, the title drew WIMPO where MR PUNIVERSE goes. The inlay calls the weaklings "Wimps"
A lift, coded and animated, that no room placesconfirmedplayer_move raises him on character $BC and animate_chars scrolls its glyph, but none of the 25 room records draws one
Switch 8 is always on: the always-on cannons and crushers read the first object's type as their switchconfirmedobject_timer reads switch_state + 8, which is obj_type
A second tune player that nothing calls, reading room data as its tunetracedold_music_tick
The tune's first six frames read past the tune, and three of its notes past the frequency tablestracedmusic_tick, tune_voice1, note_freq_lo (facts.md, "The tune")

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.