Вот мы тоже к этому пришли. Теперь пытаемся понять, как это починить.Mixa64 wrote:Но если команда IN или OUT 16-разрядная, то внешний обмен также 16-разрядный, без преобразования в два 8-разрядных цикла.
Проанализировал работу bus steering (D-триггеры). Оно запускается при наличии трех условий:
- имеется обмен с памятью (/MEMR = 0 или /MEMW = 0 на D32.4.5.6), назовем сигнал MEMRW по аналогии
- это не RAM на матери (т.е. за 640к) и она не умеет обмен словом (/MEMCS16 = 1) на D88.8.9.10, пусть будет MEMBYTE
- обмен именно словом (VA0 = /BHE = 0 на D33.1.2.3), пусть будет CPUWORD
Тогда на D34.4 появится запускающий фронт.
А вот на D59.10 появляется фронт сброса при подъеме /MEMR или /MEMW.
IORW, который подмешивается на D7 там нужен для обычных байтовых обменов, т.к. D22 также отвечает за передачу байта со старшей половины в младшую при обмене по нечетному адресу.
Суммируя:
- нам нужно обеспечить фронт на D34.4 при ((MEMRW & MEMBYTE) | (IORW & /IOCS16)) & CPUWORD
- нам нужно обеспечить фронт на D59 при (MEMRW | IORW)
Для простоты пока предположим, что /IOCS16 = 1.
Если делать полноценный /IOCS16, то там чуть сложнее, но тоже решаемо.
При текущей схеме все IO-обмены с картами станут 8-битными, даже если карта и умеет 16 бит в родном слоте.