function GetLPTByte(): char;
var
ok, res: byte;
begin
// первый полубайт
ok := $80;
hLpt.WritePort( LPTPort, 0, $10 ); // готов принять
while ( ok and $80 <> 0 ) and ( not cancel ) do begin
ok := hLpt.ReadPort( LPTPort, 1 ); // ждем передачи
end;
res := ( ( ok xor $80 ) shr 3 ) and $F;
hLpt.WritePort( LPTPort, 0, $8 ); // принял и обрабатываю
ok := 0;
while ( ok and $80 = 0 ) and ( not cancel ) do begin
ok := hLpt.ReadPort( LPTPort, 1 ); // ждем готовности к приему
end;
// второй полубайт
ok := $80;
hLpt.WritePort( LPTPort, 0, $10 ); // готов принять
while ( ok and $80 <> 0 ) and ( not cancel ) do begin
ok := hLpt.ReadPort( LPTPort, 1 ); // ждем передачи
end;
hLpt.WritePort( LPTPort, 0, $8 ); // принял и обрабатываю
res := res + ( ok xor $80 ) shl 1;
ok := 0;
while ( ok and $80 = 0 ) and ( not cancel ) do begin
ok := hLpt.ReadPort( LPTPort, 1 ); // ждем готовности к приему
end;
// байт принят
Result := char( res );
end;
procedure SendLPTByte( send: char );
var
ok: byte;
begin
// первый полубайт
ok := $80;
while ( ok and $80 <> 0 ) and ( not cancel ) do begin
ok := hLpt.ReadPort( LPTPort, 1 ); // ждем готовности к приему
end;
hLpt.WritePort( LPTPort, 0, byte( send ) and $F + $10 ); // передаем
ok := 0;
while ( ok and $40 = 0 ) and ( not cancel ) do begin
ok := hLpt.ReadPort( LPTPort, 1 ); // ждем удачного приема
end;
hLpt.WritePort( LPTPort, 0, 0 );
// второй полубайт
ok := $80;
while ( ok and $80 <> 0 ) and ( not cancel ) do begin
ok := hLpt.ReadPort( LPTPort, 1 ); // ждем готовности к приему
end;
hLpt.WritePort( LPTPort, 0, byte( send ) shr 4 + $10 ); // передаем
ok := 0;
while ( ok and $40 = 0 ) and ( not cancel ) do begin
ok := hLpt.ReadPort( LPTPort, 1 ); // ждем удачного приема
end;
hLpt.WritePort( LPTPort, 0, 0 );
end;
Передача данных по lpt
Распайка кабеля похожа на http://www.nestor.minsk.by/kg/2008/27/kg82716.html, но разница в том, что линии Strobe(1), Init(16), AutoLF(14), selin(17) заведены друг на друга, т.е. на одном штекере вывод 1 и на второй штекер он подключен к выводу 1. Как это вообще работает не понимаю, ведь все эти четыре вывода являются выходами и не должны работать на вход?
Я понимаю что можно просто кабель перепаять нормально, но хочеться разобраться как работает Тотал командер с такой скоростью.
Подскажите пожалуйста, нет ли у кого алгоритма работы Total commander'a при передаче через lpt. У кого есть хоть какие нибудь идеи, поделитесь пожалуйста...
Код:
Вот код функций приема и передачи, что тут может тормозить не понимаю, посмотрите пожалуйста.
Используй FIFO+DMA.
Если Вы имеете ввиду режим ECP то насколько я знаю с таким кабелем он работать не будет
000 SPP или иначе ISA
001 PS/2
010 FIFO использует протокол SPP аналогичен 000, за исключением того что данные отправляются в FIFO и LPT автоматически выполняет рукопожатие.
011 ECP
100 EPP
101 резерв
110 тестовый режим
111 конфигурационный режим
Я имею ввиду режим 010.
Нашел только как его включить.
Будет ли он работать с таким кабелем, как с ним вообще работать, может у вас есть что то по этому поводу?