; *************************************************************************** ; 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 UART_HW_Interface_RunWriting @global ; ; Write current message to ringbuffer. ; ; @param Y pointer to start of interface data ; @clobbers r16, r19, X (R17, R18, R20, R21) UART_HW_Interface_RunWriting: ldd r19, Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM cpi r19, 0xff ; invalid buffer number? breq UART_HW_Interface_RunWrite_end ; yes, invalid, nothing to do UART_HW_Interface_RunWrite_haveMsg: ; there are still bytes left in the buffer, send them ldd r20, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT rcall uartHwWriteUptoNumBytes ; (r16, r17, r18, r20, r21, X) ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT tst r16 brne UART_HW_Interface_RunWrite_end ; still bytes left to write ; message completely sent to interface, release buffer ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM rcall UART_HW_FixedBuffers_ReleaseByNum ldi r16, 0xff ; set invalid buffer number std Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM, r16 ldd r16, Y+UART_HW_IFACE_OFFS_MODE cbr r16, UART_HW_MODE_WRITEMASK ori r16, UART_HW_MODE_WAITBUFFEREMPTY std Y+UART_HW_IFACE_OFFS_MODE, r16 UART_HW_Interface_RunWrite_end: ret ; @end ; --------------------------------------------------------------------------- ; @routine UART_HW_Interface_WriteSetBuffer ; ; Set given fixed buffer as source for @ref UART_HW_Interface_RunWrite. ; ; @param r16 buffer num ; @param Y pointer to start of interface data ; @clobbers r16, r19, X UART_HW_Interface_WriteSetBuffer: mov r19, r16 rcall UART_HW_FixedBuffers_Locate ; (R16) brcc UART_HW_Interface_WriteSetBuffer_end std Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM, r19 adiw xh:xl, 1 std Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR, xl std Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR+1, xh adiw xh:xl, 1 ; get msg len ld r16, X inc r16 ; adjust for destination addr byte inc r16 ; adjust for msg len byte inc r16 ; adjust for crc byte std Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT, r16 std Y+UART_HW_IFACE_OFFS_WRITEMSG_USED, r16 UART_HW_Interface_WriteSetBuffer_end: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartHwWriteUptoNumBytes ; ; @param Y pointer to start of interface data ; @param R20 number of bytes to read ; @clobbers r16, r20, r21, X (R17, R18) uartHwWriteUptoNumBytes: clr r21 ldd xl, Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR ldd xh, Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR+1 uartHwWriteUptoNumBytes_loop: ld r16, X push xl push xh rcall UART_HW_InterfaceWriteToWriteBuffer ; (R17, R18, X) pop xh pop xl brcc uartHwWriteUptoNumBytes_done adiw xh:xl, 1 inc r21 dec r20 brne uartHwWriteUptoNumBytes_loop uartHwWriteUptoNumBytes_done: ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT sub r16, r21 std Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT, r16 std Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR, xl std Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR+1, xh ret ; @end