vak: (Default)
Какие версии MS-DOS умеют файловую систему FAT32 и длинные имена файлов? Чтобы без проблем файлами через SD карточку с линуксом обмениваться. Да почти никакие не умеют. Есть два варианта: неофициальный микрософтовский MS-DOS 7.1 и чуть менее неофициальный айбиэмовский PC DOS 7.1.

MS-DOS 7.1 (он же Win98) всем хорош, скачать его нетрудно, но он требует процессора не ниже i386. Что делает его непригодным для моей задачи - реплики XT-шки.

Остаётся PC DOS 7.1. Когда с середины 90-х Микрософт задвинул дос на дальнюю полку, IBM продолжила его развивать. Есть такой крутой чувак Вернон Брукс, он возглавил айбиэмовскую команду, и до 2003-го они это дело тащили. Добавили и поддержку больших дисков, и длинные имена файлов с FAT32. Видимо нужно кому-то было, может для встроенных применений. И всё продолжает работать на самом простом процессоре 8086 или 8088, к нашему удобству.

Где взять этот самый последний DOS от IBM версии 7.1? Бинарники доступны с официальных сайтов, но надо знать подход.

Есть такой IBM ServerGuide Toolkit. Скачать его можно с сайта Lenovo: ibm_sw_sgtk_1_3_07_anyos_anycpu.zip. Внутри имеются бинарники PC DOS 7.1. Покажу как сделать из них загружаемый флопик.
wget https://download.lenovo.com/servers/mig/systems/support/system_x/ibm_sw_sgtk_1_3_07_anyos_anycpu.zip
unzip ibm_sw_sgtk_1_3_07_anyos_anycpu.zip
cp sgdeploy/sgtk/ads/images/tk_scrub.vfd floppy.img
mdel -i floppy.img ::*.bat
mdel -i floppy.img ::*.sys
mdel -i floppy.img ::dos/*.*
mcopy -i floppy.img sgdeploy/sgtk/DOS/*.* ::dos/
mcopy -i floppy.img sgdeploy/sgtk/DOS/cfgfiles/*.* ::dos/
Готово! В файле floppy.img находится бутабельный флопик.

Чтобы создать раздел FAT32 на диске, используйте команду FDISK32. Размер раздела должен превышать 520 мегабайт, иначе выйдет обычный FAT16. Форматировать раздел FAT32 надо командой FORMAT32.

Можно на этот же флопик положить и Волков Командер для удобства:
wget https://vc.vvv.kyiv.ua/download/vc405sw.zip
unzip vc405sw.zip -d vc
mmd -i floppy.img ::vc
mcopy -i floppy.img vc/*.* ::vc/
Вот так оно смотрится под QEMU.
Image
Готовый образ лежит здесь: pcdos7.1vc.img
vak: (Аристипп)
Добавил я в симулятор жёсткие диски и второй флопик. Теперь можно устанавливать разные ДОСы на диск C: и с ним развлекаться. Вот запуск CHKDSK, к примеру.
Image
+4 )
vak: (Default)
Приобрёл на Ebay чудное устройство: флоповод с USB интерфейсом. Тошиба, не хухры-мухры: настоящее японское качество. Распознаётся как TEAC.

ImageImage

Стал разбираться, как с ним работать. Мак и Линукс отлично видят устройство и автоматически монтируют флопик. Но мне нужен USB протокол или что там на нижнем уровне. Под Линуксом обнаружилась прекрасная утилита ufiformat. Спросим с её помощью возможности устройства. Флопик пока не вставлен.
$ ufiformat -i /dev/sdb
vendor: TEAC
product: FD-05PUB
status block size kb
no 2880 512 1440
Говорит, что умеет форматировать 1440k. Ладно, вставим флопик DD, который 720k.
$ ufiformat -i /dev/sdb
vendor: TEAC
product: FD-05PUB
write protect: off
media type: 2DD
status block size kb
formatted 1440 512 720
formattable 1440 512 720
Флопик распознался как форматированный, и теперь девайс готов форматировать 720k. Забавно. Хорошо, вставим флопик HD, который 1440k.
$ ufiformat -i /dev/sdb
vendor: TEAC
product: FD-05PUB
write protect: off
media type: 2HD
status block size kb
formatted 2880 512 1440
formattable 2880 512 1440
formattable 1232 1024 1232
formattable 2400 512 1200
Флопик тоже ожидаемо распознался. Но что за странные форматы появились в списке, кроме стандартного 1440k?

Оказывается, этот девайс умеет создавать на трёхдюймовом флопике точные копии пятидюймового флопа 1.2M и восьмидюймового флопа 1.25M! Кто бы мог подумать. Наверное для каких-то древних встроенных применений. 

Как общаться с девайсом напрямую? Я набросал на скорую руку пару примеров на Си.
vak: (Знайка)
Официально последней версией MS-DOS считается 6.22, от 1994 года. В ней обнаружилась хитрая фишка: когда система грузится, после сообщения "Starting MS-DOS..." делается двухсекундная пауза. В это время можно нажать F5 или F8, и отменить выполнение скриптов config.sys и autoexec.bat.

К примеру, нажмём F5. Скрипты config.sys и autoexec.bat игнорируются. Экспериментально выяснено, что к тому же эффекту ведёт нажатие Shift, левого или правого.
Image
+2 )
vak: (Аристипп)
Оказывается, бут сектор лучше вызывать не по адресу 07c0:0000, a как 0000:7c00. Казалось бы шило на мыло, однако после правки запустились PC DOS версий 1.10 и 2.10, DR-DOS 3.41, и даже древний CP/M-86 версии 1.1.

Начнём с CP/M-86 1.1. Гари Килдалл утверждал, что микрософтовский DOS был нагло содран с его операционки. Теперь с помощью симулятора можете убедиться сами. 😀
Image
+5 )
vak: (Знайка)
Имеем некоторый прогресс: на симуляторе PC i86 заработали несколько разных версий DOS.
  • MS-DOS 1.12
  • MS-DOS 2.12
  • MS-DOS 3.31
  • PC DOS 3.30
  • PC DOS 4.00
  • DR-DOS 6.0
Я сделал входы в Makefile, чтобы удобно запускать разные версии досов. К примеру "make msdos1".

MS-DOS 1.12 - специальная версия для компьютеров Compaq, 1983-й год. Дискета 320 килобайт.
Image
Видите утилиту TEST.EXE в списке? Это специальная штуковина от Компака для диагностики хардвера. А команда FDISK.COM отсутствует. Эту версию DOS ещё нельзя было установить на жёсткий диск.
+10 )
vak: (Знайка)
Постепенно допиливаю симулятор i86. Вот уже PC-DOS 6.3 стартует. Но не желает устанавливаться, поскольку жёсткий диск отсутствует.
Image
vak: (Знайка)
Я переделал видеоадаптер на SDL2, и вот результат. Бейсик подаёт признаки жизни. Это я запустил "tiltti -", то есть без загрузочного флопа. При этом стартует Бейсик из ROM. Ввёл "print 23+45". В целом оно ещё глючит изрядно: пришлось нажать несколько раз Enter, чтобы увидеть весь вывод. Однако это уже дело техники, повычистить.
Image
vak: (Default)
Подумалось: а ведь на симуляторе PC i86 можно запустить тот самый легендарный IBM Basic, с которого началась фирма Microsoft. Бинарник версии 1.10 лежит здесь. Он кладётся в память процессора по адресу D6000 и вызывается. Использует только стандартные вызовы биоса, кроме работы с аудиомагнитофоном. Он умеет читать и писать аудиокассету командами CLOAD и CSAVE. Это тоже можно как-то эмулировать.

Документация: BASIC_1.1_May82.pdf

Так выглядит IBM Basic на симуляторе PCem.
Image
vak: (Знайка)
Для экспериментов с разными линуксами решил я обзавестись отдельным маленьким компьютером. То, что нынче называется NUC или mini PC. Люблю всё маленькое и элегантное. Китайцы нынче клепают массу разных mini PC, но мне ж надо, чтобы без проблем с драйверами. И ещё тут AMD Ryzen 5, а не какой-нибудь скучный Интел. Памяти 16 гиг на всякий случай, а то проблемы с нею нынче.

ImageImage

Снизу через прорези видно, что внутри вентилятор чуть ли не на весь корпус.

Image

Биос известной конторы American Megatrends. Они были в 80-х в числе первых, кто сваял собственный биос, совместимый с IBM.

Image

Поставил я для пробы Lubuntu и SUSE. Все периферия отлично работает, включая Wi-Fi и Bluetooth.

Померял скорость процессора: 93000 дуремарков. Это 63% от Intel i9 на моём iMac. Потребление в спокойном состоянии 5 ватт, в нагруженном - 17 ватт.
vak: (Аристипп)
Я собрал коллекцию образов загрузочных флопиков с разными версиями DOS: здесь. Надеюсь постепенно оживить все версии на симуляторе. Подумал, а пусть ИИ поведает нам их историю. Здесь краткий конспект на русском, выжимка из Evolution_of_DOS.md.

Ранние годы (1981–1983): строим фундамент

PC DOS 1.10 (май 1982)

Это обновление первой версии для IBM PC. Добавили поддержку двусторонних дискет — с 160 КБ до 320 КБ.

Сейчас звучит смешно. Тогда это было почти удвоение Вселенной.

Исправили ошибки, улучшили работу с файлами, сделали систему стабильнее.

Но:
  • никаких жёстких дисков,
  • никаких каталогов — все файлы в одном списке,
  • команды вроде FORMAT пугали новичков.
Тем не менее система грузилась за секунды на 4,77 МГц. И это было впечатляюще.

MS-DOS 1.25 (август 1982)

Вот тут начинается магия рынка.

Microsoft поняла: если дать DOS не только IBM, но и другим производителям, появится рынок «совместимых ПК».

Так и произошло.

Технически версия почти та же, что PC DOS 1.1. Но стратегически — это шаг, который создал экосистему клонов.

Проблема? Разное «железо». Приходилось настраивать систему под каждого производителя.

Но рынок рос.

PC DOS 2.10 (1983)

Появились жёсткие диски в IBM PC XT. И DOS пришлось взрослеть.

Добавили:
  • иерархические каталоги,
  • поддержку HDD до 10 МБ,
  • AUTOEXEC.BAT (автоматизация!).
Это был переход от «игрушки с дискетами» к настоящему рабочему инструменту.

MS-DOS 2.12

Редкая OEM-версия, адаптированная под специфическое оборудование (Texas Instruments, Compaq).

Это был период фрагментации. Каждый хотел своё. Система начинала разветвляться.

Средний период (1984–1991): рост и усложнение

PC DOS 3.30 (1987)

Теперь поддержка:
  • дискет 1,44 МБ,
  • разделов до 32 МБ,
  • международных кодировок.
Мир становился больше — DOS расширялась.

Но многозадачности всё ещё нет. Управление памятью — довольно примитивное.

PC DOS 4.01 (1988)

Предыдущая версия 4.0 была нестабильной. Добавили DOSSHELL — графическую оболочку. Но система падала.

Версия 4.01 исправила ошибки.

Интересный момент: DOS пыталась стать более «дружелюбной». Но архитектура у неё была не для GUI.

Это как прикрутить руль от автомобиля к велосипеду.

PC DOS 5.02 (1993)

Добавили:
  • полноэкранный редактор EDIT,
  • EMM386 для работы с расширенной памятью.
Вот тут начинается борьба с барьером 640 КБ. Инженерные трюки, верхняя память, EMS, XMS — целый цирк с адресными пространствами.

Но работало!

Расхождение путей (1993–1995)

В 90-е Microsoft переключается на Windows. DOS остаётся как фундамент.

IBM продолжает развивать PC DOS.

MS-DOS 6.22 (1994)

Последняя самостоятельная версия.

Добавили:
  • DriveSpace (сжатие диска),
  • SCANDISK,
  • DEFRAG.
Сжатие диска — это инженерная поэзия: вы делаете вид, что у вас в два раза больше места, хотя физически его не стало больше.

Но были патентные войны со Stac Electronics. Юридические битвы тоже часть эволюции технологий.

PC DOS 6.30

IBM ответила своей версией:
  • SuperStor (сжатие),
  • RAMBoost,
  • резервное копирование.
IBM делала ставку на надёжность.

PC DOS 7.0 (1995)

Добавили:
  • язык сценариев REXX,
  • Stacker,
  • поддержку XDF-дискет.
Это уже система для корпоративных задач.

Но мир уходил в Windows.

Поздний этап (1995–2003): жизнь внутри Windows

MS-DOS 7.1 (1998)

Она шла вместе с Windows 98.

Добавили:
  • FAT32,
  • поддержку больших дисков,
  • длинные имена файлов.
Но это уже не самостоятельная система. Это фундамент под Windows.

PC DOS 7.00 Release 1 (1998)

Исправления для Y2K. Добавили символ евро.

Это не революция — это аккуратная уборка перед новым тысячелетием.

PC DOS 7.1 (2003)

Добавили:
  • FAT32,
  • LBA,
  • поддержку больших дисков.
Использовалась в служебных и встроенных решениях IBM.

Это уже эпилог истории.
vak: (Аристипп)
Доделал я в симуляторе i86 некоторое количество биосных вызовов, и вот результат. PC-DOS загружается с образа флопика.
$ tiltti pcdos330.img 
Current date is Wed 2-11-2026
Enter new date (mm-dd-yy):
Current time is 7:44:18.32
Enter new time:


The IBM Personal Computer DOS
Version 3.30 (C)Copyright International Business Machines Corp 1981, 1987
(C)Copyright Microsoft Corp 1981, 1986

A>dir/w

Volume in drive A has no label
Directory of A:\

COMMAND COM ANSI SYS APPEND EXE ASSIGN COM ATTRIB EXE
BACKUP COM BASIC COM BASICA COM CHKDSK COM COMP COM
COUNTRY SYS DEBUG COM DISKCOMP COM DISKCOPY COM DISPLAY SYS
DRIVER SYS EDLIN COM FASTOPEN EXE FDISK COM FIND EXE
FORMAT COM GRAFTABL COM GRAPHICS COM JOIN EXE KEYB COM
KEYBOARD SYS LABEL COM MODE COM MORE COM NLSFUNC EXE
PRINT COM PRINTER SYS RECOVER COM REPLACE EXE RESTORE COM
SELECT COM SHARE EXE SORT EXE SUBST EXE SYS COM
TREE COM VDISK SYS XCOPY EXE EGA CPI LCD CPI
4201 CPI 5202 CPI BASIC PIF BASICA PIF MORTGAGE BAS
50 File(s) 128512 bytes free

A>chkdsk

724480 bytes total disk space
52736 bytes in 3 hidden files
543232 bytes in 50 user files
128512 bytes available on disk

655360 bytes total memory
600896 bytes free

A>_
Отсюда понятно, что идея перехватывать INT вызовы имеет право на жизнь. Нет необходимости выполнять бинарник биоса из ROM.
vak: (Знайка)
Симулятор PC i86 делает первые робкие попытки загрузиться с флопика, и чтобы легче разбираться, я набросал страничку с подсказками:

MS-DOS 3.30 Boot Sequence
vak: (Знайка)
Какую машинную инструкцию процессора 8086 оказалось сложнее всего воспроизвести? Ни за что не угадаете: команду DAA, десятичную коррекцию для сложения. И парную ей DAS, для вычитания. Ни один из симуляторов процессора не умеет выполнять её аутентичным образом. Я проверил несколько: DOSBox, PCre, MAME. Глядел исходники - везде сделано как в 386, а не как в 8086. Никто так и не озадачился выяснить, как же эти команды работают в реальности.

Пришлось наваять тестик на Турбо Си и прогнать со всеми возможными входами на реальной XT-шке.
void daa(int al_in, int af_in, int cf_in, int *al_out, int *af_out, int *cf_out)
{
int flags_in = (af_in ? 0x10 : 0) | (cf_in ? 1 : 0);
int flags_out = 0;
int al_buf = 0;

asm {
mov al, byte ptr al_in
mov ah, byte ptr flags_in
sahf
daa
lahf
mov byte ptr flags_out, ah
mov byte ptr al_buf, al
}

*al_out = al_buf;
*af_out = (flags_out >> 4) & 1;
*cf_out = flags_out & 1;
}
Результат - полная таблица "истинности" для команд DAA и DAS процессора 8086 - выложена здесь: daa-das-8086.txt

Начиная с 286 процессора Интел изменил реализацию команд DAA и DAS. Вот аналогичный результат, полученный на современном Intel Core I7: daa-das-286.txt

Сравниваем:
DAA:
AL AF CF ---86--- ---286---
9A 1 0 -> A0 1 0 00 1 1
9B 1 0 -> A1 1 0 01 1 1
9C 1 0 -> A2 1 0 02 1 1
9D 1 0 -> A3 1 0 03 1 1
9E 1 0 -> A4 1 0 04 1 1
9F 1 0 -> A5 1 0 05 1 1

DAS:
AL AF CF ---86--- ---286---
00 1 0 -> FA 1 0 FA 1 1
01 1 0 -> FB 1 0 FB 1 1
02 1 0 -> FC 1 0 FC 1 1
03 1 0 -> FD 1 0 FD 1 1
04 1 0 -> FE 1 0 FE 1 1
05 1 0 -> FF 1 0 FF 1 1
9A 1 0 -> 94 1 0 34 1 1
9B 1 0 -> 95 1 0 35 1 1
9C 1 0 -> 96 1 0 36 1 1
9D 1 0 -> 97 1 0 37 1 1
9E 1 0 -> 98 1 0 38 1 1
9F 1 0 -> 99 1 0 39 1 1
По этим данным удалось построить адекватный код на Си: для DAA и для DAS.
vak: (Знайка)
Есть в процессоре 8086 регистр флагов. Отдельные биты в нём что-то говорят о результате предыдущей команды: перенос, чётность, промежуточный перенос, ноль, знак, пошаговый режим, разрешение прерываний, направление, переполнение. Всё для удобства программиста, казалось бы. Но есть и подстава.

Некоторые флаги после некоторых команд содержат мусор. В интеловской документации эти флаги обозначены как U, то есть Undefined. Смотрите таблицу 2-21 со страницы 2-51 в документе The_8086_Family_Users_Manual_Oct79.pdf. Там дофига этих U.

На практике оказалось, что не всё так плохо. Многие из флагов, обозначенные как Undefined в документации, на самом деле прекрасно вычисляются симулятором и соответствуют чипу. Вот таблица флагов, которые действительно не удаётся предсказать.
  • Команды AAA, AAS - флаги OF, PF, SF, ZF - Переполнение, чётность, знак и ноль не определены
  • Команды DAA, DAS, AAM, AAD - флаг OF - Переполнение не определено
  • Команда RCR - флаг OF - Переполнение определено только для однократного сдвига (count=1); не определено, когда count!=1
  • Команды SAL, SHL - флаг AF - Дополнительный перенос не определен
  • Команда MUL - флаги PF, ZF - Чётность и признак нуля не определены для словного беззнакового умножения; для байтового все флаги определены
  • Команда IMUL - флаги PF, AF, ZF, SF - Чётность, дополнительный перенос, знак, признак нуля не определены
  • Команды DIV, IDIV - флаги CF, OF, SF, ZF, PF, AF - Все арифметические флаги не определены
Мой симулятор прошёл 100% всех потактовых тестов от Intel P80C86A-2 и AMD D8088. Его можно считать эталонной реализацией. Если есть вопросы по работе процессорных инструкций 8086 - смотрите соответствующее место в исходнике processor.cpp.
vak: (Аристипп)
(авторство ИИ)

Представьте, что вы стоите в лаборатории 1970‑х годов. Вокруг — осциллографы, запах горячего кремния и люди, которые работают так, будто от этого зависит их жизнь. В каком‑то смысле так и было. Именно в такой обстановке появился Intel 8086. Не как результат божественного озарения, а как срочная инженерная мера. А такие вещи, как показывает практика, иногда оказываются самыми важными.

Intel к тому времени уже умела делать микропроцессоры. В 1972 году появился 8008 — маленький, восьмибитный, немного неуклюжий. Он работал, и это уже было чудом. Затем в 1974‑м вышел 8080, и тут стало по‑настоящему интересно: Altair, первые персональные компьютеры, люди вдруг поняли, что вычисления можно поставить на стол. Потом был 8085 — аккуратная, более взрослая версия. Все это выглядело как уверенный марш вперед.

И тут инженеры Intel решили: «А давайте сразу прыгнем в будущее». Так родился iAPX 432 — архитектура, которая хотела быть слишком умной. Объекты в железе, защита, сборка мусора, никакой возни с регистрами — сплошная чистота и теория. Проблема была в том, что физика, как обычно, плевать хотела на красивые идеи. Процессор получился медленным, сложным и практически непригодным. Если вы когда‑нибудь видели, как отличная концепция разбивается о реальность тактовых частот, — вот это был именно тот случай.

И вот здесь начинается самое интересное. Intel оказалась в ситуации, знакомой любому инженеру: времени нет, конкуренты дышат в спину, а идеальный проект тонет. Нужно что‑то сделать — быстро. Не идеально, а достаточно хорошо. Так в 1976 году появилась команда, которой сказали: «Сделайте 16‑битный процессор. Чтобы работал. Чтобы был совместим со старым кодом. И желательно — вчера».

Это был 8086. Он не пытался быть философским трактатом. Он был практичным. Да, пришлось идти на компромиссы. Да, адреса и данные по одним и тем же выводам — потому что 40‑контактный корпус дешевле. Да, сегментированная память — потому что регистры 16‑битные, а памяти хочется больше. Это не было красиво, но это работало. А в инженерии это главный критерий.

Люди часто ругают сегментацию, и справедливо. Но давайте будем честны: перед инженерами стоял выбор — либо сделать что‑то кривоватое, либо не сделать вообще ничего. Они выбрали первое. Умножение и деление занимали десятки тактов, потому что отдельного блока не было. Ну и что? Если вам нужна скорость — вы найдете способ. Сдвиги, таблицы, трюки — программисты всегда так делают.

В то же время конкуренты выглядели очень привлекательно. Motorola 68000 был почти произведением искусства: плоская адресация, удобные регистры, простор для программиста. Если смотреть только на архитектуру, он выглядел «правильнее». Но мир не выбирает процессоры по эстетике. Мир выбирает по совокупности случайностей.

Ключевой случайностью стал 8088 — версия 8086 с восьмибитной внешней шиной. Дешевле, проще, идеально подходила для IBM PC. И вот тут произошло то, что физики называют фазовым переходом: одна система внезапно становится доминирующей. После IBM PC уже было неважно, кто элегантнее. Важно было, что это работает, продается и вокруг этого растет экосистема.

Дальше история покатилась сама собой. Клоны, тысячи производителей, 80286, 80386 — и каждый шаг добавлял новые слои, не убирая старые. Это как накапливать отложения в геологии: снизу — странные решения 1970‑х, сверху — современные гигагерцы. И все это по‑прежнему совместимо.

Конечно, были и провалы. iAPX 432 стал дорогим уроком. Сегментация десятилетиями сводила программистов с ума. Но в этом и есть суть реальной науки и инженерии: вы делаете ошибки, а потом живете с их последствиями.

История 8086 — не про идеальный дизайн. Она про то, как люди под давлением времени и рынка сделали работающую вещь. А иногда именно такие вещи и меняют мир. Не потому, что они лучшие. А потому, что они появились вовремя.
vak: (Default)
Оказывается, если на процессоре 8086 к командам IDIV, IMUL или MUL приставить префикс REP, то знак результата изменится на противоположный. Поразительные тайны обнаруживаются в древнем железе. 😀

Это мой симулятор успешно прошёл первые 15 тысяч тестов от Daniel Balsom.
vak: (Default)
Один крутой чувак научился устанавливать Windows 3.11 на нынешних компьютерах. Для этого пришлось разработать отдельный графический драйвер vbesvga.drv.

Image


vak: (Знайка)
Качественное объяснение, чем матрица (как набор чисел) отличается от тензора (физического объекта, независимого от системы координат).

vak: (Знайка)
Сделал я тулзу, автоматически преобразующую MOO тесты в исходник для Googletest. Типа такого:
TEST_F(MachineTest, adc_al_45h)
{
// Initial CPU State
cpu.set_ax(0xADEE);
cpu.set_bx(0xFD34);
cpu.set_cx(0xA1B4);
cpu.set_dx(0x4038);
cpu.set_cs(0xD271);
cpu.set_ss(0xF076);
cpu.set_ds(0x8702);
cpu.set_es(0xCE41);
cpu.set_sp(0x5BDF);
cpu.set_bp(0xD8D9);
cpu.set_si(0x0000);
cpu.set_di(0x2DB1);
cpu.set_ip(0x8490);
cpu.set_flags(0xF4C3);
machine.trace_registers();

// Initial RAM entries
machine.mem_store_byte(0xDABA0, 0x3E);
machine.mem_store_byte(0xDABA1, 0x14);
machine.mem_store_byte(0xDABA2, 0x45);
machine.mem_store_byte(0xDABA3, 0x90);
machine.mem_store_byte(0xDABA4, 0x90);
machine.mem_store_byte(0xDABA5, 0x90);

// Single-step.
cpu.step();

// Final CPU State
EXPECT_EQ(cpu.get_ax(), 0xAD34);
EXPECT_EQ(cpu.get_ip(), 0x8493);
EXPECT_EQ(cpu.get_flags(), 0xF413);

// Final RAM entries
EXPECT_EQ(memory.load8(0xDABA0), 0x3E);
EXPECT_EQ(memory.load8(0xDABA1), 0x14);
EXPECT_EQ(memory.load8(0xDABA2), 0x45);
EXPECT_EQ(memory.load8(0xDABA3), 0x90);
EXPECT_EQ(memory.load8(0xDABA4), 0x90);
EXPECT_EQ(memory.load8(0xDABA5), 0x90);
}
Для начала конвертнул три сотни тестов, по одному из каждой категории. Много интересного узнал. Про неиспользуемые биты регистра флагов, про недокументированные коды операций, про плохо описанные команды типа AAA.

ChatGPT вчера долго пытался меня убедить, что в процессоре 8086 была команда BOUND. Имел наглость отсылать к официальному The 8086 Family Users Manual от 1979 года. Чувак, говорю, в этом документе нет команды BOUND. Ой да, говорит, Интел просто забыл упомянуть. Но 62h точно-точно выполняется как BOUND, мамой клянусь. Пока я не ткнул его мордой в MOO тесты, и только тогда он признал, что коды 6xh работают как 7xh, то есть как условные переходы.

Грок, тот сразу выяснил, что инструкция BOUND появилась позже, в 80186 процессоре. Есть таки разница между искусственными интеллектами, не все они одинаково умные.