Реализация OP-кода Zilog Z80

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

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

14
задан hippietrail 13 March 2012 в 06:27
поделиться