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

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


Aus: ST-Computer 08 / 1987, Seite 42

Links

Copyright-Bestimmungen: siehe Über diese Seite