П.И. САРЫЧИХИН, С.А. ФРОЛОВ
БОЛЬШИЕ ПРОГРАММЫ НА БК 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.
Если в процессе ввода команд совершена ошибка, то она удаляется, как обычно, клавишей.
Заметим, что для успешного пользования программой необходимо:
- питание магнитофона должно включаться через реле управления питанием, которое находится в корпусе БК 0010;
- программные модули, которые будут выполняться последовательно, должны храниться друг за другом записанные во внутреннем формате Бейсик- системы;
- с помощью оператора «CLEAR» в командной последовательности должна быть организована область памяти, защищённая от Бейсик-системы, эта область может понадобиться для передачи данных из одного программного модуля в другой.
В результате эксплуатации программы может возникнуть ситуация, когда объём выполняемой программы настолько велик, что команды Бейсик-системы, которые необходимо выполнить для прогона программы, целиком не помещаются в текстовый буфер программы 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». Приведённая в ней программа действительно является очень полезной и просто необходимой в ряде случаев, однако в статье допущен ряд ошибок.
Во-первых, ошибки языка БЕЙСИК:
- В строке программы 56 DEF USR = 16128% пропущен знак равенства.
- В примере пакета команд (стр. 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 выполняется автоматически.