О. БЕЛОЗЕРОВ, В. ДОБРЯКОВ

Ну и что, что мала память!

Одним из эффективных приёмов решения проблемы малого объёма ОЗУ БК-0010 (в составе КУВТ-86) является оверлейное построение программ, так что в нужный момент в ОЗУ подгружаются блоки, необходимые в текущий момент времени для работы.

Основная часть ППС создаётся на Бейсике (Вильнюс-86), к числу очевидных недостатков которого следует отнести и невозможность использования операторов обращения к диску в программном режиме.

Вопросам памяти БК уделяется большое внимание. В частности, предложена следующая идея: обеспечить выполнение Бейсик-программы по заданному сценарию (Вычислительная техника и её применение. 1989. №3, №4; 1990. № 8). К сожалению, сценарий имеет жёсткую структуру, не предусматривающую её изменения в ходе выполнения.

Нам удалось устранить данный недостаток. Взяв за основу программу И.П. Березенцева и незначительно изменив способ управления, мы практически забыли о малой памяти БК, так как получили возможность создавать на Бейсике достаточно разветвлённые блочные учебные программы, имеющие возможность из одного блока загружать другой, запускать его, задавать последовательность выполнения программных модулей.

На листинге управляющая подпрограмма начинается со строки 5000. Перед обращением к ней необходимо определить переменную А$, придав ей значение последовательности выполняемых команд с включением управляющих кодов, например, код 10 - ВК (здесь и далее все значения кодов и адресов десятичные).

Учитывая возможные ошибки, возникающие в Бейсик-системе при работе с символьными переменными, лучше всего это сделать, определив соответствующую функцию пользователя (строки 90, 100).

В приводимом листинге из базовой программы вызывается модуль «TERMO1», при этом символьная переменная A принимает следующее значение (последовательность команд):

10 REM **************************** 
20 REM *                          *
30 REM * ОСНОВНАЯ ЧАСТЬ ПРОГРАММЫ *
40 REM *                          *
50 REM ****************************
60 ......
70 ......
80 REM <<< ЗАДАНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ КОМАНД >>>
90 DEF FNA$(A$)="NEW"+CHR$(10)+"CLOAD"+CHR$(34)+A$+CHR$(34)+",R"+ CHR$(10)+CHR$(3)
100 A$=FNA$("TT:TERMO1")
110 GOTO 5000
120 ......
130 ......
5000 REM <<<ПОДПРОГРАММА ЗАГРУЗКИ >>>
5010 DEF USR1=16128
5020 DEF USR2=16142
5030 DATA 5443,4930,5569,16222,-27503,32450,135
5040 DATA 2551,2,289,5623,16222,66,5599,16162,24
5050 DATA 135,9718,-18418,16,770,95,-32694,5047
5060 DATA 40,-6665,2,34,9727,-30714,28,757,-24640,24
5070 DATA 2743,20,9664,3,769,2,5599,-32694,24,95,-24420,0
5080 I%=16128
5090 READ A%
5100 POKE I%, A%
5110 I%= I%+2%
5120 IF A% THEN 5090
5130 A$=USR1(A$) 'ПЕРЕСЫЛКА ПЕРЕМЕННОЙ A$
5140 A%=USR2(A%) 'ЗАПУСК КОМАНД НА ВЫПОЛНЕНИЕ

Если после выполнения вызываемого программного модуля необходим возврат в исходную программу, то символьную переменную A$ необходимо определить так:

NEW <ВК>
CLOAD "TERMO1",R <ВК>

Внимание! В конце значения переменной A$ обязательно должен стоять управляющий код 3!

Базовый программный модуль, из которого передаётся управление, должен сохранить свою работоспособность (или восстановить работоспособность) при выполнении команды NEW. Для этого кодовый блок необходимо располагать либо в буфере ввода-вывода с адреса 16128 (см. листинг), либо в младших адресах стековой области с адреса 256. Выбор места следует производить исходя из следующих соображений: если используется буфер ввода-вывода, то в вызываемом программном модуле должны отсутствовать операторы PRINT и INPUT#, нельзя также использовать команды LOAD и SAVE. Если же предпочтение отдано стековой области, необходимо учесть, что разрушение кодового блока может произойти при закрашивании сложных контуров оператором PAINT.

Чтобы перейти в стековую область, в приведённом листинге число 16222 (строки 5030 и 5040) нужно заменить на 350 и число 16162 (строка 5040) - на 290.

Кроме того, надо изменить следующие строки:

NEW <BK>
CLOAD "TERMD1",R <BK>
NEW <BK>
CLOAD "<имя исходного файла>",В <BK>
5010 DEF USR1=256
5020 DEF USR2=270
5080 I%=256

Если возникает необходимость в применении «жёстких» сценариев, следует исключить строку 5140, задать символьную переменную А$ и после запуска подпрограммы записать сформированный новый управляющий блок на диск. При размещении в буфере ввода-вывода или в стековой области использовать соответственно команды

BSAVE "TT:<имя>",16142,16384
BSAVE "TT:<имя>",270,512

Более точно адрес конца программы подсчитывается для конкретного случая.

Запуск сценариев на выполнение производится командой

BLOAD "TT:<имя>",R

 

Е. ВОЛОДИН

БК-стихотворец

«Все мне пророчат счастье, но...
Вечная осень, багровые тона.
Устала я, устала я,
Хочу любить, всё жду чего-то.
Вечная осень. Что ж - судьба!
Устала я. Надежда блекнет...»

Научить БК писать стихи совсем несложно, даже если он имеет только встроенный Фокал, не предусматривающий обработку символьных переменных.

