Есть много интересных способов провести новогодние праздники, но поскольку я уже старенький — вместо классических алкогольного угара, ведра оливье и просмотра «Иронии судьбы» выбрал себе более редкое и необычное занятие.

Слева направо: Borland Turbo C 2.01 из 1989 года, FreeBSD 15 от 2025го и PC DOS 2.0 из 1983.
Слева направо: Borland Turbo C 2.01 из 1989 года, FreeBSD 15 от 2025го и PC DOS 2.0 из 1983.

Этой статьей продолжаются мои изыскания на тему винтажной разработки и на этот раз показываю почтенной публике как собрать и запустить программу на С для самого первого PC.

Того самого прародителя вашего домашнего компьютера, с которого началась эра PC-совместимых компьютеров.

Да, мы снова тревожим дух компьютерных предков, во славу науки.

IBM 5150

Процитирую википедию:

The IBM Personal Computer (model 5150, commonly known as the IBM PC) is the first microcomputer released in the IBM PC model line and the basis for the IBM PC compatible de facto standard.

Тут нечего добавлять от себя, поскольку все эти факты — часть мировой истории компьютерной индустрии, многократно описанные в книгах и статьях.

Так выглядит один из действующих образцов, доживших до наших дней:

Обратите внимание на версию DOS на экране.
Обратите внимание на версию DOS на экране.

C другого ракурса:

5.25' дисковод. Две штуки. Нижняя модель на самом деле 5160 - с жестким диском вместо флоппи.
5.25' дисковод. Две штуки. Нижняя модель на самом деле 5160 - с жестким диском вместо флоппи.

Вот тут можно найти еще фото, в том числе внутренностей этой замечательной машины. Интересное видео с процессом восстановления модели 5150:

Скажу сразу:

нет, я не застал эти компьютеры и никогда не видел оригинальный IBM PC

Моя история c ИТ началась сильно позже — в 90е, с PC-совместимого 286го в школе и списанного 386го, который стал моим первым домашним компьютером. Так что разработка для первого PC для меня точно такое же открытие как и для вас, дорогой читатель.

Теперь стоит рассказать про инструментарий разработки на компьютерах тех лет, который сильно отличается от современного:

Знакомые всем, кто учился в школе в 90е синие окошки.
Знакомые всем, кто учился в школе в 90е синие окошки.

Borland Turbo C

Одна из самых популярных и известных сред и средств (поскольку в составе был еще и одноименный компилятор) разработки на рубеже 80х-90х:

Turbo C is a discontinued integrated development environment (IDE) and compiler for the C programming language from Borland. First introduced in 1987, it was noted for its integrated development environment, small size, fast compile speed, comprehensive manuals and low price.

Собственно продукция фирмы Borland долгое время была эталоном того как должны выглядеть, распространяться и продаваться «программы для программистов».

Множество идей и подходов, реализованных Борландом были цинично украдены неоднократно воспроизводились в других средах разработки.

Продукты Borland сломали психику сильно повлияли на несколько поколений программистов по всему миру, а на просторах РФ с начала 90х и по середину «нулевых» практически любая разработка вообще подразумевала использование продукции этой компании в том или ином виде.

Хотя конечно речь идет не о C или C++ а о куда более известном в широких программистских кругах Borland Turbo Pascal и выросшим из него Delphi, ставшей крайне популярной в наших краях.

Что же касается моего опыта, к сожалению Borland Turbo C и более поздний Turbo C++ я не застал, начав погружение в разработку на С/C++ гораздо позже — с Microsoft Visual Studio 6.0 и уже под Windows.

Зато еще в 1996м году в обычной средней школе посреди сибирских пердей смог в полной мере насладиться другим продуктом фирмы Borland.

PC-DOS 1.0 в эмуляторе.
PC-DOS 1.0 в эмуляторе.

PC-DOS

Так вышло, ��то для первого продукта, предназначенного для обычных а не корпоративных пользователей — PC, в IBM было принято судьбоносное решение:

поручить разработку операционной системы для разрабатываемого персонального компьютера внешнему подрядчику — Microsoft.

Этот проект дал огромный толчок к развитию «мелкомягких» и заложил основу будущей платформы Wintel, гегемонию которой вы можете наблюдать и поныне, достаточно взглянуть под стол или на любимый ноутбук.

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

Лишь отмечу, что как-то так появилась на свет эта новая операционная система — PC DOS:

86-DOS was rebranded IBM PC DOS 1.0 for its August 1981 release with the IBM PC.

