Пр о ц е с с о р TMS 3 2 0C4 x
64
порта (AR0), памяти для ввода данных (AR1) и регистра управления порта
(AR2), которые загружаются из секции .data с использованием прямой адреса-
ции. После этого разрешаются прерывания установкой соответствующих битов
регистров IIE и ST.
Обработчик прерывания сохраняет в стеке используемые регистры: RS,
RE, RC - изменяются командой RPTS, R10 - служит для промежуточного хра-
нения данных обмена с коммуникационным портом. Сохранение регистра R10
выполняется двумя командами, запоминающими в стеке сначала младшие 32
разряда регистра (команда PUSH), потом старшие 32 разряда (команда PUSHF).
Это делается из-за того, что регистр R10 может использоваться основной про-
граммой для хранения числа с ПТ, занимающего все 40 бит регистра. Регистры
AR0-AR2 хранят параметры передачи данных, поэтому в обработчике преры-
ваний не сохраняются, а основной программой не должны использоваться по
другому назначению. После сохранения регистров в стеке данные между пор-
том и памятью передаются в цикле повтора параллельной команды, далее вос-
станавливается содержимое регистров из стека (в порядке, обратном записи) и
осуществляет возврат из прерывания.
Пример ввода с коммуникационного порта по прерываниям ICFULL
.data
P0_CTR
.word 00100040h
; адрес регистра управления порта
P0_INP
.word 00100041h
; адрес входного FIFO порта
IRAM
.word 002FFC00h
; адрес буфера памяти для ввода
VECTORS .word 002FF800h
; адрес таблицы векторов прерываний
.text
.
; инициализация
LDPK
P0_CTR
; установка регистра страниц
; установка указателя таблицы векторов прерываний
LDI
@VECTORS, R9
LDPE
R9, IVTP
LDA
@P0_CTR, AR2
; адрес регистра управления порта
LDA
@P0_INP, AR0
; адрес входного буфера порта
LDA
@IRAM, AR1
; адрес памяти
AND3
0F7h,
∗
AR2, R9
; разрешение работы входного порта
STI
R9,
∗
AR2
;
OR
02h, IIE
; разрешение прерываний в IIE
OR
2000h, ST
; разрешений прерываний процессора
.
.
ICFULL0
;
обработчик прерывания
PUSH
ST
; сохранение регистров в стеке
PUSH
RS
;
PUSH
RE
; регистры AR0-AR2 не сохраняются
PUSH
RC
;
PUSH
R0
; сохранение регистра R0
PUSHF
R0
;
LDI
∗
AR0, R0
; чтение 1го слова из буфера порта
RPTS
6
;