\documentclass[a4paper,fontsize=14bp]{article}

\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\setcounter{secnumdepth}{0}
\numerationTop

\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader

% ... работе, номер, тема, предмет, ?а, кто
\makeReportTitle{лабораторной}{2}{Исследование процессов обработки сигналов}{Микропроцессорные устройства обработки сигналов}{}{А.И. Германчук}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Целью работы является изучение стандартных процедур обработки сигналов и данных, а также их реализация в интегрированной среде проектирования Code Composer Studio версии 5 и на микропроцессоре TMS320C5515 компании Texas Instruments Incorporated. При выполнении лабораторной работы используется симулятор микропроцессора TMS320C5515 или оценочноя плата TMS320C5515 DSP Evaluation Module (TMDXEVM5515).

\section{Выполнение}
Индивидуальным заданием было написание функции вычисления арктангенса числа: \code{ushort atan16(DATA *x, DATA *r, ushort nx)}.

\section{Результаты работы}
После запуска проверочной программы (\hrf{code:prog-c}) представленной в приложении \hrf{appendix:fulls} было доказано совпадение результатов библиотечной функции (листинг \hrf{code:std-asm}) и описанной в дизассемблированном листинге \hrf{code:asm}. Результаты работы профилировщика отражены в таблице \hrf{table:profiler}. Снимки экрана, демонстрирующие идентичность полученных результатов представлены на рис. \hrf{pic:result}.

\begin{table}[H]
  \centering
  \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|} 
    \hline
    Name                        & Calls & EC Av & EC Ttl & IC Av  & IC Ttl & File \\
    \hline
    atan(short *, short *, int) & 1     & 969.0 & 969.0  & 3384.0 & 3384.0 & main.c \\
    \hline
    null()                      & 1     & 49.0  & 49.0   & 49.0   & 49.0   & atan16.asm \\
    \hline
  \end{tabular}
  \caption{Результат работы профилировщика}
  \label{table:profiler}
\end{table}

\begin{figure}[H]
  \centering
  \includegraphics[width=12cm]{02lab-rpt-1.png}
  \caption{Результат вычислений}
  \label{pic:result}
\end{figure}


\newpage
\printbibliography[heading=bibintoc, title={Список литературы}, resetnumbers=1]

\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Alph{subsection}}

\subsection{Полные листинги программ}
\label{appendix:fulls}
\begin{lstlisting}[style=ASMStyle,caption={Стандартный ассемблерный листинг}, label=code:std-asm]
_atan16:
 ;* AR0   assigned to _x
 ;* AR1   assigned to _r
 ;* T0   assigned to _nx
 PSH     T3
  || BSET	FRCT			;fractional mode
 SUB #1, T0   ;nx-1
 MOV T0, BRC0 ;repeat nx times
 MOV #2596 << #16, AC3  ; AC3.Hi = C5
 MOV #-9464 << #16, AC1 ; AC1.Hi = C3
 MOV #32617 << #16, AC2 ; AC2.Hi = C1

 MPYMR	T3=*AR0+, AC3, AC0      ; (Prime the Pump)
  || RPTBLOCAL	loop1-1
 MACR	AC0, T3, AC1, AC0
 MPYR	T3, AC0
  ||MOV	*AR0+, T1               ; (for next iteration)
 MACR	AC0, T3, AC2, AC0
 MPYR	T3, AC0
  ||MOV	T1, T3
 MOV	HI(AC0), *AR1+		;save result
  ||MPYR	T1, AC3, AC0            ; (for next iteration)

loop1:
 POP     T3
  || BCLR	FRCT			;return to standard C
 MOV	#0, T0			;return OK value (no possible error)
  || RET
\end{lstlisting}

\newpage
\begin{lstlisting}[language=C,style=CCodeStyle,caption={Программа на языке С}, label=code:prog-c]
#include "TMS320.h"

#define NX 7
#define FNAME "t1"
#define MAXERROR 40

ushort atan16(DATA *x, DATA *r, ushort nx);

