; Программа 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
; Загрузка константы в tmpSTS wrBuf1, tmp
; Сохранение содержимого регистра tmp в буфере 1
LDI tmp, $55
; Загрузка константы в tmpSTS wrBuf2, tmp
LDI tmp,$71
; Загрузка константы в tmpSTS wrBuf3, tmp
;======ЧТЕНИЕ / ИЗМЕНЕНИЕ ДАННЫХ В БУФЕРАХ
LDS tmp, rdBuf1
; Передача данных из ячейки с адресом rdBuf1 в регистр tmp
ORI tmp, (1<<7)+(1<<6)+(1<<5)+(1<<4);
Установка битов 4.. 7STS 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;
Загрузка константы в tmpARR1: 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;
Загрузка константы в tmpARR2: 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:)