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

Собственно, уже такие схемы обеспечивали рабочие частоты до мегагерца - а это снова семидесятые годы. Ну, если только нагрузка на выход конкретных схем была не многовата - иначе приходилось снижать рабочие частоты, чтобы все емкости успели зарядиться за такт, или ставить несколько двойных элементов НЕ, чтобы выход микросхемы работал на меньшее число входов, а уж эти вспомогательные элементы доносили бы сигнал на меньшее число своих входов - например, если какой-то выход идет на шестнадцать входов следующих каскадов, ставим, например, четыре пары НЕ - и вот этот прежде нагруженный выход начинает работать уже только на четыре входа - емкости существенно уменьшаются - четыре вместо шестнадцати. А уж каждые из этих четырех элементов работают на свои четыре входа. Но такое разнесение нагрузки вносит дополнительные задержки. И это мы еще пошли на микросхемотехническую хитрость - ввели в микросхемы выходные транзисторы с длинным каналом - при ширине 50-100 микрометров его длина достигала пяти миллиметров - чтобы он мог выдавать достаточно тока для зарядки емкостей, образованных выходными ножками самой микросхемы, проводниками к соседним микросхемам и входными ножками потребителей сигнала. Попытки устанавливать несколько кристаллов на одной подложке, чтобы уменьшить длину и емкость межсоединений, я пока пресек - мы только-только отладили автоматизированную пайку проволочных переходников между кристаллом и ножками микросхемы, и заново все это отлаживать не хотелось - ведь потребуется несколько типоразмеров таких составных микросхем, а была надежда, что кристалльщики смогут выдавать слитки со все меньшим количеством дефектов и те же схемы удастся уместить на одном кристалле. Овчинка выделки не стоила.

Но и с такими широкими каналами и подобранными опытным путем параметрами легирования схемы работали. Я так вообще видел в интернете ролики, где народ дома в подвале делал вполне рабочие транзисторы - отламывали кусок от кремниевой пластины (вот она была покупная), наклеивали поперек полоску скотча шириной примерно полсантиметра - делали "маску" для затвора, опускали в плавиковую кислоту, чтобы получить на открытых поверхностях фторид кремния, затем грели в печи - проводили диффузию фтора, то есть легировали кремний в глубину - и транзистор работал ! Собственно, почти так же - на коленке - появился в моей истории и первый биполярный транзистор в конце сороковых - там он вообще состоял из кристалла германия и двух металлических иголок - американцы ведь исследовали работу диода, пытаясь найти на поверхности кристалла наилучшие точки, где будет лучше всего идти полупроводниковый эффект, ну и естественным образом подумали, что два контакта могут быть лучше чем один - вот и додвигались до того, что контакты стали настолько близкими, что между ними потек ток.

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

А по биполярным у нас работал сам Олег Лосев (в РИ умер в блокадном Ленинграде в начале 1942го), который еще в двадцатых исследовал полупроводники, а перед войной приступил и к трехэлектродным схемам - глядишь, если бы он не умер в моей истории, лавры открывателя транзистора стали бы его - а потом злые языки еще говорят, что Россия и СССР не могли придумывать разные вещи, все тянули с запада - так лезли всякие уроды - либо с войной, либо просто проходимцы на теплые места - поправить свои дела. Сейчас мы вытянули Лосева к себе, а уж он подсказал, кто бы еще мог помочь по этим работам - отдали нам далеко не всех, но полтора десятка опытных советских ученых у нас по полупроводникам работали. Заодно мы уже начали выпуск светодиодов - Лосев и их исследовал, получал свечение на контактах металла с полупроводниками, только не знал как эта штука называется. А я - знал - и как они называются, и для чего их можно применять - замена в электронной технике лампочек накаливания для индикации и подсветки экономила немало энергии и трудоемкости изготовления.