Именно эту первую версию я хотел использовать для демонстрации в эмуляторе и запуска собранных программ, но довольно быстро столкнулся с особенностями разработки тех лет:

When developing the early DOS versions, there was no linker. The SCP ASM.COM assembler did not produce object files. It had a built-in locator and produced HEX files (text files) which were converted by HEX2BIN.COM into binary executable files. It is likely that IBM and Microsoft exchanged HEX files rather than binaries, and those were converted into binaries as required.

Переводя с технического английского на обыкновенный русский: это полный пэ.

Стало понятно, что не выйдет собрать приложение под первую версию PC-DOS используя Borland Turbo C, даже с использованием черной магии и колдовства чего-то такого:

tcc -c -ms main
tasm c0 /D__TINY__ /D__NOFLOAT /t/mx;
tasm setargv /D__TINY__ /t/mx;
tlink c0 main setargv /c/m,main 

Я честно пытался все это повторить, но увы — на первой версии PC DOS бинарник так и не запустился, зато на 2й и выше все заработало без всяких дополнительных извращений с ассемблером и линковщиком.

Заработало вообще все, включая FizzBuzz на C++ из предыдущей статьи:

Напомню, что этот FizzBuzz написан на современном C++ и собран в виде 16-битного EXE под DOS.
Напомню, что этот FizzBuzz написан на современном C++ и собран в виде 16-битного EXE под DOS.

Желание показать в статье Borland Turbo C «с синенькими панельками» возобладало над потребностью сборки «Hello, world!» любым возможным способом, вроде переписывания кода на ассемблер, на котором и шла разработка самой DOS.

«Нормальные герои всегда идут в обход» (ц)

Мы — нормальные герои, поэтому вот он, тот самый обход:

виртуально проапгрейдить эмулируемый IBM 5150, запустив на нем более современный PC DOS 2.х.

Апгрейд операционной системы было нормой даже для конца 80х, тем более что следующая выпущенная модель PC 5160 поставлялась как раз со второй версией PC DOS.

Теперь переходим к эмулятору.

Запущенный эмулятор PCE под Solaris 9 (!) на SPARC, в качестве демонстрации возможностей.
Запущенный эмулятор PCE под Solaris 9 (!) на SPARC, в качестве демонстрации возможностей.

Эмулятор PCE

Помимо ностальгии по Борланду и давно забытой ОС из 80х, хотелось познакомить широкую аудиторию с одним удивительным, но малоизвестным проектом:

PCE is a collection of microcomputer emulators.

Технически это не один а четыре разных эмулятора винтажных компьютеров 80х-90х, каждый из которых представляет интерес:

  • PCE/atarist is an Atari ST emulator. It emulates the various ST and Mega ST models.

  • PCE/ibmpc is an IBM PC 5150 emulator. It emulates an IBM PC 5150 or an IBM PC/XT 5160.

  • PCE/macplus is a classic Macintosh emulator. It emulates a Macintosh 128K, Macintosh 512k, Macintosh 512ke, Macintosh Plus, Macintosh SE or a Macintosh Classic.

  • PCE/rc759 is a Regnecentralen RC759 Piccoline emulator.

В рамках статьи мы будем использовать лишь эмулятор IBM PC 5150 — того самого первого PC, что не мешает посмотреть остальные, хотя-бы в виде готовых сборок.

Благо что там много чего интересного:

Уверен, о PC/IX большинство читателей узнало сегодня впервые.
Уверен, о PC/IX большинство читателей узнало сегодня впервые.

Ниже несколько скриншотов с примерами широко известных программ, запущенных в этом эмуляторе:

Microsoft Word 1.1a (VGA 640*480*16)
Microsoft Word 1.1a (VGA 640*480*16)
Deluxe Paint II (EGA 640*350*16)
Deluxe Paint II (EGA 640*350*16)
Adobe Illustrator 3.0.1
Adobe Illustrator 3.0.1
TOS 1.04 (640*200*4)
TOS 1.04 (640*200*4)

Окружение

Поскольку доступа к настоящему IBM 5150 у меня нет (да это намек владельцам винтажных компов — пишите, если хотите чтобы ваши питомцы приняли участие в новых статьях), придется в очередной раз эмулировать.

Cам процесс разработки будет происходить, как и в прошлый раз в куда более современном и быстром Dosbox, который не совсем эмулятор.

Что позволит обойти ряд проблем, связанных с пробросом файлов — Dosbox реализует прозрачную эмуляцию поверх реальной файловой системы хоста.

