понеділок, 25 лютого 2013 р.

MS/PC DOS 1.XX "Ось ти який, північний олень!"

Розібравшись, в попередніх постах ("MS/PC DOS 1.0", "MS/PC DOS 1.XX в емуляторах"), із історією народження PC/MS-DOS та навчившись запускати такі старі версії DOS, подивимося нарешті, що ж він собою являв.

Ми вже переконались раніше, що DOS 1.00, а тому, швидше за все, і всі DOS 1.XX для справді IBM PC-сумісних машин, нормально працюють на сучасних машинах (за винятком перевірки сигнатури бут-сектора). Тому, для автентичності, надалі працюватимемо, емулюючи IBM PC 5150, з оригінальним BIOS (включаючи ROM BASIC). Лише, щоб довго не чекати, іноді будемо збільшувати робочу частоту. Використовуватимемо, в основному, SPC/XT (деталі див. попередній пост).

IBM PC-DOS 1.0



Ми його вже багато раз бачили в попередньому пості, але лише з однієї точки зору. Придивимося тепер детальніше.

Запускаємо (відео захоплювалося Cam Studio):
Спочатку чекаємо, дивимося як мигає екран -- змінюється поточний відеорежим (видно в заголовку вікна), нарешті, на 20-й секунді писк -- BIOS перевірив апаратуру і залишився задоволеним її станом. Виводить якісь числа, вантажить DOS (іконка дискети блимнула зеленим). На жаль, емуляція швидкодії дисководів у SPC/XT більш ніж неточна, тому завантаження практично миттєве.

DOS питається дату. На відміну від наступних версій, якщо просто натиснути Enter, він, замість вибрати значення по замовчуванню, (для DOS 1.1+ -- 1-1-1980) запитається ще раз. Так само мовчки перепитається у відповідь на дату, яка йому видається некоректною (ввести 2013 цілком можна, просто воно показуватиме його у вигляді 13, а ось рік, менший за 1980 ввести не дасть -- DOS зберігає дату у вигляді числа років, що пройшли з 1979). До речі, якщо натиснути Ctrl-C, вводити дату таки не буде потрібно, але буде встановлено значення по замовчуванню "00-00-80". Ймовірно, це пов'язано із тим, що в DOS 1.00, DATE -- окрема програмка, яка запускається при завантаженні, а Ctrl-C її "вбиває".

Після цього побачимо запрошення "A>". CHKDSK дає нам можливість подивитися, скільки файлів на дискеті (40), який її об'єм, скільки вільного місця, аналогічно -- про оперативну пам'ять. Подивитися список файлів можна командою DIR. На жаль, тодішній DIR не показує загальної кількості файлів, але підкажу -- виведе 38. Де решту два? (40-38=2). Це IBMIO.COM i IBMDOS.COM, вони приховані і штатними засобами їх не видно. Побачити можна хіба ззовні, або за допомогою DEBUG.COM, вручну завантаживши 4-й сектор (про структуру FAT див. посилання в попередньому пості). Ще одна проблема -- DIR не приймає жодних опцій, кажучи у відповідь "File not found": і /W і /P, і навіть команда MORE з'явилися потім, тому список просто пробігає екраном, засобу призупинити його немає (хіба, може, на деяких машинах спрацьовувала б клавіша Pause, в емуляторі SPC/XT -- не спрацьовує).

