Скажите честно, сколько раз вы нажимали кнопку Turbo на бежевом системнике, чтобы игра загрузилась побыстрее? Мне в какой-то момент покоя не давал простой вопрос, что именно эта кнопка делала с железом. Чем глубже я закапывалась в даташиты, схемы и мануалы к материнкам того времени, тем сильнее крепло ощущение, что целое поколение пользователей купилось на самую наглую подмену понятий в истории персональных компьютеров. Кнопка с надписью Turbo умела делать ровно одну вещь, и этой вещью было замедление компьютера. Название, светодиод и гордая цифра 66 на передней панели нарисовали поверх этой функции с единственной целью: чтобы вы захотели корпус именно с такой кнопкой. Давайте разбираться по порядку.

Откуда взялись 4,77 МГц

Вся история растет из одного кварца на материнской плате IBM PC 5150 1981 года. IBM поставила туда Intel 8088 и тактировала его частотой 4,77 МГц. Откуда взялась такая странная цифра, проще всего показать арифметикой. На плате стоит единственный кварц на 14,31818 МГц, что ровно в четыре раза больше частоты цветовой поднесущей NTSC (3,579545 × 4 = 14,31818, сходится). Эта частота нужна видеоадаптеру CGA, чтобы выводить цветную картинку на обычный телевизор. Генератор 8284A делит ее на три и отдает процессору 14,31818 / 3 = 4,77 МГц, а таймер 8253 получает от нее же 14,31818 / 12 = 1,19 МГц. Один кристалл на всю машину выходит дешево и сердито, и до паспортных для тогдашнего 8088 пяти мегагерц почти дотянули, так что ругать за это инженеров IBM у меня язык не поворачивается.

Нюанс в том, что в 1981 году IBM PC существовал в единственном варианте с единственной скоростью. Программист, который писал под него игру, знал железо пользователя с точностью до такта. Самым простым способом отмерить паузу между кадрами было заставить камень покрутиться в пустом цикле, подобрав число итераций на глаз. Таймер при этом никуда не девался и тикал 18,2 раза в секунду (65536 / 1 193 182 ≈ 0,055 с на тик), но 55 мс для анимации слишком грубо. Перепрограммировать таймер на более частые прерывания надо было уметь, и многие просто не заморачивались. Выглядело это примерно так (код условный, но похожих циклов в софте начала 80-х было полно):

; пауза между кадрами, подобрано на IBM PC 4,77 МГц
wait_frame:
    mov  cx, 3000        ; магическое число, найдено методом тыка
.spin:
    loop .spin           ; крутимся и ничего не делаем
    ret                  ; на 8 МГц кадр пролетит почти вдвое быстрее

Этот код прекрасно работает ровно до того дня, когда его запустят на процессоре побыстрее, и первые ряды, я вижу, уже догадываются, что было дальше.

Атака клонов

В середине 80-х за дело взялись производители клонов, в первую очередь тайваньские, и они быстро сообразили, что 8088 вполне способен работать быстрее. Intel выпускала версию 8088-2 с паспортными 8 МГц. NEC продавала свой V20, который вставлялся в ту же панельку, держал 8 и 10 МГц и вдобавок выполнял часть инструкций быстрее интеловского оригинала на той же частоте. Так появились платы, которые в народе называли Turbo XT: архитектура та же, набор микросхем тот же, а процессор бодрее почти вдвое.

И тут клоны уперлись в совместимость, которая в те годы была настоящим культом. Клон проверяли тем, запускаются ли на нем Microsoft Flight Simulator и Lotus 1-2-3, и машину, на которой привычный софт вел себя странно, покупать не спешили. Игры с пустыми циклами на 8 МГц формально работали, просто пришельцы в них начинали носиться с такой скоростью, что играть становилось физически невозможно. Нужен был способ вернуть машине исходные 4,77 МГц, и способ нашелся простой, надежный и слегка колхозный: на плату ставили второй источник тактовой частоты или переключаемый делитель, а переключатель выводили на переднюю панель корпуса.

Добравшись до этого места, я держалась за гипотезу, которая могла бы спасти честь маркетологов. Может быть, турборежим все-таки что-то разгонял, выводил процессор за паспортные значения, и название тогда хотя бы отчасти оправдано? Гипотеза развалилась при первом же взгляде в документацию на 8088-2 и V20. В турборежиме процессор работал ровно на той частоте, на которую он рассчитан по паспорту, так что никакого разгона там не было и в помине. Штатная скорость камня называлась «турбо», а при отжатой кнопке его придушивали почти вдвое, до уровня машины 1981 года.

Как назвать кнопку, чтобы ее купили

