avr: fixed some bugs in address handling code

- fixed bugs in jumptable code and calls
  NOTE to self: addresses in flash are WORD addresses, so we need
  to double the address difference when working with bytes!
- correctly set params for call to cproAddressSetTimer
This commit is contained in:
Martin Preuss
2023-05-10 21:09:08 +02:00
parent 459f261133
commit 44bed4dc14

View File

@@ -39,13 +39,20 @@ CPRO_Address_OnPacketReceived:
ld r16, x ld r16, x
sbiw xh:xl, COM2_MSG_OFFS_CMD sbiw xh:xl, COM2_MSG_OFFS_CMD
ldi r17, (cproPacketTypeTransTableEnd-cproPacketTypeTransTableBegin) & 0xff cpi r16, CPRO_CMD_NEED_ADDRESS
brcs CPRO_Address_OnPacketReceived_nc ; smaller than 60
cpi r16, (CPRO_CMD_ADDRESS_RANGE+1)
brcc CPRO_Address_OnPacketReceived_nc
CPRO_Address_OnPacketReceived_debug2:
ldi r17, (cproPacketTypeTransTableEnd-cproPacketTypeTransTableBegin)*2
ldi zl, LOW(cproPacketTypeTransTableBegin) ldi zl, LOW(cproPacketTypeTransTableBegin)
ldi zh, HIGH(cproPacketTypeTransTableBegin) ldi zh, HIGH(cproPacketTypeTransTableBegin)
rcall Utils_FindBytePositionInTable rcall Utils_FindBytePositionInTable
brcc CPRO_Address_OnPacketReceived_nc brcc CPRO_Address_OnPacketReceived_nc
ldi r17, (cproPacketTypeTransTableEnd-cproPacketTypeTransTableBegin) & 0xff ldi r17, (cproPacketTypeTransTableEnd-cproPacketTypeTransTableBegin)*2
ldi zl, LOW(cproPacketTypeHandleTable) ldi zl, LOW(cproPacketTypeHandleTable)
ldi zh, HIGH(cproPacketTypeHandleTable) ldi zh, HIGH(cproPacketTypeHandleTable)
rcall Utils_TableJump rcall Utils_TableJump
@@ -58,12 +65,12 @@ CPRO_Address_OnPacketReceived_nc:
cproPacketTypeTransTableBegin: cproPacketTypeTransTableBegin:
.db CPRO_CMD_PING, CPRO_CMD_NEED_ADDRESS, CPRO_CMD_HAVE_ADDRESS, CPRO_CMD_ADDRESS_RANGE, CPRO_CMD_DENY_ADDRESS, CPRO_CMD_CLAIM_ADDRESS .db CPRO_CMD_NEED_ADDRESS, CPRO_CMD_HAVE_ADDRESS, CPRO_CMD_ADDRESS_RANGE, CPRO_CMD_DENY_ADDRESS, CPRO_CMD_CLAIM_ADDRESS, CPRO_CMD_PING
cproPacketTypeTransTableEnd: cproPacketTypeTransTableEnd:
; position within table must be in same order as in table above! ; position within table must be in same order as in table above!
cproPacketTypeHandleTable: cproPacketTypeHandleTable:
.dw cproHandlePing, cproHandleNeedAddr, cproHandleHaveAddr, cproHandleAddrRange, cproHandleDenyAddr, cproHandleClaimAddr .dw cproHandleNeedAddr, cproHandleHaveAddr, cproHandleAddrRange, cproHandleDenyAddr, cproHandleClaimAddr, cproHandlePing
@@ -80,6 +87,8 @@ cproHandleNeedAddr:
lds r24, com2Address lds r24, com2Address
clr r25 clr r25
adiw r25:r24, 3 adiw r25:r24, 3
mov r18, r24
mov r19, r25
rjmp cproAddressSetTimer rjmp cproAddressSetTimer
cproHandleNeedAddr_done: cproHandleNeedAddr_done:
sec sec
@@ -111,18 +120,20 @@ cproHandleHaveAddr_done:
cproHandleClaimAddr: cproHandleClaimAddr:
adiw xh:xl, CPRO_PACKET_CLAIMADDR_OFFS_ADDRESS adiw xh:xl, CPRO_PACKET_CLAIMADDR_OFFS_ADDRESS
ld r16, x ld r16, x
tst r16 sbiw xh:xl, CPRO_PACKET_CLAIMADDR_OFFS_ADDRESS
tst r16 ; dont handle claim addr 0
breq cproHandleClaimAddr_done breq cproHandleClaimAddr_done
cpi r16, 0xff cpi r16, 0xff ; dont handle claim addr 0
breq cproHandleClaimAddr_done breq cproHandleClaimAddr_done
lds r17, com2Address lds r17, com2Address
tst r17 tst r17
breq cproHandleClaimAddr_done breq cproHandleClaimAddr_done ; we have no address, yet
cp r16, r17 cp r16, r17
brne cproHandleClaimAddr_done brne cproHandleClaimAddr_done ; not our address
ldi r16, CPRO_MODE_SEND_DENY_ADDR ldi r16, CPRO_MODE_SEND_DENY_ADDR
sts cproMode, r16 sts cproMode, r16
rcall cproAddressSetTimer1s rcall cproAddressSetTimer1s
cproHandleClaimAddr_done: cproHandleClaimAddr_done:
sec sec
ret ret