Если заглянем в "Англо-русский словарь по
основам компьютерной грамотности", то прочита-
ем, что glitch (читается - "глитч") - кратко-
временная импульсная помеха, а ещё - хроничес-
кий дефект, имеющий своей причиной неправильно
сформулированные требования к программе.
Так, вот. Если где-то там, у кого-то имеет
место "дефект, имеющий своей причиной...", то
это несомненно - глитч. Но если врёт родной
компьютер, то это всё-таки - глюк.
(C) Александр Майоров (MAS), 1996.
С тех пор, как я расширил свой Compоsite 48
до Scorpion 256, у меня врямя от времени возни-
кал один и тот же вопрос. Почему всякие "ксор-
ки" с регистром <R> нужно проходить полностью
либо в режиме трассировки, либо в реальном вре-
мени, и нельзя часть оттрассировать, а ос-
тальное выполнить в реальном времени?
Особо меня это не беспокоило, но вот недавно,
внимательно глядя на экран при трассировке
STS-ом и Monitor-ом одной и той-же программы, я
"поймал" этот глюк.
Все дело в том, что работа с регистром <R>
в скорпионовском мониторе реализована не
совсем правильно!
Сразу хочу сказать, что этот глюк присутству-
ет на всех версиях Скорпиона, какие я смог най-
ти: Version 2.7b, 2.95 и, даже, на проф-версии
3.42!!!
А теперь конкретнее о глюке: виноваты команды
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 ...) и
Вы, поставив breakpoint, запустите программу в
режиме реального времени...
И еще одно важное замечание.
Если при входе в теневик по Magik-у, или по
breakpoint-у (что в принципе одно и тоже), вы
увидете в регистре <R> некое число (например
#25) - НЕ ВЕРЬТЕ ГЛАЗАМ СВОИМ! Там должно быть
число НА ДВА МЕНЬШЕ!! Т.е. надо скомандовать
"r=r-2", но не забывая о том, что 7-й бит не
должен меняться.