Вот тут интереснее, потому что скорость, на которую плату проектировали и под которую подбирали детали, получила гордое имя «турбо». Режим, ради которого вообще городили переключатель, никакого имени не получил, ему досталась только погасшая лампочка. Инженер подписал бы такую кнопку Slow, Compat или на худой конец 4.77, но на ней написано Slow Turbo, и возникает резонный вопрос, почему. Обычная скорость платы вдруг стала особенной, а медленная тогда какая, нормальная? И кто решил, что человек, заплативший за 10 МГц, должен чувствовать себя обладателем секретного форсажа, включая то, за что он и так уже отдал деньги?

Ответ, по-моему, лежит на поверхности: кнопку называл человек, который продавал компьютеры, а в середине 80-х слово Turbo работало как заклинание. Porsche с середины 70-х продавал 911 Turbo, Saab строил на турбинах всю свою репутацию. Borland в 1983 году выпустила Turbo Pascal и следом наштамповала Turbo C, Turbo Basic и Turbo Assembler, а к нам эта мода докатилась чуть позже в виде жвачки Turbo с машинками на вкладышах. Надпись Turbo на корпусе продавала компьютер лучше любых мегагерц, и надпись Slow в такой обстановке выглядела бы коммерческим самоубийством.

Семь сегментов вранья

Если бы все ограничилось переименованием, это еще можно было бы списать на безобидную маркетинговую вольность, но к кнопке очень быстро приделали индикатор. На передней панели множества корпусов стоял двух- или трехразрядный семисегментный дисплей, который показывал частоту процессора: нажимаешь Turbo, и цифра прыгает, скажем, с 8 на 16 или с 33 на 66. Представьте, да, как покупатель в магазине видит загорающиеся на корпусе 66, и у него нет ни малейших сомнений, что эта штука честно меряет мегагерцы.

Частотомер Индикатор при этом НИЧЕГО не измерял, и выясняется это за пять минут, если снять переднюю панель и посмотреть на его плату. Там обнаруживается питание от разъема блока питания, пара проводов к кнопке Turbo или к разъему светодиода на материнке и поле перемычек. Перемычки стоят по одной на каждый сегмент каждой цифры, отдельно для турбо- и не-турбо-режима. Сборщик брал инструкцию, находил в табличке нужную цифру и выставлял сегменты руками. Связи с тактовым генератором там нет никакой, счетчика тоже, короче, вся информация, которой располагает эта плата, сводится к одному биту: нажата кнопка или нет.

А раз сегменты выставляются руками, выставить можно что угодно. Ленивый сборщик оставлял то, что стояло с завода, и на 386-м вполне могло гордо светиться 66. Кто-то ставил 99, потому что красиво, а кто-то выводил HI и LO, и это, если подумать, был самый честный вариант из возможных. Подозреваю, что где-то в природе существовали и корпуса, в которых без турбо горела цифра больше, чем с турбо, просто потому что сборщик перепутал строки в таблице. Подтверждения у меня нет, так что пусть это останется гипотезой.

Со светодиодом Turbo творилась похожая история, потому что логика разъема TURBO SW на разных платах отличалась: в одних замкнутый контакт означал турбо, в других наоборот. В корпусах светодиод к тому же нередко питался прямо через контакты самой кнопки, поэтому при неудачном сочетании лампочка честно горела в медленном режиме и гасла в быстром. Добавьте к этому кнопку с фиксацией на корпусе, который стоит под столом, где ее легко задеть коленом или сумкой, и вы получите машины, которые месяцами работали вполовину своей скорости, пока хозяин ругал Windows 3.1. Готова спорить, что для мастерских того времени проверка кнопки Turbo была примерно тем же, чем сейчас вопрос «а вы пробовали выключить и включить».

Форсаж наоборот

На XT-клонах кнопка хотя бы честно выполняла свою работу: процессор возвращался к исходным 4,77 МГц, и старые игры начинали вести себя так, как задумывали их авторы. Но кнопку по инерции перенесли на 286-е, 386-е и 486-е машины, и там ее смысл начал стремительно испаряться.

На 286-х платах медленный режим обычно сбрасывал частоту до уровня IBM PC/AT, то есть до 6 или 8 МГц, что программам, написанным под 4,77 МГц, уже никак не помогало. Ну а на 386-х и 486-х стало совсем весело, потому что каждый производитель чипсета тормозил процессор так, как ему было удобнее. Где-то понижали частоту, где-то отключали кэш или вставляли такты ожидания при обращении к памяти, а некоторые чипсеты периодически отбирали у процессора шину. Насколько при этом падала скорость, никто не нормировал. Если полистать отсканированные мануалы к материнкам того времени (их на удивление много), внятного ответа на вопрос, какой машине должен соответствовать компьютер при отжатой кнопке, там не найти, по той простой причине, что никакой конкретной машине он не соответствовал.

