VC 20
Software

Neues vom VC 20 Videochip

Der Video-Chip des VC 20 kann wesentlich mehr als nur die Bildschirmfarben steuern und Musik machen. So läßt sich zum Beispiel mit wenig Aufwand das Bildschirmformat ändern oder zwischen verschiedenen Bildschirmseiten umschalten. Auch die Erzeugung hochauflösender Grafik ist nicht so schwierig, wie es manchem Anfänger scheinen mag.

Bild 1. Bildschirmformat 25 x 20
Bild 2. Bildschirmformat 17 x 29
Bild 3. Das Plotten von Funktionen ist kein Problem mit der Grafikerweiterung
Bild 4. Ein weiteres Beispiel für die Anwendung der neuen Grafikbefehle

Wie bei seinen »großen Brüdern« CBM 4032/8032 wird die Bildschirmdarstellung des VC 20 mit einem speziellen Videocontroller erzeugt. Das Betriebssystem stellt diesen Baustein nach dem Einschalten auf das bekannte Format von 22 Zeichen bei 23 Zeilen ein. Da diese Festlegung softwaremäßig erfolgt, ist es in Grenzen möglich, das Bildschirmformat nachträglich durch POKE-Befehle zu ändern. Leider werden solche interessanten Möglichkeiten des VC 20 (und C 64) von Commodore nur durch die Befehle PEEK und POKE unterstützt. Deshalb an dieser Stelle zunächst ein Exkurs zu den Bits und Bytes. Ein Byte setzt sich aus acht Bits zusammen, aber das wissen Sie ja sicherlich schon. Um in Basic einzelne Bits anzusprechen, muß eine Bit-Kombination zuerst in den entsprechenden Dezimalwert umgerechnet werden. Dies erreicht man mit der folgenden Beispielrechnung:

Bit 7 6 5 4 3 2 1 0
Wert 1 0 0 0 0 0 0 1

= 1↑7*1+2↑6*0+2↑5*0+…+2↑0*1 oder: 2↑7+2↑0
Das Ergebnis aus 2↑7+2↑0 lautet 128+1 also 129. Mit den beiden Basic-Befehlen AND und OR können die Bits gezielt verändert werden. Hierzu ein Beispiel: »R=128 : V=1 : PRINT R OR V«. In Bit-Schreibweise sieht die Rechnung wie folgt aus:

R: 1 0 0 0 0 0 0 0 : 128
V: 0 0 0 0 0 0 0 1 : 1
E: 1 0 0 0 0 0 0 1 = 129

Falls ein Bit in R oder in V (oder in beiden) gesetzt ist, wird dieses Bit auch als »1« in das Ergebnis übernommen. Umgekehrt werden jene Bits zu Null, deren entsprechenden Positionen in beiden Variablen zurückgesetzt sind.

Durch den OR-Befehl können gezielt Bits gesetzt werden. Im Bildschirmspeicher bewirkt das gesetzte siebte Bit, daß das Zeichen invertiert dargestellt wird. Schreiben Sie einmal ein Zeichen links oben auf den Bildschirm. Ermitteln Sie nun den »Z = PEEK(7680)« (PEEK(4096) beim erweiterten VC) den entsprechenden Zeichencode. Durch Z = Z OR 128 wird nun das siebente Bit gesetzt. POKE 7680,Z schreibt den Wert zurück und das Zeichen erscheint invertiert.

Das folgende kurze Programm invertiert den gesamten Bildschirm.

10 A = 7680 : REM ODER 4096!
20 FOR I=0 TO 511 : D = PEEK(I+A)
30 D=D OR 128 : POKE A+I,D : NEXT

Falls Sie die Zeile 30 durch »D = D AND 127:…« ersetzen, werden die zuvor invertierten Zeichen wieder »normal« dargestellt. Durch die BIT-Schreibweise wird dies anschaulich:

R: 1 0 0 0 0 0 0 1 : 129)
V: 0 1 1 1 1 1 1 1 : 127)
E: 0 0 0 0 0 0 0 1 = 1

Alle BIT-Positionen von R werden in das Ergebnis übernommen, sobald die entsprechenden Positionen des Vergleichswertes auf »1« gesetzt sind. Durch D AND 127 wird somit das siebte Bit in D gelöscht.

Die Tabelle 1 zeigt die für unsere Zwecke wichtigsten Register des Video-Chips sowie deren Funktion.

