Druckertreiber für Itoh, NEC u. a. Drucker

Wer einen ITOH 8510 oder NEC 8023 oder dazu kompatiblen Drucker besitzt, kann die im Betriebssystem des ATARI implementierte Hardcopy-Routine, die über das gleichzeitige Drücken der < Alternate > und der < Help > Taste aufgerufen wird, nicht nutzen. Außerdem kann auch nicht ohne Programmhilfe der komplette ATARI-Zeichensatz (früher IBM-kompatible genannt) ausgedruckt werden, also Umlaute und Sonderzeichen, die über die < Alternate >-Taste des ATARI 260ST / 520ST / 520ST + anzuspechen sind.

Das Programm installiert die neue Hardcopy-Routine in der VBL-Queue (Vertical-BLank-Interrupt), die bei angeschlossenem monochrom Monitor 71 mal in der Sekunde aufgerufen wird, und es dem Benutzer ermöglicht eigene Programme abarbeiten zu lassen. Bei Drücken von ALT/HELP wird dann die neue Hardcopy-Routine ausgeführt und durch erneutes Drücken von ATL/HELP abgebrochen. Um die Hardcopy-Routine an andere Drucker anzupassen, müssen in den ’Datas: Druckersteuerung’ die entsprechenden Escape-Sequenzen verändert werden. Die erste Zahl gibt jeweils die Anzahl der zu übertragenden Daten minus 1 an.

’dinit:’
Druckerinitialisierung / wird nur zu Beginn der Hardcopy gesendet.

’dzeile:’
wird bei neuer Bildschirmzeile (640 Punkte) gesendet.

’dreset:’
Druckerreset / wird am Ende der Hardcopy gesendet.

Außerdem ist zu beachten, daß die Einzelnadelansteuerung beim ITOH-Drucker von oben nach unten erfolgt, während diese bei anderen Druckern oft umgekehrt aufgebaut ist. In diesem Fall muß der Assembler-Befehl clr d4 (über ’loops:’) durch move #560,d4 und add #80,d4 ( zwei Befehle unter ’loops:’) durch sub #80,d4 ersetzt werden.

Aufbau und Werte der Einzelnadelansteuerung im Graphikmodus:

ITOH Nadeln z.B. EPSON
1 1. ★ 128
2 2. ★ 64
4 3. ★ 32
8 4. ★ 16
16 5. ★ 8
32 6. ★ 4
64 7. ★ 2
128 8. ★ 1

Das in das Programm integrierte Druckertreiber wandelt den ATARI-Code in eine Codesequenz für den Drucker um, die das entsprechende Zeichen oder ein durch Einzelnadelgraphik definiertes Symbol darstellen. So besteht die Möglichkeit, daß Sie sich Ihre eigenen Zeichen und Symbole in der Tabelle der Wandlungswerte definieren. Der Treiber kann durch folgendes Assemblerprogramm erzeugt werden.

