Routines |
Prev: 38545 | Up: Map | Next: 38601 |
Used by the routine at 34762. For each of the 99 bytes in the tune data table at 34299, this routine produces two notes, each lasting approximately 0.15s; the second note is played at half the frequency of the first. Returns with the zero flag reset if ENTER, 0 or the fire button is pressed while the tune is being played.
|
||||||||
38562 | LD A,(HL) | Pick up the next byte of tune data from the table at 34299 | ||||||
38563 | CP 255 | Has the tune finished? | ||||||
38565 | RET Z | Return (with the zero flag set) if so | ||||||
38566 | LD BC,100 | B=0 (short note duration counter), C=100 (short note counter) | ||||||
38569 | XOR A | A=0 (border colour and speaker state) | ||||||
38570 | LD E,(HL) | Save the byte of tune data in E for retrieval during the short note loop | ||||||
38571 | LD D,E | Initialise D (pitch delay counter) | ||||||
38572 | OUT (254),A | Produce a short note (approximately 0.003s) whose pitch is determined by the value in E | ||||||
38574 | DEC D | |||||||
38575 | JR NZ,38580 | |||||||
38577 | LD D,E | |||||||
38578 | XOR 24 | |||||||
38580 | DJNZ 38572 | |||||||
38582 | EX AF,AF' | Save A briefly | ||||||
38583 | LD A,C | Is the short note counter in C (which starts off at 100) down to 50 yet? | ||||||
38584 | CP 50 | |||||||
38586 | JR NZ,38590 | Jump if not | ||||||
38588 | RL E | Otherwise double the value in E (which halves the note frequency) | ||||||
38590 | EX AF,AF' | Restore the value of A | ||||||
38591 | DEC C | Decrement the short note counter in C | ||||||
38592 | JR NZ,38572 | Jump back unless we've finished playing 50 short notes at the lower frequency | ||||||
38594 | CALL 38601 | Check whether ENTER, 0 or the fire button is being pressed | ||||||
38597 | RET NZ | Return (with the zero flag reset) if it is | ||||||
38598 | INC HL | Move HL along to the next byte of tune data | ||||||
38599 | JR 38562 | Jump back to play the next batch of 100 short notes |
Prev: 38545 | Up: Map | Next: 38601 |