;**************************************************************************
;***                                                                    ***
;*** Everyday Electronics Micro-Lab                                     ***
;***                                                                    ***
;***    Name:           Demonstration 7                                 ***
;***    Version:        1.0                                             ***
;***    Author:         Geoff MacDonald                                 ***
;***    Date:           18/01/1993                                      ***
;***    Last Update:                                                    ***
;***                                                                    ***
;**************************************************************************

                        ;Reads data from memory and uses it to play a
                        ;tune using the 65C22 VIA.  The data is of the
                        ;form:
                        ;   NOTE, LENGTH, NOTE, LENGTH, NOTE, LENGTH...
                        ;Where NOTE=(0;Rest | 1:A1 | 2:Bb1 | 3:B1 | 4:C2..)
                        ;And   LENGTH=(1:0.16S | 2:0.32S | ... | 7:1.12S)
                        ;A NOTE of value $FF terminates the tune.
                        ;The start address of the tune data should be stored
                        ;in locations $90 (low) and $91 (high)

FREQTABH:               DFB     $FF,$07,$06,$06,$06,$05,$05,$05,$04
                        DFB     $04,$04,$04,$03,$03,$03,$03,$03
                        DFB     $02,$02,$02,$02,$02,$02,$02,$01,$01
FREQTABL:               DFB     $FF,$6D,$FA,$89,$3B,$E3,$88,$31,$E4
                        DFB     $AD,$69,$29,$EC,$B1,$7A,$4C,$1B
                        DFB     $F5,$C3,$99,$7B,$53,$33,$14,$F3,$DB

D_DEMO7:                LDA     $90             ;Save tune start on stack
                        PHA
                        LDA     $91
                        PHA
                        LDA     #$01            ;Initialise 65C22 for sound
                        JSR     SOUND
DEMO7A:                 LDY     #$00
                        LDA     ($90),Y         ;Get note value
                        CMP     #$FF            ;End of tune?
                        BEQ     DEMO7B
                        TAX
                        LDA     FREQTABL,X      ;Convert to 65C22 count value
                        TAY
                        LDA     FREQTABH,X
                        TAX
                        LDA     #$00
                        JSR     SOUND           ;Play sound
                        LDY     #$01            ;Get note length
                        LDA     ($90),Y
                        ASL     A               ;Convert to delay time
                        ASL     A
                        ASL     A
                        JSR     DELAY           ;Delay
                        LDX     #$FF            ;Staccato pause
                        LDY     #$FF
                        LDA     #$00
                        JSR     SOUND
                        LDA     #$1
                        JSR     DELAY
                        CLC                     ;Point to next note
                        LDA     $90
                        ADC     #$02
                        STA     $90
                        LDA     $91
                        ADC     #$00
                        STA     $91
                        JMP     DEMO7A
DEMO7B:                 LDX     #$00            ;Turn sound off
                        LDY     #$00
                        LDA     #$00
                        JSR     SOUND
                        PLA                     ;Restore tune start address
                        STA     $91
                        PLA
                        STA     $90
                        BRK
