ZX Review #7-8-9-10
08 ноября 1997

Ретро - 40 лучших процедур: Удаление REM-строк.

<b>Ретро</b> - 40 лучших процедур: Удаление REM-строк.
    7.3. Удаление REM-строк

  Длина: 132
  Количество переменных: 0
  Контрольная сумма: 13809
  Назначение: эта программа уда-
ляет все комментарии из  БЕЙСИК-
программы.
  Вызов подпрограммы:
     RANDOMIZE USR адрес
  Контроль ошибок: если в  памя-
ти нет  БЕЙСИК-программы, проце-
дура вернется в  BASIC  без  ка-
ких-либо действий.
  Комментарий:  процедура   ПЗУ,
которая используется для  удале-
ния  символов,  выполняется   не
очень быстро и поэтому  подпрог-
рамма "Удаление REM-строк" рабо-
тает медленно.

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

       LD HL,(23635)  42  83  92
       JR CHECK       24  31
NEXT_L PUSH HL       229
       INC HL         35
       INC HL         35
       LD C,(HL)      78
       INC HL         35
       LD B,(HL)      70
NXT_CH INC HL         35
       LD A,(HL)     126
       CP 33         254  33
       JR C,NXT_CH    56 250
       CP 234        254 234
       JR NZ,SEARCH   32  26
       INC BC          3
       INC BC          3
       INC BC          3
       INC BC          3
       POP HL        225
DEL_L  PUSH BC       197
       CALL 4120     205  24  16
       POP BC        193
       DEC BC         11
       LD A,B        120
       OR C          177
       JR NZ,DEL_L    32 246
CHECK  LD DE,(23627) 237 91 75 92
       AND A         167
       SBC HL,DE     237  82
       RET NC        208
       ADD HL,DE      25
       JR NEXT_L      24 214
SEARCH INC HL         35
       LD A,(HL)     126
       CP 13         254  13
       JR NZ,N_ENT    32   8
ENT_FD POP HL        225
       ADD HL,BC       9
       INC HL         35
       INC HL         35
       INC HL         35
       INC HL         35
       JR CHECK       24 231
N_ENT  CP 14         254  14
       JR NZ,N_NUMB   32   7
       INC HL         35
       INC HL         35
       INC HL         35
       INC HL         35
       INC HL         35
       JR SEARCH      24 231
N_NUMB CP 33         254  33
       JR C,SEARCH    56 227
       CP 34         254  34
       JR NZ,N_QUOT   32   8
FD_QT  INC HL         35
       LD A,(HL)     126
       CP 34         254  34
       JR NZ,FD_QT    32 250
       JR SEARCH      24 215
N_QUOT CP 58         254  58
       JR NZ,SEARCH   32 211
       LD D,H         84
       LD E,L         93
FD_ENT INC HL         35
       LD A,(HL)     126
       CP 13         254  13
       JR Z,ENT_FD    40 209
       CP 33         254  33
       JR C,FD_ENT    56 246
       CP 234        254 234
       JR NZ,N_QUOT   32 236
       LD H,D         98
       LD L,E        107
DEL_CH PUSH BC       197
       CALL 4120     205  24  16
       POP BC        193
       DEC BC         11
       LD A,(HL)     126
       CP 13         254  13
       JR NZ,DEL_CH   32 245
       POP HL        225
       INC HL         35
       INC HL         35
       LD (HL),C     113
       INC HL         35
       LD (HL),B     112
       DEC HL         43
       DEC HL         43
       DEC HL         43
       JR CHECK       24 160
  Контроль  ошибок:  если  число
байтов для копирования  равно  0
или  первая  строка  уже   есть,
программа возвращается в  BASIC.
Программа  не  проверяет, доста-
точно ли памяти для новой  стро-
ки. Программа требует 10  байтов
на байт данных плюс пять  байтов
для  номеров  строк,  указателей
длины  и  т.д.  Кроме  того, ис-
пользуемая подпрограмма ПЗУ так-
же  использует  большую  рабочую
область - принимайте это в  рас-
чет. Если доступной  памяти  не-
достаточно, указатели строки бу-
дут  установлены  неправильно  и
листинг БЕЙСИКа будет недостове-
рен.
  Комментарий:  Время,  занимае-
мое работой этой программы, про-
порционально объему  памяти  для
копирования.

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

       LD DE,(23296) 237 91 0 91
       LD BC,(23298) 237 75 2 91
       LD A,B        120
       OR C          177
       RET Z         200
       LD HL,(23635)  42  83  92
       LD A,(HL)     126
       CP 0          254   0
       JR NZ,CONT     32   6
       INC HL         35
       LD A,(HL)     126
       CP 1          254   1
       RET Z         200
       DEC HL         43
