Перевірка коректності файлової структури дисків tr-dos

З різних причин (переривання дискових операцій, пов'язаних із записом на диск, використання програм, неправильно працюючих з диском, помилкові дії користувача при ручному редагуванні каталогу і т.д.) файлова структура диска TR-DOS може виявитися некоректною.

Якщо працює з диском програма не перевіряє правильність файлової структури (а взагалі-то, і сама TR-DOS цього не робить # 151; перевіряється лише спеціальний байт в службовому секторі, який вказує на приналежність диска TR-DOS), то робота з «неправильним» диском може привести, взагалі кажучи, до непередбачуваних наслідків. Можливо і руйнування програми в пам'яті, і втрата інформації на диску. А якщо, скажімо, в каталозі для якогось файлу неправильно вказано його розмір або номер початкового треку / сектора, то спроба роботи з цим файлом теоретично може привести навіть до пошкодження дисковода при спробі позиціонування на неіснуючий трек.

Ясно, що своєчасне виявлення помилок у файловій структурі було б дуже до речі. Значить, потрібна процедура, що перевіряє правильність каталогу диска. Така процедура може бути використана як в спеціальній програмі перевірки дисків, так і взагалі в будь-якій програмі, що працює з диском: якщо перед дисковими операціями прочитати каталог і перевірити його коректність, це допоможе уникнути неприємних наслідків, а якщо ваша програма виконує операції, пов'язані із записом на диск, працюючи безпосередньо з каталогом, то виклик цієї процедури буде корисний і перед записом зміненого каталогу на диск: якщо через помилку в програмі записується каталог не є коректним, це буде сра зу ж помічено. Ваша програма, таким чином, буде перевіряти саму себе!

Коротко розповім про формат дисків TR-DOS # 151; ця інформація стане в нагоді для розуміння логіки роботи програми.

На кожному треку (вони нумеруються з 0) знаходиться 16 секторів (також нумеруються з 0). Довжина кожного сектора # 151; 256 (# 100) байтів.

Для системних потреб виділено нульовий трек, а область з першого треку і до кінця диска використовується для зберігання вмісту файлів.

У секторах 0 # 151; 7 нульового треку знаходяться елементи каталогу, що містять інформацію про записаних на диску файлах. Кожен елемент каталогу займає 16 байтів, його структура описана в табл. 1.

Зсув від початку

Ім'я диска (взагалі кажучи, може займати і все 11 байтів до кінця сектора).

Спочатку я написав функцію, яка перевіряє коректність каталогу, на мові C (використовуючи компілятор Turbo C 2.0), а потім вже переніс її на асемблер Z80. З одного боку, це полегшило мені тестування і налагодження, а з іншого боку # 151; наявність функції на C допоможе тим, кому потрібно додати перевірку коректності каталогу в програму для роботи з дисками TR-DOS (або з файлами-образами таких дисків) нема на ZX Spectrum, а, наприклад, на AMiGA або PC.

В принципі, можна було б вважати другий параметр рівним 40, 80 або 160 треках, в залежності від типу диска (див. Табл. 2), і визначати його в самій функції. Рішення про передачу цього параметра при виконанні функції було прийнято з урахуванням того, щоб можна було перевіряти диски, відформатовані на більшу кількість треків, ніж випливає з значення типу диска, а також RAM-диски, кількість треків на яких визначається обсягом виділеної під них пам'яті.

Функція повертає двухбайтное значення, де молодший байт # 151; або 0, якщо помилок не виявлено, або код помилки (див. табл. 3), а старший байт # 151; номер елемента каталогу (нумеруються з 0), при розгляді якого помилка була виявлена ​​(для тих кодів помилок, які позначені «*» в першому стовпці табл. 3). Якщо в каталозі кілька помилок, то повертається функцією значення буде відповідати першій помічені помилки.