КОГДА НЕТ СЧЁТЧИКА

1.1 S А=1444
1.2 S A=A-2;J(FX(1,А)-2534) 1.2,1.3,1.2
1.3 А "НАБЕРИ НОМЕР, НАЖМИ ПУСК И ВВОД"N
2.1 S М=FITR(N/100);S B=A+6;D3
2.2 В M=N-M*100; S B=A+8;D3
2.3 T ! ,%4.00,N;D 9;S N=N+1;G 2.1
3.1 X FX(-1,B,12336+256*M-2559*FITR(M/10))
9.9 L S 0000

Если магнитофон не оборудован счётчиком, искать нужное место на магнитной ленте - трудное дело. Трудное, даже если между файлами записана какая-то информация с помощью микрофона. В то же время упростить поиск можно, стоит заранее разметить ленту, записав по всей её длине, метки - имена несуществующих программ или массивов. Тогда при чтении с магнитофона эти имена будут появляться на экране. Если воспользоваться той программой, что приведена выше, то программа будет записывать сама себя под возрастающими четырёхзначными цифровыми именами с интервалом примерно 3,3 с, то есть стандартная кассета МК-60 окажется разбитой примерно на 550 интервалов. Начальный номер выбирается произвольно. Это сделано для того, чтобы можно было размечать не только чистую ленту, но и такую, где с достаточными интервалами уже записаны какие-либо файлы. Специального места для хранения программа не требует, поскольку её можно вызвать из любого размеченного места ленты.

Как работать с программой? Запустив её, подматываем плёнку к началу разметки. Через несколько секунд после запуска на экране появляется директива - это срабатывает строка 1.3. Набрав начальный номер, включаем магнитофон на запуск и нажимаем ВВОД. Периодически на экране появляется очередной номер и слышится характерный звук записи (2.3 и 9.9). Кратко поясню назначение остальных строк. В 1.1 устанавливается достаточно большой адрес ячейки памяти А. Строка 1.2 находит ячейку с номером строки 9.9. Строка 2.1 подсчитывает количество сотен текущего номера и с помощью 3.1 изменяет надлежащим образом строку 9.9. Строка 2.3 аналогично поступает с последними двумя цифрами номера.

Изменения текста программы в процессе её выполнения - сравнительно редкий, но довольно мощный приём программирования. Чтобы его освоить, важно хорошо представлять структуру распределения текста программы в памяти машины. На Фокале для программ пользователя отводится часть ОЗУ, начиная с ячейки 1024. Записи строк образуют как бы очередь. Каждая новая строка записывается в хвост очереди с первой свободной ячейки, а если строка удаляется, то очередь смыкается. Запись каждой строки начинается с ячейки, где записано число - сдвиг к разделителю, стоящему перед следующей строкой. Вторая ячейка записи строки содержит в старшем байте целую часть номера, а младший байт - это произведение числа 256 и дробной части номера. Далее следует запись содержания строки программы, при этом 15 знаков (среди них + - / " = ) кодируются нестандартно - числами от 128 до 143. Завершает запись строки байт 142. Если он оказывается младшим для текущей ячейки, старший байт остаётся нулевым. Таким образом, запись строки не содержит никаких байтов для хранения «начального» пробела, отделяющего номер строки от текста оператора, как считает Ф. Суханов из Омска (№ 10, 1987 г.).

Н. ПЕТРИ (г. Москва).


НЕСКОЛЬКО СЛОВ О ПРЕРЫВАНИИ

Что произойдёт, если во время работы программы нажать какую-либо клавишу на клавиатуре БК? В специальную ячейку оперативного запоминающего устройства (её называют регистром данных клавиатуры) поступает код нажатой клавиши. Чтобы быть совсем точным, следует сказать, что адрес регистра - 177662, а код клавиши записывается в младшие восемь разрядов этого регистра. Код сохраняется в регистре все время, пока не будет нажата другая клавиша, то есть пока в регистр не поступит новый код.

Если нажатая клавиша - это СТОП, то выполнение программы будет прервано, если ШАГ - выполнение программы приостановится. Происходит это потому, что специальная системная подпрограмма реагирует на коды этих двух клавиш и некоторых других управляющих клавиш, игнорируя нажатия всех остальных.

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

Теперь нажатие любой клавиши управления курсором в ходе исполнения основной программы будет обрабатываться подпрограммой. Если, к примеру, была нажата клавиша ↑, подпрограмма выполнит блок с адресами строк 50. Это может быть фрагмент, обеспечивающий смещение фигурки на экране на строку выше.

Вместо FX можно использовать и другие функции Фокала, например FSBR и FCHR(-1), но не столь эффективно. Кстати, такой алгоритм обработки прерываний справедлив и для других ЭВМ. Следует, однако, помнить, что адрес регистра данных клавиатуры может быть другим. Так, например, в СМ ЭВМ этот адрес - 177562.

10.10 С ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ КЛАВИАТУРЫ
10.19 I(FХ(1,177662)-8) 10.25.10.20,10.25
10.20 D 20;R;C ОБРАБОТКА КОДА 8 И ВОЗВРАТ В ПРОГРАММУ
10.29 I(FХ(1,177662)-25) 10.35,10.30,10.35
10.30 D 30;R;C ОБРАБОТКА КОДА 25 И ВОЗВРАТ В ПРОГРАММУ
10.39 I(FХ(1,177662)-26) 10.45,10.40.10.45
10.40 D 40;R;C ОБРАБОТКА КОДА 26 И ВОЗВРАТ В ПРОГРАММУ
10.45 I(FX(1,177662)-27) 10.55,10.50.10.55
10.30 D 50;R;C ОБРАБОТКА КОДА 27 И ВОЗВРАТ В ПРОГРАММУ
10.55 R;C ВОЗВРАТ В ПРОГРАММУ

 

А. ШЕЛОМАНОВ (г. Жуковский)

 

Performed by © gid, 2012-2022.