C 64/VC 20
Tips & Tricks

Hex-DATA-Automat

Der Computer programmiert sich selbst — Maschinenprogramme werden automatisch in DATA-Statements mit Prüfsumme umgewandelt.

Ein Maschinenprogramm in ein korrektes Basic-Ladeprogramm umzusetzen, ist sicherlich eine sehr langweilige Programmieraufgabe, außerdem schleichen sich sehr schnell Fehler ein.

Soll diese Umsetzung automatisch erfolgen, müßte sich der Computer — salopp gesagt — selbst programmieren. Dies ist prinzipiell möglich; doch zuvor einige Grundlagen.

Geben Sie hierzu das nebenstehende kleine Testprogramm ein.

100 POKE 2,0
110 ZL=PEEK(2) : POKE 2,ZL+1
120 D$=STR$(ZL+1000)
130 D$=D$+"DATA ABCFDEF”
140 PRINT CHR$(147);D$
150 PRINT ”RUN 110”
160 :
170 :
180 END

Die Programmzeile 100 setzt die Speicheradresse 2 auf Null. Anschließend wird der Wert dieser Adresse nach ZL geholt und die Adresse um eins erhöht. Der STR$-Befehl wandelt den Wert ZL+1000 in einen String, und die Zeile 130 erweitert den String mit »DATA ABCDEF«. Die CHR$-Anweisung löscht anschließend den Bildschirm und schreibt den String »1000 DATA ABCDEF« links oben auf den Bildschirm. Zuletzt wird in der zweiten Bildschirmzeile der Text »RUN 110« gedruckt.

Falls Sie nach RUN die Taste HOME drücken, steht der Cursor auf der Zeile »1000 DATA ABCDEF«. Drücken Sie nun die RETURN-Taste, dann wird die Zeile 1000 in das Programm aufgenommen. Der Cursor steht jetzt auf dem »RUN 110«. Drücken Sie jetzt erneut RETURN, so startet das Programm wieder, und es folgt der nächste Durchgang mit: 1001 DATA ABCDEF RUN 110

Da im ersten Durchlauf der Wert in der Speicherzelle 2 um eins erhöht wurde, lautet die nächste Zeilennummer 1001. Nun könnten Sie wieder (in Handarbeit) HOME/RETURN/RETURN eingeben, doch — und jetzt wird’s interessant — auch dies kann der Computer durchführen. 160 POKE 198,3 170 POKE 631,19:POKE 632,13:POKE 633,13

Geben Sie nun RUN ein. Das Programm erweitert sich nun automatisch — ab der Nummer 1000 — um DATA-Zeilen.

Dies ist möglich, da alle Commodore-Computer mit einem Tastaturpuffer arbeiten. In diesem Zwischenspeicher, der beim VC 20 und C 64 ab der Adresse 631 beginnt, kann sich der Computer bis zu neun Tastatureingaben merken. Die Anzahl der Zeichen in dem Puffer steht in der Adresse 198.

In der vorherigen Programmerweiterung wurde in der Zeile 160 der Wert 3 eingePOKEt. Der Computer meint anschließend, es seien drei Tastatureingaben erfolgt. Die POKE-Befehle in der Zeile 170 simulieren die Eingabesequenz HOME, RETURN, RETURN. Nach dem Programmende vergißt der Computer diese untergeschobenen Eingaben keineswegs, sondern führt sie nachträglich aus.

Aus der Zeit des legendären PET 2001 stammt noch die Bezeichnung »selbsterhaltendes Programm«. Naja, aber so hatte das Kind wenigstens einen Namen.

Leider hat das beschriebene Verfahren den Nachteil, daß der Computer, sobald er sich selbst die Zeile einprogrammiert, die Variablen löscht. Aus diesem Grund müssen Sie wichtige Werte vor dem Programmabbruch durch POKE sichern und beim Neustart mit PEEK zurückholen. In dem vorherigen Testprogramm wurde beispielsweise der Zähler für die Zeilennummer mit der Adresse 2 weiter gegeben.