Dosbox известен и популярен, поэтому наверняка будет в вашей ОС, коль уж бинарные сборки есть даже для Windows.

Хостом, на котором будет работать весь этот цирк традиционно выступит FreeBSD 15.

Для доставки собранных приложений внутрь эмулятора IBM 5150 я как и в истории про Digital Mars буду использовать пакет mtools:

Mtools is a free software collection of utilities to allow a Unix operating system to manipulate files on an MS-DOS file system, typically a floppy disk or floppy disk image.[2]3]

Установка

Начнем процесс с самого замороченного в этой истории — с эмулятора PCE. Заморочек с ним целых две:

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

  • Во-вторых, из-за истории с первой версией PC-DOS (см. выше), есть необходимость дополнительной правки конфига, для того чтобы подсунуть эмулятору образ дискеты с PC-DOS 2.x.

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

К сожалению автор эмулятора (Hampa Hug) свой проект немного запустил, перестав с 2013 года выпускать номерные версии и запрятав ссылку на свежие сборки:

13 лет выпускать снепшоты "текущей версии" это мощно.
13 лет выпускать снепшоты "текущей версии" это мощно.

Для статьи я использовал последнюю snapshot-версию от 2025 года, прямая ссылка на исходники и сборку машины 5150 под Windows.

Скачиваем архив, распаковываем и запускаем сборку:

wget http://www.hampa.ch/pub/pce/pre/pce-20250420-cc0c583c/pce-20250420-cc0c583c.tar.gz
tar xvf pce-20250420-cc0c583c.tar.gz
cd pce-20250420-cc0c583c
./configure --prefix=/opt/own/pce

Тут есть нюанс:

эмулятор не заработает «из коробки» — из каталога сборки, его будет необходимо обязательно установить с помощью вызова make install

Чтобы не ломать действующую систему (по-умолчанию все устанавливается в системный /usr) и был указан префикс /opt/own/pce скрипту configure.

Запускаем сборку, напомню что дело происходит на FreeBSD, где есть свой отдельный make, не совместимый с GNU Make, используемый в Linux, так что необходимо использовать команду gmake вместо make:

gmake
gmake install

После успешной сборки и установки, должны появиться вот такие бинарники:

pce-ibmpc мы и будем использовать далее.

Следующим шагом забираем готовую сборку PCE под Windows отсюда.

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

Шаги:

mkdir pc-5150
cd pc-5150
wget http://www.hampa.ch/pub/pce/pre/pce-20250420-cc0c583c/machines/pce-20250420-cc0c583c-ibm-pc-pcdos-1.00.zip
unzip pce-20250420-cc0c583c-ibm-pc-pcdos-1.00.zip 

Готовая сборка — только под Windows, поэтому скрипты запуска выглядят как BAT-файлы, их будет необходимо переделать для запуска в Linux/BSD.

Было:

cat run-cga.bat 
bin\pce-ibmpc.exe -v -c pce-5150.cfg -l pce.log -g cga -r

Стало:

/opt/own/pce/bin/pce-ibmpc -v -c pce-5150.cfg -l pce.log -g cga -r

Префикс /opt/own/pce — тот самый, который мы указывали скрипту configure при сборке эмулятора.

Скриптов запуска два, поскольку у первого PC было два варианта адаптеров для подключения монитора: CGA и MDA, разными скриптами эмулируемая система запускается с разными типами мониторов.

Для большего антуража я использовал CGA-версию.

Скан настоящей 5.25' дискеты, с PC-DOS 2.10
Скан настоящей 5.25' дискеты, с PC-DOS 2.10

Скачиваем архив с PC-DOS 2.10 вот отсюда, внутри будут отсканированные фото оригинальных дискет и два IMG-файла — образы дискет с PC-DOS.

Нам нужен только первый, копируем его в каталог cо сборкой эмулятора:

 cp Disk01.img pc-5150/data/images/

Следующим шагом надо указать в конфиге эмулируемой системы путь к образу дискеты с PC-DOS 2.10.

Открываем файл pce-ibmpc.inc в каталоге data, находим вот такой блок:

И вставляем путь к Disk01.img, закомментировав остальные варианты:

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

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

Если все сделано правильно, эмулятор загрузится с 2.10 версией PC-DOS:

Узрите историю!
Узрите историю!

Но это еще не все.

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

Создаем образ дискеты на 360 килобайт в каталоге pc-5150/data/images:

cd pc-5150/data/images
mformat -C -t 40 -h 2 -n 9 -i floppy360k.img

