;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; exemple de test de fichier asembleur pour TMS (test du mode asmTMS)


;*FICHIER du PROGRAMME PRINCIPAL
;*******************************

;--------------
; INTERRUPTIONS
;--------------
	.ps 0FA0Ah
        B    RINT    ; branchement au sous-programme d'interruption RINT
	eint          ; interruption XINT
	ret

;*****************************************************************
;PROGRAMME PRINCIPAL
;-------------------
; Ce programme initialise le convertisseur AIC et specifie certains
; parametres du programe comme la configuration 1, pas de decalage en
; sortie du registre P et les interruptions autorisees par l'intermediaire
; du registre IMR puis lance les algorithmes (Prog.Princ.) 
;**********************************************************************
;temps d'execution: 36106 cycles a 10 MHz + 10000 cycles pour l'interrupt
;*************************************************************************
	.ps 0FB00h
	.entry

START dint               ;empeche les interruptions sans modifier IMR
	call    AIC_RS   ;appel de sous-programme
	call    AIC_SET
	nop              ;introduit un temps d'attente
	ldpk    0        ;chargement du pointeur de pages de donnee
	lack    14h      ;Permet, comme seules interruptions masquables
			 ;RINT (loader) et INT2 (debogeur)
	sacl    IMR
	ssxm            ;mode extension de signe
	spm     0       ;pas de declage en sortiedu multiplieur
	conf    1       ;Config. des blocs:B0 en PROG, B1 B3 en DONNEE
	SOVM
	eint
;-------------
;prog. princ.
;-------------
	call    pgm_init      ; attente acquisition d'une trame/2
	call    pgm_init      ; attente acquisition autre trame/2
	call    pgm_init      ; init des variables et des tableaux
loop
	call    pgm_init
	; appel des differents algorithmes de traitement
	call    hamming
	call    correl
	call    div
	call    schur

	LRLK	AR1,ki
	LARP	AR1
	LRLK	AR2,11
div_ki	LAC	*
	SFR
	SACL	*+,0,AR2
	BANZ	div_ki,*-,AR1
	call    levinson

	call    AMDF
;	call    residuel
;;	call	seuillage

	call    synthese
;	call    /hamming
	call    /hamming_AMDF

	b       loop

;---------------------------------------------------------------------
; implantation du S/P d'interruption RINT en memoire programme interne
;---------------------------------------------------------------------
	 .include "spi_rint.asm"

;-----------------------------------------------------------
; implantation des autres algos en memoire programme externe
;-----------------------------------------------------------
	.ps 8000h
	.include "sp_init.asm"
	.include "compress.asm"
	.include "algobiz.asm" ; tous les algo. de traitement
	                       ;  (hamming, correl,..)

;---------------------------------------------
; declaration de l'implantation memoire donnee
;---------------------------------------------
;	.include "inc_test.asm"

;---------------------------------------------
; declaration de l'implantation memoire donnee
;---------------------------------------------
	.include "mem_data.asm"

	.end
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;*******************************************************************
;** Calcul du fondamental
;*******************
;Ce programme calcule le fondamental du signal de parole par AMDF

;In:    tab du signal de parole d_ech_B1
;Out:   tab des coef. AMDF de taille 60
;       tab du nouveau residuel avec V/NV

;****************************************************************

AMDF    ZAC                    ;"0" -> ACCU
        LDPK    AMDF_coef
        LRLK    AR1,AMDF_coef  ;AR1 pointe sur les coef. AMDF
        LARP    AR1
        RPTK    59             ;remise a zero des 60 coef. AMDF
        SACL    *+

        LRLK    AR1,AMDF_coef  ;AR1 pointe sur les coef. AMDF
        LRLK    AR4,59         ;nombre de coef. AMDF -1
        ZAC
        LDPK    AMDF_tmp       ;tmp pour calculer un coef.
        SACL    AMDF_tmp       ;"0" -> AMDF_tmp
        LDPK    AMDF_H
        SACL    AMDF_H
        LRLK    AR5,AMDF_tmp
        LRLK    AR6,59         ;=nbre -1 de "-" pour chaque coef.
        LRLK    AR7,80         ;=nbre de val. en entree

        LALK    d_ech_B1       ;@"d_ech_B1" -> ACCU
        LDPK    tab1
        SACL    tab1           ;@"d_ech_B1" -> tab1
        LDPK    tab2
        ADDK    20
        SACL    tab2           ;@"d_ech_B1" +20 -> tab2

        LAR     AR2,tab1       ;pointeur sur le tableau d'entree tab1
        LAR     AR3,tab2       ;idem sur tab2
        LARP    AR3


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;***************************************************
;* FICHIER des DECLARATIONS et des INITIALISATIONS *
;***************************************************

