ZX Review
#7-8-9-10
08 ноября 1997 |
|
Ретро - 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.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября