Проблема с 16-разрядным обменом по ISA
Уважаемые мастера, подскажите пожалуйста }=
Имеется самопальное устройство для ISA (интерфейсный контроллер, 6 портов по 8 бит каждый). Порты сидят три штуки на младшей части ШД и три-на старшей. Обращение к портам выполняется при помощи 16 разрядного обмена, т. е . порты читаютсязаписываются парами.
Адреса портов:
300h - PORT01
301h - PORT23
302h - PORT45
303h - управляющий регистр (управляет выбором режима портов-на запись или на чтение).
При пошаговой отладке девайса (без компа)-всё работает отлично.
При попытке работать с утройством в компе наблюдается следующий глюк: при попытке записать AA55h в 300h для примера 55h нормально попадает в нулевой порт, а вот AAh, вместо того, чтобы оказаться в первом порте, оказывается во втором, т. е. в младшем байте порта, висящего по адресу 301h. Этот глюк происходит при любом обращении (что по чтению, что по записи) к любым адресам. Младший байт-на месте, старший уходит в порт с адресом на единицу большим.
Расследование причин (путём осцилографирования шины) показало, что шина работает в режиме 8 разрядного, а не 16 разрядного обмена. При этом сигнал -CS16 формируется нормально и вовремя (опять-же проверено осцилографом).
Спецификация ISA говорит следующее:
+--------------+---------------+----------------+
| Задатчик | Исполнитель |Выполняемый цикл|
+--------------+---------------+----------------+
|Размер|SBH|SA0|Размер| -CS16 |Размер| Чт.|Зап.|
+------+---+---+------+--------+------+----+----+
| 8 | 1 | 0 | 8 | 1 | 8 |L-›L|L-›L|
+------+---+---+------+--------+------+----+----+
| 8 | 0 | 1 | 8 | 1 | 8 |L-›H|H-›L|
+------+---+---+------+--------+------+----+----+
| 8 | 1 | 0 | 16 | 0 | 8 |L-›L|L-›L|
+------+---+---+------+--------+------+----+----+
| 8 | 0 | 1 | 16 | 0 | 8 |H-›H|H-›H|
+------+---+---+------+--------+------+----+----+
| 16 | 0 | 0 | 8 | 1 | 8 |L-›L|L-›L|
+------+---+---+------+--------+------+----+----+
| 16 | 0 | 0 | 16 | 0 | 16 |L-›L|L-›L|
| | | | | | |H-›H|H-›H|
+------+---+---+------+--------+------+----+----+
Моё устройство должно работать в режиме, описываемом самой нижней строкой. Но, осцилограммы (встающий в 1 SBH и меняющееся значение SA0) показывают, что шина работает в режиме, описываемом третьей и четвёртой сверху строкой. Вопрос, почему? Мне кажется, что проблема эта программная, но как её решить-не понимаю пока. Работа с портом идёт из-под ДОС, используется Borland C 3.1, для вывода данные в порты используется функция outport (не outportb, так как первая-16 разрядная, а вторая-8 разрядная).
Кто-нибудь знает, что я делаю не так?
P.s. Вопросы типа "проверь схему" не принимаются, так как при ручном тестировании всё работает как надо и потому, что даже если вытащить устройство из шины и просто запустить программу-драйвер, то шина всё равно висит в 8 разрядном режиме.
Заранее спасибо }=
|