Maxim, ты ещё здесь сидишь?
Суббота Декабрь 04 2004 23:16, Maxim Polyanskiy wrote to Alexei Zaiko:
[...]
AZ>> Причем, все асинхронно. Hаверняка такое делается не очень сложно. MP> В регистре (вывод) 37Ah:
Как же я не люблю горе-программеров, жёстко задающих адреса, которые вполне могут меняться! Периодически приходится патчить подобные "кульхацкерские" поделки с намертво вбитой отсебятиной... :-/ LPT портов в персоналке запросто может быть 4 штуки, базовые адреса этих портов хранятся в области данных BIOS 0:408h-0:40Fh. Адреса регистров нужно отсчитывать от базового адреса выбранного порта. Софт, который не умеет корректно переключаться между портами по хорошему должен немедленно отправляться на свалку (нет порта - базовый адрес равен 0). В данном случае речь идёт о регистре управления (базовый адрес + 2).
MP> 5-й бит выбирает направление передачи 0-вывод 1-ввод,
Только если порт умеет двунаправленный режим (может не поддерживаться "железом" или быть отключен в настройках BIOS'а). Проверяется контрольным чтением регистра управления - значение 5-го бита должно отслеживать изменения, производимые с ним при записи.
MP> 0 бит -1 пин,
Линия -STROBE, значение инвертируется. Исходный уровень "0" (данных нет).
MP> 1-14 пин,
Линия -AUTOFD, значение инвертируется. Исходный уровень "0" (без автоперевода строки после символа "возврат каретки").
MP> 2-16 пин,
Линия -INIT, прямое значение. Исходный уровень "1" (нет сброса).
MP> 3-17пин.
Линия -SLCTIN, значение инвертируется. Исходный уровень "1" (принтер выбран).
4 бит - сигнал разрешения прерывания. Исходный уровень "0" (прерывание запрещено). Hомер прерывания задаётся джамперами или в настройках BIOS.
MP> Регистр 379h:
Регистр статуса (базовый адрес + 1).
MP> ввод, MP> 7-11пин,
Линия BUSY, инверсное значение.
MP> 6-10пин,
Линия -ACK, прямое значение.
MP> 5-12пин,
Линия PE, прямое значение.
MP> 4-13пин,
Линия SLCT, прямое значение.
MP> 3-15 пин.
Линия -ERROR, прямое значение.
MP> Регистр 378h отображается на пины 2-9 DB25.
Регистр данных (базовый адрес + 0). Прямые значения.
MP> Ввод. MP> mov dx,37ah ^^^^ базовый адрес выбранного порта + 2 MP> mov al,port_37a ^^^^^^^^ значение для записи в регистр управления MP> or al,20h MP> out dx,al переключил LPT порт на приём
Здесь должен быть код, выдающий "наружу" сигнал о готовности к приёму байта (внешнее устройство может выдавать байт данных на шину данных) и ожидание сигнала квитирования (готовность данных) от внешнего устройства.
MP> sub dx,2 MP> in al,dx принял байт данных
Здесь должен быть код, подтверждающий приём байта. Лучше сразу же дождаться сигнала квитирования (внешнее устройство освободило шину данных) и переключить LPT порт на передачу.
MP> Вывод: MP> xchg al,ah кульхацкерство ;) Подразумевается, что в AL - байт данных для передачи MP> mov dx,37ah ^^^^ базовый адрес выбранного порта + 2 MP> mov al,port_37a ^^^^^^^^^^^ значение для записи в регистр управления MP> and al, 0dfh MP> out dx,al Переключение LPT порта на передачу. По хорошему это должно быть просто исходным состоянием порта.
Здесь должен быть код, ожидающий готовность внешнего устройства к приёму.
MP> xchg al,ah вернули байт данных взад ;) MP> sub dx,2 MP> out dx,al
Здесь должен быть код, подтверждающий выдачу байта передёргиванием линии
-STROBE, возможно наличие кода, проверяющего принятие байта внешним устройством.
Георгий
P.S. Если разрешено, прерывание формируется по активности сигнала на линии -ACK