short atan(DATA *x, DATA *r, int nx) {
	long long ac3 = ((long long)  2596) << 16; // AC3.Hi = C5  0.0396118164062500
	long long ac1 = ((long long) -9464) << 16; // AC1.Hi = C3 -0.1444091796875000
	long long ac2 = ((long long) 32617) << 16; // AC2.Hi = C1  0.4976959228515625
	while (--nx >= 0) {
		long long ac0;
		DATA t3 = *(x + nx);
	    ac0 = (t3 * (ac3 >> 15)) << 1;   // MPYMR T3=*AR0+, AC3, AC0
	    ac0 = ((ac0 >> 15) * t3) + ac1;  // MACR  AC0, T3, AC1, AC0
	    ac0 = ((ac0 >> 15) * t3);        // MPYR  T3, AC0

	    ac0 = ((ac0 >> 15) * t3) + ac2;  // MACR  AC0, T3, AC2, AC0
	    ac0 = ((ac0 >> 15) * t3);        // MPYR  T3, AC0
	    *(r + nx) = ac0 >> 16;           // MOV   HI(AC0), *AR1+
	}
	return 0;
}

int main(void) {
	DATA x[NX] = {8192,16384,24576,32767,-8192,-16384,-24576};
	DATA rtest[NX] ={8027,15192,21086,25735,-8028,-15193,-21087};
	DATA r[NX];
	DATA r0[NX];

	(void)atan16(x, r0, NX);
	atan(x, r, NX);

	return 0;
}
\end{lstlisting}

