10. ЗАЩИТА ПРОГРАММ.
защита программ состоит в исключении вожможности просмо тра
текста программы и внесения в него изменений лицом, не уполно-
моченным на это автором программы.
методов защиты программ существует очень много и здесь мы
рассмотрим только основные принципы и обозначим подходы к
этой проблеме.
можно выделить три основных направления:
1. исключить возможность остановки ( прерывание работы про-
граммы ).
2. исключить возможность подачи команды list для распечатыва-
ния текста программы.
3. сделать листинг программы нечитаемым.
исключение возможности остановки программы.
самое первое, что вы должны сделать - это выполнить программу
автостартующей со строки номер n. это выполняется при выгрузке
программы командой save "имя' line n. теперь программа после за-
грузки будет сама стартовать с указанной строки. тем не менее, она
может быть остановлена командой break или по сообщению об
ошибке.
отключить клавишу break можно, если в той строке, с которой
происходит автостарт, поместить команду роке 23613. реек 23730 - 5.
если программа вами хорошо отлажена, то остановку по ошибке
можно исключить. надо помнить, что чаще всего при взломе про-
граммы сознательно вносят ошибку во время исполнения операто-
ра input. так, если программа просит от пользователя ввести какое-
либо число. он сознательно нажимает на клавишу с буквой. про-
п'амма останавливается с сообщением variable not found. реко-
мендуем не использовать оператор input, а организовывать опрос
клавиатуры на основе функции inkey$.
если в строке автостарта поместить нижеприведенные команды,
то при попытке сделать break или при появлении ошибки. про-
грамма будет сбрасываться:
let err-256*pef.k 23614+реек 23613: poke err.o: poke err+1,0
примерно тот же эффект дает помещение в стартовой строке ко-
манды роке 23659,0.
одним из способов остановки автостартующей программы явля-
ется использование команды merge "" вместо load "" при загрузке.
если ваша программа имеет размер больше 7к, то защитить ее от,
этого приема можно. если перед выг рузкой подать следующие пря-'
мые команды:
let х-256*реек 23636 + реек 23635: poke х.60: роке х+1,0
другой способ зашиты от merge состоит в том, чтобы перед вы-
грузкой вашей программы на ленту, дать ложную информацию о
том, что якобы первая строка вашей программы имеет чрезмерно
большую длину. это делается прямой командой:
роке ( реек 23635 + 256*реек 23636 + 3 >,255.
отключение команды list.
введите первой строкой программы 1 rem. перед выгрузкой про-
граммы на ленту дайте прямую команду: роке(реек 23635+256*реек
23636), 100
теперь программу можно за1 !ускать (run). но читать нельзя.
как сделать текст программы нечитаемым.
прос тейший прием, применяемой ао многих программах состоит в
том, что устанавливают одинаковым цвета символов (ink) и фона
(paper). например:
10 INK 7:PAPER 7
в тех же местах, где программа должна сделать вывод на ркран в
операторе print вставляют в качестве временных правильные цвета:
20 PRINT INK 0; " ZX SPECTRUM "
другой способ состоит в искажении набора символов путем зада-
ния "фальшиього" значения системной переменной chars попро-
буйте, например:
РОКЕ 23606, 8: PRINT "ZX SPECTRUM": POKE 23606(0
если адресовать системную переменную chars в те области памя-
ти, где вообще ничего нет, например роке 23607,200, то все символы
будут выглядеть как пробелы и на экране вообще ничего не будет
вам же нужно перед всяким оператором print включать истинное
значение chars и выключать его после prjnt.
еще один регулярно используемый прием состоит в организации
"нулевой" строки, которая реально исполняется программой, но не
может быть удалена при редактировании. чтобы первая строка ста-
ла нулевой. дайте команду:
РОКЕ 23755,0: РОКЕ 23756,0
11. ОПЕРАЦИИ С ЭКРАНОМ.
типичной. задачей для тех кто начинает создавать собственные
программы на "спектруме"является создание красочных изображе-
ний в графике высокого разрешения, хранение их в памяти компью-
тера и вывод на экран.
мы не будем рассматривать графические операции с операторами
draw, circle, plot, а также печать символов графики пользователя,
а рассмотрим операции с экраном, созданным в графическом ре-
дакторе. наиболее удобным в работе является графический редак-
тор artstudio, но можно использовать и какой-либо другой до-
ступный.
созданное в редакторе изображение вы можете выгрузить на лен-
ту в виде блока кодов, длина которого 6912 байтов. если теперь за-
грузить его командой
LOAD ""CODE 16384, 6912
то изображение сразу будет загружено на экран, но хранить его
там, естественно, нельзя. можно загрузить изображение в произ-
вольное место и вызывать его оттуда на экран по мере необходи-
мости. примем адрес для хранения картинки 30000.
LOAD ""CODE 30000, 6912
переброску на экран можно организовать в бейсике.
500 FOR 1-1 ТО 6912
510 РОКЕ 16383+1, РЕЕК 29999+1
520 NEXT I
530 RETURN
всякий раз когда вам надо вызвать изображение на экран, вы може-
те делать это командой go sub 500.
к сожалению, этот метод очень медленно работает, что связано с
ограниченными возможностями бейсика. построение экрана про-
исходит более 20 секунд.
возможность быстрой переброски экрана* (менее 1 сек.) предо-
ставляет программирование в машинном коде. процессор z-80 для
этой цели имеет мощную команду перемещения блоков ldir (ее код
237,176). для ее работы необходимо, чтобы э регистре hl процессора
находился адрес начала блока, подлежащего переброске (в нашем
случае 30000), в регистре вс-длина блока (6912), а в регистре de -ад-
рес места назначения <16384). тогда программа в машинном коде
будет выглядеть так:
МАШИННЫЙ КОД АССЕМБЛЕР КОММЕНТАРИЙ
33 48 117 LD HL, 48 117 ЗАГРУЗИТЬ В РЕГИСТР HL
АДРЕС
30000. ОБРАТИТЕ ВНИМАНИЕ НА ТО,
ЧТО 48+117*256-30000.
01 0 27 LD ВС, 0 27 ЗАГРУЗИТЬ В РЕГИСТР ВС
6912.
17 0 64 LD DE, 0 64 ЗАГРУЗИТЬ В РЕГИСТР DE
16384.
237 176 LDIR ВЫПОЛНИТЬ ПЕРЕБРОСКУ
БЛОКА В
НОВОЕ МЕСТО.
201 RET ВОЗВРАТ В ВЫЗЫВАЮЩУЮ
ПРОГРАММУ.
таким образом, программа в машинном коде выглядит так:
33, 48, 117, 1, 0, 27, 17, 0, 64, 237, 176, 201.
поместим ее в произвольное место оперативной памяти, напри-
мер начиная с адреса 65000 следующей программой написанной на
бейсике.
10 FOR 1-1 ТО 12
20 READ А
30 РОКЕ 59999+1, А
40 NEXT I
50 DATA 33, 48, 117, 1, 0, 27, 17, 0, 64, 237, 176, 201
теперь всякий раз, когда вам нужно поместить картинку на экран,
вам надо стартовать эту процедуру. что выполняется командой
randomize usr 65000.
если же у вас в памяти компьютера хранится не одно, а несколько
графических изображений, то их можно также перебрасывать на
экран этой процедурой, надо только изменить адрес, поступаю-
щий в регистр процессора hl, что можно сделать командой роке по
адресу 65001 и по адресу 65002.
предположим, что у вас есть вторая картинка, помещенная начи-
ная с адреса 37000. тогда int (37000/256)-144, а37000-256*144-136. выпол-
ним роке 65001,136 и роке 65002,144. команда randomizi usr 65000 выпол-
нит переброску второй картинки и т.д.
очевидно, что поскольку каждый экран занимает 6912 байтов, то
одновременно в памяти нельзя хранить более 6 изображений, что
во многих случиях бывает недостаточно. если учесть. что каждое
изображение имет длительные последовательности нулей. то
имеется возможность компрессировать каждое изображение. это
позволяет во многих случаях вдвое сократить обьем памяти, зани-
маемой графикой, а иногда даже больше.
мы предлагаем вашему вниманию две процедуры в машинном ко-
де. первая процедура называется fn s и служит для компрессирова-
ния изображения с экрана и размещения его в заданном пользова-
телем адресе. она имеет два параметра ниц которые задают адрес
для хранения экрана. н - старший байт адреса, a l - младший байт.
сама процедура fn s расположена начиная с адреса 56600. длина-60
байтов.
вторая процедура fn т служит для декомпрессирования изобра-
жения и переброски его на экран. она имеет два тех же параметра
h,l. адрес размещения этой процедуры - 56500. длина-40 байтов.
чтобы создать процедуру fn s, вам надо набрать и запустить следу-
ющую бейсик- программу. после того как она отработает, выгрузите
созданную процедуру на ленту командой save "fns" code 56600,60 и в
дальнейшем можете использовать в своих программах. точно так
же исполняется копия процедуры fn т: save tnt" code 56500,40
процедура fn s
8300 LET B-56600: LET L-60: LET Z-0: RESTORE 8310
8301 FOR 1-0 TO L-l: READ A
8302 R0KE (B+I), A: LET Z-Z+A
8303 NEXT I
8304 LET Z-INT(((Z/L)-INT(Z/L))*L)
8305 READ A:IF AZ THEN PRINT"???": STOP
8310 DATA 42, 11, 92, 1, 4
8311 DATA 0, 9, 86, 14, 8
8312 DATA 9, 94, 237, 83. 82
8313 DATA 221, 33, 0. 64, 6
8314 DATA 1, 126, 44, 32, 8
8315 DATA 36. 245, 124, 254, 91
8316 DATA 40. 16, 241, 78, 185
8317 DATA 32, 4, 4, 32, 238
8318 DATA 5» 18, 19, 120. 18
8319 DATA 19. 24, 227, 241. 18
8320 DATA 19. 120, 18, 237, 83
8321 DATA 22, 221, 201, О, 0
8322 DATA 56. 0, 0,0, 0
после того. как процедура выполнит компрессирование экрана и
перебросит его в место. отведенное д ля длительного хранения, вы
можете узнать адрес. в который можно помещать следующий эк-
ран. print реек 232%+256*ребк 23297. но помните, что делать это можно
только немедленно после окончания компрессирования и перебро-
ски блока.
процедура fn t
8350 LET 8*56500: LET. L-35: 1ЕТ Z-0: RESTORE 8360
8351 FOR 1*0 TO L-l : READ A
8352 POKE (B+I), A: LET Z-Z+A
8353 NEXT I
8354 LET ZMNT(((Z/L)-INT<Z/L))*L)
8355 READ A: IF AZ THEN PRINT "???": STOP
8360 DATA 42, 11, 92, 1, 4
8361 DATA 0, 9, 86, 14, 8
8362 DATA 9, 94, 33, 0, 64
8363 DATA 26, 245, 19, 26, 19
83J64 DATA 71, 2'41, 119, 35, 16
8365 DATA 252, 124, 254, 91, 32
8366 DATA 240, 201, 0, 0. 0
8367 DATA 28, 0, 0, 0, 0
пример применения процедур компрессии идекопрессии:
предположим. что вам надо компрессировать и отправить на хра-
нение три экрана scr1.scr2, scr3, причем первый из них идет в адрес
30000(48.117).
тогда программа будет выглядеть так:
10 DEF FN S(H,L) -USR 56600
20 DEF FN T(H,L) -USR 56500
100 LET A-23296: LET B=23297
110 LET HI—117: LET 11=48
120 LET AD-Ll+(HI*256)
130 PRINT AD: LOAD "SCR140DE 16384,6912
140 RANDOMIZE FN S(H1,L1)
150 LET 12-PEEK A: LET H2-PEEK В
155 LET AD-L2+H2*256
160 PRINT AD: LOAD "SCR240DE 16384,6912
170 RAMDOMIZE FN S (H2,L2)
180 LET L3-PEEK A: LET НЗ-РЕЕК В
185 LET AD-L3+256*H3
190 PRINT AD: LOAD "SCR340DE 16384,6912
200 RAMDOMIZE FN S(H3.L3)
210 PAUSE 50
300 RAMDOMIZE FN T(Hl,Ll)
310 PAUSE 50
320 RAMDOMIZE FN T(H2,L2)
330 PAUSE 50
340 RAMDOMiZE-FN T(b3,L3)
350 PAUSE 50: GO TO 300