CONT   PUSH HL       229
       PUSH BC       197
       PUSH DE       213
       SUB A         151
       CALL 3976     205 136  15
       EX DE,HL      235
       LD A,1         62   1
       CALL 3976     205 136  15
       EX DE,HL      235
       CALL 3976     205 136  15
       EX DE,HL      235
       CALL 3976     205 136  15
       EX DE,HL      235
       LD A,228       62 228
       CALL 3976     205 136  15
       EX DE,HL      235
NEXT_B POP DE        209
       LD A,(DE)      26
       PUSH DE       213
       LD C,47        14  47
HUNDR  INC C          12
       LD B,100        6 100
       SUB B         144
       JR NC,HUNDR    48 250
       ADD A,B       128
       LD B,A         71
       LD A,C        121
       PUSH BC       197
       CALL 3976     205 136  15
       EX DE,HL      235
       POP BC        193
       LD A,B        120
       LD C,47        14  47
TENS   INC C          12
       LD B,10         6  10
       SUB B         144
       JR NC,TENS     48 250
       ADD A,B       128
       LD B,A         71
       LD A,C        121
       PUSH BC       197
       CALL 3976     205 136  15
       POP BC        193
       EX DE,HL      235
       LD A,B        120
       ADD A,48      198  48
       CALL 3976     205 136  15
       EX DE,HL      235
       LD A,14        62  14
       LD B,6          6   6
N_ZERO PUSH BC       197
       CALL 3976     205 136  15
       POP BC        193
       EX DE,HL      235
       SUB A         151
       DJNZ N_ZERO    16 247
       POP DE        209
       PUSH HL       229
       DEC HL         43
       DEC HL         43
       DEC HL         43
       LD A,(DE)      26
       LD (HL),A     119
       POP HL        225
       INC DE         19
       POP BC        193
       DEC BC         11
       LD A,B        120
       OR C          177
       JR Z,ENTER     40  10
       PUSH BC       197
       PUSH DE       213
       LD A,44        62  44
       CALL 3976     205 136  15
       EX DE,HL      235
       JR NEXT_B      24 173
ENTER  LD A,13        62  13
       CALL 3976     205 136  15
       POP HL        225
       LD BC,0         1   0   0
       INC HL         35
       INC HL         35
       LD D,H         84
       LD E,L         93
       INC HL         35
POINT  INC HL         35
       INC BC          3
       LD A,(HL)     126
       CP 14         254  14
       JR NZ,END?     32  12
       INC BC          3
       INC BC          3
       INC BC          3
       INC BC          3
       INC BC          3
       INC HL         35
       INC HL         35
       INC HL         35
       INC HL         35
       INC HL         35
       JR POINT       24 237
END?   CP 13         254  13
       JR NZ POINT    32 233
       LD A,C        121
       LD (DE),A      18
       INC DE         19
       LD A,B        120
       LD (DE),A      18
       RET           201
2
  Как она работает:
  В пару регистров DE загружает-
ся адрес байтов для копирования,
а в пару регистров BC загружает-
ся число байтов для копирования.
Если  BC  содержит  0, программа
возвращается в BASIC.
  В пару регистров HL загружает-
ся адрес БЕЙСИК-программы. В ак-
кумулятор  загружается  байт  из
адреса, установленного в HL. Это
старший байт номера строки. Если
он не равен 0, первая строка  не
существует и  программа  перехо-
дит к CONT.  Если  старший  байт
содержит 0, в аккумулятор загру-
жается младший  байт.  Если  это
значение установлено  в  1, пер-
вая  строка  уже  существует   и
программа возвращается в BASIC.
  Адрес  старшего  байта  номера
строки  сохраняется  на   стеке.
Сохраняется число байтов для ко-
пирования, затем адрес данных. В
аккумулятор загружается 0 (стар-
ший байт нового номера  строки).
Вызванная подпрограмма  ПЗУ, на-
ходящаяся по адресу 3976, встав-
ляет символ, имеющийся в аккуму-
ляторе, по адресу, установленно-
му в HL.
  В HL восстанавливается  значе-
ние, хранившееся там перед  этой
операцией. В аккумулятор  загру-
жается 1 и это  значение  встав-
ляется 3 раза. Первая  единица -
это младший байт номера  строки,
следующие две - указатель  длины
строки. В аккумулятор затем заг-
ружается код символа DATA и  это
значение вводится в строку.
  Адрес следующего байта  данных
