← ST-Computer 08 / 1987

Hardcopy für Typenraddrucker (TA-GABI 9009 mit IFD 1)

Grundlagen

Dieses Programm ermöglicht es endlich auch den vielen Besitzern des TA Typenraddruckers Gabriele 9009 Hardcopys zu drucken! Es funktioniert mit der Interface-Box IFD 1.

Das Programm wurde mit dem Hisoft Assembler geschrieben, kann aber im Prinzip an jeden anderen, insbesondere an unseren Public-Domain Assembler, angepasst werden, da keine speziellen Bibliotheks-Funktionen verwendet werden. Das fertige Programm wird als COPY.TOS (oder COPY. PRG falls es im Auto Ordner gestartet werden soll) abgespeichert. Ist die Routine im Speicher, können Sie über Alternate + Help die Hardcopy starten. Ein erneutes Drücken von Alt/ Help bricht die Hardcopy ab. Hier müssen Sie allerdings warten, bis der Puffer Ihrer Interface-Box leer ist.

Bild 1: Hardcopy des Desktops

Zur Funktion des Programms

Wird das Programm aus dem Desktop oder dem Auto-Ordner gestartet, überprüft es erst, ob es sich schon im Speicher befindet. In diesem Fall zeigt der 7. Eintrag der VBL-queue auf die Startadresse. Wir müssen also nur eine festgelegte Adresse innerhalb unseres Programms abfragen, und erfahren so, ob das Programm schon Speicherresident geladen ist. Die Aufgabe dieser sogenannten Magic-number übernimmt hier das Langwort ab Label progr + 2. Ist das Programm schon geladen worden, verabschiedet sich das Programm mit entsprechender Meldung. Starten Sie es aber zum ersten Mal und bestätigen die Frage „resident halten“ mit „J“ oder „j“, wird die eigentliche Copy-Routine ab Label progr mit Hilfe der Gemdos-Funktion $31 resident gehalten und die Startadresse in die VBL-queue eingetragen. An die Stelle „progr“ wird ab jetzt gesprungen, wenn Sie Alternate + Help bestätigen.

Wollen Sie nun eine Hardcopy machen, wird als erstes überprüft, ob Sie einen Farbmonitor angeschlossen haben. Da mit dem Drucker im Farbmodus keine brauchbaren Graustufen (über die Anschlagstärke) möglich sind, wird in diesem Falle einfach abgebrochen.

Wenn Sie in der hohen Auflösung arbeiten und die IFD1 „online“ ist, steht der Hardcopy nichts mehr im Wege.

Die Routine „initco“ stellt den Grafic-Modus der Schreibmaschine ein. Dies geschieht mit der Funktion ESC „3“, die in Ihrer IFD 1 Bedienungsanleitung auf Seite 46 näher beschrieben ist.

Nun werden ymax Zeilen ab Zeile ymin gedruckt. Das Unterprogramm „Zeile“ übernimmt die Abfrage, ob einzelne Bildpunkte gesetzt sind oder nicht. Entsprechend wird ein „.“ oder ein Space gedruckt. Die Bildschirmabfrage geschieht mit Hilfe der Line A Routine A002. Am Ende der Zeile wird ein LF und ein CR ausgegeben, und der Drucker erneut in den Grafic-Modus gebracht (CR löscht diesen!). In jeder Zeile werden xmax Punkte ab Punkt xmin gedruckt.

Sie können diese Routine in ein von Ihnen erstelltes GEM-Programm einbauen, um den zu druckenden Bereich z. B. mit dem GEM-Gummi-faden ausschneiden zu können. Sie brauchen hierzu lediglich den Teil ab „docopy“, in welchem Sie die Zeile „move.w -1, $4ee“ entfernen, als Unterprogramm in Ihr eigenes Programm einzubauen. Die Koordinaten übergeben Sie in xmin bis ymax.

Nur für Geduldige

Nicht verleugnen wollen wir die Zeit, die eine Hardcopy auf der Gabi 9009 benötigt. Bild 1 quälte die Maschine ca. zwei Stunden.

Bild 2 hingegen gab sich mit 70 Minuten zufrieden. Es ist bei einer Typenradmaschine auch nicht anders zu erwarten, denn jedes Pixel bedarf eines Anschlages. Also: je weniger Punkte desto schneller.

