|
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:
В этот день... 15 November