IBM PC XT своими руками
Можно ли самостоятельно спаять настоящий компьютер? Не ZX-Spectrum или что-то подобное, а вот прямо настоящий PC? Может быть я немного ошибаюсь, но компьютер (само железо) для большинства пользователей – это что-то на грани магии. Оно как-то работает, но что там внутри происходит – не понятно, да и не очень важно.
В общем, где-то в конце 2024 года решил я сделать компьютер. Понятно, что не такой как в магазине – это все-таки не тот уровень, куда с паяльником лезут, а что-то попроще, но по-настоящему.
Вообще история PC началась в 1981 году, когда IBM предложила миру свою модель 5150 или IBM PC. В тот момент это не было какой-то особенной революцией, многие компании пытались предложить рынку массовый персональный компьютер, но IBM случайно угадала баланс между стоимостью, производительностью и авторскими правами. Последний пункт оказался чуть ли не самым главным, т.к. позволил всем желающим клонировать PC в формате собственных версий. IBM наверно было обидно, что их идеи приносят деньги всем желающим, но для судьбы архитектуры это оказалось ключевым моментом. Рынок быстро наполнился компьютерами и программами к ним.
Та модель 5150 была не такой уж прикольной. Для игр даже Spectrum был точно поинтереснее. Но IBM продвигала PC прежде всего как инструмент для бизнеса. В минимальной конфигурации это был довольно унылый компьютер с магнитофоном в качестве постоянной памяти. Поэтому очень быстро вышла модель 5160 – IBM PC/XT. Вот это уже был настоящий компьютер в современном понимании. Сама основа осталась почти без изменений, но в комплекте уже сразу шли накопитель на гибких дисках и жесткий диск. И усиленный блок питания, чтобы питать их. Видеокарта выбиралась юзером в момент покупки. Или относительно бюджетная монохромная MDA, или CGA для любителей странных цветовых палитр.
На самом деле там было много вариантов комплектации, но я не буду описывать эти детали, кому интересно, тот может почитать – статей про это написано множество.
Теперь вернемся в наше время. Модель 5160 вполне можно спаять самостоятельно. Там все микросхемы в корпусах доступных обычному паяльнику. Конструкция IBM PC XT подробно описана в мануалах того времени и легко находится в Интернете. Это довольно объемный документ на 420 страниц. Не по-русски разумеется.
Здесь есть все, включая принципиальную схему и полный листинг BIOS на ассемблере.
Но делать компьютер по той инструкции не интересно. Хотелось добавить в него всяких современностей, но при этом не опускаться до эмуляции всего на микроконтроллере – в таком подходе нет ничего интересного. Компьютер должен быть настоящим, железным. При этом конструкцию можно упростить, если не делать те ее части, которые не получится использовать.
Поразмыслив над всем этим, я пришел к такому плану:
CPU V20 – это улучшенная версия 8088. Может работать на большей скорости.
Математического сопроцессора не будет.
RAM – 1МБ статической памяти.
Клавиатура – использовать простую Bluetooth-клавиатуру из Фикспрайса.
Разъемы ISA не делать. Все, что вставлялось в слоты, сразу припаять на материнку.
Видеокарта MDA тоже самодельная в собственном разъеме, а потом VGA на материнке.
ЖМД (HDD) – CF-card.
ГМД (FDD) – эмулятор на флешке.
COM-мышка.
USB-флешка.
Печатной платы не будет, все навесным монтажом.
Исходный план был не совсем такой, но в процессе пришел к нему.
Видеокарта MDA
Сначала сделал видеокарту MDA. На отдельной плате. Карта задумывалась как тестовая для использования только в процессе отладки.
Оригинальная MDA карта в стандартном режиме показывает алфавитно-цифровую картинку 25 строк по 80 символов. Частоты синхронизации совершенно телевизионные, поэтому современный ЖК-монитор почти точно откажется показывать такой сигнал. Необходимо рисовать его в более современном формате.
Чтобы решить проблему совместимости, решил изменить размеры знакоместа и поместил каждый символ в матрицу 8х9. Примерно как на ZX-Spectrum, т.е. совершенно нормально читаемые символы, хотя и не такие симпатичные как в настоящем ХТ. Картинка получилась размером 640х225. Прочерчиваем каждую строку два раза и получаем на выходе 640х450. Почти идеальные 640х480. И пиксельная частота примерно 24 МГц.
Оригинальная MDA карта содержит на борту еще и LPT разъем для подключения принтера – это сразу в корзину. Есть ряд dip-переключателей для настройки режимов – это тоже исключил. Будет только один стандартный режим.
Сердцем настоящей MDA является видеоконтроллер Motorola 6845, который уже не так-то просто найти. Да он не очень-то и нужен, если планируется совершенно неродной формат изображения.
Вместо этого используются две ПЛИС EPM3064. Одна занимается рисованием картинки, а вторая управляет отображением курсора и сообщает по запросу CPU байт статуса видеокарты.
Видеопамять настоящего MDA – это область памяти в основном RAM. Процессор и видеокарта разделяют доступ к ней, от чего немного снижается скорость работы процессора. Моя видеокарта просто постоянно мониторит системную шину и забирает к себе в память видеобайты, когда процессор пишет их в RAM. Торможений нет.
В остальном ничего примечательного. Картинка из кода символа и кода атрибутов формируется на дискретной логике и отправляется в монитор. Почти как в Радио-86РК.
В итоге поучилась вот такая конструкция:
Клавиатура.
Родная клавиатура IBM XT – это совершенно особенная конструкция. По формату передачи данных похожа на PS/2, но это не она. Купить такую новую уже просто невозможно. Можно использовать что-то более современное, но с конвертором. Или сделать совсем по другому.
Как я уже писал, используется клавиатура Bluetooth из Фикспрайса – самое бюджетное решение без проводов. Чтобы подключиться к ней, пришлось приобрести ESP-32S, который в разы круче всего остального железа. Если бы я делал эмулятор, то можно было бы почти все в нем и реализовать.
Bluetooth – это целая вселенная, погружаться в которую у меня желания не было. Я взял за основу этот проект (спасибо turgu1 из Канады) и доработал под свою задачу. Коды нажатых и отпущенных клавиш принимаются ESP-32S, перекодируются в соответствующие коды клавиатуры IBM PC и через com-порт выкидываются в другой микроконтроллер, о котором будет написано дальше.
Каких-то проблем тут не возникло. Я дольше разбирался, как заливать прошивку в ESP, чем делал саму прошивку.
Материнская плата.
Далее я буду использовать краткие наименования микросхем типа «8088» просто чтобы было меньше букв. Желающие смогут легко найти их описание в сети.
Для материнки заказал большую макетную плату. Размером почти А4.
За основу схемы взял оригинальную конструкцию. Но почти все немного или сильно изменил. Прежде всего, добавил микроконтроллер STC8H8K64U (далее просто STC), который заменил тактовый генератор 8284 и формирует своими таймерами частоты для CPU и для системного таймера 8253. При этом на ЦПУ поступает примерно 8.63 МГц при стандарте 4.77 – почти в два раза быстрее.
Но это не все. Еще STC выполняет функцию буфера клавиатуры, сообщая CPU коды нажатых и отпущенных клавиш, которые принимает через com-порт от ESP-32S. При этом он еще занимается автоповтором нажатых клавиш, который в XT реализован аппаратно внутри клавиатуры.
Так же STC формирует канал DMA 2, который нужен для работы с гибкими дисками.
ROM (BIOS). Сначала я хотел весь код BIOS хранить в прошивке STC просто как статический массив байтов и загружать его в RAM при старте используя режим DMA. Это позволяло хорошо сэкономить на количестве микросхем. Но когда решил делать полноценную модель 5160, пришлось пойти по классике и вынести BIOS в отдельное ROM. Слишком большой объем 64 кБ – это вообще вся память STC.
В качестве этой памяти для хранения BIOS используется W25Q32Q32VB. Емкость 1 МБ, подключается к STC по SPI. Вообще, там не только BIOS, но и ПЗУ (драйвера) контроллеров жесткого и гибкого дисков и видеокарты. Они тоже загружаются в память перед стартом.
Системный таймер (который в любом компьютере незаметно считает время работы), контроллер прерываний и параллельный порт для внутренних устройств почти без изменений повторяют оригинальную конструкцию.
CPU включен в минимальном режиме, потому что в схеме нет математического сопроцессора, поэтому в схеме нет и 8288, процессор по сути сам рулит всеми устройствами.
При старте компьютера STC включает режим DMA, забирая управление на себя. Очищает экран, пишет свое приветствие и производит легкий тест RAM. Просто пишет и читает несколько байт в каждую микросхему. Тестирует контроллер ГМД, загружает в память коды BIOS и драйвера.
После этого управление возвращается процессору и дальше все происходит как обычно в PC/XT.
Здесь и начались первые настоящие трудности. Конструкторы IBM заложили в BIOS алгоритм довольно подробного самотестирования при старте. Значительно серьезнее чем, например, в Spectrum’e. Это объяснялось тем, то РС предлагался прежде всего для бизнеса, и IBM должна была гарантировать, что если компьютер включился, то он исправен и не принесет ущерба неожиданным сбоем. Этот тест моментально блокировал загрузку моей конструкции.
Пришлось доставать логический анализатор, подключаться куда только можно и разбираться что не так. К счастью, в техническом описании есть полный листинг BIOS на ассемблере с машинными кодами. Поэтому получилось возможным делать снимок загрузки и потом побайтно разбираться какие команды исполняет процессор, и в какой подпрограмме происходит сбой.
Чтобы было понятно, это выглядит примерно так:
Как оказалось, CPU не находил контроллера DMA, который я сначала совсем исключил из схемы, и выполнял команду HLT, т.е. просто останавливался. Я заменил HLT на NOP и теперь тест стал падать на проверке контрольной суммы ROM (логично). Пришлось обойти и эту проверку.
Всего в код BIOS внес изменения в шести местах. И это не всегда была простая замена одного байта. Местами более обширные изменения. По мере адаптации кода к конструкции компьютер начал проявлять признаки жизни. Прежде всего писать коды ошибок на экране. Это выглядело например так:
Здесь видно сразу три проблемы.
301 – нет клавиатуры
80000 FF 201 – проблема с RAM.
Все строки подчеркнуты – мой MDA неправильно интерпретирует байты атрибутов символов, ошибочно думает, что надо подчеркивать.
И здесь еще видно в четвертой строке первый вариант курсора – вертикальный мерцающий штрих, как у современных ПК. Позже я заменил его на стандартный для РС мерцающий символ подчеркивания.
Ошибка клавиатуры решилась исправлением кода в STC, в RAM был непропай (после этого появился тест RAM на этапе старта).
Постепенно все проблемы были решены или обойдены и мой ХТ издал всем знакомый одиночный бип и загрузился как положено:
Т.к. в системе нет никаких дисков для загрузки, то управление передается встроенному Basic от Билла Гейтса. Получился такой чёрно-белый вариант Spectrum или Радио-86РК на максималках. Можно было что-то кодить. А если добавить проводков, то и сохранять программы на магнитофоне.
На этом этапе выглядело все это так:
Микросхемы с радиаторами – это КР580ИР82 / ВА86. Я их выбрал потому что они продаются за копейки и имеют удобное расположение выводов. Но, как оказалось, они очень сильно греются при работе. Потом я поменял их на более «холодные». На MDA-карте тоже стоят 4 штуки и без радиаторов. Никаких проблем при этом нет. Только горячие очень.
Еще здесь видно первый вариант BIOS в обычной ПЗУ, потом я его убрал.
HDD (ЖМД)
IBM PC/XT из коробки умеет работать с ЖМД. Разумеется речь о ЖМД 80-х годов прошлого века. Любой современный накопитель будет непосильной проблемой для XT.
Для подключения ЖМД необходим специальный контроллер, который вставляется в свободный слот ISA.
Но есть вариант проще. CF-карта имеет разъем почти идентичный IDA – это такой разъем под широкий шлейф, уже давно не применяется, но все это можно спокойно купить.
Среди любителей ретрожелеза давно известен проект Сергея Киселева. Можно подключить CF-карту к XT в качестве ЖМД.
От этого проекта я взял только код ROM и общую идею. Сергей предлагает свой контроллер как универсальный модуль для установки в любой PC. Поэтому там есть переключатели для настройки конфигурации под конкретную машину. Мне это не было нужно, потому что я делал этот модуль встроенным в материнку. Так же я совсем отказался от ROM и весь его код положил в ПЗУ STC. Таким образом, и без того простая схема контроллера стала совсем уж примитивной. Она вся на этой картинке:
Разъем под CF-карту специально сделан на самом краю, чтобы потом можно было легко извлекать карту через прорезь в корпусе. Я использовал карту на 32 МБ. Невиданная роскошь по тем временам. А потом вообще поставил 250 МБ. Эта конструкция запустилась сразу без отладки и порадовала меня такой картинкой:
Как видно, CF-карта корректно распозналась, но это и почти все. Логическим анализатором я установил, что с карты нормально считывается загрузочный сектор (MBR), управление передается ему и на этом все валится. После нескольких неудачных попыток пройти дальше XT выдает сообщение об ошибке.
Проблема была ожидаемая и заключалась просто в том, что карта была отформатирована на современном ПК непонятным для XT образом. Нулевой сектор всегда нулевой, поэтому MBR читается без проблем, а дальше XT просто не может найти на диске нужный сектор. Я потратил немало времени, пытаясь хоть как-то установить MS-DOS на карту так, чтобы XT смог ее увидеть, но все оказалось бесполезно.
Решить проблему можно было только имея работающий ГМД.
FDD (ГМД).
Сначала я вообще не собирался делать FDD. Уже давно прошли те времена, когда FDD был нормой для конфигурации ПК. Но оказалось, что правильно отформатировать CF-карту для работы в качестве жесткого диска можно только если загрузиться с ГМД.
Сейчас даже просто пойти и купить сам привод с разъемом под шлейф скорее всего не получится. Да и за дисками придется побегать. Но к счастью наши друзья из Китая придумали замечательную штуку, которая позволяет эмулировать привод дисков на обычной флешке:
Сам контроллер тоже «эволюционировал» с тех времен, когда это был отдельный большой модуль для ISA разъема, и теперь практически целиком помещает в одной микросхеме M82077 или PC8477B. Нужен только дешифратор портов для того, чтобы CPU мог обратиться к FDD. Это одна дополнительная небольшая микросхема. Поддержка FDD уже встроена в BIOS и не должна вызывать проблем.
И вот тут меня ожидал сюрприз. FDD не работает без DMA. Такая реализация в PC. А я поначалу вообще не хотел делать DMA, потому что, если нет ГМД, то он нужен только для регенерации динамической оперативной памяти, а память я поставил статическую.
Раз уж ГМД возвращался в конструкцию, пришлось эмулировать канал DMA 2 в STC, потому что STC уже реализует DMA при старте.
Была только одна проблема. Я использовал STC8H8K64U в ретро-корпусе на 40 ног, которые уже даже не выпускают, но еще продают. И почти все эти 40 ног уже были задействованы. Подключать FDD было просто некуда.
Самым простым решением было заменить STC. Я взял точно такой-же, но уже в корпусе TQFP-64. Это абсолютно тот же самый чип, но у него выведено больше портов. Даже прошивку менять не пришлось. Только припаял на это же место другую микросхему. Все-таки макетная плата – это удобно.
Было – стало:
Как видно, тут добавился куллер. Я их заказал, когда увидел как греются буферы КР580, и потом прикрутил, но и без них нормально.
Новая STC запустилась без проблем. Бонусом получил возможность загружать родной BIOS без корректировки. К тому времени подъехали другие детали, и на материнке появился контроллер FDD:
Микросхема контроллера не новая, но их уже наверно не производят. Микросхема с номером 23 на фотографии – это дешифратор портов. Таким образом, все детали контроллера FDD поместились на этой картинке. За основу взял другой проект Сергея Киселева только без com-порта, но, справедливости ради, подключение контроллера совершенно типовое как по даташиту. Проект Сергея помог мне просто понять, как это устроено.
Сразу это все не заработало. Микросхема контроллера оказалась неисправной и пришлось покупать другую.
Хотя родной BIOS поддерживает FDD, для использованного микроконтроллера FDD все же лучше подходит специальное расширение BIOS все того же Сергея. Это расширение стандартного BIOS позволяет работать с дисками любого формата.
Код этого расширения аналогично BIOS заливается в RAM при старте.
Долго ждал эмулятор накопителя, и, когда он приехал, запустил все. На экране получил такое:
Я пробовал разные образы загрузочных дисков, какие нашел в Интернете. Все зависали после старта операционной системы. Ошибка оказалась до обидного простой. Просто заменил в коде STC в одном месте “ &” на “ |” и все заработало.
Найти в Интернете образы дисков с MS-DOS не так уж сложно. Сложнее найти нормальный образ, пригодный для установки. Большинство ориентированы на то, чтобы быть самостоятельными загрузочными дисками для постоянной работы. Можно конечно всегда сделать «format c: /s» и превратить диск C в загрузочный с установленной ОС MS-DOS, но это будет крайне минимальная конфигурация всего из четырех основных файлов. Работать в такой системе можно, но это не будет полноценная система. Придется вручную копировать на диск остальные фалы.
После ряда экспериментов удалось установить на жесткий диск MS-DOS 4.01.
Добавил к системе свой любимый с 90-х годов Volkov Commander и получил такой результат:
Интересно, что если вставить теперь CF-карту, которая отформатирована в XT, в USB-адаптер, то современный ПК ее вообще не видит. Первоначальный план использовать ее как флешку для переноса файлов не сработал. Теперь понятно, почему в Интерне нет образов жестких дисков XT. Без каких-то хитрых приемов их просто не получится развернуть на CF-карту. И видимо прочитать тоже не получится, чтобы сделать образ. Все дело в нестандартной геометрии разметки «поверхности» диска.
Для переноса файлов оказалось проще использовать запись в образ гибкого диска любой доступной программой, которая понимает образы *.imo или *.img .
На этом этапе компьютер выглядел уже так:
Ну и конечно теперь можно было попробовать поиграть во что-нибудь. Игры – это отличный тест системы. С MDA картой сильно не разгонишься, но кое-что можно попробовать. Вот, например, Тетрис:
Продолжение будет завтра. Уже написано.
UPD:
Продолжение здесь.
















