← ST-Computer 02 / 1986

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

Listing

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