1986 · Palace Software

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/c64/the-sacred-armour-of-antiriad 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.

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 15 wrong, so between 12 and 29 % of the listing’s comments are likely wrong. How listings are checked
Build analysedone-file crack on a D64, packed in five stages behind 1986 SYS2080 SCI 666 (archive.org d64_Sacred_Armour_of_Antiriad_The_1986_Palace_Software, MD5 dadadbe50ae657af3f5441497c44d6de)
Copyagent-draft
Toolsemulator: release v3.13.2, v3.13.2-linux-x86_64-gui.zip, disassembler: regenerator2000 0.9.20, host: Linux x86_64 (Ubuntu 24.04.5, cloud container)
Modelclaude-opus-5-5[1m]
Kit version0.0.226

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 869 comments.
Sample 1claude-opus-5-5[1m]15 of 80 comments wrong, so between 12 and 29 % of the listing is likely wrong. All 15 were then corrected.
60 hand-written comments (13 wrong) and 20 generated (2 wrong); 14 more corrected with them, those that shared their beliefs
Port checkclaude-opus-5-5[1m]Checked a page’s port or widget against the game and corrected 2 comments it showed wrong.
the room $40 widget on Discoveries, against the game running: the wait of the creatures held back by a striped one, given in steps, is 100 frames; the panel's message strip on How it works, against a screenshot of the game: drawn in hires red, it is multicolour, dark grey, light blue and cyan
Port checkclaude-opus-5-5[1m]Checked a page’s port or widget against the game and corrected 2 comments it showed wrong.
the Maps page's route, replayed in VICE a stick read at a time: zp_throw ($7C) left out that nothing clears it when a game starts, and throw_stone ($A3B3) that it copies Tal's X high bit to the stone's on every pass while a throw is asked for
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 held to the game's code alone and in lockstep: from the cold start for 500,000 passes and from each of 56 moments of play for 6,000, every pass identical; test_play.js holds the published page beside the game at the route's 15 stages

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
Joystick in control port 2 (wiki infobox); fire at the title starts playlivefire on port 2 started play from the title, 24 October 2026; read_fire, foot_control read $DC00
Flip-screen world of 69 rooms, numbered $00-$44, current room in $5B (wiki)confirmedroom_links has 69 entries; zp_room ($5B) changed with each room built in the live tests
Rooms on one level share their left and right 64-pixel columns with the next room (wiki, Graphics)confirmedbuild_room draws one tile column (32 pixels) of each neighbour at each side (draw_edge_column), so two neighbouring screens have 64 pixels in common; the room renderer built from this matched the live first screen
Some rows of rooms wrap round into an endless corridor (wiki, Trivia, given as a likely explanation)confirmedroom_links: the rows $06-$09, $0D-$12, $1A-$23 and $29-$37 link their last room's right back to the first
Playfield in character mode, 320 × 128 pixels, characters at $7800; status panel with characters at $7000; both share the screen at $4000 (wiki)liveone recorded frame: $D018 reads $0F from line 251 and $0D from line 180 (orientation.md); the game writes $0E and $0C (raster_bands), and the unused bit 0 reads as 1
Status panel monochrome until the armour is first worn, multicolour after (wiki)livedraw_panel draws it in dark grey; colour_panel and panel_power_up colour it after the first activation; driven into the armour live, the panel came on 150 frames later and flickered through its seven stages
Tal is sprites 0 and 1 (multicolour, one above the other; side by side when he has died); the empty armour sprites 3 and 4; stones and shots sprite 2; items and most enemies sprites 4 to 7 (wiki)confirmedplace_room_sprites fills slots 7 down to 3, so items and creatures use 3 to 7; place_armour puts the armour on 3 and 4; tal_lives lays Tal's halves side by side; live, the armour was on slots 3 and 4 in room $3F
The hanging monkeys, the fire-breathing dragons and the machine gunners are drawn in characters, not sprites (wiki)confirmedanimated-tile scripts $80 (monkey), $83-$88 (dragons and fire), $89 (gunner), copied into the playfield set by animate_tile
On foot, facing left or right: fire throws a stone, left or right walks, left or right with fire jumps that way, up jumps straight up, down crouches and picks up (wiki)confirmedfoot_fire, foot_left, foot_right, foot_up (sets the direction to up alone), foot_down; pickups need the crouch (tal_touches). Left and right first turn Tal through the front view. From the first screen, where Tal faces the player, only left and right moved him (sprite 0 X 96 to 74, and to 172 walking off the ledge)
Facing the player, Tal can put on the armour or use the teleporter (wiki)livetal_touches takes both only for animation $88/$89; live, Tal placed at the armour facing the player dissolved into it. The teleporter also needs the panel on, so it works only after the first activation
In the armour Tal floats in any direction; with the Pulsar Beam, fire shoots; landed, left or right takes the armour off (wiki)confirmedsuit_control, suit_fire (needs $067E), suit_left/suit_right call leave_armour when landed
Q starts a new game (wiki)livecheck_quit_key; Q held for 20 frames brought the title and its tune back, 24 October 2026
Tal's energy, 0 to 31, in $51, the shown value in $52 (wiki)livezp_tal_energy, zp_tal_shown; clear_game_state sets 31; radiation drained it live
The armour's energy, 0 to 63, in $4F, the shown value in $50; wearing it, Tal cannot die and is recharged from it (wiki)differszp_suit_energy is charged to 32 at the first activation (live) and set to 31 by a recharge cell (suit_drift); the bar is 32 pixels. Tal cannot die in it (check_death) and gains a point every 100 frames (energy_tick), but the suit's energy does not pay for it
Five lives: when Tal's energy runs out he falls and rises again, four times ("rejuvenation"), count in $AC (wiki); the panel says "YOU HAVE THREE / TWO / ONE REJUVENATION REMAINING", "THIS IS YOUR FINAL REJUVENATION"livecheck_death, tal_lives; live, a death gave message $8C and a refill, and the fifth death (zp_rejuv 4 to 5) set zp_game_over
Armour state in $7B: $00 not yet activated, $02 active and not worn, $B2 worn (wiki)livezp_armour_state; live, $00 became $B2 as Tal dissolved into the armour; leave_armour sets $02
First wearing activates the suit ("ANTI-RAD SUIT ACTIVE"); without the Gravity Displacer it cannot fly ("GRAVITY PREVENTS TAKEOFF") (wiki, game text)livedissolve_step (first activation), panel_power_up (message $84, seen live), suit_up (message $85 without $0680)
Four add-ons, each worth 50 points: Gravity Displacer (room C13, lets the suit fly), Pulsar Beam (K11, shots), Implosion Mine (H8, behind an energy barrier, destroys the power centre), Particle Negator (K5, protects in rooms H1 and H2) (wiki); found flags $067A-$067D, owned flags $067E-$0681confirmedenemy_points 50 each; the sprite lists put them in rooms $2B (C13), $21 (K11), $14 (H8) and $06 (K5); addon_new, addon_fitted; room_change empties the suit in rooms $00/$01 without the Negator
A message for each add-on when the suit is next worn: "PULSAR BEAM ENERGISED FIRING ENABLED" and three more (game text)confirmedaddon_message, messages $80-$83
"PULSAR BEAM NOT FITTED" when fire is pressed in the suit without it (game text; the trigger is a guess)confirmedsuit_fire, facing left or right, without $067E bit 7
Recharge cells in 18 rooms (H3, I5, G6, J6, H7, H8, G9, D11, L11, I12, O12, B13, D13, F13, J13, D14, G14, L14) refill the suit to its maximum and score 25 points; carried flag in bit 7 of $A7; a cell taken is remembered per room in a 69-bit map at $0661-$0669; "ALREADY CARRYING RECHARGE CELL" (wiki, game text)differsthe sprite lists hold 19: the wiki's 18 and one in J14 (room $40), which appears only if the round striped creature listed before it is still alive (live). A cell sets the suit to 31 (suit_drift), one short of the 32 the activation gives. zp_cell, cells_taken, message $89 in tal_touches
"SUIT INOPERATIVE RECHARGE CELL DEPLETED": a suit out of energy sinks and cannot move; "DANGER SUIT ENERGY LOW" (wiki, game text)livesuit_drift: at 0 off the ground it sinks with message $88; 1 to 7 queues $8A, seen live while the suit charged at its first activation
Radiation by height: harmless in rows 14-11, Tal off the suit loses 1 energy a second in rows 10-8 and 2 in rows 7-6, rows 5-3 lock the suit on ("HIGH RADIATION SAFETY INTERLOCK OPERATIVE"), rows 2-1 need the Particle Negator ("EXTREME RADIATION SHIELD FAILURE IMMINENT") (wiki, game text); a meter and a warning lamp on the panelliveroom_radiation gives level 0 to rows 11-14, 1 to rows 8-10, 2 to rows 6-7, 3 to rows 1-5; energy_tick takes the level every 50 frames (live: 1, 2 and 3); leave_armour refuses in rooms $00-$09 (rows 1-5); room_change for $00/$01 (rows 1-2). Meter pictures $70-$73 and the lamp ($C0, level 3 only) live
Energy barrier: crossed only without the armour (wiki)confirmedbarrier_left, barrier_right stop the suit at character $FF; on foot the walls are found by colour only (wall_left)
Teleporter in the bottom jungle takes Tal back to his armour, "BEAM ME UP SCOTTY" (wiki, game text)confirmedthe teleporter ($D3) is in room $27 (N12); tal_touches (message $91), teleport_to_armour
Enemies that die from one or two hits (stones or shots), cost 4, 8 or 32 energy on contact, and score 20 to 60 points, half when killed by contact (wiki, eight kinds)confirmedenemy_damage 4, 8 or 32; hit points a quarter of that (set_enemy_stats); a shot takes two (sprite_hits). enemy_points 10-30 are scored twice for a stone kill and once for a shot or contact (score_kill): a shot kill also scores half
Hazards that cannot be killed and drain energy while touched: acid drop (4 a frame), thrusting thorn, monkey, dragon; a "bullseye" that takes all of Tal's energy; a bomb-thrower that is safe to touch (wiki)confirmedthe drops are in unkillable_anims with damage 4, taken on every frame they touch; thorns (4 a touch), the monkey and the dragons' fire (8) hurt by their colour, with 25 frames between touches (scenery_hits, hazard_colours, the character lists' colours); a dragon's head is harmless, and the machine gunner hurts too; the bomb-thrower's damage is 0. The only 32-damage creature is the bomb ($D2)
Score in five decimal digits at $0687-$068B and binary at $0697-$069A, each with a shown copy that counts up to it (wiki)differs$0697-$0699 is the score; $0682-$0686 are digits counted up to it a unit every four frames (score_digits), and $0687-$068B the digits shown, which roll after them (roll_score). Live, the shown digits stayed one roll behind $0682. The wiki names $0682 the shown copy and $0687 the score
Ending: pushing the upper pole of the force field in room H1 with the mine primed starts "IMPLOSION MINE DETONATION SEQUENCE INITIALIZED", a countdown FIVE to ZERO, then "THE OPPRESSORS ARE DEFEATED YOUR RACE IS FREE PRESS FIRE TO PLAY AGAIN" (wiki, game text)livecheck_detonation: the landed suit over characters $C9-$CB at row 12, columns 18-20 of room $00, the cap of the pole below the force field, with $0681 set; victory_sequence. Live, the suit placed there with the add-ons set started the countdown, the dissolve and message $95
Game over: "YOU HAVE DIED YOUR RACE IS DOOMED PRESS FIRE TO PLAY AGAIN" (game text)livecheck_death at the fifth death, message $90 queued live; foot_fire restarts after the 200-frame wait
Title screen: the logo between two statues, credits for Stanley Schembri (programming), Daniel Malone (plot and graphics) and Richard Joseph (sound design), "PRESS FIRE TO PLAY", "© PALACE SOFTWARE MCMLXXXVI" (game text, live)livetitle_sequence, title_attract, title_credits, credits_text; screenshot reference/live-title.png
Title music in three voices, by Richard Joseph; only short effects in play (wiki)confirmedthree parts of three tracks each (title_tune_part1-3, tracks $80-$88); live, tracks $80-$82 were playing after Q brought the title back. In play the panel's power-up tune ($8F-$91), the rejuvenation's and the ending's are short tunes too
No time limit (wiki)confirmedrestart_game is reached only from victory_sequence, foot_fire after the fifth death and check_quit_key; the only countdown is the mine's (zp_countdown)

Beyond the documentation

Found in the code, not in the manual.

FindingStatusWhere
The title picture holds the words THE SACRED ARMOUR OF in large letters, one row above what is drawn; they never appearconfirmedtitle_picture_top ($F514); draw_title_screen starts at title_picture; the live title shows only the logo
The music is tuned for an NTSC machine: on a PAL C64 every note is about two thirds of a semitone flattracednote_freqs entry 114 (note 57) is 7217, 440 Hz at 1.023 MHz, about 424 Hz at 0.985 MHz
Room $32's link below names a room $45 that has no map, behind a floor that is solid along its whole widthliveroom_links; colour RAM row 15 of room $32 all solid
A drop that splashes on the floor falls again from where it startedtracedstep_animation calls spawn_enemy when a splash (land_anims) ends, and every drop is the first entry of its room's list, whose place and animation spawn_enemy gives it again
A round striped creature holds back the creatures listed after it, and they never come if it is killed first, a recharge cell among themlivehold_back_group, materialise_step; room $40
The bomb-thrower in room $1E never throws, because its halves are listed the other way roundliveplace_bomber looks for $C9 on sprite 7
The bomb dies to the first stone, whatever its damage, because it is placed with no hit pointsliveplace_bomb does not set $0285; reset_sprite_slots cleared it; live, one stone on the bomb in room $03 started its dissolve
A stone kill scores twice a creature's pointslivescore_kill adds the points again when sprite 2 is the stone ($BC); live, the bomb (20 points) scored 40 to a stone and 20 to a shot
The panel's text alphabet has A, O and U with umlauts, unused in this texttracedtext_punct, text_punct_chars
Scenery is solid or harmful by its colour in colour RAM, not by its shapeliveopen_colours_floor, open_colours_wall, hazard_colours; room $32's floor read live
The multicolour creatures change two of their colours when Tal puts the armour on, because every sprite shares the two multicolours the suit setslivedissolve_step sets $D025/$D026 to 14 and 11, leave_armour and start_new_game to 8 and 9; the frame recorded with the suit worn reads 14 and 11
The radiation lamp lights only at level 3liveradiation_lamps indexed by 3 minus the level
The first game after power-on always starts at the jungle's left end (room $38)livezp_pass_count is 0 until the main loop runs; start_new_game
The teleporter does nothing until the suit has been activated oncetracedtal_touches tests zp_panel_on
Add-ons and recharge cells cannot be picked up before the first activation eithertracedtal_touches tests zp_panel_on for both

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.