/****************************************************************************************
*****************************************************************************************
Technická univerzita v Kosiciach
Fakulta elektrotechniky a informatiky
Katedra elektroniky a multimedialnych telekomunikacii

Tema diplomovej prace:    Implementacia zakladnych algoritmov cislicoveho spracovania
                          signalov pomocou procesorov Analog Devices ADSP218x a ADSP219x

Veduci diplomovej prace:  doc. Ing. Milos Drutarovsky, CSc.

*****************************************************************************************
Nazov suboru:            iir_main.asm

Datum modifikacie:       29-04-2003

Autor:                   Peter Popadic

Verzia:                  1.00 pre ADSP2191, VisualDSP++ verzie 3

Opis:
Demonstruje cinnost IIR filtra implementovaneho v procesore ADSP-2191. Priklad vyuziva
kaskadne zapojenie bikvadov. Vstupne vzorky su nacitavane zo suboru x.dat vo formate 16.0
do vstupneho buffra rx_buf a filtrovane udaje sa zapisuju do vystupneho buffra tx_buf
a do IO pameti, odkial sa zapisu do suboru.

Subor na zaciatk obsahuje deklaracie buffrov a premennych. Buffre _Scale_List a _Coef musia byt
definovane ako cirkulacne buffre. V hlavnej casti _main sa postupne sa nastavia potrebne
registre (I, L, M, B). Nasleduje slucka 'iir', v ktorej sa nacita vzorka a nasledne sa
vola funkcia bikvad, ktora realizuje filtraciu vzoriek.
****************************************************************************************/

#include "iir_constant.h"

/*** datova pamat - DM data ***/
.section/dm data1;
.var _rx_buf[Dlzka_Bloku]="x.dat";          // deklaracia vstupneho buffra, hodnoty sa
                                            // nacitaju zo suboru x.dat (format 16.0) 
.var _tx_buf[Dlzka_Bloku];                  // deklaracia vystupneho buffra
.var _Scale_List[Pocet_Sekcii] = "scal.dat"; // skalovacie faktory pre bikvady
.var _Delay_Line[2*Pocet_Sekcii+2];          // deklaracia oneskorovacej linky
.global _Delay_Line;

/*** programova pamat - PM data ***/
.section/pm data3;
.var _Coef[N]="coef.dat";                   // koeficienty filtra su nacitane zo suboru
                                            // coef.dat v tvare B2, B1, B0, A2, A1,...
/*** programova pamat - PM program ***/
.section/pm  program;
.global _main;
.extern _bikvad;

_main:
/*** nastavenie smernikov ***/
    I2=_rx_buf;                         // nastavenie smernika na vstupny buffer
    I3=_tx_buf;                         // nastavenie smernika na vystupny buffer
    I0=_Delay_Line;                     // nastavenie smernika na oneskorovaciu linku
    ax0=0;
    L0=ax0;

    I1=_Scale_List;                     // nastavenie smernika na skalovacie koeficienty,
    L1=length(_Scale_List);             // nastavene ako cirkulacny buffe
    ar=_Scale_List;
    reg(B1) = ar;

    I5=_Coef;                           // nastavenie smernika na koeficienty,
    L5=length(_Coef);                   // nastavene ako cirkulacny buffe
    ar=_Coef;
    reg(b5) = ar;

    M0=1;
    M3=-3;
    M2=1;
    M5=1;
        
    CNTR=Dlzka_Bloku;                  // inicializacia pocitadla dlzky bloku
    DO iir UNTIL CE;
          SR1=DM(I2,M2);               // nacitanie vstupnej vzorky
          I0=_Delay_Line;              // smernik na oneskorovaciu linku
          CNTR=Pocet_Sekcii;           // inicializacia pocitadla bikvadov
          Call _bikvad;                // volanie funkcie na filtraciu  
          io(0x000f)=SR1;              // zapisanie vysledku do IO pameti
    iir:  DM(I3,M2)=SR1;               // zapis vysledku
    receive:                           // nekonecna slucka
    Jump receive;