Реализация Zilog Z80 OP-Code - PullRequest
       78

Реализация Zilog Z80 OP-Code

14 голосов
/ 12 марта 2012

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

Сейчас я выполняю операции AND;первые несколько (0xA0 -> 0xA3; 0xA6 и 0xA7) довольно просты, но операции AND для регистров H, L немного отличаются.

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

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

ANDA, 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-битным регистром.Поскольку процессор / шина может обрабатывать только 8-битные операции, его необходимо разделить;или более логичное предложение: так как это только один регистр, значения H и L маскируются в регистре, и их просто нужно отделить друг от друга (более высокий / более низкий клев?).

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

1 Ответ

11 голосов
/ 13 марта 2012

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

Оригинальный z80 имеет 4-битный ALU (см. Комментарии Шимы, начинающиеся внизу страницы 9 в этой транскрипции панели Музея истории компьютеров ), так что на самом деле (i) И младшие четыре биты L и аккумулятор; затем (ii) И старшие четыре бита L и аккумулятор. Однако он выставляет свои регистры как дискретные 8-битные объекты, поэтому внутренняя реализация полностью скрыта.

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

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

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

...