Tips & Tricks für Profis
Hätten Sie gedacht, daß die rote LED an lhrer Hoppy ihre Helligkeit verändern kann? Oder daß ein kurzes Maschinenprogramm den Bildschirm auf den Kopf steift? Auch diesmal haben wir für Sie einige Beiträge gesammett, die selbst ausgefuchste Profis in Erstaunen versetzen werden.
Beginnen wollen wir diesmal mit einer wirklich außergewöhnlichen »Basic-Erweiterung«: Sie ermöglicht es, bis zu 252 Zeichen lange Basic-Zeilen einzugeben! Damit taucht unwillkürlich folgende Frage auf: Ist dies noch ein Einzeiler oder nicht?
Die Super-Einzeiler
Wer nicht will, daß sein Basic-Programm unnötig viel Speicher verbraucht, da er jedes freie Byte für Daten gebrauchen kann, oder wer will, daß sein Programm möglichst schnell ist, weil ihm jede Sekunde kostbar ist, für den ist es oft von Nutzen, mehrere Programmzeilen zu einer zusammenzufassen. Jede Zeile, die neu begonnen wird, verbraucht nämlich vier Byte mehr Speicherplatz, als wenn diese mit einem Doppelpunkt an die vorhergehende Zeile angehängt würde. Bei einem längeren Programm kann da schon einiges zusammenkommen. Außerdem kann der Interpreter Befehle in einer Zeile schneller abarbeiten, als wenn jeder Befehl in einer eigenen Zeile steht. Wenn diese sich dann noch in einer Schleife befinden, die vielleicht einige hundertmal durchlaufen wird, könnte man hier schon durch eine andere Anordnung Zeit sparen. Um das Programm allerdings nicht allzu unübersichtlich zu machen, sollte man nur solche Zeilen zusammenfassen, die auch logisch zusammengehören.
Wenn man dies nun beherzigen will, wird man allerdings durch den Basic-Editor ziemlich eingeschränkt, da dieser nur maximal 80 Zeichen in einer Zeile zuläßt. Der Interpreter würde aber auch längere Zeilen akzeptieren, nur kann man solche eben nicht eingeben.
Um dieses Manko zu beseitigen, habe ich EX-LINE geschrieben (siehe Listing 1). Mit diesem Programm ist es nun möglich, mit einer Länge von bis zu 252 Zeichen Basic-Zeilen einzugeben.
Nachdem man dieses Programm mit dem MSE eingegeben oder mit »LOAD "EX-LiNE",8,1« von Diskette geladen hat, kann man es mit »SYS 49152« starten. Danach steht das Ausrufungszeichen als neuer Befehl zur Verfügung. Wenn man diesen Befehl eingibt, erscheint der Cursor in der linken oberen Ecke des Bildschirms. Nun kann man eine Programmzeile oder Befehle im Direktmodus eingeben. Dabei ist zu beachten, daß nach »RETURN« nur die ersten 6,5 Bildschirmzeilen übernommen werden, egal wo sich der Cursor dann befindet. Wenn man nach dem Ausrufungszeichen noch eine Zeilennummer angibt, wird vorher noch der Bildschirm gelöscht und die entsprechende Zeile gelistet, so daß man auch überlange Zeilen editieren kann.
Da sich das Programm nicht mit dem Checksummer verträgt, errechnet es noch eine Prüfsumme, die sich mit »PRINT PEEK(2)« auslesen läßt. Sie entsteht einfach durch Addition der ASC-Werte der eingegebenen Zeichen. In der Speicherzelle 2 steht dann das Low-Byte der Summe.
Wenn man die Befehle in abgekürzter Form eingibt, erhält man eine andere Prüfsumme, als wenn man sie ausschreibt. Die angegebenen Prüfsummen bei den folgenden Programmen beziehen sich immer auf die ausgeschriebene Form.
Programmbeschreibung
Das Programm ist komplett in Maschinensprache geschrieben und steht im Speicher ab $C000. Nach dem Start mit »SYS 49152« wird zuerst das Basic-ROM in den darunter liegenden RAM-Bereich kopiert und so verändert, daß der Eingabepuffer nicht mehr bei $0200, sondern bei $C200 liegt. Dies ist nötig, da dieser jetzt mehr Platz benötigt, als das Betriebssystem für ihn vorsieht.
Schließlich wird der Vektor für »Basic-Befehl holen« bei $0308 auf die neue Routine gelenkt. Diese prüft, ob das erste Zeichen ein Ausrufungszeichen ist. Wenn dies der Fall ist und noch eine Zeilennummer folgt, wird zunächst der Bildschirm gelöscht und die entsprechende Zeile gelistet. (Wenn keine Zeile angegeben war, wird dieser Teil übersprungen.)
Nachdem dann die Eingabe erfolgt ist, wird das RAM bei $A000 aktiviert, der Text im oberen Teil des Bildschirms in den Puffer bei $C200 kopiert, in Interpretercode umgewandelt und ausgeführt. Das ROM wird bei der nächsten Eingabe wieder eingeschaltet, so daß der Eingabepuffer wieder wie üblich bei $0200 liegt.
Um zu zeigen, was man mit diesem Programm alles in einer Zeile unterbringen kann, habe ich folgende drei »Einzeiler« geschrieben:
PROGRAMM : EX-LINE C000 C12E ----------------------------------- C000 : A0 00 A2 A0 84 F7 86 F8 71 C008 : A2 20 B1 F7 91 F7 C8 D0 C3 C010 : F9 E6 F8 E6 FA CA D0 F2 C6 C018 : A9 C2 8D F5 A4 8D 84 A5 58 C020 : 8D BA A5 8D E7 A5 8D 06 13 C028 : A6 A9 C1 8D 13 A5 8D 16 86 C030 : A5 8D 24 A5 8D CD A5 8D 53 C038 : D0 A5 8D F1 A5 8D 0B A6 BD C040 : 8D D2 AA 8D FD C1 A2 87 1A C048 : A0 C0 8E 08 03 8C 09 03 AC C050 : A9 D0 A2 7A 8D 28 A5 8E 27 C058 : 2B A5 8C 2C A5 A9 20 A2 6C C060 : 82 8D 80 A4 8E 81 A4 8C FE C068 : 82 A4 A2 00 BD 1D C1 F0 93 C070 : 06 20 D2 FF E8 D0 F5 6C 01 C078 : 02 A0 B9 FC C1 91 5F 4C 97 C080 : 59 A6 A9 37 85 01 60 20 A0 C088 : 73 00 C9 21 F0 03 4C E7 BA C090 : A7 A2 36 86 01 20 73 00 C6 C098 : B0 21 A2 AE A0 C0 8E 00 A1 C0A0 : 03 8C 01 03 48 A9 93 20 EA C0A8 : D2 FF 68 4C A4 A6 20 EA F3 C0B0 : E8 A2 8B A0 E3 8E 00 03 99 C0B8 : 8C 01 03 A9 13 20 D2 FF 38 C0C0 : 20 CF FF AD 00 04 48 A2 04 C0C8 : 00 86 02 A5 D4 48 A9 00 77 C0D0 : 85 D4 A9 13 20 D2 FF A9 78 C0D8 : 27 85 D0 BD 00 04 8D 00 04 C0E0 : 04 68 85 D4 20 CF FF 9D D0 C0E8 : 00 C2 18 65 02 85 02 E8 22 C0F0 : D0 D9 8A 8D FF C2 A2 FC 9C C0F8 : BD 00 C2 C9 20 D0 04 CA CD C100 : B8 50 F5 E8 A9 00 9D 00 8C C108 : C2 68 8D 00 04 A9 0D A2 69 C110 : 03 20 D2 FF CA D0 FA 20 37 C118 : CF AA 4C 86 A4 0D 45 58 99 C120 : 2D 4C 49 4E 45 20 42 59 A1 C128 : 20 48 43 45 0D 00 AE
1. SOFT FLASH:
Dieser Einzeiler (Listing 2) bewirkt, daß die rote LED am Diskettenlaufwerk scheinbar stufenlos ein- und ausgeschaltet wird. Wenn man das Programm mit Hilfe von »EX-LINE« eingegeben hat, kann man mit »PRINT PEEK(2)« die Prüfsumme abfragen. Diese sollte 180 betragen.
Programmbeschreibung:
In der FOR-NEXT-Schleife wird ein Maschinenprogramm mittels »Memory-Write« in das RAM der Floppy ab $0500 geschrieben. Der Floppy-Befehl »UC« bewirkt dann, daß dieses gestartet wird. Das Maschinenprogramm schaltet die LED so schnell an und aus, daß dies für das Auge nicht sichtbar ist. Dabei ändert sich die Länge der Hell- und Dunkelphase, so daß es scheint, als ob die Lampe langsam hell und dunkel würde.
Weil das Programm als Endlosschleife geschrieben ist, läßt sich das Laufwerk nicht mehr ansprechen. Wenn man die Floppy weiter verwenden will, muß man sie vorher aus- und anschalten.
1 open1,8,15:fori=0to44:reada:print#1,"m-w"chr$(i)chr$(5)chr$(1)chr$(a):next:print#1,"uc":data169,254,170,32,21,5,202,224,1,208,248,32,21,5,232,224,255,208,248,240,235,138,72,73,255,168,169,248,141,0,28,202,208,248,169,240,141,,28,136,208,248,104,170,96
2. STRICH-CURSOR:
Dieser Einzeiler (Listing 3) verwandelt den Cursor in einen Strich, der unter den Zeichen blinkt, so wie man es oft bei größeren Computern sieht. Man kann diese Routine verwenden, um seinen Programmen ein professionelles Aussehen zu verleihen (Prüfsumme: 186).
Programmbeschreibung:
Die ersten drei POKE-Befehle bewirken, daß der Bildschirm nach $CC00 verlegt wird und der Zeichensatz aus dem RAM ab $D000 gelesen wird. Dies ist notwendig, da kein Basic-Speicher verloren gehen soll und der VIC nur 16 KByte auf einmal adressieren kann.
Bevor man nun den Originalzeichensatz bei $D000 mit »POKE 1,3« lesbar machen kann, muß noch der Interrupt mit »POKE 56333,1« ausgeschaltet werden. Die erste FOR-NEXT-Schleife kopiert den Bildschirm an seine neue Position. Die zweite Schleife kopiert den Zeichensatz ins RAM. Dabei werden die reversen Zeichen so verändert, daß nur die unterste Reihe revers erscheint. Die folgenden POKEs bewirken schließlich, daß der Interrupt eingeschaltet wird und der I/O-Bereich bei $D000 wieder ansprechbar ist.
1 w=56333:q=53248:z=4^5:pokeq+24,52:poke56576,0:poke648,204:pokew,1:poke1,3:fori=0to999:poke52224+i,peek(z+i):next:fori=0toz:a=q+i:b=a+2*z:l=z*((iand7)=7):pokea,peek(a):pokeb,peek(b):pokea+z,peek(a-l):pokeb+z,peek(b-l):next:poke1,7:pokew,129
3. UPSIDE-DOWN:
Dieses Programm habe ich in zwei Versionen geschrieben, da es als Einzeiler (Listing 4) sehr schwer abzutippen ist. Die zweite Version (Listing 5) wird mit dem MSE eingegeben (die Prüfsumme für den Einzeiler lautet 76). Beide Versionen können einfach mit »RUN« gestartet werden. Danach erscheint der ganze Bildschirm »auf den Kopf gestellt«. Dies bezieht sich auf alle Ein- und Ausgaben. Auch Zeichen, die mit »POKE« auf den Bildschirm gebracht werden, erscheinen an der entsprechenden anderen Stelle auf dem Kopf. Die meisten Programme vertragen sich damit gut, da nur der IRQ-Vektor verändert wird. Nach einem Reset oder RUN/STOP-RESTORE kann das Programm mit »SYS 300« wieder aktiviert werden.
Programmbeschreibung:
Das Maschinenprogramm, das bei dem Einzeiler mittels »PRINT« auf den Bildschirm gebracht wird, kopiert zunächst eine Interruptroutine in den Stack ab Adresse 300. (Dieser Bereich ist besonders geeignet, da er nach einem Reset nicht gelöscht wird und ein Programm dort nicht stört.) Dann wird der gesamte Zeichensatz auf den Kopf gestellt und in das RAM bei $D000 kopiert. Der VIC wird veranlaßt, den Zeichensatz aus $D000 und den Bildschirm aus $E000 zu lesen, und schließlich wird die Interruptroutine aktiviert, die 60mal in der Sekunde den Bildschirm umgekehrt nach $E000 kopiert.
PROGRAMM : UPSIDE-DOWN 0801 08CA ----------------------------------- 0801 : C8 08 01 00 99 22 13 12 29 0809 : 20 92 C0 12 39 92 C3 44 A4 0811 : 12 59 92 2C 41 12 48 92 E5 0819 : 50 12 B7 92 B8 12 29 92 98 0821 : 33 12 45 92 41 12 29 92 6F 0829 : 40 12 45 B7 29 D0 45 B8 5A 0831 : 20 92 40 12 31 B7 2E 39 E9 0839 : 23 92 CA 26 42 12 CA D0 9E 0841 : BA 58 92 C9 47 12 28 25 F5 0849 : 92 42 12 51 B7 58 92 C9 C7 0851 : 47 12 28 C8 D0 A6 A6 B8 13 0859 : 25 B8 C9 A0 D0 FF 29 92 38 0861 : 37 12 45 92 41 CC 2C 41 F3 0869 : B8 12 29 44 4D 92 58 12 EC 0871 : D0 29 92 40 12 4D 92 40 D9 0879 : 12 DD 29 92 C3 12 4D 92 3E 0881 : 54 43 12 29 92 41 12 4D 37 0889 : 92 55 43 D8 A0 12 29 92 16 0891 : 40 12 2A 28 48 3D 92 40 A3 0899 : 44 12 59 A8 A2 3D 92 40 31 08A1 : 45 12 59 A8 A1 3D 92 40 2A 08A9 : 46 12 59 A8 A0 3D 92 40 22 08B1 : 47 12 59 A8 DF 48 A8 D0 F1 08B9 : A4 92 CC 31 12 AA 92 22 05 08C1 : 3A 9E 31 30 32 34 00 00 62 08C9 : 00 94
PROGRAMM : UPSIDE-DOWN V2 0801 0896 ----------------------------------- 0801 : 11 08 00 00 9E 32 30 37 C1 0809 : 32 20 AB 20 48 43 45 00 EE 0811 : 00 00 00 00 00 00 00 A0 53 0819 : 40 B9 5B 08 99 2C 01 88 1E 0821 : 10 F7 78 A9 33 85 01 A9 37 0829 : 00 85 F7 A9 D0 85 F8 A0 7D 0831 : 00 B1 F7 AE B9 A3 4A 26 0C 0839 : 02 CA D0 FA 98 49 07 A8 75 0841 : A5 02 91 F7 98 49 07 A8 8C 0849 : C8 D0 E6 E6 F8 A5 F8 C9 44 0851 : E0 D0 DE A9 37 85 01 4C C2 0859 : 2C 01 78 A9 84 8D 18 D0 10 0861 : A9 00 8D 00 DD A9 43 8D C1 0869 : 14 03 A9 01 8D 15 03 58 C8 0871 : 60 A9 00 AA A8 88 BD 00 C1 0879 : 04 99 E8 E2 BD 00 05 99 03 0881 : E8 E1 BD 00 06 99 E8 E0 5C 0889 : BD 00 07 99 E8 DF 88 E8 BD 0891 : D0 E4 4C 31 EA 98
Print Shop und CP 80X
Probleme traten bei Print Shop und angeschlossenem Drucker (Melchers) CP 80X auf. Das lag daran, daß Print Shop nach jeder Druckzeile ein $0A sendet. Dies wird aber vom CP 80X laut Handbuch ignoriert. Abhilfe: Im Programmteil »Syslib« ($8800-$A0C0) die Adresse $9B31 von $0A auf $0D (= 13, entspricht Carriage Return + Linefeed)abändernund beim Setup den Druckertyp »Mannesmann Tally Spirit 80« anwählen. Seit dieser Änderung läuft Print Shop mit CP 80X einwandfrei. Die gesuchte Adresse befindet sich auf der (Original-) Disk im 20. Block, Adresse 5B von »Syslib«.
(Jürgen Römer/tr)Disk-Optimizer
Ein nützliches Utility für Sparsame. Das Programm läuft auf allen Commodore-Computern, wenn man den DIM-Befehl in Zeile 60 demverfügbaren Speicherplatz des jeweiligen Computers anpaßt.
Das Programm (Listing 6) ermöglicht die optimale Ausnutzung der Disketten. Man kann seine Programmsammlung auf die kleinstmögliche Anzahl von Disketten verteilen und belastet damit den schmalen Geldbeutel vieler Computerfreaks nicht so stark. Ein Anwenderprogramm dieser Art ist bis jetzt nicht nur einzigartig, sondern nützt auch wirklich etwas — wird seinem Namen (Utility) also gerecht!
Anwendungsbeispiel:
Wir haben 13 Programme zur Verfügung, die auf möglichst wenige Disketten verteilt werden sollen. Sie haben folgende Blocklängen: 116,153,182,6,33,191,38,84,156,5,86,186,113. Nach dem Programmstart mit »RUN« geben wir die freien Blöcke einer Diskette ein (meistens 664) und anschließend die Blocklängen der 13 Programme in beliebiger Reihenfolge. Vertippt man sich, so kann man mit einer »0« oder einfach RETURN die jeweils letzte Eingabe berichtigen. Zum Abschluß der Eingabe muß die Zahl »999« folgen.
Jetzt sucht das Programm die Blöcke heraus, die addiert die vorher eingegebene Summe ergeben. Damit keine gleichen Zahlenfolgen auf dem Bildschirm erscheinen, sortiert das Programm solche Zahlenfolgen, die bereits schon einmal gefunden wurden, aus. Nach einer Weile sehen wir, daß es mehrere Kombinationen gibt, diese Programme platzsparend auf wenigen Disketten unterzubringen. Wir suchen uns die passenden aus und erhalten durch geschicktes Umkopieren der Programme auf eine oder mehrere Disketten brauchbaren Speicherplatz. Hätten Sie gedacht, daß man mit diesen 13 Programmen so viele verschiedene Möglichkeiten hat, eine Diskette randvoll zu füllen? Die Bedeutung der »Versuche«-Anzeige im Fenster oben links wird in der Programmbeschreibung erklärt. Das Programm sucht so lange nach neuen Folgen, bis Sie durch Drücken der START-/STOP-Taste »S« neu beginnen.
Da das Basic-Programm relativ langsam arbeitet, empfiehlt es sich, es zu compilieren. Erst bei 3- bis 4mal schnellerer Bearbeitungsgeschwindigkeit wird man es gern einsetzen. Die Programmservice-Diskette enthält neben der Basic- auch die compilierte Version.
40 ap=200
50 dl=20
60 dimb(ap),e(ap),z(ap),gs(ap,dl)
80 gosub140
90 gosub210
100 gosub300
110 gosub350
120 goto90
140 print"{clr}{down} disk-optimizer:":print" EEEEEEEEEEEEEEE":input"{down} summe =";s
150 print"{down}bei fehlern '0' eingeben.":print"ende: '999'":print
160 az=az+1:print" zahl"az;:inputb(az)
170 ifb(az)=0thenaz=az-2:print"{up}{up}";:goto160
180 ifb(az)<>999goto160
190 az=az-1
200 print"{clr}summe :"s:print"zahlen :";az:return
210 v=v+1:print"{home}{down}{down}versuch :"v
220 getb$:ifb$="s"thenrun
230 fori=1tot:b(z(i))=e(i):next:t=0:bs=0
240 z%=rnd(1)*az+1:ifb(z%)=0goto240
250 bs=bs+b(z%):t=t+1:e(t)=b(z%):b(z%)=0:z(t)=z%
260 ifbs>sgoto210
270 ifbs=sthenreturn
280 ift=azthenprint"{down}{down}summe aller zahlen ist kleiner als";s:end
290 goto240
300 g=t-1:forx=gto1step-1
310 f=0:fory=1tog:ife(y)<=e(y+1)goto330
320 f=y:m=e(y):e(y)=e(y+1):e(y+1)=m
330 nexty:g=f:iff=0thenreturn
340 nextx:return
350 fora=1togs:forb=1tot
360 ifgs(a,b)<>e(b)thenb=t:nextb,a:goto380
370 nextb:return
380 printchr$(19):gs=gs+1:fori=1torz+3:print:next
390 fori=1tot:gs(gs,i)=e(i):printe(i);:next
400 rz=rz+1:ifrz<20thenreturn
410 geta$:ifa$=""goto410
420 rz=0:goto200
| Zeile | |
| 40— 60 | Die vorgegebene Variablendimensionierung erfordert mindestens den Speicherplatz des C 64. Für kleinere Commodore-Computer muß knapper kalkuliert werden. AP gibt die größtmögliche Anzahl der zu verarbeitenden Programme an. DL gibt die größtmögliche Anzahl von Files auf einer Diskette an. Berechnung siehe im Listing. |
| 80—120 | Hauptschleife mit Unterprogrammen |
| 140—200 | Eingabe der Zahlen (Blocklängen) in B(AZ), AZ = Anzahl |
| 210 | Anzeige der Versuche, die gewünschte Summe (664) zu erhalten. |
| 220 | Abbruchmöglichkeit |
| 230 | Initialisierung |
| 240—250 | Zufälliges Aussuchen einer Blocklänge, doppelte ignorieren |
| 260 | Diskette »überfüllt«, neu suchen |
| 270 | Summe genau erreicht, Diskette voll |
| 280 | Falls alle Blöcke addiert keine Diskette füllen: Abbruch |
| 300—390 | Vergleich vorheriger Zahlenfolgen mit der jetzt gefundenen: falls neu: Bildschirmausgabe; sonst weitersuchen |
| 400—420 | Scrollstop für den Bildschirm, falls unteres Ende erreicht; weiter mit Tastendruck |
LoRes zu HiRes
Diese geniale Maschinenroutine (Listing 7) konvertiert den normalen Low-Resolution-Bildschirm, also den Bildschirm, der nach dem Einschalten aktiv ist, zu einem hochauflösenden Grafikbild und speichert dieses auf Diskette. Es kann sowohl die niedrig auflösende Grafik (Pixel-Grafik) als auch der normale Textbildschirm umgewandelt und gespeichert werden.
Bedienung
Nach dem Laden des Programms mit »LOAD"LORES zu HIRES",8,1« wird die Maschinenroutine mit »SYS 828,"BILDNAME1",8« aufgerufen. Die Parameter nach dem »SYS 828,« entsprechen genau den Angaben hinter dem normalen SAVE-Befehl. Da das Programm frei im Speicher verschiebbar ist, muß man nur die SYS-Startadresse auf den benutzten Speicherbereich anpassen. Ursprünglich liegt die Routine im Kassettenpuffer, wird also von keinem Basic-Programm gestört. Der Aufruf »SYS 828,"NAME",8« kann sowohl im Programm- als auch im Direktmodus erfolgen. Im Direktmodus jedoch wird dann auch der eingegebene SYS-Befehl, der sich noch auf dem Bildschirm befindet, als Bestandteil des Textbildschirms gespeichert.
Anwendung:
Wird von einem LoRes-Grafikbild eine Hardcopy gemacht, so erscheint bei fast allen Druckern zwischen den Bildschirmzeilen ein weißer Streifen. Das ist beim Text ja auch sehr sinnvoll — wie sollte man ihn sonst auch lesen? Bilder werden durch diese Art des Druckes aber leider zerstört.
Nun hilft die »LoRes zu HiRes«-Routine: Man speichert sein Bild als hochauflösende Grafik, lädt es mit Hi-Eddi oder einem sonstigen Malprogramm wieder und kann nun mit diesem Programm eine »heile« Hardcopy erstellen. Wenn diese Hardcopy-Routine Bilder doppelt groß drucken kann (Hi-Eddi!), hat man erstmalig die Möglichkeit, einen LoRes-Bildschirm im Riesenformat auf Papier zu bringen.
Zweites Beispiel:
Wer schon einmal ein schönes Grafikbild mit Hi-Eddi erstellt hat, weiß, wieviel Arbeit das macht. Oft kann man die grobe, geometrische Struktur mit einem Maskengenerator (64’er, Ausgabe 8/85) erstellen. Da man sein Werk jetzt in Hi-Res übertragen kann, ist für die Feinarbeit mit Hi-Eddi schon gute Vorarbeit geleistet.
Drittens: Man kann sogar ein LoRes-Bild, das mit einem anderen Zeichensatz erstellt wurde, weiterverarbeiten! Der Konvertierungsroutine muß nur die Basisadresse des neuen Zeichensatzes mitgeteilt werden. Das High-Byte wird in die Speicherstelle 828 + 55 geschrieben, das Low-Byte muß $00 sein, braucht also nicht extra geändert zu werden.
Das Basic-Programm (Listing 8) ist äquivalent zu dem Maschinen. Interessant ist der Zeitvergleich: In Basic dauert die Hi-Res-Übertragung 2:13 min, in Maschinensprache 0,4 s! Die Basic-Version ist daher weniger zum Abtippen, sondern vielmehr zum leichten Verstehen des Algorithmus gedacht.
PROGRAMM : LORES ZU HIRES 033C 03BA ----------------------------------- 033C : A9 00 8D 0E DC A9 33 85 FD 0344 : 01 A9 04 85 F8 A9 00 85 B3 034C : F7 85 F9 A9 20 85 FA A2 19 0354 : 04 A0 00 8A 48 98 48 A9 B7 035C : 00 85 FC B1 F7 85 FB 06 3C 0364 : FB 26 FC 06 FB 26 FC 06 63 036C : FB 26 FC 18 A5 FC 69 D0 46 0374 : 85 FC A2 00 A0 07 B1 FB 21 037C : 91 F9 88 10 F9 18 A5 F9 19 0384 : 69 08 85 F9 90 02 E6 FA 3C 038C : 68 A8 68 AA C8 D0 C4 E6 AC 0394 : F8 CA D0 BD A9 37 85 01 49 039C : A9 01 8D 0E DC 20 FD AE 0F 03A4 : 20 D4 E1 A9 20 85 FA A9 49 03AC : 00 85 F9 AA A9 F9 A0 40 B0 03B4 : 20 D8 FF 60 01 08 68
10 poke56334,0:poke1,51 20 fori=1024to2023:ba=53248+peek(i)*8 30 forj=0to7:poke8192+z,peek(ba+j):z=z+1:nextj,i 40 poke1,55:poke56334,1