неділю, 24 лютого 2013 р.

MS/PC DOS 1.XX в емуляторах

Теж емуляція ;-)
На завершення попереднього поста я згадував, що побачити DOS 1.xx в емуляторах не так просто. Щоб зрозуміти, чому, розглянемо як відбувається завантаження операційної системи (ОС) в IBM PC-сумісних комп'ютерах. 

Проблематика

BIOS, згідно своїх уявлень про правильний порядок, вибирає диск (1), завантажує з нього нульовий сектор -- сектор з нульової сторони, на нульовій доріжці, із номером 1 (2). Завантаження відбувається за адресою: 0x0000:0x7C00  -- в 31-й кілобайт оперативної пам'яті (3). Після того, BIOS перевіряє, чи перед ним коректний завантажувач, використовуючи для цього сигнатуру: два останніх байти повинні бути 0x55, 0xAA (4). Якщо коректний, сигнатура правильна -- йому передається керування (5). Якщо ж коректної сигнатури не знайдено, або якщо бут-лоадер не зміг завантажити свою ОС і вирішив повернути керування BIOS, викликавши INT 18h, переходить до наступного пристрою, з якого можна завантажитися. Не змігши завантажитися з жодного, викликає INT 19h, яке в давні часи викликало вбудований BASIC, а зараз просто повідомляє, що присутня певна проблемка.

Проблема в тому, що така концепція ще не існувала на момент виходу IBM PC, тому бут-сектор DOS 1.xx не містить жодних подібних сигнатур. Більшість сучасних BIOS-ів, як тих, що в реальних машинах, так і їх реалізацій для емуляторів, просто не вважатимуть такий диск бутабельним і відмовляться вантажити ОС з нього. Забігаючи на перед, скажу, що цю проблему можна вирішити, якщо змусити BIOS не перевіряти сигнатуру, якщо є така можливість; вручну пропатчити бут-сектор; знайти достатньо древню машину; або попросити емулятор скористатися BIOS, який вміє завантажувати і такі диски, наприклад копію BIOS оригінального  IBM PC 5150. 

Наступна проблема в тому, що оригінальні дискети -- 5-дюймові, так ще й з 8 секторів на доріжку, відверто нестандартним з сучасної точки зору, форматом (активно існував заледве рік, див. також "All Those Floppy Disk Formats…"). Більшість програмного забезпечення для роботи із образами дисків та частина сучасних BIOS (не будемо поки про реальну апаратуру того часу -- її залишилося зовсім мало) цей формат не підтримують -- вони просто не повірять, що дискета може мати 8 а не 9 секторів на доріжку.

Ще одна велика проблема така. В boot-секторі, починаючи із зміщення 0x0B, повинен містити так-званий BIOS parameter block (BPB). Як не дивно, апаратурі -- власне BIOS-у, цей блок глибоко байдужий. Ним користується та частина DOS, що ближче до заліза, призвана доповнювати апаратний BIOS, і яка знаходилася у файлі IBMIO.COM. Як би там не було, але і його на дискетах DOS 1.XX немає. (Є лише його рудимент-попередник). А без нього такі диски не читатимуться хоч наскількись сучасними ОС і з ними не працюватимуть програми роботи з образами -- важлива інформація про FAT знаходиться саме там. 

Тому працювати із такими образами можна лише або завантаживши оригінальний DOS 1.XX, (дискети із  BPB він вмітиме читати-писати, якщо їх розмір (160Кб для DOS 1.00) і формат (8 секторів на доріжку) буде відповідати єдиному, який він підтримує), або відредагувавши Boot належним чином. У стандартному бут-секторі PC-DOS 1.XX є достатньо незайнятого місця, щоб розташувати нормальний BPB, не заважаючи завантажувальному коду. Правда, образи дисків при тому вже не будуть оригінальним. ;-) Зокрема, затреться timestamp -- дата створення сектора. Детальніше про те, як правильно пропатчити -- див. Додаток 1.

Крім того, завантажувач у бут-секторі DOS 1.XX робив дуже багато припущень, (див. той же Додаток 1), тому просто так перенести образ на дискету іншого формату не вдасться. Інша справа, що, знову ж таки, можна спробувати патчити, знаючи, яке середовище очікував IBMIO.COM в момент, коли йому передавалося керування.

Де взяти образи?

Наступним закономірним питанням є -- а де ж взяти диски, чи хоча б їх образи, із DOS 1.XX? Якщо потрібно саме диски -- можна спробувати купити, на e-bay, або, наприклад, тут. Але це -- для "гурманів". Решті ж, щоб задовольнити цікавість, цілком вистачить образів.

Взяти їх можна, наприклад, в бібліотеці сайту WinWorld: "Abandonware Operating Systems/PC/DOS/". На момент написання там присутні багато версій DOS, від Microsoft, IBM, Digital Research, та інших. Також можна знайти ще багато чого цікавого -- старі версії Windows, SDK, різноманітні програми, і так далі і тому подібне. Імена архівів включають всю необхідну інформацію, образи -- звичайні, побайтові, не у якихось хитрих форматах, софт для роботи з якими давно і безнадійно застарів (7). Явних фейків не помітив, хоча частина образів зняті явно не з оригінальних дистрибутивів.

На момент написання, із релевантного до статті, присутні:
Велика колекція є також на сайті Old-DOS.ru. Однак, вона в цілому дещо гіршої якості -- багато фейків, образи представлені у всіляких екзотичних форматах, або відверто не-оригінальні -- наприклад з бут-секторами від WinImage, без частини файлів і т.д. і т.п.


