ZX-News
#07
06 октября 1996 |
|
Программистам - О глюках в Shadow Service Monitor'e (Скорпион)
┌───────────────┐ │ Программистам │▒ └───────────────┘▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ © Александр Майоров, 1996. ────────────────────────── О ГЛЮКАХ В SHADOW SERVICE MONITOR Вот уже сколько раз, влзамывая с помощью Scorpion'а всяческие защиты, я натыкался на "глючок", но всё как-то было лень с ним разобраться. И вот однажды, отложив все дела, я "поймал" этот глюк. Дело всё в том, что работа с регистром <R> в скорпионовском мониторе реализована не совсем правильно! Благодаря этому всякие "ксорки" с регист- ром <R> нужно проходить полностью либо в режиме трассировки, либо в реальном време- ни. И нельзя часть оттрассировать в мони- торе, а остальное продолжить выполнять в реальном времени. Сразу хочу сказать, что этот глюк присутс- твует на всех версиях скорпоина, какие я смог найти. А версии такие: Обычное ПЗУ: v2.7b, v2.95 ПрофПЗУ : v3.42, v3.92 А теперь конкретнее о глюке: "глючат" команды LD R,A и LD A,R. Пишем ма-аленькую программку: ----------------------------- DI LD A,#00 LD R,A и получаем такие результаты: - при выполнении этой программки в режиме трассировки в <R> будет: в STS - R=#00, как и должно быть в MONITOR - R=#01 - глюк! -в режиме реального времени: (т.е. ставим breakpoint после LD R,A) в STS - R=#00, что и следовало ожидать в MONITOR - R=#02, лучше некуда! А теперь, команда LD A,R: ------------------------- STS: После выполнения команды в аккумуля- торе, а также в регистре <R> будет нахо- дится значение регистра регенерации перед командой плюс два. (Что соответствует справочным данным) MONITOR: После команды содержимое регист- ра <R> увеличится на два, но в аккумулято- ре будет значение регистра <R> перед ко- мандой ПЛЮС ОДИН! (Т.е. на ЕДЕНИЦУ МЕНЬШЕ, чем должно быть) Если кто-то не понял вышесказаного, то смотрим ниже нарисованую табличку: ┌─────────────────────────────────────┐ │ выполнение команды LD A,R │ ├────────────┬──────────┬─────────────┤ │ │регистр R │ Аккумулятор │ ├────────────┼──────────┼─────────────┤ │до команды │ #00 │ без разницы │ ├────────────┼──────────┼─────────────┤ │в STS-е │ #02 │ #02 │ ├────────────┼──────────┼─────────────┤ │в MONITOR-е │ #02 │ #01 │ └────────────┴──────────┴─────────────┘ По-моему тут всё ясно... Я надеюсь, что вы уже догадались, почему "ксорки" нормально проходятся в режиме трассировки, несмотря на эти ошибки, но на всяких случай попробую объяснить: Вначале в регистр <R> посылается некое число. Благодаря ошибке, там (в регистре <R>) оказывается число ПЛЮС ОДИН. Затем, когда число из <R> посылается в Аккумуля- тор, оно попадает туда МЕНЬШЕ НА ЕДЕНИЦУ, а поскольку (-1)+(+1)=0 , то всё вроде-бы и в порядке. Но если посреди "ксорки" вам надоело нажимать на "True Video" или надо- ело ждать (SLOW ...) и вы, поставив break- point, запустите программу в режиме реаль- ного времени, то... Ещё одно ценное замечание: Если при входе в теневик по Magik-у или по breakpoint-у вы увидете в регистре <R> некое число (например #25), то НЕ ВЕРЬ- ТЕ ГЛАЗАМ СВОИМ! Там должно быть число НА ДВА МЕНЬШЕ!! И для того, чтобы в <R> было то, что надо, скажите теневику "r=r-2". Но не забудьте о том, что 7-й бит не дол- жен изменяться. "Что же с этим нам делать?" - спросите вы. На это имеется несколько ответов : 1) Не взламывать программы с помощью тене- вика. 2) Ждать, а вдруг эту ошибку исправят... 3) При взломе программ корректировать зна- чение регистра <R>. Т.е. при входе в тене- вик уменьшить <R> на еденицу и можно зани- маться трассировкой. А перед выходом из теневика надо снова уменьшить <R> на еде- ницу. Вот такие дела... P.S. Возможно, я где-то ошибся! Проверьте всё сами! P.P.S. Как видите, не только в ZxNews бы- вают глюки... :) С уважением, *MAS* from Omega group. __________________________ ────────────────────
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября