ZX-Ревю 1993 №1-2 1992 г.

Спектрум в школе - мы подготовили сегодня программу "МОЗАИКА". Ее можно применять на уроках информатики.


Темы статьи: Программирование  

СПЕКТРУМ В ШКОЛЕ

Для тех, кто использует компьютеры семейства "ZX-Spectrum" в школьных учреждениях, мы подготовили сегодня программу "МОЗАИКА". Интересным, на наш взгляд, в ней является то, что это программа двойного назначения. Ее можно применять на уроках информатики как в старших классах, так и в младших.

Более опытные ученики смогут набрать текст этой программы и отладить ее, а для младших школьников она явится замечательным первым шагом в компьютеризацию, поскольку поможет легко наладить процесс общения с компьютером и сделать его радостным.

У нас есть положительный опыт работы с этой программой шестилетних детей, которые без труда освоили всю необходимую технику управления.

Не лишним также будет отметить и тот факт, что применима эта программа не только в школе, но и конечно дома. В этом случае она доставит много приятных минут и детям и их родителям. Не пожалейте несколько утренних часов. Ваш сын или дочь на всю жизнь запомнят этот воскресный день.

Дополнительный интерес в этой программе представляет и то, что при ее наборе Вам предстоит ознакомиться со многими профессиональными приемами, например с подгрузкой своего знакогенератора, с организацией перехода по ошибкам ON ERROR GO TO, с работой шестнадцатиричного загрузчика, с организацией в программе нулевой строки, с заполнением этой строки блоком кодов REM FILL, с адаптацией программы под БЕТА-ДИСК-интерфейс и т.д. и т.п. Все эти вопросы здесь последовательно разобраны, но Вам могут (если Вы пожелаете) пригодиться ранее выпущенные нами сборники "ZX-РЕВЮ" за прошлые годы.

"ИНФОРКОМ" предоставляет Вам возможность заказать и получить по почте сборники '^-РЕВЮ-91" и '^-РЕВЮ-92", выполненные в виде аккуратных книжек стандартного формата. Наш адрес Вам известен.

Те, кто не хочет связываться с почтой, смогут приобрести их лично на нашем корпункте по адресу: г. Москва, ул. Новый Арбат (бывший просп. Калинина), д.2, о/с Г-19. На первом этаже Вы найдете нас по вывеске "ZX-РЕВЮ".

ПРОГРАММА "МОЗАИКА"

В магазинах игрушек продается игра под названием "МОЗАИКА". Кто в детстве не играл в нее? В панель с отверстиями вставляются разноцветные фишки, которые образуют рисунок. Сегодня вниманию читателей предлагается компьютерный вариант этой игры. Программа может использоваться не только в младших классах школы, но даже в дошкольных учреждениях.

По существу это простейший в управлении графический редактор. Освоить профессиональный графический редактор, такой, как, например "ARTIST" или "ARTSTUDIO", ребенок не в состоянии, а программа "МОЗАИКА" поможет ему приобщиться к "компьютерной графике". В то же время, эта программа приучит ребенка пользоваться функциональными клавишами переключения цвета чернил, бумаги, режима работы "графика - текст" и т.п., то есть будет пройден "курс подготовки" перед освоением в будущем более сложных программ.

Issue #16: Third Impact

Для того, чтобы в деталях понять многие моменты, используемые в этой программе, следует обратиться к циклу ряда статей, опубликованных под рубрикой "Профессиональный подход" в ZX-РЕВЮ в 1992 году (см. стр. 113-116, 193-202, 241-248). Однако, если у Вас нет возможности ознакомиться с этими материалами, или нет желания вдаваться в подробности работы программы, Вы можете получить готовую программу, если будете строго придерживаться указаний по набору Бейсик программы и блоков кодов.

Теперь несколько слов о том, что же может эта программа. Для простоты пользования в программе не применяется полностью графический режим, при помощи которого можно рисовать линии, окружности и т.д. Применяется только псевдографика, позволяющая печатать какой-либо символ в то знакоместо экрана, где находятся курсор. Символьный набор же сделан такой, что при нажатии буквенных клавиш, печатаются всевозможные символы: кружочки (это прежде всего, как в обычной игре "Мозаика"), а также квадратики, треугольнички, крестики и т.д., (насколько хватает фантазии) по количеству буквенных клавиш.

Изображение строится, например, из кружочков, как в игре "Мозаика" из круглых фишек, но в отличие от прототипа, можно использовать "фишки" разной формы и к тому же не беспокоиться о том, что фишек нужного цвета не хватит для желаемого рисунка.

Символьный набор для игры построен таким образом, что переключившись в режим CAPS LOCK, можно печатать буквы русского алфавита. Этот режим нужен не для того, чтобы использовать программу в качестве текстового редактора, а для того, чтобы можно было подписать рисунок.

Для перемещения курсора по экрану используются функциональные клавиши перемещения курсора, а при помощи других функциональных клавиш производится переключение цвета чернил, бумаги, бордюра, включение и выключение режимов повышенной яркости и инверсии. При распределении этих функции между клавишами, ориентир был сделан на удобство пользования для клавиатуры "SPECTRUM+" или что то же самое, отечественного компьютера "ДЕЛЬТА-C". (Хотя это распределение Вы можете изменить на свой вкус.)

Краткая инструкция по пользованию программой всегда находится в памяти компьютера и в любой момент может быть вызвана на экран при нажатии BREAK, при этом изображение с экрана запоминается и после просмотра инструкции возвращается обратно на экран.

В программе предусмотрена возможность сохранения рисунка на внешнем носителе (магнитная лента, дискета) и загрузки рисунка с внешнего носителя. Предусмотрена также возможность оперативного сохранения рисунка в специальном буфере в памяти компьютера. С этим буфером можно производить следующие манипуляции: переслать рисунок с экрана в буфер, вызвать рисунок из буфера на экран, а также обменять содержимое экрана и буфера между собой.

После того, как работа над рисунком закончена, можно насладиться результатами своего труда под музыкальное сопровождение компьютера, нажав ENTER.

Для дальнейшей работы, при необходимости, может быть произведена очистка экрана.

Теперь, когда мы кратко ознакомились с возможностями программы "МОЗАИКА", можно переводить к подробному описанию программы. Она набрана на Бейсике, но в ней используются фрагменты в машинных кодах, в частности те, о которых говорилось в "ZX-РЕВЮ", см. выше.

Учитывая тот факт, что у многих пользователей имеется "БЕТА-ДИСК интерфейс", программа построена таким образом, что адаптация ее под "БЕТА-ДИСК" сводится к минимуму. Об этом будет подробный разговор в конце статьи.

Кроме Бейсик-файла и файла в машинных кодах для работы программы необходимо подготовить например, при помощи "ARTSTUDIO", заставку-картинку, на которой будет содержаться краткая инструкция по клавишам управления программой. Форма, цвет, размер шрифта, окружающее оформление - произвольное, пусть его Вам подскажет Ваша фантазия, но там кроме названия программы должна быть следующая информация:

КЛАВИШИ УПРАВЛЕНИЯ:

[BREAK] -Вызов инструкции

[E.MODE] -Смена цвета чернил

[GRAPH] -Изменение яркости

[EDIT] -Смена цвета бумаги

[INV.V.] -Инверсия вкл./выкл.

[TR. V.] -Смена цвета бордюра

[DELETE] -Забой символа

[ENTER] -Просмотр рисунка

[C.LOCK] -Режим графика/текст

Буквенные клавиши - граф.символы ^Б^буквенные клавиши, а также [SS]+2,0,Y,U,D - русские буквы

STOP

[SS]+A

- Очистка экрана

<=

[SS]+Q

- Запоминание экрана

> =

[SS]+E

- Экран из буфера

<>

[SS]+W

- Обмен экран/буфер

[SS]+I

- Загрузка экрана

[SS]+S

- Запись экрана

Подготовив файл с этой картинкой-инструкцией, запишите его на магнитофон под именем "mozaik $" CODE 16384,6912.

