135 lines
3.2 KiB
Plaintext
Executable File
135 lines
3.2 KiB
Plaintext
Executable File
const
|
|
{ printer status bits @base + 1 }
|
|
PError = $08;
|
|
PSelect = $10;
|
|
PPaperOut = $20;
|
|
Pack = $40;
|
|
NPbusy = $80;
|
|
EPPTimeout = $01;
|
|
|
|
{ printer control bits @base + 2 }
|
|
NPstb = $01;
|
|
NPafd = $02;
|
|
Pinit = $04;
|
|
NPslin = $08;
|
|
EPPIdleControl = $04;
|
|
|
|
LPT1Base = $3BC;
|
|
LPT2Base = $378;
|
|
LPT3Base = $278;
|
|
ContOfs = 2;
|
|
StatOfs = 1;
|
|
EPPDataOfs = 4;
|
|
EPPAddressOfs = 3;
|
|
|
|
var
|
|
EPPBasePort : word;
|
|
BaseAddr : longint;
|
|
DataPort : word;
|
|
ContPort : word;
|
|
StatPort : word;
|
|
EPPDataPort : word;
|
|
EPPAddressPort : word;
|
|
Shadow : byte;
|
|
ShadowAdd : byte;
|
|
UARTBaseAddress : word;
|
|
|
|
procedure EPPWriteData(d: byte);
|
|
begin
|
|
port[EPPDataPort] := d;
|
|
Shadow := d;
|
|
end;
|
|
|
|
procedure EPPWriteAddress(a : byte);
|
|
begin
|
|
port[EPPAddressPort] := a;
|
|
ShadowAdd := a;
|
|
end;
|
|
|
|
function EPPReadData : byte;
|
|
begin
|
|
EPPReadData := port[EPPDataPort];
|
|
end;
|
|
|
|
function EPPReadAddress : byte;
|
|
begin
|
|
EPPReadAddress := port[EPPAddressPort];
|
|
end;
|
|
|
|
procedure EPPInit(ourport:word);
|
|
var foodata : byte;
|
|
begin
|
|
DataPort := ourport;
|
|
ContPort := ourport + ContOfs;
|
|
StatPort := ourport + StatOfs;
|
|
EPPDataPort := ourport + EPPDataOfs;
|
|
EPPAddressPort := ourport + EPPAddressOfs;
|
|
port[ContPort] := EPPIdleControl;
|
|
port[StatPort] := EPPTimeout;
|
|
EPPWriteAddress($FF);
|
|
EPPWriteAddress($FF);
|
|
foodata := EPPReadData;
|
|
end;
|
|
|
|
procedure WriteEPP32(addr : word; data : longint);
|
|
var foodata : byte;
|
|
begin
|
|
EPPWriteAddress($FF);
|
|
EPPWriteAddress($FF);
|
|
foodata := EPPReadData;
|
|
EPPWriteAddress(lo(addr));
|
|
EPPWriteAddress(hi(addr) or $80);
|
|
EPPWriteData(LongIntByteRec(data).Byte0);
|
|
EPPWriteData(LongIntByteRec(data).Byte1);
|
|
EPPWriteData(LongIntByteRec(data).Byte2);
|
|
EPPWriteData(LongIntByteRec(data).Byte3);
|
|
end;
|
|
|
|
function ReadEPP32(addr : word) : longint;
|
|
var foodata : longint;
|
|
begin
|
|
EPPWriteAddress($FF);
|
|
EPPWriteAddress($FF);
|
|
foodata := EPPReadData;
|
|
EPPWriteAddress(lo(addr));
|
|
EPPWriteAddress(hi(addr) or $80);
|
|
LongIntByteRec(foodata).Byte0 := EPPReadData;
|
|
LongIntByteRec(foodata).Byte1 := EPPReadData;
|
|
LongIntByteRec(foodata).Byte2 := EPPReadData;
|
|
LongIntByteRec(foodata).Byte3 := EPPReadData;
|
|
ReadEPP32 := foodata;
|
|
end;
|
|
|
|
procedure FastWriteEPP32(addr : word; data : longint);
|
|
begin
|
|
EPPWriteAddress(lo(addr));
|
|
EPPWriteAddress(hi(addr) or $80);
|
|
EPPWriteData(LongIntByteRec(data).Byte0);
|
|
EPPWriteData(LongIntByteRec(data).Byte1);
|
|
EPPWriteData(LongIntByteRec(data).Byte2);
|
|
EPPWriteData(LongIntByteRec(data).Byte3);
|
|
end;
|
|
|
|
function FastReadEPP32(addr : word) : longint;
|
|
var
|
|
foodata : longint;
|
|
begin
|
|
EPPWriteAddress(lo(addr));
|
|
EPPWriteAddress(hi(addr) or $80);
|
|
LongIntByteRec(foodata).Byte0 := EPPReadData;
|
|
LongIntByteRec(foodata).Byte1 := EPPReadData;
|
|
LongIntByteRec(foodata).Byte2 := EPPReadData;
|
|
LongIntByteRec(foodata).Byte3 := EPPReadData;
|
|
FastReadEPP32 := foodata;
|
|
end;
|
|
|
|
function EPPCheckTimeout : boolean;
|
|
begin
|
|
if port[Statport] and EPPTimeout = 0 then EPPCheckTimeout := false else EPPChecktimeout := true;
|
|
end;
|
|
|
|
procedure EPPZeroPort; {parallel port outputs are all set to zero}
|
|
begin {so the remote card is not powered by the port}
|
|
port[DataPort] := 0;
|
|
port[ContPort] := 0;
|
|
end; |