#include #include "adds_21161_ezkit.h" #include .extern _vector_X; .extern _vector_Y; .extern _matrix_A; .extern _matrix_A_PM; .extern _n; //--------- .extern _liczba1; .extern _liczba2; .extern _macierz; .segment /pm seg_pmco; //########################################################## //####### procedura mnożenia 'macierz x wektor' ############ //# obie tablice (macierz A i wektor X ) w pamięci danych ## //########################################################## _matrix_x_vector_1: .global _matrix_x_vector_1; leaf_entry; //wejscie do procedury I0=_matrix_A; B0=I0; L0=9; M0=1; I1=_vector_X; B1=I1; L1=3; M1=1; I2= _vector_Y; B2=I2; L2=3; M2=1; f0=0; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2;f0=f0+f3; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2;f0=f0+f3; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2;f0=f0+f3; DM(I2,M2)=F0; f0=0; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2;f0=f0+f3; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2;f0=f0+f3; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2;f0=f0+f3; DM(I2,M2)=F0; f0=0; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2; f0=f0+f3; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2; f0=f0+f3; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2; f0=f0+f3; DM(I2,M2)=F0; /* lcntr =3, do loop_wiersze until LCE; f0=0; //wartosc poczatkowa lcntr =3, do loop_kolumny until LCE; f1=DM(I0,M0); f2=DM(I1,M1); f3=f1*f2; loop_kolumny: f0=f0+f3; loop_wiersze: DM(I2,M2)=F0; */ //############################################################# // wyjscie z procedury (przywrócenie wartości zerowych w rejestrach) i0=0; i1=0; b0=i0; b1=i0; l0=0; l1=0; m0=0; m1=0; I2=0; B2=0; M2=0; L2=0; leaf_exit; _matrix_x_vector_1.end: //###################################################### //####### procedura mnożenia 'macierz x wektor' ######## //########## macierz A w pamięci programu PM ########### //########## wektor X w pamięci danych DM ############## //###################################################### _matrix_x_vector_2: .global _matrix_x_vector_2; leaf_entry; I8=_matrix_A_PM; B8=I8; L8=9; M8=1; I1=_vector_X; B1=I1; L1=3; M1=1; I2= _vector_Y; B2=I2; L2=3; M2=1; lcntr =3, do loop_wiersze_2 until LCE; f0=0; //wartosc początkowa f1=PM(I8,M8), f2=DM(I1,M1); f0=f1*f2; f1=PM(I8,M8), f2=DM(I1,M1); f0=f1*f2; f1=PM(I8,M8), f2=DM(I1,M1); f0=f1*f2; loop_wiersze_2: DM(I2,M2)=F0; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // wyjscie z procedury (przywrócenie wartości zerowych w rejestrach) i0=0; i1=0; b0=i0; b1=i0; l0=0; l1=0; m0=0; m1=0; I2=0; B2=0; M2=0; L2=0; leaf_exit; _matrix_x_vector_2.end: //########################################################################### //# pusta procedura - w celu obliczenia czasu wejscia i wyjscia z procedury # //########################################################################### //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ _matrix_x_vector_0: .global _matrix_x_vector_0; leaf_entry; I8=_matrix_A_PM; M8=1; B8=I8; L8=9; I1=_vector_X; M1=1; B1=I1; L1=3; I2= _vector_Y; B2=I2; L2=3; M2=1; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // wyjscie z procedury (przywrócenie wartości zerowych w rejestrach) i0=0; i1=0; b0=i0; b1=i0; l0=0; l1=0; m0=0; m1=0; I2=0; B2=0; M2=0; L2=0; leaf_exit; _matrix_x_vector_0.end: //############################################################# //############################################################# //########### procedura 'silnia' w assemblerze ################ //############################################################# _silnia_ASM: .global _silnia_ASM; leaf_entry; r0=1; //index poczatkowy r1=DM(_n); //liczba powtorzen petli r1=r1+1; r2=1; //wartosc poczatkowa silni lcntr=r1, do petla_silnia until LCE; r2=r2*r0; petla_silnia: r0=r0+1; dm(_n)=r2; leaf_exit; _silnia_ASM.end: _dodawanie: .global _dodawanie; leaf_entry; r0=DM(_macierz); r1=DM(_macierz+1); r2=DM(_macierz+2); r3=DM(_macierz+3); r4=r0*r1; r5=r2*r3; r0=r4-r5; dm(_liczba2)=r0; //B0=I0; //M0=0; //r0=DM(B0,M0); //M0=M0+1; //r1=DM(B0,); /* r1=DM(_liczba1); r1=DM(_liczba2); r2=r1-r0; dm(_liczba2)=r2;*/ leaf_exit; _dodawanie.end: //################################################################ //# procedura _count_start - do pomiaru czasu trwania procedury # //################################################################ _count_start: /* call this to start cycle count */ .global _count_start; r1=mode1; bit clr mode1 IRPTEN; r0=emuclk; mode1=r1; exit; _count_start.end: //############################################################### //# procedura _count_end - do pomiaru czasu trwania procedury # //############################################################### _count_end: /* call this to end cycle count */ .global _count_end; r2=mode1; bit clr mode1 IRPTEN; r0=emuclk; r0=r0-r4; r1=14; /* fudge factor to compensate for overhead */ r0=r0-r1; mode1=r2; exit; _count_end.end: .endseg;