Образи BIOS

Не менш важливою частиною PC, ніж ОС, є BIOS. Взагалі, інтерфейс BIOS, запропонований IBM у їх перших машинах, став стандартом де-факто у достатній мірі, щоб більшість програм могли працювати із якимось "узагальненим" IBM PC чи IBM PC/XT BIOS-ом. Зокрема, DOS 1.XX чудово запускається із стандартним біосом, що йде з DosBox чи Bochs (див. далі).

Однак, з тим є дві, не те щоб проблеми, швидше -- незручності. По перше це неавтентично -- все ж BIOS еволюціонував разом із апаратурою, по друге -- важливою частиною ранніх PC був ROM-BASIC, реалізацією якого в сучасних емуляторах, зрозуміло, ніхто не заморочується.

Вирішення, щоправда, існує. Добрі люди прочитали (іноді -- руйнуючи необоротно антикварну техніку, якщо не було іншого способу, але все ж зберігаючи її так для історії) вміст оригінальних чіпів BIOS і виклали в Інтернет. (Так, зі всіма застереженнями, що ті біоси можуть бути захищені авторськими правами і все таке, але ймовірність заробити на свою голову судовий процес все ж незначна.)

Відмічу дві колекції таких образів:
Образи в Інтернеті присутні, дещо спрощуючи, в двох формах.

Перша -- просто цілісний образ якогось елемента BIOS. Іноді навіть з дескриптивним іменем. Наприклад, файл "ibm-basic-1.00.rom", 32Кб  -- IBM ROM BASIC 1.00, або "ibm-pc-1981-04-24.rom", 8Кб -- IBM PC BIOS (1981-04-24, перша ревізія).

Щодо другої, тут слід заглянути трішки в минуле (див. наприклад "An Introduction to the PC's (Personal Computer's) BIOS (Basic I/O System)". Оригінальний BIOS IBM PC моделі 5150 знаходився на п'яти 8Кб мікросхемах. Одна -- власне BIOS, чотири інших містили ROM BASIC (4x8=32Кб). Називалися ті мікросхеми якось так: 1501476 -- "part number", номер компоненти в каталозі IBM, який визначався типом та датою виходу, і кодом, наприклад U33 -- власне BIOS, U29, U30, U31, U32 формували ROM BASIC (саме в такому порядку!). Так вони і блукають по Інету, наприклад у вигляді наступних файлів: 5700019.u29, 5700027.u30, 5700035.u31, 5700043.u32, 5700051.u33. Тобто згаданий вище  ibm-basic-1.00.rom це всього лиш об'єднані в правильному порядку файли *.29--*.u32 відповідної версії (ревізії) ROM-BASIC. Зрозуміло, що БІОСи старших моделей йдуть по-чіповими шматками більших розмірів, наприклад 32Кб, але суті це не змінює.

Проблема в тому, що різні емулятори мають різні очікування того, в якому форматі їм надавати образи BIOS. Одні хочуть перший, інші -- другий, треті -- ROM-BASIC чотирма файлами з іменами виду *.uXX, а власне BIOS з якимось іншим іменем. Доводиться вгадувати. :-)

Слід також зауважити, що крім системного BIOS, різноманітна апаратура могла мати свій, для повноцінної емуляції машини з тією апаратурою треба надати і його образи.

На завершення список деяких важливих образів (більше див. за посиланнями вище):

Емулятори

Для простоти випробовуватимемо емулятори двома способами: чи здатні запустити PC DOS 1.00 з образу оригінального диску (дискети) -- без всіляких патчень (тих, про які Додаток 1), і чи здатні працювати з ROM-BASIC. Останній перевірятимемо за допомогою першої гри, написаної для IBM PC, та ще й за співавторства Білла Гейтса особисто, DONKEY.BAS

Увага! Нижче -- далеко не повний огляд емуляторів! Лише їх коротка характеристика з точки зору виконання конкретної задачі. Самі по собі вони можуть мати багато більше можливостей, ніж описано. Крім того, список далеко не вичерпний, хоча основні "гравці" ніби присутні.

Коли нижче говориться про якісь баги, особливо в інтерфейсі, слід розуміти, що вони стосуються виконання на моїй машині, з Windows 7/x64 -- систематичного тестування я не проводив.

mess

Існує дуже хороший емулятор, призваний зберегти для нащадків історію ігрових консолей та інших подібних пристроїв. Вміє емулювати іранні IBM PC. Open Source. Так і називається -- MESS. Базується він на іншому проекті, MAME, з яким зараз розвивається у парі. Справді дуже хороший пакет! Однак у керуванні -- близький по складності до міжзоряного бойового корабля. Навіть дуже помічна оболонка до нього: QMC2 – M.A.M.E./M.E.S.S./U.M.E. Catalog / Launcher II" не сильно покращує ситуацію:
Клікабельно! А потім вдумливо над тим медитабельно...
Платформа справді тисячі:
Клікабельно! А краще самому запустити, подивитися.
Із додаткових бонусів, вміє підвантажувати інформаційні сторінки типу цієї.

Взяти можна тут: "Latest MAME & MESS Release". Інсталятори порядку 30Мб, заінстальоване -- порядку 220Мб. Спочатку ставиться MAME, потім MESS. Деталі інсталяції не розповідатиму -- не пам'ятаю, а ще раз зносити-ставити лінь, але нічого особливо складного не було. В мене версія 0.148b.

