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.
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.
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
* 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