ZX-Ревю 1992 №9-10 1991 г.

Профессиональный подход - дебют программы. Блок кодов "REM FILL".


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

ПРОФЕССИОНАЛЬНЫЙ ПОДХОД

"ДЕБЮТ ПРОГРАММЫ"

Продолжая разговор о повседневных задачах, начатый в одной из номеров "ZX-РЕВЮ", следует поподробнее остановиться вот на чем. Несмотря на то, что Ваши программы различаются в зависимости от конкретной задачи, практически во всех программах встречается повторяющиеся моменты. Это может быть введение русского шрифта, титульная заставка с фамилией автора (Вашей), блок кодов "ON ERROR GO TO" с механизмом его инициирования, который описан в предыдущей статье (см. ZX-РЕВЮ 5-6 за 1992 г. стр. 113), какое-то стандартное начало программы. Неплохо также предусмотреть элементарный сервис для себя, в частности упрощение сохранения программы на ленте в процессе написания и отладки. То есть речь идет о "дебюте" программы. Наверное, у многих програмистов есть свой "дебют" или стандартное начало своих программ, а также одинаковые приемы, используемые практически во всех или в большинстве своих программ.

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

Итак, сначала текст заготовки программы, назовем ее "PROG", затем - комментарии.

0 REM (машинные коды)

1 GO TO 100

2 RANDOMIZE 2: GO SUB 10:CLEAR 49999: LOAD "pгog"СООЕ 50000,1000

3 GO SUB 8: PRINT . . . (вывод на экран заставки)

4 GO SUB 20: GO TO 0

5 GO SUB 9: SAVE "PROG"LINE 2: SAVE "prog"CODE 50000,1000

6 VERIFY "PROG": VERIFY "prog" CODE: PRINT INK 9; TAB 20; "О.К." : BEEP 0.5,32: GO TO 5

7 POKE 23675,208: POKE 23676,95: RETURN : REM UDG

8 POKE 23606,208: POKE 23607,91: RETURN : REM RUS

9 POKE 23606,0: POKE 23607,60: RETURN : REM LAT

10 POKE 24746, PEEK 23670: POKE 24749,PEEK 23671: RANDOMIZE USR 24696: RETURN :REM ON ERROR

GO TO

20 PRINT #0; TAB 5;"НАЖМИТЕ ЛЮБУЮ КЛАВИШУ": PAUSE 0: INPUT; 22 IF INKEY$="q" THEM GO TO 9999 24 RETURN

100 RANDOMIZE 3: GO SUB 10: GO SUB 7: GO SUB 8: BORDER 1: PAPER 0: INK 6: BRIGHT 0: CLS 1000 PAUSE 50: GO SUB 20

1010 PRINT AT 12, 10;"ЗВУК 1":RANDOMIZE USR 24769

102O PAUSE 50: GO SUB 20 1030 PRINT AT 12,10;"ЗВУК 2":RANDOMIZE USR 24801 9999 BORDER 7: PAPER 7: INK 0: BRIGHT 0: INVERSE 0

В нулевой строке программы расположены блоки кодов, необходимые для ее работы.

О формировании нулевой строки мы подробно поговорим позже. А сейчас - о том, что же это за блоки кодов.

1. Символьный набор расположен с адреса 23760. Длина - 768 байт (по адрес 24537). Системная переменная CHARS при этом равна: 23760-256=23504. Символьный набор может быть любым, по вашему вкусу. Я использую русско-латинский символьный набор в кодах ASCII КОИ-7 "НС". Подробно об этом - в статье о русификации программы "МАСТЕРФАЙЛ-09" в ZX-РЕВЮ 1-2 за этот год, стр. 31. Там же программа по формированию такого символьного набора.

2. Символы UDG графики расположены с адреса 24528. Длина -168 байт (по адрес 24695). Этот набор может быть совершенно различным в зависимости от Ваших требований. Попутно замечу, что часто могут требоваться изображения стрелок влево, вправо, вниз (вверх - уже есть в символьном наборе), элемента для изображения рамок, волнистые линии и т.д. Все зависит от требований Вашей программы. Поэтому я не буду специально останавливаться на этом.

