1986 · Mindscape

Fist II: The Legend Continues: the source

This minisite was contributed by air, unorig. It’s currently claimed by unorig who is editing it to reach a Gold tier standard.

Every routine, table and variable the game uses, with the names and descriptions given to them. Click an operand to follow it; the counter beside a label lists what refers to it. The reference below the fold is rendered from the game's facts file.

Technical reference: memory map, timing, tables, cheats

Current truth for this game. The workflow lives in kit/skills/; how this understanding developed lives in agent-history.md. Every fact names the routine or table it comes from. Unless marked live, a fact comes from reading the code in work/f2-entry.vsf, the Adventure hand-over.

Build

The Mindscape disk (orientation.md). The Adventure load fills memory from $0400 to $FFF8, the RAM under the I/O chips and the KERNAL included. The game never switches the I/O out: $01 is written only by the loader and the start-up ($C459, $C469), and stays $15 in play (live). So only the video chip reads the RAM at $D000-$DFFF.

Memory layout

ThingWhere
Timer periods for the sample player$0200-$03FF, copied from $C700/$C800 (1 to 60,000)
Main entry$0402 JMP $2101
Game variables$0405-$0492: scroll flags $0405-$040C, energy $0412/$0413, pause $0416, area $046A, screen $046B, maximum energy $0485
Rooms, exits, scenery drawing, move scripts, pose builder$055B-$20E0
Game flow, fights, opponent, encounters, raster handlers, sample player$2101-$3F62
Sprite multiplex planner$3F67-$4801
Screen-to-area table, exits, item lists, scenery sets 0 and 1$4A71-$63AB
Scenery set 2, strike-reach tables$6DEE-$7FFF
229 packed fighter sprite frames$8000-$AF0F
Move scripts, pose tables, frame addresses, mirror table$AF46-$BFFF
Leftover loader, start-up, sprites$C000-$CBFF
Play screen 2 and status band$CC00
Play-area character sets A and B$D000, $D800 (RAM under I/O)
Character set, status-band font, sprites$E000-$EFFF
Play screen 1$F000
Music driver and tunes$F400-$FFC9

Timing and structure

Controls

Fighters

Energy, lives and scrolls

The world

Play, from the manual and the code

Sound

Hardware register census

RegisterWhere
$D000-$D010sprite positions, the multiplex planner $4000-$47E2, handlers
$D011, $D012start-up, raster handlers
$D015-$D01Dstart-up, fighters ($2118, $2DB7), zone priority $D01B
$D018, $D016start-up; $3BF2-$3C02, $3D4C
$D01Esprite-sprite collisions, read at $3328, $3F99
$D020-$D026colours: start-up, $1209, $3C1B, $3D41
$D400-$D417music driver $F4F5-$F90x, filter included
$D418volume: music, and the sample player's flips at $3D93
$D41B, $D41Cvoice 3 oscillator and envelope, read for pulse modulation
$DC00-$DC03joystick and keyboard $2446-$2453, $3393
$DC0D, $DC0FCIA 1 interrupts; timer B for samples
$DD00, $DD0DVIC bank 3 at start-up; NMI source test

Towards a solution

Read from the game's tables, with the live tests named.

Where the scrolls lie (encounter records with flags $60-$67 at $E609; flags AND 7 is the scroll number, byte 2 the map position):

ScrollRoomMap positionIts chamber
1102180room 68 ($44)
29115269
311411070
48412471
510714372
611014073
711821274
84417575

What each delivered scroll opens (the code that tests $0405+n):

ScrollOpensWhere
1barriers of type 3 (rooms 4, 21, 37, 39, 40, 53) can be broken$0A59-$0A6A
2an exit of room 52 ($34), taken with the stick$36DE-$373C
3leaving area 7 (room 76, on the way to the volcano) alive: without it energy is set to 0$0649-$0660
4barriers of type 7 (rooms 79, 81) can be broken$0A44-$0A55
5the chain of opponents at an encounter ends early$27AD
6the exits of area 13 (room 79)$064C-$0677
7the colour scheme of one zone changes$10E5
8area 5 (rooms 64-67) stops draining the hero$2CE4

