СПЕКТРУМ В ШКОЛЕ
Для тех, кто использует компьютеры семейства "ZX-Spectrum" в школьных учреждениях, мы подготовили сегодня программу "МОЗАИКА". Интересным, на наш взгляд, в ней является то, что это программа двойного назначения. Ее можно применять на уроках информатики как в старших классах, так и в младших.
Более опытные ученики смогут набрать текст этой программы и отладить ее, а для младших школьников она явится замечательным первым шагом в компьютеризацию, поскольку поможет легко наладить процесс общения с компьютером и сделать его радостным.
У нас есть положительный опыт работы с этой программой шестилетних детей, которые без труда освоили всю необходимую технику управления.
Не лишним также будет отметить и тот факт, что применима эта программа не только в школе, но и конечно дома. В этом случае она доставит много приятных минут и детям и их родителям. Не пожалейте несколько утренних часов. Ваш сын или дочь на всю жизнь запомнят этот воскресный день.
Дополнительный интерес в этой программе представляет и то, что при ее наборе Вам предстоит ознакомиться со многими профессиональными приемами, например с подгрузкой своего знакогенератора, с организацией перехода по ошибкам ON ERROR GO TO, с работой шестнадцатиричного загрузчика, с организацией в программе нулевой строки, с заполнением этой строки блоком кодов REM FILL, с адаптацией программы под БЕТА-ДИСК-интерфейс и т.д. и т.п. Все эти вопросы здесь последовательно разобраны, но Вам могут (если Вы пожелаете) пригодиться ранее выпущенные нами сборники "ZX-РЕВЮ" за прошлые годы.
"ИНФОРКОМ" предоставляет Вам возможность заказать и получить по почте сборники '^-РЕВЮ-91" и '^-РЕВЮ-92", выполненные в виде аккуратных книжек стандартного формата. Наш адрес Вам известен.
Те, кто не хочет связываться с почтой, смогут приобрести их лично на нашем корпункте по адресу: г. Москва, ул. Новый Арбат (бывший просп. Калинина), д.2, о/с Г-19. На первом этаже Вы найдете нас по вывеске "ZX-РЕВЮ".
ПРОГРАММА "МОЗАИКА"
В магазинах игрушек продается игра под названием "МОЗАИКА". Кто в детстве не играл в нее? В панель с отверстиями вставляются разноцветные фишки, которые образуют рисунок. Сегодня вниманию читателей предлагается компьютерный вариант этой игры. Программа может использоваться не только в младших классах школы, но даже в дошкольных учреждениях.
По существу это простейший в управлении графический редактор. Освоить профессиональный графический редактор, такой, как, например "ARTIST" или "ARTSTUDIO", ребенок не в состоянии, а программа "МОЗАИКА" поможет ему приобщиться к "компьютерной графике". В то же время, эта программа приучит ребенка пользоваться функциональными клавишами переключения цвета чернил, бумаги, режима работы "графика - текст" и т.п., то есть будет пройден "курс подготовки" перед освоением в будущем более сложных программ.
Для того, чтобы в деталях понять многие моменты, используемые в этой программе, следует обратиться к циклу ряда статей, опубликованных под рубрикой "Профессиональный подход" в 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
В заключение же хочется пожелать всем юным пользователям "Спектрума" приятной работы с программой "МОЗАИКА".
Перевод английского: Пашорин В. И.