Як із тим монстром працювати я толком не розібрався. Явно слід знати безліч деталей, крім того, хоча оце (стороннє) GUI дуже допоміжне для зовсім-зовсім початківця, але, здається, має свою колекцію фішок, без знання яких малоюзабельне (8).

Щоб запустити на емуляцію IBM PC 5150 слід зробити наступне: скопіювати в <root>\mame0148b\roms\ibm5150 образи BIOS, 5000019.u29, 5700019.u29, 5000021.u30, 5700027.u30, 5000022.u31, 5700035.u31, 5000023.u32, 5700043.u32, 1501476.u33, 5700051.u33, 5700671.u33, 5788005.u33 з архіву вище (зрозуміло, що потрібні не всі, але для простоти -- хай лежать), 14166.bin -- BIOS клавіатури з архіву keytronic_pc3270.zip (підозрюю, отих перших 101-клавішних, 1982+), wdbios.rom з архіву вище. Без останнього можна обійтися, якщо явно заборонити HDD.

Викликається емулятор командою типу:

mess.exe -rompath "<root>\mame0148b\roms" ibm5150  -floppydisk1 "<FDroot>\IBM PC-DOS 1.0 (5.25)\PCDOS100.IMG" -w

або після довгого і ніжного кохання з GUI. Під час виклику вказуємо шлях до образів BIOS (rompath), модель (ibm5150), образ дискети-1 (floppydisk1), та бажання працювати у вікні (-w, по замовчуванню працює в повноекранному режимі).

Хоча опція -ramsize присутня, на жаль, реалізація зараз підтримує лише один розмір, 640Кб.  На жаль -- бо, забігаючи наперед,  ROM BASIC, принаймні викликаний з DOS 1.00, відмовляється працювати, коли пам'яті так багато.

За першого запуску емулятор наголошує, що можна використовувати лише легальні копії ROM, для підтвердження слід поворушити джойстиком (який теж може емулюватися), або ввести з клавіатури OK. За кожного запуску, (якщо явно не заборонити), буде перепитуватися, чи я в курсі, що звук не працюватиме, для підтвердження слід ввести те ж OK. Потім ще виведе трішки інформації про платформу, і аж тоді запуститься.

Запускається дооовго... 60-70 секунд на ініціалізацію BIOS. Із всіх випробуваних емуляторів час від запуску до спроби завантажитися найбільший (навіть якщо їх просити працювати із оригінальною швидкістю 4.77МГц). Невже оригінальний теж так тупив (9)?  Любить злетіти під час всіляких маніпуляцій, типу Alt-Tab чи Ctrl-Enter.