На повышенную секретность новых элементов мы забили - наши агенты в Германии сообщали, что к фрицам попали некоторые образцы наших микросхем, так они попытались искать в них резисторы и конденсаторы, даже что-то нашли, но распределение легирования не проверяли - так у них это и прошло под пометкой "русские пытаются задешево въехать в рай". Думаю, еще лет пять такое продлится - "ну не могут русские что-то придумать, а если и придумают, то сделать". Мы вообще-то и не рассчитывали на глупость врага - не догадались сейчас, догадаются позднее, так что утечку любых секретов мы считали лишь вопросом времени, а результат данного инцидента был всего-лишь приятным бонусом. И так на попытках выкрасть микросхемы попалось несколько шпионов - не только немецких, но и английских, польских, румынских, американских - советские к этому времени уже поугомонились, так как мы объяснили руководству суть наших работ и причины нашего нежелания раньше времени раскрывать их широкому кругу людей - Сталин и сам понимал, что в их структурах есть шпионы, причем не только в плане "надо хоть в чем-то обвинить, чтобы публично не раскрывать истинные причины ареста", но и настоящие. Но из-за этого нам постоянно пеняли на недостаток секретности у нас - слишком много народа знало и пользовалось цифровыми схемами - "Ви жэ нэ думаете, что шпионы есть только у нас ?". Нет, мы так не думали, но и вводить повышенную секретность - значит застопорить работы. А я рассчитывал сейчас получить приличную фору в несколько лет - все-равно, пока на западе поймут что тут делается, пока сообразят полезность новой техники, пока запустят исследования, потом - производства, да еще сколько будут примеряться, проектировать, да пока все расползется в массы - мы шагнем далеко вперед, и при этом нам не придется тыкаться впотемках - мы будем делать "сразу правильно" - ведь главным консультантом буду я, который уже видел, что работает, а что нет, и что вообще может быть - тоже важный момент. Ну, насчет "сразу" - тут уж как получится, как позволят ресурсы.

Так что изготовить хоть какие-то транзисторы - это было не проблемой, проблемой было понять, что они вообще существуют и очень полезны - а такое понимание в это время было, пожалуй, только у меня. Для нас проблемой было улучшение характеристик и техпроцессов - после первых грандиозных успехов пошла долгая и кропотливая работа. Тут и борьба с металлизацией, и биполярные транзисторы, которые у нас пока получались хорошо если один из десятка. Надо было и дальше уменьшать размеры радиостанций - если полупроводниковые диоды применялись уже более года, то в качестве активных элементов у нас пока были лампы - их-то и надо было заменить биполярными транзисторами. Или полевыми - но они у нас стабильно работали только в режиме ключа, а в режимах усиления - раз на раз не приходится, хотя уже отлаживались схемы, где они используются в тракте УНЧ - усиливать радио- или промежуточные частоты они пока не могли, но и это было немалым подспорьем - по сравнению с конструкциями других радиостанций экономия составляла до трех вакуумных приборов, а с учетом больших объемов выпуска - уже десятки, а то и сотни тысяч ламп в год. Да и в ракетах уже испытывались полупроводники - снова и экономия производственных ресурсов, и облегчение конструкции ракет. Советские ученые - прежде всего "наши", но с привлечением и ученых большой земли - как раз и занимались больше разработкой теории полупроводников.

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

