8.7. Поиск и замещение строки
Длина: 85
Количество переменных: 3
Контрольная сумма: 8518
Назначение: программа ищет
символьную строку в БЕЙСИК-прог-
рамме и делает замену каждой
найденной строки стринга на дру-
гую строку такой же длины.
Переменные:
Имя: old data start
Длина: 2
Ячейка: 23296
Комментарий: адрес первого
байта замещаемой строки.
Имя: string length
Длина: 1
Ячейка: 23298
Комментарий: длина замещае-
мой строки.
Имя: new data start
Длина: 2
Ячейка: 23299
Комментарий: адрес первого
байта замещающей строки.
Вызов подпрограммы:
RANDOMIZE USR адрес
Контроль ошибок: если длина
строки равна 0 или БЕЙСИК-прог-
раммы в памяти нет, то процеду-
ра возвращается непосредственно
в BASIC.
Комментарий: время выполнения
этой программы зависит от длины
строки и от длины БЕЙСИК-прог-
раммы.
ЛИСТИНГ МАШИННЫХ КОДОВ
МЕТКА АССЕМБЛЕР ЧИСЛА ДЛЯ ВВОДА147.
LD IX,(23296) 221 42 0 91
LD HL,(23635) 42 83 92
LD A,(23298) 58 2 91
LD E,A 95
CP 0 254 0
RET Z 200
DEC HL 43
NEWLIN INC HL 35
INC HL 35
INC HL 35
INC HL 35
JR RESET 24 23
CHECK INC HL 35
PUSH DE 213
LD DE,(23627) 237 91 75 92
AND A 167
SBC HL,DE 237 82
ADD HL,DE 25
POP DE 209
RET NC 208
LD A,(HL) 126
CP 13 254 13
JR Z,NEWLIN 40 233
CALL 6326 205 182 24
JR NZ,COMPAR 32 8
DEC HL 43
RESET PUSH IX 221 229
POP BC 193
LD D,0 22 0
JR CHECK 24 226
COMPAR LD A,(BC) 10
CP (HL) 190
JR NZ,RESET 32 245
INC BC 3
INC D 20
LD A,L 122
CP E 187
JR NZ,CHECK 32 216
PUSH HL 229
LD D,0 22 0
AND A 167
SBC HL,DE 237 82
LD D,E 83
LD BC,(23299) 237 75 3 91
INC D 20
NEXT_CHINC HL 35
DEC D 21
JR Z,FINISH 40 5
LD A,(BC) 10
LD (HL),A 119
INC BC 3
JR NEXT_C 24 247
FINISH POP HL 225
JR RESET 24 215
2
Как она работает:
В IX загружается адрес заме-
щающей строки. Это значение дол-
жно быть выше RAMTOP. В HL заг-
ружается адрес начала програм-
мной области, а в аккумулятор
загружается длина строки, кото-
рая копируется в E-регистр для
дальнейшего использования в
программе. Если длина строки
равна 0, программа возвращается
в BASIC.
Устанавливается HL, указывая
на старший байт следующего ука-
зателя БЕЙСИК-строки, и делается
переход к RESET.
В процедуре CHECK HL увели-
чивается, указывая на следующий
символ. DE сохраняется в стеке и
загружается адресом области пе-
ременных. Если HL не меньше, чем
DE, конец программы достигнут, и
после восстановления DE из сте-
ка программа возвращается в
BASIC.
В аккумулятор загружается сим-
вол по адресу в HL. Если это
значение является знаком ENTER,
программа возвращается к NEWLIN.
Если аккумулятор не содержит
знак NUMBER (символ 14), делает-
ся переход к COMPAR, иначе HL
увеличивается на 5, так что HL
указывает на пятый байт найден-
ного числа.
В процедуре RESET в BC загру-
жается адрес строки для поиска.
Регистр D устанавливается в 0
для хранения количества симво-
лов в строке, найденной к тому
времени. Программа затем возвра-
щается к CHECK.
В процедуре COMPARE в аккуму-
лятор загружается символ строки,
на который указывает пара регис-
тров BC. Если это значение отли-
чается от байта по адресу в HL,
программа переходит к RESET. BC
увеличивается, указывая на сле-
дующий символ в строке, регистр
D, счетчик, увеличивается. Если
это значение не равно длине
строки, программа возвращается к
CHECK.
Если строка найдена, HL сохра-
няется в стеке, так что програм-
ма начинает поиск для следующе-
го случая с этого адреса. В DE
загружается длина строки и это
значение вычитается из HL, да-
вая значение на единицу меньше,
чем стартовый адрес. Длина стро-
ки затем загружается в D для ис-
пользования ее в качестве счет-
чика. В BC загружается старто-
вый адрес замещающей строки, а
регистр D увеличивается. Ре-
гистр HL увеличивается, указы-
вая на следующую ячейку, а счет-
чик уменьшается.
Если счетчик равен 0, HL вос-
станавливается из стека и де-
лается переход к RESET для сле-
дующего случая. В аккумулятор
загружается символ, на который
указывает BC, и это значение по-
мещается в ячейку по адресу в
HL. BC увеличивается, указывая
на следующий символ, а програм-
ма возвращается в NEXT_CHAR.