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.