Вот под эти работы я и выделил еще одну ЭВМ, уже для лаборатории высоких давлений. По моим расчетам, ее должно было хватить на обслуживание пары десятков устройств - если на них выполнялись однотипные эксперименты, то программа - одна на всех, а параметров-то и надо десяток-другой - так что должно было хватить 256 байт, что были на ней установлены - еще на дискретных конденсаторах. Потом подумали и добавили еще один такой блок. Работа закипела, разве что я в самом начале подкорректировал связку с устройствами, а то экспериментаторы начали было вести к каждому устройству и датчику отдельные пучки проводов. Они и сами уже начинали понимать что "что-то тут не то", так что моя идея шины легла на благодатную почву. Ну а потом я еще раз их подправил, когда предложил использовать не параллельную, а последовательную шину, и не на потенциальных сигналах, а на токовой петле - по своему времени я помнил, что на такие сигналы в моем времени переводилось все что только можно - тут и помехоустойчивость, и скорость работы. Так что к началу мая на компьютере крутился бесконечный цикл, который опрашивал устройства, точнее - регистры их датчиков, отсылал нужные значения в регистры и на исполнительные устройства, и переходил на ту ветку команд, которая требовалась для конкретного устройства в зависимости от его текущего состояния и значений датчиков - тут главное было следить, чтобы время выполнения веток не мешало вовремя опрашивать последующие устройства, чтобы опрос до них добирался не позднее некоторой величины - эдакая реал-тайм псевдо-операционка, построенная на большом цикле.

Причем то, что этот компьютер был собран на рассыпухе, давало и свои плюсы. Так, исследователи добавили блок аппаратного умножения-деления - до этого эти операции выполнялись подпрограммами, а сам процессор был настолько "старым", что даже не имел проверки опкодов, поэтому любые подпрограммы, что исследователи брали из уже напрограммированных библиотек, требовалось проверять на наличие операций умножения и деления и заменять их на вызовы подпрограмм. В новых-то процессорах, даже если какая-то операция не была реализована аппаратно, выдавалось прерывание, так что компьютер мог сэмулировать ее программным путем - собственно, подобным образом мы в дальнейшем и обеспечивали совместимость сверху-вниз - с выпуском новых команд в новых процессорах для старых процессоров писались подпрограммы эмуляции этих команд. Да, работало медленнее, но работало. Хотя такое требовалось и нечасто - как правило библиотеки и программы компилировались под конкретные процессоры и программная эмуляция выстреливала только в случаях, когда что-то упустят при конфигурировании библиотек конкретной машины.

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

Но в любом случае переход на вычислители означает, что из цикла расчета по каждому элементу делают цикл расчета по группе элементов - в данном случае - по двум группам. Причем если количество элементов в массиве не кратно размеру векторных регистров вычислителя, то добавляют обработку и такой ситуации - либо неполным заполнением регистров, когда в них отправляется меньше элементов, либо дополнением массива данных до размера, кратного размеру векторов. А если вычислителей будет, скажем, три, то этот же цикл будет переписан - он будет разбивать массивы на тройные куски и отправлять их в те три вычислителя, которые имеются в наличии - снова перепрограммирование циклов. Присутствует некоторая морока, но зато оборудование используется наиболее полно и "прямо сейчас", а не "когда все будет идеально".

В дальнейшем у нас так и шло - при появлении новых видов оборудования программирование под него сначала шло в таком ручном режиме, но постепенно выявляли закономерности, которые и перекладывались в код, все больше автоматизирующий перепрограммирование одних и тех же программ. А через некоторое время появились вычислители, способные брать данные сразу из памяти и туда же их возвращать - и снова было перепрограммирование - теперь основной код задавал в регистрах только начальные адреса векторов - с данными и с маской условий, количество элементов, а также адрес, куда надо помещать результат - и вычислитель сам все забирал, вычислял, помещал в память и выдавал прерывание "все готово". Причем адреса надо было указывать физические, а не виртуальные - первые вычислители не работали с виртуальной памятью, соответственно, и операционке надо было следить, чтобы ненароком не отсвопить эти блоки из памяти на жесткий диск - а это снова дополнительное программирование - на этот раз - закрепление участков памяти. Но это было делом будущего.

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

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

