Gameboy (z80) назначение кода операции
Я работал над эмулятором Gameboy и заметил, что существуют определенные коды операций, которые никогда не изменят никаких значений, такие как LD A, A
, LD B, B
и т. д., а также AND A
, Первые, очевидно, ничего не меняют, поскольку они загружают значение регистров в одни и те же регистры, и поскольку AND
сравнивается с A
регистр, AND A
всегда вернется A
, Есть ли какая-либо цель для этих операций, или они по сути такие же, как NOP
после каждого цикла?
3 ответа
Как отметили Джеффри Босбум и Ханс Пассант в своих комментариях, причина в простоте. Точнее аппаратная простота.
LD r,r'
инструкции по копированию содержимого исходного регистра (r'
) к регистру назначения (r
). LD r,r'
коды операций следуют за этой формой:
-------------------------------
BIT | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
-------------------------------
OPCODE | 0 | 1 | r | r' |
-------------------------------
Регистры назначения и источника могут принимать следующие значения:
-----------
| BIT | REG |
-----------
| 111 | A |
-----------
| 000 | B |
-----------
| 001 | C |
-----------
| 010 | D |
-----------
| 011 | E |
-----------
| 100 | H |
-----------
| 101 | L |
-----------
Чтобы реализовать эти инструкции в аппаратном обеспечении, нам просто нужен мультиплексор, который принимает биты 0-2, чтобы выбрать регистр источника, и другой мультиплексор, который получает биты 3-5, чтобы выбрать регистр назначения.
Если вы хотите проверить, указывают ли биты 0-2 и 3-5 на один и тот же регистр, вам придется добавить больше логики в ЦП. И, как мы все знаем, ресурсы были более ограничены в 80-х годах:P
Обратите внимание, что инструкции по загрузке, такие как LD A,A
, LD B,B
, LD C,C
, LD D,D
, LD E,E
, LD H,H
, а также LD L,L
вести себя как NOP
, тем не мение AND A
а также OR A
НЕ веди себя как NOP
, поскольку они влияют на регистр флага, и их выполнение может изменить внутреннее состояние машины.
Инструкции как LD A,A
а также AND A
может показаться NOP
s, но они также могут изменять флаги процессора и использоваться для проверки значения регистра.
Обязательно внимательно ознакомьтесь с документацией к набору инструкций на наличие таких побочных эффектов.
На самом деле есть цель в AND A
(так же как OR A
) инструкция - устанавливает флаг Z
когда A
ноль и очищает в противном случае. Так что оба AND A
а также OR A
часто используются для этой цели.