
; Lezione14-9a.s	Comporre numeri telefonici (sistema a toni!!!)

; Un tono telefonico consiste in 2 toni, uno ad alta frequenza ed uno a bassa
; frequenza, che sono suonati contemporaneamente. (da Hallvard Korsgaard)

	SECTION	LEZIONE14-9,CODE

; Questi sono i periodi giusti per i vari numeri (si tratta di 2 word ogni
; numero, che sono il periodo per aud0/1  e aud2/3

zero		equ	$ee00a7		; 0
uno		equ	$14100b9	; 1
due		equ	$14100a7	; 2
tre		equ	$1410097	; 3
quattro		equ	$12200b9	; 4
cinque		equ	$12200a7	; 5
sei		equ	$1220097	; 6
sette		equ	$10700b9	; 7
otto		equ	$10700a7	; 8
nove		equ	$1070097	; 9
cancelletto	equ	$ee0097		; #
asterisco	equ	$ee00b7		; *


Start:
	movem.l	d0-d1/a0/a5,-(SP)	; Salvo i registri nello stack
	lea	$dff000,a5		; Custom base per offsets
	bsr.s	SettaAudRegs
	lea	TabbaNum(PC),a0		; Tabella col numero da suonare
NumeLoop:
	move.l	(a0)+,d0		; numero da suonare
	tst.l	d0			; tabella finita?
	beq.s	FinitoNum		; se si, esci
	bsr.s	SettaAudRegs

;             |\__/,|   (`\
;             |o o  |__ _) )
;           _.( T   )  `  /
; n n._    ((_ `^--' /_<  \
; <" _ }=- `` `-'(((/  (((/
;  `" "

	move.w	d0,$c6(a5)		; AUD2PER - period
	move.w	d0,$d6(a5)		; AUD3PER - period
	swap	d0
	move.w	d0,$a6(a5)		; AUD0PER - period
	move.w	d0,$b6(a5)		; AUD1PER - period
	move.w	#$800f,$96(a5)	; MACON - abilito il canale DMA audio 0,
				; dunque il sample comincia ad essere suonato.
	bsr.s	SpettaTraNumeri	; aspetto il giusto per suonare e la pausa
	bra.s	NumeLoop	; tra un numero e l'altro...
FinitoNum:
	movem.l	(SP)+,d0-d1/a0/a5	; ripristino i registri
	rts				; uscita

; Questa routine setta i registri per far suonare il nostro sample

SettaAudRegs:
	move.l	#SMP1,$a0(a5)		; AUD0LCH - indirizzo del sample
	move.l	#SMP1,$b0(a5)		; AUD1LCH - indirizzo del sample
	move.l	#SMP1,$c0(a5)		; AUD2LCH - indirizzo del sample
	move.l	#SMP1,$d0(a5)		; AUD3LCH - indirizzo del sample
	move.w	#SMP1LEN,$A4(a5)	; AUD0LEN - lunghezza del sample
	move.w	#SMP1LEN,$B4(a5)	; AUD1LEN - lunghezza del sample
	move.w	#SMP1LEN,$C4(a5)	; AUD2LEN - lunghezza del sample
	move.w	#SMP1LEN,$D4(a5)	; AUD3LEN - lunghezza del sample
	move.w	#64,$A8(a5)		; AUD0VOL - volume massimo
	move.w	#64,$B8(a5)		; AUD1VOL - volume massimo
	move.w	#64,$C8(a5)		; AUD2VOL - volume massimo
	move.w	#64,$D8(a5)		; AUD3VOL - volume massimo
	rts

; Questa routine serve per attendere il tempo del beep e la pausa tra un beep
; e l'altro, cosa fondamentale.

SpettaTraNumeri:
	MOVEQ	#23,D1		; numero di fotogrammi da aspettare
	MOVEQ	#-1,D0
WBLAN1:	
	CMP.B	6(A5),d0
	BNE.S	WBLAN1
WBLAN2:
	CMP.B	6(A5),D0
	BEQ.S	WBLAN2
	DBRA	D1,WBLAN1

	move.w	#$f,$96(a5)	; DMACON - chiudo i canali audio (zitto!)

	MOVEQ	#11,D1		; numero di fotogrammi da aspettare
	MOVEQ	#-1,D0
WBLAN1b:	
	CMP.B	6(A5),d0
	BNE.S	WBLAN1b
WBLAN2b:
	CMP.B	6(A5),D0
	BEQ.S	WBLAN2b
	DBRA	D1,WBLAN1b
	rts

; In questa tabella si mettono i numeri da comporre, usando quelli definiti
; prima dall' EQU.

TabbaNum:
	dc.l	uno,uno,tre	; chiamiamo il 113, vah!
	dc.l	0		; terminiamo la tabella con 0


******************************************************************************
;			IL SAMPLE IN MEMORIA
******************************************************************************

	SECTION	Tono,DATA_C

SMP1:
	dc.b $00,$31,$5a,$75,$7f,$75,$5a,$31,$00,$cf,$a6,$8b,$81,$8b,$a6,$cf
SMP1LEN		equ	(*-SMP1)>>1	; lunghezza del sample in words

	END


Questo listato vi puo' servire se si rompesse il vostro telefono, e non
digitasse piu' alcuni numeri: basta alzare la cornetta, avvicinarla alle
casse o applicarci una cuffietta, e il gioco e' fatto!
Altrimenti potreste mettere nella vostra demo l'opzione per chiamarvi
automaticamente anziche' doversi scrivere il numero su un foglio e
ridigitarlo. Fate voi...
