С. КОМАРОВ, М. МОНИН

Про Бейсик, быстродействие и кое-что ещё

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

Долгое время БК-0010 оснащался интерпретатором Фокала, о недостатках которого неоднократно писали. Энтузиасты использовали загружаемые Бейсик-85, Бейсик-ДВК, Бейсик-87 и др. Наконец в июне 1987 г. появилась модель БК-0010-01 с версией Бейсик-БК (упрощённый MSX). С тех пор не утихают споры о достоинствах и недостатках Фокала и Бейсика. Одни авторы уверяют, что интерпретатор-компилятор Бейсик-БК по быстродействию «...ставит БК-0010-01 в ряд популярных зарубежных компьютеров» (Наука и жизнь. 1987. № 8. с. 34). Другие считают, что недостатков у Бейсика-БК больше, чем достоинств, именно поэтому «...серьёзных и интересных программ на Бейсике-БК так и не создано» (Наука и жизнь. 1989. № 5. с. 127). Третьи ещё более категорично высказываются в пользу Фокала (Информатика и образование. 1989. № 1. с. 50).

Кто же прав? Для объективной оценки качества интерпретаторов и компиляторов за рубежом широко применяют тесты Benchmark (PC World. 1984. Vol. 7. № 8; Информатика и образование. 1988. № 2). Тесты позволяют оценить скорость выполнения основных операторов интерпретатора: математических операций, обмена с внешними устройствами, графики и т.д. Для профессиональных ПЭВМ важнее всего скорость, точность вычислений и время доступа к памяти, хотя надо уточнить, какие задачи решает данный компьютер. Хороший домашний компьютер должен иметь быструю графику, лёгкий для изучения и удобный для работы язык программирования. Точность вычислений здесь чаще всего не нужна.

Скорость вычислений зависит от быстродействия процессора (т.е. самого компьютера) и эффективности работы интерпретатора или компилятора (компилятор работает намного быстрее). Быстродействие процессора определяется тактовой частотой, эффективностью и гибкостью команд (машинных кодов) и числом разрядов шины данных. Так, 16-разрядный микропроцессор К1801ВМ1 (БК-0010, ДВК-2, PDP-11) обрабатывает информацию в два раза большими порциями, чем, например, 8-разрядные процессоры Z80 (ZX Spectrum и др.) или 8088 (IBM PC). Сравнить наборы команд этих процессоров непросто. Такая задача выходит далеко за рамки данной статьи. Желающих отсылаем к специальной литературе (для начала можно порекомендовать: В мире персональных компьютеров. 1988. № 2. С. 67-69). Процессор «понимает» только «свои» команды. Интерпретатор или компилятор преобразует программу на Бейсике или другом языке в команды процессора. Различные Бейсики могут по-разному переводить программу в машинные коды. Одни, как плохой переводчик, тратят много лишних слов (т.е. команд), пока доберутся до сути. Другие более лаконичны. По-разному могут работать подпрограммы математических действий, например, перемножения вещественных чисел (если такой процедуры нет в наборе команд процессора) или извлечения квадратного корня. Ещё больше могут отличаться подпрограммы (да и сами алгоритмы) обработки строковых переменных, графики, доступа к памяти. Наконец, по-разному организуется взаимодействие между подпрограммами, распознавание ключевых слов языка и т.д. Например, в БК-0010-01 и загружаемых «вильнюсских» Бейсиках ключевые слова хранятся в таблицах интерпретатора в полном написании, хотя могут распознаваться и при сокращённой записи. Другие Бейсик-системы (например, Basic-80 в операционной системе СР/М) хранят ключевые слова в алфавитном порядке без первой буквы (а некоторые слова - и без окончания); вспомогательная таблица содержит адреса «страниц» памяти, где хранятся ключевые слова, начинающиеся на А, В и т.д. Интерпретатор сперва распознает первую букву, а затем сразу обращается к нужной «странице». «Вильнюсские» Бейсики просматривают таблицу целиком. Есть и более глубокие различия. Всё зависит от особенностей данного компьютера, неизбежных ограничений на параметры интерпретатора и искусства системных программистов - разработчиков Бейсика.

Это несколько утомительное отступление позволит лучше понять, почему одни программы могут выполняться быстрее на одном компьютере, а другие на другом. Тесты Benchmark позволяют выявить как раз эти различия. Для оценки среднего быстродействия можно воспользоваться тестом из журнала «Creative Computer» (Vol. 10, № 2, Feb. 1984). Тест содержит наиболее употребительные операторы: арифметических выражений, функций и циклов. Попутно тест проверяет точность вычислений и качество генератора псевдослучайных чисел. В упомянутой статье приведена таблица результатов для 115 зарубежных компьютеров, от супер-ЭВМ до дешёвых карманных моделей. Вот этот тест и его «перевод» на Фокал.

10 FOR N=1 TO 100
20 A=N
30 FOR I=1 TO 10
40 A=SQR(A)
50 R=RND(1)
60 NEXT I
70 FOR I=1 TO 10
80 A=A^2
90 R=R+RND(1)
100 NEXT I
110 S=S+A
120 NEXT N
130 PRINT ABS(1010-S/5)
140 PRINT ABS(1000-R)
1.10 F N=1,99; D 2
2.10 S A=N
2.20 F I=1,9; D 2.3
2.30 S A=FSQT[A]
2.35 S R=R+FRAN()
2.40 F I=1,9; D 2.5
2.50 S A=A^2
2.55 S R=R+FRAN()
2.60 S S=S+A
3.10 T FABS[1010-S/5]
3.20 Т FABS[R]

Разумеется, обе программы можно записать короче, но именно в таком виде этот тест работал на зарубежных ЭВМ.

Как работает тест? Если из любого числа натурального ряда (кроме единицы) десять раз извлечь квадратный корень, а результат десять раз возвести в квадрат, полученное число будет несколько отличаться от исходного. Чем меньше разница, тем точнее работает интерпретатор. Точность вычислений зависит от числа цифр, с которыми происходят вычисления (т.е. разрядной сетки) и алгоритмов математических операций. Переменная S есть сумма обработанных таким образом чисел от 1 до 100. Вместе с накоплением суммы происходит накопление погрешностей. Точное значение суммы 5050. Строка 130 (Или 3.10) вычисляет и выводит абсолютную величину накопленной погрешности, уменьшенную в пять раз.

Переменная R равна сумме двух тысяч псевдослучайных чисел. Математическое ожидание этой величины при равномерном распределении от 0 до 1 равно 1000. Таким образом, второй результат позволяет, хотя и довольно грубо, оценить отклонение распределения от равномерного. По мнению «Creative Computer», ориентировочные оценки таковы:

Этот тест мы запускали на БК-0010-01 и на некоторых других ЭВМ. Результаты, взятые из цитируемого журнала, помечены звёздочкой, остальные получены авторами.

Результаты выполнения теста «Creative Computer» (время в минутах, секундах и десятых долях секунды) приведены в таблице.

На какие размышления наводит полученная таблица? Если говорить о БК-0010, то по точности Бейсик-БК сопоставим с мощными профессиональными ЭВМ и значительно превосходит все персональные домашние компьютеры. Но по быстродействию он уступает даже Фокалу и большинству дешёвых 8-разрядных домашних компьютеров. В первую очередь это объясняется тем, что интерпретатор-компилятор БК-0010-01 вычисляет все функции с двойной точностью. Даже если заменить все переменные в тесте на переменные одинарной точности (например, S! или R!), время выполнения теста почти не меняется, а точность падает до 0.011! В утешение владельцам БК-0010-01 отметим, что программы, в которых нет вычисления функций, выполняются быстрее аналогичных на Фокале.

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

Тест не позволяет выявить дефекты генератора FRAN, которые отмечали многие «бэкашники». Генератор RND в Бейсике-БК вроде бы неплох. Так, во всяком случае, следует из теста. Но если FRAN генерирует коррелированные пары чисел, то RND выдаёт тройки! Следующая простая программа убедит вас в этом.

10 CLS
20 X=256*RND(1)
30 Y=240*RND(1)
40 C=3*RND(1)
50 PSET (X,Y,),C
60 GOTO 20

Экран покроется не случайным цветным узором, а диагональными полосами разного цвета.

