40 ЛУЧШИХ ПРОЦЕДУР
Продолжение. Начало см. с. 17-28, 61-70.
7. ПРОЦЕДУРЫ ОБРАБОТКИ ПРОГРАММ.
7.1 Удаление блока программы.
Длина: 42
Количество переменных: 2 Контрольная сумма: 5977
Назначение: Эта программа удаляет блок BASIC-программы, находящийся между строками, определенными пользователем. Переменные: Имя - start line no Длина - 2 Адрес - 23296
Комментарий: Номер первой строки, подлежащей удалению. Имя - end line no Длина - 2 Адрес - 23298
Комментарий: Номер последней строки, подлежащей удалению.
Вызов программы:
RANDOMIZE USR адрес Контроль ошибок:
Если имеют место следующие ошибки, то процедура останавливается без удаления строк BASIC-программы:
- если последний номер строки меньше, чем первый номер строки;
- если между этими двумя строками нет программы на БЕЙСИКе;
- если один из номеров строк или оба равны 0.
Комментарий:
Эта программа довольно медленна для удаления большого блока программных строк, но, тем не менее, работать с ее помощью все же удобнее, чем удалять строки вручную.
Не вводите номера строк больше, чем 9999.
ЛИСТИНГ МАШИННЫХ КОДОВ
ЧИСЛА ДЛЯ ВВОДА
LD HL,(23296) LD DE,(23298)
42 0 91 237 91 2 91
124 181 200 122 179 200 213
LD A,H OR L RET Z LD A,D OR E RET Z PUSH DE
CALL 6510 EX (SP),HL
SBC HL,DE
200 216 235 122 179 200 213 229
RET Z RET C
EX DE, HL NXT_CH LD A, D
OR E RET Z PUSH DE PUSH HL
205 24 16
24 243
Как она работает:
В пары регистров HL и DE загружаются начальный и конечный номера строк соответственно. Эти значения проверяются и, если одно из них или оба равны 0, программа возвращается в BASIC.
Затем вызывается подпрограмма ПЗУ по адресу 6510 - она возвращает адрес в памяти компьютера, с которого начинается первая строка. Эта же подпрограмма затем вызывается снова для определения адреса символа, стоящего после 'ENTER' в конечной строке.
В пару регистров HL помещается разность этих двух адресов и, если это значение равно 0 или отрицательно, программа возвращается в BASIC.
Содержимое пары регистров HL копируется в DE для использования DE в качестве счетчика. Если счетчик равен 0, то работа процедуры завершается, а если нет, то вызывается подпрограмма ПЗУ, расположенная по адресу 4120, которая удаляет один символ. После этого - возврат к ^ХТ_СН'.
7.2 Обмен токена.
Примечание: под "токеном" подразумевается любое ключевое слово (команда, функция) из "словаря" БЕЙСИКа, которое рассматривается данной программой (как и интерпретатором компьютера) в виде определенного кода. Длина: 46
Количество переменных: 2 Контрольная сумма: 5000 Назначение:
Меняет любое вхождение заданного токена в БЕЙСИК-программе на другой токен (например, все операторы PRINT могут быть изменены на LPRINT).
Переменные: Имя - chr old Длина - 1 Адрес - 23296
Комментарий: Код заменяемого токена. Имя - chr new Длина - 1 Адрес - 23297
Комментарий: Код замещающего токена.
Вызов программы:
RANDOMIZE USR адрес
Контроль ошибок:
Если БЕЙСИК-программы нет в памяти или один из двух заданных токенов имеет код меньше 32, то процедура возвращается в БЕЙСИК.
Комментарий:
Эта процедура очень быстра, но чем длиннее БЕЙСИК-программа, тем медленнее она работает.
ЛИСТИНГ МАШИННЫХ КОДОВ
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
LD BC,(23296) |
237 |
75 |
LD A,31 |
62 |
31 |
CP B |
184 |
|
RET NC |
208 |
|
CP C |
185 |
|
RET NC |
208 |
|
LD HL,(23635) |
42 |
83 |
INC HL |
35 |
|
INC HL |
35 |
|
INC HL |
35 |
|
LD DE,(23627) |
237 |
91 |
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 |
DEC HL |
43 |
|
CP C |
185 |
|
JR NZ,CHECK |
32 |
229 |
LD (HL),B |
112 |
|
JR CHECK |
24 |
226 |
Как она работает:
В регистры B и C загружаются новый и старый токены соответственно. Если любой из токенов имеет код меньше, чем 32, то программа возвращается в BASIC.
В пару HL заносится адрес начала БЕЙСИК программы. Пара регистров затем увеличивается и сравнивается с адресом области переменных. Если HL не меньше чем адрес начала области переменных программа возвращается в БЕЙСИК.
Пара HL увеличивается указывая на следующий символ. Код этого символа загружается в аккумулятор и HL увеличивается вновь. Если значение в аккумуляторе равно 13 или 14 (ENTER или NUMBER) подпрограмма возвращается к ^ХТ_СН' а HL увеличивается указывая на следующий символ. Если аккумулятор не содержит 13 или 14, хранимое значение сравнивается с 'chr old'. Если пара найдена, этот символ замещается на 'chr new'.
Затем возврат к проверке ('CHECK') на конец обрабатываемой программы.
7.3 Удаление REM строк
Длина: 132
Количество переменных: 0
Контрольная сумма 13809
Назначение:
Эта программа удаляет все комментарии из БЕЙСИК программы. Вызов программы:
RANDOMIZE USR адрес Контроль ошибок:
Если в памяти нет БЕЙСИК программы процедура вернется в БЕЙСИК без каких либо действий.
Комментарий:
Процедура ПЗУ, которая используется для удаления символов, выполняется не очень быстро и поэтому процедура "Удаление REM" работает медленно.
ЛИСТИНГ МАШИННЫХ КОДОВ
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
LD HL,(23635) |
42 |
8З |
JR CHECK |
24 |
31 |
PUSH HL |
229 |
|
INC HL |
35 |
|
INC HL |
35 |
|
LD C,(HL) |
78 |
|
INC HL |
35 |
|
LD B,(HL) |
70 |
|
INC HL |
35 |
|
LD A,(HL) |
126 |
|
CP 33 |
254 |
33 |
JR C,NXT СН |
56 |
250 |
CP 234 |
254 |
234 |
JR NZ,SEARCH |
32 |
26 |
INC ВС |
3 |
|
INC BC |
3 |
|
INC ВС |
3 |
|
INC BC |
3 |
|
POP HL |
225 |
|
PUSH ВС |
197 |
|
CALL 4120 |
205 |
24 |
POP BC |
193 |
|
DEC BC |
11 |
|
LD A,B |
120 |
|
OR C |
177 |
|
JR NZ,DEL L |
32 |
248 |
LD DE,(23627) |
237 |
91 |
AND A |
167 |
|
SBC HL,DE |
237 |
82 |
RET NC |
208 |
|
ADD HL,DE |
25 |
|
JR NEXT L |
24 |
214 |
INC HL |
35 |
|
LD A,(HL) |
126 |
|
CP 13 |
254 |
13 |
JR NZ,N ENT |
32 |
8 |
POP HL |
225 |
|
ADD HL,BC |
9 |
|
INC HL |
35 |
|
INC HL |
35 |
|
INC HL |
35 |
|
INC HL |
35 |
|
JR CHECK |
24 |
231 |
CP 14 |
254 |
14 |
JR NZ,N NUMB |
32 |
7 |
INC HL |
35 |
|
INC HL |
35 |
|
INC HL |
35 |
|
92
75
INC HL |
35 |
|
INC HL |
35 |
|
JR SEARCH |
24 |
231 |
CP 33 |
254 |
33 |
JR C,SEARCH |
56 |
227 |
CP 34 |
254 |
34 |
JR NZ,N QUOT |
32 |
8 |
INC HL |
35 |
|
LD A,(HL) |
126 |
|
CP 34 |
254 |
34 |
JR NZ,FD QT |
32 |
250 |
JR SEARCH |
24 |
215 |
CP 58 |
254 |
58 |
JR NZ,SEARCH |
32 |
211 |
LD D,H |
84 |
|
LD E,L |
93 |
|
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 |
|
PUSH BC |
197 |
|
CALL 4120 |
205 |
24 |
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)^ |
113 |
|
INC HL |
35 |
|
LD (HL),B |
112 |
|
DEC HL |
43 |
|
DEC HL |
43 |
|
DEC HL |
43 |
|
JR CHECK |
24 |
160 |
16
N_NUMB
FD QD
N QUOT
FD_ENT
Как она работает:
В пару регистров HL загружается адрес начала БЕЙСИК области и делается переход к подпрограмме проверки конца обрабатываемой программы. Если конец достигнут, происходит возврат в БЕЙСИК.
Программа переходит к обработке следующей строки "NEXT_L". Адрес, имевшийся в HL сохраняется на стеке для дальнейшего использования, а в BC загружается длина обрабатываемой БЕЙСИК строки. Подпрограмма 'NXT_^' увеличивает адрес в HL и загружает в аккумулятор очередной символ. Если его код меньше чем 33, т. е. это пробел или управляющий символ, процедура возвращается, чтобы повторить эту часть вновь. Если встретившийся символ не является символом REM, делается переход к 'SEARCH'.
Если оператор RЕМ найден, регистр ВС увеличивается на 4 (он может быть теперь использован в качестве счетчика), а HL восстанавливается из стека. Затем удаляется количество символов, определенное в ВС, начиная с адреса определенного в HL. Для удаления используется процедура ПЗУ, расположенная по адресу 4120. Затем процедура снова переходит к процедуре 'CHECK'.
Если происходит переход к процедуре 'SEARCH', HL увеличивается указывая на следующий символ, и это значение загружается в аккумулятор. Если это символ ENTER, т.е.
достигнут конец строки, то HL восстанавливается из стека и увеличивается, указывая на начало следующей строки, а затем происходит переход к 'CHECK'.
Если аккумулятор хранит символ NUMBER (код равен 14), то HL увеличивается, указывая на первый символ после обнаруженного числа, и процесс поиска повторяется.
Затем делается проверка для символов, код которых меньше 33. Если такой символ обнаружен делается возврат к 'SEARCH'.
Если обнаружен символ "кавычка" (34), процедура выполняет цикл до тех пор, пока не будет обнаружена вторая кавычка, а затем поиск будет продолжен. Если найденный символ не двоеточие, определяющее строку с несколькими выражениями, поиск повторить.
HL копируется в DE, чтобы сохранить адрес двоеточия, а затем HL увеличивается, указывая на следующий символ. Если это символ ENTER, делается переход к 'ENT_FD', иначе, если это управляющий символ или пробел, программа возвращается к 'FD_ENT'.
Если символ не является кодом REM, происходит переход к 'N_QUOT'. Если же код REM найден, в HL загружается адрес последнего встретившегося двоеточия, а затем все символы от адреса, находящегося в HL до следующего символа ENTER удаляются. Указатели для этой строки корректируются, HL устанавливается в начало этой строки, и происходит переход к 'CHECK'.
7.4 Создание REM строк
Длина: 85
Количество переменных 3 Контрольная сумма 9526 Назначение:
Эта процедура создает выражение REM с заданным количеством символов в заданной строке. Символ выбирается пользователем. Переменные: Имя - line number Длина - 2 Адрес - 23296
Комментарий: номер строки в которую надо вставить выражение RЕМ. Имя - number chr Длина - 2 Адрес - 23298
Комментарий: Количество символов после REM. Имя - chr code Длина - 1 Адрес - 23300
Комментарий: Код символов после REM Вызов программы:
RANDOMIZE USR адрес Контроль ошибок:
Если номер строки равен 0, больше 9999, или строка с тем же самым номером уже существует, программа возвращается в BASIC. Комментарий:
Эта программа не проверяет достаточно ли свободной памяти для добавления новой строки. Следовательно это должно быть сделано перед стартом с помощью программы "Размер свободной памяти" из нашей статьи. Символы для ввода после REM должны иметь коды больше чем 31, т. к. управляющие символы (0 - 31) могут сбить с толку подпрограмму LIST в ПЗУ.
Подпрограмма ПЗУ, которая вызывается для вставки символов, довольно медленно выполняется, занимая много времени.
Созданное выражение REM может быть использовано для хранения машинного кода или данных.
ЛИСТИНГ МАШИНЫХ КОДОВ
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
ВВОДА |
LD HL,(23296) |
42 |
0 |
91 |
LD A,H |
14 |
|
|
OR L |
181 |
|
|
RET Z |
200 |
|
|
LD DE,10000 |
17 |
16 |
39 |
AND A |
167 |
|
|
SBC HL,DE |
237 |
82 |
|
RET NC |
208 |
|
|
ADD HL,DE |
25 |
|
|
PUSH HL |
229 |
|
|
CALL 6510 |
205 |
110 |
25 |
JR NZ,CREATE |
32 |
2 |
|
POP HL |
225 |
|
|
RET |
201 |
|
|
LD BC,(23298) |
237 |
75 |
2 |
PUSH BC |
197 |
|
|
PUSH BC |
197 |
|
|
LD A,13 |
62 |
13 |
|
CALL 3976 |
205 |
136 |
15 |
INC HL |
35 |
|
|
POP ВС |
193 |
|
|
PUSH BC |
197 |
|
|
LD A,B |
120 |
|
|
OR C |
177 |
|
|
JR Z,INSERT |
40 |
11 |
|
LD A,(23300) |
58 |
4 |
91 |
CALL 3976 |
205 |
136 |
16 |
INC HL |
35 |
|
|
POP BC |
193 |
|
|
DEC BC |
11 |
|
|
JR NXT_CH |
24 |
240 |
|
POP BC |
193 |
|
|
LD A,234 |
62 |
234 |
|
CALL 3976 |
205 |
136 |
15 |
INC HL |
35 |
|
|
POP BC |
193 |
|
|
INC BC |
3 |
|
|
INC BC |
3 |
|
|
LD A,B |
120 |
|
|
PUSH BC |
197 |
|
|
CALL 3976 |
205 |
136 |
15 |
POP BC |
193 |
|
|
INC HL |
35 |
|
|
LD A,C |
121 |
|
|
CALL 3976 |
205 |
136 |
15 |
INC HL |
35 |
|
|
POP BC |
193 |
|
|
LD A,C |
121 |
|
|
PUSH BC |
197 |
|
|
CALL 3976 |
205 |
136 |
15 |
POP BC |
193 |
|
|
INC HL |
35 |
|
|
LD A,B |
120 |
|
|
JP 3976 |
195 |
136 |
15 |
Как она работает:
В пару регистров HL загружается заданный номер строки. Это значение сравнивается с нулем и если он равен нулю, программа возвращается в БЕЙСИК. Если HL содержит число больше 9999 (максимально возможный номер строки), также происходит возврат в БЕЙСИК.
Вызывается подпрограмма ПЗУ (CALL 6510), которая возвращает в HL адрес строки, номер которой был в HL перед вызовом этой подпрограммы. Если флаг нуля установлен, то строка уже существует и в этом случае программа также возвращается в БЕЙСИК.
Если флаг нуля не установлен, делается переход к 'CREATE'. В BC загружается количество символов для вставки после 'REM' и это число запоминается на стеке. В аккумулятор загружается число 13 - код символа ENTER. Затем вызывается подпрограмма ПЗУ из адреса 3976 для вставки символа ENTER. Регистр ВС восстанавливается из стека.
После повторного сохранения ВС на стеке, пара ВС тестируется чтобы определить есть ли еще символы для вставки. Если нет, то делается переход к 'INSERT'. Если есть еще символы для вставки, в аккумулятор загружается заданный нами код и подпрограмма по адресу 3976 (из ПЗУ) используется для его вставки. Счетчик ВС уменьшается и программа возвращается к проверке ВС на 0.
Как только процедура достигает 'INSERT', код REM вставляется, используя эту же подпрограмму. Затем в ВС загружается длина созданной новой строки, и указатели длины для этой строки созданы. Номер строки затем извлекается из стека, и это значение вставляется перед возвратом в БЕЙСИК.
7.5 Сжатие программы.
Длина: 71
Количество переменных: 0
Контрольная сумма: 7158
Назначение:
Эта программа удаляет все ненужные управляющие символы и свободные пространства из БЕЙСИК-программы, увеличивая таким образом количество доступной памяти.
Вызов процедуры:
RANDOMIZE USR адрес
Контроль ошибок:
Если в памяти нет БЕЙСИК-программы, процедура возвращается в БЕЙСИК.
Комментарий:
Эта процедура предполагает, что все выражения REM уже удалены из БЕЙСИК-программы. Если же это не так, произойдет сбой. Время выполнения пропорционально длине БЕЙСИК программы.
ЛИСТИНГ МАШИННЫХ КОДОВ
ЧИСЛА ДЛЯ ВВОДА
42 83 92
LD DE,(23627) AND A SBC HL,DE RET NC ADD HL,DE PUSH HL LD C,(HL) INC HL LD B,(HL) INC HL LD A,(HL) CP 13
JR NZ,NUMBER POP HL LD (HL)^ INC HL LD (ИЬ),В
237 91 75 92 167
237 82
208 25 229 78 35 70 35 126
ADD HL,BC INC HL JR NEXT_L
9
35
24 227 254 14
32 7 35
NUMBER CP 14
JR NZ,QUOTE INC HL INC HL INC HL INC HL INC HL JR NEXT_B QUOTE CP 34
JR NZ,CONTR F_QUOT INC HL
35 35 35 35
24 231 254 34
32 12 35
LD A,(HL) CP 34
JR Z,NEXT_B CP 13
JR Z,RESTOR JR F_QUOT
CONTR CP 33
JR NC,NEXT_B PUSH BC CALL 4120 POP BC DEC BC JR LOAD
Как она работает:
В пару регистров HL загружается адрес БЕЙСИК-программы. HL затем увеличивается дважды, указывая на два байта, хранящих длину следующей строки. В пару регистров DE загружается адрес области переменных. Если HL не меньше, чем DE, подпрограмма возвращается в BASIC, т. к. достигнут конец программной области.
Адрес из HL сохраняется в стеке, в ВС загружается длина строки, и HL увеличивается, указывая на следующий байт в строке. Байт в HL затем загружается в аккумулятор. Если это значение не равно 13, происходит переход к 'NUMBER'.
Для достижения 'RESTOR' должен быть найден конец строки. Адрес указателей длины строки загружается из стека в HL и вставляется длина существующей строки. Длина строки добавляется к HL, HL увеличивается и программа возвращается к NEXT_L.
Если программа достигает 'NUMBER', проверяется, содержит ли аккумулятор символ NUMBER (код 14). Если да, HL увеличивается на 5 - т. е. выполняется прыжок через следующее за NUMBER число, и происходит переход к 'NEXT BYTE'.
Если аккумулятор не содержит кода кавычки, программа переходит к 'CONTR'. Если код кавычки найден, циклы программы будут выполняться до тех пор, пока не будет достигнут конец строки или найдена другая кавычка. В первом случае происходит переход к RESTOR, в последнем - к NЕХТ_В.
В процедуре CONTR происходит проверка символа. Если он имеет код не меньше, чем 33, подпрограмма возвращается к 'NEXT_B'.
Если свободное пространство или управляющий символ найдены, вызывается подпрограмма ПЗУ по адресу 4120 для его удаления. Длина строки, которая хранится в ВС, уменьшается и происходит переход к 'LOAD'.
7.6 Загрузка машинного кода в DATA-строку.
Длина: 179
Количество переменных: 2 Контрольная сумма: 19181 Назначение:
Эта программа создает выражение DATA в первой строке программы на БЕЙСИКе, а
затем заполняет его данными из памяти. Переменные: Имя - data start Длина - 2 Адрес - 23296
Комментарий: Адрес данных для копирования. Имя - data length Длина - 2 Адрес - 23298
Комментарий: Количество байтов для копирования. Вызов программы:
RANDOMIZE USR адрес Контроль ошибок:
Если число байтов для копирования равно 0, или первая строка уже есть, программа возвращается в БЕЙСИК. Программа не проверяет, достаточно ли памяти для новой строки. Программа требует 10 байтов на байт данных плюс пять байтов для номеров строк, указателей длины и т. д. Кроме того, используемая подпрограмма ПЗУ также использует большую рабочую область - принимайте это в расчет. Если доступной памяти недостаточно, указатели строки будут установлены неправильно, и листинг БЕЙСИКа будет недостоверен. Комментарий:
Время, занимаемое работой этой программы, пропорционально объему памяти для копирования.
ЛИСТИНГ МАШИННЫХ КОДОВ
ЧИСЛА ДЛЯ ВВОДА
LD DE,(23296) LD ВС,(23298) LD A,B OR C RET Z
LD HL,(23635) LD A, (HL) CP 0
JR NZ,CONT INC HL LD A,(HL) CP 1 RET Z DEC HL PUSH HL PUSH BC PUSH DE SUB A CALL 3976 EX DE,HL LD A,1 CALL 3976 EX DE,HL CALL 3976 EX DE,HL CALL 3976 EX DE,HL LD A,228 CALL 3976 EX DE,HL POP DE LD A,(DE) PUSH DE
237 91 0 91 237 75 2 91
120 177 200
42 83 92 126
254 0
32 6
35 126
254 1
200
43
229
197
213
151
205 136 15 235 62 1
205 136 15 235
205 135 15 235
205 135 15 235 62 228 205 135 15
235 209 26 213
LD C,47 |
14 |
47 |
INC C |
12 |
|
LD B,100 |
6 |
100 |
SUB B |
144 |
|
JR NC,HUNDR |
48 |
250 |
ADD A,В |
128 |
|
LD B,A |
71 |
|
LD A, С |
121 |
|
PUSH BC |
197 |
|
CALL 3976 |
205 |
136 |
EX DE,HL |
235 |
|
POP BC |
193 |
|
LD A,B |
120 |
|
LD C,47 |
14 |
47 |
INC C |
12 |
|
LD B,10 |
6 |
10 |
SUB B |
144 |
|
JR NC,TENS |
48 |
250 |
ADD A,B |
128 |
|
LD B, А |
71 |
|
LD A,C |
121 |
|
PUSH BC |
197 |
|
CALL 3976 |
205 |
136 |
POP BC |
193 |
|
EX DE,HL |
235 |
|
LD A,B |
120 |
|
ADD A,48 |
198 |
48 |
CALL 3976 |
205 |
136 |
EX DE,HL |
235 |
|
LD A,14 |
62 |
14 |
LD B, 6 |
6 |
6 |
PUSH BC |
197 |
|
CALL 3976 |
206 |
136 |
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 |
EX DE,HL |
235 |
|
JR NEXT B |
24 |
173 |
LD A,13 |
62 |
13 |
CALL 397 |
205 |
136 |
POP HL |
225 |
|
LD BC,0 |
1 |
0 |
INC HL |
35 |
|
INC HL |
35 |
|
LD D,H |
84 |
|
LD E,L |
93 |
|
15
15
15
15
15
LD A,(HL) CP 14
JR NZ,END?
JR POINT CP 13
JR NZ,POINT LD A,C LD (DE),A
LD (DE),A RET
Как она работает:
В пару регистров DE загружается адрес байтов для копирования, а в пару регистров ВС загружается число байтов для копирования. Если ВС содержит 0, программа возвращается в БЕЙСИК.
В пару регистров HL загружается адрес БЕЙСИК-программы. В аккумулятор загружается байт из адреса установленного в HL. Это старший байт номера строки. Если он не равен 0, первая строка не существует и программа переходит к 'CONT'. Если старший байт содержит 0, в аккумулятор загружается младший байт. Если это значение установлено в 1, первая строка уже существует и программа возвращается в БЕЙСИК.
Адрес старшего байта номера строки сохраняется на стеке. Сохраняется число байтов для копирования, затем адрес данных. В аккумулятор загружается 0 (старший байт нового номера строки). Вызванная подпрограмма ПЗУ, находящаяся по адресу 3976, вставляет символ, имеющийся в аккумуляторе, по адресу установленному в HL.
В HL восстанавливается значение, хранившееся там перед этой операцией. В аккумулятор загружается 1 и это значение вставляется 3 раза. Первая единица - это младший байт номера строки, следующие две - указатель длины строки. В аккумулятор затем загружается код символа 'DATA' и это значение вводится в строку.
Адрес следующего байта данных восстанавливается из стека и загружается в DE. Сам этот байт загружается в аккумулятор, а содержимое DE вновь сохраняется на стеке. В C-регистр загружается значение, на 1 меньшее, чем код символа "0". C-регистр увеличивается, а в B-регистр загружается значение 100. B-регистр вычитается из аккумулятора и, если результат не отрицательный, подпрограмма возвращается к 'HUNDR'.
B-регистр прибавляется к аккумулятору. Таким образом аккумулятор содержит положительное значение. Это значение затем загружается в B-регистр. В аккумулятор загружается содержимое C-регистра, а ВС сохраняется на стеке. Вызовом подпрограммы ПЗУ (3976), вставляется символ, хранящийся в аккумуляторе, по адресу, содержащемуся в HL. Пара регистров ВС восстанавливается из стека, а в аккумулятор загружается значение B-регистра. Вышеупомянутый прием затем повторяется для B=10. Аккумулятор затем увеличивается на 48 и полученный в результате символ вставляется в строку.
Вышеописанная подпрограмма делала вставку десятичного представления встречающегося байта данных в выражение DATA. Теперь должно быть вставлено двоичное представление. Это значение маркируется с помощью кода NUMBER (CHR 14), который вводится первым, а за ним 5 нулей. Значение копируемого байта помещается в ячейку, чтобы заместить третий ноль. DE увеличивается, указывая на следующий байт данных. Число байтов для копирования снимается из стека в ВС, и это значение уменьшается. Если результат равен 0, делается переход к 'ENTER', иначе содержимое пар регистров ВС и DE вторично помещается в стек, в выражение DATA включается запятая, а программа возвращается к 'NEXT_B'. В данной процедуре код ENTER (конец строки) добавляется для маркировки конца выражения DATA. В HL загружается адрес начала строки, а ВС устанавливается в 0. HL увеличивается, указывая на младший байт указателя строки, и этот новый адрес копируется в DE. HL увеличивается, указывая на старший байт указателя строки. HL и ВС затем увеличиваются, а в аккумулятор загружается символ, находящийся по адресу в HL.
Если аккумулятор содержит код 14, число найдено, то HL и ВС увеличиваются на 5, перепрыгивая через число и указывая на символ, следующий за ним. Подпрограмма затем переходит к 'POINT'.
Если аккумулятор не содержит значений 14 и 13, происходит переход к 'POINT'.
Завершение формирования строки выполняется помещением содержимого ВС в ячейку указателя длины строки. На необходимый адрес указывает DE. По окончании работы процедура выполняет возврат в БЕЙСИК.