Noch einen Tip zum Schluß: Verwenden Sie bitte normales Nylon-und kein Carbon-Farbband für Hardcopys. Da Sie eine Hardcopy in DIN A4 Format erhalten, empfehle ich DIN A3 Zeichenblock Papier zu verwenden.

Uli Herrmann

Bild 2: Hardcopy eines Platinenlayouts
* Programmlänge berechnen init move.l 4(sp),a0 * Basepage move.l #$100,d6 * Basepage-length add.l 12(a0),d6 * + Programm-length * Test ob bereits resident check clr.l (sp) * in supervisor-mode move.w #32,-(sp) trap #1 addq.1 #6,sp move.l d0,d5 * alter ssp move. 1 $456,a5 * adress of vblqueue move.l 28(a5),a0 * adress of copy routine cmp.1 #$03121964,2(a0) * test ob schon resident beq.s alres * ist schon resident lea amsg,a0 * meldung --> a0 bsr.s print * print "resident halten?" bsr.s input * auf j oder n warten bne.s batg * wenn nein, dann terminate move.l #progr,28(a5) * copy vector an stelle 7 in vblqueue bsr.s userm * in usermode zurck clr.w -(sp) move.l d6,-(sp) * program-length move.w #$31,-(sp) * keep process trap #1 * gemdos does it alres lea rmsg,a0 * text "bereits resident" bsr.s print bsr.s input * warte auf taste batg bsr.s userm clr.w -(sp) * terminate trap #1 input move.w #1,-(sp) trap #1 addq .1 #2,sp ori.w #$20,d0 * klein machen cmpi.b #'j',d0 * ist es 'J' bne.s no yes clr.w d0 * return with zero no rts print move.l a0,-(sp) * adress of string move.w #9,-(sp) trap #1 addq.l #6,sp rts userm move.l d5,-(sp) * old Supervisor stack move.w #32,-(sp) * in user-mode zurck trap #1 addq.l #6,sp rts * folgende routine wird bei ALT/HELP aufgerufen progr bra.s copy dc.1 $03121964 * Kennung der routine copy tst.w $4ee * test dmpflg beq.s docopy * ist 0 wenn ALT/HELP gedr. wurde rts * schade docopy movem.l d0-d7/a0-a6,-(sp) move.l a7,a4 * sp for error return dc.w $a000 * 1 ine -A Variables move.w 0(a0),d0 * v_planes lsr.w #1,d0 * high_res mode (eine Möglichkeit) bcc.s donot * no highres mode - no copy move.l 12(a0),a0 * x/y-Koordinaten movea.l a0,a6 bsr.s initco * printnr in grafic mode move.w ymin,ycor * minimum y position move.w ymax,d3 * maximum y position loop3 bsr.s zeile * plot 1 line bsr.s nxtlne add.w #1,ycor * next line tst.w $4ee * ALT/HELP bne.s donot * Ende dbf d3,loop3 * bis alle Zeilen fertig donot move.w #-1,$4ee * Copy-Flag wieder vorbereiten movem.l (sp)+,d0-d7/a0-a6 rts zeile move.w xmin,xcor * minimum x position move.w xmax,d4 * maximum x position loop1 movea.l a6,a0 * adress of x/y line A move.w xcor,0(a0) * x coordinate move.w ycor,2(a0) * y coordinate dc.w $a002 * Punkt testen tst.w d0 * gesetzt? beq nodot * nein bsr.s dot * ja nodot bsr space * immer im Grafic mode add.w #1,xcor * next position dbf d4,loop1 * und so weiter bis Zeile fertig rts initco move.l #inita,a5 loop2 cmp.w #$ff,(a5) beq.s goback move.w (a5)+,d0 bsr.s prtout bra.s loop2 goback rts nxtlne move.l #lntab,a5 bra.s loop2 dot move.w #".",d0 bra.s prtout space move.w #" ",d0 prtout move.w d0,-(sp) move.w #0,-(sp) move.w #3,-(sp) trap #13 addq.1 #6,sp tst.w d0 * alles klar? bne.s prtok * ja move.1 a4,a7 bra donot * lieber abbrechen prtok rts even lntab dc.w 10,13 inita dc.w 27,"3",$ff xeor ds.w 1 ycor ds.w 1 amsg dc.b $1b,'E','COPY geladen, Resident halten (J/N) ?',0 even rmsg dc.b $1b,'E','COPY bereits resident !!! ',0 even xmin dc.w 0 xmax dc.w 639 ymin dc.w 0 ymax dc.w 399 end 1 'OMIKRON-Basic Lader zu Hardcopyroutine Gabi 9009 2 Filename$="GABI9009.TOS" 3 OPEN "O",1,FilenameS 4 READ Wert 5 REPEAT 6 PRINT #1, CHR$(Wert); 7 Summe=Summe+Wert 8 READ Wert 9 UNTIL Wert=-1 10 READ Pruefsumme 11 IF Pruefsumme<>Summe THEN 12 PRINT "Fehler In Datas" 13 ENDIF 14 CLOSE(1) 100 DATA 96,26,0,0,1,196,0,0,0,0 101 DATA 0,0,0,0,0,0,0,0,0,0 102 DATA 0,0,0,0,0,0,0,0,32,111 103 DATA 0,4,44,60,0,0,1,0,220,168 104 DATA 0,12,66,167,63,60,0,32,78,65 105 DATA 92,143,42,0,42,121,0,0,4,86 106 DATA 32,109,0,28,12,168,3,18,25,100 107 DATA 0,2,103,32,65,249,0,0,1,118 108 DATA 97,62,97,38,102,30,43,124,0,0 109 DATA 0,140,0,28,97,60,66,103,47,6 110 DATA 63,60,0,49,78,65,65,249,0,0 111 DATA 1,158,97,30,97,6,97,38,66,103 112 DATA 78,65,63,60,0,1,78,65,84,143 113 DATA 0,64,0,32,12,0,0,106,102,2 114 DATA 66,64,78,117,47,8,63,60,0,9 115 DATA 78,65,92,143,78,117,47,5,63,60 116 DATA 0,32,78,65,92,143,78,117,96,4 117 DATA 3,18,25,100,74,121,0,0,4,238 118 DATA 103,2,78,117,72,231,255,254,40,79 119 DATA 160,0,48,40,0,0,226,72,100,48 120 DATA 32,104,0,12,44,72,97,116,51,249 121 DATA 0,0,1,192,0,0,1,116,54,57 122 DATA 0,0,1,194,97,36,97,116,6,121 123 DATA 0,1,0,0,1,116,74,121,0,0 124 DATA 4,238,102,4,81,203,255,234,51,252 125 DATA 255,255,0,0,4,238,76,223,127,255 126 DATA 78,117,51,249,0,0,1,188,0,0 127 DATA 1,114,56,57,0,0,1,190,32,78 128 DATA 49,121,0,0,1,114,0,0,49,121 129 DATA 0,0,1,116,0,2,160,2,74,64 130 DATA 103,0,0,4,97,46,97,0,0,50 131 DATA 6,121,0,1,0,0,1,114,81,204 132 DATA 255,214,78,117,42,124,0,0,1,108 133 DATA 12,85,0,255,103,6,48,29,97,22 134 DATA 96,244,78,117,42,124,0,0,1,104 135 DATA 96,234,48,60,0,46,96,4,48,60 136 DATA 0,32,63,0,63,60,0,0,63,60 137 DATA 0,3,78,77,92,143,74,64,102,6 138 DATA 46,76,96,0,255,120,78,117,0,10 139 DATA 0,13,0,27,0,51,0,255,0,0 140 DATA 0,0,27,69,67,79,80,89,32,103 141 DATA 101,108,97,100,101,110,44,32,82,101 142 DATA 115,105,100,101,110,116,32,104,97,108 143 DATA 116,101,110,32,40,74,47,78,41,32 144 DATA 63,0,27,69,67,79,80,89,32,98 145 DATA 101,114,101,105,116,115,32,114,101,115 146 DATA 105,100,101,110,116,32,33,33,33,32 147 DATA 0,0,0,0,2,127,0,0,1,143 148 DATA 0,0,0,48,12,20,102,4,6,12 149 DATA 32,4,6,8,8,24,12,20,0 9998 DATA -1 9999 DATA 30238