Вопрос

В настоящее время я в настоящее время разрабатываю эмулятор для старого старого Gameboy, и я сталкиваюсь с некоторыми проблемами, понимая, как должны быть реализованы некоторые основные операции.

прямо сейчас я реализую и операции; Первые несколько (0xa0 -> 0xa3; 0xa6 & 0xa7) довольно проходят прямо вперед, но и операции для регистров H, L немного отличается.

Вы можете скачать документ Z80 по этой ссылке: um0080.pdf (стр. 172)

Вот несколько примеров, чтобы показать, что я имею в виду (с псевдокодом) и в основном то, что я делаю:

и A, H (обратите внимание на бит-смещение)

(read HL register; >> 8) save in cache C
R->C = R->HL >> 8;

perform AND operation with cache
AND_H(R->C);
R->A &= R->C;
.

и A, L (обратите внимание на бит-маскировка)

(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;
.

Я знаю все биты операции, и я знаю, что они делают, но кажется, что я не могу понять, почему его нужно сделать так. У меня есть некоторые теории (поправьте меня, если я ошибаюсь: -)):

То, что я уже понял, это то, что регистры H и L в основном являются регистром HL, который является 16-битным регистром. Поскольку CPU / автобус могут обрабатывать только 8-битные операции, его необходимо расщеплять; Или более логическое предложение: поскольку его единственный регистр, значения H и L замаскированы в реестре, и они просто должны быть разделены друг от друга (более высокие / нижние раскручивания?).

Я был бы глубоко благодарен, если кто-то может сделать это более понятно для меня, потому что я просто хочу иметь еще несколько фоновых знаний (как все этот материал работает внутри) Так что это очень важно для меня, что я знаю, что я делаю.

Это было полезно?

Решение

Как отметили комментарии, тот факт, что реализация, которую вы нашли, хранит регистры H и L вместе в качестве 16-битной организации HL, а затем разлагает, что в H путем перехода вправо, а в L путем замаскировки является исключительно реализация специфический.

Оригинальный Z80 имеет 4-битный ALU (см. Комментарии Shima, начиная с нижней части страницы 9 в эта стенограмма компьютерной панели музеи истории компьютеров ), так что это на самом деле (i) и низкие четыре бита л и аккумулятора; Затем (ii) и высокие четыре бита л и аккумулятора. Однако он обнажает свои регистры в качестве дискретных 8-битных объектов, поэтому внутреннее реализация полностью скрыта.

HL называется парой регистра, потому что это два регистрия, взятые вместе, чтобы сделать 16-битное количество. Игнорирование регистров тени и индекса, оригинал Z80 на самом деле имеет три из них - HL, BC и DE. BC и DE выживают в процессоре Gameboy в качестве альтернативных пар для косвенной нагрузки (например, OPCode 0x1a - LD A, (BC)) и для 16-битной арифметики (например, 0x09 Add HL, BC) и имеют несколько других используемых на z80.

SP и ПК обычно рассматриваются как неделимые 16-битные регистры (хотя, конечно, вы можете разделить их, сохраняя их в память и чтение байтов обратно по отдельности), и AF существует для толкания и появления, но F является таким специальным случай, когда AF обычно не особенно полезен как 16-битное целое число.

Краткое резюме Тогда: у вас нет проблем с пониманием того, как OPCODES должны быть реализованы, просто как они были реализованы конкретным автором.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top