Spectrofon #11
23 февраля 1995

Система - "Новое о Z-80 или кое-что о недокументированных командах процессора и архитектуре "ZX-Spectrum".

<b>Система</b> -
┌──────────────────────────────┐
│ ───────── СИСТЕМА ────────── │
└──────────────────────────────┘

 Станислав В. Ефимов

        Новое  о  Z-80,
или  как используются недокумен-
тированные возможности процессо-
ра, а также кое-что про архитек-
туру компьютера.

   Тот, кто программирует на ас-
семблере,  прекрасно  знает  все
инструкции, флаги, которые меня-
ются   под   воздействием   этих
инструкций  и,  в зависимости от
опыта  и прочих условий, полага-
ет,  что ему известно все о Z80.
Однако я уверен, что информация,
изложенная  мною ниже, если и не
будет  для  кого-то неожиданной,
то будет интересной и, возможно,
полезной.
    Каждый  из  вас  изучал  ас-
семблер  по своему: кто-то читал
различные книги "русского" изда-
ния  (Из великого множества книг
безусловно можно выделить широко
известный  трехтомник  "Инфорко-
ма"), а кто-то со временем, и не
читая   никаких  книг  набирался
опыта  у  "западных" программис-
тов,  бесконечно  просматривая в
MONSе  бесконечные тексты беско-
нечного  множества  программ,  а
также листая различные "западны-
е" энциклопедии по Z80 (этим пу-
тем  шло огромное количество лю-
дей,  которые  начали заниматься
программированием Z80 в не столь
отдаленные  "перестроечные"  го-
да).  Со временем появляется все
больше книг, так или иначе каса-
ющихся Спектрума, однако там нет
ни  слова  о  том,  о чем пойдет
речь ниже...

   Существует множество нигде не
документированных   возможностей
Z80, которые не описаны ZILOG ни
в каких документах. Однако прог-
раммы,  которые  используют  эти
возможности,  существуют (и, ра-
зумеется, работают).

   Подавляющее   количество  ин-
струкций  ассемблера  однобайто-
вые, т.е. состоят из одного бай-
та,  собственно, кода операции и
операнда: байта или слова. Четы-
ре  байта  CB, DD, ED и FD - это
байты,  которые меняют смысл ко-
дов,   следующих  за  ними.  Су-
ществуют  248 CB-инструкций. Од-
нако  комбинации  с CB30 до CB37
опущены  из официального списка.
Эти   инструкции  обычно  дизас-
семблируются  как мнемоники SLL-
Shift   Left   Logical,  которые
сдвигают  операнд  влево и уста-
навливают 0-й бит операнда.
Например   эту   инструкцию  ис-
пользуют   программы   Bouder  и
Enduro  Racer.  И таких программ
довольно много...

   Инструкции,   начинающиеся  с
байтов  DD и FD предполагают ис-
пользование  регистров  IX и IY,
Посмотрите  внимательно, как они
работают:

2A nn    LD HL,(nn)
DD 2A nn LD IX,(nn)
7E       LD A,(HL)
DD 7E d  LD A,(IX+d)

Но  это  вещи  хорошо известные.
Когда   Вы   видите   инструкцию
DD2Ann,  то  она  воспринимается
Вами, как очевидная.




Однако,   если   инструкция  ис-
пользует  регистр  H  или  L, то
байт-префикс  позволяет работать
Вам со старшей или младшей поло-
виной регистра IX или IY.

   Например:

44       LD B,H
FD 44    LD B,IYh

Эти  типы неофициальных инструк-
ций  используются огромным коли-
чеством  программ.  Другие  типы
DD и FD инструкций, не приведен-
ные выше можно лишь использовать
с полезностью,  не  большей NOP.
Несколько подряд DD или FD може-
те    попробовать    распечатать
MONSом (посмотрите результат са-
ми)...



   Я не встречал программ, кото-
рые   использовали  бы  неофици-
альные  ED инструкции, такие как
ED6Bnn - "длинная"  версия 2Ann,
LD HL,(nn).

   Ну  а  теперь  о  регистре R,
точнее  о  том, по какому закону
происходит его изменение... Поп-
росту  говоря,  регистр  R - это
счетчик,   который   обновляется
после  каждой инструкции, причем
DD,   FD,   ED  и  CB  процессор
"воспринимает"   как   отдельные
инструкции!  Т.е.  инструкции  с
такими  префиксами увеличивают R
на  2.  Но существует интересная
особенность: "двойные" префиксы,
такие как DDCB и FDCB увеличива-
ют R также на 2! LDI увеличивает
R  на  два,  LDIR на 2*BC (также
как  и LDDR).