Adresse / BIT 7 6 5 4 3 2 1 0
36864 = HZ HZ HZ HZ HZ HZ HZ : Horizontal-Zentrierung
36865 = VZ VZ VZ VZ VZ VZ VZ VZ : Vertikal-Zentrierung
36866 = BA ZE ZE ZE ZE ZE ZE ZE : Bildschirm-Adresse
: ZEichen pro Zeile
36867 = ZL ZL ZL ZL ZL ZL MA : ZeiLen-Anzahl
: Matrix: (8*8 / 8*16)
36869 = BA BA BA BA ZA ZA ZA ZA : Bildschirm-Adresse
: Zeichensatz-Adresse
Tabelle 1. Einige wenig bekannte, aber recht nützliche Register des VIC-Chips.

Die folgende Tabelle 2 verdeutlicht, wie die Register verändert werden können. Mit dem PEEK-Befehl wird der Inhalt der Speicheradresse abgefragt. Der AND-Befehl löscht nun einen Teilbereich und mit OR X wird zuletzt ein neuer Wert angeknüpft.

Außerdem gibt die Tabelle 2 die Originalwerte für die Variable X an, sowie — in Klammern — den zulässigen Zahlenbereich.

Tabelle 2. So können die Register aus Tabelle 1 verändert werden

Die Adressen 36864/36865 zentrieren die Bilddarstellung auf dem Fernsehgerät oder Monitor. Mit dem Basicprogramm »BILD ZENTRIEREN« (Listing 1) können Sie dies testen. Der Bildausschnitt wird mit den Cursor-Tasten verschoben. Falls Sie die RETURN-Taste drücken, zeigt das Programm die notwendigen POKE-Befehle für die letzte Einstellung und setzt den Bildschirm zuletzt wieder in den Ausgangszustand zurück.

Das Programm »BILDSCHIRMFORMAT« (Listing 2) verändert die Adressen 36866/36867. Mit den Cursor-Tasten wird die Anzahl der Zeilen beziehungsweise die Anzahl der Zeichen pro Zeile verändert. Auch hier können Sie durch Drücken der RETURN-Taste die erforderlichen POKE-Befehle für die letzte Einstellung ermitteln.

Die Bilder 1 und 2 zeigen zwei geänderte Bildformate mit den dazugehörigen POKE-Befehlen.

Zwischen verschiedenen Bildschirmbereichen umschatten

Das Register 36869 legt die Adressen für den Zeichensatz und den Bildschirmspeicher fest. Die Tabelle 2 zeigt vier POKE-Befehle mit den entsprechenden Bildschirm-Startadressen. Falls Sie eine Änderung durchführen, müssen Sie dem Computer die neue Startadresse in dem Zeiger 648 mitteilen. Außerdem müssen noch 25 weitere Zeiger (MSB der Zeilenanfänge) geändert werden. Durch SYS 58775 führt der Computer die notwendigen Berechnungen aus. Die POKE-Befehle in die Adressen 52/53 begrenzen den oberen Speicherbereich und schützen so das Bild-RAM vor dem Überschreiben durch Basic-Variablen.

Die mit einem Doppelkreuz »#« gekennzeichneten Adressen gelten, falls die Bildadresse zusätzlich um 512 Byte nach unten verschoben wurde. Diese »Feinverschiebung« erfolgt durch das siebte Bit der Adresse 36866. Die Tabelle 2 zeigt die beiden POKE-Anweisungen, mit denen diese Umschaltung — beispielsweise zwischen zwei Text- oder Grafikseiten — durchgeführt wird.

Das Programm »BILD-RAM« (Listing 3) verdeutlicht dies. Die Programmzeile 11 schützt den oberen Speicherbereich. Mit GOSUB 80 wird die erste Seite »vorgeblendet«. CHR$(147) löscht die Seite. Zuletzt wird der Text »ERSTE SEITE« gedruckt. Die Zeilen 40 bis 42 wiederholen den Vorgang für die zweite Seite. Die Programmzeilen 50 bis 61 schalten nun — mit einer Verzögerung — abwechselnd die beiden Testseiten ein. So schnell und flimmerfrei kann dies kein anderes Commodore-System.

Falls Sie nach dem Umschalten mit dem Register 36866 die Zeile »POKE 648,…:SYS 58775« weglassen, wird sich die Bildanzeige zwar ändern; PRINT-Befehle gelangen jedoch weiterhin in die alte — nun unsichtbare — Seite.