восстанавливается  из  стека   и
загружается в DE. Сам этот  байт
загружается в аккумулятор, а со-
держимое DE вновь сохраняется на
стеке. В  C-регистр  загружается
значение на 1  меньшее, чем  код
символа  0.  C-регистр  увеличи-
вается, а в B-регистр загружает-
ся значение 100. B-регистр вычи-
тается  из аккумулятора  и, если
результат не отрицательный, под-
программа возвращается к HUNDR.
  B-регистр прибавляется к акку-
мулятору  (таким  образом, акку-
мулятор  содержит  положительное
значение).  Это  значение  затем
загружается в B-регистр. В акку-
мулятор  загружается  содержимое
C-регистра, а BC сохраняется  на
стеке. Вызовом подпрограммы  ПЗУ
(3976), вставляется символ, хра-
нящийся в аккумуляторе, по адре-
су, содержащемуся в HL. Пара ре-
гистров BC восстанавливается  из
стека, а  в  аккумулятор  загру-
жается значение B-регистра.  Вы-
шеупомянутый прием затем  повто-
ряется для B=10. Аккумулятор за-
тем увеличивается на 48 и  полу-
ченный в результате символ вста-
вляется в строку.
  Вышеописанная подпрограмма де-
лала вставку  десятичного  пред-
ставления  встречающегося  байта
данных в выражение DATA.  Теперь
должно быть  вставлено  двоичное
представление. Это значение мар-
кируется с помощью  кода  NUMBER
(CHR 14), который вводится  пер-
вым, а за ним пять нулей. Значе-
ние копируемого байта  помещает-
ся  в  ячейку,  чтобы  заместить
третий ноль.  DE  увеличивается,
указывая на следующий байт  дан-
ных. Число байтов для  копирова-
ния снимается из стека  в  BC  и
это значение  уменьшается.  Если
результат равен 0, делается  пе-
реход в ENTER, иначе  содержимое
пар регистров BC и  DE  вторично
помещается в  стек, в  выражение
DATA включается запятая, а прог-
рамма возвращается к NEXT_B.
  В данной процедуре  код  ENTER
(конец строки)  добавляется  для
маркировки конца выражения DATA.
В HL  загружается  адрес  начала
строки, а BC  устанавливается  в
0.  HL  увеличивается,  указывая
на младший байт указателя  стро-
ки, и этот новый адрес копирует-
ся в DE. HL увеличивается,  ука-
зывая на старший байт  указателя
строки. HL и BC  затем  увеличи-
ваются, а в  аккумулятор  загру-
жается  символ,  находящийся  по
адресу в HL.
  Если аккумулятор содержит  код
14 - число найдено, то HL  и  BC
увеличиваются  на  5, перепрыги-
вая через число  и  указывая  на
символ, следующий за  ним.  Под-
программа  затем  переходит    к
POINT.
  Если аккумулятор  не  содержит
значений 14 и 13, происходит пе-
реход к POINT.
  Завершение формирования  стро-
ки выполняется помещением содер-
жимого  BC  в  ячейку  указателя
длины строки. На необходимый ад-
рес указывает DE.  По  окончании
работы процедура выполняет  воз-
рат в BASIC.



Другие статьи номера:

TR-DOS для начинающих - Окончание.

Компьютерная новелла - Prince of Persia.

Компьютерная новелла - Лазерная бригада (по игре Laser Squad).

Перекресток драконов - Игра Rapscallion.

Перекресток драконов - Игра The Runes of Zendos.

Перекресток драконов - Игра The Saga.

Перекресток драконов - Игра Witch's Cauldron.

Перекресток драконов - Создаём Адвентюру. Обзор редакторов.

Перекресток драконов - Создаём словарь к Адвентюрной игре.

Программы, которые мы выбираем - Возможные последствия использования недокументированных команд.

Программы, которые мы выбираем - О замеченных шероховатостях в работе некоторых программ и пожелания к следующим версиям.

Программы, которые мы выбираем - Предложение ко всем авторам программ, печатающих дамп памяти. Программистам, использующим защиту дисков от копирования.

Программы, которые мы выбираем - Несколько предложений по усовершенствованию ассемблера.

Программы, которые мы выбираем - Предложения по доработке ZX Word v2.5.

Программы, которые мы выбираем - Программа "Эмулятор Спектрума" v1.2.

Программы, которые мы выбираем - Что хотелось бы иметь в идеальном ассемблере.

Ретро - 40 лучших процедур: Копирование данных в памяти.

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

Ретро - 40 лучших процедур: Определение адреса БЕЙСИК-строки.

