Лаборатория КБ «Сфера» полнилась привычным многослойным шумом. В коридоре кто-то с грохотом катил тележку с блоками питания. В дальнем углу мерно гудел вытяжной вентилятор, а над столами висел непрерывный писк измерительной аппаратуры.
Алексей Морозов, Евгений Громов и Сергей Липатов уехали в Зеленоград, забрав с собой дискету с координатами и подготовленные акты контроля. Олегу Тимофееву и Наташе Роговой предстояло заставить аппаратную схему видеовывода стабильно работать с реальным кинескопом здесь, во Владимире.
На центральном монтажном столе громоздилось выпотрошенное шасси УПИМЦТ — тяжелая, угловатая конструкция из штампованного металла и гетинакса, ощетинившаяся радиаторами транзисторов и высоковольтными проводами. Рядом располагался макет цифрового видеоконтроллера на базе микропроцессора К580. Плата макета пестрела ровными рядами микросхем, опутанными густой паутиной тонких монтажных проводов во фторопластовой изоляции.
Олег, закатав рукава, зачищал кусачками тонкие провода. Он подпаивал выходы цифрового макета напрямую к цепям видеоусилителя телевизора, минуя штатный радиотракт.
Люба Ветрова стояла над ним, сжимая щупы мультиметра. Волосы растрепались, пара прядей выбилась из-под заколки, но взгляд за стеклами очков оставался колючим.
— Тимофеев, убери руки от питания, — не отрывая взгляда от показаний мультиметра, произнесла она, прижимая минусовой щуп к металлической раме макета.
— Люба, да мы на пять минут включим, — поморщился Олег, не выпуская из пальцев зачищенный конец медного провода. — Я просто времянку кину на землю видеоусилителя. Нам только картинку посмотреть, статична или нет. Завтра нормально распаяю.
— Времянку ты будешь у себя в гараже на аккумулятор кидать. — Люба переключила предел измерений на приборе, и стрелка дернулась, показывая сопротивление. — У тебя телевизионное шасси. Блок строчной развертки. Там импульсы обратного хода луча — киловольты. Если твоя «времянка» даст петлю по земле, или сопротивление контакта окажется выше нормы, весь этот высоковольтный мусор полетит прямо в шину данных.
Она отложила мультиметр и указала кончиком карандаша на хитросплетение дорожек.
— Цифровая логика питается пятью вольтами. Идеально чистыми пятью вольтами. Одно пробитие по массе из-за твоей спешки — и мы будем выковыривать кристаллы К580 из панелей, потому что они сплавятся. Земля должна сходиться в одной точке. Звезда, Олег. Никаких петель. Перепаивай.
Олег тяжело вздохнул, признавая поражение. Спорить с Ветровой в вопросах разводки и помех было бесполезно. Он молча взял кусачки и откусил злополучную времянку.
В паре метров от них, на краю стола, расчищенном от обрезков провода и пустых спичечных коробков, сидел Саша Птицын. Перед ним лежала клавиатура и толстая стопка распечаток. Младший инженер водил пальцем по колонкам шестнадцатеричных кодов, беззвучно шевеля губами. Тестовое ПЗУ уже было прошито и вставлено в цанговую панельку.
К столу неслышно подошел Андрей Горелов, чья безупречно выглаженная светлая рубашка резко контрастировала с рабочими халатами инженеров. Он положил на край стола неизменную общую тетрадь.
— Александр, отвлекитесь на минуту, — произнес Горелов. — Аппаратную часть видеовывода я изучил. Схемы Роговой мне понятны. Меня интересует программная реализация. Как именно логика управляет цветом?
Птицын оторвался от листинга.
— Сейчас мы реализуем атрибутный режим, — начал Птицын, придвигая к себе карту распределения памяти. — Цвет присваивается группе точек восемь на восемь.
Он обвел карандашом блок адресов на чертеже.
— Базовое текстовое поле, как в черно-белой версии. Но параллельно с кодом символа из отдельной области ОЗУ вычитывается байт атрибута.
Горелов быстро пробежал глазами по шестнадцатеричным адресам.
— Значит, цвет привязан к знакоместу аппаратно, — утвердительно произнес он.
— Именно, — кивнул Птицын. — Процессор пишет один байт, а красит сразу целую букву. Это экономит такты. Смотрите, как мы разбили этот атрибутный байт. Два старших бита мы пока отбросили, они резервные. Дальше идут три бита на цвет фона. И три бита на цвет самого знака.
— Три бита дают восемь комбинаций, — мгновенно подсчитал Горелов.
— Да, восемь простых цветов, — подтвердил Саша. — Палитра жестко зашита аппаратно. Программа просто кидает в память байт атрибута, а дешифратор уже сам на лету формирует нужные сигналы для кинескопа. Но здесь есть аппаратное ограничение, Андрей Витальевич, о котором ваши операторы должны знать. Внутри одного квадрата восемь на восемь точек мы можем вывести только два цвета одновременно: цвет знака и цвет фона. Если вы попытаетесь нарисовать красный график, пересекающий синюю таблицу, в месте их встречи цвета неизбежно сольются или затрут друг друга. Цветовой конфликт. За дешевизну памяти приходится платить.
Горелов понимающе кивнул. Для вывода графиков станочных резов и красных сообщений об ошибках двух цветов на блок хватало с лихвой. Он сделал аккуратную пометку в тетради: «ограничение наложения цветов в одной ячейке».
— Разумный компромисс, — сказал Горелов. — А рамка вокруг текста? Наш аварийный красный бордюр сидит отдельно?
— Это отдельная песня, — улыбнулся Птицын. — Бордюр не имеет адресов в видеопамяти. Под него выделен аппаратный порт. Процессор отправляет туда значение от нуля до семи, и контроллер заливает края кадра аппаратно, пока идет обратный ход луча.
— Независимое управление рамкой, — Горелов сделал короткую пометку в тетради. — Удобно. Если мы зашьем зеленый бордюр как маркер штатного ввода, а желтый — как ожидание данных по линии спецсвязи, оператор увидит состояние боковым зрением, не вчитываясь в текст.
Наташа Рогова, закончив проверку уровней на выходных каскадах макета, выпрямилась и отложила щупы. Она посмотрела на Олега, который затягивал последний винт на клемме заземления.
— Землю в одну точку свел, — доложил Олег, вытирая руки куском ветоши. — Питание развязал. Весь радиотракт отсечен к чертям, синхросмесь и цветовые каналы идут прямо на видеоусилители.
Наташа повернулась к Ветровой. Люба, прищурившись, еще раз окинула взглядом конструкцию, проверяя толщину проводов и надежность паек. Наконец она коротко кивнула.
— Замыканий нет. Можно подавать напряжение.
Разговоры за соседними столами стихли. Инженеры, отложив паяльники и чертежи, повернулись к стенду. В центре помещения возвышался выпуклый серый экран цветного кинескопа 61ЛК3Ц, зажатый в массивных тисках шасси УПИМЦТ.
— Птицын, тестовая программа готова? — спросила Наташа, вставая сбоку от экрана, чтобы контролировать геометрию луча под углом.
— ПЗУ на стартовом адресе. Цикл ждет питания, — отозвался Саша, положив руки на клавиши клавиатуры.
Люба шагнула к тяжелому автотрансформатору. Плавно, миллиметр за миллиметром, она начала поворачивать массивную черную ручку, повышая напряжение в сети.
Стрелка вольтметра поползла вверх. Сначала раздался низкий, утробный гул силового трансформатора. Затем тонко, на грани ультразвука, засвистела строчная развертка — пятнадцать с половиной килогерц прорезали воздух лаборатории.
На стекле кинескопа заплясали невидимые заряды. Раздался громкий, пугающий треск статического электричества. Волоски на руках инженеров встали дыбом от напряжения поля. В горле запершило от резкого, металлического запаха озона.
Экран моргнул. Из глубины колбы, разогревая нити накала, пробилось тусклое оранжевое свечение.
— Питание стабильно. Просадок по пяти вольтам нет, — констатировала Люба, не сводя глаз со стрелочных индикаторов.
— Пускаю тест атрибутов, — произнес Птицын и нажал широкую клавишу «Ввод».
Программа инициализировала счетчики и выплюнула в шину данных первый байт.
Кинескоп вспыхнул.
Стекло залило густым синим цветом, окаймленным желтой рамкой бордюра. Видеоконтроллер надежно держал геометрию: границы прямоугольника оставались ровными и не дрожали.
Непривычно яркие для лаборатории цвета подсветили лица собравшихся. Напряженное лицо Наташи и Птицына окрасились в синий фоновый оттенок кинескопа.
Олег шумно выдохнул, расплываясь в торжествующей улыбке.
— Есть синхронизация! — крикнул он, ударив ладонью по краю стола. — Держит кадр!
Птицын быстро пробежался пальцами по клавишам. Синий фон мгновенно, без задержек и мерцания, сменился на ядовито-зеленый, затем на глубокий красный, потом на розовый. Аппаратная логика смешивания сигналов работала безупречно.
— Отлично, сплошные заливки держит, — деловито произнесла Наташа. — Птицын, давай нагрузку. Запускай шахматку и мелкий текст. Посмотрим, как он отрабатывает резкие переходы.
Саша кивнул и ввел команду вызова подпрограммы вывода символов.
Улыбка Олега мгновенно погасла, он тревожно прищурился.
Картинка на экране болезненно дернулась. Вместо ровных полей стекло кинескопа покрылось плотной сеткой чередующихся контрастных блоков — розовых и зеленых, поверх которых плотным массивом выстроились белые символы аппаратного знакогенератора.
Цвета мгновенно поплыли. Границы квадратов «шахматки», которые на статике казались вычерченными по линейке, мелко задрожали. За каждой белой буквой потянулась грязная, смазанная цветовая тень.
Хуже того, развалилась геометрия бордюра. Левый край желтой аппаратной рамки перестал быть прямой линией. Он рвался, «дышал», пульсируя в такт с выводом символов. Цвет бордюра неприятно наплывал на крайние левые буквы активной зоны, затапливая их желтизной из-за рассинхронизации сигналов гашения.
Олег отреагировал инстинктивно. В нем проснулся старый радиолюбитель, привыкший лечить любые болезни телевизоров паяльником и отверткой. Он схватил со стола шлицевую отвертку с длинным диэлектрическим жалом и потянулся к платам УПИМЦТ, выискивая подстроечные резисторы на модуле цветности и блоке развертки.
— Сейчас я уровень черного вытяну и фазу сдвину аналогом, — забормотал он, примериваясь к шлицу крошечного потенциометра. — Кадровая чуть уплыла, это ерунда…
Его пальцы уже легли на пластиковую ручку отвертки, когда Наташа Рогова сделала резкий шаг вперед и жестко перехватила руку Олега.
— Положи инструмент, Тимофеев, — холодно приказала она.
Олег недоуменно моргнул, пытаясь высвободить руку.
— Наташ, да я только подкорректирую. У нас телевизор не справляется с крутыми фронтами сигнала. Надо сгладить на входе…
— Мы не в телемастерской, — отчеканила Наташа, отпуская руку Олега. Она неотрывно смотрела на мерцающий экран: — Телевизор работает идеально. Он рисует ровно то, что мы ему даем. Это наша цифра врет. Если мы сейчас начнем крутить подстроечники, мы привяжем этот конкретный макет к этому конкретному телевизору. Сменишь трубку — и все поплывет заново. Мы не кустари. Проблема в логике.
Она обернулась к столу с измерительной аппаратурой.
— Люба, включи осциллограф, пожалуйста. Встаем щупами на штырьки жгута. Будем смотреть математику.
Олег, тяжело дыша, положил отвертку на стол. Он сжал кулаки и молча встал рядом с Наташей, глядя на зеленый экран осциллографа.
Люба подключила первый щуп к выходу генератора тактовой частоты. Второй щуп лег на выход сдвигового регистра, отвечающего за смену атрибута цвета.
На экране осциллографа побежали две зеленые кривые: верхняя — строчный синхроимпульс, нижняя — сигнал цветовых атрибутов.
— Вот и проблема, — Наташа ткнула пальцем в люминофор, где вертикальные фронты импульсов заваливались в пологие горки. — Сигнал не успевает нарастать. Сдвиговый регистр выталкивает бит цвета, но паразитная емкость монтажа и резистивные делители тянут фронт вниз. Пока напряжение поднимается до уровня единицы, луч кинескопа уже успевает пробежать пару миллиметров по стеклу. Вот вам и размазанный хвост за буквой.
— А бордюр почему дышит? — нахмурился Олег, вглядываясь в хитросплетение зеленых линий.
Наташа перекинула щуп на выход порта бордюра. Кривая сместилась.
— Фаза, — коротко бросила она. — Сигнал открытия бордюра приходит с дешифратора на долю микросекунды раньше, чем заканчивается вывод видеоданных из регистра. Они сталкиваются. Бордюр залезает на текст.
Люба Ветрова молча села за стол, вооружившись логарифмической линейкой и справочником по сопротивлениям. Она пересчитывала номиналы нагрузочных резисторов, выискивая компромисс между скоростью нарастания сигнала и током потребления.
— Олег, — Люба протянула ему исписанный листок. — Выпаивай делители на выходах цвета. Ставим номиналы в два раза меньше. И кинь керамический шунтирующий конденсатор прямо на ноги питания регистра, он у нас по току проседает в момент переключения.
Олег глубоко вздохнул и положил лист с настройками. Включил паяльник, дождался, пока канифоль расплавится на жале, и приступил к перепайке.
— А с фазой бордюра что делать? — спросил Птицын, наблюдая за ювелирными движениями пинцета в руках Олега. — Программно я задержку не вставлю, это аппаратный конфликт.
— Защелкнем триггером, — ответила Наташа, быстро набрасывая на полях распечатки новую схему. — Тимофеев, ищи в кассе свободную ТМ2. Пустим сигнал бордюра через нее, а тактировать будем тем же сдвиговым импульсом с регистра. Выйдут строго одновременно, фаза выровняется.
Следующие сорок минут лаборатория наполнилась щелчками кусачек, шипением припоя и короткими, рублеными командами. Олег врезал микросхему триггера прямо поверх готового монтажа, припаяв ее выводы короткими жесткими перемычками — некрасиво, но электрически надежно. Люба заменила резисторы, жестко контролируя качество пайки.
— Готово. Остывает, — Олег подул на плату, сдувая крошки канифоли.
— Питание, — скомандовала Наташа.
Люба снова вывела напряжение на ЛАТРе. Кинескоп привычно треснул статикой.
Птицын, не дожидаясь команды, ударил по клавишам, заполняя видеопамять самой плотной тестовой таблицей.
Экран вспыхнул.
Шахматка стабилизировалась. Грубое дрожание ушло, хотя по краям старого кинескопа геометрия все еще слегка заваливалась. Белые буквы системного шрифта читались уверенно, цветовые тени превратились в едва заметные аппаратные ореолы.
Желтая рамка бордюра больше не «дышала» и не наползала на текст. Сигналы защелкнулись в едином ритме тактового генератора.
— Вытянули аппаратно, — тихо сказала Наташа, сразу делая новую пометку в блокноте. — Но при прогреве шасси параметры снова уплывут. Надо гонять часами и составлять ведомость.
Олег устало опустился на стул, вытирая блестящий от пота лоб рукавом.
— Работает железяка. Осталось доказать, что мы сможем повторить это на другом телевизоре.
К столу снова подошел Андрей Горелов. До этого он молча наблюдал за процессом отладки, не вмешиваясь в аппаратные споры.
— Картинка впечатляет, — Горелов достал из нагрудного кармана ручку и щелкнул кнопкой. — Но эстетика цвета для закрытого контура вторична. Александр, помните наш разговор об аппаратной страховке?
Птицын кивнул, напрягшись.
— Сымитируйте программный или аппаратный останов, — потребовал Горелов. — Представьте, что оператор ввел неверную команду, произошел сбой памяти, и процессор зациклился. Программа не выполняется. Я хочу видеть, что произойдет с экраном.
Обычно зависание процессора приводило к тому, что на экране застывала последняя картинка, вводя оператора в заблуждение. Но Горелов и Морозов заложили в архитектуру «Сферы-82В» жесткое требование: отказ должен быть виден мгновенно.
Птицын потянулся к макету. Он нашел вывод на процессоре К580, отвечающий за сигнал готовности, и пинцетом замкнул его на общий провод.
Процессор мгновенно перешел в состояние бесконечного ожидания. Выполнение программного кода полностью прекратилось. Шина адреса замерла.
Текстовое поле на экране кинескопа застыло. Видеоконтроллер продолжал циклично вычитывать один и тот же кадр из памяти, поэтому буквы и шахматка остались висеть в фосфорном свечении неизменными, создавая иллюзию нормально работающей машины.
Но программа больше не выполнялась. А значит, она перестала посылать периодические сигналы сброса на независимый аппаратный счетчик — тот самый сторожевой таймер, который Горелов требовал заложить в архитектуру еще в январе.
Спустя долю секунды счетчик таймера переполнился. Аппаратная логика видеоконтроллера мгновенно отреагировала на ошибку.
Желтая рамка погасла. Вместо нее вокруг застывшего зеленого текста тревожно замигал ярко-красный бордюр аварии.
Горелов несколько секунд наблюдал за ритмичным мерцанием, затем повернулся к Наташе.
— А если программист сам задаст красный цвет бордюра в рабочем режиме? Как оператор отличит норму от сбоя?
— По аппаратному мерцанию, — с готовностью пояснила Рогова, которой не терпелось показать изящество своей схемы. — Сторожевой таймер не просто меняет цвет. При переполнении он аппаратно отрубает программный порт от видеовыхода и подключает красный канал напрямую к делителю кадровой частоты. Рамка мигает с частотой в два герца. Процессор висит, программная среда мертва, а железо продолжает бить тревогу совершенно независимо от них.
Горелов убрал ручку и медленно выпрямился, разминая затекшую спину.
— Идеально. Ошибка однозначно читается и не поддается программной имитации, — произнес он спокойно и твердо. — Страховка от зависания работает. Это пойдет в акт приемки рабочего места. Принимается, товарищи.
Горелов кивнул и отошел к своему столу, аккуратно закрывая прошнурованную тетрадь.
Олег Тимофеев щелкнул тумблером, снимая питание с макета. Красный бордюр погас, экран схлопнулся в яркую белую точку, которая медленно растаяла в темноте стекла. Кинескоп остывал, издавая тихое потрескивание.