; *************************************************************************** ; 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. * ; *************************************************************************** #ifndef AVR_MODULES_UARTFD_UARTFD1_ASM #define AVR_MODULES_UARTFD_UARTFD1_ASM ; this is the tested version! .dseg uartFd1_iface: .byte UARTFD_IFACE_SIZE .cseg ; --------------------------------------------------------------------------- ; @routine UARTFD_Init @global ; ; @clobbers UARTFD1_Init: ldi yl, LOW(uartFd1_iface) ldi yh, HIGH(uartFd1_iface) rcall NET_Interface_Init ; (R16, R17, X) ldi r16, 0xff std Y+UARTFD_IFACE_OFFS_WBUFNUM, r16 clr r16 std Y+UARTFD_IFACE_OFFS_WBUFLEFT, r16 std Y+UARTFD_IFACE_OFFS_RBUFUSED, r16 std Y+UARTFD_IFACE_OFFS_RBUFLEFT, r16 M_UARTFD_SET_BAUDRATE 0 M_UARTFD_SET_CHARFORMAT 0 ; always receive! rcall uartFd1StartRx ret ; @end ; --------------------------------------------------------------------------- ; @routine UARTFD1_Every100ms @global ; ; @clobbers UARTFD1_Every100ms: ldi yl, LOW(uartFd1_iface) ldi yh, HIGH(uartFd1_iface) rcall NET_Interface_Periodically ret ; @end ; --------------------------------------------------------------------------- ; @routine UARTFD1_Run @global ; ; @return CFLAG set if something done ; @clobbers r22, (r16, r17, r18, r19, r20, r24, r25, X, Y, Z) UARTFD1_Run: ldi yl, LOW(uartFd1_iface) ldi yh, HIGH(uartFd1_iface) clr r22 push r15 in r15, SREG cli ; disable irqs rcall uartFd1RunRead ; (r16, r17, r18, r19, r20, r24, r25, X, Z) sbci r22, 0 out SREG, r15 ; probably enable irqs cli ; disable irqs rcall uartFd1RunWrite ; (r16, r17, r18, r19, r24, r25, X) sbci r22, 0 out SREG, r15 ; probably enable irqs pop r15 tst r22 clc breq UARTFD1_Run_ret sec UARTFD1_Run_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd1RunWrite ; ; @param Y pointer to interface data in SRAM ; @return CFLAG set if something done ; @clobbers r19 (r16, r18, r24, r25, X) uartFd1RunWrite: clr r19 rcall uartFd1CheckWriting ; (r16, X) rcall uartFd1CheckMsgSent ; (r16, r24, r25) sbci r19, 0 rcall uartFd1CheckSendMsg ; (r16, r17, r18, X) sbci r19, 0 tst r19 clc breq uartFd1RunWrite_ret sec uartFd1RunWrite_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd1CheckWriting ; ; @param Y pointer to interface data in SRAM ; @clobbers r16 (X) uartFd1CheckWriting: ldd r16, Y+UARTFD_IFACE_OFFS_WBUFNUM cpi r16, 0xff breq uartFd1CheckWriting_ret ldd r16, Y+UARTFD_IFACE_OFFS_WBUFLEFT tst r16 breq uartFd1CheckWriting_ret ldd r16, Y+NET_IFACE_OFFS_WRITETIMER cpi r16, UARTFD_WRITE_TIMEOUT brcs uartFd1CheckWriting_ret rcall uartFd1RestartWriting ; (r16, X) uartFd1CheckWriting_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd1CheckSendMsg ; ; @param Y pointer to interface data in SRAM ; @return CFLAG set if something done ; @clobbers r16 (r17, r18, X) uartFd1CheckSendMsg: ldd r16, Y+UARTFD_IFACE_OFFS_WBUFNUM cpi r16, 0xff brne uartFd1CheckSendMsg_clcRet rcall NET_Interface_GetNextOutgoingMsgNum ; (R17, R18, X) brcc uartFd1CheckSendMsg_ret rcall uartFd1StartWriting ; (R16, R17, X) sec rjmp uartFd1CheckSendMsg_ret uartFd1CheckSendMsg_clcRet: clc uartFd1CheckSendMsg_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd1CheckMsgSent ; ; @param Y pointer to interface data in SRAM ; @return CFLAG set if something done ; @clobbers r16 (r24, r25) uartFd1CheckMsgSent: ldd r16, Y+UARTFD_IFACE_OFFS_WBUFNUM cpi r16, 0xff breq uartFd1CheckMsgSent_clcRet ldd r16, Y+UARTFD_IFACE_OFFS_WBUFLEFT tst r16 brne uartFd1CheckMsgSent_clcRet rcall uartFd1FinishWriting ; (r16, r24, r25) sec rjmp uartFd1CheckMsgSent_ret uartFd1CheckMsgSent_clcRet: clc uartFd1CheckMsgSent_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd1RunRead ; ; @param Y pointer to interface data in SRAM ; @return CFLAG set if something done ; @clobbers r16 (r17, r18, r19, r20, r24, r25, X, Z) uartFd1RunRead: ; make sure received messages are stored ASAP rcall uartFd1CheckMsgReceived ; (r16, r17, r18, r19, r20, r24, r25, X, Z) push r15 in r15, SREG ; save CFLAG ; handle errors rcall uartFd1CheckOverrun ; (r16, r24, r25) rcall uartFd1CheckHwErr ; (r16, r24, r25) rcall uartFd1CheckBadMsgSize ; (r16, r24, r25) rcall uartFd1CheckSkipping ; (r16, X) ; clear error flags ldd r16, Y+UARTFD_IFACE_OFFS_STATUS cbr r16, (1<