IMB PC XT своими руками. Часть 2
Продолжаем. Первая часть здесь.
VGA.
Пришло время делать полноценную видеокарту. Как я уже писал выше, в начальном плане было сделать минимальную конфигурацию 640х480 с какой-то одной глубиной цвета. Однако, погружение в эту тему привело к понимаю того, что делать минимальную карту не очень логично. Дело в том, что настоящая VGA карта поддерживала целый пакет различных видеорежимов (что-то около 16) и могла налету переключаться между ними. На практике отсутствие такой возможности привело бы к тому, что очень много программ не смогли бы нормально работать.
Пришлось изучить конструкцию оригинальной карты. Эта схема тоже легко находится в Интернете в виде подробного pdf-файла. Там все довольно сложно. По сути, второй компьютер. Было бы странно надеяться, что я смогу как-то оптимизировать и упростить схему после десятилетий работы над ней множества инженеров.
Оставалось два варианта: использовать какую-то ПЛИС, чтобы синтезировать все в ней, или применить один из видеоконтроллеров, на которых строились видеокарты где-то в 90-х годах. Я выбрал второй вариант.
Лучшим кандидатом для применения показался TVGA9000i. У Сергея Киселева имеется уже проверенная очень популярная реализация под этот видеоконтроллер. Поэтому я знал, что если у меня что-то и не получится, то только из-за кривизны рук.
На первом этапе как обычно нужно было купить комплектующие. Я потратил какое-то время на изучение вопроса и пришел к выводу, что проще всего купить готовую видеокарту и получить весь комплект запчастей сразу. Их довольно активно продают на разных барахолках. Все БУшные разумеется. Есть конечно риск, что будет что-то неисправно, но такой риск есть всегда. Все микросхемы уже давно не производят и новых почти нет.
Вариантов покупки видеокарты есть масса, я в итоге купил за примерно 600 рублей + пересылка, что мне кажется довольно удачно. Приехал вот такая карта:
Видны следы активной эксплуатации и немного ржавчины.
Был конечно соблазн просто припаять ее как есть, но получилось бы очень некрасиво без разъема. Да и план был другой. В общем, взял фен и паяльник и разобрал почти полностью.
Для переноса на мою материнку следовало решить главную проблему: как припаять видеоконтроллер? Обычно для таких микросхем используют всякие переходники DIP – QFP, но найти такой на 160 ног мне не удалось.
Пришлось рисовать проект печатной платы и заказывать изготовление у китайцев. Вышло дороже чем сама микросхема, но вариантов не оставалось. По одной их не делают, прислали сразу 5 штук. Дальше пара вечеров и на материнке появилась видеокарта:
Что касается самой схемы, то тут тоже есть немного адаптации. Прежде всего, традиционно для всей конструкции удален ROM. Код драйвера загружается как все предыдущие в оперативную память при старте из STC.
Тут не обошлось без особенностей. Дело в том, что этот видеоконтроллер универсальный. Поддерживает 8- и 16-битные системы. Поэтому у него очень экзотическое подключение ROM. Микросхема ROM находится для процессора как бы за видеочипом, который выполняет для нее роль буфера и перекоммутирует выводы на 8- и 16-битный вариант разъема. А сам код размещен в микросхеме ROM так, чтобы оптимизировать этот процесс. Если кратко, то все четные и нечетные байты кода размещены не по порядку, а в разных страницах памяти. Соответственно, чтобы переселить этот код в RAM, пришлось пересобрать его, т.е. расположить байты по порядку. Я использовал код ROM от Сергея Киселева, чтобы быть уверенным, что он запустится на XT. Хотя на многих форумах написано, что у него используется обычное ROM как от заводской карты. Сама схема к Сергею имеет мало отношения. Подключение скорее стандартное по даташиту для варианта без собственного ROM.
Еще пришлось добавить кварцевый генератор на 14.31818 МГц. Это стандартный сигнал OSC разъема ISA – основной тактовый сигнал всей системы, от которого я отказался, чтобы ускорить процессор. Но здесь он используется для синтезирования различных частот.
При первой попытке карта вообще не завелась. Через пару дней я догадался прогреть феном все контакты и картинка появилась. Но очень печальная. Вот такая:
На решение этой проблемы ушла еще пара дней. Изображение пошло, но символы были очень сильно искажены. Можно даже сказать разрушены, хотя атрибуты (цвет и т.п.) шли нормально. После некоторых экспериментов я понял, что нормально работают простые видеорежимы типа MDA или CGA, а VGA рассыпается. Все дело в интенсивной работе с памятью. Фактически я уперся в предел для навесного монтажа. Сигналы RAS/CAS не могли нормально дойти до памяти. Я переложил прочие жгуты подальше от памяти, чтобы было меньше помех, а для сигналов RAS/CAS сделал две коротких витых пары и пропустил сигналы по ним. Это, если кому-то непонятно, специальные сигналы для передачи адреса в память. Они по сути имеют частоту выше всех прочих. Стало отлично. Вот так получилось:
Что особенно радует – это удивительно чистая картинка. Словно это настоящий ПК с настоящей видеокартой. Никогда еще мои самоделки не давали такой результат.
Из плохих новостей – компьютер перестал быть стабильным. Загружался даже не через раз, один раз из десяти наверно. И глючил при запуске программ. Но достаточно было вынуть CF-карту и все начинало работать. Другими словами, шина данных была перегружена потребителями.
Я добавил второй буфер на шину данных (74HC245N) и второй буфер на шину адреса, который сделал из трех 74HC245N, работающих в прозрачном режиме.
После того, как все было сделано примерно как задумано в IBM, видеокарта совсем плохо стала работать.
Снова изучение осциллограмм и вывод: Неправильные буферы каким-то чудом компенсировали другую проблему. Оказалось, что разгон CPU привел к тому, что он просто проскакивал мимо сигнала готовности видеокарты. Когда Trident при чтении видеопамяти снимал сигнал готовности, чтобы CPU подождал данные, CPU уже пролетал ту фазу, на которой он проверяет этот сигнал. В результате задержка игнорировалась, видеокарта еще не отдавала байт на шину данных, и CPU читал резисторы подтяжки – FF.
Пришлось делать контроллер, который синхронизирует шину и процессор. Точнее синтезировать его в EPM3064, о которой будет рассказано в следующей главе. Для стабильной работы потребовалось сделать паузу на пять тактов. Компьютер начал работать нормально.
Загрузил его первым сложным тестом – знаменитый Принц Персии. На максималках.
USB
В поисках ответов на разные вопросы в Интернете, я наткнулся на интересный модуль для XT.
Это самый настоящий адаптер для USB-флешек. Конечно, в начале 80-х ничего подобного не существовало даже в проекте, но почему бы не добавить эту удобную штуку? Однако, они продаются по какой-то безумной цене в районе 2,5 тыс, что совершенно отбивает желание покупать. Сердцем модуля является CH375, который можно купить на макетной плате всего за 150 рублей с доставкой:
Разница двух модулей по сути только в том, что нет разъема ISA с буфером и декодера портов, чтобы XT мог общаться с модулем. И нет ROM, панельку которого видно на картинке. Но эта ROM требуется только чтобы обеспечить возможность загрузки системы с флешки. Для простой работы с флешкой как с переносным носителем информации драйвер можно разместить как обычно в sys-файле и загружать его вместе с DOS.
В оригинальном модуле декодер реализован в бюджетной ПЛИС ATF16V8. Такой у меня не было, и программатора тогда не было тоже, поэтому я заменил ее на EPM3064, которая уже упоминалась в предыдущем разделе. Она значительно более мощная. Поэтому кроме поддержки USB в нее можно перенести часть мелкой логики от других узлов – к этому моменту место на материнской плате начало заканчиваться. Кроме того, пришлось переделать разъем IDE под HDD, чтобы освободить место, которое переходник закрывал собой. Раньше я хотел сделать его так, чтобы CF-карту можно было легко вынуть и использовать как флешку, но теперь это стало неактуально и можно было освободить пространство под картой.
Микросхема буфера данных расположена под модулем, не видно на картинке.
Получилось вот так:
Модуль USB запустился удивительно сразу без отладки. Пришлось только разобраться в синтаксисе файла config.sys, который подключает драйвера к MS-DOS. В системе появился диск D. А вот с самой флешкой пришлось повозиться. MS-DOS не умеет работать с большими накопителями. Даже самая маленькая моя флешка на 8 Гбайт – это слишком много для FAT16. В итоге получилась флешка на 512 МБ, которая отлично читается в XT. 7,5 ГБ осталось в тени.
Вообще, флешка получилась заметно тормознутой. Тестовый файл размером 650 кБ читается или записывается ровно одну минуту. Получается, скорость флешки всего около 10 кБ/сек, хотя в теории должно было получиться примерно в 5-6 раз быстрее.
С флешки удалось запустить знаменитый Wolfenstein 3D. Вообще, игра просит для VGA 286 процессор и не запускается. А в версии для CGA на экране почти ничего не разобрать.
Однако, житель Интернета по имени @kingcrimson234 поправил исходный код игры так, чтобы она не требовала 286-й процессор. По его словам изменения были крайне незначительными. С его правками Wolfenstein запустился полноценно в VGA.
Играть с FPS в районе 1 – 2 все равно почти невозможно. Но забавно это видеть.
Ну и мой любимый Retal. Когда-то эта игра была у меня на дискетке всегда с собой. Я играл в нее в институте, в компьютерном классе кафедры на 286-х ПК. В прошлый раз это было в 1994 году. И вот теперь опять. Работает, кстати отлично, без тормозов. В самом начале, когда я только все планировал, я именно эту игру хотел увидеть как конечную цель. Получилось.
COM-порт.
COM-порта в начальном плане не было. Я не смог придумать, что в него подключать, поэтому и не стал конструировать. Однако, когда проект зашел достаточно далеко, мне захотелось иметь мышку. Стандартный аксессуар для любого нормального компьютера. А в годы зарождения ПК мышки подключались обычно через COM-порт.
Первая проблема тут – это сама мышка. Конечно, есть варианты всяких конверторов, превращающих современную USB-мышь в старинную, а еще можно было заморочиться и сделать эмуляцию через тот же контроллер клавиатуры (ESP32) и использовать bluetooth’ную мышку. Но решил пойти по классике.
Прежде всего, удалось купить новенькую настоящую COM-мышку с шариком. Нашел в одном единственном магазине на Яндексе. Видимо товар совершенно не ходовой. Когда достал ее из упаковки – чуть не прослезился. Ровно такие же мышки я гонял по коврикам 30 лет назад.
С контроллером порта вышло сложнее. Вообще, это не особенно сложное устройство. Существует несколько вариантов микросхем, которые реализуют полный функционал. Я приобрел 16С550 в dip корпусе на 40 выводов. Этот чип полностью обеспечивает всю работу интерфейса RS-232 в смысле логики, но вот дальше сложнее. Нельзя просто использовать RXD и TXD соединив их проводками с разъемом по типу UART’a. В RS-232 двуполярные сигналы. Конкретно в XT были уровни +-12 вольт. Между контроллером и разъемом стоял буфер, который брал эти напряжения с разъема ISA (т.е. по сути с блока питания XT) и модулировал их сигналами контроллера. У того же Сергея Киселева для com-порта используется буфер GD75232 или аналогичный, к которому нужно подключать +- 12 вольт. У меня же в схеме есть только +5 вольт.
Пришлось погружаться в теорию устройства мышек наших предков. Как оказалось, питание для мозгов мышки берется из сигнальных линий. Точнее с линии TXD, которая должна быть в логической единице RS-232, а это -12 Вольт. Этот сигнал подключен к земле мышки, а ее плюс – это земля компьютера.
Т.к. для питания мышки по даташиту от ее чипа нужны просто 5 Вольт, то я их подал прямо на разъем в нужной полярности вместо сигнала TXD. Осталось два сигнала RTS и RXD. Первый делает сброс мышки, а по второму она асинхронно выкидывает байты о своем перемещении. Их только нужно инвертировать оба и можно подключать к контроллеру COM-порта. Никакие буферы напряжений в таком варианте не нужны. А на плате как раз были два свободных инвертора.
Так и сделал, все сразу заработало. С драйвером проблем не возникло. Получился конечно не совсем COM-порт, а скорее разъем для комовской мышки, но это в общем-то и было целью.
Вот так, если кто-то не знал, выглядит курсор мышки в DOSе, точнее в файл-мененджере. Полупрозрачный оранжевый прямоугольник.
В остальном мышка работает как обычно в Windows. Чувствительность довольно хорошая хотя и без коврика. Никаких тормозов не ощущается.
UMB
UMB - Upper Memory Block.
В адресном пространстве процессора 8088 после основных 640 кБ остаются пустые окна (или промежутки), которые не заняты каким-то ROM, драйверами или видео. Их не очень много и они могут быть изрядно фрагментированы, но они есть. Возникает соблазн использовать их для дополнительного RAM, что и было в свое время реализовано и названо UMB. В эту память переносились код DOS и драйвера, освобождая место для пользовательского кода в основной памяти. Потому что как оказалось, 640 кБ хватает не всем. Были такие специальные модули с памятью, которые вставлялись в слот ISA.
В моем случае оставалось 143 кБ бесполезной памяти (СС000 - EFFFF). Плюс, они уже «покрыты» физической RAM и могли бы быть очень просто переданы DOS как верхняя память.
Нужно было только добавить схему, которая разрешит процессору читать и писать эту область памяти. Потому что ранее я ее заблокировал, чтобы программы не могли повредить код BIOS.
Эту схему я синтезировал в GAL16V8B – микросхема программируемой логики из тех времен. Очень в тему получилось:
Просто так новые килобайты в системе не появляются, нужен специальный драйвер. Тут выяснилось, что установленная у меня ОС MS-DOS 4.01 даже с драйвером очень плохо (неэффективно) работает с UMB. Отличная причина сделать апгрейд. Перешел на MS-DOS 6.22.
Вот здесь видно, что получилось:
В строке Upper драйвер UMB нашел всего 144 кБ верхней памяти (147472 / 1024), 13 кБ сразу заняты драйверами и самой ОС – это значит, что в основной памяти эти килобайты освободились для пользовательских программ. Еще 130 кБ доступно для использования. Очень не дурно, надо сказать. Дополнительные килобайты в основной памяти позволили запустить Wolfenstein с мышкой. Раньше приходилось загружаться без драйвера мышки, иначе не хватало RAM.
В этом месте я решил остановиться, хотя хотелось добавить еще RTC (часы на батарейке) и звуковую карту. Но подумал, что лучше не загромождать конструкцию. Места уже не было, требовался второй этаж. А мне хотелось получить ноутбучный плоский формат.
В итоге получилось так:
Здесь видно, что я припаял на свободное место переходника разъем под вторую CF-карту. Сейчас там стоит две карты на 250 МБ каждая. Соответственно в системе два HDD.
Ну и самое интересное:
Корпус.
Оставить такой компьютер без корпуса было бы неправильно. Поэтому корпус был в плане с самого начала. Пришло время его делать.
Сам корпус я сделал из отдельных стенок, вырезанных из листового пластика, соединенных винтами через уголки, напечатанные на 3-D принтере. На том же принтере напечатаны элементы для установки эмулятора гибкого диска, элементов управления, индикации и разъемов. Сейчас я думаю, что проще было напечатать весь корпус целиком – вышло бы аккуратнее и не сильно дороже, но уже как сделал, так и будет.
Windows.
MS-DOS 6.22 – это конечно хорошо, но настоящий компьютер в современном смысле должен быть на винде или что-то типа того.
Для процессора 8088 доступны только самые первые версии Windows. Точнее его предел – это версия 3.0. Дальше уже нужен процессор 80286.
Windows 3.x устанавливается как дополнение к MS-DOS. После загрузки надо ввести команду win и Windows запустится. (Ну или сразу сделать это в автозапуске.)
Тормозит конечно, но работает. Торможения в основном на графических моментах типа перетаскивания окон или других элементов. Можно в карты поиграть.
Вся история заняла чуть меньше чем полтора года. Компьютер теперь в моем личном музее самоделок. Какой-то пользы от него я не вижу, но было интересно сделать.
Этот пост является упрощенной версией моей статьи на Хабре. Здесь, на Пикабу, очень сильно меньше технических деталей. Схема, если кому-то интересно, вот здесь: Схема
К сериям микросхем типа HC / ALS прошу не придираться. На схеме показана только логика. Паял то, что было проще купить. Главное, что оно работает.
Теперь думаю не замахнуться ли мне на ПК на базе 286-го процессора?







