То есть по сути для выполнения одной команды требовалось выполнить две - ну, за исключением команд перехода - там счетчик команд складывался со смещением и результат помещался в счетчик команд. Работа шла почти в два раза медленнее. Вот это узкое место и расшили добавлением отдельного сумматора - теперь выполнение операций в АЛУ и вычисление адреса следующей команды шло параллельно - обработка команд АЛУ и загрузка-выгрузка регистров ускорились в два раза, а выполнение программ - минимум в полтора - все-таки некоторое количество команд было переходами. Загрузка-выгрузка также ускорились потому что теперь для инкремента счетчика команд не требовалась шина РОН-АЛУ, тогда как ранее сначала по ней шли данные в или из регистров, и только затем - вычисление адреса следующей команды. Причем этот сумматор использовался из той же схемы, что и новый блок умножения-деления - его и делали-то на сдвиговом регистре и на том самом сумматоре - если в очередном разряде множителя стоит единица - множимое и сдвинутый множитель суммируются, а если ноль - множитель просто сдвигается - мы такие схемки, помнится, рисовали в институте на третьем курсе. Работало почти так же, как и в программной реализации умножения, выигрыш был в отсутствии затрат времени на дешифрацию команд сдвига, проверки бита на ноль, суммирования с переполнением, проверки на ноль всего множителя и перехода в начало цикла, если он не ноль - все это делалось теперь аппаратно и скорость умножения многократно возросла даже при отсутствии матричного умножения. Да и деление стало работать тоже быстрее. Вот на этом сумматоре и сделали программный счетчик - при этом если выполнялась операция умножения или деления, то выигрыша от такого переноса не было, но сами эти операции были медленными, так что не страшно. А вот для остальных операций вычисление адреса и выполнялось параллельно с самой операцией.

И резервы для ускорения работы были - так, даже после введения программного счетчика операции обычно занимали четыре такта из-за общей шины регистров - сначала по ней передавался первый операнд, с следующем такте - второй, в третьем (и порой четвертом, пятом - если суммирование было без схемы быстрого переноса) шло выполнение самой операции, в четвертом (или еще большем) результат передавался по шине в один из регистров. В новых-то процессорах поступление данных из РОН на АЛУ выполнялось одновременно, так как было две шины и два набора дешифраторов адреса регистра, ну а запись обратно в регистры - на следующем такте по одной из шин - мы по мере поступления все большего количества микросхем понемногу расшивали такие узкие места. Причем эти места проистекали и из структуры команд. Так, мы применяли команды с двумя регистрами - результат всегда помещался в первый регистр-источник, то есть перезаписывал один из операндов. Если бы мы применили трехоперандную схему - с отдельным указанием регистра, в который помещать результат, то в принципе можно было бы сделать отдельную шину для записи результата. Но это, во-первых, заставило бы перейти на более длинные команды (а это потребует больше памяти) или уменьшить количество регистров (а это уменьшит возможности по оптимизации программ), а во-вторых, в дальнейшем все это можно будет развести по промежуточным регистрам, что все-равно потребуется делать с прицелом на конвейеризацию. Разрулим. В крайнем случае - сделаем как Интел - внешние команды перетранслируются во внутренние, а уж их можно делать какими угодно.

И, замечу, все эти улучшения были бы невозможны, возведи мы предельный уровень секретности по вычислительной технике. Нет, и сейчас все было строго - микросхемы получали только работники с нужным допуском, безопасники записывали типы и номера микросхем в журнал выдачи/возврата, а после установки в аппаратуру - в журнал установки микросхем. Сами шкафы с микросхемами опечатывались, а если работы шли на "открытом теле", как в данном случае - выполнялась ежедневная сверка микросхем с журналом, да и корпуса периодически инспектировались. Но "главными" в этом процессе были работники, а не безопасники - последние занимались только регистрацией и проверками, но не решали - кому что можно, а кому - нельзя - это решал только допуск, который также был поделен на несколько уровней - в зависимости от степени интеграции и вида микросхем - но тут мы наверное несколько перемудрили - пока ввели это на всякий случай и возможно позднее отменим. Или нет - посмотрим. У безопасников была мысль ввести безопасные комнаты, в которые работники могли входить только после переодевания, а выходить - только после сдачи одежды и внешнего осмотра. Но тут уже я воспротивился - выломать чип и сунуть под язык не так уж и сложно, а ковыряться пальцами во рту - тоже не поможет - в крайнем случае можно и проглотить. Так что такие строгости только обозлят работников, но ни от чего не уберегут.