\newpage
\begin{lstlisting}[style=ASMStyle,caption={Дизассемблированная программа}, label=code:asm]
atan:
  4ee9                     AADD #-23,SP
  c408                     MOV T0,*SP(#04h)
  eb0495                   MOV XAR1,dbl(*SP(#02h))
  eb0085                   MOV XAR0,dbl(*SP(#00h))
long long ac3 = ((long long)  2596) << 16;
  7a0a240a                 MOV #2596 << #16,AC0
  46a3_110700              BSET ST1_M40 || SFTL AC0,#0,AC0
  104720                   SFTL AC0,#-32,AC1
  eb0c18                   MOV AC1,dbl(*SP(#06h))
  eb1008                   MOV AC0,dbl(*SP(#08h))
long long ac1 = ((long long) -9464) << 16;
  7adb080a                 MOV #-9464 << #16,AC0
  104720                   SFTL AC0,#-32,AC1
  eb1418                   MOV AC1,dbl(*SP(#0ah))
  eb1808                   MOV AC0,dbl(*SP(#0ch))
long long ac2 = ((long long) 32617) << 16;
  7a7f690a_47a2            MOV #32617 << #16,AC0 || BCLR ST1_M40
  46a3_110700              BSET ST1_M40 || SFTL AC0,#0,AC0
  104720                   SFTL AC0,#-32,AC1
  eb1c18                   MOV AC1,dbl(*SP(#0eh))
  eb2008                   MOV AC0,dbl(*SP(#10h))
while (--nx >= 0)
  a908                     MOV *SP(#04h),AR1
  4219                     SUB #1,AR1
  c908                     MOV AR1,*SP(#04h)
  6d2900d6                 BCC C$DW$L$_atan$2$E,AR1 < #0
DATA t3 = *(x + nx);
  2294                     MOV AR1,T0
  ed00bf                   MOV dbl(*SP(#00h)),XAR3
  a96b                     MOV *AR3(T0),AR1
  c92c                     MOV AR1,*SP(#16h)
ac0 = (t3 * (ac3 >> 15)) << 1;
  ed1018                   MOV dbl(*SP(#08h)),AC1
  ed0c28                   MOV dbl(*SP(#06h)),AC2
  c21a_98                  MOV AC2,mmap(@AC1G)
  a02c                     MOV *SP(#16h),AC0
  46a2_115531              BCLR ST1_M40 || SFTS AC1,#-15,AC1
  6c00207d                 CALL _mpylli
  46a3                     BSET ST1_M40
  4450                     SFTS AC0,#1
  104720                   SFTL AC0,#-32,AC1
  eb2418                   MOV AC1,dbl(*SP(#12h))
  eb2808                   MOV AC0,dbl(*SP(#14h))
ac0 = ((ac0 >> 15) * t3) + ac1;
  ed2808                   MOV dbl(*SP(#14h)),AC0
  ed2418                   MOV dbl(*SP(#12h)),AC1
  c114_98                  MOV AC1,mmap(@AC0G)
  a12c                     MOV *SP(#16h),AC1
  46a2_110531              BCLR ST1_M40 || SFTS AC0,#-15,AC0
  6c00207d                 CALL _mpylli
  ed1428                   MOV dbl(*SP(#0ah)),AC2
  ed1818                   MOV dbl(*SP(#0ch)),AC1
  c21a_98                  MOV AC2,mmap(@AC1G)
  46a3                     BSET ST1_M40
  2401                     ADD AC0,AC1
  101720                   SFTL AC1,#-32,AC0
  eb2408                   MOV AC0,dbl(*SP(#12h))
  eb2818                   MOV AC1,dbl(*SP(#14h))
ac0 = ((ac0 >> 15) * t3);
  ed2418                   MOV dbl(*SP(#12h)),AC1
  ed2808                   MOV dbl(*SP(#14h)),AC0
  c114_98                  MOV AC1,mmap(@AC0G)
  a12c                     MOV *SP(#16h),AC1
  46a2_110531              BCLR ST1_M40 || SFTS AC0,#-15,AC0
  6c00207d                 CALL _mpylli
  46a3                     BSET ST1_M40
  104720                   SFTL AC0,#-32,AC1
  eb2418                   MOV AC1,dbl(*SP(#12h))
  eb2808                   MOV AC0,dbl(*SP(#14h))
ac0 = ((ac0 >> 15) * t3) + ac2;
  ed2808                   MOV dbl(*SP(#14h)),AC0
  ed2418                   MOV dbl(*SP(#12h)),AC1
  c114_98                  MOV AC1,mmap(@AC0G)
  a12c                     MOV *SP(#16h),AC1
  46a2_110531              BCLR ST1_M40 || SFTS AC0,#-15,AC0
  6c00207d                 CALL _mpylli
  ed1c28                   MOV dbl(*SP(#0eh)),AC2
  ed2018                   MOV dbl(*SP(#10h)),AC1
  c21a_98                  MOV AC2,mmap(@AC1G)
  46a3                     BSET ST1_M40
  2401                     ADD AC0,AC1
  101720                   SFTL AC1,#-32,AC0
  eb2408                   MOV AC0,dbl(*SP(#12h))
  eb2818                   MOV AC1,dbl(*SP(#14h))
ac0 = ((ac0 >> 15) * t3);
  ed2418                   MOV dbl(*SP(#12h)),AC1
  ed2808                   MOV dbl(*SP(#14h)),AC0
  c114_98                  MOV AC1,mmap(@AC0G)
  a12c                     MOV *SP(#16h),AC1
  46a2_110531              BCLR ST1_M40 || SFTS AC0,#-15,AC0
  6c00207d                 CALL _mpylli
  46a3                     BSET ST1_M40
  104720                   SFTL AC0,#-32,AC1
  eb2418                   MOV AC1,dbl(*SP(#12h))
  eb2808                   MOV AC0,dbl(*SP(#14h))
*(r + nx) = ac0 >> 16;
  a408                     MOV *SP(#04h),T0
  ed04bf                   MOV dbl(*SP(#02h)),XAR3
  ed2418                   MOV dbl(*SP(#12h)),AC1
  ed2808                   MOV dbl(*SP(#14h)),AC0
  c114_98                  MOV AC1,mmap(@AC0G)
  bc6b                     MOV HI(AC0),*AR3(T0)
  a908                     MOV *SP(#04h),AR1
  4219                     SUB #1,AR1
  c908                     MOV AR1,*SP(#04h)
  6d59ff2a                 BCC C$L1,AR1 >= #0
return 0;
\end{lstlisting}

\end{document}

