В настоящее время я разрабатываю эмулятор для старого доброго GameBoy, и я столкнулся с некоторыми проблемами понимания того, как должны быть реализованы некоторые основные коды операций.
Прямо сейчас я реализую операции AND; первые несколько (0xA0 -> 0xA3; 0xA6 и 0xA7) довольно просты, но операции AND для регистров H, L немного отличаются.
Вы можете скачать документацию по z80 по этой ссылке: um0080.pdf(стр. 172)
Вот несколько примеров, показывающих, что я имею в виду (с псевдокодом) и в основном, что я делаю:
AND 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-битным регистром. Поскольку ЦП/шина могут обрабатывать только 8-битные операции, их необходимо разделить; или более логичное предложение: поскольку это только один регистр, значения H и L маскируются в регистре, и их просто нужно отделить друг от друга (старший/младший полубайт?).
Я был бы глубоко признателен, если бы кто-нибудь разъяснил мне это более ясно, потому что я просто хочу получить дополнительные базовые знания (как все это работает внутри), поэтому для меня очень важно знать, что я делаю.