Я поспорю. Vit правильно написал, это одна кастрированная задача. Если действовать по вашему, то тогда в других задачах выбывают из игры указанные вами регистры. Опять же в указанном вами примере только прием данных. А требуется и прием и передача. Если пакет данных. Еще счетчик байтов в пакете. Еще проверка счетчика.
Пример кода, если использовать прерывания. 42 инструкции. В тактах еще грусснее...
SPI_BYTES_SIZE:
.byte 1
sts SPI_CNT_BYTES,RCLR
ldi r16,2
sts SPI_BYTES_SIZE,r16
lds r16,SPI_TRANSFER_BUFFER
out SPDR,r16
SPI_Transfer_Int_Init
;=========================================================================
SPI_Transfer_Int:
push r16 ; 1
in r16,SREG ; 1
push r16 ; 1
push r17 ; 1
push CNT ; 1
push XL ; 1
push XH ; 1
push YL ; 1
push YH ; 1
ldix SPI_RECEIVE_BUFFER ; 2
ldiy SPI_TRANSFER_BUFFER ; 2
lds CNT,SPI_CNT_BYTES ; 1
lds r17,SPI_BYTES_SIZE ; 1
addw X,CNT,RCLR ; 2
in r16,SPDR ; 1
st X,r16 ; 1
inc CNT ; 1
cp CNT,r17 ; 1
brsh SPI_Transfer_Int_Off ; 1
sts SPI_CNT_BYTES,CNT ; 1
addw Y,CNT,RCLR ; 2
ld r16,Y ; 1
out SPDR,r16 ; 1
rjmp SPI_Transfer_Int_End ; 1
SPI_Transfer_Int_Off:
in r16,SPCR ; 1
cbr r16,1<<SPIE ; 1
out SPCR,r16 ; 1
cbr FLAGS,1<<SPITC_FLG ; 1
SPI_Transfer_Int_End:
pop YH ; 1
pop YL ; 1
pop XH ; 1
pop XL ; 1
pop CNT ; 1
pop r17 ; 1
pop r16 ; 1
out SREG,r16 ; 1
pop r16 ; 1
reti ; 1
;=========================================================================