Ретро - 40 лучших процедур: Обмен токена.

ZX Review #7-8-9-10

       7.2. Обмен токена

   Примечание:   под   "токеном"
подразумевается  любое  ключевое
слово  (команда,  функция)    из
"словаря" БЕЙСИКа, которое  рас-
сматривается  данной  программой
(как и интерпретатором компьюте-
ра) в виде определенного кода.
  Длина: 46
  Количество переменных: 2
  Контрольная сумма: 5000
  Назначение: меняет любое вхож-
дение  заданного  токена  в БЕЙ-
СИК-программе  на  другой  токен
(например, все  операторы  PRINT
могут быть изменены на LPRINT).
  Переменные:
     Имя: chr old
     Длина: 1
     Ячейка: 23296
     Комментарий: код заменяемо-
го токена.
     Имя: chr new
     Длина: 1
     Ячейка: 23297
     Комментарий: код замещающе-
го токена.
  Вызов программы:
     RANDOMIZE USR адрес
  Контроль ошибок: если  БЕЙСИК-
программы нет в памяти или  один
из двух заданных  токенов  имеет
код меньше 32, то процедура воз-
вращается в BASIC.
  Комментарий:   эта   процедура
очень  быстра,  но  чем  длиннее
БЕЙСИК-программа, тем  медленнее
она работает.

   ЛИСТИНГ МАШИННЫХ КОДОВ
МЕТКА  АССЕМБЛЕР      ЧИСЛА ДЛЯ ВВОДА147.

       LD BC,(23296) 237 75 0 91
       LD A,31        62  31
       CP B          184
       RET NC        208
       CP C          185
       RET NC        208
       LD HL,(23635)  42  83  92
NXT_CH INC HL         35
       INC HL         35
       INC HL         35
CHECK  LD DE,(23627) 237 91 75 92
       AND A         167
       SBC HL,DE     237  82
       RET NC        208
       ADD HL,DE      25
       INC HL         35
       LD A,(HL)     126
       INC HL         35
       CP 13         254  13
       JR Z,NXT_CH    40 237
       CP 14         254  14
       JR NZ,COMP     32   3
       INC HL         35
       JR NEXT_CHR    24 230
CONP   DEC HL         43
       CP C          185
       JR NZ,CHECK    32 229
       LD (HL),B     112
       JR CHECK       24 226
2
  Как она работает:
  В регистры B и  C  загружаются
новый и старый  токены  соответ-
ственно. Если любой  из  токенов
имеет  код  меньше, чем  32,  то
программа возвращается в BASIC.
  В пару HL заносится адрес  на-
чала БЕЙСИК-программы. Пара  ре-
гистров  затем  увеличивается  и
сравнивается с  адресом  области
переменных. Если HL  не  меньше,
чем адрес начала  области  пере-
менных, программа возвращается в
BASIC.
  Пара  HL увеличивается, указы-
вая  на  следующий  символ.  Код
этого символа загружается в  ак-
кумулятор  и  HL   увеличивается
вновь. Если значение в аккумуля-
торе равно 13 или 14 (ENTER  или
NUMBER),  подпрограмма   возвра-
щается  к  NXT_CH, а  HL  увели-
чивается, указывая на  следующий
символ. Если аккумулятор не  со-
держит 13 или 14, хранимое  зна-
чение сравнивается  с  chr  old.
Если пара  найдена, этот  символ
замещается на chr new.
  Затем  возврат   к    проверке
(CHECK) на конец  обрабатываемой
программы.