int21h
Detekce tiskárny
Toto téma je dost nezvyklé a málokdo takovýto problém řešil. Windowsáci přistupují k tiskárně přes ovladače a DOSaři většinou používají jen ten úplně nejzákladnější znakový výstup typu:
copy file.txt prn
Jen ty nejlepší programy toho umějí z tiskárny dostat víc. Používají k tomu vlastní sady ovladačů, které jdou obvykle použít jen pro ten jediný program. Klíčavý bod je k tomu nastavení tiskárny. Uživatel musí spustit interaktivní setup, ve kterém si podobně, jako když se zadává zvuková karta, vybere svůj model tiskárny.
Jenže často se stává, že v seznamu tiskáren právě ta uživatelova tiskárna chybí, sice tam jsou podobné typy, ale zrovna ta jeho ne. A on neví, jestli může zvolit nějakou jinou nebo nemůže.
A tady nám pomůže
autodetekce. Autodetekční rutina totiž kromě typu tiskárny ještě vrátí její komunikační jazyk
(Postscript, PCL, aj.) a další informace.
Základním předpokladem ovšem je, aby tiskárna byla zapnutá a byla připojena na
paralelní port. USB port je v DOSu dostupný jen s krajními obtížemi a takové fígle neumím. Paralelní port i tiskárna dále musí splňovat normu
IEEE-1284, což kromě vyložených veteránů splňují. Tato norma definuje pod režimů činnosti paralelního portu:
- SPP mód kompatibility
- nibble mód
- byte mód
- EPP mód (enhanced parallel port)
- ECP mód (extended capabilities mode)
Koho zajímají takovéto detaily, nechť se podívá na pěknou českou stránku o paralelního portech -
zde.
Následující kód využívá nibble mód. Jak sami vidíte, nejsem autor :-)
program i1284_info;
uses crt;
var q,y,z:byte;
r:array[0..1023] of char;
i,s:integer;
f,quit:boolean;
function wait(mask,result:byte) : boolean;
var x,i:byte;
begin
i:=1;
repeat
x:=port[$379];
inc(i);
delay(1);
until ((x and mask)=result) or (i=40);
if i<40 then wait:=true else wait:=false;
end;
function read_nibble : byte;
var z:byte;
begin
z:=(port[$379] shr 3) and $f7;
if z and $10=0 then z:=z or 8;
read_nibble:=z and $f;
end;
var ff:text;
begin
Assign(ff,'');
Rewrite(ff);
clrscr;
writeln(ff,'IEEE-1284 Parallel port device scan.');
writeln(ff);
port[$378]:=4;
delay(5);
port[$37a]:=port[$37a] and $f7;
port[$37a]:=port[$37a] or 2;
if wait($78,$38) then
begin
writeln(ff,'Passed initial check. An IEEE-1284 device is present.');
port[$37a]:=port[$37a] or 1;
port[$37a]:=port[$37a] and $fd;
delay(5);
port[$37a]:=port[$37a] and $fe;
delay(5);
if wait($20,0) then
begin
writeln(ff,'Passed second check. Device ID is readable.');
f:=false;
quit:=false;
s:=0;
delay(10);
repeat
port[$37a]:=port[$37a] or $2;
if not wait($40,0) then
begin
writeln(ff,'Read1 timeout!');
port[$37a]:=port[$37a] and $fd;
quit:=true;
end;
y:=read_nibble;
port[$37a]:=port[$37a] and $fd;
if not wait($40,$40) then
begin
writeln(ff,'Read2 timeout!');
quit:=true;
end;
if f then
begin
f:=not f;
q:=q + y shl 4;
r[s]:=chr(q);
inc(s);
if port[$379] and 8=8 then quit:=true;
end else
begin
f:=not f;
q:=y;
end;
if s>1023 then quit:=true;
until quit;
port[$37a]:=(port[$37a] and $fd) or 8;
if wait($80,0) then writeln(ff,'ID Read terminated OK')
else writeln(ff,'ID Read terminated with error!');
writeln(ff);
writeln(ff,'Size our count : ',s);
writeln(ff,'Size returned : ',integer(ord(r[0]) shl 8+ord(r[1])));
write(ff,'Info returned : ');
for i:=2 to s do
begin
if r[i]=';' then
begin
writeln(ff);
write(ff,' ');
end else write(ff,r[i]);
end;
writeln(ff);
writeln(ff);
end else writeln(ff,'Failed second check. No device ID Readable.');
end else
begin
writeln(ff,'Failed initial check. No IEEE-1284 device detected.');
port[$37a]:=((port[$37a] and $fd) or 8);
end;
Close(ff);
end.
Tento prográmek nemusí sloužit jen k detekci tiskáren, ale k libovolnému zařízení připojenému na paralelní port.
Nicméně já ho používám pro tiskárnu a moje tiskárna vrací toto:
IEEE-1284 Parallel port device scan.
Passed initial check. An IEEE-1284 device is present.
Passed second check. Device ID is readable.
ID Read terminated OK
Size our count MFG:HEWLETT-PACKARD
Size returned MDL:DESKJET 640C
Info returned CMD:MLC,PCL,PML
CLASS:PRINTER
DESCRIPTION:Hewlett-Packard DeskJet 640C
VSTATUS:$Cb0$Rc0,ff,DN,IDLE
MFG - je zřejmě
Manufacter - tedy výrobce
MDL -
model
CMD - říká, jakým komunikačním protokolům zařízení rozumí. Mezi druhými dvěma vidíme
PCL - komunikační jazyk společný pro všechny tiskárny od
Hewlett-Packard
CLASS - co je to zač - v našem případě tiskárna
DESCRIPTION - oficiální plný název
VSTATUS - jakýsi status, patrně se liší zařízení od zařízení
Vidíte, že tiskárna sama nám dá dostatek informací, abychom věděli, jak k ní přistupovat i bez interaktivního setupu.
DOS-u-akbar!