В.И. Сулханов

«ЭЛЕКТРОНИКА БК-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, которые одолели и не такие «необычности».

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

Что же касается «необычности», то этот термин говорит сам за себя: чего не знаешь, то и необычно. Если же разобраться по существу, то главная необычность Форта заключена в стереотипе мышления программирующего на императивных языках. По мере «вхождения» в Форт мышление быстро адаптируется.

Какими же «плюсами» отличается Форт от остальных языков?

А чем ещё необычен Форт? Вот несколько примеров:

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 ;

и т.д.

И теперь можно вводить строки формул «обычным» способом (без скобок!).

Вообще говоря, возможности Форта, как тема для разговора, не имеют видимых границ, и вы наверняка откроете для себя много нового в чудесном мире Форта.

 

Performed by © gid, 2012-2022.