;-----------------------------------------------------------------
;-- DECLARATION DES CONSTANTES --
;--------------------------------

;parametres generaux de l'appli
;------------------------------
trame           .set    160     ; taille d'une trame
output          .set    80      ; fenetre de sortie du residuel
offset          .set    40      ; decalage de la fenetre
nb_lpc          .set    12      ; nombre de coeff. de la LPC

; constantes pour la compression du residuel par l'AMDF
ff		.set	2
decalage	.set	5	;9 pas de pics sur 'a', pics sur '11'
				;8 pics sur 'a', '11'
; Memory Mapped Registers
DRR     .set    0
DXR     .set    1
TIM     .set    2
PRD     .set    3
IMR     .set    4
GREG    .set    5
; TMS320C26 Memory Map - jusqu'a
B2_D    .set    060h    ; 07Fh  -> utilise par le deboggueur
B0_D    .set    0200h   ; 03FFh
B1_D    .set    0400h   ; 05FFh
B3_D    .set    0600h   ; 07FFh
B0_P    .set    0FA00h  ; FBFFh
B1_P    .set    0FC00h  ; FDFFh
B3_P    .set    0FE00h  ; FFFFh


;----------------------------------------------------------------
;----------------------------------------------------------------
;-- ORGANISATION DE L'ESPACE MEMOIRE --
;--------------------------------------

	.ds B1_D
; bloc B1 situe en MEMOIRE DONNEE avec l'instruction CONF 1
; et en MEMOIRE PROGRAMME avec l'instruction CONF 2
;---------------------------------------------------------
; Sous-programme de calcul des coefficients de correlation
;---------------------------------------------------------
d_ech_B1:       .space  2560    ;=16*(trame) = sauvegarde des
				; echantillons d'entree
				;filtres dans le bloc B1 (ou 0FC00h) en
				;ZONE PROGRAMME (conf 2)
d_cp_mac2       .set    0FC00h  ;adresse de B1 en zone programme
;----------------------------------
; Sous-programme de calcul du Residuel
;----------------------------------
d_output_B1     .set    450h    ;=d_ech_B1+output = adresse debut 2eme
				; demi-tableau B1 en ZONE DONNEE

ai_B1           .space  192     ;=16*(nb_lpc) = copie du tableau des ai
				; en ZONE PROGRAMME (calcul du residuel)

ad_ai_B1        .set    0FCA0h  ; adr. du tableau ai_b1 precedent
				; en ZONE PROGRAMME

;-----------------------------------
; Sous-programme d'interruption RINT
;-----------------------------------
compteur        .word   0       ; compteur de boucle de RINT (80 boucles)
d_tab_in:       .space  1264    ;=16*(output-1); tableau des 80 echant.
				;d'entree filtres apres pre-accent. 
				; (dans RINT)
fin_tab_in      .word   0
d_tab_out:      .space  1264    ;=16*(output-1); idem en sortie avant
				; desaccent. (dans RINT)
fin_tab_out     .word   0
ind_tab_in      .word   4ADh    ;= adresse du tableau d_tab_in

ind_tab_out     .word   4FDh    ;= adresse du tableau d_tab_out
save		.word	92afh


;----------------------------------------------------------------------
	.ds B3_D
; premiere page du bloc B3 situee en MEMOIRE DONNEE pour cette appli.
;------------------------------------------------------------------------
; freq. d'echantillonnage : fe= 10,000,000/(2*TA*TB) pour la transmission
;                           fe=  10,000,000/(2*TA*TB) pour la reception.
TA        .word   16
RA        .word   16     ;cette initialisation du registre AIC(Analog
TAp       .word   1      ;Interface Circuit)definit une frequence
RAp       .word   1      ;d'echantillonnage de 8000 Hz
TB        .word   41
RB        .word   41
AIC_CMD   .word   019h  ; - filtre passe-bande en entree
			 ; - pas de rebouclage interne (test)
			 ; - inhibition des entrees auxiliaires
			 ; - fonctionnement synchrone
			 ; - gain = 2 (+/- 3V pleine echelle)
