Записки программиста - глюк монитора отладчика в ZS Scorpion 256.

Spectrum Progress #01
  Если  заглянем  в  "Англо-русский словарь по
основам компьютерной грамотности", то прочита-
ем, что  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-й бит не
должен меняться.