VC 20 + 8 KByte
Movemaster
6/84, S. 78-81

Movemaster – Der VC 20 als Trickfilmstudio

»Movemaster« wurde für die Erstellung beweglicher Grafiken konzipiert und läuft mit mindestens 8 KByte Speichererweiterung. Das Programm verwaltet bis zu 47 kleine Bilder, die man beliebig untereinander mischen, kopieren, speichern, laden und schließlich der Reihe nach, mit wählbarer Geschwindigkeit, im Bildschirm einblenden kann. Dies ergibt schließlich den Zeichentrickeffekt.

Bild 1. Das Movemaster-Hauptmenü
Solche Bilder lassen sich mit Movemaster per Joystick erzeugen und zum Leben erwecken

Zeichnungen können mit Joystick oder Tastatur in die Bilder eingebracht werden. Es ist auch möglich, die Lage der Bilder im Verhältnis zum Bildrahmen zu verändern, was die Entwicklung von Laufschrift oder ähnliche Anwendungen erheblich erleichtert. Das Programm »Movemaster« enthält Maschinencode-Routinen, die Aufgaben übernehmen, deren Ausführungszeit von Bedeutung ist (zum Beispiel Grafikausgabe). Außerdem nehmen diese Maschinencode-Routinen entscheidend weniger Speicherplatz ein als gleichwertige Basic-Routinen. Die SYS-Adressen der einzelnen Routinen gehen aus Tabelle 2 hervor.

Programmeingabe

Zuerst wird der Lader (Listing 1) eingetippt und sicherheitshalber abgespeichert. Eine kurze Zeit nach dem Starten des Laders erscheint auf dem Bildschirm: »FEHLERLOS« oder »TIPPFEHLER«. Im zweiten Fall müssen sowohl die DATA-Zeilen als auch der Lader überprüft und verbessert werden. Erst bei der Anzeige »FEHLERLOS« darf der Lader mit NEW gelöscht werden. Bei richtiger Eingabe beinhalten die Speicherzellen 45 und 46 die Zahlen 68 und 27 (dezimal). Ist das nicht der Fall, so gibt es noch einen (oder mehrere) Tippfehler, die bereinigt werden müssen. Das ganze Programm muß exakt übernommen werden — kein Zeichen mehr oder weniger.

Damit »Movemaster« zusammen mit den Maschinencode-Routinen abgespeichert werden kann, müssen davor die Speicherzellen 45 und 46 auf 0 und 30 geändert werden. Das hat den Vorteil, daß der Lader nicht mehr benötigt wird.

Programmbedienung

Nach dem Starten des Programms erscheint auf dem blauen Bildschirm das Hauptmenü. Es stehen jetzt folgende Befehle zur Verfügung:

N Wählen der Bildnummer (von 1 bis 47 Bildern bei 24 KByte Speichererweiterung) oder Information über die momentane Bildnummer
Q Löschen eines Bildes oder des Arbeitsspeichers
I Ein Bild in den Arbeitsspeicher übertragen und mit dem Inhalt mischen
0 Den Arbeitsspeicher in ein Bild übertragen und überschreiben
K Ein Bild in ein anderes kopieren
Z Bilder mit dem Joystick oder der Tastatur in den Arbeitsspeicher einzeichnen
V Den Inhalt des Arbeitsspeichers mit dem Joystick oder der Tastatur verschieben
B Den Inhalt des Arbeitsspeichers in das momentane Bild überschreiben und die momentane Bildnummer um eins erhöhen
T Eine Bildfolge nacheinander abrufen und im Bildschirm einblenden
L Eine Bildfolge vom Band lesen
S Eine Bildfolge auf Band speichern
R Rückkehr in das Hauptmenü

Zum Zeichnen wird, wie schon erwähnt, der Joystick oder die Tastatur eingesetzt:
Punkt links — 1 bzw. Hebel links
Punkt hoch — 3 bzw. Hebel hoch
Punkt runter — 5 bzw. Hebel runter
Punkt rechts — 7 bzw. Hebel rechts
Punkt löschen — SHIFT bzw. Feuerknopf

Beispiele zur Programmbedienung

