П.И. САРЫЧИХИН, С.А. ФРОЛОВ

БОЛЬШИЕ ПРОГРАММЫ НА БК 0010

У многих пользователей ПЭВМ БК 0010 вызывает неудовлетворение заметная диспропорция между значительными возможностями 16-разрядного процессора серии КР1801 и весьма малым объёмом ОЗУ. Ситуация до смешного напоминает ту, которая была на заре отечественной вычислительной техники: с одной стороны, процессор, способный выполнять до 300 тыс. оп/с, а с другой - 28 Кбайт памяти, да ещё в режиме работы БК 0010 с четырёхстрочным дисплеем. А как быть, если программа или файл не помещаются в память? Здесь можно рассмотреть два варианта решения - либо физическое расширение памяти, т.е. установить дополнительные блоки в БК 0010, что приведёт к увеличению стоимости самой машины, либо использовать имеющуюся внешнюю память на кассетном магнитофоне. Этот путь представляется наиболее доступным для большинства владельцев БК 0010. Однако БЕЙСИК (версия 1986 07.24), используемый в БК, не поддерживает команду MERGE, позволяющую объединять текст программы в оперативной памяти с программой на магнитной ленте магнитофона, что ограничивает объем выполняемых на ПЭВМ программ.

Включение команды MERGE в БЕЙСИК было бы весьма полезно именно для ПЭВМ с незначительным объёмом оперативной памяти, отведённой для нужд пользователя. Поэтому возможность реализации подобной функции, на наш взгляд, могла бы заинтересовать многих. Для этого необходимо написать управляющую программу на ассемблере, позволяющую выполнять последовательно команды Бейсик-системы, которые были предварительно записаны пользователем в память машины. Программа должна последовательно считывать их из памяти и передавать в Бейсик для их реализации. После выполнения Бейсиком очередной команды управление должно перейти в управляющую программу, которая начнёт считывать из памяти следующую команду. Такой переход из Бейсика в управляющую программу возможен всегда, когда в Бейсике выполняется командное прерывание ЕМТ 6. В этом случае в счётчик команд загружается адрес команды, находящийся в ячейке памяти с адресом 30. Теперь не трудно догадаться, что, если загрузить в ячейку 30 адрес управляющей программы, она начнёт выполняться, как только Бейсик переходит в режим ожидания информации с терминала, то есть переходит на выполнение командного прерывания ЕМТ 6.

Один из вариантов такой программы (получившей название COM.ASC) представлен в настоящей статье.

Программа COM.ASC написана для удобства пользования на языке БЕЙСЙК. Это позволяет пользователю при включении машины не переходить специально для загрузки программы на АССЕМБЛЕРе в режим монитора, а работать всегда в Бейсик-системе. Размещение машинных кодов данной программы осуществляется оператором БЕЙСИКА РОКЕ в память, начиная с адреса &О37400 (16128%). Последний оператор программы USR передаст управление размещённой программе.

После того как вы запустите программу на выполнение командой Бейсик-системы, должен погаснуть маркер. Теперь можно ввести последовательно команды Бейсик-системы.

Например:

CLEAR 200,&О20000/ВК/
CLOAD "PROG1"/BK/
RUN /ВК/
NEW /ВК/
CLOAD "PROG2" /ВК/
RUN /ВК/

Для того, чтобы запустить команды на выполнение, необходимо ввести символ «:». В показанном примере выполняются последовательно две программы PROG1 и PROG2, записанные на магнитной ленте во внутреннем формате Бейсика. Оператор CLEAR организует область памяти для передачи данных из PROG1 в PROG2.

Если в процессе ввода команд совершена ошибка, то она удаляется, как обычно, клавишей.

Заметим, что для успешного пользования программой необходимо:

В результате эксплуатации программы может возникнуть ситуация, когда объём выполняемой программы настолько велик, что команды Бейсик-системы, которые необходимо выполнить для прогона программы, целиком не помещаются в текстовый буфер программы COM.ASC. В связи с этим необходимо текстовый буфер программы COM.ASC корректировать в процессе выполнения программных модулей пользователя. Для этого следует в процессе выполнения программы занести в текстовый буфер (первая ячейка которого имеет адрес &O37614 включительно) по символике в каждый байт новую последовательность команд, разделяя их символом ВК (12).

Затем в ячейку с адресом &О37602 (в ней хранится адрес первого символа следующей выполняемой команды) занести число &O37614.

В настоящее время многие пользователи имеют возможность с помощью БК 0010 дистанционно управлять магнитофоном. Использование программы COM.ASC в данном случае позволяет ещё больше расширить возможности БК 0010 в этом направлении и реализовать работу сложных программных систем в оверлейном режиме.