Скориставшись тим, що DOS вже підтримує wildcard-и, подивимося, які програми .COM (49-та секунда відео) та .EXE (55 секунда) присутні на диску. Бачимо, що з EXE -- тільки одна LINK.EXE (яка ще й, сама по собі -- малокорисна, вимагає компілятора, здатного генерувати об'єктні файли для неї).  По .COM поговоримо пізніше, а зараз перейдемо до демонстрації першої гри для IBM PC (детальніше див. попередній пост). Починаючи з 1 хв 7 секунд від початку відео об'їжджаємо ослів. Наїздившись -- гра, все ж, навіть як на той час, не фонтан, завершуємо, опиняючись в середовищі BASICA (1:29). Виходимо командою "system", на чому відео і завершується.

Отож, доступні нам вбудовані команди (див. List of MS-DOS commands):
COPY
ERASE (синонім DEL з'явився пізніше)
DIR
PAUSE
REM (здається, єдина спеціалізована команда batch-файлів, жодних IF ще не було )
RENAME (синонім REN з'явився пізніше)
TYPE

Зовнішні, не рахуючи LINK.EXE і командний інтерпретатор COMMAND.COM:
FORMAT.COM
CHKDSK.COM
SYS.COM
DISKCOPY.COM
DISKCOMP.COM
COMP.COM
DATE.COM (з DOS 1.1 стала вбудованою)
TIME.COM (з DOS 1.1 стала вбудованою)
MODE.COM
EDLIN.COM
DEBUG.COM
BASIC.COM і BASICA.COM, які трішки відрізняються підтримуваними "фічами" і вимогами до системи.

Перенаправлення вводу-виводу немає. Команди практично не приймають опцій, діагностика мінімальна. Зокрема, зустрівши незнайому опцію, просто її ігнорують.

Наприклад, "DIR /W", "DIR /?", "DIR /<Any symbol>" скаже просто "File not found". Так само вона скаже, якщо диск просто порожній! При тому, "DIR /", "DIR a:", "DIR a:/" виведе список файлів в корені диску (а про директорії вона і не знає, зустрівши виводитиме як файли нульового розміру).

Так як команди не повідомляють про невірні опції, вияснити, котрі ж реально існують, не так просто. FORMAT.COM точно приймає опцію /S, роблячи диск системним. (Для експериментів було змонтовано ще один образ дискети).

Виявив цікавий баг: якщо дискету сформатувати як системну ("FORMAT B: /S"), то "SYS.COM" казатиме "System transferred", хоча, здавалося б -- сенсу тепер ;-), однак якщо  взяти чисту дискету (навіть після "FORMAT B:"), заявить "No room for system on destination disk". Або не зовсім баг -- вимоги до розташування IBMIO.SYS/IBMDOS.COM дуже строгі, але для чистої дискети вони мали б виконуватися. Та й навіщо тоді SYS.COM, якщо він не може вирішити проблему, для вирішення якої призначений? З іншого боку, може то наслідок якихось проблем в емуляторі. Як би там не було, баг-репорт навряд чи приймуть...

Інструкцію по роботі з DOS 1.00 писати мені все ж неохота -- неактуально трохи, тому запропоную хіба невеликий ролик із демонстрацією роботи команд:


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

Зверніть увагу, як DISCCOMP дозволяє порівнювати дискети за допомогою одного дисковода -- вона просто читає дані у пам'ять, скільки влізе, просить замінити диск, і так, поки не завершило. Хоча, робить це не дуже ефективно -- 200 Кб вільної пам'яті цілком мало б вистачити, щоб 160Кб дискети порівняти за один раз, а не за змушувати мене 9 раз змінювати диск. Показано й інші, як обговорені, так і не обговорені, "фішки" -- Ctrl-C у відповідь на дату, 2013 рік, аномалія SYS.COM, трішки -- різницю між BASIC і BASICA, та те, що вони приклади програм зберігають у tokenized вигляді (порівняйте вивід LIST у середовищі і вивід TYPE).

На завершення огляду оригінального диску -- демонстрація програм на БЕЙСИКу, призначених показати крутизну нової платформи, в тому числі її здатність виводити колір та пищати динаміком. Для цього згодиться програмка SAMPLES.BAS -- такий собі диспетчер. (Стосовно відео: спроба друкувати на відсутній принтер завершилася провалом, SAMPLES.BAS довелося перезапустити):

Крім того, подивимося на дві програми, які вміли працювати під цю ОС: VisiCalc та Turbo Pascal 1.0 (WordStar 3.x знайти не вдалося, хоча, можливо, саме завдяки йому багато які архаїзми -- див. попередні пости (1, 2), присутні і в сучасних машинах):
 
Turbo Basic 1.00. Завантажено файл calc.pas, який йде як приклад до пакету, потім його скомпільовано. (Інструкції по користуванню цим простеньким Spreasheet є у файлі CALC.DOC.)
VisiCalc, програма, яка претендує на звання першої електронної таблиці (Spreadsheet). Вважається, що саме завдяки їй персоналки вперше почали розглядати як серйозний бізнесовий інструмент. Як з нею працювати, можна почитати, наприклад, тут (там не для DOS-версії, але вчився рахувати нею суми я саме за тими інструкціями), вихід -  /SQY.
Програми завантажувалися з образу дискети, куди потрапили за допомогою WinImage. Скачати TP 1.0 можна в музеї Borland, який вже, правда, не Borland; VisiCalc тут. Дискети було модифіковано, як описано в попередньому пості, щоб додати BPB. На жаль, WinImage трішки "псує" їх, після збереження DOS 1.00 крім файлів бачить багато "записів"-нулів, але працювати це не заважає. Може колись спробую розібратися, чого це він -- яке ще припущення про структури файлової системи робить DOS 1.00, або навпаки, яким елементом стандарту нехтує WinImage. ImDisk собі такого не дозволяє -- ніяких аномалій для образів, змонтованих у ньому та змінених, DOS 1.00 не бачить (хоча створені в WinImage образи, змінені ним, все рівно залишаються "проблемними").

Директорії, якщо вони на дискеті створені зовнішніми засобами DOS 1.00 бачить так:
1 -- директорія, у якій файл vc.com (VisiCalc, не Volkov Commander), vc1.com -- файл в корені диску.

З цією, першою публічною, версією, поки все, що хотілося розповісти. Рухаємося далі.

IBM PC-DOS 1.10 (5.25)

Ця редакція особливих змін не мала. З'явилася підтримка двосторонніх дискет, 320Кб (тих же 8 секторів на доріжку), DATE і TIME стали вбудованими, в команд з'явилося трохи більше опцій та більш детальні повідомлення про помилки, додано EXE2BIN.EXE. Якщо користувач не вводив дату при запуску -- просто встановлювалася дата по замовчуванню (тому на світі є багато файлів, датованих 1 січня 1980 :). Додано синоніми парі вбудованих команд, DEL для  ERASE і REN для RENAME. Для файлів почали зберігатися й час їх зміни, не тільки дата, як раніше. (Трішки про історію див. поза-попередній пост і посилання там).

 Детально колупатися все ж не дуже цікаво, відмічу тільки що:
  • В FORMAT.COM з'явилася опція "/1" -- форматувати двосторонній диск як односторонній, а на невірні опції він, замість того, щоб просто їх ігнорувати, почав матюкатися "Invalid parameter".
  • DISKCOMP i DISKCOPY набули нової опції "/1" -- порівнювати/копіювати лише одну сторону. Кумедно, що коли дискета одностороння, цю опцію давати обов'язково, інакше вони намагатимуться читати і другу, відсутню, сторону. Незнайомі опції ігнорують.
  • DIR навчилася розуміти /P -- робити паузи після кожного повного екрану виводу і /W -- виводити лише імена файлів, в декілька стовпців. Виводить також загальну кількість файлів, яку вона показала. Правда, якщо диск порожній, все ще каже "File not found" -- от ніби чесно, але заплутує. Невідомі опції теж все ще просто ігнорує.
Робота DIR /P, екран перший.
DIR /P, екран другий та DIR /W



Microsoft DOS 1.12 [Compaq OEM]

З Compaq-івським трохи складніше... Судячи по всьому, це PC-DOS 1.10/MS-DOS 1.24+, містить, окрім стандартного DOS-івського комплекту утиліт, цікаві приклади на БЕЙСИКу, та TEST.EXE, таку собі системну утиліту, для тестування і т.д., від власне Compaq. Однак, завантажитися з нього не вдавалося ніяк. Взявши IDA Free та внутрішній зневаджувач bochs, вдалося знайти, принаймні, безпосередню причину.
  1. Файл, скачаний за посиланням вище, (який взагалі розповзся по Інету) трішки завеликий -- там зайвих 4Кб нулів, які починаються і закінчуються стрічкою "Skip  8 blocks". Що це таке і звідки -- не знаю, але в результаті частина емуляторів відмовляються розпізнавати файл як коректний образ (розмір його 331 792 замість коректних для 320Кб дискети 327 680). Виправляється тривіально, HEX-редактором.
  2. Бут-сектор, на відміну від розглянутих раніше, починається безпосередньо з коду. Якщо відновити BPB, затре його важливу частину.
  3. Завантаження відбувається, в загальних рисах, так: читається 4-й сектор, каталог, перевіряється, чи є там стрічки "IOSYS   COM" і "MSDOS   COM" (три пробіли в обох випадках), потім читає другий сектор -- FAT, перевіряє медіа-дескриптор, збережений у FAT (0xFF - 320Кб, 0xFE - 160Кб), на підставі цього в регістр SI завантажується адреса структури, яка описує, як завантажувати ОС. Далі регістри тричі заповнюються послідовними елементами цієї структури, і викликається INT 13h. Проблема в тому, що вже перед першим з них в DX потрапляє 0x4000, (DH -- Head, DL - Drive, 40-ва головка аж ніяк не може бути присутня на дискеті), а решту викликів -- взагалі лише сміття. Тобто, швидше за все, ця частина образу (або вихідної дискети) пошкоджена. Як варіант -- то такий хитрий захист від копіювання, що базується на особливостях BIOS від Compaq, для якого передані значення -- аж ніяк не сміття.  Образ наш - 320Кб, якщо вручну направити виконання по шляху 160Кб -- значення виглядатимуть більш розумно.
Я вирішив схитрувати. Завантажився з PC DOS 1.10, вставив два диски (точніше, змонтував образи, але не суть) DOS 1.12, викликав з одного з них "FORMAT.COM b: /S", щоб отримати системний диск, згенерований штатними засобами.  (Якщо зовсім чесно, почав я з DOS 2.00, але з-під нього FORMAT від Compaq не запустився, поскаржившись на невірну версію DOS.) Бут-сектор отриманого таким чином диску відрізнявся від сектору з скачаного образу лише парою байт там і сям, і вантажитися так само відмовився. Пам'ятаючи, що значення для одностороннього диску виглядали більш розумними, зробив наступне: "FORMAT.COM b: /S /1" (опції /F:160 він ще не знає). Результат цих трудів успішно завантажився. При тому, залишаючись майже повністю автентичним -- щирим Compaq MS-DOS 1.12. Тобто, справді, дані для шляху завантаження з односторонньої дискети в оригінальному бут-секторі коректні, на відміну від даних для двосторонньої.

Потім я взяв образ розміром 160Кб, сформатував його. На обидва образи (320Кб, сформатований як 160Кб і "істинно" 160Кб) скопіював всі *.EXE i *.COM програми з оригінального диску.  Виявилося, що якщо 320Кб, сформатований як 160Кб, урізати до 160 -- він перестане вантажитися, хоча читатися буде успішно. Оригінально сформатований під 160 вантажиться нормально. Очевидно, чимось вони все ж відрізняються, хоча побайтове порівняння не прояснило нічого. Дивно... Поки що далі не колупатиму -- думаю, можна відновити бутабельність і двостороннього, але в даний момент шкода часу.

Для експериментів із прикладами на БЕЙСИКу можна, всього лиш, використати обидва образи одночасно -- з одного вантажити ОС, з іншого БЕЙСИК.

Отож:
Compay DOS 1.12. Видно, що це явно MS-DOS 1.24+/PC DOS 1.100 -- наприклад, нормально сприймає "Enter" замість введення дати, та й про час питається.
Демонстрація DEMO.BAS. На жаль, гру додивитися не вдається -- команда F9 зупиняє захоплення відео (можна виправити, полінувався запускати втретє). Там також є трохи і звуків, але, на жаль, їх майже не чути -- якийсь збій у програмі захоплення екранного відео.:


Тестування системи засобами TEST.EXE (де потрібно, як і в попередньому відео, натискаю відповідні клавіші):


MS-DOS 1.20.ver.1.20 OEM [Zenith]

Ось для якихось таких машин: Z-100/110/120.

Завантажився нормально:
Zenith DOS (Z-DOS/MS-DOS) 1.20. Chkdsk завис, на щось там матернувшись...
Однак CHKDSK зразу і висне. Взагалі, частина утиліт виснуть у випадку безобідних помилок, або й просто так. Частина не висне. Висне, окрім CHKDSK, FORMAT, ASSIGN, SORT, та інші утиліти, які схожі на ті, що прийшли з DOS 2+. Але PRINT.COM чи TREE.COM не виснуть... STAT.COM виводить те, що очікували від CHKDSK. VIDEO.EXE успішно тестує відеорежими. Загадкова CONFIGUR.COM каже, "Version Mismatch with IO.SYS". SYS.COM вимагає вставити системний диск.

Бут-сектор містить достатньо місця для BPB. Сама ОС (COMMAND.COM, зокрема), поводиться якось так, як би очікувалося від DOS версії порядку PC DOS 1.10/ MS DOS 1.2X.

Утиліти повідомляють найрізноманітніші версії. Частина мають трішки нетипові назви (Наприклад, DSKCOPY.COM, який ще й при тому нічого не згадує про Microsoft). Трішки нетипово поводяться (див. запрошення DEBUG.COM). Однак, найбільш дивним є те, що частина присутніх програм явно належать DOS 2+ -- ASSIGN, BACKUP, RESTORE, SORT, PRINT, TREE, і т.д., та програми типу CREF, MAP, LIB, які виглядають частиною Мікрософтівського асемблера.

Список файлів (зверніть увагу на нетипові для DOS 1.XX утиліти), запуск EXE2BIN i DEBUG.COM.
Ще на диску є доволі мила гра, SC1.EXE -- "Space Commanders":
Так виглядає, що дискета, з якої робився образ, була чиєюсь робочою, а то й експериментальною -- хоча ядро схоже на справжню MS-DOS 1.20 від Zenith, решта файлів абсолютна збірна солянка із DOS інших версій, частин асемблера, якихось тестових утиліт і навіть гри.

Всі решта

На жаль, завантажити інші образи не вдалося.

Образ "Microsoft DOS 1.25 [Corona Data Systems OEM]" виглядав пошкодженим, але, судячи по всьому, дана система просто використовувала дискети із 42 доріжками на сторону. (Нестандартний розмір образа міг вказувати на зайві байти, типу того, як було для Compaq 1.12. Однак, конвертер TDCVT і ImageDisk заявили, що у вихіному файлі TD0, взятому тут, є 42 доріжки-8 секторів-2 сторони, а отриманий з нього .IMG співпадає з тим, що скачаний з WinWorldPC). Завантажити не вдалося, хоча в Інеті ходять чутки про більш вдалі спроби.

Microsoft DOS 1.25 [Zenith OEM] -- формату 180Кб, DOS 1.XX такого не підтримував. Бут-сектор має правильну сигнатуру, в ньому спочатку пише MSDOS5.0, далі -- MSDOS125, тобто походження його -- загадкове, але він явно не оригінальний. Завантажитися з нього не вдалося. То є трішки дивно, бо 1.20 вантажився цілком успішно.  Читатися з-під DOS 2.00 -- читається, але повторити той трюк, що було зроблено для Compaq 1.12 не вдалося.

Образи "MS-DOS 1.25.ver.1.25 OEM [MPX-16]" і "MS-DOS 1.25.ver.1.25 OEM [Sanyo]", взяті з old-dos.ru, вдалося успішно перетворити з TD0 в (здається) нормальні .IMG, але обидва вантажитися відмовилися. Образ для Sanyo, взяти тут, теж не захотів вантажитися (він трохи відрізняється), хоча там пише, що MESS здатен емулювати відповідну машину (сходу не знайшов, детально не вникав). Можливо, через те, що ті машини були не дуже IBM PC-сумісними, і просто не здатні працювати під емуляторами IBM PC.

Зокрема, бут-сектор Sanyo не використовує ніяких переривань, працює з портами напряму, і я не маю уявлення, що він тим хоче добитися. IDA Free каже, що на IBM PC ті порти мають відношення до DMA-контролера. Бут-сектор MPX менш-більш конвенційно читає сектори з диску, але потім навіщось викликає int 14h -- в стандартному IBM PC BIOS то є фурнкції роботи з UART, не найпотрібніша річ в буті, тому певне вони означали щось інше в MPX.

Обидва бут-сектори не мають місця для BPB. Диски нормально читаються з інших DOS, чогось особливо цікавого не містять -- стандартний набір утиліт, з дрібними варіаціями (типу "FILCOM.COM" замість "COMP.COM" на диску Sanyo).

Можливо, колись ще до цієї теми повернуся, але поки що -- все.

На завершення:

Початок нової епохи -- IBM PC-DOS 2.0:


Наступний пост нарешті розповість, чому я ото собі згадав такі давні часи, а поки що:

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

Немає коментарів:

Дописати коментар