Вывод неутешительный: ни Фокал, ни Бейсик-БК для бытового компьютера не годятся. О том, где можно использовать Фокал, написано немало. Бейсик-БК с его высокой точностью лучше всего применять для решения математических задач с итерационными алгоритмами: интегрирования систем дифференциальных уравнений, вычисления специальных функций и т.д. У одного из авторов есть достаточный опыт применения БК-0010-01 для подобных целей, и результаты получались очень хорошими. Для «домашнего пользователя» важнее быстродействие, а подобная точность - излишество! Если к сказанному добавить, что операторы графики в загружаемом Бейсике также исполняются в несколько раз быстрее, а объектный код не «съедает» и без того скудную память, что Бейсик-БК далеко не полностью соответствует стандарту MSX и содержит системные ошибки (см., например: Информатика и образование. 1989. № 1, 2, 3; 1990. № 2, 3), вывод ясен: версию Бейсик-Вильнюс 1986.07.24 (так она именуется официально) следует признать неудачной. Если ряд БК получит развитие, на наш взгляд, для зашивки в микросхемы следовало бы принять Бейсик-87, предварительно расширив его до 16К байт дополнительными командами графики, редактирования и работы с файлами.

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

ЭВМ

Время выполнения

Точность

Генератор псевдослучайных чисел

*Cray-1

0'00,01

0.0000000014

6.1

*VAX-11/780

0'01

0.11

5.3

*WANG 2200 SVP

0'05

0.000000076

3.9

*IBM PC

0'24

0.011

6.3

*DEC Professional 350

0'25

0.014

7.7

*Commodore 64

1'53

0.001

8.9

*Apple lie

1'53

0.001

12.0

*TRS-80 Model 1

2'19

0.03387

12.0

*Atari 800

2'23

0.006875

7.0

*TI 99/4a

3'46

0.00000011

2.6

*Sinclair Spectrum

4'39

0.000668

3.5

*Sharp PC-1211

28'32

0.000028

-

IBM PC AT (12 МГц, 80287):

 

 

 

GW-Basi c 3.2

0'02,70

0.005859

7.1884

Turbo-Basic 1.0

0'01,45

0.0115234

3.8839

Quick Basic 4.0

0'01.25

0.0115356

11.6106

УКНЦ (Бейсик ВГУ)

0'12

0.067299

21.0454

ДВК-З

0'18

0.00964

0.812

EC 1840 (Бейсик M86)

0'22

0.011597

9.3175

Искра 1030 (Basic 85)

0'25

0.011597

9.3175

CM-3:

 

 

 

Basic RT-11

0'26

0.00964

0.812

FORTRAN RT-11

0'04,50

0.00964

1.0

FORTRAN RT-11 с двойной точностью

0'29

0.000000000009

1.0

Электроника-60

0'27

0.00964

0.812

ДВК-2М:

 

 

 

Basic RT-11

0'27

0.00964

0.812

Бейсик-ВГУ (87.09.15)

0'11

0.06073

21.0455

Электроника-85

0'29

0.014648

7.6756

Искра-226

0'42

0.000000076

1.3E-16

Роботрон 1715

1'35

0.188

7.482

Корвет

1'37

0.03387

7.701

Агат

1'55

0.00104

12.0

Правец 8Д

2'24

0.00104

6.7834

ПК-01 Львов

2'51

0.03387

1.571

ПК Криста

2'55

0.03387

1.307

Микроша

3'01

0.03387

1.55

Электроника ДЗ-28

3'47

0.00000516

1.59

Ямаха MSX-2

3'52

0.000000206

12.4944

БК-0010:

 

 

 

Бейсик-БК

2'58

0.000000000112

6. E-26

Бейсик-ДВК

3'35

0.000761

12.22

Бейсик-85/87

0'14

0.0418

7.94

Фокал

1'02

0.2463

6.3244

Было бы интересно получить и проанализировать аналогичные результаты от владельцев других типов ПЭВМ. Приглашаем к разговору!

 


 

Окончание. Начало см.: Информатика и образование. 1991. № 2.

А. ДИКОВ, А. КАЛАШНИКОВ, А. КУЛАКОВ

TermOS

Устройство расширения ОЗУ (УРОЗУ) (автор - А.М. Диков) предназначено для использования незадействованного адресного пространства БК-0010 с адресами 140000-157777 в качестве ОЗУ.

Программа, хранящаяся в УРОЗУ, запускается директивой Р(П) монитора и может быть испорчена только выключением питания или записью новой информации вместо старой. Перезапуск процессора переключателем ПУСК/СТОП информацию не искажает.

В УРОЗУ используются микросхемы К537РУ3А (16 шт.) или К537РУ8 (4 шт.) и несколько недефицитных микросхем серий 561 или 564. Микросхемы потребляют очень малый ток, поэтому устройство питается от БК-0010. Подключается оно к разъёму «общая шина».

УРОЗУ доступно для повторения радиолюбителями, имеющими опыт работы с цифровыми микросхемами, не требует наладки. В системе TermOS оно предназначено для хранения основной программы и каталогов файлов магнитных лент. Очень удобно использовать его также для системных программ (редакторов, ассемблеров, отладчиков, баз данных). Это значительно увеличивает размер обрабатываемых файлов (текстов, листингов, данных и т.д.). Такие программы нами уже используются.

Магнитофон для работы в системе TermOS должен удовлетворять следующим условиям:

Управление магнитофоном осуществляется при помощи интерфейсного кабеля со встроенными трёхдекадным счётчиком ленты (размещение счётчика в магнитофоне потребовало бы увеличения числа соединительных проводов между ним и БК с 9 до 20).

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

 

Рис. 1

Выходной регистр

Разряд

Контакт

Сигнал

0

A16

Управление вторым магнитофоном

1

A13

Останов МГ1

2

B12

Перемотка влево

3

B10

Перемотка вправо

4

B5

Воспроизведение

5

B7

Запись

6

B6

Сброс счётчика

7

A7

D0 принтера

8

A28

D1 принтера

9

B28

D2 принтера

10

A27

D3 принтера

11

B27

D4 принтера

12

A26

D5 принтера

13

B26

D6 принтера

14

A25

D7 принтера

15

B25

Строб принтера

Входной регистр

Разряд

Контакт

Сигнал

0

B24

Единицы счётчика

1

A24

2

B23

3

B17

4

B20

Десятки счётчика

5

A20

6

B22

7

A23

8

B31

Сотни счётчика

9

A31

10

B32

11

A32

12

B30

Кассета в МГ?

13

A29

READY принтера

 

Счётчик ленты собран на трёх двоично-десятичных реверсивных счётчиках К564ИЕ14 (их можно заменить на К561ИЕ14), включённых в режим десятичного счета подачей на вход В/D уровня логического 0. Счётные импульсы с датчика в МГ1 через буферный каскад на VT1 и инвертор DD1.1 подаются на счётные выходы С счётчиков, соединённых последовательно; Сигнал направления счета (прямого или обратного) с МГ1 через буферный каскад на VT2 и инвертор DD1.2 подаётся на входы U/D. Сброс счётчика происходит при поступлении сигнала с порта БК через инвертор DD1.3 на входы SE. Коррекция счётчика осуществляется программно.

Каскад на VT3 предназначен для буферизации сигнала управления включением МГ2.

Питание на схему подаётся с разъёма порта БК, для чего в некоторых экземплярах необходимо запаять перемычку, подающую +5 В на разъём порта. Микросхемы серии 564 можно заменить на микросхемы серии 561.

В используемый нами магнитофон «Вильма-312 стерео» были внесены следующие изменения и дополнения (рис. 2):

 

Рис. 2

 

Рис. 3

 

Рис. 4

Устройство датчика импульсов показано на рис. 3. Шкив, жёстко связанный с приёмным подкассетником, зачерняется чёрной краской. Затем на него наклеиваются три полоски алюминиевой фольги шириной по 3 мм. В приклеенном рядом кронштейне укрепляются светодиод АЛ107 и фотодиод ФД27К. Каскады на VT1 и DD1 формируют прямоугольные импульсы, которые подаются на счётчик DD2, обеспечивающий необходимый коэффициент деления (в приведённой конструкции при установке кассет МК-60 и МК-90 концу ленты соответствуют показания счётчика около 600 и 900 соответственно).

 

Сигнал направления движения ленты берётся с коллектора VT32. В других магнитофонах этот сигнал можно снять, например, со схемы индикации режимов работы.

Устройство управления вторым магнитофоном позволяет управлять МГ2, не имеющим электронного управления, не внося никаких изменений в его схему. Управление производится включением и отключением напряжения питания магнитофона.

Кроме того, это устройство можно использовать для управления какой-либо мощной нагрузкой в программах пользователя.

Электрическая схема устройства показана на рис. 4.


 

Оптимальный драйвер магнитофона для БК

Драйвер магнитофона, «прошитый» в ПЗУ БК-0010 (в дальнейшем именуемый штатным), обеспечивает скорость обмена информацией 1200 бит/с. Для записи информации на МЛ используется метод широтно-импульсной модуляции[1] с побитовой синхронизацией[2]. Степень надёжности считывания информации вряд ли можно считать высокой даже при использовании двух экземпляров записи файла, особенно для достаточно длинных программ. Нельзя ли улучшить программ-драйвер?

