VC 20
Grafik

Der VC 20 als Laterna Magica

Laterna Magica macht Spiele beweglicher und professioneller. Man kann Zeichen und zusammengesetzte Bilder nicht nur entwickeln, sondern auch bewegen, pulsieren, rotieren oder explodieren lassen und in eigene Programme einbauen.

Der Bildeditor

»Laterna Magica« ist für jeden VC 20 gedacht, sei er erweitert oder nicht. Als Peripherie wird ein Floppy-Disk-Laufwerk VC-1541 vorausgesetzt. Das Programm kann aber für die Datasette umgeschrieben werden, indem die Gerätenummer 8 in Zeile 60 des DATA-Laders in eine 1 umgewandelt wird. Außerdem muß es dann im Hauptprogramm heißen: 490 PRINT”SAVE”CHR$(34)” ”CHR$(34)”,1,1”

Das Programm (Listing 1) ist nicht mehr zu erweitern, es können also auch keine REM-Zeilen mehr eingefügt werden. Es sieht zwar als Listing nicht sehr umfangreich aus, jedoch mußte das Basic-Ende heruntergesetzt werden, um das Maschinenprogramm, den neuen Zeichengenerator und den Speicherplatz, in dem wir später unsere Ersatzbilder speichern, vor Überschreibung zu schützen. Die Erzeugung von Grafik beim VC 20 beruht ja darauf, die Zeichen auf dem Bildschirm, die aus 88 Punkten aufgebaut sind, in ihrem Aufbau zu ändern. Bei einem Zeichen hieße es, 8 Byte gegen 8 andere auszutauschen. Bei 9 Zeichen (das ist die Zeichenanzahl, mit der »Lanterna Magica« arbeitet) werden es 72 Byte. Versuchte man das Problem mit Basic zu lösen, müßte man bei jedem Tauschvorgang eine Zählschleife von 1 bis 72 mit einigen POKEs dazwischen in Kauf nehmen. So etwas kann Action-Spiele ganz schön langsam machen. Ich habe diese Routine daher in Maschinensprache geschrieben. So genügt ein SYS-Aufruf, und 9 Zeichen auf dem Bildschirm ändern sofort ihre Form.

Ausgeführt werden kann der Tausch nur, wenn der Zeichengenerator nicht wie üblich im ROM liegt. Das ist also die erste Aufgabe des Maschinenprogramms. Es legt den Zeichengenerator ins RAM ab $1C00(entspricht dezimal 7168). Danach holt es sich aus dem Reserve-Bildschirmspeicher ($1A00 bis $1BFF, dezimal 6656 bis 7167) die ersten 72 Byte und legt sie im Bildschirmspeicher ab. Das ist zunächst alles. Beim nächsten Aufruf verfährt es mit den folgenden 72 Byte in gleicher Weise. Das geht siebenmal so, danach werden wieder die ersten 72 Byte geholt und so weiter.

Wichtig ist, daß vor jedem Aufruf in die Speicher $FB und $FC (dezimal 251 und 252) ein Wert von maximal 7 gePOKEt wird. An diesem Wert erkennt das Maschinenprogramm, wievielmal es die Bilder austauschen soll, bis es wieder beim ersten beginnt. Das bedeutet, daß man auch »Filme« mit nur drei Bildern laufen lassen kann, indem man den Wert 3 in diese Speicher POKEt.

Der Bildeditor

Um diese besprochenen Bilder zu entwickeln, wären langwierige Berechnungen und viel Tastaturarbeit zum Eingeben der bis zu 504 Werte notwendig. Deswegen habe ich ein Programm geschrieben, das diese Arbeit übernimmt. (Listing 2).

Der Umgang mit dem Bildeditor ist recht einfach. Nach RUN erscheint in der oberen Hälfte des Bildschirmes eine Maske, in der die Zeichen aufgebaut werden und in der unteren Hälfte das Menü (siehe Bild).

Das Feld rechts oben zeigt das erste Bild. Man sieht zwar zunächst nur ein abstraktes Gebilde, das liegt aber nur daran, daß noch keine Zeichen entwickelt wurden. Links daneben stehen die gleichen Zeichen in Klarschrift. In beiden Feldern sind die gleichen Zeichen in der linken oberen Ecke schwarz, um herauszustellen, daß dieses Zeichen bearbeitet werden kann.

Mit F1 kann man nun ein Zeichen auswählen, das verändert werden soll. Dabei wandert das schwarze Feld jeweils eine Ziffer weiter.