1.   РОКЕ   16128%,  &O12737
2.   РОКЕ   16130%,  &O37614
3.   РОКЕ   16132%,  &O37600
4.   РОКЕ   16134%,  &O12737
5.   РОКЕ   16136%,  &O37610
6.   РОКЕ   16138%,  &O37602
7.   РОКЕ   16140%,  &O104006
8.   РОКЕ   16142%,  &O104016
9.   РОКЕ   16144%,  &O110077
10.  РОКЕ   16146%,  &O154
11.  РОКЕ   16148%,  &O5237
12.  РОКЕ   16150%,  &O37600
13.  РОКЕ   16152%,  &O20027
14.  РОКЕ   16154%,  &O72
15.  РОКЕ   16156%,  &O1401
16.  РОКЕ   16158%,  &O766
17.  РОКЕ   16160%,  &O12737
18.  РОКЕ   16162%,  &O37450
19.  РОКЕ   16164%,  &О30
20.  РОКЕ   16166%,  &O207
21.  РОКЕ   16168%,  &O12737
22.  РОКЕ   16170%,  &O100112
23.  РОКЕ   16172%,  &O30
24.  РОКЕ   16174%,  &O11637
25.  РОКЕ   16176%,  &O37604
26.  РОКЕ   16178%,  &O5337
27.  РОКЕ   16180%,  &O37604
28.  РОКЕ   16182%,  &O5337
29.  РОКЕ   16184%,  &O37604
30.  РОКЕ   16186%,  &O17737
31.  РОКЕ   16188%,  &О106
32.  РОКЕ   16190%,  &O37510
33.  РОКЕ   16192%,  &O22737
34.  РОКЕ   16194%,  &O104006
35.  РОКЕ   16196%,  &O37510
36.  РОКЕ   16198%,  &O1405
37.  РОКЕ   16200%,  &O0000
38.  РОКЕ   16202%,  &O12737
39.  РОКЕ   16204%,  &O37450
40.  РОКЕ   16206%,  &O30
41.  РОКЕ   16208%,  &O2
42.  РОКЕ   16210%,  &O117700
43.  РОКЕ   16212%,  &O54
44.  РОКЕ   16214%,  &O5237
45.  РОКЕ   16216%,  &O37602
46.  РОКЕ   16218%,  &O23737
47.  РОКЕ   16220%,  &O37600
48.  РОКЕ   16222%,  &O37602
49.  РОКЕ   16224%,  &O1404
50.  РОКЕ   16226%,  &O12737
51.  РОКЕ   16228%,  &O37450
52.  РОКЕ   16230%,  &О30
53.  РОКЕ   16232%,  &O2
54.  РОКЕ   16234%,  &O42516
55.  РОКЕ   16236%,  &O5127
56.  DEF USR = 16128%
57.  А=USR(A)

 

Дополнения.

 

Уважаемая редакция, я с большим интересом прочитал в третьем номере [03'1989] серии «Вычислительная техника и её применение» статью П.И. Сарычихина и С.А. Фролова «Большие программы на БК 0010». Приведённая в ней программа действительно является очень полезной и просто необходимой в ряде случаев, однако в статье допущен ряд ошибок.

Во-первых, ошибки языка БЕЙСИК:

  1. В строке программы 56 DEF USR = 16128% пропущен знак равенства.
  2. В примере пакета команд (стр. 35) четвертой командой является несуществующая в БЕЙСИКе команда TEV, видимо имелась в виду команда NEW - удаление программы пользователя.

Однако и после исправления этих ошибок после запуска пакета команд на выполнение (введение символом «:») появляется сообщение об ошибках №2 (синтаксис) и №51 (ошибке выполнения программы в машинных кодах).

Первая ошибка связана с тем, что запись пакета команд происходит с адреса &O37614, а его считывание - &O37610, поэтому первые четыре символа команды, считываемой из буфера, являются случайными, что и приводит к синтаксической ошибке. Для её устранения надо изменить адрес считывания на &O37614, он задаётся в строке 5 программы. Должно быть:

5. РОКЕ 16136%, &O37614.

Вторая ошибка возникает в конце пакета программ, когда команда условного перехода &О1404 (49-я строка программы) передаёт управление по адресу 16234%, где находятся две не имеющие никакого отношения к программе команды: &O42516 и &O5127 (54 и 55 строки команды). Первая команда использует содержимое пятого регистра, который до этого в программе не использовался, а вторая команда инвертирует содержание следующей за ней ячейки памяти 16238%, содержимое которой также нигде до этого не определено. Далее выполняется следующая команда, содержащаяся в ячейке памяти 16240%; поскольку она не определена, это приводит к ошибке № 51.

Для устранения указанных недостатков целесообразно заменить команду условного перехода &O1404 на &O1403. Должно быть: 49. РОКЕ 16224%, &O1403.

Теперь в случае окончания пакета команд управление передаётся по адресу 16232%, где находится команда возврата из прерывания (код &O2), а выполнение этой команды приводит к передаче управления БЕЙСИК-системе.

Строки программы 54 и 55 удаляются.

После указанных выше исправлений программа становится работоспособной.

П.И. Павлов (Москва)

 

А. П. ГАРМАШЕВ, программист (г. Ленинград)

В седьмом номере вашего журнала за этот год [07'1989] опубликована заметка П.И. Павлова с исправлениями ошибок в тексте программы из третьего номера журнала «Большие программы на БК0010». Предложенные П.И. Павловым изменения в общем верны, но для выполнения примера последовательности команд БЕЙСИК-системы из статьи в третьем номере журнала необходимо в начало примера ввести строку NEW «ВК».

Коды &O42516 и &O5127 в строках 54 и 55 в кодировке ASCII соответствуют последовательности символов NEW и пробелу. С учётом адреса начала буфера в строке 5 очевидно, что команда NEW должна располагаться в начале буфера команд с адреса &O37610. Так что строки 54 и 55 необходимы, а адреса в них надо заменить соответственно на 16264% и 16266% (&O37610 и &O37612). Строку 5 сохраняем в редакции исходного текста программы. Пример выполнения последовательности команд теперь не нуждается в изменениях.

От автора. Строки 54 и 55 необходимы для пересылки начала текстового буфера, где хранятся команды БЕЙСИК-системы, команды NEW «ВК». После запуска программы команда NEW выполняется автоматически.

Performed by © gid, 2012-2022.