Предлагаю программу, которая доставит немало удовольствия начинающим поэтам и графоманам. Она состоит из двух частей. Первая (строки 1.3-1.7) - создание словаря, вторая - «сочинение» и вывод на экран дисплея готовых стихотворений.

На запрос программы «СОЗДАНИЕ [1] или ИСПОЛНЕНИЕ [2] ?:» выберите режим 1 и начинайте вводить слова, не забывая после каждого слова нажимать клавишу <ВВОД>. Клавиша <Q> - конец работы.

1.10 X FCHR(12);A "СОЗДАНИЕ [1] ИЛИ ИСПОЛНЕНИЕ [2]?",A;X FCHR(12)
1.20 I (1-A)1.8
1.30 S I=0;S J=1;S W=0;S P=0;S L=1
1.40 S I=I+1;S A(I,J)=FCHR(FCHR(-1))
1.50 I (A(I,J)-81) 1.60,2.60
1.60 I (A(I,J)-13) 1.40,1.70.1.40
1.70 S M(J)=I-1;S J=J+1;S I=0;T " ";G 1.40
1.80 A "ФOPMAT",X,"ДЛИНА",Y;X FCHR(12)
1.90 T " ОПУС N ".%2.00,L,!!
2.10 S J=FABS(FITR(FRAN()*N))+1
2.20 F I=1,M(J);X FCHR(A(I,J))
2.30 S W=W+1; T " "; I (W-X)2.10;T !
2.40 S P=P+1;S W=0;I (P-Y) 2.10;T !
2.50 S L=L+1;S P=0;I (FCHR(-1)-13)2-60,1.90
2.60 Q

Созданный массив сразу же запишите на магнитную ленту командой L О ИМЯ. Затем по команде М 2.1 войдите в режим редактирования строки и вместо переменной N подставьте число введённых слов. Снова запустите программу и переходите в режим 2. Запрос «ФОРМАТ»: обозначает требуемое количество слов в строке, а «ДЛИНА» - общее количество строк. Ознакомившись с первым образцом «творчества» БК, нажмите клавишу (ВВОД), компьютер выдаст следующее стихотворение и т.д.