3. Блок кодов "ON ERROR GO ТО" расположен с адреса 24696. Длина - 73 байта. Подробно работа этого блока была изложена в предыдущей статье в ZX-РЕВЮ N 5-6 за этот год на стр.113. Номер Бейсик-строки для перехода задается в ячейках 24746,24749.

4. SOUND 1 - так назовем коротенький блок в машинных кодах, выдающий звуковой сигнал, который может использоваться для индикации какого-либо положительного эффекта в программе (это может быть правильный ответ на вопрос или находка "клада" и т.п.). SOUND 1 расположен с адреса 24759 (по адрес 24800). Длина - 32 байта. Вызов -RANDOMIZE USR 24769.

5. SOUND 2 - аналогично предыдущему пункту - звуковой сигнал, индицирующий отрицательный эффект в программе, т.е. неправильный ответ на вопрос, ошибка в действиях игравшего и т.п. SOUND 2 расположен с адреса 24801. Длина - 32 байта. Вызов -RANDOMIZE USR 24801.

Для получения блоков кодов SOUND 1 и SOUND 2 приведена программа в конце этой статьи, а более подробно о них будет рассказано в следующем выпуске "РЕВЮ".

Конечно, это не означает, что Вы должны копировать этот порядок. Вам просто надо определиться со своими требованиями и добавить свои блоки кодов или изменить имеющиеся.

Теперь о других строках программы.

Автостарт программы происходит со строки 2. Строки 2, 3, 4 - выполняют те действия, которые необходимо сделать, чтобы обеспечить старт программы "с нуля", после включения компьютера. Иными словами, это "горячий старт". Сюда входит следующее. Предположим, что для работы Вашей программы требуется загрузка некоторого блока в машинных кодах. Пусть это будет блок "prog"CODE 50000,1000.

Тогда предварительно надо переустановить RAMTOP для резервирования места под блок кодов командой CLEAR (ADDR-1), где ADDR - адрес загрузки.

Далее (строка 3) может идти вывод сообщения об авторах программы, дате ее последней коррекции или какие-либо рекламные комментарии, а также краткие сообщения по работе программы. (Перед тем, как это сделать, скорее всего придется включить русский символьный набор.) Если Вам недостаточно одной строки для этого, то используйте GO SUB ...

Строка 4 передает управление на начало программы, обеспечивая "холодный" старт программы. В процессе отладки Вы будете пользоваться "холодным" стартом программы, подавая команду RUN. При этом нет необходимости опять загружать блок машинных кодов. В том случае, если у вас нет блока машинных кодов, который необходим для работы Вашей программы и "холодный" и "горячий" старт - это одно и то же, то исключите строки 1 и 2, а в строке 4 GO TO 0 исправьте на GO TO 100. 100 - это адрес начала непосредственного выполнения программы.

Зато, если вы в дальнейшем захотите усовершенствовать свою программу, например, "озвучить" ее с помощью музыкального редактора "WHAM", то Вы всегда сможете восстановить строки 1 и 2 для загрузки скомпилированная кодов мелодий.

Строки 5 и 6 обеспечивают вам возможность периодического сохранения программы (вместе с блоком кодов, если это необходимо) на ленте в процессе написания и отладки. Для этого надо сделать RUN 5.

Строка 7 - переключатель символов UDG-графики. Она включает набор символов UDG, размещенный в нулевой строке.

Строка 8 - включение символьного набора, который расположен в нулевой строке.

Строка 9 - выключение символьного набора нулевой строки (т.е. включение символьного набора из ПЗУ).

Строка 10 - подготовка и активизация блока кодов "ON ERROR GO ТО", подробно об этом было изложено в предыдущей статье в ZX-РЕВЮ 5 -6 за этот год.

