Загрузка данных


$path = "$env:USERPROFILE\Desktop\oakcdrom.sys"
$flp = "$env:USERPROFILE\Desktop\cd_driver.flp"
$bytes = [System.IO.File]::ReadAllBytes($path)

# Генерируем пустой образ 1.44 MB
$disk = New-Object byte[] 1474560

# Заголовок FAT12 BPB
$boot = [byte[]]@(
    0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00,
    0x02, 0xE0, 0x00, 0x40, 0x0B, 0xF0, 0x09, 0x00, 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
)
[Array]::Copy($boot, 0, $disk, 0, $boot.Length)

# Таблицы FAT
$disk[0x200] = 0xF0; $disk[0x201] = 0xFF; $disk[0x202] = 0xFF
$disk[0x1400] = 0xF0; $disk[0x1401] = 0xFF; $disk[0x1402] = 0xFF

# Кластеры для файла
$clustersNeeded = [Math]::Ceiling($bytes.Length / 512)
for ($i = 0; $i -lt $clustersNeeded; $i++) {
    $current = 2 + $i
    $next = if ($i -eq ($clustersNeeded - 1)) { 0xFFF } else { $current + 1 }
    $entryPos = [int](1.5 * $current)
    if ($current % 2 -eq 0) {
        $disk[0x200 + $entryPos] = [byte]($next -band 0xFF)
        $disk[0x200 + $entryPos + 1] = [byte](($disk[0x200 + $entryPos + 1] -band 0xF0) -bor (($next -shr 8) -band 0x0F))
    } else {
        $disk[0x200 + $entryPos] = [byte](($disk[0x200 + $entryPos] -band 0x0F) -bor (($next -shl 4) -band 0xF0))
        $disk[0x200 + $entryPos + 1] = [byte](($next -shr 4) -band 0xFF)
    }
}
[Array]::Copy($disk, 0x200, $disk, 0x1400, 4608)

# Запись Root Directory (OAKCDROM SYS)
$dirOffset = 0x2600
$name = [System.Text.Encoding]::ASCII.GetBytes("OAKCDROMSYS")
[Array]::Copy($name, 0, $disk, $dirOffset, 11)
$disk[$dirOffset + 0x0B] = 0x20
$disk[$dirOffset + 0x1A] = 0x02
$lenBytes = [System.BitConverter]::GetBytes([int]$bytes.Length)
[Array]::Copy($lenBytes, 0, $disk, $dirOffset + 0x1C, 4)

# Данные файла в Data Area
[Array]::Copy($bytes, 0, $disk, 0x4200, $bytes.Length)

[System.IO.File]::WriteAllBytes($flp, $disk)
Write-Host "Готово! Образ создан: $flp" -ForegroundColor Green