199 lines
4.8 KiB
NASM
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
|
|
; @param r16 byte to write
|
|
; @param Y pointer to start of interface data
|
|
; @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
|
|
|
|
|
|
|