Das Programm kann nur vom DeskTop des ATARI aus initialisiert werden, nicht von einem „Auto“-Ordner aus. Außerdem darf es nur einmal gestartet werden.

	Sonderzeichen auf Itoh — Drucker 8510 A 
	           und Compatib1en

	       Zeichen und ASCII-Wert
	ä = 132	, ö = 148	,	ü = 12?	,	ß = 158	
	A = 142	, ö = 153	,	Ü = 154	,	§ = 221	
	[ = 125	, 1 = 092	,	{ = 093	,	} = 124	
	@ = 064	, \ = 123	,	~ = 126	,	| = 091
	-------------------------------------------

;*********************************************
;*        BILDSCHIRM - HARD - COPY und       *
;*      DRUCKERTREIBER fuer ITOH 8510 A,     *
;*         NEC 8023 B und Compatible         *
;*********************************************
nvbl :	equ		$454	;Anzahl der VBL-Slots
vbl:	equ		$454	;Basisadr. des VBL
ahf:	equ		$4ee	;ALT-HELP-Flag
badr:	equ		$44e	;Bi1dschirm-Basis-Adr.
;************************************************************* 
		jmp		svi		;Sprung zur Installation
;********* Test - Alt/Help - Routine ************************* 
begin:	tst		ahf
		bne		return
		move	#0,ahf
		bsr		hc
		move	#-1,ahf
return: rts				;Return zu Aufrufer
;*********** Hard - Copy - Routine ************************** 
hc:		lea		dinit(pc),a1	;Drucker initialisieren
		bsr		dout
		move.l	badr,a0			;Videobasis in aO
		move	#49,d1			;50 * 8 Bit <200 Punkte)
loopz:	tst		ahf				;Hardcopy abbrechen ?
		bne		ret
		lea		dzeile(pc),a1	;neue Zeile
		bsr		dout
		move 	#39,d2			;40 * 14 Bits <440 Punkte)
loopb:	move.l	#buffer,a1		;neuer Block
		move	#15,d3
		c1r		d4
loops:	subq	#1,d3			;Block in Buffer
		move	0(a0,d4),0(a1,d3)
		add		#80,d4
		dbf		d3,loops
		move	#15,d3			;Block drucken
loopd:	move	#7,d4
		move.l	#buffer,a1
loopp:	1sl		(a1)+			;Zeichenausgabe
		rox1	#1,d0
		dbf		d4,1oopp
		bsr		print
		dbf		d3,loopd
		add.l	#2,a0			;naechster Block
		dbf		d2,loopb
		add.l	#560,a0			;naechste Zeile
		dbf		d1,1oopz
ret:	lea		dreset(pc),a1 	;Drucker-Reset
		bsr		dout
		rts						;Ende der HC => Return
;********** Data - out - Routine ******************** 
dout:	move	sr,-(sp)
		movem.l	d1-d5/a0-a1,-(sp)
		move.b	(a1)+,d5		;Anzahl der Daten
loopo:	move.b	(a1)+,d0		;Zeichen holen
		bsr		print			;Zeichen drucken
		dbf		d5,loopo
		movem.l	(sp)+,a0-a1/d1-d5
		rtr
;********* Print - Routine ***************************** 
print:	movem.l	d1-d5/a0-a1,-(sp);Register sichern
		move	d0,-(sp)
		move	#0,-(sp)
		move	#3,-(sp)
		pea		radr(pc)	;Returnadresse
		move 	sr,-(sp)
printl:	move.l	atrap13,a0	;Zeichenausgabe
		jmp		(a0)		;=> alten trap«13
radr:	addq.1	#6,sp		;Stack korrigieren
		movem.l	(sp)+,a0-a1/d1-d5;Register zurueck
		rts

;*********	Datas: Druckersteuerung	*******************

		even
dinit:	dc.b	7,27,">",27,"N",27,"T16"	;unidire.,<N>,16/144
dzeile:	dc.b	7,13,10,27,"S0640"	;CR,Graphikp .(<540 )
dreset:	dc.b	7,27,"<",27,"A",13,10,10,10	; bidire., 1/6 Zeitenvorschub
		even
buffer:	blk.w	8
;**********	Neue trap#13 Routine **********************
trap13:	move.l	sp,a2			;Stackp. sichern
		btst	#5,(sp)			;Supervisor call
		bne		prints			;wenn ja, verzweige
		move.1	usp,a2			;sonst usp benutzen
		subq	#6,a2
prints:	cmp		#3,6(a2)		;Zeichenausgabe-Aufruf ?
		bne		print1
		cmp		#0,8(a2)		;zum Drucker ?
		bne		print1
		move	10(a2),d0		;Zeichen hoien
		lea		zeitab(pc),a0	;Zeiger auf Sonderzeichentabelle
		moveq	#ww01-zeitab-1,d1;Laenge der Tabele
loop:	cmp.b	(a0)+,d0		;Zeichen mit Tabelle vergleichen
		beq		print1			;wenn ja => ITOH-CODE drucken
		dbra	d1,1oop			;wenn d1>-1 dann Sprung zu loop
		bra		print1			;existiert nicht, so drucken
print1:	lsl		#2,d1
		1ea		adrtab(pc),a0	;Zeiger auf Adresstabelle
		move.l	(a0,d1),a0		;Zeiger auf Tabelle
		move.b	(a0)+,d1		;Laenge der Tabelle —1
loop1:	move.b	(a0)+,d0		;Zeichen aus Tabelle
		cmp		#255,d0			;vergleiche Endekennung
		beq		exit			;wenn d1=255 dann Sprung zu exit
		bsr		print			;Zeichenausgabe
		dbf		d1,loop1		;naechstes Zeichen
exit:	rte						;zurueck zum Programm

;********** Sonderzeichen-Tabelle (ATARI-Wert) **********
zeitab:	dc.b	091,092,093,123 ;| ] ( \
		dc.b	124,125,064,126	;) [ @ ~
		dc.b	132,148,129,158	;ae oe	ue	sz
		dc.b	142,153,154,221	;AE OE UE Pararaph
;***** Wandlungswerte bzw. Graphikdefinitionen (ITOH-Wert) ***** 
wwO1:	dc.b	0,64,255	;Paragraph
ww02:	dc.b	0,93,255	;UE
ww03:	dc.b	0,92,255	;0E
ww04:	dc.b	0,91,255	;AE
ww05:	dc.b	0,126,255	;sz
ww06:	dc.b	0,125,255	;ue
ww07:	dc.b	0,124,255	;ae
ww08:	dc.b	0,123,255	;ae
ww09:	dc.b	13,27,83,48,48,48,56,0,24,12,12,24,48,48,24	;~
ww1O:	dc.b	13,27,83,48,48,48,56,0,62,65,65,93,85,21,30	;@
ww11:	dc.b	13,27,83,48,48,48,56,0,0,65,65,119,62,8,0	;[
ww12:	dc.b	13,27,83,48,48,48,56,0,0,0,127,127,0,0,0	;)
ww13:	dc.b	13,27,83,48,48,48,56,0,8,62,119,65,65,0,0	;\
ww14:	dc.b	13,27,83,48,48,48,56,0,65,65,127,127,0,0,0	;(
ww15:	dc.b	13,27,83,48,48,48,56,0,6,12,24,48,96,64,0	;]
ww16:	dc.b	13,27,83,48,48,48,56,0,0,0,127,127,65,65,0	;|
;********** Adressen-Tabelle der Wandlungswerte ************** 
		even
adrtab:	de.l	ww01,ww02,ww03,ww04,ww05,ww06 	;Adressen
		dc.l	ww07,ww08,ww09,ww10,ww11,ww12	;der
		dc.l	ww13,ww14,ww15,ww16				; ITOH-Zeichen
atrap13:dc.l	0								;alter Trap#13-Vektor

;************ INSTALLATION DER VEKTOREN **************************** 
svi:	move.l	4(sp),a0	;Programm!aenge
		move.l	#$100,d7
		add.l	12(a0),d7
		add.l	20(a0),d7
		add.l	28(a0),d7
		sub.l	#110,d7		;minus Install.-Routine
		move.l	#instal,-(sp)	;Supervisor-cal1
		move	#38,-(sp)
		trap	#14
		addq.1	#6,sp

;********* INITIALISIERUNG DES trap#13—VEKTORS **************** 
		move.l	#trap13,-(sp)	;neuer Vektor
		move	#45,-(sp)		;Vektornummer
		move 	#5,-(sp)
		trap	#13				;Vektor setzen
		addq.1	#8,sp
		move.1	d0,atrap13		;alten Vektor sichern
		move.1	#0,-(sp)
		move.1	d0,-(sp)		;Speicherplatz des
		move	#$31,-(sp)		;Programms reservieren
		trap	#1				;=> Desktop

;********* INSTALLATION DES ALT—HELP-VEKTORS ****************** 
instal:	move	nvbl,d0	;Anzahl der Slots
		lsl		#2,d0
		move.l	vbl,a0	;Basisadr. der Slots
		clr		d1
search:	tst.l	0(a0,d1); freien Slot suchen
		beq		found
		addq 	#4,d1 
		cmp		d0,d1
		bne		search
		rts
tound:	lea		(a0,d1),a2	;freie Slotadr, merken
		move.l	#begin,(a2)	;Vektor setzen
		rts

;********* ENDE DER INSTALLATION ************************
Beispiel für eine Hardcopy mit dem Itoh-Drucker


Aus: ST-Computer 02 / 1986, Seite 49

Links

Copyright-Bestimmungen: siehe Über diese Seite