{---------------------------------------------------------------------------} { SETUP.PAS } { Ein Werkzeug zur Druckerinitialisierung } { fuer Panasonic KX-P1092 und Epson-Kompatible. } { } {---------------------------------------------------------------------------} PROGRAM SetUp; CONST max = 10; { maximale Anzahl Betriebsarten/Gruppe } Bell = ^G; { ASCII-Zeichen laesst Ton ertoenen } up = ^E; { Control-Zeichen zur Cursorsteuerung } down = ^X; right = ^D; left = ^S; enter = ^M; esc = #27; backspace = ^H; TYPE Arten = (Schriften,ZeilenVor,PapierVor,ZeichenSt,Divers); str20 = STRING[ 20]; str128 = STRING[128]; Beschreiber = RECORD Text : str20; { Betriebsarten Beschreibung } Init : STRING[6]; { Betriebsarten Initialsierung-Sequenz } DeInit: STRING[6]; { Betriebsarten Deinitialisieruns-Sequenz } Parm : BYTE; { wenn zur Initialisierung ein Parameter } { erfragt werden soll ist dieser Wert<>0 } Grp : BYTE; { Priority der Beriebsart: 0=Default Wert einer Gruppe, nach dem Reset anzuzeigen 1=nach dem Reset der Bertiebsart selektiere den Default-Wert der Gruppe 2=Diese Betriebsart kann normal gesetzt und rueckgesetzt werden 3=Definiertes Ruecksetzten nicht moeglich 4=Nach dem Reset setzen. Wird benutzt bei Betriebsarten anstatt Grp=0 7=fluechtige Betriebsart Einstellung z.b LF 8=reserviertes Feld, nicht benutzt 9=General Reset, IN allen Gruppen Default Werte anzeigen } Aktv : BOOLEAN; { Status der Betriebsart valid/invalid } END; Menue = RECORD Kopf : str20; { Titel eines Untermenues } Anzahl: INTEGER; { Betriebsarten eines Untermenues } Xpos : BYTE; { Anzeige eines Untermenues, an } Ypos : BYTE; { Bildschirmposition X,Y } Rumpf : ARRAY[1..max] OF Beschreiber; END; CONST Menuefeld : ARRAY[Arten] OF Menue = ((Kopf :'** SCHRIFTARTEN **' ; Anzahl:9; Xpos:2; Ypos:5; Rumpf : ((Text:'Pica ';Init:#27#80 ;DeInit:#0 ;Parm:0 ;Grp:0 ;Aktv:TRUE), (Text:'Elite ';Init:#27#77 ;DeInit:#27#80 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Komprimiert ';Init:#15 ;DeInit:#18 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Fett ';Init:#27#69 ;DeInit:#27#70 ;Parm:0 ;Grp:2 ;Aktv:FALSE), (Text:'Breit ';Init:#27#87#1 ;DeInit:#27#87#0 ;Parm:0 ;Grp:2 ;Aktv:FALSE), (Text:'Kursiv-Schrift ';Init:#27#52 ;DeInit:#27#53 ;Parm:0 ;Grp:2 ;Aktv:FALSE), (Text:'NLQ-Schrift ';Init:#27#110 ;DeInit:#27#80 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Proport. Schrift ';Init:#27#111 ;DeInit:#27#80 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Proport. Abstand ';Init:#27#112#1 ;DeInit:#27#112#0 ;Parm:0 ;Grp:2 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE))), (Kopf :'** ZEILENSPRUNG **'; Anzahl:5; Xpos:22; Ypos:5; Rumpf : ((Text:'2,47mm (7/72i) ';Init:#27#49 ;DeInit:#27#50 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'3,2 mm (1/8 i) ';Init:#27#48 ;DeInit:#27#50 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'4,2 mm (1/6 i) ';Init:#27#50 ;DeInit:#0 ;Parm:0 ;Grp:0 ;Aktv:TRUE ), (Text:'[xx]/72 i ';Init:#27#65 ;DeInit:#27#50 ;Parm:1 ;Grp:1 ;Aktv:FALSE), (Text:'[xxx]/216i ';Init:#27#51 ;DeInit:#27#50 ;Parm:1 ;Grp:1 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE))), (Kopf :'** DRUCKBEREICH **'; Anzahl:3; Xpos:22; Ypos:12; Rumpf : ((Text:'[xxx] Ueber Perfor';Init:#27#78 ;DeInit:#27#79 ;Parm:1 ;Grp:2 ;Aktv:FALSE), (Text:'[xxx] Rand rechts ';Init:#27#81 ;DeInit:#0 ;Parm:1 ;Grp:3 ;Aktv:FALSE), (Text:'[xxx] Rand links ';Init:#27#108 ;DeInit:#0 ;Parm:1 ;Grp:3 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE))), (Kopf :'** ZEICHENSATZ **'; Anzahl:10; Xpos:42; Ypos:5; Rumpf : ((Text:'USA ';Init:#27#82#0 ;DeInit:#27#82#0 ;Parm:0 ;Grp:0 ;Aktv:TRUE ), (Text:'England ';Init:#27#82#3 ;DeInit:#27#82#0 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Deutschland ';Init:#27#82#2 ;DeInit:#27#82#0 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Frankreich ';Init:#27#82#1 ;DeInit:#27#82#0 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Italien ';Init:#27#82#6 ;DeInit:#27#82#0 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Schweden ';Init:#27#82#5 ;DeInit:#27#82#0 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Spanien ';Init:#27#82#7 ;DeInit:#27#82#0 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Japan ';Init:#27#82#8 ;DeInit:#27#82#0 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Norwegen ';Init:#27#82#9 ;DeInit:#27#82#0 ;Parm:0 ;Grp:1 ;Aktv:FALSE), (Text:'Daenemark ';Init:#27#82#10 ;DeInit:#27#82#0 ;Parm:0 ;Grp:1 ;Aktv:FALSE))), (Kopf :'** STEUERUNG **'; Anzahl:8; Xpos:62; Ypos:5; Rumpf : ((Text:'Reset ';Init:#27#64 ;DeInit:#0 ;Parm:0 ;Grp:9 ;Aktv:FALSE), (Text:'Zeilenvorschub ';Init:#10 ;DeInit:#0 ;Parm:0 ;Grp:7 ;Aktv:FALSE), (Text:'Seitenvorschub ';Init:#12 ;DeInit:#0 ;Parm:0 ;Grp:7 ;Aktv:FALSE), (Text:'Halbe Geschwindkt ';Init:#27#115#1 ;DeInit:#27#115#0 ;Parm:0 ;Grp:2 ;Aktv:FALSE), (Text:'Druck in e.Richtng';Init:#27#85#1 ;DeInit:#27#85#0 ;Parm:0 ;Grp:2 ;Aktv:FALSE), (Text:'Papierendekennung ';Init:#27#57 ;DeInit:#27#56 ;Parm:0 ;Grp:4 ;Aktv:TRUE ), (Text:'Testbetrieb ';Init:#27#105#1 ;DeInit:#27#105#0 ;Parm:0 ;Grp:2 ;Aktv:FALSE), (Text:'Probedruck' ;Init:'' ;DeInit:'' ;Parm:255 ;Grp:7 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE), (Text:'' ;Init:'' ;DeInit:'' ;Parm:0 ;Grp:8 ;Aktv:FALSE)))); VAR Xalt, Yalt: INTEGER; { fuer SHARP vom Type BYTE ! } Ch : CHAR; f : INTEGER; P : Arten; Init : BOOLEAN; {---------------------------------------------------------------------------} PROCEDURE DruckerReset; BEGIN Write(Lst, esc, '@'); END; {---------------------------------------------------------------------------} PROCEDURE Merke_alte_Position; (* Version fuer SHARP MZ 80A unter CP/M 2.2: VAR CurHor: BYTE ABSOLUTE $0048; CurVer: BYTE ABSOLUTE $0049; BEGIN Xalt := Succ(CurHor); Yalt := Succ(CurVer); END; und hier fuer MS-DOS: BEGIN Xalt := WhereX; Yalt := WhereY; END; *) {---------------------------------------------------------------------------} PROCEDURE Setze_alte_Position; BEGIN GotoXY(Xalt,Yalt); END; {---------------------------------------------------------------------------} PROCEDURE ZeigeAn (x, y: BYTE; inverse: BOOLEAN; Text: str128); BEGIN GotoXY(x,y); IF inverse THEN HighVideo; Write(Text); LowVideo; END; {---------------------------------------------------------------------------} PROCEDURE Status_Aendern (Gruppe: Arten; feld: INTEGER); BEGIN Merke_alte_Position; WITH Menuefeld[Gruppe].Rumpf[feld] DO Aktv := NOT Aktv; WITH Menuefeld[Gruppe] DO ZeigeAn(Xpos, Ypos+feld, Rumpf[feld].Aktv, Rumpf[feld].Text); Setze_alte_Position; END; {---------------------------------------------------------------------------} PROCEDURE Wait_for_Ready; VAR Stbyte : BYTE; hell, PReady: BOOLEAN; BEGIN Merke_alte_Position; REPEAT Stbyte := Port[$FE]; Stbyte := Stbyte AND $03; hell := NOT hell; CASE Stbyte OF 1: BEGIN PReady := FALSE; ZeigeAn(1, 23, hell, '++Fehler: Drucker ONLINE schalten !'); Delay(150); { 150 Millisekunden warten } END; 2: PReady := TRUE; 3: BEGIN PReady := FALSE; ZeigeAn(1, 23, hell, '++Fehler: Drucker einschalten !'); Delay(150); END; END; UNTIL PReady; GotoXY(1,23); ClrEol; { bis Zeilenende loeschen } Setze_alte_Position; END; {---------------------------------------------------------------------------} PROCEDURE Zeiger (x, y: BYTE; Mark: BOOLEAN); VAR marker: STRING[2]; BEGIN Merke_alte_Position; IF Mark THEN marker := '><' ELSE marker := ' '; GotoXY(Pred(x),y); Write(marker[1]); GotoXY(x+18,y); Write(marker[2]); Setze_alte_Position; END; {---------------------------------------------------------------------------} PROCEDURE Waehle_Betriebsart; TYPE Str80 = STRING[80]; VAR j : Arten; i : INTEGER; parameter: INTEGER; satz : Str80; {-------------------------------------------------------------------------} PROCEDURE GetParameter (VAR paramt: INTEGER); VAR n,a,e, err: INTEGER; c : CHAR; tmp : STRING[6]; BEGIN Merke_alte_Position; GotoXY(1,23); Write('Parameter eingeben: '); WITH Menuefeld[P].Rumpf[f] DO BEGIN e := Pos(']', Text); a := Pos('[', Text); n := Pred(e-a); tmp := ''; REPEAT Read(Kbd, c); { Zeichen von Tastatur ohne Echo lesen } IF c IN ['0'..'9'] THEN BEGIN Write(c); tmp := tmp+c; END ELSE IF (c = backspace) AND (Length(tmp) > 0) THEN BEGIN Write(c); tmp[0] := Chr(Pred(Length(tmp))); END ELSE IF c <> enter THEN Write(Bell); UNTIL (c = ^M) OR (Length(tmp) = n); Val(tmp, paramt, err); Text := '['+Copy('000', 1, n-Length(tmp))+tmp+']'+ Copy(Text, Succ(e), Succ(Length(Text)-e)); END; { WITH } GotoXY(1,23); ClrEol; Setze_alte_Position; END; {-------------------------------------------------------------------------} PROCEDURE GetString (VAR Satz: Str80); BEGIN Merke_alte_Position; GotoXY(1,23); Write('String: '); ReadLn(Satz); GotoXY(1,23); ClrEol; Setze_alte_Position; END; {-------------------------------------------------------------------------} BEGIN { Waehle_Betriebsart } WITH Menuefeld[P].Rumpf[f] DO CASE Grp OF 0: IF Aktv THEN Write(Bell) ELSE BEGIN Write(Lst, Bell, Init); Status_Aendern(P, f); FOR i := 1 TO max DO WITH Menuefeld[P].Rumpf[i] DO IF (Grp = 1) AND Aktv THEN Status_Aendern(P, i); END; 1: IF Aktv THEN BEGIN Write(Lst, Bell, DeInit); Status_Aendern(P, f); FOR i := 1 TO max DO WITH Menuefeld[P].Rumpf[i] DO IF (Grp = 0) AND NOT Aktv THEN Status_Aendern(P, i); END ELSE BEGIN IF Parm = 0 THEN Write(Lst, Bell, Init) ELSE BEGIN GetParameter(parameter); Write(Lst, Bell, Init, Chr(parameter)); END; Status_Aendern(P, f); FOR i := 1 TO max DO WITH Menuefeld[P].Rumpf[i] DO IF (Grp IN [0..1]) AND Aktv AND (i <> f) THEN Status_Aendern(P, i); END; 2, 4: BEGIN IF Aktv THEN Write(Lst, Bell, DeInit) ELSE BEGIN IF Parm = 0 THEN Write(Lst, Bell, Init) ELSE BEGIN GetParameter(parameter); Write(Lst, Bell, Init, Chr(parameter)); END; END; Status_Aendern(P, f); END; 3: IF NOT Aktv THEN BEGIN IF Parm = 0 THEN Write(Lst, Bell, Init) ELSE BEGIN GetParameter(parameter); Write(Lst, Bell, Init, Chr(parameter)); END; Status_Aendern(P, f); END ELSE BEGIN Merke_alte_Position; Write(Bell, Bell, Bell); GotoXY(1,23); HighVideo; Write('++Fehler:Benutze RESET zum Ruecksetzen '); Write('dieser Betriebsart'); Delay(2000); LowVideo; GotoXY(1,23); ClrEol; Setze_alte_Position; END; 7: IF NOT Aktv THEN IF Parm = 255 THEN BEGIN GetString(Satz); WriteLn(Lst, Satz); END ELSE BEGIN Status_Aendern(P, f); Write(Lst, Bell, Init); Delay(150); Status_Aendern(P, f); END; 9: BEGIN DruckerReset; Status_Aendern(P, f); FOR j := Schriften TO Divers DO FOR i := 1 TO max DO WITH Menuefeld[j].Rumpf[i] DO IF ((Grp = 0) OR (Grp = 4)) AND NOT Aktv THEN Status_Aendern(j, i) ELSE IF (Grp IN [1..3]) AND Aktv THEN Status_Aendern(j, i); Status_Aendern(P, f); END; END; { CASE } END; {---------------------------------------------------------------------------} PROCEDURE Baueauf; CONST limiter = '=================='; VAR i: INTEGER; z: Arten; BEGIN LowVideo; ZeigeAn(25, 1, FALSE, '** DRUCKER-SETUP Ver 1.01 **'); ZeigeAn(27, 2, FALSE, '(c) PASCAL International'); ZeigeAn(1, 21, FALSE, '=Auswahl der Betriebsart '); ZeigeAn(34,21, FALSE, '/ =Setzen der Betriebsart / =Ende'); WriteLn; FOR z := Schriften TO Divers DO WITH Menuefeld[z] DO BEGIN ZeigeAn(Xpos, Ypos, FALSE, Kopf); FOR i := 1 TO Anzahl DO WITH Rumpf[i] DO ZeigeAn(Xpos, Ypos+i, Aktv, Text); ZeigeAn(Xpos, Succ(Ypos+Anzahl), FALSE, limiter); END; GotoXY(1,22); Write('CMD>'); END; {---------------------------------------------------------------------------} PROCEDURE NeuesFeld (c: CHAR); BEGIN WITH Menuefeld[p] DO CASE c OF down : IF f < Anzahl THEN BEGIN Zeiger(Xpos, Ypos+f, FALSE); f := Succ(f); Zeiger(Xpos, Ypos+f, TRUE); END ELSE IF Ord(p) = 4 THEN Write(Bell) ELSE BEGIN Zeiger(Xpos, Ypos+f, FALSE); p := Succ(p); f := 1; Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE); END; up : IF f > 1 THEN BEGIN Zeiger(Xpos, Ypos+f, FALSE); f := Pred(f); Zeiger(Xpos, Ypos+f, TRUE); END ELSE IF Ord(p) = 0 THEN Write(Bell) ELSE BEGIN Zeiger(Xpos, Ypos+f, FALSE); p := Pred(p); f := Menuefeld[p].Anzahl; Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE); END; left : IF Ord(p) > 0 THEN BEGIN Zeiger(Xpos, Ypos+f, FALSE); p := Pred(p); f := 1; Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE); END ELSE Write(Bell); right: IF Ord(p) < 4 THEN BEGIN Zeiger(Xpos, Ypos+f, FALSE); p := Succ(p); f := 1; Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE); END ELSE Write(Bell); END; { CASE c } END; {---------------------------------------------------------------------------} BEGIN { SetUp } (* ClrScr; Baueauf; { Wait_for_Ready; s. Begleitartikel } DruckerReset; p := Schriften; f := 1; Zeiger(Menuefeld[p].Xpos, Menuefeld[p].Ypos+f, TRUE); REPEAT Read(Kbd, Ch); CASE Ch OF up, down, right, left: NeuesFeld(Ch); enter : Waehle_Betriebsart; ELSE Write(Bell); END; UNTIL Ch = esc; *) END.