Hardcopy-Routinen

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)
Beispiel einer Hardcopy. Das Original ist 25,7x17 cm groß.
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
Listing 1. »BIGCOPY DATAs«.
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
Listing 2. »BIGCOPY Erzeuger«.
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
Listing 3. »Basic Druck«.
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
Listing 4. »Anp. Hi-Eddi«.
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
Listing 5. »Hi-Print Erzeuger«.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →