107 lines
3.4 KiB
NASM
107 lines
3.4 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 UART_HW_Interface_RunWrite @global
|
|
;
|
|
; Get messages via @ref UART_HW_GetNextOutgoingMsgNum and fill them into
|
|
; the outbound ringbuffer of this interface.
|
|
;
|
|
; @param Y pointer to start of interface data
|
|
; @clobbers r16, r19, X (R17, R18, R20, R21)
|
|
|
|
UART_HW_Interface_RunWrite:
|
|
ldd r19, Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM
|
|
cpi r19, 0xff
|
|
breq UART_HW_Interface_RunWrite_end ; nothing to do
|
|
UART_HW_Interface_RunWrite_haveMsg:
|
|
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 ; reset buffer number
|
|
std Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM, 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
|
|
; @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
|
|
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
|
|
|
|
|
|
|
|
|