1986 · Beam Software

Fist II: The Legend Continues

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

Two programs sharing one processor, a second joystick nothing switches on, an opponent who writes into the hero's slot, and graphics nothing reads.

Secret

Secret: the game runs as two tasks

The fighting and the scrolling are two separate programs, each with its own stack, and the raster interrupt switches between them.

The main loop ($21E2) runs the fighters, the opponent and the rules. The scrolling needs a whole new screen built every time the view moves a character's width, which is far more work than fits between two frames. So the game gives it a task of its own ($1503): it shifts the hidden screen one column at a time and draws the new edge, and when its time is up it gives the processor back.

The switch is made by patching an interrupt handler. When the scroll task has work, the routine at $12CA writes a NOP over the RTI that ends the status-band interrupt ($3D86), so instead of returning, the handler falls into a jump to the other task and its stack. A second routine switches back ($14E8), and a third puts the RTI back ($12E0) when the work is done. The first task is started by an RTI from a stack frame the game builds itself ($0133).

Secret

Secret: a second joystick for the other fighter

The routine that reads the joystick ($3393) can read either port. For fighter 1, the opponent, it reads port 1 instead of letting the computer decide, when one byte ($0455) is zero. Nothing in the Adventure sets it to zero, so the computer always plays the opponent. It may be what is left of a two-player mode, or the way the Training program lets a second player in; the Training load was not analysed.

Bug

Bug: one attack combination writes into the hero's slot

The opponent attacks with scripted combinations. Combination 8 ends by setting up combination 5, and stores it with STA $B4 ($31F2). Eleven other stores of this kind in the opponent code are STA $B4,X, into the slot of the fighter running the combination; one more ($3179) is unindexed too. Without the ,X, the combination is always written into fighter 0's slot, the hero's. What the hero does with it has not been tested.

Secret

Secret: after thirty defeats, beaten opponents come back

Beating an opponent marks his place done, and a done place stays empty until the hero has beaten 30 opponents in all. After that, each time the game checks a done place as the hero reaches it, it brings the opponent back one time in four ($2820). Scrolls never come back: their records are skipped ($27F5). A player on Lemon645 worked this out from play on the cassette version; the Gameplay tab sets the two side by side.

Quirk

Meditation counts every defeat, not the ones since last time

The manual says meditating raises the energy limit "depending on the number of opponents you have defeated since your last meditation"1. The code reads a counter ($048C) that only a new game clears ($2135), so every defeat in the game counts, and meditating twice in a row gives the same limit. The limit reaches its ceiling of 127 after twenty defeats.

Quirk

The trapdoor below the volcano

Bill McIntosh, who joined Beam in 1985, remembered Fist II for one thing a later rule would forbid: when Nintendo insisted that games be "complete-able", he pointed to the trapdoor in the floor of Fist II's last level, which "killed the player instantly". A player who played through again and jumped it, he said, met nine warriors who could not be beaten.15

The trapdoor is in the code. Room 76, the last room before the volcano, has two drops in its floor, at columns 10 and 19, and they are the only way down into the volcano ($4AEC). Falling through either one tests the third scroll ($0659): if it has not been delivered, the hero's energy is set to nothing ($0660). With it, the fall is simply the way in. Kan, the trigram of danger that "can also afford protection", is what turns the trap into a door.1

The nine warriors are not in this copy. The game can field a horde, an opponent followed by up to nine more ($2875, $27A1), but none of the 54 encounter records asks for one ($E609), and nothing changes a record except the bit that marks it beaten ($3524). Three of the volcano's four rooms hold one opponent each.

Quirk

Three more places where the manual and the code part

The manual warns that "you will be unable to smash through strong barriers ... with insufficient Chi".1 The test that decides whether a blow breaks a barrier ($0A2E) asks only for the right move at the right frame and the scroll for that kind of barrier, stone heaps ($0A59) or trees ($0A44). It never reads the hero's energy.

It also says that a poisoned hero "will not regain Chi" until a meditation cures him.1 The routine that gives energy back, a point every 128 frames ($2D14), tests no poison flag; it pauses only while a room's barriers are being read again. The one place energy drains steadily is area 5, and there the drain stops when the eighth scroll is delivered ($2CE4), not after a meditation. No poison state was found anywhere in the code, which is a statement about this search.

And F5, the manual says, ends the game and returns to the demo.1 The Mindscape disk has no demo: F5 starts a new game at once ($2444).

Quirk

An area that drains you until the last scroll is found

In area 5, the game checks whether scroll 8 has been delivered to its chamber. If it has not, the screen flashes and the hero loses a point of energy every ten frames until he falls ($2CE4). Delivering the eighth scroll is what makes the area safe: the game reads scroll 8's byte ($040C), and once it is marked delivered the drain is skipped ($2CF0).

Leftovers

Graphics and code nothing uses

WhatWhy it seems unused
29 uncompressed head sprites, side-on ($B746)no instruction or pointer table reaching them was found
A full character set of 193 glyphs ($E000)the start-up points the video chip at it for a moment; nothing else reads it
1,200 bytes in the unused half of the status-band font ($E910)no reader found
An older start-up routine ($C280)nothing calls it, and it calls an address where no routine is
27 blank sprite images ($AF10)no entry in the frame tables points at them
The Adventure loader ($C000)its work is done before the game starts

"No reader found" is a statement about the search: code reached through a pointer computed at run time can still use these bytes.

Open questions

What the code does not settle