Программистское везение
От: кт  
Дата: 24.03.17 16:43
Оценка: 12 (7) :)))
Байки 90-х
Программистское везение

Два десятка лет назад мы разрабатывали устройство, передающее и принимающее данные, используя телевизионный сигнал. Это сейчас все избалованы гигагерцами и гигабайтами, а тогда, имея компьютер типа IBM/PC-AT, на таких скоростях можно было работать только с помощью встроенного контроллера прямого доступа к памяти, реализованного в виде микросхем 8237А-5. Это устройство позволяло писать или читать данные, не привлекая центральный процессор.

Отработка ПО заняла несколько недель, и когда все, наконец, заработало, я решил привести исходные тексты в окончательный вид. С одной стороны, в этот момент, поскольку все уже работает, существенных исправлений в тексте не предвидится, с другой стороны – в памяти еще удерживается множество деталей, которые лучше увековечить понятными комментариями, так как очень скоро все эти детали забудутся. Заодно, можно глобально заменить все неудачные названия переменных на более внятные, исправить орфографические ошибки, красиво подвинуть строки и т.п.

И вот, заключительно просматривая текст, я вдруг увидел глупую описку в программировании ПДП. Адрес в 16-разрядной 8237А-5 приходилось задавать по частям и при задании номера «станицы» (т.е. номера куска памяти в 128 Кбайт) вместо команды OUT DX,AL было написано OUT DX,AX, что совершенно бессмысленно, поскольку все используемые порты 8-разрядные.
Исправил ляпсус, перетранслировал – НЕ работает! Вернул опять бессмысленный AX вместо AL – работает. Не может быть!
Начинаю рассуждать. Команда OUT выполняется ведь подобно обычной записи в память, только специальный сигнал INOUT на шине выставляется. Следовательно, если вместо AL я выдаю AX, то это равнозначно тому, что я в один порт (в данном случае 83H) выдаю значение из AL, а в соседний, т.е. получается в 84H – значение из AH, а там в этот момент просто ноль.
А что это за порт такой? Вот же таблица всех портов из тогда единственной имевшейся у нас книги Фроловых «Аппаратное обеспечение IBM PC»:
Назначение и адреса регистров страниц контроллера для IBM AT:
81h Регистр страниц канала 2
82h Регистр страниц канала 3
83h Регистр страниц канала 1
87h Регистр страниц канала 0
89h Регистр страниц канала 6
8Bh Регистр страниц канала 5
8Ah Регистр страниц канала 7
8Fh Регенерация динамической памяти

Нет вообще здесь никакого порта 84H!

Честно говоря, я и сейчас не знаю, что это такое. Может быть, разрешение на работу данного DMA из всего каскада, а может какая-то особенность конкретной материнской платы или еще одна часть адреса, позволяющая задать его больше чем 16 Мбайт.
Теперь, в эпоху Интернета, доступа к электронным библиотекам и компьютерным форумам, наверное, можно докопаться, что именно делала запись нуля в неведомый мне порт 84Н. Но это уже неинтересно, поскольку все эти DMA давно ушли в прошлое вместе с шиной ISA и другими древними интерфейсами.

Однако речь о другом. Какое невероятное, прямо волшебное везение для программиста! Кто толкнул меня под руку написать AX вместо AL и именно в этом месте? Ведь ни в одном примере этого не было. Напиши я как положено AL, и мы провозились бы месяцы, подозревая, конечно, неправильную работу нового устройства, а не настройку ПДП. Да и как догадаться, что нужно обратиться к порту, которого даже нет в документации! А сроки были жесткие и не уложись мы в них, проект вообще был бы закрыт с наклеиванием на нас ярлыка неумех и неудачников.