Проанализируем требования, которым должен удовлетворять оптимальный драйвер магнитофона для БК-0010 (с учётом использования дешёвых и несовершенных моделей магнитофонов).

  1. Устойчивость работы при больших нелинейных искажениях сигнала, поступающего с магнитофона.
  2. Желательно сохранение работоспособности при различных скоростях движения МЛ.
  3. Индифферентность к возможному инвертированию импульсов, получаемых от магнитофона.
  4. Сохранение работоспособности при незначительных колебаниях скорости движения МЛ.
  5. Максимальная плотность записи на МЛ (при фиксированной максимальной частоте записываемого сигнала).
  6. Максимальная надёжность считывания.
  7. Устойчивость к помехам (наводкам) периодического характера.

 

1. Из всех видов магнитной записи цифровой информации в условиях больших нелинейных искажений наилучшим является метод широтно-импульсной модуляции. Он, в частности, положен в основу штатного драйвера, причём каждому импульсу предшествует синхроимпульс, т.е. используется побитовая синхронизация. Но нужна ли она? Быстродействия процессора K1801BM1 вполне достаточно, чтобы, занеся после декодирования очередного информационного импульса бит в ОЗУ и вернувшись на чтение сигнала с магнитофона, «потерять» не слишком большую часть начала следующего импульса. Можно было бы сделать поправку на время занесения бита, но она очень мала, и учитывать её не обязательно.

2, 3. Этим требованиям штатный драйвер удовлетворяет вполне, так как является настраиваемым. По расположенной в начале файла настроечной последовательности, заканчивающейся маркером, вырабатывается константа, с помощью которой осуществляется декодирование, а маркер служит указателем начала оглавления файла, а также для определения характера чтения (прямое или инверсное).

Настройка драйвера по скорости движения МЛ известна, хотя и используется в основном обладателями катушечных магнитофонов; менее известен факт возможного инвертирования сигнала при использовании фильтров или разных выходов магнитофона.

4. Защищённость от высокого коэффициента детонаций, характерного для дешёвых магнитофонов, обеспечивается большой разницей длительностей информационных импульсов. В штатном драйвере единица кодируется вдвое более длинным, чем ноль, импульсом. Практика показывает, что такое соотношение длительностей оптимально.

5. Этот пункт наиболее важен. Задача (с учётом вышесказанного) формулируется так: выбрать наиболее информативный способ кодирования при условии, что алфавит кодируется кратными по длительности импульсами, а длительность самого короткого импульса фиксирована.

Пусть М - число битов, кодируемых одним импульсом (например, в штатном драйвере М = 1: длинный импульс кодирует 1, короткий - 0; если используются импульсы четырёх длительностей: Т, 2Т, ЗТ, 4Т, то каждый кодирует два бита, М+2; например, импульс длиной Т может обозначать 00, 2Т - 01, ЗТ - 10, 4Т - 11). Тогда для кодирования всего алфавита потребуется К=2М импульсов с периодами Т, 2Т, ..., КТ. Средняя длительность импульса ТС будет равна ТС=(Т+2Т+...+КТ)/К=(К+1)Т/2, а среднее время T1, затрачиваемое на передачу одного бита - Т1=ТС/М=(К+1)Т/2М=(2M+1)Т/2М. Эта функция принимает максимальное значение при М=2, при этом Т1 = 1,25Т.

Итак, для обеспечения максимальной скорости передачи информации при данных условиях необходимо кодировать одним импульсом два бита. А сколько времени тратит на передачу бита штатный драйвер? При каждом информационном импульсе (длительностью Т для нуля и 2Т для единицы) им передаётся ещё и синхроимпульс длительностью Т, так что Т1=(Т+Т+Т+2Т)/2=2,5Т: вдвое больше оптимума! А ведь оптимальный драйвер не предъявляет дополнительных требований ни к магнитофону, ни к МЛ: если штатный драйвер использует импульсы длительностью Т и 2Т и маркерный импульс длительностью 4Т, то оптимальный - импульсы длительностью Т, 2Т, ЗТ, 4Т.

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

7. Большинство пользователей встречались с ситуацией, когда при считывании с МЛ драйвер, вместо того чтобы искать файл с заданным именем, начинает распечатывать немыслимые имена несуществующих файлов. Причина в том, что в магнитофонном кабеле имеется периодическая помеха (например, наводка от сети), по которой и происходит настройка драйвера. Для нейтрализации этого явления можно, например, ввести специальный ключевой символ в один из байтов оглавления файла; его отсутствие будет сигнализировать о необходимости прекратить чтение и повторить настройку.

В соответствии с результатами этого анализа был написан драйвер магнитофона для БК-0010 HELP7. Он использует для записи информационные сигналы длительностью Т, 2Т, ЗТ, 4Т и маркерный импульс длительностью 4Т.

При записи файла драйвер записывает сначала настроечную последовательность, затем блок параметров, в который входят имя файла, адрес его загрузки, длина и контрольная сумма файла, метка &, идентифицирующая файлы в формате HELP7. Сам файл разбивается на блоки длиной 256 байтов каждый (кроме, может быть, последнего). Каждый блок предваряется четырёхбайтовым оглавлением.

Первый байт оглавления - ключ декодирования. В нём диады 00, 01, 10, 11 располагаются в порядке возрастания частоты их появления в блоке. Первая из диад ключа кодируется в данном блоке импульсом длиной Т, вторая - 2Т и т.д. Благодаря этому обеспечивается минимальное время передачи блока. В частности, блок из одних нулей передаётся в четыре, а из одних единиц - в шесть раз быстрее, чем штатным драйвером.

Второй байт - номер блока. Его наличие позволяет обеспечить независимое чтение блоков; зная номер, драйвер может определить положение блока в ОЗУ, следовательно, блоки могут считываться в любом порядке.

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

При чтении HELP7 сперва ищет на МЛ очередное оглавление блока и определяет по номеру блока, был ли он ранее считан без ошибки. Если да - осуществляется поиск следующего блока; если нет - блок считывается и помещается на соответствующее место в ОЗУ. Таким образом, если какие-то блоки не считываются, а файл записан на МЛ дважды, их можно считать со второго экземпляра файла. В результате значительно повышается надёжность хранения информации.

На практике HELP7 при высокой надёжности чтения-записи обеспечивает скорость обмена до 6000 бит/с; обычно используется па скорости 4000 бит/с.

Ниже приводятся распечатки программ записи и чтения массива, достаточно полно иллюстрирующих изложенные идеи. Хотя в них не отражён ряд моментов работы HELP7 (определение постоянных чтения, блочная передача информации, работа с ЦАП и др.), они могут послужить базой для полезных и интересных экспериментов даже неопытному программисту.

; Программа записи массива
; Содержимое регистров:
; R1 - адрес записываемого на МЛ массива
; R2 - его длина в байтах
; R3=177716
 
M0:     MOVB    (R1)+,R0    ;Записать в R0 оче-
                            ;редной байт
M1:     MOV     #4,R4       ;Один байт - это
                            ;четыре диады
        ASR     R0          ;Арифметический
                            ;сдвиг вправо
        BCS     A1          ;Анализ первого би-
                            ;та диады
        ASR     R0      
        BCS     A2          ;Анализ второго би-
                            ;та диады
                            ;Передается диада
                            ; "00"
        MOV     #160,@R3    ;Установка высокого
                            ;уровня
        MOV     T00,R5      ;(Т00) - длительность импульса
                            ; "00 и
0M:     SOB     R5,0M       ;Задержка
        MOV     #20,@R3     ;установка низкого
                            ;уровня
        MOV     T00,R5
IM:     SOB     R5,1M
        BR      KN
                            ;Передается диада
                            ; "10"
A2:     MOV     #160,@R3
        MOV     T10,R5
2M:     SOB     R5,2M
        MOV     #20,@R3
        MOV     T10,R5
3M:     SOB     R5,3M
        BR      KN
A1:     ASR     R0
        BCS     A3          ;Анализ второго би-
                            ;та диады
                            ;Передается диада ; "01"
        MOV     #160,@R3
        MOV     T01,R5
4M:     SOB     R5,4M
        MOV     #20,@R3
        MOV     T01,R5
5M:     SOB     R5,5M
        BR      KN
                            ;Передается диада
                            ; "11"
A3:     MOV     #160,@R3
        MOV     T11,R5
6M:     SOB     R5,6M
        MOV     #20,@R3 
        MOV     T11,R5 
7M:     SOB     R5,7M 
KN:     SOB     R4,M1       ;Цикл по диадам
        SOB     R2,M0       ;Цикл no длине
        RTS     PC
        
; Программа чтения массива
; Содержимое регистров:
; R1 - адрес, с которого размещается считываемый с МЛ массив
; R2 - длина массива
; R3=177716
; R5=40
; Импульсы длительностью Т, 2Т, ЗТ, 4Т кодируют диады 00,01,10,11.
; Постоянные чтения: 1,5Т; 2,5Т; 3,5Т.
M0:     MOV     #4,R0       ;Чтение четырех диад
M1:     CLR     R4          ;Очистка R4
1M:     INC     R4          ;R4=R4+1
        BIT     R5,@R3      ;Тестирование 5-го
                            ;раэряда регис-
                            ;тра 177716
        BEQ     1M
2M:     INC     R4
        BIT     R5,@R3
        BNE     2M
        CMPB    R4,C2       ;(C2)=2,5Т. Сравнение
                            ;со второй постоянной ;чтения
        BHI     M2          ;Длительность импуль-
                            ;са больше 2Т
        CMPB    R4,C1       ;(С1)=1,5Т. Сравнение
                            ;с первой постоянной ;чтения
        BHI     M3          ;Длительность импуль-
                            ;са равна 2Т
                            ;длительность импуль- ;са равна Т
                            ;Запись диады "00" в ;память
        CLC
        RORB    @R1
        CLC
        RORB    @R1
        BR      KN
                            ;Запись диады "01" в
                            ;память
M3:     SEC
        RORB    @R1
        CLC
        RORB    @R1
        BR      KN
M2:     CMPB    R4,C3       ;(C3)=3,5T. Сравнение
                            ;с третьей постоянной ;чтения
        BHI     M4
                            ;Запись диады "10" в ;память
        CLC
        RORB    @R1
        SEC
        RORB    @R1
        BR KN
                            ;Запись диады "11" в ;память
M4:     SEC
        RORB    @R1
        SEC
        RORB    @R1
KN:     SOB     R0,M1       ;Цикл по диадам
        INC     R1          ;Следующий байт
        SOB     R2,M0       ;Цикл по длине
        RTS     PC

Заинтересовавшиеся этой темой могут написать автору по адресу:
194017, Ленинград, ул. Рашетова, 11, кор. 2 кв. 16.

А. МОЛЧАНОВ

 



[1] Широтно-импульсная модуляция - способ представления информации, при котором информационное значение импульса определяется его длительностью. - Примеч. ред.

[2] Побитовая синхронизация - способ передачи информации, при котором каждому информационному импульсу предшествует так называемый синхроимпульс, не несущий информационной нагрузки, а служащий для уведомления о том, что через стандартный интервал времени последует информационный импульс. - Примеч. ред.


 

Подключение принтеров «Электроника МС-6312» и «Электроника МС-6313» к БК

В московском магазине-салоне «Электроника» появились в продаже принтеры моделей МС-6312, МС-6313, предназначенные для печати алфавитно-цифровой и графической информации. Обе модели представляют большой интерес уже потому, что первыми появились в свободной продаже.

В табл. 1 приведены их основные технические характеристики, анализ которых позволяет сделать следующие выводы.

Таблица 1

 

М С-6312

МС-6313

Тип УВП

термоструйное

ударное, знакосинтезирующее

Тип бумаги

ГОСТ 6656-76

ГОСТ 6656-76

Формат бумаги

А4 или рулонная

А4 или рулонная

Тип красконосителя

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

лента красящая синтетическая

Ресурс

800-1200 страниц

1000 страниц

Режим печати:

 

 

СИМВОЛЬНЫЙ

есть

есть

графический

есть

есть

Средства для диагностики:

 

 

тест шрифтов

есть

есть

тест графики

нет

есть

тест косой печати

нет

есть

Число символов в строке

40-120

40-160

Шаг строки, мм

2,12-4,23

2,12-12,7

Скорость печати, зн/мин

150

100

Матрица знакоместа, точек

16x12

9x12, 18x24

Качество шрифта:

 

 

качественный

есть

есть

черновой

нет

есть

Типы шрифтов:

 

 

нормальный

есть

есть

двойной

есть

есть

высокий

нет

есть

подчёркивание

есть

есть

верхние индексы

есть

есть

нижние индексы

есть

есть

Кодирование

КОИ-8

КОИ-7, КОИ-8

Количество наборов символов

3

7

Совместимость со стандартом Epson

есть

нет

Тип интерфейса

ИРПР, ИРПР-М

ИРПР, ИРПР-М, С2

Напряжение питания, В

220 ±10%

220 ±10 %

Потребляемая мощность

30 Вт

90 Вт

Габаритные размеры, мм

55x166x277

100x400x460

Масса, кг

2,3

8

Цена, руб.

1525

1675

Завод-изготовитель

ПО «Радий», Москва

завод «Кентавр», Смоленск

 

Устройство вывода информации печатающее (УВИП) МС-6312:

Отметим также, что инструкция по эксплуатации УВИП МС-6312 недостаточно полна и не лишена неточностей: например, в команде ESC С неверно указан десятичный код, неверно описана функция команды. Отсутствуют примеры применения команд.

Устройство вывода печатающее (УВП) МС-6313:

Принтеры могут работать совместно с компьютером БК-0010(01), однако для МС-6313 необходимо несколько изменить подпрограмму передачи кодов от компьютера к УВП в плане формирования положительного фронта импульса STROBE. Например, чтобы обеспечить функционирование команды nW программы-отладчика ОТЛ12, необходимо подпрограмму передачи кодов перезаписать в следующем виде:

037612 BIS #400,R0
037616 TST @#177714
037622 BEQ 37616
037624 MOV R0,@#177714
037630 SUB #400,R0
037634 MOV R0,@#177714
037640 RTS R7

Для более полного использования возможностей принтеров разработаны драйверы MS6312.SAV и MS6313.SAV. Построенные по сходным алгоритмам, они различаются наборами задающих режимов. В качестве примера приводится описание драйвера MS6313.SAV.

Драйвер предназначен для печати текстовых файлов, созданных редакторами EDASP, МИКРО.10К, МИКРО.11К, на печатающем устройстве МС-6313.

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

1 - СБРОС

2 - ЧТЕНИЕ

3 - ПЕЧАТЬ

4 - ТЕКСТОВЫЙ РЕЖИМ

5 - ГРАФИЧЕСКИЙ РЕЖИМ

Для выбора режима работы необходимо нажать соответствующую цифровую клавишу.

Режим СБРОС предназначен для установки принтера в исходное состояние, действует аналогично включению питания. Сигнал может быть заблокирован переключателем SA3.5 принтера. Для исключения ошибочного сброса запрашивается подтверждение.

Режим ЧТЕНИЕ предназначен для загрузки файла с целью его последующей распечатки.

ПЕЧАТЬ обеспечивает вывод на принтер предварительно загруженного текстового файла с параметрами печати, заданными режимами 4, 5. При распечатке файла в левой верхней части листа распечатывается его имя.

Текстовый режим предназначен для вызова меню задания режимов управления текстовой печатью.

Графический режим предназначен для задания плотности графической печати в диапазоне 577-1921 ударных позиций в строке. Выход из графического режима в текстовый осуществляется по нажатию клавиши 0.

В текстовом режиме есть своё меню:

0 - ВЫХОД

1 - ФОРМАТ

2 - ТАБУЛЯЦИЯ

3 - ШАГ СТРОКИ

4 - ШАГ ЗНАКОВ

5 - КАЧЕСТВО ШРИФТА

6 - АТРИБУТЫ ШРИФТА

Для выбора управления необходимо нажать соответствующую клавишу.

0 - выход в головное меню.

1 - (формат) позволяет задать число строк на странице десятичным числом от 0 до 255. При задании нулевого значения принтер не следит за форматом, но контролирует наличие бумаги.

2 - (табуляция) позволяет задать левую границу страницы, при этом активная позиция печати перемещается вправо на число знаков, равное Nx8, где N<ВВОД> - задаваемое число позиций табуляции.

3 - (шаг строки) позволяет задать шаг строки (от 2,12 до 12,7 мм). Для выбора необходимо нажать соответствующую клавишу.

4 - (шаг знаков) позволяет задать шаг знаков (число символов в строке) в диапазоне от 1,27 до 5,08 мм (40-160 символов). Переключатель SA3.3 должен быть в положении «включено».

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

6 - (атрибуты шрифта) - задание дополнительных вариантов шрифта. При нажатии клавиши 0 осуществляется отмена всех атрибутов.

Для задания режимов работы драйвера рекомендуется следующий порядок:

сброс; чтение; задание режимов печати; печать; возврат либо на чтение, либо на задание режимов печати.

Таблица 2

МС-6313

БК-0010.01

Сигнал

Контакт

Контакт

Сигнал

DATA0

3

A16

ВД00

