Block Copy
Blockverschieberoutine
Blockverschieberoutine

Manchmal ist es nötig, sehr schnell sehr viele Bytes an andere Stellen im Speicher umzulagern. Zwar kann man mit einer FOR..NEXT-Schleife sehr viele Bytes bewegen, aber eine hohe Geschwindigkeit darf man davon nicht erwarten. Zum Glück bringt der C64 selbst solch eine Routine mit, die er vor allem beim Editieren eines Programms verwendet: die Blockverschiebroutine (BLTUC).

Die Daten, die die Blockverschieberoutine für ihre Arbeit benötigt, sind ein wenig undurchschaubar, darum haben wir uns gedacht, dass ein fertiges "PROC kopieren" dem einen oder anderen ganz gelegen kommen könnte.

Die Prozedur braucht drei Eingangswerte: in Q die Anfangsadresse der Daten, die verschoben werden sollen, in Z die Zieladresse dieser Daten und in L die Anzahl Bytes, die übertragen werden sollen, ein Wert zwischen 1 und 65535 (alles definiert in Zeile 120 im folgenden Code). Da wir aus Vereinfachungsgründen nicht den vorgesehenen Systemeinsprung für die Routine verwenden, muss man wissen, dass diese Implementation die Daten von hinten nach vorne kopiert (wichtig bei sich überlappenden Daten).

100 cls
110 :
120 l= 920: q=$c700: z=$0400: kopieren
130 :
140 print at(0,22)"";
999 end
1000 proc kopieren
1010 ql=mod(q,256): qh=div(q,256)
1020 zl=mod(z,256): zh=div(z,256)
1025 ll=mod(l,256): lh=div(l,256)
1030 if lh then qh=qh+lh: zh=zh+lh
1040 poke$5a,ql:poke$5b,qh:poke$58,zl:poke$59,zh:poke782,ll:poke781,lh+1
1045 sys $a3ec
1050 end proc

In diesem Fall zeigt das Programm einen Bereich von 920 Bytes aus TSB auf dem Bildschirm an, in dem ganz links unten (viertletzte Bildschirmzeile) die Versionsnummer von TSB zu erkennen ist. Der Rest ist visualisierter Code.


Seit TSB-Version 2.30803 mit seinem neuen Befehl D!POKE kann die Prozedur kopieren drastisch vereinfacht werden. Hier der neue Code:

1000 proc kopieren
1025 lh=div(l,256): ll=mod(l,256)
1030 if lh then q=q+lh*256: z=z+lh*256
1040 d!poke $5a,q: d!poke $58,z: poke 781,lh+1: poke 782,ll
1045 sys $a3ec
1050 end proc

Die alten Zeilen 1010 und 1020 fallen komplett weg und die Zeile 1040 ist plötzlich lesbar!