Они упрощают блок декодирования, если вы проверите
7F LD A,A
78 LD A,B
79 LD A,C
против
47 LD B,A
40 LD B,B
41 LD B,C
против
4F LD C,A
48 LD C,B
49 LD C,C
Вы можете заметить, что младшие 3 бита зарезервированы для исходного регистра (значения 0-7 собираются B,C,D,E,H,L,(HL),A
), 3 бита рядом с ними являются целевым регистром, снова имеющим то же значение 0-7 (таким образом, 0 против 0 создает LD B,B
), а верхние два бита 01
выбирают LD
, не уверен с первого взгляда, правильно ли я его расшифровал.
Можно также ожидать, что тогда 76
будет LD (HL),(HL)
, что имеет даже меньший смысл, чем LD A,A
, поэтому есть специальная логика, чтобы поймать это и сделать HALT
вместо этого.
Таким образом, речь идет о простоте декодера команд, использовании одинаковых битовых комбинаций для выбора регистров источника / цели и о том, что не нужно добавлять больше транзисторов для перехвата ситуаций same,same
, кроме (HL),(HL)
(который, возможно, будет внутренне давать сбой в обоих случаях. источник и цель, требующие доступа к памяти, поэтому, возможно, дополнительная «логика» довольно проста в конструкции HW.
Имейте в виду, что ранние процессоры часто проектировались вручную, и общее количество транзисторов должно было быть низким как для размещения на чипе, так и для того, чтобы можно было рисовать схемы вручную и проверять их правильность.
РЕДАКТИРОВАТЬ: Z80 имеет около 8500 транзисторов, вы можете проверить: https://en.wikipedia.org/wiki/Transistor_count и https://en.wikipedia.org/wiki/Zilog_Z80 ... и GameBoy имеет немного модифицированный Z80, но общее количество транзисторов будет очень близко к исходному значению, хотя я не искал точное значение, и я не уверен, насколько далеко в будущем Nintendo будет расширять его, возможно, они могли бы позволить себе даже пойти на что-то вроде 20-50k, но я сомневаюсь в этом.
Добавление: в последнее время я читал о российских клонах Sinclair ZX Spectrum, которые были сильно модифицированными машинами, добавляющими дополнительную мощность, память и возможности ... И некоторые из них используют эти коды операций ld same,same
для управления передачей DMA, поэтому на этих машинах код, использующий их как nop
, вероятно, не сможет работать должным образом. Это не связано с GameBoy, но если у вас есть бинарный таргетинг одного из «Sprinter» или аналогичных русских клонов ZX, и вы обнаружите один из них в разборке, не считайте их автоматически nop
, они могут быть частью эффективного код на самом деле делает что-то (скорее всего, с DMA).