Das was ich in Assembler gemacht habe ist eine einfache
Flash-Optimierung.
Der Z-Pointer soll auf eine Tabelle zeigen. Dazu muss ein 8bit Offset
addiert werden.
Einfachste Möglichkeit:
1 | ldi ZL, lo8(table)
|
2 | ldi ZH, hi8(table)
|
3 | add ZL, lo8(offset)
|
4 | adc ZH, hi8(offset)
|
Wenn man jetzt jedoch einer der beiden Schritte in einem Befehl (movw)
machen kann spart man ein Befehl. Das geht in meinem Fall, obwohl es nur
ein 8bit Offset ist. Das Register darüber enthält nämlich einen
konstanten Wert. Dieser muss dann aber wieder abgezogen werden.
1 | ldi r21, VRAM_TILES_H
|
2 | [...]
|
3 | movw ZL, r20 //r20 = offset register
|
4 | subi ZL, lo8(-(table))
|
5 | sbci ZH, hi8(((VRAM_TILES_H)*256)-(Scroll2_loop_table)) //Um die Zeile geht es
|
Ich hoffe du kannst damit etwas anfangen. Das wäre in C schwer
darzustellen gewesen.
Hier geht es zwar nur um ein Word, allerdings stört es mich, dass es
nicht möglich scheint einen halbkomplexen Ausdruck mit avrgas zu
verwenden.