Провел несколько простейших экспериментов: сделал на ISA-карте с CPLD два порта - 0x3a0 и 0x3a1. Оба порта доступны на запись и чтение. При записи сохраняют байт данных, при чтении отдают записанный ранее байт. На семисегментном индикаторе высвечивается адрес порта ввода-вывода, куда произошла запись. Записывал в порт данные словами:
Код: Выделить всё
cli
mov dx,3a0h ; порт на ISA карте с CPLD
mov ax,1234h
out dx,ax
hlt
Проблема стала ясна. На системной шине вообще нет сигнала /IOCS16, а значит ВСЕ карты считаются 16-битными по IO-части. Да и как правильно подсказал Mixa64: "в самой Handbuch, в разделе 3.4.2 (стр. 94, последний абзац) рассказывается, какие типы обмена по внешней шине реализованы и как они работают. Если адаптер отвечает сигналом /MEMCS16, то обмен идет по обеим половинам, в соответствии с сигналами A0 и /BHE процессора. Если /MEMCS16 неактивен, то происходит байтовый обмен по нижней половине шины. При этом, если со стороны процессора обмен 16-разрядный, он преобразуется в два цикла шины по младшей половине. Это всё обращения к памяти.
Обращение к УВВ работает по-другому. Если оно байтовое, то происходит по младшей половине. Но если команда IN или OUT 16-разрядная, то внешний обмен также 16-разрядный, без преобразования в два 8-разрядных цикла."
Поэтому Vic3Dexe предложил следующий вариант доработки схемы "bus steering":
Так же еще нужно вместо MEMR подать на D11.10 ~(/MEMR & /XIOR). Ну или MEMR | ~/XIOR. Это не показано на схеме.
Эту доработку я вчера и осуществил методом МГТФ:
Начал работать XT-IDE в режиме Hi-Speed, завелась EGA видеокарта на чипе VC-001, завелась VGA на чипе ACUMOS AVGA1. То есть обмен словами с портами IO пошел.
Более подробно - здесь: http://www.nedopc.org/forum/viewtopic.php?f=87&t=19024