Eigene Zeichen definieren

Aus der Tabelle 1 kann man ablesen, daß nur die oberen vier Bits der Adresse 36869 das Bild-RAM verschieben. Die restlichen Bits bestimmen die Lage des Zeichensatzes im Speicher. Durch die in der Tabelle 2 angegebenen OR-Verknüpfungen kann der Zeichensatz ins RAM gelegt werden. Nur »OR 15« stellt eine Ausnahme dar, da hierdurch die unteren 128 Zeichen aus dem RAM, die oberen — invertierten — Zeichen weiterhin aus dem ROM geholt werden. Diese Zeichen erscheinen dann aber »nichtinvertiert«.

In dem Programm »PROG. ZEICHENSATZ« (Listing 4) werden die notwendigen Änderungen in der Programmzeile 30 vorgenommen. Nach »POKE 36869,240« lautet die Startadresse des Bildschirm-RAMs 7680. Der Wert »+15« verschiebt den Zeichensatz zur Adresse 7168.

Im einzelnen schreibt das Programm den gesamten Zeichensatz des VC 20 auf den Bildschirm. Dabei werden die Zeichen durch »POKE 38400+1,0« in der Farbe Schwarz gedruckt. Die Zeile 30 verändert dann die Zeiger, so daß die ersten 128 Zeichen den zufälligen Inhalt des Zeichensatz-RAMs wiedergeben. Der Zeichensatzspeicher wird dann in den folgenden Zeilen gesetzt und anschließend gelöscht. Zuletzt werden noch die Originalzeichen aus dem ROM in das RAM »gePOKEt«. Die Zeile 55 schaltet den programmierten Zeichensatz wieder ab.

Falls Sie mit dem Zeichensatz experimentieren wollen, brauchen Sie nur die letzte Zeile wegzulassen. Alle »ungeshifteten« Zeichen können dann verändert werden. Zuerst müssen Sie jedoch ermitteln, wohin Sie »POKEn« müssen. Schreiben Sie hierzu das Zeichen, das Sie ändern wollen, links oben auf den Bildschirm. Mit »PRINT PEEK(7680)« kann dann der dazugehörige Code ermittelt werden. Der Wert muß nun mit acht multipliziert werden, da zu jedem Zeichen acht Byte gehören. Zuletzt müssen Sie noch die Startadresse des Zeichensatzes (hier 7168) hinzuaddieren. Für den Buchstaben »A« lautet die richtige Adresse 7174. POKEn Sie einmal den Wert 129 an diese Adresse. In Bit-Form sieht das wie folgt aus: 129 gibt 10000001.

Genauso wird anschließend die erste Zeile in dem Buchstaben »A« aussehen; rechts und links außen je ein Pünktchen. Verändert Sie auch einmal die nächsten Adressen oder versuchen Sie den Umlaut »Ä« zu gestalten.

Nach der Theorie nun ein praktisches Grafikbeispiel. Das abschreckend lange Basic-Ladeprogramm (Listing 5) erweitert den Basic-Befehlssatz des VC 20 (ohne Speichererweiterung) um sieben weitere Anweisungen (COPY, GNEW, GON, GOFF, PLOT, TURN und CLEAR). Beim Eintippen sollten Sie jedoch die Zeilen 10 bis 32 durch das Programm »Prüfsumme« (Listing 6) ersetzen. Nach RUN können Sie mit Hilfe der Tabelle 3 überprüfen, ob Sie die Daten fehlerfrei eingegeben haben. Die Prüfsummen gelten jeweils für eine DATA-Zeile.

Zeile 50-54 2390 2436 2823 2640 3449
Zeile 55-59 3487 3010 3321 2882 2608
Zeile 60-64 2930 2741 2458 3089 2285
Zeile 65-69 2480 2156 2935 3048 2241
Zeile 70-74 2495 2564 3256 2723 2393
Zeile 75-79 1864 2230 2187 2148 3300
Zeile 80-84 3135 2640 3023 2734 1918
Zeile 85-88 2258 1431 1564 449 -
Tabelle 3. Prüfsummen zum Grafikprogramm

Nachdem Sie das Ladeprogramm (Zeile 10 bis 32) hinzugenommen haben, muß das Programm unbedingt abgespeichert werden. Nach RUN sucht das Programm die Zeile 32 (also nicht weglassen) und überträgt die Daten ab dieser Adresse in den Speicher. In den Programmzeilen 22 bis 24 wird das Maschinenprogramm zuletzt in den oberen RAM-Bereich übertragen und durch die folgenden POKE-Befehle geschützt. Der NEW-Befehl löscht zuletzt das — ohnehin zerstörte — Programm.

