А теперь - некоторые разра-
ботки Max'а:
Продолжая тему эмуляторов,
начатую Alex'ом, несколько слов
хочу сказать о способах защиты
от них (в основном от UKV).
Не всем может понравиться на-
личие встроенного отладчика, под
которым почти любую программу
можно не только отладить, но и
взломать. И ведь нельзя перехва-
тить нажатие ESC (выход в отлад-
чик) - ведь это не СПЕКТРУМ, и
нажатие сей кнопочки не остав-
ляет никаких следов... (вот было
бы здорово: нажимает какой-ни-
будь чайник ESC, с целью поковы-
ряться в программе, а там - SHA-
DOW FORMATTER...) Поэтому оста-
ется только один способ - в са-
мом же начале работы программы
определить факт запуска под эму-
лятором и сброситься.
После проведения серии бесче-
ловечных экспериментов над UKV
Spectrum Debugger, было найдено
несколько способов:
1) Следующие байты: #DD, #DD,
#23 интерпретируются эмулятором
как INC HL, в то время как для
СПЕКТРУМА это - INC IX. Т.е. ес-
ли после такой проверки увели-
чился регистр HL, то программа
запущена под эмулятором.
2) Абсолютно не эмулируются
3-й и 5-й биты флагового регис-
тра - они сброшены в ноль.
140.
XOR A
ADD A,240
PUSH AF
DEC SP
POP AF
AND 40
2
Если после выполнения такой
процедуры в аккумуляторе будет
ноль - программа под UKV.
3) Подвязка по скорости.
Сравнивать замеренную ско-
рость с каким-либо числом не ре-
комендуется.
Во-первых - и у Спектрумов
скорость может незначительно
варьироваться.
Во-вторых - скорость эмуля-
тора можно подобрать (например
понизить частоту прерываний в 2
раза - в результате тактов меж-
ду прерываниями станет больше).
Лучше сделать так. UKV сильно
тормозит при работе с атрибута-
ми. Теперь если сделать замер
тактов между прерываниями, и в
цикле подсчета поставить коман-
ду записи числа в область атри-
бутов, то вы получите одно зна-
чение.
Если затем повторить этот за-
мер еще раз, но записывать чис-
ло в обычную память, результат
будет другим.
На настоящем Спектруме эти
два числа будут равны.
140.
Цикл 1-й:
LD BC,50
XOR A
COUNT1 INC BC
LD (22528),A
JR COUNT1
Цикл 2-й:
LD BC,0
XOR A
COUNT2 INC BC
LD (65535),A
JR COUNT2
2
В первом цикле стоит команда
LD BC,50. Это сделано для того,
чтобы дать 'фору' более медлен-
ному (на эмуляторе) циклу (вдруг
Спектрум тоже слегка тормозит
при записи в атрибуты...)
Естественно, запускать эти
циклы нужно сразу же после
HALT'а, а выход из них - через
процедуру обработки IM 2.
Теперь осталось сравнить два
этих числа, к примеру - SPEED1 и
SPEED2:
LD HL,SPEED1
LD DE,SPEED2
AND A
SBC HL,DE
JR C,EMU
OKAY ...
То же самое можно проделать и
с выводами в порты - эмулятор
весьма и весьма медленно меняет
цвет бордюра (ведь "бордюр" - на
самом деле только часть экрана
на IBM, и эмулятор после каждо-
го OUT'а в порт 254 меняет цвет
всех пикселов бордюра, а это за-
нимает значительное время).
Alex писал и еще об одном
эмуляторе - Z80TRDOS.
Так вот: все вышеперечислен-
ные тесты на нем не срабатыва-
ют - он более совместим, нежели
UKV Spectrum Debugger.
Да и защищаться от него не
имеет смысла, так как в Z80 мо-
нитор отсутствует.
Тем не менее, могу порекомен-
довать следующее: LD HL,(#FFFF).
После такого, Z80TRDOS без-
надежно виснет вместе с PC, и
единственное, что может помочь -
кнопка RESET (семь бед - один
RESET...)
Кстати, то же самое будет и с
UKV, если на вашем PC не уста-
новлена EMS-память.
Еще Alex писал о случаях пор-
чи ПЗУ (так как в эмуляторе ПЗУ
- это ОЗУ, только с программно
запрещенной записью, видимо,
иногда эта проверка не срабаты-
вает...)
Мне не удалось найти такие
условия, при которых происходит
эта порча.