;---------------------------------------------
; Sous-programme du filtre de pre-accentuation
;---------------------------------------------
old_sample   .word 0h   ; pour le filtre de pre-accentuation
;-----------------------------------
; Sous-programme d'interruption RINT
;-----------------------------------
a           .word   799ah   ; valeur du coefficient a = 0.95
moins_a     .word   8666h   ; valeur du coefficient - a = - 0.95
;a           .word   6666h   ; valeur du coefficient a = 0.8
;moins_a     .word   999ah   ; valeur du coefficient - a = - 0.8
;a           .word   0h   ; valeur du coefficient a = 0
;moins_a     .word   0h   ; valeur du coefficient - a =  0

old_in      .word   0h      ; sauvegarde de l'echantillon precedent
			    ;(fitre pre-accent.)
old_out     .word   0h      ; idem pour filtre desaccentuation
synchro     .word   0       ; indicateur de fin d'acquisition des
				; 80 echantillons
;--------------------------------------------------------
; Sous-programme de calcul des coefficents de correlation
;--------------------------------------------------------
zero        .word   0h    ;variable permettant une RAZ des
			   ; registres du DSP
vec_cor     .word   159   ;=trame-1= pour calculer Somme des sn*sn-1
			   ;de l'autocorrelation
nb_cor      .word   13    ;=nb_lpc+1 = nbre de boucles de
			   ; l'autocorrelation
debut_cp    .word   0h    ;adresse de debut du tableau d'entree
			   ; d_ech_B3 tranlatee de i (pointeur pour
			   ; le calcul de sn*sn-i) 
;--------------------------------
; Sous-programme de Normalisation
;--------------------------------
nb_norm     .word   13  ;=nb_lpc+1= nbre de coeff. Ci a calculer
			 ; (normalisation) - compteur de boucle
temsgn      .word   0   ;sauvegarde du signe de la division(Cn/C0)
;------------------------
; Sous-programme de Schur
;------------------------
tmp        .word   0    ;memoire temporaire de l'algo de Schur
			 ; (mult. de mat.)
tmp0       .word   0    ;idem
tmp1       .word   0    ;idem

ki:        .space  176  ;=16*(nb_lpc-1), pointeurs debut et fin de
			 ;tableau k(i)
