pvvx
Активный участник сообщества
Тут то прикол в том, что счас nikolz вдрух сядет и начнет писать на asm для DSP, вместо отсылки по чужим ссылкам Ж)
Эт мелкий кусок из программы к тому устройству...
Код:
/************ Поиск полигона ***********************************************/
Search_pol:
i1 = fdata; l1=0;
s_in_next_sec:
call Read_cashe;
if ne jump search_err_ar;
m1 = -256;
modify(i1,m1);
m1 = 1;
ax0 = dm(x); // lon
ax1 = dm(y); // lat
for_search:
ay0 = fdata;
ar = i1;
ar = ar - ay0;
if ge jump s_in_next_sec;
sr0 = dm(i1,m0); //+0 lsw
sr1 = dm(i1,m0); //+1 msw
ar = tstbit 15 of sr1; // начало блока полигона ?
if eq jump format_err; // нет. "ошибка формата"
ar = tstbit 7 of sr0; // конец блока полигонов ?
ar = sooNoPol; // "Полигон не найден"
if ne jump no_search; // да. "Полигон не найден"
ar = clrbit 15 of sr1;
dm(func_sec) = ar;
sr = lshift sr0 by 8(lo);
dm(func_ptr) = sr1;
sr = lshift sr0 by 4(lo);
sr = lshift sr0 by -12(lo);
ar = pass sr0; // клетка полностью перекрывается этим полигоном ?
if eq jump Go_next_map; // да.
sr0 = dm(i1,m0); // площадь полигона low 16 bit
sr1 = dm(i1,m0); // площадь полигона hi 16 bit
ar = ar + 1; // получить в ar число точек в полигоне - 1
cntr = ar;
ay0 = dm(i1,m0);
ar = ay0 - ax0, ay0 = dm(i1,m0);
ar = ay0 - ax1, my0 = ar;
mx0 = ar;
do calc_Sx until ce;
ay0 = dm(i1,m0);
ar = ay0 - ax0, ay0 = dm(i1,m0);
ar = ay0 - ax1, my1 = ar;
mr = ar*my0(ss), my0 = my1;
mr = mr - mx0*my1(ss), mx0 = ar;
ar = pass mr2, ay0 = sr0;
if ne jump calc_Sx;
ar = ay0 - mr0, ay0 = sr1;
ar = ay0 - mr1 + C - 1, sr0 = ar;
calc_Sx: sr1 = ar;
none = pass ar;
if lt jump for_search;
call SM_off; /* отключить SM */
none = pass 0; // полигон найден.
rts;
/* "Не найдена карта" или "Полигон не найден" */
no_search:
call search_err_ar;
none = pass 1;
rts;
format_err:
ar = sooErr2; // "сбой формата полигонов"
search_err_ar:
dm(error_code) = ar;
search_err:
call SM_off; /* отключить SM */
none = pass -1;
rts;