Создаем тестовый файл и копируем его внутрь образа:

echo "This is test!" > test.txt
mcopy -i floppy360k.img test.txt ::test.txt

Прописываем созданный образ дискеты в том же конфиге pce-ibmpc.inc но для второго флоппи-дисковода:

Должно получиться что-то такое:

Если все прошло успешно, будет доступен диск B:, перейдя на который можно увидеть созданный тестовый файл с данными:

Узрите, ибо грядет!
Узрите, ибо грядет!

Теперь, в полной мере насладившись столь винтажной системой, переходим ко второй части — к среде разработки из 80х.

Из тысяча девятьсот восмидесятых.

Borland Turbo C

На известном (в узких кругах) archive.org нашлась эпическая сборка «Borland Turbo C 2.01», в которой собраны все необходимые утилиты для разработки, документация и куча примеров исходного кода:

Нас интересует файл BorlandTurboC201-megapack.zip
Нас интересует файл BorlandTurboC201-megapack.zip

Причем все эти радости готовы к использованию в Dosbox без дополнительных приседаний.

Так выглядит каталог с примерами из этого «мегасборника»:

Напоминаю, что все это богатство из 80х - начала 90х.
Напоминаю, что все это богатство из 80х - начала 90х.

Соответственно скачиваем, распаковываем и запускаем:

dosbox RUNHACK.BAT

Получаем мощные вайбы ностальгии:

С тех пор "синие окошки" стабильно стали ассоциироваться с программированием и компьютерами.
С тех пор "синие окошки" стабильно стали ассоциироваться с программированием и компьютерами.

Разработка

Вот он, момент истины, ради которого мы заморачивались и страдали:

настоящая разработка 80х, прямо на вашем современном компьютере!

Сейчас будет много картинок и видео, выбивающих слезу ностальгии у любого олдфага, учившегося в школе в 90е.

Для начала покажу как выглядит открытие файла с исходником на С:

Это был первый раз, когда функциональные клавиши на клавиатуре (F1-F12) полностью оправдывали свое название, поскольку все основные действия в среде разработки Борланда запускались с их помощью.

Более того:

эти функциональные клавиши и их назначение в среде от Борланда (правда для Паскаля) мы когда-то заучивали в качестве домашнего задания.

На уроках в школе, ага.

Так выглядит сборка и запуск классического «Hello, world» прямо из среды:

Вызов getch() добавлен ради паузы, без него программа сразу завершится и произойдет возврат в среду разработки.

Диалог с предложением сохраниться, автосохранения тогда еще не придумали:

Известное и довольно объемное BGIDEMO с демонстрацией работы разных графических режимов:

Так оно выглядит в работе:

Реализация связанного списка на С (когда-то было любимым вопросом Джоэла Спольски на технических интервью):

Не забываем, что код выше — из 80х, поэтому практически все использумые функции успели устареть и ныне являются небезопасными для использования.

Хотя я и не понимаю до сих пор, как программная функция смеет может угрожать человеку.

Запуск

Наконец последняя часть сегодняшнего шоу:

запуск нашего тестового приложения в эмуляторе PC 5150

Жмем F9 в любимом Turbo C, запуститcя процесс компиляции и линковки:

Итоговый файл HELLO.EXE будет находиться в каталоге TC:

Копируем его внутрь образа дискеты, который мы создавали выше и подключали к эмулятору:

mcopy -i floppy360k.img ../../../../megapack/TC/HELLO.EXE  ::HELLO.EXE

Теперь запускаем эмулятор PC 5150, переходим на диск B: и запускаем наш кастомный «Hello, world»:

Поздравляю, вы только что создали и запустили программу для самого первого PC на свете.

Эпилог

Как ни странно, но BGIDEMO с демонстрацией возможностей Borland также запустилось на PC DOS:

Чтобы приложение заработало, помимо самого DEMO.EXE, надо скопировать на образ дискеты файл CGA.BGI.

Кстати если нет желания заморачиваться cборкой эмулятора PCE из исходников, можно спокойно использовать его Windows-версию с помощью Wine:

wineconsole run-mda.bat

Все отлично работает даже во FreeBSD:

Вот такая она, прикладная некромантия.

P.S.

Более вольный оригинал как обычно в нашем блоге, бекстейджи, дополнительные материалы мы выкладываем на нашем канале, еще теперь пишем делаем видеоролики: VK Video, Rutube, Youtube.

Также поздравляем всех пользователей Хабра с наступившим 2026м годом!