DATA1

5

A13

ВД01

DATA2

7

B12

ВД02

DATA3

9

B10

ВД03

DATA4

11

B5

ВД04

DATA5

13

B7

ВД05

DATA6

15

B6

ВД06

DATA7

17

А7

ВД07

STROBE

23

А28

ВД08

BUSY

21

В31

ВВ08

ASCNLG

25

А23

ВВ07

INIT

27

В28

ВД09

OY

4, 6,8, 10, 12 14, 16, 18, 20 22, 24, 26, 28

A11, А18 B11, B18 A19, B19

Общий

 

Принтер функционирует от параллельного интерфейса ИРПР по ОСТ 11.305.917-84. Схема его подключения к БК приведена в табл. 2. Переключатели принтера должны быть установлены в следующее положение: SA1 - 01001101; SA2-11000000; SA3- 11011001.

А. БАРСУКОВ


 

Программатор микросхем ППЗУ 558РРЗ для БК-0010

Законное раздражение многих пользователей БК вызывает неудобство работы с магнитофоном: малая скорость обмена, сбои, трудность поиска нужной информации на МЛ... Попытки решить проблему «в лоб» пока не дали достаточно хороших результатов; а ведь есть удобный обходной путь - использование в качестве внешней памяти постоянных перепрограммируемых запоминающих устройств (ППЗУ). Это даёт возможность всегда иметь «под рукой» наиболее часто используемые программы, варьировать их состав, практически забыть о сбоях.

В предлагаемом программаторе ППЗУ используются микросхемы с электрическим стиранием информации К558РРЗ. Программатор работает в составе БК под управлением специальной программы, позволяющей записывать в ППЗУ и стирать необходимую информацию. Чтение из ППЗУ осуществляется непосредственно, как из ОЗУ.

Технические характеристики программатора:

Для начального адреса ППЗУ могут быть установлены значения 0, 20000, 40000, 60000, 100000, 140000.

Из входящих в программатор шести микросхем лишь три необходимы в случае использования его как модуля ПЗУ (т.е. только для чтения).

Программатор состоит из двух основных блоков: ППЗУ (две микросхемы К558РРЗ) и устройства управления ими. Последнее формирует сигналы выборки ПЗУ CS, выборки адреса СЕ, выборки данных СО, а также напряжения программирования и стирания.

Схема выборки собрана на мультиплексоре D4 и триггере D5.1. Перемычки на входе D4 служат для установки диапазона адресов, в которых работает ППЗУ. Если адрес на входах D4 лежит в заданном диапазоне, то D4 вырабатывает импульс, который стробируется сигналом SYNC и устанавливает триггер D5.1. Сброс триггера происходит по его входу S задним фронтом сигнала SYNC. На выходе D5.1 формируется сигнал CS, под управлением которого и происходит любой обмен с ППЗУ.



Вторая половина триггера, D5.2, управляет прохождением сигнала SYNC на вход СЕ ППЗУ через элементы D3.1 и D3.2. D5.2 разрешает сигнал СЕ, если в регистре управления D6 установлен бит разрешения записи. Сбрасывается триггер при очередном обращении к регистру управления. Такое решение позволяет программно затянуть импульс СЕ до длительности в 50 мс, требуемой при программировании ППЗУ, или вообще отключить его, что необходимо при стирании.

Элементы D2 и D1 служат для получения сигналов стробирования данных ОЕ и ответа RPLY. Логика схемы такова, что данные стробируются на выводах данных ППЗУ только при наличии сигнала выборки CS. Сигнал ОЕ может быть заблокирован одним из разрядов регистра управления - это нужно при стирании. RPLY формируется элементами D1.3 и D1.4, представляя собой сигнал DIN или DOUT, возвращаемый процессору с задержкой 150-200 нс.

Формирование необходимой временной диаграммы и коммутацию питающего напряжения выполняет регистр управления D6. Назначение его разрядов: 1 - включение напряжения 24 В; 2 - включение напряжения 18 В; 3 - установка режима записи; 4 - установка режима стирания. Адрес регистра - 177716. Это системный регистр БК, в программаторе используется его старший байт, не задействованный в БК. Начальная установка регистра (режим чтения) происходит при включении БК или при перезапуске монитора.

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

Главной частью схемы являются ППЗУ К558РРЗ. Следует отметить особенность их установки в шину БК: каждое ППЗУ выдаёт один байт (D7 - младший, D8 - старший), поэтому адресные входы ППЗУ подключены к шине начиная не с AD0, а с AD1 (обмен по словам).

Для управления работой программатора используется специальная управляющая программа «558РРЗ». Она позволяет:

Все эти функции представлены в меню программы. На те из них, которые оказывают необратимое воздействие, запрашивается дополнительное подтверждение. Объём программы - 1,5 К байт, объём рабочего буфера - 26К, язык программирования - ассемблер МИКРО10.К.

Конструктивно программатор удобно выполнить в виде приставки, собираемой в корпусе от блока МСТД, и подключать к БК через разъём системной шины ХТ3.1. На верхней крышке приставки можно расположить разъёмы для подключения ППЗУ и светодиода индикации программирующего напряжения.

За время подготовки данной статьи к печати программатор был успешно применён автором при разработке дисковой операционной системы для БК-0010 РАМОНГ.

За справками можно обращаться по адресу: 235410, Шяуляй, Севастополь, 9, кв. 44.

Автор благодарен В. И. Джиган и С. Г. Лужецкому (см.: Микропроцессорные средства и системы. 1988. № 1. С. 85-88) за идею схемы.

А. ЕРМАКОВ


 

Увеличение символов на экране

Многим программистам-любителям знакома ситуация, когда возникает желание подписать рисунок или схему крупными буквами. Увы, два шрифта БК не позволяют этого сделать, и приходится рисовать буквы оператором DRAW, засоряя ОЗУ.

Предлагаемые программы SCR12 и SCR24 позволяют увеличить символы в 1x2 и 2x4 раза соответственно. Работа с ними происходит так.

  1. Загрузить в БК код программы SCR12.BIN (или SCR24.BIN). Это можно сделать из Бейсика операторами DATA и READ или с МЛ оператором BLOAD; программы написаны в позиционно-независимом коде, т.е. адрес загрузки можно выбрать произвольно.
  2. Определить машинную подпрограмму оператором
    DEF USR=<адрес>
  3. Обязательно выровнять экран:
    PRINT CHR$(140);CHR$(140)
  4. Обратиться к подпрограмме оператором
    R$=USR(R$)

    передав ей значение символьной величины R$=«ХУТекст», где X - номер позиции в строке, начиная с которой будет выводиться Текст, Y - номер строки, в которой будет выводиться Текст, Текст - произвольный набор символов Бейсика.

Например, оператор

