Объяснение на пальцах от АнСа:
На любой адрес в архитектуре Денди отводится 16 битов.
Вот визуально представим их, обозначив место каждого бита буквой.
A B C D E F G H I J K L M N O P - 16 позиций
Например, вот так в двоичном виде можно представить число $FFFE (адрес в РОМе, где хранится указатель на процедуру IRQ):
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
Вот в Memory Viewer (сейчас он называется Hex Editor) ты видишь всё адресное пространство от 0000 до FFFF. А на самом деле физически такого цельного пространства на приставке нет. Есть отдельная плата с оперативной памятью, есть плата постоянной памяти (в пластмассовом картридже), и есть порты видео/звука, которые вообще даже памятью не являются, а в пространстве процессора они обозначены только для лёгкого доступа.
Всё содержимое окна Hex Editor составляется на лету из нескольких источников. На самой приставке нету такого массива размером 65536 байтов, который ты скроллируешь в этом окне.
Так вот, когда процессор получает 16 битов некоего адреса, ему надо их расшифровать и определить, к какому виду памяти это относится (ОЗУ, ПЗУ, порты, а может вообще SRAM для сэйва). Так что процессор по первым нескольким битам определяет тип устройства, а по оставшимся битам - адрес ячейки внутри этого устройства.
Расшифровка идёт слева направо (со старшего бита к младшему).
Если самый первый бит (на позиции A, см. выше) равен единице, то мы явно имеем дело с ROM, так что отбрасываем старший бит и оставшиеся 15 битов являются адресом ячейки на картридже. В итоге на картридже можно адресовать 0000-7FFF - это 32 килобайта. Если 32к игре мало, она использует мапперы, ловко подменяя содержимое этих тридцати двух килобайтов.
Но если бит на позиции A равен нулю, то надо расшифровывать дальше.
Берём бит на позиции B. Если он равен единице то мы имеем дело либо с портами звуковухи, либо с карточкой сохранения (это уже определяется по биту на позиции C - если он равен 1, то используем SRAM, если 0, то APU).
А вот если бит B равен нулю, то мы имеем дело либо с оперативной памятью, либо с портами видеокарты. Это можно определить по биту C - если он равен 1, то используем PPU, если 0, то RAM.
Итак, если бит A равен 0, бит B равен 0, бит C равен 0, то мы точно определились, что имеем дело с RAM. Оставшиеся 13 битов являются адресом ячейки в оперативке.
Но физически оперативной памяти только 2 килобайта (и в эмуляторе тоже для ОЗУ отводится массив в 2048 байт), и любое число в диапазоне от 0 до 7FF можно записать с помощью одиннадцати битов.
Так что значение битов D и E не принимается в расчёт при доступе к ячейке ОЗУ. Эти два бита могут быть любыми, а конечный адрес определяется битами FGHIJKLMNOP (но только если ABC = 000).
Так вот, допустим, "FGHIJKLMNOP" - это адрес жизней босса, ну 0x589. То есть в двоичном это "10110001001". Как можно указать процессору на этот адрес? Ну, во-первых, три старших бита обязаны быть нулями, чтобы процессор изначально отправил сигнал вправо по материнке, где микросхемы памяти, а не налево, где картридж торчит, и не вниз, где PPU.
Во-вторых, из оставшихся 13 битов младшие одиннадцать должны быть равны "10110001001", чтобы указать точный адрес в ОЗУ.
В-третьих... а третьих нет. Биты D и E игнорируются.
В итоге можно адресовать эту пятьсот восемьдесят девятую ячейку четырьмя шестнадцатибитными адресами:
000 00 10110001001
000 01 10110001001
000 10 10110001001
000 11 10110001001
И это всё будет та же самая ячейка 0x589.
Возьмём последний адрес - 0001110110001001. Если перевести его в хекс, то это будет 1D89. И в хексредакторе по адресу 0x1D89 ты видишь то же самое значение, что и в 589. Но если запишешь в эту ячейку своё число, то эмулятор (как и реальный процессор Денди) отбросит значения битов D и E (в данном случае они оба равны единице), и запишет твоё новое значение не в ячейку 1D89 (такой ячейки просто нет в массиве RAM, в нём только ячейки с 0 до 7FF), а в ячейку 589.
При этом в самом хексредакторе одновременно с 589 обновится и ячейка 1D89, так как хексредактор когда рисует на экране цифры тоже в уме игнорирует D и E. Рисуя значение ячейки 1D89 он смотрит на ячейку 0x589 в массиве RAM. В итоге эта ячейка 1D89 существует только у тебя на экране в момент обновления картинки, а внутри эмулятора хранится только ячейка 589.