home *** CD-ROM | disk | FTP | other *** search
- ; This source dials a number, it can do either DTMF or CCITT5. It has built
- ; in letter recognition. Ie ABC -> 1, DEF -> 2 which can be switched off.
- ; It is also variable speed. Feel free to use in your programmes.
- ;
- ; NB: This isnt the source of the programme dial, just the routine which
- ; dials numbers. Dial is merely a frontend to this:
- ;
- ; Original code by Andrew Leppard Internet: 9405571x@lux.levels.unisa.edu.au
- ; SAS C conversion and optimization by David Ekholm.
- ;
- ; Usage from C:
- ; extern void __asm DialDTMF(register __a0 char *phonenumber,
- ; register __d0, unsigned int speed);
- ;
- ; extern void __asm DialCCITT5(register __a0 char *phonenumber,
- ; register __d0, unsigned int speed);
- ;
-
- include "exec/funcdef.i"
- include "exec/exec_lib.i"
- include "exec/libraries.i"
- include "hardware/custom.i"
-
- xdef _DialDTMF
- xdef _DialCCITT5
-
- callsys macro
- LINKLIB _LVO\1,4
- endm
-
- section text,code
-
- _DialDTMF ;dial DTMF,
- movem.l d1/d4-d7/a3-a5,-(sp) ;a0=number in ascii
- lea DTMF,a1 ;chr(0) to end
- bra Start
-
- _DialCCITT5 ;dial CCITT5,
- movem.l d1/d4-d7/a3-a5,-(sp) ;a0=number in ascii
- lea CCITT5,a1 ;chr(0) to end
-
- Start move.b d0,Speed
- move.l #SnWaveS,d0
-
- clr.l d2
- move.b Speed,d2
-
- NextTone
- clr.l d1
- move.b (a0)+,d1
- cmp.b #'*',d1
- beq Special
- cmp.b #'#',d1
- beq Special
-
- cmp.b #'0',d1
- blt SkipNote
- cmp.b #'9',d1
- bgt NotDigit
-
- sub.b #'0',d1
- DoneConv
- lsl #2,d1 ;*4
- move.w 0(a1,d1.w),d4 ;Lookup table in words
- move.w 2(a1,d1.w),d5 ;get period of both tones
- bsr SoundTone
- bra Pause
- SkipNote
- tst.b (a0)
- bne NextTone
-
- movem.l (sp)+,d1/d4-d7/a3-a5
- rts
-
- Special move.w #10,d1 ;* & #
- cmpi.b #'#',d1 ;(does anyone want the
- bne NoAdN ;a,b,c or d tones?)
- addq.w #1,d1
- NoAdN bra DoneConv
-
- NotDigit ;Handles a-y
- tst.b Letter ;-nl -ignore letters
- bne SkipNote
-
- cmp.b #'Q',d1 ;Q & Z = 1
- beq DoLQZ
- cmp.b #'Z',d1
- beq DoLQZ
- bgt SmallCase
- cmp.b #'A',d1 ;=> 1-9
- blt SkipNote
- cmp.b #'Q',d1
- blt NoDif
- subq.b #1,d1
- NoDif sub.b #59,d1
- divu #3,d1
- bra DoneConv
- DoLQZ move.l #1,d1
- bra DoneConv
-
- SmallCase
- cmp.b #'z',d1
- beq DoLQZ ;Q and Z come on the
- bgt SkipNote
- cmp.b #'q',d1 ;Number 1 button
- beq DoLQZ ;sometimes
- cmp.b #'a',d1
- blt SkipNote
- cmp.b #'q',d1
- blt NoDifS
- subq.b #1,d1
- NoDifS sub.b #91,d1
- divu #3,d1
- bra DoneConv
-
- SoundTone
- lea $dff000,a5
- lea aud1(a5),a3 ;Right channel only
- lea aud2(a5),a4 ;N.B Don't be clever
- move.w #$000f,dmacon(a5) ;and use stereo it
- move.l d0,(a3) ;doesn't work then.
- move.l d0,(a4)
- move.w #SnSize/2,ac_len(a3)
- move.w #SnSize/2,ac_len(a4)
- move.w #64,ac_vol(a3)
- move.w #64,ac_vol(a4)
- move.w d4,ac_per(a3)
- move.w d5,ac_per(a4)
- move.w #$00ff,adkcon(a5)
- move.w #$8206,dmacon(a5)
-
- timedelay
- bsr GetTime
- move.l d7,d6
- Cont bsr GetTime
- sub.l d6,d7
- cmp.l d2,d7
- bgt StopNote
- bra Cont
-
- StopNote
- move.w #$0006,dmacon(a5)
- rts
-
- Pause bsr GetTime
- move.l d7,d6
- Cont2 bsr GetTime
- sub.l d6,d7
- cmpi.l #2,d7
- bgt SkipNote
- bra Cont2
-
- GetTime clr.l d7 ;Stuff the timer.device
- move.b $bfea01,d7 ;we programme direct
- lsl.l #4,d7 ;via PIA
- lsl.l #4,d7
- move.b $bfe901,d7
- lsl.l #4,d7
- lsl.l #4,d7
- move.b $bfe801,d7
- rts
-
- section __MERGED,data
-
- cnop 0,4
-
- DTMF dc.w 238,166 ;0
- dc.w 319,186 ;1
- dc.w 319,166 ;2
- dc.w 319,151 ;3
- dc.w 290,184 ;4
- dc.w 290,166 ;5
- dc.w 290,151 ;6
- dc.w 263,184 ;7
- dc.w 263,166 ;8
- dc.w 263,151 ;9
- dc.w 238,184 ;*
- dc.w 238,151 ;#
-
- CCITT5 dc.w 128,120 ;0
- dc.w 162,149 ;1
- dc.w 162,138 ;2
- dc.w 149,138 ;3
- dc.w 162,128 ;4
- dc.w 149,128 ;5
- dc.w 138,128 ;6
- dc.w 162,120 ;7
- dc.w 149,120 ;8
- dc.w 138,120 ;9
- dc.w 138,112 ;*
- dc.w 128,112 ;#
-
- Speed dc.b 5 ;speed of dial
- Letter dc.b 0 ;0 = use letter recognitiion
-
- section chip,data,CHIP
- cnop 0,4
- SnWaveS
- dc.b 0,49
- dc.b 90,117
- dc.b 127,117
- dc.b 90,49
- dc.b 0,-49
- dc.b -90,-117
- dc.b -127,-117
- dc.b -90,-49
- SnWaveE
- SnSize EQU SnWaveE-SnWaveS
-
- end
-