1.3. Требования по оформлению программ
Для организации связи микроконтроллера с ПЭВМ в ПЗУ прошита программа "Монитор", которая позволяет читать и записывать информацию из(в) контроллера, запускать программу пользователя и выполнять ее в пошаговом режиме и с точками останова. В связи с этим, накладываются некоторые ограничения на использование ресурсов микроконтроллера: файлового регистра и внешнего ОЗУ, которые будут описаны ниже.
1.3.1. Регистровый файл
Микроконтроллер 8XC196KC имеет регистровый файл объёмом 488 байт, размещенный по адресам 1Ah-1FFh. "Монитор" использует для своей работы 6 байт файлового регистра с младшими адресами (1Ah-1Fh). Использование их программой пользователя может привести к непредсказуемым последствиям.
1.3.2. Стек
"Монитор" инициализирует стек с адреса 200h и помещает в него адрес возврата из программы пользователя (2222h). При выполнении программы пользователя в пошаговом режиме либо с точками останова, "Монитор" использует текущее состояние стека, поэтому, чтобы избежать потери информации, необходимо резервировать под стек на 4 байта больше требуемого.
1.3.3. Точка возврата
Как уже было сказано, перед запуском программы пользователя "Монитор" инициализирует стек с адреса 200h и помещает в него адрес возврата - 2222h. Таким образом, чтобы завершить программу необходимо выполнить команду RET. В случае, если пользователь использует свой стек, программа может быть завершена двумя способами:
1) поместить в стек значение 2222h и выполнить команду RET.
2) выполнить команду дальнего перехода LJMP 2222h
1.3.4. Внешнее ОЗУ
Для загрузки и выполнения программ пользователя микроконтроллер должен иметь внешнее ОЗУ. Внешнее ОЗУ расположено по адресам 8000h-FFFFh.
1.3.4.1. Область данных "Монитора"
Область памяти внешнего ОЗУ с адресами 8060h-809Fh зарезервирована под "Монитор". Она необходима для сохранения состояния регистров специального назначения и программы пользователя.
1.3.4.2. Вектора прерываний
Для того чтобы пользователь мог использовать систему прерываний, все ее вектора (за исключением TRAP-прерывания, адрес вектора 2010h) вынесены в область внешнего ОЗУ. Вектора прерываний размещаются с такими же смещениями относительно базового адреса (8000h), как и в ПЗУ (базовый адрес 2000h).
1.3.4.3. Размещение информации пользователя
Для размещения программ и данных доступно все адресное пространство ОЗУ, за исключением тех областей, которые были описаны выше (адреса 8000h-809Fh). Рекомендуется начинать программу с адреса 8100 h.
1.4. Пример программы
$nolist ;Подавление распечатки
$include (8096.inc) ;Описание идентификаторов специальных ;регистров
$list ;Возобновление распечатки
;*********************************************************
rseg at (30h) ; Начальный адпес размещения сегмента ;регистров
Pattern_ptr: dsw 1 ;Выделение слова для указателя на таблицу
Data: dsb 1 ;Выделение байта данных
n_Loop: dsb 1 ;Выделение байта для счетчика циклов
;*********************************************************
cseg at 8100h ; Сегмент кода программы
сlr Pattern_ptr ;Инициализация указателя таблицы
clrb n_Loop ; Инициализация счетчика циклов
loop: ldb ioport1, PATTERN_TABLE[Pattern_ptr]
jbc ios1, 5, $ ; Ожидание выполнения
; Выбираем байт из таблицы
ldb Data, PATTERN_TABLE[Pattern_ptr]
scall Serial_Out ;Подпрограмма передачи данных по последовательному каналу
; Вычисляем указатель на таблицу
inc Pattern_ptr
and Pattern_ptr, #07h
djnz n_Loop, loop
ret ;
;***********************************************************
; Таблица состояний выводимых данных на порт 1 и
; соответственно на восемь светодиодов
;************************************************************
PATTERN_TABLE:
dcb 00000000b
dcb 10000001b
dcb 11000011b
dcb 11100111b
dcb 11111111b
dcb 11100111b
dcb 11000011b
dcb 10000001b
;*********************************************************
$nolist
$include (work.inc)
$list
END ;Конец программы