← На главную

C-компилятор собрал сам себя на Am29000, потом переехал на G11V2

16.08.2026 20:41 · hackernews

Оскар Толедо Г. сделал C-компилятор для своего самодельного компьютера на Am29000. До этого он написал оконную ОС в машинных кодах, но так работать стало невыносимо: нужно было планировать каждый байт, двигать код и ловить баги от пропущенных переходов. Готовый компилятор не взять: High-C 29k не купить, а GNU C compiler v2.8.1 требовал минимум 2 МБ RAM, когда у него было 512 КБ, плюс Flex, Bison и поддержку ОС. Поэтому он взял свой старый компилятор для transputer. Первый порт Small-C на Am29000 в декабре 1997 провалился, а в феврале 1998 он поставил DJGPP на 80486 и 6 мая скомпилировал transputer-компилятор.

Деревья выражений сначала хранились в массивах, потом перешли на malloc/free и struct. 13 мая Толедо взялся за парсер: последовательности операторов становились связным списком, вложенные — ветками. Перенос генератора кода занял больше двух недель. У transputer регистры раздавала стековая архитектура, у Am29000 это делает компилятор. В прологе функций он назначает «виртуальные» переменные (обычные, массивы, аргументы), копирует аргументы при необходимости, а если функция ничего не вызывает и использует не больше четырёх регистров, обходится без стекового кадра на gr116-gr119. Иначе кадр делается тремя инструкциями: sub, asgeu, add.

Параллельно он писал ассемблер: набор команд Am29000 ортогональный, у всех арифметико-логических инструкций три операнда. Компилятор портировался в его ОС, мучили утечки памяти. 27 мая компилятор выдал тот же листинг, что и PC-версия, ассемблер для ОС пришлось переносить вручную в машинный код, и 1 июня компилятор собрал сам себя. Потом Толедо случайно затёр машинный ассемблер, поэтому с 22 июня по 1 июля писал текстовый редактор в машинных кодах — 50 КБ. Затем чинил баги плавающей точки, struct-присваивания и неэффективный код. Финальным тестом стала сборка 3D-полигонального модельера для transputer.

Дальше — перенос на G11V2: она little-endian, а G11V1 big-endian, но у Am29000 есть бит порядка байтов. В G11V2 были ISA-слоты и три PCI-слота. Оконная ОС лежала в ROM; нашлись два образа FENIX.BIN: функции переехали с 0x000f0000 на 0x00030000, копирайты 1996-1999 и 1996-2000. В эмуляторе ОС искала SCSI-контроллер SYM53C810, потом видеокарты Cirrus Logic GD-5440, GD-5446 или Trident TGUI-9685. Пришлось ставить заглушки для PCI и разбираться с ISA Plug&Play (порты 0x020b..0x0303). Появились обои с багом цвета курсора, потом ОС зависла на клавиатурных LED. Буквы в панели оказались мусором: GD5440 принимает bitmap для bitblt прямо из памяти, и bitblt пришлось эмулировать как конечный автомат. С диском намучился: buildboot.c собирал FAT в big-endian, файлы не читались, образ на 40 МБ определялся как 24 576 КБ, сектора не читались, потому что файловая обёртка вызывала SCSI-инициализацию, но без карты не искала диски. Помогла инструкция CONST gr96,1.

Читать оригинал →