Про память на i86

Nov. 29th, 2025 01:44 pm
vak: (Знайка)
[personal profile] vak
В комментах возникло обсуждение способов расширения памяти на XT-шке. Вспомню исторические факты конспективно.

8088 и PC XT

Процессор 8088 имел 20 разрядов физического адреса. Поэтому адресовать мог только 2^20 = 1 мегабайт. Из них айбиэмовские инженеры отвели 640к для программ и 384к для хардвера (биосы, видеопамять). Позже придумали EMS, где в пространстве 384к создавалось окно, и через него можно было пролистывать несколько мегабайт дополнительной памяти. Драйвер EMM.SYS.

286 и PC AT

У процессора 286 было уже 24 разряда физадреса. То есть уже 16 мегабайт памяти, но только в защищённом режиме. Что для MS-DOS не годилось.

В незащищённом режиме 286 мог адресовать 64 килобайта сразу за первым мегабайтом. Эту область научились использовать, и назвали HMA. Но для совместимости приходилось жульничать с адресным сигналом A20. Драйвер HIMEM.SYS и иже с ним.

386

Тут уже 32-битный физадрес, и память хоть до 4 гигабайт. Драйвер EMM386.SYS.
vak: (Путиномедвед)
[personal profile] vak
Заржавело всё. Появилось видео с падением и взрывом ракеты на полигоне вчера под Оренбургом.

vak: (Знайка)
[personal profile] vak
Освежим память про системы программирования на персональных компьютерах конца 80-х. Я накачал с сайта winworldpc.com разных компиляторов и устанавливаю их один за одним на XT-шке. Начал с Борланда как самого уважаемого. Складывать буду на Гитхабе:Там не только бинарники, но и куча полезных примеров в исходных текстах.

vak: (Знайка)
[personal profile] vak
Для ELKS есть и Си компилятор: проект 8086 Toolchain. Если собрать его по инструкции, он интегрируется в образ диска ELKS. Вот пример компиляции классического Hello World:



Смотрим получившийся ассемблерный код.

Open Watcom

Nov. 28th, 2025 12:10 am
vak: (Default)
[personal profile] vak
Помните Си компилятор Watcom из 90-х? Оказывается, он продолжает существовать в опенсорсном виде. Свежие бинарники можно скачать по ссылке:

github.com/open-watcom/open-watcom-v2/releases/download/Current-build/ow-snapshot.tar.xz

Поддерживаются языки Си, Си++ и Фортран, платформы DOS, OS/2, Win16, Win32, Win64, Linux i386, Linux x64.

Юникс на XT-шке

