Read Me #02
31 декабря 1996

><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><
░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓
▓░▓░▓░▓░▓░▓░▓░▓███████▒░▓░▓█████▒░▓░▓█████▒░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░
░▓░▓░▓░▓░▓░▓░▓░▓░▓░██▒░▓░▓██▒░░██▒░▓██▒▓░██▒░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓
▓░▓░▓░▓░▓░▓░▓░▓░▓░██▒░▓░▓░▓█████▒░▓░██▒░▓██▒▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░
░▓░▓░▓░▓░▓░▓░▓░▓░██▒░▓░▓░▓██▒░░██▒░▓██▒▓░██▒░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓
▓░▓░▓░▓░▓░▓░▓░▓░██▒░▓░▓░▓░██▒░░██▒▓░██▒░▓██▒▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░
░▓░▓░▓░▓░▓░▓░▓░███████▒▓░▓░█████▒▓░▓░█████▒▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓
▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░
><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><

 Здесь мы хотим представить вашему драгоценному вниманию инфор-
мацию ранее  не  публиковавшуюся нигде !  Перевод оригинального
описания  к  эмулятору господина  G.A. LUNTER'a  выполненный на
вполне и вполне профессиональном уровне.

><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><

 (C) Перевод и редакция Алексей Воскресенский'97 

  Процессор Z80 - вполне честный процессор и я не припоминаю ка-
ких-то интересных 'жучков' и 'выкрутасов'.  Тем не менее я отко-
пал несколько недокументированных 'примочек'.  Некоторые  из них
весьма полезны, а некоторые нет. С некоторых пор множество прог-
рамм используют полезные, а  меньшенство используют  странные  и
непонятные. Я же в свою очередь попытаюсь вам их описать.

 Большинство операционных кодов (ОК) Z80 имеют однобайтовую дли-
ну; возможные байты или слова операндов не в  счет.  Четыре ОК -
#CB, #DD, #ED и #FD являются сменными shift-кодами: они изменяют
значения кодов следующих за ними.

 Существует 248 различных  #CB - опкодов.  Блок кодов с #CB30 по
#CB37 'выпал' из официальных  описаний.  Эти  инструкции  обычно
указывались, как мнемоники SLL, Shift Left Logical  ( логический
сдвиг влево - прим.пер. ), действие команды: сдвигает влево опе-
ранд и устанавливает бит 0 в единицу. "Bounder" и "Enduro Racer"
пользуются ими.

 ОК #DD и #FD предшествует  инструкциям,  использующим  регистры
IX и IY.  Если  внимательно посмотреть на эти  инструкции, легко
понять принцип их работы:

      #2Ann   LD HL,(nn)   #DD2A nn   LD IX,(nn)
      
      #7E     LD A,(HL)    #DD7E d    LD A,(IX+d)

 ОК #DD просто меняет значение в следующей инструкции. Если байт
памяти адресуется косвенно через HL, как  во  втором пример при-
бавляется байт смещения. Иначе инструкция просто влияет  на  ре-
гистр  IX вместо HL (неуклюжая система обозначений, лишние  хло-
поты писателям  ассемблеров  и  дизассемблеров: JP (HL) - это не
косвенная адресация; по сути это означает JP HL).

 Если ОК #DD предшествует инструкции, не  использующей регистро-
вую пару HL, то инструкция выполняется как обычная ( это хороший
прием для забивания мозгов, возьмем на заметку - прим.пер.). Тем
не менее, если инструкция оперирует с регистром H или L, то  бу-
дут использоваться старшая  или  младшая  половинки  регистровой
пары IX:

      #44     LD B,H       #DD44      LD B,IXh

 Такие типы  неофициальных инструкций используются очень многими
программистами. Между прочим, множество чередующихся кодов #DD и
#FD по эффективности будут равны NOP'ам.  Ничего  делать  они не
будут, за исключением повторной установки флага 'обращаться к HL
как к IX (или IY)' и будут занимать ровно 4 такта каждая ( попы-
тактесь дать MONS'у дизассемблировать такой блок ). *

 * - Я уверен, что его стошнит - прим.пер.

 Мне не встречались программы, использующие  неофицальные  #ED -
инструкции, за исключением  #ED6B nn, долгого  варианта  #2A nn,
LD HL,(nn). Других я не знаю.  Тем не менее я вполне уверен, что
они существуют, но никогда не возьму на себя ужасный труд прове-
рить их все.

 Насчет регистра R. В общем, это  не  вполне недокументированный
'гвоздик', хотя я не припомню какого-нибудь действительно полно-
го описания этой штуки.  Регистр R - это счетчик, который  'под-
новляет' каждую инструкцию, #DD,#FD,#ED и #CB  будут  рассматри-
ваться, как отдельные инструкции.  Сдвинутые инструкции увеличат
R на два. Oбратите внимание  на  любопытное  исключение:  дважды
сдвинутые ОК (#DDCB и #FDCB) тоже увеличат R на два. Команда LDI
увеличит R на 2, LDIR на BC*2, точно также поступит команда LDDR
и ей подобные. Последовательность  LD R,A  LD A,R  увеличит A на
два. Исключение составит старший бит:  в регистре R этот бит ни-
когда не изменяется. Это объясняется тем, что несколько лет тому
назад все использовали 16К чипы. Внутри такого чипа биты  сгруп-
пированы в матрицу 128x128, нуждающуюся  в  7 битовом освежающем
цикле. Поэтому в ZILOG  решили  использовать  только  младшие  7
бит.

 Можно запросто проверить, насколько критично регистр R 'поднов-
ляет' память. Ассемблируйте такую программу:

        ORG   32768

        DI
        LD    B,0
LOOP    XOR   A
        LD    R,A
        DEC   HL
        LD    A,H
        OR    L
        JR    NZ,LOOP
        DJNZ  LOOP
        EI
        RET

 Программа  будет  работать около трех минут. Посмотрите верхние
32К ОЗУ, например UDG графику.  Она разрушена.  Только несколько
первых байт в каждом 256 байтном блоке по-прежнему содержат нули
потому что они были 'обновлены' во время выполнения петли (LOOP)
ULA следит за обновлением нижних 16К ОЗУ.
 
                 -=- ПРОДОЛЖЕНИЕ СЛЕДУЕТ -=-
_______________________________________________________________



Other articles:


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

Similar articles:
Advertising - Advertisements and announcements ...
Text Editors - The problems of text software on Speccy.
Soft - a small survey of System Software: UltraSonic version 2., Shuffle Commander v1.0, Elastic Copy v1.0, Strange Player v3.0, Screen Mixer v1.0, ZX C + +, Smagly 3, Quick Commander 2.4.

В этот день...   21 November