Если свести все в одну табличку (цифры ориентировочные, разброс между платами был огромный), картина получается такая:

Поколение

С Turbo

Без Turbo

Чем тормозили

XT-клоны

8–10 МГц

4,77 МГц

переключение тактовой частоты

286

10–20 МГц

обычно 6–8 МГц

переключение тактовой частоты

386 и 486

16–100 МГц

как повезет

частота, кэш, такты ожидания, захват шины

Pentium

60–233 МГц

как правило, никак

кнопка часто вообще никуда не подключена

Для программ, которым нужны были 4,77 МГц, 486-й даже с выключенным кэшем оставался в разы быстрее оригинального IBM PC. Кнопка перестала решать единственную задачу, ради которой ее придумали, и любителям старых игр пришлось переходить на программы-тормоза вроде Moslo, которые отъедали у процессора часть времени и позволяли подобрать скорость поточнее. Кнопка же осталась на месте, и причины у этого были чисто торговые.

Кнопка, подключенная к ничему

К эпохе Pentium на большинстве материнских плат разъема TURBO SW уже не было, и кнопке стало просто некуда подключаться. Корпуса тем не менее продолжали выпускать с кнопкой и цифровым индикатором еще несколько лет, потому что покупатель привык, что у нормального компьютера есть Turbo, и корпус без нее смотрелся бюджетной моделью. Провода от кнопки болтались внутри, свернутые в бухточку, светодиод цепляли так, чтобы он горел всегда, а индикатор показывал выставленные перемычками 133 или 166 независимо от положения чего бы то ни было. Самые хозяйственные пользователи перекидывали эти провода на Reset или приспосабливали кнопку под что-нибудь полезное, и, по-моему, это было лучшее применение, которое она получила за всю свою жизнь.

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

Месть Borland

Самое смешное, что проблема, ради которой когда-то придумали кнопку, никуда не делась и в итоге догнала программистов там, где ее никто не ждал. Borland, та самая, что с Turbo Pascal, реализовала процедуру Delay в модуле CRT через тот же пустой цикл, только умнее. При старте программы модуль замерял, сколько оборотов цикла процессор успевает сделать за один тик таймера, делил это число на 55 и получал количество оборотов на миллисекунду. Калибровка на лету избавляла от привязки к 4,77 МГц, так что идея была хорошая, но:

{ код условный, по мотивам инициализации модуля CRT }
WaitTick;                    { ждем начала нового тика таймера }
Count := 0;
repeat
  Inc(Count);                { крутим цикл и считаем обороты }
until TickChanged;           { тик сменился, прошло ~55 мс }
DelayCnt := Count div 55;    { оборотов на одну миллисекунду }
                             { вот тут все и падает }

В оригинале это деление сделано ассемблерной инструкцией DIV, у которой частное обязано поместиться в 16-битный регистр. Если оно туда не лезет, процессор генерирует исключение деления, и Turbo Pascal радостно превращает его в Runtime error 200 (Division by zero). Посчитаем, когда это происходит: частное перестает влезать в 16 бит, как только за тик набирается больше 65535 × 55 ≈ 3,6 млн оборотов. Процессоры, которые успевали столько прокрутить, появились примерно на рубеже 200 МГц. Все программы, скомпилированные с модулем CRT, начали падать сразу после запуска, еще до первой строчки пользовательского кода, потому что инициализация модуля выполняется раньше основной программы.

Ошибка деления на ноль в программе, где никто ничего на ноль не делит, способна слегка ох.. озадачить кого угодно, и владельцы свежих Pentium II массово ловили ее на старом софте, который еще вчера работал. Лечили это патчами для CRT, которых в сети до сих пор полно. Нажать Turbo, чтобы машина стала помедленнее, было уже нельзя, потому что к этому времени кнопка на корпусе давно превратилась в декорацию. В DOSBox, где эти программы и игры запускают до сих пор, есть параметр cycles, который регулирует скорость эмулируемого процессора в обе стороны, и по сути он оказался той самой кнопкой, какой она могла бы быть, если бы ее подписывал инженер.

Настоящий турборежим, кстати, в итоге все-таки появился: в 2008 году Intel выпустила Core i7 с технологией Turbo Boost, которая поднимает частоту выше базовой, когда процессору хватает запаса по нагреву и питанию, то есть делает ровно то, что когда-то обещала надпись на бежевых корпусах, и кнопку для него, что характерно, делать никто не стал.