Nov. 27th, 2025 03:46 pm
vak: (Знайка)
[personal profile] vak
Проблема с делением на ноль в ядре ELKS неожиданно разрешилась сама собой. Только я примерился отладочную печать вставлять, собрал для начала ELKS из свежих исходников. Процесс несложный, только делать это надо в линуксе.
sudo apt-get install texinfo libncurses5-dev libelf-dev ncompress bison flex
git clone https://github.com/ghaerr/elks.git
cd elks
./build.sh
Получаем образ флопика:
$ ls -l image/*.img
-rw-rw-r-- 1 vak vak 1474560 Nov 27 08:15 image/fd1440.img
Только это 1.44 мегабайта, а надо 360 килобайт. Не вопрос.
$ . ./env.sh
$ cd image
$ make fd360-minix
...
$ ls -l fd360-minix.img
-rw-rw-r-- 1 vak vak 368640 Nov 27 08:20 fd360-minix.img
Дай, думаю, загружусь для начала с этого флопика, вдруг упадёт как-то иначе. И ядро стартовало в лучшем виде! Видно, недавно починили проблему кривого CMOS.



В процессе изучения сборки ELKS выяснилось, что вовсе необязательно возиться с флопиками. Можно построить сразу образ жёсткого диска и записать на SD карточку:
$ cd image
$ make hd64-minix
...
$ ls -l hd64-minix.img
-rw-rw-r-- 1 vak vak 67107840 Nov 27 08:47 hd64-minix.img
$ dd if=hd64-minix.img of=/dev/sda
Имеем вот такой "жёсткий диск":



Грузимся с SD карточки:



Вот вам Линукс на XT-шке, а вы не верили. 😀

Если у вас есть PC XT или AT с адаптером XT-IDE, готовый образ диска с установленным Линуксом можно скачать здесь: elks-v0.9.0-hd64-c86.zip. Я обновил образ, теперь там Си компилятор в копмлекте.

Установку ELKS на чистый диск с загрузочного флопика я тоже проверил. Проще чем в MS-DOS: всего две команды mkfs и sys.



Это базовая юниксная система. Дальше будем выяснять, как установить Си компилятор. Задача собрать Демос Командер.

Мультипортовка

Nov. 27th, 2025 02:07 pm
vak: (Default)
[personal profile] vak
Помните забытое слово из 80-х? Мультипортовая плата означала последовательный интерфейс COM (для модема), параллельный интерфейс LPT (для принтера) и интерфейс к игровому джойстику. И ещё на ней стояла важная фишка конкретно для XT: часы реального времени RTC. Благодаря литиевой батарейке часы постоянно шли, даже когда компьютер выключен.



Поскольку родной биос XT-шки ничего не знает про RTC, для автоматической установки времени в MS-DOS требовались отдельные утилитки типа GETCLOCK.COM и SETCLOCK.COM. Каждый производитель мультипортовок поставлял свои версии этих утилит. Совместимость их с материнскими платами была тонким местом.

Начиная с PC AT часы реального времени встроили в материнскую плату, и проблема совместимости RTC/CMOS снялась.

Эта конкретно плата называется DIO-200, производитель DFI. Соответствующий софт ещё предстоит отыскать.

Нашлось описание от модели DIO-200X: diamond-flower-dio-200x-users-manual.pdf. Но там RTC сделан на чипе MM58167, а у меня UM82C8167.

Divide fault

Nov. 26th, 2025 08:43 pm
vak: (Default)
[personal profile] vak
Пытаюсь грузить Линукс-86 на реальной XT-шке. Что-то не так: выскакивает деление на ноль.



Сравните с успешной загрузкой на симуляторе:



Может быть дело в умершей батарейке CMOS. Поэтому с определением типа флопика возникает проблема.
vak: (Default)
[personal profile] vak
Прикольно, конечно, играть в Диггера как в юности, и мы ещё наиграемся. Но есть и более весёлые занятия на XT-шке. Вчера я провёл насыщенный вечер, выясняя шансы установить юникс на имеющемся хардвере.

Из юниксов для IBM PC XT (model 5160) существовали:Всё это я вчера опробовал, одно за другим. Все образы флопиков доступны в сети, и известно, что каждый из них кому-нибудь да удалось оживить на каком-нибудь симуляторе.

Но мне ж надо на реальном имеющемся железе. Подобрал я симулятор, воспроизводящий конфигурацию, максимально близкую к моей. Есть такой проект 86Box. Народ собрал качественную коллекцию конфигураций и образов ПЗУ компьютеров и периферии от разных производителей. Нашлась там и конфигурация, близкая к моей Generic XT clone, и видеоадаптер TVGA8900, а главное - дисковый контроллер XT-IDE. Всё это я сконфигурил и принялся ставить вышеуказанные юниксы.

С юниксами вот какая проблема. Всё упирается в обмен с жёстким диском. Создателями было задумано, чтобы чтение-запись диска делалась через системный вызов int 13h. Выполняется этот вызов биосом, находящимся в контроллере диска, и всё идёт как надо. Но юниксу неудобно ходить в биос. Юникс задуман по другому: драйвер диска находится в ядре и напрямую ходит в аппаратные регистры контроллера диска.

Все четыре упомянутые юниксы (Xenix, Venix, PC/IX и Minix) так и устроены. Они понимают только родной дисковый контроллер от IBM. А у меня XT-IDE, и в нем аппаратные регистры совсем другие. Нет шансов. Я честно попробовал загрузить каждый юникс и убедился, что установщик падает ровно на попытке работать с диском.

Однако есть свет в окошке! И это ELKS. Так называется проект, где народ поставил задачу протащить верблюда Линукс через игольное ушко. Он же Гога, он же Жора Linux-86. Я наблюдал эту странную затею с середины 90-х. Думал применить для какого-нибудь встроенного хардвера, но пользы не выходило. Однако здесь он сыграл в полный рост. Загрузился с флопика и честно встал на диск под XT-IDE. Никаких вопросов. Осталось проделать то же самое не под 86Box, а на реальном железе, и у нас будет приличный юникс, даже с подключением к интернету.

Вот пример загрузки ELKS на симуляторе Turbo XT.

vak: (Знайка)
[personal profile] vak
Набрёл на критическую статью 1986 года про новую клавиатуру Model M от IBM и её ужасный дизайн. 😀



А это картинка из тогдашней рекламы IBM.

Клавиатура для XT-шки

Nov. 24th, 2025 09:22 pm
vak: (Знайка)
[personal profile] vak
Приехала клавиатура для коллекционной писишки: аутентичная Compaq в идеальном состоянии. Характерный признак древности: отсутствие клавиши Windows. 😀







Только клавиатурный интерфейс не родной XT, а более поздний IBM PS/2. У XT-шки не только разъём, но и протокол отличается. У всех писишек начиная с AT клавиатуры работали одинаково: 1 стартовый бит, 8 данных, 1 чётность и 1 стоп бит. У XT же всё по другому: 2 стартовых, 8 данных, 1 бит make/break, и 1 стоповый. Но ничего, новозеландцы придумали адаптер, транслирующий протокол на лету.

vak: (Знайка)
[personal profile] vak
Стандартом де-факто для PC XT был видеоадаптер CGA (1981 год разработки). Схемотехнически он красиво сделан, но разрешения и цветности недоставало. К 1984-му году появился EGA, а в 1987-м VGA. В наши дни всё ещё можно отыскать дисплеи с интерфейсом VGA. Есть и недорогие конвертеры VGA в современный интерфейс HDMI.

Существовали видеоадаптеры VGA для 8-битной шины ISA, но сейчас найти их крайне тяжело. К счастью, отыскался Trident TVGA8900C, который переключается в режим восьмибитности. Для этого надо на нём установить джампер J4. На моей плате джампер не был установлен, пришлось просто запаять перемычку.



Вынимаем из XT-шки плату CGA и вставляем VGA. На материнской плате надо изменить микропереключатели, чтобы биос не пытался искать видеопамять CGA.



Надо поставить SW 5 и 6 в положение "on", то есть "no display adapter". Фишка в том, что CGA (и MDA) обслуживаются основным биосом. А на платах EGA и VGA уже работает свой собственный биос.



Загружаемся - совсем другое дело! Сравните с CGA.



И даже тетрис повеселел. Для сравнения смотрите видео с CGA.



Теперь куча разных игрушек должна запускаться. Буду собирать коллекцию.
vak: (Default)
[personal profile] vak
Нет предела совершенству. В развитие XT-IDE, фирма TexElec выпускает контроллер, позволяющий использовать стандартную SD карточку в качестве диска в компьютере PC XT.



Вот вид сбоку. Интересно, что "железку" (крепёжную скобу) к платам ISA теперь можно изготавливать на 3D принтере.



Самая маленькая SD карточка в моём запаснике имеет размер 250 мегабайт. Команда fdisk разбивает это дело на восемь разделов, с C: до J:. Вот так выглядит загрузка XT-шки. Можно видеть сообщения дискового биоса.

XT-IDE

Nov. 22nd, 2025 05:06 pm
vak: (Default)
[personal profile] vak
К 2000-м годам ретро энтузиасты осознали, что древние компьютеры PC XT почти вымерли, по одной и той же причине: все жёсткие диски типа MFM заржавели и вышли из строя.

Возник опенсорсный проект по разработке нового дискового контроллера под названием XT-IDE. Контроллер для 8-битной шины ISA позволяет подключать стандартные IDE-накопители, в том числе CompactFlash. Также сделали качественный биос к дисковому контроллеру. Исходники: github.com/glitchwrks/xt_ide

Нынче фирма The Glitch Works продаёт контроллеры XT-IDE на Ebay как в виде конструктора для самостоятельной пайки, так и в собранном виде. Один такой контроллер я и приобрёл. А также переходник для CompactFlash к нему.



Установка джамперов:



Вот такой экран загрузки биоса. Стрелками можно выбрать, откуда грузиться: диск C, флопики A или B, или загрузчик в ПЗУ.



Чтобы карточка CompactFlash надёжно опозналась, её лучше сначала "стереть" на другом компьютере. То есть записать несколько килобайт нулей, к примеру Линуксной командой "dd bs=1k count=100 if=/dev/zero of=/dev/sdX", где sdX - имя флешки на вашем компьютере.

После чего грузим MS-DOS с флопика и командой fdisk создаём разделы. Двухгигибайтную флешку XT-IDE видит как диск с 997 цилиндрами и 63 головками. Раздел максимально разрешённого досовского размера (32 мегабайта) занимает 16 цилиндров. Для начала создаём раздел C.

Снова перезагружаемся с флопика и форматируем раздел С как системный (format c: /s). Переписываем туда файлы MS-DOS с флопика, и диск готов. Добавим Нортон Командер для удобства. Настроим config.sys и autoexec.bat.

Перезагружаемся с диска. Вот так теперь выглядит писишка:



Пробовал я и хитачевский микродрайв. XT-IDE опознаёт его без проблем, но поскольку он 4-гигабайтный, показывает как диск с 127 головками. От этого MS-DOS маленько дуреет. Создать раздел даёт, но читать его не может.
vak: (Default)
[personal profile] vak
Увы, диск не заработал. Не раскручивается чисто механически, похоже. За 38 лет подшипники приказали долго жить.

Полноразмерная плата в писишку, в задней части которой закреплён жёсткий диск.



Контроллер WD1002 в идеальном состоянии. Интересный может получиться проект для самоделкиных: заменить неработающий жёсткий диск репликой на основе Raspberry Pi Zero или типа того. Интерфейс ST506 должно быть нетрудно повторить.



Жесткий диск Miniscribe 8438 внешне прекрасно сохранился, но больше не жужжит.





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



Понятно, что с этим диском ловить нечего, и надо искать замену. К счастью, современная замена существует: так называемый контроллер XT IDE. Про него в следующем посте.
vak: (Default)
[personal profile] vak
Как на маке, имея образ флопика, достучаться до его содержимого? Лайфхак:
hdiutil attach -imagekey diskimage-class=CRawDiskImage floppy.img 
Флопик будет подключен как файловая система, как если бы его воткнули в порт USB:
/dev/disk8        /Volumes/NO NAME
vak: (Аристипп)
[personal profile] vak
Все мозги разбил на части, все извилины заплёл. Интересно, подтверждаются ли эксперименты этого чувака независимыми исследователями.

vak: (Знайка)
[personal profile] vak
Есть успехи на фронте ретрокомпьютинга. Вчера удалось загрузить MS-DOS 3.30 с флопика.



Путь к этому делу был тернистый.
  1. Машина пришла с жёстким диском, но он не работал. Физически не раскручивался. Было понятно, что надо браться за флопики.
  2. У меня имелся исправный пятидюймовый флоповод и "свежая" неоткрытая упаковка флопиков 1.2 Мбайта.
  3. Встала задача сформатировать флопик и записать загрузочный диск MS-DOS. Но как это сделать? К современному лаптопу или даже настольному компьютеру пятидюймовый флоповод не подключишь. Прошерстил свою коллекцию ретро компьютеров на тему наличия интерфейса к флоповоду - отыскались Pentium 4 и Celeron. Эксперименты показали, что пентиумный компьютер понимает только трёхдюймовые флопы. Зато у селерона оказался выбор типа флоповода в биосе.
  4. Стал выяснять какой MS-DOS выбрать для XT. Узнал много нового про историю разных досов и соответствующего писишного хардвера. Исторически последней массовой версией именно для 8086 оказался MS-DOS 3.31. Более поздние или не грузились, или кушали заметно больше резидентной памяти.
  5. Загрузочных флопиков MS-DOS в сети куча, но чтобы именно версия 3.31 и образ 1.2 мегабайта - отыскался только один: winworldpc.com/product/ms-dos/331.
  6. На селероне у меня установлен Linux Debian. Внезапно обнаружилось, что пару лет назад из ядра Линукса убрали возможность форматировать флопы. Соответствующий системный вызов в драйвере флопа просто не выполняется. Нужно пересобрать модуль floppy.ko, благо он загружаемый.
  7. Удивительным образом в Линуксе до сих пор невозможно скомпилить один отдельно взятый загружаемый модуль. Перекомпиляция всего ядра на селероне заняла бы не меньше суток. И даже перекомпиляция только модулей. А сборка только драйверов блочных устройств возможна, но не фурычит.
  8. Проблема решилась установкой того же Дебиана на виртуальном i386 на маке, и компиляцией линуксного ядра в нём. Бинарник драйвера был переслан на селерон и задействован для форматирования флопа.
  9. Загружаемый 1.2-мегабайтный флопик был записан, но... XT-шка отказалась с него грузиться. И тут пришлось чесать репу. Смутные воспоминания довелось освежать гуглением. Не знал XT-шный флоповый контроллер и биос про существование 1.2 мегабайтных флопов. Они стали поддерживаться только в PC AT и позже. Надо добывать флопы 360 килобайт.
  10. Заказ пачки флопов 360к через Ebay приехал через несколько дней.
  11. Я решил, что для надёжности надо эти флопы и форматировать на XT-шном флоповоде. Ведь биос в селероне их вроде понимает. Убил два дня на борьбу с линуксным флоповым драйвером и утилитами floppycontrol и superformat. Коту под хвост: XT-шные флоповоды отказывались форматировать. Выдавали i/o error.
  12. Опять смутные воспоминания и мысль: ведь 1.2 мегабайтные флоповоды умели писать 360 килобайтные диски. Взял изначальный флоповод, и действительно, удалось сформатировать 360-килобайтные флопы.
  13. Образы загрузочных флопиков отыскались только версии MS-DOS 3.30: winworldpc.com/product/ms-dos/3x.
  14. Результат загрузки вы видите на фотке.
Дальше будем оживлять жёсткий диск.
vak: (Default)
[personal profile] vak
Вынесу из комментов, где [personal profile] chaource предложил реализацию на Хаскеле.

В исходной статье Робинсона алгоритм звучит не особо ясно.
The following process, applicable to any finite nonempty set A of well-formed expressions, is called the Unification Algorithm:
  • Step 1. Set σ₀ = ε and k = 0, and go to step 2.
  • Step 2. If Aσₖ is not a singleton, go to step 3. Otherwise, set σ_A = σₖ, and terminate.
  • Step 3. Let Vₖ be the earliest, and Uₖ the next earliest, in the lexical ordering of the disagreement set Bₖ of Aσₖ. If Vₖ is a variable, and does not occur in Uₖ, set σₖ₊₁ = σₖ {Uₖ / Vₖ}, add 1 to k, and return to step 2. Otherwise, terminate.
Переведём на современный язык.
Step 1. Initialization
  • Start with a substitution σ₀​ = ∅.
  • Let k = 0.
  • Continue to Step 2.
Step 2. Check Whether Unification Is Complete
  • Apply the current substitution σₖ to the entire set A, producing Aσₖ.
  • If all resulting expressions in Aσₖ are identical, the algorithm stops and returns σₖ as the most general unifier.
  • Otherwise proceed to Step 3.
Step 3. Find a Disagreement
  • Identify the first position (in a left-to-right, top-down scan) where two expressions in Aσₖ differ.
  • Let the disagreeing subexpressions be p and q.
Step 4. Process the Disagreement
    Depending on the form of p and q:
    1. If one is a variable and it does not occur inside the other term (occurs-check in modern terminology):
    • Construct a substitution that maps that variable to the other term.
    • Compose this substitution with the current one to produce Aσk+1.
    • Increment k; return to Step 2.
    2. If both are variables but different:
    • Substitute one variable with the other, compose as above, and repeat Step 2.
    3. If both are compound expressions with different functors or different arity:
    • Unification fails; the set has no unifier, and the algorithm terminates unsuccessfully.
    4. If both are compound expressions with the same functor and arity:
    • Add their corresponding arguments to the set of expressions being unified.
    • Return to Step 2.
Бегая глазами по исходникам unify.gisp и по описанию, вроде всё однозначно соответствует, разве нет? Дело же не в количестве строк, а в лёгкости понимания.
Page generated Nov. 30th, 2025 07:39 am
Powered by Dreamwidth Studios