Я стал вспоминать, были ли другие случаи программистского везения. Были, конечно. Например, сляпанный наскоро тест, покрывавший ничтожную часть области возможных значений, вдруг с первого (!) запуска давал комбинацию параметров, выявлявших тонкую и редко воспроизводимую ошибку.
Но все-таки этот случай везения в моей программисткой практике из ряда вон выходящий. Вот и не верь после этого в ангелов-хранителей. Причем специализированных, уберегающих от ошибок в программах на ассемблере
Re: Программистское везение
От: ononim  
Дата: 24.03.17 18:30
Оценка:
Может, оно?
http://bochs.sourceforge.net/techspec/PORTS.LST :

0081 r/w DMA channel 2 address byte 2
0082 r/w DMA channel 3 address byte 2
0083 r/w DMA channel 1 address byte 2
0084 r/w extra page register
0085 r/w extra page register
0086 r/w extra page register

...

http://wiki.osdev.org/ISA_DMA :

ISA-based DMA controllers are specified to run at 4.77 MHz. No exceptions. If the "front-side" (memory) bus of a system runs at 133 MHz, it will be artificially slowed down to 4.77 MHz when transferring each ISA DMA byte/word. This includes EISA and PS/2 32-bit controllers, even though these controllers have an extra page register (which allows a 4 GiB addressing space) and the ability to do 32 bit transfers. (These DMA controllers exist only on EISA and MCA systems, which are now obsolete and are not further described here.)



..ну или как вариант out dx, ax возможно работало медленнее чем out dx, al и эта задержка была нужна для инициализации контроллера.
Как много веселых ребят, и все делают велосипед...
Re[2]: Программистское везение
От: кт  
Дата: 24.03.17 19:15
Оценка: :))
Здравствуйте, ononim, Вы писали:

O>..ну или как вариант out dx, ax возможно работало медленнее чем out dx, al и эта задержка была нужна для инициализации контроллера.


Вряд ли, окончательный вид исходного текста потом был такой
MOV AL,НОМЕР_СТРАНИЦЫ 
OUT 83H,AL ; ЗАДАЕМ НОМЕР СТРАНИЦЫ
MOV AL,0
OUT 84H,AL ; НЕИЗВЕСТНАЯ ОПЕРАЦИЯ (ПОДСКАЗАНА СВЫШЕ)


Так, что скорее всего первое — "экстра-страница", хотя могли бы по умолчанию там ноль и так держать, без необходимости его туда явно записывать...
Re[3]: Программистское везение
От: Michael7 Россия  
Дата: 24.03.17 19:37
Оценка:
Здравствуйте, кт, Вы писали:

кт>Так, что скорее всего первое — "экстра-страница", хотя могли бы по умолчанию там ноль и так держать, без необходимости его туда явно записывать...


А вот, если кому спустя много лет поддерживать такое с "подсказками свыше"
Но если это была честная AT 286, какие там еще экстра-страницы. Это или все-таки задержка или какая-то тонкость в работе ПДП о которой в книжках не написали.
Re[3]: Программистское везение
От: Michael7 Россия  
Дата: 24.03.17 19:54
Оценка:
Здравствуйте, кт, Вы писали:

кт>Здравствуйте, ononim, Вы писали:


O>>..ну или как вариант out dx, ax возможно работало медленнее чем out dx, al и эта задержка была нужна для инициализации контроллера.


кт>Вряд ли, окончательный вид исходного текста потом был такой

кт>
MOV AL,НОМЕР_СТРАНИЦЫ 
кт>OUT 83H,AL ; ЗАДАЕМ НОМЕР СТРАНИЦЫ
кт>MOV AL,0
кт>OUT 84H,AL ; НЕИЗВЕСТНАЯ ОПЕРАЦИЯ (ПОДСКАЗАНА СВЫШЕ)
кт>


Кстати, поиск в гугле строчки ""OUT 84H,AL"" выдает несколько любопытных результатов. Похоже ononim угадал с тем, что инициализация контроллера, вернее какого-то его каскада (там что-то про master и slave и это не винчестеры, это контроллеры клавиатуры или пдп). Ссылку дать не могу, так как результаты поиска внутри google books.
Отредактировано 24.03.2017 19:58 Michael7 . Предыдущая версия . Еще …
Отредактировано 24.03.2017 19:56 Michael7 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.