Для получения более или менее осмысленных стихов требуется тщательный отбор слов: рекомендуется вводить не отдельные слова, а смысловые блоки, внутри которых строго соблюдены правила грамматики. Лучше всего удаются «белые» стихи абстрактного философского содержания (см. эпиграф), но можно получить и рифмованные стихотворения. Для этого нужно заранее позаботиться о ритме (например, «наша Таня громко плачет», ударение везде на первый слог и организовать в программе проверку кодов окончаний слов.

И ещё одно замечание: «поэтический талант» БК (впрочем, как и у людей) существенно зависит от словарного запаса.

Примечания: переменная I - порядковый номер буквы в слове с номером J; М(J) - общее количество букв в J-м словаре; W - счётчик слов в строке; Р - счётчик строк; L - номер стихотворения.


 

В. ВОРМСБЕХЕР, А. САЯПИН

Опыт рационального решения локальной сети с использованием IBM PC и БК-0011М

Анализ коллективного использования вычислительной техники в школах, институтах, малых (и не малых) предприятиях выявил ряд интересных особенностей.

Так, в подавляющем большинстве случаев (более 80%) достаточно мощная вычислительная техника - персональные компьютеры типа IBM, Apple, Macintosh используются крайне нерационально и гораздо ниже заложенных в них возможностей. В первую очередь это связано с использованием такой вычислительной техники вне локальных сетей. Уже одно это резко снижает доступность техники для большого круга людей, заинтересованных в ней. Нередки ситуации, когда машина, способная одновременно обслуживать несколько десятков пользователей, занимается одним-единственным и целыми днями услаждает его играми.

С другой стороны, опыт, накопленный в школьных компьютерных классах по использованию локальных сетей отечественного производства, показывает, что основным их недостатком оказывается отсутствие достаточно мощных накопителей информации (жёстких дисков) и невозможность использовать в их составе компьютеры, совместимые с IBM. Мы сознательно не касаемся остальных трудностей, возникающих в повседневной эксплуатации школьных классов типа УКНЦ-01.01 и их предшественников - об этом уже исписаны впустую груды бумаги.

В данной статье нам хотелось бы поделиться опытом рационального использования вычислительной техники в рамках локальных сетей, не требующих больших денежных затрат, базирующихся на отечественных ЭВМ БК-0011М и работающих под контролем разработанной нами операционной системы, выгодно отличающейся от заводской своей надёжностью и пользовательским комфортом.

Разрабатывая концепцию локальной сети, мы преследовали в первую очередь решение проблемы совместимости отечественной вычислительной техники, уже использующейся в локальных сетях и знакомой выпускникам наших школ, с достаточно мощной зарубежной техникой, имеющей ёмкие хранилища информации в виде винчестерских дисков. Мы также стремились обеспечить максимальную идентичность пользовательских интерфейсов всех наших программных средств с программами для IBM с целью минимизации проблем, связанных с переучиванием персонала. Помимо этого, нам хотелось дать реальную и не очень дорогую возможность пользователям и той, и другой техники объединить доступность одних с оперативной мощностью других для достижения максимальной экономической эффективности имеющегося оборудования.

В качестве основы локальной сети используется штатная локальная сеть, применяемая в учебном компьютерном классе.

Отличительными особенностями разработанной локальной сети являются:

Локальная сеть работает под управлением системы SPRUT, широко применяемой в обычных компьютерных классах на базе БК-0011М. Головная часть системы SPRUT исполняется на шлюзовом БК-0011 под управлением ОС БК-11. Периферийные модули системы представляют собой двухпанельное меню, аналогичное Norton Commander, и позволяют запускать на периферийных компьютерах не только программы в машинных кодах, ФОКАЛЕ или БЕЙСИКЕ, написанные для БК-0011М и БК-0010(-01), но и более сложные системы, разработанные для других, более мощных компьютеров. Эмулятор операционной системы поддерживает практически полностью языки высокого уровня: ПАСКАЛЬ, СИ, ФОРТРАН и т.д.

Распространение компьютеров фирмы IBM побудило коллектив разработчиков предприятия «ИНТЕРСЕРВЕР» создать целый набор средств, позволяющих преодолеть барьер несовместимости этих компьютеров с компьютерами серии БК в подавляющем большинстве пользовательских применений.

Так, программы перенормирования дискет позволяют переписать файлы с диска IBM на дискету для БК-0011М (или ДВК) как с перекодировкой, так и без неё. Это открывает возможность попеременной работы с текстовыми файлами на IBM и на БК-0011М. Такой же алгоритм работы возможен теперь и для файлов баз данных типа dBF. В ближайшем будущем станет возможным и перенос с БК на IBM исходных текстов, написанных на языке высокого уровня, с последующей их интерпретацией (или трансляцией).

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

 


 

Е. КУЗНИЦКИЙ, К. КАЗАРНОВСКИЙ, С КРИЧЕВСКИЙ

Средняя школа № 491, Москва

Сетевая операционная система для учебных классов КУВТ-86М и УКНЦ-01

Любой пользователь современной ПЭВМ от системного программиста до издателя или бухгалтера имеет дело, прежде всего, с операционной системой (ОС). В то же время, как заводская поставка, так и распространяемые независимыми разработчиками пакеты программ для локальной сети, построенной на базе ПЭВМ БК-0011 и БК-0011М мало способствуют пониманию принципов функционирования ОС и навыков работы с операционными системами. Как уже справедливо отмечалось, в статье «Тема «Операционные системы» на базе КУВТ-86» данная тема имеет самостоятельный учебный интерес, но, кроме того, наличие ОС на каждой рабочей станции локальной сети значительно упрощает создание и эксплуатацию педагогических программных средств. В самом деле, до сегодняшнего дня разработчики были вынуждены писать свои программы на ассемблере или создавать на нём же библиотеки для имеющихся трансляторов с языков высокого уровня, поскольку существующие библиотеки используют функции и прерывания ОС, а при попытке сохранить результаты работы на дискетах, ещё и разбиваться, в ассемблерной же и не отличающейся полнотой заводской технической документации (распространяемый НЦПСО сетевой монитор «Transit» облегчает последнюю задачу, но не обладает достаточной гибкостью). Такая работа больше подходит для системного программиста, а не для учителя или, тем более, ученика (возможность создавать серьёзные программные продукты на Бейсике БК-0011 не рассматривается, как нереалистичная).

Технические возможности компьютеров БК-0011/11М (объём оперативной памяти, но, увы, не скорость передачи по локальной сети) позволили разработчикам описываемой системы пойти по пути, отличному от предложенного авторами упомянутой выше статьи и создать сетевую ОС, полностью поддерживающую работу ОС B11SJ на периферийных станциях.

Работа осуществляется следующим образом: на центральной машине запускается программа NEHOST.SAV, превращающая последнюю в файловый сервер, после чего включение периферийной машины для БК-0011М или инициализация локальной сети для БК-0011 приводит к загрузке в неё ОС B11SJ, использующей в качестве системного оригинальный сетевой драйвер NE.SYS таким образом, что системным устройством SY для этой машины становится NE0:. NE0 сделан доступным только для чтения с тем, чтобы пользователи локальной сети не могли испортить или стереть программы общего пользования. Они, кроме того, могут работать с устройствами NE1:-NE7: и VD:. VD - это виртуальный диск, организованный с помощью оригинального драйвера VD.SYS и использующий недоступные для ОС B11SJ страницы оперативной памяти периферийной станции в качестве устройства с произвольным доступом для хранения информации, как на обычном диске. Он, разумеется, открыт для чтения/записи. Также открытые для чтения/записи устройства NE1: - NE7: представляют собой файлы на дисках BY0: и BY1: файлового сервера и работа с ними аналогична работе с логическими дисками LDn:, за исключением того, что присоединение файла в качестве логического диска осуществляется не командой MOUNT операционной системой, а программой NEDISK.SAV (запускаемой с периферийной машины), которую, впрочем, можно вызывать как команду ОС. Поскольку каждый файл может быть присоединён в качестве логического устройства только к одной станции, пользователи не имеют возможности, преднамеренно или нет, портить данные друг друга.

Отметим ещё ряд дополнительных возможностей и особенной сетевой ОС.

Утилита NESTR.SAV автоматически выбирает продолжение стартового файла (вторичный стартовый файл) в зависимости от устройства загрузки.

Структура сетевого логического диска полностью совместима со структурой обычного логического диска, полученного с помощью драйвера LD, так что оператор центральной машины, например, учитель, имеет доступ ко всем файлам на дискетах.

Программа NEHOST позволяет использовать в качестве системной для периферийной станции дискету, отличную от используемой, в качестве таковой для центральной, что даёт возможность, в частности, объединять в одну сеть машины двух типов: БК-0011 и БК-0011М. Кроме того, отладочный режим, реализованный в программе NEHOST, печатает всю необходимую информацию о каждой сетевой операции.

Хотя логически содержимое NEO: совпадает с SY: центральной станции, начальные блоки последнего подменяются программой NEHOST так, что команды загрузки ОС выполняются корректно.

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

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

Примечание. Ко времени выхода настоящего номера журнала работа над новой версией сетевой ОС должна быть завершена.


 

Всем БК-менам
предлагаем первый выпуск
ежегодного обзора
«Семейство персональных компьютеров
БК-0010 - БК-0011М»

В сборнике представлены сведения как справочного характера, так и практического, поддержанные объёмной библиотекой программ (листингов). Рассматриваются наиболее актуальные темы: языки программирования, машинная графика, сети, базы знаний, СУБД, компьютерные игры, обработка текстовой и табличной информации, образование и другие области знаний. Специальный раздел «Лучшие самоделки» расскажет заинтересованным, как «выжать» из вашего БК даже то, что ему не дали инженеры и конструкторы завода.

Подписку на сборник можно оформить с 1 марта 1993 г. в отделении связи.

Индекс в каталоге - 73177.

Библиотека журнала «Информатика и образование»

(От БК-0010 до БК-0011М). Цена 200 руб.

Издание книги планируется в III квартале 1993 г.


 

Р. ХУДЯКОВ

Практика работы с периферийным процессором УКНЦ

Прежде чем программа будет работать в ОЗУ ПП, её нужно туда загрузить. Рассказ об этой операции начнём с массива параметров (далее - МП), формат которого приведён на первой распечатке.

MASSIV: .Byte   0       ;B этом байте будет содержаться код ошибки или 0
COMAND: .Byte   0       ;Команда (01-ВЫДЕЛИТЬ ПАМЯТЬ, 02-ОСВОБОДИТЬ ПАМЯТЬ,
                        ;         10-ЧТЕНИЕ, 20-ЗАПИСЬ, 30-ПУСК)
TYPDEV: .Word   32      ; Устройство - периферийный процессор
ADR$PP: .Word   0       ; Адрес в ОЗУ ПП
ADR$CP: .Word   0       ; Адрес в ОЗУ ЦП
LENGTH: .Word   0       ;Длина  программы в словах (не байтах !)
ADRMAS: .Word   MASSIV  ;Слово всегда содержит начальный адрес массива параметров
        .Word   401     ;Стоповый элемент (используется при передаче)
        
ZAGR:   .Enable LSB
        MOV     #ADRMAS,R0      ;Адрес МП в R0
        MOV     #5,R1
        BR      1$              ;Передать четыре байта
2$:     MOVB    (R0)+,@#176676  ;(поле ADRMAS и слово, содержащее 401)
1$:     TSTB    @#176674
        BPL     .-4
        SOB     R1,2$
        RTS     PC              ;Вернуться

Команды «Выделить память», «Освободить память», «Чтение», «Запись», «Пуск». Для правильного выполнения команды «Выделить память» поле COMAND МП должно содержать код 01, TYPDEV - код 32, a LENGTH - длину загружаемой программы. Значения остальных полей игнорируются. После пересылки МП в поле ADR$PP ПП возвращает адрес, начиная с которого после команды «ЗАПИСЬ» и будет размещена пересылаемая программа. При повторном запросе выделение памяти производится из оставшейся свободной. Если размер программы превосходит размер свободной памяти в ПП, то в поле LENGTH возвращается длина свободной памяти, а поле MASSIV не будет равно нулю.

Для команды «Освободить память» поля ADR$PP и LENGTH должны содержать те же параметры, которые задавались при выделении данного сегмента, иначе команда не будет выполнена, а в поле MASSIV будет возвращено ненулевое значение.

Для команды «Чтение» («Запись») поле ADR$CP содержит адрес ОЗУ ЦП, откуда (куда) будет пересылаться программа. Для команды «Пуск» ADR$PP содержит стартовый адрес программы. Сама программа должна быть оформлена как подпрограмма (заканчиваться RTS PC) и быть перемещаемой, так как место её размещения заранее неизвестно.

На распечатке 2 приведена подпрограмма загрузки МП в ПП.

ZAGPP:  .Enable LSB
        MOVB    #1,COMAND       ;Отработать команду "ВЫДЕЛИТЬ ПАМЯТЬ"
        MOV     (R5),ADR$CP     ;Через R5 передается табличка из
        CALL    ZAGR            ;Двух слов: 1-е - длина программы,
                                ; 2-е - её начальный адрес в ОЗУ ЦП
        TSTB    MASSIV          ;А памяти хватит ?
        BEQ     1$              ;Да
        MOV     #NOMEM,R0       ;Выведем сообщение об ошибке
        EMT     351             ;"Не хватает памяти"
        CMP     (R5)+,(R5)+     ;увеличим R5 на четыре
        SEC                     ; Установим признак ошибки
        BR      2$              ;И на выход
1$:     MOVB    #20,COMAND      ;Отработать "ЗАПИСЬ"
        MOV     (R5)+,LENGTH    ;Из таблички 1-е слово в LENGTH,
        MOV     (R5)+,ADR$CP    ;2-е в ADR$CP
        CALL    ZAGR
        MOVB    #30,COMAND      ;Отработать "ПУСК"
        CALL    ZAGR
        MOVB    #2,COMAND       ;Отработать "ОСВОБОДИТЬ ПАМЯТЬ"
        MOV     -4(R5),ADR$CP
        CALL    ZAGR
2$:     RTS     R5              ; Вернуться
NOMEM:  .ASCIZ  "NO MEMORY"
        .EVEN

Она передаёт по каналу К2 адрес массива параметров и два байта завершения передачи, нормализующие состояние канала.

На распечатке 3 приведена полная подпрограмма загрузки программы, её пуска и последующего освобождения памяти ПП по окончании работы.

.MACRO  $ZAGPP STADR,ENDADR
        JSR R5,ZAGPP
        .WORD <ENDADR-STADR/2>,STADR
.ENDM $ZAGPP

Формат вызова подпрограммы приведён на распечатке 4.

        .TITLE  MYPROG
START:  $ZAGPP  STARTPP,ENDPP   ;Загрузить программу
        EMT 350                 ; Выход в монитор
        ;Здесь находятся подпрограммы, сообщения и массив параметров
STARTPP: INC    (PC)+           ;Эту программу можно заменить любой другой
        .WORD   0               ;---*---*---*---*---*--
        RTS     PC              ;Вернуться  в ЦП
        ENDPP:
        .END    START

А вот полностью законченная программа.

(...а программы то и нету...)

┌──── АДРЕС

0000

0000

0000

0000

0000

0000

0000

0000

белый

жёлт.

фиол.

красн.

бирюз.

зелён.

голуб.

чёрн.

Итак, программа в ПП загружена.

Работа с регистрами внешних устройств не отличается от обычной. Адресное пространство ОЗУ ПП имеет диапазон 0-77777, ПЗУ ПП - 100000-177777, т.е. 32 Кбайт ОЗУ и 32 Кбайт ПЗУ. ПП (как и ЦП) имеет свой пультовый отладчик, облегчающий отладку программ (вход в него осуществляется из меню установок одновременным нажатием клавиш УПР и @). Работать с ним нужно так же, как и с пультовым отладчиком ЦП.

Основное внимание мы уделим дополнительным возможностям, которые могут быть использованы только при помощи ПП. Начнём со средств отображения. Для начала «пощёлкаем» палитрой. В УКНЦ любой цвет, выводимый на экран, можно представить любым другим (поменять местами красный и зелёный, фиолетовый и бирюзовый и т.д.). Допустим, вы поменяли синий на белый. Теперь всё, что вы запишите в голубой план, на экране появится белым цветом, причём если какая-либо другая программа не изменит значения соответствующей ячейки памяти, то даже после выхода в монитор всё, что должно было бы отображаться на экране голубым, будет отображаться белым, включая графическую информацию. Замена цветов происходит очень быстро (практически мгновенно), на этом можно построить интересные эффекты.

Формат ячеек управления аппаратным отображением приведён на рисунке (таких пар слов четыре, их «полномочия» приведены в табл. 1). Каждый из цветов представлен четырьмя битами. Байты каждой из тетрад означают (слева направо):

Таблица 1

Адрес

Зона, управляемая соответствующими ячейками

2400

Верхняя служебная строка

2470

Собственно сам экран

4700

Меню установок

6750

Нижняя служебная строка

        MOV     #2470,R0        ;Адрес палитры экрана в R0
        MOV     (R0) , - (SР)   ;Запомнить в стеке текущее значение
        MOV     2(R0),-(SP)     ;палитры
        CLR     (R0)            ;Выключить экран
        CLR     2(R0)           ;(все цвета на экране представить черным)
        MOV     #100000,@#177010
        MOV     #30.,R1
2$:     MOV     #20.,R2
1$:     MOVB    #377,@#177012   ;Нарисовать квадрат
        INC     @#177010
        SOB     R2,1$
        ADD     #<80.-20.>,@#177010 ;
        SOB     R1,2$
        MOV     #1,R1           ;"Щелкаем" палитру.
3$:     MOV     R1,R3
        .REPT   4               ;Четыре раза ASL R3
        ASL R3
        .ENDR
        BIC     #360,(R0)
        BIS     R3,(R0)         ;Квадрат отображается
        CLR     R2              ;цветами от голубого до белого 
        SOB     R2,.            ;<-задержка
        SOB     R2,.            ;<-задержка
        INC     R1
        CMP     #8.,R1
        BNE     3$
        MOV     (SP)+,2(R0)     ;Возвращаем предыдущие значения.
        MOV     (SP)+,(R0)      ;ячейкам
        RTS     PC              ;Возврат

На машинах литеры 5 завода «Квант» из схемы контроллера цветного монитора удалена ИС 155ЛП9, поэтому яркостный бит не оказывает влияния на изображение; на почти половине машин завода «СЭМЗ» ИС 155ЛП9 заменена на ИС 155ЛН2, поэтому в яркостный бит для получения 100% яркости нужно записать 0, а для 50 % - 1. Всё это справедливо только для цветного монитора, на отображение градаций яркости на черно-белом мониторе яркостный бит не влияет.

Отметим также, что в начале 1991 г. изменена схема подключения цветного монитора (поменялись местами выходы красного и зелёного цветов).

Приведём программу для ПП, выполняющую следующее: экран выключается, на нём (невидимо) рисуется голубой квадрат; экран включается (квадрат появляется); затем цвет квадрата начинает меняться от голубого до белого.

        MOV     PC,R0
        ADD     #SOOB-.,R0      ;Вычислить адрес сообщения
        MOV     R0,AMT
        MOV     PC,R0
        ADD     #SOOB1-.,R0     ;To же
        MOV     R0,AMT1
        MOV     #135230,@#2400  ;Разрешить вывод на экран всех цветов
        MOV     #177334,@#2402  ;для верхней служебной строки
        MOV     #135230,@#6750  ;То же сделать и для нижней
        MOV     #177334,@#6752
        MOV     #1,@#22614      ;Цвет символов в верхней строке - голубой
        MOV     #3,@#23106      ;Цвет символов в нижней строке - бирюзовый
        MOV     #63146,@#22620  ;Цвет знакоместа в верхней строке - желтый
        MOV     #52525,@#22622
        MOV     #52525,@#23112  ;Цвет  знакоместа в нижней строке - фиолетовый
        MOV     #42104,@#23114
        MOV     #67,@#2372      ;Верхняя строка в формате 4 (10x24)
        MOV     #47,@#6742      ;Нижняя строка в формате 3 (20x24)
        EMT     52              ;Вывести сообщение в верхнюю строку
AMT:    .WORD   0               ;Здесь находится адрес сообщения
        EMT     56              ;Вывести сообщение в нижнюю строку
AMT1:   .WORD   0               ;Здесь находится адрес второго сообщения
        RTS     PC              ;Возврат в ЦП
SOOB:   .ASCIZ  <40.>/"ТЕХНОКОМ"/
SOOB1:  .ASCIZ  <40.>"    ПРЕДСТАВЛЯЕТ    "
        .EVEN

При выводе информации в служебные строки можно менять формат и цвета символа и знакоместа, причём цвета меняются двумя способами. Первый - непосредственное изменение цветов символа и знакоместа, второй - через изменение палитры цветов вывода.

Пример программы с изменением цветов символа и знакоместа.

        MOV     PC,R0           ;Вычислить адрес сообщения
        ADD     #SOOB-.,R0
        MOV     R0,AMT
        MOV     PC,R0           ;To же
        ADD     #SOOB1-.,R0
        MOV     R0,AMT1
        EMT     52              ;Вывести “TEXHOKOM" в верхнюю строку
AMT:    .WORD   0               ;Здесь адрес сообщения
        EMT     56              ;Вывести "ПРЕДСТАВЛЯЕТ" в нижнюю строку
AMT1:   .WORD   0               ;Здесь адрес второго сообщения
        MOV     #67,@#2372      ;Формат верхней строки - 4 (10X24)
        MOV     #47,@#6742      ;Формат нижней строки - 3 (20X24)
        MOV     #135236,@#2400  ;Для верхней строки представляем желтый цвет
        MOV     #174734,@#2402  ;голубым, а черный желтым
        MOV     #135235,@#6750  ;Для нижней строки представляем желтый цвет
        MOV     #175734,@#6752  ;бирюзовым, а черный фиолетовым
        RTS     PC              ;Возврат
SOOB:   .ASCIZ  <40.>/"ТЕХНОКОМ"/
SOOB1:  .ASCIZ  <40.>"    ПРЕДСТАВЛЯЕТ    "
        .EVEN

Ячейки с адресами 2400, 2402 (6750, 6752) отвечают за палитру вывода для верхней (нижней) служебной строки. Их формат был описан выше.

В ячейках 22614, 23106 хранится цвет символа в формате (0 - чёрный, 1 - голубой, 2 - зелёный, ..., 7 - белый), а в ячейках 23112, 23114 - цвет знакоместа в формате регистра кода цвета фона (177020, 177022) (этот формат будет рассмотрен ниже). В исходном состоянии (после включения питания) голубой план для вывода в служебные строки заблокирован.

Пример программы с изменением палитры вывода.

 

4

3

2

1

- номер точки в октете

177020:

0000

0000

0000

0000

 

 

RGB

RGB

RGB

RGB

- красный, зелёный, голубой планы

 

 

 

 

 

 

 

8

7

6

5

Старший бит

177024:

0000

0000

0000

0000

каждой тетрады

 

RGB

RGB

RGB

RGB

не используется

Требования при выводе текстовой информации в служебные строки таковы: первый байт любого сообщения есть байт позиционирования, а сам текст сообщения должен быть восьмибитным, так как коды <РУС> и <ЛАТ> (16(8) и 17(8) при печати не отрабатываются.

Теперь немного о выводе графической информации из ПП. Есть целая группа регистров, существенно облегчающая этот процесс:

177016 (запись/чтение) - регистр кода цвета точки. Формат - число от 0 до 7 (цвет точки);

177024 (запись) - регистр октета точки. Формат - восьмеричное число от 0 до 377 (восемь битов - восемь точек на экране; бит содержит 1 - точка зажжена, 0 - погашена);

177020 - регистр кода цвета фона (планы 0-1), 177022 - регистр кода цвета фона (планы 1-2). Оба регистра представляют собой единое целое; формат приведён на рисунке. Выведем на экран октет, в котором первая точка - чёрная, вторая - голубая; третья - зелёная, ..., восьмая - белая. Для этого нужно записать в 177020 число 0011 0010 0001 0000, а в 177022 - 0111 0110 0101 0100.

177026 - регистр маски планов. Формат - число от 0 до 7 (один или несколько планов, в которые нужно запретить запись информации). Регистр не блокирует запись в зелёный и красный планы со стороны ЦП.

Рассмотрим использование этих регистров. Приведённая ниже программа сначала заполняет экран цветными вертикальными полосами толщиной в одну точку, затем выводит в левом верхнем углу экрана спрайт.

        MOV     #^B0011001000010000,@#177020 ;Загрузить регистр кода цвета фона
        MOV     #^B0111011001010100,@#177022 ;по принципу 1-я точка черная, восьмая - белая
        MOV     #100000,@#177010    ;Загрузить адрес планов в регистр адреса планов.
        MOV     #<264.*80.>,R1      ;В R1 Общее число байтов экранной зоны
1$:     CLR     @#177024            ;"Чистим" текущий октет
        INC     @#177010            ;Увеличим на 1 адрес в планах
        SOB     R1,1$               ;Все это в цикле
        ;НА ЭКРАНЕ ВИДНЫ ЦВЕТНЫЕ ПОЛОСКИ
        MOV     #^B0100010101100111,@#177020 ;Загрузить другие значения 
        MOV     #^B0000000100100011,@#177022 ;цвета фона
        MOV     PC,R2
        ADD     #SPRITE-.,R2        ;Адрес спрайта в R2
        MOV     #100000,@#177010    ;Адрес в планах - 100000
        MOV     #7,@#177016         ;Выводить будем белым
        MOV     #11,R0              ;Размеры спрайта (Y - 11, X - 21)
3$:     MOV     #21,R1
        ;ЭТУ ЧАСТЬ ВЫДЕЛИМ
2$:     MOVB    (R2)+,@#177024      ;Байты, из которых состоит спрайт, по порядку на экран
        ;КОНЕЦ ВЫДЕЛЕННОЙ ЧАСТИ
        INC     @#177010            ;Увеличим адрес в планах на 1
        SOB     R1,2$               ;Следующий байт на экран
        ADD     #<80.-21>,@#177010  ;Отступить для вывода следующей строки
        SOB     R0,3$               ;спрайта.
        RTS     PC                  ;Возврат
        ;НИЖЕ ДАН САМ СПРАЙТ
SPRITE: .Byte   377,7,377,37,36,36,74,170,340,77,360, 340,201,377,300,3,17
        .Byte   61,6,6,30,30,6,30,60,60,140,140,140,300,200,201,3,7
        .Byte   60,0,6,0,60,3,30,60,30,300,140,60,140,0,203,207,7
        .Byte   60,0,6,0,340,1,30,60,30,300,140,30,140,0,203,315,6
        .Byte   60,0,376,1,300,0,370,77,30,300,340,17,140,0,203,171,6
        .Byte   60,0,6,0,340,1,30,60,30,300,140,30,140,0,203,61,6
        .Byte   60,0,6,0,60,3,30,60,30,300,140,60,140,0,203,1,6
        .Byte   60,0,6,30,30,6,30,60,60,140,140,140,300,200,201,1,6
        .Byte   170,0,377,37,36,36,74,170,340,77,360,340,201,377,300,3,217
        .Even
ENDPRG:                             ; Конец программы в ПП

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

2$:     MOVB    (R2)+,R3
        MOV     R3,@#177024

Как видно, с помощью этой группы регистров можно существенно повысить скорость вывода графики, однако иногда и этой скорости не хватает. Можно ещё в несколько раз её увеличить, используя нерегистровый (прямой) доступ к видео-ОЗУ. Но об этом в следующий раз.

Теперь немного о музыке. Звук из динамика УКНЦ можно получить при помощи регистров 177710 и 177716. В регистре 177716 разряды с 7 по 12 позволяют получить звуки с частотой от 60 Гц до 64 кГц при частоте программируемого таймера 2, 4, 8 и 16 мкс. В табл. 2 даны соответствия комбинаций разрядов 8-16 регистра 177716, а в табл. 3 - разрядов 1, 2 регистра 177710.

Частоты звука приведены для тактовой частоты таймера 16 мкс. Если же тактовая частота равна 8 мкс, то значения частот в правой колонке увеличатся в 2 раза (соответственно для 4 мкс в 4 раза, а для 2 мкс в 8 раз).

Если разряды 8-12 содержат 0, то частота звука будет зависеть от того, с какой скоростью разряд 7 переключается из 0 в 1. Способ извлечения звука прост. Меняя значение, загружаемое для задержки, мы управляем высотой звука. Программа, приведённая ниже, работает именно по этому принципу.

        BIS     #6,@#177710     ;Тактовая частота таймера 16 мкс
        BIC     #17400,@#177716 ;Очистить разряды с 8 по 12
        MOV     #200,R0         ;Установить в R0 единственный разряд - 7
1$:     XOR     R0,@#177716     ;Если он есть в 177716 ,то снять его и наоборот
        MOV     #<от этого числа зависит высота звука>,R1
        SOB     R1,.            ;Задержка именно на этом числе
        BR      1$              ;Бесконечный цикл

Этот способ имеет существенный недостаток. На разных машинах высота звука будет «плавать», так как быстродействие ПП меняется от машины к машине из-за разброса параметров элементной базы. Устранить данный недостаток можно, «собирая» нужные частоты из набора стандартных. Сборка ведётся по «И» (одна частота модулирует собой другую), что позволяет, управляя частотой программируемого таймера и комбинируя значения разрядов 8-12 регистра 177716, добиваться исполнения несложных мелодий.

Таблица 2

Разряды регистра 177716

 

 

 

 

 

Частота звукового сигнала

7

12

11

10

9

8

 

Программно формируется

0

0

0

0

0

Соответствует программе

 

0

0

0

0

1

60 Гц

 

0

0

0

1

0

250 Гц

1

0

0

1

0

0

500 Гц

 

0

1

0

0

0

1 кГц

 

1

0

0

0

0

8 кГц

0

Звук отключён

 

1

Комбинация логических значений

Сборка сетки частот по «И»

Программно формируется

*

*

*

*

*

Сборка сетки частот по «И» промодулирована программой

 

Таблица 3

Разряды регистра 177710

Период тактовой частоты

2

1

0

0

2 мкс

0

1

4 мкс

1

0

8 мкс

1

1

16 мкс

Данный способ даёт стабильный звук, но его недостаток очевиден: крайне трудно получить требуемые ноты. Гораздо лучше использовать программируемый таймер в «чистом» виде в режиме прерываний. Достоинства такого способа: чистый стабильный звук, подбор частоты до единиц герц и лёгкость практической реализации. Действительно, раз можно плавно менять высоту звука и его длительность (это реализуется на другом таймере - сетевом), то уже можно исполнять довольно сложные мелодии. Для облегчения задачи приведём значения частот звучания нот двух октав в герцах.

1-я октава
До – 130,8
До-диез, ре-бемоль – 138,6
Ре – 146,8
Ре-диез, ми-бемоль – 155,6
Ми – 164,8
Фа – 174,6
Фа-диез, соль-бемоль – 185,0
Соль – 196,0
Соль-диез, ля-бемоль – 207,7
Ля – 220,0
Ля-диез, си-бемоль – 233,1
Си – 246,9
Среднее до – 261,7
2-я октава
До-диез, ре-бемоль - 277,2
Ре - 293,7
Ре-диез, ми-бемоль - 311,1
Ми - 329,6
Фа - 349,2
Фа-диез, соль-бемоль - 370,0
Соль - 392,0
Соль-диез, ля-бемоль - 415,3
Ля - 440,0
Ля-диез, си-бемоль - 466,2
Си - 493,9
Среднее до - 523,3

Пример программы, иллюстрирующей применение программируемого таймера:

        MOV     PC,R0           ;Вычислить адрес программы обработки преры-
        ADD     #POP-.,R0       ;ваний от программируемого таймера
        MOV     R0,@#304        ;Загрузить этот адрес в вектор прерывания
        MOV     PC,R0           ;Вычислить адрес программы обработки преры-
        ADD     #POPT-.,R0      ;ваний от сетевого таймера
        MOV     R0,@#100        ;Загрузить этот адрес в вектор прерывания
        MOV     PC,R0           ;Вычислить начальный адрес массива с музы-
        ADD     #MUZON-.,R0     ;кой
        MOV     R0,ADRESS       ;Загрузить этот адрес в ячейку ADRESS
        MOV     R0,EADRES       ;Вычислить и загрузить в ячейку EADRES
        ADD     #<EP-MUZON>,EADRES ;конечный адрес массива с музыкой
        BIS     #107,@#177710   ;Установить период тактовой частоты программ-
        RTS     PC              ;мируемого таймера 16 мкс и разрешить
                                ;прерывания от него 
        ;ПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ СЕТЕВОГО
PORT:   .ENABLE LSB             ;ТАЙМЕРА
        DEC     (PC)+           ;Уменьшить на 1 содержимое ячейки COUNT
COUNT:  .WORD   50.             ;50 тиков - это 1 секунда (длительность ноты)
        BNE     1$              ;Если секунда не истекла, то на выход
        MOV     @ADRESS,TON+2   ;Сыграть очередную ноту из массива
        ADD     #2,ADRESS       ;Перейти на следующую ноту
        CMP     EADRES,ADRESS   ;А не конец ли массива?
        BNE     2$
        SUB     #<EP-MUZON>,ADRESS  ;Да . Вернемся к началу
2$:     MOV     #50.,COUNT      ;1 секунда в COUNT
1$:     JMP     @#174612        ;Выход из прерывания
        ;ПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРОГРАМ-
POP:    .ENABLE LSB             ;МИРУЕМОГО ТАЙМЕРА
        TST     @#177714        ;Очистить регистр текущего значения пр. тайм.
        MOV     R0,-(SP)        ;Сохранить в стеке R0
        MOV     #200,R0         ;Загрузить число 200 в R0
        XOR     R0,@#177716     ;7 разряд если есть - снять , и наоборот
        MOV     (SP)+,R0        ;Восстановить R0
...
TON:    MOV #0,@#177712         ; Загрузить текущее значение ячейки TON+2 в 
                                ;буферный регистр программируемого таймера
        RTI                     ;Возврат из прерывания
ADRESS: .WORD   0               ;Ячейка хранение начального адреса массива
EADRES: .WORD   0               ;Ячейка хранение конечного адреса массива 
        ;ДАЛЕЕ СЛЕДУЕТ САМ МАССИВ С МУЗЫКОЙ
MUZON:  .WORD   478.    ;До первой октавы
        .WORD   426.    ;Ре первой октавы
        .WORD   379.    ;Ми первой октавы
        .WORD   358.    ;Фа первой октавы
        .WORD   319.    ;Соль первой октавы
        .WORD   284.    ;Ля первой октавы
        .WORD   253.    ;Си первой октавы
        .WORD   239.    ;Срединное до
        .WORD   213.    ;Ре второй октавы
        .WORD   190.    ;Ми второй октавы
        .WORD   179.    ;Фа второй октавы
        .WORD   159.    ;Соль второй октавы
        .WORD   142.    ;Ля второй октавы
        .WORD   127.    ;Си второй октавы
        .WORD   119.    ;До второй октавы
EP: ;Конец программы в ПП

Эта программа проигрывает указанные ноты по порядку в цикле. Значения чисел, соответствующие реальным звуковым частотам, рассчитываются по формуле A/F, где А соответствует тактовой частоте программируемого таймера (для периода 16 мкс А=62500, для 8 мкс А=125000, для 4 мкс А=250000, для 2 мкс А=500000 (все значения десятичные), a F - частота, которую требуется получить. Обратите внимание на то, что буферный регистр программируемого таймера (177712) 12-, а не 16-разрядный! Об этом следует помнить при загрузке данных в регистр.

 

Performed by © gid, 2012-2024.