Hardcopy in doppelter Größe
Mit diesem Programm ist es jetzt auch MPS 801-Besitzern möglich, Hardcopies in doppelter Größe auszugeben.
»BIGCOPY 64« wurde abgefaßt, um auch mit dem Commodore MPS 801 eine Hardcopy in doppelter Größe anfertigen zu können.
Was uns besonders störte, war die Tatsache, daß es anscheinend keine Programme gab, die auf Siebennadeldruckern Hardcopies in doppelter Größe ermöglichten. Da wir jedoch unsere Grafiken zur Abwechslung einmal in akzeptabler Größe haben wollten, sahen wir uns gezwungen, ein eigenes Programm zu schreiben. Im folgenden wollen wir von den Schwierigkeiten, die sich uns in den Weg stellten und deren Beseitigung berichten.
Betrachtet man einmal die Speichernutzung des C 64 bei Grafiken, so ist ersichtlich, daß sich die Einteilung in horizontal liegende Bytes ideal für Hardcopies eignet, die auf Achtnadeldruckern ausgegeben werden sollen. Der Commodore MPS 801-Matrixdrucker hat aber die unangenehme Eigenschaft, die Grafiken mit lediglich sieben Nadeln auf das Papier zu bringen. Da man mit dem MPS 801 lediglich 480 Punkte in einer Zeile drucken kann, ist man bei der Erstellung von Programmen, die doppelt große Hardcopies ermöglichen sollen, darauf angewiesen, die Grafiken nicht wie üblich quer auszugeben, sondern sie müssen längs ausgedruckt werden. In dieser Richtung kann man die 400 x 640 Punkte problemlos auf das Papier bringen.
Jetzt aber stellt sich das oben angesprochene Problem: Wie die acht Bit eines Bytes mit sieben Nadeln ausdrucken? Die Antwort ist leider klar: Gar nicht, es geht nämlich nicht! Also muß ein Algorithmus her, der es gestattet, das bei ersten Versuchen unterschlagene achte Bit dennoch auszudrucken. Dieser Algorithmus muß aber, um eben dieses achte Bit zu berücksichtigen, Punkt für Punkt des zu druckenden Bildes abfragen, um so die gesamte Grafik in vertikale Siebenerscheibchen zu zerlegen, die der MPS 801 anstandslos verarbeitet. Durch diese, zugegebenermaßen recht unelegante, aber nötige Prozedur, geht jedoch der oben erwähnte positive Effekt verloren, den die interne Grafikspeicherung auf Berechnungen haben kann. Aus diesem Grund dauert eine Hardcopy mit der Basic-Version von »BIGCOPY« auch zirka 150 Minuten, eine nicht gerade berauschende Zeit für den Erhalt einer einzigen Grafik. Was liegt bei solcherart trödelnden Programmen näher, als sie in der um ein vielfaches schnelleren Maschinensprache zu verfassen.
Hier sei eine kurze Bemerkung über die Verträglichkeit des Programmes mit anderen Druckern als dem MPS 801 gesagt. Die Basic-Version läßt sich relativ leicht auf andere Drucker umschreiben, lediglich die OPEN-Anweisungen und die CHR$-Codes müssen geändert werden. Dies gilt selbstverständlich nur für die unglücklichen Besitzer von Siebennadeldruckern, die bisher gezwungen waren, ihre Grafiken in »Briefmarkenformat« ausdrucken zu lassen.
Hardcopy in 13 Minuten
Die Maschinensprachversion des Programmes gibt sich auch schon viel freundlicher, was den Zeitbedarf angeht, sie liefert eine Hardcopy in einem Elftel der Zeit des Basic-Programmes, das heißt daß man jetzt nur noch 13 Minuten auf seine Grafik zu warten braucht. Wundert man sich jetzt, warum die als bis zu hundert Mal schnellere Maschinensprache lediglich eine Reduktion des Zeitbedarfs um 91% bringt, so sei man daran erinnert, daß der Drucker ja auch nicht gerade zu den schnellsten gehört, er ist also das bremsende Glied.
Da wir unser Programm als vollständiges Maschinenprogramm verfaßten, mußten aus Komfortgründen gewisse Änderungen vorgenommen werden. Daraus resultierte die vorliegende Fbrm in zwei einzutippenden Teilprogrammen, die ein drittes, funktionsfähiges »BIGCOPY« erzeugen.
Es folgt die Anleitung, wie die Programme eingegeben werden müssen. Zuerst werden beide Listing »BIGCOPY-DATAs« (Listing 1) und »BIGCOPY-Erzeuger« (Listing 2) eingetippt und ohne sie zu starten auf Diskette abgespeichert. Nach der Speicherung des DATA-Teiles sollte dieser Teil jedoch probehalber gestartet werden, um eventuelle Tippfehler durch die Prüfsummenbildung zu identifizieren und zu korrigieren. Diese verbesserte Version muß dann erneut abgespeichert werden. Bei dem Erzeugerprogramm dürfen die REM-Zeilen auf keinen Fall mit eingetippt werden! Zum Erzeugen von »BIGCOPY 64« lädt man zuerst das DATA-Programm, startet es und lädt danach den Erzeugerteil. Nachdem eine Diskette eingelegt wurde, auf der mindestens neun Blöcke Platz sein müssen, wird der Erzeuger mit RUN 1000 gestartet. Das erzeugte »BIGCOPY« kann dann einfach mit LOAD "BIGCOPY 64",8 geladen und mit RUN gestartet werden. Diese etwas umständliche Prozedur mußte gewählt werden, da der Maschinenteil des Programmes direkt hinter dem Basic-Teil liegen muß, um alle sieben Grafikspeicher ausdrucken zu können.
Speicheraufteilung
Jetzt zum Programm an sich.
Um alle sieben Grafikspeicher ansprechen zu können, muß auf jeden Fall mit Maschinensprache gearbeitet werden, da ein Ausschalten des Basic-ROMs von Basic aus logischerweise Selbstmord wäre.
Im Maschinenteil ist deswegen eine Vertauschroutine, die das auszudruckende Bild in den Bereich $2000-$3FFF verschiebt. Diese Routine wird mit Basic angesprochen und wechselt den gewählten Grafikspeicher mit dem ab $2000 aus. Nachdem die Grafik eingeschaltet ist, wird die Druckroutine aufgerufen, die im Maschinensprachteil hinter der Tauschroutine liegt. Nach erfolgtem Ausdruck werden die beiden Bereiche (gewählter und $2000-$3FFF) wieder zurückgeschrieben, so daß kein Bild verlorengeht. Auf diese Weise können alle sieben Grafikspeicher hintereinander ausgedruckt werden. Die Maschinenroutine für den Ausdruck (Listing 3) wurde fast ohne Änderungen aus der Basic-Version der Druckroutine gebildet. Die Basic-Routine verdeutlicht den Algorithmus und vereinfacht die Anpassung an andere Siebennadeldrucker. Zusätzlich läßt sie sich als Unterprogramm in eigenen Programmen gebrauchen.
Da unser Maschinenprogramm bei $0D00 beginnt, und das im Januarheft des 64'er veröffentlichte Hi-Eddi zufälligerweise auch eine Druckroutine benötigt, die ab $0D00 liegt, kamen wir auf die Idee, »BIGCOPY« an Hi-Eddi anzupassen. Für die Anpassung an Hi-Eddi sind zwei Teilschritte notwendig. Zum ersten müssen im Hi-Eddi-Steuerprogramm (Listing 3 im 64'er, Ausgabe 1/85) die Zeilen 600-820 (Listing 4) durch die Änderungen ersetzt werden, zweitens muß ein Hi-Print-Programm (Listing 5) erzeugt werden, das aus unserer Maschinenroutine besteht. Zur Erzeugung von Hi-Print werden die Basic-Zeilen an den DATA-Teil des »BIGCOPY«-Listings angehängt, danach wird der DATA-Teil einfach mit RUN gestartet, dadurch wird Hi-Print auf Diskette geschrieben.
(M. Kowall/E. Wilde/rg)
5 rem -----block 1-----(7213) 10 data120,165,1,41,0,133,1,169,32,133,6,169,224,133,4,169,0,133,5,133,3 20 data162,32,160,0,177,3,133,9,177,5,145,3,165,9,145,5,200,208,241,230 30 data4,230,6,202,208,234,165,1,9,55,133,1,88,96,169,1,141,11,17,169,63 40 data141,10,17,169,0,141,12,17,174,12,17,32,59,14,173,16,17,157,32,17 45 rem -----block 2-----(8794) 50 data173,17,17,157,32,19,232,173,16,17,157,32,17,173,17,17,157,32,19,238 60 data12,17,232,173,12,17,201,100,208,217,162,0,32,59,14,173,16,17,157 70 data32,18,173,17,17,157,32,20,232,173,16,17,157,32,18,173,17,17,157,32 80 data20,238,12,17,232,173,12,17,201,200,208,217,32,46,16,32,96,16,169 90 data0,141,18,17,174,18,17,189,32,17,32,210,255,238,18,17,173,18,17,201 95 rem -----block 3-----(10886) 100 data200,208,237,169,0,141,18,17,174,18,17,189,32,18,32,210,255,238,18 110 data17,173,18,17,201,200,208,237,169,13,32,210,255,169,9,32,210,255,32 120 data96,16,169,0,141,18,17,174,18,17,189,32,19,32,210,255,238,18,17,173 130 data18,17,201,200,208,237,169,0,141,18,17,174,18,17,189,32,20,32,210 140 data255,238,18,17,173,18,17,201,200,208,237,169,13,32,210,255,169,9,32 145 rem -----block 4-----(8796) 150 data210,255,173,10,17,56,233,7,141,10,17,201,249,240,7,201,253,240,11 160 data76,65,13,169,0,141,11,17,76,65,13,32,204,255,169,4,32,195,255,96 170 data169,128,141,16,17,141,17,17,173,11,17,141,14,17,141,2,17,173,10,17 180 data141,13,17,141,1,17,173,12,17,141,3,17,32,110,15,173,9,17,240,9,24 190 data173,16,17,105,3,141,16,17,173,13,17,208,12,169,0,141,14,17,169,255 195 rem -----block 5-----(6787) 200 data141,13,17,208,3,206,13,17,173,13,17,141,1,17,173,14,17,141,2,17,173 210 data12,17,141,3,17,32,110,15,173,9,17,240,9,24,173,16,17,105,12,141,16 220 data17,206,13,17,173,13,17,141,1,17,173,14,17,141,2,17,173,12,17,141 230 data3,17,32,110,15,173,9,17,240,9,24,173,16,17,105,48,141,16,17,206,13 240 data17,173,13,17,141,1,17,173,14,17,141,2,17,173,12,17,141,3,17,32,110 245 rem -----block 6-----(7229) 250 data15,173,9,17,240,12,24,173,16,17,105,64,141,16,17,238,17,17,206,13 260 data17,208,7,169,128,141,17,17,208,111,173,13,17,141,1,17,173,14,17,141 270 data2,17,173,12,17,141,3,17,32,110,15,173,9,17,240,9,24,173,17,17,105 280 data6,141,17,17,206,13,17,173,13,17,141,1,17,173,14,17,141,2,17,173,12 290 data17,141,3,17,32,110,15,173,9,17,240,9,24,173,17,17,105,24,141,17,17 295 rem -----block 7-----(7422) 300 data206,13,17,173,13,17,141,1,17,173,14,17,141,2,17,173,12,17,141,3,17 310 data32,110,15,173,9,17,240,9,24,173,17,17,105,96,141,17,17,96,173,1,17 320 data141,0,17,173,3,17,141,4,17,173,1,17,41,248,141,1,17,173,2,17,41,1 330 data141,2,17,173,4,17,41,248,141,4,17,173,3,17,41,7,141,3,17,169,0,141 340 data5,17,173,4,17,141,6,17,160,4,24,109,6,17,144,3,238,5,17,136,208,244 345 rem -----block 8-----(7523) 350 data141,4,17,160,3,24,46,4,17,46,5,17,136,208,246,173,3,17,24,109,4,17 360 data144,3,238,5,17,24,109,1,17,144,3,238,5,17,24,133,2,173,5,17,109,2 370 data17,105,32,133,3,173,0,17,41,7,141,0,17,169,7,56,237,0,17,141,0,17 380 data208,10,169,1,141,7,17,173,0,17,240,14,169,1,141,7,17,24,14,7,17,206 390 data0,17,208,248,24,160,0,177,2,141,8,17,13,7,17,56,237,8,17,208,8,169 395 rem -----block 9-----(10566) 400 data1,141,9,17,76,45,16,169,0,141,9,17,96,169,4,162,4,160,0,32,186,255 410 data169,0,32,189,255,32,192,255,169,6,162,4,160,6,32,186,255,162,6,32 420 data201,255,169,16,32,210,255,32,204,255,169,6,32,195,255,162,4,32,201 430 data255,96,169,8,32,210,255,169,27,32,210,255,169,16,32,210,255,169,0 440 data32,210,255,169,40,32,210,255,96 450 s=0:fort=1to82:reada:s=s+a:poke49152+t,a:next:if s<>7213then f=1:goto1000 460 s=0:fort=83to180:reada:s=s+a:poke49152+t,a:next:ifs<>8794then f=2:goto1000 470 s=0:fort=181to276:reada:s=s+a:poke49152+t,a:next:ifs<>10886thenf=3:goto1000 480 s=0:fort=277to376:reada:s=s+a:poke49152+t,a:next:ifs<>8796thenf=4:goto1000 490 s=0:fort=377to480:reada:s=s+a:poke49152+t,a:next:ifs<>6787thenf=5:goto1000 500 s=0:fort=481to583:reada:s=s+a:poke49152+t,a:next:ifs<>7229thenf=6:goto1000 510 s=0:fort=584to691:reada:s=s+a:poke49152+t,a:next:ifs<>7422thenf=7:goto1000 520 s=0:fort=692to801:reada:s=s+a:poke49152+t,a:next:ifs<>7523thenf=8:goto1000 530 s=0:fort=802to890:reada:s=s+a:poke49152+t,a:next:ifs<>10566thenf=9:goto1000 540 print"alles okay !!!":end 1000 print"fehler im block";f
5 rem wichtig !!! 6 rem beim eingeben von bigcopy erzeuger unbedingt die rem-zeilen weglassen. 10 rem bigcopy erzeuger erzeugt das druckprogramm bigcopy 64 auf diskette 20 rem dazu laedt man zuerst bigcopy datas und startet es. 30 rem wenn alles okay ist,laedt man bigcopy erzeuger ein,legt eine freie 40 rem diskette ein und starte das programm mit run1000. 50 rem nach ca. 1 minute steht bigcopy 64 auf diskette und kann jederzeit 60 rem eingelesen und gestartet werden. 100 poke55,255:poke56,12:rem maschinenprogramm schuetzen 110 print"{clr}":print" -----bigcopy 64-----" 120 print"--fuer commodore mps 801 matrixdrucker--" 130 print:print"drucker angeschlossen und eingeschaltet ? (y/n)" 140 geta$:ifa$<>"y"then140 150 print:print:print"welcher der 7 hires graphikspeicher soll" 160 print"mit bigcopy ausgedruckt werden ? (1-7) " 170 getb$:a=val(b$):if(a<1)or(a>7)then170 180 print:print"es wird bild";a;"ausgedruckt!" 190 print:print"jetzt noch ca. 13 minuten geduld!":fort=1to1000:next 200 a=a*32:poke3340,a:poke3336,32:rem a=bildadresse 210 sys3328:rem bild wird nach $2000 gebracht 220 poke53265,59:poke53272,24:print"{clr}":rem bild wird angezeigt 230 sys3383:rem druckroutine beginnt 240 poke3340,32:poke3336,a 250 poke53265,155:poke53272,21 260 sys3328:rem bild wird nach a zurueckgebracht 270 print"noch ein bild ? (y/n)" 280 getz$ 290 if z$="y"then goto110 300 if z$<>"n"then280 310 if z$="n"then sys64738 400 rem zeilen 1000-1040 erzeugen bigcopy auf diskette 1000 open1,8,1,"bigcopy 64" 1010 print#1,chr$(1);chr$(8); 1020 fort=2049to2687:print#1,chr$(peek(t));:next 1030 fort=2688to3326:print#1,chr$(0);:next 1040 fort=49152to50042:print#1,chr$(peek(t));:next 1050 close1
100 rem basicversion der druckroutine 110 rem kann auch als unterroutine in eigene programme eingebaut werden 120 rem anpassung an andere 7-nadel-drucker sicher moeglich 130 open4,4:open6,4,6:print#6,chr$(16):close6:poke56,30 140 rem offnet druckkanal und stellt zeilenabstant fuer grafik ein 150 for i=319 to-3 step -7 160 u$="":u2$="":o$="":o2$="" 170 for y=0 to199:c=128:g=128 180 for x=i to i-2 step -1 190 a=0:gosub1000 200 bi=2*(i-x) 210 ifa=1then c=c+2^bi+2^(bi+1) 220 nextx 230 a=0:x=i-3:gosub1000 240 if a=1then c=c+64 :g=g+1 250 for x=i-4 to i-6 step -1 260 a=0:gosub1000 270 bi =2*(i-x-4) 280 if a=1 then g=g+2^(bi+1)+2^(bi+2) 290 nextx 300 if y<100theno$=o$+chr$(c)+chr$(c) 310 if y>99theno2$=o2$+chr$(c)+chr$(c) 320 if y<100thenu$=u$+chr$(g)+chr$(g) 330 if y>99thenu2$=u2$+chr$(g)+chr$(g) 340 nexty 350 print#4,chr$(8)chr$(27)chr$(16)chr$(0)chr$(40); 360 print#4,o$o2$chr$(9) 370 rem chr$(8) stellt bit-muster-modus ein 380 rem chr$(27)chr$(16)chr$(0)chr$(40) stellt die druckstartadrsse jeder 390 rem zeile auf 40 punkte nach rechts ein 400 rem chr$(9) stellt den bit-muster-modus wieder aus 410 print#4,chr$(8)chr$(27)chr$(16)chr$(0)chr$(40); 420 print#4,u$u2$chr$(9) 430 nexti 440 close4:end 450 rem pruefroutine ob der grafikpunkt gesetzt oder nicht gesetzt ist: 1000 ifx<0thena=0:return 1010 by=(xand504)+40*(yand248)+(yand7) 1020 bi=2^(7-(xand7)) 1030 s=peek(8192+by) 1040 if(sorbi)=sthena=1 1050 return
600 input"[clr,down]nummer des bildes";d: 610 for c=1 to 7:z=peek(8085+c) 620 if z=d then g=32*d:goto650 640 next 650 if a=5 then a=4:load"hi-print",8,1 660 poke3340,g:poke3336,32:sys3328:poke53265,59:poke53272,24 665 sys3383 670 poke3340,32:poke3336,g:sys3328:poke53265,155:poke53272,21 680 if a=5 then return 690 a=1 goto 50
10 rem zur erzeugung von hi-print 20 rem bigcopy data programm einladen, 30 rem zeile450-1000 loeschen 40 rem dafuer folgende zeilen anhaengen 450 open1,8,1,"hi-print" 460 print#1,chr$(0);chr$(13); 470 fort=1to890:read a 480 print#1,chr$(a); 490 next 500 close1