Нарешті, дочекавшись, бачимо:
PC-DOS 1.00 під MESS.
Зверніть увагу, що запрошення представлено як "A>", в стилі IBM  (MS любили "A:")
Запустити BASICA, необхідний для DONKEY.BAS толком не вдається -- він каже, що замало пам'яті, очевидно від побачених 640Кб йому паморочиться. :-) Запустити вдалося, схитрувавши -- за допомогою DEBUG.COM. Чи то пам'яті стало менше, і він прийшов до тями, чи просто середовище відладчик для нього краще приготував...
Отож, BASICA.COM запускається із відладчика, командою (розширення .COM -- обов'язкове в даному випадку):
A> DEBUG BASICA.COM
Після чого програмі передається керування командою "G" (10):
Екран примітивного IDE ROM-BASIC. (BASICA в даному випадку.)
Тиснемо F3 (або набираємо load" -- те, що буде введено по F3), вводимо, щоб отримати:
   LOAD"donkey.com"
Почекавши, поки завантажиться, і знову з'явиться запрошення "Ok", тиснемо F2, щоб запустити програму на виконання:
Виконавши його прохання -- натиснувши пробіл, можемо бавитися:
Власне, вона - перша гра для IBM PC. Ціль -- не натикатися на ослів. Пробіл, згідно написаного, та, як виявляється, будь-яка інша клавіша, крім Esc змінює смугу руху, Esc завершує гру.
Набавившися, тиснемо Esc, потрапляємо в BASIC, "system", щоб вийти з нього, тоді "q", щоб вийти з DEBUG.

Підсумовуючи, MESS -- дуже потужна штука! Однак, при тому, складна у використанні, і, намагаючись бути всім і зразу, конкретно серію IBM PC емулює трохи тяп-ляп. Тому для душі (та експериментів з старим софтом) її використовувати в мене бажання не виникає -- є багато приємніші альтернативи.

PCE

Наступний емулятор: PCE - PC Emulator.

Поміж його фішок слід відмітити:
  • Емулює IBM PC 5150/IBM PC/XT 5160 (PCE/ibmpc); крім того (!)  Macintosh 128K, Macintosh 512k, Macintosh 512k, Macintosh Plus, Macintosh SE, Macintosh Classic (PCE/macplus) та ще одну екзотичну машину із Данії, Regnecentralen RC759 Piccoline (PCE/rc759).
  • Дуже гарна сторінка завантаження. Містить: джерельні тексти (Open Source); бінарники для Windows; ряд готових до запуску систем: "IBM PC 5150 with PC-DOS 1.00", "IBM PC 5150 with Concurrent CP/M-86 1.0", "IBM PC/XT 5160 with SCO Xenix System V 2.1.3", "Macintosh 512K with System 0.5", та багато інших --  просто розархівуй і запусти; гарно посортовані різноманітні образи BIOS (див. вище за конкретними прикладами). Розмір самого емулятора -- неповних пара мегабайт, але більшість архівів містять образи дисків.
  • Проста конфігурація, хоча -- тільки редагуванням конфігураційного файлу. Див., наприклад, коментарі в pce-ibmpc.cfg із стандартних бінарників для Windows. В деталі вдаватися не буду, якщо дуже цікаво -- пишіть, розберемося.
Для проби візьмемо готову конфігурацію "IBM PC 5150 with PC-DOS 1.00", але вантажитися будемо з образу із "нашого" архіву: "IBM PC-DOS 1.0 (5.25).7z". Необхідні ROM-образи вже на місці, в "pce-20130106-9cf39d4-pc-pcdos-1.00\rom": ibm-basic-1.00.rom, ibm-pc-1981-10-19.rom, ibmpc-pcex.rom, але скачати їх можна і окремо, на офіційній сторінці завантаження. В конфігурації (pce-5150.cfg) вказано, із головного:
  • system.model = "5150"
  • cpu.model = "8088"
  • load{ address = 0xfe000, file    = "ibm-pc-1981-10-19.rom" } -- головний BIOS
  • load{ address = 0xf6000, file    = "ibm-basic-1.00.rom" } -- ROM BASIC
  • ram.size = 64K
На жаль, при спробі задати об'єм пам'яті, більший за 704Кб, перестає вантажитися, очевидно щось не те із відображенням областей адресного простору вище 640Кб, де живе відеопам'ять, BIOS і т.д..

Диск, з якого вантажитися, заданий так:
 disk {
    drive    = 0x00
    type     = "auto"
    file     = "fd0.pfdc"
    file     = "fd0.img"
    optional = 0
}

Заміняємо ім'я файлу образа, що йде в комплекті, на наш:
disk {
    drive    = 0x00
    type     = "auto"
    file     = "<FDroot>\IBM PC-DOS 1.0 (5.25)\PCDOS100.IMG"
    optional = 0
}

Запускаємо run-cga.bat  (можна і run-mda.bat, але DONKEY.BAS хоче кольорового дисплея), назви говорять самі за себе. Які опції передаються і як -- див. ці .bat-файли.
DONKEY.BAS теж успішно працює, навіть коли пам'ять 640Кб (11):
Ну і не втримаюся:
Macintosh 512K -- Калькулятор, Блокнот, Панель керування, інші елементи робочого стола.

На загал, приємний, швидкий і зручний емулятор. Із недоліків -- трішки обмежений спектр моделей IBM PC, які підтримуються (зате підтримує Мак-и тієї ж епохи) і необхідність конфігурування, редагуючи файли. Також, хоча для перевантаження віртуальної машини та деяких подібних дій, є відповідні комбінації клавіш, не знайшов, як можна замінити диски на льоту...

PicoXT

Наступний емулятор в нашій колекції -- PicoXT, Portable IBM PC-XT Emulator. Написаний на асемблері, тому всього 29Кб, навіть із базовим GUI (Freeware, Win32 only).

GUI дозволяє на льоту змінювати дискети, вибирати частоту процесора, тип графічного адаптера (CGA/VGA), перевантажувати машину, та й все -- не дуже багато, але 29Кб!
По замовчуванню містить якийсь "анонімний" BIOS, якщо в ту ж директорію, що і програма, покласти файли з іменем "basicc11.bin" -- ROM BASIC (взяв ibm-basic-1.00.rom, 1.10 не працюватиме!), "et4000.bin" -- VGA-BIOS (взяв з et4000.zip) і "wdbios.rom" -- HDD BIOS (взяв hdc.zip), вміє їх підвантажувати (12).

Із основних недоліків -- під час роботи неперервно трішки хрипить динаміком (не зрозуміло чому...), перестаючи лише коли запущено DONKEY.BAS чи інші подібні програми, що безпосередньо працюють з PC-спікером. Також, ніяк не показує, які ж диски змонтовано, немає способу побачити, які модулі BIOS завантажилися, які ні (або я не знайшов). Не знаю, чи є якийсь шоткат, щоб повертати фокус клавіатури -- доводиться мишкою переключати. Неможливо змінювати розмір пам'яті машини, що емулюється та інші її характеристики.

Зафіксовано момент аварії, автомобіль та осел розвалюються.
Звичайно, програма має дуже серйозні обмеження, але враховуючи її розмір у 29Кб та повну працездатність як базового емулятора IBM PC/XT -- просто чудо! Висновок: мила, маленька і шустра.

PCem


Ще один емулятор, PCem. Не плутати із розглянутим вище PCE! Підтримує помітно більше моделей, процесори 88/86/286/386/486; 1-64Мб памяті; відеоадаптери CGA, MDA, Hercules, EGA (тільки для PC1640 ), VGA та SVGA; SoundBlaster і т.д. Open Source, розмір -- декілька мегабайт.

GUI може трохи більше, ніж у розглянутих вище програм:
Діалог конфігурації, показано вибір звукових карт.
На тому, по великому рахунку, сильні сторони майже завершуються.

Грануляція пам'яті -- 1Мб, менше виділити не можна. (Що дивно, DOS 1.00 бачить її як 256Кб. Взагалі, під деякими, але не під всіма (!) емуляторами,  він кумедно так відображає вільну пам'ять, якщо її більше за 640Кб.)
Насправді пам'ять - 1Мб, DOS бачить лише 256Кб.
BIOS слід згодовувати у наступній формі (праворуч -- назва, вживана раніше):
pc102782.bin -- <rev>.u33
basicc11.f6  -- <rev>.u29
basicc11.f8  --
<rev>.u30
basicc11.fa  --
<rev>.u31
basicc11.fc  --
<rev>.u32
Де розширення, очевидно, лінійна адреса, за якою вантажини: ROM BASIC має якраз починатися з 0xf6000.

При тому, BASIC/BASICA завантажуються, але при спробі запустити навіть прості програми просто тихо мирно виснуть.

Крім того, не знаю чи то вина емулятора, чи моя, але після кількох безуспішних спроб запустити BASIC, образи дисків раптом стали вдвічі більшими, і перестали читатися...

Зате, єдиний із емуляторів, що справді показує славнозвісний "сніг" CGA адаптера, його, так би мовити, фірмову фішку:

Підсумовуючи, програма мені не дуже сподобалася... Якби не "сніг", не згадував би про неї.

SPC/XT

Емулятор PC/XT, від автора з Білорусії. У нього є ряд споріднених проектів (див. http://soviet-pc.narod.ru/): покинутий Script PC, який явно був базою для SPC/XT, Soviet PC -- емулятор радянських машин, SPC/AT -- назва сама за себе говорить, емулятор БК-0010 і Корвета (див. http://soviet-pc.narod.ru/sandbox_ru.html). Freeware, розмір декілька мегабайт.

Виділяється розвинутим GUI. Підтримує, окрім IBM PC та IBM PC/XT, деякі радянські клони, типу "Пошука-1/2":
Зверніть увагу на список моделей та доступні BIOS для конкретної моделі.
Іконки дискет та дисків служать для графічного (доволі милого :) відображення їх роботи.
Включає розвинуті засоби відлагодження:
Можна керувати за допомогою консолі (оце запрошення ">" внизу скріншотів, введіть HELP для отримання підказок по використанню).

Вміє зберігати та завантажувати стан емуляції (ретельно не випробовував, каюся, але базово працює).

На жаль, вся конфігурація -- в двійкових файлах.

BIOS слід класти в ту ж директорію, де знаходиться програма. Форма -- .uXX (див. вище), для тих моделей, що вона знає, розуміє значення тих кодів -- Part Number та інших, при чому -- в декількох варіантах! Якщо правильних файлів немає, повідомляє про це, сильно спрощуючи життя: 
Навіть не знаю, плюс це, чи мінус, але дозволяє тільки історично реальні об'єми пам'яті -- 640Кб для XT, 256Кб для PC.

Дуже хорошим, хоч і відносно сирим, спорідненим проектом є SPC/AT:
Список підтримуваних моделей машин говорить сам за себе.
На жаль, і SPC/XT i SPC/AT мають доволі неприємний чи то баг чи то фічу в інтерфейсі. Після переключення за допомогою Alt-Tab перестають сприйматися клавіші з символами (літерами, цифрами і т.д), хоча Enter, Cntr-C і подібні функціонують нормально. Щоб пройшло -- достатньо натиснути Alt.

Ні проблем з емуляцією DOS 1.00:
ні проблем з ROM-BASIC:

емулятор не має.

На загал -- мій найулюбленіший інструмент для роботи з "комп'ютерною археологією" із описаних тут. Гнучкий, потужний, гарно зроблений, зручний в користуванні. Шкода, що не Open Source, але немає в світі ідеалу. :-)

DosBox

Хоча DosBox знайомий всім як потужний, швидкий, та точний емулятор DOS, завдяки якому можна на сучасних комп'ютерах і в ОС, які про DOS і не чули, запускати практично будь-які DOS-івські програми, бавитися старі ігри, і т.д., виявляється він також вміє завантажувати ОС з вказаного йому образа! Справді, так як емуляція середовища для DOS-програм повинна включати емуляцію практично всієї апаратури, чому б і ні? Пробує емулювати навіть PCjr.

Завантаження сторонньої ОС здійснюється командою boot:
boot <imgpath>\imgname.ext
При чому шлях до образу може бути заданий як у "термінах" гостьової системи (директорії, змонтовані в DosBox), так і абсолютним для Host-системи.
Синя стрілка -- команда, що завантажує вказаний образ.
На жаль, можливості вказати заданий BIOS немає, тому мови про ROM-BASIC не може бути. Ну, але, DosBox, він і не для того, можливість завантажувати ОС в ньому -- лише приємний бонус.

bochs

На відміну від описаних вище емуляторів, bochs емулює процесор та деяку периферію, орієнтуючись швидше на сучасну апаратуру, а не на древню. Під ним йде навіть Windows 7, хоча і дууууже повільно -- bochs повністю емулює всі команди CPU, це не віртуалізатор.

Однак, невеликою допомогою він цілком здатен працювати з DOS 1.XX.

Допомога наступна::

Вимкнути перевірку коректності boot-сектора (див. Додаток 1):
floppy_bootsig_check: disabled=1
в файлі конфігурації, або в графічному конфігураторі:
"Disk & Boot" --> "Boot Options" --> "Skip Floppy Boot Signature Check":
В принципі, цього достатньо. Само собою, слід ще вказати образ, з якого ватажитися, або так:
floppya: type=1_2, 160k="<FDPATH>\IBM PC-DOS 1.0 (5.25)\PCDOS100.IMG", status=inserted, write_protected=0
або так:

В результаті отримаємо DOS 1.00 на цілком сучасній машині:
Правда, курсор мигає часто-часто -- частота все ж завелика, але особливих проблем не виникає. Можна, до всього, поколупатися у внутрішньому функціонуванні DOS, скориставшись засобами зневадження bochs.

На жаль, хоча bochs вміє завантажувати користувацькі BIOS-и, переконати його працювати із BIOS-ами ранніх IBM PC не вдалося. Очевидно, віртуальна апаратура несумісна із старим кодом BIOS. Питання з наскоку не вирішилося і вимагає більш ретельного дослідження. Якщо хтось може поділитися інформацією з того приводу -- пишіть!

Знову ж таки, на жаль, в bochs проявляється той же баг, що і в SPC/XT -- після Alt-Tab з програми  некоректно сприймаються клавіші, поки не натиснеш один раз Alt.


На сьогодні -- все. Наступного разу придивимося ближче, що ж це за DOS 1.XX такий був.

Дякую за увагу!


_______________

Виноски


(1) Наприклад, згідно вказаного в конфігурації порядку завантаження для новіших машин, або згідно фіксованого порядку, типу спочатку A:, потім C: для старіших. 

(2) Тут певна плутанина, сектори на доріжках нумеруються з одиниці, але наскрізна нумерація секторів йде з нуля. Детальніше див. "Cylinder-head-sector". Взагалі, зараз більш актуальна система нумерації не CHS, а LBA, та й сектори відмінного від 512 байт розміру теж починають з'являтися, але в цьому пості мова про старішу техніку, старіші стандарти, тому в основному використовується відповідна термінологія.  

(3) Передаючи керування, BIOS може скористатися і іншою формою адреси, наприклад:  0x7C0:0x0000, що відповідає тій же фізичній/лінійній адресі, однак з відмінними значеннями сегмента і зміщення (нагадаємо, що режим все ще реальний). Таку можливість слід враховувати, використовуючи абсолютну адресацію в коді бут-сектора. Але це - окрема тема, детальніше див. "Boot Sequence" на OsDev.

(4) Тобто, 0x55 за зміщенням 0x1FE і 0xAA за 0x1FF -- не забуваємо, що x86 є процесорами з little-endian порядком байт, тому 2-байтове слово, прочитане за зміщенням 0x1FE відносно початку бут-сектора буде виглядати як 0xAA,0x55.

(5) Далі він може або почати самостійно завантажувати ОС, або, якщо це, наприклад, MBR, передати керування бут-сектору активного розділу. Всілякі бут-менеджери, типу GRUB, цим і користуються. Детальніше див: "Boot manager", "Boot sector", "Volume Boot Record", "Booting" на Вікіпедії та "Boot Sequence" і "Rolling Your Own Bootloader" на OsDev. Також вартує уваги наступна сторінка: "All the Details of many versions of both MBR and OS Boot Records", на тому ж сайті є цікаві матеріали по DOS 1.00 i DOS 1.10

(6) Щодо VFD точно того не скажу -- під x64 він працює ненадійно, під Windows 7 не працює взагалі, тому спробувати не було можливості.

(7) В Інтернеті ходять образи ранніх DOS в форматі .DIM. Як з них добути "сирий" образ -- див. "Tutorial on extracting "Disk Images" from a *.DIM File using HxD (a Disk/Hex Editor)".

(8) Наприклад, хоча я розумію, що просто не до кінця розібрався, що і як, ймовірно у моїх труднощах моя ж вина, але ті самі параметри на одних вкладках працюють нормально, на інших ні, а іноді взагалі працюють, лише якщо їх виставити на конкретній вкладці, і запускаючи емуляцію, залишити її активною...

(9) Ну так, вузол нашого кластера теж ініціює BIOS більше хвилини. Але він при тому обнуляє багато гігабайт оперативної пам'яті, щоб ECC працювало коректно. ;-)

(10) Детальніше про використання DEBUG див. "A Guide to DEBUG".

(11) Нагадую -- на відміну від MESS. Хоча, може то я щось недопересконфігурував...

(12) Із технічних подробиць -- програмка запакована UPX, після розпакування нормально дизасемблюється IDA Free (Див. додаток 2), можна перевірити, які імена файлів очікуються насправді. Містить стрічки pcxt.rom (очевидно, ім'я файлу з тим анонімним BIOS-ом) та cga.chr, які ніде безпосередньо не використовуються в коді.

_______________

Додаток 1. Boot-сектор DOS-1.XX та що з ним робити

Що таке бут-сектор вже розповідалося вище, щоб нагадати собі, можна подивитися у виноску (5). Формат його, для FAT, сумісного із DOS 2 і старшими, наступний: 
  • Перших три байти -- перехід на код завантажувача, часто -- короткий перехід + nop. 
  • Наступних 8 байт має бути стрічка "OEM name" -- ідентифікатор виробника, доповнена до 8 байт пробілами.
  • Наступні байти, із зміщенням, починаючи з 0x0B, містять власне BPB. Його розмір, може складати 13, 19, 21, 25, 32, 51, 79 байт, в залежності від версії.
  • Після BPB йде код, що завантажуватиме ОС, якщо така присутня на диску, або повідомлятиме, що ОС немає.
  • Нарешті, останніх два байти -- сигнатура 0x55, 0xAA (0x55 за зміщенням 0x1FE і 0xAA за 0x1FF, див. також виноску (4)).
Детальніше про різні формати BPB (та структури FAT взагалі) можна почитати тут: "FAT (reserved sectors)" та тут "FAT: BPB (BIOS Parameter Block)". 

На жаль, DOS 1.XX, стосувалася лише перша умова, і то частково. Знайшлися люди, які розколупали та дизасемблювали boot-сектори DOS 1.00 i DOS 1.xx, подальша розповідь базується на їх роботі. В оригіналі можна почитати тут: "Reverse-Engineering DOS 1.0 – Part 1: The Boot Sector" і тут: "The Boot Sector of IBM® Personal Computer™ DOS Version 1.00 (1981)", "The Boot Sector of IBM® Personal Computer™ DOS Version 1.10 (1982)".

Boot-сектор DOS 1.00 мав наступну структуру (не забуваємо про little-endianness, наприклад двобайтове 0x1450 на диску буде представлене як 0x50, 0x14, щоб, після завантаження в пам'ять, а з пам'яті в регістр дати якраз правильну послідовність 0x14, 0x50):
  • Двобайтовий перехід на код завантажувача.
  • Два байти, (зміщення в бут-секторі 0x02) -- кількість секторів, що потрібно завантажити з диску: 0x14=20.
  • Два байти (0x04) -- зміщення, за яким завантажувати: 0.
  • Два байти (0x06) -- сегмент в який завантажувати: 0x60.
  • 0x08: 10-байтова стрічка " 7-May-81",0, очевидно, "дата народження" коду бут-сектора (вона справді починається з пробілу).
  • 0x11: 31 нульовий байт.
  • Із зміщення 0x31 починається власне код. Перша команда, cli, забороняє переривання, (іі опкод 0xFA).
  • Цікавинка: в коді є стрічка "Robert O'Rear", яка ніде не використовується, просто автор залишив таку пам'ятку про себе. (Він - сьомий найманий працівник Мікрософт).
Як бачимо, BPB майже не пахне, сигнатура в кінці теж не передбачена, хоча, місце для неї є -- код бут-сектора помітно менший від 512 байт.

Завантажувач, отримавши керування, зчитує те, що він вважає першим сектором каталогу (див. структуру FAT за посиланнями вище) -- сектор 4 на доріжці 0 (сторона нульова автоматом -- про існування інших він і не знає), і порівнює перших два записи каталогу (довжину яких він знає) з стрічками "IBMBIO.COM" і "IBMDOS.COM" (порівняння робиться нечутливим до регістру літер). Якщо їх немає -- просить користувача замінити диск і натиснути довільну клавішу. Якщо диск взагалі не прочитався, повідомляє про це ("Disk Boot failur"+ символ з кодом 'e'+0x80, ймовірно одиничний старший біт використовувався як символ кінця стрічки -- стандартна ASCII таблиця була цілком собі 7-бітною) і звертається до ROM BASIC. Якщо ж все ОК, файли присутні, завантажує перших 20 секторів, починаючи з сектора 8 на нульовій доріжці, за адресою 0x0060:0x0000 -- починаючи з байта із лінійною адресою 0x00600. При чому, читає, вважаючи, що на доріжку приходиться рівно 8 секторів, тому не здатен нічого коректно завантажити з дискет, у яких інша кількість секторів на доріжку! Щодо адреси в пам'яті, куди потрапляє образ IBMIO.COM, то згадаємо, що в x86 байти з 0x0000 по 0x03FF це таблиця переривань, область від 0x0400 до 0x4FF використовує BIOS для своїх потреб, від 0x500 до 0x5FF зарезервовано для “DOS Communication Area”, відповідно першою вільною адресою є 0x600. (Детальніше, що ж там діється між 0x0400 i 0x5FF можна почитати також в книзі "Персональный компьютер фирмы IBM и операционная система MS-DOS").

Як бачимо, припущень бут-лоадер справді робить багато:
  • Першими файлами в каталозі мають бути "IBMBIO.COM" і "IBMDOS.COM"
  • При тому йти вони мають один за одним у неперервних секторах (перший файл - 1920 байт, 3 сектори, другий 6400 байт, 12 секторів, разом -- 15), і займати не більше 20 секторів (хоча, коли підвантажено 20 секторів, код у них може сам довантажувати далі, але це окрема тема).
  • Каталог повинен починатися в секторі 4 нульової доріжки, дані -- в її ж секторі 8.
  • На доріжку повинно приходитися рівно 8 секторів.

Хоча код бут-сектора DOS 1.10 на око дещо відмінний, по суті він відрізняється слабо. Якщо я правильно розібрався (попередні висновки базувалися на аналізі професіоналів):
  • Перших три байти -- двобайтовий ближній перехід та інструкція nop (як прийнято і більш нових бут-секторах).
  • Наступних два байти, (0x03) здається, кодують тип дискети -- одностороння чи двостороння (для DOS 1.00 все було простіше -- підтримувався лише один формат, а тут зразу два). Якщо рівні 0x08, вона вважається односторонньою, якщо ні -- двосторонньою (CMP WORD PTR [7C03],+08). Кількість секторів на доріжку вважається рівною 8.
  • За адресою 0x05 -- вже знайома кількість секторів, яку слід прочитати (20=0x14).
  • Адреса, куди завантажувати, і куди передавати керування, на цей раз прошита жорстко, 0x0060:0x0000.
  • Виконання починається із тієї ж команди cli, але перед нею розташована послідовність байт 0xCD,  0x19, яка кодує int 19h, виклик ROM-BASIC. Перехід на неї відбувається, якщо диск ініціалізувався, (інакше напише "Disk Boot failure" і зависне) але в процесі читання виникли збої.
  • Будь-які дати відсутні, замість стрічки з іменем автора -- "Microsoft,Inc".
Для порівняння див. "The MS-DOS 5.0 Floppy Disk Boot Record".

Детальніше про бут-сектори ранніх DOS та суміжні питання, див:
Але що із тим робити? Як змусити сучасні утиліти успішно працювати із тими образами?

Все дуже просто -- слід, за допомогою того чи іншого HEX-редактора, створити на них BPB. Тоді можна буде змінювати вміст дисків, при тому вантажитися із них все ще можна буде (див. далі), але, за бажання, для повної автентичності, можна буде і після необхідних змін вмісту диску відновити оригінальний бут-сектор.

BPB (BIOS Parameter Block) для DOS 1.XX


Вдалим співпадінням є те, що наш старенький бут-сектор залишає достатньо місця для BPB. Мінімальний і достатній розмір BPB - 13 байт (0x0D), починається він повинен зі зміщення 0x0B, завершується, відповідно, на 0x18h, тоді як код завантажувача починається за зміщенням 0x31 для DOS 1.00 та 0x27 для DOS 1.10. На жаль, затреться значна частина запису " 7-May-81", (все що після "7-"), але реальною проблемою це не є.

Формат його, мінімального BPB, наступний:

Опис поля Зміщення
від початку
сектора
Зміщення
від початку
BPB
Розмір,
байт
Значення
поля для
160 кб FD
Байт на (логічний) сектор  0x00B  0x00  2  0x200=512 
Логічних секторів на кластер   0x00D  0x02  1  1
К-сть зарезервованих секторів
перед першим FAT
 0x00E  0x03     2  1
Кількість копій FAT  0x010  0x010  1  2
Максимальна кількість елементів
кореневого каталогу
 0x011  0x06  2  0x40=64
Загальна кількість логічних
секторів
 0x013     0x08  2 0x140=320
 Медіа-дескриптор (магічне число)  0x015     0x0A     1 0xFE
 К-сть логічних секторів у FAT  0x016  0x0B     2 1

Інформація взята із наступних джерел:
  • "FAT (reserved sectors)" з Вікіпедії -- розділи "BIOS Parameter Block" із загальним форматом, у залежності від версій ОС та табличку ближче до кінця, яка, на жаль, не має назви, але містить відповідність між різними медіа-дескрипторами, розмірами дисків та іншими їх параметрами з PBP.
  • FAT: BPB (BIOS Parameter Block), на OsDev. Теж хороша стаття, але табличками користуватися значно менш зручно, ніж на Вікі (IMHO, звичайно), та й деталізація значно менша.
  • "Standard Floppy Disk Formats Supported by MS-DOS" від Мікрософт, зокрема, "Formatted Capacity 160K ".
Тобто, слід взяти образ дискети, і довільним HEX-редактором (див. Додаток 2) встановити вказані величини за вказаними зміщеннями:

Можна, звичайно, крім BPB, дописати в кінці сектора сигнатуру 0x55, 0xAA. Що цікаво, випробувані мною утиліти не потребували її, однак вона буде потрібна BIOS під час перевірки коректності бут-сектора.

Оригінальний бут-сектор DOS 1.00
Бут-сектор DOS 1.00 із правильним BPB (його поля обведено червоним, не забуваємо про endianness -- для x86 старші байти йдуть першими!), але без сигнатури, місце для якої обведено синім.

____________

Додаток 2: Інструменти

Крім власне емуляторів, про які мова в тексті, корисними будуть і різноманітні допоміжні програми.

WinImage -- програма роботи із образами. Дуже хороша, але, на жаль, Shareware. Вміє працювати, в тому числі, і з 160/180/320/360Кб образами.

DiskExplorer -- безкоштовний, при тому -- цілком достойний, аналог WinImage. Ретельно не випробовував, але формат 160Кб (із коректним BPB, як і WinImage) підтримує.

ImDisk та Virtual Floppy Driver (VFD) -- програми для монтування образів дисків як реальних дисководів. На жаль, VFD не дружить із x64 і не дружить з Windows 7, (а якщо і те і друге...) тому на практиці не випробовував, але згідно документації вони обоє вміють коректно монтувати 160Кб образи. Open Source.

Важливо, що образи 160/320 Кб, модифіковані цими програмами (для цього їм довелося сформувати правильний BPB), читаються DOS 1.XX та DOS 2.00 некоректно. В деталі вникати не став, для практичних експериментів копіював за допомогою DOS 2.0 із образа 360 Кб, до якості якого претензій у цієї ОС не було. Підозрюю, що тут якась дрібничка... Колись може й розберуся, як зовсім не буде чим зайнятися.

Утиліти для конвертації образів TeleDisk: TDCVT (TD? --> .TRD та .FDI), FDI2IMA (щоб з продуктів попередньої утиліти добути щось читабельне сучасними засобами) --  http://erokhin.tripod.com/. Див. також ImageDisk 1.18 та Readme до нього. (Автор любить перетасовувати папки, щоб не давали прямих лінків, тому також: http://www.classiccmp.org/dunfield/img/index.htm)

HxD -- приємний HEX-редактор. Безкоштовний.

Hex Workshop -- дуже потужний, хоча і Shareware, редактор. Зокрема, вміє відображати структуру PBP.

Також пара Open Source-редакторів: Frhed і wxHexEditor.

Більше див. тут: Comparison of hex editors.

IDA  -- надзвичайно потужний дизасемблер. Дорогий, але версія 5.0 доступна безкоштовно для некомерційного використання, і її цілком достатньо для дослідження DOS,


2 коментарі:

  1. mess не долго грузится, он пытается несколько раз загрузиться с винта, которого нет, а потом выдает ошибку. Надо или с винта грузится или как-то отключить его в конфиге.

    ВідповістиВидалити
    Відповіді
    1. А, понятно, спасибо! Буду иметь ввиду, если столкнусь опять. Я особенно глубоко не копал -- и так немеряно времени потратил тогда...

      Видалити