R$=USR("65ПРИВЕТ”)

выведет слово ПРИВЕТ, начиная с шестой позиции пятой строки экрана.

В нашем кабинете информатики разработаны также программы SCR22, SCR44, SCR46 и т.д. Их листинги можно заказать по адресу: 261820, Житомирская обл., пгт Ружин, ул. Ленина, 33.

SCR12
1 DATA &O012503,&O011505,&O112504,&O162704,&O000060,&O006304,&O112502,&O162702
2 DATA &O000060,&O062704,&O002400,&O077203,&O062704,&O042000,&O005303,&O005303
3 DATA &O012737,&O040000,&O000160,&O112500,&O104016,&O010400,&O012701,&O040000
4 DATA &O012702,&O000012,&O011110,&O011160,&O000100,&O005011,&O062700,&O000200
5 DATA &O062701,&O000100,&O077211,&O062704,&O000002,&O077326,&O012737,&O042000
6 DATA &O000160,&O000207
10 FOR I%=&O1000 TO &O1122 STEP 2
12 READ U%
14 POKE I%, U%
16 NEXT I%
18 DEF USR1=&O1000
20 ? CHR$(140);CHR$(140)
22 R$=USR1("10Текст...")
...
SCR24
0 DATA &O012503,&O011505,&O112504,&O162704,&O000060,&O006304,&O006304,&O112502
1 DATA &O162702,&O000060,&O062704,&O005000,&O077203,&O062704,&O042000,&O005303
2 DATA &O005303,&O012737,&O040000,&O000160,&O112500,&O104016,&O012701,&O040000
3 DATA &O012700,&O000012,&O011146,&O042711,&O177400,&O000311,&O004767,&O000060
4 DATA &O004767,&O000114,&O062704,&O000002,&O012611,&O042711,&O000377,&O004767
5 DATA &O000036,&O004767,&O000072,&O005011,&O062701,&O000100,&O062704,&O000376
6 DATA &O077027,&O162704,&O004774,&O077343,&O012737,&O042000,&O000160,&O000207
7 DATA &O010446,&O010346,&O005002,&O012703,&O000010,&O005004,&O006111,&O005504
8 DATA &O006102,&O060402,&O006102,&O060402,&O077310,&O012603,&O012604,&O000207
9 DATA &O010214,&O010264,&O000100,&O010264,&O000200,&O010264,&O000300,&O000207
10 FOR I%=&O1000 TO &O1236 STEP 2

С. МАТВИЙЧУК


 

Волшебная сила двух ячеек

Вот короткая программа:

10 POKE &O600,&O12701
20 POKE &O602,&O630
30 POKE &O604,&O12503
40 POKE &O606,&O11502
50 POKE &O610,&O10337
60 POKE &O612,&O122
70 POKE &O614,&O112221
80 POKE &O616,&O77302
90 POKE &O620,&O12737
100 POKE &O622,&O630
110 POKE &O624,&O124
120 POKE &O626,&O207
130 DEF USR=&O600
140 A$=USR(<строка>)

Её задача - занесение значений в ячейки памяти с адресами 122 и 124, а также копирование параметра в стековую область. Всего-то! Но дело в том, что ячейки эти не простые: хранящаяся в них информация задаёт так называемый режим псевдоклавиатуры, когда ввод информации с клавиатуры подменяется на выдачу символов из заданной строки. В ячейку 122 заносится длина этой строки, а в ячейку 124 - её адрес.

В результате перед программирующими на Бейсике-БК открывается целый ряд дополнительных возможностей:

Все эти возможности открываются благодаря тому, что после выхода из программы (по команде END или STOP) можно в «автоматическом» режиме исполнить любую директиву Бейсика.

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

Пусть программа разбита на две части, записанные в файлы с именами Р1 и Р2. Для работы Р2 требуются значения переменных А, В и С, которые формируются в результате работы Р1. Тогда программа Р1 будет выглядеть так.

10 POKE &O600,&O12701
20 POKE &O602,&O630
30 POKE &O0604, &O12503
40 POKE &O606,&O11502
50 POKE &O610,&O10337
60 POKE &O612.&O122
70 POKE &O614,&O112221
80 POKE &O616,&O77302
90 POKE &O620,&O12737
100 POKE &O622,&O630
110 POKE &O624,&O124
120 POKE &O626,&O207
130 DEF USR=&O600
140 CR$=CHR$(10) 'код клавиши ВВОД
150 QU$=CHR$(34) 'код кавычки
160 . . .
    А=. . .
    . . .
    В=. . .
    . . .
    С$=...
    . . .
    А1$="NEW"+CR$+"LOAD"+QU$+"Р2"+QU$+CR$+"RUN"+CR$
    A2$=STR$(A)+CR$+STR$(B)+CR$+C$+CR$
    A$=USR(A1$+A2$)
    END

А программа P2 должна содержать оператор

INPUT А,В,С$

на момент исполнения которого буфер псевдоклавиатуры окажется не пустым (в нём будут значения трёх переменных, переданные из Р1), и вместо ввода с клавиатуры произойдёт считывание из буфера. Программу Р2 можно загрузить и вне цепочки (например, для отладки); в этом случае данные для оператора INPUT можно ввести с клавиатуры.

Вывод содержимого экрана на принтер КУВТ возможен при использовании в качестве программы связи, созданной в нашем техникуме программы NT.SAV. Для этого в том месте программы, где нужна печать экрана, нужно вставить команды.

А$="BSAVE"+QU$+"TT:GP:"+QU$+",&O40000,&O100000"
А$=""+A$+CR$+"CONT"+CR$ 
A$=USR(A$)

Предполагается, что уже исполнены операторы с номерами 10-150 из предыдущего примера.

В. ГУБАРЕНКО

Сумской машиностроительный техникум

Кирпичики ваших программ

Редакционная почта приносит немало писем с просьбами уделять место на страницах журнала небольшим программам и подпрограммам - это лучшая демонстрация возможностей программирования на любом языке. Действительно, это может принести немалую пользу как в аспекте изучения программирования, так и в чисто практическом смысле накопления готовых модулей для использования в своих программах.

В этом номере мы начинаем публиковать такую подборку. Надеемся, вы не останетесь пассивными читателями, а откликнетесь присылкой в редакцию нужных, красивых и нетривиальных текстов подпрограмм.

Постепенно нашими общими усилиями создастся уникальная библиотека подпрограмм и алгоритмов, полезная всем пользователям БК.

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

10 POKE 136,16384
20 POKE -76,512OR(PEEK(132)/64-40)
30 Y=64
40 CLS
50 LOCATE 0,0,0
60 ? AT(5,5)"Вы можете выбрать:
70 ? AT(5,7)"концентрические круги
80 ? AT(5,9)"сетчатое полотно
90 ? AT(5,11)"хаос прямоугольников
100 ? AT(5,13)"звук вертолета
110 3 AT(5,15)"поздравление
120 3 AT(5,17)"выход
130 Y1=Y
140 LINE (30,Y)-(200,Y+20),1,B
150 C$=INKEYS
160 IFC$=""TH150ELST=ASC(C$)
170 IF T=26THIFY>64THY=Y-20ELSY=164
180 IF T=27THIFY<164THY=Y+20ELSY=64
190 IF T=10THIFY=164TH260ELS220
200 IF Y<>Y1TH LINE(30,Y1)-(200, Y1+20),0,B
210 GOTO 130
220 LOCATE 5,22,1
230 ON (Y-44)\20 GOSUB 460,270,360,530,610
240 IF Y=123TH260ELSIFY<>143GOTO 30
250 IF INKEY$=""TH250ELS130
260 END
270 LOCATE 0,0,0
280 CLS
290 FOR X=0TO30
300 FOR Y=0TO24
310 LOCATE X,Y
320 ? "$";
330 NEXT Y,X
340 IF INKEY$=""TH340
350 RETURN
360 LOCATE 0,0,0
370 CLS
380 FOR B=1TO50
390 X=INT(RND(1)*220)+5
400 Y=INT(RND(1)*280)+5
410 V=INT(RND(1)*40)+20
420 LINE (X,Y)-ST(V,V),,B
430 NEXT B
440 IF INKEY$=""TH440
450 RETURN
460 LOCATE 0,0,0
470 CLS
480 FOR L=8TO1ST-1
490 CIRCLE(120,100),L*10+5,,,,1,4
500 NEXT L
510 IF INKEY$=""TH510
520 RETURN
530 CLS
540 LOCATE 0,0,0
550 FOR Z=0TO400
560 OUT &O177716,&O100,1
570 OUT &O177716,&O100,0
580 FOR I=0TO50
590 NEXT I,Z
600 RETURN
610 LOCATE 0,0,0
620 CLS
630 ? AT(3,9)"П О 3 Д P А В Л Я Е М "
      AT(3.9)"* * * * * * * * * * * "
      AT(3,9)"                      "
640 FOR I=0TO72
650 NEXT I
660 IF INKEY$=""TH630
670 RETURN

 

А вот подпрограмма, составленная В. Роговым и И. Никитиной на ассемблере и позволяющая выводить тексты в служебную строку.

1000  12700    MOV  #14,R0    ;ОЧИСТКА
1002  14
1004  104016   EMT  16        ;ЭКРАНА
1006  12700    MOV  #236,R0   ;ОЧИСТКА
1010  236                     ;СЛУЖЕБНОЙ
1012  104016   EMT  16        ;СТРОКИ

 

Ещё три программы прислал в редакцию А. Ланеев. Первая позволяет рисовать с помощью джойстика.

1014

12703

MOV

#47,R3

;ДЛИНА СТРОКИ

1016

47

 

 

;СИМВОЛОВ

1020

12702

MOV

#2000,R2

;АДРЕС, С

1022

2000

 

 

;КОТОРОГО ЗАПИСАНЫ СИМВОЛЫ

1024

12701

MOV

#0,R1

;ПОЗИЦИЯ

1026

0

 

 

;ПЕРВОГО СИМВОЛА В СЛУЖЕБНОЙ

;СТРОКЕ

1030

112200

M:MOVB

(R2)+,R0

;ПЕРЕСЛАТЬ В R0 КОД СИМВОЛА

1032

104022

EMT

22

;ФОРМИРОВАНИЕ СИМВОЛА В

;СЛУЖЕБНОЙ СТРОКЕ

1034

5201

INC

R1

;УВЕЛИЧЕНИЕ НА 1 НОМЕРА ПОЗИЦИИ

1036

5303

DEC

R3

;УМЕНЬШЕНИЕ НА 1 СТРОКИ СИМВОЛОВ

1040

3373

BGT

M

;ПЕРЕХОД НА М, ЕСЛИ СТРОКА НЕ

;ЗАВЕРШЕНА

1042

20

RTS

 

;ВЫХОД

Вторая обеспечивает движение по экрану некоей фигуры, пока нажата клавиша.

10 Х=122
20 Y=12S
30 CLS
40 IF PEEK(&O177714)=1 THEN R=-1
50 IF PEEK(&O177714)=3 THEN P=-1
60 IF PEEK(&O177714)=17 THEN P=1
70 IF PEEK(&O177714)=5 THEN R=1
80 PSET(X,Y),1
90 X=X+R
100 Y=Y+P
110 IF X<10 THEN X=240
120 IF X>240 THEN X=10
130 IF Y>230 THEN Y=10
140 IF Y<10 THEN Y=230
150 PSET(X,Y),2
160 R=0
170 P=0
180 GOTO 40

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

5 COLOR 1,4
10 CLS
20 ? "PROGRAM"
30 FOR P=1 TO 5
40 FOR R=1 TO 58
50 IF POINT(R,P)=1 THEN PSET(R,P),2
60 NEXT R,P

 

При выводе чисел на принтер и экран монитора числа, меньшие 0,01, печатаются в экспоненциальной форме, что неудобно. В вильнюсской версии Бейсика нет специального оператора вывода чисел в форматированном виде, но вместо него В. Кошелев предлагает использовать специальную процедуру, обеспечивающую привычную форму выводимых чисел.

10 INPUT В
20 D$=""
30 С$=""
40 T$=""
50 N=VAL(MID$(STR$(B),LEN(STR$((B)))-1,1))
60 S=INT(CSNG(B)*(10^(N+1))+1/(10^N))
70 T$=STRING$(N-1,48)
80 IF B<.01 THEN 110
90 ? CSNG(B)
100 GOTO 10
110 A$="0."
120 D$=STR$(S)
130 C$=A$+T$+MID$(D$,LEN(D$)-2)
140 ? C$
150 GOTO 10

И. ПАНЧЕНКОВ


 

О символьных переменных

Ошибка вильнюсского интерпретатора Бейсика при выполнении присваивания А$=А$+В$ общеизвестна. Для получения правильных результатов в «ИНФО» № 2 за 1990 г., с. 49, предлагались некоторые приёмы.

Если приглядеться к работе использующих присваивание А$=А$+В$ программ, видно, что при этом «съедается» первый символ, вся информация сдвигается влево, а последний символ дублируется. Ситуация напоминает «дребезг» клавиатуры.

Модифицируем присваивание так, чтобы «съедался» пустой символ: A$=""+A$+P$. Этот приём предлагался консультантом журнала Г. Панченковым, но из-за опечатки он многим оказался непонятен; между тем он обеспечивает правильность не только присваивания, но и выделения подстроки с использованием функций MID$ и LEN.

Обратим внимание на использование оператора CLEAR при работе с символьными переменными. Буфер символьной переменной рассчитан на 256 символов, следовательно, переменная может состоять не более чем из 255 символов. Однако, хотя программа

5 CLEAR 201

работает нормально, стоит лишь заменить 200 на 201, как произойдёт сбой. Для его ликвидации придётся добавить строку

10 CLS
20 A$=STRING$(200,"*")
30 ?А$

Для максимально полного использования буфера символьной переменной и предотвращения ошибок следует чаще использовать оператор CLEAR для перераспределения памяти под конкретную задачу.

А. ЧЕРНОЛЯСОВ


 

Спрайты на БК

В «ИНФО» уже рассказывалось о спрайтах на БК-0010 (№ 2, 1990 г.). Подпрограммы, приведённые в той статье, позволяют выводить спрайты на экран лишь в 32 позиции по горизонтали и при отсутствии графического редактора GRED0 практически бесполезны: для записи образа спрайта из Бейсика необходим большой объём двоичных данных, используется зеркальное изображение спрайта, следовательно, есть сложности с цветом...

Решить проблему может специальный редактор спрайтов, точнее, два - для размеров 8x10 и 16x20. Такие редакторы - EDSPR8 и EDSPR16 - были созданы. Одновременно были разработаны и новые подпрограммы выдачи спрайтов на экран; они позволяют выводить спрайты в 64 позиции по горизонтали и в то же время имеют вдвое меньший объём. Благодаря последнему обстоятельству можно увеличить объём программы на Бейсике, использующей спрайты, или объём блока спрайтов.

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

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

Манипулирование спрайтами - это копирование, обмен местами, логические операции И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ. Можно также передвигаться по блоку спрайтов, отменять результаты редактирования, запоминать текущий спрайт.

Файл спрайтов можно записать на МЛ и считать его оттуда.

Подпрограммы выдачи спрайтов на экран помещаются в ОЗУ с адреса 30000, блок спрайтов - с адреса 30100. Координата X заносится в ячейку 30074, Y - в ячейку 30076. Номер спрайта (обязательно целее число - % является операндом функции USR, вызывающей подпрограмму. И подпрограммы, и блок спрайтов легко переместить в памяти и использовать обе подпрограммы для выдачи спрайтов на экран.

Ниже приводятся тексты программ, заносящих в ОЗУ подпрограммы выдачи спрайтов.

SPR8:
10 DATA 5572,12352,4933,771,26052,20,32579,6080
20 DATA 12350,5571,6,3264,32450,26048,16384,26560
30 DATA 12348,5569,10,8215,32766,-32251,-27376,-27376
40 DATA 26048,62,32328,135
50 FOR I=&O30000 TO &O30066 STEP 2
60 READ C
70 POKE I,C
80 NEXT
SPR16:
10 DATA 5572,12352,4933,771,26052,80,32579,6080
20 DATA 12350,5571,6,3264,32450,26048,16384,26560
30 DATA 12348,5569,20,8215,32764,-32249,-27376,-27376
40 DATA -27376,-27376,26048,60,32330,135
50 FOR I=&O30000 TO &O30072 STEP 2
60 READ C
70 POKE I,C
80 NEXT

После ввода и выполнения одной из этих программ запускается соответствующий редактор спрайтов и создаются (или загружаются с МЛ) необходимые спрайты, использовать которые в дальнейшем можно, определив подпрограмму выдачи на экран командой

DEF USR=&O30000

Заинтересовавшиеся могут обратиться по адресу: 432012, г. Ульяновск, просп. Гая, 23а, кв. 44; тел. 37-10-57.

П. НИКОНОВ


 

Рекомендации по подключению внешних устройств к порту ввода-вывода БК-0010

Номер контакта

Назначение

A1

Сброс

B1

ПРТ

A2

 

B2

 

A3

 

B3

 

A4

 

B4

 

A5

 

B5

ВД4

A6

 

B6

ВД6

A7

ВД7

B7

ВД5

A8

Питание +5 В

B8

Питание +5 В

A9

Питание +5 В

B9

Питание +5 В

A10

 

B10

ВД3; мышь: сброс

A11

Общий

B11

Общий

A12

ВД2

B12

 

A13

ВД1

B13

 

A14

 

B14

 

A15

 

B15

 

A16

ВД0

B16

 

A17

 

B17

Мышь: курсор влево. Дискретный джойстик 2: выстрел влево

A18

Общий

B18

Общий

A19

Общий

B19

Общий

A20

КН1 (мышь: клавиша записи). Дискретный джойстик 1: вниз

B20

Дискретный джойстик 1: вправо

A21

 

B21

 

A22

 

B22

КН2 (мышь: клавиша стирания). Дискретный джойстик 2: вправо

A23

Дискретный джойстик 2: вниз

B23

Мышь: курсор вниз. Дискретный джойстик 2: выстрел вправо

A24

Мышь: курсор вправо. Дискретный джойстик 1: выстрел влево

B24

Мышь: курсор вверх. Дискретный джойстик 2: выстрел вправо

A25

ИНД2 (индикация джойстика 2)

B25

 

A26

Аналоговый джойстик 2: вертикальный сдвиг

B26

ИНД1 (индикация джойстика 1)

A27

Аналоговый джойстик 1: вертикальный сдвиг

B27

Аналоговый джойстик 2: горизонтальный сдвиг

A28

СТР (принтер: строб)

B28

Аналоговый джойстик 1: горизонтальный сдвиг

A29

ИНДД (индикация дискретного джойстика)

B29

ИНАД (индикация аналогового джойстика )

A30

 

B30

Дискретный джойстик 2: сдвиг вверх

A31

Дискретный джойстик 1: влево.
Аналоговый джойстик 1: горизонтальный сдвиг

B31

ЗП (принтер: запрос приёмника)

A32

Дискретный джойстик 2: влево

B32

Дискретный джойстик 1: вверх.
Аналоговый джойстик 1: вертикальный сдвиг

 

Предлагаемый стандарт предусматривает возможность одновременного подключения печатающего устройства (принтера), устройства ввода УВК-01 («мышь») и двух джойстиков (аналоговых или дискретных). Схемы джойстиков приведены на рисунке, а опознавание их типов происходит автоматически по наличию контрольных перемычек между контактами В26 и А29 или В29 (для джойстика 1) и контактами А25 и А29 или В29 (для джойстика 2). Например, наличие перемычек В26 - В29 и А25 - А29 означает, что подключён джойстик 1 аналогового типа и джойстик 2 дискретного типа, наличие перемычки А25 - В29 означает, что подключён только джойстик 2 аналогового типа.

 

Для подключения принтера используются девять выходных регистров (ВД0 - ВД7 данные и ВД8 строб) и один входной (ВВ8 ЗП). Остальные запросы (подразумевается, что они есть) заземляются на контакты А, В (11, 18, 19).


 

Важные восьмеричные числа

При программировании на ассемблере возникает необходимость помещения кода КОИ-7 в младший или старший байт регистра общего назначения. Если в случае младшего байта никаких проблем нет (например, MOV #12, R2), то при занесении кода в старший байт необходимо сначала подобрать соответствующее восьмеричное число. Допустим, мы используем команду ЕМТ 10 и нам необходимо занести в старший байт регистра R2 в качестве ограничителя строки код 12 (ВВОД). Для этого необходимо поместить в R2 восьмеричное число 5000: MOV #5000, R2. В результате в младшем байте R2 окажется 0, а в старшем - 12. Для этого случая в ассемблере МИКРО10 есть специальная псевдокоманда .В:, но как вычислить физический адрес метки? К тому же такие команды есть не во всех версиях ассемблеров.

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

Восьмеричные

Назначение

Код

Число

10

4000

12

5000

ВВОД

14

6000

СБР

15

6400

УСТ ТАБ

16

7000

РУС

17

7400

ЛАТ

20

10000

СБР ТАБ

22

11000

23

11400

ВС

24

12000

ГТ

26

13000

|<--

27

13400

|-->

30

14000

<--|-

31

14400

32

15000

33

15400

34

16000

35

16400

36

17000

37

17400

В. КИМ


 

О системных ячейках БК-0010

Координаты курсора хранятся в ячейке 156 (здесь и далее используются восьмеричные числа, за исключением отмеченных случаев). Значение её младших 6 битов (0-5) определяют координату по горизонтальной оси (от 0 до 77), значения битов 6-1010) - по вертикальной. В режиме 3210 символа в строке позиция курсора на горизонтальной оси (0-3110) определяется целой частью от деления на 2 точной его координаты.

Ячейка 160 определяет адрес того байта экранной памяти, с которого начнётся вывод очередного символа. Он соответствует текущему положению курсора.

В режиме ГРАФ (в байте 50 записан не ноль), курсор указывает на отдельные адресуемые точки. В этом случае содержимое ячейки 156 показывает, в какой области из 8x1010 (в режиме 6410 символа в строке) или 4x1010 (в режиме 3210 символа в строке, когда точку определяют два соседних бита экранной памяти) точек находится курсор. Координаты, записанные в этой ячейке, указывают на место, в котором курсор будет находиться при выходе из графического режима. Положение графического курсора внутри такой области определяют ячейки 154, 166, 170 и 174.

Младший байт ячейки 154 определяет положение точки, в которой находится курсор, на горизонтальной оси. Если в бите 9 этой ячейки записана единица, то текущий режим - 3210 символа в строке (25610 точек по горизонтали), если 0 - то 6410 символа (51210 точек).

В последнем режиме номер установленного (т.е. того, в котором записана единица) бита младшего байта ячейки 154 указывает координату курсора внутри «области символьного курсора» (ОСК) по горизонтали. Так, если содержимое ячейки 154 равно ...010001000, то графический курсор указывает на пятую по горизонтали точку внутри той ОСК, в которой он находится. В режиме 1 координата определяется установкой пары битов (0-1, 2-3, 4-6 или 5-7). Если, например, в ячейке 154 записано ...1111000000, то курсор находится в четвертой по горизонтали точке ОСК.

Младший байт ячейки 154 логически умножается на маску цвета, а затем логически складывается с тем байтом экранной памяти, «где находится» графический курсор; адрес этого байта определяется содержимым ячейки 170. В 6 младших битах ячейки 166 записана координата ОСК по горизонтальной оси (та же, что в 6 младших битах ячейки 156).

Теперь о вертикальной координате. Биты 6-1310 ячейки 166 определяют координату Y графического курсора (от 0 до 357, т.е. до 23910). Биты 6-9 содержимого ячейки 174 определяют вертикальную координату точки внутри ОСК. Кроме того, адрес, указанный в ячейке 170, может однозначно определить вертикальную координату графического курсора, если учесть рулонный сдвиг.

При переходе в графический режим содержимое ячейки 106 изменяется с 20 000 на 2000, а ячейки 224 - с 0 на 2. Назначение этих изменений неясно.

Кроме того, мне удалось установить, где хранится информация о табулируемых позициях (устанавливаемых клавишами СУ+М и снимаемых клавишами СУ+Р). Ячейки 112-120 определяют их следующим образом:

ячейка 112 хранит информацию о позициях 0 - 1510;

114 - 1610 - 3110;

116 - 3210 - 4710;

118 - 4810 - 6310 (последние две ячейки задействованы только в режиме 6410 символа в строке). Установленные биты задают позиции табуляции (например, бит 2 ячейки 112 - позицию 2, бит 2 ячейки 114 - позицию 18 и т.д.).

Ячейка 214 определяет цвета символа, 212 - цвет фона, 220 - цвет символа в служебной строке, 216 - цвет фона в служебной строке. О том, как задаётся цвет в БК, уже говорилось на страницах «ИНФО». Подчеркну, что изменение значений в двух последних ячейках не изменяет цвет служебной строки, а лишь указывает режим вывода в ней подсказок РУС, ЛАТ, ПОДЧ, ИНВ, ИСУ, БЛР.

В ячейке 176 записана координата X последней выведенной (или стёртой) по запросам ЕМТ 30 или ЕМТ 32 графической точки, а в ячейке 200 - её координата Y. Они используют при построении отрезков по запросу ЕМТ 32 для указания начала отрезка.

И. ХРИСТОФОРОВ

 

Ниже следует внутренняя рецензия на статью И. Христофорова. Обычно рецензия остаётся известной только редактору, однако в данном случае она весьма информативна. Кроме того, представление о редакционной «кухне» может быть полезным молодым авторам, поэтому мы и впредь будем публиковать интересные рецензии.

 

Автором проделана значительная работа по экспериментальному определению назначения ячеек системной области БК-0010, результаты которой в основном изложены правильно. Кое в чём автор неточен, или, вернее, неправильно формулирует свои выводы. Например, ячейка 154 рассматривается им как слово, хотя из текста драйвера дисплея БК-0010 очевидно, что это два отдельных байта, 154 и 155. Если ещё назвать их «по имени», т.е. сказать, что байт 154 - маска позиции графического курсора (в пределах байта), а байт 155 - начальная маска графического курсора (или, иначе выражаясь, графической точки), то положение значительно прояснится. При описании ячейки 166 создаётся впечатление, что её содержимое чуть ли не дублирует содержимое ячейки 156; между тем ячейка 166 задаёт номер (адрес) графической точки на экране, а 156 - номер символа. Ячейка 156 работает и в символьном, и в графическом режиме, определяя номер «рабочего» знакоместа, а ячейка 166 - только в графическом режиме (при возврате в символьный режим её содержимое фиксируется).

Автор затрудняется объяснить назначение ячеек 106 и 224 и причины изменений их содержимого при смене режимов. Для ясности можно сообщить, что 106 - буфер константы повтора (время цикла задержки в режиме «повтор»), а 224 - счётчик индикаторов служебной строки, или, иначе говоря, условный номер выводимого в служебную строку в графическом режиме текста. Содержимому ячейки 224, равному 0, соответствуют пустые позиции 2010-2310 (считая с правого края строки), 2 - индикатор ГРАФ, 3 - ЗАП, 4 - СТИР.

Ячейки 112-120 определяются в тексте драйвера как блок из 8 байтов, носящий название «маска табуляции».

Несмотря на указанные недостатки, материал представляет заметный интерес для читателей и может быть опубликован.

Ю. ЗАЛЬЦМАН

 

(прим.gid: Вот-вот. Чувак старался, исследовал, совершал для себя открытия, а Зальцман, глянул в исходники монитора (у него они были), и всё, уже всё ему ясно, понятно и известно. А нам, простым людям, приходилось буквально всё узнавать самими и исследовать методом тыка.)

 

Performed by © gid, 2012-2024.