ZX-Ревю 1993 №3-4 1992 г.

Профессиональный подход - методы взлома игр Билла Гильберта.


Темы статьи: Программирование  

Профессиональный подход

Методы Билла Гильберта.

По-видимому, среди программ, находящихся у пользователей, имеющих Синклер-совместимые компьютеры, ничто так не распространено, как программы, взломанные Биллом Гильбертом.

В этой статье Вашему вниманию будет предложена информация о специфике некоторых приемов оформления программ, применяемых этим хаккером. Несмотря на внешнюю схожесть эффектов, получающихся в ходе работы программ, Гильберт не всегда действует по одному шаблону. У него их достаточно много, хотя иногда они очень похожи и, разобравшись с одним из них, Вам не составит труда понять принципы действия остальных.

Как Вы уже вероятно знаете, Билл Гильберт всегда оставляет текстовые сообщения на взломанных им программах. Несмотря на то, что в последние годы он явно поскромнел, и большинство его сообщений можно перевести с английского, как "Дисковая версия Билла Гильберта" (по-английски: Disked by Bill Gilbert), в отличие от ранее использовавшегося автографа "Взломано Биллом Гильбертом" (по-английски: Cracked by Bill Gilbert), его методы остались теми же и основная цель, которую он преследовал вставкой подобных сообщений не изменилась. При изучении его "творчества" необходимо осознавать неэтичность действий Гильберта и относиться к этому так же, как и к тому, что некто на наших глазах роется в чужих карманах (хоть и делает это высокопрофессионально).

В то же время, опыт хаккера может быть использован при оформлении программ, совершенствовании их дизайна, что делает работу более простой, удобной и увлекательной.

При использовании приводимого нами материала необходимо учитывать, что большинство рассматриваемых программ написаны в машинных кодах. Это еще раз говорит о том, что высокого уровня профессионализма можно добиться только изучив программирование на языке Ассемблера. Несмотря на то, что большинство рассматриваемых процедур снабжены подробным комментарием, мы настоятельно рекомендуем Вам перед прочтением данного материала поближе познакомиться с программированием в машинных кодах. Одной из лучших книг, которые нам приходилось встречать по данное тематике, является методическая разработка "ИНФОРКОМа" "Практикум по программированию в машинных кодах".

Мы рекомендуем Вам для начала просто ознакомиться с текстом статьи, получить представление об основных приемах и методах, а потом уже детально изучать проблему по разделам. Мы старались подготовить информацию таким образом, чтобы она не требовала специального запоминания, а усваивалась постепенно по ходу внимательного прочтения.

Необходимо также учитывать, что данный материал тесно связан с той информацией, которая давалась в предыдущих статьях, особенно это касается методик взлома рассмотренных систем защиты. Впрочем, если Вы и не читали предыдущих статей, то не отчаивайтесь - нижеследующий текст отличается определенной автономией от предыдущего материала и не требует особой подготовки, интересен как для профессионалов, так и для начинающих. Желаем Вам удачи при изучении!

Современные разработки Билла Гильберта.

Билл Гильберт работает над взломом программ уже много лет. За это время ему удалось накопить достаточно большой опыт в этих вопросах. Постоянно совершенствуя свою технику программирования он достиг того уровня, который мы видим в последних взломанных им программах.

Наиболее любопытными среди них являются Iron Man и Sim City. В этих програмах использован оригинальный вывод текстовых сообщений о взломе, который свидетельствует о высоком профессиональном уровне программирования хаккера. В обеих программах используется совмещение программы на БЕЙСИКе с программой в машинных кодах, обе эти программы схожи также и по структуре загрузки и по методике взлома, применненной хаккером. Это позволяет рассматривать обе программы как две оригинальные ветви одного типа взлома. В них можно найти очень много общего, в том числе: общие процедуры на Ассемблере, схожесть расположения процедур в адресном пространстве и многое другое. Но, в тоже время, существуют довольно разительные отличия, которые предопределяют необходимость индивидуального рассмотрения каждой программы. В первую очередь это касается методики вывода текстовых сообщений на экран и, во-вторых, методики создания оригинальных моделей шрифта.

