; *************************************************************************** ; 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_UARTFD0_ASM #define AVR_MODULES_UARTFD_UARTFD0_ASM .dseg uartFd0_iface: .byte UARTFD_IFACE_SIZE .cseg ; --------------------------------------------------------------------------- ; @routine UARTFD_Init @global ; ; @clobbers UARTFD0_Init: ldi yl, LOW(uartFd0_iface) ldi yh, HIGH(uartFd0_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 std Y+UARTFD_IFACE_OFFS_STATUS, r16 M_UARTFD_SET_BAUDRATE 0 M_UARTFD_SET_CHARFORMAT 0 ; always receive! rcall uartFd0StartReading rcall uartFd0StartRx ret ; @end ; --------------------------------------------------------------------------- ; @routine UARTFD0_Every100ms @global ; ; @clobbers UARTFD0_Every100ms: ldi yl, LOW(uartFd0_iface) ldi yh, HIGH(uartFd0_iface) rcall NET_Interface_Periodically ret ; @end ; --------------------------------------------------------------------------- ; @routine UARTFD0_Run @global ; ; @return CFLAG set if something done ; @clobbers r22, (r16, r17, r18, r19, r20, r24, r25, X, Y, Z) UARTFD0_Run: ldi yl, LOW(uartFd0_iface) ldi yh, HIGH(uartFd0_iface) clr r22 push r15 in r15, SREG cli ; disable irqs rcall uartFd0RunRead ; (r16, r17, r18, r19, r20, r24, r25, X, Z) sbci r22, 0 out SREG, r15 ; probably enable irqs cli ; disable irqs rcall uartFd0RunWrite ; (r16, r17, r18, r19, r24, r25, X) sbci r22, 0 out SREG, r15 ; probably enable irqs pop r15 tst r22 clc breq UARTFD0_Run_ret sec UARTFD0_Run_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd0RunWrite ; ; @param Y pointer to interface data in SRAM ; @return CFLAG set if something done ; @clobbers r19 (r16, r18, r24, r25, X) uartFd0RunWrite: clr r19 rcall uartFd0CheckWriting ; (r16, X) rcall uartFd0CheckMsgSent ; (r16, r24, r25) sbci r19, 0 rcall uartFd0CheckSendMsg ; (r16, r17, r18, X) sbci r19, 0 tst r19 clc breq uartFd0RunWrite_ret sec uartFd0RunWrite_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd0CheckWriting ; ; @param Y pointer to interface data in SRAM ; @clobbers r16 (X) uartFd0CheckWriting: ldd r16, Y+UARTFD_IFACE_OFFS_WBUFNUM cpi r16, 0xff breq uartFd0CheckWriting_ret ldd r16, Y+UARTFD_IFACE_OFFS_WBUFLEFT tst r16 breq uartFd0CheckWriting_ret ldd r16, Y+NET_IFACE_OFFS_WRITETIMER cpi r16, UARTFD_WRITE_TIMEOUT brcs uartFd0CheckWriting_ret rcall uartFd0RestartWriting ; (r16, X) uartFd0CheckWriting_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd0CheckSendMsg ; ; @param Y pointer to interface data in SRAM ; @return CFLAG set if something done ; @clobbers r16 (r17, r18, X) uartFd0CheckSendMsg: ldd r16, Y+UARTFD_IFACE_OFFS_WBUFNUM cpi r16, 0xff brne uartFd0CheckSendMsg_clcRet rcall NET_Interface_GetNextOutgoingMsgNum ; (R17, R18, X) brcc uartFd0CheckSendMsg_ret rcall uartFd0StartWriting ; (R16, R17, X) sec rjmp uartFd0CheckSendMsg_ret uartFd0CheckSendMsg_clcRet: clc uartFd0CheckSendMsg_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd0CheckMsgSent ; ; @param Y pointer to interface data in SRAM ; @return CFLAG set if something done ; @clobbers r16 (r24, r25) uartFd0CheckMsgSent: ldd r16, Y+UARTFD_IFACE_OFFS_WBUFNUM cpi r16, 0xff breq uartFd0CheckMsgSent_clcRet ldd r16, Y+UARTFD_IFACE_OFFS_WBUFLEFT tst r16 brne uartFd0CheckMsgSent_clcRet rcall uartFd0FinishWriting ; (r16, r24, r25) sec rjmp uartFd0CheckMsgSent_ret uartFd0CheckMsgSent_clcRet: clc uartFd0CheckMsgSent_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine uartFd0RunRead ; ; @param Y pointer to interface data in SRAM ; @return CFLAG set if something done ; @clobbers r16 (r17, r18, r19, r20, r24, r25, X, Z) uartFd0RunRead: ; make sure received messages are stored ASAP rcall uartFd0CheckMsgReceived ; (r16, r17, r18, r19, r20, r24, r25, X, Z) push r15 in r15, SREG ; save CFLAG ; handle errors rcall uartFd0CheckOverrun ; (r16, r24, r25) rcall uartFd0CheckHwErr ; (r16, r24, r25) rcall uartFd0CheckBadMsgSize ; (r16, r24, r25) rcall uartFd0CheckSkipping ; (r16, X) rcall uartFd0SetSkippingSignal ; (r16, r17) ; clear error flags ldd r16, Y+UARTFD_IFACE_OFFS_STATUS cbr r16, (1<