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