; Программа BUF_SRAM.asm
; обращение к внешней памяти, запись данных в буферы
; ========================
.INCLUDE "С: \Avr\Try\8515def.inc”
; Вставка содержимого файла 8515def.inc, находящегося
; в директории C: \Avr\Try в нашу программу
.DEF tmp=r16; Регистру r16 присвоить имя tmp
; (значение переменной tmp будет храниться в
; регистре общего назначения г16)
.DEF cnt = r17; Переменная cnt — счетчик цикла
RESET: IN tmp,MCUCR
; Ввод содержимого регистра MCUCR в регистр tmp
ORI tmp,(1<
; Установка бита SRE (режим работы с внешней памятью)
; Бит SRW не устанавливаем; (работа без дополнительного цикла ожидания)
OUT MCUCR,tmp
; Вывод содержимого регистра tmp в регистр MCUCR
;=========ЗАГРУЗКА ДАННЫХ В БУФЕРЫ
.EQU wrBuf1=$7FFD
; Адрес для записи данных в буфер 1 (по схеме — элемент DD6)
.EQU wrBuf2=$BFFE
; Адрес для записи данных в буфер 2 (DD7)
.EQU wrBuf3=$DFFF
; Адрес для записи данных в буфер 3 (DD8)
.EQU rdBuf1=$FFFD
; Адрес для считывания данных из ячейки, соотв. буферу 1
.EQU rdBuf2=$FFFE
; Адрес для считывания данных из ячейки, соотв. буферу 2
.EQU rdBuf3=$FFFF
; Адрес для считывания данных из ячейки, соотв. буферу 3
LDI tmp,$AA; Загрузка константы в tmp
STS wrBuf1, tmp
; Сохранение содержимого регистра tmp в буфере 1
LDI tmp, $55; Загрузка константы в tmp
STS wrBuf2, tmp
LDI tmp,$71; Загрузка константы в tmp
STS wrBuf3, tmp
;======ЧТЕНИЕ / ИЗМЕНЕНИЕ ДАННЫХ В БУФЕРАХ
LDS tmp, rdBuf1
; Передача данных из ячейки с адресом rdBuf1 в регистр tmp
ORI tmp, (1<<7)+(1<<6)+(1<<5)+(1<<4); Установка битов 4.. 7
STS wrBuf1, tmp
; Сохранение содержимого регистра tmp в буфере 1
LDS tmp, rdBuf2
ORI tmp, 0b11110000
; Установка тех же битов, что и для буфера 1,
; только константа представлена в двоичной форме,
; для обозначения двоичной константы 1111 0000; перед ней ставят символы "ноль” и “Ь”
STS wrBuf2, tmp
; Сохранение содержимого регистра tmp в буфере 2
LDS tmp, rdBuf3
ANDI tmp, 0b11110000; сброс тех же битов
STS wrBuf3, tmp
; Сохранение содержимого регистра tmp в буфере 2
; ===== ЗАГРУЗКА В ПАМЯТЬ ПЕРВОГО МАССИВА
.EQU ArSize =10; Размеры массивов
.EQU aArBgn1 =$Е060
: Используем константу аА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:)