Das Programm »HEX-DATA-Automatik« arbeitet im Prinzip genau nach dem zuvor beschriebenen Verfahren. Die Umwandlungsroutine wird mit RUN 200 gestartet. Das Programm fragt dann nach der Anfangs- und Endadresse des Maschinenprogramms und wandelt es anschließend in DATA-Zeilen um. Diese haben das folgende Format: 1000 DATA 01,02,03,04,05,…,20, 1234 1001 DATA 11,12,13,14,15,…,40, 5678 1002 DATA …

Nach jeweils 20 Hexadezimal-Daten folgt immer eine Prüfsumme.

Anschließend müssen Sie die DATA-Routine (200—720) löschen und den Schleifenzähler in Zeile 30 anpassen. Falls das Programm veröffentlicht werden soll, können Sie zusätzlich ein Copyrightstatement hinzufügen.

Für diesen Zweck wurde diese Routine auch ursprünglich erstellt. Die Zeilen 10—90 wandeln die Hex-Zahlen wieder um und schreiben das Maschinenprogramm in den entsprechenden Speicherbereich zurück (Zeile 30 beachten).

Das Programm kann in dieser Form sehr leicht abgetippt werden, da Prüfsummenfehler wie folgt angezeigt werden: ZEILE 1000 ZEILE 1001 ZEILE 1002 ZEILE 1003 PRÜFSUMMENFEHLER ! BREAK IN 80

Anschließend müssen nur 20 Daten überprüft werden, so daß auch längere Basic-Lader vergleichsweise schnell und fehlerfrei abgeschrieben werden können.

(Heino Velder/ev)
1 rem *****************************************
2 rem *         ++++ programm-name ++++       *
3 rem *                                       *
4 rem *  stichwort.........................   *
5 rem *  copyright (c) ....................   *
6 rem *                                       *
7 rem *****************************************
8 :
9 :
10 dim h(75) : for i=0 to 9
20 h(48+i)=i : h(65+i)=i+10 : next
30 for i=anfang to schluss: read a$ : rem hier aktuelle werte einsetzen !
40 h=asc(left$(a$,1)):l=asc(right$(a$,1))
50 d=h(h)*16+h(l) : s=s+d : poke i,d
60 a=a+1:if a<20 then next : a=-1
65 print "zeile:";1000+z;
70 read v : z=z+1 : if v=s then 85
80 print" pruefsummenfehler !";999+z:stop
85 if a<0 then end
90 s=0 : a=0 : print : next : end
95 :
96 :
97 :
98 :
99 :
200 rem ***************************************
210 rem *  hex-data-automatik (vc 20 & c64)   *
220 rem *                                     *
230 rem *  data-zeilen programmieren          *
240 rem *      start mit run 200              *
250 rem *                                     *
260 rem ***************************************
270 :
280 :
500 input "start-adresse";a
510 h=int(a/256):l=a-h*256:poke 640,h:poke 641,l
520 input "end/adresse  ";e
530 h=int(e/256):l=e-h*256:poke 642,h:poke 643,l
540 poke 2,1 : if a>e then 500
550 :
560 a=peek(640)*256+peek(641)
570 e=peek(642)*256+peek(643)
580 :
590 dim h$(20):for i=0 to 9 : h$(i)=chr$(i+48)
600 h$(i+10)=chr$(i+65)     : next : z=3
610 :
620 for i=1 to 20 : d=peek(a) : s=s+d
630 h=int(d/16)   : l=d-16*h
640 a$=a$+h$(h)+h$(l)+","
650 if a=e then z=2 : d=peek(2) : goto 670
660 a=a+1 : next : d=peek(2) : poke 2,d+1
670 a$=str$(999+d)+" data "+a$
680 a$=a$+str$(s)
690 h=int(a/256):l=a-h*256:poke 640,h:poke 641,l
700 poke 631,19: poke 632,13 : poke 633,13
710 poke 198,z : print chr$(147);a$
720 print "run 560" : end
Listing »Hex-DATA-Automat«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →