| Routines

5F9D: Play a tune

Used by the routine at F5BE. The main entry point is used to play the theme tune. Your browser doesn't support HTML5 audio. Here is a link to the audio instead.
5F9D | LD HL,$5C3B | Reset bit 5 at 5C3B, clearing the record of any keypresses before the tune starts
5FA0 | RES 5,(HL)
5FA2 | LD HL,$DC40 | The theme tune data starts at DC41
This entry point is used by the routine at 5D63 with HL=DC2C-1 (the up-a-year tune data starts at DC2C). Your browser doesn't support HTML5 audio. Here is a link to the audio instead.
5FA5 | DI | Disable interrupts
5FA6 | INC HL | Point HL at the next tune datum
5FA7 | LD A,(HL) | Pick it up
5FA8 | INC A | Is it an end-of-section marker?
5FA9 | JR NZ,$5FB0 | Jump if not
5FAB | INC HL | Point HL at the first datum in the next section
5FAC | LD A,(HL)
5FAD | INC HL
5FAE | LD H,(HL)
5FAF | LD L,A
5FB0 | LD A,(HL) | A=tune datum
5FB1 | AND A | Have we reached the end of the tune?
5FB2 | JP Z,$F2D9 | Jump if so
A non-zero tune datum has been found, meaning the tune is not finished yet.
5FB5 | PUSH HL | Save the tune data table pointer
5FB6 | RRCA | Set the carry flag if we should pause briefly
5FB7 | LD B,A | Copy the right-rotated tune datum to B
5FB8 | JR NC,$5FC2 | Jump unless we should pause briefly
5FBA | LD D,$0F | Pause briefly
5FBC | DEC E
5FBD | JR NZ,$5FBC
5FBF | DEC D
5FC0 | JR NZ,$5FBC
5FC2 | AND $07 | 0<=A<=7
5FC4 | LD C,A | C=border colour for this note
5FC5 | ADD A,A | Point HL at an entry in the note duration/pitch data table at 5FF0
5FC6 | ADD A,$F0
5FC8 | LD L,A
5FC9 | LD H,$5F
5FCB | LD A,B | A=original tune datum rotated right one bit
5FCC | RRCA | Obtain the note frequency parameter in E and the note duration parameter in HL
5FCD | RRCA
5FCE | RRCA
5FCF | AND $0F
5FD1 | LD B,A
5FD2 | LD E,(HL)
5FD3 | INC L
5FD4 | LD A,(HL)
5FD5 | LD HL,$0000
5FD8 | ADD HL,DE
5FD9 | DJNZ $5FD8
5FDB | RES 0,L
5FDD | LD E,A
5FDE | LD A,C | Produce a note
5FDF | OUT ($FE),A
5FE1 | XOR $10
5FE3 | LD C,A
5FE4 | LD B,E
5FE5 | DJNZ $5FE5
5FE7 | DEC HL
5FE8 | DEC L
5FE9 | LD A,H
5FEA | OR L
5FEB | JR NZ,$5FDE
5FED | POP HL | Restore the tune data table pointer to HL
5FEE | JR $5FA6 | Pick up the next tune datum