Hедокументиpованные биты в pегистpе флагов

ZXNet echo conference «zx.spectrum»

From Alexey Mednonogov To All 21 July 1997


Hi Andrew!

18 Jul 97 16:13, Andrew Mikheyev wrote to All about Hедокументиpованные биты в
pегистpе флагов:

AM> Хочу спpосить у All, кто нибудь знает, по какому пpинципу Z80
AM> изменяет %subj% ?

Кyсочек рyсской доки к эмyляторy Z80

=== Cut ===

Есть еще один неосвещенный участок в процессоре Z80, который оказывает
свое влияние на некоторые программы, например Sabre Wulf, Ghosts'n
Goblins и Speedlock. Это недокументированные флаги!

Биты 3 и 5 флагового регистра F не используются. Hо они могут содержать
информацию и она может быть использована, поскольку существуют такие
очевидные команды, как PUSH AF и POP AF. Hо, тем не менее, иногда
все-таки содержимое этих флагов изменяется. Я нашел следующее
эмпирическое правило:

Значения битов 7,5,3 повторяют значения соответствующих битов
последнего 8-битного результата инструкции, которая меняла
обычные флаги.

Hапример, после команды ADD A,B эти биты будут идентичны битам в
регистре A. Бит 7 регистра F - это знаковый бит и он, естественно, по
определению всегда следует этому правилу. исключением является команда
CP x (где x - регистр или (HL) или прямой аргумент). В этом случае биты
копируются не с результата, а с аргумента.

Для инструкций, которые оперируют с двухбайтными операндами, 8 битов,
подпадающие под выведенное правило - это старшие 8 битов из 16-битного
результата. Этого и следовало ожидать, поскольку здесь знаковым
является старший 15-ый бит.

Ghosts'n Goblins используют недокументированные флаги вследствие ошибки
программиста. В программе Sabre Wulf неестественно ведет себя носорог,
который иногда бегает малыми кругами в углах, если знаковый бит
по команде BIT вычисляется неправильно. Я процитирую:

AD86 DD CB 06 7E BIT 7,(IX+6)
AD8A F2 8F AD JP P,#AD8F

Удивительный образец кода! А что же касается "Спидлока", то он
выделывает такое количество непонятных и головоломных трюков, что для
того, чтобы он работал, в эмуляторе все должно точнехонько
соответствовать реальному Спектруму.

Hу и, наконец, в 128-ом ПЗУ тоже есть необычное использование регистра
AF - там он использован для временного хранения адреса перехода к
подпрограмме.

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

=== Cut ===


Cordially Yours, Alexey