Кроме этого надо подготовить еще один кодовый файл для работы программы. Это будет "mozaik" CODE 63824,1584. Сюда входят следующие коды:

Во-первых, это символьный набор, содержащий русские буквы и графические образы, причем кодам с 64 по 95 (заглавные латинские буквы) соответствуют русские буквы, а кодам с 96 по 127 (строчные латинские буквы) соответствуют графические символы. Русские буквы в символьном наборе следует расположить в соответствии с тем, как подписана Ваша клавиатура. Можно, например, в соответствии с кодами КОИ-7: "ЯВЕРТЫ...", а можно в соответствии с клавиатурой пишущей машинки: "ЙЦУКЕН...". Поскольку программа не претендует на стыковку с принтером в литерном режиме, то возможен любой вариант. Из-за того, что на "Спектруме" меньше клавишей, чем на пишущей машинке, часто применяется вариант со смещенным верхним рядом "ЦУКЕНГ...". В общем, как Вам нравится, так и делайте. Для примера ниже приведен символьный набор в кодах КОИ-7 (имеется в виду только соответствие заглавным латинским буквам, так как на месте строчных букв находятся графические символы "МОЗАИКИ"). Переставить русские буквы в соответствии с тем, как отмаркированы клавиши Вашего компьютера очень просто при помощи программы "ARTSTUDIO". В ней для этого предусмотрена специальная возможность. Надо загрузить предлагаемый символьный набор в "ARTSTUDIO", затем в текстовом режиме, начиная из левого верхнего угла, напечатать 32 русские буквы в соответствии с требуемым новым порядком расположения, а затем, задав окно вокруг этих напечатанных букв скопировать их с экрана в символьный набор, начиная с символа "@", пользуясь операцией CAPTURE FONT меню FONT EDITOR.

Сразу же за символьным набором следует блок UDG-графики. Правда, используется в программе всего лишь один символ UDG - "А", однако нет гарантии, что в дальнейшем программа не будет усовершенствоваться, поэтому зарезервирован полный объем UDG-блока, 168 байт.

Кроме символьного набора и UDG-блока в кодовом файле расположен блок кодов "ON ERROR GO TO" (см. "ZX-РЕВЮ" N 5-6 за 1992 г. стр. 113). Затем идут два небольших блока, длиной по 32 байта каждый, воспроизводящие звуковые эффекты, (см. "ZX-РЕВЮ" N 11-12

за 1992 г. стр. 241).

Далее расположено несколько блоков кодов, осуществляющих переброску из экрана в память или из памяти на экран. Для простой переброски используется команда LDIR, и тогда процедура переброски будет выглядеть следующим образом:

LD HL,16384 адрес экрана LD ВС,6912 длина кодов LD DE,50000 адрес буфера LDIR RET

Такой блок кодов имеет длину 12 байт и может быть загружен в любое место памяти. Разумеется, при переброске экрана в буфер, содержимое последнего будет уничтожено, как и содержимое экрана будет уничтожено при переброске буфера на экран. Для того, чтобы обменять содержимое экрана и буфера без уничтожения обоих, применяется другая процедура. Она взята из программы "SUPERCODE" (N 27): LD DE,#C350 (1) LD HL,#4000 LD B,#1B (2)

PUSH BC (5)

LD B,#00 (4)

LD A,(HL) (5)

PUSH AF

LD A,(DE) (6)

LD (HL),A (7)

POP AF (8)

LD (DE),A INC HL (9)

INC DE

DJNZ #AB0B (10)

POP BC (11)

DJNZ #AB08 (12)

RET

Блок кодов имеет длину 25 байт. Его можно загружать в любое место памяти. Адрес загрузки является адресом старта. Адрес начала дисплейного файла экрана задан в регистре HL, а начало буфера - в регистре DE (1). Основу блока составляет процедура обмена содержимого одной пары ячеек экрана и буфера (5)-(9). Сначала в аккумулятор загружается содержимое ячейки экрана (5) и отправляется для хранения на стек. Затем в аккумулятор загружается содержимое соответствующей ячейки буфера (6) и из него перегружается в ячейку экрана (7). После этого в аккумулятор со стека считывается запомненное значение экранной ячейки (8) и записывается в буфер. После завершения обмена ячеек содержимое регистров HL и DE увеличиваются на единицу (9) для перехода к следующей паре ячеек.