Mit SYS 6273 können die Befehle jetzt eingeschaltet werden. Bei 2173 BYTES FREE nähert man sich natürlich gefährlich dem »Sinclair-Syndrom«.

Nach dem Einschalten fällt zuerst ein neuer Cursor auf. In der invertierten Blinkphase des Cursors wird ein »graues« Viereck (COMMODORE-SHIFT »+«) gedruckt. Dies ist notwendig, da der Zeichensatz keine invertierten Zeichen mehr umfaßt und deshalb der Cursor nicht mehr blinken würde. Durch das Grafikprogramm werden alle 64 umgeshifteten Zeichen programmierbar. Der Zeichensatzspeicher beginnt — wie in dem kleinen Textprogramm »PROG. ZEICHENSATZ« (Listing 4) — an der Adresse 7168. Mit dem Befehl »COPY« wird der Originalzeichensatz aus dem ROM in diesen Bereich kopiert.

Der Befehl »GON« schaltet nun den Grafik-Modus ein. Da zuvor der Originalzeichensatz ins RAM kopiert wurde, werden sich die ersten 64 Zeichen nicht verändern. Falls invertierte Zeichen auf dem Bildschirm stehen, werden diese jetzt nichtinvertiert wiedergegeben. Nur bei den geshifteten Zeichen (außer den invertierten) gibt es einen Totalausfall, aber bei 3,5 KByte Speicherraum muß man schon gewisse Mängel in Kauf nehmen. Mit »GOFF« wird der Zeichensatz wieder ins ROM verlegt, so daß alle Zeichen sichtbar werden.

Die drei Befehle PLOT/CLEAR/TURN setzen, löschen oder invertieren einen Bildpunkt. Natürlich muß hinter den Befehlen eine X- und Y-Koordinate angegeben werden. Beispielsweise »PLOT 176,1«; allerdings führt diese Eingabe zu der Fehlermeldung X-ERROR (IN…), da der zulässige Wertebereich für die X-Koordinate 0 bis 175 (22 Zeichen * 8 — 1), und für die Y-Koordinate 0 bis 183 (23 Zeichen * 8 — 1) beträgt.

Der Wertebereich für die Koordinatenangabe wird durch den letzten Befehl »GNEW« ermittelt, da das Bildschirmformat — wie zuvor beschrieben — per Software geändert werden kann. Bei einer Einstellung mit beispielsweise 25 Zeichen pro Zeile kann der Wert für X zwischen 0 und 199 variieren.

Außerdem löscht der GNEW-Befehl die 64 programmierbaren Zeichen sowie alle nichtinvertierten Zeichen auf dem Bildschirm. Da sich eine Grafik jedoch aus genau solchen Zeichen zusammensetzt, wird — falls sich eine Zeichnung auf dem Bildschirm befindet — diese gelöscht. Invertierte Zeichen werden hingeben nicht verändert, so daß Texte oder Beschriftungen erhalten bleiben.

Doch nun ein Beispiel:

10 PRINT CHR$(147);CHR$(18);
20 PRINT »TEST-PROGRAMM«
30 GNEW
40 GON
50 FORI = 0 TO 111
60 : PLOT I,I
70 NEXT
80 POKE 198,0:WAIT 198,1
90 GOFF

In den Zeilen 10 bis 20 wird der Bildschirm gelöscht und der invertierte Text »TEXT-PROGRAMME« geschrieben. Der Befehl »GNEW« löscht den Grafikspeicher und den Bildschirm, wobei der invertierte Text unverändert bleibt. GON schaltet dann die Grafik ein und in der Schleife wird eine Linie von links unten nach rechts oben (in der augenblicklichen Schriftfarbe) gezeichnet. Sobald Sie eine Taste drücken, wird die Grafik wieder abgeschaltet und Sie sehen eine schräge Linie aus Fragezeichen.

Das Maschinenprogramm schreibt ein programmierbares Zeichen auf den Bildschirm und ändert den Grafikinhalt dieses Zeichens. Anschließend wird geprüft, ob schon ein Zeichen mit genau dieser Grafik umdefiniert wurde. Ist dies der Fall, so wird das gefundene Zeichen auf den Bildschirm gebracht und das alte Zeichen ist wieder frei. Wegen dieser Optimierungs-Routine »verbraucht« das Beispielprogramm nur ein Zeichen aus dem schmalen Vorrat von 64 programmierbaren Zeichen.