Рассмотрим более подробно эти методы на обеих программах.

Iron Man.

10 PAPER NOT PI 20 INK NOT PI

30 POKE VAL "23624",NOT PI 40 CLEAR VAL "24499" 50 OUT VAL "254",NOT PI 60 RANDOMIZE USR VAL "23789" 70 LOAD "IRNMAN1" CODE 80 LOAD "IRONMAN2" CODE 90 RANDOMIZE USR VAL "25E3" 100 REM NO POKE 110 RANDOMIZE USR VAL "24036"

Как видим, данная программа практически не имеет стройной системы защиты; такой вид она имела сразу же после того, как ее обработал Билл Гильберт. В строке 100 хаккер сам предупреждает нас, что в программе отсутствуют защитные POKES. Структура прграмны на БЕЙСИКе достаточно проста. Строки 10-20 делают цвет INK и PAPER черный, строка 50 делает черным и цвет бордюра. Как Вы могли заметить, в программе трижды используется запуск процедур в машинных кодах, но нас будет интересовать только самый первый запуск в строке 60. Именно благодаря ему создается оригинальное текстовое сообщение характеризующееся необычным сочетанием цветов, и использованием необычного шрифта. Рассмотрим подпрограмму в машинных кодах более подробно. CALL N5D07 CALL N5D23 CALL N5D45 CALL N5D64 CALL N5D77 CALL N5DA1 LD HL,3D00 DEC H

LD (5C36),HL RET

N5D07 LD HL,3D00

LD DE,9C40 PUSH DE LD BC,0300 N5D11 LD A,(HL)

RRA

OR (HL) LD (DE),A INC HL INC DE DEC BC LD A,B OR C

JR NZ,N5D11 POP DE DEC D

LD (5C36),DE RET

N5D23 LD HL,5DD6

LD B,1E

N5D28 LD A,(HL)

CP 0D JR Z,5D30 INC HL DJNZ N5D28 LD A,1E SUB B

LD (5D40),A LD B,A LD A,20 SUB B SRL A

LD (5D41),A RET

N5D40 XOR A

CALL 1601 LD A,16 RST 10 XOR A RST 10 LD A,(5D41) RST 10 LD A,10 RST 10 XOR A RST 10 LD A,(5D40) LD B,A LD HL,5DD6

N5D5E LD A,(HL)

RST 10 INC HL DJNZ N5D5E RET

N5D64 LD HL,5CD0

LD A,16 RST 10 LD A,01 RST 10 INC A RST 10

N5D6F LD A,(HL)

CP 0D RET Z RST 10 INC HL JR N5D6F

N5D77 XOR A

LD (5D42),A LD B,07

N5D7D PUSH вс

LD A,(5D42) LD HL,5AC0 LD DE,5AC1 LD BC,001F LD (HL),A LDIR

CALL N5D9B LD A,(5D42) INC A

LD (5D42),A POP BC DJNZ N5D7D RET

N5D9B LD B,05

N5D9D HALT

DJNZ N5D9D RET

N5DA1 LD IX,0000

LD (5D43),IX LD HL,5AF0 LD BC,0011 LD D,05 N5DB1 PUSH HL

PUSH BC LD BC,(5D43) PUSH BC INC BC

LD (5D43),BC POP BC PUSH HL SBC HL,BC LD (HL),D POP HL ADD HL,BC LD (HL),D POP BC POP HL HALT HALT HALT DEC BC LD A,B OR C

JR NZ,N5DB1 RET

Если Вы внимательно присмотритесь к программе в машинных кодах, то обнаружите, что текст ее составлен весьма профессионально. Программа на языке Ассемблера обычно характеризуется очень большим объемом. Чтобы облегчить работу с ней, некоторые логически законченные действия оформляются в виде отдельных процедур - подпрограмм, которые следуют одна за другой. Управление этими процедурами осуществляется из головной программы на языке Ассемблера, которая последовательно вызывает каждую процедуру, используя оператор CALL.

Внимательно присмотревшись к листингу программы, Вы обнаружите, что программа Билла Гильберта не исключение. В этом листинге очень четко просматривается головная программа управления и процедуры в машинных кодах.

Рассмотрим, что выполняют процедуры этой программы. Для этого проследим, какой визуальный эффект получается при работе программы в целом. После запуска программы экран становится черным, после этого на нижних строчках появляется надпись "IRON MAN" и постепенно высвечивается сообщение "DISKED BY BILL GILBERT 1991". После того, как последняя надпись высветилась полностью, все буквы начинают переливаться разными цветами. Особый колорит оформления достигается за счет использования в программе оригинального шрифта.

Как Вы видите, программа состоит из шести подпрограмм, каждая из которых выполняет определенную функцию для достижения визуального эффекта, описанного выше. Таким образом, одна из них формирует утолщенный шрифт, следующая затемняет экран, следующая за ней процедура ответственна за распечатку первого текстового сообщения, второе текстовое сообщение, как Вы помните, выводится на экран достаточно оригинальным способом - путем постепенного высвечивания информации от середины к краям экрана, следующая процедура обеспечивает переливающуюся различными цветами окраску букв.

Однако, наибольший интерес для читателя, на наш взгляд, представляют не все процедуры, используемые Биллом Гильбертом, а лишь некоторые из них. В частности, формирование оригинального шрифта. Поэтому не будем здесь подробно расссматривать каждую процедуру программы в машинных кодах, а остановимся на рассмотрении лишь самых интересных из них, Оставленные за пределами нашего изучения процедуры достаточно просты и не нуждаются в подробном объяснении и комментарии.

Рассмотрим процедуру формирования утолщенного шрифта. Одним из недостатков знакогенератора Спектрума являются тонкие буквы - поэтому многие пользователи жалуются на нечеткость надписей, выводимых на экран. Самым практичным методом создания утолщенного шрифта можно считать моделирование нового знака, как наложение нормального знака и знака, сдвинутого на одну точку влево. Формирование нового шрифта обычно начинается перемещением встроенного знакогенератора "Спектрума" в свободную область оперативной памяти. Следующим этапом является изменение знакогенератора, находящегося в ОЗУ, в соответствии с нашими требованиями и завершающим этапом является переключение системной переменной, указывающей на место расположения нового знакогенератора, образовавшегося в ходе ваших переделок. Рассмотрим подпрограмму на Ассемблере, выполняющую данные функции. N5D07 LD HL,3D00

LD DE,9C40 PUSH DE LD BC,0300 N5D11 LD A,(HL)

RRA

OR (HL) LD (DE),A INC HL INC DE DEC BC LD A,B OR C

JR NZ,N5D11 POP DE DEC D

LD (5C36),DE RET

В начале в регистр HL мы загружаем начало встроенного знакогенератора Спектрума - 3D00. После этого в регистр DE загружается адресе нового месторасположения шрифта, а в регистр BC мы заносим общую длину области знакогенератора. Далее начинается работа в цикле. Мы загружаем в аккумулятор то, что находится в ячейке памяти, на которую указывает регистр HL, то есть первый байт области знакогенератора. Следующий этап - это ротация аккумулятора вправо, причем бит 0 перемещается во флаг переноса, а флаг переноса - в бит 7. Более подробно эта операция показана на структурной схеме, приведенной ниже.

->

->

3

0

C

7

4

1

Схема 1.0 : C - флаг переноса.

Таким образом, мы получаем байт знакогенератора, который является смещенным вправо на один бит относительно первоначального байта. Теперь нам необходимо выполнить команду "ИЛИ" (OR) над образовавшимися байтами. Команда "ИЛИ" (OR) исполняется побитным сравнением двух двоичных чисел. Результат ее работы равен единице, если данный бит включен хотя бы в одном из операндов: в первом, или во втором,

или в обоих вместе. Таким образом, в результате может быть ноль только если в обоих операндах ноль, в противном случае получается единица.

Пример 1.0:

Первый операнд 1010 1010 (AA)

Второй операнд 1100 0000 (C0)

Результат OR 1110 1010 (EA)

Продолжим рассмотрение программы, формирующей утолщенный шрифт. После того, как мы произвели операцию логическое "ИЛИ" над двумя байтами, мы загружаем образовавшийся байт в ячейку памяти, адрес которой находится в DE. Таким образом начинается формирование нового знакогенератора в свободной области оперативной памяти, поскольку именно в регистре DE содержится начало заданной для этих целей области ОЗУ.

Следующим этапом мы увеличиваем содержимое регистров HL и DE на единицу, т.е. переходим к следующему байту знакогенератора и записываем его измененный вариант в новое место оперативной памяти. В то же время, нам необходим контроль, чтобы модифицировать только байты знакогенератора и не больше. Для этой цели мы используем регистр BC, значение которого уменьшается на единицу после модернизаций очередного байта знакогенератора.

Следующим этапом программы является проверка достижения нуля в регистре BC. Если ноль не достигнут, то мы повторяем все операции сначала, только со следующим байтом шаблона символа. Однако, если в регистре BC остался ноль, это свидетельствует о том, что мы обработали всю область знакогенератора.

После этой проверки мы восстанавливаем со стека значение регистра DE, причем обратите внимание на то, что на стек засылалось значение регистра, которое соответствует месторасположению новой области знакогенератора в ОЗУ. Теперь нам достаточно уменьшить значение регистра D на единицу, и в регистре DE у нас окажется адрес, указывающий на 256 байтов ниже той области памяти, где расположен альтернативный знакогенератор, формируемый нами в ходе выполняемых операций. Теперь нам осталось занести это значение в область системных переменных, чтобы указать на месторасположение нового набора шаблонов символов. Последним шагом является возврат в головную программу в машинных кодах.

Как видим, ничего сложного в подобном преобразовании нет. При желании Вы можете использовать эту процедуру в своей работе. Для этого мы написали похожую процедуру в виде отдельной программы на БЕЙСИКе, запустив которую, Вы сможете подробно разобраться с работой генератора утолщенного шрифта.

10 INPUT "START ADRESS = ";ADRES 20 LET SUMMA=0

30 FOR N=ADRES TO ADRES + 68 40 READ BYTE:POKE N,BYTE 50 LET SUMMA = SUMMA + BYTE 60 NEXT N

65 IF SUMMA <> 6932 THEN STOP 100 DEF FN G(A$) = USR ADRES 110 PRINT AT 15,7; 115 LET ZM=FN G(IS IT GOOD ?) 120 PRINT AT 17,7;"AND NOW?"

200 DATA 42,11,92,35,35,35,35,126,92,35,126,67,35,70,235,94 210 DATA 123,254,31,216,254,127,208,22,0,197,229,33,160,0 220 DATA 237,75,123,92,9,235,41,41,41,237,75,54,92,9,6,8,126 230 DATA 203,63,128,18,19,35,16,247,62,2,205,1,22,62,164,215 240 DATA 225,35,193,16,203,201

Данная программа являтся перемещаемой: ее можно поместить по любому адресу.

Вызов : LET ZM = FN G ("ТЕКСТ")

Текст может содержать знаки с кодами от 32 до 127 включительно. Если присутствуют другие символы, вывод на экран автоматически останавливается. Программа строит утолщенные знаки, как GRAPHICS "U", поэтому в своей программе нельзя переопределить этот символ, так как после выполнения команды вывода текста GRAPHICS "U" стирается.

На этом закончим рассмотрение того, как Билл Гильберт оформил программу "Iron Man" и теперь займемся программой "Sim City".

Sim City

10 PAPER NOT PI 20 INK NOT PI

30 POKE VAL "23624",NOT PI 40 CLEAR VAL "24499" 50 OUT VAL "254",NOT PI 60 RANDOMIZE USR VAL "23791" 70 LOAD "SIMCITY1" CODE VAL "4E4" 80 CLS

90 RANDOMIZE USR VAL "4E4" 100 POKE VAL "23739",CODE "o" 110 LOAD "SIMCITY2" CODE 120 CLS

130 LOAD "SIMCITY3" CODE 140 RANDOMIZE USR VAL "24500" 150 REM NO POKE 160 RANDOMIZE USR VAL "20480"

Как видим, БЕЙСИК-загрузчик данной программы очень схож с аналогичным загрузчиком программы "IRON MAN". В нем практически отсутствуют какие-либо хитроумные операции направленные на защиту программы от просмотра. Билл Гильберт сам предупреждает нас о том что, программа практически не защищена.

Фактически эффект, возникающий в ходе работы программы в машинных кодах очень схож с аналогичным эффектом в программе "Iron Man". Однако, профессиональный программист сразу же обратит внимание на то, что вся информация выводится своеобразным шрифтом. Причем, если в предыдущей программе для вывода сообщения использовался обычный утолщенный шрифт, в данном случае мы имеем дело с неким подобием готического шрифта. Начинающий программист может предположить, что этот шрифт загружается вместе с исходным текстом программы, однако дополнительные 768 байтов может себе дозволить далеко не каждый загрузчик. В нашем примере Биллу Гильберту с помощью использования специальных команд процессора удалось сформировать готический шрифт из обычного шрифта "Спектрума". Кроме того, подпрограмма в машинных кодах, работающая в программе "Sim City", обладает целым рядом новшеств, делающих ее очень увлекательным.

Рассмотрим листинг процедуры в машинных кодах более подробно. CALL N5D2D CALL N5D93 CALL N5D74 CALL N5D4A CALL N5D02 CALL N5D69 RET

N5D02 LD B,07

XOR A

LD (5D73),A N5D08 LD HL,5AC0

PUSH BC LD A,(5D73) INC A

LD (5D73),A LD B,40 PUSH BC LD A,(5D73) LD (HL),A

INC HL POP BC CALL N5D25 DJNZ N5D08 RET

N5D25 PUSH BC

LD B,05

N5D2B HALT

DJNZ N5D28 POP BC RET

N5D2D LD HL,5DFA

LD B,1E

N5D32 LD A,(HL)

CP 0D

JR Z,N5D3A INC HL DJNZ N5D32

N5D3A LD A,1E

SUB B

LD (5D72),A LD B,A LD A,20 SUB B SRL A

LD (5D71),A RET

N5D4A XOR A

CALL 1601 LD A,16 RST 10 XOR A RST 10 LD A,(5D71) RST 10 LD A,10 RST 10 XOR A RST 10 LD A,(5D72) LD B,A LD HL,5DFA

N5D63 LD A,(HL)

RST 10 INC HL DJNZ N5D63 RET

N5D69 LD HL,3D00

DEC H

LD (5C36),HL RET INC C EX AF,AF RLCA

N5D74 XOR A

CALL 1601 LD HL,5CD0 LD A,16 RST 10 LD A,01 RST 10 LD A,02

RST 10 LD A,10 RST 10 XOR A RST 10 LD B,1C PUSH BC LD A,(HL) RST 10 INC HL POP BC DJNZ 5D8B RET

DI

LD A,R LD E,A EX DE,HL SUB L LD L,A OR 40 LD H,A SUB H PUSH HL PUSH HL POP DE INC A LD E,A RRA CPL LD C,A SCF RLA DAA RLA

RES 4,(IY+01) RLA

LD A,(000E) INC A INC A LD B,A LD (HL),L LDIR POP HL LD A,H SUB 03 LD H,A SUB H LD L,A XOR C8 LD D,A LD E,L LD C,E LD B,L SET 0,B XOR C8 SET 1A OR B LD B,A PUSH DE LDIR POP HL PUSH HL LD BC,(1A22) LD B,C

N5D8B

N5D93

N5DD7 PUSH BC

SUB A LD B,A SET 2,B INC HL INC HL INC HL INC HL N5DE0 LD A,(HL)

LD C,A SLA A OR C

LD (HL),A INC HL DJNZ N5DE0 POP BC DJNZ N5DD7 POP DE EX DE,HL DEC H

LD (5C36),HL

EI

RET

Данная программа на Ассемблере по своей структуре очень похожа на рассмотренную ранее в программе "Iron Man". Однако, это только внешнее сходство. Большинство процедур в машинных кодах выполнены по новому принципу. Однако, все они достаточно примитивны и мы надеемся, что читатель сам сможет разобраться с ними. Мы же остановимся лишь на процедуре создания готического шрифта. Она начинается с метки N5D93 (см. листинг выше).

При создании этой процедуры Билл Гильберт, очевидно, не задавался целью сделать ее доступной для понимания широкого круга читателей, скорее наоброт. Он запутал ее как сумел. Нам пришлось провести работу по расшифровке и полученной информацией мы готовы поделиться с читателем.

В этой подпрограмме в машинных кодах Билл Гильберт совместил выполнение двух функций: затемнение экрана (экран становится черным) и создание оригинального готического шрифта. Нас мало интересует процедура затемнения экрана, поэтому все свое внимание мы сконцентрируем на подпрограмме создания готического шрифта. В то же время, мы не можем рассматривать эти процедуры разрозненно, поскольку они тесно связаны между собой, и находятся в единой подпрограмме, которая вызывается второй по счету из головвой программы в машинных кодах, с использованием оператора CALL.

Четкого разграничения между этими процедурами не существует, потому что после выполнения одной Биллу Гильберту понадобилось изменить содержимое всех регистров микроцессора с целью правильного выполнения второй процедуры. В то же время, вместо того, чтобы напрямую занести содержимое чисел в регистр микропроцессора, Билл Гильберт начинает "заметать следы", используя ряд ухищрений с употреблением лишних в данной ситуации команд микропроцессора. Вместе с тем, к концу махинаций в регистрах оказывается именно те значения, которые необходимы для правильной работы процедуры, создавшей готический шрифт. Это Вы можете легко проверить, используя дизассемблер со встроенной процедурой отладки.

Фактически подпрограмма создания готического шрифта берет свое начало с метки N5DD7. Именно относительно этой метки создается цикл, который преобразует весь встроенный шрифт "Спектрума" в оригинальный готический шрифт. Все это делается тем же способом, как и в программе "IRON MAN". К началу работы процедуры в регистре BC находится значение 0300H, что соответствует длине области встроенного в компьютер шрифта. Регистр HL несет в себе значение 3D00H, что соответствует началу этой области. В регистре DE содержится значение C800H (десятиричный эквивалент - 51200). Это адрес в оперативной памяти, куда осуществляется перенос нового шрифта.

Если рассматривать любой символ шрифта как знакоместо 8X8, то мы можем обнаружить, что в предыдущей программе создания утолщенного шрифта образующийся символ создавался за счет смещения всего исходного символа вправо с сохранением исходного символа на своем месте. В этой программе мы смещаем не полное знакоместо, а лишь последний четыре байта, к тому же смещение этих байтов осуществляется не вправо, а влево, что наглядно демонстрируют приведенные ниже диаграммы.

X

X

X

X

X

X

X

X

X

X

X

X

X

X

Диаг. 1. Стандартный символ "O" из области знакогенератора "Спектрума".

X

X

X

X

X

X

X

X

X

X

X

X

X

X

Диаг. 2. Изображение смещенной буквы "O", образующееся после сдвига вправо всех байтов шаблона 8X8. Подобный принцип сдвига реализован в программе "Iron Man".

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

Диаг. 3. Утолщенная буква "O", образующаяся в результате операции "ИЛИ" над стандартный символом "O" и смещенным символом "O".

X

X

X

X

X

X

X

X

X

X

X

X

X

X

Диаг. 4. Символ "O", в котором нижние четыре байта смещены влево операцией SLA.

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

X

Диаг. 5. Символ "O", образующийся в результате операции "ИЛИ" над стандартным символом "O" и символом, изображенным на диаг. 4. Принцип используется Биллом Гильбертом в программе "Sim City".

Теперь рассмотрим, каким образом это реализуются в процедуре, написанной в машинных кодах. Перед входом в процедуру мы сохраняем на стеке значение регистра DE, которое, как Вы помните, указывает на место расположения нового шрифта в оперативной памяти компьютера. После этого мы сохраняем на стеке значение регистра BC, которое указывает на номер обрабатываемого символа из таблицы стандартного шрифта. Далее следует очистка аккумулятора, после чего мы очищаем содержимое регистра B, засылая в него содержимое аккумулятора, равное 0. Затем "зажигается" второй бит регистра B. Таким образом Билл Гильберт записывает в регистр в число 4. Это достаточно простой прием, который направлен на то, чтобы запутать начинающего программиста. В данном случае вместо одной команды: LD B,4

Гильберт использует целых три, причем результат работы в обоих случаях один и тот

же.

На следующем этапе компьютер начинает анализировать стандартный шрифт. Первые четыре байта остаются неизменными, остальные четыре байта нам необходимо сместить на один бит влево и осуществить операцию логического "или" с их исходными аналогами. Делается это следующим образом. Для начала в аккумулятор заносится значение, содержащееся в ячейке памяти, на которую указывает регистр HL. После этого значение регистра A копируется в регистр C. Далее над содержимым регистра A производится команда арифметического сдвига влево: по этой команде все биты сдвигаются. В бит 0 (младший) засылается 0. Бит 7 сдвигается во флаг переноса C. Операция эквивалента умножению байта на 2. Если при этом образуется число большее, чем 255, включается флаг переноса C. Более подробно эта операция показана на структурной схеме.

7

6

5

4

3

2

1

0

C

0

Схема 2.0 : C - флаг переноса.

После выполнения логического сдвига, мы выполняем функцию "ИЛИ" над содержимым регистров A и C. После этого новое значение сохраняем в памяти в области нового шрифта. Далее содержимое регистра HL увеличивается на единицу, чтобы он указывал на значение следующего байта из области стандартного шрифта.

Поскольку в регистре B содержалось 4, а следующей командой идет оператор DJNZ, который задает цикл, мы начинаем повторять все предыдущие операции, пока не очистится регистр B.

Следующим этапом нашей работы является восстановление со стека содержимого регистра DE, который, как Вы помните, указывал на место расположения сформированного нами шрифта. Для того чтобы поместить в соответствующую системную переменную указание на месторасположения данного шрифта, нам необходимо, чтобы в регистре HL содержалось значение на 256 байтов меньше, чем действительный адрес месторасположения шрифта в ОЗУ. Это достигается уменьшением на единицу старшего регистра пары HL, то есть регистра H. После необходимых изменений мы заносим содержимое этого регистра в системную переменную, указывающую на месторасположение действующего в данный момент шрифта "Спектрума".

В заключение мы восстанавливаем прерывания и возвращаемся в вызвавшую нас процедуру с помощью команды RET.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Лит.Страничка - Рассказ "IT'S I". Новые приключения Винни Пуха (глава 7,8).
Содержание - содержание второго номера журнала.
Описание - Операционная система PQ-DOS
Вступление - Глюки в читалке - миф или реальность.
Видео - Комедия "Бархонов и его телохранитель".

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