[an error occurred while processing this directive]
|
Init_UART_DMA:
ax1 = IMASK;
IMASK = 0;
IOPG = UART_Controller_Page;
//================ Инициализация UART ================================================
ar = 0x80; io(LCR) = ar; // переключаем в режим записи делителя скорости
ar = 0xF0; io(DLL) = ar; // младшая часть делителя 19200
ar = 0x00; io(DLH) = ar; // старшая часть делителя
ar = 0x07; io(LCR) = ar; // переключаем в режим записи конфигурации
// 8 бит данных 2 стопа
//================ Инициализация DMA TX ===============================================
ar = 0x8005; dm(HEAD_TX) = ar; // Конфигурация DMA порта
ar = 0x0000; dm(HEAD_TX + 1) = ar; // Стартовая страница
ar = UART_Tx_buf; dm(HEAD_TX + 2) = ar; // Стартовый адрес буфера
ar = length(UART_Tx_buf); dm(HEAD_TX + 3) = ar; // Счетчик слов
ar = 0x0000; dm(HEAD_TX + 4) = ar; // Останов в конце передачи
/* ar = HEAD_TX; io(UARDT_CP) = ar;
ar = 0x0001; io(UARDT_CPR) = ar;
ar = 0x8001; io(UARDT_CFG) = ar;
*/
ar = IMASK;
ar = setbit 12 of ax1;
ax1 = ar; // разрешить прерывание передачи
//================ Инициализация DMA RX ===============================================
ar = 0x8007; dm(HEAD_RX) = ar; // Конфигурация DMA порта
ar = 0x0000; dm(HEAD_RX + 1) = ar; // Стартовая страница
ar = UART_Rx_buf; dm(HEAD_RX + 2) = ar; // Стартовый адрес буфера
ar = length(UART_Rx_buf); dm(HEAD_RX + 3) = ar; // Счетчик слов
ar = 0x0000; dm(HEAD_RX + 4) = ar; // Останов в конце передачи
ar = HEAD_RX; io(UARDR_CP) = ar;
ar = 0x0001; io(UARDR_CPR) = ar;
ar = 0x8007; io(UARDR_CFG) = ar;
ar = IMASK;
ar = setbit 11 of ax1;
IMASK = ar; // разрешить прерывание передачи
/*
ar = 0x0010; io(UARDR_CFG) = ar; // DMA - автобуферизация
ar = 0x0000; io(UARDR_SRP) = ar; // внутреннее ОЗУ
ar = UART_Rx_buf; io(UARDR_SRA) = ar; // указатель начала буфера
ar = length(UART_Rx_buf);
io(UARDR_CNT) = ax0; // счетчик передаваемых слов
ar = 0x0017; io(UARDR_CFG) = ar; // прерывание по окончанию обмена старт
ar = IMASK;
ar = setbit 11 of ar;
IMASK = ar; // разрешить прерывание приема
*/
rts;
Send_Reg: // подпрограма передачи значения 16 разрядного регистра по RS
// значение в SI;
dm(Tx_buf) = si;
State_1:
ax0 = dm(UART_Tx_bisy);
ar = pass ax0;
if ne jump State_1;
si = dm(Tx_buf);
i0 = UART_Tx_buf;
l0 = 0;
m0 = 1;
ar = 0x0D; // Hex код "Возврат каретки"
dm(i0,m0) = ar;
ar = 0x42; // Hex код "B"
dm(i0,m0) = ar;
ar = 0x23; // Hex код "#"
dm(i0,m0) = ar;
ay0 = 0x0030;
cntr = 16;
do convert_bin until ce;
sr = lshift si by 1 (lo);
si = sr0;
ar = sr1 + ay0;
convert_bin: dm(i0,m0) = ar;
IOPG = UART_Controller_Page;
ar = 19; dm(HEAD_TX + 3) = ar; // Счетчик слов
ar = 0x8005; dm(HEAD_TX) = ar; // Конфигурация DMA порта
ar = HEAD_TX; io(UARDT_CP) = ar;
ar = 0x0001; io(UARDT_CPR) = ar;
ar = 0x8005; io(UARDT_CFG) = ar;
ar = 0x0001;
dm(UART_Tx_bisy) = ar;
rts;
Send_RegX:
dm(Tx_buf) = si;
State_2:
ax0 = dm(UART_Tx_bisy);
ar = pass ax0;
if ne jump State_2;
si = dm(Tx_buf);
i0 = UART_Tx_buf;
l0 = 0;
m0 = 1;
ar = 0x0D; // Hex код "Возврат каретки"
dm(i0,m0) = ar;
ar = 0x30; // Hex код "0"
dm(i0,m0) = ar;
ar = 0x78; // Hex код "x"
dm(i0,m0) = ar;
ay0 = 9;
ax0 = 0x0030;
ax1 = 0x0037;
cntr = 4;
do convert_hex until ce;
sr = lshift si by 4 (lo);
si = sr0;
ar = sr1 - ay0;
if gt ar = pass ax1;
if le ar = pass ax0;
ar = ar + sr1;
convert_hex: dm(i0,m0) = ar;
IOPG = UART_Controller_Page;
ar = 7; dm(HEAD_TX + 3) = ar; // Счетчик слов
ar = 0x8005; dm(HEAD_TX) = ar; // Конфигурация DMA порта
ar = HEAD_TX; io(UARDT_CP) = ar;
ar = 0x0001; io(UARDT_CPR) = ar;
ar = 0x8005; io(UARDT_CFG) = ar;
ar = 0x0001;
dm(UART_Tx_bisy) = ar;
rts;
E-mail: info@telesys.ru