; OPUS I THE TRS-80 CONCERTO ; .org 0000h LD SP, 0080h ; ADDED FOR TESTING PURPOSES. START: LD IX, TABLE ; START OF MUSIC TABLE. CONT1: LD C, (IX) ; DURATION. LD A, C ; MOVE TO A FOR TEST. OR A ; TEST FOR 0. LOOP: JP Z, LOOP ; LOOP HERE ON DONE. CONT2: LD B, (IX +1) ; GET DELAY COUNT. LD A, 1 OUT (0FFh), A ; TURN ON 1/2 CYCLE. LOOP1: DJNZ LOOP1 ; DELAY FOR FREQUENCY. LD B, (IX +1) ; GET DELAY AGAIN. LD A, 2 OUT (0FFh), A ; TURN ON OTHER 1/2 CYCLE. LOOP2: DJNZ LOOP2 ; DELAY FOR FREQUENCY. LOOP3: DEC C ; DECREMENT DURATION. JP NZ, CONT2 ; GO IF NOT DONE. INC IX ; POINT TO NEXT NOTE. INC IX LD BC, -1 ; INCREMENT VALUE. LD HL, 30h ; INITIAL DELAY VALUE. LOOP4: ADD HL, BC ; DELAY FOR INTERVAL BETWEEN NOTES. JP C, LOOP4 JP CONT1 ; CONTINUE. TABLE: .DB 90A0h ; TABLE OF NOTES. .DB 0A23Fh ; EACH ENTRY IS MADE UP OF TWO BYTES. .DB 0AC5Ch ; FIRST BYTE IS DURATION OF NOTE. .DB 9060h ; SECOND BYTES IS FREQUENCY VALUE. .DB 90A0h .DB 9040h .DB 8070h .DB 90F0h .DB 0A25Dh .DB 0AD5Bh .DB 9060h .DB 6BE0h .DB 5F48h .DB 54FFh .DB 0 ; TERMINATOR. .END