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