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.



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
- Ein Rechteck soll ins Bild Nummer 1 eingezeichnet werden. Zuerst wird der Befehl N eingegeben, dem eine Frage »BILDNUMMER?« folgt, die mit 1 beantwortet wird. Mit der Eingabe von Z wird in den Grafikmodus umgeschaltet. Der Bildschirm wird schwarz. Die momentane Position ist in der Mitte des Bildschirms. Jetzt kann gezeichnet werden. Ist das Bild fertig, so wird es mit B abgespeichert. R führt zur Rückkehr zum Hauptmenü.
- Das Rechteck aus Bild Nummer 1 soll in Bild Nummer 2 etwas höher liegen.
Mit Z wird wieder in den Grafikmodus umgeschaltet. Im Arbeitsspeicher befindet sich noch das Rechteck, und es wäre unklug, es mit Q zu löschen, da es ja den Befehl V zur Verschiebung gibt. Nach der Eingabe von V blinken die Begrenzungspunkte, und das Rechteck kann verschoben werden. Vor dem Abspeichern mit B wird mit Z die Verschiebung unterbrochen. Die Eingabe von N führt zur Information über die momentane Bildnummer. Mit R wird die Grafik-Routine verlassen. - Die Bilder Nummer 1 und Nummer 2 sollen miteinander gemischt und als Bild Nummer 3 abgespeichert werden. Im Arbeitsspeicher befindet sich noch das Rechteck Nummer 2 also reicht der Befehl I und 1 schon aus, um die Bilder zu mischen. Mit O und 3 wird der Arbeitsspeicher ins Bild Nummer 3 kopiert.
- Bild Nummer 2 soll in Bild Nummer 4 kopiert werden. Dazu wird der Befehl K benutzt. Die erste Zahl, die eingegeben wird, ist logischerweise 2 gefolgt von einer 4.
- Die eben gezeichneten Bilder sollen der Reihe nach in den Bildschirm eingeblendet werden. Nach der Eingabe von T wird die Anzahl der Bilder angegeben, die projiziert werden sollen, in diesem Falle also 4. Die Werte für die Verzögerung sollten zwischen 0 und 200 liegen, da sonst die Pausen zwischen den einzelnen Bildern zu lang werden und somit der Zeichentrickeffekt nicht erzielt wird. Mit R wird die Projektion unterbrochen.

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 |
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 |
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
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