The map. Each of the 123 rooms has an exit list at $4AEC: type, column, destination room, arrival column (read with find_room_exits $1A06; tested against the hero's column $E5 by scan_room_exits $0576). Walls are the 2-byte records of the room's item list ($501E); the hero stops at a wall's column plus $0AC7[type] from the left and minus $0ABD[type] from the right ($087A-$08DF; live: stopped at column 75 by the wall at 77 in room 101). Barriers are the 3-byte records with bit 7 set: type 1 breaks to any attack at its striking frame while the hero is against it ($0A2E; live: room 104), types 3 and 7 only once scroll 1 or 4 has been delivered.

Exit types, by what scan_room_exits does with them:

TypesTaken byStick (live, facing right)
9, 1, 15the stick within 2 columns of the exitdown
10, 2, 4, 14, 20the stick within 2 columnsup
3, 5the stick within 2 columnsup and right
18, 19, 12walking off the room's edgeright, left
11a hole: within 2 columns of itfalls
16a drop 7 columns wide (column to column + 6)falls
17a drop 11 columns widefalls
21every column left of the exitfalls

A drop takes the hero only while he is walking with his feet on the floor: $92 is his height on the screen, $4E (78) when standing, and $371D tests it. A forward somersault (stick up and back) lifts him off the floor for about ten columns, and so carries him over a hole or a 7-column drop (live: from column 48 over the hole at 52 in room 103; from column 112 over the drop at 115-121 in room 85, landing at 122). No tested move crosses an 11-column drop.

Picking up a scroll. The encounter scan ($27F5) shows a room's scroll when the screen's map position $72 plus 0 (walking left) or 41 (walking right, $2961) equals the scroll's map position; the hero picks it up by touching it (sprite collision, $2C25), which sets its flag to 1. Delivering it to its chamber sets $80 and adds a life.

Tested in the emulator. A breadth-first search over the exit lists, walls, barriers, drops and the gates above, with a script that drives the joystick along its route. For route testing the script marks every encounter except the scrolls as done and holds the hero's energy, so fights were not played. On 1 October 2026 it collected and delivered five scrolls in this order, ending with scrolls 1, 2, 4, 6 and 8 flagged $80 and 6 lives:

ScrollRooms, from the previous chamber
194, 100, 101, 102 (scroll), 103 (somersault the hole), 104 (break the barrier), back through 103-100, 94, 5, 3, chamber 68
83, 90, 106, 17, 53-55, 22, 57-59, 91, 11, 29, 92, 93, 89, 86, 83, 19, 45, 44 (scroll); 45, 19, 83, 12, 4, 84 (carried on to 87), chamber 75
287, 105, 15, 7, 56, 54, 55, 22, 57-59, 91 (scroll); 11, 29, 92, 93, 89, 86, 83, 19, 45, 46, 48, 64, 38, chamber 69
438, 64, 49-52, 80, 78, 77, 0-2, 14, 112, 84 (scroll, from the right); 112, 14, 2-0, 77, 78, 80, 83, 19, 45, 10, chamber 71
3not collected: the hero reached room 114 east of the wall at 117 and went on to chamber 70 without it
670, 21, 108, 20, 108, 109, 110 (scroll); 109, 108, 26-28, 53-55, 22, 57-59, 91, 11, 29, 92, 93, 89, 86, 83, 19, 45, 46, 48, 64, 49-52, 80, 78, 77, 0-2, 65, 2, 39, 40, 82, 85 (somersault the drop), 121, 9, chamber 73

Two traps decide the route. Arriving in room 84 from room 4 carries the hero on to room 87, so scroll 4 (at 124, beside the drop at 112-122) is reached only from room 112. In room 85 the drop at 115-121 takes the hero to room 111 unless he somersaults it.

The crevice in room 79. Scrolls 5 and 7, chambers 72 and 74, the volcano rooms 60-63 and the ending, room 122 ($2DB5), lie in a region (rooms 8, 16, 18, 30-36, 60-63, 72, 74, 76, 88, 95-99, 107, 117-120, 122) whose only way in, by the exit tables, is room 79's right-hand exit at 171 to room 117. Room 43's exit at 88 (type 5, stick up and right) arrives in room 79 at column 0, left of room 79's drop at 18. That drop is 11 columns wide, but with scroll 6 delivered scan_room_exits narrows it to columns 18-24 ($067B), which the forward somersault crosses; the drop blinks the scroll-6 icon as a hint ($0491/$0492, blink_icons $2D57). Past it, the type-7 barrier at 109 breaks once scroll 4 is delivered. With that crossing modelled, the search (solver/solve.py, reading the committed listing) finds all eight scrolls in the order 1, 8, 2, 4, 3, 6, 7, 5 and reaches room 122 through rooms 34, 97-99, 76 and 60-63. The crossing, scrolls 3, 7 and 5 and the ending have not been driven in the emulator. Two outside sources agree: the key of a hand-drawn map by Master Lee and hiTCH-HiKER (December 2008, given by the contributor) names scroll 6 "crossing the rock crevice", and Magnus Andersson's GameFAQs walkthrough (2007) has "a middle plattform at the waterfall. Jump across and continue right."

The slide in room 77 is not the way in: its exit at 222 carries the hero into the drop at 233, which lands him in room 79 at column 21, inside the crevice, and he falls on through to room 82 (live, walking, standing, ducking, every stick direction). Room 77 refuses jumps and attacks (live).

The same map's key matches the other scrolls to the code: 1 destroying stone heaps (type-3 barriers), 2 the way across to the river (room 52), 3 keeping energy for the last opponent (area 7), 4 kicking trees down (type-7 barriers), 5 more fighting strength (chains end early), 7 lighting the dark rooms (a zone's colours), 8 surviving the poison rooms (area 5).

Open questions

Live tests

TestResult
Frame capture rebuilt104,448 of 104,448 pixels
$01 in play$15
RESTORE$0416 0 → 1, main loop waits at $2201; again → 0
Energy, maximum, lives at the start47, 47, 1
First opponent's energy63
$74 sampled over time$CC and $F0
Screen and area at the start and at the first opponent94/28, 100/30
Tune number in the jungle3
Sprite frame table, mirror table, note table, period tablechecked in the snapshot

The cast

Cheats

Pokes that change the game within its own parameters. Each one names the variable it changes and whether it has been tested live. Untested pokes are labelled as candidates.

EffectPokeStatus
Lives$2D32 = n (1 at the start)candidate (1 read live)
Hero's energy and its limit$0412 = $7F, $0485 = $7Fcandidate (47 read live; 127 is the game's own cap)
Scroll n found / delivered$0404+n = 1 / $80candidate
PauseRESTORE, or $0416 = 1live (RESTORE)
routines tables variables strings branch labels

Loading listing…