— А как проверить этот метод?
— Экспериментально, как же ещё?
— Давай лучше к шине CPU вернёмся!
Коллапс
Уже начав писать программу саморепликации для Орион-128 я понял, что здесь нужен реестр свободных CPU. Иначе никак не понять: есть ли в доступе свободные CPU и какой CPU выбрать для того, чтобы его запустить в работу.
Помимо такого реестра, ещё пришлось реализовать ассемблерную команду, выполняющую атомарный запуск CPU в работу.
Устранив эти недоработки, завершить программу саморепликации оказалось очень просто: программа плетения одного ядра, каждый раз, как доделает свою работу, заглядывала в список свободных CPU и запускала на них себя же.
Этот алгоритм продолжается, пока количество CPU не станет равно 2 в степени 128. Причём тот CPU что уже начал плестись, считается готовым, чтобы программа гарантировано могла остановиться.
Загрузив счётчик CPU начальным значением близким к 2 в 128 степени, мы сделали множество тестовых прогонов и сплели таким образом шестьдесят четыре стартовых ядра. Все произведённые тесты убедили нас, что всё работает и готово к запуску.
– “Помолясь усердно богу он отправился в дорогу” — процитировал я фразочку из детского стихотворения.
— Начинаем? — спросила Эт.
— Осталось два маленьких штриха.
— Какие?
— Подпустить огоньку и водичкой разбавить. Это же твоя идея.
— О, я и забыла!
— Я добавлю искорку, а ты льдинку?
— Ага!
Завершив все подготовительные работы, мы перезапустили Орион-128 и шестьдесят четыре ядра начали плести новые шестьдесят четыре ядра.
Итоговая сложность каждого CPU получилась довольно высокой: на плетение одного ядра тратится около двух часов процессорного времени. Из за того, что сложность некоторых шин по мере их построения растёт нелинейно, то плетение новых слоёв будет происходить всё медленнее и медленнее. В конечном итоге, каждое ядро, по расчётам, будет изготавливаться около пяти часов, а на изготовление всех 128 слоёв Орион-128 уйдёт около двадцати дней.
Запустив репликацию в работу, мы прождали два часа и убедились, что седьмой слой ядер доплёлся и их стало сто двадцать восемь.
Я забрал одно ядро на нужды индикации и запустил на нём программку, показывающую сколько CPU уже сделано в виде этакого прогресс-бара, путешествующего от единицы до 128.
— А чем мы займёмся теперь? — спросила Эт.
— Таблицей символов. Нужно перестать разрабатывать программы в кодах и хотя бы писать их на ассемблере. Для этого будем учить наш компьютер выводить цифры и буквы.
— А куда он их будет выводить?
— В плетение связи. С его помощью я уже умею рисовать линии перед глазами. Нам нужны шрифты со всеми демонскими буквами, цифрами, а ещё с моим родным русским алфавитом. Заодно и алфавит древних нужно поддержать.
— Алфавит древних?
— Ага, я зря что ли рисунки их символов коллекционирую и переписываю все найденные тексты?
В общем, база символов будет первой базой данных нашего компьютера. По номеру символа из неё можно будет извлечь список, описывающих его линий.
— И как это делать?
— Смотри. — я взял лист бумаги. — Делим лист на клеточки, затем рисуем на нём букву. А потом описываем её считая, что компьютер умеет рисовать только прямые линии. Например: начало в клетке 20,30, толщина 4, прямая до клетки 25,45. И так далее. Такое надо прорисовать для каждого символа и сложить в память компьютера.
— Каждый символ вот так рисовать? Это же очень муторно и долго!
— У нас примерно двадцать дней впереди. Косм нам тоже поможет, он же хотел участвовать. На самом деле, хоть работа и однообразная, но нам надо нарисовать всего около пары сотен символов. Вот увидишь: уже к послезавтра мы всё доделаем. И, кстати, здесь можно загрузить конструкты: ты рисуешь, а он описывает нарисованное.
Как я и предполагал, на следующий день, когда Орион-128 добрался до двадцатого слоя CPU, мы уже сделали большую часть работы. У меня были описания для всех цифр и значительной части букв, включая буквы древних.
В кодах символов я решил выделить часть бит, чтобы можно было использовать их как биты признаков: например если вдруг захочется поставить ударение, то взяв символ с кодом 10, установив в единицу бит ударения, можно будет получить ударную букву. Да, таким образом, можно ставить ударения и над согласными, но пока что не до жиру: будем решать эти проблемы на более высоком уровне.
Главное, из за чего я взялся за эти биты, необходимость различать цифры и буквы. Выделив целых восемь бит под признак цифры и ещё шестнадцать бит под признак языка я получил возможность кодировать цифры на разных языках. Можно написать цифру 2, поставив ей во флагах признак “десятичная система” и язык “арабский”. Та же цифра 2, записанная в демонском написании будет иметь тот же код символа, но другие флаги. А изображение символа можно рисовать для любого сочетания флагов.