diff --git a/avr/comproto.asm b/avr/comproto.asm index 37553e5..22c6f26 100644 --- a/avr/comproto.asm +++ b/avr/comproto.asm @@ -323,6 +323,63 @@ CPRO_EnqueueValue_error: +; --------------------------------------------------------------------------- +; Enqueue a NEEDADDRESS packet. +; +; IN: +; - R16: destination address +; OUT: +; - CFLAG: set if okay, clear otherwise +; MODIFIED REGS: R16, R18, R19, R20, R21, X, Y (R15, R17) + +CPRO_EnqueueNeedAddress: + push r16 + rcall COM_AllocBufferAndGetXY ; (r16, r17, r21) + pop r16 + brcc CPRO_EnqueueNeedAddress_error + clr r1 ; r1: XOR byte + ; write header (dest address, msg length) + st X+, r16 ; destination address + eor r1, r16 + ldi r16, 6 ; 6 bytes payload + st X+, r16 ; msglen + eor r1, r16 + ; write payload + ldi r16, CPRO_CMD_NEED_ADDRESS ; 0: msg type + st X+, r16 + eor r1, r16 + clr r16 ; dummy src address + st X+, r16 + eor r1, r16 + + push xh ; 2-5: UID + push xl + rcall Utils_ReadUid ; (R16, X) + pop xl + pop xh + st X+, r18 + eor r1, r18 + st X+, r19 + eor r1, r19 + st X+, r20 + eor r1, r20 + st X+, r21 + eor r1, r21 + ; store XOR byte + mov r16, r1 + st X+, r16 + ; mark buffer as enqueued with PRIO "important" (higher retry count) + ldi r20, COM_BUFFER_PRIO_IMPORTANT + rcall COM_EnqueuePacket ; (R15, R16) + brcc CPRO_EnqueueNeedAddress_error + sec + ret +CPRO_EnqueueNeedAddress_error: + clc + ret + + + ; --------------------------------------------------------------------------- ; Enqueue a simple packet with payload only CMD and source address. ;