(Artur Wystub)
Speicherbelegung von »Movemaster«
HEX DEZ
1C1D 7197 Begrenzungspunkte löschen
1C3E 7230 Begrenzungspunkte setzen
1C4F 7247 Bild nach oben verschieben
1C81 7297 Bild nach unten verschieben
1CB1 7345 Bild nach rechts verschieben
1DO8 7432 Bild nach links verschieben
1D5F 7519 Bild in Arbeitsspeicher kopieren
1D7E 7550 Arbeitssspeicher ins Bild kopieren
1D9D 7581 Grafikmodus setzten
1DB9 7609 Arbeitsspeicher löschen
1DD8 7640 Bild mit Arbeitsspeicher mischen
Adressen der Maschinencode-Routinen
A$ Befehlsvariable
NA$ Bildfolgename
BZ Höchstmögliche Bildnummer
BM Momentane Bildnummer
BO Gewählte Bilderzahl
GG Verzögerungsvariable
Z VIC-C-Basicadresse (36864)
X Horizontale Position auf dem Grafikbildschirm
Y Vertikale Position auf dem Grafikbildschirm
P Adresse der durch (X,Y) Position ermittelten Zelle
W Wert dieser Zelle
V Modusvariable (V=0 zeichnen, V=1 verschieben)
T Laufvariable in allen Schleifen
Variablenliste
10 rem***loader***
20 fort=7197to7672
30 read a$
40 h=asc(mid$(a$,1,1))-48
50 l=asc(mid$(a$,2,1))-48
60 ifh>9thenh=h-7
70 ifl>9thenl=l-7
80 poket,h*16+l:z=z+h*16+l
90 next:ifz<>49265thenprint"tippfehler":end
95 print"fehlerlos":end
100 dataa9,7f,2d,00,1e,8d,00,1e,a9,7f,2d,47,1e,8d,47,1e,a9,fe,2d
110 datab0,1f,8d,b0,1f,a5,fe,2d,f7,1f,8d,f7,1f,60,a9,80,8d,00,1e
120 data8d,47,1e,a9,01,8d,b0,1f,8d,f7,1f,60,a2,01,bd,01,1e,9d,00
130 data1e,bd,49,1e,9d,48,1e,bd,91,1e,9d,90,1e,bd,d9,1e,9d,d8,1e
140 databd,21,1f,9d,20,1f,bd,69,1f,9d,68,1f,bd,b1,1f,9d,b0,1f,e8
150 datae0,47,d0,d1,60,a2,45,bd,00,1e,9d,01,1e,bd,48,1e,9d,49,1e
160 databd,90,1e,9d,91,1e,bd,d8,1e,9d,d9,1e,bd,20,1f,9d,21,1f,bd
170 data68,1f,9d,69,1f,bd,b0,1f,9d,b1,1f,ca,10,d3,60,a0,7f,a9,00
180 dataa2,00,5e,b0,1f,5e,68,1f,90,07,98,7d,b0,1f,9d,b0,1f,5e,20
190 data1f,90,07,98,7d,68,1f,9d,68,1f,5e,d8,1e,90,07,98,7d,20,1f
200 data9d,20,1f,5e,90,1e,90,07,98,7d,d8,1e,9d,d8,1e,5e,48,1e,90
210 data07,98,7d,90,1e,9d,90,1e,5e,00,1e,90,07,98,7d,48,1e,9d,48
220 data1e,e8,e0,47,d0,b0,60,a0,00,a9,00,a2,00,1e,00,1e,1e,48,1e
230 data90,07,98,7d,00,1e,9d,00,1e,1e,90,1e,90,07,98,7d,48,1e,9d
240 data48,1e,1e,d8,1e,90,07,98,7d,90,1e,9d,90,1e,1e,20,1f,90,07
250 data98,7d,d8,1e,9d,d8,1e,1e,68,1f,90,07,98,7d,20,1f,9d,20,1f
260 data1e,b0,1f,90,07,98,7d,68,1f,9d,68,1f,e8,e0,47,d0,b0,60,a9
270 data00,85,03,a9,1e,85,04,a0,00,b1,01,91,03,e6,01,e6,03,d0,f6
280 datae6,02,e6,04,a9,20,c5,04,d0,ec,60,a9,00,85,03,a9,1e,85,04
290 dataa0,00,b1,03,91,01,e6,01,e6,03,d0,f6,e6,02,e6,04,a9,20,c5
300 data04,d0,ec,60,a2,00,a9,40,a0,00,9d,00,10,18,69,09,e8,c8,c0
310 data07,d0,f4,a0,00,38,e9,3e,c9,49,d0,eb,60,a9,00,85,03,a9,1e
320 data85,04,a9,00,a0,00,91,03,e6,01,e6,03,d0,f8,e6,02,e6,04,a9
330 data20,c5,04,d0,ea,60,a9,00,85,03,a9,1e,85,04,a0,00,b1,01,11
340 data03,91,03,e6,01,e6,03,d0,f4,e6,02,e6,04,a9,20,c5,04,d0,ea
350 data60
Listing 1. Maschinenprogramm-Lader zu »Movemaster«
10 rem*by artur wystub      ******vc-20*****      ***12.12.1983***
20 poke45,68:poke46,27:poke47,68:poke48,27:poke49,68:poke50,27
30 bz=int((peek(56)-34)/2):z=36864:bm=1
40 gosub530:print" 'n'-bild nr.(in/out)"," 'z'-zeichnen"
50 print" 'v'-verschieben"," 'k'-kopieren"," 'q'-loeschen"
60 print" 'i'-bild holen"," 'o'-bild speichern"," 'b'-blaettern"
70 print" 't'-trick "," 'l'-load"," 's'-save":gosub660
80 ifa$="n"thengosub620:goto40
90 ifa$="z"thenv=0:gosub210:goto40
100 ifa$="b"thengosub210:goto40
110 ifa$="v"thenv=1:gosub210:goto40
120 ifa$="k"thengosub620:sys7519:gosub620:sys7550:goto40
130 ifa$="i"thengosub620:sys7640:goto40
140 ifa$="o"thengosub620:sys7550:goto40
150 ifa$="q"thengosub620:sys7609:goto40
160 ifa$="l"thengosub460:goto40
170 ifa$="s"thengosub410:goto40
180 ifa$="t"thengosub350:goto40
190 ifa$="r"then40
200 gosub650:goto40
210 gosub560:x=27:y=35
220 ifv=1thensys7197
230 gosub700:sys7230:p=7751+int(x/8)*72-y:w=2^(7-(x-int(x/8)*8))
240 pokep,worpeek(p)
250 if(peek(37137)and32)=0orpeek(653)=1thenpokep,255-wandpeek(p)
260 ifv=1thenpokep,255-wandpeek(p)
270 geta$:ifa$="n"thengosub530:gosub600:gosub510:gosub590:goto210
280 ifa$="q"thengosub510:sys7609:goto210
290 ifa$="z"thenv=0:gosub510
300 ifa$="v"thenv=1:gosub510
310 ifa$="b"thengosub510:gosub640:sys7197:sys7550:bm=bm+1:sys7230
320 ifbm>bzthengosub510:return
330 ifa$="r"thensys7197:gosub510:return
340 goto220
350 input"{down}bildanzahl:1-";bo:gosub510
360 ifbo<1orbo>bzthengosub800:return
370 input"{down}verzoegerung:";gg:gg=abs(gg):gosub510:gosub560
380 forbm=1tobo:fort=0togg:nextt:gosub640:sys7519:nextbm
390 geta$:ifa$="r"thengosub510:return
400 goto380
410 input"{down}bildanzahl";bo:gosub510
420 ifbo<1orbo>bzthengosub800:return
430 input"{down}name";na$:gosub510:print"{down}"
440 open1,1,1,na$:print#1,na$:print#1,bo:forbm=1tobo:fort=0to511
450 print#1,peek((bm*2+30)*256+t):nextt,bm:close1:gosub510:return
460 input"{down}name ";na$:gosub510
470 open1,1,0,na$:input#1,na$:input#1,bo
480 print"{down}gefunden ";na$:print"{down}bildanzahl=";bo
490 forbm=1tobo:fort=0to511:input#1,w:poke(bm*2+30)*256+t,w
500 nextt,bm:close1
510 poke36878,15:fort=0to10:poke36876,254:poke36876,244:next
520 poke36878,0:return
530 pokez,12:pokez+1,38:pokez+2,22:pokez+3,46:pokez+5,192
540 pokez+15,110
550 print"{clr}{wht} ***move-master***":print" *by artur wystub*{down}":return
560 print"{clr}"
570 pokez,25:pokez+1,61:pokez+2,7:pokez+3,18:pokez+5,207
580 pokez+15,8:sys7581:return
590 fort=0to2000:next:return
600 print"{down}bild nummer:";bm
610 print"{down}max. bildanzahl:";bz:return
620 input"{down}bildnummer:";bm:gosub510
630 ifbm<1orbm>bzthengosub800:bm=1:goto40
640 poke1,0:poke2,bm*2+30:return
650 print"{down}befehl unbekannt":gosub510:gosub590:return
660 print" 'r'-return","{down}geben sie einen befehl":print" * ";
670 geta$:ifa$=""then670
680 printa$:gosub510
690 return
700 poke37154,127:poke37139,0
710 if(peek(37137)and16)=0orpeek(203)=0thenx=x-1:ifv=1thensys7432
720 if(peek(37152)and128)=0orpeek(203)=3thenx=x+1:ifv=1thensys7345
730 if(peek(37137)and4)=0orpeek(203)=1theny=y+1:ifv=1thensys7247
740 if(peek(37137)and8)=0orpeek(203)=2theny=y-1:ifv=1thensys7297
750 ifx<0thenx=0
760 ifx>55thenx=55
770 ify<1theny=1
780 ify>70theny=70
790 poke37154,255:return
800 print"{down}unmoeglich{up}":gosub510:gosub590:return
Listing 2. Movemaster - Das Hauptprogramm
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →