Техника - молодёжи 1991-10, страница 24

Техника - молодёжи 1991-10, страница 24

Вячеслав АЛЕКСЕЕВ,

инженер-программист

Назовите свой адрес и номер...

ШКТРОНШ ИГР

ШКТРОНШ ИГР

SE32

-ни-

к

В «ТМ» N 3 вместе с программой игры «Sokoban» читателям были предложены несколько задач, а именно: пользуясь бейсиком, разработать алгоритмы, которые помогут найти экранную область, определить адреса основных системных подпрограмм, адреса и номера портов ввода/вывода, осуществить вврд и запуск подпрограмм в машинных кодах. И что, пожалуй, самое сложное — обеспечат достаточно эффективную защиту бейсик-программ от несанкционированного копирования (проще говоря — воровства). В последнем задании допускалось применение машинных кодов или ассемблера.

Клуб электронных игр получил немало ответов на каждый вопрос, хотя были и письма, авторы которых, не предлагая абсолютно ничего, умоляли прислать лично им эти алгоритмы, потому что... и далее следовали разнообразные, но одинаково неинтересные объяснения: зачем они, то есть алгоритмы, нужны вообще и данным читателям в частности. Были и другие письма: ни к чему вся эта затея, ведь достаточно повнимательнее прочитать инструкцию... Но многие пользователи ПК приобрели компьютеры с рук, чаще всего это самоделки без какой-либо документации, реже импортные ПК. Хорошо, если инструкции к ним написаны на английском языке, а если на венгерском? Или языке суахили? Да и отечественные ПЭВМ снабжены такими руководствами, разобраться в которых способны лишь их авторы.

Итак, сегодня мы рассмотрим наиболее интересные решения поставленных задач и поделимся некоторыми собственными секретами.

ПОИСК ЭКРАННОЙ ОБЛАСТИ не вызвал особых затруднений у большинства наших корреспондентов, работающих на бытовых ПК (с профессиональными дело обстоит сложнее, но об этом ниже). По сути, предложены два очень схожих алгоритма. Первый (более слабый) таков: следует заслать в левый верхний и правый нижний углы экрана цепочку символов, которая наверняка не может быть спутана ни с чем другим, например, собственную фамилию, а за

тем функцией РЕЕК искать эти цепочки в недрах машинной памяти:

10 FOR /=0 ТО 65528

20IF РЕЕК(I) О "A" THEN 120

30 IF PEEK(l+l) <>"л"

THEN 120 50 IF РЕЕК{1+2) <>V

THEN 120 60 IF PEEK(l+3) <>"к"

THEN 120 70 IF PEEK{I+4)<>"c"

THEN 120 80 IF PEEK{I+ 5) <> "e"

THEN 120 90 IF PEEK(I+ 6) <>"e"

THEN 120 100 IF PEEK(I+1) < > "в"

THEN 120

110 PRINT «НАЙДЕНО ПО АДРЕСУ»;! 120 NEXT I

Перед запуском программы нужно очистить экран, и, подогнав курсор к нужному месту, занести искомое слово, не пользуясь клавишей. < Enter >

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

Недостаток описанного алгоритма в том, что придется перебрать все ячейки ОЗУ, что займет немало времени.

Второй алгоритм более «скорострелен». В его основе не поиск текста, выведенного на экран, а наоборот — запись в ячейки ОЗУ какого-ли-бо символа, который следует «ловить» на экране: 10 CLS

20 FOR / = 0 ТО 65500 STEP 100 30 РОКЕ /,//256 40 NEXT I

Этот алгоритм одними из первых предложили Вадим Пыльцов и Константин Галий из города Надым (ZX Spectrum). Точнее, в оригинале оператор РОКЕ записывает в ячейку памяти однобайтовое число 255, мы же заменили этот произвольно выбран

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

Приведем пример. Предположим, что эта программа запущена на «Ми-кроше», тогда на экране появятся бу-v квы Ж, В, Ь, Ы, 3, Ш, Э, Щ и Ч, коды этих букв (у «Микроши») — с 118 (Ж) по 126 (Ч), значит, экранная область расположена на участке с 118 х 256= = 30200 по 126x256=32256 или, в шест-надцатеричной системе счета, с &h7600 по &h7F00. Определив порядок адреса экранной области, можно провести более точное определение конкретных точек экрана. Для этого цикл следует ограничить уже найденной зоной (в нашем примере: 20 FOR /= 30200 ТО 32300 STEP 10) и вместо старшего (//256) выводить младший байт. При этом на экране тоже будут появляться символы, но уже соответствующие младшему байту:

30 РОКЕ /,(//256—/ТУТ

(//256)) х 256.

Если у вашего ПК имеется операция MOD, то строка упрощается: 30 РОКЕ 1,1 MOD 256.

Хотя оба алгоритма работают в пределах 64 Кб ОЗУ, тем не менее они позволяют решить задачу практически на всех типах бытовых ПК, поскольку и при страничной организации памяти (свыше 64 Кб) экранная область всегда находится на активной странице. Но сами алгоритмы содержат несколько «подводных камней», о которых следует упомянуть.

Во-первых, не на всех ПК операторы РОКЕ и РЕЕК будут работать с реальными числами (0 —65535.). Целочисленные же ограничены величиной 32767 (&h7FFF), а далее начинается обратный отсчет: с — 32768 (&h8000) до - 1 (&hFFFF). Поэтому цикл может оборваться на адресе 32767, а потом —в лучшем случае появится сообщение о переполнении, в худшем —не появится ничего, а программа повторит работу с прежними адресами. На некоторых машинах положение не спасет и применение

22