Hallo,
Danke, der erzeugte Code sieht wirklich ganz gut aus.
Schön ist auch, das C das mit Registern regelt, und nicht
stur das RAM benutzt. Wirklich interessant.

Das Array scheint allerdings ein Byte-Array zu sein,
denn er lädt nur Bytes.
Aber C behandelt die Werte ständig als INT. Deshalb
könnte man da deutlich mehr als zwei Befehle weglassen.

Gruß Jan

Hier mal mein Vorschlag:
Code:
 red0   = (boden_value_red0[2*i]*256   | boden_value_red0[2*i + 1]) >> 2;
     824:   f7 01          movw   r30, r14
     826:   80 81          ld   r24, Z       ;ersetzen durch "ld r25,Z"         
     828:   99 27          eor   r25, r25   ;weglassen
     82a:   98 2f          mov   r25, r24   ;weglassen
     82c:   88 27          eor   r24, r24   ;weglassen
     82e:   21 81          ldd   r18, Z+1  ;ersetzen durch "ldd r24, Z+1"
     830:   33 27          eor   r19, r19   ;weglassen
     832:   82 2b          or   r24, r18      ;weglassen
     834:   93 2b          or   r25, r19   ;weglassen
     836:   95 95          asr   r25   
     838:   87 95          ror   r24    
     83a:   95 95          asr   r25   
     83c:   87 95          ror   r24   
     83e:   68 2f          mov   r22, r24

oder netto (und gleich r22 benutzt):
     movw   r30, r14
     ld   r18, Z
     ldd   r22, Z+1  
     asr r18    
     ror   r22
     asr  r18
     ror   r22     

macht 7 Befehle (und Takte) statt 14