Files
aqhomecontrol/avr/common/ringbuffer_y.asm
2025-08-03 00:54:45 +02:00

199 lines
4.8 KiB
NASM

; ***************************************************************************
; 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. *
; ***************************************************************************
.equ RINGBUFFERY_OFFS_MAXSIZE = 0
.equ RINGBUFFERY_OFFS_USED = 1
.equ RINGBUFFERY_OFFS_READPOS = 2
.equ RINGBUFFERY_OFFS_WRITEPOS = 3
.equ RINGBUFFERY_OFFS_DATA = 4
.equ RINGBUFFERY_SIZE = 4
; ---------------------------------------------------------------------------
; @routine RingBufferY_Init
;
; @param R16 size of ringbuffer
; @param Y base address of ringbuffer struct
; @return CFLAG set if okay, cleared on error (i.e. buffer full)
; @clobbers R17
RingBufferY_Init:
std Y+RINGBUFFERY_OFFS_MAXSIZE, r16
rjmp RingBufferY_Reset
; @end
; ---------------------------------------------------------------------------
; @routine RingBufferY_WriteByte
;
; @param R16 byte to write
; @param Y base address of ringbuffer struct
; @return CFLAG set if okay, cleared on error (i.e. buffer full)
; @clobbers R17, R18, X
RingBufferY_WriteByte:
m_ringbuffer_y_writebyte \
RINGBUFFERY_OFFS_MAXSIZE, \
RINGBUFFERY_OFFS_USED, \
RINGBUFFERY_OFFS_READPOS, \
RINGBUFFERY_OFFS_WRITEPOS, \
RINGBUFFERY_OFFS_DATA
ret
; @end
; ---------------------------------------------------------------------------
; @routine RingBufferY_ReadByte
;
; @param Y base address of ringbuffer struct
; @return CFLAG set if okay, cleared on error (i.e. buffer empty)
; @return R16 byte read
; @clobbers R17, R18, X
RingBufferY_ReadByte:
m_ringbuffer_y_readbyte \
RINGBUFFERY_OFFS_MAXSIZE, \
RINGBUFFERY_OFFS_USED, \
RINGBUFFERY_OFFS_READPOS, \
RINGBUFFERY_OFFS_WRITEPOS, \
RINGBUFFERY_OFFS_DATA
ret
; @end
; ---------------------------------------------------------------------------
; @routine RingBufferY_PeekByte
;
; @param Y base address (for "LDD Y+nn" and "STD Y+nn")
; @param %0 offset to Y to access maxBytes variable (for "LDD Y+nn" and "STD Y+nn")
; @param %1 offset to Y to access usedBytes
; @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 empty)
; @return R16 byte read
; @clobbers R17, R18, X
RingBufferY_PeekByte:
m_ringbuffer_y_peekbyte \
RINGBUFFERY_OFFS_MAXSIZE, \
RINGBUFFERY_OFFS_USED, \
RINGBUFFERY_OFFS_READPOS, \
RINGBUFFERY_OFFS_WRITEPOS, \
RINGBUFFERY_OFFS_DATA
ret
; @end
; ---------------------------------------------------------------------------
; @macro m_ringbuffer_y_reset
;
; @param Y base address of ringbuffer struct
; @clobbers R17
RingBufferY_Reset:
m_ringbuffer_y_reset \
RINGBUFFERY_OFFS_MAXSIZE, \
RINGBUFFERY_OFFS_USED, \
RINGBUFFERY_OFFS_READPOS, \
RINGBUFFERY_OFFS_WRITEPOS, \
RINGBUFFERY_OFFS_DATA
ret
; @end
; ---------------------------------------------------------------------------
; @routine RingBufferY_ReadByteGuarded
;
; @return CFLAG on success, cleared on error
; @return r16 byte read
; @param Y base address of ringbuffer struct
; @clobbers R17, R18, X
RingBufferY_ReadByteGuarded:
push r15
in r15, SREG
cli
rcall RingBufferY_ReadByte ; R17, R18, X
brcc RingBufferY_ReadByteGuarded_error
out SREG, r15
pop r15
sec
ret
RingBufferY_ReadByteGuarded_error:
out SREG, r15
pop r15
clc
ret
; @end
; ---------------------------------------------------------------------------
; @routine RingBufferY_PeekByteGuarded
;
; @return CFLAG on success, cleared on error
; @param r16 byte to write
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
RingBufferY_PeekByteGuarded:
push r15
in r15, SREG
cli
rcall RingBufferY_PeekByte ; R17, R18, X
brcc RingBufferY_PeekByteGuarded_error
out SREG, r15
pop r15
sec
ret
RingBufferY_PeekByteGuarded_error:
out SREG, r15
pop r15
clc
ret
; @end
; ---------------------------------------------------------------------------
; @routine RingBufferY_WriteByteGuarded
;
; @return CFLAG on success, cleared on error
; @param r16 byte to write
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
RingBufferY_WriteByteGuarded:
push r15
in r15, SREG
cli
rcall RingBufferY_WriteByte ; R17, R18, X
brcc RingBufferY_WriteByteGuarded_error
out SREG, r15
pop r15
sec
ret
RingBufferY_WriteByteGuarded_error:
out SREG, r15
pop r15
clc
ret
; @end