: Используем константу аАrВgn как адрес начальной ячейки для хранения массива 1
LDI ZL,low(aArBgn1)
LDI ZH,high(aArBgn1)
; Загрузка в регистр Z адреса начала массива 1
LDI cnt,ArSize; Загрузка в cnt размера массива
LDI tmp,$FF; Загрузка константы в tmp
ARR1: ST Z+, tmp;
; Запись содержимого регистра tmp в ячейку памяти,
; адрес которой — в регистре Z,
; с последующим увеличением на 1 адреса в регистре Z
; В первом цикле содержимое tmp запишется
; по адресу aArBgn1 ($Е060), во втором цикле —
; по адресу aArBgn1+1 ($Е061) и т. д.
INC tmp; Увеличить содержимое tmp на единицу
DEC cnt; Уменьшить содержимое счетчика циклов на единицу
BRNE ARR1
; Если бит (флаг) Z в регистре состояния процессора SREG
; не установлен — перейти на команду с меткой ARR1:
; ======ЗАГРУЗКА В ПАМЯТЬ ВТОРОГО МАССИВА
.EQU аАгВgn2 =$FFFC
; Используем константу аАгВgn2 как адрес последней ячейки
; для хранения массива 2
LDI ZL,lоw(аАгВgn2+1)
LDI ZH,high(aArBgn2+1)
; Загрузка в двухбайтный регистр Z адреса конечного
; элемента массива 2, увеличенного на единицу
LDI cot,ArSize; Загрузка в cnt размера массива
LDI tmp,$03; Загрузка константы в tmp
ARR2: ST -Z, tmp;
; Сначала уменьшается на единицу адрес,
; хранящийся в регистре Z (поэтому в Z загружался
; адрес, увеличенный на единицу), затем по новому
; адресу запишется содержимое регистра tmp
; В первом цикле содержимое tmp запишется; по адресу (аАrВgn2+1)-1, то есть, по адресу аАrВgn2
; во втором цикле — по адресу аАrВgn2-1, и т. д.
DEC tmp; Уменьшить содержимое tmp на единицу
DEC cnt; Уменьшить содержимое счетчика циклов на единицу
BRNE ARR2
; Если бит (флаг) Z в регистре состояния процессора SREG
; не установлен — перейти на команду с меткой ARR2:
STOP: RJMP STOP; Зацикливание программы
; (перейти на команду с меткой STOP:)
Ассемблируем программу (клавиша F7). При обнаружении ошибок проверьте правильность набора программы в строках, содержащих ошибки — номера строк с ошибками и комментарии к этим ошибкам выводятся в окне Project output, появляющемся после ассемблирования.
Директивой. INCLUDE в программу вставлен файл 8515def.inc, использовавшийся в предыдущем примере и находящийся с проектом в разных директориях. Поэтому ассемблирование пройдет нормально, если файл c: \avr\try\8515def.inc еще существует.
Начнем отладку программы, нажав клавишу F11. В появившемся окне Simulator options выберем микроконтроллер: Device | AT90S8515 with External SRAM.
Для контроля отладки вызовем окна переменных, процессора и памяти: View | Watches, View | Processor и View | New Memoiy view.
В окно Watches введем переменные tmp и cnt.
Первые три команды были отлажены в проекте Memory.apr, поэтому переместим курсор на первую команду ЗАГРУЗКИ ДАННЫХ В БУФЕР: LDItmp,$AA и нажмем Ctrl+F10.
Нажмем F11 — в переменную tmp (смотрите в окне Watch) загрузилась константа $АА.
В окне просмотра памяти Memoiy перейдем на адрес S7FFD (адрес wrBuf1), для этого в окне ввода, расположенном в первой строке окна справа, заменим 0x0060 на 0x7FFD. Жмем F11 — в ячейке с адресом 7FFD появились данные АА.
Таким же способом переходим к ячейке SBFFE (wrBu£2), дважды жмем F11, проверяем состояние ячейки, оно равно 55.
Повторяем действия для ячейки SDFFF — ее состояние станет равным 71.
Теперь указатель выполнения команд находится на первой команде ЧТЕНИЯ/ИЗМЕНЕНИЯ ДАННЫХ В БУФЕРАХ:
LDS tmp, rdBuf1
К сожалению, отладчик не позволит правильно отобразить процессы, происходящие в нашей схеме из-за того, что симулятор предполагает подключение к микроконтроллеру лишь внешней памяти размером 65536 Кбайт, поэтому параллельная запись данных в буфер и в соответствующую ячейку памяти никак не отражается симулятором.
Возможный выход — до выполнения команды LDS вручную загрузить в ячейки с адресами rdBuf1, rdBuf2 и rdBuf3 данные, которые должны были в них загрузиться при записи в буферы 1…3 ($АА, $55 и $71 соответственно).