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.