┌────────────────────────────┐
│ ░▒▒▓▒▓█ Z80-Flags. █▓▒▓▒▒░ │
└────────────────────────────┘
(C) Unknown
(текст взят из спектрумовской
конференции fido7.zx.spectrum)
Есть еще один неосвещенный
участок в процессоре Z80, кото-
рый оказывает свое влияние на
некоторые программы, например
Sabre Wulf, Ghosts'n Goblins и
Speedlock. Это недокументирован-
ные флаги!
Биты 3 и 5 флагового регистра
F не используются. Hо они могут
содержать информацию и она может
быть использована, поскольку су-
ществуют такие очевидные коман-
ды, как PUSH AF и POP AF. Hо,
тем не менее, иногда все-таки
содержимое этих флагов изменяет-
ся. Я нашел следующее эмпиричес-
кое правило:
Значения битов 7,5,3 повторяют
значения соответствующих битов
последнего 8-битного результата
инструкции, которая меняла обыч-
ные флаги.
Например, после команды 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
Удивительный образец кода! А
что же касается "Спидлока", то
он выделывает такое количество
непонятных и головоломных трю-
ков, что для того, чтобы он ра-
ботал, в эмуляторе все должно
точнехонько соответствовать ре-
альному Спектруму.