Bei Compilern heißt das »loop unrolling«: Man programmiert keine Schleife, sondern wiederholt den Code in der Schleife einfach so oft manuell, wie die Schleife ausgeführt werden soll.
Genau, "Loop Unrolling" oder "Loop Flattening", wenn die Loops verschachtelt ("nested") sind. Das ist neben Controller- und FPGA-Programmierung auch heute noch mit Hochsprachen sinnvoll, beispielsweise wenn die Loops asynchron oder parallel ausgeführt werden sollen. Das habe ich zuletzt mit Kotlin vor zwei Jahren so gemacht, weswegen ich sehr gute Laufzeitverbesserungen erreichte.
Die Idee ist einfach: Wenn eine Schleife 25 mal ausgeführt wird (bitte korrigiert mich, ich meine das Color-RAM des C64 hat genau diese Zeichenauflösung von 40x25 Byte) und der Sprung an den Anfang der Schleife und die vorherige Abfrage, ob die Schleife schon zu Ende ist, sagen wir mal zusammen 6 Taktzyklen dauert ... dann spart man 25x6 = 150 Taktzylen. Der Code wird zwar länger, aber das ist in solchen Zeitkritischen Anwendungen meistens weniger das Problem.
40x25 ist richtig. Da gibt es so einige Ansätze (auch aus alten Zeitschriften), wie man Speicherbereiche effizient umkopiert. Am Ende läuft es aufs Takte-Zählen hinaus. Und ein guter Makro-Assembler macht es viel leichter, weil man das Unrolling als Makro umsetzen kann. Ich hatte damals nur den Monitor vom Action Replay Cartridge MK VI und später SMON, aber keinen Makro-Assembler. Heute wird man ja mit Cross-Platform-Tools wie z.B. KickAssembler regelrecht verwöhnt
(das nehme ich mir mal heraus, weil ich das ca. 1993 hautnah miterlebt habe und es hier super passt)
1993... Da hatte ich meinen ersten Computer, den C64, gerade mal ein Jahr und war gerade zum BASIC-Profi aufgestiegen. Erst ein Jahr später konnte ich einigermaßen gut Assembler, sodass ich was an die 64er-Redaktion schicken konnte.