В настоящее время я разрабатываю эмулятор для старого доброго 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 маскируются в регистре, и их просто нужно отделить друг от друга (более высокий / более низкий клев?).
Я был быглубоко признателен, если кто-то может сделать это более ясным для меня, потому что я просто хочу получить дополнительные знания (как все это работает внутри), поэтому для меня очень важно, чтобы я знал, что я делаю.