В ней одним из участников (defunct) была приведена программа, в которой использовался циклический буфер для работы с последовательным портом МК AT90S2313. На взгляд автора программа написана достаточно грамотно, но как-то слишком размашисто, без учёта мизерности ресурсов данного МК. Предлагаю участникам поделиться примерами и приёмами использования циклического буфера в программных разработках.
Для затравки предлагаю следующие фрагменты.
А. Запись байта из регистра AL в циклический буфер
Код
mov xl,qhead ;указатель на запись
st x+,al ;запишем байт
cp xl,qend ;конец буфера?
brne .+2 ;нет, обходим
ldi xl,buffer ;да, установим начало
st x+,al ;запишем байт
cp xl,qend ;конец буфера?
brne .+2 ;нет, обходим
ldi xl,buffer ;да, установим начало
Б. Чтение байта из циклического буфера в регистр AL
Код
mov xl,qtail ;указатель на чтение
ld al,x+ ;прочитаем байт
cp xl,qend ;конец буфера?
brne .+2 ;нет, обходим
ldi xl,buffer ;да, установим начало
ld al,x+ ;прочитаем байт
cp xl,qend ;конец буфера?
brne .+2 ;нет, обходим
ldi xl,buffer ;да, установим начало
Если использовать буфер не произвольной длины, а кратный степени 2, и размещать его в памяти не произвольно, а начиная с адресов, кратных длине буфера, то размер кода можно немного сократить. Например.
В. Запись байта из регистра AL в циклический буфер длиной 32
Код
mov xl,qhead ;указатель на запись
st x+,al ;запишем байт
cbr xl,0xE0 ;держим указатель в предписанных рамках
st x+,al ;запишем байт
cbr xl,0xE0 ;держим указатель в предписанных рамках
Г. Чтение байта из циклического буфера длиной 32 в регистр AL
Код
mov xl,qtail ;указатель на чтение
ld al,x+ ;прочитаем байт
cbr xl,0xE0 ;держим указатель в предписанных рамках
ld al,x+ ;прочитаем байт
cbr xl,0xE0 ;держим указатель в предписанных рамках
Здесь qhead, qtail, qend – регистровые переменные, содержащие адреса-указатели ячеек в озу для записи, чтения и конца буфера соответственно.