Ретро - 40 лучших процедур: Определение длины БЕЙСИК-программы.

Ретро - 40 лучших процедур: Определение размера свободной памяти.

Ретро - 40 лучших процедур: Поиск и замещение строки.

Ретро - 40 лучших процедур: Поиск подстроки.

Ретро - 40 лучших процедур: Поиск строки.

Ретро - 40 лучших процедур: Составление списка переменных.

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

Ретро - 40 лучших процедур: Удаление REM-строк.

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

Советы экспертов - Игра Fredloader.

Советы экспертов - Игра Robin of Sherwood: The Touchstones of Rhianon.

Советы экспертов - Игра Scorpions: Die Machines.

Советы экспертов - Игра Terropods.

Страничка iS-DOS - Описание рестартов системы IS DOS.

Форум - Алгоритм распознавания символов.

Форум - Время выполнения недокументированных команд процессора Z80.

Форум - Концепция экрана высокого цветового разрешения.

Форум - Несколько Pokes к играм. Программа Hacman96.

Форум - По поводу новых DOS и BIOS для Спектрума.

Форум - Программа Multicolor на любой модели компьютера. Использование 2-го экрана для Multicolor'а. Демонстрация текста. Электронные журналы.

Форум - Проект ZX Config.

Форум - Усовершенствование Art Studio. Идеи относительно компрессии файлов.

Форум - Эмулятор ZX Spectrum на IBM. По поводу шестнадцатеричной системы счисления. Программа ZX-Stars. Странности в Elita

Форум - Эффекты на бордюре и Multicolor.

Читатель-читателю - ZX Spectrum 128 - новые возможности, новые проблемы.

Читатель-читателю - Группа 'Light'. Спектрум и экспертная система.

Читатель-читателю - Драйвер принтера для Scorpion'а.

Читатель-читателю - Печать чисел в различных системах счисления.

Читатель-читателю - Программирование аркадной игры со скроллингом экрана.

Читатель-читателю - Процедура печати меток ассемблера XAS для монитора-отладчика STS 4.3.

Этюды - Атрибутная бегущая строка. "Гасилка" экрана. Упрощенный вариант процедуры "Занавес". Процедура гащения картинки. Процедура проявления картинки по точкам.

Этюды - Графический эффект "цветные полосы".

Этюды - Драйвер экрана для печати по 64 символа в строке.

Этюды - Комплект защит загрузчиков.

Этюды - Обращение к диску в режиме IM 2. Работа с диском нестандартного формата.

Этюды - Печать символа, увеличенного в 8 раз. Программа "наливания" экрана. Процедура гашения экрана по точкам. Очистка экрана как в Terminator'е. Поиск последовательности символов в памяти. Система перекодировки символьного набора.

Этюды - Программа - каталогизатор дисков.

Этюды - Программа вывода значений амплитуды каналов муз. сопроцессора на бордюр.

Этюды - Программа вывода картинки.

Этюды - Программа зажигания спрайта.

Этюды - Программа очистки заданного окна экрана.

Этюды - Программа сортировки массива по возрастанию. Процедура заполнения экрана заданным атрибутом. Процедура проявления картинки. Эффект летящих навстречу звезд. "Душ", идущий из верхнего левого угла экрана. Процедура "осыпания" картинки по пиксельным линиям. Программа "вытягивания" картинки под углом в 45 градусов. Три процедуры "Scroll".

Этюды - Процедура печати чисел.

Этюды - Процедура прорисовки символа с помощью атрибутов.

Этюды - Процедура проявления картинки. Fade-OUT эффект (картинка уходит за края экрана). Графический эффект "Фонтан". Fade-OUT эффект, имитирующий выключение телевизора. Процедура "зажигания" картинки. Программа плавной прорисовки картинки.

Этюды - Процедура рисования линии.

Этюды - Процедура составления оптимальной таблицы символов.

Этюды - Скроллинг строк текста в заданном окне. Атрибутный скроллер. Диагональный скроллинг.

Этюды - Спрайтовый скроллер. Процедуры проявления экрана.

Этюды - Укороченная процедура индикации амплитуды каналов муз. сопроцессора. Способ вычитания константы из регистровой пары HL.

Этюды - Формула для вычисления дня недели.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Z#80 BUG - Ошибка Z80 пофиксена (определение состояния прерываний).
HINTS! - 59 паролей к игре LEMMINGS.
Реклама - реклама и объявления.
Программирование - Эффект "Летающий спрайт".
Рассказ - Сексуальная история: Алёша, Наташа и Лия.

В этот день...   28 апреля