*THESE EQUATES DEFINE VARIOUS CONTROL REGISTERS *INTERRUPT/RESET VECTORS RESVEC EQU $1FFE HARD RESET VECTOR SCIVEC EQU $1FF6 SCI SERIAL PORT INTERRUPT VECTOR TIMVEC EQU $1FF8 TIMER INTERRUPT VECTOR *MEMORY CONFIGURATION OPTREG EQU $1FDF OPTION REGISTER TO SET MEMORY CONFIGURATION *I/O PORTS PORTA EQU $00 PORT A DATA REGISTER PORTB EQU $01 PORT B DATA REGISTER PORTC EQU $02 PORT C DATA REGISTER PORTD EQU $03 PORT D FIXED INPUT REGISTER DDRA EQU $04 PORT A DATA DIRECTION REGISTER DDRB EQU $05 PORT B DATA DIRECTION REGISTER DDRC EQU $06 PORT C DATA DIRECTION REGISTER *SCI SERIAL PORT BAUDRG EQU $0D SCI BAUD RATE REGISTER SCICT1 EQU $0E SCI CONTROL REGISTER 1 SCICT2 EQU $0F SCI CONTROL REGISTER 2 SCISTA EQU $10 SCI COMMUNICATIONS STATUS REGISTER SCIDAT EQU $11 SCI COMMUNICATIONS DATA REGISTER *TIMER *WITH A 4 MHz CLOCK, EACH FREE RUNNING TIMER COUNTER DECREMENT TAKES *2 MICROSECONDS (BEST RESOLUTION) TIMCNT EQU $19 TIMER COUNTER REGISTER, READ ONLY (LOW BYTE) ACHR EQU $1A ALTERNATE COUNTER HIGH REGISTER ACLR EQU $1B ALTERNATE COUNTER LOW REGISTER OCHR EQU $16 OUTPUT COMPARE HIGH REGISTER OCLR EQU $17 OUTPUT COMPARE LOW REGISTER TSR EQU $13 TIMER STATUS REGISTER TCR EQU $12 TIMER CONTROL REGISTER SAMCNT EQU $25 NUMBER OF TIMER COUNTS BETWEEN INTERRUPTS FOR 12 KHZ SEIZE EQU $20 PRESS VALUE FOR BUTTON 2600 KEYP EQU $40 PRESS VALUE FOR BUTTON KEY PULSE 1 STRT EQU $80 PRESS VALUE FOR BUTTON START MF1 EQU $01 PRESS VALUE FOR BUTTON 1 MF2 EQU $02 PRESS VALUE FOR BUTTON 2 MF3 EQU $04 PRESS VALUE FOR BUTTON 3 MF4 EQU $02 PRESS VALUE FOR BUTTON 4 MF5 EQU $04 PRESS VALUE FOR BUTTON 5 MF6 EQU $08 PRESS VALUE FOR BUTTON 6 MF7 EQU $10 PRESS VALUE FOR BUTTON 7 MF8 EQU $20 PRESS VALUE FOR BUTTON 8 MF9 EQU $40 PRESS VALUE FOR BUTTON 9 MF0 EQU $80 PRESS VALUE FOR BUTTON 0 DIAL EQU $03 PRESS VALUE FOR DIAL TONE RING EQU $06 PRESS VALUE FOR RINGBACK BUSY EQU $06 PRESS VALUE FOR BUSY REORD EQU $0C PRESS VALUE FOR REORDER DTMF EQU $A0 PRESS VALUE TO TOGGLE DTMF MODE AA EQU $05 PRESS VALUE FOR DTMF A DD EQU $C0 PRESS VALUE FOR DTMF D BB EQU $0A PRESS VALUE FOR DTMF B CC EQU $50 PRESS VALUE FOR DTMF C BRST EQU $30 PRESS VALUE TO TOGGLE MF BURST MODE CAL EQU $60 PRESS VALUE TO TOGGLE CALIBRATION MODE SITIN EQU $12 PRESS VALUE FOR INTERCEPT SIT TONE SITNC EQU $24 PRESS VALUE FOR NO CIRCUIT SIT TONE SITRO EQU $48 PRESS VALUE FOR REORDER SIT TONE *RAM STORAGE PTR1LO EQU $30 POINTER INTO SINE TABLE FOR TONE 1 PTR1HI EQU $31 PTR2LO EQU $32 POINTER INTO SINE TABLE FOR TONE 2 PTR2HI EQU $33 INC1LO EQU $34 INCREMENT INTO SINE TABLE FOR TONE 1 INC1HI EQU $35 INC2LO EQU $36 INCREMENT INTO SINE TABLE FOR TONE 2 INC2HI EQU $37 SAMPLO EQU $38 12KHZ SAMPLE CYCLE COUNTER SAMPHI EQU $39 TIMLO EQU $40 STORAGE FOR LOW TIMER COUNT TIMHI EQU $41 STORAGE FOR HIGH TIMER COUNT BURCNT EQU $42 BURST COUNTER CTLO EQU $43 HIGH BYTE OF SAMPLE COUNT CTHI EQU $44 LOW BYTE OF SAMPLE COUNT TEMP EQU $45 TEMPORARY BYTE STORAGE FOR TIMER SERVICING PRESS EQU $46 STORAGE FOR LAST KEY PRESS MODE EQU $47 STORAGE FOR MF/DTMF MODE FLAG BSTFLG EQU $48 STORAGE FOR MF BURST MODE FLAG TEMP1 EQU $49 TEMPORARY STORAGE FOR DEBOUNCE DELAY PWRTIM EQU $50 COUNTER FOR POWER OFF TIMER CALFLG EQU $51 STORAGE FOR CALIBRATION MODE FLAG ******************************************************************************* * INITIALIZATION ORG $1FF4 BEGINNING OF INTERRUPT VECTORS FDB START SPI VECTOR POINTS TO INIT FDB START SCI VECTOR POINTS TO INIT FDB TIMISR TIMER VECTOR POINTS TO TIMER ISR FDB SWITCH IRQ LINE VECTOR POINTS TO ISR FDB START SWI VECTOR POINTS TO INIT FDB START RESET VECTOR POINTS TO INIT ORG $0160 BEGINNING OF USER EPROM, MEMORY MAP 4 START EQU * SEI DISABLE INTERRUPTS LDA #$C0 SET FOR MEMORY MAP 4, EDGE IRQ DETECT STA OPTREG LDA #$10 SET PORTA FOR SWITCHES AND AMPLIFIER SWITCH STA DDRA BSET 3,PORTA PRESET LATCH FOR PULL-UP V SOURCE LDA #$FF INITIALIZE PORT B FOR D/A STA DDRB CLR PORTB INITIALIZE D/A FOR NO OUTPUT LDA #$01 INITIALIZE SECOND SWITCH PORT FOR 7 INPUTS STA DDRC SET 2ND SWITCH PORT FOR 7 INPUTS CLR MODE INITIALIZE TO MF MODE CLR BSTFLG INITIALIZE TO MF BURST MODE CLR CALFLG INITIALIZE CALIBRATION MODE OFF INIT CLI ENABLE INTERRUPTS MAIN EQU * * WAIT FOR KEY RELEASE BSET 3,DDRA TURN ON PULL-UP VOLTAGE BSET 3,PORTA LDA #$FF WAIT FOR VOLTAGE TO STABILIZE AGAIN DECA BNE AGAIN NONE LDA PORTA GET INPUTS FROM SWITCH PORT COMA TAKE THE COMPLEMENT FOR EASIER PROCESSING AND #$E7 MASK ALL BUT THE SWITCH INPUTS BNE NONE STILL PRESSED, WAIT NONE2 LDA PORTC GET INPUTS FROM SECOND SWITCH PORT COMA TAKE THE COMPLEMENT FOR EASIER PROCESSING AND #$FE MASK ALL BUT THE SWITCH INPUTS BNE NONE2 STILL PRESSED, WAIT BCLR 3,DDRA IF RELEASED, SHUT OFF PULL-UP VOLTAGE * 33 SECOND POWER DOWN TIMER ROUTINE LDA #$FF SET UP OVERFLOW EVENT COUNTER STA PWRTIM SAVE IT PWRDWN LDA TSR CLEAR TIMER OVERFLOW FLAG LDA TIMCNT HOLD BIL PWRUP IF IRQ LOW, CONTINUE BRCLR 5,TSR,HOLD LOOP UNTIL OVERFLOW SET DEC PWRTIM DECREMENT POWER OFF TIMER BNE PWRDWN DO AGAIN, IF NOT 33 SECONDS CLR PORTB SET D/A PORT FOR NO OUTPUT BSET 4,PORTA TURN OFF AMPLIFIER CLR CALFLG TURN CALIBRATION MODE OFF STOP ENTER LOW POWER MODE AND WAIT FOR IRQ PWRUP SEI DISABLE INTERRUPTS BCLR 4,PORTA TURN ON AMPLIFIER BSET 3,DDRA TURN ON PULL-UP VOLTAGE BSET 3,PORTA LDA #$FF WAIT FOR VOLTAGE TO STABILIZE AGAIN1 DECA BNE AGAIN1 * GET AND DEBOUNCE SWITCH INPUTS DBNCE LDA PORTA GET INPUTS FROM SWITCH PORT COMA TAKE THE COMPLEMENT FOR EASIER PROCESSING AND #$E7 MASK ALL BUT THE SWITCH INPUTS BEQ DBNCE2 NO PRESS, CHECK NEXT SWITCH PORT STA PRESS OTHERWISE, STORE VALUE IN REGISTER JSR WAIT WAIT FOR DEBOUNCE TIME LDA PORTA GET SWITCH VALUE AGAIN COMA TAKE THE COMPLEMENT FOR EASIER PROCESSING AND #$E7 MASK ALL BUT THE SWITCH INPUTS CMP PRESS SEE IF VALUE IS THE SAME AFTER DEBOUNCE BNE DBNCE IF NOT, TRY AGAIN UNTIL NONE PRESSED BCLR 3,DDRA IF GOOD PRESS, SHUT OFF PULL-UP VOLTAGE CLI RE-ENABLE INTERRUPTS BRA DECODE GO TO KEY DECODE DBNCE2 LDA PORTC GET INPUTS FROM SWITCH PORT COMA TAKE THE COMPLEMENT FOR EASIER PROCESSING AND #$FE MASK ALL BUT THE SWITCH INPUTS BEQ MAIN NO PRESS, START OVER STA PRESS OTHERWISE, STORE VALUE IN REGISTER JSR WAIT WAIT FOR DEBOUNCE TIME LDA PORTC GET SWITCH VALUE AGAIN COMA TAKE THE COMPLEMENT FOR EASIER PROCESSING AND #$FE MASK ALL BUT THE SWITCH INPUTS CMP PRESS SEE IF VALUE IS THE SAME AFTER DEBOUNCE BNE DBNCE2 IF NOT, TRY AGAIN UNTIL NONE PRESSED BCLR 3,DDRA IF GOOD PRESS, SHUT OFF PULL-UP VOLTAGE CLI RE-ENABLE INTERRUPTS JMP NEXT10 JUMP TO KEY DECODE FOR PORTC * DECODE BUTTON 2600 DECODE CMP #SEIZE SEE IF THE 2600 BUTTON IS PRESSED BNE NEXT01 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL08 CONTINUE IF NOT CAL MODE JSR NICK PLAY NICKEL TONE BRA SKIP01 NCAL08 LDA MODE GET MF/DTMF MODE BNE SKIP01 DO NOTHING IF IN DTMF MODE JSR BEEP PLAY 2600 SKIP01 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON KEY PULSE 1 NEXT01 CMP #KEYP SEE IF THE TWO BUTTON IS PRESSED BNE NEXT02 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL09 CONTINUE IF NOT CAL MODE JSR DIME PLAY DIME TONE BRA SKIP03 NCAL09 LDA MODE CHECK MF/DTMF MODE BEQ SKIP02 JSR STAR PLAY DTMF * if DTMF MODE BRA SKIP03 BRANCH AROUND MF IF DTMF MODE SKIP02 JSR KP1 PLAY MF KP1 SKIP03 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON START NEXT02 CMP #STRT SEE IF THE START BUTTON IS PRESSED BNE NEXT03 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL10 CONTINUE IF NOT CAL MODE JSR QUART PLAY QUARTER TONE BRA SKIP05 NCAL10 LDA MODE CHECK MF/DTMF MODE BEQ SKIP04 JSR POUND PLAY DTMF # if DTMF MODE BRA SKIP05 BRANCH AROUND MF IF DTMF MODE SKIP04 JSR ST PLAY MF ST SKIP05 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON MF1 NEXT03 CMP #MF1 SEE IF THE PORTA 0 BUTTON IS PRESSED BNE NEXT04 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL01 CONTINUE IF NOT CAL MODE JSR T0700 PLAY 700 CAL TONE BRA SKIP07 NCAL01 LDA MODE CHECK MF/DTMF MODE BEQ SKIP06 JSR DIONE PLAY DTMF 1 if DTMF MODE BRA SKIP07 BRANCH AROUND MF IF DTMF MODE SKIP06 JSR MFONE PLAY MF ONE SKIP07 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON MF2 NEXT04 CMP #MF2 SEE IF THE PORT A 1 BUTTON IS PRESSED BNE NEXT05 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL02 CONTINUE IF NOT CAL MODE JSR T0900 PLAY 900 CAL TONE BRA SKIP09 NCAL02 LDA MODE CHECK MF/DTMF MODE BEQ SKIP08 JSR DITWO PLAY DTMF 2 if DTMF MODE BRA SKIP09 BRANCH AROUND MF IF DTMF MODE SKIP08 JSR MFTWO PLAY MF TWO SKIP09 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON MF3 NEXT05 CMP #MF3 SEE IF THE PORT A 2 BUTTON IS PRESSED BNE NEXT06 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL03 CONTINUE IF NOT CAL MODE JSR T1100 PLAY 1100 CAL TONE BRA SKIP11 NCAL03 LDA MODE CHECK MF/DTMF MODE BEQ SKIP10 JSR DITHREE PLAY DTMF 3 if DTMF MODE BRA SKIP11 BRANCH AROUND MF IF DTMF MODE SKIP10 JSR MFTHREE PLAY MF THREE SKIP11 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON DTMF A NEXT06 CMP #AA SEE IF THE PORT A 1 AND 3 BUTTON IS PRESSED BNE NEXT07 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION MODE FLAG BNE SKIP12 DO NOTHING IF IN CALIBRATION MODE LDA MODE CHECK MF/DTMF MODE BEQ SKIP12 JSR AAA PLAY DTMF A IF DTMF MODE SKIP12 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON DTMF D NEXT07 CMP #DD SEE IF THE PORT A KP AND ST BUTTON IS PRESSED BNE NEXT08 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION MODE FLAG BNE SKIP99 DO NOTHING IF IN CALIBRATION MODE LDA MODE CHECK MF/DTMF MODE BEQ SKIP99 JSR DDD PLAY DTMF D if DTMF MODE SKIP99 JMP MAIN POWER DOWN AND WAIT FOR NEXT *DECODE BUTTON FOR DIALTONE NEXT08 CMP #DIAL SEE IF THE PORT A 1 AND 2 BUTTON IS PRESSED BNE NEXT09 IF NOT, TRY THE NEXT JSR DIALTN PLAY DIAL TONE JMP MAIN POWER DOWN AND WAIT FOR NEXT *DECODE BUTTON FOR RINGBACK NEXT09 CMP #RING SEE IF THE PORT A 2 BUTTON IS PRESSED BNE NEXT99 IF NOT, TRY THE NEXT JSR RINGBK PLAY RINGBACK JMP MAIN POWER DOWN AND WAIT FOR NEXT NEXT99 JMP MAIN INVALID KEY PRESS, POWER DOWN AND WAIT FOR NEXT *END OF DECODE SCAN FOR PORTA * DECODE BUTTON MF4 NEXT10 CMP #MF4 SEE IF THE PORTC BIT1 BUTTON IS PRESSED BNE NEXT11 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL04 CONTINUE IF NOT CAL MODE JSR T1300 PLAY 1300 CAL TONE BRA SKIP14 NCAL04 LDA MODE CHECK MF/DTMF MODE BEQ SKIP13 JSR DIFOUR PLAY DTMF 4 if DTMF MODE BRA SKIP14 BRANCH AROUND MF IF DTMF MODE SKIP13 JSR MFFOUR PLAY MF FOUR SKIP14 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON MF5 NEXT11 CMP #MF5 SEE IF THE PORTC BIT2 BUTTON IS PRESSED BNE NEXT12 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL05 CONTINUE IF NOT CAL MODE JSR T1500 PLAY 1500 CAL TONE BRA SKIP16 NCAL05 LDA MODE CHECK MF/DTMF MODE BEQ SKIP15 JSR DIFIVE PLAY DTMF 5 if DTMF MODE BRA SKIP16 BRANCH AROUND MF IF DTMF MODE SKIP15 JSR MFFIVE PLAY MF FIVE SKIP16 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON MF6 NEXT12 CMP #MF6 SEE IF THE PORTC BIT3 BUTTON IS PRESSED BNE NEXT13 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL06 CONTINUE IF NOT CAL MODE JSR T1700 PLAY 1700 CAL TONE BRA SKIP18 NCAL06 LDA MODE CHECK MF/DTMF MODE BEQ SKIP17 JSR DISIX PLAY DTMF 6 if DTMF MODE BRA SKIP18 BRANCH AROUND MF IF DTMF MODE SKIP17 JSR MFSIX PLAY MF SIX SKIP18 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON MF7 NEXT13 CMP #MF7 SEE IF THE PORTC BIT4 BUTTON IS PRESSED BNE NEXT14 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION MODE FLAG BNE SKIP20 DO NOTHING IF IN CALIBRATION MODE LDA MODE CHECK MF/DTMF MODE BEQ SKIP19 JSR DISEVEN PLAY DTMF 7 if DTMF MODE BRA SKIP20 BRANCH AROUND MF IF DTMF MODE SKIP19 JSR MFSEVEN PLAY MF SEVEN SKIP20 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON MF8 NEXT14 CMP #MF8 SEE IF THE PORTC BIT5 BUTTON IS PRESSED BNE NEXT15 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION MODE FLAG BNE SKIP22 DO NOTHING IF IN CALIBRATION MODE LDA MODE CHECK MF/DTMF MODE BEQ SKIP21 JSR DIEIGHT PLAY DTMF 8 if DTMF MODE BRA SKIP22 BRANCH AROUND MF IF DTMF MODE SKIP21 JSR MFEIGHT PLAY MF EIGHT SKIP22 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON MF9 NEXT15 CMP #MF9 SEE IF THE PORTC BIT6 BUTTON IS PRESSED BNE NEXT16 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION MODE FLAG BNE SKIP24 DO NOTHING IF IN CALIBRATION MODE LDA MODE CHECK MF/DTMF MODE BEQ SKIP23 JSR DININE PLAY DTMF 9 if DTMF MODE BRA SKIP24 BRANCH AROUND MF IF DTMF MODE SKIP23 JSR MFNINE PLAY MF NINE SKIP24 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON MF0 NEXT16 CMP #MF0 SEE IF THE PORTC BIT7 BUTTON IS PRESSED BNE NEXT17 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION FLAG BEQ NCAL07 CONTINUE IF NOT CAL MODE JSR T1004 PLAY 1004 CAL TONE BRA SKIP26 NCAL07 LDA MODE CHECK MF/DTMF MODE BEQ SKIP25 JSR DIZERO PLAY DTMF 0 if DTMF MODE BRA SKIP26 BRANCH AROUND MF IF DTMF MODE SKIP25 JSR MFZERO PLAY MF ZERO SKIP26 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON BUSY NEXT17 CMP #BUSY SEE IF THE BUTTONS 4 AND 5 ARE PRESSED BNE NEXT18 IF NOT, TRY THE NEXT JSR BUSYTN PLAY BUSY SIGNAL JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON REORDER NEXT18 CMP #REORD SEE IF THE BUTTONS 5 AND 6 ARE PRESSED BNE NEXT19 IF NOT, TRY THE NEXT JSR REORDTN PLAY REORDER JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON DTMF B NEXT19 CMP #BB SEE IF THE PORT A KP AND ST BUTTON IS PRESSED BNE NEXT20 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION MODE FLAG BNE SKIP27 DO NOTHING IF IN CALIBRATION MODE LDA MODE CHECK MF/DTMF MODE BEQ SKIP27 JSR BBB PLAY DTMF B if DTMF MODE SKIP27 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON DTMF C NEXT20 CMP #CC SEE IF THE PORT A KP AND ST BUTTON IS PRESSED BNE NEXT21 IF NOT, TRY THE NEXT LDA CALFLG GET CALIBRATION MODE FLAG BNE SKIP28 DO NOTHING IF IN CALIBRATION MODE LDA MODE CHECK MF/DTMF MODE BEQ SKIP28 JSR CCC PLAY DTMF C if DTMF MODE SKIP28 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON FOR MF/DTMF TOGGLE NEXT21 CMP #DTMF SEE IF THE BUTTONS 5 AND 6 ARE PRESSED BNE NEXT22 IF NOT, TRY THE NEXT JSR TOGGLE TOGGLE MF/DTMF MODE JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON FOR MF BURST MODE NEXT22 CMP #BRST SEE IF THE BUTTONS 7 AND 8 ARE PRESSED BNE NEXT23 IF NOT, TRY THE NEXT JSR BURST TOGGLE MF BURST MODE JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON FOR CALIBRATION MODE NEXT23 CMP #CAL SEE IF THE BUTTONS 8 AND 9 ARE PRESSED BNE NEXT24 IF NOT, TRY THE NEXT JSR CALIB TOGGLE CALIBRATION MODE JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON SIT1 NEXT24 CMP #SITIN SEE IF THE BUTTONS 4 AND 7 ARE PRESSED BNE NEXT25 IF NOT, TRY THE NEXT JSR SIT1 PLAY SIT1 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON SIT2 NEXT25 CMP #SITNC SEE IF THE BUTTONS 5 AND 8 ARE PRESSED BNE NEXT26 IF NOT, TRY THE NEXT JSR SIT2 PLAY SIT2 JMP MAIN POWER DOWN AND WAIT FOR NEXT * DECODE BUTTON SIT3 NEXT26 CMP #SITRO SEE IF THE BUTTONS 6 AND 9 ARE PRESSED BNE NEXT27 IF NOT, TRY THE NEXT JSR SIT3 PLAY SIT3 JMP MAIN POWER DOWN AND WAIT FOR NEXT NEXT27 JMP MAIN INVALID KEY PRESS, POWER DOWN AND WAIT FOR NEXT * SUBROUTINE TO PLAY A TONE OF SPECIFIED FREQUENCIES AND DURATION PLAY EQU * JSR CLRTON CLEAR TONE COUNTERS JSR SETTIM SET UP TIMER FOR SAMPLING AT 12 KHZ BSET 6,TCR ENABLE TIMER INTERRUPTS JSR CHKCNT SEE IF CORRECT NUMBER OF SAMPLES TIMED BCLR 6,TCR DISABLE INTERRUPTS WHEN COUNT COMPLETE RTS * SUBROUTINE TO PLAY A TONE OF SPECIFIED FREQUENCIES AND DURATION + SILENCE PLAY2 EQU * JSR CLRTON CLEAR TONE COUNTERS JSR SETTIM SET UP TIMER FOR SAMPLING AT 12 KHZ BSET 6,TCR ENABLE TIMER INTERRUPTS JSR CHKCNT SEE IF CORRECT NUMBER OF SAMPLES TIMED BCLR 6,TCR DISABLE INTERRUPTS WHEN COUNT COMPLETE JSR CLRTON CLEAR TONE COUNTERS JSR NOTONE SET FOR SILENCE JSR SETTIM SET UP TIMER FOR SAMPLING AT 12 KHZ BSET 6,TCR ENABLE TIMER INTERRUPTS JSR CHKCNT SEE IF CORRECT NUMBER OF SAMPLES TIMED BCLR 6,TCR DISABLE INTERRUPTS WHEN COUNT COMPLETE RTS * SUBROUTINE TO PLAY A TONE OF SPECIFIED FREQUENCIES WHILE BUTTON DOWN PLAY3 EQU * JSR CLRTON CLEAR TONE COUNTERS JSR SETTIM SET UP TIMER FOR SAMPLING AT 12 KHZ BSET 6,TCR ENABLE TIMER INTERRUPTS HOLD2 BIL HOLD2 PLAY WHILE BUTTON IS DOWN BCLR 6,TCR DISABLE INTERRUPTS WHEN COUNT COMPLETE RTS *TIMER INTERRUPT SERVICE ROUIINE *SET UP TIMER FOR NEXT SAMPLING PERIOD TIMISR EQU * LDA TSR CLEAR OUTPUT COMPARE FLAG LDA ACHR GET HIGH BYTE OF CURRENT TIMER COUNT STA TIMHI SAVE IT LDA ACLR GET LOW BYTE OF CURRENT TIMER COUNT ADD #SAMCNT ADD OFFSET FOR 12KHZ SAMPLING RATE STA TIMLO SAVE IT CLRA ADC TIMHI ADD CARRY BIT TO HIGH COUNT STA OCHR STORE HIGH BYTE OF COMPARE REG LDA TIMLO GET LOW TIMER VALUE STA OCLR FINISH OUTPUT COMPARE WRITE *DON'T MESS WITH ANYTHING IN THE ISR ABOVE THIS LINE! LDA INC1LO GET LO INCREMENT FOR TONE 1 ADD PTR1LO ADD IT TO THE LO TONE 1 COUNTER STA PTR1LO SAVE IT BACK LDA INC1HI GET HI INCREMENT FOR TONE 1 ADC PTR1HI ADD IT TO THE HI TONE 1 COUNTER STA PTR1HI SAVE IT BACK LDA INC2LO GET LO INCREMENT FOR TONE 2 ADD PTR2LO ADD IT TO THE LO TONE 2 COUNTER STA PTR2LO SAVE IT BACK LDA INC2HI GET HI INCREMENT FOR TONE 2 ADC PTR2HI ADD IT TO THE HI TONE 2 COUNTER STA PTR2HI SAVE IT BACK LDX PTR1HI GET THE TONE 1 TABLE INDEX LDA SINTBL,X GET TONE 1 TABLE VALUE STA TEMP SAVE IT LDX PTR2HI GET THE TONE 2 TABLE INDEX LDA SINTBL,X GET TONE 2 TABLE VALUE ADD TEMP SUM THE VALUES RORA DIVIDE BY TWO FOR THE MEAN VALUE STA PORTB SEND IT TO THE D/A PORT INC SAMPLO INCREMENT THE SAMPLE COUNTER BNE NEXT RETURN, IF NOT GREATER THAN FF INC SAMPHI IF ROLLED OVER, INC HI BYTE NEXT RTI *SEE IF CORRECT NUMBER OF SAMPLES COUNTED FOR TONE BURST CHKCNT EQU * LDA SAMPHI GET HI BYTE OF SAMPLING COUNT CMP CTHI CHECK WITH HI BYTE OF LIMIT BLO CHKCNT DO AGAIN IF NO MATCH CHKLO LDA SAMPLO GET LO BYTE OF SAMPLING COUNT CMP CTLO CHECK WITH LO BYTE OF LIMIT BLO CHKLO DO AGAIN IF NO MATCH RTS RETURN WHEN CYCLE COUNTS MATCH *SET UP TIMER FOR NEXT SAMPLING PERIOD SETTIM EQU * LDA TSR CLEAR OUTPUT COMPARE FLAG LDA ACHR GET HIGH BYTE OF CURRENT TIMER COUNT STA TIMHI SAVE IT LDA ACLR GET LOW BYTE OF CURRENT TIMER COUNT ADD #SAMCNT ADD OFFSET FOR 12KHZ SAMPLING RATE STA TIMLO SAVE IT CLRA ADC TIMHI ADD CARRY BIT TO HIGH COUNT STA OCHR STORE HIGH BYTE OF COMPARE REG LDA TIMLO GET LOW TIMER VALUE STA OCLR FINISH OUTPUT COMPARE WRITE RTS * CLEAR TONE GENERATION REGISTERS CLRTON EQU * CLR PTR1LO CLEAR TONE 1 POINTER CLR PTR1HI CLR PTR2LO CLEAR TONE 2 POINTER CLR PTR2HI CLR SAMPLO CLEAR SAMPLING COUNTER CLR SAMPHI RTS NOTONE EQU * CLR INC1LO CLR INC1HI CLR INC2LO CLR INC2HI RTS SWITCH EQU * IRQ ISR FOR SWITCH PRESS DETECT RTI JUST RESTORE THE STACK AND CONTINUE WAIT EQU * 37 MS DELAY FOR SWITCH DEBOUNCE LDA #$63 SET OUTER LOOP VALUE STA TEMP1 LOOP1 LDA #$FF SET INNER LOOP VALUE LOOP DECA DECREMENT BNE LOOP LOOP TO ZERO DEC TEMP1 DECREMENT OUTER LOOP BNE LOOP1 LOOP TO ZERO RTS TOGGLE EQU * SUBROUTINE TO TOGGLE BETWEEN MF and DTMF MODES LDA MODE GET CURRENT MODE BEQ TODTMF SET TO DTMF IF MF MODE CLR MODE SET TO MF IF DTMF MODE JSR HILO BEEP TO INDICATE MODE CHANGE RTS TODTMF LDA #$01 SET TO DTMF MODE STA MODE JSR LOHI BEEP TO INDICATE MODE CHANGE RTS BURST EQU * ROUTINE TO TOGGLE MF BURST MODE LDA BSTFLG GET CURRENT MODE BEQ TOCONT SET TO CONTINUOUS IF BURST MODE CLR BSTFLG SET TO BURST IF CONTINUOUS MODE JSR HILO BEEP TO INDICATE MODE CHANGE RTS TOCONT LDA #$01 SET TO CONTINUOUS MODE STA BSTFLG JSR LOHI BEEP TO INDICATE MODE CHANGE RTS CALIB EQU * ROUTINE TO TOGGLE CALIBRATION MODE LDA CALFLG GET CURRENT MODE BEQ TOCAL SET TO CALIBRATE MODE IF NOT CLR CALFLG SET TO MF IF DTMF MODE JSR HILO BEEP TO INDICATE MODE CHANGE RTS TOCAL LDA #$01 SET TO CALIBRATE MODE STA CALFLG JSR LOHI BEEP TO INDICATE MODE CHANGE RTS MF EQU * ROUTINE TO PLAY MF DIGIT AT 75 MS DURATION LDA #$7E STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$03 OF 75 MS (VALID RANGE IS 58 TO 75 MS): STA CTHI COUNT = TIME / 83.933 MICROSECS LDA BSTFLG GET MF BURST MODE FLAG BEQ PLAYBST PLAY BURST IF IN BURST MODE JSR PLAY3 IF IN CONTINUOUS MODE, PLAY WHILE KEY DOWN RTS PLAYBST JSR PLAY PLAY IT RTS BLEEP EQU * ROUTINE TO PLAY TONE AT 75 MS DURATION LDA #$7E STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$03 OF 75 MS (VALID RANGE IS 58 TO 75 MS): STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT RTS MFONE LDA #$0A LOW BYTE FOR TONE 1, 700 HZ (5.5006 x f) STA INC1LO LDA #$0F HI BYTE FOR TONE 1 STA INC1HI LDA #$57 LOW BYTE FOR TONE 2, 900 HZ (5.5006 x f) STA INC2LO LDA #$13 HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS MFTWO LDA #$0A LOW BYTE FOR TONE 1, 700 HZ (5.5006 x f) STA INC1LO LDA #$0F HI BYTE FOR TONE 1 STA INC1HI LDA #$A3 LOW BYTE FOR TONE 2, 1100 HZ (5.5006 x f) STA INC2LO LDA #$17 HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS MFTHREE LDA #$57 LOW BYTE FOR TONE 1, 900 HZ (5.5006 x f) STA INC1LO LDA #$13 HI BYTE FOR TONE 1 STA INC1HI LDA #$A3 LOW BYTE FOR TONE 2, 1100 HZ (5.5006 x f) STA INC2LO LDA #$17 HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS MFFOUR LDA #$0A LOW BYTE FOR TONE 1, 700 HZ (5.5006 x f) STA INC1LO LDA #$0F HI BYTE FOR TONE 1 STA INC1HI LDA #$EF LOW BYTE FOR TONE 2, 1300 HZ (5.5006 x f) STA INC2LO LDA #$1B HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS MFFIVE LDA #$57 LOW BYTE FOR TONE 1, 900 HZ (5.5006 x f) STA INC1LO LDA #$13 HI BYTE FOR TONE 1 STA INC1HI LDA #$EF LOW BYTE FOR TONE 2, 1300 HZ (5.5006 x f) STA INC2LO LDA #$1B HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS MFSIX LDA #$A3 LOW BYTE FOR TONE 1, 1100 HZ (5.5006 x f) STA INC1LO LDA #$17 HI BYTE FOR TONE 1 STA INC1HI LDA #$EF LOW BYTE FOR TONE 2, 1300 HZ (5.5006 x f) STA INC2LO LDA #$1B HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS MFSEVEN LDA #$0A LOW BYTE FOR TONE 1, 700 HZ (5.5006 x f) STA INC1LO LDA #$0F HI BYTE FOR TONE 1 STA INC1HI LDA #$3B LOW BYTE FOR TONE 2, 1500 HZ (5.5006 x f) STA INC2LO LDA #$20 HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS MFEIGHT LDA #$57 LOW BYTE FOR TONE 1, 900 HZ (5.5006 x f) STA INC1LO LDA #$13 HI BYTE FOR TONE 1 STA INC1HI LDA #$3B LOW BYTE FOR TONE 2, 1500 HZ (5.5006 x f) STA INC2LO LDA #$20 HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS MFNINE LDA #$A3 LOW BYTE FOR TONE 1, 1100 HZ (5.5006 x f) STA INC1LO LDA #$17 HI BYTE FOR TONE 1 STA INC1HI LDA #$3B LOW BYTE FOR TONE 2, 1500 HZ (5.5006 x f) STA INC2LO LDA #$20 HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS KP1 LDA #$A3 LOW BYTE FOR TONE 1, 1100 HZ (5.5006 x f) STA INC1LO LDA #$17 HI BYTE FOR TONE 1 STA INC1HI LDA #$87 LOW BYTE FOR TONE 2, 1700 HZ (5.5006 x f) STA INC2LO LDA #$24 HI BYTE FOR TONE 2 STA INC2HI LDA #$96 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$05 OF 120 MS (VALID KP RANGE IS 90 TO 120 MS) STA CTHI COUNT = TIME / 83.933 MICROSECS LDA BSTFLG GET MF BURST MODE FLAG BEQ BST PLAY BURST IF IN BURST MODE JSR PLAY3 IF IN CONTINUOUS MODE, PLAY WHILE KEY DOWN RTS BST JSR PLAY PLAY IT RTS MFZERO LDA #$EF LOW BYTE FOR TONE 1, 1300 HZ (5.5006 x f) STA INC1LO LDA #$1B HI BYTE FOR TONE 1 STA INC1HI LDA #$3B LOW BYTE FOR TONE 2, 1500 HZ (5.5006 x f) STA INC2LO LDA #$20 HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS ST LDA #$3B LOW BYTE FOR TONE 1, 1500 HZ (5.5006 x f) STA INC1LO LDA #$20 HI BYTE FOR TONE 1 STA INC1HI LDA #$87 LOW BYTE FOR TONE 2, 1700 HZ (5.5006 x f) STA INC2LO LDA #$24 HI BYTE FOR TONE 2 STA INC2HI JSR MF RTS * 2600 BEEP ROUTINE BEEP EQU * BEEP ROUTINE, 2600 HZ LDA #$DE LOW BYTE FOR TONE 1, 2600 HZ (5.5006 x f) STA INC1LO LDA #$37 HI BYTE FOR TONE 1 STA INC1HI LDA #$DE LOW BYTE FOR TONE 2, 2600 HZ (5.5006 x f) STA INC2LO LDA #$37 HI BYTE FOR TONE 2 STA INC2HI LDA #$8A STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION (NOT USED) LDA #$2E OF 1000 MS: STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY3 PLAY IT WHILE BUTTON DOWN RTS * DIALTONE ROUTINE DIALTN LDA #$85 LOW BYTE FOR TONE 1, 350 HZ (5.5006 x f) STA INC1LO LDA #$07 HI BYTE FOR TONE 1 STA INC1HI LDA #$74 LOW BYTE FOR TONE 2, 440 HZ (5.5006 x f) STA INC2LO LDA #$09 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS * RING TONE ROUTINE RINGBK LDA #$74 LOW BYTE FOR TONE 1, 440 HZ (5.5006 x f) STA INC1LO LDA #$09 HI BYTE FOR TONE 1 STA INC1HI LDA #$50 LOW BYTE FOR TONE 2, 480 HZ (5.5006 x f) STA INC2LO LDA #$0A HI BYTE FOR TONE 2 STA INC2HI LDA #$15 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$5D OF 2000 MS: STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT JSR NOTONE SET FOR SILENCE LDA #$29 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$BA OF 4000 MS: STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT BIL RINGBK REPEAT UNTIL KEY RELEASED RTS * BUSY TONE ROUTINE BUSYTN LDA #$50 LOW BYTE FOR TONE 1, 480 HZ (5.5006 x f) STA INC1LO LDA #$0A HI BYTE FOR TONE 1 STA INC1HI LDA #$52 LOW BYTE FOR TONE 2, 620 HZ (5.5006 x f) STA INC2LO LDA #$0D HI BYTE FOR TONE 2 STA INC2HI LDA #$45 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$17 OF 500 MS: STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY2 BIL BUSYTN REPEAT UNTIL KEY RELEASED RTS * REORDER TONE ROUTINE REORDTN LDA #$50 LOW BYTE FOR TONE 1, 480 HZ (5.5006 x f) STA INC1LO LDA #$0A HI BYTE FOR TONE 1 STA INC1HI LDA #$52 LOW BYTE FOR TONE 2, 620 HZ (5.5006 x f) STA INC2LO LDA #$0D HI BYTE FOR TONE 2 STA INC2HI LDA #$A3 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$0B OF 250 MS: STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY2 BIL REORDTN REPEAT UNTIL KEY RELEASED RTS DIONE LDA #$FA LOW BYTE FOR TONE 1, 697 HZ (5.5006 x f) STA INC1LO LDA #$0E HI BYTE FOR TONE 1 STA INC1HI LDA #$FA LOW BYTE FOR TONE 2, 1209 HZ (5.5006 x f) STA INC2LO LDA #$19 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DITWO LDA #$FA LOW BYTE FOR TONE 1, 697 HZ (5.5006 x f) STA INC1LO LDA #$0E HI BYTE FOR TONE 1 STA INC1HI LDA #$B5 LOW BYTE FOR TONE 2, 1336 HZ (5.5006 x f) STA INC2LO LDA #$1C HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DITHREE LDA #$FA LOW BYTE FOR TONE 1, 697 HZ (5.5006 x f) STA INC1LO LDA #$0E HI BYTE FOR TONE 1 STA INC1HI LDA #$BC LOW BYTE FOR TONE 2, 1477 HZ (5.5006 x f) STA INC2LO LDA #$1F HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS AAA LDA #$FA LOW BYTE FOR TONE 1, 697 HZ (5.5006 x f) STA INC1LO LDA #$0E HI BYTE FOR TONE 1 STA INC1HI LDA #$16 LOW BYTE FOR TONE 2, 1633 HZ (5.5006 x f) STA INC2LO LDA #$23 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DIFOUR LDA #$8B LOW BYTE FOR TONE 1, 770 HZ (5.5006 x f) STA INC1LO LDA #$10 HI BYTE FOR TONE 1 STA INC1HI LDA #$FA LOW BYTE FOR TONE 2, 1209 HZ (5.5006 x f) STA INC2LO LDA #$19 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DIFIVE LDA #$8B LOW BYTE FOR TONE 1, 770 HZ (5.5006 x f) STA INC1LO LDA #$10 HI BYTE FOR TONE 1 STA INC1HI LDA #$B5 LOW BYTE FOR TONE 2, 1336 HZ (5.5006 x f) STA INC2LO LDA #$1C HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DISIX LDA #$8B LOW BYTE FOR TONE 1, 770 HZ (5.5006 x f) STA INC1LO LDA #$10 HI BYTE FOR TONE 1 STA INC1HI LDA #$BC LOW BYTE FOR TONE 2, 1477 HZ (5.5006 x f) STA INC2LO LDA #$1F HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS BBB LDA #$8B LOW BYTE FOR TONE 1, 770 HZ (5.5006 x f) STA INC1LO LDA #$10 HI BYTE FOR TONE 1 STA INC1HI LDA #$16 LOW BYTE FOR TONE 2, 1633 HZ (5.5006 x f) STA INC2LO LDA #$23 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DISEVEN LDA #$4F LOW BYTE FOR TONE 1, 852 HZ (5.5006 x f) STA INC1LO LDA #$12 HI BYTE FOR TONE 1 STA INC1HI LDA #$FA LOW BYTE FOR TONE 2, 1209 HZ (5.5006 x f) STA INC2LO LDA #$19 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DIEIGHT LDA #$4F LOW BYTE FOR TONE 1, 852 HZ (5.5006 x f) STA INC1LO LDA #$12 HI BYTE FOR TONE 1 STA INC1HI LDA #$B5 LOW BYTE FOR TONE 2, 1336 HZ (5.5006 x f) STA INC2LO LDA #$1C HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DININE LDA #$4F LOW BYTE FOR TONE 1, 852 HZ (5.5006 x f) STA INC1LO LDA #$12 HI BYTE FOR TONE 1 STA INC1HI LDA #$BC LOW BYTE FOR TONE 2, 1477 HZ (5.5006 x f) STA INC2LO LDA #$1F HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS CCC LDA #$4F LOW BYTE FOR TONE 1, 852 HZ (5.5006 x f) STA INC1LO LDA #$12 HI BYTE FOR TONE 1 STA INC1HI LDA #$16 LOW BYTE FOR TONE 2, 1633 HZ (5.5006 x f) STA INC2LO LDA #$23 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS STAR LDA #$38 LOW BYTE FOR TONE 1, 941 HZ (5.5006 x f) STA INC1LO LDA #$14 HI BYTE FOR TONE 1 STA INC1HI LDA #$FA LOW BYTE FOR TONE 2, 1209 HZ (5.5006 x f) STA INC2LO LDA #$19 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DIZERO LDA #$38 LOW BYTE FOR TONE 1, 941 HZ (5.5006 x f) STA INC1LO LDA #$14 HI BYTE FOR TONE 1 STA INC1HI LDA #$B5 LOW BYTE FOR TONE 2, 1336 HZ (5.5006 x f) STA INC2LO LDA #$1C HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS POUND LDA #$38 LOW BYTE FOR TONE 1, 941 HZ (5.5006 x f) STA INC1LO LDA #$14 HI BYTE FOR TONE 1 STA INC1HI LDA #$BC LOW BYTE FOR TONE 2, 1477 HZ (5.5006 x f) STA INC2LO LDA #$1F HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS DDD LDA #$38 LOW BYTE FOR TONE 1, 941 HZ (5.5006 x f) STA INC1LO LDA #$14 HI BYTE FOR TONE 1 STA INC1HI LDA #$16 LOW BYTE FOR TONE 2, 1633 HZ (5.5006 x f) STA INC2LO LDA #$23 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS LOHI LDA #$EF LOW BYTE FOR TONE 1, 1300 HZ (5.5006 x f) STA INC1LO LDA #$1B HI BYTE FOR TONE 1 STA INC1HI LDA #$EF LOW BYTE FOR TONE 2, 1300 HZ (5.5006 x f) STA INC2LO LDA #$1B HI BYTE FOR TONE 2 STA INC2HI JSR BLEEP LDA #$87 LOW BYTE FOR TONE 1, 1700 HZ (5.5006 x f) STA INC1LO LDA #$24 HI BYTE FOR TONE 1 STA INC1HI LDA #$87 LOW BYTE FOR TONE 2, 1700 HZ (5.5006 x f) STA INC2LO LDA #$24 HI BYTE FOR TONE 2 STA INC2HI JSR BLEEP RTS HILO LDA #$87 LOW BYTE FOR TONE 1, 1700 HZ (5.5006 x f) STA INC1LO LDA #$24 HI BYTE FOR TONE 1 STA INC1HI LDA #$87 LOW BYTE FOR TONE 2, 1700 HZ (5.5006 x f) STA INC2LO LDA #$24 HI BYTE FOR TONE 2 STA INC2HI JSR BLEEP LDA #$EF LOW BYTE FOR TONE 1, 1300 HZ (5.5006 x f) STA INC1LO LDA #$1B HI BYTE FOR TONE 1 STA INC1HI LDA #$EF LOW BYTE FOR TONE 2, 1300 HZ (5.5006 x f) STA INC2LO LDA #$1B HI BYTE FOR TONE 2 STA INC2HI JSR BLEEP RTS T0700 LDA #$0A LOW BYTE FOR TONE 1, 700 HZ (5.5006 x f) STA INC1LO LDA #$0F HI BYTE FOR TONE 1 STA INC1HI LDA #$0A LOW BYTE FOR TONE 2, 700 HZ (5.5006 x f) STA INC2LO LDA #$0F HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS T0900 LDA #$57 LOW BYTE FOR TONE 1, 900 HZ (5.5006 x f) STA INC1LO LDA #$13 HI BYTE FOR TONE 1 STA INC1HI LDA #$57 LOW BYTE FOR TONE 2, 900 HZ (5.5006 x f) STA INC2LO LDA #$13 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS T1100 LDA #$A3 LOW BYTE FOR TONE 1, 1100 HZ (5.5006 x f) STA INC1LO LDA #$17 HI BYTE FOR TONE 1 STA INC1HI LDA #$A3 LOW BYTE FOR TONE 2, 1100 HZ (5.5006 x f) STA INC2LO LDA #$17 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS T1300 LDA #$EF LOW BYTE FOR TONE 1, 1300 HZ (5.5006 x f) STA INC1LO LDA #$1B HI BYTE FOR TONE 1 STA INC1HI LDA #$EF LOW BYTE FOR TONE 2, 1300 HZ (5.5006 x f) STA INC2LO LDA #$1B HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS T1500 LDA #$3B LOW BYTE FOR TONE 1, 1500 HZ (5.5006 x f) STA INC1LO LDA #$20 HI BYTE FOR TONE 1 STA INC1HI LDA #$3B LOW BYTE FOR TONE 2, 1500 HZ (5.5006 x f) STA INC2LO LDA #$20 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS T1700 LDA #$87 LOW BYTE FOR TONE 1, 1700 HZ (5.5006 x f) STA INC1LO LDA #$24 HI BYTE FOR TONE 1 STA INC1HI LDA #$87 LOW BYTE FOR TONE 2, 1700 HZ (5.5006 x f) STA INC2LO LDA #$24 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS T1004 LDA #$93 LOW BYTE FOR TONE 1, 1004 HZ (5.5006 x f) STA INC1LO LDA #$15 HI BYTE FOR TONE 1 STA INC1HI LDA #$93 LOW BYTE FOR TONE 2, 1004 HZ (5.5006 x f) STA INC2LO LDA #$15 HI BYTE FOR TONE 2 STA INC2HI JSR PLAY3 RTS NICK EQU * LDA #$87 LOW BYTE FOR TONE 1, 1700 HZ (5.5006 x f) STA INC1LO LDA #$24 HI BYTE FOR TONE 1 STA INC1HI LDA #$45 LOW BYTE FOR TONE 2, 2200 HZ (5.5006 x f) STA INC2LO LDA #$2F HI BYTE FOR TONE 2 STA INC2HI LDA #$06 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$03 OF 65 MS : STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY2 PLAY IT RTS DIME EQU * LDA #$02 SET UP BURST COUNTER STA BURCNT MORE1 LDA #$87 LOW BYTE FOR TONE 1, 1700 HZ (5.5006 x f) STA INC1LO LDA #$24 HI BYTE FOR TONE 1 STA INC1HI LDA #$45 LOW BYTE FOR TONE 2, 2200 HZ (5.5006 x f) STA INC2LO LDA #$2F HI BYTE FOR TONE 2 STA INC2HI LDA #$06 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$03 OF 65 MS : STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY2 PLAY IT DEC BURCNT PLAY AGAIN, IF NEEDED BNE MORE1 RTS QUART EQU * LDA #$05 SET UP BURST COUNTER STA BURCNT MORE2 LDA #$87 LOW BYTE FOR TONE 1, 1700 HZ (5.5006 x f) STA INC1LO LDA #$24 HI BYTE FOR TONE 1 STA INC1HI LDA #$45 LOW BYTE FOR TONE 2, 2200 HZ (5.5006 x f) STA INC2LO LDA #$2F HI BYTE FOR TONE 2 STA INC2HI LDA #$DD STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$01 OF 40 MS : STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY2 PLAY IT DEC BURCNT PLAY AGAIN, IF NEEDED BNE MORE2 RTS *ROUTINE TO PLAY INTERCEPT SIT TONES SIT1 LDA #$A2 LOW BYTE FOR TONE 1, 913.8 HZ (5.5006 x f) STA INC1LO LDA #$13 HI BYTE FOR TONE 1 STA INC1HI LDA #$A2 LOW BYTE FOR TONE 2, 913.8 HZ (5.5006 x f) STA INC2LO LDA #$13 HI BYTE FOR TONE 2 STA INC2HI LDA #$C1 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$0C OF 274 MS STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT LDA #$73 LOW BYTE FOR TONE 1, 1370.6 HZ (5.5006 x f) STA INC1LO LDA #$1D HI BYTE FOR TONE 1 STA INC1HI LDA #$73 LOW BYTE FOR TONE 2, 1370.6 HZ (5.5006 x f) STA INC2LO LDA #$1D HI BYTE FOR TONE 2 STA INC2HI LDA #$C1 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$0C OF 274 MS STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT LDA #$2D LOW BYTE FOR TONE 1, 1776.7 HZ (5.5006 x f) STA INC1LO LDA #$26 HI BYTE FOR TONE 1 STA INC1HI LDA #$2D LOW BYTE FOR TONE 2, 1776.7 HZ (5.5006 x f) STA INC2LO LDA #$26 HI BYTE FOR TONE 2 STA INC2HI LDA #$AF STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$11 OF 380 MS (VALID KP RANGE IS 90 TO 120 MS) STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT RTS *ROUTINE TO PLAY INTER-LATA NO CIRCUIT SIT TONES SIT2 LDA #$A2 LOW BYTE FOR TONE 1, 913.8 HZ (5.5006 x f) STA INC1LO LDA #$13 HI BYTE FOR TONE 1 STA INC1HI LDA #$A2 LOW BYTE FOR TONE 2, 913.8 HZ (5.5006 x f) STA INC2LO LDA #$13 HI BYTE FOR TONE 2 STA INC2HI LDA #$AF STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$11 OF 380 MS STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT LDA #$73 LOW BYTE FOR TONE 1, 1370.6 HZ (5.5006 x f) STA INC1LO LDA #$1D HI BYTE FOR TONE 1 STA INC1HI LDA #$73 LOW BYTE FOR TONE 2, 1370.6 HZ (5.5006 x f) STA INC2LO LDA #$1D HI BYTE FOR TONE 2 STA INC2HI LDA #$AF STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$11 OF 380 MS STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT LDA #$2D LOW BYTE FOR TONE 1, 1776.7 HZ (5.5006 x f) STA INC1LO LDA #$26 HI BYTE FOR TONE 1 STA INC1HI LDA #$2D LOW BYTE FOR TONE 2, 1776.7 HZ (5.5006 x f) STA INC2LO LDA #$26 HI BYTE FOR TONE 2 STA INC2HI LDA #$AF STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$11 OF 380 MS (VALID KP RANGE IS 90 TO 120 MS) STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT RTS *ROUTINE TO PLAY INTER-LATA REORDER SIT TONES SIT3 LDA #$2B LOW BYTE FOR TONE 1, 985.2 HZ (5.5006 x f) STA INC1LO LDA #$15 HI BYTE FOR TONE 1 STA INC1HI LDA #$2B LOW BYTE FOR TONE 2, 985.2 HZ (5.5006 x f) STA INC2LO LDA #$15 HI BYTE FOR TONE 2 STA INC2HI LDA #$C1 STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$0C OF 274 MS STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT LDA #$73 LOW BYTE FOR TONE 1, 1370.6 HZ (5.5006 x f) STA INC1LO LDA #$1D HI BYTE FOR TONE 1 STA INC1HI LDA #$73 LOW BYTE FOR TONE 2, 1370.6 HZ (5.5006 x f) STA INC2LO LDA #$1D HI BYTE FOR TONE 2 STA INC2HI LDA #$AF STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$11 OF 380 MS STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT LDA #$2D LOW BYTE FOR TONE 1, 1776.7 HZ (5.5006 x f) STA INC1LO LDA #$26 HI BYTE FOR TONE 1 STA INC1HI LDA #$2D LOW BYTE FOR TONE 2, 1776.7 HZ (5.5006 x f) STA INC2LO LDA #$26 HI BYTE FOR TONE 2 STA INC2HI LDA #$AF STA CTLO SAMPLE COUNT FOR REQUIRED TONE DURATION LDA #$11 OF 380 MS (VALID KP RANGE IS 90 TO 120 MS) STA CTHI COUNT = TIME / 83.933 MICROSECS JSR PLAY PLAY IT RTS * Sine wave table: 256 elements, beginning at 2.5 volts, to 5 volts to 0, then SINTBL EQU * FCB 128 FCB 131 FCB 134 FCB 137 FCB 140 FCB 144 FCB 147 FCB 150 FCB 153 FCB 156 FCB 159 FCB 162 FCB 165 FCB 168 FCB 171 FCB 174 FCB 177 FCB 179 FCB 182 FCB 185 FCB 188 FCB 191 FCB 193 FCB 196 FCB 199 FCB 201 FCB 204 FCB 206 FCB 209 FCB 211 FCB 213 FCB 216 FCB 218 FCB 220 FCB 222 FCB 224 FCB 226 FCB 228 FCB 230 FCB 232 FCB 234 FCB 235 FCB 237 FCB 239 FCB 240 FCB 241 FCB 243 FCB 244 FCB 245 FCB 246 FCB 248 FCB 249 FCB 250 FCB 250 FCB 251 FCB 252 FCB 253 FCB 253 FCB 254 FCB 254 FCB 254 FCB 255 FCB 255 FCB 255 FCB 255 FCB 255 FCB 255 FCB 255 FCB 254 FCB 254 FCB 254 FCB 253 FCB 253 FCB 252 FCB 251 FCB 250 FCB 250 FCB 249 FCB 248 FCB 246 FCB 245 FCB 244 FCB 243 FCB 241 FCB 240 FCB 239 FCB 237 FCB 235 FCB 234 FCB 232 FCB 230 FCB 228 FCB 226 FCB 224 FCB 222 FCB 220 FCB 218 FCB 216 FCB 213 FCB 211 FCB 209 FCB 206 FCB 204 FCB 201 FCB 199 FCB 196 FCB 193 FCB 191 FCB 188 FCB 185 FCB 182 FCB 179 FCB 177 FCB 174 FCB 171 FCB 168 FCB 165 FCB 162 FCB 159 FCB 156 FCB 153 FCB 150 FCB 147 FCB 144 FCB 140 FCB 137 FCB 134 FCB 131 FCB 128 FCB 125 FCB 122 FCB 119 FCB 116 FCB 112 FCB 109 FCB 106 FCB 103 FCB 100 FCB 97 FCB 94 FCB 91 FCB 88 FCB 85 FCB 82 FCB 79 FCB 77 FCB 74 FCB 71 FCB 68 FCB 65 FCB 63 FCB 60 FCB 57 FCB 55 FCB 52 FCB 50 FCB 47 FCB 45 FCB 43 FCB 40 FCB 38 FCB 36 FCB 34 FCB 32 FCB 30 FCB 28 FCB 26 FCB 24 FCB 22 FCB 21 FCB 19 FCB 17 FCB 16 FCB 15 FCB 13 FCB 12 FCB 11 FCB 10 FCB 8 FCB 7 FCB 6 FCB 6 FCB 5 FCB 4 FCB 3 FCB 3 FCB 2 FCB 2 FCB 2 FCB 1 FCB 1 FCB 1 FCB 1 FCB 1 FCB 1 FCB 1 FCB 2 FCB 2 FCB 2 FCB 3 FCB 3 FCB 4 FCB 5 FCB 6 FCB 6 FCB 7 FCB 8 FCB 10 FCB 11 FCB 12 FCB 13 FCB 15 FCB 16 FCB 17 FCB 19 FCB 21 FCB 22 FCB 24 FCB 26 FCB 28 FCB 30 FCB 32 FCB 34 FCB 36 FCB 38 FCB 40 FCB 43 FCB 45 FCB 47 FCB 50 FCB 52 FCB 55 FCB 57 FCB 60 FCB 63 FCB 65 FCB 68 FCB 71 FCB 74 FCB 77 FCB 79 FCB 82 FCB 85 FCB 88 FCB 91 FCB 94 FCB 97 FCB 100 FCB 103 FCB 106 FCB 109 FCB 112 FCB 116 FCB 119 FCB 122 FCB 125