В строках 20, 30, 40, ... по 99) - располагаются недлинные подпрограммы, которые часто используются на протяжении всей программы, типа вывода таблички "нажмите любую клавишу" или последовательности операторов ВЕЕР, играющих мелодию из нескольких нот и т.п. В общем, их можно было бы располагать и в другом месте, например в строках 6000 или 9000, но я использую именно строки с 20 по 99 просто потому, что короче набирать GO SUB 20, чем GO SUB 8000.

Сама программа начинается со строки 100. Причем в строках 100 999 располагаются следующие фрагменты. Это установка исходных параметров, когда происходит переключение блока UDG-графики на тот, который загружен с ленты, включение нового символьного набора, устанавливаются необходимые цвета PAPER, INK, BORDER и т.п. Могут задаваться массивы для переменных, присваиваются численные значения переменным и т. д.

Со строки 200 может быть расположено главное меню программы. Подробно об универсальном варианте такого меню будет рассказано в следующей статье. Это меню, в свою очередь, может передавать управление на другие "подменю", располагаемые со строк 300, 400 ... , при помощи которых управление передается на непосредственное выполнение различных фрагментов программы. Последние располагаются, начиная со строк 1000, 2000 и т.д. (Для примера, в строкая с 1000 демонстрируются звуки SOUND 1 и SOUND 2).

Остановка программы, в случае использования блока кодов "ON ERROR GO TO", возможна только благодаря "жучку" в строке 22. Нажав клавишу "Q", когда появляется табличка: "нажмите любую клавишу", переходим на строку 9999. Эта строка обеспечивает восстановление белого цвета PAPER и черного INK при остановке программы для удобства редактирования. Добавив в строку 9999: GO SUB 9, можно включать опять символьный набор Спектрума, но если Вы используете русско-латинский символьный набор "НС" в кодах КОИ-7, то это переключение не требуется. Наоборот, в этом случае вы будете одинаково хорошо видеть текст программы, печатаемый английскими буквани и текстовые сообщения в операторах PRINT, печатаемые русскими буквами. Надо только для удобочитаемости программы имена переменных набирать, используя режим CAPS LOCK, тогда они будут печататься английскими буквами. (Впрочем, может быть Вам больше понравится набирать их русскими словами? Дело вкуса.)

Теперь поговорим подробнее о нулевой строке. Вспомним, как располагается в памяти строка Бейсика. На начало первой строки программы указывает системная переменная PROG (2 байта по адресу 23655). Обычно это 23755. 2 байта занимает номер строки, (младший и старший байты здесь расположены не как обычно, сначала - старший, затем - младший) затем 2 байта занимает длина строки (длина текста плюс 1 байт для кода 13, завершающего строку), затем идет текст программы на Бейсике, затем код 13 - ENTER -конец строки.

Если набрать 1 REM , а после REM, скажем, 5 пробелов, то после ввода в память строка будет иметь вид:

23755 0 номер строки: 1

23756 1

23757 7 длина строки: 7

23756 0

23759 234 REM

23760 32

23761 32

23762 32

23763 32

23764 32

23765 13 <ENTER>

Область за REM начинается с адреса 23760 и заканчивается адресом 23764 (5 байт).

768 байт 168 байт 73 байта 32 байта 32 байта 1073 байта

То есть после REM должно быть набрано 1073 пробела или любых других символов. Если Вы попытаетесь вручную набрать такое количество пробелов, то это займет уйму времени, к тому же, при наборе, с определенного момента времени начнет раздаваться предупредительный звуковой сигнал, еще более замедляющий работу. То есть, набрать вручную такое количество пробелов практически невозможно.

В этом случае могла бы помочь опять же программа "SUPERCODE". Под номером 84 в ней находится блок кодов "EXPAND REM" (или "REM FILL" в "SUPERCODE 2"). Этот блок кодов должен расширять область REM на величину до 9999 байт. К сожалению, этот блок кодов имеет программные ошибки, из-за чего он не работает так, как должен. Поэтому я для создания REM-области пользуюсь своей программой в машинных кодах, которую хочу предложить вниманию читателей.

