Раз уж в теме обсуждается и КР580, то добавлю и про него.
Почитывая на досуге вражеские книги и журналы на тему антикварных микропроцессоров, узнал недавно, как следовало с пользой использовать наличие в КР580 команд IN/OUT. Оказывается, чтобы использовать команды IN/OUT совершенно необязательно ставить системный контроллер ВК28 (или делать его аналог вокруг 589ИР12 на мелкой логике).
IN/OUT выгодны тем, что они 2-х байтовые, тогда как команды работы с ОЗУ (если не считать косвенную адресацию) - трёх-байтовые. Когда идёт битва за каждый байт, что типично для кода прошиваемого в ПЗУ, то возможность применить IN/OUT становится ценной.
Т.к I/O-портов всего 256, то в РК86 достаточно выделить в области памяти одну страницу в 256 байт. В РК найти свободные сплошные 256 адресов не проблема. Чтобы поиметь 256 портов в памяти, но с которыми можно работать командами IN/OUT, хитрые враги обычно делают так.
Они при работе команд IN/OUT хитро выдают на старшую половину шины адреса (msb) старший адрес страницы выделенной для портов. Например, если мы решили отдать портам участок A000...A0FF, то надо выдавать при OUT на адреса A15...A8 число A0.
Процессоры 8085 и Z80 сразу дают /IORD и /IOWR, которые можно объединить на двух диодах и резисторе, получив сигнал /IO о том, что идёт команда IN/OUT. А вот при КР580 требуется получать его из "слова состояния", для чего надо по фронту SYNC защёлкивать в 155 ТМ2 биты D4 и D6, а инверсные выходы этих триггеров также объединить двумя диодами. Полученный с помощью 2-х диодов сигнал /IO, когда он равен 0, свидетельствует, что идёт работа с портами.
Если по этому сигналу /IO выдавать на старшую половину адресов адрес страницы портов в памяти (в данном примере это A0), то с портами отображёнными в память можно работать командами IN/OUT, как при наличии системного контроллера. Выгоднее всего старший (msb) байт адреса страницы портов выдавать с помощью двух 555 КП11, т.к при этом одновременно адреса A15...A8 процессора буферизуются. Но можно использовать отключаемый 8-ми разрядный буфер АП6 и резисторы привязки (что даёт страницу портов FF00).
Эти КП11-тые при не OUT-командах пропускают через себя адреса A15...A8 от процессора, а при OUT командах выдают в линии A15...A8 msb-байт адреса страницы портов. Если изменять число набранное на входе КП11, то страницу портов можно "гонять" по всему адресному пространству, что, кстати, и делается в «Корвете» (позволяя создать конфигурацию наиболее удобную для конкретной задачи, например, там одна конфигурация портов для МГ-бейсика и совсем другая для CP/M).
Причём, интересно, что мы получаем порты, которые читаются и по обращению в память и по IN/OUT, что даёт нам ещё больше выигрыша. Во-первых, скорость. LD A,(HL) выполняется вдвое быстрее, чем IN A,(port). Во-вторых, мы можем проверять один флаг по биту D7 всего одной командой. Например, INC (HL) при HL указывающем в порт выдаст во флаге Signum значение бита D7 порта, что экономит нам команду OR A. При этом возможность работать с портами двухбайтовыми IN/OUT, и экономить тем самым объём кода в некритичных к скорости местам, сохраняется.
Не знаю дошла ли ценность идеи до малоопытных в железе, потому упомяну лишь что, если бы разработчики РК86 читали в своё время вражеские книги, то они могли бы израсходовать на порты не 32 тысячи адресов, а всего 256, получив при этом выигрыш в объёме кода за счёт двухбайтовости команд IN/OUT, причём не увеличивая число корпусов.
PS. msb на вражеском языке означает "most significant byte".