IBM PC: полная история, часть 1
Билл Гейтс, загадочные смерти, IBM, ведущая себя, как шустрый стартап. В этой истории есть всё!
Портативный компьютер IBM 5001
Можно заявить, что IBM PC не был первым PC от IBM. В сентябре 1975 года компания представила IBM 5100, первый «портативный» компьютер (это значило, что он весил всего 25 кг, и для него можно было купить специальный чемодан для путешествий).
5100 технически не был микрокомпьютером – он использовал разработанный в компании IBM процессор PALM, размазанный по всей материнской плате, а не содержащийся в одном микрочипе. Но с точки зрения конечного пользователя разница была небольшой – он явно подходил под определение персонального компьютера. Это была самодостаточная, полная по Тьюрингу, программируемая машина размером не более чемодана, с ленточным приводом для загрузки и сохранения программ, клавиатурой, 5″ экраном и памятью в 16 Кб.
5100 отличался от первой волны PC ценой и рекламируемой областью применения. Цена начиналась от $10 000 и легко могла забраться за отметку в $20 000. IBM продвигала машину как серьёзный инструмент для полевых инженеров в удалённых местах, в которых нет возможности получить доступ к большим машинам IBM, а не устройство для развлечения, обучения, взлома или офисной работы.
IBM 5110, небольшой апгрейд 5100
Реклама изменилась с двумя следующими итерациями концепции, моделями 5110 и 5120, которые рекламировали как системы, подходящие для офиса, с приложением для бухгалтерии, базой данных и даже текстовым процессором. Но цены оставались на высоком уровне, при том, что для реальной работы в офисе этот компьютер необходимо было подсоединять к отдельно стоящему массиву дисков, по размеру превышавшему сам компьютер, в результате чего вся система становилась больше похожей на миникомпьютер, чем на PC.
System/23 Datamaster и студенты университета
Однако получается, что хотя полным именем IBM PC никогда не называли, официально это была модель IBM PC 5150 (не путайте с альбомом Van Halen) – продолжение линейки портативных компьютеров 5100, а не нечто совершенно новое, несмотря на то, что её архитектура не имела ничего общего с предшественниками.
В феврале 1978 года IBM начала работу над первым микрокомпьютером – и это опять не был IBM PC. Это была машина System/23 Datamaster.
The System/23 Datamaster
Она вновь была разработана для работы в офисе, и построена на микропроцессоре Intel 8085. Она была большой и тяжёлой (43 кг) и стоила порядка $10 000, что вкупе с её ориентированием на бизнес и сухие варианты использования радикально отличало её от компьютеров вроде Apple II. Но технически это был микрокомпьютер. IBM была огромной компанией с легендарно запутанной бюрократией, что означало, что проектам для завершения иногда требовалось невероятно много времени. Несмотря на то, что проект Datamaster опередил PC на два года, он не выходил вплоть до июля 1981, как раз вовремя, чтобы его славу затмил анонс выхода IBM PC в следующем месяце. И всё-таки, если в игре на эрудицию всплывёт вопрос по поводу первого микрокомпьютера от IBM, то вот вам и ответ.
Atari VCS (2600), которая, как ни странно, имеет отношение к истокам IBM PC
Вот теперь история начинается по-настоящему
Машина, которая станет известной, как настоящий IBM PC, внезапно берёт своё начало в Atari. Видимо, почувствовав вкус успеха на волне взрыва видеоигр, организованного игрой «Space Invaders» и приставкой Atari VCS, а также выпуском собственных PC, Atari 400 и 800, компания в июле 1980 сделала предложение председателю правления IBM Фрэнку Кэри: если IBM хочет сделать свой PC, Atari может снизойти до разработки такового для неё.
Кэри не был таким уж ограниченным любителем мейнфреймов, как его пытаются представить. Он ратовал за разработку малых систем – даже если под «малыми» в IBM часто понимали нечто совсем иное, чем в остальном мире. Кэри принёс это предложение к директору по системам ввода данным IBM, Биллу Лоу, работавшему в городе Бока-Ратон во Флориде. Лоу представил предложение комитету управляющих, объявивших его «тупейшим из всего, что им доводилось слышать». И действительно, IBM и Atari составляют самую странную пару. Но при этом все понимали, что Лоу выступает по личной просьбе председателя правления, а такие предложения запросто не отметаются, если вы, конечно, заботитесь о вашей карьере. Так что они велели Лоу собрать команду для составления детального предложения, как именно IBM могли бы самостоятельно сделать PC, и представить его через месяц.
IBM PC 5150 с принтером, представлен в августе 1981
Лоу собрал команду из 12 или 13 человек (источники расходятся в точной цифре) для создания черновика предложения. Нарушая традицию компании, он специально не стал собирать большую команду и вводить формальную структуру управления, надеясь создать какую-то «хакерскую магию», которая и породила PC. Его менеджер проектов Дон Эстридж сказал: «Если вы соревнуетесь с людьми, начинавшими в гараже, вам надо начинать в гараже».
Можно было ожидать, что такой Голиаф компьютерной индустрии, как IBM, пробьёт себе путь на рынок PC нахрапом. Хотя любители PC гордились тем, что построили новый рынок путём дерзких решений, творческого подхода и гибкости, на которые не способен такой флегматичный гигант, как IBM, они всё же побаивались именно такого развития событий. Однако IBM решила быть паинькой, ознакомиться с существующим положением дел и побеседовать с людьми, создававшими рынок PC, чтобы понять, что нужно и куда теоретический IBM PC мог бы встроиться.
Размышляя таким образом, Джек Сэмс, глава разработки ПО, рекомендовал пообщаться с Microsoft. Сэмс был необычно хорошо знаком с рынком PC для работника IBM; он агитировал компанию купить у Microsoft BASIC для Datamaster, но его предложение отклонили в пользу внутренней разработки. «Просто это заняло дольше и стоило дороже», – сказал он позже. Сэмс позвонил Биллу Гейтсу 21 июля 1980 года и спросил, можно ли ему приехать на следующий день в офис в Сиэтле и дружески поболтать по поводу PC. «Но не нужно особенно радоваться и не ожидайте ничего сверхъестественного», – сказал он.
Это Билл Гейтс в 1984 году в возрасте 29. Представьте, как молодо он выглядел за 4 года до этого.
Гейтс и Стив Балмер, его правая рука и единственный среди компании хакеров обладатель бизнес-образования, всё же поняли, что ситуация может обещать нечто сверхъестественное. Когда Сэмс приехал с двумя сотрудниками, выступающими в роли свидетелей, Гейтс лично вышел их встречать. (Сэмс изначально подумал, что Гейтс, своим лицом, голосом и фигурой напоминавший 12-летнего мальчика, – это какой-то посыльный). Сэмс сразу же вытащил соглашение о неразглашении, бывшее стандартной процедурой для IBM.
«IBM не облегчало задачу, — вспоминал позже Гейтс. – Нужно было подписывать все эти странные соглашения, в которых говорилось, что IBM может делать что хочет и когда хочет, и использовать ваши секреты по своему усмотрению. Так что потребовалось немного доверия». Однако же, он сразу подписал их.
Сэмс хотел узнать общее состояние рынка PC у Гейтса, который был близко знаком с этой темой. Так что Гейтс был лишь одной из выдающихся фигур, с которыми он общался. Однако у него был и скрытый мотив: посмотреть, чем занимается Гейтс, попробовать понять, может ли Microsoft быть полезным ему ресурсом. Он был очень впечатлён.
Проконсультировавшись с Гейтсом и остальными, Лоу представил 8 августа предложение по поводу машины, которую IBM необходимо построить. Из многих популярных исторических источников, к примеру, из старой документалки «Триумф нёрдов» [Triumph of the Nerds], создаётся впечатление, что IBM PC быстро слепили в нереальной спешке. Реально же над этой разработкой очень серьёзно размышляли. У неё был два очень интересных аспекта.
Скромный MOS 6502
Такой же скромный Zilog Z80
Intel 8080, с которым Z80 был совместим
Интегральная схема клона Z80
Открытая архитектура
В то время почти все PC использовали один из двух процессоров – либо MOS 6502, либо Zilog Z80. Оба они появились в относительно небольших, начинающих компаниях, и каждый из них позаимствовал основной набор инструкций и большую часть схемы у другого, более дорогого CPU, производимого крупной компанией – у Motorola 6800 и Intel 8080 соответственно. (Если говорить об этической стороне дела, то оба процессора в основном разрабатывали инженеры, также работавшие и над созданием процессоров, послуживших для них «вдохновением»).
Оба были 8-битными чипами с адресацией памяти до 64 Кб. И это уже становилось проблемой. Apple II был ограничен 48 Кб RAM из-за необходимости адресации 16 Кб ROM. И даже там, где эти ограничения ещё не были проблемой, становилось ясно, что скоро проблемы появятся.
Так что команда решила работать над CPU следующего поколения, способного оставить эти ограничения в прошлом. IBM давно сотрудничала с Intel, поэтому выбрала Intel 8088, гибридный ЦП на 8 бит/16 бит, способный работать на частоте 5 МГц (гораздо быстрее 6502 или Z80), и, что лучше всего, мог работать с адресацией целого мегабайта памяти. У IBM PC будет возможность для роста, недоступная его предшественникам.
Другой интересный аспект – очень популярная идея «открытой архитектуры». В книге «Случайные империи» [Accidental Empires] и основанном на ней фильме «Триумф нёрдов» [Triumph of the Nerds] Роберт Кринджли утверждает, что этот выбор был сделан, исходя из необходимости, и это был ещё один симптом поспешного создания машины. «Продукт года от IBM! Какая чушь! Чтобы сэкономить время, вместо того, чтобы создать его с нуля, они купили готовые компоненты и собрали из них компьютер – то, что на языке IBM называется „открытой архитектурой“.
Гарри Гарланд и Роджер Мелен, сооснователи Cromemco, держат в руках системную плату S-100, 1981
Ну, во-первых, „открытую архитектуру“ вряд ли можно называть „языком IBM“. Это термин, которым практически везде описывали IBM PC, и, вероятно, менее всего в самой IBM. (К примеру, в этой подробной и детализированной статье для журнала Byte, „Создание IBM PC“, член команды Дэвид Брэдли ни разу его не использует). Но что имеют в виду люди под „открытой архитектурой“? К несчастью для журналистов, „открытость“ или „закрытость“ архитектуры, это не выбор „или/или“, а, как и всё в жизни, некий континуум.
К примеру, Apple II тоже обладал относительно открытой архитектурой. Одной из немногих выигранных Возняком у Джобса битв было включение слотов расширения и опубликование детальной схемы, что позволило пользователям делать с машиной такое, чего её создатели не могли предвидеть, и что послужило одной из причин её поразительно долгой жизни. Компьютеры CP/M, часто использовавшиеся на предприятиях, были ещё более открытыми, поскольку основывались на общепринятых и хорошо описанных спецификациях S-100, и обладали множеством слотов расширения. Это позволяло им совместно использовать и железо, и софт.
Commodore PET вышел в январе 1977 и использовал MOS 6502 – один из вариантов чипов, которые IBM могла бы использовать в PC
Вместо разговоров об открытой архитектуре, нам лучше поговорить о модульной архитектуре. IBM сделала компьютерный конструктор, набор взаимозаменяемых компонентов, которые покупатель мог собрать в любой комбинации, подходящей для его потребностей и кошелька. Сразу после запуска у него был выбор между цветной видеокартой, способной рисовать графику и игры, или монохромной картой, способной выдавать 80 столбцов текстовых символов. Можно было выбирать объём встроенной памяти в промежутке от 16 Кб до 256 Кб, один или два флоппи-дисковода или кассетный привод, и т.п. В результате, когда все сторонние компании включились в эту игру и IBM расширила продуктовую линейку, можно было просто утонуть в вариантах выбора.
Большая часть отдельных компонентов действительно была заказана в сторонних компаниях, что резко ускорило процесс разработки. Использование проверенных и хорошо известных компонентов имеет и другие преимущества, из чего и вытекла репутация IBM PC как надёжной машины.
Tandy Radio Shack TRS-80, использовавший Zilog Z80
Заказ такого большого количества оборудования у сторонних компаний для IBM был отходом от традиций, но в иных аспектах IBM PC продолжал философию разработки компании. Не было одного, единственного, подходящего для всех мейнфрейма. Когда вы звонили и говорили, что хотите купить одного из этих монстров, IBM отправляла парочку представителей для обсуждения ваших нужд, финансовых возможностей и проверки доступного пространства. Затем вы вместе разрабатывали систему, которая лучше всего подойдёт вам, решая, сколько вам нужно дискового пространства, памяти, сколько и каких кассетных приводов, какие вам понадобятся принтеры, терминалы, устройства чтения перфокарт и т.п.
В этом смысле IBM PC была продолжением обычной работы компании в миниатюре. Конечно, у большинства других персоналок тоже была какая-то гибкость. Однако же важно то, что IBM решила поставить всё на модульность, расширяемость, или, если угодно, открытость. Как и выбор CPU, это дало машине пространство для роста, поскольку неизбежно начали появляться новые, улучшенные жёсткие диски, видеокарты и потом – звуковые карты. Это ключевая причина того, что разработанная так давно архитектура остаётся с нами и сегодня, в сильно переработанном виде.
Apple II, использовавший MOS 6502
В поисках операционной системы
Комитет одобрил задумку Лоу по созданию компьютера. IBM, понимая, что её собственная бюрократия служит препятствием на пути людей, пытающихся что-то сделать, незадолго до этого придумала концепцию „независимой бизнес-ячейки“ [Independent Business Unit, IBU]. Идея была в том, чтобы IBU работали как полунезависимые сущности, освобождённые от обычной бюрократии, а IBM исполняла бы роль венчурного капиталиста. В журнале Fortune описали IBU как „Как начать собственную компанию, не покидая IBM“. Председатель Кэри, цитату которого часто искажают и неправильно понимают, назвал IBU ответом IBM на вопрос „Как заставить слона танцевать чечётку?“ IBU Лоу назовут Project Chess, а разрабатываемую машину – Acorn (по-видимому, никто не знал о британской компьютерной компании с тем же названием). Команде дали карт-бланш, с одним ограничением – Acorn должен был появиться уже через год.
Джек Сэмс, так сильно впечатлённый Биллом Гейтсом и Microsoft, вернулся к ним почти сразу после того, как IBM запустила Project Chess – 21 августа 1980 года. Получив от Гейтса ещё одно подписанное NDA, он готов был закончить с теориями и поговорить начистоту. Он объяснил, что IBM планирует сделать свой собственный PC, но это никого не удивило. Придерживаясь принятой философии машины, которую можно настроить на любые задачи, он планировал предложить пользователям выбор – использовать BASIC-окружение, встроенное в ROM, как это было у Apple II, PET и TRS-80, или загружаться в дисковую операционную систему CP/M, которая была очень популярной среди бизнес-пользователей.
Microsoft, как главный поставщик BASIC’ов для микрокомпьютеров, была очевидным выбором для первого варианта. Также она недавно занялась и другими компилируемыми языками вроде Fortran, и Сэмс не возражал против наличия и других языков. Роберт Кринджли и другие придают слишком много значения тому, что IBM обратилась за софтом к стороннему разработчику (ещё один их аргумент в пользу сборки на скорую руку), но это не было чем-то из ряда вон выходящим. Apple, Commodore, Radio Shack и многие другие сделали то же самое, взяв BASIC у Microsoft.
Реклама пакета CP/M Graphics от Digital Research
Сэмс не мог разобраться кое в чём другом. Той весной Microsoft представила своё первое оборудование, Z80 SoftCard. Это был ЦП Z80 на карте, подключаемой в один из слотов расширения Apple II. После установки карты пользователь мог выбирать – отдавать контроль над машиной стандартному ЦП 6502 или же Z80. На карте были схемы, позволявшие Z80 использовать стандартную память и другую периферию Apple II. Это был удивительный хак, разработанный совместно с Seattle Computer Products, небольшой фирме, производящей оборудование, в то время тесно сотрудничавшей с Microsoft.
Поскольку CP/M работала только на процессорах Z80, пользователи Apple II были отрезаны от вселенной бизнес-программ CP/M. Теперь у них появился доступ к лучшим возможностям обоих миров – весь софт для образования и развлечения, пользовавшийся возможностями графики Apple II (не говоря уже про VisiCalc) и все текстовые бизнес-приложения СР/М. SoftCard имела бешеный успех, не дотянув только до самого VisiCalc, в процессе продвижения Apple II на бизнес-рынок Америки как единственной машины, основанной на 6502. Apple II с SoftCard вскоре стала самой популярной конфигурацией оборудования для CP/M.
Microsoft Z80 SoftCard
Поскольку SoftCard поставлялась с копией CP/M, Сэмс был уверен, что эта операционка принадлежала Microsoft. Гейтс объяснил, что это не так – Microsoft лишь приобрела лицензию у её владельца, компании Digital Research.
Гейтс и Гэри Килдалл, глава Digital Research и один из первых программистов CP/M были знакомы много лет, и выработали взаимное уважение и некое партнёрство. С выходом новой машины Microsoft занималась языками, а Digital – операционкой.
Стив Вуд, один из первых программистов Microsoft:
Когда мы общались с очередным OEM, клиентом-производителем, желавшим, чтобы на его железе работал BASIC или любой другой продукт, то к 77-78 году мы уже всегда пытались склонить их к сотрудничеству с Digital и CP/M, поскольку нам так было гораздо легче работать. Когда мы делали что-то на заказ, типа версии для General Electric или версии для NCR, это была ужасная головная боль. Наша жизнь становилась проще, когда кто-нибудь просто покупал лицензию на CP/M и поднимал её у себя, после чего наши программы просто сразу работали. Гэри делал то же самое. Если кто-либо обращался к нему за лицензией на CP/M, и им нужны были языки, он отправлял людей в Microsoft. Это было нечто синергетическое.
Гейтс и Килдалл в какой-то момент даже обсуждали слияние компаний. Существовало некое молчаливое соглашение, что Microsoft не будет лезть в операционки, а Digital – в языки. Однако к концу 1979 Digital начала распространять с некоторыми версиями CP/M BASIC не от Microsoft, что Гейтс и его коллеги восприняли, как предательство.
Однако же Гейтс прямо в присутствии Сэмса позвонил Килдаллу, чтобы договориться о встрече с ним и его командой на следующий день. Он сказал, что это очень важные клиенты, „так что обращайтесь с ними нормально“. Сэмс не был этому рад. Он находился под впечатлением от Гейтса и Microsoft, и „мы просто хотели работать с одним человеком“ по вопросу ПО.
Но выбора не было. Как вы помните, CP/M работала на Z80. Сэмсу нужно было не просто купить лицензию у Digital; ему нужно было договориться о портировании ОС на новую архитектуру 8088, причём по нужному ему графику. Следующим утром они с командой на самолёте следовали в Пасифик-Гроув, Калифорния, где располагалась Digital Research.
Загадочные события 22 августа 1980 года
Гэри Килдалл в 1977-м
Этот момент знаменит тем, что история становится туманной. Впоследствии Сэмса и Килдалла спрашивали множество раз, что случилось 22 августа 1980. Их истории настолько несопоставимы по фактам, что невозможно отнести это только на счёт отношения к нюансам или разной интерпретации событий. Кто-то, а возможно, оба они, просто говорили неправду.
Сэмс утверждает, что они с командой прибыли в викторианское здание, служившее штабом Digital, точно вовремя, и узнали, что Килдалл решил воспользоваться хорошей погодой, и вместо встречи отправился полетать на своём самолёте. Сэмсу и компании пришлось общаться с бизнес-менеджером Digital, женой Килдалла, Дороти. Будучи шокирован, Сэмс остался непреклонен и достал своё NDA в качестве прелюдии к бизнесу.
На первый взгляд это было оскорбительное и несправедливое соглашение, в котором, по сути, говорилось, что вторую сторону засудят, если она раскроет секреты IBM, но при этом у IBM сохраняется иммунитет от любых судебных исков в противоположном случае. Гейтс сказал, что „верит“ им, и сразу подписал бумагу. Дороти же отказалась и сказала, что ей сначала нужно будет проконсультироваться со своим юристом. И пока Сэмс нервно ожидал в приёмной, они с адвокатом, Джерри Дэвисом, колебались до трёх часов дня, пока, наконец, не подписали NDA.
Поскольку почти весь день прошёл, а технический специалист, которому и нужно было бы заниматься портированием, отсутствовал, обсуждения практически не продвинулись. Сэмс покинул Digital разочарованным и раздражённым, без намёков на соглашение, и тут же начал искать альтернативы этим людям.
Со своей стороны Килдалл (умерший в 1994 году при очень странных обстоятельствах) признал, что он летал, когда Сэмс прибыл на встречу. Однако он утверждал, что не развлекался полётами, а летел домой после деловой командировки. Он сказал, что не видел ничего страшного в том, чтобы с командой из IBM в начале встречи общалась Дороти, поскольку она больше занималась бизнес-переговорами, чем он. При этом он сказал, что вернулся уже днём, и именно он убедил Дороти и Дэвиса подписать NDA и продолжить переговоры.
После этого переговоры прошли быстро, и IBM с Digital „пожали друг другу руки“ к концу дня. Килдалл также заявлял, что затем он с Дороти улетели тем же вечером, уже коммерческим рейсом, чтобы начать свой отпуск во Флориде, и что группа из IBM летела тем же рейсом. И там они пообщались по поводу дальнейших планов.
Сэмс говорит, что он не полетел во Флориду сразу после встречи, а отправился обратно в Сиэтл, чтобы продолжить беседу с Microsoft, признав, что возможно, парочка членов команды могла направиться обратно в Бока-Ратон. Спустя годы он твёрдо стоял на том, что вообще не встречался с Килдаллом, „если только он не притворялся кем-то другим, будучи там“.
Лишь в последние годы Сэмс смягчил свою позицию, и говорил, что „вероятно“, что Килдалл был на встрече, но он „этого не помнит“. Также он недавно сказал: „Мы это провалили, Килдалл это провалил и Microsoft это провалила“. Это можно воспринять как последнее убежище человека, не всегда говорившего правду, но кто его знает. Для обеих версий событий есть свидетели, частично их подтверждающие. Исполнительный директор Digital и друг Килдалла, Том Роландер, говорит, что он был в командировке вместе с Килдаллом, и что они вместе встречались с Сэмсом в тот день. Дэвис, юрист Digital, говорит, что никакого соглашения на словах в тот день заключено не было, а другие сотрудники IBM вспоминают, что Сэмс сразу после этой экспедиции рассказывал, что Килдалла вообще не было на встрече.
Билл Гейтс испытывает взаимопонимание с сооснователем Microsoft Полом Алленом в 1987
Бизнесмен с восточного побережья против калифорнийского хиппи
И как же во всём этом разобраться? Можно сравнить личность Килдалла с личностью Гейтса. Популярные описания этих событий часто низводят Гейтса и Килдалла до карикатурных персонажей, до маниакального бизнесмена с восточного побережья против расслабленного хиппи из Калифорнии. На самом деле это не так далеко от истины. Оба были прекрасными хакерами, но во всём остальном вряд ли могли отличаться ещё больше. Гейтс был настроен на то, чтобы доказывать всем свою состоятельность и выигрывать, снова и снова. Когда к нему пришла такая крупная рыба, как IBM, он с готовностью проявил скромность, вплоть до низкопоклонства, поскольку она была нужна ему, как следующий этап карьерного роста. (После того, как он перестал в них нуждаться, всё поменялось). Амбициозность Гейтса, пусть и не самое восхитительное из его свойств, заставила многих его партнёров уважать Microsoft. Гейтс не только собрал очень талантливую команду, все они соответствовали личности своего босса в том, что были готовы пахать, как волы, и преодолевать все препятствия для того, чтобы сделать работу как надо, и опередить своих соперников.
Килдалл же вёл себя так, что иногда было не похоже, что он уверен в том, что хочет заниматься бизнесом.
В один из самых неудачных моментов конца 70-х Гэри прошёл мимо парковки по пути на свою работу и пошёл дальше по улице, вдруг поняв, что не может себя заставить пойти на работу. Он обошёл вокруг квартала три раза, пока не смог заставить себя встретить ещё один день в Digital Research.
Невозможно представить, как какие-то подобные сомнения одолевают Гейтса.
Килдаллу была важна радость хакинга. А пользователям нужно было терпеливо ждать. Ему, может, и понравилось работать с IBM, но им надо было встать в очередь, как всем остальным. И уж точно он не собирался пресмыкаться перед ними. Джордан Юбэнкс, вице-президент Digital в 1980 году, говорит: „Гэри больше нравились вечеринки, чем управление бизнесом“. Кроме вечеринок, Килдаллу нравилось программное обеспечение. А Гейтсу нравился бизнес программного обеспечения. Юбэнкс:
Различия между Биллом и Гэри были поразительные. Билл, увидев возможность, гнался за ней, делал всё возможное, делал больше возможного, без проблем. Гэри же был настроен вроде „Да мне всё равно, я Digital Research. Вы будете работать со мной на моих условиях“.
Джек Сэмс в документалке „Триумф Нёрдов“ в 1996 г.
А ещё была личность Сэмса, или, точнее, его корпоративный опекун. IBM была большой шишкой в компьютерном мире, и ожидала, что к ней будут относиться соответственно. Если они снисходили до визитов к таким компаниям, как Microsoft или Digital, с ними должны были носиться, как с VIP, и показывать, что данная компания очень хочет иметь с ними дело.
Когда Digital не смогла продемонстрировать уважение и благодарность так, как это сделали в Microsoft – а что бы ни случилось в тот день, ясно хотя бы, что так оно и было; Юбэнкс описывает, что Дороти „стервозно“ относилась ко всем, включая клиентов – Сэмс был в ярости. „Они что, не знают, кто я такой?“ – вероятно, удивлялся он. Ясно, что Сэмсу не нравилась перспектива работать с Digital вместо Гейтса ещё до того, как он сел на рейс в Калифорнию. Как нам всегда говорили наши мамы, если ты начинаешь дело с плохим отношением, то обычно получаешь плохие результаты.
Одно ясно: была устная договорённость, или нет, или какое там впечатление сложилось от этого у Килдалла, Сэмс не был удовлетворён своим опытом общения с Digital. Он спросил Гейтса, подписавшего на этот раз уже консалтинговый договор, не может ли он найти ему альтернативу CP/M. Гейтс сказал, что посмотрит, что можно сделать. Сэмс утверждает, что продолжал попытки договориться с Digital, но не мог получить согласие на разработку 8088 CP/M в жёсткие установленные сроки. Юбэнкс говорит, что Килдаллу этот проект просто не показался таким уж „интересным“, несмотря на его очевидную необходимость, и в результате он работал над ним спустя рукава.
А потом Гейтс вернулся с QDOS.
Полная история IBM PC, часть вторая: империя DOS наносит удар
Реальным победителем была Microsoft, построившая империю на закорках сомнительно приобретённой MS-DOS.
Intel 8086, более дорогая, но функционально идентичная версия Intel 8088, под управлением которой в итоге и будет работать IBM PC
В ноябре 1979 года частый партнёр Microsoft, компания Seattle Computer Products выпустила материнскую плату Intel 8086 для самых упёртых любителей хобби и производителей компьютеров, проводящих эксперименты с этим новым и очень мощным ЦП. 8086 состоял в близком родстве с 8088, выбранным IBM для PC. Последний был удешевлённой версией первого, гибридный чип на 8-бит/16 бит, а не чисто 16-битный, как 8086.
IBM склонилась к менее мощному 8088 в частности, чтобы контролировать издержки, но и затем, чтобы позволить использовать с ним определённую периферию, которой требовалась 8-битная внешняя шина данных, которой обладал 8088. Но, вероятно, самым сильный аргумент поступил, как это часто бывает, из отдела маркетинга, а не разработок. Чип 8086 был таким мощным, что оборудованный им IBM PC мог заставить клиентов отказаться в его пользу от более крупных систем IBM. IBM хотела отобрать бизнес у других производителей PC, но не у своих подразделений.
Скромный ЦП Intel 8088
Для нас важно понять, что у обоих чипов был одинаковый набор инструкций, поэтому на них могли идти одни и те же программы. Все хотели запускать CP/M на картах SCP, но CP/M была разработана только для Intel 8080 и Zilog Z80. Потому у SCP были те же проблемы, на которые Джек Сэмс и IBM натолкнулись через несколько месяцев. Digital Research периодически обещала выпустить версию CP/M для 8086/8088, но не сделала этого. Так что в апреле 1980-го Тим Патерсон из SCP решил самостоятельно написать ОС для 8086/8088. Он назвал её QDOS – «дешёвой и сердитой операционной системой» [Quick and Dirty Operating System].
Этичность или отсутствие таковой в поступке Патерсона обсуждалась годами. Гэри Килдалл много раз заявлял, что он похитил исходные коды CP/M, но это утверждение сомнительно. Нет никаких свидетельств, что у него был доступ к коду, тщательно охранявшемуся компанией Digital, как это принято у большинства компаний, как того времени, так и современных.
С другой стороны, Патерсон признаёт, что просто взял руководство по CP/M и просто скопировал все API-вызовы, один за другим. С третьей стороны, даже если это был не очень оригинальный и творческий подход, его действия были совершенно легальны, даже по сегодняшним стандартам. Суды раз за разом заключают, что API не защищается авторским правом, это можно сделать только с его конкретной реализацией, поэтому реверс-инжиниринг допустим. Ну, конечно, существует ещё патентное право, но в это болото мы не полезем.
Карта Intel 8086, выпускавшаяся Seattle Computer Products
Пища для размышлений для приверженцев открытого кода и противников Microsoft: если создание QDOS было неэтичным, тогда Linux – по большей части повторное воплощение стандартов Unix – будет настолько же неэтичным. Патерсон утверждает, что у него были существенные причины для копирования CP/M: он хотел, чтобы программистам было как можно легче портировать программы с CP/M на QDOS. Он также заявляет, что под капотом, там, где это было возможно, он серьёзно улучшил свой вариант С, особенно в работе с диском и файлами.
А в это время Билл Гейтс размышлял, как, чёрт побери, он сможет сотворить операционку для IBM в назначенные ему сроки. А затем Патерсон позвонил сооснователю Microsoft Полу Аллену и рассказал про QDOS – просто на случай, если вдруг Microsoft заинтересуется написанием для неё программ или внутреннего использования. Гейтс, как человек, способный распознать внезапного спасителя, позвонил Сэмсу и спросил: «Сами заберёте, или хотите, чтобы я это сделал?» Ответ Сэмса на этот вопрос за последующие десятилетия обойдётся IBM в миллиарды долларов. «Конечно, забирайте сами», – сказал он.
А теперь – с дополнением в виде сопроцессора 8087!
Понимая, что программы для PC были очень далеки от его области знаний, Сэмс просто отдал все проблемы, связанные с ПО, в Microsoft, и не видел причин менять курс. «Мы хотели, чтобы это было их проблемой», – говорил он после. «Проблема» Microsoft через несколько лет станет большой, огромной проблемой для IBM.
Да будет свет!
Стив Балмер и Билл Гейтс на PC Forum в 1986.
30 сентября Гейтс, Стив Балмер и Боб О’Рир – седьмой сотрудник Microsoft – полетели во Флориду с целью сделать окончательное предложение IBM. Сэмсу, желавшему всучить проблему разработки ПО кому-то другому, их план показался идеальным. Microsoft будет отвечать за поставку ОС, четырёх языков программирования (BASIC, COBOL, Fortran, Pascal) и набора другого софта, который должен быть готов к запуску продукта (включая нашего старого друга, Microsoft Adventure).
На одном из пунктов Гейтс настаивал особенно: Microsoft будет продавать лицензии на софт для IBM, а не просто продавать готовый продукт, и будет ожидать с них роялти, оплаты с каждой копии. IBM, считая, что возможностей заработать на этом хватит всем, и что не помешает так тесно привязать судьбу Microsoft к IBM PC, согласилась. Огромная компания, чья консервативность и избегание рисков были легендарными, согласилась вручить судьбу одного из крупнейших проектов в руки 24-летнего парня. Если бы Microsoft не справилась, то IBM PC был бы мертворожденным продуктом.
6 ноября Microsoft и IBM официально подписали контракт, по которому сразу же заплатили Microsoft $700 000 за начало переноса всякого разнообразного софта на новую архитектуру. Забавно, что Лоу и Сэмс, сыгравшие значительные роли во всём проекте, перевели в другие подразделения. Project Chess, возможно, был и независимой бизнес-ячейкой, но, очевидно у него не было абсолютного иммунитета к переменчивому настроению бюрократии IBM. Место лидера проекта занял Дон Эстридж.
Пока составлялся договор по поводу ПО, Project Chess не стоял на месте. В том же ноябре Microsoft получила два первых прототипа. IBM, отчаянно боровшаяся за секретность, потребовала, чтобы их держали в подвале без окон, закрытом на замки, которые поставляла сама IBM. Microsoft и Project Chess, физически разделённые так, как это только возможно, чтобы всё ещё оставаться в США, всё же создали работающие взаимоотношения, похожие на рабочие связи, существующие сегодня, когда от географии зависит гораздо меньше. Они постоянно общались по телефону и особенно по специальной системе электронной почты, которую они наладили, передававшей сообщения в обе стороны при помощи сервиса за одни сутки, и часто ездили друг к другу – иногда и без предупреждения. Это стало особенной причиной беспокойства для Microsoft. У IBM была привычка приезжать без предупреждения, чтобы проверить, придерживаются ли тут их хитромудрых практик безопасности.
Конечно, у команды IBM тоже было, чем заняться, но Microsoft реально приходилось торопиться. Из-за всех этих переговоров они, если верить Гейтсу, уже «отставали от графика на три месяца» в день подписания контракта. Все несколько месяцев подряд работали без выходных. Большинство даже не ушло на Рождество.
Первой целью было заставить машину работать в двух режимах: BASIC и дисковая операционная система. Microsoft могла справиться с первым и сама, но по второму вопросы они зависели от Seattle Computer Products. Когда Microsoft заканчивала переговоры с IBM и начинала работу, Патерсон и SCP продолжали собственные разработки, улучшая QDOS от состояния хака «дёшево и сердито» до пригодной к продаже ОС. В процессе они по очевидным причинам переименовали её в 86-DOS. К окончанию года у них, наконец, появилась версия, пригодная для выхода в мир.
Билл Гейтс, может, и не выглядит хладнокровным бизнесменом, но именно такого впечатления он и добивается!
Билл Гейтс выходит из тени
До того момента Билл Гейтс вёл себя тихо, действуя, как целеустремлённый, но честный бизнесмен. Теперь же мы начинаем видеть, как на свет выходит что-то от той легендарной уклончивости Гейтса. Он хотел, чтобы Microsoft работала по схеме роялти, которая давала им долю в проекте IBM PC, на успех которого возлагались надежды. Но он не хотел делиться этими плодами с SCP, которая и не подозревала о существовании проекта IBM, или о том, что их скромная ОС, написанная одним человеком, была ключом к планам одной из крупнейших компаний мира. Гейтс хотел держать их в неведении, но 86-DOS была нужна ему уже вчера. Следовательно, ему нужно было вырвать 86-DOS из их рук, не давая им узнать, зачем она ему нужна.
Пол Аллен и Билл Гейтс скучают на PC Forum 1987 года
Пол Аллен договорился с владельцем SCP Родом Броком в январе, утверждая, что у Microsoft есть целый вагон клиентов, жаждущих запускать 86-DOS. Сделка позволяла Microsoft работать посредником, или розничным продавцом, на этих транзакциях. За каждого клиента, которому они продадут лицензию на 86-DOS, они пообещали платить SCP по $10 000, или по $15 000 в случае, если с лицензией будет поставляться исходный код. Также они заплатят SCP $10 000 сразу после заключения сделки.
Для SCP, небольшой компании, занимавшейся оборудованием, без связей и маркетинговых навыков Microsoft такая сделка звучала прекрасно – особенно из-за того, что за последнее время бизнес шёл не очень хорошо. Microsoft выказывала уверенность в том, что она сможет продать довольно много лицензий, что принесёт фирме лёгкие деньги за ОС, которую Патерсон начал почти что забавы ради.
Один из пунктов, спрятанных в контракте, мог вызвать подозрение: «Ничто в этом лицензионном соглашении не может обязать Microsoft раскрыть своего клиента для Seattle Computer Products». Позже Брок говорил: «Нам это казалось странным, но мы согласились». На самом же деле, конечно, у Microsoft не было никакого вагона страждущих клиентов. У них был всего один клиент, крупнейший из всех: IBM. Microsoft продала по этому соглашению всего одну лицензию, что дало ей право успешно приобрести ОС для IBM PC за общую сумму в $25 000.
Первая загрузка
В феврале Боб О’Рир из Microsoft впервые смог загрузить 86-DOS на одном из прототипов:
Была уже вроде глубокая ночь. Это был один из самых радостных моментов моей жизни, наконец, после всех приготовлений и работы, метаний туда и сюда, операционка загрузилась и сообщила, что готова принимать команды. Это был волнительный момент.
IBM вскоре начала требовать внести в 86-DOS различные изменения. Microsoft обнаружила, что попала в неудобное положение, поскольку ей пришлось снова обращаться к Патерсону, знавшему 86-DOS лучше любого другого, с кем они заключили контракт на консультации, и просить у него внести изменения, не говоря, от кого идут эти запросы. В результате они убедили его уйти из SCP и прийти к ним на полный рабочий день. «Это IBM!» – сообщили они ему, как только он переступил порог своего кабинета в первый рабочий день в качестве сотрудника.
86-DOS (QDOS), работающая на эмуляторе
Ирония с точки зрения Патерсона, десятилетиями защищавшегося от обвинений в пиратском копировании CP/M, заключалась в том, что многие изменения, запрошенные IBM, ещё сильнее приближали 86-DOS к CP/M. К примеру, запрос команд, демонстрирующий текущий диск, «A:>», был введён по просьбе IBM, и это была копия того, что делала CP/M. Патерсон говорит, что его от этого «тошнило», но, естественно, в этом проекте IBM обычно получала то, что требовала.
IBM планировала сделать анонс IBM PC в августе 1981 года – согласно изначальному плану, по которому Project Chess должен был родиться ровно за год. Им не хотелось откладывать это, поэтому все в Бока-Ратон, и особенно в Microsoft, работали ещё усерднее, пропуская мелкие дедлайны, в то время как основной оставался недвижимым.
IBM также начала делать конфиденциальные предложения разработчикам такого ПО, как VisiCalc и пакету для обработки текстов Easy Writer, чтобы добавить их к линейке приложений и игр от Microsoft. Они даже договорились, что UCSD Pascal P-System будет доступна для тех, кто захочет запускать её совместно с 86-DOS или Microsoft BASIC.
Удивительно, но такой обширный проект очень долго оставался тайным. Но, наконец, в июне InfoWorld напечатала подробную статью, описывающую практически весь план в деталях, и даже упомянула, что ОС в проекте будет не CP/M, но очень на неё похожей. InfoWorld ошибся только с датой анонса, написав, что он произойдёт в июне, а не в августе. Более ранний проект персонального компьютера Datamaster, технологии и создатели которого пригодились в Project Chess, совершил свой дебют именно в том месяце. Многие решили, что статья InfoWorld была про Datamaster, и что в результате журнал всё описал неправильно. Однако люди с хорошими связями уже были в курсе происходящего.
Я выпью твой молочный коктейль
Версия PC-DOS 1982 года
А потом 27 июля 1981 года, менее, чем за две недели до запланированного анонса, Билл Гейтс заключил сделку столетия.
Род Брок из SCP был разочарован. Армия лицензий на 86-DOS, которую он ожидал после заключения сделки с Microsoft, так и не появилась, а теперь он ещё потерял Патерсона, единственного человека, работавшего с ПО в его компании, ориентированной в основном на оборудование. На тот момент уже было очевидно, кто стал единственным покупателем лицензии 86-DOS, но SCP требовались деньги и у неё не было возможности поддерживать ОС. Он попробовал продать 86-DOS, в поисках того, кто захочет заниматься поддержкой системы в обмен на эксклюзивную лицензию. Гейтс немедленно отозвался, предложил так необходимые для SCP $50000, но с одним условием. Он настоял, что Microsoft купит не эксклюзивную лицензию, но саму систему целиком. Затем она выдаст эксклюзивную лицензию самой SCP, что переворачивало всю сделку с ног на голову. Брок сомневался, но деньги ему были нужны, и он не знал, что ему самому делать с 86-DOS.
Он подписал сделку, сделав Microsoft единственным владельцем 86-DOS – а её сразу же переименовали в MS-DOS. Вот вам ещё один пример принятия ужасного финансового решения, очень типичного для ранней истории микрокомпьютеров, когда хакеры, знавшие всё о битах и байтах, и не знавшие ничего о бизнесе, внезапно стали управлять компаниями. Гейтс, казалось, никогда не делал подобных ошибок, и при этом знал, как воспользоваться или даже побудить других на их совершение. Такую невинную овечку, как Брок, было легко отправить на заклание. MS-DOS, приобретённая за $50000, заработала к 1991 году для Microsoft порядка $200 млн. А ещё она стала краеугольным камнем в монополии компании, которая станет доминировать в бизнес-вычислениях к середине 80-х, и практически во всех компьютерных областях к середине 90-х. Это решение больше других способствовало превращению Microsoft в сегодняшнего гиганта.
Но тогда у Microsoft и IBM осталась ещё одна юридическая загвоздка. В то время, как проект IBM PC становился всё более известным секретом индустрии, Гэри Килдалл увидел, как работает 86-DOS/MS-DOS. Он был убеждён, что Патерсон украл его операционку, каким-то образом получив доступ к исходному коду, затем изменил его, чтобы он запускался на Intel 8086/8088, спилил серийники и продал её IBM. Он начал угрожать судом, и (что, вероятно, больше волновало IBM), поднять вой в прессе, способный омрачить грядущий анонс.
Килдал и Гейтс встретились за обедом, чтобы попытаться договориться, но ничего не вышло. «Это была одна из тех встреч, на которых все сначала вежливо говорят друг с другом, затем все орут друг на друга, затем все опять вежливы друг с другом, а потом все опять орут», – вспоминает Джон Катсарос, сотрудник Digital Research, присутствовавший на встрече. Поэтому IBM вмешалась и предложила сделку. Компания будет предлагать версию CP/M-86, совместимую с 8088, которую Digital никак не могла доделать, как только Килдалл предоставит им её готовый вариант. Успокоенный Килдалл согласился.
IBM PC, который с самого начала задумывался, как «машина для всего», теперь будет обладать целыми четырьмя возможностями для работы: BASIC, встроенный в ROM, MS-DOS, CP/M или UCSD Pascal.
12 августа 1981 года
IBM сделала официальный анонс IBM PC 12 августа 1981 года в отеле Уолдорф-Астория в Нью-Йорке. У машины с 16 Кб RAM и одним флоппи-диском рекомендованная цена была $1565. В полной комплектации цена достигала $6000. По таким ценам вы могли бесплатно получить Microsoft BASIC в ROM. MS-DOS, продаваемая по лицензии IBM как PC-DOS, стоила $40, а UCSD Pascal – более $500. IBM также объявила, что в какой-то момент будет доступна и CP/M-86. В итоге пройдёт более шести месяцев, пока Digital, наконец, не выдаст работающую CP/M-86. После этого IBM, как обещала, разместила её в своём каталоге по цене в $240.
Первая версия IBM PC 5150 с принтером, представленная в августе 1981
Килдалл, вплоть до своей смерти уверенный в том, что MS-DOS была пиратской копией CP/M, и иногда заявлявший, что сумеет доказать это посредством встроенного в систему секретного сообщения или необычного атрибута API, считал, что IBM специально назначила для CP/M цену в шесть раз выше, чем для MS-DOS, чтобы её никто не покупал, и, таким образом, выполняла букву, но не дух соглашения. IBM просто заявила, что поскольку Digital потребовали слишком высоких лицензионных отчислений, у неё не было выхода. Три из четырёх вариантов операционок, CP/M, Microsoft BASIC и UCSD Pascal, использовали так редко, что сегодня уже мало кто помнит, что они вообще были доступны в качестве опций. А MS-DOS, понятное дело, отправилась завоёвывать мир.
IBM PC 5150
При этом железо было серым и скучным. Несмотря на необычный для IBM процесс разработки, конечный продукт не сильно отличался от того, что можно было ожидать от IBM. В нём не было никакой творческой жилки, но по клацанью клавиатуры и по большому, крепкому корпусу с большим количеством металла внутри, агрегат выглядел достаточно надёжным. И это было не поверхностное впечатление. Что бы ни говорили, IBM PC был создан на века. Возможно, наименее известной инновацией было использование памяти с дополнительным битом чётности, который автоматически обнаруживал ошибки. Это был первый массовый микрокомпьютер, оборудованный такой защитой памяти, помогавшей избегать редких, но чрезвычайно сложно обнаруживаемых ошибок памяти, которые могли приводить к совершенно непредсказуемым результатам на ранних PC. Проверка чётности в RAM – не та функция, что может возбудить хакеров, но для бизнесмена, жизнь которого зависит от оборудования, это именно такая функция, которая характеризует компанию IBM. Она обеспечивала вам чувство безопасности.
Реклама IBM PC 5150 в печатном издании
Отсутствие творческого начала в дизайне подтверждало предубеждённость хакеров, но для бизнесменов, не доверяющим всяким неряшливым стартапам-выскочкам, появление IBM PC сделало микрокомпьютер серьёзным инструментом, пригодным для серьёзной работы. Менеджеры среднего звена кинулись скупать IBM PC, поскольку ещё никого никогда не увольняли за покупку IBM – даже если раньше этот процесс так сильно никого не радовал. IBM продала 13500 PC за последние два месяца 1981 года, а после этого продажи вообще рванули в космос.
Когда в игру, наконец, вступила IBM, и с октября машины начали поступать покупателям с опережением графика, компаниям, до того присутствовавшим на рынке, оставалось только догадываться, что всё это значит. Джон Роач из Radio Shack не угадал больше других: «Не думаю, что это такое уж значимое событие». Ещё один директор Radio Shack оказался лишь чуть менее близоруким: «Конечно, у нас появился новый конкурент, но IBM не предложила ничего, что могло бы взорвать индустрию».
Apple, уже тогда больше всех понимавшая в связях с общественностью, дала рекламную статью в Wall Street Journal на полную страницу, в которой говорилось: «Добро пожаловать, IBM. Правда.» Как и многие другие примеры рекламы от Apple, это был шедевр риторики, звучащий вроде бы вежливо, и при этом дававший понять, что а) IBM опоздала и б) Apple рассматривает их как ещё одних конкурентов.
Реклама Apple в WSJ:
Добро пожаловать на самый интересный и важный рынок с момента начала компьютерной революции, стартовавшей 35 лет назад.
Поздравляем с вашим первым персональным компьютером.
Отдать все возможности компьютера в распоряжение отдельных индивидов – это значит, улучшить качество того, как люди живут, работают, обучаются, общаются и проводят свободное время.
Когда мы придумали первую персональную вычислительную систему, мы прикидывали, что примерно 140 млн людей смогут оправдать её покупку, если поймут её преимущества.
Мы предположили, что только в следующем году миллион человек придёт к этому пониманию. А в следующем десятилетии рост персональных компьютеров будет логарифмическим.
Мы ждём ответственной конкурентной борьбы в сложной попытке распространить эту американскую технологию по всему миру. Мы ценим сложность взятых вами на себя обязательств.
Потому что мы занимаемся увеличением социального капитала через улучшение продуктивности индивидов.
Добро пожаловать на выполнение этой задачи.
Эпилог
IBM PC 5150 стал настолько успешным, что породил множество вариаций
Много лет спустя станет ясно, что появление IBM PC стало третьей величайшей вехой в истории PC, последовавшей за первыми микрокомпьютерными наборами, появившимися в 1975 году, и троицей (Apple II, PET, TRS-80), вышедшей в 1977. Также оно отметило конец первой эры истории Microsoft, неряшливого, но уважаемого поставщика BASIC, других языков программирования и прикладных программ (в таком порядке). На фоне запуска IBM PC Microsoft быстро оборвала связи с более хакерскими сообществами, среди которых она росла, чтобы крепко прицепить свой вагон к поезду бизнес-вычислений IBM и MS-DOS. На этом пути их ожидало множество эстетических, технических и юридических проблем – но кроме этого, там же ждали и сотни миллиардов долларов.
Начиная с IBM PC XT в 1983, со встроенным жёстким диском
У других игроков в этой истории судьбы сложились сложнее. Seattle Computer Products ещё несколько лет пыталась оставаться на плаву, но сдалась в 1985. У Рода Брока всё же оставалась одна очень ценная вещица. Вы помните, что Брок продал 86-DOS в Microsoft, но взамен получил эксклюзивную лицензию. Когда его компания закрывалась, он решил подзаработать, продав эту лицензию покупателю, который предложит самую высокую цену. Microsoft, увидев возможность того, что внезапно Radio Shack, Compaq или даже IBM смогут продавать машины с установленной MS-DOS и ничего ей за это не платить, задним числом установила, что эта лицензия продана без права передачи. Это вылилось в сложную юридическую баталию, одну из первых, ждавших Microsoft на её пути. В результате Брок не продал свою лицензию, но получил в качестве примирения чек на сумму в $925000, которого ему вполне хватило.
Потом был IBM PC AT в 1984, с новым ЦП 80286
Естественно, самым большим неудачником в этой истории остался Гэри Килдалл. Однако это вопрос интерпретации и точки зрения. Digital Research потеряла своё первое место в мире бизнес-вычислений, но годами продолжала оставаться жизнеспособным и достаточно неплохо зарабатывающим поставщиком ПО и нишевых ОС. Килдалл прославился, как один из ведущих шоу Computer Chronicles на PBS, немного взъерошенным, вежливым, и интересным для телезрителей, относившихся к породе нёрдов. В итоге в 1991 году Digital купила Novell, что позволило Килдаллу удалиться на покой в качестве миллионера. Так что для неудачника он довольно неплохо кончил. Килдалл всегда больше интересовался технологиями, чем бизнесом, и он не смог бы стать Биллом Гейтсом. Гейтс, возможно, и выиграл, но, вероятно, Килдаллу было гораздо интереснее работать.
IBM PCjr, первая попытка компании прорваться на рынок домашних компьютеров, 1984
Хотя IBM PC отметил окончание эры, и начало новой, эти эры лучше видны задним числом, чем в момент их существования. Сразу после его запуска мало что сразу изменилось для счастливых пользователей Apple, Commodore, Atari и Radio Shack. IBM при разработке PC представляла себе машину как подходящую для чего угодно, включая и конкуренцию с упомянутыми компаниями – отсюда и BASIC в ROM, вариант с поддержкой кассет, и даже требование о возможности присоединения его к телевизору. IBM даже договорилась о возможности продаж через популярную сеть Sears. И всё же машина была достаточно дорогой даже в простейших вариантах, и ей не хватало основы из казуального софта (в основном, игр) и таких приверженцев, какие были у её конкурентов. Также были малопривлекательными её возможности в графике и звуке (и удивительно, что они вообще были), особенно по сравнению с новой машиной Commodore 64, вышедшей в 1982-м.
Commodore 64 удерживал IBM PC от завоевания рынка домашних компьютеров. Некоторое время.
Так что, хотя бизнес-сообщество удивительно быстро потянулось к IBM и MS-DOS, мир домашних вычислений, любителей хобби и образовательных компьютеров оставался достаточно раздробленным ещё много лет. В результате, конечно, MS-DOS победит – но это займёт больше десятилетия, вместо нескольких месяцев, что позволит расти и процветать самым живым и интересным компьютерным культурам.
- История IT
- Старое железо
IBM PC своими руками — это очень просто
После того, как я воплотил свою давнишнюю мечту и все-таки (хотя и с опозданием почти на 30 лет) построил Радио 86РК, некоторое время мне казалось, что на этой части моей истории поставлена вполне достойная точка.
Тем не менее, обнаружилось, что болезнь до конца не вылечена, и она вернулась еще более острым рецидивом. Наверное, сказались как неожиданно успешный опыт постройки 86РК, так и то, что у меня в ходе данного процесса образовалось довольно большое количество весьма притягательно выглядящих инструментов, приборов и деталей, которым очень хотелось найти применение.
В конце концов ломка стала нестерпимой, и мне пришлось снова взяться за паяльник, а также вспомнить некоторые другие навыки из прошлого. Что из этого получилось, можно увидеть вместе с некоторым количеством картинок и очень (повторяю – ОЧЕНЬ) большим количеством букв (и даже не букв, а страниц) дальше…
Основным вопрос был в том, что именно делать. С одной стороны, душа лежала к чему-то совсем раритетному, с другой стороны хотелось также попробовать новые технологии. Находясь в тяжелых раздумьях, я периодически просматривал пару тематических форумов, посвященных старому «железу». В какой-то момент я натолкнулся на долго тянущуюся тему о том, как запустить 8086 процессор с минимумом обвязки. Странно было то, что тема обсуждалась больше года, но в практическую плоскость так и не передвинулась.
На мой неискушенный взгляд казалось, что задача вообще пустяковая, но вдруг там есть что-то, что я вообще не понимаю? В результате я решил попробовать поиграться именно с этим в надежде, что данное развлечение – именно то, что мне нужно для полного счастья.
Схему для себя я даже рисовать не стал – вроде все настолько просто, что вопросов, куда что подключать, не возникало. Оставалось только решить, каким способом это все собирать. С МГТФ я достаточно поигрался раньше, хотелось чего-то новенького. Так как все новое – это забытое старое, то я прикупил инструмент и материалы для монтажа накруткой и взялся за процесс. Который (процесс), к сожалению, особо никуда не пошел… Либо руки у меня совсем из неправильного места растут, либо что-то понял неправильно, но добиться устойчивой скрутки так и не получилось.
Впрочем, мучился я недолго (хотя, может именно в этом и была основная причина ?) – в процессе перекладывания моих сокровищ с места на место обнаружилась нераспечатанная беспаечная макетная плата с кучей очень красивых разноцветных проводков. Сложность (вернее, отсутствие таковой) проекта вполне позволяла без труда разместить все на этой плате, что я довольно оперативно и сделал:
Была написана суперпрограмма размером в десяток байт, реализующая не имеющую мировых аналогов функцию – мигание светодиодом. При первом включении ничего не заработало, но обнаружилось, что проблема только в запуске тактового генератора. Мне было лень ставить указанные в документации конденсаторы/резисторы возле кварца, поэтому иногда для запуска генератора требовалось коснуться корпуса кварца пальцем или отверткой, после чего светодиод начинал исправно мигать.
Кстати, меня немного удивила частота мигания – я уже забыл, насколько этот процессор был медленный. При максимально допустимой для оригинального 8088 тактовой частоте в 5МГц цикл в 65536 «пустых» операций выполнялся порядка секунды…
Опубликовав результат своего творчества на соответствующем форуме, я тут же был обвинен в том, что обсуждалось подключение 8086, а у меня же 8088, что намного проще и вообще!
Ладно, практика – критерий истины. Раздобыл 8086, потратил еще чуть-чуть времени (в основном, чтобы разнести вручную программу в две микросхемы ПЗУ, так как 8086 16-разрядный, а ПЗУ у меня были 8-разрядные) и получил очередную мигалку:
Апетит, как известно, приходит во время еды. Вот и у меня, вместо удовлетворения от достигнутого, возникло желание двинуться дальше. Только тут уже совсем настойчиво утвердилась мысль, что нужно также опробовать и современные технологии. В качестве примера современных технологий было принято решение использовать FPGA в комбинации с 8088 процессором. Одним махом можно было убить нескольких зайцев – база (процессор) знакомая, технологии FPGA вполне современные, особо тратить время на монтаж не нужно, так как все творчество можно перенести внутрь FPGA.
У меня уже имелась одна из самых навороченных отладочных FPGA плат – Terasic DE2-115, на которой, кроме довольно большой FPGA Altera Cyclone IV, также установлено немереное количество прибамбасов, свисталок и мигалок:
В частности, кроме штатных GPIO в количестве 36 плюс еще несколько штук, на этой плате также находится разъем расширения, к которому можно подключить небольшую плату и получить в общей сложности около 100 GPIO, что должно хватить для практически любого мыслимого применения (разумеется, в моих скромных целях).
Правда, есть нюанс – процессор 8088 5-вольтовый, а вот FPGA уже давно отказались от поддержки TTL 5V, максимум, что есть – LVTTL 3.3V
Хорошо, что есть широкий выбор преобразователей уровней, что и решено было использовать. Вначале остановился на микросхеме TXB0108 – 8-разрядный двунаправленный преобразователь уровней с автоматическим выбором направления. Автоматический выбор направления был довольно важен, так как позволял не думать о том, что происходит на шине данных – чтение или запись. Кроме того, шина данных в 8088 мультиплексирована с 8 младшими разрядами адресной шины, что еще добавляет сложности в определении того, в каком направлении нужно передавать сигналы – от процессора или к нему.
Так как TXB0108 довольно маленькая, да и возиться с проводами уже не очень хотелось, решил попробовать еще одну новую для меня вещь. Была куплена программа Eagle для разводки печатных плат, и начались мои мучения как с освоением нового программного продукта вообще, так и с весьма специфическим интерфейсом Eagle в частности.
Делать что-то в первый раз в новой для себя области лично для меня очень мучительно – тыкаешься, как слепой котенок, а душа рвется на просторы. Подготовка gerber-файлов для производства платы (да, о ЛУТе думал, и даже материал купил, но не решился) вообще чуть не вызвала нервный срыв – сразу представлялось, как все производство стоит и хохочет, глядя на жалкие результаты моих трудов…
Хорошо, что плата была совсем уж простая, поэтому не прошло и недели (вместе со временем изготовления), как я уже держал в руках свежеспаянное творение:
Кстати, для пайки преобразователей уровней я испробовал жало «микроволна» от Ersa (естественно, есть подобное и у других производителей, да и самому такое можно сделать). Должен заметить, работает довольно неплохо, так что трудоемкость пайки была на порядок меньше, чем можно было бы ожидать при таких размерах выводов.
За время, пока плата изготавливалась, я ускоренными темпами осваивал FPGA. Вообще отладочную плату я изначально купил, чтобы поразвлекаться немного с FPGA технологиями и, в частности, с VHDL, но это у меня конкретно не пошло. Мозг просто отказывался мыслить категориями VHDL, и максимум, что я сделал – повторил в FPGA несколько простых устройств, скопировав их схемы методом схемного дизайна. Изучение же VHDL закончилось на уровне signal3
Тут тоже решил все делать с помощью схемного дизайна. И вообще – нафига все эти HDL’ы, когда так просто мышкой нарисовать схему, и все работает? В тот момент мне это казалось и правильнее, и удобнее. Соответственно, нарисовал в Quartus’е все ту же мигалку, только пришлось еще сделать аналог тактового генератора 8284 (на макетке он у меня был в «железном» виде). К счастью, в документации нашлась полная внутренняя структура этой микросхемы, так что с этим проблем не возникло. Хотя один нюанс обнаружился – в документации от Intersil (производитель устаревших микросхем) внутренняя структура 8284 была нарисована с ошибкой (инверсный выход вместо прямого, или наоборот – уже не помню). Правда, ошибку отловил еще при рассмотрении схемы, но сам факт очередной раз натолкнул на мысль, что нужно руководствоваться оригинальными документами.
Далее было сгенерировано ПЗУ с соответствующей программой, моя плата с процессором подключена плоским шлейфом к отладочной плате, и наступил момент истины – загрузка прошивки в FPGA. К сожалению, светодиод после этого не замигал… После короткого разбирательства выяснилось, что я подал 0 на один из входов процессора, тогда как там должна быть 1. Данное недоразумение легко исправилось перерезанием дорожки и пайкой перемычки. После этого светодиод мигнул, но так и застыл в горящем состоянии…
И вот тут пошли настоящие разборки. К сожалению, скажу сразу, что причину нестабильной работы схемы я так и не понял. Почти уверен, что это связано с нечетким определением направленности сигналов через преобразователи уровней (хотя бы потому, что больше там нечему неправильно работать). Светодиод мог помигать какое-то время, а потом вообще в полный отказ, затем снова начать работать безо всякой закономерности.
Все мои тыканья с осциллографом не показали ничего, что могло бы натолкнуть на истинную причину, поэтому мне пришлось задуматься о путях кардинального решения проблемы – останавливаться в этом месте не позволяло самолюбие. Так как «самоопределяющиеся» преобразователи оказались под большим вопросом, решил обратиться к более проверенному решению – 74LVC8T245, преобразователи уровня с «ручным» управлением направления передачи сигнала.
Кроме того, также решил расширить задачу и сделать все по максимуму, в буквальном смысле – запустить процессор в максимальном режиме. В данном режиме процессор не является единоличным владельцем системной шины, и может отдавать ее другим устройствам (типа DMA и т.д.). Именно в таком режиме 8088 работает, в т.ч., и в IBM PC совместимых компьютерах. Для работы в максимальном режиме необходимы определенные сигналы, которые обычно формируются с помощью контроллера шины 8288. Теоретически, эти сигналы можно было сформировать внутри FPGA, но у меня не возникло полной ясности после довольно внимательного чтения документации по 8288, поэтому было принято решение использовать «железный» 8288, наряду с таким же 8284 (гулять так гулять !). В результате получалось гарантированно работающее (как мне казалось) ядро, вокруг которого уже можно было строить все, что угодно.
В процессе обдумывания схемы очередной раз пришел к выводу, что понять направление передачи на шине адреса/данных – не совсем тривиальная задача (именно из-за этого, если помните, изначально пробовал использовать «самоопределяющиеся» преобразователи уровней). Сначала кажется, что все предельно просто, и для этого есть практически готовые сигналы, но при более внимательном рассмотрении выясняется, что все далеко не так (особенно, если принять во внимание возможные временные разбросы сигналов и пытаться четко вписаться в них). Поэтому пошел по не самому элегантному, но зато железно работающему варианту – для младших 8 линий адресов выделил отдельный преобразователь уровня, работающий в одном направлении (от процессора) вместе с защелкой (с ней, защелкой, слегка погорячился – можно было внутри FPGA делать), а параллельно к этому на эти же линии поставил еще один преобразователь, чье направление уже управлялось соответствующим сигналом от 8288 (если говорить только о данных, без оглядки на адрес, то там все однозначно).
Правда, из-за того, что полярность сигнала направления была инверсна к тому, что требовалось для преобразователя, пришлось задействовать еще инвертор из 7400. Зато на схеме появилась знаменитая 7400, она же ЛА3, без которой в свое время не обходилось ни одно цифровое устройство.
Очередной раз, пока плата находилась в изготовлении, я рисовал в Quartus’е схему своего суперкомпьютера. В отличие от предыдущего варианта, тут я уже решил добавить нормальную дешифрацию адресного пространства, разделить память и ввод/вывод, а также задействовать ОЗУ. Мало того, вместо мигающего светодиода я сразу замахнулся на целый 7-сегментый индикатор, который должен был увеличивать свое значение по кругу!
Как раз к моменту завершения рисования схемы платы были доставлены, распайка заняла совсем немного времени, и все было готово к загрузке прошивки:
На этот раз, как ни странно, все заработало практически с «полу-тыка». Единственное, что меня удивило и насторожило, так это температура процессора. Он реально нагревался так, что через некоторое время на нем с трудом можно было удерживать палец. Попытки посмотреть осциллографом, нет ли каких-либо конфликтов на шинах, привели только к появлению дополнительных вопросов, поэтому я обратился к одному из профессиональных форумов по электронике.
Тут нужно сделать некоторое отступление. Я никогда не занимался электроникой профессионально, и никакого образования в этой сфере у меня нет. Мало того, даже с любительской точки зрения у меня в этой области был перерыв около 20 лет (да и до того опыт был довольно узким). Соответственно, очень много я не знал вообще, а многое из того, что знал, то понимал в идеализированном виде. В частности, сигналы в цифровой схеме строго прямоугольные и т.д. Не, я, конечно, понимал, что это не так, но практически такое понимание применить не мог.
Так вот, на том форуме мне открыли глаза на некоторые вещи, которые для многих покажутся прописными истинами, но для меня оказались неожиданностью. Например, мне показалась странной форма тактового сигнала, приходящего на процессор с чудовищным по амплитуде «звоном»:
Оказалось, что этот самый сигнал выглядит совершенно по другому, если всего-навсего «землю» брать не там, где брал ее я (на другом конце отладочной платы, как удобнее), а непосредственно у приемника сигнала (процессора):
Вроде мелочь, но, на мой взгляд, именно из таких мелочей и формируется истинное понимание многих процессов…
Кстати, по поводу оборудования, на котором сделана эта картинка. В ходе возни с 86РК у меня появился совсем неплохой портативный осциллограф Fluke, но почему-то к нему у меня сразу душа не легла. Почему – не знаю, не то, и все… Так что новый проект оказался хорошим поводом к приобретению нового осциллографа. Загоревшись идеей, иногда я принимаю поспешные решения. Так и случилось в этот раз. Вместо детального изучения предмета я заимел первое понравившееся устройство – Tektronix MSO3012. Нет, ничего плохого об аппарате я сказать не могу, наоборот – реально удобный интерфейс, куча полезных функций, практически полноценный 16-канальный анализатор цифровых сигналов, возможность просматривать сигналы в виде логической шины, подключение к компьютеру как напрямую, так и через сеть и т.д. Просто всегда хочется большего, и можно было бы выбрать более современную серию – MDO, которая ко всему прочему предлагает еще и встроенный генератор произвольных сигналов. А так инструмент очень крутой – мне аж завидно тем, кто использует подобное оборудование для решения реальных задач, а не для примитивных поделок, как в моем случае…
Возвращаясь к перегреву процессора – на форуме меня убедили, что для данной микросхемы такая температура совершенно нормальна (просто энергопотребление большое). Окончательно я успокоился после того, как поменял процессор на изготовленный по более современной технологии, и он после этого оставался совершенно холодным в течение всего процесса.
Получив в свое распоряжение 8088 с (потенциальной) кучей периферии, у меня совсем уж зачесались руки попрограммировать что-то посложнее управления 7-сегментым индикатором. Правда, встал вопрос о нормальной интегрированной среде для программирования на ассемблере реального режима (единственный язык, который я знал). И вот тут меня ждал большой облом. Если для 8080/Z80, а также для всех современных контроллеров есть масса как бесплатных, так и коммерческих IDE со всеми мыслимыми и немыслимыми прибамбасами, то для x86 не нашлось вообще ничего приличного. Были какие-то заброшенные любительские проекты, и все. Причин этому можно придумать несколько, но факт остается фактом. В конечном итоге, остановился на WinAsm (первое, что у меня хоть как-то заработало), который полноценным IDE назвать вряд ли можно (в первую очередь, из-за отсутствия отладчика), но хоть что-то (типа компиляции прямо из редактора) он позволял делать. В качестве отладчика на тот момент решил использовать старый заслуженный Turbo Debugger, запускаемый в DosBox.
Первым делом мне захотелось получить для своего устройства нормальный способ отображения информации, т.е. видеоадаптер. Хотя в куче мест (в т.ч. и на Хабре) можно найти статьи на тему «Как самому написать видеоадаптер на HDL за 5 минут», сделать свой модуль для меня было просто недостижимой мечтой. Поэтому я залез на широко известный opencores.org и нашел там самый простой алфавитно-цифровой VGA видеоадаптер, да еще и на VHDL (бОльшая часть проектов на opencores написана на Verilog).
Хотя данный модуль был практически законченным устройством, тем не менее, для работы с моей отладочной платой требовалась некоторая доработка (связанная, в первую очередь, со спецификой цифро-аналоговой части VGA-интерфейса DE2-115). Вооружившись моими зачаточными знаниями отдельных выражений VHDL, а также (в основном) методами научного тыка и последовательных приближений, в конце-концов удалось сделать что-то, что вроде отвечало моим потребностям, и компилировалось без ошибок.
К этому моменту я уже начал более-менее ориентироваться в схемном дизайне, так что преобразовать далее модуль видеоадаптера в символ и вставить в свою схему труда не составило. Сначала в качестве видеобуфера я использовал сгенерированное внутри FPGA ПЗУ с заранее записанным тестовым сообщением. Довольно быстро я увидел это сообщение на экране VGA монитора, после чего можно было менять буфер на ОЗУ. В этот момент в очередной (и далеко не последний) раз я ощутил всю прелесть FPGA. В видеоадаптерах всегда есть конфликт между необходимостью непрерывно читать видеобуфер для вывода его на экран, и потребностью процессора записывать в этот же буфер данные (а иногда и тоже их читать). Решается задача по разному, но, в любом случае, это далеко не самый простой узел (как минимум, для меня). А вот при наличии FPGA все сделалось элементарно – я просто сгенерировал двухпортовое ОЗУ, у которого было два комплекта шин адреса и данных. Процессор, естественно, подключался к одному порту, видеоадаптер – ко второму. Что там происходило внутри ОЗУ, и как убирались конфликты при одновременном обращении к одной и той же ячейке памяти – это были проблемы Altera, но никак не мои.
В качестве основного ОЗУ использовал имеющуюся на плате статическую RAM объемом 16х1M (в смысле, 1024К 16-битных слов). В качестве ПЗУ все так же использовался ROM, сгенерированный внутри FPGA – хотя на отладочной плате есть flash-память более чем достаточного объема, но для отладочных целей намного удобнее использовать встроенную память, тем более, что недостатка ее я не испытывал.
Итак, у меня неожиданно появилась вполне рабочая система на 8088 процессоре с видеадаптером, кучей (относительной) памяти и множеством разъемов для подключения к чему угодно. Все это явно напрашивалось на то, чтобы сделать с ним еще что-нибудь.
В голове очередной раз стала появляться мысль, которую я уже несколько раз упорно отгонял – «Может, DOS . ». И в какой то момент, попав на пик самоуверенности, я сдался… Итак, будем пробовать запускать MS-DOS!
Очевидно, для запуска DOS мне нужно будет реализовать необходимые функции BIOS, но что скрывается под словом «необходимые»? В принципе, я знал, где найти максимальный минимум (или минимальный максимум ?) функций – а именно в первой версии BIOS’а для IBM PC. Так как уже на этом BIOS’е должны были работать все версии DOS, то в любом случае можно было бы ограничиться только его функциями. Найти исходники BIOS в интернете труда не составило, а беглый просмотр показал, что ничего особо загадочного там нет. Фактически, нужна была работа с клавиатурой INT 16h, видеоадаптер 10h, диск 13h и еще несколько простейших функций типа возврата объема доступной оперативной памяти, которые реализовывались буквально несколькими строчками ассемблера.
Первым делом в глубинах интернета был найден VHDL модуль для работы с PS/2 клавиатурой и внедрен (все тем же схемным дизайном) в мою схему. С контроллером прерываний было решено пока не заморачиваться, так как клавиатура на этот момент планировалась единственным источником прерываний.
Итак, можно было приступать к написанию обработчика INT 09h – прерывания клавиатуры. И тут меня ждала очередная засада. В позапрошлой жизни я довольно серьезно программировал на x86 ассемблере, но это было так давно, что почти все тонкости из головы улетучились вчистую. Нет, ясно, что mov и cmp забыть сложно, но все сложнее этого давалось с огромным трудом. Для меня нет ничего хуже, чем делать то, чего уже когда-то делал, и обучение чему-то не является исключением. Особенно если помнишь, что когда-то был довольно крут в чем-то, а сейчас не можешь сказать ни бе, ни ме… Пришлось, стиснув зубы, скачать какой-то учебник по ассемблеру и в экспресс-режиме его прочитать.
Естественно, вспоминать легче, чем начинать с нуля, но мои программы, особенно вначале, мягко говоря, элегантностью не отличались. Приблизительно как попытка пересказать Шекспира на английском языке, пользуясь словарным запасов в сотню слов и двумя временами…
Тем не менее, довольно быстро минимальный набор INT 09/16 заработал, а за ним и была сделана поддержка нескольких основных функций INT 10h для вывода символов на экран. Можно было приступать к намного более сложной вещи – работе с диском.
Естественно, поддерживать реальный жесткий диск я не собирался. Идея была в том, чтобы эмулировать жесткий диск через работу с SD-картой, тем более, что на отладочной плате был разъем для такой карты. С образом диска проблем не возникло – чтобы не ходить далеко, я взял образ диска для уже упоминавшегося здесь проекта zet.aluzina.org
С поддержкой же работы SD-карты возникло сразу два больших вопроса – аппаратная поддержка шины SPI и протокол взаимодействия с самой картой.
В принципе, SPI можно реализовать полностью программно, но мне хотелось поразвлекаться и с «железом» тоже, поэтому я героически принялся за рисование приемо-передатчика байта в схемном дизайне. К моему удивлению, ничего сложного в этом не оказалось, и довольно скоро я уже наблюдал на экране осциллографа резво бегающие 8-битовые пакеты, содержащие именно то, что мне хотелось. Кстати, тут я впервые оценил возможность нового осциллографа не просто показывать кучу сигналов, а еще и объединять их логически в соответствующую шину. Намного приятнее видеть, что осциллограф понял, что передается именно байт A5, а не вручную смотреть, в нужных ли местах находятся переходы с 0 в 1 и наоборот.
С протоколом общения с SD-картой было слегка сложнее, но не намного. В интернете есть куча ресурсов, где все тщательно разжевывается, поэтому поиск необходимой информации не составил большого труда. В принципе, практически все необходимое по этому поводу в суперконцентрированном виде можно найти здесь — nada-labs.net/2010/using-the-buspirate-with-a-sd-card
Для упрощения задачи я не пытался подстраиваться под все типы и разновидности карт, а ограничился оригинальной SD (не SDHC или еще какие-то варианты) картой. Немного программирования, и вот уже на экране стало отображаться содержимое 0-го сектора карты. Сразу после этого привел эти функции в некоторое подобие INT 13h, добавил в зачаточном виде INT 19h (boot load) и увидел на экране следующее:
Так как в тот момент при чтении всегда считывался только 0-ой сектор, то начальный загрузчик (находящийся как раз в этом секторе), не находил ОС для загрузки, о чем и сообщал. Но это уже мелочи – главное, что моя схема потихоньку начала превращаться в настоящий компьютер и уже даже пыталась загрузиться!
Далее пошла борьба с пересчетом физических секторов в логические блоки. Тут я тоже схалявничал и вместо определения параметров (образа) диска просто жестко забил цифры для конкретного экземпляра образа. С этой частью пришлось повозиться – вычисления почему-то приводили к совершенно неожиданным результатам (вообще никогда не любил арифметику на ассемблере). Тем не менее, после некоторых мучений физические сектора/цилиндры/головки стали исправно переводиться в логические блоки, и пришло время попробовать загрузиться уже по серьезному.
Естественно, сразу загрузка не прошла, да я и не ожидал этого. Заранее зная, что у меня в BIOS’е не реализована куча функций, я поставил на все прерывания заглушки, и при обращении к нереализованной функции на экран выводилась вся необходимая информация – к какому прерыванию и с какими аргументами обращаются. Далее шел процесс написания обработчика соответсвующей функции (а еще чаще – просто временной заглушки), и процесс продолжался. Неожиданно все остановилось на функции, которая вообще отсутствует в оригинальной PC – одна из функций INT 2F, связанную с обработкой событий. Я видел, что DOS определяет тип PC, и вроде не должна вызывать прерывания, отсутствующие на данном типе, но, тем не менее, это происходило, и процесс останавливался. Простая заглушка не помогла, а всю функцию реализовывать не хотелось из принципа.
Сейчас уже не помню весь ход мыслей (очень много чего смотрел в тот момент в исходниках DOS и в процессе загрузки), но в очередной раз на данном «зависании» я решил вызвать кучу прерываний (в тот момент у меня был отключен таймер на INT 08h) и нажал клавишу Shift. Неожиданно случилось чудо:
Скажу честно, эмоций на меня нахлынуло довольно много – проделать путь от макетки с парой микросхем до загрузки DOS за месяц, да еще и короткими набегами (из-за хронической нехватки времени) вроде довольно круто (извините за хвастовство)!
Кстати, с этим сообщением у меня есть до сих пор неразгаданная загадка. Дело в том, что после доделки прерывания таймера DOS стала загружаться без зависания в данном месте, но вот сообщение о копирайте Microsoft почему-то не выводится. Вроде оно также не выводится и на настоящем компьютере (к сожалению, попробовать не на чем). В чем тут первопричина – тайна, покрытая мраком. Я пытался понять логику по исходным кодам DOS, но сходу не увидел, а много времени тратить не захотел. Тем не менее, вопрос все еще мучает потихоньку…
После запуска DOS пришла очередь позапускать другие программы. Наверное, можно догадаться, чья очередь была первой – естественно, как говорят, старый добрый Norton Commander. Как ни странно, возни с ним было заметно больше, чем с DOS’ом. NC при запуске вызывал дикое количество функций, причем в ряде случаев обойтись простыми заглушками не удавалось, приходилось писать хотя бы минимум функциональности.
Тем не менее, проблемы были больше количественные, чем качественные, и вскоре удалось довести процесс загрузки NC до логического завершения:
Такой «интересный» внешний вид обусловлен несколькими причинами:
— видеоадаптер не поддерживал на тот момент атрибуты
— у меня не было второй части знакогенератора, в которой содержиться псевдографика, поэтому в соответствующих местах оказались символы из нижней части кодовой таблицы
— не были реализованы некоторые функции INT 10h.
Вообще меня периодически удивляло, каким именно образом реализованы те или иные функции в различных программах (и даже в DOS). Например, команда CLS (очистка экрана) вызывала функцию INT 10h, вызывающую сдвиг окна вверх. При этом в качестве окна указывалась вся доступная экранная область, и сдвигалась она на количество строк, равное количеству строк на экране. Так как я не ожидал, что функции работы с окнами вообще кто-то использует, то и не спешил их реализовывать. Результат оказался налицо (вернее, на экране). Впрочем, к странностям некоторых программ еще вернемся немного дальше…
После запуска NC у меня возникло естественное желание привести его в божеский вид. Тем более, что такая часть работы иногда даже более приятна, чем попытки завести вообще мертвое устройство. С псевдографикой особых проблем не было – просто довольно много времени на ручное рисование символов (знакогенератор у меня был прямо в виде VHDL кода). А вот с атрибутами пришлось немного напрячься.
Еще раньше, по ходу процесса, я стал применять некоторые элементы VHDL. Сначала практически насильно – все-таки было желание еще раз попробовать освоить этот язык, а потом и потому, что в определенных случаях это оказывалось удобнее, чем использовать схемный дизайн. Даже в самом видеоадаптере мне пришлось вникнуть в код – изначально поддерживалось 43 (или что-то около этого) строки, мне же нужно было переделать на 25 строк. И поддержку атрибутов я сначала попытался сделать схемным дизайном, но вдруг стал осознавать, что вроде использовать VHDL для этого может оказаться проще. Естественно, все двигалось с большим трудом и использованием самых простых конструкций языка, но я вдруг начал понимать суть VHDL – пока еще совсем чуть-чуть, но уже достаточно, чтобы начать на нем что-то осознано создавать, а не просто модифицировать уже имеющееся.
Моя возня с VHDL не прошла даром, и через некоторое время я смог увидеть что-то давно и хорошо знакомое:
Да, там еще можно было заметить некоторые недоделки (типа сдвинутого на один символ атрибута), но в целом цветной текстовый режим 80×25 заработал так, как должен.
Следующим на очереди стоял контроллер прерываний 8259. Сначала возникла мысль попытаться использовать уже имеющийся из какого-то проекта, но ни один из них мне по разным причинам не понравился (либо слишком примитивные, либо, наоборот — я не понимал, как они работают, а документация отсутствовала). Была даже попытка купить коммерческую IP (в данном случае IP это не Internet Protocol, а Intellectual Property), но производители не хотели заморачиваться с продажей целой одной штуки…
В конечном итоге пришлось взяться за листик бумаги и набросать нечто типа (блок)схемы контроллера, которую потом начал реализовывать на VHDL. За полной совместимостью не гнался – мне нужна была (на данном этапе) поддержка одного основного режима приоритетных прерываний, возможность маскировать прерывания (также читать маску прерываний) и выполнять команду EOI (End Of Interrupt). На мой взгляд, этого должно быть достаточно, чтобы подавляющее большинство программ с этим нормально работали. Забегая вперед, скажу, что и по настоящий день я не обнаружил ни одной программы, которая пыталась бы сделать с контроллером прерываний что-то свыше заложенной мною функциональности.
Наверное, контроллер прерываний был моим первым настоящим (пускай и маленьким) проектом на VHDL – от начала и до конца. Писал я его тщательно, не поленился даже (опять таки впервые в своей жизни) сделать test bench (не уверен, как правильно перевести на русский – фактически, последовательность сигналов для проверки правильности функционирования устройства). Моделирование в симуляторе ModelSim показало вроде полную работоспособность контроллера, после чего из него был сгенерирован очередной графический символ и добавлен в мое устройство.
Нормального таймера 8254 у меня еще не было, для генерации прерываний 18.2 Гц использовался обычный счетчик, который я и подключил к контроллеру прерываний. Поведение компьютера показало, что вроде все работает – DOS загрузился без необходимости нажимать на клавишу, а в NC наконец-то пошли часы. Казалось, пройден очередной этап, и можно смело двигаться дальше.
Как оказалось, рано я радовался – в этот момент обнаружилась, пожалуй, самая большая проблема во всем проекте. Если кто помнит, у NC есть встроенная экранная заставка – «звездное небо». Оставив мой компьютер на некоторое время, после возвращения к нему я обнаружил, что звезды на заставке почему-то застыли, проще говоря, компьютер завис. Хотя я понимаю, что таких случайностей не бывает, мне все-таки хотелось верить в чудо – в то, что это единичный случай. К сожалению, как всегда, чуда не случилось – после полного сброса и перезагрузки компьютер снова подвис после часа или около того работы. Стало однозначно понятно, что где-то есть проблема, причем очень труднонаходимая.
Чтобы максимально сузить круг поиска, я написал простейший тест памяти, который запускался сразу после сброса процессора, без инициализации всех ненужных устройств типа таймера и т.д. В принципе, индикацию ошибки памяти я воспринял с облегчением – по крайней мере, проблема была явно в железе. Осталось дело за малым – понять, в каком именно месте. И вот с этим оказалось все совсем не просто.
Дело в том, что вообще схема, задействованная в процессе тестирования памяти, по своей сути довольно примитивна. Задействован минимум логики, кроме процессора нет никаких других сложных программируемых элементов. В результате после какого-то времени, затраченного на анализ схемотехники, у меня появилась более-менее уверенность в том, что дело не в принципиальной ошибке в схеме, а в чем-то более случайном – например, в помехах.
С этой стороной схемотехники у меня вообще все было плохо. Я знал, что нужно ставить побольше блокирующих конденсаторов, и что длинные провода – это вроде плохо. На этом мои познания заканчивались. Поэтому за советом я снова обратился на один из профессиональных форумов. Советов мне надавали много, иногда было сложно отделить действительно толковые советы от советующих по принципу «скажу все, что хоть немного знаю на эту тему». Расписывать здесь все это не буду – слишком много всего обсуждалось, так что это может быть темой отдельной статьи. По результатам обсуждений моя плата обросла почти двумя десятками блокировочных конденсаторов и полностью потеряла изначальный более-менее гламурный вид.
К сожалению, очередной запуск теста показал, что проблема не ушла. Возможно, она стала проявляться чуть реже, но это сказать трудно – и раньше сбой мог возникнуть то через 20-30 минут, то через несколько часов. Сейчас же, как минимум, оставленная на ночь плата утром оказывалась гарантированно сбойнувшей. В отчаянии я снова вернулся к анализу схемотехники и еще более внимательному изучению диаграмм работы шин процессора. В одном месте у меня возникла определенная мысль, и я опять пошел на тот же форум. В ходе обсуждения моей идеи я в очередной раз получил порцию полезных (а иногда и не очень) советов, попробовал реализовать некоторые вещи (в первую очередь, связанные с небольшой задержкой некоторых управляющих сигналов), но на наличие сбоев это не повлияло вообще никак.
В конце дороги отчетливо вырисовывался конкретный такой тупик, поэтому я начал проверять вообще бредовые идеи. В частности, не сбоит ли сама микросхема памяти? Для проверки я сгенерировал прямо внутри FPGA модуль RAM, который и использовал вместо внешней памяти. Честно говоря, на результат я не надеялся – просто делал все, что приходило в голову. Но представьте мое удивление, когда после этого сбои вдруг исчезли! Вообще я даже как-то не был готов к этому, поэтому не совсем понимал, как использовать это знание. В то, что микросхема памяти неисправна, не верилось даже в этот момент. Также была почти полная уверенность, что я работаю с этой микросхемой правильно – по управляющим сигналам там все проще простого. Но факт оставался фактом – с микросхемой сбой гарантированно происходил не позже, чем через несколько часов теста, с внутренней памятью все проработало без сбоев несколько дней, пока мне не надоело.
Для очистки совести я все же решил потестировать память полностью другой схемой, без использования моей процессорной платы. В процессе обдумывания, как это лучше сделать, мне вдруг в голову пришла мысль – я понял единственное существенное отличие между использованием внутренней и внешней памяти. Дело в том, что внешняя память была асинхронная, а внутренняя – частично синхронная, и для нее дополнительно требовался сигнал, по которому во внутреннем буфере защелкивался адрес ячейки, к которой происходило обращение.
Я вообще не понимал, как это может относиться к проблеме случайных сбоев – по всем диаграммам было совершенно однозначно понятно, что у меня адрес держится намного больше, чем минимально необходимо для памяти, поэтому, теоретически, это не могло быть причиной. Тем не менее, я тут же нарисовал в Quartus’е еще один регистр, подал на него адрес и защелкнул его тем же сигналом, который использовался для внутренней памяти. Выход регистра, естественно, подал на адресные линии внешней памяти. Понимая, что делаю полную чушь, я запустил тест. И тест отработал успешно до тех пор, пока я его не выключил на следующий день. Далее еще пару раз с регистром и без – совершенно четко было видно, что наличие регистра убирает сбои полностью.
Это было совершенно необъяснимо – даже на осциллографе я видел, что адресные сигналы и так держатся больше, чем это в принципе может быть нужно, но факт оставался фактом. После целых выходных разборок я плюнул на это и решил смириться с этим, как с данностью…
Итак, DOS грузилась, многие программы, не требовавшие графического режима, запускались, можно было двигаться дальше. Естественно, возникло желание запустить какую-то игрушку. Но для игрушки, как правило, требуется графика, а ее у меня пока не было. И если для текстового видеоадаптера удалось обойтись малой кровью путем переделки существующего, то для графики с этим было не так просто.
Дело было даже не в отсутствии готовых решений. Проблема была в том, что мне нужна была практически полная совместимость со стандартным видеоадаптером на аппаратном уровне – ведь все игры работают с графикой напрямую с железом, без использования BIOS. Я понял, что проще сделать видеоадаптер «с нуля», чем пытаться переделать какой-то готовый. Да и, естественно, самому сделать было намного интереснее.
Итак, пишем свой собственный CGA адаптер – даже EGA на пару порядков сложнее, так что пока на него замахиваться не будем. В принципе, немножко для начала я все-таки подсмотрел – нашел, фактически, наброски модуля генерирования VGA-развертки. Но это было полтора десятка строчек, да еще и не до конца работающих. Так что, реально, они были использованы как шаблон для начала писанины – морально так было легче.
Естественно, CGA монитора у меня нет и не планировалось, поэтому идея заключалась в использовании режима VGA 640х400, в которых превосходно ложился CGA-шный режим 320х200 путем простого дублирования точек как по горизонтали, так и по вертикали.
Вообще графический адаптер у меня получился неожиданно легко – мозг к этому моменту вдруг научился мыслить категориями VHDL, плюс появилось небольшое понимание, что можно требовать от VHDL, а чего не стоит. Вообще основное время отладки у меня занял поиск совершенно глупой ошибки, связанной с разрядностью чисел (две такие проблемы наложились друг на друга и дали весьма забавный вариант). В остальном же я начал получать удовольствие от того, как строчки в редакторе превращаются в практически реальное «железо» внутри FPGA и делают именно то, что я хочу.
В самом начале, естественно, адаптер получился далек от совершенства и совместимости, но Checkit смог опознать его и даже вывести первую тестовую картинку:
Кстати, Checkit оказался довольно полезной программой – многие вещи он определял довольно хитрыми способами, что заставляло делать всю конструкцию все более PC-совместимой. А так как Checkit мог проверить все узлы и компоненты, то и совместимость тестировалась тоже для всех частей системы.
После исправления самых явных ляпов (типа видимого на предыдущей фотографии дублирования точки из предыдущего байта) удалось, с некоторым трудом, найти игру, которая вроде даже заработала:
Цвета на этой картинке не соответствуют оригинальным – в этот момент переключение палитр еще не было сделано, да и сами цвета вообще не были настроенными.
Попытки найти работающие игры показали, что игровые программы, в большинстве случаев работающие напрямую с «железом», куда требовательнее к совместимости, чем какой-нибудь NC или даже QuickBasic. К счастью, FPGA предоставляла практически неограниченные возможности по выявлению фактов обращения программы к интересующим портам, адресам памяти и т.д. Особенно вместе с тем, что BIOS я тоже мог менять по собственному усмотрению, это давало отличный механизм отладки. Кстати, в какой-то момент (уже не помню точно, когда), заработал и Turbo Debugger, что тоже расширило арсенал отладочных инструментов.
Сразу же стало ясно, что нужно делать хотя бы минимальный таймер 8253. Причем программы пытались использовать таймер не только для звуков (канал 2), а еще и активно перепрограммировали канал 0, изменяя таким образом частоту прерываний от таймера, а также использовали этот канал для определения временных параметров.
Почитав документацию к 8253, мне стало немного тоскливо. Делать нужно было много и не очень интересно. Решив заняться этим как-нибудь потом, в тот момент просто залез на все тот же opencores и стащил пару модулей таймера. Один на Verilog, причем весьма упрощенный, второй – по виду крайне навороченный, да еще и на VHDL. К сожалению, таймер на VHDL подключался по шине Wishbone – это открытый стандарт для разработок на FPGA. С Wishbone я до этого никогда не сталкивался, так что решил для начала использовать модуль на Verilog’е, который по интерфейсу выглядел попроще.
После довольно безболезненного подключения таймера к моей системе провел несколько простых тестов и убедился, что модуль вроде работает. Мало того, после еще одной небольшой доработки системы в части интерфейса с динамиком раздались первые, но вполне правильные звуки от работающей игрушки. Пока с таймером можно было закончить, и двинуться дальше.
Дальше же мне пришлось принять кардинальное решение. До этого момента INT 10h я писал сам. В текстовом режиме с этим еще можно было смириться, но вот необходимость поддерживать эти функции в графических режимах меня расстроила. Учитывая, что к этому моменту страсть к программированию на ассемблере была практически удовлетворена (все-таки сказалось то, что в свое время уже пришлось делать это в промышленных объемах), поступил по принципу «Если гора не идет к Мухаммеду, то тот посылает ее нафиг». А именно решил сделать свой CGA адаптер настолько совместимым по «железу», чтобы оригинальный BIOS мог работать с ним.
В принципе, особой сложности не возникло – регистров не очень много, функциональность их крайне проста. Из неявных вещей — пришлось эмулировать регистр состояния, в котором находятся признаки обратного хода луча кадровой и строчной развертки. Довольно логично оказалось, что многие программы (включая BIOS) активно пользуются этим регистром, чтобы избежать «снег» при попытке одновременного обращения к видеопамяти со стороны процессора и адаптера.
Почему-то процесс приведения в порядок видеоадаптера мне показался очень увлекательным, и в конечном итоге этот узел оказался самым проработанным с точки зрения совместимости с оригинальным устройством. Попутно были добавлены недостающие вещи типа переключаемых палитр, режима 640х200 и т.д. Кстати, для тестирования режима 640х200 оказалось довольно непросто найти программу, поддерживающую данный режим. Единственное, что удалось раскопать, это шахматы:
На мой взгляд, выглядит довольно красиво…
Оригинальный обработчик INT 10h отнёсся к такому адаптеру весьма дружелюбно, а я вздохнул с облегчением от отсутствия необходимости писать вещи типа распознавания символа, напечатанного в определенном месте экрана в графическом режиме.
Последним препятствием на пути к приемлемой совместимости с PC была, как ни странно, клавиатура. Хотя это было чуть ли не первое, что я прикрутил к проекту, но с точки зрения совместимости там вообще еще конь не валялся. Основная проблема заключалась в том, что все нормальные программы работают с первым набором скан-кодов, который применялся еще в IBM PC. А вот все клавиатуры, начиная с PC AT, выдают, как минимум, второй набор скан-кодов, очень отличающийся от первого. Только контроллер клавиатуры внутри компьютера преобразовывает эти коды в оригинальный, первый набор, и все обычные программы работают именно с ним (даже если эти программы вроде бы обращаются к клавиатуре напрямую, не используя BIOS). У меня же, естественно, никакого контроллера не было (кстати, в PC AT и даже в поздних PC XT для этого использовался отдельный микроконтроллер на базе 8051). Функции INT 09/16 у меня были реализованы в самом минимальном варианте, а уж о прямой работе программ с клавиатурой вообще и речи не могло быть – они (программы) просто не поняли бы ни одного скан-кода.
К этому моменту я вдруг почувствовал эйфорию от владения VHDL – мне казалось, что я уже постигнул истину, и могу вообще все. Поэтому без промедления был написан изящный (как мне казалось) модуль на VHDL, который выполнял перекодирование скан-кодов. В этом модуле все было очень красиво и хорошо, за исключением одной маленькой детали – он не работал. Причем причину неработоспособности я понять никак не мог, что расстраивало и вызывало недоумение – там всего был десяток строчек.
Очередной раз обратившись на форум к знатокам, я получил изрядное количество действительно толковых советов. Мало того, мое понимание самой концепции VHDL очередной раз чуть ли не в корне поменялось (в т.ч., появилось некоторое разочарование). Основное – чудес не бывает. VHDL (а также все другие HDL) не сделает того, что невозможно сделать обычным способом из имеющихся аппаратных ресурсов. Если я пишу строчку, вроде правильную с точки зрения синтаксиса языка, но при этом даже близко не представляю, как это может быть реализовано в железе, то, скорее всего, оно и не будет реализовано при компиляции. Как минимум, не будет делать то, что от этого требуется. И еще – очень важно использовать шаблоны. Оказывается, многие конструкции языка превращаются в правильные аппаратные узлы только тогда, когда компилятор распознает соответствующий шаблон. Определенная гибкость, конечно, присутствует, но все-равно нужно всегда помнить о рекомендованных стилях описания тех или иных узлов.
Думаю, именно после этих разборок я действительно хоть совсем чуть-чуть, но уже по-настоящему начал понимать суть VHDL (да и Verilog к этому моменту тоже перестал быть совсем уж непонятным). Волшебным образом учебники по этим языкам вдруг обрели смысл, и за словами становилась понятна суть описываемых вещей.
Короче говоря, сделав модуль преобразователя чуть менее красивым, но зато намного более правильным, получил на его выходе коды в первом наборе. Далее осталось скормить эти коды уже оригинальному обработчику INT 09h, и проверить все тем-же Checkit’ом правильность распознавания нажатий клавиш. Итак, клавиатура тоже была почти 100% совместима на аппаратном уровне.
К этому моменту я начал ощущать все больше и больше неудобств от того, что верхним уровнем проекта у меня все еще оставался схемный дизайн. Окончательным толчком, побудившим взяться за полный переход на VHDL, послужила смена домашнего компьютера. На столе у меня оказался iMac Retina с установленным Windows. К сожалению, Quartus попал в число программ, которые оказались совершенно не готовы к работе с таким разрешением экрана. Схемный дизайн стал совершенно нечитаемым, и никакие мои попытки что-то настроить никаких реальных улучшений не произвели. Деваться было некуда, я стиснул зубы и взялся за текстовый редактор.
Как ни странно, все прошло более, чем гладко. Сейчас уже даже не помню, нужно ли было хоть что-то отлаживать, или же все заработало сразу после переделки. В любом случае, серьезных затыков точно не было, а вот работать сразу стало намного удобнее и эффективнее. Я сразу вспомнил советы ряда знающих людей, настоятельно рекомендовавших мне с самого начала забыть о схемном дизайне и сразу начинать с VHDL/Verilog. Кстати, относительно VHDL vs Verilog – пожалуйста, не спорьте со мной, что лучше/хуже, и почему я остановился именно на VHDL. Давайте считать, что мне просто так захотелось, и это практически правда. Больше на эту тему я рассуждать не буду…
При переходе на VHDL был также полностью переделан последний модуль на схемном дизайне – интерфейс SPI. Если помните, он обеспечивал аппаратный прием/передачу только одного байта, причем вокруг этого нужно было произвести целый ряд подготовительных шагов. Вкупе с медленным процессором (и лениво написанным INT 13h) это давало всего около 35% от быстродействия оригинального жесткого диска PC XT (согласно Checkit). Так как я уже практически чувствовал себя гуру VHDL и вообще цифровой электроники, то сразу решил писать не копию имеющегося интерфейса, а модуль, обеспечивающий пакетную передачу.
Правда, с DMA (или, как говорят у нас в России, ПДП) решил не заморачиваться – контроллера DMA еще не было, а браться сразу за два новых модуля не хотелось, потом не разберешься, где именно проблема. Отладка модуля прошла не совсем гладко – пришлось немного повозиться, в том числе активно задействуя цифровые каналы осциллографа в качестве анализатора протокола. Кстати, почему-то в ходе всего процесса я практически забыл, что в состав Quartus’а входит встроенный цифровой анализатор SignalTap, который, наверное, был бы еще удобнее. Возможно, в будущем у меня руки дойдут и до него (еще ни разу не пользовался), но пока мне очень нравится использовать для этого отдельную железку.
Наверное, с учетом нового модуля можно было бы более серьезно переписать INT 13h, но мне было лень, и я отделался только минимально необходимой модификацией. В результате получилось не очень красивое и совсем неэффективное нагромождение, но все равно скорость с новым модулем выросла практически в 5 раз:
Далее пошел частично нудный, частично увлекательный процесс запуска различных программ (в первую очередь, игровых) с целью выяснения, почему они не работают (вернее, что в моем компьютере недостаточно совместимое). О поисках причин можно написать отдельную большую статью, просто приведу несколько примеров:
— у меня нет DMA. Оказалось, что нулевой канал DMA (используемый для регенерации памяти на оригинальных PC) также используется некоторыми программами как счетчик для определения коротких временных промежутков. Пришлось эмулировать соответствующую часть счетчиков контроллера DMA
— обычно (но не всегда) при чтении из несуществующей области памяти или порта ввода/вывода считывается байт FF. У меня считывалось наоборот – 00. Это не понравилось программе, которая проверяла таким образом (и более ничем другим) наличие джойстика, после чего решала, что он есть, и что зажаты все кнопки
— самым оригинальным способом определения наличия CGA адаптера воспользовалась программа, которая записывала определенное значение в регистр местоположения курсора, потом считывала значение и сверяла с тем, что записывала (потом восстанавливала оригинальное значение). Согласно имеющейся у меня документации, этот регистр вроде должен быть только для записи, но переделал на чтение/запись, после чего программа успокоилась
— не связанное с моим компьютером – потратил кучу времени на выяснение причин зависания простейшей старинной игры Paratrooper. Оказалось что хотя игра и старая, но имевшийся у меня файл был сжат самораспаковывающимся архиватором com/exe файлов. Так вот, та часть, которая отвечала потом за распаковку программы при запуске, содержала команду, которая появилась только, начиная с 286 процессора. Неприятность заключалась в том, что данная команда не сильно влияла на процесс распаковки и портила только некоторые байты (меньше одного из тысячи). Пожалуй, на эти разборки я потратил больше всего времени.
Так, потихоньку, практически все игры, которые у меня были, стали запускаться и работать без особых проблем, в некоторые из них я даже попытался сыграть:
В ходе запуска многочисленных игр выяснилось, что имеющийся у меня модуль таймера далеко не идеален – в большинстве случаев звуки были не совсем правильными. Решив, что все-равно захочу разобраться с шиной Wishbone, я решил прикрутить таймер на VHDL, о котором уже упоминал ранее. Для начала, почитал описание Wishbone и сваял нечто типа переходника между Wishbone интерфейсом и шиной 8088 – ничего сложного. К сожалению, таймер не заработал. Пришлось снова доставать осциллограф и смотреть, что же там происходит (в первую очередь, правильно ли формируются Wishbone сигналы).
Кто мог подумать, что в этот момент меня будет ждать великое открытие… Помните, как я мучился со сбоями памяти, и вынужден был ввести промежуточный регистр, необходимости в котором не видел в принципе? Так вот, на экране осциллографа у меня оказалась следующая картинка:
Естественно, первое, что бросилось в глаза, так это жуткий звон сигнала 2. Причем звон этот перешел из количественного параметра в качественный. Сигнал 6 формируется одноразрядным счетчиком, на вход которого подан сигнал 2. Фактически, по каждому восходящему фронту сигнала 2 сигнал 6 инвертируется. Но на осциллограмме видно, что сигнал 6 переключился один раз не только по нормальному фронту сигнала 2, но по фронту самого сильного «звона»! Т.е. в моей схеме на некоторых линиях звон был такой амплитуды, что мог вызвать ложные переключения логики. Сказать, что я офигел – не сказать ничего. Даже не верилось, что при всем этом мне удалось добиться устойчивой работы схемы…
Далее, после небольшого анализа схемы с учетом новых данных, мне стало совершенно понятно, где именно возникали старые сбои, и почему тот регистр их вылечил. Тем не менее, нужно было что-то делать, так как именно сигнал 2 мне был нужен для работы с новым модулем таймера. И снова традиционное обращение к знатокам. Из нескольких советов на форуме был выбран вариант с разрезанием дорожки и впаиванием туда резистора. Результат был далек от идеала, но более ложных переключений от звона при тестировании в течение нескольких часов я не зафиксировал:
К сожалению, на работоспособность VHDL модуля таймера это не повлияло – он молчал. Повозившись еще некоторое время, причина была обнаружена в довольно неожиданном месте – в самом модуле. Причем была она довольно прозаична (и часто встречающаяся в программировании) – модуль неправильно обрабатывал одно из крайних значений, а именно при делителе 0 он вместо деления на максимальное значение (65536) не делал ничего. Я же проверял все время именно инициализацию канала 0, который инициализируется максимальным делителем, чтобы получить частоту 18.2 Гц. Когда я для эксперимента использовал делитель FFFF, все заработало.
Я даже связался с автором модуля, который (автор) уже и забыл, что он этот модуль писал. Тем не менее, автор помог мне найти конкретное место, где была допущена ошибка, и я даже кое-как попытался ошибку исправить. Именно эта проблема решилась, но были обнаружены другие, так что я пока остановился на первой версии модуля, на Verilog.
К этому моменту готовность моей конструкции была такова, что я созрел для главного эксперимента. Дело в том, что в далеком 86 году я читал статью из журнала «В мире науки», который является русским переводом американского журнала «Scientific American», в которой рассказывалось о новейшем продукте компании Microsoft – а именно об игре MS Flight Simulator. Учитывая, что уже в том время я фанател от компьютеров, но при этом твердо собирался стать летчиком, можно понять, какие эмоции тогда бурлили у меня в голове (да и в других частях тела).
И вот сейчас, спустя почти 30 лет, у меня появилось неутолимое желание запустить именно тот исторический Flight Simulator на моем компьютере. Интерес подогревался еще и тем, что вроде бы в те времена для тестирования на совместимость чуть ли не официально использовались две программы – тот самый Flight Simulator, а также Lotus 1-2-3. Говорилось, что они так плотно используют аппаратные особенности компьютера, что если заработали эти программы, то все остальное и подавно будет работать.
Вообще у меня были некоторые сомнения – я все-таки знал о некоторых подводных камнях в моей конструкции, но все же решил рискнуть (особенно учитывая, что ничем, естественно, не рисковал). Результат на экране:
Кстати, загадочная зернистость картинки вначале вызвала у меня подозрение – я сразу стал думать о каком-то совсем хитром способе работы с видеоадаптером, который у меня не поддерживается. На самом деле, как оказалось, таким образом Microsoft пытался получить дополнительные цвета, комбинируя точки из имеющихся цветов. Должен заметить, что, учитывая разрешение 320х200, результат был, мягко говоря, сомнительный.
Никаких проблем с запуском Lotus 1-2-3 тоже не возникло, так что на этом эксперимент можно было бы считать оконченным. Тем не менее, я провел еще ряд небольших доделок и подкруток, после чего стали запускаться и абсолютно нормально работать вообще все программы, которые у меня есть на настоящий момент. Единственной новой функцией, которую я добавил после этого, была EMS. Мне просто не давало покоя, что пропадает больше мегабайта доступной памяти (если честно, то просто хотелось еще что-то сделать), поэтому я нашел описание платы EMS с драйвером, и написал модуль, эмулирующий работу этой платы. Драйвер успешно память опознал:
Совсем последним штрихом стала переделка самой процессорной платы. Мне совершенно не нравился тот кошмар, что творился с формой сигналов, а также хотелось еще раз попрактиковаться с Eagle. В результате была разведена 4-слойная печатная плата, у которой один из внутренних слоев был выделен под землю, второй – под оба напряжения питания. Кроме того, самым существенным моментом было устранение шлейфов – разъемы установлены так, что моя плата прямо втыкается в отладочную плату FPGA (если быть совсем уж точным, то в плату расширения портов GPIO отладочной платы FPGA – такая вот матрешка):
Были также некоторые схемотехнические изменения – убран полностью формирователь тактовой последовательности 8284 (решил, что можно без проблем убрать его внутрь FPGA, не нанеся ни малейшего ущерба совместимости по сигналам шины) и регистр-защелка на шине адреса/данных (также убран внутрь FPGA). Быстрая проверка формы сигналов на новой плате показала, что сигналы стали практически идеальными:
Итак, путь от мигающего светодиода на беспаечной макетке до вполне нормального компьютера был пройден за пару месяцев, при этом получено огромное количество удовольствия, а также знаний в целом ряде областей. На выходе получился компьютер с довольно неплохой совместимостью с IBM PC, на котором вообще без замечаний работают все программы, которые я не поленился раздобыть, в т.ч. и те, которые считаются крайне требовательными к совместимости «железа». На компьютере практически полностью (за исключением обработчика INT 13h) используется BIOS 3-ей версии от IBM PC.
Насчет бюджета проекта сказать что-то определенное практически невозможно. Для начала, что туда включить — только несколько микросхем (подразумевая, что монтаж можно сделать МГТФ’ом, плата FPGA и приборы для настройки и так есть), или же все, начиная от сверхсрочного изготовления плат, покупки отладочной платы FPGA специально для этого проекта, и заканчивая не самым дешевым осциллографом?
Конкретные типы микросхем и всего остального в статье я вроде указал, так что любой желающий сможет посмотреть, во что все это обойдется именно в его варианте. Естественно, необязательно использовать именно DE2-115, для ориентира привожу требуемые ресурсы FPGA:
Следует учесть, что здесь еще присутствует куча артефактов, использовавшихся для отладки, да и сам код практически не оптимизировался.
Что делать со всем этим (и делать ли вообще что-либо) – не совсем уверен. В ходе процесса очередной раз стало понятно, что, хотя на энтузиазме и эрудиции тоже можно кое-чего добиться, формальное знание основ позволило бы все ускорить, избежать многих граблей, а главное – больше сконцентрироваться на творчестве, а не изобретении велосипеда с квадратными колесами. Поэтому пока есть большое желание заполнить каким-нибудь экспресс-методом прорехи (вернее, зияющие дыры) в знании как просто основ электроники и схемотехники вообще, так и VHDL в частности. Насколько это получится, увидим – всегда присутствует проблема в мотивации и наличии свободного времени.
9.1. Какие бывают интернет-программы
Существует огромное множество программ для Интернета. С помощью одних вы можете общаться с другими пользователями (мы рассмотрим их в разд. 9.2), с помощью других — намного быстрее скачивать большие файлы из Всемирной компьютерной сети (о них — в разд. 9.3). Некоторые программы (см. разд. 9.4) позволяют просматривать сайты без подключения к Интернету — вы сможете скачивать Web-страницы себе на жесткий диск, а затем, отключившись от Сети, спокойно их просматривать, — особенно это актуально, если вы имеете к Интернету ограниченный доступ.
Для безопасной работы в Интернете и локальной сети советую обзавестись специальной программой, которая будет контролировать активность всех сетевых приложений. В разд. 9.5 мы поговорим о программах для безопасности — брандмауэрах (firewalls).
Разумеется, мы рассмотрим далеко не все программы, которые можно использовать во время работы в Интернете. Программ таких великое множество, так что рассмотреть их все — задача сложная и необъятная. В этой главе мы поговорим лишь о наиболее популярных программах, которые используются множеством людей и значительно упрощают им жизнь.
Данный текст является ознакомительным фрагментом.
Продолжение на ЛитРес
Читайте также
Какие программы используются в этой книге
Какие программы используются в этой книге Вопрос далеко не праздный, учитывая то, что за программы сегодня приходится платить… Так что же за программы использовал автор?Только бесплатные!— Блокнот — простейший текстовый редактор, стандартно поставляемый в составе
(1.3) Какие виды поставки w2k бывают?
(1.3) Какие виды поставки w2k бывают? Всего их четыре, Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server и Windows 2000 DataCenter Server. Отличаются они друг от друга, во-первых, количеством служб и программ входящих в поставку, во-вторых, степенью поддержки аппаратного обеспечения. Например, W2k Pro
1.4. Какие виды поставки XP бывают?
1.4. Какие виды поставки XP бывают? Первоначально выпущено две версии — Windows XP Home Edition и Windows XP Professional. Кроме этого, существует 64-битная версия Windows XP Professional, сделанная для 64-битного Intel Itanium. Позже будут выпущены Widows.NET Server, Windows.NET Advanced Server и Windows.NET Datacenter Server (x86 и 64 bit edition для
Какие программы используются в этой книге
Какие программы используются в этой книге Вопрос далеко не праздный, учитывая то, что за программы сегодня приходится платить… Так что же за программы использовал автор?Только бесплатные!— Блокнот — простейший текстовый редактор, стандартно поставляемый в составе
1.6. Какие сервера бывают и для чего они нужны
1.6. Какие сервера бывают и для чего они нужны Для полноты картины рассмотрим несколько различных типов серверов:1. Сервер локальной сети.2. Шлюз.3. Сервер удаленного доступа.Сервер любого типа вы сможете настроить с помощью данной
Какие бывают блоги
Какие бывают блоги Существует много классификаций блогов, но в этом разделе мы рассмотрим два основных типа блогов — с точки зрения технической базы, на которой они размещаются.БлогохостингиСайты, на которых можно зарегистрироваться и бесплатно вести блог без
Какие бывают состояния пользователей
Какие бывают состояния пользователей Понятно, что постоянно сидеть за компьютером очень утомительно. Иногда нужно и по делам сходить или вздремнуть часок-другой прямо на клавиатуре. Однако вдруг в это самое время кто-то захочет с вами поговорить — он-то не знает, что вы
Какие бывают оповещения
Какие бывают оповещения При работе с Windows Messenger могут появляться оповещения в области уведомлений рядом со значком программы. Эти оповещения можно условно разделить на три вида:? о том, что пользователь, который находится в вашем списке контактов, вошел в систему;? при
Какие бывают сайты?
Какие бывают сайты? Сайт сайту рознь. И будет нелишним узнать, чем же они отличаются друг от
Какие бывают программы?
Какие бывают программы? Виды программ по назначению Системные программыЭто первая и самая обширная группа программ, с которыми нам придется иметь дело. Они нужны для обеспечения нормальной работы компьютера, его обслуживания и настройки. Это в первую очередь
Какие бывают модемы ADSL?
Какие бывают модемы ADSL? Кроме модемов с портом Ethernet, включаемых в локальную сеть, существуют недорогие ADSL-модемы, которые подключаются к компьютеру кабелем USB. Энергию они получают от компьютера по той же шине USB и не нуждаются в отдельном блоке питания. Такие модемы
Какие еще бывают проводные подключения?
Какие еще бывают проводные подключения? Некоторые провайдеры предлагают стационарное подключение к Интернету и по другим технологиям. В наших городах они еще не так популярны, как ADSL, и о них скажем лишь в общих чертах.Дело в том, что прокладку кабелей и настройку
Как работают блоки питания персональных компьютеров? Какие блоки питания бывают?
Как работают блоки питания персональных компьютеров? Какие блоки питания бывают? http://pc-doc.spb.ru/atx.html Блок питания — жизненно важная часть компьютера, без которой его функционирование невозможно. Лишенный блока питания компьютер — всего лишь мертвая коробка, наполненная
1.3. Какие бывают компьютеры
1.3. Какие бывают компьютеры Компьютеры можно подразделить на два стандарта — IBM PC и Macintosh.IBM PC-совместимые компьютеры стоят в большинстве домов и организаций, именно о работе на этих ПК и пойдет разговор в книге. Кроме обычных компьютеров (с системным блоком, клавиатурой,