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

Links

Copyright-Bestimmungen: siehe Über diese Seite