fin_ki     .word   0
;---------------------------
; Sous-programme de Levinson
;---------------------------
;ai        .word   3fffh   ; 1 code en 2.14 (pour les coefficients ai
ai        .word   1fffh   ; 1 code en 3.13 (pour les coefficients ai
	  .space  192     ;=16*(nb_lpc) = table des coefficients a(i)

new_ai:   .space 192     ;=16*nb_lpc = table des valeurs intermediaires
			  ;des a(i)
tmp2      .word 0         ; memoire temporaire
;--------------------------------------
; Sous-programme de Synthese (Treillis)
;--------------------------------------
Xm_1      .word   0    ; memoire tempo. du filtre en treillis
Ym_2      .word   0
Ym_1      .word   0
Xm_2      .word   0

treillis:  .word 0,0,0,0,0,0,0,0,0,0,0    ;=16*(nb_lpc-1) = valeurs
		   	; des sorties des differentes cellules
		   	; du filtre en treillis

;-----------------calcul du bruit blanc--------------------------------

bruit      .word   0     ;valeurs du bruit blanc
bruit_1    .word   0,0,0,0,0,0,0,0,0,0,0
bruit_12   .word   0,0
bruit_14   .word   0
bruit_15   .word   2    ;valeur "2" pour permettre l'operation
			 ;(bruit-1)/2
position   .word   8000h   ;position du dernier pic par rapport
			   ;aux 80 valeurs a calculer
			   ;cad si position=10 <=> le dernier
			   ;se trouve a la valeur 70 (80 -10)

;-----------------compression du residuel-----------------------------

AMDF_coef:   .space  960    ;=16*60 coef
AMDF_tmp     .word   0h
AMDF_H       .word	0h   ;mem. tampon

tab1         .word   0h    ;ad. dans le tab d_ech_B3
tab2         .word   0h    ;ad. dans le tab d_ech_B3
min          .word   0h    ;valeur minimum des coefs AMDF
index        .word   0h    ;index dans le tab des AMDF
old_index    .word   0h    ;ancien index dans le tab des AMDF
p_relative   .word   0h    ;position relative des pics lors du
			    ;calcul d'un son voise
delta_i      .word   0h      ;;p.p/819

input        .word   0h    ;coefficient C0 de l'energie
guess        .word   0,0   ;variable (racine carre)

pas          .word   0h    ;pas d'inc. pour la gene. de la sinu.

;-------------------------------------------------------------------
	.ds 700h
; 3ieme page du bloc B3 en MEMOIRE DONNEE pour cette application
;-------------------------------------------------------------------
; Sous-programme de calcul des coefficients de correlation
;---------------------------------------------------------
d_ech_B3:  .space  2560  ;=16*(trame) = tab. B3 identique a B1
			  ; (ZONE DONNEE)
ad_cor:    .space  208   ;=16*(nb_lpc+1) = tableau des coefficients
			  ;d'autocorrelation mis a la suite de B3
;--------------------------------
; Sous-programme de Normalisation
;--------------------------------
ri         .word   0       ; 1er coeff. normalise R(i) (= Ci/C0)
ri_1:      .space  160     ;=16*(nb_lpc-2) = suite des coeff. R(i)
ri_dmov    .word   0       ;avant dernier coeff.
ri_fin     .word   0       ; dernier coeff.
;------------------------
; Sous-programme de SCHUR
;------------------------
ri_c2      .word   0    ;1er coeff. norm. R(i) de la 2eme colonne
			 ;matrice Ai de Schur
ri_c2_1:   .space  192  ;=16*(nb_lpc) = suite coeff. 2eme col.
			 ; de Schur
;------------------------
tmp_13:    .space  208  ;=16*(nb_lpc+1) = mem. temporaire
;-----------------------------------
; Sous-programme d'interruption RINT
;-----------------------------------
	   .space   464    ;=16*(29) = taille de la pile
			  ; (sauvegardes de RINT)
contexte   .word   0h      ;pointeur de fin de pile
max        .word   0h      ;variable du seuillage
;seuil      .word   0h     ;pas de changement du signal
;seuil      .word   3fffh   ;seuillage a 50% (codage : 1.15)
seuil      .word   4CCDh   ;seuillage a 60%

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	.ds 8000h

; tableau des coefficients pour Hamming
d_ham  .word  0a3dh
          .word  0a49h
          .word  0a6ch
          .word  0aa7h
          .word  0af9h
          .word  0b62h
          .word  0be3h
          .word  0c7ah
          .word  0d28h
          .word  0dech
          .word  0ec6h
          .word  0fb7h
          .word  010bch
          .word  011d6h
          .word  01305h
          .word  01448h
          .word  0159fh
          .word  01708h
          .word  01884h
          .word  01a12h
          .word  01bb0h
          .word  01d60h
          .word  01f1fh
          .word  020eeh
          .word  022cbh
          .word  024b5h
          .word  026adh
          .word  028b1h
          .word  02ac0h
          .word  02cdah
          .word  02efdh
          .word  03129h
          .word  0335dh
          .word  03599h
          .word  037dah
          .word  03a21h
          .word  03c6ch
          .word  03ebbh
          .word  0410ch
          .word  0435fh
          .word  045b3h
          .word  04806h
          .word  04a58h
          .word  04ca8h
          .word  04ef5h
          .word  0513eh
          .word  05383h
          .word  055c1h
          .word  057f9h
          .word  05a29h
          .word  05c51h
          .word  05e70h
          .word  06085h
          .word  0628eh
          .word  0648ch
          .word  0667dh
          .word  06861h
          .word  06a37h
          .word  06bfeh
          .word  06db5h
          .word  06f5dh
          .word  070f3h
          .word  07278h
          .word  073eah
          .word  0754ah
          .word  07697h
          .word  077d0h
          .word  078f5h
          .word  07a05h
          .word  07b00h
          .word  07be5h
          .word  07cb4h
          .word  07d6dh
          .word  07e10h
          .word  07e9ch
          .word  07f11h
          .word  07f6fh
          .word  07fb5h
          .word  07fe4h
          .word  07ffch
          .word  07ffch
          .word  07fe4h
          .word  07fb5h
          .word  07f6fh
          .word  07f11h
          .word  07e9ch
          .word  07e10h
          .word  07d6dh
          .word  07cb4h
          .word  07be5h
          .word  07b00h
          .word  07a05h
          .word  078f5h
          .word  077d0h
          .word  07697h
          .word  0754ah
          .word  073eah
          .word  07278h
          .word  070f3h
          .word  06f5dh
          .word  06db5h
          .word  06bfeh
          .word  06a37h
          .word  06861h
          .word  0667dh
          .word  0648ch
          .word  0628eh
          .word  06085h
          .word  05e70h
          .word  05c51h
          .word  05a29h
          .word  057f9h
          .word  055c1h
          .word  05383h
          .word  0513eh
          .word  04ef5h
          .word  04ca8h
          .word  04a58h
          .word  04806h
          .word  045b3h
          .word  0435fh
          .word  0410ch
          .word  03ebbh
          .word  03c6ch
          .word  03a21h
          .word  037dah
          .word  03599h
          .word  0335dh
          .word  03129h
          .word  02efdh
          .word  02cdah
          .word  02ac0h
          .word  028b1h
          .word  026adh
          .word  024b5h
          .word  022cbh
          .word  020eeh
          .word  01f1fh
          .word  01d60h
          .word  01bb0h
          .word  01a12h
          .word  01884h
          .word  01708h
          .word  0159fh
          .word  01448h
          .word  01305h
          .word  011d6h
          .word  010bch
          .word  0fb7h
          .word  0ec6h
          .word  0dech
          .word  0d28h
          .word  0c7ah
          .word  0be3h
          .word  0b62h
          .word  0af9h
          .word  0aa7h
          .word  0a6ch
          .word  0a49h
f_ham    .word  0a3dh


d_/ham  .word  06400h
          .word  0638dh
          .word  0623ch
          .word  0601eh
          .word  05d4fh
          .word  059f0h
          .word  05624h
          .word  0520fh
          .word  04dd3h
          .word  04989h
          .word  0454bh
          .word  04128h
          .word  03d2eh
          .word  03966h
          .word  035d4h
          .word  0327bh
          .word  02f5bh
          .word  02c74h
          .word  029c4h
          .word  02746h
          .word  024fah
          .word  022dbh
          .word  020e6h
          .word  01f18h
          .word  01d6eh
          .word  01be4h
          .word  01a79h
          .word  01929h
          .word  017f3h
          .word  016d4h
          .word  015cah
          .word  014d4h
          .word  013efh
          .word  0131ah
          .word  01255h
          .word  0119dh
          .word  010f2h
          .word  01052h
          .word  0fbdh
          .word  0f32h
          .word  0eb0h
          .word  0e37h
          .word  0dc5h
          .word  0d5bh
          .word  0cf7h
          .word  0c9ah
          .word  0c42h
          .word  0bf0h
          .word  0ba3h
          .word  0b5bh
          .word  0b17h
          .word  0ad7h
          .word  0a9bh
          .word  0a63h
          .word  0a2fh
          .word  09fdh
          .word  09cfh
          .word  09a3h
          .word  097bh
          .word  0955h
          .word  0931h
          .word  0910h
          .word  08f2h
          .word  08d5h
          .word  08bah
          .word  08a2h
          .word  088bh
          .word  0877h
          .word  0864h
          .word  0853h
          .word  0843h
          .word  0836h
          .word  0829h
          .word  081fh
          .word  0816h
          .word  080eh
          .word  0809h
          .word  0804h
          .word  0801h
          .word  0800h
          .word  0800h
          .word  0801h
          .word  0804h
          .word  0809h
          .word  080eh
          .word  0816h
          .word  081fh
          .word  0829h
          .word  0836h
          .word  0843h
          .word  0853h
          .word  0864h
          .word  0877h
          .word  088bh
          .word  08a2h
          .word  08bah
          .word  08d5h
          .word  08f2h
          .word  0910h
          .word  0931h
          .word  0955h
          .word  097bh
          .word  09a3h
          .word  09cfh
          .word  09fdh
          .word  0a2fh
          .word  0a63h
          .word  0a9bh
          .word  0ad7h
          .word  0b17h
          .word  0b5bh
          .word  0ba3h
          .word  0bf0h
          .word  0c42h
          .word  0c9ah
          .word  0cf7h
          .word  0d5bh
          .word  0dc5h
          .word  0e37h
          .word  0eb0h
          .word  0f32h
          .word  0fbdh
          .word  01052h
          .word  010f2h
          .word  0119dh
          .word  01255h
          .word  0131ah
          .word  013efh
          .word  014d4h
          .word  015cah
          .word  016d4h
          .word  017f3h
          .word  01929h
          .word  01a79h
          .word  01be4h
          .word  01d6eh
          .word  01f18h
          .word  020e6h
          .word  022dbh
          .word  024fah
          .word  02746h
          .word  029c4h
          .word  02c74h
          .word  02f5bh
          .word  0327bh
          .word  035d4h
          .word  03966h
          .word  03d2eh
          .word  04128h
          .word  0454bh
          .word  04989h
          .word  04dd3h
          .word  0520fh
          .word  05624h
          .word  059f0h
          .word  05d4fh
          .word  0601eh
          .word  0623ch
          .word  0638dh
f_/ham    .word  06400h
