{ ---------------------------------------------------------------------	}
{ Функции для работы с выводом данных на ЦАП										}
{ ---------------------------------------------------------------------	}

{ *********************************************************************	}
{ команда запуска вывода данных на ЦАП												}
{ *********************************************************************	}
Start_Write_cmd:
{ SPORT0 - disable, SPORT1 - disable, SPORT1 - FI, FO, IRQ0, IRQ1, SCLK1}
	AR = 0x0;
	DM(Sys_Ctrl_Reg) = AR;			{ 0x3FFF - System Control Register 		}

{ проинициализируем необходимые указатели ЦАП									}
	CALL InitOutputPointers;

{ установим требуемую частоту вывода отсчетов на ЦАП							}
	GetPm(AR, OutputRateAddr);
	DM(Sport0_Rfsdiv) = AR; { 0x3FF4 - Receive Frame Sync Divide Modulus }

{ разрешаем автобуфферизацию для передачи данных по SPORT0					}
{ буфер данных для ЦАП: I1, M1, L1								 					}
	AR = 0x4282;					{ 0100 0010 1000 0010							}
	DM(Sport0_Autobuf_Ctrl) = AR;

{ установим флаг работы ЦАП															}
	PutValPm(AR, 0x1, OutputEnableAddr);

{ высветим светодиодик																	}
/*	AR=DM(Prog_Flag_Data); AR= CLRBIT 2 OF AR; DM(Prog_Flag_Data)=AR;*/

{ первый отсчёт для вывода на ЦАП													}
	AR = DM(I1, M1); TX0 = AR;

{ SPORT0 - enable, SPORT1 - disable, SPORT1 - FI, FO, IRQ0, IRQ1, SCLK1	}
	AR = 0x1000;					 	{ 0001 0000 0000 0000 						}
	DM(Sys_Ctrl_Reg) = AR;      	{ 0x3FFF - System Control Register 		}

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

{ *********************************************************************	}
{ команда останова ЦАП																	}
{ *********************************************************************	}
Stop_Write_cmd:
{ SPORT0 - disable, SPORT1 - disable, SPORT1 - FI, FO, IRQ0, IRQ1, SCLK1}
	AR = 0x0;
	DM(Sys_Ctrl_Reg)=AR;				{ 0x3FFF - System Control Register 		}

{ запрещаем автобуфферизацию SPORT0													}
	AR = 0x4000;						{ 0100 0000 0000 0000						}
	DM(Sport0_Autobuf_Ctrl)=AR;

{ установим требуемую частоту вывода отсчетов на ЦАП							}
	GetPm(AR, OutputRateAddr);
	DM(Sport0_Rfsdiv) = AR; { 0x3FF4 - Receive Frame Sync Divide Modulus }

{ сбросим флаг работы ЦАП																}
	PutValPm(AR, 0x0, OutputEnableAddr);

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

{ *********************************************************************	}
{ Команда выдачи однократного отсчета на ЦАП (если возможно)				}
{ *********************************************************************	}
Write_Sample_cmd:
{ а работа ЦАП разрешена?																}
	GetPm(AR, OutputEnableAddr); NONE = PASS AR;
	IF NE JUMP EndOfCommand; 	{ никакой выдачи на ЦАП - просто выйдем	}

{ SPORT0 - disable, SPORT1 - disable, SPORT1 - FI, FO, IRQ0, IRQ1, SCLK1}
	AR = 0x0;
	DM(Sys_Ctrl_Reg) = AR;			{ 0x3FFF - System Control Register 		}

{ запрещаем автобуфферизацию SPORT0													}
	AR = 0x4000;						{ 0100 0000 0000 0000						}
	DM(Sport0_Autobuf_Ctrl) = AR;

{ установим максимальную частоту вывода отсчетов на ЦАП (100 кГц)			}
	AR = 39;
	DM(Sport0_Rfsdiv) = AR; { 0x3FF4 - Receive Frame Sync Divide Modulus }

{ получим однократный отсчет для ЦАП												}
	GetPm(AR, OutputSampleAddr); TX0 = AR;

{ сбросим флажок завершения однократной выдачи отсчета на ЦАП				}
	SB = 0x0;

{ очистим все запросы на прерывания, кроме IRQE(ввод)							}
	IFC = 0xEF; NOP;

{ дополнительно размаскируем прерывания SPORT0 Transmit(ЦАП)				}
	GetPm(AR, ImaskValueAddr);
	AR = SETBIT 6 OF AR;				{ бит прерывания SPORT0 Transmit(ЦАП)	}
	PutPm(AR, ImaskValueAddr);
	IMASK = AR; NOP;

{ SPORT0 - enable, SPORT1 - disable, SPORT1 - FI, FO, IRQ0, IRQ1, SCLK1	}
	AR = 0x1000;					 	{ 0001 0000 0000 0000 						}
	DM(Sys_Ctrl_Reg) = AR;      	{ 0x3FFF - System Control Register 		}

{ выходим из команды, временно отложив её выполнение							}
	RTS;

{ *********************************************************************	}
{	Установка указателей для ЦАП														}
{ *********************************************************************	}
InitOutputPointers:
{ установим требуемые размеры FIFO буфера ЦАП									}
	CALL CheckOutputFifoLimits;

{ половина длины FIFO буфера ЦАП														}
	GetPm(AR, CurOutputFifoLengthAddr);
	SR = LSHIFT AR BY -1 (LO);
	PutPm(SR0, OutputFifoLengthOver2Addr);

{ Set Output Fifo Parameters (указатель на 'голову' FIFO ЦАП)				}
	GetPm(AR, OutputFifoBaseAddressAddr);
	I1 = AR;
	M1 = 0x1;
	GetPm(AR, CurOutputFifoLengthAddr);
	L1 = AR;

{ указатель на 'хвост' FIFO буфера ЦАП												}
	I0 = I1;
{ в M0 должна быть половина длины FIFO буфера ЦАП								}
	GetPm(AR, OutputFifoLengthOver2Addr);
	M0 = AR;
	L0 = L1;

{ сбросим флажок завершения однократной выдачи отсчета на ЦАП				}
	SB = 0x0;

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