1985 · Melbourne House

Way of the Exploding Fist: the source

This minisite was contributed by air, chunkypixel. It’s agent-generated and needs a human editor. Clone https://github.com/gamesexplained/gamesexplained and follow kit/START.md to curate games/c64/way-of-the-exploding-fist with me to Gold.

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/play_round1.vsf, the snapshot named in orientation.md.

Build

The Melbourne House disk, a GCR image (GCR-1541, 42 tracks). The game proper is entered through BASIC at $1AED (SYS 6893), which calls the machine set-up $18E8 and jumps to the outer loop $1EE1 (live: a stopping checkpoint at $1AED caught the hand-over). It carries no version text and no credits.

Memory layout

ThingWhere
Speech timing table, 256 16-bit periods (copied from $C700/$C800 by $18F8; the disk file m.prerun, byte for byte)$0200-$03FF
Music: patterns, pattern tables, driver, song tables, 25 instruments$0400-$1159
Per-move tables (blows, blocks, reach windows, strike frames, points)$115D-$12D0
Bull bonus round$12F8-$1469
High-score table and name entry$146A-$17BA
Backdrop unpackers$17BB-$18E7
Machine set-up, game flow, judge, function keys$18E8-$1FF9
Panel: scores, clock, rank text$2002-$22CE
Computer opponent and its tables$22CF-$27FF
Fighter update: controls, moves, hit test$2808-$2D61
Raster interrupt chain and multiplexer handlers$2D62-$3119
One-bit speech player$311A-$31F1
Multiplexer set-up$31F2-$37BC
Animation engine and sprite builder$37BD-$3E7F
Packed backdrop bitmaps (4)$3F5F-$68CA
Packed backdrop colours (4)$68CB-$71FF
Reach profiles (22 of 59 bytes)$7200-$7711
Animation word table and step lists$7720-$79E9
Frame-to-cell tables (9 slots x 79 frames)$7AE0-$7DA6
Multicolour mirror table, cell page table$7E00-$7FFF
Fighter shape cells, 64 bytes each$8000-$BFFF
Blank sprite; fighters' build buffers (run time); bull sprites$C000; $C040-$C93F; $C940-$CBFF
Screen memory, sprite pointers$CC00-$CFFF
Sprites under the I/O chips: bull, judge, shadow row$D000-$DFFF
Bull sprites and the font (codes $20-$5F)$E000-$E5BF
Backdrop bitmap (unpacked at run time)$E640-$F53F
Speech sample table and four samples$F540-$FFDC
Hardware vectors$FFFA-$FFFF

$01 is $05 in play: RAM at $A000 and $E000, I/O at $D000 ($1956). VIC bank 3 ($1993), screen at $CC00, $D018 = $39. The KERNAL is out and the game owns the vectors: NMI $2FF2, RESET $1990 (an RTI), IRQ rewritten by each raster handler.

Timing

Controls

| Stick | Without fire | With fire | |---|---|---| | centre, or fire alone | 1 stand | 1 | | forward | 2 walk forward | $0C | | back | 3 walk back | $11 | | down | 4 crouch | $0A | | up | 5 jump | $0E flying kick | | up-forward | 6 high punch | $0D | | down-forward | $18 from standing, 7 from a crouch ($2B33) | $0B | | down-back | 8 somersault backwards | $10 | | up-back | 9 somersault forwards | $0F |

Sixteen inputs give sixteen moves; with standing that is the eighteen movements of the box once the crouching variant 7 and the turn round $12 (fire + back from standing, $11 turned into $12) are counted. Which kick or punch each fire move is was judged from screenshots only for the moves named in the table.

Graphics

Mechanics

Data tables

TableWhereWhat
move_end_kind$115Dwhat ends each move: back to standing, hold the pose, or walk
move_is_blow$11761 for the eleven scoring moves
move_block_answer$118Fthe block that answers each blow
move_reach_reversed$11A8backward blows $0F, $10
move_full_window, move_half_window$11BD, $11D6margins for whole and half points
move_strike_frame$1204the frame a blow is tested on
reach pointers$121D, $124F25 words each, into the profiles at $7200
move_points$12A5points per blow in hundreds
ai_low_answer$12D0the computer's low version of an attack
X clamps$12E9, $12EBby facing
bull_hit_reach$142F59 bytes by player frame
stick_to_move$286C32 bytes, the five port bits
reach profiles$7200-$771122 x 59 bytes, by defender frame
anim_list_table$772033 words: lists 1-31 and an end
frame tables$7AE0-$7DA69 x 79 cell numbers
mirror_pairs$7E00bit-pair reversal
cell_page_table$7F00$80 + cell / 4

Sound

| Sample | Bytes | When | Started at | |---|---|---|---| | 0 | 227 | the defender is hit by a forward blow other than $18, 7 or $0C, and falls (reaction $16) | $2CE7 | | 1 | 790 | the defender is hit by $18, 7 or $0C (reaction $1B) or by a backward blow (reaction $1A); the bull hits the player | $2CDC, $2CF2, $13B7 | | 2 | 858 | every attack, as its animation starts (moves flagged in $1176) | $2B54 | | 3 | 266 | a floored fighter reaches frame $2C or $28, the last of the two falls (animations $16 and $1A), on a new step; the bull's charge begins, once the last sample has ended | $29E9, $141F |

Oddities

Live tests

TestHowResult
Hand-overstopping checkpoint on $1AED, then a store watch on $FFFEentered by SYS from BASIC; $1943 installs the vectors
Raster chainframe.py captureseven handlers and their lines
Option keyskey presses in the attract mode, screenshotsF1, F3, F5, F7, DEL, fire on ports 1 and 2 as above
Stick tableeach of 16 inputs on port 2 in a two-player game, $61 readevery entry of $286C as tabled
Clockexec checkpoints over 250 frames; frames between changes of $B2per-frame code 250, loop 195; 50 or 60-66 frames per unit
Scoringwhole point with $0C at a distance of 12, two players200 points, symbol drawn then cleared
Bullstage, wins and halves poked; blow landed; then crouch and down-forward at distancesbull charges and floors; felled at distance 26 for 3000
Judgeone point, clock run out in warpjudge sprites shown at the end of the two-player game
$DD0E trap$DD0E = 1, then a scoring blowcrash to $0201
BackdropsPython re-implementation of both unpackersbyte-identical to the snapshot
Players byte$AE read in a two-player game1

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
routines tables variables strings branch labels

Loading listing…