Da diese Optimierung über einen Vektor verläuft, kann sie durch »POKE 1,PEEK(1)-1« abgeschaltet werden. Lassen Sie das Testprogramm erneut laufen und sehen Sie sich das neue Ergebnis an. Mit »POKE 1,PEEK(1)+1« optimiert das Programm wieder, wird aber auch etwas langsamer.

Durch »PEEK(0)« können Sie außerdem abfragen, wie viele Zeichen noch frei sind. Hierdurch kann die Fehlermeldung »CHARACTER-ERROR (IN…)« verhindert werden. Falls PEEK(0) den Wert Null ergibt, sollten keine Grafikbefehle mehr folgen.

Ändern Sie nun die Zeile 60 des Testprogramms in »60 TURN I,I« und erweitern Sie folgende Zeile mit »GOTO 50«.

Das Programm wird jetzt eine Linie ziehen, anschließend löschen und so fort, da die Bildpunkte jetzt fortlaufend invertiert werden. Falls Sie in der Zeile 40 den Befehle »GON« durch »GOFF« ersetzen, können Sie anschaulich verfolgen, wie das Programm — und speziell die Optimierung — arbeitet.

Eine Besonderheit müssen Sie jedoch unbedingt beachten. Die neuen Basicbefehle können nicht direkt hinter einer THEN-Anweisung stehen. Am einfachsten ist es, die beiden Befehle dann durch einen Doppelpunkt (…THEN : COPY) zu trennen.

Zuletzt eine Grafik-Anwendung. Die Bilder 3 und 4 zeigen, welche Ergebnisse mit der Grafik-Erweiterung möglich sind. Das Basicprogramm »FUNKTIONS-PLOT« (Listing 7) vereinfacht das programmierte Plotten von Funktionen doch erheblich.

Nachdem Sie das Programm eingegeben und gestartet haben, werden Sie nach dem Wertebereich gefragt. Anschließend wird die Bildumrahmung gezeichnet. Die Größe sowie die Position des Diagramms auf dem Bildschirm ist durch die Variablen Unten, Oben, Rechts und Links (U,O,R,L) in der Zeile 110 festgelegt. Die Zeilen 170 bis 230 berechnen nun das Minimum sowie das Maximum der Funktion. Außerdem werden die Werte in das Feld Y(A) übertragen. Die Variablen MI und MA werden in Zeile 250 auf vier Nachkommastellen begrenzt. Diese Werte sowie die Funktion selbst werden nun (invertiert) im unteren Bildteil gedruckt. Nachdem die Funktion grafisch dargestellt wurde, läuft das Programm in Zeile 390 in einer Warteschleife.

Drücken Sie jetzt eine Taste, so gelangen Sie in ein Mini-Menü. Sie können nun eine neue Funktion eingeben oder die alte mit neuen Werten untersuchen.

Eine neue Funktion wird in der Zeile 450 mit INPUT A$ übergeben. Salopp gesagt, programmiert sich der Copmputer in den folgenden Zeilen selbst. Wie das?

Zuerst wird der Bildschirm gelöscht und in der obersten Zeile die Zeilennummer 190 und der String A$, der die neue Funktion enthält, gedruckt. Die Zeile 460 druckt darunter die Nummer 190 und einen PRINT-Befehl. Anschließend folgt ein Anführungszeichen, dann die Funktion und schließlich wieder ein Anführungszeichen. Zuletzt wird in der dritten Bildschirmzeile der Befehl »RUN« gedruckt. Jetzt könnte auf dem Bildschirm der folgende Text stehen:

190 Y=COS(X)
290 ?"Y=COS(X)"
RUN

Wäre das Programm hier zu Ende, so müßten Sie nur die HOME-Taste drücken und der Cursor würde auf der Zeile 190 stehen. Drückt man jetzt RETURN, so wird diese Zeile einprogrammiert. Ein erneuertes RETURN übernimmt die Zeile 290 in das Programm und beim dritten RETURN wird der Befehl RUN ausgeführt. Da sich der Computer bis zu neun Tastatureingaben »merken« kann, brauchen Sie diesen Ablauf nicht »von Hand« einzugeben. Der erste POKE-Befehl in der Zeile 470 sagt dem Computer, daß — angeblich — sechs Tasten gedrückt worden sind. Zuerst »CURSOR HOME« (POKE 631,19), und dann fünfmal »RETURN« (Zeile 480). Nach dem END-Befehl führt er diese — untergeschobenen — Eingaben aus, programmiert die beiden Programmzeilen ein und startet sich zuletzt wieder mit dem RUN-Befehl.