Для тех, кто интересуется машинными кодами, приводится текст программы с комментариями. Если Вас это не интересует, то пропустите описание работы блока кодов.

Программу назовем так же, как и в "SUPERCODE" - "REM FILL".

Блок кодов "REM FILL"

Этот блок кодов можно загружать в любое место памяти, для примера, он загружен в буфер принтера, в адрес 23296 (#5B00). В отличие от программы N84 в "SUPERCODE", здесь длина получаемой REM-области не ограничена 9999 байтами, а ограничена только памятью компьютера, отведенной под Бейсик-программу (системной переменной RAMTOP). Кроме того, сам блок кодов почти вдвое короче, чем в "SUPERCODE". Единственное ограничение на работу блока кодов - это то, что получаемая REM-область должна быть не менее двух байт (что вряд ли кому-то может придти в голову).

Теперь - блок кодов "REM FILL", затем - комментарии.

Теперь на это место можно загрузить блок кодов (конечно, если его длина не превышает 5 байт, иначе Бейсик-программа будет запорчена). Так мы делали, располагая в начальной строке программы блок кодов "ON ERROR GO ТО" (см. предыдущую статью в ZX-РЕВЮ 5-6 на стр. 113). Там для этого надо было 73 байта памяти и после REM мы набирали 73 пробела.

Для размещения тех кодов, о которых говорилось выше, надо зарезервировать следующий объем памяти: Символьный набор: UDG-графика: ON ERROR GO TO: SOUND 1: SOUND 2: Всего:

5В00

016400

LD BC,#0064

(1)

5В03

2А4В5С

LD HL,(#5C4B)

(2)

5B06

09

ADD HL,BC

(3)

5B07

224B5C

LD (#5C4B),HL

(4)

5B0A

2A555C

LD HL,(#5C55)

(5)

5B0D

09

ADD HL,BC

5B0E

22555C

LD (#5C55),HL

5B11

2A595C

LD HL,(#5C59)

(6)

5B14

09

ADD HL,BC

5B15

22595C

LD (#5C59),HL

5B18

2A5B5C

LD HL,(#5C5B)

(7)

5B1B

09

ADD HL,BC

5B1C

225B5C

LD (#5C5B),HL

5B1F

8A5D5C

LD HL,(#5C5D)

(8)

5B22

09

ADD HL, ВС

5B23

225D5C

LD (#5C5D),HL

5B26

2A615C

LD HL,(#5C61)

(9)

5B29

09

ADD HL,BC

5B2A

22615C

LD (#5C61),HL

5B2D

2A635C

LD HL,(#5063)

(10)

5B30

09

ADD HL^

5B31

22635C

LD (#5C63),HL

5B34

DD2A535C

LD IX,(#5C53)

(11)

5B38

DDE5

PUSH IX

5B3A

DD360000

LD (IX+0),#00

(12)

5B3E

DD360100

LD (IX+1),#00

5В42

DD6603

LD H,(IX+3)

(13)

5B45

DD6E02

LD L,(IX+2)

5B48

E5

PUSH HL

(14)

5B49

09

ADD HL,BC

(15)

5B4A

DD7403

LD (IX+3),H

(16)

5B4D

DD7502

LD (IX+2),L

5ВЭО

D1

POP DE

(17)

5B51

13

INC DE

5B52

13

INC DE

5B53

13

INC DE

5B54

E1

POP HL

(18)

5BS5

19

ADD HL,DE

(19)

5B56

C5

PUSH BC

(20)

5B57

С5

PUSH ВС

5B58

EB

EX DE,HL

(21)

5B59

2A655C

LD HL,(#5C65)

(22)

5B5C

E5

PUSH HL

(23)

5B5D

ED52

SBC HL,DE

(24)

5B5F

E5

PUSH HL

(25)

5B60

C1

POP ВС

5B61

D1

POP DE

(26)

5B62

E1

POP HL

5B63

19

ADD HL,DE

(27)

5B64

22655C

LD (#5C65),HL

(28)

5B67

EB

EX DE,HL

(29)

5B68

2B

DEC HL

(30)

5B69

1B

DEC DE

(31)

5B6A

EDBB

LDDR

(32)

5B6C

23

INC HL

(33)

5B6D

3600

LD (HL),#00

(34)

5B6F

E5

PUSH HL

(35)

5B70

D1

POP DE

5B71

13

INC DE

(36)

5B72

C1

POP BC

(37)

5B73

0B

DEC ВС

5B74

EDB0

LDIR

(38)

5B76

00

NOP

(39)

5B77

210100

LD HL,#0001

(40)

5B7A

CD6E19

CALL #196E

5B7D

E5

PUSH HL

5B7E

211027

LD HL,#2710

5B81

CD6E19

CALL #196Е

5B84

D1

POP DE

5B65

CDE519

CALL #19E5

5B88

C9

RET

Комментарии к программе.

Сначала (1) в регистр BC заносится длина будущей REM-области - это та величина, на которую удлинится начальная строка Бейсик-программы, или иными словами, это то число байтов, которое добавится между текстом начальной строки и кодом 13 - <ENTER>, завершающим строку. (Для примера задано 100 байтов - то есть #0064.)

Далее следует ряд действий по изменению значений системных переменных. На величину добавляемых байтов должна увеличиться значения следующих системных

переменных:

VARS - адреса переменных Бейсика (23627 или #5С4В)

NXTLIN - адрес следующей строки Бейсик-программы (23637 или #5С55)

Е_LINE - адрес выведенной команды (23641 или #5С59)

^CUR - адрес курсора (23643 или #5C5B)

^_ADD - адрес следующего интерпретируемого символа (23645 или #5C5D) WORK_SP - адрес временной рабочей области (23649 или #5С61) STK_BOT - адрес дна программируемого стека (23651 или #5С63) STK_END - адрес начала резервной области памяти (23653 или #5C65)

Все эти системные переменные имеют длину по два байта и изменяются следующим образом. Сначала (2) в регистр HL заносится содержимое системной переменной (VARS), затем (3) к нему прибавляется число добавочных байтов из регистра BC и затем результат сложения (4) из регистра HL пересылается назад в память компьютера, в ячейку этой системной переменной.

Аналогичные действия (5)-(10) производятся и с остальными перечисленными системными переменными, кроме STK END. О ней - чуть позже.

Далее (11) в регистр IX заносится значение системной переменной PROG (23635). Теперь в IX -23755. Это число нам еще понадобится для дальнейших рассчетов, поэтому сохраним его на стеке.

Записывая 0 по адресу (PROG) и (PKOG)+1 (12) изменяем номер начальной строки программы, теперь это 0.

Затем (13) в регистры H и L побайтно заносятся числа из адресов (PROG)+2 и (PROG)+3. Теперь в регистре HL - длина начальной строки Бейсик-программы. Запомним это число на стеке (14) для дальнейших действий. Далее содержимое HL также увеличивается на величину добавляемых байтов и затем (16) новое значение длины строки из регистров H и L побайтно записывается в память.

Для дальнейших рассчетов нам надо получить адрес символа <ENTER> - конца строки. Начиная с этого места вся дальнейшая область Бейсик-системы должна быть отодвинута на величину добавляемых байтов. Для этого снимаем со стека в регистр DE бывшую длину начальной строки и увеличиваем ее на три (два байта - номер строки плюс два байта - длина строки и минус один байт - символ <ENTER>; итого 3 байта). Затем (18) снимаем со стека значение PROG и добавляем к нему (19) полученное число из регистра DE. Теперь в регистре HL - адрес символа <ENTER>. Теперь, перед дальнейшими расчетами, сохраним на стеке (20) длину добавочных байт.

Затем (21) переписываем содержимое HL в DE (это адрес символа <ENTER>), а в регистр HL загружаем (22) значение системной переменной STK END число из ячейки 23653. Бейсик-система заканчивается адресом (STK END)-1, а с адреса (STK END) начинается свободная область памяти. Сохраним (23) эту величину на стеке. Теперь (24) из HL вычтем DE. Получим длину блока, который надо отодвинуть для размещения добавочных байтов. Перепишем (25) это число через стек из HL в BC. далее (26) снимем со стека значение STK END в регистр DE и число добавочных байтов в регистр HL. сложив их (27), получим (в регистре HL) новое значение STK END. Теперь (28) его можно занести в память в таблицу системных переменных.

Далее (29), поменяв между собой содержимое регистров HL и DE, получим в HL -бывшее значение STK END, а в DE - новое значение STK END. Уменьшив HL на единицу (30), получим последний адрес Бейсик-системы, которую надо отодвинуть (путем переброски) на величину добавляемых байтов. Адрес "места назначения" перебрасываемого блока кодов получится (31) в результате уменьшения на единицу содержимого DE. В BC к этому моменту находится длина перебрасываемого блока - начиная с символа <ENTER> - конца начальной строки до величины STK END.

Для переброски блока кодов используется (32) команда LDDR, а не LDIR, так как LDDR начинает переброску со старших адресов и заканчивает младшими, что сохраняет массив кодов при частичном наложении (см. "Программирование в машинных кодах"; М.:"ИНФОРКОМ", 1990,1992, 271 стр.).

К моменту завершения переброски массива, в регистре HL будет 23759 - адрес последнего "непереброшенного" байта. Увеличив (33) это значение на единицу, получим адрес первого "добавочного" байта. Иными словами - это адрес первого байта за REM (то есть 23760).

Для того, чтобы полученную REM-область очистить от прежних кодов - остатков переброшенной Бейсик-программы (заполнить например нулями), воспользуемся командой LDIR. Для этого сделаем следующее. Запишем (34) в первую ячейку за REM -ноль. Затем (35) перенесем через стек содержимое HL в регистр DE и увеличим (36) на единицу содержимое DE. Теперь (37) снимем со стека число добавочных байтов в регистр BC и уменьшим это число на единицу (так как в одну ячейку мы уже занесли ноль). При выполнении LDIR (38) происходит следующее. Из ячейки 23760 ноль переписывается в 23761, затем из 23761 - в 23762 и так далее, пока не заполнится нулями вся добавочная REM-область кодов.

Вместо нуля можно задать любой другой код, изменив числовой параметр в команде (34). Задав, например, 32 (#20), вся добавленная REM-область заполнится пробелами, а задав 137 - графическими символами типа "шахматная клетка".

На этом работа по формированию REM-области заканчивается. Если на месте команды NOP (39) поставить RET, то произойдет возврат из машинного кода в вызывающую Бейсик-программу. Но в данном варианте происходит переход на дальнейшее выполнение программы в машинных кодах (40). Этот небольшой фрагмент служит для удаления строк с 1 до 10000 вызывающей Бейсик-программы. Строка с REM-областью имеет теперь номер 0 и не удаляется. Этот блок кодов (40) взят из ZX-РЕВЮ N3 за 1991 г. со стр. 50, поэтому я не останавливаюсь на нем подробно. В результате действия этого блока кодов в памяти компьютера останется только нулевая строка с REM-областью. Ее можно теперь записать на магнитофон или соединить с необходимой Бейсик-программой при помощи MERGE.

Для того, чтобы получить блок кодов "REM FILL", наберите программу на Бейсике:

10 LET N=23296: LET S=0 20 FOR X=N TO N+136 30 READ Y 40 POKE X.Y 50 LET S=S+Y 60 NEXT X

70 IF S<> 12985 THEN PRINT FLASH 1;"ERROR": STOP 80 SAVE "REM FILL"CODE 23396,137 90 STOP

100 DATA 1,2,0,42,75,92,9,34,75,92,42,85,92,9,34,85,92,42,89,92,9,34,89,92 110 DATA 42,91,92,9,34,91,92,42,93,92,9,34,93,92,42,97,92,9,34,97,92,42,99, 92,9,34,99,92

120 DATA 221,42,83,92,221,229,221,54,0,0,221,54,1,0,221,102,3,221,110,2,229,

9,221,116,3,221,117,2 130 DATA 209,19,19,19,225,25,197,197,235,42,101,92,229,237,82,229 140 DATA 193,209,225,25,34,101,92,235,43,27,237,184,35,54 150 DATA 0,229,209,19,193,11,237,176,0

160 DATA 33,1,0,205,110,25,229,33,16,39,205,110,25,209,205,229,25,201

Если Вы все набрали правильно, то программа сформирует и выдаст для записи на магнитофон блок кодов под именем "REM FILL". В строке 150 первое значение DATA определяет код символа, которым будет заполнена REM-область.

Бейсиковая часть программы "REM FILL" выглядит следующим образом:

1 REM 10 LOAD "REM FILL"CODE 23296 20 INPUT "No. of extra bytes:"; n

30 RANDOMIZE n: POKE 23297, PEEK 23670: POKE 23298, PEEK 23671 40 CLEAR : RANDOMIZE USR 23296

Программа стартует сначала, загружая блок кодов "REM FILL". Затем в строке 20 запрашивается, на сколько байтов надо увеличить начальную строку. (При этом в строке 1 после REM уже может находиться какая-либо информация, например, Ваша фамилия и телефон. Добавочные байты будут расположены после этой информации.) Строка 30 преобразует число добавочных байтов в двухбайтную форму и записывает полученное значение в ячейки 23297, 23296, подготавливая данные для блока кодов. Затем стартует блок кодов "REM FILL". В результате, после сообщения 0 ОК. будет сформирована строка с заданным числом байтов после REM, номер этой строки станет 0, а все остальные строки Бейсик-программы будут уничтожены.

А теперь вернемся к нашему дебюту программы "PROG". В этом случае для формирования нулевой строки надо на запрос о числе добавочных байтов ответить: 1073. После того, как нулевая строка необходимой длины будет сформирована, наберите (или догрузите) текст программы "PROG". (Ho не запускайте ее. Кроме этого, во избежание ошибок, подставьте RETURN: в начало строки 10. Это отключит пока блок кодов "ON ERROR GO TO" до тех пор, пока не будет набита, отлажена и работать без ошибок вся программа. Только после этого можно начинать вторую часть работы - отладку программы с блоком "ON ERROR GO TO", удалив RETURN из начала строки 10.)

Теперь можно загрузить в REM-область заранее подготовленные символьный набор, блок UDG и другие блоки кодов:

LOAD "CHR"CODE 23760,768 LOAD "UDG"CODE 24528,168 LOAD "ON ERR"CODE 24696,73 LOAD "SOUND 1"CODE 24769,32 LOAD "SOUND 2"CODE 24801,32

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

Что касается блоков кодов "SOUND 1" и "SOUND 2", то они сформированы при помощи программы "SPECSOUND" фирмы "OZ SOFTWARE". Те читатели, которые не имеют этой программы, могут получить указанные блоки (для записи на магнитофон), набрав и запустив следующую Бейсик-программу:

10 LET N=23296: LET S=0 20 FOR X=N TO N+63 30 READ Y 40 POKE X,Y 50 LET S=S+Y 60 NEXT X

70 IF S<>6020 THEN PRINT FLASH 1;"ERROR": STOP

80 PRINT AT 10,12;"SOUND 1": RAHDOMIZE USR 23296: PAUSE 50: PRINT AT 10,18;"2": RANDOMIZE

USR 23328: PAUSE 100 90 CLS : SAVE "SOUND 1"CODE 23296,32: SAVE "SOUND 2"CODE 23328,32 100 DATA 14,1,6,5,33,224,1,197,17,70,0,229,205,181,3,225,17,40,0,237,

82,193,16,239,62,2,12,65,184,32,227,201 110 DATA 14,1,6,100,33,200,0,197,17,10,0,229,205,181,3,225,17,2,0,237, 90,193,16,239,62,2,12,65,184,32,227,201

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

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

И, в заключение, еще один момент. Если Вы размещаете блоки кодов в нулевой строке Бейсик программы, то отсутствует жесткая привязка этих кодов к конкретным адресам памяти компьютера, а есть только привязка к началу Бейсик-программы -системной переменной PROG. Если Вы работаете с магнитофоном и у Вас нет планов обзаводиться дисководом, то все будет нормально. Если же Вы решите в будущем адаптировать Вашу программу для работы с дисковой операционной системой TR-DOS, то вы должны знать, что для работы этой системы в памяти компьютера выделяется дополнительно 112 байт ОЗУ, в которых хранятся новые системные переменные, связанные с работой TR-DOS. Эти дополнительные байты расположены непосредственно перед Бейсик-программой, поэтому последняя отодвинута на 112 байт в памяти компьютера и системная переменная PROG имеет значение не 23755, а 23867. Так что при работе с дисковой операционной системой все обращения к кодам нулевой строки должны быть смещены на 112 байт.

Аналогичные сюрпризы могут возникнуть не только при работе с дисковой операционной системой. В частности - если Вы пользуетесь ПЗУ "TURBO-90", которое имеет встроенный МОНИТОР и возможность загрузки программ с магнитофона с удвоенной скоростью. В некоторых режимах работы этого ПЗУ происходит сдвижка Бейсик-программы в область более старших адресов.

Ключей к избавлению от этих "подводных камней" является тот факт, что куда бы ни была сдвинута Бейсик-программа, ее место всегда указывается в системной переменной PROG. Исходя из этого, начало символьного набора в нулевой строке можно представить как (PROG)+5. При этом CHARS=(PROG)+ 5-256=(PROG)-251, начало UDG-графики (PROG)+5+768=(PROG)+773, начало блока "ON ERROR GO TO" будет: (PROG)+5+768+168=(PROG)+941 и т.д.

Теперь надо изменить некоторые строки нашего "дебюта":

7 RANDOMIZE PEEK 23635+256*РЕЕК 23636+773:POKE 33675, РЕЕК 23670: POKE 23676, РЕЕК 23671:

RETURN : REM UDG

8 RANDOMIZE PEEK 23635+256*РЕЕК 23636-251: POKE 23606, РЕЕК 23670: POKE 23607, РЕЕК 23671:

RETURN : REM RUS

10 POKE РЕЕК 23635+256*РЕЕК 23636+993, РЕЕК 23670: POKE РЕЕК 23635+256*PEEK 23636+994,РЕЕК

23671: RANDOMIZE USR (PEEK 23635+256*РЕЕК 23636+941): RETURN

Строку 9 изменять не надо. Вызов звуков SOUND 1 и SOUND 2 может осуществляться через GO SUB. Определим для этого, скажем, строки 11 и 12:

11 RANDOMIZE USR (PEEK 23635+256*РЕЕК 23636+1014): RETURN

12 RANDOMIZE USR (РЕЕК 23635+256*РЕЕК 23636+1046): RETURN

Тогда вызов SOUND 1 будет GO SUB 11, a SOUND 2 GO SUB 12.

Этот вариант обращения к кодам нулевой строки предпочтительнее, он гораздо более универсален, так как не требует какой-либо переделки для адаптации программы под БЕТА-ДИСК интерфейс, да и в других случаях не принесет Вам сюрпризов. Но, поскольку ничего в природе не дается даром, то такой вариант имеет и свой недостаток - он медленнее работает. Работая над программой, оцените сами, существенно ли это замедление для Вас, и решите, какой вариант Вам более подходит.

Рассматривая дебют программы "PROG", я упомянул о том, что со строк 200, 300... могут быть расположены меню программы. В следующей статье мы подробно рассмотрим возможный вариант такого меню. Оно достаточно эффектно выглядит на экране и легко переналаживается на разные режимы работы.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Осторожно ГЛЮК ! - о глюках непростых, а очень опасных и вредных.
Стихи - Обещание.
Игротека -Перспективные проекты.
Бред - Рязанская сцена.
А за базаР... - письмо от юзера из Иркутска.

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