Я работаю над эмулятором Gameboy, и я заметил, что существуют определенные коды операций, которые бы никогда не меняли никаких значений, таких как LD A, A
, LD B, B
и т. Д., А также AND A
. Первые, очевидно, ничего не меняют, поскольку они загружают значение регистров в одни и те же регистры, и поскольку AND
сравнивается с регистром A
, AND A
всегда будет возвращать A
. Есть ли какая-либо цель для этих операций или по существу то же самое, что и NOP
после каждого цикла?Назначение кода для Gameboy (z80)
ответ
Как Jeffrey Bosboom и Hans Passant указывал на их замечания, причина простота. Более конкретно, простота аппаратного обеспечения.
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 на один и тот же регистр, вам придется добавить больше логики в CPU. И, как мы все знаем, Ressources были более ограничены в 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
, так как они влияют на регистр флага, и их выполнение может изменить внутреннее состояние машины.
Работая с точки зрения программного обеспечения, легко упускать из вида аппаратное обеспечение, которое должно быть установлено на исходной системе. Только то, что я искал, спасибо. – zchbrntmr
На самом деле (по крайней мере, на Z80, процессор игрового мира не Z80, может быть, Z80 или 8080, как и только ... отсутствие многих функций Z80), единственным исключением является (HL) с комбинацией LD, LD (HL), (HL) существуют, и вместо этого это означает HALT (так что совсем другое). Но (HL) ссылка немного особенная, даже если она входит в число нормальных LD r1, r2 блоков os opcodes. – LGB
Инструкции, такие как LD A,A
и AND A
, могут быть NOP
s, но они также могут изменять флаги процессора и использоваться для проверки значения регистра.
Обязательно тщательно проверьте документацию по набору инструкций для таких побочных эффектов.
'AND A' - это идиоматический способ сравнения с нолем, если память служит; в результате получается один байт, а не два и меньше циклов. – Tommy
'LD r, r'' does * not * изменить флаги. – usr2564301
Там является на самом деле цель AND A
(а также OR A
) инструкция - она устанавливает флаг Z
когда A
равен нулю и очищает иначе. Поэтому для этой цели часто используются как AND A
, так и OR A
.
Они также безоговорочно очищают флаг переноса, который полезен, если вы используете его для возврата результата (например, функция, которая возвращает значение, но сигнализирует об ошибке или условии исключения, устанавливая перенос). –
- 1. Запись памяти с помощью сборки (Z80/Gameboy)
- 2. Длина команды LD A, (C) в gameboy ~ Процессор Z80
- 3. Использование NAudio для эмулятора GameBoy
- 4. BCD программа вычитания для Z80
- 5. Каковы наилучшие инструменты для обратного инженерного кода z80?
- 6. Компилятор GameBoy с системными регистрами и прерываниями
- 7. Узел сборки пузыря для z80
- 8. SPI Интерфейс оборудования для z80
- 9. Z80 memory refresh register
- 10. Эмуляция GameBoy Color's GameLink
- 11. GameBoy ISA (Пишем Emulator)
- 12. Z80 Регистрация Порядок байтов
- 13. Есть ли способ программирования для gameboy?
- 14. Выбор языка для GameBoy Advance Homebrew развития
- 15. Нужна помощь в понимании этого кода (Z80 Assembler)
- 16. Z80 Переполнение с DAA
- 17. Z80 Статус флага регистрирует
- 18. Задержка программного обеспечения Z80
- 19. Является ли Z80 «Game Boy» процессором 8 или 16 бит?
- 20. Проблемы с Z80 Assembler
- 21. z80 Сборка вложенных циклов
- 22. Z80 Регистрация Регистрация Размер
- 23. Назначение кода 200
- 24. Является ли Z80 NMI реентерабельным?
- 25. Назначение назначения данных для сгенерированного кода
- 26. Назначение Т-кода для документов смены пользователя
- 27. Назначение значения JS-кода для DIV
- 28. Z80 Multibyte Commands in IM0
- 29. Назначение этого кода (XmlElement) XmlDocument
- 30. Назначение блока кода в Val
Я предполагаю, что они существуют по той же причине, что вы можете написать «mov eax, eax» в x86: это не стоило усложнять пространство кодирования, чтобы использовать эти кодировки для чего-то полезного. (Я недостаточно знаком с Game Boy или z80, чтобы сказать, есть ли у этих инструкций какие-либо скрытые микроархитектурные побочные эффекты, извините.) –
Это относится к процессору 8008, 1970. Простота была важна, у нее было только 3500 транзисторов. Позднее 8080 и Z80 скопировали дизайн набора инструкций. Никакой цели для них, только для того, чтобы логика декодера инструкции была простой. –