[VoIP] MF tone generator
Donald Froula
dfroula at sbcglobal.net
Fri Jun 15 18:42:25 CDT 2007
It's written in assembly, I'm afraid. The timer
routines are very specific to the chip.
Not very elegant, but it works.
Don
==================================================
*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
* 5 SECOND POWER DOWN TIMER ROUTINE
LDA #$25 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 5 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 BEEP PLAY 2600
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 NICK PLAY NICKEL 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 HOP01
JSR AAA PLAY DTMF A IF DTMF MODE
BRA SKIP12 BRANCH AROUND DTMF IF MF MODE
HOP01 JSR STP PLAY MF STP
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 HOP02
JSR DDD PLAY DTMF D if DTMF MODE
BRA SKIP99 BRANCH AROUND DTMF IF MF MODE
HOP02 JSR BEEP PLAY 2600
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
BEQ HOP05
JSR T1004 PLAY 1004 HZ CAL TONE
BRA SKIP22
HOP05 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 DIME PLAY DIME TONE IN CAL MODE
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 HOP03 BRANCH AROUND DTMF IF MF MODE
JSR BBB PLAY DTMF B if DTMF MODE
BRA SKIP27
HOP03 JSR ST2P PLAY MF ST2P
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 HOP04 BRANCH AROUND DTMF IF MF MODE
JSR CCC PLAY DTMF C if DTMF MODE
BRA SKIP28
HOP04 JSR ST3P PLAY MF ST3P
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
STP 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 #$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
ST2P 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 #$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
ST3P 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 #$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
More information about the VoIP
mailing list