Das ist einer der seltenen Fälle, in denen es sich selbst in C lohnt,
den Inline-Assembler zu verwenden:
LDX, Anzahl_der_Register; (bei Dir 0x2000-0x4000)
REGMOVD, Startwert, letzte_Zieladresse ; (bei Dir 0x4000, Letzte
Zieladresse)
REGMOVD kopiert den gesamten Block beginnend bei der obersten Adresse;
kopiert von Start auf Zieladresse, erniedrigt dann die Adressen um 1,
ernidrigt x um 1, und wiederholt das solange x>0.
Leichter zu verstehen ist eigentlich REGMOVI (i für increment), hier
fängt bei der niedrigsten Adresse zum Kopieren an. Abbruch ist auch hier
bei 0. Nur musst Du dafür das LDX mit dem Zweierkompliment der
Registeranzahl-1 belegen, der Überlauf des Registers erzwingt dann den
Abbruch, da Carry-Flag nicht berücksichtigt wird. Das ist etwas Tricky
und liest sich dann im Code schwerer.
Natürlich kannst Du das auch in C schreiben, aber so ist es
übersichtlicher. Die wenigsten Compeiler (nur einige
hochproffessionelle) können diese Optimierung. Wieso also Rechenzeit
verschenken und etwas kompliziert schreiben wenn es auch einfacher geht.
Wichtig, Anzahl_der_Register darf höchstens eine 12-Bit Zahl sein.