Образы CP/M дискет KDI

## Формат KDI

KDI - Korvet Disk Image (дефакто это 5\*1024\*80\*2)
его описание находится в 0м секторе (всякие там смещения)
и там же есть CRC, его легко задетектить.

```
        Содержимое   первых  32  байт  информационного  сектора
приведено на рис.  5.5.1.   Первые  6  байт  -  информация  для
загрузчика.   Если  они  равны  нулю,  значит  диск не содержит
информацию для загрузки, т.е.  диск не системный.  Байты 7...16
содержат   информацию   о   физическом  устройстве  диска.   Их
назначение  понятно  из  рис.5.5.1.    Байты  17...31  содержат
информацию  о  логическом  устройстве диска.  Хотя некоторые из
приведенных логических параметров могли бы быть вычислены,  для
простоты  весь  блок логических параметров приведен в том виде,
каком CP/M требует таблицу дисковых параметров.  Подробнее  эта
таблица  будет расписана ниже.
        Байт 32  содержит  контрольную сумму  со  смещением 66H
(т.е. КС[1-31] + 66H = [содержимое байта 32].
        В  заключение  этого  пункта  отметим,  что  существует
стандартный формат  диска в CP/M.  Параметры стандартного диска
следующие:  8",  одинарная плотность, одна сторона, 77 дорожек,
26  128-ми байтовых секторов на дорожке, две системных дорожки,
64  входа в директорию,  фактор смещения - 6.   Этот  стандарт
распространяется  только на диски 8".  Для дисков 5.25" такого
стандарта  нет.

Номер байта: обозначение ; комментарий

;физические параметры диска

 1:    DW LoadAdress ; адрес, с которого начинается загрузка
 3:    DW RunAdress  ; адрес,куда передается управление после
                     ; загрузки
 5:    DW Count      ; число загружаемых физических секторов
 7:    DB SizeDisk   ; если значение байта 1 -8" диск, если 0
                     ; - 5.25"
 8:    DB Density    ; способ записи: 0 - FM; 1 - MFM
 9:    DB TpI        ; число дорожек  на дюйм: 0 - 48 TpI
                     ; 1 - 96 TpI, 2 - 135 TpI
10:    DB SkewFactor ; если значение байта 1 - фактора смещения
                     ; нет. Если <> 1 - байты 33-128
                     ; информационного сектора содержат таблицу
                     ; перевода секторов, причем значение байта
                     ; равно размеру таблицы.
11:    DB SecSize    ; размер физического сектора:0 - 128 байт,
                     ; 1 - 256 байт, 2 - 512 байт и  3 - 1024
12:    DB InSide     ; информация о сторонах диска: 0 -
                     ; односторонний диск, 1 - двухсторонний,
                     ; причем сектора нумеруются от 1 до n
                     ; с каждой стороны, четные логические
                     ; дорожки с нулевой стороны, нечетные с
                     ; первой.
13:    DW SecPerTrack; число физических секторов на дорожке
15:    DW TrkPerDisk ; число дорожек на диске (с одной стороны)

;логические параметры диска

17:    DW SPT        ; число логических секторов на дорожке
19:    DB BSH        ; фактор сдвига блока распределения данных
20:    DB BLM        ; маска блока распределения данных
21:    DB EXM        ; маска размера
22:    DW DSM        ; объем памяти на диске в блоках минус 1
24:    DW DRM        ; число входов в директорию диска минус 1
26:    DB AL0        ; определяет, какие блоки зарезервированы
27:    DB AL1        ; под директорию
28:    DW CKS        ; размер вектора контроля директории
30:    DW OFS        ; число системных дорожек на диске
32:    DB CheckSum   ;контрольная сумма служебной информации
                                                     CS[1-31]+66H
                           РИС. 5.5.1.

```

## CP/M

Раздел может быть до сотни мегабайт в реализации на Орионе (а максимальное теоретическое ограничение CP/M на файловую систему - 65356\*16384=1073741824 байт, т.е. 1Гбайт).

### CP/M 2.2 disc formats

http://www.classiccmp.org/cpmarchives/cpm/mirrors/www.seasip.info/Cpm/format22.html

CP/M 2.2 works with a much larger range of discs than CP/M 1.4. The disc statistics are stored in a parameter block (the DPB), which contains the following information:

```
	DEFW	spt	;Number of 128-byte records per track
	DEFB	bsh	;Block shift. 3 => 1k, 4 => 2k, 5 => 4k....
	DEFB	blm	;Block mask. 7 => 1k, 0Fh => 2k, 1Fh => 4k...
	DEFB	exm	;Extent mask, see later
	DEFW	dsm	;(no. of blocks on the disc)-1
	DEFW	drm	;(no. of directory entries)-1
	DEFB	al0	;Directory allocation bitmap, first byte
	DEFB	al1	;Directory allocation bitmap, second byte
	DEFW	cks	;Checksum vector size, 0 for a fixed disc
			;No. directory entries/4, rounded up.
	DEFW	off	;Offset, number of reserved tracks

```

The directory allocation bitmap is interpreted as:

```
       al0              al1
b7b6b5b4b3b2b1b0 b7b6b5b4b3b2b1b0
 1 1 1 1 0 0 0 0  0 0 0 0 0 0 0 0

```

```
- ie, in this example, the first 4 blocks of the disc contain the directory.

```

The DPB is not stored on disc. It is either hardwired into the BIOS or generated on the fly when a disc is logged in.
The reserved tracks will contain an image of CP/M 2.2, used when the system is rebooted. Discs can be formatted as data only discs, in which case they have no system tracks and cannot be used to reboot the system.

### CP/M 2.2 directory

The CP/M 2.2 directory has only one type of entry:

```
UU F1 F2 F3 F4 F5 F6 F7 F8 T1 T2 T3 EX S1 S2 RC   .FILENAMETYP....
AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL   ................

UU = User number. 0-15 (on some systems, 0-31). The user number allows multiple
    files of the same name to coexist on the disc.
     User number = 0E5h => File deleted
Fn - filename
Tn - filetype. The characters used for these are 7-bit ASCII.
       The top bit of T1 (often referred to as T1') is set if the file is
     read-only.
       T2' is set if the file is a system file (this corresponds to "hidden" on
     other systems).
EX = Extent counter, low byte - takes values from 0-31
S2 = Extent counter, high byte.

      An extent is the portion of a file controlled by one directory entry.
    If a file takes up more blocks than can be listed in one directory entry,
    it is given multiple entries, distinguished by their EX and S2 bytes. The
    formula is: Entry number = ((32*S2)+EX) / (exm+1) where exm is the
    extent mask value from the Disc Parameter Block.

S1 - reserved, set to 0.
RC - Number of records (1 record=128 bytes) used in this extent, low byte.
    The total number of records used in this extent is

    (EX & exm) * 128 + RC

    If RC is 80h, this extent is full and there may be another one on the disc.
    File lengths are only saved to the nearest 128 bytes.

AL - Allocation. Each AL is the number of a block on the disc. If an AL
    number is zero, that section of the file has no storage allocated to it
    (ie it does not exist). For example, a 3k file might have allocation
    5,6,8,0,0.... - the first 1k is in block 5, the second in block 6, the
    third in block 8.
     AL numbers can either be 8-bit (if there are fewer than 256 blocks on the
    disc) or 16-bit (stored low byte first).

```

### Date stamps

Some compatible 3rd-party BDOSes (such as Z80DOS and DOS+) implement date stamping. Unfortunately the date stamp format they use is different from that used by CP/M 3.

Every fourth entry of a date-stamped directory will contain stamps for the preceding three entries:

```
21 00 C1 C1 M1 M1 M1 M1 A1 A1 A1 A1 C2 C2 M2 M2    !...............
M2 M2 A2 A2 A2 A2 C3 C3 M3 M3 M3 M3 A3 A3 A3 A3    ................

C1 = File 1 Create date
M1 = File 1 Modify date/time
A1 = File 1 Access date/time
C2 = File 2 Create date
M2 = File 2 Modify date/time
A2 = File 2 Access date/time
C3 = File 3 Create date
M3 = File 3 Modify date/time
A3 = File 3 Access date/time

```

The format of a date/time entry is:

```
        DW      day     ;Julian day number, stored low byte first.
                        ;Day 1 = 1 Jan 1978.
        DB      hour    ;BCD hour, eg 13h => 13:xx
        DB      min     ;BCD minute

```

## KDI Checksum Reader v1.4

* http://zx-pk.ru/threads/11294-prosmotr-obrazov-cp-m-diskov.html?p=829154&viewfull=1#post829154

```
kdichkreader [filename] [--lang <lang>/-l <lang>] [-log/-l]
Options:
 -log		Save log to file;
 -l
 --lang <lang>	Change interface language (--lang en --> set English language for example).
 -l <lang>

```