Инструкция Intel 8080: OUT
Я пытаюсь эмулировать набор инструкций Intel 8080, и я застрял на этой инструкции OUT D8
, который согласно книге Intel 8080/8085 на языке программирования ассемблера говорит, что
OUT
Инструкция помещает содержимое аккумулятора на восьмибитную шину данных, а номер выбранного порта на шестнадцатибитную адресную шину. Поскольку число портов варьируется от 0 до 255, номер порта дублируется на адресной шине.
Дело в том, что я не понимаю, что это делает. Может ли кто-нибудь объяснить мне это или направить меня к статье или книге, которая это объясняет.
2 ответа
Можно подумать, что 8080 и его производные имеют 17-разрядную адресную шину, а не 16-разрядную шину, на которую обычно ссылаются. Верхний бит этой адресной шины является строкой запроса ввода / вывода микросхемы (IORQ).
При использовании обычных нагрузок и сохранений старший бит всегда сбрасывается. Когда вы выполняете вход или выход, верхний бит всегда установлен.
Intel назвала эту линию и ожидала, что она будет использоваться для связи с периферийными микросхемами, отсюда и название, гораздо более ограниченная форма доступной адресации, расширенные затраты на доступ и тот факт, что ни счетчик программы, ни указатель стека не могут указывать на это. Площадь адресного пространства.
В связи с этим у Intel возникает проблема, заключающаяся в том, что им нужно заполнить 16-битную адресную шину, но они принимают только 8-битный параметр. Что они на самом деле делают, так это загружают аккумулятор в верхние 8 бит. Так что, если у вас было:
LD A, 0xfe
OUT (0xdc)
Затем значение 0xfe будет выведено на адрес порта 0xfedc.
(кроме: извинения за синтаксис Zilog, а не Intel; возможно, интересно, Z80 добавляет кучу инструкций, таких как OUT (C), A
которые действительно сбрасывают весь BC на адресную шину, а не просто в C, и большинство производителей микросхем Z80 были совершенно счастливы использовать полный 16-битный адрес, так как это позволило им использовать упрощенную логику компонента, к которому обращается, если эта адресная строка низкий, но при этом оставаясь приличным диапазоном для внешних периферийных устройств)
Для подражания это значит
когда порты IN/OUT существуют в эмулируемом устройстве - простые данные IN/OUT в порту
когда эмулируемое устройство имеет подключенные к памяти порты -
затем
OUT AB -> в STA ABAB
IN 12 -> LDAX 1212
для разработчика аппаратного обеспечения это означает, что когда выполняется вход / выход, адресная шина имеет a15-8 = a7-a0 и =portNum