У Z80 есть одно, практически неиспользуемое свойство, используя которое, можно без существенных затрат деталей (что важно для простейших контроллеров, где число корпусов менее 10), получить 8-ми разрядный порт на вывод.
Мало кто знает, что в тактах RFSH процессор Z80 выдаёт на старшую половину шины адреса содержимое регистра прерываний I. Так что, если сигналы шины адреса A8...A15 "защёлкивать" по стробу /MREQ в тактах регенерации, то получается 8-ми разрядный выходной порт. Это эквивалентно тому, как бы в процессор добавили 8 дополнительных выходных линий, адресуемых непосредственной адресацией, причём шина данных даже не нагружается входами доп.порта.
Аппаратно это выливается в один вентиль из 1533 ЛЛ1 и, естественно, регистр-защёлку типа 1533 ИР23 или ИР27 (или ИМС с меньшей разрядностью, например ТМ2, срабатывающие по прямому фронту). Программно, всё, что процессор запишет в регистр I, после ближайшего такта регенерации (а он будет уже в этой же или в следующей команде Z80) появится на выходе регистра ИР23. Для простого контроллера это то, что надо. Выигрыш тройной: по деталям, скорости прогона и расходу байтов на программу. Недостаток - потеря прерываний в MODE 2.
В простом контроллере это можно использовать для вывода звука или вывода в линию. Можно этим портом управлять режимом (например экрана) в компьютере. Но гораздо полезнее задействовать этот дополнительный порт, как бы встроенный в процессор, для управления диспетчером памяти (в простейшем случае, просто для переключения банок).
Я не встречал в литературе подобного использования регистра I. Может быть кто-нибудь знает почему это плохо или вообще невозможно.