Dieses Verfahren ist übrigens sehr praktisch, falls man ein Maschinenprogramm in DATA-Zeilen umwandeln muß. Vorausgesetzt das notwendige Programm ist fehlerfrei, kann man eigentlich sicher sein, daß es der Basic-Lader anschließend auch ist.

Wie Sie an dem Funktions-Plotter sehen können, ermöglicht die Grafikhilfe die Programmierung auch komplexerer Grafiken in einfacher und überschaubarer Form. Da die Erstellung der Grafik recht schnell erfolgt, ist eine große Vielfalt von Anwendungen denkbar.

(Heino Verder/ev)
10 rem ******* bild zentrieren ********
15 :
20 h=12       : v=38
25 poke 198,0 : wait 198,1 : get a$
30 if a$=chr$( 13)           then 60
35 if a$=chr$( 17) and v<255 then v=v+1
40 if a$=chr$(145) and v>0   then v=v-1
45 if a$=chr$( 29) and h<23  then h=h+1
50 if a$=chr$(157) and h>1   then h=h-1
55 poke 36864,h :poke 36865,v:goto 25
60 poke 36864,12:poke 36865,38
65 print "poke 36864 ,";h
70 print "poke 36865 ,";v
Listing 1. »Bild zentrieren«
10 rem ****** bildschirm-format *******
15 :
20 v=46       : h=22+128
25 poke 198,0 : wait 198,1 : get a$
30 if a$=chr$( 13)           then 60
35 if a$=chr$( 17) and v<100 then v=v+2
40 if a$=chr$(145) and v>2   then v=v-2
45 if a$=chr$( 29) and h<155 then h=h+1
50 if a$=chr$(157) and h>128 then h=h-1
55 poke 36866,h :poke 36867,v  :goto 25
60 poke 36867,46:poke 36866,150
65 print "poke 36866 ,";h
70 print "poke 36867 ,";v
Listing 2. »Bildschirmformat«
1 rem ***** bild-ram *****
2 :
10 d=36866:p1=30:p2=28
11 poke 52,p2:poke 56,p2
15 :
30 gosub 80
31 print chr$(147):print
32 print" erste seite"
35 :
40 gosub 90
41 print chr$(147):print
42 print" zweite seite"
45 :
50 for z=0 to 300:next
51 gosub 80
60 for z=0 to 300:next
61 gosub 90      :goto 50
70 :
80 poke d,peek(d) or 128
81 poke 648,p1:sys 58775
82 return
85 :
90 poke d,peek(d) and 127
91 poke 648,p2:sys 58775
93 return
Listing 3. »Bild-RAM« - Umschalten zwischen zwei Bildschirmseiten
10 rem ******* prog. zeichensatz ******
11 :
12 poke 52,26         :poke 56,26
15 :
20 for i=0 to 255     :poke 7680+i,i
25 poke 38400+i,0     :next
30 poke 36869,240+15
35 for i=7168 to 7679 :poke i,255:next
40 for i=7168 to 7679 :poke i,0  :next
45 for i=0    to  511 :c=peek(32768+i)
50 poke 7168+i,c      :next
55 poke 36869,240+0
Listing 4. »Programmierbarer Zeichensatz«
10 for i=4096 to 9999:if peek(i)<>42then next
12 a=i:for i=0 to 896:read a$:d=0:print"";i
14 for l=1 to 2:if len(a$)<2then a$="0"+a$
16 w$=mid$(a$,l,1):w=0:if w$=""then 18
18 w=asc(w$)-48   :if w>9 then w=w-7
20 :
22 d=d+w*16^(2-l) :next:poke i+a,d:next
24 for i=0 to 896:d=peek(a+i):poke 6272+i,d:next
26 poke 51,128 : poke 52,24
28 poke 55,128 : poke 56,24  :new
30 :
32 rem **********
50 data ea,ea,ea,78,a9,bc,8d,14,3,a9,18,8d,15,3,a9,18,8d,8,3,a9,19,8d,9
51 data 3,a9,11,85,1,a9,1b,85,2,8d,f2,1b,58,60,78,a9,bf,8d,14,3,a9,ea,8d
52 data 15,3,a9,e4,8d,8,3,a9,c7,8d,9,3,58,60,ad,f2,1b,f0,d,ce,f2,1b,a4,d3
53 data b1,d1,8d,f1,1b,8d,f0,1b,a9,18,48,a9,db,48,8,8,8,8,4c,bf,ea,ae,5
54 data 90,e8,d0,0,a4,d3,a6,cc,d0,2e,ad,f1,1b,f0,8,8e,f1,1b,b1,d1,8d,f0
55 data 1b,a5,c6,f0,e,a5,cb,c9,1b,f0,5,ee,f2,1b,d0,9,ee,f1,1b,a9,e6,a6,cf
56 data d0,3,ad,f0,1b,d1,d1,f0,2,91,d1,4c,18,eb,a9,7,85,58,a9,0,48,aa,ca
57 data a0,0,c8,e8,bd,ab,1b,f0,f,d1,7a,f0,f5,18,68,69,8,c6,58,d0,e8,4c,e4
58 data c7,68,88,98,18,65,7a,85,7a,90,2,e6,7b,bd,ac,1b,85,f7,bd,ad,1b,85
59 data f8,20,55,19,4c,18,19,6c,f7,0,a2,ff,d0,2,a2,f0,8e,5,90,60,a0,0,a2
60 data 2,84,62,84,64,a9,80,85,63,a9,1c,85,65,b1,62,91,64,c8,d0,f9,e6,63
61 data e6,65,ca,d0,f2,60,ad,2,90,29,7f,8d,f5,1b,a,a,a,8d,f4,1b,ad,3,90
62 data 29,7e,a,a,8d,f3,1b,ce,f3,1b,a9,1c,85,63,a9,1e,85,65,a0,0,84,62,84
63 data 64,a2,1,a9,0,91,62,b1,64,30,4,a9,a0,91,64,c8,d0,f1,e6,63,e6,65,ca
64 data 10,ea,a2,3f,86,0,a2,7f,a9,0,9d,50,3,ca,10,fa,60,a2,0,2c,a2,2,2c
65 data a2,4,bd,e0,1b,8d,40,3,bd,e1,1b,8d,41,3,20,73,0,20,8a,cd,20,f7,d7
66 data a0,58,a6,15,d0,29,8e,43,3,a5,14,8d,42,3,cd,f4,1b,b0,1c,20,79,0,20
67 data fd,ce,20,8a,cd,20,f7,d7,a5,15,d0,8,ad,f3,1b,38,e5,14,b0,17,a9,59
68 data d0,2,a9,58,20,d2,ff,a9,2d,20,d2,ff,20,7a,c6,c8,a9,6b,4c,67,c4,aa
69 data 20,98,1b,8e,45,3,a9,1e,85,5b,a9,0,c0,0,f0,b,18,6d,f5,1b,90,2,e6
70 data 5b,88,d0,f5,85,5a,ae,42,3,20,98,1b,ad,43,3,f0,5,98,18,69,20,a8,a9
71 data 0,e8,38,6a,ca,d0,fc,86,fd,8d,44,3,b1,5a,8d,47,3,30,15,c5,0,90,11
72 data aa,bd,50,3,d0,6,b1,5a,c5,0,b0,3a,de,50,3,e6,fd,a5,fb,f0,9,c6,fb
73 data a6,fb,bd,e8,3,d0,11,a5,0,d0,b,58,a9,e6,a0,1b,20,1e,cb,4c,22,1a,c6
74 data 0,91,5a,aa,a5,5a,18,69,0,85,58,a5,5b,69,78,85,59,ad,86,2,91,58,8a
75 data 78,85,fc,8c,46,3,a2,0,86,59,a,26,59,a,26,59,a,26,59,18,69,0,85,58
76 data a5,59,69,1c,85,59,a5,fd,f0,24,a9,0,85,5e,ad,47,3,a,26,5e,a,26,5e
77 data a,26,5e,18,69,0,85,5d,a5,5e,69,1c,85,5e,a0,7,b1,5d,91,58,88,10,f9
78 data ac,45,3,ad,44,3,20,8a,1b,91,58,58,6c,1,0,60,78,a0,7,84,fd,b1,58
79 data 99,e0,3,d0,2,c6,fd,88,10,f4,e6,fd,d0,4,a9,a0,d0,24,a9,1e,85,5e,a9
80 data 0,85,5d,a2,40,d0,42,a0,7,e4,fc,f0,3c,e4,0,f0,48,b1,5d,d9,e0,3,d0
81 data 31,88,10,f6,fe,50,3,8a,ac,46,3,91,5a,a6,fc,bd,50,3,f0,3,de,50,3
82 data 8a,e6,0,c5,0,f0,9,c6,0,a6,fb,9d,e8,3,e6,fb,a0,7,a9,0,91,58,88,10
83 data fb,30,10,a5,5d,38,e9,8,b0,2,c6,5e,85,5d,ca,e4,0,d0,ae,58,60,6c,40
84 data 3,11,58,60,51,58,60,49,ff,31,58,60,a0,0,8a,10,4,a0,10,29,7f,aa,38
85 data e9,8,90,3,c8,d0,f7,60,50,4c,4f,54,0,d1,19,0,54,55,52,4e,0,d4,19
86 data 0,43,4c,45,41,52,0,d7,19,43,4f,50,59,0,62,19,0,cb,4e,0,58,19,0,0
87 data 0,cb,46,46,0,5c,19,0,0,47,a2,0,81,19,8d,1b,90,1b,93,1b,43,48,41
88 data 52,41,43,54,45,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
Listing 5. Basic-Ladeprogramm zur Befehlserweiterung
10 rem ********* pruefsumme **********
12 zd=50:a=i:for i=0 to 896:read a$
14 zl=peek(63)+peek(64)*256:d=0
16 if zl=zd then 20
18 print "zeile";zd;c : zd=zl : c=0
20 for l=1 to 2:if len(a$)<2then a$="0"+a$
22 w$=mid$(a$,l,1):w=0:if w$=""then 24
24 w=asc(w$)-48   :if w>9 then w=w-7
26 :
28 d=d+w*16^(2-l) :next : c=c+d : s=s+1
30 next : print "zeile";zd,c    : end
32 :
Listing 6. Prüfsummenprogramm zum Basic-Lader aus Listing 5. Das Zeichen »^« in Zeile 28 ist der Hochpfeil (»↑«)
100 clr:input"{clr}{rvon} wertebereich";x1,x2
110 u=80:o=183:l=0:r=175:d=r-l:k=10000
120 gnew:gon:dim y(d):if x1=x2 then 100
130 for a=l to r:plot a,u:plot a,0:next
140 for a=u to o:plot l,a:plot r,a:next
150 if x1>x2 then z=x1:x1=x2:x2=z
160 :
170 sx=(x2-x1)/d:x=x1:mi=1e38:p=mi:ma=-mi
180 for a=0 to d
190 y=sin(x)+sin(2*x)
200 if y>ma then ma=y
210 if y<mi then mi=y
220 if abs(y)<p then p=abs(y):n=a
230 y(a)=y:x=x+sx:next:sy=(ma-mi)/(o-u-5)
240 :
250 mi=int(mi*k)/k:ma=int(ma*k)/k:k=0
260 print"{home}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{rght}  ";:t1=k
270 t2=len(str$(x1))-len(str$(mi))
280 if t2<k then t1=-t2:t2=k
290 print "y=sin(x)*sin(2*x)"
300 print tab(t1);"{rvon}{down}";x1;"<x<";x2
310 print tab(t2);"{rvon}" ;mi;"<y<";ma
320 if mi>=k and ma>=k or mi<=k and ma<=k then 340
330 p=u+3+int((y(n)-mi)/sy):for a=l to r:plot a,p:next
340 if x1>=k and x2>=k or x1<=k and x2 <=k then 360
350 p=int(abs(x1)/sx):for a=u to 0:plot p,a:next
360 :
370 for a=l to r:p=u+3+int((y(a-l)-mi)/sy)
380 plot a,p:if peek(k) then next
390 poke 198,0:wait 198,1:get a$
400 print"{clr}{rvon} f => funktion"
410 print"{rvon} w => wertebereich"
420 wait 198,1:get a$
430 if a$= "w" then 100
440 if a$<>"f" then 420
450 copy:input "{clr} funktion";a$:print "{clr} 190";a$
460 print"290 ?";chr$(34);a$;chr$(34)
470 print "run ":poke 198,6:poke 631,19
480 for i=632 to 636:poke i,13:next:end
Listing 7. Basicprogramm »Funktions-Plot« zur Demonstration der neuen Grafikbefehle
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →