Хм, я человек адекватный и справедливый. Легко признаю свои ошибки. И не зацикливаюсь на каких-то идеях, как бы они мне не нравились. Если в этих идеях есть ошибки. Конечно же, мне еще расти и расти. Но и у вас я заметил несколько существенных моментов. Первый же, за который зацепился мой взгляд, инструкция sbiw допускает максимальное число 64. Второй, что-то скромненько вы преподали
cp2i Xh,Xl,(SPI_RECEIVE_BUFFER+SPI_RECEIVE_BUFFER_LENGTH)
4 инструкции, 4 такта. Хотя, я и не знаю, что там у вас в этом макросе. Но предварительные догадки таковы.
Приведенный вами код только для одного случая. Если пакеты всегда одинаковы. А если они разные? Потому я и ввел счетчик байтов в пакете. Хорошо, все равно у меня у меня практически всегда остаются неиспользуемые регистры. Задействуем один как счетчик байтов SPI. Еще один для сравнения.
В любом случае, вам спасибо, я взял на заметку ваши замечания. Переделал несколько задач с учетом приведенного принципа.
clr SPI_CNT_BYTES
ldi r16,3
mov SPI_BYTES_LENGHT,r16
SPI_Transfer_Int_Init
lds r16,SPI_TRANSFER_BUFFER
out SPDR,r16
;=========================================================================
SPI_Transfer_Int:
push r16
in r16,SREG
push r16
push XL
push XH
ldix SPI_RECEIVE_BUFFER
addw X,SPI_CNT_BYTES,RCLR
in r16,SPDR
st X+,r16
inc SPI_CNT_BYTES
cp SPI_CNT_BYTES,SPI_BYTES_LENGHT
brsh SPI_Transfer_Int_Off
addiw X,(SPI_TRANSFER_BUFFER-SPI_RECEIVE_BUFFER)
ld r16,X
out SPDR,r16
rjmp SPI_Transfer_Int_End
SPI_Transfer_Int_Off:
in r16,SPCR
cbr r16,1<<SPIE
out SPCR,r16
cbr FLAGS,1<<SPITC_FLG
SPI_Transfer_Int_End:
pop XH
pop XL
pop r16
out SREG,r16
pop r16
reti
;=========================================================================
29 команд. Это уже не 42 команды, как прежде.