Files
aqhomecontrol/avr/modules/network/iface.asm
2025-03-21 20:55:50 +01:00

185 lines
4.5 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. *
; ***************************************************************************
.cseg
; ---------------------------------------------------------------------------
; @routine NET_Interface_Init @global
;
; @param Y pointer to interface data in SRAM
; @clobbers R16, R17, X
NET_Interface_Init:
mov xl, yl
mov xh, yh
ldi r17, NET_IFACE_SIZE
clr r16
rcall Utils_FillSram ; (R17, X)
push yl
push yh
adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF
ldi r16, NET_IFACE_OUTMSGBUF_SIZE
rcall RingBufferY_Init
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine NET_Interface_AddOutgoingMsgNum @global
;
; @return CFLAG on success, cleared on error
; @param r16 byte to write
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
NET_Interface_AddOutgoingMsgNum:
push yl
push yh
adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF
rcall RingBufferY_WriteByteGuarded ; R17, R18, X
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine NET_Interface_AddOrReleaseOutMsg @global
;
; Try to add given msg to the given interface's list of outbound messages,
; if that fails release the given message (@ref NET_Buffer_ReleaseByNum)
;
; @return CFLAG on success, cleared on error
; @param r16 byte to write
; @param Y pointer to start of interface data
; @clobbers R16, R17, R18, X
NET_Interface_AddOrReleaseOutMsg:
rcall NET_Interface_AddOutgoingMsgNum ; (R17, R18, X)
brcs NET_Interface_AddOrReleaseOutMsg_ret
rcall NET_Buffer_ReleaseByNum ; (R16, X)
clc
NET_Interface_AddOrReleaseOutMsg_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine NET_Interface_GetNextOutgoingMsgNum @global
;
; @return CFLAG on success, cleared on error
; @return R16 byte read
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
NET_Interface_GetNextOutgoingMsgNum:
push yl
push yh
adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF
rcall RingBufferY_ReadByteGuarded ; R17, R18, X
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine NET_Interface_PeekNextOutgoingMsgNum @global
;
; @return CFLAG on success, cleared on error
; @return R16 byte read
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
NET_Interface_PeekNextOutgoingMsgNum:
push yl
push yh
adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF
rcall RingBufferY_PeekByteGuarded ; R17, R18, X
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine NET_Interface_GetNumOfOutgoingMsgNums @global
;
; @return CFLAG on success, cleared on error
; @return R16 byte read
; @param Y pointer to start of interface data
; @clobbers none
NET_Interface_GetNumOfOutgoingMsgNums:
ldd r16, Y+(NET_IFACE_OFFS_OUTMSGRINGBUF+RINGBUFFERY_OFFS_USED)
ret
; @end
; ---------------------------------------------------------------------------
; @routine NET_Interface_IncCounter16 @global
;
; @param Y pointer to start of interface data
; @param R16 offset to Y for counter to increment
; @clobbers R24, R25
NET_Interface_IncCounter16:
add yl, r16
adc yh, r16
sub yh, r16
ld r24, Y+
ld r25, Y
sbiw yh:yl, 1
adiw r25:r24, 1
breq NET_Interface_IncCounter16_end
st Y+, r24
st Y, r25
sbiw yh:yl, 1
NET_Interface_IncCounter16_end:
sub yl, r16
sbc yh, r16
add yh, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine NET_Interface_SetIfaceNumInBuffer @global
;
; @param X pointer to start of buffer
; @param Y pointer to start of interface data
; @clobbers R16, R17
NET_Interface_SetIfaceNumInBuffer:
ldd r16, Y+NET_IFACE_OFFS_IFACENUM
andi r16, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT)
ld r17, X
andi r17, ~(NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT)
or r17, r16
st X, r17
ret
; @end