A 48K Spectrum has one bit of sound hardware, bit 4 of port $FE, and Alien 8 makes every sound by setting and clearing it with the processor counting in between, the border kept black. While a sound plays nothing else happens: the game stands still for a tune, and every beep lengthens the turn it is in. There are two players. The tunes go through PLAY_NOTE, a note at a time; everything else is waves from CLICK, which turns the speaker on for B turns of a 13 T-state loop and off for as long, and BEEP ($B6FB, the end of FOOTSTEP), which repeats it C times. Most of the effects are Knight Lore's routines, some of them with new callers; a few are Alien 8's own (the robots' warble, WARBLE_SOUND).

The tune player and its note table are Knight Lore's, and Pentagram's (see Knight Lore's sounds and Pentagram's). A tune is a string of note bytes ended by $FF: the low six bits index NOTES, five octaves of semitones from G#1 to G6 with 0 a rest, and the top two bits are the length less one, one to four units of about 0.155 s. Against Knight Lore's snapshot at this build: of the 88 bytes of PLAY_NOTE, the 4 that differ from Knight Lore's player ($B2DA) are exactly the two addresses in it, the CALL to ADD_HL_A and the LD of NOTES; and the 183 bytes of NOTES are its note table ($B332) exactly. Against Pentagram's snapshot at this build: of the 88 bytes of PLAY_NOTE, the 4 that differ from Pentagram's player ($D6C0) are exactly the two addresses in it, the CALL to ADD_HL_A and the LD of NOTES; and the 183 bytes of NOTES are its note table ($D718) exactly.

Every recording here is the game's own code running in SkoolKit's simulator, each change of the speaker bit logged to the T-state and rendered at 44100 Hz; nothing is synthesised. Most effects were recorded from the game playing -- the very runs the Animations page shows -- so each is heard as it is in the game, with whatever else sounded in those turns, and each is checked wave by wave against what the code and the objects' records say it should be: every wave's half-wave count, and every off half-wave inside a sound against the instruction timings of the loop that timed it. The simulator has no memory contention, so all of this runs a touch faster, and a touch higher, than on a real Spectrum, where the ULA holds up the OUTs. A quiet turn (the empty room, $6D, nothing moving) lasts 121,037 T-states, 35 ms; the calls that stand for a sound made over several turns are spaced by that.

Tunes

The start of a game

Played to its end by AFTER_GAME once 0 has been pressed at the menu, before the robot is put in his start room: the game stands still while it plays.

Recorded: PLAY_TUNE called with DE = $B3C5.

Checked: 17 notes, 18 units, no rests, from row 37 (G#4, 415 Hz) to row 45 (E5, 656 Hz). The table's wave counts make that 1,464 waves, so 2,927 edges (the first OUT turns off a speaker already off); the recording has 2,927 -- the same. Every off half-wave was D + 39 T-states and every on half-wave inside a note was D + 62, D being 13B + 3339C - 3333 for the note's B and C, as PLAY_NOTE's loops imply.

2.84 s, 2,927 edges, 415 to 656 Hz (G#4 to E5).

The menu

TUNE_MENU ($B451, in TUNE_GAME_OVER_END), played by PLAY_TUNE_ONCE from the menu's loop (MENU) the first time the menu is shown after the game is loaded or a game ends (TUNE_HEARD); any key stops it between two notes.

Recorded: PLAY_TUNE_ONCE called with DE = $B451, TUNE_HEARD clear and no key down, so that it plays to the end, as it does for a player who waits.

Checked: 79 notes, 79 units, no rests, from row 23 (F#3, 187 Hz) to row 47 (F#5, 734 Hz). The table's wave counts make that 4,299 waves, so 8,597 edges (the first OUT turns off a speaker already off); the recording has 8,597 -- the same. Every off half-wave was D + 39 T-states and every on half-wave inside a note was D + 62, D being 13B + 3339C - 3333 for the note's B and C, as PLAY_NOTE's loops imply.

12.44 s, 8,597 edges, 187 to 734 Hz (F#3 to F#5).

Game over

Played by GAME_ENDED under the summary after every game, won or lost, through PLAY_TUNE_ONCE's second entry, which stops it at a key but does not mark it heard; then about fourteen seconds' wait for a key (WAIT_KEY_OR_TIME), and the scene after the game.

Recorded: PLAY_TUNE_ONCE's second entry, PLAY_TUNE_TILL_KEY ($B4A9), called with DE = $B3F7 and no key down, so that it plays to the end.

Checked: 63 notes, 64 units, no rests, from row 30 (C#4, 279 Hz) to row 44 (D#5, 619 Hz). The table's wave counts make that 4,491 waves, so 8,981 edges (the first OUT turns off a speaker already off); the recording has 8,981 -- the same. Every off half-wave was D + 39 T-states and every on half-wave inside a note was D + 62, D being 13B + 3339C - 3333 for the note's B and C, as PLAY_NOTE's loops imply.

10.05 s, 8,981 edges, 279 to 619 Hz (C#4 to D#5).

The station arrives

TUNE_ARRIVAL ($B437, in TUNE_GAME_OVER_END), played to its end by ARRIVAL_SCREEN under the arrival screen when the twenty-fourth chamber has been activated, before the summary. The same notes as Knight Lore's tune for the game completed (compared at this build).

Recorded: PLAY_TUNE called with DE = $B437.

Checked: 25 notes, 27 units, no rests, from row 26 (A3, 222 Hz) to row 34 (F4, 350 Hz). The table's wave counts make that 1,119 waves, so 2,237 edges (the first OUT turns off a speaker already off); the recording has 2,237 -- the same. Every off half-wave was D + 39 T-states and every on half-wave inside a note was D + 62, D being 13B + 3339C - 3333 for the note's B and C, as PLAY_NOTE's loops imply.

4.24 s, 2,237 edges, 222 to 350 Hz (A3 to F4).

The end of the winning scene

Played to its end by OILED_ROBOT when the robot has been lowered into the can of oil and raised again, gleaming, at the end of the scene after a won game; then the menu. It begins with the whole of the start tune.

Recorded: PLAY_TUNE called with DE = $B3D7.

Checked: 31 notes, 32 units, no rests, from row 37 (G#4, 415 Hz) to row 45 (E5, 656 Hz). The table's wave counts make that 2,603 waves, so 5,205 edges (the first OUT turns off a speaker already off); the recording has 5,205 -- the same. Every off half-wave was D + 39 T-states and every on half-wave inside a note was D + 62, D being 13B + 3339C - 3333 for the note's B and C, as PLAY_NOTE's loops imply.

5.04 s, 5,205 edges, 415 to 656 Hz (G#4 to E5).

The notes the tunes use, worked out from NOTES and PLAY_NOTE's timing: B and C time each half-wave, and a unit is that many waves. The table has 61 rows; these are the ones any of the five tunes plays.

RowNoteBCWaves a unitPitchA unitPlayed in
23F#3203329186.7 Hz0.155 sThe menu
25G#3125333209.3 Hz0.158 sThe menu
26A389335221.8 Hz0.158 sThe station arrives
27A#356337234.5 Hz0.158 sThe menu, The station arrives
28B324339248.4 Hz0.157 sThe menu
29C4250241263.3 Hz0.156 sThe station arrives
30C#4221244279.2 Hz0.158 sGame over, The station arrives
31D4194246295.7 Hz0.156 sGame over
32D#4169249312.9 Hz0.157 sGame over, The station arrives
33E4145252331.4 Hz0.157 sGame over
34F4123255350.4 Hz0.157 sGame over, The station arrives
35F#4102258370.6 Hz0.156 sThe menu
36G481262393.4 Hz0.158 sGame over
37G#463265415.2 Hz0.157 sGame over, The end of the winning scene, The menu, The start of a game
39A#428273465.5 Hz0.157 sGame over, The end of the winning scene, The menu, The start of a game
40B412278492.7 Hz0.158 sThe end of the winning scene, The menu, The start of a game
41C5253182523.1 Hz0.157 sGame over
42C#5239187553.2 Hz0.157 sGame over, The end of the winning scene, The menu, The start of a game
44D#5213198619.4 Hz0.158 sGame over, The end of the winning scene, The menu, The start of a game
45E52011104655.6 Hz0.159 sThe end of the winning scene, The start of a game
47F#51791117734.2 Hz0.159 sThe menu

The robot

Walking

FOOTSTEP, from HANDLE_FORWARD each time the legs leave a stride (frames 0 and 2 of four): a footstep every other turn, its pitch a fixed half-wave count of 96 or, on alternate pairs of turns (bit 1 of the turn counter), one from his height -- a tick and a tock -- and its length, (U/2 + (256-V)/2)/16 waves, longer towards plus U and shorter towards plus V. Knight Lore's footstep.

Recorded: the game running in the empty room ($6D): walk held for 16 turns from standing, facing plus V, and two turns after.

Checked: 61 waves, 122 edges (the code implies 61 and 122); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

747 ms, 122 edges, 18 turns, 1358 to 2035 Hz.

Turning

The turn's sound: TURNING_LEGS, as a part-way view ends and the legs take the new facing, calls FOOTSTEP past its test on the frame (FOOTSTEP_NOW, $B6D4): a footstep, whatever the legs' frame. So a quarter turn ends in a tick. TURNING_LEGS does not keep BC round the call, and the footstep's loop leaves C, the controls, at zero: on that turn he takes no step and gravity ignores a held jump.

Recorded: the game running: the turning animation's run -- right turn held from standing for a whole circle, four quarter turns.

Checked: 32 waves, 64 edges (the code implies 32 and 64); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

489 ms, 64 edges, 13 turns, 1358 to 2035 Hz.

A jump

JUMP_SOUND, from HANDLE_JUMP as the jump starts: 32 single waves at half-wave counts of 8C for C = 31 down to 1 (the first, 32, rotates round to 1) -- a rising sweep; Knight Lore's jump. Then the legs step all through the jump, with their footsteps, and once he is falling faster than two units a turn MOVE_PLAYER plays BEEP_BY_Z, six waves pitched by his height, every turn until he lands -- and one turn after, as the step the landing left is taken as a fall again.

Recorded: the game running: the jumping animation's run -- jump held from standing until he landed, and two turns after.

Checked: 120 waves, 240 edges (the code implies 120 and 240); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 92 (JUMP_SOUND's) -- the loops' own timing.

880 ms, 240 edges, 16 turns, 526 to 25735 Hz.

Picking up and putting down

PLAIN_BEEP, sixteen waves at 128, for every press of the pick-up key that TAKE_OR_LEAVE acts on -- picking up, moving the slots along, putting down. The valve put down makes a note of its own on the same turn (LOOSE_VALVE sees bit 0 of +D and plays BEEP_BY_UVZ, pitched by U + V + Z). The same beep is the menu's (below), the extra life's and the sparks' in the scene after a lost game.

Recorded: the game running: the carrying animation's run -- a valve (staged) in front of him, four presses of 1, four turns apart.

Checked: 70 waves, 140 edges (the code implies 70 and 140); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

771 ms, 140 edges, 19 turns, 526 to 1026 Hz.

Pausing, and going on

PAUSE_BEEP, 24 waves at a half-wave count of 80, played by HANDLE_PAUSE at the end of a turn as SPACE (or CAPS SHIFT) alone pauses the game, and again as the next press lets it go on. Knight Lore's pause beep. Interrupts stay off throughout.

Recorded: the game running in the empty room: SPACE held 0.3 s, let go 0.5 s, held 0.3 s, let go; recorded on to two turns later. The silence in the middle is the pause, as long as it was held.

Checked: 48 waves, 96 edges (the code implies 48 and 96); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

1.29 s, 96 edges, 1619 Hz.

Dying

SPARKLE_SOUND for each of his two records, every turn of the sparkle they become (START_SPARKLE, SPARKLE_STEP): blips of two waves at pitches read from the ROM, from $1234 on, as many as the complement of the graphic's low five bits -- 15 at graphic 48, one fewer each turn, 8 at 55. Then, as graphic 55 goes, a note for each record pitched by its U + V + Z (SPARKLE_END_PLACE into BEEP_BY_UVZ). Knight Lore's death sparkle.

Recorded: the game running: the dying animation's run -- he walked into a spike; from the turn he was killed to the turn the records emptied.

Checked: 380 waves, 760 edges (the code implies 380 and 760); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 126 (SPARKLE_SOUND's between blips) -- the loops' own timing.

891 ms, 760 edges, 9 turns, 515 to 32407 Hz.

Appearing, a life begun

MATERIALISE_SOUND, for each of his two records, every other turn as PLAYER_APPEARING steps them through graphics 57 to 63: single waves stepping from 4 x (graphic AND 7) + 3 down to 1, the half-wave count four times the step -- a sweep that rises, longer at each frame, 7 waves at 57 to 31 at 63. Knight Lore's materialising sound. At the start of every life, and after every doorway.

Recorded: the game running: the dying animation's run, from the turn after the records emptied to the turn he stood again.

Checked: 266 waves, 532 edges (the code implies 266 and 532); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 80 (MATERIALISE_SOUND's) -- the loops' own timing.

1.48 s, 532 edges, 15 turns, 1054 to 11438 Hz.

Valves and chambers

A valve on its way

LOOSE_VALVE: every turn a valve moves -- and on the turn it is put down -- a note of six waves pitched by U + V + Z (BEEP_BY_UVZ), so a valve steering itself a unit a turn towards its socket sounds a slowly falling scale. On the turn it was put down the beep of the press comes first, and the socket's sparkle vanishing with a note of its own (SOCKET_SPARKLE into $B3BB); as the valve slid out from under him his own falling note joins in (MOVE_PLAYER).

Recorded: the game running: the valve seating animation's run -- from the press that put the valve down to the turn it came to rest on the socket.

Checked: 148 waves, 296 edges (the code implies 148 and 296); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

2.21 s, 296 edges, 18 turns, 611 to 1120 Hz.

A chamber activated

LOOSE_VALVE, as the valve sits on its socket: a note pitched by its U + V + Z as it becomes a seated valve, then for each of the sixteen passes over the colours SPARKLE_SOUND with the seated valve's graphic (100: 27 blips of two waves from the ROM at $1234) and a pause; the silences between are the passes over the 768 attribute cells. The same sound for all 24 chambers.

Recorded: the game running: the chamber animation's run -- the turn the valve activated the chamber, from its start to its end.

Checked: 870 waves, 1,740 edges (the code implies 870 and 1,740); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 126 (SPARKLE_SOUND's between blips) -- the loops' own timing.

1.16 s, 1,740 edges, 1 turn, 515 to 32407 Hz.

An extra life

EXTRA_LIFE, as he touches it: PLAIN_BEEP's beep, and the life becomes graphic 64, the start of a two-frame vanish: the next turn SPARKLE_STEP steps it to 65 with SPARKLE_SOUND's blips (30 of them, for graphic 65), and the turn after SPARKLE_END_PLACE empties its place for good with a note pitched by its position. Walking into it he also pushed it, and a thing that moves makes a note of its own ($B3BF, pitched by U + V + Z) on that turn, after the beep.

Recorded: the game running in the empty room: an extra life staged 40 units in front of him (as the build's session puts one, in place 1), walk held until he touched it, and three turns after.

Checked: 126 waves, 252 edges (the code implies 126 and 252); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 126 (SPARKLE_SOUND's between blips) -- the loops' own timing.

602 ms, 252 edges, 13 turns, 515 to 32407 Hz.

Things in the rooms

A lift ridden

LIFT: every turn it moves, BEEP_BY_Z pitched by its height as the turn began -- higher as it rises -- and a turn's silence at the top, where it turns round. On the way down he is falling onto it every turn, faster than two units a turn once gravity has had its way, and his own falling note (MOVE_PLAYER) sounds before the lift's: two notes a turn, his falling as the lift's does.

Recorded: the game running: the lift animation's run in room $23 -- up with him on it and down again.

Checked: 900 waves, 1,800 edges (the code implies 900 and 1,800); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

8.02 s, 1,800 edges, 101 turns, 526 to 11076 Hz.

Riding a conveyor

HIGH_BEEP, 32 waves at 48, from the conveyor's routine (CONVEYOR_PLUS_V) every turn something has landed on it -- and something standing on it lands on it every turn, gravity pulling it down and the conveyor stopping it -- so a ride is a steady buzz, a beep a turn. The clockwork mice use the same beep as they turn.

Recorded: the game running: the conveyor animation's run in room $0D, ten turns of the ride.

Checked: 320 waves, 640 edges (the code implies 320 and 640); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

882 ms, 640 edges, 10 turns, 2632 Hz.

A dropping block ridden down

DROPPING_BLOCK: every turn it sinks, BEEP_BY_Z pitched by its new height; and with him on it, falling after it a unit a turn, his own falling note first (MOVE_PLAYER) -- two notes a turn, falling together.

Recorded: the game running: the dropping block animation's run in room $12, until the block had stopped.

Checked: 288 waves, 576 edges (the code implies 288 and 576); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

2.45 s, 576 edges, 28 turns, 526 to 1200 Hz.

A collapsing block

COLLAPSING_BLOCK: landed on, it becomes 64 and at once 65 with SPARKLE_STEP's sparkle sound (SPARKLE_SOUND, 30 blips for graphic 65); the next turn SPARKLE_END_PLACE makes it vanish with a note pitched by U + V + Z; and he falls, with his falling notes.

Recorded: the game running: the collapsing block animation's run in room $15.

Checked: 96 waves, 192 edges (the code implies 96 and 192); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 126 (SPARKLE_SOUND's between blips) -- the loops' own timing.

454 ms, 192 edges, 7 turns, 515 to 32407 Hz.

Shuttling blocks

SHUTTLE_U (graphic 66) plays BEEP_BY_U, pitched by its U, and SHUTTLE_V (graphic 67) BEEP_BY_V, pitched by its V, every turn before it moves: with the two in room $61 out of step, two scales passing each other.

Recorded: the game running: the shuttling blocks animation's run in room $61.

Checked: 468 waves, 936 edges (the code implies 468 and 936); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

5.75 s, 936 edges, 39 turns, 1400 to 3723 Hz.

A remote-controlled robot at work

WARBLE_SOUND from REMOTE_ROBOT every turn the robot in control has an order: single waves, as many as WARBLE_COUNTS gives for the turn counter's low two bits (12, 16, 20, 8 in turn), each at 64 plus the turn counter XOR the step count, AND 31 -- a warble that never repeats exactly. The fragile thing it breaks (FRAGILE) goes with the death sparkle's last frame, 55 (SPARKLE_SOUND, 8 blips), and a note as it vanishes.

Recorded: the game running: the remote-control animation's run in room $D9, him on a button, until the fragile thing was gone.

Checked: 450 waves, 900 edges (the code implies 450 and 900); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 99 (WARBLE_SOUND's), 126 (SPARKLE_SOUND's between blips) -- the loops' own timing.

3.85 s, 900 edges, 30 turns, 525 to 6679 Hz.

A homing thing

SLOW_CHASER plays WARBLE_SOUND every turn with the table four bytes on (WARBLE_COUNTS's last four: 24, 20, 16, 12 waves by the turn counter), so it warbles as the robots do but longer.

Recorded: the game running: the homing thing animation's run in room $5E, until the turn before it reached him.

Checked: 612 waves, 1,224 edges (the code implies 612 and 1,224); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 99 (WARBLE_SOUND's) -- the loops' own timing.

1.94 s, 1,224 edges, 34 turns, 1353 to 1965 Hz.

A chaser

SPARK_CHASER ends every turn in $B3BF: a note pitched by U + V + Z after its move, so its pitch follows it about and holds steady (or flickers between two) when it is stuck against him.

Recorded: the game running: the chaser animation's run in room $9C.

Checked: 234 waves, 468 edges (the code implies 234 and 468); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

2.22 s, 468 edges, 39 turns, 542 to 14706 Hz.

Clockwork mice

CLOCKWORK_MOUSE plays HIGH_BEEP, 32 waves at 48, each time a mouse turns -- when it is stopped, blocked or has run its count -- and nothing while it runs.

Recorded: the game running: the clockwork mice animation's run in room $4D.

Checked: 736 waves, 1,472 edges (the code implies 736 and 1,472); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

4.05 s, 1,472 edges, 63 turns, 2632 Hz.

A wanderer turning

WANDERER plays THUD_SOUND each time it is stopped and turns a quarter: three waves at each of the ROM's first four bytes with the top two bits set -- low, dull notes, a thud. Knight Lore's thud.

Recorded: the game running: the wanderer animation's run.

Checked: 72 waves, 144 edges (the code implies 72 and 144); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 133 (CRASH_SOUND's and THUD_SOUND's between blips) -- the loops' own timing.

4.40 s, 144 edges, 63 turns, 521 to 635 Hz.

A pacer turning round

PACER plays the same thud (THUD_SOUND) each time it is stopped and turns round.

Recorded: the game running: the pacer animation's run.

Checked: 48 waves, 96 edges (the code implies 48 and 96); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 133 (CRASH_SOUND's and THUD_SOUND's between blips) -- the loops' own timing.

3.30 s, 96 edges, 39 turns, 521 to 635 Hz.

Leapers

LEAPER: every turn a leaper is in the air -- and the turn it lands -- BEEP_BY_Z pitched by its height after the move: up and down the scale, one leaper at a time.

Recorded: the game running: the leapers animation's run in room $97.

Checked: 384 waves, 768 edges (the code implies 384 and 768); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

4.22 s, 768 edges, 63 turns, 526 to 2238 Hz.

A thing dropping from the ceiling

CEILING_DROP: every turn it falls, BEEP_BY_Z pitched by its height, lower and lower; and as it lands THUD_ON_LANDING plays CRASH_SOUND, sixteen blips of two waves at pitches read from the ROM at an address made of the random number and the turn counter -- a crash no two landings share. Knight Lore's crash.

Recorded: the game running: the ceiling animation's run in room $58, two of them falling one after the other.

Checked: 166 waves, 332 edges (the code implies 166 and 332); every on half-wave was 13B + 18 T-states for the B the code gives it; the 2 crashes' pitches were sixteen ROM bytes in a row, less their top bits, as CRASH_SOUND reads them; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 133 (CRASH_SOUND's and THUD_SOUND's between blips) -- the loops' own timing.

2.70 s, 332 edges, 19 turns, 514 to 32407 Hz.

The menu and the scenes after a game

Re-programming

The scene after a lost game: the sparks over the robot's head (SCENE_SPARKS) beep (PLAIN_BEEP) every eighth turn as they flash, sixteen times; then each tool (SCENE_TOOL) thuds (THUD_SOUND) as it starts its swing and crashes (CRASH_SOUND) as it strikes, fifteen swings in all.

Recorded: the game running: the game-over animation's run, the scene from its second sound (the game-over tune before it leaves the speaker on) to the last turn before the menu. The scene has no wait between turns, so the sounds come closer together than they would in play.

Checked: 900 waves, 1,800 edges (the code implies 900 and 1,800); every on half-wave was 13B + 18 T-states for the B the code gives it; the 15 crashes' pitches were sixteen ROM bytes in a row, less their top bits, as CRASH_SOUND reads them; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP), 133 (CRASH_SOUND's and THUD_SOUND's between blips) -- the loops' own timing.

5.10 s, 1,800 edges, 303 turns, 514 to 32407 Hz.

The robot oiled

OILED_ROBOT, the scene after a won game: every turn the robot moves, down into the can of oil and up out of it, $B63F pitched by its height on the screen (+1B, in pixels): falling, a pause at the bottom, rising.

Recorded: the game running: the win animation's run, the scene from the robot's second move (the tunes before it leave the speaker on) to its last.

Checked: 354 waves, 708 edges (the code implies 354 and 708); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

2.13 s, 708 edges, 123 turns, 528 to 14706 Hz.

Never heard in the game

Sound code the game has but never runs, recorded by calling it to hear what it would have made. Checked at this build against Knight Lore's snapshot: of its 23 bytes, the 2 that differ from Knight Lore's sound_transform ($B472) are exactly the address in its CALL of CLICK.

Knight Lore's werewolf, never played

TRANSFORM_SOUND, which nothing calls: Knight Lore's sound for Sabreman changing into the werewolf and back (Knight Lore's sounds), left in: 16, 24, 32 or 40 single waves by the low two bits of the graphic, each at (C XOR $55) + C for C counting down -- a warble. Pentagram's jump is the same routine with $A5.

Recorded: four calls with IX on a record of graphic 0, 1, 2 and 3 -- the four lengths -- four quiet turns apart, as Knight Lore played it every fourth frame.

Checked: 112 waves, 224 edges (the code implies 112 and 224); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 83 (TRANSFORM_SOUND's) -- the loops' own timing.

501 ms, 224 edges, 797 to 1514 Hz.

Knight Lore's movable-block blip, never played

The 18 bytes of code at $B5D4, after the last row of NOTES, which no instruction or table reaches: four waves (BEEP) at one of the eight half-wave counts after it, picked by the turn counter's low three bits. It is Knight Lore's blip for its movable block, which that game's block plays every frame, a quiet buzz under everything (Knight Lore's sounds); Pentagram keeps a variant of it, gated on a flag and also never reached (Pentagram's sounds). Compared at this build with Knight Lore's snapshot: of its 26 bytes, code and pitch table, the 5 that differ from Knight Lore's routine at $B3E9 and the table after it are only the three addresses in it (the turn counter for Knight Lore's frame counter, the table, BEEP); the eight pitches are the same.

Recorded: eight calls of $B5D4 with the turn counter 0 to 7, a quiet turn apart: what one object calling it every turn would make.

Checked: 32 waves, 64 edges (the code implies 32 and 64); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

281 ms, 64 edges, 593 to 1358 Hz.

A creature's footstep, never heard

LOWER_HALF_STEP, which the lower half of a two-part creature calls every turn (LOWER_HALF): it plays only for an even graphic, and the lower half is always graphic 11, so it never sounds. Past the test it is the robot's footstep (FOOTSTEP) at a pitch of 128, the turn counter complemented: Knight Lore's footstep for its guards and wizard, whose graphics change as they walk.

Recorded: eight calls of $B6C6, the code after the test, with IX on a record at U 128, V 128, Z 64 and the turn counter 0 to 7, a quiet turn apart.

Checked: 64 waves, 128 edges (the code implies 64 and 128); every on half-wave was 13B + 18 T-states for the B the code gives it; and every off half-wave inside a sound was 13B plus 64 (BEEP's, in FOOTSTEP) -- the loops' own timing.

289 ms, 128 edges, 1026 to 2035 Hz.