Das Java-Programm TinySVG (ZIP-Datei, ∼150KB) von Dipl.Inf. Bernd Bock dient dazu, aus beliebigen Vektorgrafikbildern im SVG-Format Dateien zu generieren, mit deren Hilfe man diese SVG-Bilder auf 8Bit-Rechnern wiedergeben kann, im von Bernd Bock entwickelten VEC-Format (s. unten). Da SVG viele Möglichkeiten zur Darstellung aufweist, die auf Retro-Computern nicht nachvollzogen werden können, beschränkt sich das VEC-Format darauf, SVG auf monochrome Strichzeichnungen zu reduzieren. B. Bock hat sein Programm TinySVG und das VEC-Format im Joyce-Forum und im Forum64 vorgestellt.
TinySVG kann VEC-Dateien für die Computer ZX81, ZX Spectrum, Schneider Joyce und C64 erzeugen. Im Commodore-Bereich gibt es VEC-Viewer von den Forum64-Usern EgonOlsen71 (kompiliertes V2-Basic), WTE (Basic 7.0) und das TSB-Programm TinyVECViewer.
Der TinyVEC-Viewer ist ein Interpreter für VEC-Dateien, die nach folgenden Vorgaben aufgebaut sind:
Header: 'V' 'E' 'C' Byte | 0 | 1 2 | 3 4 | 5 6 | 7 8 | ----------------------------------------------------------------------- Dot | 0 | x | y | | | Line | 1 | x1 | y1 | x2 | y2 | Box | 2 | xleft | ytop | xright | ybottom | Square | 3 | xleft | ytop | width | | Ellipse | 4 | xcenter | ycenter | xradius | yradius | Circle | 5 | xcenter | ycenter | radius | | Multi-Dot | 10 |#dots| x1 | y1 | x2 | ... | Multi-Line | 11 |#dots| x1 | y1 | x2 | ... | Polygon-Fill | 12 |#dots| x1 | y1 | x2 | ... | End | 99 | | | | |
Byte 0 ist das Token für den Befehl, dessen Bezeichnung in der ganz linken Spalte zu sehen ist. Auf das jeweilige Token müssen die in der gleichen Zeile stehenden Parameter folgen. "#dots" bedeutet "Anzahl der jetzt folgenden Koordinaten (x|y)".
Funktionsweise des TSB-Programms:
100 rem" Programm TinyVEC Viewer by AD 2021 105 rem" TinyVEC by Bernd Bock 110 : 140 header: init: repeat: menue: until pr=0 150 if (not pr and al=0) then colour15,11,0: keyget x$ 160 header 170 if al<>2 then print at(0,lin+2)"Letztes Bild: '"f$"'" 180 if al=1 then print at(0,lin+2)"Methode noch nicht implementiert." 190 if al=2 then print at(0,lin+2)"Abbruch." 200 if al=3 then print at(0,lin+2)"Datei ist keine TinyVEC-Datei." 205 if al=4 then print at(0,lin+2)"Dateiname falsch?" 210 print at(0,lin+2)"ENTER startet neu. Ende mit 'x'." 220 pause 1: keyget x$: if x$=chr$(13) then run 999 end 1300 proc header 1310 cset1: cls: colour 11,12,0 1320 centre"- Tiny Vector -": print: print 1330 end proc 1500 proc menue 1510 dir: print: print: print"Dateiname: ? "; 1520 fetch fp$,16,f$:if f$="" then pr=0: al=2 1525 if right$(f$,4)<>".vec" then f$=f$+".vec" 1530 if pr then open1,dr,2,f$: close 1: if st then pr=0: al=4 1540 if pr then vopen 1550 end proc 1000 proc init 1010 pr=-1:al=0:dr=peek($be):fp$=chr$(17)+chr$(29) 1090 end proc
Hier im Hauptprogramm geben wir zunächst die Überschrift aus (Z.140) und dann das Menü, das daraus besteht, den Inhalt der Diskette im aktuellen Laufwerk anzuzeigen und nach dem Namen der gewünschten VEC-Datei zu fragen (Z.1510/1520). Dabei braucht das Datei-Suffix ".VEC" nicht angegeben zu werden (Z.1525). Zeile 1530 testet, ob diese Datei vorhanden ist. Trifft das zu, wird sie in Zeile 1540 endgültig geöffnet.
1600 proc vopen 1610 open1,dr,2,f$: filecheck 1620 if pr then hires 0,15: repeat: parsevec: until pr=0 1630 close1 1640 end proc 2000 proc filecheck 2010 s$="": b$="": for i=0 to 2: get#1,b$: s$=s$+b$: next 2020 if s$<>"vec" then pr=0: al=3 2030 end proc
Der TinyVECViewer prüft zunächst, ob es sich um eine gültige VEC-Datei handelt ("filecheck", Z.2000 bis 2030), schaltet die Grafik ein und parset sie via "parsevec", wenn das zutrifft (Z.1620).
1100 proc parsevec 1110 get#1,b$: b=peek($0200) 1115 get x$: if x$="x" then pr=0: al=2 1120 if b=0 then vpunkt 1130 if b=1 then vlinie 1140 if b=2 then vrechteck 1150 if b=3 then vquadrat 1160 if b=4 then vellipse 1170 if b=5 then vkreis 1180 if b=10 then vpunktwolke 1190 if b=11 then vlinienzug 1200 if b=12 then vpolygon 1210 if b=99 then pr=0 1220 end proc
Dort liest das Programm den Befehlstoken ein (Z.1110) und verzweigt daraufhin entsprechend in die Unterroutinen (deren Labels alle mit dem Buchstaben "v" beginnen). Dazu braucht es auf jeden Fall die drei Hilfsroutinen zum Einlesen der Basisparameter "hol.wert", "x" und "y".
4000 proc hol.wert 4010 get#1,b$: b1=peek($0200) 4020 get#1,b$: b2=peek($0200) 4030 end proc 5000 proc x 5010 hol.wert 5020 x=b1+256*b2 5030 end proc 5100 proc y 5110 hol.wert 5120 y=b1+256*b2 5130 end proc
Im Rest werden die Befehle, die die Token angeben, ausgeführt: Punkte setzen, Linien ziehen, Figuren malen. Der Code ist sicher selbsterklärend:
10000 proc vpunkt 10010 x: y: plot x,y,1 10030 end proc 10100 proc vlinie 10110 x: y: x0=x: y0=y: x: y: line x0,y0,x,y,1 10130 end proc 10200 proc vrechteck 10210 x: y: x0=x: y0=y: x: y: x=x-x0: y=y-y0: rec x0,y0,x,y,1 10230 end proc 10300 proc vquadrat 10310 x: y: x0=x: y0=y: x: y=x: rec x0,y0,x,y,1 10330 end proc 10400 proc vellipse 10410 x: y: x0=x: y0=y: x: y: circle x0,y0,x,y,1 10430 end proc 10500 proc vkreis 10510 x: y: x0=x: y0=y: x: y=x: circle x0,y0,x,y,1 10530 end proc 10600 proc vpunktwolke 10610 get#1,b$: n=peek($0200): for i=1 to n: x: y: plot x,y,1: next 10630 end proc 10700 proc vlinienzug 10710 get#1,b$:n=peek($0200):x:y:plot x,y,0: x0=x: y0=y 10720 for i=2 to n: x: y: drawto x,y,1: next 10740 end proc 10800 proc vpolygon 10810 vlinienzug: drawto x0,y0,1 10820 end proc
Das Programm bei der Arbeit ist einfach faszinierend zu verfolgen! Hier ein Ergebnis (ein Bild ist fertig gerendert, wenn der Bildschirmrahmen hell wird):

Download TSB TinyVEC (vier D64 als ZIP-Datei)