Речь шла о "добиться максимальной скорости". "добиться" это не "протянуть руку и взять", тут надо чем-то пожертвовать, чтобы добиться.
Ну ладно, это всё лирика.
Отвечаем кодом на код :). Здесь используется указатель на текущую позицию в буфере. Y не использовался и в исходном коде, он спокойно заменялся на Х который стал не нужен после записи в буфер приёма.
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 X->r[0]
ld2 Xh,Xl,SPI_RECEIVE_BUFFER_PTR ; 2 X->r[i]
; ldiy SPI_TRANSFER_BUFFER ; 2 Y->t[0]
; lds CNT,SPI_CNT_BYTES ; 1 cnt=i
; lds r17,SPI_BYTES_SIZE ; 1 17 Buf.len
; addw X,CNT,RCLR ; 2 X->r[i]
in r16,SPDR ; 1 data in
; st X,r16 ; 1 r[i]=data
st X+,r16 ; 1 r[i++]=data
; inc CNT ; 1
; cp CNT,r17 ; 1 i+1 vs Blen?
cp2i Xh,Xl,(SPI_RECEIVE_BUFFER+SPI_RECEIVE_BUFFER_LENGTH)
brsh SPI_Transfer_Int_Off ; 1
; sts SPI_CNT_BYTES,CNT ; 1 sav i++
st2 SPI_RECEIVE_BUFFER_PTR,Xh,Xl ; 2 sav r_ptr
sbiw X,(SPI_TRANSMIT_BUFFER-SPI_RECEIVE_BUFFER) ; 2 X->t[i+1]
; addw Y,CNT,RCLR ; 2 Y->t[i+1]
ld r16,Y ; 1
out SPDR,r16 ; 1 out t[i+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