В.И. Сулханов
«ЭЛЕКТРОНИКА БК-0010» и УКНЦ
Многие владельцы БК, желая работать на профессиональной машине под стандартной ОС, приобрели УКНЦ (МС-0511). Продавать БК не хочется, уже накоплено несколько тысяч программ, да и детишки (внуки, племянники, гости) с удовольствием на ней играют.
А не создать ли многопроцессорный комплекс? Технически это сделать совсем несложно, - достаточно соединить параллельные порты машин.
┌──────────────────────────┐ ┌──────────────────────────┐ │ Выходной порт УКНЦ │ │ Входной порт УКНЦ │общий ├──────────────────────┬───┤ ├──────────────────────┬───┤провод │ Р Е Г И С Т Р - A │ C │ │ Р Е Г И С Т Р - B │ C │ УКНЦ └┬──┬──┬──┬──┬──┬──┬──┬┴─┬─┘ └┬──┬──┬──┬──┬──┬──┬──┬┴─┬─┘ ─┬─ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 0│ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 7│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ | | | | | | | | | | | | | | | | | | | │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ │ ┌┴──┴──┴──┴──┴──┴──┴──┴──┴─┐ ┌┴──┴──┴──┴──┴──┴──┴──┴──┴─┐ ─┴─ │ Р Е Г И С Т Р - 177714 │ │ Р Е Г И С Т Р - 177714 │общий ├──────────────────────────┤ ├──────────────────────────┤провод │ Входной порт БК │ │ Выходной порт БК │ БК └──────────────────────────┘ └──────────────────────────┘
Теперь, если написать соответствующее программное обеспечение на обе машины, появятся следующие возможности:
- можно хранить программы БК на флоппи-дисках УКНЦ, что несомненно дешевле и оперативнее.
- можно писать и транслировать БК-ные программы на УКНЦ, и сразу же исполнять их на БК.
- можно (для виртуозов) для ускорения выполнения задания исполнять его сразу на всех процессорах.
Ниже приводится текст программы на ассемблере для БК, которая проверяет состояние порта УКНЦ (3-я и 5-я строки программы), и при получении от УКНЦ соответствующей команды либо читает файл из УКНЦ, либо читает первый встреченный файл с магнитофона и направляет его в УКНЦ. Программу разумнее всего "зашить" в ППЗУ типа 573РФЗ. Можно использовать ОЗУ на микросхеме 537РУ11А с 3-х вольтовым аккумулятором или миниатюрной батарейкой. Данная микросхема имеет объём 512 байт и потребляет в режиме хранения доли микроампера. Эти микросхемы имеют (строенный интерфейс МПИ и непосредственно устанавливаются в свободное место в блоке МСТД. Мы рекомендуем программировать микросхему на начальный адрес 120000 и отключить ФОКАЛ. Адрес 120000 удобен тем, что после включения машины программа сразу начинает работать и не требуется никаких действий на БК. Если это вас не устраивает, то лучше использовать для ОЗУ микросхему 537РУ11А, начальный адрес которой легко изменять, записывая в ячейку 177760 значение необходимого вам начального адреса.
;программа на стороне БК BK: MOV # 177714,R1 MOV (R1),R0 ;ЧИТАЕМ ПОРТ CMP #333,R0 BEQ BKU CMP #111,R0 BEQ UKB BR BK ;------ ЧИТАЕМ ИЗ УКНЦ UKB: MOV #177714,R1 JSR PC,CH RTS PC HALT BKU: JSR PC,ZAP ;ЧИТАЕМ ПЕРВЫЙ ВСТРЕЧНЫЙ TSTB @#301 ;ЕСЛИ ПЛОХО ПРОЧИТАЛОСЬ BEQ MB3 MOV #40,R1 MOV #7,R0 MB2: EMT 16 ;ТО ГУДИМ 40 РАЗ SOB R1,MB2 BR BK ;И СНОВА ЧИТАЕМ MB3: MOV #12,R3 ;КОЛ-ВО СЛОВ В ИМЕНИ... MOV #346,R2 ;НАЧАЛО ИМЕНИ MOV #1000,R0 ;НАЧАЛЬНЫЙ АДРЕС ПРОГРАММЫ MOV R0,R4 ;ЗАПОМНИЛИ ДЛЯ П/П ПЕРЕПИСИ НА ДИСК MB4: MOV (R2)+,(R0)+ ;ДАЛЕЕ ИМЯ, SOB R3,MB4 MOV @#266,R5 ;ДЛИНА МАССИВА ADD #24,R5 ;ПОЛНАЯ ДЛИНА МАССИВА В БАЙТАХ. MOV #222,(R1) ;СООБЩАЕМ О ЗАВЕРШЕНИИ ЧТЕНИЯ С МЛ MB5: CMP #123,(R1) BNE MB5 JSR PC,PER ;ПЕРЕДАЕМ НА ДИСК И... JMP BK ;ВСЕ С НАЧАЛА... ;П/П ПЕРЕДАЧИ НА ДИСК ЧЕРЕЗ ПАРАЛЛЕЛЬНЫЙ ПОРТ PER: MOV #177714,R1 PE2: BIT (R1),#400 ;ПРОВЕРЯЕМ ГОТОВНОСТЬ УКНЦ BEQ PE2 MOVB (R4)+,R0 ;БЕРЕМ ОЧЕРЕДНОЙ БАЙТ BIS #400,R0 ;ДОБАВЛЯЕМ СТРОБ MOV R0,(R1) ;И ПЕРЕДАЕМ В ПОРТ. P2: BIT (R1),#400 ;ПРОВЕРЯЕМ СНЯТИЕ ГОТОВНОСТИ УКНЦ BNE P2 CLR (R1) ;ОЧИЩАЕМ ПОРТ SOB R5,PER ;И ВСЕ ПОВТОРЯЕМ, ПОКА НЕ КОНЧИТСЯ ФАЙЛ. RTS PC ;И ВСЕ.... ;П/П ЧТЕНИЯ ПЕРВОГО ФАЙЛА ZAP: JSR R4,@#110346 ;ЗАПОМИНАНИЕ R0-R4 MOV #320,R1 ;АДРЕС БЛОКА ПАРАМЕТРОВ MOV R1,@#306 MOV #177716,R3 ;АДРЕС ПОРТА CLR @#300 ;ЗДЕСЬ ТИП ЗАПИСИ И ОТВЕТ CLR @#302 ;ПОДСЧИТЫВАТЬ КС MOV @#4,-(SP) MOV #116214,@#4 ;НОВЫЙ ВЕКТОР ПО СТОП MOV SP,@#310 ;УКАЗАТЕЛЬ SP ПРИ ВХОДЕ MOV #20,(R3) ;ПУСК ДВИГАТЕЛЯ MOV #1024,@#264 ;В ОЗУ MOV #20040,@#326 ;ИМЯ НАЧИНАЕТСЯ С ПРОБЕЛА MOV #1,@#304 ;ШАГ ПО ОЗУ MOV #40,R5 JSR PC,@#116712 ;ПОИСК НАЧАЛА ФАЙЛА MOV @#306,R1 ADD #26,R1 MOV #24,R2 JSR PC,@#117260 MOV #10,R2 M1: MOV -(R1),177754(R1) SOB R2,M1 MOV -(R1),@#266 JSR PC,@#117154 ;СОБСТВЕННО ЧТЕНИЕ ФАЙЛА MOV #220,(R3) ;ОСТАНАВЛИВАЕМ МОТОР И JMP @#116212 ;УХОД, ТАМ ЕСТЬ RTS PC ;П/П ЧТЕНИЯ ИЗ УКНЦ CH: MOV #346,R2 MOV #24,R3 MC1: JSR PC,CB MOVB R0,(R2)+ SOB R3,MC1 ;РАСПИСАЛИ ПО БЛОКУ ПАРАМЕТРОВ MOV @#346,R2 MOV R2,@#264 MOV @#350,R3 MOV R3,@#266 ;ЗДЕСЬ ДЛИНА В БАЙТАХ MC2: JSR PC,CS MOVB R0,(R2)+ SOB R3,MC2 RTS PC ;П/П ЧТЕНИЯ ОДНОГО БАЙТА CB: MOV #200,(R1) ;ШЛЕМ ГОТОВНОСТЬ CS1: BIT (R1),#400 ;ЕСТЬ СОПРОВОЖДЕНИЕ? BEQ CS1 MOV (R1) R0 ;ЗАБИРАЕМ КОД CLR (R1) ;И СНИМАЕМ ГОТОВНОСТЬ CS2: BIT (R1),#400 BNE CS2 ;СНЯЛИ СОПРОВОЖДЕНИЕ? BIC #177400,R0 ;ЗАПОМИНАЕМ БАЙТ RTS PC ;И ВСЕ... .END BK
Вся программа занимает менее 310 байт
На стороне УКНЦ создана программа (BUB.SAV), высвечивающая директорию рабочего диска. Одно из имён подсвечено. Перемещая подсветку, вы выбираете нужную программу для исполнения на БК.
Работа с системой исключительно проста. Включаются обе машины. Дисплей подключается к УКНЦ. Если БК используется для игр, то её можно подключить к цветному телевизору. Предполагаем, что на рабочей дискете предварительно записаны программы БК. Загружаем систему на УКНЦ и вызываем программу BUB.SAV. Перемещаясь по директорию, находим нужную игру и нажимаем <ВВОД>. УКНЦ переписывает программу с дискеты в БК и сообщает вам об этом. Если загруженная программа с автозапуском, она немедленно начинает исполняться. Никаких специальных действий на БК производить не нужно, т.к. БК после включения или сброса автоматически переходит на выполнение программы ВК SAV.
Если вы ещё не создали дискету с программами БК, то следует подключить к БК магнитофон, установить кассету с программами, которые необходимо переписать на дискету, и включить систему. Запускается программа BUB.SAV, в директории выбирается последняя пустая строка и нажимается <ВВОД>. Всё остальное сделает УКНЦ. БК начнёт читать с кассеты, и после каждого прочитанного файла на дисплее УКНЦ будет появляться имя прочитанного файла. Вам остаётся принять решение, записывать ли прочитанную программу на диски УКНЦ и не следует ли изменить имя программы. Все необходимые подсказки появляются на экране. Корректировать имена приходится потому, что УКНЦ хранит файлы с именами размером не более 6 букв, и только латинских. Впрочем, уникальное имя программы БК не теряется и при переписывании с диска УКНЦ на БК оно, как и положено, занимает своё место начиная с адреса 352.
Если вы решили соединить свои УКНЦ и БК и у вас возникли проблемы, вам помогут в клубе УКНЦ, информация о котором была опубликована в «ИНФО» №6 за 1992 г.
Ю.В. Котов, г. Москва
ЭКОНОМНОЕ ПРОГРАММИРОВАНИЕ ДЛЯ БК-0010.01 И БК-0011М
Известен «главный» недостаток ПЭВМ БК-0010.01 - малый объём оперативной памяти, который значительно усугубляется недостатками системы обработки зашитого в них Бейсика с объёмистым «объектным кодом». Существенная часть ОЗУ тратится также на таблицу адресов строк. Таблица поневоле получается длинной из-за недостатка данной реализации Бейсика, не позволяющей записывать в одной строке несколько операторов. В итоге в БК-0010.01 может работать примерно вдвое более короткая программа, нежели это было бы возможно при наличии интерпретатора (можно сравнить с допустимым объёмом программ на Фокале).
Попытки работать с загружаемым с магнитной ленты или даже диска Бейсиком либо другим языком не дают существенного выигрыша (чаще приводят к проигрышу). Происходит это из-за необходимости занимать ОЗУ интерпретатором или компилятором, а также подпрограммами операций с нормализованными числами и вычисления функций. Надо сказать, что «штатный» режим работы с Бейсиком, когда в ПЗУ находится система обработки с подпрограммами арифметики и вычисления функций, а в ОЗУ одновременно исходный текст, объектный код (условное подобие машинной программы), таблицы и данные удобен лишь для отладки программ и в ситуациях, когда программа должна сработать всего один или несколько раз. Если же готовится программа для долгой жизни и многократного использования, этот режим неэффективен. После отладки программы становятся не нужны ни повторные трансляции, ни загрузка памяти лишними теперь таблицами и исходным текстом. Любопытно, что в имеющейся реализации Бейсика почти всё сделано для того, чтобы объектный код мог работать без таблиц и исходного текста. Но «почти» не есть «да». И хотя иногда можно искусственно заставить работать объектный код самостоятельно - память уже распределена, сам код непереместим и практического выигрыша просто так не получишь.
Конечно, разработчики давно должны были учесть критику и рациональные предложения и обновить систему, введя возможность записи в одной строке нескольких операторов, добавив команду «MERGE», исправив ошибку в обработке многомерных массивов и другие ошибки. Следовало бы также предусмотреть режимы записи на носитель и загрузки объектных кодов с настройкой адресов и интерпретацией этих кодов без исходных текстов. Но где ныне эти разработчики?
Надо также отметить, что объектный код неэкономичен, объёмист, он имитирует нуль-одноадресную «стековую» квазимашину, причём и код операции, и адрес занимают... 16 бит (где это видано?!). В итоге на одну операцию А%=А%+1% без учёта исходного текста уходит 20 байт.
Понятно, что автоматически генерировать эффективный промежуточный код - задача сложная, и тем не менее из-за отсутствия этой возможности практическая ценность машины существенно снижена.
А что вместо Бейсика? Работа на типовом ассемблере по замыслу и сложности не сравнима с работой на языке высокого уровня, да ещё для многих приложений - математических, геометрических, физических и т.п. - неэффективна из-за примитивности процессора, который не имеет даже команд умножения-деления целых чисел, не говоря уже о нормализованных. Целесообразно было бы разработать специализированный «макроассемблер», совместимый с системой обработки Бейсика и использующий её ресурсы для реализации нормализованной арифметики и вычисления функций, но, по имеющимся сведениям, такого нет.
Практическая работа над программами увеличенной сложности показала, что переход на программирование в машинных кодах с использованием ресурсов обрабатывающей системы Бейсика (фактически программирование в операциях объектного кода) позволяет разместить в ОЗУ вдвое более сложные (длинные) программы, чем на Бейсике. Дополнительная экономия ещё примерно в полтора раза достигается для длинных программ реализацией подобия двухадресных команд «квазимашины» на уровне объектного кода.
Подобные машинные (или квазимашинные) программы могут работать совместно с Бейсиком как подпрограммы, вызываемые оператором USR. Разработана методика обращения к этим подпрограммам с передачей им фактических параметров списком через особым образом организуемые функции пользователя типа FN.
Используя специальную кодировку с дополнительными таблицами, при некоторых ограничениях и очень незначительном снижении быстродействия можно ещё почти вдвое снизить затраты ОЗУ; в результате по сравнению со штатным программированием на Бейсике ожидается примерно пятикратный рост объёма вмещаемых в ОЗУ программ.
Конечно непосредственное (ручное) программирование в условных псевдокодах и машинных командах - дело очень кропотливое и рядовому пользователю (начинающему программисту) малодоступное. Нужны специализированные трансляторы. Первоначально они могут быть функционально ограниченными, например, обеспечивать обработку только арифметических операций с целыми и нормализованными числами, вычисление функций, а также минимум операций управления (переходы, циклы, вызовы подпрограмм). Исходный же текст на особом языке программирования может где-то напоминать «автокод», не обязательно поднимаясь до уровня, подобного алгебраической записи формул.
Редакция приглашает заинтересованных программистов заняться решением этой проблемы. Описания лучших разработок будут опубликованы.
И. Л. Андронов, г. Одесса
ОДА ФОРТУ
Впервые реализация Форта для БК-0010 появилась в 1986 г. трудами ленинградцев М. Ефимова и А. Цаплева. По тем временам для пользователей БК-0010 это был настоящий прорыв замкнутого круга под названием «Фокал». Однако первые радостные голоса быстро утихли, когда выяснилось, что Форт на БК-0010 оставляет пользователю всего лишь 3-3.5 Кб памяти, чего может хватить разве только для учебно-познавательных целей. Причина этого - ставший притчей во языцех мизерный ресурс ОЗУ БК-0010. Поэтому Форт для БК-0010 версии 1986 года не получил распространения.
Все другие причины непопулярности Форта, в том числе и его необычность, я считаю необоснованными. Утверждать обратное - значит подвергать сомнению «расторопность» пользователей БК-0010, которые одолели и не такие «необычности».
Ещё чаще говорят о сложности освоения Форта, но об этом почти всегда можно услышать только от тех, кто и не пытался серьёзно им овладеть. Вообще же, с учётом появившейся литературы о Форте и на основании личного опыта, смею утверждать, что Форт в освоении легче, чем Бейсик.
Что же касается «необычности», то этот термин говорит сам за себя: чего не знаешь, то и необычно. Если же разобраться по существу, то главная необычность Форта заключена в стереотипе мышления программирующего на императивных языках. По мере «вхождения» в Форт мышление быстро адаптируется.
Какими же «плюсами» отличается Форт от остальных языков?
- Широта и глубина мышления программирующего на Форте не ограничена закостенелыми формами. «Кирпичики», с помощью которых строится программа, весьма разнообразны как по количеству, так и по диапазону сложности. Более того, лексикон этих «кирпичиков» зависит исключительно от программиста и им же обогащается, так как Форт по своей природе расширяемый язык.
- После создания каждого нового определения программист легко «прощается с деталями, освобождая внимание для перехода на более высокий структурный уровень.
- Форт одинаково пригоден как для системного, так и для прикладного программирования.
- Форт для БК-0011 делает компьютер вполне «серьёзной» и «самостоятельной» машиной. Не секрет, что работа на БК-0011 до сих пор шла в основном по пути не всегда эффективного использования богатого программного обеспечения от БК-0010. А вот поместив Форт на БК-0011, пользователь получает в свои руки все ресурсы машины - и «HARDWARE» и «SOFTWARE».
- Форт устроен так, что легко приспосабливает для своих нужд «чужое» программное обеспечение. Так, в описываемой версии (VER 2.0 JAN 92), имеется слово «ВLOAD», позволяющее подгружать к Форту с магнитофона «чужие» программы в позиционно независимом коде (файлы, созданные «Меломаном», дизассемблер DISASM М. Цыпина и т.д.), а пакет арифметики с плавающей запятой напрямую использует подпрограммы из ПЗУ Бейсика.
- Пакет Форт-ассемблер создаёт интерактивную среду, более удобную, нежели при работе с MIRAGE, ОТЛ12 или, тем более, при работе в системах «MICRO». При этом Форт-ассемблер позволяет применять как локальные (в пределах одного определения), так и глобальные метки, где последними служат обычные Форт-слова (длиной до 31 символа).
- Форт имеет средства чтения EDASP-текстов.
- В Форте всегда присутствует свой редактор, по мощности сопоставимый с редактором EDASP.
- Если компилятор Бейсика долгое время был «закрытой зоной» для пользователей и лишь недавно «вскрыт» расторопным умельцами, то Форт сразу объявляет себя открытым для всех, даже для слабо подготовленных пользователей. Форт «насквозь просвечивается» такими мощными средствами самодокументирования, как REFORTH, DECOMPILER, DUMP.
- Сколько «слез пролито программирующими на Бейсике БК-0010.01 из-за отсутствия в системе того или иного оператора (MERGE, SPRITE, МАТ и др.)! А суть программирования на Форте как раз и заключается в создании (определении) новых нужных в данный момент слов-операторов, так что в некотором смысле можно говорить о неисчерпаемости Форта.
А чем ещё необычен Форт? Вот несколько примеров:
- В Форте возможно целочисленное умножение таких величин:
ОСТ 377 400 * (В Бейсике при этом произошло бы переполнение).
- Форт позволяет напечатать результат в нужном вам формате
1) ОСТ 377 400 * . ОСТ 377 400 * U.
Ответы соответственно будут -400 и 177400.
2) Поместим два кода символов в одно слово:
OCT ASCII Щ 400 * ASCII Я + U. <ВК> 176761
Теперь введите такую строку:
176761 SP @ 2 TYPE DROP ЯЩ
('DROP' здесь нужно лишь для того, чтобы не «засорять» стек данных, так как 'ТУРЕ' не предназначено для печати со стека и поэтому данные (176761) остаются на стеке после 'ТУРЕ').
Необычностей в Форте много, и среди них есть такие экзотические, что не отпугивают, а скорее завораживают своими чудесными и ценными свойствами. Что вы, например, скажете о возможности в Форте присваивать переменным не только величины, но и действия, т.е. переменная в некотором роде может стать оператором, и таким, каким вам заблаговолится!? Вот пример программы:
ОКТ VAR A VAR В VAR С ' NOOP С ! : ANSWER А @ В @ С @ EXECUTE ; : SUM ['] + С ! ANSWER ; : DIFFER ['] - С ! ANSWER ; : MUL ['] * C ! ANSWER ; : DIV ['] / C ! ANSWER ; : QUADR_SUM SUM DUP * ; : QUADR_DIFFER DIFFER DUP * ; 10 A ! 4 В !
(В зависимости от вводимого вами слова переменной 'С' присваивается соответствующий оператор, который исполняется словом 'EXECUTE').
Поговорим теперь о сложности освоения Форта. Да, Форт действительно достаточно сложен. Когда я впервые прочитал, что Форт изобретён Чарльзом Муром, то термин «изобретён» представился мне несколько высокомерным. Теперь же, когда Форт стал моим «вероисповеданием», я преклоняюсь перед гением создателя. Уровень погружения в Форт безмерен. Занимаясь Фортом уже более 3 лет, я всё ещё ощущаю себя юнцом, постоянно встречаясь всё с новыми и новыми откровениями, а количество непонятных вещей, пожалуй, даже растёт.
На следующих примерах я хочу показать, что самый консервативный учитель математики, усвоивший Бейсик «на всю оставшуюся жизнь», или самый нерадивый ученик 4-5 класса, на примере четырёх-пяти игр научившийся осмысленно стучать по клавиатуре, за 15-20 минут «инструктажа» или даже самостоятельно вполне могут усвоить на приведённых примерах простейший синтаксис и метод программирования на Форте (заодно попытайтесь-ка решить эти же задачки средствами Бейсика, и сравните результат).
Пример 1.
: TABLE ."СТОЛ"; : СТОЛ ."TABLE";
и т.д. - вот у вас уже и готов англо-русский и русско-английский словарь.
Форт позволяет «открытым текстом», в том числе и на русском языке записывать (а в этом языке программирования правильно записать - значит уже решить) условия задачи, оформляя их как «определения через двоеточие». Запустив на исполнение последнее слово '??', вы получите на своём экране строку с ответом.
: частей_алюминия 19; : частей_магния 2; : вес_разности 34; : разность_частей частей_алюминия частей_магния - ; : вес_одной_части вес_разности разность_частей / ; : вес_алюминия частей_алюминия вес_одной_части * ; : вес_магния частей_магния вес_одной_части * ; : ?? ." ответ: вес сплава =" вес_алюминия вес_магния +.." кг" ; ?? ответ: вес сплава = 42 кг
Обратите внимание: мы не использовали ни одной переменной. В решении этой задачи Форт показал нам ещё одну свою грань: Форт - это язык спецификаций. (В данном случае для решения задачи мы обошлись целочисленной арифметикой. Синтаксис при использовании арифметики с плавающей запятой тот же).
И в заключение хочу отметить следующее. Ещё одно «препятствие», по мнению многих оппонентов (постфиксная запись формул) также является, на мой взгляд, надуманным. Во-первых, Форт - стековая система, поэтому когда вы научитесь думать по-фортовски (а для этого надо немедленно начать программировать на Форте), постфиксная запись представится вам вполне естественной (кроме оправданных исключений, этот принцип прослеживается во всем словаре Форта). А во-вторых, весьма просто переопределить способ ввода на любой (но нужно ли это?). Вот пример для инфиксной записи.
:INFIX BL WORD NUMBER DROP ;
Теперь можно переопределить любые операторы:
: + INFIX + ; : - INFIX - ; : AND INFIX AND ;
и т.д.
И теперь можно вводить строки формул «обычным» способом (без скобок!).
Вообще говоря, возможности Форта, как тема для разговора, не имеют видимых границ, и вы наверняка откроете для себя много нового в чудесном мире Форта.