В общем, подобными дополнениями скорость работы управляющей ЭВМ повысилась. Но были и другие доработки. Например - сетевая шина. Вначале, когда только примеривались к цифровому управлению лабораторным оборудованием, все исследовали и отлаживали на одной установке, и времени на опрос и установку регистров устройства хватало. Когда же начали работы с несколькими установками, стали возникать проблемы - если опрашивать еще как-то получалось, то на расчеты - сравнения, подгрузку данных с перфоленты - времени уже стало не хватать. Тогда разработали отдельную схему опроса устройств - процессор заносил в его регистры номер устройства, количество регистров и адрес в памяти, по которому размещались данные, и уже это устройство отправляло их последовательно в лабораторную установку. Почти сразу добавили начальный регистр, а то оказалось, что далеко не всегда требовалось заносить значения во все регистры лабораторной установки. Потом добавили битовую маску, чтобы можно было пропускать какие-то регистры - скажем, занести значения только в первый, третий и четвертый регистры. Потом добавили флаг окончания обработки пакетной передачи, а то высчитывать по тактам время передачи оказалось не очень удобным. То же самое - и в обратном направлении.

Так что шина связи с установками развивалась - собственно, это была почти что сеть, только с мастер-хостом, который и управлял всей деятельностью сети - лабораторные установки могли выдать данные в сеть только после получения от хоста своего номера и команды "выдать данные". И это был не предел улучшений. Так, в августе начали мудрить с прерываниями от таймера, а то высчитывать время по количеству исполненных команд - это сложновато, приходилось и вставлять пустые циклы (а при этом надо учесть и количество тактов на выполнение команд для расчета длительности самого цикла !), и прерывать расчетные циклы (а при этом часть времени цикла приходилось тратить на проверку - а не пора ли его прервать, чтобы успеть опросить очередное устройство !). Так что с таймером была надежда, что как минимум от этих расчетов удастся избавиться - занес в регистры таймера адрес для перехода, количество тиков, запустил таймер - и спокойно считай что там надо или выводи на печать, а когда таймер дотикает - он сохранит текущий адрес операций и поместит в регистр команд сохраненный в таймере адрес - и начнется обработка прерывания по таймеру - тут еще требовался флаг с признаком, что находимся в обработчике прерывания, чтобы при возврате из него восстановить предыдущую последовательность - а это снова команды восстановления регистров и передачи управления. Да и с вложенными таймерами надо было что-то делать - но тут я полет мысли уже остановил - получалась сложная схема управления прерываниями, а над ней работал отдельный коллектив. Так что пока просто ограничим количество одновременно поддерживаемых установок - и все, для того, чтобы попробовать новые технологии этого вполне хватит. И так уже память нарастили до двух килобайт, заменив блоки памяти на дискретных конденсаторах блоками памяти уже на микросхемах по 64 бита каждая. И по расчетам, если ограничиться только операциями считывания с перфоленты, отправки данных в установки, считывания оттуда показателей, сравнение и отправку других показателей при необходимости, а также вывод на перфоленту или на цифровое печатающее устройство, то даже эта ЭВМ могла поддерживать более тридцати установок, пусть и без расчета графиков изменения значений - этим пока могут заниматься и аналоговые вычислители самих установок. Ну а если с расчетом графиков - то штук пять, не более. Но вот если поставить ЭВМ хотя бы следующего поколения, то она сможет рассчитывать графики уже для двадцати лабораторных установок. И, наверное, уже зимой исследователи получат новую машину.