diff --git a/_sd/README.md b/_sd/README.md index f91cae3..44bab27 100644 --- a/_sd/README.md +++ b/_sd/README.md @@ -23,6 +23,36 @@ `SEEK0`. Остальные точки входа таблицы — заглушки (не используются ZiFi). +## Что реализовано сверх голого CORE ABI + +- **MBR/раздел**: автоматически определяет, есть ли на карте + партиция (тип `0x0B`/`0x0C`), или BPB лежит прямо в LBA0; смещение + партиции (`ADDTOP`) прибавляется ко всем последующим LBA. +- **SDSC/SDHC/SDXC**: сама определяет байтовую или блочную адресацию + по биту CCS из CMD8/ACMD41/CMD58, а не считает её заранее известной. +- **Защита от выхода за границу LBA**: перед любым чтением сверяет + номер сектора с реальным размером тома (посчитанным из BPB) — + ошибка в арифметике не уйдёт в CMD17/25 как заведомо неверный адрес. +- **Проверка BPB/FAT32**: сигнатура `55 AA`, `BytesPerSector==512`, + `FATSz16==0`, `RootEntryCount==0`, `SectorsPerCluster` — степень + двойки, прежде чем доверять остальным полям. +- **Зеркалирование FAT**: запись FAT-записи дублируется во все копии + (`NumFATs`), не только в первую. +- **Поиск свободного кластера**: сессионный кэш "куда искать дальше" + плюс чтение/запись `FSInfo`-подсказки (`FSI_Nxt_Free`) — не + пересканирует FAT с кластера 2 при каждой аллокации на разделах с + большим количеством уже занятых кластеров. +- **Длинные имена (LFN)**: генерация уникального короткого имени 8.3 + с суффиксом `~N` при коллизии, полноценные LFN-записи для + MKFILE/MKDIR. +- **Дата/время создания**: читает реальные RTC (DS1685-совместимые, + порты `#EFF7`/`#DFF7`/`#BFF7`) и проставляет их в создаваемые + записи каталога вместо фиксированной заглушки. +- **Многокластерные файлы/каталоги**: потоковое чтение и запись + (`stream_open`/`stream_read_sector`/`stream_write_sector`) следует + цепочке FAT и доращивает её по мере необходимости — не ограничено + одним кластером. + ## Адресация Драйвер загружается в физическую страницу `#0F`, отображается в CPU