Weiterhin kann man über den beiden Feldern die Bildnummer ablesen. Mit F3 können wir zwischen sieben Bildern wählen. Die Bilder werden jeweils im rechten Feld gezeigt. Es entsteht so schon ein Zeichentrickeffekt.

Hat man nun seine Wahl getroffen, kann man mit F7 in den Entwicklungsmodus wechseln. Der Cursor steht nun in der linken oberen Ecke des großen Entwicklungsfeldes. Er läßt sich voll steuern, jedoch nicht über den Feldrand hinaus. Tippt man nun, mehr oder weniger willkürlich, Buchstaben oder Zeichen in das Feld, sieht man gleichzeitig an der vorgewählten Ziffer im rechten Feld das Ergebnis. Man sollte nur nicht den Fehler machen, CLR/HOME oder INST/DEL zu drücken. Das kann den Bildschirmaufbau durcheinander bringen.

Mit RETURN kommt man ins Menü zurück.

Ist eine Bild- oder Zeichenfolge fertiggestellt, kann man den Trickfilm mit F5 ausprobieren. Im Menüfeld wird die Geschwindigkeit des Ablaufes erfragt. Eine gute Geschwindigkeit von 100 ist vorgegeben. Ein Wert von Null ergibt die größte Geschwindigkeit. In der anderen Richtung wird man selbst merken, wenn es langweilig wird. Mit RETURN wird gestartet, und mit der SPACE-Taste kann der Vorgang abgebrochen werden.

Es bleibt noch die F2-Funktion zu erklären. Bei Druck auf F2 erscheinen ein paar im ersten Augenblick wirr anmutende Befehle und die Bitte, den Namen der Bildfolge einzutragen. Das bedeutet, daß in der ersten Zeile (mit den vielen POKEs und dem SAVE) in die Lücke ein Name eingetragen werden soll. Es ist auch angebracht, das zweite Anführungszeichen an den Namen heranzuziehen. Dann drückt man RETURN, und alles geht wieder automatisch. Die Bildfolge wird als Maschinenprogramm geSAVEt und das Programm startet von neuem.

Zur Eingabe des Programmes: Bei Verwendung der Datasette muß zunächst der DATA-Lader (Listing 1) abgetippt und abgespeichert werden und danach Listing 2, weil der DATA-Lader selbständig das nächste Programm nachlädt. Verwendet man ein Floppy-Laufwerk, ist die Reihenfolge unerheblich.

Will man mit dem Programm arbeiten, muß erst der DATA-Lader geladen werden. »RUN« startet den Lader, der das Hauptprogramm lädt.

Bildfolgen in eigenen Programmen

Will man die Trickfolge im selbstgemachten Programm anwenden, muß natürlich das Machinenprogramm im Speicher vorhanden sein. Dazu lädt man den DATA-Lader, löscht die Zeilen 60-75, setzt in Zeile 60 ein NEW und startet den Lader. Damit ist das Maschinenprogramm im Bereich dezimal 6400 bis 6640 abgelegt und vor Überschreibung geschützt. Der Lader löscht sich selbst. Außerdem ist auch der Bereich geschützt, in den nun die selbstgemachte Bildfolge mit »LOAD ”Name”,8,1« oder »LOAD ”Name”,1,1« geladen werden kann.

Damit keine Fehlermeldungen auftreten, gibt man jetzt noch den Befehl NEW ein und drückt die Return-Taste. Jetzt kann man das eigene Programm laden oder eintippen.

Das Maschinenprogramm wird übrigens mit SYS6400 aufgerufen.

Und noch einmal: Am Anfang des Programmes, vor dem ersten SYS6400 muß unbedingt eine Zahl zwischen 1 und 7 in 251 und 252 gePOKEt werden, eben die Anzahl der Bilder des Trickfilms. Alle kleineren Zahlen als 1 und alle größeren als 7 richten zwar keinen Schaden an, jedoch bewirken sie eine Einschränkung der Funktion.

Sollte man dies einmal vergessen haben, ist es angebracht, das Maschinenprogramm neu zu laden.

Zum Schluß noch zwei Tips.

  1. Bei erweitertem VC 20 sollte man für eigene Programme nicht das Basic-Ende herunter-, sondern den Basic-Beginn heraufsetzen. Damit hat man mehr Speicherplatz für seine Programme. (Zeile 20) des DATA-Laders: POKE44,32:POKE8192,0:CLR).

  2. Da bei der Arbeit mit diesem Programm nicht der Original-Zeichensatz vorhanden ist, kann man ihn, wenn gebraucht, über die RVS-ON-Taste darstellen. Dieses Verfahren habe ich selbst im Listing 1 verwendet.
