C 64/VC 20
Tips & Tricks

Datawandler

Mit dem Datawandler ist es auch dem »Nur-Basicprogrammierer« möglich, Maschinensprachprogramme (oder Teile davon), die in Form eines Basic-Laders (also über DATAs und POKE-Befehle) eingetippt wurden, als Maschinensprache abzuspeichern. Dadurch ergibt sich auf der Diskette eine Platz-, beim Laden eine Zeitersparnis.

»Bitte warten — ich lese Daten« — so oder ähnlich wird der »Basicprogrammierer« nach dem Programmstart darauf aufmerksam gemacht, daß bei jedem RUN eines Basicprogramms die Maschinenspracheteile DATA für DATA in die Speicherzellen gePOKEt werden. Warum also nicht die DATAs gleich wieder als Maschinensprache abspeichern! Aber es ergibt sich nicht nur eine Zeitersparnis beim Programmlauf, sondern auch beim Laden, da auf der Diskette oder Kassette weniger Speicherplatz benötigt wird (zum Vergleich: der Schatzsucher aus der Ausgabe 6 belegt auf der Diskette als Basicprogramm 72 Blöcke, als Kombination Basic/Maschinensprache nur noch 44 — außerdem startet dieses Programm dann in Sekundenbruchteilen).

Darüber hinaus bestehen viele Hilfsprogramme, die auf Maschinenroutinen zurückzugreifen, nur aus der Zeile »FORI=xTOxx:READx:POKEI,x:NEXTI« und vielen, vielen DATAs. Derartige Programme bieten sich für den Datawandler von selbst an, da sie nach der Umformung geladen werden können, ohne ein eventuell im Basicspeicher stehendes Programm zu zerstören.

Zum Programm selbst

Vor dem Start des Datawandlers müssen die Daten im Speicher stehen — falls sie nur in Form von DATA-Zeilen vorhanden sind, wird in Zeile 60130 eingefügt:
60130 FORI=AA TO EA:READX:POKEI,X:NEXTI
In den Zeilen 60030 — 60040 wird (in dezimaler Form) die Anfangs- und Endadresse abgefragt, unter der die DATAs »abgelegt« sind und den Variablen AA beziehungsweise EA zugeordnet. Die Zeilen 60050 bis 60100 dienen der Abklärung, ob das abzuspeichernde Programm auch wieder an die Adresse geladen werden soll, wo derzeit die DATA stehen (durch das Verschieben der Ladeadresse ist auch ein leichteres Experimentieren in den Autostartbereichen möglich, die dem Programmierer gelegentlich nach den ersten »POKEs« das Konzept aus der Hand nehmen).

Wird die Abfrage mit »N« beantwortet, so wird nach dieser späteren Ladeabdresse gefragt — lautet die Antwort »J«, so wird die Ladeadresse = derzeitige Anfangsadresse (LA=AA) und nach dem Namen gefragt, unter dem das Programm nun abgespeichert werden soll (Zeile 60120).
Zeile 60130 — siehe oben.

So dann wird der Floppykanal geöffnet (Zeile 60140), die dezimalen Eingaben auf »Diskettenformat« gebracht (Zeile 60150), damit die ersten beiden Bytes auf der Diskette als Ladeadresse geschrieben werden können (Zeile 60160). In den Zeilen 60170 bis 60190 werden schließlich die Daten ausgelesen und direkt auf die Diskette geschrieben. Die übrigen Zeilen dienen der Abfrage des Fehlerkanals der Floppy beziehungsweise schließlich der »Fertig«-Meldung.

Weitere Hinweise:

  1. Das Programm ist in dieser Form sowohl für den VC 20 als auch für den C 64 verwendbar.
  2. Bei entsprechender Abänderung des OPEN-Befehls sollte auch die Abspeicherung auf Kassette möglich sein (die Zeilen 60200 bis 60240 entfallen dann).
  3. Vor dem Abspeichern sollten die DATAs natürlich korrekt sein, da nach dem Abspeichern eine Überprüfung noch schwieriger ist.
    Bei Basicprogrammen sollten deshalb der Basicteil und die DATAs zunächst unabhängig voneinander eingegeben, zum Probelauf mit »MERGE« zusammengefügt und bei Fehlerlosigkeit der DATA-Teil dann entsprechend abgespeichert werden.
  4. Die »eigenständigen« Maschinenprogamme werden dann mit LOAD’xy’,8,1 geladen und mit dem SYS-Befehl gestartet. Bei Basicprogrammen sollte dann (sofern nicht ein Autostartprogramm zum Laden aller Teile verwendet wird), die erste Programmzeile lauten:
    IFA=0THENA=1: LOAD »Name des Maschinenspracheteils«,8,1
    — das klingt zwar paradox, aber es funktioniert: nach dem RUN wird dann geladen und gestartet.
    Daß in einem solchen Basicprogramm alle READ-Befehle etc. ausgebaut werden müssen, versteht sich wohl von selbst.
(Uwe Christian Parpart/gk)
60000 rem *** datawandler ***
60010 rem *** (c) uwe chr. parpart ***
60020 print"{clr}{down}    *** d a t a w a n d l e r ***"
60030 input"{down} jetzige anfangsadresse";aa
60040 input"{down}     jetzige endadresse";ea
60050 print"{down} ist die anfangsadresse identisch"
60060 print"{down} mit spaeterer ladeadresse (j/n)?"
60070 geta$:ifa$=""then60070
60080 ifa$="j"thenla=aa:goto60120
60090 ifa$="n"then60110
60100 goto 60070
60110 input"{down}   spaetere ladeadresse";la
60120 input"{down} name des programms";l$
60130 open1,8,1,l$+",p,w"
60140 hb=int(la/256):lb=la-hb*256
60150 print#1,chr$(lb);chr$(hb);
60160 fori=aatoea
60170 print#1,chr$(peek(i));
60180 nexti:close1
60190 rem *** abfrage fehlerkanal ***
60200 open1,8,15
60210 input#1,a,b$,c,d
60220 printa;b$;c;d
60230 close1
60240 print"{rght}{rght}{down}{down}{rvon}f e r t i g !{rvof}"
60250 end
Listing »Datawandler«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →