Jet Set Willy: Routine at 8C01

| Routines

8C01: Lose a life

Used by the routine at 8B07.
8C01 | LD A,$47 | A=0x47 (INK 7: PAPER 0: BRIGHT 1)
The following loop fills the top two thirds of the attribute file with a single value (0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41 or 0x40) and makes a sound effect. Your browser doesn't support HTML5 audio. Here is a link to the audio instead.
8C03 | LD HL,$5800 | Fill the top two thirds of the attribute file with the value in A
8C06 | LD DE,$5801
8C09 | LD BC,$01FF
8C0C | LD (HL),A
8C0D | LDIR
8C0F | LD E,A | Save the attribute byte (0x40-0x47) in E for later retrieval
8C10 | CPL | D=63-8*(E AND 7); this value determines the pitch of the short note that will be played
8C11 | AND $07
8C13 | RLCA
8C14 | RLCA
8C15 | RLCA
8C16 | OR $07
8C18 | LD D,A
8C19 | LD C,E | C=8+32*(E AND 7); this value determines the duration of the short note that will be played
8C1A | RRC C
8C1C | RRC C
8C1E | RRC C
8C20 | OR $10 | Set bit 4 of A (for no apparent reason)
8C22 | XOR A | Set A=0 (this will make the border black)
8C23 | OUT ($FE),A | Produce a short note whose pitch is determined by D and whose duration is determined by C
8C25 | XOR $18
8C27 | LD B,D
8C28 | DJNZ $8C28
8C2A | DEC C
8C2B | JR NZ,$8C23
8C2D | LD A,E | Restore the attribute byte (originally 0x47) to A
8C2E | DEC A | Decrement it (effectively decrementing the INK colour)
8C2F | CP $3F | Have we used attribute value 0x40 (INK 0) yet?
8C31 | JR NZ,$8C03 | If not, jump back to update the INK colour in the top two thirds of the screen and make another sound effect
Now check whether any lives remain.
8C33 | LD HL,$85CC | Pick up the number of lives remaining from 85CC
8C36 | LD A,(HL)
8C37 | OR A | Are there any lives remaining?
8C38 | JP Z,$8C4A | If not, display the game over sequence
8C3B | DEC (HL) | Decrease the number of lives remaining by one
8C3C | LD HL,$85D7 | Restore Willy's state upon entry to the room by copying the seven bytes at 85D7 back into 85CF-85D5
8C3F | LD DE,$85CF
8C42 | LD BC,$0007
8C45 | LDIR
8C47 | JP $8912 | Reinitialise the room and resume the game