Последовательность LD R,A/LD A,R
увеличивает  А на 2, кроме стар-
шего  бита  (7-го): Этот бит ре-
гистра R не изменяется. Происхо-
дит  это  потому,  что ранее ис-
пользовались 16KBitные микросхе-
мы, где биты группируются в мат-
рицу 128x128, т.е. для доступа к
ним  необходимо лишь 7 бит... Во
многих  программах регистр R ис-
пользуется как база для реализа-
ции генератора случайных чисел.

   Следующие  несколько  страниц
будут  верны  лишь  для  машин с
"раздельным  полем памяти", т.е.
на плате это выглядит как 8 штук
K565РУ6 & 8 штук K565РУ5 (напри-
мер, версия схемы МОСКВА-48). Ну
и,  конечно, нижеследующее будет
верно  для "фирменного" Спекрума
с 48k RAM.


Если  у Вас одна из таких машин,
Вы  можете посмотреть, как рабо-
тает  регистр  R при регенерации
памяти. (Нижеследующая программа
также будет полезна тем, кто хо-
чет  определить,  с каким "полем
памяти" у него машина.)

   Введите программу:

    ORG #7530
    DI
    XOR A
    LD B,A
L1  XOR A
    LD R,A
    DEC HL
    LD A,L
    OR H
    JR NZ,L1
    DJNZ L1
    EI
    RET

   Запустите эту программу. Ког-
да  она отработает (это произой-
дет через несколько минут), пос-
мотрите   содержимое   "верхних"
32k.  Лишь несколько первых байт
из  каждых 256-и будут содержать
ту информацию, которая в них на-
ходилась.  Содержимое  этих байт
не изменится, потому что они ус-
пеют   регенерировать  за  время
"тела цикла"...

   ULA оперирует с памятью в ди-
апазоне  #4000-#7FFF,  процессор
"верхним"  диапазоном  памяти  и
ПЗУ      составляет     диапазон
#0000-#3FFF, каждая из этих сос-
тавляющих  всю память работает с
различной скоростью и независимо
друг от друга. Шины данных и ад-
реса Z80 и ULA соединяются с по-
мощью сопротивлений малой емкос-
ти;  это  дает очень эффективный
доступ к памяти.
Если Z80 нужно прочитать или за-
писать  данные  в "нижние" 16k в
то  время, когда ULA занята чте-
нием,  процессор приостанавлива-
ется,  а  когда этот процесс за-
кончится, ULA позволяет получить
доступ  к  "нижним"  16K  непос-
редственно  через сопротивления.
Это необычайно эффективно. Когда
Вы  запускаете программу в "ниж-
них"  16k RAM или пишите-читаете
эту   память,  процессор  слегка
"подвисает".  Поэтому  эта часть
памяти  медленнее,  чем  верхние
32k.  Именно  поэтому никогда не
пишите программы типа ввод/вывод
в  этих  "нижних" 16k RAM (также
это    относится   к   написанию
подпрограмм, связанных с воспро-
изведением звуков через встроен-
ный динамик).



   Из  всего вышесказанного сле-
дует, что если Вы напишете такие
подпрограммы  на машине с "общим
полем  памяти",  то  когда  Вашу
программу  запустят  на "фирмен-
ном"    Спектруме,    в   случае
синхро-ввода/вывода    программа
просто  не  будет работать, а  в
случае  со  звуками  Ваша музыка
будет   "непрезентабельной".   К
этому  же относится чтение порта
FE,  поскольку  ULA "поставляет"
его  значение. Каждый раз, когда
Вы  будете читать этот порт, ULA
временно  останавливает  процес-
сор,  потому  чтение значения из
этого порта несколько медленнее,
чем  из  других  портов. Приведу
факты: обычно IN A,(nn) выполня-
ется  процессором  за  11T (так-
тов), однако это время возраста-
ет до 12.15T, если nn=FE (приве-
дено, разумеется, среднее значе-
ние).
   На тему чтения несуществующих
портов,  порта  FF,  о  вопросах
синхронизации экрана, прерывани-
ях,    степени   "совместимости"
программ  на различных компьюте-
рах  (т.е. отчего одна программа
работает на одном Спектруме и не
работает  на другом ...), специ-
альных  эффектах,  совместимости
различных   версий  TR-DOS  и  о
многом  другом  планируется  еще
один  разговор. Поскольку я нем-
ного  отошел  в  сторону от темы
данной статьи, я продолжаю...

   Есть  еще  один, но далеко не
единственный  "темный  угол", им
пользуются  программы Sabrewulf,
Ghosts'n Goblins, а также защита
Speedlock.  Это  загадка недоку-
ментированных флагов. Биты 3 и 5
регистра флагов F не используют-
ся.


Казалось  бы, Вы можете их уста-
новить  или  сбросить, используя
лишь  POP  AF  и PUSH AF. Однако
эмпирическим путем (т.е. методом
научного  тыка) было определено,
что  значение этих битов зависит
от  8-и бит результата последней
инструкции, которая воздействует
на  обычные биты регистра флагов
F. (Уфф, ну и сказал).


  Пример 1:

   После  ADD  A,B  биты 7,5 и 3
будут идентичны битам регистра А
(бит  7  регистра F - бит знака,
понятно, что он также берется из
7-го бита A).




  Пример 2:

   После  инструкции  CP x (где
x, разумеется, регистр, (HL) или
константа),  в недокументирован-
ных  битах  будут находится биты
аргумента.

   Рассмотрим  инструкции, кото-
рые  оперируют с 16-битовым сло-
вом.  В этом случае значение не-
документированных  битов следует
брать  из  старших  8-ми бит ре-
зультата.  Так,  S-флаг берем из
15-го бита результата.

   За  примером программы, кото-
рая использовала бы недокументи-
рованные биты регистра F, далеко
ходить  не  надо.  Возьмем очень
старую программу Sabre Wulf '84.



Носорог в этой программе бежит в
одну,  затем  в  другую сторону,
благодаря  следующей  последова-
тельности    инструкций:

#AD86  DDCB067E  BIT 7,(IX+6)
#AD8A  F28FAD    JP P,#AD8F

   Не правда ли, оригинально!

   Те,  кто сталкивался на прак-
тике с системой защиты программ,
называемой  Speedlock,  обратили
внимание,  что  для  того  чтобы
"пройти  шагом" по программе да-
лее,  необходимо точнейшим обра-
зом  обойти  все ловушки, такие,
как  показано выше. К слову ска-
зать,  наши "отечественные" сис-
темы  такого рода на базе вышес-
казанного  смотрятся  более  чем
скромно...


   В  заключение  следует  также
сказать,   что   ROM  для 128-го
Спектрума использует AF для вре-
менного хранения адреса подпрог-
раммы.

   Как принято во всем цивилизо-
ванном  мире, я передам огромное
спасибо  автору отменного эмуля-
тора ZX-SPECTUM 48/128 + Sammy +
Interface I & more...more... для
IBM PC, Z80 v2.01:

Hello & thanx, Gerton A. Lunter!

Отдельные  моменты  его  советов
изложены выше.

Как  уже  было сказано, еще есть
темы,  о  которых  можно погово-
рить.



P.S.

   Эту статью не следует воспри-
нимать  как  Истину  в последней
инстанции  (Истина  находится  в
оригинальной  "фирменной"  доку-
ментации,  которой  не существу-
ет). Любая неверно данная инфор-
мация  связана  с моим возможным
заблуждением  относительно трак-
товки данного вопроса. Любая не-
полно(!) данная информация сяза-
на ислючительно с моей неуверен-
ностью  в  правильной  трактовке
данного  вопроса, а не с нежела-
нием  давать подобную информацию
в  силу  других причин (если это
не указано особо), за исключени-
ем  "очевидных"  вещей, где сте-
пень  "очевидности"  остается на
моей  совести. Поэтому Вы можете
присылать любые дополнения и пр.



Любые  претензии  касательно СО-
ДЕРЖАНИЯ  по сути, высказанные в
некорректной  форме, не принима-
ются и не обсуждаются.

Автор  не вступает в переписку с
читателями  ни  под каким видом,
однако  присланная Вами информа-
ция будет полезна при подготовке
материала следующих статей.

   С уважением, Fanatic Stas.


             * * *



Другие статьи номера:

Экспертиза - игра "Swords & Sorcery". Это предшественница популярных ролевых игр приятно удивит Вас обширным игровым пространством, обилием монстров, чудовищ и колдунов.

Штурм - читатели журнала штурмуют загадочную игру "MindFighter".

Премьера - "Notebook" - "Записная Книжка" и "Color Lines" - логическая игра, аналог игры для IBM PC и комикс "Смертельное Касание".

Обзор - Шахматные игры для "ZX-SPECTRUM".

С миру по биту - Письма читателей, статья-пародия на "бегущие строчки".

Система - "Новое о Z-80 или кое-что о недокументированных командах процессора и архитектуре "ZX-Spectrum".

Реклама - реклама и обьявления.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
FANTASY - Роман Г.Гаррисона "Чума из космоса" (продолжение).
Вступление - содержание номера.
Технодром - схема расширения ОЗУ дл 512 в копмьютера с общем полем памяти.
Новости - О челябинских новостях писать нечего, :(
Железо - Глюки TR-DOS.

В этот день...   21 ноября