(*************************************************************************)
(* Installationsprogramm für Stand : 3. 1.89 *)
(* 24-Nadel Drucker Version : 0.9 *)
(* Autor : hjh *)
(*************************************************************************)
PACKET driver inst 24
DEFINES treiber einrichten:
LET up = ""3""13""5"",
generator name = "printer.24.nadel",
description file name = "beschreibungen24",
module file name = "module24";
INT VAR pr channel,
quality,
paper format number,
service option;
TEXT VAR fonttab name :: "",
driver name :: "";
TEXT VAR inp;
BOOL VAR was esc;
treiber einrichten
PROC treiber einrichten:
treiber einrichten (0)
END PROC treiber einrichten;
PROC treiber einrichten (INT CONST service opt):
ask for print channel;
main menu;
IF installed
THEN generate printer spool
ELSE inform about restart
FI.
ask for printchannel:
inits;
page;
headline ("Druckerkanal - Einstellung");
cursor (1, 15);
putline ("Hinweis: Die Druckerkanalnummer kann auch nachträglich mit");
putline (" 'serverchannel (Kanalnummer)' in der Task """ +
name (myself) + """");
putline (" verändert werden.");
REP
cursor (1, 10);
put (""5"EUMEL-Kanalnummer des Druckerkanals:");
get (pr channel);
disable stop;
serverchannel (pr channel);
BOOL VAR no error :: NOT is error;
IF is error
THEN cursor (1, 7);
put error;
putline ("Eingabe korrigiert wiederholen!")
FI;
clear error;
enable stop
UNTIL no error PER.
inits:
line;
IF single task
THEN errorstop ("Dieser Treiber arbeitet nur mit Multi-Tasking-EUMEL")
FI;
command dialogue (TRUE);
IF name (myself) <> "PRINTER"
THEN putline ("Diese Task heißt nicht ""PRINTER"", sondern """ +
name (myself) + """ !");
IF yes ("Soll die Task in ""PRINTER"" umbenannt werden ?")
THEN rename myself ("PRINTER")
FI
FI;
INT VAR choice;
service option := service opt.
single task: (pcb (9) AND 255) = 1.
main menu:
BOOL VAR installed :: FALSE;
REP
show main menu;
get choice;
treat choice
UNTIL was esc OR installed PER.
show main menu:
page;
headline("Hauptmenü 24-Nadel-Drucker");
putline (" 1. Brother");
putline (" 2. Epson");
putline (" 3. NEC");
putline (" 4. OKI");
putline (" 5. Toshiba").
get choice:
cursor (1,24);
put ("CR: Eingabe ESC: Installation abbrechen");
ask user (5).
treat choice:
SELECT int (inp) OF
CASE 1: brother menu
CASE 2: epson menu
CASE 3: nec menu
CASE 4: oki menu
CASE 5: toshiba menu
END SELECT.
brother menu:
page;
headline ("brother - Menü");
putline (" 1. M-1724 L");
cursor (1,24);
put ("CR: Eingabe ESC: Zurück zum Hauptmenü");
ask user (1);
page;
choice := int (inp);
IF was esc
THEN was esc := FALSE
ELSE headline ("");
putline ("Druckertyp:");
brother m1724l inst
FI.
brother m1724l inst:
putline ("brother M-1724 L");
line;
putline ("Wählen Sie folgende DIP-Schalter Optionen:");
putline ("Emulationsmodus IBM Proprinter XL ");
putline ("Automatischer Zeilenvorschub Nein ");
show control options ("paperfeed, std speed, top margin");
show material options ("slow, fast, draft, nlq");
show command options ("draft, nlq");
ask for papersize;
ask for quality;
IF all right
THEN get fonttable ("fonttab.brother");
generate ("brotherm1724l");
adjust papersize;
adjust quality;
IF choice = 2 THEN do ("papersize (34.544, 30.48)") FI;
installed := TRUE
FI.
toshiba menu:
page;
headline ("TOSHIBA - Menü");
putline (" 1. P 321");
cursor (1,24);
put ("CR: Eingabe ESC: Zurück zum Hauptmenü");
ask user (1);
page;
choice := int (inp);
IF was esc
THEN was esc := FALSE
ELSE headline ("");
putline ("Druckertyp:");
toshiba p321 inst
FI.
toshiba p321 inst:
putline ("TOSHIBA P 321");
putline ("Die DIP-Schalter müssen so eingestellt sein:");
putline ("S3-8 S3-7 S3-5 übrige Schalter");
putline ("OFF OFF *) egal ");
putline ("*) ON: Einzelblatteinzug, OFF: kein Einzug");
show control options ("std speed, paper feed");
show material options("slow, fast");
show command options ("nlq, draft");
ask for quality;
ask for papersize;
IF all right
THEN get fonttable ("fonttab.toshiba.p321");
generate ("toshp321");
adjust papersize;
adjust quality;
do ("papersize(21.0,30.48)");
installed := TRUE;
FI.
epson menu:
page;
headline ("Epson - Menü");
putline (" 1. LQ 850");
putline (" 2. LQ 1050");
putline (" 3. LQ 1500");
cursor (1,24);
put ("CR: Eingabe ESC: Zurück zum Hauptmenü");
ask user (3);
page;
choice := int (inp);
IF was esc
THEN was esc := FALSE
ELSE headline ("");
putline ("Druckertyp:");
SELECT choice OF
CASE 1 : lq850 inst
CASE 2 : lq850 inst
CASE 3 : lq1500 inst
END SELECT
FI.
lq850 inst:
IF choice = 1
THEN putline ("Epson LQ 850")
ELSE putline ("Epson LQ 1050")
FI;
putline ("Die DIP-Schalter müssen so eingestellt sein:");
putline ("SW1-1 SW1-2 SW1-3 SW1-4 SW1-5 SW1-6 SW1-7 SW1-8");
putline ("egal egal egal egal egal egal *1) OFF ");
putline ("*1) ON: Einzelblatteinzug, OFF: kein Einzug"); line;
putline ("SW2-1 SW2-2 SW2-3 SW2-4 SW2-5 SW2-6 SW2-7 SW2-8");
putline ("egal egal *2) OFF OFF");
putline ("*2) SW2-2 bis SW2-6 müssen je nach Art der Schnittstelle ");
putline (" gesetzt werden (Druckerhandbuch)");
show control options ("std speed, top margin, std typeface, paperfeed");
show material options ("slow, fast, draft, nlq, roman, sansserif");
show command options ("draft, nlq, roman, sansserif");
ask for quality;
ask for papersize;
IF all right
THEN get fonttable ("fonttab.epson.lq850");
generate ("epsonlq850");
adjust quality;
adjust papersize;
IF choice = 2 THEN do ("papersize (34.544, 30.48)") FI;
installed := TRUE
FI.
lq1500 inst:
putline ("EPSON LQ-1500");
show control options ("");
show material options ("draft, nlq");
show command options ("draft, nlq");
ask for quality;
IF all right
THEN get fonttable ("fonttab.epson.lq1500");
generate ("epsonlq1500");
adjust quality;
installed := TRUE
FI.
nec menu:
page;
headline ("NEC - Menü");
putline (" 1. PINWRITER P5 ");
putline (" 2. PINWRITER P6 ");
putline (" 3. PINWRITER P7 ");
putline (" 4. PINWRITER P6 PLUS");
putline (" 5. PINWRITER P7 PLUS");
cursor (1,24);
put ("CR: Eingabe ESC: Zurück zum Hauptmenü");
ask user (5);
page;
choice := int (inp);
IF was esc
THEN was esc := FALSE
ELSE headline ("");
putline ("Druckertyp:");
SELECT choice OF
CASE 1 : necp5p7 inst
CASE 2 : necp6 inst
CASE 3 : necp5p7 inst
CASE 4 : necp6plus inst
CASE 5 : necp6plus inst
END SELECT
FI.
necp5p7 inst:
IF choice = 1
THEN putline ("NEC PINWRITER P5")
ELSE putline ("NEC PINWRITER P7")
FI;
show control options ("paper feed");
show material options ("draft, nlq");
show command options ("draft, nlq");
ask for quality;
ask for papersize;
IF all right
THEN get fonttable ("fonttab.nec.p5.new");
generate ("necp5p7");
adjust papersize;
adjust quality;
installed := TRUE
FI.
necp6 inst:
putline ("NEC PINWRITER P6 ");
show control options ("paper feed");
show material options ("draft, nlq");
show command options ("draft, nlq");
ask for quality;
ask for papersize;
IF all right
THEN get fonttable ("fonttab.nec.p5.new");
generate ("necp6");
adjust papersize;
adjust quality;
installed := TRUE
FI.
necp6plus inst:
IF choice = 4
THEN putline ("NEC PINWRITER P6 PLUS")
ELSE putline ("NEC PINWRITER P7 PLUS")
FI;
putline ("Der Druckertreiber unterstützt auch den Farbdruck mit entsprechendem");
putline ("Farbband.");
line;
putline ("Wählen Sie folgende Optionen im Druckmenü des Druckers:");
putline ("CR FUNCTION CR ONLY ");
show control options ("std speed, top margin, std typeface, paperfeed");
show material options ("slow, fast, draft, nlq, courier, souvenir");
show command options ("draft, nlq, courier, souvenir");
ask for papersize;
ask for quality;
IF all right
THEN get fonttable ("fonttab.nec.p6+");
generate ("necp6+");
adjust papersize;
adjust quality;
installed := TRUE;
IF choice = 5 THEN do ("papersize (34.544, 30.48)") FI;
FI.
oki menu:
page;
headline ("OKI - Menü");
putline (" 1. MICROLINE 390 IBM-/EPSON-kompatibel");
putline (" 2. MICROLINE 391 IBM-/EPSON-kompatibel");
putline (" 3. MICROLINE 393/393C EPSON-kompatibel");
putline (" 4. MICROLINE 393/393C IBM-kompatibel");
cursor (1,24);
put ("CR: Eingabe ESC: Zurück zum Hauptmenü");
ask user (4);
page;
choice := int (inp);
IF was esc
THEN was esc := FALSE
ELSE headline ("");
putline ("Druckertyp:");
SELECT choice OF
CASE 1 : oki ml390 inst
CASE 2 : oki ml390 inst
CASE 3 : oki ml393eps inst
CASE 4 : oki ml393ibm inst
END SELECT
FI.
oki ml390 inst:
IF choice = 1
THEN putline ("OKI Microline 390") ;
ELSE putline ("OKI Microline 391") ;
FI;
line;
putline ("Wählen Sie folgende Optionen im Druckmenü des Druckers:");
putline ("EMULATION MODE EPSON LQ ");
putline ("AUTO LF NO ");
show control options ("paperfeed, std speed, top margin");
show material options ("slow, fast, draft, nlq");
show command options ("draft, nlq, courier, kassette");
ask for papersize;
ask for quality;
IF all right
THEN get fonttable ("fonttab.oki");
generate ("oki390/391");
adjust papersize;
adjust quality;
IF choice = 2 THEN do ("papersize (34.544, 30.48)") FI;
installed := TRUE
FI.
oki ml393eps inst:
putline ("OKI Microline 393 EPSON-kompatibel");
putline ("Der Druckertreiber unterstützt auch den Farbdruck mit entsprechendem");
putline ("Farbband.");
line;
putline ("Wählen Sie folgende Optionen im Druckmenü des Druckers:");
putline ("AUTO LF NO ");
show control options ("paperfeed, std speed, top margin, std typeface");
show material options ("slow, fast, draft, nlq");
show command options ("draft, nlq, courier, kassette, schwarz, rot, blau, violett, gelb, orange, grün");
ask for papersize;
ask for quality;
IF all right
THEN get fonttable ("fonttab.oki");
generate ("oki393/393Ceps");
adjust papersize;
adjust quality;
installed := TRUE
FI.
oki ml393ibm inst:
putline ("OKI Microline 393 IBM-kompatibel");
putline ("Der Druckertreiber unterstützt auch den Farbdruck mit entsprechendem");
putline ("Farbband.");
line;
putline ("Wählen Sie folgende Optionen im Druckmenü des Druckers:");
putline ("EMULATION MODE ASCII ");
putline ("AUTO LF NO ");
show control options ("paperfeed, std speed, top margin, std typeface");
show material options ("slow, fast, draft, nlq");
show command options ("draft, nlq, courier, kassette, schwarz, rot, blau, violett, gelb, orange, grün");
ask for papersize;
ask for quality;
IF all right
THEN get fonttable ("fonttab.oki");
generate ("oki393/393Cibm");
adjust papersize;
adjust quality;
installed := TRUE
FI.
generate printer spool:
IF service opt = 0
THEN forget (generator name, quiet);
forget (driver name, quiet)
FI;
eumel must advertise;
cursor (1, 10);
putline ("In allen bestehenden Tasks - insbesondere in der Task ""PUBLIC"" - muß");
putline ("die Fonttabelle mit dem Kommando");
line;
putline (" font table (""" + font tab name + """)");
line;
putline ("eingestellt werden!!!");
line (2);
putline ("Hinweis: Dieses Installationsprogramm kann in der Task """ + name (myself) + """");
putline (" mit 'treiber einrichten' aufgerufen werden, wenn ein anderer");
putline (" Drucker eingesetzt werden soll.");
line (2);
put ("Generierung beendet, weiter mit 'SV'");
break (quiet);
do ("spool manager (PROC printer)").
inform about restart:
page;
putline ("Es ist kein Druckertreiber installiert worden!");
line;
putline ("Dieses Installationsprogramm kann in der Task """ + name (myself) + """");
putline ("mit 'treiber einrichten' erneut aufgerufen werden.");
line.
END PROC treiber einrichten;
PROC headline (TEXT CONST header):
cursor (13,1);
putline ("E U M E L - Druckertreiber - Installations - Programm");
cursor (40 - LENGTH header DIV 2, 2);
put (header);
line (2)
END PROC headline;
PROC ask user (INT CONST max choice):
TEXT VAR exit;
inp := "";
REP
cursor (1,23);
IF inp = ""
THEN put ("Ihre Wahl (Nummer eingeben):")
ELSE put ("FEHLER! Eingabe korrigieren:")
FI;
editget (inp, ""27"", "", exit);
was esc := exit = ""27"";
UNTIL was esc OR ok PER.
ok:
int (inp) > 0 AND int (inp) <= max choice AND last conversion ok.
END PROC ask user;
PROC show control options (TEXT CONST options):
line;
putline ("Steuerprozeduren in der Task """ + name (myself) + """:");
write ("papersize, std quality");
IF options <> ""
THEN put (",");
putline (options)
FI
END PROC show control options;
PROC show material options (TEXT CONST options):
line;
putline ("Mögliche Materialwerte (#material(""..."")#):");
putline (options)
END PROC show material options;
PROC show command options (TEXT CONST options):
line;
putline ("Mögliche direkte Druckeranweisungen (#""...""#):");
putline (options)
END PROC show command options;
PROC ask for quality:
line (1);
putline ("Standard - Druckqualität:");
line;
REP out (up);
IF yes ("Draft Quality (schneller, aber nicht so schön)")
THEN quality := 1; LEAVE ask for quality
FI;
out (up);
IF yes ("Near Letter Quality (schöner, aber langsamer)")
THEN quality := 2; LEAVE ask for quality
FI;
PER
END PROC ask for quality;
PROC adjust quality:
IF quality = 1
THEN do ("std quality (""draft"")")
ELSE do ("std quality (""nlq"")")
FI
END PROC adjust quality;
PROC ask for papersize :
LET up = ""3""13""5"";
paper format number := paper format ;
. paper format :
line (1);
putline ("Papierformat:");
line;
REP out (up);
IF yes ("Endlospapier, 8 Zoll breit")
THEN LEAVE paper format WITH 1 FI;
out (up);
IF yes ("Endlospapier, 13.2 Zoll breit")
THEN LEAVE paper format WITH 2 FI;
out (up);
IF yes ("Einzelblatteinzug, DINA 4")
THEN LEAVE paper format WITH 3 FI;
PER;
0
END PROC ask for papersize;
PROC adjust papersize:
SELECT paper format number OF
CASE 1 : do("papersize ( 8.0 * 2.54, 12.0 * 2.54)");
do ("paper feed (""tractor"")")
CASE 2 : do("papersize (13.2 * 2.54, 12.0 * 2.54)");
do ("paper feed (""tractor"")")
CASE 3 : do("papersize (21.0, 29.7)");
do ("paper feed (""sheet"")")
END SELECT
END PROC adjust papersize;
BOOL PROC all right:
line (3);
cursor (1,23);
yes ("Soll der ausgewählte Druckertreiber installiert werden")
END PROC all right;
PROC get fonttable (TEXT CONST name):
fonttab name := name;
from archive ((description file name & module file name & fonttab name)
- all);
fonttable (fonttab name);
command dialogue (FALSE);
save (fonttab name, /"configurator");
IF service option = 0
THEN forget (fonttab name)
FI;
command dialogue (TRUE);
END PROC get fonttable;
PROC from archive (THESAURUS CONST files):
IF highest entry (files) > 0
THEN fetch from archive;
release (archive);
putline ("Archiv abgemeldet !")
FI.
fetch from archive:
THESAURUS VAR thes :: files;
REP
ask for archive;
reserve archive;
fetch (thes / ALL archive, archive);
thes := thes - all
UNTIL highest entry (thes) = 0 PER.
ask for archive:
line;
putline ("Bitte Archiv mit den Dateien");
TEXT VAR buffer;
INT VAR index :: 0;
REP
get (thes, buffer, index);
putline (" " + buffer)
UNTIL index = 0 PER;
putline ("einlegen !");
line;
putline ("Wenn eingelegt: Taste drücken !");
inchar (buffer).
reserve archive :
INT VAR p1, p2;
archive (" "31" ");
disable stop;
list (archive);
IF is error
THEN buffer := errormessage;
p1 := pos (buffer, """", 1 ) + 1;
p2 := pos (buffer, """", p1) - 1;
IF p1 > 0 AND p2 > 0
THEN clear error;
buffer := subtext (buffer, p1, p2);
archive (buffer);
FI;
FI;
enable stop.
END PROC from archive;
THESAURUS OP & (TEXT CONST left, right):
THESAURUS VAR result := empty thesaurus;
insert (result, left);
insert (result, right);
result
END OP &;
THESAURUS OP & (THESAURUS CONST left, TEXT CONST right):
THESAURUS VAR result := left;
insert (result, right);
result
END OP &;
PROC generate (TEXT CONST name):
open files;
read description;
build programme;
insert programme;
forget files.
open files:
line (5);
cursor (1, 20);
putline (""4"Bitte warten !");
putline (" - Der Treiber wird generiert.");
driver name := "printer." + name + "(generiert)";
IF exists (driver name)
THEN forget (driver name, quiet)
FI;
FILE VAR des file :: sequential file (modify, description file name),
mod file :: sequential file (modify, module file name),
driver file :: sequential file (output, driver name).
read description:
to line (des file, 1);
col (des file, 1);
downety (des file, "$" + name + "$");
IF eof (des file)
THEN errorstop ("Beschreibung von """ + name + """ nicht im"13""10"" +
"Descriptions-File enthalten")
FI;
TEXT VAR description :: "",
record;
BOOL VAR done :: FALSE;
read record (des file, record);
record := subtext (record, col (des file) + LENGTH name + 2);
WHILE NOT eof (des file) AND NOT done REP
treat record
PER.
treat record:
INT VAR dollar pos :: pos (record, "$");
IF dollar pos = 0
THEN description CAT compress (record);
down (des file);
read record (des file, record)
ELSE description CAT compress (subtext (record, 1, dollar pos - 1));
col (des file, dollar pos);
done := TRUE;
FI.
build programme:
get module name;
WHILE still modules REP
find module;
transfer module;
get module name
PER.
get module name:
INT VAR semicol pos :: pos (description, ";");
TEXT VAR module name;
IF semicol pos > 0
THEN module name := subtext (description, 1, semicol pos - 1);
description := subtext (description, semicol pos + 1)
ELSE module name := description;
description := ""
FI.
still modules:
module name <> "" OR description <> "".
find module:
to line (mod file, 1);
col (mod file, 1);
downety (mod file, "$" + module name + "$");
IF eof (mod file)
THEN errorstop ("Modul """ + module name + """ nicht im"13""10"" +
"Modul-File enthalten")
FI.
transfer module:
done := FALSE;
read record (mod file, record);
record := subtext (record, col (mod file) + LENGTH module name + 2);
WHILE NOT eof (mod file) AND NOT done REP
transfer record
PER.
transfer record:
dollar pos := pos (record, "$");
IF dollar pos = 0
THEN write (driver file, compress (record));
line (driver file);
down (mod file);
read record (mod file, record)
ELSE write (driver file, compress (subtext (record, 1,
dollar pos - 1)));
col (mod file, dollar pos);
done := TRUE;
cout (line no (mod file))
FI.
insert programme:
IF online
THEN putline (" - Der Treiber wird insertiert.")
FI;
check off;
insert (driver name).
forget files:
IF service option = 0
THEN forget (description file name, quiet);
forget (module file name, quiet)
FI .
END PROC generate;
END PACKET driver inst 24