Hardcopy für den Sieger
In unserer letzten Ausgabe konnten wir das Görlitz-Interface für Epson-Drucker zum Testsieger erklären. Die Schnittstelle verdankt diesen Sieg hauptsächlich ihrer universellen Anwendbarkeit. Dazu gehört auch das Ausdrucken eines Bildschirminhaltes in Verbindung mit Simons Basic. Daß eine Basicerweiterung aber nicht unbedingt notwendig ist, zeigt diese Hardcopyroutine.
![](83-1.jpg)
Mit dem Maschinenprogramm ist es möglich, Grafiken im Maßstab 1:1 (Druckdauer zirka 35 Sekunden, 64 000 Dots) oder im Maßstab 2:1 (Druckdauer zirka 2 Minuten, 256 000 Dots) ausgeben zu lassen.
Mit dem Basic-Lader kann das Maschinenprogramm in jeden beliebigen Speicherbereich eingelesen werden. Sinnvollerweise sollte das Maschinenprogramm auf die Startadresse # 49152 ($C000) gesetzt werden, da hier keine Basic-Bytes verloren gehen. Wird trotzdem eine Endadresse für das Programm festgestellt, die unter #40960 ($A000) liegt, so wird der Beginn des Maschinenprogramms gleichzeitig als Ende des Basic-RAMs ausgewiesen; hierdurch wird verhindert, daß das Maschinenprogramm versehentlich von Basic aus überschrieben wird. Zusätzlich kann wegen der Unterschiedlichkeit der Interfaces gewählt werden, welche Filenummer, welches Gerät und was für eine Sekundäradresse gesetzt werden sollen. Damit die Zeichen ohne Umdefinition vom Computer zum Drucker gesendet werden, ist es je nach Interface notwendig, eine entsprechende Sekundäradresse zu setzen. Entsprechende Hinweise befinden sich sicher bei der Betriebsanleitung des Interfaces. Je nach Bedarf können die Parameter der Initialisierungsroutine geändert werden.
Die mit dem Basic-Lader erzeugte Routine sollte man nach der Erzeugung abspeichern. Für die verschiedenen Speicherkonfigurationen lassen sich natürlich auch verschiedene Hardcopyroutinen erzeugen. Die Startadresse und die Endadresse des erzeugten Maschinenprogramms werden auf dem Monitor angezeigt.
Wird das Maschinenprogramm abgespeichert, so geschieht das unter dem Namen »HC EPSON xxxxx«, wobei xxxxx die Startadresse der Routine wiedergibt.
Hinweise zum Maschinenprogramm:
- Es wird nur eine Datei auf den Drucker eröffnet; diese kann vom Anwender selbst definiert werden.
- Es können die Grafiken aller acht Grafikbildschirme ohne Einschränkungen verarbeitet werden.
- Nach dem Ende des Maschinenprogramms müssen 16 Byte für zwei Umrechnungstabellen freigehalten werden.
- Es werden nur die folgenden Byte in der Zero-Page für die Routine benötigt: $FB-$FF, $02, $A7-$AA.
Die Routine kann im Direktmodus, aber auch unter Programmkontrolle aufgerufen werden. Dabei liegt der besondere Vorteil des Programms darin, das sämtliche Parameter durch Basicvariablen ausgedrückt werden können. Das Format zum Ausdruck eines Bildes in Hires-Grafik lautet SYS A, B, C.
A | bezeichnet die Startadresse der Routine |
B | bezeichnet die Startadresse von einem der acht möglichen Grafikbildschirme |
C | gibt den Maßstab der Wiedergabe an. Dabei kann man zwischen vier Ausgabetypen wählen: |
0 | gibt das Hiresbild im Maßstab 1:1 aus, zusätzlich wird die Grafik invertiert ausgegeben. |
1 | gibt das Hiresbild ohne Invertierung im Maßstab 1:1 aus. |
2 | Der Grafikbildschirm wird im Verhältnis 1:2 vergrößert. Zusätzlich wird das Bild invertiert. |
3 | Auch hier wird das Bild vergrößert, die Ausgabe des Bildes erfolgt ohne Invertierung. |
Wird die Routine als Maschinenprogramm geladen, so muß man nach dem Laden »NEW« eingeben, um sämtliche Zeiger zu korrigieren.
Fehlerbehandlung:
- Werden die Angaben nicht durch Kommata getrennt, erscheint SYNTAX ERROR.
- Wird eine Startadresse für B eingegeben, die nicht mit der Anfangsadresse eines der acht Grafikbildschirme (0, 8192, 16384, 24576, 32768, 40960, 49152 oder 57344) übereinstimmt, so wird je nach Argument »UNDEF’D STATEMENT« oder »ILLEGAL QUANTITY« ausgegeben.
- Bei Angabe eines ungültigen Maßstabs dagegen wird je nach Argument »UNDEF'D FUNCTION« oder »ILLEGAL QUANTITY« ausgegeben.
Anwendungsbeispiel:
Zunächst wird mit dem Basic-Lader die Maschinenspracheroutine initialisiert. Soll zum Beispiel die Hardcopyroutine zusammen mit Simons Basic arbeiten, so braucht die vorgesehene Startadresse 49152 nicht geändert zu werden. Die erfragten Parameter Device (Gerätenummer) und Sekundäradresse richten sich nach dem benutzten Interface. Änderungen können bei Bedarf durch Überschreiben der alten Werte vorgenommen werden. Nach korrekter Eingabe wird dann das Maschinenprogramm erzeugt. Nach Abschluß dieser Operation kann dann noch entschieden werden, ob der erzeugte Code abgespeichert werden soll. Wird die Frage positiv beantwortet, so wird das Maschinenprogramm nach Wahl auf Diskette beziehungsweise Kassette abgespeichert. Zum Schluß wird nur noch errechnet, ob das Programm in einem Bereich steht, der von Basic aus erreichbar ist. Ist das der Fall, so wird das Maschinenprogramm vor einem versehentlichen Überschreiben geschützt.
Ist dann die Routine einmal erzeugt, so kann man mit der Ausgabe von Hires-Grafiken beginnen. Erzeugt man zum Beispiel mit Hilfe von Simons Basic eine Hires-Grafik, so wird diese mit SYS xxxxx,57344,1 im Originalmaßstab ausgegeben. Dabei bezeichnet xxxxx die Anfangsadresse der Routine, bei 57344 liegt der Grafikbildschirm von Simons Basic und der letzte Parameter 1 gibt an, daß die Grafik im Maßstab 1:1 ohne Invertierung des Bildes ausgegeben werden soll. Nach ordnungsgemäßer Eingabe des SYS-Befehls beginnt der Drucker das Bild auszugeben.
Bei Bedarf kann man dann zu einem späteren Zeitpunkt die abgespeicherte Maschinenroutine nachladen. Liegt sie im Basicbereich (bis #40959,$9FFF), so kann man durch Abtippen und Starten der Zeilen 144 bis 146 des Laders erreichen, daß das Programm vor Überschreibung geschützt wird, ohne gleich den gesamten Lader zu starten. Dazu ist in diesen Zeilen die Variable AN durch die Startadresse der Routine zu ersetzen.
Sonstige Hinweise:
Bevor die Routine beginnt, muß der Drucker bereits eingeschaltet sein.
Werden eventuell andere Codes für die Erzeugung der Hires-Grafik benötigt, so sind die Steuercodes, die die Bit-Image Schreibweise des Druckers steuern, zu ändern. Das hier vorgestellte Maschinenprogramm ist für den FX-80 ausgelegt, ist jedoch auch auf anderen Druckern lauffähig. Da das Assemblerlisting nicht abgedruckt werden kann, können sich Interessierte gerne schriftlich an mich wenden.
(Frank Lonczewski/gk)![](83-2.jpg)
100 rem ****************************************************** 101 rem * * 102 rem * hardcopyroutine fuer epson-drucker, basic-loader * 103 rem * * 104 rem * copyright juni 1984 by frank lonczewski * 105 rem * 5810 witten 6,froebelstrasse 33, tel.::02302/60933 * 106 rem * cursorsteuerzeichen stehen in klammern:"[" und "]" * 107 rem ****************************************************** 108 print"{clr}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rvon}epson hardcopyroutine{rvof}{down}" 109 input"startadresse{rght}{rght}{rght}{rght}{rght}{rght}{rght}49152{left}{left}{left}{left}{left}{left}{left}";an:ifan<0oran>53248then109 110 input"filenummer{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}127{left}{left}{left}{left}{left}";lf:iflf<1orlf>255then110 111 input"device{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}4{left}{left}{left}";dn:ifdn<4ordn>15then111 112 input"sekundaeradresse{rght}{rght}{rght}4{left}{left}{left}";sn:ifsn<0orsn>15then112 113 i=an:print"{down}ich arbeite ! bitte etwas geduld." 114 gosub147 115 ifrethengosub158:goto117 116 pokei,a 117 ps=ps+a:re=0:i=i+1:ifi-an<528then114 118 ifps<>57824thenprint"pruefsummenfehler !":end 119 pokean+62,dn:rem device setzen 120 pokean+64,sn:rem sekun. setzen 121 pokean+60,lf:pokean+72,lf:pokean+176,lf:pokean+244,lf:rem filenr. setzen 122 print"{clr}epson hardcopyroutine initalisiert" 123 k=an+475:b=int(k/256):k=k-b*256:pokean+47,k:pokean+49,b 124 print"{down}startadresse{rght}{rght}{rght}{rght}:";an 125 print"endadresse{rght}{rght}{rght}{rght}{rght}{rght}:";an+527 126 print"filenummer{rght}{rght}{rght}{rght}{rght}{rght}:";lf 127 print"device{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}:";dn 128 print"sekundaeradresse:";sn 129 print"{down}aufruf mit sys"an"{left},gradr,mas" 130 print"{down}gradr : dezimal grafikbildschirmadresse" 131 print"mas{rght}{rght}{rght}: dezimal massstab{down}" 132 input"code abspeichern{rght}{rght}{rght}{rght}y{left}{left}{left}";j$:ifj$<>"y"then144 133 input"{rvon}d{rvof}isk oder {rvon}t{rvof}ape{rght}{rght}{rght}d{left}{left}{left}";j$:ifj$<>"d"andj$<>"t"then133 134 ifj$="d"thend=8:goto136 135 d=1 136 ps=0:print:fori=688to738 137 gosub147:pokei,a:ps=ps+a:next 138 ifps<>5381then118 139 b=an:h=int(b/256):l=b-h*256 140 b=an+528:he=int(b/256):le=b-he*256 141 poke707,l:poke711,h:poke717,le:poke719,he 142 poke693,d:an$=mid$(str$(an),2):fori=1tolen(an$):poke732+i,asc(mid$(an$,i,1)) 143 nexti:poke157,128:sys688:print 144 ifan+543>40960thenprint"{down}maschinenprogramm wird nicht geschuetzt.":end 145 b=an:h=int(b/256):l=b-h*256 146 poke56,h:poke55,l:clr:end 147 reada$:iflen(a$)<>2thenprint"tippfehler in zeile"peek(63)+peek(64)*256:end 148 a1=asc(a$):a2=asc(right$(a$,1)) 149 ifa1=42thena1=48:re=1 150 ifa1<48ora1>57thenifa1<65ora1>70then157 151 ifa2<48ora2>57thenifa2<65ora2>70then157 152 ifa1>64thena1=a1-55:goto154 153 ifa1<58thena1=a1-48 154 ifa2>64thena2=a2-55:goto156 155 ifa2<58thena2=a2-48 156 a=a1*16+a2:return 157 print"ungueltiger hexcode in zeile"peek(63)+peek(64)*256:end 158 b=an+a2*256:gosub147:i=i+1:b=b+a 159 hb=int(b/256):b=b-hb*256:pokei-1,b:pokei,hb:return 160 data 20,fd,ae,20,8a,ad,20,9b 161 data bc,a5,65,f0,03,4c,e3,a8 162 data a5,64,aa,29,10,d0,f6,8e 163 data *0,58,20,fd,ae,20,9e,b7 164 data e0,04,30,03,4c,ae,b3,86 165 data aa,8a,29,80,30,f6,a9,db 166 data a0,c1,20,1e,ab,a9,00,85 167 data b7,85,a9,a9,7f,a2,04,a0 168 data 04,20,ba,ff,20,c0,ff,a2 169 data 7f,20,c9,ff,a2,06,bd,*1 170 data cd,20,d2,ff,ca,10,f7,a9 171 data 00,85,fc,a9,00,85,fb,18 172 data 69,40,85,fd,a5,fc,69,1f 173 data 85,fe,a5,aa,c9,02,10,05 174 data a9,09,20,d2,ff,a2,04,a5 175 data aa,c9,02,10,0b,bd,*1,c3 176 data 20,d2,ff,ca,10,f7,30,09 177 data bd,*1,c8,20,d2,ff,ca,10 178 data f7,a2,00,86,ff,20,*0,f8 179 data a6,ff,a5,fb,18,69,08,85 180 data fb,a5,fc,69,00,85,fc,e8 181 data e0,28,d0,e7,20,cc,ff,a2 182 data 7f,20,c9,ff,a9,0a,20,d2 183 data ff,a5,aa,c9,02,30,16,a6 184 data a9,d0,12,e6,a9,38,a5,fb 185 data e9,40,85,fb,a5,fc,e9,01 186 data 85,fc,4c,*0,6a,a9,00,85 187 data a9,a5,fc,c5,fe,d0,8b,a5 188 data fb,c5,fd,d0,85,a2,06,bd 189 data *1,d4,20,d2,ff,ca,10,f7 190 data 20,cc,ff,a9,7f,4c,c3,ff 191 data a5,01,48,78,a9,34,85,01 192 data a0,07,b1,fb,99,*2,18,a9 193 data 00,99,*2,10,88,10,f3,68 194 data 85,01,58,20,*1,32,a0,07 195 data a5,aa,c9,02,10,0a,b9,*2 196 data 10,20,*1,b2,88,10,f7,60 197 data b9,*2,10,20,*1,68,88,10 198 data f7,60,a2,07,a0,07,b9,*2 199 data 18,29,80,20,*1,58,18,7d 200 data *2,10,9d,*2,10,88,10,ee 201 data a0,07,b9,*2,18,0a,99,*2 202 data 18,88,10,f6,ca,10,dd,60 203 data 85,02,98,c0,00,f0,05,46 204 data 02,88,10,f7,a8,a5,02,60 205 data 85,a8,98,48,a5,a9,f0,07 206 data a0,04,06,a8,88,d0,fb,a0 207 data 00,84,a7,a5,a8,29,80,20 208 data *1,a6,a5,a8,29,40,20,*1 209 data a5,a5,a8,29,20,4a,20,*1 210 data a5,a5,a8,29,10,4a,4a,20 211 data *1,a5,48,20,*1,b2,68,20 212 data *1,b2,68,a8,60,4a,48,20 213 data *1,ac,68,4a,18,65,a7,85 214 data a7,60,48,a5,aa,29,01,f0 215 data 04,68,4c,d2,ff,68,49,ff 216 data 4c,d2,ff,01,40,00,2a,1b 217 data 02,80,04,2a,1b,00,0d,44 218 data 1b,17,33,1b,0a,0a,0a,0a 219 data 0a,32,1b,0d,48,41,52,44 220 data 43,4f,50,59,20,45,50,53 221 data 4f,4e,0d,0d,28,43,29,20 222 data 20,4a,55,4e,49,20,31,39 223 data 38,34,20,42,59,0d,46,52 224 data 41,4e,4b,20,4c,4f,4e,43 225 data 5a,45,57,53,4b,49,0d,00 226 data a9,01,a0,01,a2,08,20,ba 227 data ff,a9,0f,a2,d3,a0,02,20 228 data bd,ff,a9,00,85,fb,a9,00 229 data 85,fc,a9,fb,a2,00,a0,00 230 data 4c,d8,ff,48,43,20,45,50 231 data 53,4f,4e,20,20,20,20,20 232 data 20,20,20