ZX Идеи
- Вставка сообщений в лоадер
- Удаление блока из BASIC
- Перенумерация
Вставка сообщений в лоадер
На этот раз буквы стали на один символ больше, а жирность им придают двойные пиксели. Эту программу я использую не только для вставки сообщения, но и для эффективной защиты!
После ввода программа сразу защищена от MERGE. POKE для блокировки команды MERGE — 23757,-1 или какое-нибудь другое число. Но если ввести это значение, то при выполнении POKE в какой-нибудь BASIC-программе, примерно во второй строке, компьютер выдаст странную строку, которую после редактирования уже не удастся вернуть в листинг!
POKE 23757,-1 управляет длиной строк в байтах. То есть, если, например, первая строка содержит 30 байт, а мы зададим 23757,40, то получим странные символы. Как предотвратить эту блокировку? Вот как: введите в первую строку 51 байт (только проследите, чтобы последний байт вам не понадобился в программе), затем вставьте POKE 23757,50.
Итак, каков вывод?
Вывод такой: блокировку предотвращаем, вводя значения POKE, меньшие длины этой строки. Прежде чем вводить машинный код, наберите в строке 1 (после команды REM в первом листинге) 125 букв A. После ввода машинного кода из листинга 2 введите POKE 23756,0! Затем удалите строки под номерами 2, 3, 4 и 5. Сохраните полученную программу на кассету и введите POKE 23757,124. Возможно, появится строка 1, в которой будет буква A. Удалите эту строку и, если всё в порядке, наберите листинг 3.
ВНИМАНИЕ! Строку 0 удалять нельзя.
Листинг 1:
1 REM
2 FOR F=23760 TO 23879
3 INPUT I:POKE F,I:PRINT F,I
4 POKE 23609,150
5 NEXT F
Листинг 2
Листинг 3
1 BORDER 0:PAPER 0:INK 0:CLS:PRINT#0; MODIFYED by DADO Telefon:078 /49-953 LOADING :RANDOMIZE USR 23760:LOAD
Разумеется, это всего лишь пример. Вы можете задать любое сообщение! После ввода листинга 3 вставьте POKE 23884,0 — и ваш листинг будет скрыт за машинным кодом. Теперь вы хорошо защитили и машинный код, и BASIC от просмотра.
Если хотите защитить программу от команды BREAK (прерывания), введите POKE 23613,0 в листинг 3.
ПРИЛОЖЕНИЕ ПОДГОТОВИЛ:
Keser Mladen-DADO
Beogradska 11
78000 Banja Luka
Telefon: 078/49-953
Удаление блока из BASIC
Если мы хотим удалить последнюю, большую часть BASIC-программы, а в памяти компьютера нет ни серьёзной программы TOOLKIT, ни такой же подпрограммы на машинном коде, ту же задачу может выполнить всего одна строка BASIC. У этого простого решения есть и один недостаток: оно может удалять только блок в конце программы. В большинстве случаев это не обязательно является проблемой. Обратите внимание: все три команды этой подпрограммы нужно обязательно записать в одну строку.
Нельзя пропустить ни одну команду. Эта строка должна быть последней из тех, которые не будут удалены. Вот подпрограмма и пример:
10 REM
20 REM
30 REM
40 POKE 23627,PEEK 23637:POKE 23628,PEEK 23638:CLEAR 70
70 REM
80 REM
90 REM
RUN/ENTER
После выполнения этой программы строки с 70 по 90 исчезнут из программы навсегда. Будьте осторожны: подпрограмма удалит и пространство, отведённое под переменные.
Поэтому после применения подпрограммы переменные нужно инициализировать заново.
B.J.
Если вам нужно перенумеровать длинную BASIC-программу, а перед её написанием или редактированием вы не загрузили набор утилит с этой процедурой, вы наверняка знаете, что такое RENUMBER. Возможно, из-за длины самой программы вы не можете загрузить набор утилит — для него уже не осталось места в памяти. Попробуйте эту небольшую программку: возможно, она решит вашу проблему.
Запустите её командой RUN 9986 и нажмите ENTER. Программа попросит ввести начальный (новый) номер строки и шаг между строками, а затем перенумерует весь BASIC до строки с номером 9985. Предусмотрена защита, чтобы RENUMBER не затронул саму себя. Недостаток программы в том, что она не умеет перенумеровывать выражения после GO TO, GO SUB и RESTORE.
Некоторые процедуры RENUMBER не умеют этого даже при работе на машинном коде!
10 REM
14 REM
16 REM
100 REM
123 REM
9986 DEF FN p()=PEEK 23635+256*PEEK 23636
9987 DEF FN l(a)=256*PEEK a+PEEK(a+1)
9988 LET p=FN p()
9989 INPUT "Pervaya stroka:";so
9990 INPUT "Shag:";io
9991 PRINT "Staroe";TAB(10);"Novoe"
9992 LET l=FN l(p)
9993 IF l>9985 THEN STOP
9994 PRINT l;TAB(10);so
9995 POKE p,INT(so/256)
9996 POKE p+1,so-INT(so/256)*256
9997 LET so=so+io
9998 LET p=p+4+PEEK (p+2)+256*PEEK(p+3)
9999 GO TO 9992
B.J.
Поделитесь вашим мнением о статье