Огляд проблеми
IBM PC-сумісні комп’ютери1 трохи стандартизували формати дискет, тому, для комп’ютерів цієї епохи домінують побайтові образи – й так зрозуміло, що сектор 512 байт, формат визначається BPB у бут-секторі, а де не визначається (для дисків епохи DOS 1.xx) – можна вгадати за розміром. Ілюстрація – плагін для Total Commander-а, який працює лише із ‘‘плоскими’’ образами, відкриває абсолютну більшість образів дискет, скачаних із сайтів з ретро-софтом.
Звичайно, залишалися нестандартні формати, дискети із захистом від копіювання, формати інших операційних систем – не сімейства MS-DOS і похідних від них. Завдяки низькорівневій природі апаратури дисководів, можливими були безліч варіацій. Для роботи із ними було створено спеціалізоване програмне забезпечення. Великого поширення набули Teledisk (типове розширення .td0) та Imagedisk (.imd) – у своїх образах вони зберігають службову інформацію, дозволяючи відтворити такі ‘‘хитрі’’ образи2.
Однак, із CP/M ситуація інша. Різні комп’ютери обладнувалися різними, часто не сумісними між собою, дисководами. Вони різні за розміром – 8”, 5.25”, 3.5”, 3”; різні за принципами – soft sectors vs hard sectors; кількістю сторін (іншими словами – магнітних голівок), кількістю треків, розміром секторів, skewing-ом тощо.
Формати дискет, підтримувані Osborne Executive”, стор. 427, Osborne Executive Reference Guide. Дискети 5.25”, soft sector. |
Труднощі є і на вищому рівні абстракції – навіть за повністю визначеного фізично образу, програмні формати навіть в межах CP/M могли помітно відрізнятися, і на самих дискетах ця інформація не зберігалася – ніяких тобі BPB…
Тому маємо наступні проблеми:
- Образ повинен містити інформацію, достатню, щоб відтворити правильну будову диску під час запису.
- Зазвичай, це буде образ, створений Teledisk чи Imagedisk, або, принаймні – перетворений у цей формат.
- Потрібен сумісний дисковід на більш сучасному – але, ймовірно, все ще старенькому, комп’ютері.
- Або підключати його до сучасного комп’ютера пристроєм типу kryoflux чи greaseweazle.
- Потрібні сумісні дискети.
- Потрібна можливість редагувати такі образи.
- Бажаною є можливість читати такі образи з дискет.
Розповім про кожну із проблем.
Оригінальні образи
Цікаво також мати оригінальні образи, які розповсюджувалися з комп’ютером Знайти їх виявилося доволі просто, принаймні для систем, з якими експериментував. Джерела – Web Archive, зокрема: Osborne Executive CPM та bitsavers, (також, документація від bitsavers). Для простоти, відповідні матеріали додаю до цього репозиторію. Інше програмне забезпечення знаходив у купі різних місць – деякі перераховано у [розділі посилань].
Видається, знайшов усі диски оригінального комплекту – три диски CP/M Plus (System Disk, General Utilities Disk, Advanced Utilities Disk, разом з описами тут), диск BASIC-ів (MBASIC/CBASIC), диск SuperCalc, два диски WordStar, диск UCSD p-System.
Для своєї зручності підготував образ із утилітами, які часто використовую, разом із текстовим редактором [TE].
Дисководи
Osborne Executive використовує менш-більш стандартні 5.25” дисководи, із soft sectors – початок секторів розмічається програмно. Тому вдалося використати більш сучасні дисководи із епохи IBM PC-сумісних комп’ютерів.
Потенційною проблемою було те, що ‘‘новіші’’ 5.25” дисководи є двох видів, 360 Кб і 1.2 Мб. Оскільки доріжка в 1.2 Мб дисководі помітно вужча, записані на ньому 360 Кб дискети читаються на відповідних дисководах не завжди3. Забігаючи наперед, для запису дисків було використано Imagedisk, спочатку на 360 Кб дисководі, але організаційно це було незручно, тому поекспериментував і з 1.2 Мб – за допомогою її опції Double step, вдається успішно записувати дискети для ‘‘Осборна’’ на 1.2Мб дисководі.
Оскільки обладнання для під’єднання 5.25” дисководів до сучасних комп’ютерів, типу Kryoflux, у мене поки немає, скористався проміжною машиною, самозбірним 386-based комп’ютером із ethernet мережевою картою та ftp-сервером із пакету MTCP.
Щоправда, дискети формату Osborne-1 поки не вдалося записати. Планую поекспериментувати із іншими дисководами – ймовірно, залежить від індивідуальних особливостей. За допомогою Greaseweazle, використовуючи 1.2Мб 5.25” дисковід та “звичайні” 360Кб дискети, вдалося записати образи Osborne-1, які успішно прочиталися на Osborne Executive4. Перевірити на Osborne-1 – ще в планах.
Дискети
'’Звичайні’’ 360 Кб – DD дискети для IBM PC-сумісних комп’ютерів підійшли (завдяки можливостям Imagedisk), тому особливих проблем на цьому етапі не виникло – маю ще майже десяток працездатних. 1.2 Мб не вдалося успішно використати.
Запис за допомогою Imagedisk
Я не проводив системного дослідження, за перших експериментів Imagedisk справився краще, ніж TeleDisk та більше сподобався, то надалі я цим пакетом і обмежився5.
Скріншоти зроблені в DOSBox-X, природно, що записувати звідти я не можу, але виглядають вони краще, ніж фото6, тому, де можливо, обмежився ними.
На початку Imagedisk показує ‘‘Splash screen’’, вийти з якого можна за допомогою Esc:
Тоді буде видно доступні операції:
Спочатку потрібно встановити ключові опції – клавішею S:
Після цього, повертаємося до попереднього екрану та літерою W вмикаємо запис:
Читати можна тією ж утилітою, потім опрацьовуючи образи, як описано нижче.
Утиліти для редагування образів
Основними формати образів, з якими доводиться мати справу:
- Imd – формат Imagedisk. Робота з реальним ‘‘залізом’’ в мене зосереджена навколо нього.
- Td0 – формат Teledisk. Частина образів постачаються саме у цьому форматі.
- Достатньо вміти конвертувати його в imd.
- Mfi або mfm – формати [MAME], які цей емулятор вміє писати.
- Достатньо вміти конвертувати цей формат в .imd. MAME вміє читати такий файл і перетворювати його в .mfi для запису.
- На жаль, поки цю задачу не вдалося вирішити7 – збережене в MAME добути з цих файлів не вдалося. Серйозною проблемою це не є – поки всі задачі вдалося вирішити в [RunCPM].
Оптимальним варіантом для сучасних систем видається використання cpmtools, скомпільований із libdsk.
- cpmtools знає про формат файлової системи СP/M,
- libdsk дозволяє безпосередньо маніпулювати образами Imagedisk із збереженою низькорівневою інформацією.
Компілювання libdsk та cpmtools
- Для компіляції використовую MSYS2/MinGW64, де встановлено всі необхідні пакети – компілятори, autotools, бібліотеки (потрібні пакети розробики для libz i libbz2) тощо.
- Скачуємо останні версії обох пакетів з офіційних сайтів: cpmtools, libdsk. На момент написання цього тексту, це libdsk-1.5.19 та cpmtools-2.23.
- На github трапляються різні варіанти цих пакетів, не бачив сенсу з ними розбиратися.
- Розархівовуємо обидва пакети:
unzip libdsk1519.zip
tar -xvf libdsk-1.5.19.tar.gz
tar -xvf cpmtools-2.23.tar.gz
cd libdsk-1.5.19.tar.gz
- Нам потрібна динамічна бібліотека, тому потрібно зробити певні зміни до коду скриптів компіляції libdsk:
configure.ac :
- LT_INIT
+ LT_INIT([win32-dll])
- if test "$ac_cv_prog_gcc" = "yes"; then
- CFLAGS="-Wall -DNOTWINDLL $CFLAGS"
- fi
Перша зміна – для dll під Windows, друга – оскільки gcc 2.95, проблему якого це вирішувало, згідно коментаря, давно не актуальний.
Для спрощення – вимикаємо компіляцію документації:
doc/Makefile.am :
-%.txt: %.lyx
- lyx -e text $<
- mv `basename $@ .txt`.text $@
-%.tex: %.lyx
- lyx -e latex $<
-%.pdf: %.lyx
- lyx -e pdf $<
Необхідно для коректної компіляції DLL:
lib/Makefile.am :
- AM_CPPFLAGS=-I$(top_srcdir)/include
+ AM_CPPFLAGS=-I$(top_srcdir)/include -DLIBDSK_EXPORTS=1
- libdsk_la_LDFLAGS = -version-info 9:0:4
+ libdsk_la_LDFLAGS = -version-info 9:0:4 -no-undefined
- Перегенеровуємо скрипти autotools, конфігуруємо та компілюємо:
touch AUTHORS NEWS
autoreconf -fiv
./configure --with-zlib --with-bzlib
Тепер потрібно в згенерованому config.h додати:
config.h :
- /* #undef HAVE_GETTEMPFILENAME */
+ #define HAVE_GETTEMPFILENAME 1
configure перевіряє цю функцію викликом GetTempFileName() – без аргументів, вона не лінкується, і скрипт вирішує, що такої функції немає. Тоді проект ніби компілюється, але, розархівування образів у тимчасовий файл провалюється із дивними помилками, типу ‘‘файл не знайдено’’.
- Компілюємо
make
, або йmake -j5
– проблем із паралельною компіляцією не було. - Для наступної компіляції cpmtools, зручно зразу й заінсталювати:
make install
– файли та утиліти бібліотеки потраплять у відповідні директорії /mingw64. - Переходимо до компіляції cpmtools. Вона потребує ncursesw, але можна обійтися.
- Генеруємо Makefile:
cd ../cpmtools-2.23
./configure --with-libdsk --with-defformat=osbexec1
Оскільки я використовуватиму ці утиліти, в першу чергу, для роботи з Osborne Executive, скористався нагодою вибрати його формат (див. Опис форматів) за замовчуванням.
- Перед компіляцією потрібно внести дрібне виправлення до Makefile, не став розбиратися із причинами:
Makefile :
- LIBS= -ldsk -lncurses
+ LIBS= -ldsk -lncursesw
- Компілюємо викликом make.
Отримані утиліти потребуватимуть наступні динамічні бібліотеки: libbz2-1.dll, libdsk-5.dll, libiconv-2.dll, libintl-8.dll, libncursesw6.dll, zlib1.dll.
Завантажую архів libdsk із змінами, описаними вище, отриманий викликом make dist
.
Пошук файлів конфігурації утилітами
Так скомпільовані cpmtools будуть шукати diskdefs за шляхом
За замовчуванням, cpmtools для Win32 з офіційного сайту шукають його в директорії /cpmtools поточного диску, UNIX-систем – в ${prefix}/share/
Утиліти libdsk шукатимуть файд конфігурації libdskrc за шляхом ~/.libdskrc, або libdskrc у піддиректорії share шляху, переданого у змінній LIBDSK. Це поведінка “з коробки”.
Керувати форматом, що використовується за замовчуванням, можна за допомогою змінної середовища CPMTOOLSFMT
.
Опис форматів
Обидві пакети утиліт потребують опис конкретних дисків – через їх велику різноманітність ‘‘в дикій природі’’.
Опис властивостей дисків різних Osborne-ів дуже неповний і в cpmtools, і в Disk-Utils/libdsk. Тому мусив додати, базуючись на наведених тут: Osborne 1: Non-stock and user-made software – без них на експерименти пішло б помітно більше часу.
- Для cpmtools їх додано до файлу diskdefs,
- Для libdsk – файл libdskrc.
Записи diskdefs для дисків Osborne:
# OSB1 Osborne 1 - SSSD 48 tpi 5.25" - 256 x 10, image size = 102 400. diskdef osb1ssdd seclen 256 tracks 40 sectrk 10 blocksize 2048 maxdir 64 skew 2 boottrk 3 os 2.2 # DENSITY MFM ,LOW # BSH 4 BLM 15 EXM 1 DSM 45 DRM 63 AL0 080H AL1 0 OFS 3 end # OSB2 Osborne 1 - SSDD 48 tpi 5.25" - 1024 x 5 diskdef osb1ssdd seclen 1024 tracks 40 sectrk 5 blocksize 1024 maxdir 64 skew 1 boottrk 3 os 2.2 end # OSB6 Osborne 1 + Osmosis - DSDD 96 tpi 5.25" - 512 x 10 diskdef osb1osm seclen 512 tracks 80 sectrk 10 blocksize 2048 maxdir 128 skew 2 boottrk 6 os 2.2 end # OSB7 Osborne Nuevo - DSDD 48 tpi 5.25" - 1024 x 5 diskdef osb1nv seclen 1024 tracks 40 sectrk 10 blocksize 2048 maxdir 128 skew 2 offset 10240 boottrk 0 os 2.2 end # OSB8 Osborne Nuevo/Vixen/4 - DSDD 48 tpi 5.25" - 1024 x 5 diskdef osbVix seclen 1024 tracks 80 sectrk 5 blocksize 2048 maxdir 128 skew 2 boottrk 2 os 2.2 end # OSBB Osborne Nuevo 2.1 - DSDD 96 tpi 5.25" - 1024 x 5 diskdef osb1nv2 seclen 1024 tracks 160 sectrk 5 blocksize 2048 maxdir 256 skew 1 boottrk 2 os 2.2 end # OSB3 Osborne Executive - SSDD 48 tpi 5.25" - 1024 x 5 diskdef osbexec1 seclen 1024 tracks 40 sectrk 5 blocksize 1024 maxdir 64 skew 1 boottrk 3 os 2.2 end # OSB9 Osborne Executive w/Z3 - DSDD 96 tpi 5.25" - 1024 x 5 diskdef osbexec2 seclen 1024 tracks 160 sectrk 5 blocksize 2048 maxdir 128 skew 2 boottrk 2 os 2.2 end # OSBA Osborne Executive Dig. Arts - DSDD 48 tpi 5.25" - 1024 x 5 diskdef osbexec3 seclen 1024 tracks 80 sectrk 5 blocksize 2048 maxdir 128 skew 2 boottrk 2 os 2.2 end
Записи libdskrc для дисків Osborne:
[osb1sssd] description = OSB1 Osborne 1 - SSSD 48 tpi 5.25" - 256 x 10 cylinders = 40 heads = 1 secsize = 256 sectors = 10 secbase = 1 datarate = SD [osb1ssdd] description = OSB2 Osborne 1 - SSDD 48 tpi 5.25" - 1024 x 5 cylinders = 40 heads = 1 secsize = 1024 sectors = 5 secbase = 1 datarate = DD [osb1g2] description = OSB4 Osborne G2 System - DSDD 48 tpi 5.25" - 1024 x 5 sides = extsurface cylinders = 80 heads = 2 secsize = 1024 sectors = 5 secbase = 1 datarate = DD [osb1g2h] description = OSB5 Osborne G2 System - DSDD 96 tpi 5.25" - 1024 x 5 sides = extsurface cylinders = 160 heads = 2 secsize = 1024 sectors = 5 secbase = 1 datarate = DD [osb1osm] description = OSB6 Osborne 1 + Osmosis - DSDD 96 tpi 5.25" - 512 x 10 sides = alt cylinders = 80 heads = 2 secsize = 512 sectors = 10 secbase = 1 datarate = DD [osb1nv] description = OSB7 Osborne Nuevo - DSDD 48 tpi 5.25" - 1024 x 5 sides = extsurface cylinders = 80 heads = 2 secsize = 1024 sectors = 5 secbase = 1 datarate = DD [osbVix] description = OSB8 Osborne Vixen - DSDD 48 tpi 5.25" - 1024 x 5 sides = alt cylinders = 80 heads = 2 secsize = 1024 sectors = 5 secbase = 1 datarate = DD [osb1nv2] description = OSBB Osborne Nuevo 2.1 - DSDD 96 tpi 5.25" - 1024 x 5 sides = alt cylinders = 160 heads = 2 secsize = 1024 sectors = 5 secbase = 1 datarate = DD [osbexec1] description = OSB3 Osborne Executive - SSDD 48 tpi 5.25" - 1024 x 5 cylinders = 40 heads = 1 secsize = 1024 sectors = 5 secbase = 1 datarate = DD [osbexec2] description = OSB9 Osborne Executive w/Z3 - DSDD 96 tpi 5.25" - 1024 x 5 sides = alt cylinders = 160 heads = 2 secsize = 1024 sectors = 5 secbase = 1 datarate = DD [osbexec3] description = OSBA Osborne Executive Dig. Arts - DSDD 48 tpi 5.25" - 1024 x 5 sides = alt cylinders = 80 heads = 2 secsize = 1024 sectors = 5 secbase = 1 datarate = DD
Ремарка: skew – задає порядок чергування секторів, як оптимізацію – ранні персональні ком’ютери, обладнані дисководами, не встигали прочитати кілька секторів підряд, тому сектори чергувалися так, щоб до моменту, коли можна починати читати наступний, він якраз наближався до магнітної голівки. Без цього виникають великі паузи – доводиться чекати повного оберту диску для читання наступного сектора. Проблемою є те, що коли ‘‘відступ’’ невідомий, вміст файлів переплутується.
Редагування образів
cpmtools
Головною тріадою ‘‘повсякденної’’ роботи з образами є cpmls/cpmcp/cpmrm – вивести список, скопіювати в чи з образу, видалити файл(и).
Всім утилітам потрібно опцією -f передавати тип образу – автовизначення тут неможливе. А ось тип контейнера – IMD, TD0 тощо, із підтримуваних, визначається автоматично. Якщо визначення не влаштовує, можна скористатися опцією -T
, наприклад, -T tele
чи -T imd
, де імена типів визначаються libdsk (підказка програм про цю опцію не згадує).
Приклади використання cpmls
$ cpmls ./DISK_TE.IMD # Базове використання, тип образу -- за замовчуванням 0: c.h cpm3.sys pip.com te_kp.cf te_kp.com te_ws100.cf te_ws100.com $ cpmls ./OS1BASIC.IMD # Невірний тип образу cpmls: cannot read superblock (Data error.) $ cpmls ./os1basic.td0 # Не той тип образу -- не залежно від формату контейнера cpmls: cannot read superblock (Data error.) $ cpmls -f osb1sssd ./OS1BASIC.IMD # Вказано правильний тип 0: autost.com cbas2.com crun2.com mbasic.com xdir.com xref.com $ cpmls -f osb1sssd ./os1basic.td0 # Вказано правильний тип 0: autost.com cbas2.com crun2.com mbasic.com xdir.com xref.com $ # Різні види форматування $ cpmls -l ./DISK_TE.IMD # UNIX-style 0: -rw-rw-rw- 1320 Jan 01 1970 c.h -r--r--r-- 17920 Jan 01 1970 cpm3.sys -r-xr-xr-x 8704 Jan 01 1970 pip.com -rw-rw-rw- 1035 Jan 01 1970 te_kp.cf -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rw-rw-rw- 1040 Jan 01 1970 te_ws100.cf -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmls -d ./DISK_TE.IMD # CP/M 2.2 dir output PIP COM : TE_WS100 CF : TE_WS100 COM : TE_KP CF TE_KP COM : CPM3 SYS : C H $ cpmls -D ./DISK_TE.IMD # P2DOS 2.3 ddir-like output. Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- C .H 2K 10 CPM3 .SYS 18K 140 RS PIP .COM 9K 68 R TE_KP .CF 2K 8 TE_KP .COM 19K 148 TE_WS100.CF 2K 8 TE_WS100.COM 19K 151 7 Files occupying 71K, 112K Free. $ cpmls -F ./DISK_TE.IMD # CP/M 3.x DIR.COM output. Directory For Drive A: User 0 Name Bytes Recs Attributes Prot Update Create ------------ ------ ------ ------------ ------ -------------- -------------- C H 2k 11 None CPM3 SYS 18k 140 RS None PIP COM 9k 68 R None TE_KP CF 2k 9 None TE_KP COM 19k 148 None TE_WS100 CF 2k 9 None TE_WS100 COM 19k 151 None Total Bytes = 67k Total Records = 536 Files Found = 7 Total 1k Blocks = 71 Used/Max Dir Entries For Drive A: 10/ 64 $ cpmls -A ./DISK_TE.IMD # E2fs lsattr-like output. 0: --------- c.h ----s---- cpm3.sys --------- pip.com --------- te_kp.cf --------- te_kp.com --------- te_ws100.cf --------- te_ws100.com $ # Додатково -- друкувати індекс файлу. Видно, що с.h було створено останнім. $ cpmls -i ./DISK_TE.IMD 0: 9 c.h 6 cpm3.sys 0 pip.com 4 te_kp.cf 5 te_kp.com 1 te_ws100.cf 2 te_ws100.com $ cpmls -i -l ./DISK_TE.IMD 0: 9 -rw-rw-rw- 1320 Jan 01 1970 c.h 6 -r--r--r-- 17920 Jan 01 1970 cpm3.sys 0 -r-xr-xr-x 8704 Jan 01 1970 pip.com 4 -rw-rw-rw- 1035 Jan 01 1970 te_kp.cf 5 -rwxrwxrwx 18944 Jan 01 1970 te_kp.com 1 -rw-rw-rw- 1040 Jan 01 1970 te_ws100.cf 2 -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ # А ось це мені не зрозуміло... $ cpmls -D DISK_EXP.IMD TE_WS100.COM No files found $ cpmls -D DISK_EXP.IMD TE_WS*.COM No files found $ cpmls -D DISK_EXP.IMD TE*.COM No files found $ cpmls -D DISK_EXP.IMD *.COM Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- PIP .COM 9K 68 R TE_KP .COM 19K 148 TE_WS100.COM 19K 151 3 Files occupying 71K, 112K Free. $ cpmls -D DISK_EXP.IMD *.C* Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- PIP .COM 9K 68 R TE_KP .CF 2K 8 TE_KP .COM 19K 148 TE_WS100.CF 2K 8 TE_WS100.COM 19K 151 5 Files occupying 71K, 112K Free.
Приклади використання cpmcp та cpmrm
$ ls -l total 144 -rw-r--r-- 1 indrekis None 133830 Apr 7 02:45 DISK_EXP.IMD -rw-r--r-- 1 indrekis None 57070 Feb 21 22:44 DISK_EXP2.td0 $ cpmls -l ./DISK_EXP.IMD 0: -rw-rw-rw- 1320 Jan 01 1970 c.h -r--r--r-- 17920 Jan 01 1970 cpm3.sys -r-xr-xr-x 8704 Jan 01 1970 pip.com -rw-rw-rw- 1035 Jan 01 1970 te_kp.cf -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rw-rw-rw- 1040 Jan 01 1970 te_ws100.cf -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmcp ./DISK_EXP.IMD 0:c.h . # Добуваємо з образу $ ls -l total 148 -rw-r--r-- 1 indrekis None 133830 Apr 7 02:45 DISK_EXP.IMD -rw-r--r-- 1 indrekis None 57070 Feb 21 22:44 DISK_EXP2.td0 -rw-r--r-- 1 indrekis None 1320 Apr 19 01:39 c.h $ # Добуваємо з образу як текст (документація стверджує, $ # що перетворює з формату CP/M в UNIX формат, але виглядає, $ # що під Windows -- в формат Windows). $ cpmcp -t ./DISK_EXP.IMD 0:c.h ./c1.h $ ls -l total 152 -rw-r--r-- 1 indrekis None 133830 Apr 7 02:45 DISK_EXP.IMD -rw-r--r-- 1 indrekis None 57070 Feb 21 22:44 DISK_EXP2.td0 -rw-r--r-- 1 indrekis None 1320 Apr 19 01:39 c.h -rw-r--r-- 1 indrekis None 1392 Apr 19 01:40 c1.h $ # Перезаписує на хості, але -- не в образі: $ cpmcp ./DISK_EXP.IMD ./c.h 0: cpmcp: can not create 00c.h: file already exists $ cpmrm ./DISK_EXP.IMD c.h # Тому спершу стираємо $ cpmls -l ./DISK_EXP.IMD 0: -r--r--r-- 17920 Jan 01 1970 cpm3.sys -r-xr-xr-x 8704 Jan 01 1970 pip.com -rw-rw-rw- 1035 Jan 01 1970 te_kp.cf -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rw-rw-rw- 1040 Jan 01 1970 te_ws100.cf -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmcp ./DISK_EXP.IMD ./c.h 0: $ cpmls -l ./DISK_EXP.IMD 0: -rw-rw-rw- 1320 Jan 01 1970 c.h -r--r--r-- 17920 Jan 01 1970 cpm3.sys -r-xr-xr-x 8704 Jan 01 1970 pip.com -rw-rw-rw- 1035 Jan 01 1970 te_kp.cf -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rw-rw-rw- 1040 Jan 01 1970 te_ws100.cf -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ rm *.h # Clear folder for clarity $ ls DISK_EXP.IMD DISK_EXP2.td0 $ cpmcp ./DISK_EXP.IMD 0:*.* . # Copy all files from the image to current folder $ ls DISK_EXP.IMD DISK_EXP2.td0 c.h cpm3.sys pip.com te_kp.cf te_kp.com te_ws100.cf te_ws100.com $ cp DISK_EXP.IMD EMPTY.IMD $ cpmrm EMPTY.IMD *.* # Empty image $ cpmls -l EMPTY.IMD # Справді немає файлів $ cpmls -D EMPTY.IMD # Ще раз перевіряємо No files found $ cpmcp ./EMPTY.IMD *.COM *.CF 0: # Копіюємо групу файлів користувачу 0 $ cpmls -l EMPTY.IMD 0: -rwxrwxrwx 8704 Jan 01 1970 pip.com -rw-rw-rw- 1035 Jan 01 1970 te_kp.cf -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rw-rw-rw- 1040 Jan 01 1970 te_ws100.cf -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmcp ./EMPTY.IMD *.COM *.CF 1: # А тепер ще користувачу 1 $ cpmls -l EMPTY.IMD # cpmls вміє вивести файли всіх користувачів 0: -rwxrwxrwx 8704 Jan 01 1970 pip.com -rw-rw-rw- 1035 Jan 01 1970 te_kp.cf -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rw-rw-rw- 1040 Jan 01 1970 te_ws100.cf -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com 1: -rwxrwxrwx 8704 Jan 01 1970 pip.com -rw-rw-rw- 1035 Jan 01 1970 te_kp.cf -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rw-rw-rw- 1040 Jan 01 1970 te_ws100.cf -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ # Інший тип образу у тому ж контейнері # DISK_EXP2.IMD -- DISK_EXP2.td0, converted to .IMD $ cpmcp -f osb1sssd DISK_EXP2.IMD 0:xdir.com . $ cpmcp -f osb1sssd DISK_EXP2.IMD c.h 0: $ cpmls -f osb1sssd -l DISK_EXP2.IMD 0: -rwxrwxrwx 2048 Jan 01 1970 autost.com -rw-rw-rw- 1320 Jan 01 1970 c.h -rwxrwxrwx 20992 Jan 01 1970 cbas2.com -rwxrwxrwx 17408 Jan 01 1970 crun2.com -rwxrwxrwx 24320 Jan 01 1970 mbasic.com -rwxrwxrwx 2304 Jan 01 1970 xdir.com -rwxrwxrwx 7168 Jan 01 1970 xref.com $ cpmrm -f osb1sssd DISK_EXP2.IMD c.h $ cpmls -f osb1sssd -l DISK_EXP2.IMD 0: -rwxrwxrwx 2048 Jan 01 1970 autost.com -rwxrwxrwx 20992 Jan 01 1970 cbas2.com -rwxrwxrwx 17408 Jan 01 1970 crun2.com -rwxrwxrwx 24320 Jan 01 1970 mbasic.com -rwxrwxrwx 2304 Jan 01 1970 xdir.com -rwxrwxrwx 7168 Jan 01 1970 xref.com $ # Інший тип контейнера $ cpmls -f osb1sssd -l DISK_EXP2.td0 0: -rwxrwxrwx 2048 Jan 01 1970 autost.com -rwxrwxrwx 20992 Jan 01 1970 cbas2.com -rwxrwxrwx 17408 Jan 01 1970 crun2.com -rwxrwxrwx 24320 Jan 01 1970 mbasic.com -rwxrwxrwx 2304 Jan 01 1970 xdir.com -rwxrwxrwx 7168 Jan 01 1970 xref.com $ cpmcp -f osb1sssd DISK_EXP2.td0 0:xdir.com . # З образу -- копіює $ cpmcp -f osb1sssd DISK_EXP2.td0 c.h 0: # Але змінювати образ не вміє cpmcp: can not umount device: Disc is read-only. $ # Стирати теж не вміє, але й про помилку не каже $ cpmrm -f osb1sssd DISK_EXP2.td0 xdir.com $ echo $? 0 $ cpmls -f osb1sssd -l DISK_EXP2.td0 0: -rwxrwxrwx 2048 Jan 01 1970 autost.com -rwxrwxrwx 20992 Jan 01 1970 cbas2.com -rwxrwxrwx 17408 Jan 01 1970 crun2.com -rwxrwxrwx 24320 Jan 01 1970 mbasic.com -rwxrwxrwx 2304 Jan 01 1970 xdir.com -rwxrwxrwx 7168 Jan 01 1970 xref.com $ # Нюанс з директоріями. Якщо зробити так: $ cpmcp IMAGE.IMD ASM1\hello1.asm 0: $ # Воно створить файл ''ASM1\HEL'' -- символ ''\'' іноді припустимий # в іменах файлів. Тому потрібно робити так: $ cpmcp DISK_TOOLS_W.IMD ASM1\hello1.asm 0:hello1.asm
Приклади використання cpmchmod та cpmchattr
$ cpmls -D DISK_EXP.IMD *.COM *.SYS Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- CPM3 .SYS 18K 140 RS PIP .COM 9K 68 R TE_KP .COM 19K 148 TE_WS100.COM 19K 151 4 Files occupying 71K, 112K Free. $ cpmls -l DISK_EXP.IMD *.COM *.SYS 0: -r--r--r-- 17920 Jan 01 1970 cpm3.sys -r-xr-xr-x 8704 Jan 01 1970 pip.com -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmchattr DISK_EXP.IMD "12rs" TE_KP.COM $ cpmchattr DISK_EXP.IMD "n" CPM3.SYS $ cpmls -l DISK_EXP.IMD *.COM *.SYS 0: -rw-rw-rw- 17920 Jan 01 1970 cpm3.sys -r-xr-xr-x 8704 Jan 01 1970 pip.com -r-xr-xr-x 18944 Jan 01 1970 te_kp.com -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmls -D DISK_EXP.IMD *.COM *.SYS Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- CPM3 .SYS 18K 140 PIP .COM 9K 68 R TE_KP .COM 19K 148 RS TE_WS100.COM 19K 151 4 Files occupying 71K, 112K Free. $ cpmchattr DISK_EXP.IMD "1234" TE_KP.COM $ cpmls -D DISK_EXP.IMD *.COM Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- PIP .COM 9K 68 R TE_KP .COM 19K 148 RS TE_WS100.COM 19K 151 3 Files occupying 71K, 112K Free. $ cpmls -l DISK_EXP.IMD *.COM 0: -r-xr-xr-x 8704 Jan 01 1970 pip.com -r-xr-xr-x 18944 Jan 01 1970 te_kp.com -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmchattr DISK_EXP.IMD "AmRS" TE_KP.COM $ cpmls -l DISK_EXP.IMD *.COM 0: -r-xr-xr-x 8704 Jan 01 1970 pip.com -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmls -D DISK_EXP.IMD *.COM Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- PIP .COM 9K 68 R TE_KP .COM 19K 148 TE_WS100.COM 19K 151 3 Files occupying 71K, 112K Free. $ cpmchmod DISK_EXP.IMD 000 TE_KP.COM $ cpmls -l DISK_EXP.IMD *.COM 0: -r-xr-xr-x 8704 Jan 01 1970 pip.com -r-xr-xr-x 18944 Jan 01 1970 te_kp.com -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmls -D DISK_EXP.IMD *.COM Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- PIP .COM 9K 68 R TE_KP .COM 19K 148 R TE_WS100.COM 19K 151 3 Files occupying 71K, 112K Free. $ cpmchmod DISK_EXP.IMD 777 TE_KP.COM $ cpmls -l DISK_EXP.IMD *.COM 0: -r-xr-xr-x 8704 Jan 01 1970 pip.com -rwxrwxrwx 18944 Jan 01 1970 te_kp.com -rwxrwxrwx 19328 Jan 01 1970 te_ws100.com $ cpmls -D DISK_EXP.IMD *.COM Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- PIP .COM 9K 68 R TE_KP .COM 19K 148 TE_WS100.COM 19K 151 3 Files occupying 71K, 112K Free. $ cpmchattr DISK_EXP.IMD "RS" *.COM $ cpmls -D DISK_EXP.IMD *.COM Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- PIP .COM 9K 68 RS TE_KP .COM 19K 148 RS TE_WS100.COM 19K 151 RS 3 Files occupying 71K, 112K Free. $ cpmchattr DISK_EXP.IMD "RS" *.* $ cpmls -D DISK_EXP.IMD *.* Name Bytes Recs Attr update create ------------ ------ ------ ---- ----------------- ----------------- C .H 2K 10 RS CPM3 .SYS 18K 140 RS PIP .COM 9K 68 RS TE_KP .CF 2K 8 RS TE_KP .COM 19K 148 RS TE_WS100.CF 2K 8 RS TE_WS100.COM 19K 151 RS 7 Files occupying 71K, 112K Free.
Виглядає, що cpmchmod вміє лише встановлювати read-only та system атрибути, хіба що – mode передається у стилі UNIX.
Утиліта cpmchattr дозволяє змінювати атрибути:
- 1-4 – F1-F4, користувацькі,
- r – read-only,
- s – system,
- a – archived,
Крім того, в стрічці команди, n – очистити всі атрибути, m – очистити ті, що йдуть далі. Тобто, “nrs” – очищає всі, робить read-only i system, “12mr34” – встановлює F1, F2, очишає read-only, F3 та F4.
Приклади використання fsck.cpm та fsed.cpm
$ fsck.cpm DISK_EXP.IMD Phase 1: check extent fields Phase 2: check extent connectivity DISK_EXP.IMD: 10/64 files (0.0% non-contigous), 73/185 blocks $ fsck.cpm -f osb1sssd DISK_EXP2.TD0 Phase 1: check extent fields Phase 2: check extent connectivity DISK_EXP2.TD0: 6/64 files (0.0% non-contigous), 40/46 blocks
Утиліта fsed.cpm дозволяє редагувати файлову систему образу, а fsck.cpm перевіряє, і, кажуть – дозволяє виправляти помилки. Джерельні тексти cpmtools навіть включають приклад пошкоджених файлових систем – директорію badfs.
Редактор файлової системи CP/M – відображення каталогу. Підказки щодо відповідності різних представлень тієї ж інформації.
libdsk
Пакет libdsk допомагає cpmtools працювати із контейнерами образів, але в комплектів має і свої корисні утиліти.
dskid -- інформація про образи.
$ dskid DISK_EXP2.IMD Stage 1 Stage 2 Stage 3 Stage 4 Stage 5 DISK_EXP2.IMD: Driver: IMD file driver Sidedness: Alt Cylinders: 40 Heads: 1 Sectors: 10 First sector: 1 Sector size: 256 Data rate: SD Record mode: FM Complement: No R/W gap: 0x2a Format gap: 0x52 Drive status: 0x20 Comment: [1991-07-29T16:40:37] CP/M 2.2 Basic Disk for Osborne 1 Stage 6 $ dskid DISK_EXP.IMD Stage 1 Stage 2 Stage 3 Stage 4 Stage 5 DISK_EXP.IMD: Driver: IMD file driver Sidedness: Alt Cylinders: 40 Heads: 1 Sectors: 9 First sector: 1 Sector size: 1024 Data rate: SD Record mode: MFM Complement: No R/W gap: 0x2a Format gap: 0x52 Drive status: 0x20 Stage 6
dskparse -- деталізований HEX-dump образу.
Фрагмент виводу:$ dskparse DISK_EXP2.IMD -------- IMD disk image ------------------------------------------------------ 00000000: 49 4d 44 20 4c 69 62 44 |IMD LibD| Signature / date stamp 00000008: 73 6b 20 31 2e 35 2e 31 |sk 1.5.1| 00000010: 39 3a 20 31 39 2f 30 34 |9: 19/04| 00000018: 2f 32 30 32 33 20 30 32 |/2023 02| 00000020: 3a 33 39 3a 35 38 0d 0a |:39:58..| 00000028: 5b 31 39 39 31 2d 30 37 |[1991-07| Comment 00000030: 2d 32 39 54 31 36 3a 34 |-29T16:4| 00000038: 30 3a 33 37 5d 20 43 50 |0:37] CP| 00000040: 2f 4d 20 32 2e 32 20 42 |/M 2.2 B| 00000048: 61 73 69 63 20 44 69 73 |asic Dis| 00000050: 6b 20 66 6f 72 20 4f 73 |k for Os| 00000058: 62 6f 72 6e 65 20 31 1a |borne 1.| -------- Header for track 0 -------------------------------------------------- 00000060: 02 |. | Recording mode 00000061: 00 | . | Cylinder = 0 00000062: 00 | . | Head = 0 00000063: 0a | . | Sectors = 10 00000064: 01 | . | Sector size = 256 00000065: 01 02 03 | ...| Sector IDs 00000068: 04 05 06 07 08 09 0a |....... | 0000006f: 01 | .| Sector 0 status 00000070: c3 5c d2 c3 58 d2 7f 00 |.\..X...| Sector 0 uncompressed 00000078: 20 20 20 20 20 20 20 20 | | 00000080: 20 20 20 20 20 20 20 20 | | 00000088: 43 4f 50 59 52 49 47 48 |COPYRIGH| 00000090: 54 20 28 43 29 20 31 39 |T (C) 19| 00000098: 37 39 2c 20 44 49 47 49 |79, DIGI| 000000a0: 54 41 4c 20 52 45 53 45 |TAL RESE| 000000a8: 41 52 43 48 20 20 00 00 |ARCH ..| 000000b0: 00 00 00 00 00 00 00 00 |........| 000000b8: 00 00 00 00 00 00 00 00 |........| 000000c0: 00 00 00 00 00 00 00 00 |........| 000000c8: 00 00 00 00 00 00 00 00 |........| 000000d0: 00 00 00 00 00 00 00 00 |........| 000000d8: 00 00 00 00 00 00 00 00 |........| 000000e0: 00 00 00 00 00 00 00 00 |........| 000000e8: 00 00 00 00 00 00 00 00 |........| 000000f0: 00 00 00 00 00 00 00 00 |........| 000000f8: 08 cf 00 00 5f 0e 02 c3 |...._...| 00000100: 05 00 c5 cd 8c cf c1 c9 |........| 00000108: 3e 0d cd 92 cf 3e 0a c3 |>....>..| 00000110: 92 cf 3e 20 c3 92 cf c5 |..> ....| 00000118: cd 98 cf e1 7e b7 c8 23 |....~..#| 00000120: e5 cd 8c cf e1 c3 ac cf |........| 00000128: 0e 0d c3 05 00 5f 0e 0e |....._..| 00000130: c3 05 00 cd 05 00 32 ee |......2.| 00000138: d6 3c c9 0e 0f c3 c3 cf |.<......| 00000140: af 32 ed d6 11 cd d6 c3 |.2......| 00000148: cb cf 0e 10 c3 c3 cf 0e |........| 00000150: 11 c3 c3 cf 0e 12 c3 c3 |........| 00000158: cf 11 cd d6 c3 df cf 0e |........| 00000160: 13 c3 05 00 cd 05 00 b7 |........| 00000168: c9 0e 14 c3 f4 cf 11 cd |........| 00000170: 01 |. | Sector 1 status 00000171: d6 c3 f9 cf 0e 15 c3 | .......| Sector 1 uncompressed 00000178: f4 cf 0e 16 c3 c3 cf 0e |........| 00000180: 17 c3 05 00 1e ff 0e 20 |....... | 00000188: c3 05 00 cd 13 d0 87 87 |........| 00000190: 87 87 21 ef d6 b6 32 04 |..!...2.| 00000198: 00 c9 3a ef d6 32 04 00 |..:..2..| 000001a0: c9 fe 61 d8 fe 7b d0 e6 |..a..{..| 000001a8: 5f c9 3a ab d6 b7 ca 96 |_.:.....| 000001b0: d0 3a ef d6 b7 3e 00 c4 |.:...>..| 000001b8: bd cf 11 ac d6 cd cb cf |........| 000001c0: ca 96 d0 3a bb d6 3d 32 |...:..=2| 000001c8: cc d6 11 ac d6 cd f9 cf |........| 000001d0: c2 96 d0 11 07 cf 21 80 |......!.| 000001d8: 00 06 80 cd 42 d3 21 ba |....B.!.| 000001e0: d6 36 00 23 35 11 ac d6 |.6.#5...| 000001e8: cd da cf ca 96 d0 3a ef |......:.| 000001f0: d6 b7 c4 bd cf 21 08 cf |.....!..| 000001f8: cd ac cf cd c2 d0 ca a7 |........| 00000200: d0 cd dd d0 c3 82 d2 cd |........| 00000208: dd d0 cd 1a d0 0e 0a 11 |........| 00000210: 06 cf cd 05 00 cd 29 d0 |......).| 00000218: 21 07 cf 46 23 78 b7 ca |!..F#x..| 00000220: ba d0 7e cd 30 d0 77 05 |..~.0.w.| 00000228: c3 ab d0 77 21 08 cf 22 |...w!.."| 00000230: 88 cf c9 0e 0b cd 05 00 |........| 00000238: b7 c8 0e 01 cd 05 00 b7 |........| 00000240: c9 0e 19 c3 05 00 11 80 |........| 00000248: 00 0e 1a c3 05 00 21 ab |......!.| 00000250: d6 7e b7 c8 36 00 af cd |.~..6...| 00000258: bd cf 11 ac d6 cd ef cf |........| 00000260: 3a ef d6 c3 bd cf 11 28 |:......(| 00000268: d2 21 00 d7 06 06 1a be |.!......| 00000270: c2 |. | 00000271: 01 | . | Sector 2 status 00000272: cf d2 13 23 05 c2 | ...#..| Sector 2 uncompressed 00000278: fd d0 c9 cd 98 cf 2a 8a |......*.| 00000280: cf 7e fe 20 ca 22 d1 b7 |.~. ."..| 00000288: ca 22 d1 e5 cd 8c cf e1 |."......| 00000290: 23 c3 0f d1 3e 3f cd 8c |#...>?..| 00000298: cf cd 98 cf cd dd d0 c3 |........| 000002a0: 82 d2 1a b7 c8 fe 20 da |...... .| 000002a8: 09 d1 c8 fe 3d c8 fe 5f |....=.._| 000002b0: c8 fe 2e c8 fe 3a c8 fe |.....:..| 000002b8: 3b c8 fe 3c c8 fe 3e c8 |;..<..>.| 000002c0: c9 1a b7 c8 fe 20 c0 13 |..... ..| 000002c8: c3 4f d1 85 6f d0 24 c9 |.O..o.$.| 000002d0: 3e 00 21 cd d6 cd 59 d1 |>.!...Y.| 000002d8: e5 e5 af 32 f0 d6 2a 88 |...2..*.| 000002e0: cf eb cd 4f d1 eb 22 8a |...O..".| 000002e8: cf eb e1 1a b7 ca 89 d1 |........| 000002f0: de 40 47 13 1a fe 3a ca |.@G...:.| 000002f8: 90 d1 1b 3a ef d6 77 c3 |...:..w.| 00000300: 96 d1 78 32 f0 d6 70 13 |..x2..p.| 00000308: 06 08 cd 30 d1 ca b9 d1 |...0....| 00000310: 23 fe 2a c2 a9 d1 36 3f |#.*...6?| 00000318: c3 ab d1 77 13 05 c2 98 |...w....| 00000320: d1 cd 30 d1 ca c0 d1 13 |..0.....| 00000328: c3 af d1 23 36 20 05 c2 |...#6 ..| 00000330: b9 d1 06 03 fe 2e c2 e9 |........| 00000338: d1 13 cd 30 d1 ca e9 d1 |...0....| 00000340: 23 fe 2a c2 d9 d1 36 3f |#.*...6?| 00000348: c3 db d1 77 13 05 c2 c8 |...w....| 00000350: d1 cd 30 d1 ca f0 d1 13 |..0.....| 00000358: c3 df d1 23 36 20 05 c2 |...#6 ..| 00000360: e9 d1 06 03 23 36 00 05 |....#6..| 00000368: c2 f2 d1 eb 22 88 cf e1 |...."...| 00000370: 01 0b |.. | 00000372: 01 | . | Sector 3 status 00000373: 00 23 7e fe 3f | .#~.?| Sector 3 uncompressed 00000378: c2 09 d2 04 0d c2 01 d2 |........| 00000380: 78 b7 c9 44 49 52 20 45 |x..DIR E| 00000388: 52 41 20 54 59 50 45 53 |RA TYPES| 00000390: 41 56 45 52 45 4e 20 55 |AVEREN U| 00000398: 53 45 52 02 02 12 00 0a |SER.....| 000003a0: 2a 21 10 d2 0e 00 79 fe |*!....y.| 000003a8: 06 d0 11 ce d6 06 04 1a |........| 000003b0: be c2 4f d2 13 23 05 c2 |..O..#..| 000003b8: 3c d2 1a fe 20 c2 54 d2 |<... .T.| 000003c0: 79 c9 23 05 c2 4f d2 0c |y.#..O..| 000003c8: c3 33 d2 af 32 07 cf 31 |.3..2..1| 000003d0: ab d6 c5 79 1f 1f 1f 1f |...y....| 000003d8: e6 0f 5f cd 15 d0 cd b8 |.._.....| 000003e0: cf 32 ab d6 c1 79 e6 0f |.2...y..| 000003e8: 32 ef d6 cd bd cf 3a 07 |2.....:.| 000003f0: cf b7 c2 98 d2 31 ab d6 |.....1..| 000003f8: cd 98 cf cd d0 d0 c6 41 |.......A| 00000400: cd 8c cf 3e 3e cd 8c cf |...>>...| 00000408: cd 39 d0 11 80 00 cd d8 |.9......| 00000410: d0 cd d0 d0 32 ef d6 cd |....2...| 00000418: 5e d1 c4 09 d1 3a f0 d6 |^....:..| 00000420: b7 c2 a5 d5 cd 2e d2 21 |.......!| 00000428: c1 d2 5f 16 00 19 19 7e |.._....~| 00000430: 23 66 6f e9 77 d3 1f d4 |#fo.w...| 00000438: 5d d4 ad d4 10 d5 8e d5 |].......| 00000440: a5 d5 21 f3 76 22 00 cf |..!.v"..| 00000448: 21 00 cf e9 01 df d2 c3 |!.......| 00000450: a7 cf 52 45 41 44 20 45 |..READ E| 00000458: 52 52 4f 52 00 01 f0 d2 |RROR....| 00000460: c3 a7 cf 4e 4f 20 46 49 |...NO FI| 00000468: 4c 45 00 cd 5e d1 3a f0 |LE..^.:.| 00000470: d6 b7 c2 |... | 00000473: 01 | . | Sector 4 status 00000474: 09 d1 21 ce | ..!.| Sector 4 uncompressed 00000478: d6 01 0b 00 7e fe 20 ca |....~. .| 00000480: 33 d3 23 d6 30 fe 0a d2 |3.#.0...| 00000488: 09 d1 57 78 e6 e0 c2 09 |..Wx....| 00000490: d1 78 07 07 07 80 da 09 |.x......| 00000498: d1 80 da 09 d1 82 da 09 |........| 000004a0: d1 47 0d c2 08 d3 c9 7e |.G.....~| 000004a8: fe 20 c2 09 d1 23 0d c2 |. ...#..| 000004b0: 33 d3 78 c9 06 03 7e 12 |3.x...~.| 000004b8: 23 13 05 c2 42 d3 c9 21 |#...B..!| 000004c0: 80 00 81 cd 59 d1 7e c9 |....Y.~.| 000004c8: af 32 cd d6 3a f0 d6 b7 |.2..:...| 000004d0: c8 3d 21 ef d6 be c8 c3 |.=!.....| 000004d8: bd cf 3a f0 d6 b7 c8 3d |..:....=| 000004e0: 21 ef d6 be c8 3a ef d6 |!....:..| 000004e8: c3 bd cf cd 5e d1 cd 54 |....^..T| 000004f0: d3 21 ce d6 7e fe 20 c2 |.!..~. .| 000004f8: 8f d3 06 0b 36 3f 23 05 |....6?#.| 00000500: c2 88 d3 1e 00 d5 cd e9 |........| 00000508: cf cc ea d2 ca 1b d4 3a |.......:| 00000510: ee d6 0f 0f 0f e6 60 4f |......`O| 00000518: 3e 0a cd 4b d3 17 da 0f |>..K....| 00000520: d4 d1 7b 1c d5 e6 03 f5 |..{.....| 00000528: c2 cc d3 cd 98 cf c5 cd |........| 00000530: d0 d0 c1 c6 41 cd 92 cf |....A...| 00000538: 3e 3a cd 92 cf c3 d4 d3 |>:......| 00000540: cd a2 cf 3e 3a cd 92 cf |...>:...| 00000548: cd a2 cf 06 01 78 cd 4b |.....x.K| 00000550: d3 e6 7f fe 20 c2 f9 d3 |.... ...| 00000558: f1 f5 fe 03 c2 f7 d3 3e |.......>| 00000560: 09 cd 4b d3 e6 7f fe 20 |..K.... | 00000568: ca 0e d4 3e 20 cd 92 cf |...> ...| 00000570: 04 78 fe 0c |.x.. | 00000574: 01 | . | Sector 5 status 00000575: d2 0e d4 | ...| Sector 5 uncompressed 00000578: fe 09 c2 d9 d3 cd a2 cf |........| 00000580: c3 d9 d3 f1 cd c2 d0 c2 |........| 00000588: 1b d4 cd e4 cf c3 98 d3 |........| 00000590: d1 c3 86 d6 cd 5e d1 fe |.....^..| 00000598: 0b c2 42 d4 01 52 d4 cd |..B..R..| 000005a0: a7 cf cd 39 d0 21 07 cf |...9.!..| 000005a8: 35 c2 82 d2 23 7e fe 59 |5...#~.Y| 000005b0: c2 82 d2 23 22 88 cf cd |...#"...| 000005b8: 54 d3 11 cd d6 cd ef cf |T.......| 000005c0: 3c cc ea d2 c3 86 d6 41 |<......A| 000005c8: 4c 4c 20 28 59 2f 4e 29 |LL (Y/N)| 000005d0: 3f 00 cd 5e d1 c2 09 d1 |?..^....| 000005d8: cd 54 d3 cd d0 cf ca a7 |.T......| 000005e0: d4 cd 98 cf 21 f1 d6 36 |....!..6| 000005e8: ff 21 f1 d6 7e fe 80 da |.!..~...| 000005f0: 87 d4 e5 cd fe cf e1 c2 |........| 000005f8: a0 d4 af 77 34 21 80 00 |...w4!..| 00000600: cd 59 d1 7e fe 1a ca 86 |.Y.~....| 00000608: d6 cd 8c cf cd c2 d0 c2 |........| 00000610: 86 d6 c3 74 d4 3d ca 86 |...t.=..| 00000618: d6 cd d9 d2 cd 66 d3 c3 |.....f..| 00000620: 09 d1 cd f8 d2 f5 cd 5e |.......^| 00000628: d1 c2 09 d1 cd 54 d3 11 |.....T..| 00000630: cd d6 d5 cd ef cf d1 cd |........| 00000638: 09 d0 ca fb d4 af 32 ed |......2.| 00000640: d6 f1 6f 26 00 29 11 00 |..o&.)..| 00000648: 01 7c b5 ca f1 d4 2b e5 |.|....+.| 00000650: 21 80 00 19 e5 cd d8 d0 |!.......| 00000658: 11 cd d6 cd 04 d0 d1 e1 |........| 00000660: c2 fb d4 c3 d4 d4 11 cd |........| 00000668: d6 cd da cf 3c c2 01 d5 |....<...| 00000670: 01 07 d5 cd a7 |..... | 00000675: 01 | . | Sector 6 status 00000676: cf cd | ..| Sector 6 uncompressed 00000678: d5 d0 c3 86 d6 4e 4f 20 |.....NO | 00000680: 53 50 41 43 45 00 cd 5e |SPACE..^| 00000688: d1 c2 09 d1 3a f0 d6 f5 |....:...| 00000690: cd 54 d3 cd e9 cf c2 79 |.T.....y| 00000698: d5 21 cd d6 11 dd d6 06 |.!......| 000006a0: 10 cd 42 d3 2a 88 cf eb |..B.*...| 000006a8: cd 4f d1 fe 3d ca 3f d5 |.O..=.?.| 000006b0: fe 5f c2 73 d5 eb 23 22 |._.s..#"| 000006b8: 88 cf cd 5e d1 c2 73 d5 |...^..s.| 000006c0: f1 47 21 f0 d6 7e b7 ca |.G!..~..| 000006c8: 59 d5 b8 70 c2 73 d5 70 |Y..p.s.p| 000006d0: af 32 cd d6 cd e9 cf ca |.2......| 000006d8: 6d d5 11 cd d6 cd 0e d0 |m.......| 000006e0: c3 86 d6 cd ea d2 c3 86 |........| 000006e8: d6 cd 66 d3 c3 09 d1 01 |..f.....| 000006f0: 82 d5 cd a7 cf c3 86 d6 |........| 000006f8: 46 49 4c 45 20 45 58 49 |FILE EXI| 00000700: 53 54 53 00 cd f8 d2 fe |STS.....| 00000708: 10 d2 09 d1 5f 3a ce d6 |...._:..| 00000710: fe 20 ca 09 d1 cd 15 d0 |. ......| 00000718: c3 89 d6 cd f5 d0 3a ce |......:.| 00000720: d6 fe 20 c2 c4 d5 3a f0 |.. ...:.| 00000728: d6 b7 ca 89 d6 3d 32 ef |.....=2.| 00000730: d6 cd 29 d0 cd bd cf c3 |..).....| 00000738: 89 d6 11 d6 d6 1a fe 20 |....... | 00000740: c2 09 d1 d5 cd 54 d3 d1 |.....T..| 00000748: 21 83 d6 cd 40 d3 cd d0 |!...@...| 00000750: cf ca 6b d6 21 00 01 e5 |..k.!...| 00000758: eb cd d8 d0 11 cd d6 cd |........| 00000760: f9 cf c2 01 d6 e1 11 80 |........| 00000768: 00 19 11 00 cf 7d 93 7c |.....}.|| 00000770: 9a d2 71 d6 c3 e1 |..q... | 00000776: 01 | . | Sector 7 status 00000777: d5 | .| Sector 7 uncompressed 00000778: e1 3d c2 71 d6 cd 66 d3 |.=.q..f.| 00000780: cd 5e d1 21 f0 d6 e5 7e |.^.!...~| 00000788: 32 cd d6 3e 10 cd 60 d1 |2..>..`.| 00000790: e1 7e 32 dd d6 af 32 ed |.~2...2.| 00000798: d6 11 5c 00 21 cd d6 06 |..\.!...| 000007a0: 21 cd 42 d3 21 08 cf 7e |!.B.!..~| 000007a8: b7 ca 3e d6 fe 20 ca 3e |..>.. .>| 000007b0: d6 23 c3 30 d6 06 00 11 |.#.0....| 000007b8: 81 00 7e 12 b7 ca 4f d6 |..~...O.| 000007c0: 04 23 13 c3 43 d6 78 32 |.#..C.x2| 000007c8: 80 00 cd 98 cf cd d5 d0 |........| 000007d0: cd 1a d0 cd 00 01 31 ab |......1.| 000007d8: d6 cd 29 d0 cd bd cf c3 |..).....| 000007e0: 82 d2 cd 66 d3 c3 09 d1 |...f....| 000007e8: 01 7a d6 cd a7 cf c3 86 |.z......| 000007f0: d6 42 41 44 20 4c 4f 41 |.BAD LOA| 000007f8: 44 00 43 4f 4d cd 66 d3 |D.COM.f.| 00000800: cd 5e d1 3a ce d6 d6 20 |.^.:... | 00000808: 21 f0 d6 b6 c2 09 d1 c3 |!.......| 00000810: 82 d2 00 00 00 00 00 00 |........| 00000818: 00 00 00 00 00 00 00 00 |........| 00000820: 00 00 00 00 24 24 24 20 |....$$$ | 00000828: 20 20 20 20 53 55 42 00 | SUB.| 00000830: 00 00 00 00 00 00 00 00 |........| 00000838: 00 00 00 00 00 00 00 00 |........| 00000840: 00 00 00 00 00 00 00 00 |........| 00000848: 00 00 00 00 00 00 00 00 |........| 00000850: 00 00 00 00 00 00 00 00 |........| 00000858: 00 00 00 00 00 00 00 00 |........| 00000860: 00 00 00 00 00 00 00 00 |........| 00000868: 00 00 00 00 00 00 00 00 |........| 00000870: 00 00 00 00 00 00 00 |....... | 00000877: 01 | .| Sector 8 status 00000878: 02 02 12 00 0a 2a c3 11 |.....*..| Sector 8 uncompressed 00000880: d7 99 d7 a5 d7 ab d7 b1 |........| 00000888: d7 eb 22 43 da eb 7b 32 |.."C..{2| 00000890: d6 e4 21 00 00 22 45 da |..!.."E.| 00000898: 39 22 0f da 31 41 da af |9"..1A..| 000008a0: 32 e0 e4 32 de e4 21 74 |2..2..!t| 000008a8: e4 e5 79 fe 29 d0 4b 21 |..y.).K!| 000008b0: 47 d7 5f 16 00 19 19 5e |G._....^| 000008b8: 23 56 2a 43 da eb e9 03 |#V*C....| 000008c0: e5 c8 d9 90 d8 ce d9 12 |........| 000008c8: e5 0f e5 d4 d9 ed d9 f3 |........| 000008d0: d9 f8 d9 e1 d8 fe d9 7e |.......~| 000008d8: e3 83 e3 45 e3 9c e3 a5 |...E....| 000008e0: e3 ab e3 c8 e3 d7 e3 e0 |........| 000008e8: e3 e6 e3 ec e3 f5 e3 fe |........| 000008f0: e3 04 e4 0a e4 11 e4 2c |.......,| 000008f8: dc 17 e4 1d e4 26 e4 2d |.....&.-| 00000900: e4 41 e4 47 e4 4d e4 0e |.A.G.M..| 00000908: e3 53 e4 04 da 04 da 9b |.S......| 00000910: e4 21 ca d7 cd e5 d7 fe |.!......| 00000918: 03 ca 00 00 c9 21 d5 d7 |.....!..| 00000920: c3 b4 d7 21 e1 d7 c3 b4 |...!....| 00000928: d7 21 dc d7 cd e5 d7 c3 |.!......| 00000930: 00 00 42 64 6f 73 20 45 |..Bdos E| 00000938: 72 72 20 4f 6e 20 20 3a |rr On :| 00000940: 20 24 42 61 64 20 53 65 | $Bad Se| 00000948: 63 74 6f 72 24 53 65 6c |ctor$Sel| 00000950: 65 63 74 24 46 69 6c 65 |ect$File| 00000958: 20 52 2f 4f 24 e5 cd c9 | R/O$...| 00000960: d8 3a 42 da c6 41 32 c6 |.:B..A2.| 00000968: d7 01 ba d7 cd d3 d8 c1 |........| 00000970: cd d3 d8 21 0e da 7e 36 |...!..~6| 00000978: 01 |. | Sector 9 status 00000979: 00 b7 c0 c3 09 e5 cd | .......| Sector 9 uncompressed 00000980: fb d7 cd 14 d8 d8 f5 4f |.......O| 00000988: cd 90 d8 f1 c9 fe 0d c8 |........| 00000990: fe 0a c8 fe 09 c8 fe 08 |........| 00000998: c8 fe 20 c9 3a 0e da b7 |.. .:...| 000009a0: c2 45 d8 cd 06 e5 e6 01 |.E......| 000009a8: c8 cd 09 e5 fe 13 c2 42 |.......B| 000009b0: d8 cd 09 e5 fe 03 ca 00 |........| 000009b8: 00 af c9 32 0e da 3e 01 |...2..>.| 000009c0: c9 3a 0a da b7 c2 62 d8 |.:....b.| 000009c8: c5 cd 23 d8 c1 c5 cd 0c |..#.....| 000009d0: e5 c1 c5 3a 0d da b7 c4 |...:....| 000009d8: 0f e5 c1 79 21 0c da fe |...y!...| 000009e0: 7f c8 34 fe 20 d0 35 7e |..4. .5~| 000009e8: b7 c8 79 fe 08 c2 79 d8 |..y...y.| 000009f0: 35 c9 fe 0a c0 36 00 c9 |5....6..| 000009f8: 79 cd 14 d8 d2 90 d8 f5 |y.......| 00000a00: 0e 5e cd 48 d8 f1 f6 40 |.^.H...@| 00000a08: 4f 79 fe 09 c2 48 d8 0e |Oy...H..| 00000a10: 20 cd 48 d8 3a 0c da e6 | .H.:...| 00000a18: 07 c2 96 d8 c9 cd ac d8 |........| 00000a20: 0e 20 cd 0c e5 0e 08 c3 |. ......| 00000a28: 0c e5 0e 23 cd 48 d8 cd |...#.H..| 00000a30: c9 d8 3a 0c da 21 0b da |..:..!..| 00000a38: be d0 0e 20 cd 48 d8 c3 |... .H..| 00000a40: b9 d8 0e 0d cd 48 d8 0e |.....H..| 00000a48: 0a c3 48 d8 0a fe 24 c8 |..H...$.| 00000a50: 03 c5 4f cd 90 d8 c1 c3 |..O.....| 00000a58: d3 d8 3a 0c da 32 0b da |..:..2..| 00000a60: 2a 43 da 4e 23 e5 06 00 |*C.N#...| 00000a68: c5 e5 cd fb d7 e6 7f e1 |........| 00000a70: c1 fe 0d ca c1 d9 fe 0a |........| 00000a78: ca |. | -------- Header for track 1 -------------------------------------------------- 00000a79: 02 | . | Recording mode 00000a7a: 01 | . | Cylinder = 1 00000a7b: 00 | . | Head = 0 00000a7c: 0a | . | Sectors = 10 00000a7d: 01 | . | Sector size = 256 00000a7e: 01 02 | ..| Sector IDs 00000a80: 03 04 05 06 07 08 09 0a |........| 00000a88: 01 |. | Sector 0 status 00000a89: c1 d9 fe 08 c2 16 d9 | .......| Sector 0 uncompressed 00000a90: 78 b7 ca ef d8 05 3a 0c |x.....:.| 00000a98: da 32 0a da c3 70 d9 fe |.2...p..| 00000aa0: 7f c2 26 d9 78 b7 ca ef |..&.x...| 00000aa8: d8 7e 05 2b c3 a9 d9 fe |.~.+....| 00000ab0: 05 c2 37 d9 c5 e5 cd c9 |..7.....| 00000ab8: d8 af 32 0b da c3 f1 d8 |..2.....| 00000ac0: fe 10 c2 48 d9 e5 21 0d |...H..!.| 00000ac8: da 3e 01 96 77 e1 c3 ef |.>..w...| 00000ad0: d8 fe 18 c2 5f d9 e1 3a |...._..:| 00000ad8: 0b da 21 0c da be d2 e1 |..!.....| 00000ae0: d8 35 cd a4 d8 c3 4e d9 |.5....N.| 00000ae8: fe 15 c2 6b d9 cd b1 d8 |...k....| 00000af0: e1 c3 e1 d8 fe 12 c2 a6 |........| 00000af8: d9 c5 cd b1 d8 c1 e1 e5 |........| 00000b00: c5 78 b7 ca 8a d9 23 4e |.x....#N| 00000b08: 05 c5 e5 cd 7f d8 e1 c1 |........| 00000b10: c3 78 d9 e5 3a 0a da b7 |.x..:...| 00000b18: ca f1 d8 21 0c da 96 32 |...!...2| 00000b20: 0a da cd a4 d8 21 0a da |.....!..| 00000b28: 35 c2 99 d9 c3 f1 d8 23 |5......#| 00000b30: 77 04 c5 e5 4f cd 7f d8 |w...O...| 00000b38: e1 c1 7e fe 03 78 c2 bd |..~..x..| 00000b40: d9 fe 01 ca 00 00 b9 da |........| 00000b48: ef d8 e1 70 0e 0d c3 48 |...p...H| 00000b50: d8 cd 06 d8 c3 01 da cd |........| 00000b58: 15 e5 c3 01 da 79 3c ca |.....y<.| 00000b60: e0 d9 3c ca 06 e5 c3 0c |..<.....| 00000b68: e5 cd 06 e5 b7 ca 91 e4 |........| 00000b70: cd 09 e5 c3 01 da 3a 03 |......:.| 00000b78: 00 c3 01 da 21 03 00 71 |....!..q| 00000b80: c9 eb 4d 44 c3 d3 d8 cd |..MD....| 00000b88: 23 |# | 00000b89: 01 | . | Sector 1 status 00000b8a: d8 32 45 da c9 3e | .2E..>| Sector 1 uncompressed $ dskparse DISK_EXP2.TD0 -------- Teledisk file header ------------------------------------------------ 00000000: 54 44 |TD | Magic number 00000002: 00 | . | Volume sequence 00000003: 3f | ? | Volume ID 00000004: 15 | . | Version 00000005: 80 | . | Data rate 00000006: 01 | . | Drive type 00000007: 80 | .| Double track (comment present) 00000008: 00 |. | DOS mode 00000009: 01 | . | Sides 0000000a: 00 21 | .! | Header CRC -------- Comment record ------------------------------------------------------ 0000000c: ce d1 | .. | Comment CRC 0000000e: 48 00 | H.| Comment length 00000010: 5b 06 1d |[.. | Date: 1991-07-29 00000013: 10 28 25 | .(% | Time: 16:40:37 00000016: 43 50 | CP| Comment 00000018: 2f 4d 20 32 2e 32 20 42 |/M 2.2 B| 00000020: 61 73 69 63 20 44 69 73 |asic Dis| 00000028: 6b 20 66 6f 72 20 4f 73 |k for Os| 00000030: 62 6f 72 6e 65 20 31 00 |borne 1.| 00000038: 53 53 53 44 20 32 35 36 |SSSD 256| 00000040: 20 62 79 74 65 20 73 65 | byte se| 00000048: 63 74 6f 72 2c 20 31 2d |ctor, 1-| 00000050: 31 30 2c 20 31 3a 31 00 |10, 1:1.| 00000058: 00 00 00 00 00 00 |...... | -------- Track header -------------------------------------------------------- 0000005e: 0a | . | Track header: SPT = 10 0000005f: 00 | .| Track header: Cylinder = 0 00000060: 80 |. | Track header: Head = 0 FM 00000061: 07 | . | Track header: CRC -------- Sector header: Cylinder 0 Head 0 Sector 0 ------------------------- 00000062: 00 | . | ID: Cylinder 00000063: 00 | . | ID: Head 00000064: 01 | . | ID: Sector 00000065: 01 | . | ID: Sector size 00000066: 00 | . | Syndrome 00000067: 9b | .| Header CRC 00000068: b5 00 |.. | Sector data length 0000006a: 02 | . | Sector data encoding 0000006b: 00 | . | RLE2: Type 0000006c: 08 | . | RLE2: Length 0000006d: c3 5c d2 | .\.| RLE2: Uncompressed data 00000070: c3 58 d2 7f 00 |.X... | 00000075: 01 | . | RLE2: Type 00000076: 08 | . | RLE2: Length 00000077: 20 | | RLE2: Compressed data 00000078: 20 | | 00000079: 00 | . | RLE2: Type 0000007a: 26 | & | RLE2: Length 0000007b: 43 4f 50 59 52 | COPYR| RLE2: Uncompressed data 00000080: 49 47 48 54 20 28 43 29 |IGHT (C)| 00000088: 20 31 39 37 39 2c 20 44 | 1979, D| 00000090: 49 47 49 54 41 4c 20 52 |IGITAL R| 00000098: 45 53 45 41 52 43 48 20 |ESEARCH | 000000a0: 20 | | 000000a1: 01 | . | RLE2: Type 000000a2: 25 | % | RLE2: Length 000000a3: 00 00 | .. | RLE2: Compressed data 000000a5: 00 | . | RLE2: Type 000000a6: 78 | x | RLE2: Length 000000a7: 08 | .| RLE2: Uncompressed data 000000a8: cf 00 00 5f 0e 02 c3 05 |..._....| 000000b0: 00 c5 cd 8c cf c1 c9 3e |.......>| 000000b8: 0d cd 92 cf 3e 0a c3 92 |....>...| 000000c0: cf 3e 20 c3 92 cf c5 cd |.> .....| 000000c8: 98 cf e1 7e b7 c8 23 e5 |...~..#.| 000000d0: cd 8c cf e1 c3 ac cf 0e |........| 000000d8: 0d c3 05 00 5f 0e 0e c3 |...._...| 000000e0: 05 00 cd 05 00 32 ee d6 |.....2..| 000000e8: 3c c9 0e 0f c3 c3 cf af |<.......| 000000f0: 32 ed d6 11 cd d6 c3 cb |2.......| 000000f8: cf 0e 10 c3 c3 cf 0e 11 |........| 00000100: c3 c3 cf 0e 12 c3 c3 cf |........| 00000108: 11 cd d6 c3 df cf 0e 13 |........| 00000110: c3 05 00 cd 05 00 b7 c9 |........| 00000118: 0e 14 c3 f4 cf 11 cd |....... | -------- Sector header: Cylinder 0 Head 0 Sector 1 ------------------------- 0000011f: 00 | .| ID: Cylinder 00000120: 00 |. | ID: Head 00000121: 02 | . | ID: Sector 00000122: 01 | . | ID: Sector size 00000123: 00 | . | Syndrome 00000124: 16 | . | Header CRC 00000125: 01 01 | .. | Sector data length 00000127: 00 | .| Sector data encoding 00000128: d6 c3 f9 cf 0e 15 c3 f4 |........| Uncompressed sector data 00000130: cf 0e 16 c3 c3 cf 0e 17 |........| 00000138: c3 05 00 1e ff 0e 20 c3 |...... .| 00000140: 05 00 cd 13 d0 87 87 87 |........| 00000148: 87 21 ef d6 b6 32 04 00 |.!...2..| 00000150: c9 3a ef d6 32 04 00 c9 |.:..2...| 00000158: fe 61 d8 fe 7b d0 e6 5f |.a..{.._| 00000160: c9 3a ab d6 b7 ca 96 d0 |.:......| 00000168: 3a ef d6 b7 3e 00 c4 bd |:...>...| 00000170: cf 11 ac d6 cd cb cf ca |........| 00000178: 96 d0 3a bb d6 3d 32 cc |..:..=2.| 00000180: d6 11 ac d6 cd f9 cf c2 |........| 00000188: 96 d0 11 07 cf 21 80 00 |.....!..| 00000190: 06 80 cd 42 d3 21 ba d6 |...B.!..| 00000198: 36 00 23 35 11 ac d6 cd |6.#5....| 000001a0: da cf ca 96 d0 3a ef d6 |.....:..| 000001a8: b7 c4 bd cf 21 08 cf cd |....!...| 000001b0: ac cf cd c2 d0 ca a7 d0 |........| 000001b8: cd dd d0 c3 82 d2 cd dd |........| 000001c0: d0 cd 1a d0 0e 0a 11 06 |........| 000001c8: cf cd 05 00 cd 29 d0 21 |.....).!| 000001d0: 07 cf 46 23 78 b7 ca ba |..F#x...| 000001d8: d0 7e cd 30 d0 77 05 c3 |.~.0.w..| 000001e0: ab d0 77 21 08 cf 22 88 |..w!..".| 000001e8: cf c9 0e 0b cd 05 00 b7 |........| 000001f0: c8 0e 01 cd 05 00 b7 c9 |........| 000001f8: 0e 19 c3 05 00 11 80 00 |........| 00000200: 0e 1a c3 05 00 21 ab d6 |.....!..| 00000208: 7e b7 c8 36 00 af cd bd |~..6....| 00000210: cf 11 ac d6 cd ef cf 3a |.......:| 00000218: ef d6 c3 bd cf 11 28 d2 |......(.| 00000220: 21 00 d7 06 06 1a be c2 |!.......| -------- Sector header: Cylinder 0 Head 0 Sector 2 ------------------------- 00000228: 00 |. | ID: Cylinder 00000229: 00 | . | ID: Head 0000022a: 03 | . | ID: Sector 0000022b: 01 | . | ID: Sector size 0000022c: 00 | . | Syndrome 0000022d: 2b | + | Header CRC 0000022e: 01 01 | ..| Sector data length 00000230: 00 |. | Sector data encoding 00000231: cf d2 13 23 05 c2 fd | ...#...| Uncompressed sector data 00000238: d0 c9 cd 98 cf 2a 8a cf |.....*..| 00000240: 7e fe 20 ca 22 d1 b7 ca |~. ."...| 00000248: 22 d1 e5 cd 8c cf e1 23 |"......#| 00000250: c3 0f d1 3e 3f cd 8c cf |...>?...| 00000258: cd 98 cf cd dd d0 c3 82 |........| 00000260: d2 1a b7 c8 fe 20 da 09 |..... ..| 00000268: d1 c8 fe 3d c8 fe 5f c8 |...=.._.| 00000270: fe 2e c8 fe 3a c8 fe 3b |....:..;| 00000278: c8 fe 3c c8 fe 3e c8 c9 |..<..>..| 00000280: 1a b7 c8 fe 20 c0 13 c3 |.... ...| 00000288: 4f d1 85 6f d0 24 c9 3e |O..o.$.>| 00000290: 00 21 cd d6 cd 59 d1 e5 |.!...Y..| 00000298: e5 af 32 f0 d6 2a 88 cf |..2..*..| 000002a0: eb cd 4f d1 eb 22 8a cf |..O.."..| 000002a8: eb e1 1a b7 ca 89 d1 de |........| 000002b0: 40 47 13 1a fe 3a ca 90 |@G...:..| 000002b8: d1 1b 3a ef d6 77 c3 96 |..:..w..| 000002c0: d1 78 32 f0 d6 70 13 06 |.x2..p..| 000002c8: 08 cd 30 d1 ca b9 d1 23 |..0....#| 000002d0: fe 2a c2 a9 d1 36 3f c3 |.*...6?.| 000002d8: ab d1 77 13 05 c2 98 d1 |..w.....| 000002e0: cd 30 d1 ca c0 d1 13 c3 |.0......| 000002e8: af d1 23 36 20 05 c2 b9 |..#6 ...| 000002f0: d1 06 03 fe 2e c2 e9 d1 |........| 000002f8: 13 cd 30 d1 ca e9 d1 23 |..0....#| 00000300: fe 2a c2 d9 d1 36 3f c3 |.*...6?.| 00000308: db d1 77 13 05 c2 c8 d1 |..w.....| 00000310: cd 30 d1 ca f0 d1 13 c3 |.0......| 00000318: df d1 23 36 20 05 c2 e9 |..#6 ...| 00000320: d1 06 03 23 36 00 05 c2 |...#6...| 00000328: f2 d1 eb 22 88 cf e1 01 |..."....| 00000330: 0b |. | -------- Sector header: Cylinder 0 Head 0 Sector 3 ------------------------- 00000331: 00 | . | ID: Cylinder 00000332: 00 | . | ID: Head 00000333: 04 | . | ID: Sector 00000334: 01 | . | ID: Sector size 00000335: 00 | . | Syndrome 00000336: 49 | I | Header CRC 00000337: 01 | .| Sector data length 00000338: 01 |. | 00000339: 00 | . | Sector data encoding 0000033a: 00 23 7e fe 3f c2 | .#~.?.| Uncompressed sector data 00000340: 09 d2 04 0d c2 01 d2 78 |.......x| 00000348: b7 c9 44 49 52 20 45 52 |..DIR ER| 00000350: 41 20 54 59 50 45 53 41 |A TYPESA| 00000358: 56 45 52 45 4e 20 55 53 |VEREN US| 00000360: 45 52 02 02 12 00 0a 2a |ER.....*| 00000368: 21 10 d2 0e 00 79 fe 06 |!....y..| 00000370: d0 11 ce d6 06 04 1a be |........| 00000378: c2 4f d2 13 23 05 c2 3c |.O..#..<| 00000380: d2 1a fe 20 c2 54 d2 79 |... .T.y| 00000388: c9 23 05 c2 4f d2 0c c3 |.#..O...| 00000390: 33 d2 af 32 07 cf 31 ab |3..2..1.| 00000398: d6 c5 79 1f 1f 1f 1f e6 |..y.....| 000003a0: 0f 5f cd 15 d0 cd b8 cf |._......| 000003a8: 32 ab d6 c1 79 e6 0f 32 |2...y..2| 000003b0: ef d6 cd bd cf 3a 07 cf |.....:..| 000003b8: b7 c2 98 d2 31 ab d6 cd |....1...| 000003c0: 98 cf cd d0 d0 c6 41 cd |......A.| 000003c8: 8c cf 3e 3e cd 8c cf cd |..>>....| 000003d0: 39 d0 11 80 00 cd d8 d0 |9.......| 000003d8: cd d0 d0 32 ef d6 cd 5e |...2...^| 000003e0: d1 c4 09 d1 3a f0 d6 b7 |....:...| 000003e8: c2 a5 d5 cd 2e d2 21 c1 |......!.| 000003f0: d2 5f 16 00 19 19 7e 23 |._....~#| 000003f8: 66 6f e9 77 d3 1f d4 5d |fo.w...]| 00000400: d4 ad d4 10 d5 8e d5 a5 |........| 00000408: d5 21 f3 76 22 00 cf 21 |.!.v"..!| 00000410: 00 cf e9 01 df d2 c3 a7 |........| 00000418: cf 52 45 41 44 20 45 52 |.READ ER| 00000420: 52 4f 52 00 01 f0 d2 c3 |ROR.....| 00000428: a7 cf 4e 4f 20 46 49 4c |..NO FIL| 00000430: 45 00 cd 5e d1 3a f0 d6 |E..^.:..| 00000438: b7 c2 |.. | -------- Sector header: Cylinder 0 Head 0 Sector 4 ------------------------- 0000043a: 00 | . | ID: Cylinder 0000043b: 00 | . | ID: Head 0000043c: 05 | . | ID: Sector 0000043d: 01 | . | ID: Sector size 0000043e: 00 | . | Syndrome 0000043f: 7f | .| Header CRC 00000440: 01 01 |.. | Sector data length 00000442: 00 | . | Sector data encoding 00000443: 09 d1 21 ce d6 | ..!..| Uncompressed sector data 00000448: 01 0b 00 7e fe 20 ca 33 |...~. .3| 00000450: d3 23 d6 30 fe 0a d2 09 |.#.0....| 00000458: d1 57 78 e6 e0 c2 09 d1 |.Wx.....| 00000460: 78 07 07 07 80 da 09 d1 |x.......| 00000468: 80 da 09 d1 82 da 09 d1 |........| 00000470: 47 0d c2 08 d3 c9 7e fe |G.....~.| 00000478: 20 c2 09 d1 23 0d c2 33 | ...#..3| 00000480: d3 78 c9 06 03 7e 12 23 |.x...~.#| 00000488: 13 05 c2 42 d3 c9 21 80 |...B..!.| 00000490: 00 81 cd 59 d1 7e c9 af |...Y.~..| 00000498: 32 cd d6 3a f0 d6 b7 c8 |2..:....| 000004a0: 3d 21 ef d6 be c8 c3 bd |=!......| 000004a8: cf 3a f0 d6 b7 c8 3d 21 |.:....=!| 000004b0: ef d6 be c8 3a ef d6 c3 |....:...| 000004b8: bd cf cd 5e d1 cd 54 d3 |...^..T.| 000004c0: 21 ce d6 7e fe 20 c2 8f |!..~. ..| 000004c8: d3 06 0b 36 3f 23 05 c2 |...6?#..| 000004d0: 88 d3 1e 00 d5 cd e9 cf |........| 000004d8: cc ea d2 ca 1b d4 3a ee |......:.| 000004e0: d6 0f 0f 0f e6 60 4f 3e |.....`O>| 000004e8: 0a cd 4b d3 17 da 0f d4 |..K.....| 000004f0: d1 7b 1c d5 e6 03 f5 c2 |.{......| 000004f8: cc d3 cd 98 cf c5 cd d0 |........| 00000500: d0 c1 c6 41 cd 92 cf 3e |...A...>| 00000508: 3a cd 92 cf c3 d4 d3 cd |:.......| 00000510: a2 cf 3e 3a cd 92 cf cd |..>:....| 00000518: a2 cf 06 01 78 cd 4b d3 |....x.K.| 00000520: e6 7f fe 20 c2 f9 d3 f1 |... ....| 00000528: f5 fe 03 c2 f7 d3 3e 09 |......>.| 00000530: cd 4b d3 e6 7f fe 20 ca |.K.... .| 00000538: 0e d4 3e 20 cd 92 cf 04 |..> ....| 00000540: 78 fe 0c |x.. | -------- Sector header: Cylinder 0 Head 0 Sector 5 ------------------------- 00000543: 00 | . | ID: Cylinder 00000544: 00 | . | ID: Head 00000545: 06 | . | ID: Sector 00000546: 01 | . | ID: Sector size 00000547: 00 | .| Syndrome 00000548: dc |. | Header CRC 00000549: 01 01 | .. | Sector data length 0000054b: 00 | . | Sector data encoding 0000054c: d2 0e d4 fe | ....| Uncompressed sector data 00000550: 09 c2 d9 d3 cd a2 cf c3 |........| 00000558: d9 d3 f1 cd c2 d0 c2 1b |........| 00000560: d4 cd e4 cf c3 98 d3 d1 |........| 00000568: c3 86 d6 cd 5e d1 fe 0b |....^...| 00000570: c2 42 d4 01 52 d4 cd a7 |.B..R...| 00000578: cf cd 39 d0 21 07 cf 35 |..9.!..5| 00000580: c2 82 d2 23 7e fe 59 c2 |...#~.Y.| 00000588: 82 d2 23 22 88 cf cd 54 |..#"...T| 00000590: d3 11 cd d6 cd ef cf 3c |.......<| 00000598: cc ea d2 c3 86 d6 41 4c |......AL| 000005a0: 4c 20 28 59 2f 4e 29 3f |L (Y/N)?| 000005a8: 00 cd 5e d1 c2 09 d1 cd |..^.....| 000005b0: 54 d3 cd d0 cf ca a7 d4 |T.......| 000005b8: cd 98 cf 21 f1 d6 36 ff |...!..6.| 000005c0: 21 f1 d6 7e fe 80 da 87 |!..~....| 000005c8: d4 e5 cd fe cf e1 c2 a0 |........| 000005d0: d4 af 77 34 21 80 00 cd |..w4!...| 000005d8: 59 d1 7e fe 1a ca 86 d6 |Y.~.....| 000005e0: cd 8c cf cd c2 d0 c2 86 |........| 000005e8: d6 c3 74 d4 3d ca 86 d6 |..t.=...| 000005f0: cd d9 d2 cd 66 d3 c3 09 |....f...| 000005f8: d1 cd f8 d2 f5 cd 5e d1 |......^.| 00000600: c2 09 d1 cd 54 d3 11 cd |....T...| 00000608: d6 d5 cd ef cf d1 cd 09 |........| 00000610: d0 ca fb d4 af 32 ed d6 |.....2..| 00000618: f1 6f 26 00 29 11 00 01 |.o&.)...| 00000620: 7c b5 ca f1 d4 2b e5 21 ||....+.!| 00000628: 80 00 19 e5 cd d8 d0 11 |........| 00000630: cd d6 cd 04 d0 d1 e1 c2 |........| 00000638: fb d4 c3 d4 d4 11 cd d6 |........| 00000640: cd da cf 3c c2 01 d5 01 |...<....| 00000648: 07 d5 cd a7 |.... | -------- Sector header: Cylinder 0 Head 0 Sector 6 ------------------------- 0000064c: 00 | . | ID: Cylinder 0000064d: 00 | . | ID: Head 0000064e: 07 | . | ID: Sector 0000064f: 01 | .| ID: Sector size 00000650: 00 |. | Syndrome 00000651: e9 | . | Header CRC 00000652: 01 01 | .. | Sector data length 00000654: 00 | . | Sector data encoding 00000655: cf cd d5 | ...| Uncompressed sector data 00000658: d0 c3 86 d6 4e 4f 20 53 |....NO S| 00000660: 50 41 43 45 00 cd 5e d1 |PACE..^.| 00000668: c2 09 d1 3a f0 d6 f5 cd |...:....| 00000670: 54 d3 cd e9 cf c2 79 d5 |T.....y.| 00000678: 21 cd d6 11 dd d6 06 10 |!.......| 00000680: cd 42 d3 2a 88 cf eb cd |.B.*....| 00000688: 4f d1 fe 3d ca 3f d5 fe |O..=.?..| 00000690: 5f c2 73 d5 eb 23 22 88 |_.s..#".| 00000698: cf cd 5e d1 c2 73 d5 f1 |..^..s..| 000006a0: 47 21 f0 d6 7e b7 ca 59 |G!..~..Y| 000006a8: d5 b8 70 c2 73 d5 70 af |..p.s.p.| 000006b0: 32 cd d6 cd e9 cf ca 6d |2......m| 000006b8: d5 11 cd d6 cd 0e d0 c3 |........| 000006c0: 86 d6 cd ea d2 c3 86 d6 |........| 000006c8: cd 66 d3 c3 09 d1 01 82 |.f......| 000006d0: d5 cd a7 cf c3 86 d6 46 |.......F| 000006d8: 49 4c 45 20 45 58 49 53 |ILE EXIS| 000006e0: 54 53 00 cd f8 d2 fe 10 |TS......| 000006e8: d2 09 d1 5f 3a ce d6 fe |..._:...| 000006f0: 20 ca 09 d1 cd 15 d0 c3 | .......| 000006f8: 89 d6 cd f5 d0 3a ce d6 |.....:..| 00000700: fe 20 c2 c4 d5 3a f0 d6 |. ...:..| 00000708: b7 ca 89 d6 3d 32 ef d6 |....=2..| 00000710: cd 29 d0 cd bd cf c3 89 |.)......| 00000718: d6 11 d6 d6 1a fe 20 c2 |...... .| 00000720: 09 d1 d5 cd 54 d3 d1 21 |....T..!| 00000728: 83 d6 cd 40 d3 cd d0 cf |...@....| 00000730: ca 6b d6 21 00 01 e5 eb |.k.!....| 00000738: cd d8 d0 11 cd d6 cd f9 |........| 00000740: cf c2 01 d6 e1 11 80 00 |........| 00000748: 19 11 00 cf 7d 93 7c 9a |....}.|.| 00000750: d2 71 d6 c3 e1 |.q... | -------- Sector header: Cylinder 0 Head 0 Sector 7 ------------------------- 00000755: 00 | . | ID: Cylinder 00000756: 00 | . | ID: Head 00000757: 08 | .| ID: Sector 00000758: 01 |. | ID: Sector size 00000759: 00 | . | Syndrome 0000075a: fd | . | Header CRC 0000075b: b3 00 | .. | Sector data length 0000075d: 02 | . | Sector data encoding 0000075e: 00 | . | RLE2: Type 0000075f: 9b | .| RLE2: Length 00000760: d5 e1 3d c2 71 d6 cd 66 |..=.q..f| RLE2: Uncompressed data 00000768: d3 cd 5e d1 21 f0 d6 e5 |..^.!...| 00000770: 7e 32 cd d6 3e 10 cd 60 |~2..>..`| 00000778: d1 e1 7e 32 dd d6 af 32 |..~2...2| 00000780: ed d6 11 5c 00 21 cd d6 |...\.!..| 00000788: 06 21 cd 42 d3 21 08 cf |.!.B.!..| 00000790: 7e b7 ca 3e d6 fe 20 ca |~..>.. .| 00000798: 3e d6 23 c3 30 d6 06 00 |>.#.0...| 000007a0: 11 81 00 7e 12 b7 ca 4f |...~...O| 000007a8: d6 04 23 13 c3 43 d6 78 |..#..C.x| 000007b0: 32 80 00 cd 98 cf cd d5 |2.......| 000007b8: d0 cd 1a d0 cd 00 01 31 |.......1| 000007c0: ab d6 cd 29 d0 cd bd cf |...)....| 000007c8: c3 82 d2 cd 66 d3 c3 09 |....f...| 000007d0: d1 01 7a d6 cd a7 cf c3 |..z.....| 000007d8: 86 d6 42 41 44 20 4c 4f |..BAD LO| 000007e0: 41 44 00 43 4f 4d cd 66 |AD.COM.f| 000007e8: d3 cd 5e d1 3a ce d6 d6 |..^.:...| 000007f0: 20 21 f0 d6 b6 c2 09 d1 | !......| 000007f8: c3 82 d2 |... | 000007fb: 01 | . | RLE2: Type 000007fc: 09 | . | RLE2: Length 000007fd: 00 00 | .. | RLE2: Compressed data 000007ff: 00 | .| RLE2: Type 00000800: 0b |. | RLE2: Length 00000801: 24 24 24 20 20 20 20 | $$$ | RLE2: Uncompressed data 00000808: 20 53 55 42 | SUB | 0000080c: 01 | . | RLE2: Type 0000080d: 24 | $ | RLE2: Length 0000080e: 00 00 | ..| RLE2: Compressed data -------- Sector header: Cylinder 0 Head 0 Sector 8 ------------------------- 00000810: 00 |. | ID: Cylinder 00000811: 00 | . | ID: Head 00000812: 09 | . | ID: Sector 00000813: 01 | . | ID: Sector size 00000814: 00 | . | Syndrome 00000815: 69 | i | Header CRC 00000816: 01 01 | ..| Sector data length 00000818: 00 |. | Sector data encoding 00000819: 02 02 12 00 0a 2a c3 | .....*.| Uncompressed sector data 00000820: 11 d7 99 d7 a5 d7 ab d7 |........| 00000828: b1 d7 eb 22 43 da eb 7b |..."C..{| 00000830: 32 d6 e4 21 00 00 22 45 |2..!.."E| 00000838: da 39 22 0f da 31 41 da |.9"..1A.| 00000840: af 32 e0 e4 32 de e4 21 |.2..2..!| 00000848: 74 e4 e5 79 fe 29 d0 4b |t..y.).K| 00000850: 21 47 d7 5f 16 00 19 19 |!G._....| 00000858: 5e 23 56 2a 43 da eb e9 |^#V*C...| 00000860: 03 e5 c8 d9 90 d8 ce d9 |........| 00000868: 12 e5 0f e5 d4 d9 ed d9 |........| 00000870: f3 d9 f8 d9 e1 d8 fe d9 |........| 00000878: 7e e3 83 e3 45 e3 9c e3 |~...E...| 00000880: a5 e3 ab e3 c8 e3 d7 e3 |........| 00000888: e0 e3 e6 e3 ec e3 f5 e3 |........| 00000890: fe e3 04 e4 0a e4 11 e4 |........| 00000898: 2c dc 17 e4 1d e4 26 e4 |,.....&.| 000008a0: 2d e4 41 e4 47 e4 4d e4 |-.A.G.M.| 000008a8: 0e e3 53 e4 04 da 04 da |..S.....| 000008b0: 9b e4 21 ca d7 cd e5 d7 |..!.....| 000008b8: fe 03 ca 00 00 c9 21 d5 |......!.| 000008c0: d7 c3 b4 d7 21 e1 d7 c3 |....!...| 000008c8: b4 d7 21 dc d7 cd e5 d7 |..!.....| 000008d0: c3 00 00 42 64 6f 73 20 |...Bdos | 000008d8: 45 72 72 20 4f 6e 20 20 |Err On | 000008e0: 3a 20 24 42 61 64 20 53 |: $Bad S| 000008e8: 65 63 74 6f 72 24 53 65 |ector$Se| 000008f0: 6c 65 63 74 24 46 69 6c |lect$Fil| 000008f8: 65 20 52 2f 4f 24 e5 cd |e R/O$..| 00000900: c9 d8 3a 42 da c6 41 32 |..:B..A2| 00000908: c6 d7 01 ba d7 cd d3 d8 |........| 00000910: c1 cd d3 d8 21 0e da 7e |....!..~| 00000918: 36 |6 | -------- Sector header: Cylinder 0 Head 0 Sector 9 ------------------------- 00000919: 00 | . | ID: Cylinder 0000091a: 00 | . | ID: Head 0000091b: 0a | . | ID: Sector 0000091c: 01 | . | ID: Sector size 0000091d: 00 | . | Syndrome 0000091e: 54 | T | Header CRC 0000091f: 01 | .| Sector data length 00000920: 01 |. | 00000921: 00 | . | Sector data encoding 00000922: 00 b7 c0 c3 09 e5 | ......| Uncompressed sector data 00000928: cd fb d7 cd 14 d8 d8 f5 |........| 00000930: 4f cd 90 d8 f1 c9 fe 0d |O.......| 00000938: c8 fe 0a c8 fe 09 c8 fe |........| 00000940: 08 c8 fe 20 c9 3a 0e da |... .:..| 00000948: b7 c2 45 d8 cd 06 e5 e6 |..E.....| 00000950: 01 c8 cd 09 e5 fe 13 c2 |........| 00000958: 42 d8 cd 09 e5 fe 03 ca |B.......| 00000960: 00 00 af c9 32 0e da 3e |....2..>| 00000968: 01 c9 3a 0a da b7 c2 62 |..:....b| 00000970: d8 c5 cd 23 d8 c1 c5 cd |...#....| 00000978: 0c e5 c1 c5 3a 0d da b7 |....:...| 00000980: c4 0f e5 c1 79 21 0c da |....y!..| 00000988: fe 7f c8 34 fe 20 d0 35 |...4. .5| 00000990: 7e b7 c8 79 fe 08 c2 79 |~..y...y| 00000998: d8 35 c9 fe 0a c0 36 00 |.5....6.| 000009a0: c9 79 cd 14 d8 d2 90 d8 |.y......| 000009a8: f5 0e 5e cd 48 d8 f1 f6 |..^.H...| 000009b0: 40 4f 79 fe 09 c2 48 d8 |@Oy...H.| 000009b8: 0e 20 cd 48 d8 3a 0c da |. .H.:..| 000009c0: e6 07 c2 96 d8 c9 cd ac |........| 000009c8: d8 0e 20 cd 0c e5 0e 08 |.. .....| 000009d0: c3 0c e5 0e 23 cd 48 d8 |....#.H.| 000009d8: cd c9 d8 3a 0c da 21 0b |...:..!.| 000009e0: da be d0 0e 20 cd 48 d8 |.... .H.| 000009e8: c3 b9 d8 0e 0d cd 48 d8 |......H.| 000009f0: 0e 0a c3 48 d8 0a fe 24 |...H...$| 000009f8: c8 03 c5 4f cd 90 d8 c1 |...O....| 00000a00: c3 d3 d8 3a 0c da 32 0b |...:..2.| 00000a08: da 2a 43 da 4e 23 e5 06 |.*C.N#..| 00000a10: 00 c5 e5 cd fb d7 e6 7f |........| 00000a18: e1 c1 fe 0d ca c1 d9 fe |........| 00000a20: 0a ca |.. | -------- Track header -------------------------------------------------------- 00000a22: 0a | . | Track header: SPT = 10 00000a23: 01 | . | Track header: Cylinder = 1 00000a24: 80 | . | Track header: Head = 0 FM 00000a25: 8e | . | Track header: CRC -------- Sector header: Cylinder 1 Head 0 Sector 0 ------------------------- 00000a26: 01 | . | ID: Cylinder 00000a27: 00 | .| ID: Head 00000a28: 01 |. | ID: Sector 00000a29: 01 | . | ID: Sector size 00000a2a: 00 | . | Syndrome 00000a2b: b5 | . | Header CRC 00000a2c: 01 01 | .. | Sector data length 00000a2e: 00 | . | Sector data encoding 00000a2f: c1 | .| Uncompressed sector data 00000a30: d9 fe 08 c2 16 d9 78 b7 |......x.| 00000a38: ca ef d8 05 3a 0c da 32 |....:..2| 00000a40: 0a da c3 70 d9 fe 7f c2 |...p....| 00000a48: 26 d9 78 b7 ca ef d8 7e |&.x....~| 00000a50: 05 2b c3 a9 d9 fe 05 c2 |.+......| 00000a58: 37 d9 c5 e5 cd c9 d8 af |7.......| 00000a60: 32 0b da c3 f1 d8 fe 10 |2.......| 00000a68: c2 48 d9 e5 21 0d da 3e |.H..!..>| 00000a70: 01 96 77 e1 c3 ef d8 fe |..w.....| 00000a78: 18 c2 5f d9 e1 3a 0b da |.._..:..| 00000a80: 21 0c da be d2 e1 d8 35 |!......5| 00000a88: cd a4 d8 c3 4e d9 fe 15 |....N...| 00000a90: c2 6b d9 cd b1 d8 e1 c3 |.k......| 00000a98: e1 d8 fe 12 c2 a6 d9 c5 |........| 00000aa0: cd b1 d8 c1 e1 e5 c5 78 |.......x| 00000aa8: b7 ca 8a d9 23 4e 05 c5 |....#N..| 00000ab0: e5 cd 7f d8 e1 c1 c3 78 |.......x| 00000ab8: d9 e5 3a 0a da b7 ca f1 |..:.....| 00000ac0: d8 21 0c da 96 32 0a da |.!...2..| 00000ac8: cd a4 d8 21 0a da 35 c2 |...!..5.| 00000ad0: 99 d9 c3 f1 d8 23 77 04 |.....#w.| 00000ad8: c5 e5 4f cd 7f d8 e1 c1 |..O.....| 00000ae0: 7e fe 03 78 c2 bd d9 fe |~..x....| 00000ae8: 01 ca 00 00 b9 da ef d8 |........| 00000af0: e1 70 0e 0d c3 48 d8 cd |.p...H..| 00000af8: 06 d8 c3 01 da cd 15 e5 |........| 00000b00: c3 01 da 79 3c ca e0 d9 |...y<...| 00000b08: 3c ca 06 e5 c3 0c e5 cd |<.......| 00000b10: 06 e5 b7 ca 91 e4 cd 09 |........| 00000b18: e5 c3 01 da 3a 03 00 c3 |....:...| 00000b20: 01 da 21 03 00 71 c9 eb |..!..q..| 00000b28: 4d 44 c3 d3 d8 cd 23 |MD....# | -------- Sector header: Cylinder 1 Head 0 Sector 1 ------------------------- 00000b2f: 01 | .| ID: Cylinder 00000b30: 00 |. | ID: Head 00000b31: 02 | . | ID: Sector 00000b32: 01 | . | ID: Sector size 00000b33: 00 | . | Syndrome 00000b34: b5 | . | Header CRC 00000b35: cd 00 | .. | Sector data length 00000b37: 02 | .| Sector data encoding 00000b38: 00 |. | RLE2: Type 00000b39: 0a | . | RLE2: Length 00000b3a: d8 32 45 da c9 3e | .2E..>| RLE2: Uncompressed data 00000b40: 01 c3 01 da |.... | 00000b44: 01 | . | RLE2: Type 00000b45: 1e | . | RLE2: Length 00000b46: 00 00 | ..| RLE2: Compressed data 00000b48: 00 |. | RLE2: Type 00000b49: ba | . | RLE2: Length 00000b4a: 00 21 0b d7 5e 23 | .!..^#| RLE2: Uncompressed data 00000b50: 56 eb e9 0c 0d c8 1a 77 |V......w|
dskscan -- інформація про сектори у образі.
Фрагмент виводу:dskscan DISK_EXP2.IMD Comment: [1991-07-29T16:40:37] CP/M 2.2 Basic Disk for Osborne 1 Cylinder 0 Head 0: Data rate: 250 Encoding: fm Cyl 00 Head 0 Sec 1 size 256 Cyl 00 Head 0 Sec 2 size 256 Cyl 00 Head 0 Sec 3 size 256 Cyl 00 Head 0 Sec 4 size 256 Cyl 00 Head 0 Sec 5 size 256 Cyl 00 Head 0 Sec 6 size 256 Cyl 00 Head 0 Sec 7 size 256 Cyl 00 Head 0 Sec 8 size 256 Cyl 00 Head 0 Sec 9 size 256 Cyl 00 Head 0 Sec 10 size 256 Cylinder 0 Head 1: Found nothing Cylinder 1 Head 0: Data rate: 250 Encoding: fm Cyl 01 Head 0 Sec 1 size 256 Cyl 01 Head 0 Sec 2 size 256 Cyl 01 Head 0 Sec 3 size 256 Cyl 01 Head 0 Sec 4 size 256 Cyl 01 Head 0 Sec 5 size 256 Cyl 01 Head 0 Sec 6 size 256 Cyl 01 Head 0 Sec 7 size 256 Cyl 01 Head 0 Sec 8 size 256 Cyl 01 Head 0 Sec 9 size 256 Cyl 01 Head 0 Sec 10 size 256 Cylinder 1 Head 1: Found nothing Cylinder 2 Head 0: Data rate: 250 Encoding: fm Cyl 02 Head 0 Sec 1 size 256 Cyl 02 Head 0 Sec 2 size 256
dsktrans -- перетворення між типами образів, певне -- найважливіша утиліта пакету для мене.
$ # У всіх прикладах нижче тип вхідного образу визначається # автоматично, але, за потреби, можна й вказати, за допомогою -itype $ dsktrans -otype imd DISK_EXP2.TD0 DISK_EXP3.IMD Input driver: TeleDisk file driver Output driver:IMD file driver $ dsktrans -otype tele DISK_EXP2.IMD DISK_EXP3.TD0 Input driver: IMD file driver Output driver:TeleDisk file driver $ # ``Плоский образ'' -- лише послідовність байт $ dsktrans -otype raw DISK_EXP2.IMD DISK_EXP3.IMG Input driver: IMD file driver Output driver:Raw file driver (alternate sides)
На жаль, створити IMD-образ, сумісний з Osborne Executive, як далі описано на прикладі Imagedisk, мені поки не вдалося – так:
dsktrans -otype imd -format osbexec1
не спрацювало.
Підтримувані контейнери та формати (із врахуванням вмісту libdskrc)
Всі утиліти libdsk вміють виводити цю інформацію.$ dskid -types Disk image types supported: ntwdm : NT WDM floppy driver floppy : Win32 floppy driver gotek : Gotek 1440k disc image collection gotek72 : Gotek 720k disc image collection remote : Remote LibDsk instance rcpmfs : Reverse CP/MFS driver dsk : CPCEMU .DSK driver edsk : Extended .DSK driver apridisk : APRIDISK file driver copyqm : CopyQM file driver tele : TeleDisk file driver ldbs : LibDsk block store ldbst : LDBS (text form) sap : SAP file driver qrst : Quick Release Sector Transfer imd : IMD file driver ydsk : YAZE YDSK driver raw : Raw file driver (alternate sides) rawoo : Raw file driver (out and out) rawob : Raw file driver (out and back) myz80 : MYZ80 hard drive driver simh : SIMH disc image driver nanowasp : NanoWasp image file driver logical : Raw file logical sector order jv3 : JV3 file driver dc42 : Disk Copy 4.2 cfi : CFI file driver $ dskid -formats Disk formats supported: pcw180 : PCW / IBM 180k cpcsys : CPC System cpcdata : CPC Data pcw720 : PCW / IBM 720k pcw1440 : PcW16 / IBM 1440k ibm160 : IBM 160k (CP/M-86 / DOSPLUS) ibm320 : IBM 320k (CP/M-86 / DOSPLUS) ibm360 : IBM 360k (CP/M-86 / DOSPLUS) ibm720 : IBM 720k (144FEAT) ibm1200 : IBM 1.2M (144FEAT) ibm1440 : IBM 1.4M (144FEAT) acorn160 : Acorn 160k acorn320 : Acorn 320k acorn640 : Acorn 640k acorn800 : Acorn 800k acorn1600 : Acorn 1600k pcw800 : PCW 800k pcw200 : PCW 200k bbc100 : BBC 100k bbc200 : BBC 200k mbee400 : Microbee 400k mgt800 : MGT 800k trdos640 : TR-DOS 640k ampro200 : Ampro 40 track single-sided ampro400d : Ampro 40 track double-sided ampro400s : Ampro 80 track single-sided ampro800 : Ampro 80 track double-sided pcw1200 : PcW16 / IBM 1200k mac400 : Macintosh GCR 400k mac800 : Macintosh GCR 800k myz80 : MYZ80 8Mb pcpm320 : IBM 320k (CP/M-86 / DOSPLUS) osbexec3 : OSBA Osborne Executive Dig. Arts - DSDD 48 tpi 5.25" - 1024 x 5 osbexec2 : OSB9 Osborne Executive w/Z3 - DSDD 96 tpi 5.25" - 1024 x 5 osbexec1 : OSB3 Osborne Executive - SSDD 48 tpi 5.25" - 1024 x 5 osb1nv2 : OSBB Osborne Nuevo 2.1 - DSDD 96 tpi 5.25" - 1024 x 5 osbVix : OSB8 Osborne Vixen - DSDD 48 tpi 5.25" - 1024 x 5 osb1nv : OSB7 Osborne Nuevo - DSDD 48 tpi 5.25" - 1024 x 5 osb1osm : OSB6 Osborne 1 + Osmosis - DSDD 96 tpi 5.25" - 512 x 10 osb1g2h : OSB5 Osborne G2 System - DSDD 96 tpi 5.25" - 1024 x 5 osb1g2 : OSB4 Osborne G2 System - DSDD 48 tpi 5.25" - 1024 x 5 osb1ssdd : OSB2 Osborne 1 - SSDD 48 tpi 5.25" - 1024 x 5 osb1sssd : OSB1 Osborne 1 - SSSD 48 tpi 5.25" - 256 x 10
Інші:
- dsklabel – встановити чи побачити мітку диску. На жаль, в мене для CP/M образів не працює. Не вникав.
- dskutil – інтерактивний редактор секторів.
- Багато інших інструментів та можливостей, аж по COM-сервер.
Додаток – манівцями
Лінь спробувати скомпілювати libdsk, а потім cpmtools із нею, завела мене трохи в манівці – опишу тут свій досвід, може ще знадобиться. Але так працювати з образами видається неоптимальним.
Див. також цікаву статтю від людини, що вирішувала схожу задачу: Osborne Restoration part 16: transferring CPM software
ImageDisk
Цей пакет є лише для DOS, але, оскільки джерельні тексти доступні, перша думка була – перекомпілювати, хоча б частково – деякі утиліти, які не потребують доступу до фізичних дисків, під Win64. Ідея провалилася – для написання автор створив свій компілятор С-подібної мови – об’єм роботи нераціонально великий.
Користуючись DOSBox-X8, цими утилітами можна вирішувати наступні задачі:
TD02IMD
Утиліта для перетворення образів td0 в imd.
IMDU: ImageDisk Utility
Перетворити з IMD в ‘‘плоский’’ образ
IMDU /B DISK.IMD DISK.IMG
'’reInterLeave’’:
IMDU TMP.IMD DISK1.IMD IL=3
Вивести подробиці про всі сектори та доріжки:
IMDU /B DISK.IMD DISK.IMG
IMageDisk Utility 1.18 / Mar 07 2012 IMD 1.18: 21/12/2019 20:08:22 Osborne Executive System disk 1 of 3 0/0 300 kbps DD 5x1024 1 2 3 4 5 D D D D D 1/0 D D D D D 2/0 D D D D D 3/0 D DE5 D D D 4/0 D D D D D 5/0 D D D D D 6/0 D D D D D 7/0 D D D D D 8/0 D D D D D 9/0 D D D D D 10/0 D D D D D 11/0 D D D D D 12/0 D D D D D 13/0 D D D D D 14/0 D D D D D 15/0 D D D D D 16/0 D D D D D 17/0 D D D D D 18/0 D D D D D 19/0 D D D D D 20/0 D D D D D 21/0 D D00 D00 D00 D00 22/0 D00 D D D D 23/0 D D D D D 24/0 D D D D D 25/0 D D D D D 26/0 D D D D D 27/0 DE5 DE5 DE5 DE5 DE5 28/0 DE5 DE5 DE5 DE5 DE5 29/0 DE5 DE5 DE5 DE5 DE5 30/0 DE5 DE5 DE5 DE5 DE5 31/0 DE5 DE5 DE5 DE5 DE5 32/0 DE5 DE5 DE5 DE5 DE5 33/0 DE5 DE5 DE5 DE5 DE5 34/0 DE5 DE5 DE5 DE5 DE5 35/0 DE5 DE5 DE5 DE5 DE5 36/0 DE5 DE5 DE5 DE5 DE5 37/0 DE5 DE5 DE5 DE5 DE5 38/0 DE5 DE5 DE5 DE5 DE5 39/0 DE5 DE5 D DE5 DE5 40 tracks(40/0), 200 sectors (70 Compressed)
Можна також додати (опція AC=file), замінити (RC=file) або видобути (EC=file) коментар з файлу образу.
BIN2IMD: Binary to ImageDisk .IMD utility
Найбільш складна у використанні утиліта. Дозволяє створити образ диску із заданою геометрією.
Характеристики основного формату дисків Osborne Executive:
- Розмір сектора: 1Кб = 1024 байти.
- Сторона – одна (одна магнітна голівка).
- Треків: 40.
- Секторів на треку: 5,
- 250 kbps MFM.
Тоді мінімальним способом отримати правильний образ із сирого (побайтового):
bin2img DISK01.IMG DISK01T.IMD /1 N=40 SS=1024 DM=5 SM=1-5 /V2
Використані опції:
- /1 – односторонній образ,
- N=40 – кількість треків (циліндрів),
- SS=1024 – розмір секторів,
- DM=5 – Data Mode, 250 kbps MFM,
- SM=1-5 – карта секторів, пронумерувати сектори 1, 2, 3, 4, 5,
- /V2 – рівень багатослівності виводу (verbose).
Для зміни interleave – скористайтеся IMDU.
За іншими цінними утилітами – див. документацію.
Перший успішний workflow
Першим успішним способом змінювати образи сумісним із Osborne Executive був наступний:
- Образ IMD конвертуємо в IMG за допомогою
IMDU /B
, під DOS. - За допомогою cpmtools9: cpmls, cpmrm, cpmcp, змінюється IMG-образ, під Windows.
- Створюємо оновлений IMD образ, з допомогою
bin2img
, під DOS.
Виноски
-
Писав трішки про початок цієї епохи: MS/PC DOS 1.0, MS/PC DOS 1.XX в емуляторах, MS/PC DOS 1.XX “Ось ти який, північний олень!”, DOS FCB. ↩
-
Заради лаконічності, і щоб не втонути у настільки широкій темі, свідомо дуже спрощую. В сучасному світі за подробицями можна заглянути сюди, сюди або сюди, чи, хоча б, на Wiki та глави ‘‘Sector-level organization’’ і ‘‘Floppy disk representation’’ інструкції MAME. На щастя, з Осборном так низько (по рівнях абстракції) опускатися не довелося ↩
-
Цитуючи вікі: ‘‘A blank 40‑track disk formatted and written on an 80‑track drive can be taken to its native drive without problems, and a disk formatted on a 40‑track drive can be used on an 80‑track drive. Disks written on a 40‑track drive and then updated on an 80 track drive become unreadable on any 40‑track drives due to track width incompatibility.’’ ↩
-
На той момент така підтримка образів різних систем, хай і власних предків, була незвичною. ↩
-
Крім того, утиліта TD02IMD з цього пакету дозволяє перетворювати образи з формату teledisk, тому такий вибір ні в чому не обмежив. ↩
-
Вибачте за якість фото, але мій вибір був між такими і взагалі відсутніми. ↩
-
Floptool не вміє писати в інші формати, як і сам MAME, HxCFloppyImageConverter, 2 не допоміг, disk-analyse теж. Спроба за допомогою floptool записати в M20 – в надії, що з них можна буде добути далі, провалилися, оскільки floptool паде з Segmentation fault. ↩
-
Думаю, підійде будь-який варіант DOSBox чи іншого емулятора DOS-систем, DOSBox-X лише найзручніший для мене. ↩
-
З якихось причин, наперед скопільовані пакети cpmtools під Windosw в Інеті мені траплялися виключно без libdsk – а значить, без можливості роботи з .IMD безпосередньо. ↩