diff --git a/avr/common/0BUILD b/avr/common/0BUILD index 9efb948..bcc931c 100644 --- a/avr/common/0BUILD +++ b/avr/common/0BUILD @@ -4,6 +4,7 @@ crc8.asm + m_ringbuffer.asm ringbuffer.asm shared.asm utils.asm diff --git a/avr/common/m_ringbuffer.asm b/avr/common/m_ringbuffer.asm new file mode 100644 index 0000000..d189f9e --- /dev/null +++ b/avr/common/m_ringbuffer.asm @@ -0,0 +1,114 @@ +; *************************************************************************** +; copyright : (C) 2025 by Martin Preuss +; email : martin@libchipcard.de +; +; *************************************************************************** +; * This file is part of the project "AqHome". * +; * Please see toplevel file COPYING of that project for license details. * +; *************************************************************************** + + + +; --------------------------------------------------------------------------- +; @macro m_ringbuffer_y_writebyte +; +; @param R16 byte to write +; @param Y base address (for "LDD Y+nn" and "STD Y+nn") +; @param %0 constant maxBytes +; @param %1 offset to Y to access usedBytes variable (for "LDD Y+nn" and "STD Y+nn") +; @param %2 offset to Y to access readPos variable +; @param %3 offset to Y to access writePos variable +; @param %4 offset to Y to access buffer +; @return CFLAG set if okay, cleared on error (i.e. buffer full) +; @clobbers R17, X + +.macro m_ringbuffer_y_writebyte + ldd r17, Y+@1 ; usedBytes + cpi r17, @0 ; maxBytes + brcc l_end + inc r17 + std Y+@1, r17 ; usedBytes + ldd r17, Y+@3 ; writePos + mov xl, yl + mov xh, yh + adiw xh:xl, @4 + add xl, r17 + adc xh, r17 + sub xh, r17 + st X, r16 + inc r17 + cpi r17, @0 + brcs l_store + clr r17 +l_store: + std Y+@3, r17 ; writePos + sec +l_end: +.endmacro +; @end + + + +; --------------------------------------------------------------------------- +; @macro m_ringbuffer_y_readbyte +; +; @param Y base address (for "LDD Y+nn" and "STD Y+nn") +; @param %0 constant maxBytes +; @param %1 offset to Y to access usedBytes variable (for "LDD Y+nn" and "STD Y+nn") +; @param %2 offset to Y to access readPos variable +; @param %3 offset to Y to access writePos variable +; @param %4 offset to Y to access buffer +; @return CFLAG set if okay, cleared on error (i.e. buffer full) +; @return R16 byte read +; @clobbers R17, X + +.macro m_ringbuffer_y_readbyte + ldd r17, Y+@1 ; usedBytes + tst r17 + clc + breq l_end + dec r17 + std Y+@1, r17 ; usedBytes + ldd r17, Y+@2 ; readPos + mov xl, yl + mov xh, yh + adiw xh:xl, @4 + add xl, r17 + adc xh, r17 + sub xh, r17 + ld r16, X + inc r17 + cpi r17, @0 + brcs l_store + clr r17 +l_store: + std Y+@2, r17 ; readPos + sec +l_end: +.endmacro + + + +; --------------------------------------------------------------------------- +; @macro m_ringbuffer_y_reset +; +; @param Y base address (for "LDD Y+nn" and "STD Y+nn") +; @param %0 constant maxBytes +; @param %1 offset to Y to access usedBytes variable (for "LDD Y+nn" and "STD Y+nn") +; @param %2 offset to Y to access readPos variable +; @param %3 offset to Y to access writePos variable +; @param %4 offset to Y to access buffer +; @clobbers R17 + +.macro m_ringbuffer_y_reset + clr r17 + std Y+@1, r17 ; usedBytes + std Y+@2, r17 ; readPos + std Y+@3, r17 ; writePos +l_end: +.endmacro +; @end + + + +