Для полной переброски дисплейного файла вместе с атрибутами надо эту последовательность действий повторить 6912 раз. Это осуществляется двумя циклами (один внутри другого). Внутренний цикл (4)-( 10) организован с максимально возможным числом повторений (в счетчик цикла - регистр B записывается 0, что соответствует 256 повторениям). Внешний цикл должен содержать, таким образом 5912/256 -27 (или #1В) повторений. Внешний цикл - (2)-( 12). Так как и во внутреннем и во внешнем циклах счетчиком числа повторений является регистр B, то для того, чтобы значение регистра B не терялось при переходе от внешнего цикла ко внутреннему, оно запоминается на стеке (3) и снимается для контроля при переходе к внешнему циклу (11).

Далее - возврат в вызывающую программу.

Перед первым запуском этого блока кодов необходимо позаботиться о том, чтобы в буфере находились атрибуты белого экрана. Иначе, если буфер содержал, например, нули, то после переброски экран станет черный.

При однократном выполнении этого блока кодов происходит смена изображения экрана и буфера. При следующем выполнении восстанавливаются прежние изображения. Это используется, например, для вызова на экран, инструкции и сохранения при этом рисунка.

Для организации разнообразных обменов между экраном и буферами есть два варианта. Первый: иметь один блок кодов для простой переброски и один блок кодов для обмена экрана и буфера. А перед выполнением требуемой переброски подставлять в нужные ячейки памяти (при помощи Бейсика) соответствующие числа, задавая параметры HL и DE. Но учитывая небольшую длину кодовых блоков, их можно заготовить такое количество, какое потребуется для всевозможных перебросок (подготовка исходных параметров при помощи Бейсика съест больше памяти). Поэтому в программе используются несколько блоков для переброски.

Еще в кодовом файле "mozaik" CODE находится машиннокодовый музыкальный фрагмент, воспроизводящий знакомую мелодию. Он подготовлен при помощи музыкального редактора "WHAM".

Для того, чтобы Вы могли полностью воспроизвести у себя программу "МОЗАИКА", ниже приведены все используемые в программе блоки кодов.

Рассмотрим распределение памяти при работе программы "МОЗАИКА ". RAMTOP при старте программы устанавливается равным 49999.

Буфер, зарезервированный для запоминания экрана 6912 байт

50000

Буфер, зарезервированный 56912 для хранения титульной заставки (инструкции)

6912 байт

Символьный набор

7 68 байт

63824

Блок UDG-графики

168 байт

64592

Блок ON ERROR GO TO

7 3 байта

64760

Звук SOUND 1

32 байта

64833

Звук SOUND 2

32 байта

64865

Процедура для переброски экрана в буфер

12 байт

64897

Процедура для переброски буфера на экран

12 байт

64909

Процедура для обмена экрана и буфера

25 байт

64921

Процедура для переброски инструкции (заставки) из памяти на экран

12 байт

64946

Обмен экрана и заставки 25 байт

64958

Музыкальный фрагмент 52 5 байт

64983

65508

Теперь, когда мы разобрались в общих чертах с кодами, можно приступить к описанию Бейсиковского файла программы "МОЗАИКА". Текстовые сообщения на русском языке в листинге программы напечатаны по-русски, хотя так на самом деле не выглядят. Это сделано только для удобочитаемости программы. По-русски они будут выглядеть после переключения символьного набора при работе программы.

1 GO TO 100

2 BORDER 7: PAPER 7: INK 0: CLEAR 49999: POKE 23739,111: LOAD "mozaik $"CODE 16364

3 LOAD "mozaik"CODE 63834

4 RANDOMIZE USR 64946: GO SUB 7: GO SUB 20: CLS : RANDOMIZE USR 64897: RUN

5 SAVE "MOZAIK" LINE 2: SAVE "mozaik $"CODE 56912,6912: SAVE "mozaik"CODE 63824,1684

6 VERIFY "MOZAIK": VERIFY "mozaik $"CODE : VERIFY "mozaik"CODE : GO TO 9999

7 POKE 23675,80: POKE 23676,252: RETURN : REM udg

8 POKE 23606,80: POKE 23607,248: RETURN : REM rus

9 POKE 23606,0: POKE 23607,50: RETURN : REM lat

10 POKE 64813,PEEK 23670: POKE 64813,PEEK 23671: RANDOMIZE USR 64760: RETURN : REM err 20 GO SUB 8: PRINT AT 1,0; INK 7; PAPER 1; BRIGHT 1; FLASH 1;" нажмите любую клавишу

22 BEEP .1,26: BEEP .1,20 24 RANDOMIZE 29: GO SUB 10: PAUSE 0

29 RETURN

30 BORDER 7: INPUT ;: PRINT PAPER 7; INVERSE 0; AT 0,0;" "

39 RETURN

40 IF x>31 THEN LET x=0: LET y=y+1 42 IF x<0 THEN LET x=31: LET y=y-1 44 IF y>21 THEN LET y=1

46 IF y<1 THEN LET y=21

49 RETURN

50 GO SUB 30

52 PRINT AT 0,0:" введите имя (макс.10 символов) " 54 GO SUB 9: INPUT LINE f$: IF f$="" THEN LET f$="$" 56 GO SUB 30

59 RETURN

60 GO SUB 8: PRINT AT 0,0; INK 7; PAPER 2; BRIGHT 1; FLASH 1; " ошибка !

": BEEP 1,0: PAUSE 0

69 RETURN

70 RANDOMIZE 60: GO SUB 10: LOAD f$ CODE 16384

79 RETURN

80 RANDOMIZE 60: GO SUB 10: SAVE f$ CODE 16384,6912 89 RETURN

100 LET y=20: LET x=3: LET bb=3: LET p=7: LET i=2: LET b=1: LET f=0: LET v=0 1000 RANDOMIZE 1000: GO SUB 10:BORDER bb: INPUT ;: GO SUB 8

1010 PRINT PAPER 7; INK 0; BRIGHT 0; INVERSE 0;AT 0,0; " чернила- яркость- бумага- " 1020 PRINT INK i; PAPER p; BRIGHT b; INVERSE v; AT 0,10; CHR$ 143 ; AT 0,29;" "; INK 7;AT

0,20; INVERSE 1;" "; 1100 GO SUB 40

1110 PRINT OVER 1; PAPER 8; INK 8; BRIGHT 8; FLASH f; INVERSE v;AT y,x;"A";CHR$ 8;: REM A-GRAPH

1200 RANDOMIZE 2000: GO SUB 10:PAUSE 0: LET i$=INKEY$

1210 PRINT OVER 1; PAPER 8; INK 8; BRIGHT 8; FLASH 0; INVERSE v; "A";CHR$ 8;: REM A-GRAPH

1300 RANDOMIZE 1000: GO SUB 10

1310 IF CODE INKEY$=8 THEN LET x=x-1: GO TO 1100

1320 IF CODE INKEY$=9 THEN LET x=x+1: GO TO 1100

1330 IF CODE INKEY$=10 THEN LET y=y+1: GO TO 1100

1340 IF CODE INKEY$=11 THEN LET y=y-1: GO TO 1100

1350 IF CODE INKEY$=12 THEN LET x=x-f: GO SUB 40: PRINT AT y,x;" ": RANDOMIZE USR 64865: GO TO 1100

1360 IF INKEY$=" " THEN PRINT AT y,x;" ": RANDOMIZE USR 64833:LET x=x+1: GO TO 1100

1365 IF INKEY$="!" AND p+1=0 THEN GO TO 9999

1370 IF i$=" AND " THEN LET i$="[": REM TOKEN

1380 IF i$=" STEP " THEN LET i$="": REM TOKEN

1390 IF i$=" OR " THEN LET i$="]": REM TOKEN

1400 IF i$=" " AND i$<="z" THEN PRINT PAPER p; INK i; BRIGHT b; INVERSE v;i$;: RANDOMIZE USR

64833: LET x=x+f: GO TO 1100 1410 IF i$=" NOT " THEN GO SUB 50: GO SUB 80: REM TOKEN

1420 IF i$=" AT " THEN GO SUB 50: GO SUB 70: REM TOKEN

1430 IF i$="<=" THEN GO SUB 30: RANDOMIZE USR 64897: PRINT AT 0,0;

" экран в памяти ": BEEP 0.1,26: PAUSE 50

1440 IF i$=">=" THEN GO SUB 30:RANDOMIZE USR 64909: BEEP 0.1,20 1450 IF i$="<>" THEN GO SUB 30: RANDOMIZE USR 64921: BEEP 0.1,26: BEEP 0.1,20 1460 IF i$=" STOP " THEN CLS 1470 IF CODE i$=15 THEN LET b=b=0 1480 IF CODE i$=5 THEH LET v=v=0 1490 IF CODE i$=6 THEN LET f=f=0: POKE 23658,8*(2-f) 1500 IF CODE i$=14 THEN LET i=(1+1)*(i<7) 1510 IF CODE i$=7 THEN LET p=(p+1)*(p<7) 1520 IF CODE i$=4 THEN LET bb=(bb+1)*(bb<7)

1530 IF CODE i$=13 THEN GO SUB 30: FOR c=0 TO 50: NEXT c: RANDOMIZE USR 64983

1999 GO TO 1000

2000 BORDER 7: INPUT ;

2010 RANDOMIZE USR 64958: BEEP .1,36: BEEP .1,20 2020 RANDOMIZE 2030: GO SUB 10:PAUSE 0 2030 RANDOMIZE USE 64958: BEEP .1,26: BEEP .1,20 2040 BORDER bb: INPUT ;: GO TO 1200 9999 GO SUB 9: BORDER 7: POKE 23658,16

Переменные, применяемые в программе: y - вертикальная координата курсора (строка) x - горизонтальная координата курсора (колонка) bb - цвет бордюра p - цвет бумаги (PAPER) i - цвет чернил (INK) b - яркость (BRIGHT) f - мигание (FLASH) v - инверсия (INVERSE) i$ - нажатая клавиша

Автостарт программы происходит со строки 2. Здесь задаются цвета экрана и резервируется место для работы блока кодов программы. Кроме этого, при помощи РОКЕ отменяется вывод на экран сообщений типа: "Bytes:" при загрузке блоков кодов. Первый загружаемый блок - это заставка-инструкция, и благодаря этому РОКЕ при загрузке следующего кодового файла (в строке 3) экран не будет испорчен. Этот прием уже был описан на страницах "РЕВЮ".

В строке 4 заставка-инструкция при помощи блока машинных кодов (смотри распределение памяти выше) перебрасывается в буфер для хранения инструкции (в адрес 56912). Далее подпрограмма GO SUB 7 производит переключение блока UDG на загруженные коды. Выполняется подпрограмма GO SUB 20, выводящая на экран табличку "нажмите любую клавишу" (место для вывода таблички назначьте такое, чтобы она не уничтожала информации на экране). Звуковой сигнал говорит о том, что загрузка программы завершена и она ждет команды начала работы. Программа останавливается на PAUSE 0 в строке 24, а непосредственно перед паузой конструкция: RANDOMIZE 29: GO SUB 10 задает параметр для работы кодового блока "ON ERROR GO TO", что означает переход в случае ошибки (нажатии BREAK) на строку с номером 29. То есть при нажатии любой клавиши, в том числе и BREAK, будет выполнен возврат на строку 4. При этом происходит следующее. Очищается экран и в этот момент содержимое этого чистого экрана засылается в буфер экрана (в адрес 50000), подготавливая таким образом атрибуты изображения в буфере в случае последующего обмена экрана и буфера, чтобы экран после обмена не выглядел черным. Теперь подготовка завершена и происходят старт программы точно так же, как Вы будете это делать после остановки программы - командой RUN.

По команде RUN происходит старт программы с первой строки, которая переадресует на строку 100. В строках до 100 расположены различные подпрограммы; их назначение будет рассмотрено в процессе описания. В строке 100 присваиваются первоначальные значения переменным, используемым в программе. После этого начинается собственно

выполнение основной части программы.

Строка 1000 является базовой, на нее может быть сделан переход из различных мест программы, поэтому в начале этой строки задается переход на нее же в случае ошибки, которая может возникнуть при работе программы. Далее задается цвет бордюра и происходит окрашивание в цвет бордюра двух системных строк экрана. Они для создания рисунка недоступны. Подпрограмма GO SUB 8 производит переключение символьного набора на тот, который загружен, с графическими образами и русскими буквами.

Строки 1010 и 1020 выводят в верхней части экрана индикаторную строку, в которой отображается текущее состояние цветов чернил и бумаги, а также значение яркости. Индикаторная строка также недоступна для создания рисунка.

Строка 1100 также является базовой. На нее также происходят переходы из различных мест программы. На нее замыкается малый цикл опроса клавишей в который входят опрос курсорных клавишей, клавиши забоя, пробела и буквенных клавишей. Поскольку быстродействие Бейсика невелико, такой прием позволил реализовать вполне приемлемое быстродействие при перемещении курсора и печатании символов.

Подпрограмма GO SUB 40 - это контроль положения курсора. При перемещении курсора, при достижении правого края экрана происходит переход на левый край но на следующей строке экрана (строка 40 программы). При достижении левого края - курсор перескакивает на правый край на предыдущую строку экрана (строка 42). При вертикальных перемещениях курсора изменения номера колонки не происходит (строки 44,46).

Строка 1110 выводит на экран курсор. Его изображение закреплено за символом "А" UDG-графики. Цвет курсора определяется теми атрибутами, которые установлены для этого знакоместа. Если там ничего еще не нарисовано, то это белая бумага и черные чернила. Однако, если в этом знакоместе уже напечатан какой либо символ, то цвет курсора будет зависеть от атрибутов этого знакоместа. Кроме того, курсор печатается в режиме OVER 1, поэтому он накладывается на символ, находящийся в этом знакоместе. Вид курсора будет меняться в зависимости от включенного режима инверсии, а также от параметра мигания. Забегая вперед, скажу, что мигание курсора свидетельствует о переключении из режима "графика" в режим "текст". Или иными словами, это включение режима CAPS LOCK.

В строке 1200 происходит ожидание нажатия клавиши. Так как это может быть клавиша BREAK, то на этот случай задается переход на строку 2000, где происходит вывод на экран инструкции. Это делается так. В строке 2000 устанавливается белый цвет бордюра и двух нижних строк экрана, затем (2010) при помощи кодового блока происходит обмен содержимого экрана и буфера инструкции, затем звуковой сигнал и пауза для ожидания нажатия любой клавиши (2020). Но непосредственно перед паузой - установка блока ON ERROR GO TO на следующую после паузы строку. Теперь при нажатии на любую клавишу, в том числе и на клавишу BREAK, произойдет переход на строку 2030, то есть будет продолжено выполнение программы. Еще раз происходит обращение к кодовому блоку, в результате чего происходят восстановление рисунка на экране, а инструкция отправляется назад в свой буфер. Далее - звуковой сигнал, восстановление цвета бордюра и двух нижних строк экрана. Затем возврат в то место программы, откуда был сделан переход на 2000-ю строку, то есть на строку 1200.

Если в строке 1200 нажата не клавиша BREAK, то продолжается выполнение программы со строки 1210. Здесь еще раз происходит печать курсора в режиме OVER 1, в результате чего восстанавливается прежнее изображение в этом знакоместе.

Со строки 1300 начинается определение действий в зависимости от нажатой клавиши. Строки 1310-1340 определяют перемещение курсора.

Строка 1350 - удаление символа в текущем знакоместе. Причем в зависимости от того, в каком режиме находится программа: в графическом или в текстовом, забой действует по-разному. В графическом режиме удаляется символ в позиции курсора, а в текстовом - символ слева от курсора, так привычнее при печати текста. Текущий режим "графика" или "текст" определяется по миганию курсора. Если показатель мигания f=0, то режим "графика", а если f=1, то режим "текст". В зависимости от этого происходит или нет изменение текущей координаты "x" курсора. Удаление символа происходит путем печати пробела в позиции с текущими координатами, что сопровождается соответствующим звуком.

Строка 1360 реагирует на нажатие пробела. В этом случае, как и при удалении символа, происходит печать пробела в знакоместе с текущими координатами, что также приводит к удалению прежнего символа, однако независимо от режима (мигающий курсор или нет) происходит увеличение на единицу горизонтальной координаты курсора. Это может оказаться полезно при "расчистке" небольших участков рисунка в режиме "графика", а в режиме "текст" привычно печатается пробел. (Если Вы считаете, что это слишком запутанно, то просто удалите строку 1360.)

Строка 1365 является "жучком", позволяющим остановить программу для внесения каких-либо изменений в процессе отладки. Для остановки надо ввести символ "!" (SYMBOL SHIFT + 1). Чтобы остановка не происходила самопроизвольно в процессе работы при попытке напечатать этот символ, для остановки программа требуется дополнительное условие: чтобы переменные, определяющие цвета чернил и бумаги имели нулевые значения (черные чернила и черная бумага - то есть ситуация, бессмысленная при обычной работе). В случае соблюдения этих условий программа переходит на строку 9999, в которой происходит переключение на символьный набор ПЗУ Спектрума, установка белого бордюра, а также принудительное отключение регистра CAPS LOCK для удобства редактирования.

Строки 1370-1390 нужны для того, чтобы можно было печатать символы, которые обычно можно напечатать в расширенном режиме EXTEND MODE. В символьном наборе КОИ-7 русские буквы "Ш" и "Щ" расположены на месте "[" и "]", а последние набираются в режиме EXT.MODE. Поэтому используется прием, позволяющий вводить эти символы при помощи SYMBOL SHIFT вместо "AND" и "OR" соответственно. Аналогично вводится "Э" вместо "STEP", так как эта буква находится на месте символа "". (Этот прием, кстати, позаимствован из "АРТСТУДИИ".) Если же Вы будете использовать символьный набор с другим расположением русских букв, то продумайте вопрос набора тех букв, которые не помещаются на клавишах с 26-ю латинскими буквами.

Строка 1400 выполняет печать графических символов и русских букв. Печать сопровождается специфическим звуком, воспроизводимым блоком в кодах. В том случае, если программа находится в режиме "текст", то очевидно, что после печати очередного символа, курсор должен переместиться на следующее знакоместо. При построении рисунка по-видимому такого перемещения не должно быть, так как заранее не известно, в какую сторону должен быть сдвинут курсор для построения рисунка (может быть, вверх или вниз). Поэтому в режиме "графика" перемещения курсора не происходит. Режим определяется по миганию курсора (параметр f). Вопрос о том, должен ли курсор перемещаться или нет является в общем-то спорным, поэтому, если Вы хотите, чтобы курсор всегда после печати перемещался на одну позицию вправо, то в строке 1400 вместо: х=x+f подставьте: x=x+1.

Строки, связанные с нажатием клавишей, с 1300 по 1400 заканчиваются все одинаково: зацикливанием на строку 1100. Это, так называемый, малый цикл опроса клавишей. Это, как уже говорилось, сделано для ускорения реагирования программы на нажатие основных клавишей. Со строки 1410 начинается расширенный цикл опроса. В конце этих строк нет перехода на базовую строку. Переход происходит а самом конце расширенного цикла: в строке 1999 программа зацикливается на строку 1000.

Строка 1410 обеспечивает запись экрана на магнитную ленту при нажатии SYMBOL SHIFT+"S" (на клавише ключевое слово SAVE). Вначале производится ввод имени файла (GO SUB 50). Вы можете не задавать никакого имени, а просто нажать ENTER, тогда файл будет записан с именем "$". Можно отменить ввод имени и вернуться к работе программы, если при вводе имени нажать "КУРСОР ВНИЗ". (В обычной Бейсик-программе в таком случае происходит остановка программы по ошибке, но в программе с блоком ON ERROR GO ТО происходит переход на заданную строку. Строка для перехода по ошибке была задана последний раз в строке 1300, то есть произойдет переход на строку 1000.) После ввода имени выполняется подпрограмма записи GO SUB 80. В этой подпрограмме блок ON ERROR GO ТО устанавливается на строку 60. Это позволит Вам прервать в случае необходимости запись и вернуться к работе через подпрограмму с адреса 60. Это вывод на экран таблички

"ОШИБКА" и звуковой сигнал.

RETURN в конце этой подпрограммы вернет на строку 1420.

Строка 1420 обеспечивает загрузку экрана с магнитной ленты при нажатии SYMBOL SHIFT + "I" (ключевое слово INPUT). Привычнее, наверное, был бы вариант с клавишей "L", или "J" (ключевое слово LOAD), однако эти варианты соответствуют символам, печатаемым в текстовом режиме: "=" и "-". Если все же Вы считаете, что клавиша "I" неудобна, то можно попробовать компромиссный вариант. Вместо 1420 надо будет новую строку расположить внутри малого цикла опроса клавишей:

1395 IF i$="=" AND f=0 THEN GO SUB 50: GO SUB 70: GO TO 1000

При этом, правда, загрузка будет возможна только в режиме "графика". Зато в режиме "текст" сохранится возможность печатать "=". Выбирайте, что удобнее.

Строка 1430 позволяет сохранять экран в специальном буфере (с адреса 50000). Переброска производится при помощи машиннокодового блока. В процессе работы над рисунком полезно периодически делать запоминание экрана. Строка 1440 производит противоположное действие - вызов экрана из памяти. Например, после каких-то изменений в рисунке, захочется восстановить предыдущий вариант. Строка 1450 производит обмен экрана и буфера без потери изображения обоих. Есть возможность сравнить два варианта рисунка и выбрать лучший.

Строка 1460 выполняет очистку экрана при нажатии SYMBOL SHIFT + "А" (ключевое слово STOP).

Строки 1470-1520 позволяют изменять яркость, инверсию, переключать режим "графика" - "текст", изменять цвет чернил, бумаги и бордюра. Для наглядности выражение типа b=b=0 можно было бы записать так: b=(b=0). То, что стоит в скобках, является логическим выражением, оно равно единице, если b=0. Таким способом достигается переключательный эффект изменения яркости, инверсии и режима "графика" - "текст" при нажатии соответствующих клавиш. При переключении цвета чернил, бумаги и бордюра ситуация похожа. При нажатии на клавишу, цвет (например чернил - 1) изменяется от 0 до 7, а при следующем нажатии (i=8) логическое выражение (i<7) станет равно 0, что вызывает повторение цикла изменения цвета, начиная с i=0.

Строка 1530 воспроизводит "музыкальное сопровождение". Циклическое проигрывание мелодии происходит до тех пор, пока не будет нажата какая-нибудь клавиша. Поэтому, если чуть-чуть задержать руку на клавише ENTER, то мелодия прервется на первом же звуке. Для устранения этого недостатка введен замедляющий пустой цикл FOR-NEXT (в отличие от PAUSE, которая в данном случае не поможет, так как прекращается как раз при нажатии клавиши).

Строка 1999 завершает цикл опроса клавишей, передавая управление на базовую строку 1000. С этого момента работа программы повторяется.

Теперь, когда мы покончили с Бейсиком, можно переходить к конкретным действиям по набору программы. Все коды, которые требуются для работы "МОЗАИКИ", (то есть то, что расположено с адреса 63824 и входит в файл "mozaik" CODE), приведены ниже. Число в конце каждой строки после двоеточия - это контрольная сумма строки. Она поможет Вам при наборе этого блока кодов.

F950

00

00

00

00

00

00

00

00

49

F9C0

00

00

00

00

00

30

30

00

19

F958

00

00

10

10

10

00

10

00

91

F9C8

00

00

04

08

10

20

40

00

3D

F960

00

00

28

28

00

00

00

00

A9

F9D0

00

00

38

4C

54

64

38

00

3D

F968

00

00

28

7C

28

7C

28

00

D1

F9D8

00

00

10

30

10

10

38

00

69

F970

00

10

3C

50

38

14

78

10

D9

F9E0

00

00

38

04

18

20

3C

00

89

F978

00

00

64

68

10

2C

4C

00

C5

F9E8

00

00

38

04

18

04

38

00

71

F980

00

10

28

10

34

48

34

00

71

F9F0

00

00

18

28

48

7C

08

00

F5

F988

00

00

08

10

00

00

00

00

99

F9F8

00

00

38

20

38

04

38

00

BD

F990

00

00

08

10

10

10

08

00

C9

FA00

00

00

38

40

78

44

38

00

66

F998

00

00

20

10

10

10

20

00

01

FA08

00

00

3C

04

08

10

10

00

6A

F9A0

00

00

28

10

7C

10

28

00

85

FA10

00

00

38

44

38

44

38

00

3A

F9A8

00

00

10

10

7C

10

10

00

5D

FA18

00

00

38

44

3C

04

38

00

06

F9B0

00

00

00

00

00

10

10

20

E9

FA20

00

00

00

10

00

00

10

00

3A

F9B8

00

00

00

00

7C

00

00

00

2D

FA28

00

00

00

10

00

00

10

20

62

FA30

00

00

08

10

20

10

08

00

7A

FA38

00

00

00

7C

00

7C

00

00

2A

FA40

00

00

20

10

08

10

20

00

A2

FA48

00

00

18

24

08

00

08

00

8E

FA50

00

00

4C

52

72

52

4C

00

F8

FA58

00

00

38

44

7C

44

44

00

D2

FA60

00

00

78

40

78

44

78

00

46

FA68

00

00

48

48

48

48

7C

04

02

FA70

00

00

1C

24

24

24

7E

42

B2

FA78

00

00

7C

40

78

40

7C

00

62

FA80

00

00

7C

54

54

7C

10

00

2A

FA88

00

00

3C

20

20

20

20

00

3E

FA90

00

00

44

28

10

28

44

00

72

FA98

00

00

44

4C

54

64

44

00

1E

FAA0

00

10

44

4C

54

64

44

00

36

FAA8

00

00

44

48

70

48

44

00

2A

FAB0

00

00

1C

24

24

24

44

00

76

FAB8

00

00

44

6C

54

44

44

00

3E

FAC0

00

00

44

44

7C

44

44

00

46

FAC8

00

00

38

44

44

44

38

00

FE

FAD0

00

00

7C

44

44

44

44

00

56

FAD8

00

00

3C

44

3C

24

44

00

F6

FAE0

00

00

78

44

44

78

40

00

92

FAE8

00

00

38

44

40

44

38

00

1A

FAF0

00

00

7C

10

10

10

10

00

A6

FAF8

00

00

44

44

3C

04

38

00

F2

FB00

00

00

54

54

38

54

54

00

83

FB08

00

00

78

44

78

44

78

00

F3

FB10

00

00

40

40

78

44

78

00

BF

FB18

00

00

42

42

72

4A

72

00

C5

FB20

00

00

38

44

08

44

38

00

1B

FB28

00

00

44

54

54

54

7C

00

DF

FB30

00

00

38

04

1C

04

38

00

BF

FB38

00

00

44

54

54

54

7E

02

F3

FB40

00

00

44

44

3C

04

04

00

07

FB48

00

00

60

20

38

24

38

00

57

FB50

00

00

18

24

70

20

7C

00

93

FB58

FF

FF

FF

7F

7F

3F

1F

07

B3

FB60

00

00

00

FF

FF

00

00

00

59

FB68

AA

55

AA

55

AA

55

AA

55

5F

FB70

FF

7F

3F

1F

0F

07

03

01

61

FD78

01

01

07

0F

1F

3F

7F

FF

69

FB80

FF

FE

FC

F8

F0

E0

C0

80

7C

FB88

03

07

0F

0F

0F

0F

07

03

D3

FB90

FF

FF

7E

3C

00

00

00

00

43

FB98

00

00

00

F8

F8

18

18

18

CB

FBA0

18

18

18

1F

1F

00

00

00

21

FBA8

18

18

18

F8

F8

00

00

00

DB

FBB0

18

18

18

FF

FF

00

00

00

F1

FBB8

18

18

18

F8

F8

18

18

18

33

FBC0

18

18

18

1F

1F

18

18

18

89

FBC8

00

00

00

FF

FF

18

18

18

09

FBD0

18

18

18

FF

FF

18

18

18

59

FBD8

07

1F

3F

7F

7F

FF

FF

FF

33

FBE0

80

C0

E0

F0

F8

FC

FE

FF

DC

FBE8

FF

FF

FF

FE

FE

FC

F8

E0

B0

FBF0

00

00

00

00

3C

7E

FF

FF

A3

FBF8

00

00

00

1F

1F

18

18

18

79

FC00

18

18

18

18

18

18

18

18

BC

FC08

E0

F8

FC

FE

FE

FF

FF

FF

D1

FC10

FF

FF

FF

FF

FF

FF

FF

FF

04

FC18

C0

E0

F0

F0

F0

F0

E0

C0

14

FC20

3C

7E

FF

FF

FF

FF

7E

3C

8C

FC28

00

0E

08

30

08

08

0E

00

88

FC30

00

08

08

08

08

08

08

00

5C

FC38

00

70

10

0C

10

10

70

00

50

FC40

00

14

28

00

00

00

00

00

78

FC48

3C

42

99

A1

A1

99

42

3C

B4

FC50

FF

81

81

99

99

81

81

FF

80

FC58

00

7C

42

7C

42

42

7C

00

8E

FC60

00

3C

42

40

40

42

3C

00

D8

FC68

00

78

44

42

42

44

78

00

60

FC70

00

7E

40

7C

40

40

7E

00

A4

FC78

00

7E

40

7C

40

40

40

00

6E

FC80

00

3C

42

40

4E

42

3C

00

06

FC88

00

42

42

7E

42

42

42

00

4C

FC90

00

3E

08

08

08

08

3E

00

28

FC98

00

02

02

02

42

42

3C

00

5A

FCA0

00

44

48

70

48

44

42

00

66

FCA8

00

40

40

40

40

40

7E

00

62

FCB0

00

42

66

5A

42

42

42

00

74

FCB8

00

42

62

52

4A

46

42

00

7C

FCC0

00

3C

42

42

42

42

3C

00

3C

FCC8

00

7C

42

42

7C

40

40

00

C0

FCD0

00

3C

42

42

52

4A

3C

00

64

FCD8

00

7C

42

42

7C

44

42

00

D6

FCE0

00

3C

40

3C

02

42

3C

00

14

FCE8

00

FE

10

10

10

10

10

00

32

FCF0

00

42

42

42

42

42

3C

00

72

FCF8

CD

7C

00

3B

3B

E1

01

0F

A4

FD00

00

09

EB

2A

3D

5C

73

23

4A

FD08

72

C9

3B

3B

CD

8E

02

7B

8E

FD10

FE

FF

20

F8

3A

3A

5C

FE

F0

FD18

FF

28

21

FE

07

28

1D

FE

A5

FD20

08

28

19

3C

32

81

5C

FD

AE

FD28

36

00

FF

21

D0

07

22

42

B6

FD30

5C

AF

32

44

5C

FD

CB

01

D3

FD38

FE

C3

7D

1B

33

33

C3

03

BA

FD40

13

0E

01

06

28

21

64

00

12

FD48

C5

11

01

00

E5

CD

B5

03

86

FD50

E1

11

1E

00

ED

5A

C1

10

75

FD58

EF

3E

02

0C

41

B8

20

E3

8C

FD60

C9

0E

01

06

28

21

E8

03

6F

FD68

C5

11

01

00

E5

CD

B5

03

A6

FD70

E1

11

18

00

ED

52

C1

10

87

FD78

EF

3E

02

0C

41

B8

20

E3

AC

FD80

C9

21

00

40

01

00

1B

11

D4

FD88

50

C3

ED

B0

C9

21

50

C3

32

FD90

01

00

1B

11

00

40

ED

B0

97

FD98

C9

11

50

C3

21

00

40

06

E9

FDA0

1B

C5

06

00

7E

F5

1A

77

87

FDA8

F1

12

23

13

10

F6

C1

10

B5

FDB0

F0

C9

21

00

40

01

00

1B

E3

FDB8

11

50

DE

ED

B0

C9

11

50

BB

FDC0

DE

21

00

40

06

1B

C5

06

E8

FDC8

00

7E

F5

1A

77

F1

12

23

EF

FDD0

13

10

F6

C1

10

F0

C9

21

91

FDD8

E0

FE

22

F2

FD

21

62

FF

46

FDE0

22

F6

FD

F3

CD

1E

FE

CD

9B

FDE8

8E

02

1C

28

F7

FB

C9

0A

7E

FDF0

12

07

EF

FE

E1

FE

71

FF

42

FDF8

63

FF

EB

5E

23

56

13

1A

46

FE00

FE

40

28

12

72

2B

73

C9

4F

FE08

7E

C6

0C

5F

16

00

21

AB

97

FE10

FE

19

66

2E

01

C9

23

5E

04

FE18

23

56

2B

2B

18

E1

21

F2

F1

FE20

FD

CD

FB

FD

32

EF

FD

21

1F

FE28

F6

FD

CD

FB

FD

32

F0

FD

FD

FE30

21

EF

FD

CD

08

FE

CB

13

EC

FE38

DA

E1

FE

E5

21

F0

FD

CD

AF

FE40

08

FE

D1

7C

3D

20

04

7A

6C

FF18

29

0B

29

06

29

0A

29

0A

E0

FE48

3D

28

42

3A

FA

FD

4F

06

73

FF20

29

29

29

1E

29

12

29

1B

37

FE50

00

3A

F1

FD

08

3A

F1

FD

A6

FF28

29

12

29

19

29

11

29

11

18

FE58

DD

62

16

10

00

00

08

1D

E0

FF30

29

29

29

01

29

0B

29

03

0B

FE60

D3

FE

20

17

DD

5C

AA

08

51

FF38

29

0B

29

06

29

0A

29

0A

00

FE68

2D

C2

82

FE

D3

FE

6C

AA

BC

FF40

29

29

29

1E

29

12

29

1B

57

FE70

10

EA

0C

C2

5E

FE

C9

61

BC

FF48

29

12

29

19

29

11

29

11

38

FE78

64

61

6D

28

FE

08

2D

CA

CD

FF50

29

29

29

01

29

0B

29

03

2B

FE80

6C

FE

D3

FE

00

00

10

D4

9D

FF58

29

0B

29

06

29

0A

29

0A

20

FE88

0C

C2

5E

FE

C9

3A

FA

FD

AA

FF60

29

40

00

29

29

29

29

12

7E

FE90

2F

4F

C5

F5

06

00

E5

21

D2

FF68

29

12

29

29

29

29

29

12

81

FE98

00

00

CB

2E

CB

2E

CB

2E

81

FF70

29

12

29

29

29

29

29

12

89

FEA0

00

E1

10

F2

0D

C2

96

FE

E4

FF78

29

29

29

12

29

29

29

11

90

FEA8

F1

C1

C9

FF

F0

E3

D7

CB

95

FF80

29

11

29

29

29

29

29

11

97

FEB0

C0

B4

AB

A1

97

90

88

80

9D

FF88

29

11

29

29

29

29

29

11

9F

FEB8

79

72

6C

66

60

5B

56

51

D5

FF90

29

11

29

29

29

29

29

11

A7

FEC0

4C

48

44

40

3D

39

36

33

B5

FF98

29

29

29

11

29

29

29

12

B0

FEC8

30

2D

2B

28

26

24

22

20

02

FFA0

29

12

29

29

29

29

29

0A

B1

FED0

1E

1C

1B

19

18

17

15

14

94

FFA8

29

29

29

0A

29

29

29

0B

B2

FED8

13

12

11

10

0F

0E

0D

0C

52

FFB0

29

0B

29

29

29

29

29

11

C1

FEE0

01

0F

0D

06

29

0A

29

0A

67

FFB8

29

29

29

11

29

29

29

12

D0

FEE8

29

0F

0D

06

29

0A

29

0A

97

FFC0

29

12

29

29

29

29

29

0A

D1

FEF0

29

0F

0D

06

29

0A

29

03

98

FFC8

29

29

29

0A

29

29

29

0B

D2

FEF8

29

0A

29

01

29

0B

29

0B

BB

FFD0

29

0B

29

29

29

29

29

11

E1

FF00

29

0F

0D

01

29

0B

29

0B

AD

FFD8

29

29

29

11

29

29

29

12

F0

FF08

29

0F

0D

01

29

0B

29

0B

B5

FFE0

29

12

29

40

00

00

00

00

83

FF10

29

0F

0D

01

29

0B

29

03

B5

Для набора кодового файла "mozaik" CODE 63824,1684 можно использовать любую программу-монитор, которая есть под рукой. Однако для того, чтобы избежать ошибок, которые обязательно возникнут при таком количестве набираемых цифр, удобно будет воспользоваться программой для ввода, опубликованной в "ZX-РЕВЮ" N 3 за 1991 г. на стр. 59 в статье "ZX-MODEM", оформив числовые данные в виде строк DATA. Учитывая то, что не все имеют возможность ознакомиться с этой статьей, мы рекомендуем Вам воспользоваться несколько измененным вариантом программы для ввода кодов. В приведенном ниже варианте данные вводятся непосредственно при помощи INPUT. (Возможно, так удобнее). Кроме того, периодически, вводя "S", Вы имеете возможность сохранить на ленте то, что уже введено. Приведенные выше коды программы "МОЗАИКА" напечатаны вразрядку, да еще с разделителями ":". Это сделано для удобочитаемости данных. Вам при наборе надо будет вводить их подряд, например для первой строки: F950000000000000000049 [ENTER]

Никаких пробелов или двоеточий вводить не надо. Ошибки, допущенные при вводе, будут отмечены звуковым сигналом, после чего Вам будет предложено повторить ввод.

1 GO TO 100

2 LOAD "mozaik" CODE

4 GO TO 0

5 SAVE "INPUT" LINE 2: STOP

100 BORDER 7: PAPER 7: INK 0: CLEAR 29999 110 DIM a(10)

120 DEF FN A(a$)=(CODE a$(1)-48-(7 AND a$(1)"9"))*16+(CODE a$(2)-48-(7 AND a$(2)>"9"))

1000 POKE 23658,8: INPUT "DATA:"; LINE b$

1010 IF h$ = "S" THEN GO TO 2000

1020 LET a$=h$

1030 LET sum=0

1040 FOR i=1 TO 2

1050 LET b$=a$(2*i-1 TO 2*i)

1060 LET a(i)=FN A(b$)

1070 NEXT i

1080 LET add=a(1)*256+a(2) 1090 LET sum=a(1)+a(2) 1100 FOR i=3 TO 10

1110 LET b$=h$(2*i-1 TO 2*i) 1120 LET a(i)=FN A(b$) 1130 LET sum=sum+a(i) 1140 POKE add, a(i) 1150 LET add-add+1 1160 NEXT i

1170 LET b$=h$(21 TO )

1180 LET cs=FN A(b$)

1190 LET cs1=sum-256*INT (sum/256)

12OO IF cs<>cs1 THEN PRINT a$; INVERSE 1;" ERROR ! ": BEEP 1,0:LET add=add-8: GO TO 1000

1210 PRINT a$( TO 4): GO TO 1000

2000 SAVE "mozaik" CODE 63824,1684

2010 VERIFY "mozaik"CODE

2020 CLS : PRINT a$( TO 4): GO TO 1000

Набрав эту Бейсик-программу, сделайте RUN 5 для записи ее на магнитную ленту (автостарт со 2-й строки обеспечит в дальнейшем автоматическую подгрузку уже частично набранного кодового файла). После этого запустите программу: RUN и начинайте ввод кодового файла "mozaik" CODE. При перерывах в работе сохраняйте его на магнитной ленте, вводя "S".

Теперь последовательность, в которой следует набирать всю программу "МОЗАИКА". Сначала надо заготовить картинку-заставку при помощи графического редактора. Затем набрать приведенный выше кодовый файл. Теперь можно приступить к набору Бейсик-файла. Набирая 10 строку, подставьте в ее начало RETURN: это отключит пока блок кодов ON ERROR GO TO, блокирующий остановку программы. В строке 30 в кавычках набрано 32 пробела. Набирая текст на русском языке, учитывайте, какой русский символьный набор будет применяться в Вашей программе. Можно рекомендовать такой подход. Загрузите уже набранный кодовый файл "mozaik" CODE, затем, непосредственно перед набором русского текста, переключите символьный набор командой GO SUB 8, теперь Вы будете видеть набираемый текст таким, каким он будет на экране. Обратное переключение символьного набора - GO SUB 9. Обратите внимание: в строках 1110 и 1210 в кавычках вводится символ "A", используя графический регистр. В строках 1370-1390 а также 1410-1460 в кавычках вводятся токены ключевых слов.

После того, как набор Бейсик-файла будет закончен, сделайте RUN 2 и загрузите заготовленные заранее кодовые файлы. После этого программа начнет работать. После того, как Вы убедитесь, что ошибок нет или устраните имеющиеся, можно убрать RETURN из строки 10. Запустите программу: RUN и посмотрите, как она будет вести себя при нажатии клавиши BREAK. Для остановки программы используйте "жучок" в строке 1365: как говорилось выше, если установить чёрный цвет чернил и черный цвет бумаги, то программу можно остановить, введя восклицательный знак (SYMB.SHIFT+1). Затем можно выгрузить полностью готовую программу на магнитную ленту, выполнив RUN 5.

Теперь пришло время несколько слов сказать о том, как адаптировать программу под "БЕТА-ДИСК интерфейс". Прежде всего, надо изменить строки 2 и 3 Бейсик-файла, добавив перед ключевым словом "LOAD" префикс: RANDOMIZE USR 15619: REM :

Кроме того, надо будет изменить подпрограммы, связанные с загрузкой и выгрузкой экранов, начинающиеся со строк 70 и 80. БЕТА-вариант этих подпрограмм: 70 LET err=USR 15619 : REM : LOAD f$ CODE 16384 72 IF err<>0 THEN GO SUB 60

79 RETURN

80 RANDOMIZE USR 15619: REM : ERASE f$ CODE

82 LET err=USR 15619: REM : SAVE f$ CODE 16384,6912 84 IF err<>0 THEN GO SUB 60 89 RETURN

В подпрограмме записи файла сначала производится удаление предыдущей версии файла на диске с тем именем, которое было задано, а затем происходит запись экрана в новый файл с таким именем. В случае ошибки чтения-записи происходит вызов подпрограммы GO SUB 60, которая выводит предупредительную табличку. Для простоты программы не предусмотрена верификация. Вы можете сами организовать ее, если захотите. Кроме того, если предварительное стирание файла с заданным именем Вас не устраивает, то просто исключите строку 80. В результате, в том случае, если на диске уже имеется файл с таким именем, то записи экрана на диск не произойдет, а будет выдано сообщение об ошибке подпрограммой GO SUB 60.

В строке 52 вместо "макс. 10 символов" подставьте: "макс. 8 символов". В строке 54 удалите все, начиная с IF ... до конца строки.

На этом адаптацию под диск можно считать законченной.

А теперь дополнительная информация для тех, кто занят творческим поиском, а не просто копирует готовую программу.

Нам почему-то гораздо симпатичнее вариант, когда все блоки кодов, используемые в программах, находятся в нулевой строке, в области за оператором REM. В частности, тогда полностью исключается несанкционированная остановка программы, так как блок кодов ON ERROR GO TO, располагаясь внутри Бейсик программы, может быть инициирован сразу же после старта программы. Это обстоятельство, дополненное грамотно продуманными приемами защиты, создаст больше хлопот для взломщиков. Программа "МОЗАИКА", конечно, не претендует на такую серьезную защиту, но речь сейчас о том, какие методы Вы можете использовать в своих разработках, которые, возможно, как раз потребуют хорошей защиты. Еще одно обстоятельство в пользу кодов в нулевой строке. Такая программа гораздо быстрее загружается (это относится как к магнитофонному, так и к дисковому вариантам). А это уже существенное преимущество для пользователя. Все определяется только тем, "стоит ли овчинка выделки", то есть какими трудами это дается программисту. Попробуем показать, что в нашем случае эти дополнительные эти труды совсем незначительны.

При разработке "МОЗАИКИ" мы исходили из того, что программа должна быть легко адаптируема под "БЕТА-ДИСК интерфейс". О путях решения этой проблемы уже говорилось в "ZX-РЕВЮ" N 9-10 за 1992 г. стр. 197. Но там была ситуация, когда все блоки кодов в нулевой строке были перемещаемыми в памяти. Проблема была только в том, чтобы обеспечить правильное обращение к ним из Бейсика. В программе "МОЗАИКА" используется неперемещаемый блок кодов, воспроизводящий мелодию! Если даже его скомпилировать при помощи музыкального редактора "WHAM" для расположения в нулевой строке магнитофонного варианта, тогда при адаптации под "БЕТА-ДИСК" он окажется смещенным на 112 байт и не будет работать.

Для универсальности программы применяется следующий прием. После загрузки программы все рабочие блоки кодов из нулевой строки перебрасываются в отведенное для них место (с адреса 63824) и работают уже там. (Программа "МОЗАИКА" небольшая, с количеством свободной памяти проблем нет.)

В начале нулевой Бейсик-строки находится процедура, осуществляющая переброску кодового блока заданной длины, следующего непосредственно за этой процедурой, на заданный адрес. Этот способ Вы можете использовать и в других своих программах. Независимо от того, где располагается сама процедура, адрес, откуда будет произведена переброска, всегда берется следующим за концом процедуры. Вот она:

5CD0

CD7C00

CALL

#007C

(1)

5CD3

3B

DEC

SP

(2)

5CD4

3B

DEC

SP

5CD5

E1

POP

HL

5CD6

011000

LD

BC,#0010

(3)

5CD9

09

ADD

HL,BC

5CDA

1150F9

LD

DE,#F950

(4)

5CDD

019606

LD

BC,#0696

5CE0

EDB0

LDIR

(5)

5CE2

C9

RET

5СЕ3 .... перебрасываемый массив

Процедура имеет длину 19 байт и расположена в начале нулевой строки сразу же за REM, адрес в случае магнитофонного варианта равен 23760 (#5CD0). Но с одинаковым успехом она будет работать и в любом другом месте. Кодовый массив, подлежащий переброске, располагается сразу же за процедурой. Для определения этого адреса используется такой прием. Сначала выполняется подпрограмма из ПЗУ (1). По адресу #007С в ПЗУ находится только одна команда RET. Но при выполнении инструкции CALL на стек записывается адрес команды, следующей за CALL, то есть в данном случае #5CD3. Для того, чтобы осуществить привязку к адресам, это значение возвращается (2) в регистр HL. Далее это значение увеличивается на величину смещения, заданного в регистре ВС (3). Теперь в HL получилось: #5CD3 + #0010 = #5СЕ3. Затем задаются остальные параметры для выполнения команды LDIR (4). В DE - адрес места назначения перебрасываемого блока: 63324, а в ВС - его длина: 1684 байта. (Конкретные значения подставлены те, которые используются в программе "МОЗАИКА".) Теперь выполняется команда LDIR (5) и происходит возврат в вызывающую программу.

В нулевой строке "МОЗАИКА" расположены следующие блоки кодов:

1. Процедура, осуществляющая переброску рабочих кодов в адрес 63824. Длина - 19

байт.

2. Рабочие коды (перебрасываемые в адрес 63824). Длина - 1684 байта.

Суммарная длина кодов, располагаемых в нулевой строке, равна: 19+1684=1703

байта.

При создании нулевой строки с большим объемом памяти после REM, Вы можете воспользоваться программой REM FILL, ранее опубликованной в "ZX-PEBЮ" N 9-10 за 1992 г. на стр. 194-196. Сегодня же предложим новую версию этой программы. Она называется "REM 2". Кодовый блок этой версии имеет длину всего 62 байта. Это оказалось возможным осуществить благодаря использованию подпрограммы из ПЗУ, расположенной по адресу 5717, которая позволяет зарезервировать заданный объем памяти, раздвинуть текст Бейсик-строк и перерасчитать все системные переменные. Она используется процедурами редактора Спектрума при добавлении новых строк в программу. (О ней, в частности, упоминалось в "ZX-РЕВЮ" N 5-6 в статье Пашорина В.И. на стр. 112.) Программа "REM 2" состоит только из Бейсик-файла (кодовый блок формируется после старта Бейсик-программы): 1 REM

10 LET n=23296: LET s=0 20 FOR x=n TO n+61 30 READ y: POKE x,y: LET s=s+y 40 NEXT x

50 IF S<>6108 THEN PRINT FLASH 1; "ERROR IN LINE DATA": STOP 60 INPUT "No of extra bytes: "; n 70 RANDOMIZE n

80 POKE 23312,PEEK 23670: POKE 23313,PEEK 23671

100 DATA 042,083,092,229,054,000,035,054,000,035,094,035,086,213,025,001,008,000,197,205,

085,022,035,229,209,019,054 110 DATA 000,193,197,011,237,176,209,225,025,235,225,035,035,115,035,114 120 DATA 000,033,001,000,205,110,025,229,033,016,039,205,110,025,209,205,229,025,201 200 CLEAR : RANDOMIZE USR 23296

Подробно принцип работы этой программы был изложен в указанной выше статье в "РЕВЮ" N 9-10. Поэтому, чтобы не повторяться скажем только, что после старта программа запрашивает число дополнительных байтов, которые будут вставлены между последним символом текста начальной строки и символом <ENTER>, завершающим эту строку. После ввода этого параметра происходит старт кодового блока. После сообщения 0: OK, область за REM в 1-й строке будет расширена на число добавочных байт и обнулена, номер этой строки станет 0, а все остальные Бейсик-строки будут уничтожены. Теперь в полученную REM область можно загрузить коды.

Первое значение DATA в строке 110 определяет код заполнения дополнительной области. Если в строке 120 первое значение DATA заменить на 201, то уничтожения остальных Бейсик-строк не будет. Экспериментируя с указанными значениями, удалите строку 50, которая проверяет контрольную сумму значений DATA, защищая от ошибок при наборе программы.

Теперь возвращаемся к "МОЗАИКЕ". На вопрос о числе добавочных байтов ответьте: 1703. После того, как нулевая строка с областью заданной длины после REM будет сформирована, можете загружать в нее коды и объединить ее при помощи MERGE с Бейсик-файлом "МОЗАИКИ". Если Вы используете БЕТА-ДИСК, то на всякий случай загляните в статью о TR-DOS в этом выпуске "РЕВЮ". Там автор упомянул об особенностях загрузки кодов в нулевую строку в отличие от магнитофонного варианта.

Теперь осталось изменить строки 2 и 3 Бейсик-файла "МОЗАИКА":

2 BORDER 7: PAPER 7: INK 0: CLEAR 49999: POKE 23739,111: RANDOMIZE USR (PEEK 23635+256*PEEK

23636+5)

3 RANDOMIZE 4: GO SUB 10: LOAD "mozaik $"CODE 16354

В заключение же хочется пожелать всем юным пользователям "Спектрума" приятной работы с программой "МОЗАИКА".

Перевод английского: Пашорин В. И.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Intro - Werewolves вернулся...
Юмор - жизнь.
От авторов - О новшествах в оболочке газеты.
Gameland - прохождение игры Snowball от Level 9.
Demoscene - Deja Vu #09: Полтора десятка дем с патей разных.

В этот день...   21 ноября