(Bernd Schrödter/ev)
10 — 40: Hier wird die Anfangsadresse des Zeichenspeichers nach Adresse 7168 verlegt, der Beginn des Farb-RAM ermittelt (unterschiedliche Werte bei GV und Erweiterungen) und das Maschinenprogramm »Bildtausch« initialisiert.
50 — 90: Aufbau des Bildschirms
100: Einsprung in das Maschinenprogramm »Zeichen-Entwicklung«
110 — 190: Menü
200 — 240: Ziffernwahl. Bei Betätigung von F1 wird der Ziffernzähler erhöht und diese Änderung auf dem Bildschirm kenntlich gemacht (Unterlegung der gewählten Ziffer mit Schwarz, der Rest Blau).
260 — 270: Löschen des Menüs
280 — 350: Bildwahl. Berechnung der Anfangsadresse des nächsten Zeichens im Reserve-Bildspeicher und im Zeichenspeicher aus den Werten BI (Bildnr.) und ZI (Ziffernr.). Die Adressen werden in das LB-HB-Format umgewandelt und an das MP »Zeichen-Entwicklung« übergeben.
360 — 440: Trick. Der Bildschirm wird neu aufgebaut. Die Hauptsache ist jedoch die Zeile 430. Dort wird immer wieder das Maschinenprogramm »Bildtausch« aufgerufen, das einen Mini-Trickfilm auf dem Bildschirm erzeugt.
450 — 500: Basic-Anfang und -Ende werden in den Bytes 680-683 abgelegt. Der Zeichenspeicher wird normalisiert. Es wird eine Maske zum Abspeichern des Reserve-Bildspeichers ausgegeben. Maske: Basic-Anfang und -Ende werden gleich Reserve-Bildspeicher-Anfang und -Ende gesetzt. In den Tastaturpuffer wird ein RETURN = CHR$(13) gePOKEt, damit nach dem Abspeichern die zweite Zeile der Maske abgearbeitet wird, die Basic-Anfang und -Ende wieder in den Ausgangszustand bringt. Mit dem »RUN« am Ende der Zeile startet das Programm wieder.
510: Unterprogramm zur Ausgabe von mehreren »Cursor Down«
Programmübersicht
AZ Beginn des Farb-RAM
BI Bildzähler
I,J,K Schleifenzähler
WV Parameterübergabe für Unterprogramm in Zeile 510
A$ Abfrageergebnis aus dem Menü
ZI Ziffernzähler
HH,HI Farbspeicher, die auf dem Bildschirm schwarz erscheinen sollen
TE Zähler zum Vergleich mit aktueller Ziffer (200 bis 240) und Geschwindigkeit für »Trick« (360 bis 440)
PR Verzweigungsargument für Unterprogramm (280 bis 350)
LE Verzweigungsargument für Zeile 260
X 1. Speicherplatz für das nächste zu erstellende Zeichen (im Reserve-Bildspeicher)
Q HB von X
R LB von X
HI Äquivalent zu X (für Zeichenspeicher)
H HB von HI
L LB von HI
Die wichtigsten Variablen
10 rem * laterna-magica-data-loader *
12 rem
15 rem ==============================
16 rem
20 poke52,25:poke56,25:clr
30 fori=6400to6640:reada:pokei,a:s=s+a:next
40 ifs<>26746thenprint"data-fehler!":end
50 print"ok!"
60 a$="load"+chr$(34)+"laterna magica"+chr$(34)+",8"
70 printchr$(147);a$:printchr$(19):print:print:print:print:print:print"run"
75 poke631,19:poke632,13:poke633,13:poke198,3:new
80 data173,5,144,41,240,9,15,141,5,144,198,251,162,72,189,71
90 data26,157,127,29,202,208,247,173,15,25,24,105,72,141,15,25
100 data173,16,25,105,0,141,16,25,165,251,208,14,169,255,141,15
110 data25,169,25,141,16,25,165,252,133,251,96,169,0,133,204,32
120 data245,241,240,251,76,211,25,234,72,120,165,207,240,12,165,206
130 data174,135,2,160,0,132,207,32,161,234,88,104,32,122,242,166
140 data214,224,8,48,2,162,0,164,211,192,8,48,2,160,0,32
150 data12,229,76,175,25,32,129,229,162,0,142,60,3,160,0,177
160 data209,201,160,240,9,169,1,24,109,60,3,141,60,3,192,7
170 data240,3,14,60,3,200,192,8,48,229,32,19,229,232,173,60
180 data3,32,199,25,224,8,240,6,32,12,229,76,120,25,96,32
190 data19,229,152,72,138,72,169,1,133,204,32,117,25,104,170,104
200 data168,32,12,229,76,59,25,157,7,26,157,135,29,96,104,168
210 data104,170,96,201,13,240,3,76,72,25,120,165,207,240,12,165
220 data206,174,135,2,160,0,132,207,32,161,234,88,169,1,133,204
230 data96
Listing 1. »Laterna Magica« Basic-Lader
1 rem**** laterna magica ****
2 rem** by bernd schroedter**
10 poke36869,peek(36869)and240or15
20 if(peek(36866)or127)=255thenaz=38400
30 if(peek(36866)or127)<>255thenaz=37888
40 bi=0:poke251,7:poke252,7:poke6415,255:poke6416,25:sys6400
50 print"{clr}";:fori=1to11:print"{rvon}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}{CBM-+}":next
60 print"{home}";:fori=1to8:print"{rvon}        ":next
70 print"{home}{down}{down}{down}"tab(9)"{rvon}     {CBM-+}     ":printtab(9)"{rvon} 012 {CBM-+} {rvof}012{rvon} {rvof}"
80 print tab(9)"{rvon} 345 {CBM-+} {rvof}345{rvon} {rvof}"
90 print tab(9)"{rvon} 678 {CBM-+} {rvof}678{rvon} {rvof}":printtab(9)"{rvon}     {CBM-+}     ":goto200
100 print"{home}{rvon}";:sys6459:poke204,1
110 print"{home}":wv=11:gosub510
120 print"{rvon}f1 - ziffernwahl"
130 print"{down}{rvon}f2 - saven"
140 print"{down}{rvon}f3 - bildwahl"
150 print"{down}{rvon}f5 - trick"
160 print"{down}{rvon}f7 - zeichnen"
170 geta$:ifa$=""then170
180 ifasc(a$)<133orasc(a$)>137then170
190 onasc(a$)-132goto200,280,360,250,450
200 zi=zi+1:ifzi>9thenzi=1
210 forj=1to3:fori=0to2:hh=az+104+i+k:hi=hh-6:te=te+1:ifte=zithen230
220 pokehh,5:pokehi,5:goto240
230 pokehh,0:pokehi,0
240 nexti:k=k+22:nextj:k=0:te=0:pr=1:goto290
250 printchr$(19);:wv=10:gosub510
260 fori=1to11:print"{wht}                     ":next:print"{blu}";:ifle=1thenle=0:return
270 goto100
280 bi=bi+1:ifbi>6thenbi=0
290 print"{home}{down}{rvon}"tab(13)"bild "bi+1
300 x=72*bi+8*(zi-1)+6655:q=int(x/256):r=x-256*q
310 poke6600,r:poke6601,q
320 hi=7551+8*(zi-1):h=int(hi/256):l=hi-256*h
330 poke6603,l:poke6604,h
340 ifpr=1thenpr=0:goto110
350 sys6400:goto110
360 le=1:gosub250:print"{home}";:wv=11:gosub510:print"{rvon}tempo     0=max."
370 print:printtab(7)"{rvon}1000=klein"
380 print:print"{rvon}{rght}{rght}100{left}{left}{left}{left}{left}";:input"{rvon}";te
390 print"{clr}":wv=8:gosub510:printtab(9)"012"
400 printtab(9)"345"
410 printtab(9)"678"
420 print"{down}{down}{down}{down}{rvon}>> stop << mit space!"
430 sys6400:fori=0tote:next:ifpeek(197)=32thenle=1:gosub250:clr:goto10
440 goto430
450 poke680,peek(43):poke681,peek(44):poke682,peek(45):poke683,peek(46)
460 poke36869,peek(36869)and240
470 print"{clr}bitte namen einsetzen:"
480 print"pO43,0:pO44,26:pO45,0:pO46,28:pO198,1:pO631,13:";
490 print"save"chr$(34)"@0:             "chr$(34)",8,1"
500 print"{down}{down}{down}pO43,pE(680):pO44,pE(681):pO45,pE(682):pO46,pE(683):run":end
510 fori=1towv:printchr$(17);:next:return
Listing 2. »Laterna Magica« Grafik-Editor
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →