Агент: Ошибка 1999
Шрифт:
Эта мысль пришла коротко и зло. Виза. Если он сходит с ума, точно не дадут.
Четвёртая версия: всё это реально. Антон не стал о ней думать.
В его голове что-то живёт и читает вместе с ним. А у него файл, Михалыч и два с половиной часа до восьми.
Антон потёр глаза. Текст не сдвинулся.
Он открыл рот сказать «ладно». Ничего не вышло. Горло сжалось — перехватило. Он откашлялся.
— Ладно, — сказал он. Голос прозвучал чужим в пустом подвале.
Он встал. Прямоугольник качнулся вместе с ним, как прицельная сетка. Антон помотал головой. Текст размылся на мгновение и вернулся.
Ладно. Допустим. Галлюцинация не мешает работать. Руки есть. Часы на стене. Начало шестого. Два с половиной часа. Скачать не успел. Модем мёртв. Но файл на диске. Досовская утилита для побайтовой правки — есть. Значит, можно попробовать.
Антон переключился в режим, который знал хорошо: когда всё плохо, работай. Не думай — работай. Починить, что сломалось. Восстановить, что побилось. Руки знают. Голова подождёт.
Нажал кнопку питания правого монитора. Ничего. Ещё раз. Индикатор мёртвый. Пощупал корпус — горячий, но не критично. Кабель — сидит. Перевоткнул. Ничего. Антон подул на разъём — рефлекс, бесполезный, но руки делали сами, как дуют на картридж от Денди: знаешь, что не поможет, и всё равно дуешь. Ничего.
Модем — мёртв. Скачивание оборвалось на двенадцати процентах, на диске остался огрызок. Как та вёрстка.
Ладно. Ладно.
Антон перешёл ко второму системнику — тому, где шли Герои. Нажал кнопку перезагрузки. Писки: длинный, короткий — видео ОК, память ОК. Монитор ожил — синий экран, белые буквы, знакомый шрифт. Нормальный экран. Настоящий. Не в голове.
Перетащил кабель от мёртвого монитора к рабочему системнику — тому, на котором лежал файл с вёрсткой. Разъём тугой, винты закисли, Антон крутил пальцами, обламывая ноготь. Подключил. Включил. Обычная магия: машина работает, несмотря ни на что.
На экране появилась командная строка.
Антон открыл каталог печати.
Файл на месте. Двенадцать мегабайт. Побитый — но целый по размеру.
Синий прямоугольник никуда не делся. Висел в правом верхнем углу зрения — полупрозрачный, но читаемый. Антон попытался не замечать. Не вышло.
Антон открыл побитый файл в служебной утилите для работы с байтами. Шестнадцатеричный дамп потёк по экрану: слева — адреса, посередине — байты, справа — точки и буквы. Файл начинался как положено, заголовок был цел.
Повреждение глубже. Где-то в двенадцати миллионах байтов прятался битый кусок, и Антон должен был его найти. Вручную. Отладчиком.
Он прикинул: один экран дампа — полкилобайта. Двенадцать миллионов делить на пятьсот двенадцать — тысяч двадцать пять экранов. При одной секунде на экран — часов шесть с лишним. Антон пересчитал, потому что и это число не хотело укладываться в голову. Шесть с лишним часов.
У него оставалось два с половиной часа.
Синий прямоугольник мигнул. Текст сменился.
А?ОМАЛИЯ ПЕРИФЕРИЙ?ОГО УСТРОЙСТВА
ВИЗУАЛЬ?ЫЙ ВЫХОД ПЕРЕ?АПРАВЛЕ?
ИСПОЛЬЗУЕТСЯ В?УТРЕ??ИЙ ДИСПЛЕЙ
Антон прочитал. Потом ещё раз. «Внутренний дисплей». Приехали.
Мигнул снова. Новый текст.
ПРОКРУТИТЬ ФАЙЛ К СЕРЕДИ?Е
СМЕЩЕ?ИЕ: ПРИМЕР?О 50% ОТ РАЗМЕРА
Антон не понял. Вернее — понял, но не поверил. Галлюцинация давала команды.
Он перескочил примерно на середину файла. На шестом мегабайте шёл нормальный код, читаемые строки, операторы верстки. Прямоугольник мигнул:
ДАЛЬШЕ
Антон зажал клавишу перелистывания и пошёл по файлу дальше. Седьмой мегабайт. Восьмой. Девятый. Палец уже начал неметь. Десятый. Строки мелькали, Антон не успевал читать — просто шёл, ждал, что мусор сам бросится в глаза.
Прямоугольник мигнул. Резко, как затвор.
СТОП
ОТКАТИТЬ: СМЕЩЕ?ИЕ 0x009A1200
Антон остановился. Откатил на указанное смещение. И увидел:
Он пролистал мимо. Не заметил. А оно — заметило.
ПОВРЕЖДЕ?ИЕ ОБ?АРУЖЕ?О
РАЗМЕР: ?ЕСКОЛЬКО СЕКТОРОВ
ПРИЧИ?А: СБОЙ ЗАПИСИ ?А ДИСК
РЕКОМЕ?ДАЦИЯ: ЗАМЕ?ИТЬ ИЗ РЕЗЕРВ?ОЙ КОПИИ
Антон перестал дышать.
Оно читало быстрее, чем он. Антон пролистал нули, не остановившись. Оно — остановилось. Засекло. Дало команду.
Такое Антон видел на чужих винтах: до нулей всё читается нормально, дальше несёт чушь. Шестнадцать страниц до нулей — чистые. После — мусор.
Антон открыл резервный файл. Нужно было найти то же самое место — но смещение будет другим: в свежей версии текст правили, файл чуть длиннее, всё сдвинулось. Антон запомнил строчки кода прямо перед нулями — последние читаемые команды, что-то про шрифт, обрывок числа. Поискал те же строчки в резервной копии. Нашёл. Чуть раньше, на несколько сотен байт. Нормальные данные — читаемый, живой код там, где в свежем файле зияли нули.
Вчерашний номер, та же вёрстка. Только телефоны в рекламе и слоган на первой полосе — старые.
Антон посмотрел на утилиту на мониторе. Курсор моргал — настоящий, зелёный. Потом — на синий прямоугольник в голове. Другой курсор. Невозможный. Два интерфейса — один на экране, другой внутри.
Он мог бы не делать ничего. Встать, уйти, захлопнуть дверь. Но два часа до срока, и Михалыч, и серьёзные люди, и двенадцать мегабайт, которые без подсказки он ковырял бы трое суток.
Антон сидел перед монитором. Лампа гудела. Принтер на стеллаже за спиной мигал оранжевым. Во рту пересохло.
Данные на входе — правильные. На выходе — то, что надо. Формула работала. Только подсказка пришла из синего прямоугольника в голове.
Антон вырезал побитый участок и вставил на его место блок из резервной копии. Несколько команд. Пальцы стучали по клавишам быстрее, чем обычно. Руки дрожали — мелко, на грани заметного. Адреналин, которому некуда деться.
Запустил экранный просмотрщик — старый, корявый, зато показывал файл для печати насквозь, без долгой подготовки. Полоска загрузки поползла: десять процентов. Шрифты грузились — один за другим, все на месте. Нормальные шрифты, не кракозябры. Двадцать процентов. Растры раскладывались. Серые прямоугольники начали проявляться — контуры, полутона, детали. Лица. Тридцать процентов.