С. КОМАРОВ, М. МОНИН
Про Бейсик, быстродействие и кое-что ещё
Это небольшое исследование адресовано в первую очередь владельцам БК-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», ориентировочные оценки таковы:
- точность вычислений: 0.0000001 - отлично, 0.18 - плохо;
- генератор случайных чисел: 5 - отлично, 15 - плохо.
Этот тест мы запускали на БК-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 должен удовлетворять следующим условиям:
- управление режимами воспроизведение, запись, перемотка влево и вправо, останов должно осуществляться электрическими импульсами - логическими 0 и 1;
- должен иметься датчик импульсов для счётчика ленты;
- в схеме магнитофона должен иметься сигнал, указывающий направление движения ленты (0 - перемотка назад, 1 - остальные режимы);
- должен иметься датчик нахождения кассеты в магнитофоне.
Управление магнитофоном осуществляется при помощи интерфейсного кабеля со встроенными трёхдекадным счётчиком ленты (размещение счётчика в магнитофоне потребовало бы увеличения числа соединительных проводов между ним и БК с 9 до 20).
Кабель интерфейса со встроенным счётчиком ленты подключается к параллельному порту БК-0010. Назначение сигналов, поступающих на порт, приведено в таблице. Электрическая схема счётчика показана на рис. 1.
Рис. 1
|
|
Счётчик ленты собран на трёх двоично-десятичных реверсивных счётчиках К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), подходящий к ножке 10 триггера К155ТМ2 (DD2.1);
- для исключения ошибки счётчика из-за «выбега» ленты при выключении режима перемотка влево (счётчик уже переключён на прямой счёт, а лента ещё движется назад) на одновибраторе 155АГ1 собрана схема задержки выключения сигнала вперёд-назад; изготовлен датчик импульсов.
Рис. 2
Рис. 3
Рис. 4
Устройство датчика импульсов показано на рис. 3. Шкив, жёстко связанный с приёмным подкассетником, зачерняется чёрной краской. Затем на него наклеиваются три полоски алюминиевой фольги шириной по 3 мм. В приклеенном рядом кронштейне укрепляются светодиод АЛ107 и фотодиод ФД27К. Каскады на VT1 и DD1 формируют прямоугольные импульсы, которые подаются на счётчик DD2, обеспечивающий необходимый коэффициент деления (в приведённой конструкции при установке кассет МК-60 и МК-90 концу ленты соответствуют показания счётчика около 600 и 900 соответственно).
Сигнал направления движения ленты берётся с коллектора VT32. В других магнитофонах этот сигнал можно снять, например, со схемы индикации режимов работы.
Устройство управления вторым магнитофоном позволяет управлять МГ2, не имеющим электронного управления, не внося никаких изменений в его схему. Управление производится включением и отключением напряжения питания магнитофона.
Кроме того, это устройство можно использовать для управления какой-либо мощной нагрузкой в программах пользователя.
Электрическая схема устройства показана на рис. 4.
Оптимальный драйвер магнитофона для БК
Драйвер магнитофона, «прошитый» в ПЗУ БК-0010 (в дальнейшем именуемый штатным), обеспечивает скорость обмена информацией 1200 бит/с. Для записи информации на МЛ используется метод широтно-импульсной модуляции[1] с побитовой синхронизацией[2]. Степень надёжности считывания информации вряд ли можно считать высокой даже при использовании двух экземпляров записи файла, особенно для достаточно длинных программ. Нельзя ли улучшить программ-драйвер?
Проанализируем требования, которым должен удовлетворять оптимальный драйвер магнитофона для БК-0010 (с учётом использования дешёвых и несовершенных моделей магнитофонов).
- Устойчивость работы при больших нелинейных искажениях сигнала, поступающего с магнитофона.
- Желательно сохранение работоспособности при различных скоростях движения МЛ.
- Индифферентность к возможному инвертированию импульсов, получаемых от магнитофона.
- Сохранение работоспособности при незначительных колебаниях скорости движения МЛ.
- Максимальная плотность записи на МЛ (при фиксированной максимальной частоте записываемого сигнала).
- Максимальная надёжность считывания.
- Устойчивость к помехам (наводкам) периодического характера.
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 приведены их основные технические характеристики, анализ которых позволяет сделать следующие выводы.
|
М С-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:
- достоинства - малые вес и габариты, бесшумная высокоскоростная печать, по системе кодов практически полная совместимость со стандартом Epson ESC/-Р80
- недостаток - в качестве красконосителя используется специальная печатающая головка, которая не подлежит заправке, а заменяется новой; стоимость одной головки - 25 рублей.
Отметим также, что инструкция по эксплуатации УВИП МС-6312 недостаточно полна и не лишена неточностей: например, в команде ESC С неверно указан десятичный код, неверно описана функция команды. Отсутствуют примеры применения команд.
Устройство вывода печатающее (УВП) МС-6313:
- достоинства - широкий набор графических символов, доступность красящей ленты, высокое качество печати, наличие последовательного интерфейса, нетребовательность к типу бумаги;
- недостаток - несовместимость по системе кодов со стандартом Epson ESC/-Р80.
Принтеры могут работать совместно с компьютером БК-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 осуществляется отмена всех атрибутов.
Для задания режимов работы драйвера рекомендуется следующий порядок:
сброс; чтение; задание режимов печати; печать; возврат либо на чтение, либо на задание режимов печати.
МС-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РРЗ. Программатор работает в составе БК под управлением специальной программы, позволяющей записывать в ППЗУ и стирать необходимую информацию. Чтение из ППЗУ осуществляется непосредственно, как из ОЗУ.
Технические характеристики программатора:
- время выборки данных из ППЗУ 170 нс
- время стирания 20 с
- время записи одного слова 50 мс
- напряжение программирования 24 В
- напряжение стирания 18 В
- информационная ёмкость 16К байт
- начальный адрес ППЗУ 120000
- напряжение питания (внешний источник) 27-30 В
- интерфейс - совместимый с общей шиной БК-0010(.01)
Для начального адреса ППЗУ могут быть установлены значения 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 раза соответственно. Работа с ними происходит так.
- Загрузить в БК код программы SCR12.BIN (или SCR24.BIN). Это можно сделать из Бейсика операторами DATA и READ или с МЛ оператором BLOAD; программы написаны в позиционно-независимом коде, т.е. адрес загрузки можно выбрать произвольно.
- Определить машинную подпрограмму оператором
DEF USR=<адрес>
- Обязательно выровнять экран:
PRINT CHR$(140);CHR$(140)
- Обратиться к подпрограмме оператором
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 - её адрес.
В результате перед программирующими на Бейсике-БК открывается целый ряд дополнительных возможностей:
- создание цепочки программ:
- вывод содержимого экрана на принтер ДВК в КУ ВТ-86;
- вывод команды CLEAR непосредственно из программы;
- создание всевозможных меню выбора программ для загрузки;
- использование программы MERGE, описанной в выпуске «Вычислительная техника и её применение» (1990, № 4);
- создание самокомпонующих программ;
- и ещё много-много полезного...
Все эти возможности открываются благодаря тому, что после выхода из программы (по команде 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: влево. |
B31 |
ЗП (принтер: запрос приёмника) |
A32 |
Дискретный джойстик 2: влево |
B32 |
Дискретный джойстик 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: Вот-вот. Чувак старался, исследовал, совершал для себя открытия, а Зальцман, глянул в исходники монитора (у него они были), и всё, уже всё ему ясно, понятно и известно. А нам, простым людям, приходилось буквально всё узнавать самими и исследовать методом тыка.)