#IF AUDIOTRACE #DEFINE AUDTRACE(STR) PUSH DE \ LD DE, STR \ CALL WRITESTR \ POP DE #DEFINE AUDTRACE_A CALL PRTHEXBYTE #DEFINE AUDTRACE_B PUSH AF \ LD A, B \ CALL PRTHEXBYTE \ POP AF #DEFINE AUDTRACE_D PUSH AF \ LD A, D \ CALL PRTHEXBYTE \ POP AF #DEFINE AUDTRACE_E PUSH AF \ LD A, E \ CALL PRTHEXBYTE \ POP AF #DEFINE AUDTRACE_L PUSH AF \ LD A, L \ CALL PRTHEXBYTE \ POP AF #DEFINE AUDTRACE_HL CALL PRTHEXWORDHL #DEFINE AUDTRACE_BC PUSH HL \ PUSH BC \ POP HL \ CALL PRTHEXWORDHL \ POP HL #DEFINE AUDTRACE_DE PUSH HL \ PUSH DE \ POP HL \ CALL PRTHEXWORDHL \ POP HL #DEFINE AUDTRACE_IY PUSH HL \ PUSH IY \ POP HL \ CALL PRTHEXWORDHL \ POP HL #DEFINE AUDDEBUG(S) push hl \ CALL PRTSTRD \ .TEXT S \ .TEXT "$" \ pop hl ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED #DEFINE AUDTRACE_CR AUDDEBUG("\r\n$") #ELSE #DEFINE AUDTRACE(S) #DEFINE AUDTRACE_A #DEFINE AUDTRACE_B #DEFINE AUDTRACE_D #DEFINE AUDTRACE_E #DEFINE AUDTRACE_L #DEFINE AUDTRACE_BC #DEFINE AUDTRACE_HL #DEFINE AUDTRACE_DE #DEFINE AUDTRACE_IY #DEFINE AUDDEBUG(STR) #DEFINE AUDTRACE_CR #ENDIF #IFNDEF AUDIOUTILS #DEFINE AUDIOUTILS AUD_NOTE: AUDDEBUG("AUDNOTE ") AUDTRACE_HL AUDTRACE_CR AUDTRACE_DE AUDTRACE_CR ; PUSH DE ; ON ENTRY HL IS THE NOTE TO PLAY LD DE, 48 ; AND DE IS THE START OF NOTE TABLE CALL DIV16 ; LOAD DE WITH NOTE TABLE SIZE ; AND CALCULATE OCTAVE COUNT IN BC ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY. LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE LD L, A INC C AUD_NOTE1: ; DIVIDE THE PERIOD DEC C ; BY TWO ; JR Z, AUD_NOTE2 ; FOR EACH OCTAVE RET Z SRL H RR L JR AUD_NOTE1 ;AUD_NOTE2: ; LD A, L ; IF NOT ZERO ; OR H ; RET NZ ; RETURN THE CALCULATED PERIOD ; ; CPL ; LD H, A ; OTHERWISE RETURN -1 PERIOD (ERROR) ; LD L, A ; RET #ENDIF