Read Me
#02
31 декабря 1996 |
|
Z80 - несколько недокументированых "жучков" процессора Z80.
><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>< ░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓ ▓░▓░▓░▓░▓░▓░▓░▓███████▒░▓░▓█████▒░▓░▓█████▒░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░ ░▓░▓░▓░▓░▓░▓░▓░▓░▓░██▒░▓░▓██▒░░██▒░▓██▒▓░██▒░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓ ▓░▓░▓░▓░▓░▓░▓░▓░▓░██▒░▓░▓░▓█████▒░▓░██▒░▓██▒▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░ ░▓░▓░▓░▓░▓░▓░▓░▓░██▒░▓░▓░▓██▒░░██▒░▓██▒▓░██▒░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓ ▓░▓░▓░▓░▓░▓░▓░▓░██▒░▓░▓░▓░██▒░░██▒▓░██▒░▓██▒▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░ ░▓░▓░▓░▓░▓░▓░▓░███████▒▓░▓░█████▒▓░▓░█████▒▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓ ▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░▓░ ><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>< Здесь мы хотим представить вашему драгоценному вниманию инфор- мацию ранее не публиковавшуюся нигде ! Перевод оригинального описания к эмулятору господина 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К ОЗУ. -=- ПРОДОЛЖЕНИЕ СЛЕДУЕТ -=- _______________________________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 5 октября