{ ---------------------------------------------------------------------	}
{ В данном файле находятся функции запуска синхронизации, а именно:		}
{ - цифровой синхронизации старта или покадровой                    		}
{ - аналоговой синхронизации по уровню или переходу							}
{ ---------------------------------------------------------------------	}

{ *********************************************************************	}
{ Установка типа синхронизации														}
{ *********************************************************************	}
Synchronization:
{ проверим тип синхронизации для ввода данных									}
	GetPm(AR, SynchroTypeAddr); 
	AR = AR - 0x1;
	IF EQ JUMP TtlSynchroStart;	{ если 1, то цифровая синхронизация 	}
											{						старта ввода данных	}
{ завершим c ошибкой выполнение текущей команды									}
	JUMP ErrorEndOfCommand;			{ выйдем с ошибкой в команде				}

{ остальные типы синхронизации пока не реализованны	:(((					}
/*	AR = AR - 0x1;
	IF EQ JUMP TtlSynchroKadr;*/	{ если 2, то покадровая        			}
											{ 					цифровая синхронизация	}
/*	AR = AR - 0x1;
	IF EQ JUMP AdcSynchroStart;*/	{ если 3, то синхронизация 				}
											{								по каналу АЦП	}
/*	JUMP ErrorEndOfCommand;*/		{ выйдем с ошибкой в команде				}

{ *********************************************************************	}
{ цифровая синхронизация старта														}
{ *********************************************************************	}
TtlSynchroStart:
{ для внутренних тактовых импульсов установим требуемую частоту ввода 	}
	GetPm(AR, InputRateAddr);
	DM(Sport1_Sclkdiv) = AR;		{ 0x3FF5 - Serial Clock Divide Modulus	}
{ установка источника тактовых импульсов											}	
	CALL SetInputClockSource;
	
{ сбросим все запросы на прерывания кроме SPORT0 Transmit (вывод)			}
	IFC = 0xBF; NOP;

{ разрешим прерывания IRQE(команда) и IRQ1(внешняя синхронизация)			}
	GetPm(AR, ImaskValueAddr);
	AR = SETBIT 2 OF AR;			{ разрешим прерывания IRQ1	(внут.синхр.)	}
	PutPm(AR, ImaskValueAddr);
	IMASK = AR; NOP;

{ завершим выполнение текущей команды												}
	JUMP EndOfCommand;

{ *********************************************************************	}
{ покадровая цифровая синхронизация - пока не реализована :(((				}
{ *********************************************************************	}
TtlSynchroKadr:
{ завершим выполнение текущей команды												}
	JUMP ErrorEndOfCommand;

{ *********************************************************************	}
{ синхронизация по аналоговому каналу АЦП - пока не реализована :(((		}
{ *********************************************************************	}
AdcSynchroStart:
{ завершим выполнение текущей команды												}
	JUMP ErrorEndOfCommand;

{ *********************************************************************	}
{ Записать в PM по заданному адресу команду JUMP xxx			    			}
{ Вход:                                                     	  			}
{      I4 - адрес, куда записывается команда             					}
{      AR - адрес перехода xxx														}
{ *********************************************************************	}
ModifyJump:
{ запрещаем все прерывания, чтобы в возможных обработчиках прерываний	}
{ не могло поменяться содержимое регистра PX										}
	DIS INTS;

{ Формируем код команды 																}
	SR1 = 0x0018;							{ 00000000 00011000 						}
	SR0 = 0x000F;							{ 00000000 00001111 						}
	SR = SR OR LSHIFT AR BY 4(LO);
	PX = SR0;								{ Получили 8 младших бит 				}
	AR = SR1;
	SR = LSHIFT SR0 BY -8(LO);
	SR = SR OR LSHIFT AR BY -8(HI);	{ Получили старшие 16 бит 				}
	M7 = 0x0;
	PM(I4,M4) = SR0;						{ Сохранили все 24-битовое слово 	}

{ разрешаем все прерывания																}
	ENA INTS;

{ спокойно выходим из функции															}
	RTS;

{ *********************************************************************	}
{ Записать в PM по заданному адресу команду CALL xxx			    			}
{ Вход:                                                     	  			}
{      I4 - адрес, куда записывается команда             					}
{      AR - адрес перехода xxx														}
{ *********************************************************************	}
ModifyCall:
{ запрещаем все прерывания, чтобы в возможных обработчиках прерываний	}
{ не могло поменяться содержимое регистра PX										}
	DIS INTS;

{ Формируем код команды 																}
	SR1 = 0x001C;							{ 00000000 00011100 						}
	SR0 = 0x000F;							{ 00000000 00001111 						}
	SR = SR OR LSHIFT AR BY 4(LO);
	PX = SR0;								{ Получили 8 младших бит 				}
	AR = SR1;
	SR = LSHIFT SR0 BY -8(LO);
	SR = SR OR LSHIFT AR BY -8(HI);	{ Получили старшие 16 бит 				}
	M4 = 0x0;
	PM(I4,M4) = SR0;						{ Сохранили все 24-битовое слово 	}

{ разрешаем все прерывания																}
	ENA INTS;

{ спокойно выходим из функции															}
	RTS;
