К книге
Проект «Сфера-82»: Цвет и слойГлава 37 Тень атрибутов
79%
Глава 37 Тень атрибутов
37

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

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

Морозов сидел на стуле, скрестив руки на груди, а перед ним лежала бесконечная бумажная гармошка — распечатка содержимого ПЗУ «Сферы-80М». Четыре килобайта шестнадцатеричного кода, превращённые широким АЦПУ в плотные сплошные колонки.

Слева от распечатки слабо мерцал экран. Справа лежала стопка исчерканных листов с картой экранной памяти и черновиками адресов портов.

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

Таких крестиков на трёх метрах распечатки набралось от силы штук двадцать.

Саша Птицын стоял чуть позади. Он старался не загораживать свет от настольной лампы, но его тень всё равно падала на край стола, ломаясь на сгибах распечатки. Он уже несколько дней гонял на макете тест «ЦВЕТ-80» и теперь принёс результаты, которые упёрлись в аппаратные ограничения.

— Двадцать четыре байта, — Громов отбросил карандаш. Тот со стуком покатился по столу. — Если я вырежу кусок из подпрограммы магнитофона и объединю вывод сообщения об ошибке синтаксиса с ошибкой переполнения, сэкономлю двадцать четыре байта. Лёша, это всё. ПЗУ забито под завязку. Сюда даже приличное матерное слово не помещается, не то что диспетчер цвета.

Морозов устало потёр переносицу, разминая затёкшую шею.

— Ругаться мы можем и устно, в обход прошивки. Женя, покажи ещё раз узкие места. Только не весь интерпретатор, а именно процедуры работы с экраном.

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

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

Морозов кивнул. Он ожидал этой проблемы.

— На какой операции текст и цвет расходятся?

— На сдвиге экрана, — ответил Птицын. — Запись в порты проходит нормально, обычная печать работает. Сбой виден именно при сдвиге: символы уходят вверх, а атрибуты остаются на старых знакоместах.

Громов пожал плечами.

— Естественно. Символ переехал, а краска осталась на стене. Потому что Бейсик ничего не знает про твою цветную приставку. Он читает байт символа из старой экранной памяти и пишет его выше. А параллельная память атрибутов, которая сидит на плате у Олега, в этот момент просто простаивает. Никто не даёт команду перенести цвет.

— Получается трафарет, — кивнул Морозов. — Слово уехало вверх, а на его старом месте светится пустота. Или кусок нового текста, который туда случайно попал.

— Именно, — Птицын вздохнул. — Поэтому я и пришёл. Алексей Николаевич, может, всё-таки можно добавить одну команду? Не нужны все эти сложные операторы цвета, как на больших машинах. Просто одну маленькую функцию в ПЗУ. Чтобы перед сдвигом экрана она читала атрибут и переносила его.

— Саня. Одно слово в Бейсике — это не просто шесть букв в таблице, — голос программиста стал сухим. — Это запись в таблице лексем и ветвление в анализаторе синтаксиса. Плюс проверка параметров — ты же не просто слово напишешь, тебе надо передать номер цвета. Значит, надо вызвать анализатор чисел, проверить, не вылезло ли оно за пределы допустимого, перейти на процедуру и вернуть управление. Это байт пятьдесят-семьдесят минимум. А у нас, — он постучал ногтем по двум десяткам карандашных крестиков, — их нет. И даже если мы их выгрызем с кровью, Бейсик станет тормозить при каждом сдвиге экрана. Он и так не чемпион по скорости.

Морозов молча смотрел на распечатку. Задача создания цветной машины усложнялась тем, что если они расширят память, добавив ещё одну микросхему — это будет уже другая аппаратная база. Потеряется главное: возможность модернизации «Сферы-80» простым добавлением цветной видеоплаты.

— Значит, принимаем текущий код ПЗУ как финальный, — спокойно произнёс Морозов. — Сохраняем штатный вывод текста и прямую запись атрибутов в порты. Сопровождение строк при сдвиге реализуем силами видеоплаты.

— И пока закономерно получаем ползущие буквы на залипшем фоне, — хмыкнул Громов.

Морозов придвинул к себе чистый лист.

— Давай разложим физический цикл прокрутки экрана по тактам. Как именно прошивка двигает массив?

Громов вытащил из пальцев Морозова карандаш и набросал вытянутый прямоугольник.

— Циклом. Автомат ЦУБа берет начальный адрес второй строки. Выполняет такт чтения, забирает байт символа в рабочий регистр. Следом идет такт записи уже по адресу первой строки. Базовая машина гоняет эту петлю, наращивая адреса на магистрали, пока не перетащит весь текст.

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

— Интересно получается, — Птицын перевел взгляд с бумаги на коллег. — ЦУБ таскает байты туда-сюда, а цветная плата в этот момент висит на тех же проводах адресной шины. Она прекрасно видит все адреса и сигналы.

Морозов утвердительно качнул головой.

— Видит. И тут важно вспомнить физику вывода. Атрибуты задают только цвета. Форму символа обеспечивает штатный монохромный видеосигнал старой машины.

Громов отодвинул распечатку ПЗУ.

— Цветная приставка встает между старым видеовыходом и цветным ВКУ. Она вытаскивает из черно-белого сигнала синхронизацию и маску знака и фона.

— Затем считает телевизионные строки и знакоместа, — подхватил Морозов. — Читает собственную память атрибутов и формирует цветной выход. Если пустить сигнал в обход приставки, старый черно-белый выход остается полностью рабочим. Базовая архитектура сохраняется.

Карандаш в руке архитектора начертил на пустом месте листа длинную горизонтальную полосу.

— Вот основная экранная область, — Морозов разбил полосу на ячейки. Под ней сразу появилась вторая, точно такая же. — А это параллельная память атрибутов на цветной плате. Она подключена к тем же младшим адресным линиям.

Он провел между двумя линиями короткую вертикальную стрелку.

— Когда идет обычная печать символа, машина делает цикл записи. Плата ловит этот сигнал, берет текущий цвет из своего внутреннего регистра и кладет его в память атрибутов. А вот при сдвиге текста ЦУБ сначала выполняет чтение.

Громов нахмурился, оценивая логику.

— Заодно прячет текущий атрибут во временный регистр. Взводит флаг. А на следующем такте, когда ЦУБ пишет символ выше…

— Плата замечает запись, проверяет флаг и выгружает цвет по новому адресу, — подтвердил Морозов. — Заодно сама сбрасывает флаг.

Птицын подался вперёд, изучая рисунок.

— Всё работает аппаратно. Само.

— Аппаратура всегда требует защиты, — осадил его Громов. Программист мысленно раскладывал идею на логические вентили и машинные циклы. — Лёша, идея выглядит красиво на бумаге. В железе мы получим нюансы.

Громов постучал пальцем по распечатке прошивки.

— ЦУБ обращается к памяти прямолинейно. Моя процедура вывода то и дело читает экран ради служебных проверок. Тот же курсор стереть. Плата примет такое чтение за начало сдвига и запихнёт случайный атрибут во временный регистр. А следующая запись швырнёт этот цветовой мусор на экран. Поползут пятна.

— Потребуется защита от ложных срабатываний, — согласился Морозов. Он ожидал этого возражения. В реальном железе всегда проскакивают паразитные обращения. — Флаг переноса обязан сбрасываться после записи или при обращении к любой другой памяти. Сдвиг идёт плотно: чтение-запись, чтение-запись. ЦУБ прочитал экран, а затем полез в ПЗУ за следующей командой Бейсика — значит, это был другой процесс, и логика сама сбросит флаг.

Громов пожевал губу, прикидывая объём монтажа.

— Олегу придётся городить на плате целый автомат состояний на мелкой логике. Дешифратор адреса, распознавание сигналов, триггеры флагов. Это лишние корпуса и занятое место на текстолите.

— Такова цена совместимости, — ответил Морозов. — Базовую прошивку мы сохраняем в первозданном виде, поэтому придётся усложнять видеоплату. Олег справится. Там хватит трёх-четырёх корпусов К155ЛА3 и пары триггеров. Место найдём.

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

— Ты вовремя задал вопрос про шину, Саня, — произнёс Морозов. — Теперь этот узел сопровождения сдвига предстоит проверить в железе.

Птицын выпрямился.

— Мне паять макет?

— Плату доработают Олег и Наташа, — спокойно разделил задачи Морозов. — Добавят логические корпуса, кинут перемычки, выведут проверочные точки. А ты дорабатываешь «ЦВЕТ-80». Напиши короткий испытательный цикл: залей экран цветом и заставь ПЗУ безостановочно сдвигать строки.

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

— Понял, — Птицын торопливо вытащил из кармана халата блокнот и огрызок карандаша. — А рамку? Тоже отслеживать?

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

Птицын быстро строчил в блокноте, вдавливая грифель в бумагу.

Морозов смотрел на экран телевизора. На тёмном фоне одиноко мигал квадратный курсор.

— Сможешь завтра с утра набросать проверочный цикл? — спросил Морозов, собирая исчерканные листы со стола. — А я пойду обрадую Олега, что его макет потяжелеет на несколько микросхем.

— Он будет абсолютно счастлив, — язвительно заметил Громов, аккуратно складывая гармошку распечатки. — Особенно Наташа. Она только-только спаяла чистую плату. Теперь придется резать дорожки и добавлять корпуса.

— Переживут, — Морозов стянул бумагу в ровную стопку. — Лучше кромсать текстолит на лабораторном столе, чем потом объяснять школьникам, почему у них буквы уехали вверх, а краска осталась висеть в воздухе.

* * *

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

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

— Автомат состояний, — медленно произнес Олег, словно пробуя слова на вкус. — На шине старой восьмидесятки. Вы хотите, чтобы я воткнул сюда триггеры, которые будут следить за каждым чихом ЦУБа, ловить циклы чтения-записи и подменять адреса на лету?

— И сбрасывать флаг при обращении к ПЗУ, — добавил Громов, не отрываясь от своей чашки чая. — Не забудь про сброс. Иначе мы получим светомузыку вместо таблиц.

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

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

— А если ЦУБ полезет читать экран вне цикла прокрутки? — нахмурился Олег. — Ложное срабатывание, и мы перетащим на новую строку случайный мусор.

— Значит, следующий такт шины уйдёт в ПЗУ за кодом команды, — ответила Наташа. — Ставим логику на ЛА3. Если адрес не совпадает с экранным, подаём сигнал на асинхронный сброс триггера. Всё лишнее отсекается.

Олег почесал затылок, прикидывая габариты.

— Три дополнительных корпуса. И паутина проводов. Текстолит уже трещит от плотности монтажа.

— Разместишь, — Люба заглянула через его плечо. — Я тебе вчера отдельную шину питания вывела. Только блокировочные конденсаторы повесить не забудь, а то твои регистры от наводок сойдут с ума.

Морозов присел на край стола.

— Саш, пока Олег воюет с паяльником, набросаешь проверочный код? Только для макета. Сначала задай атрибут в порт и раскидай буквы по разным знакоместам, а потом залей экран цветными строками и вызови сдвиг. Посмотрим, поедет ли цвет.

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

К трём часам дня Олег со стуком опустил паяльник на подставку и вытер лоб тыльной стороной ладони.

— Готово. Забирайте своего Франкенштейна.

Плата, обросшая новыми микросхемами-«этажерками», выглядела неряшливо, но прозвонка подтвердила отсутствие коротких замыканий. Колодки аккуратно состыковали с системной магистралью старой «Сферы». Люба щёлкнула тумблером блока питания. Экран ВКУ засветился ровным серым фоном. Дым не пошёл.

Морозов подошёл ближе, Громов отложил распечатки.

— Прогоняй, — кивнул Морозов.

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

— Поехали, — Саша вбил стартовый адрес и нажал ввод.

На экране мгновенно отрисовались яркие блоки. Красные буквы на синем фоне выстроились в надпись «ТЕСТ СДВИГА». Ниже легла зелёная строка, за ней — жёлтая. Экран заполнился до самого низа. Цвета стояли идеально ровно, без грязи на границах. Но статику они уже проверяли.

— А теперь вниз, — негромко сказал Громов.

Птицын ударил по пробелу.

ЦУБ принял код возврата каретки. Место в нижней строке закончилось, и базовая прошивка запустила подпрограмму сдвига — обычный цикл побайтового копирования текста.

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

На дисплее всё произошло за долю секунды. Текст дернулся вверх.

И цвета сдвинулись вместе с ним.

Красная надпись «ТЕСТ СДВИГА» поднялась на строку выше. Красный шрифт и синий фон перешли в новые знакоместа строго поверх нужных символов. Освободившаяся нижняя строка очистилась полностью — старая прошивка стерла текст, а цветная плата обнулила соответствующие байты атрибутов.

— Работает, — выдохнул Птицын.

Он принялся раз за разом бить по пробелу. Экран дернулся раз, другой, третий. Цветные прямоугольники поднимались вверх синхронно со словами. Привязка цвета к символам сохранялась на каждом шаге прокрутки, пока контрольная надпись не ушла за верхнюю кромку кинескопа.

Олег уперся руками в край стола и счастливо рассмеялся.

— Схема сама тащит цвет за символами! Базовая плата прокручивает текст, а наша обвязка шагает следом и перекладывает атрибуты. Мы полностью сохранили старую прошивку.

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

— Импульс чтения из экранной области проходит чётко, — произнесла она. — Следом идёт сигнал записи, логика переносит атрибут и сразу сбрасывает флаг. При обращениях ЦУБа к ПЗУ или системному ОЗУ ложных срабатываний нет. Сигналы стабильные.

Морозов смотрел на мерцающие строки. Макет впервые выводил цветной текст, а старое ПЗУ оставалось нетронутым.

Громов хлопнул Олега по плечу.

— Беру свои слова обратно, Тимофеев. Эта этажерка из микросхем стоила того. Мой интерпретатор цел.

Наташа потерла переносицу, размазав серый след от карандашного грифеля.

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

Люба поправила очки, собирая со стола кусачки и пинцеты.

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

Громов присел на край стола.

— Программное пояснение беру на себя. Сделаю таблицу портов и пример для статьи. Пользователь задает текущий атрибут через OUT, затем печатает стандартным PRINT. Текст выводится штатно, железо параллельно подтягивает цвет.

— Завтра отдаем черновики Липатову, — сказал Морозов. — Пусть готовит документацию. С него чистовая принципиальная схема, перечень элементов и методика сборки с наладкой. Материал для статьи тоже сведет он. А Саша…

Алексей посмотрел на Птицына. Тот завороженно бил по пробелу, гоняя цветные строчки вверх по стеклу кинескопа.

— А Саша напишет первый цветной пример. График функции или простую игру. Вещь, ради которой человек пойдет греть паяльник.

Птицын просиял.

— Сделаю, Алексей Николаевич!

Предыдущая главаГлава 37 из 47Следующая глава