Привет,
Как ТР-ДОСе сделать overwrite файла на асме?
Вид для печати
Привет,
Как ТР-ДОСе сделать overwrite файла на асме?
См. VIRT, раздел Books, N 76. ZX-Spectrum & TR-DOS для пользователей и программистов - А.Ларченко, Н.Родионов'94.
Со страницы 190 и дальше.
Вкратце алгоритм такой:
1. Функция #13 - задать дескриптор файла. До этого заготовить 9 байт имя+тип файла в памяти.
2. Функция #0A - поиск файла по началу дескриптора. Получаем номер файла для
3. #08 - чтение дескриптора по номеру. Все байты #00..0F дескриптора в памяти.
4. Если файл всегда одинаковой длины (как часто бывает с блоком отгрузки в играх), этот шаг не нужен. Иначе сравниваем старшие части - (длину куска для перезаписи +1)/256 и занимаемое количество секторов (байт в позиции #0D в дескрипторе). Если новый кусок выходит больше - просто перезаписать не получиться. Большинство тогда просто стирает старый файл и создает новый, не делая никаких MOVE и не разбивая файл на два - это потеря места на дискете в ущерб надежности.
5. Если длина в секторах та же, из байтов дескриптора #0E и #0F берем сектор и дорожку файла на диске, и используем функцию #06 для записи блока секторов в это же место.
6. Если длина в секторах та же, а длина в байтах (двухбайтовое число в позиции #0B..#0C в дескрипторе) отличалась, то вообще говоря, для полной чистоты работы нужно после шага (5) заменить значение длины на новое в дескрипторе, после чего записать его под старым (запомненным ранее) номером.
7. Если длина в секторах меньше длины старого файла, очень не рекомендуется обойтись теми же мерами шагов (5) и (6), а следует после выполнения (5) и (6) пометить освободившиеся сектора (старая длина в секторах - новая длина в секторах) как удаленный файл (0 в байте #00 дескриптора) с любым именем, типом и значениями "старт/длина" (байты #01..#0C), но с правильной длиной в секторах и правильно рассчитанными "сектор/дорожкой" начала освободившихся секторов старого файла. А для этого такой новый дескриптор придется вписать НА ДИСК под номером сразу после или сразу перед дескриптором заменяемого файла (смотря какие сектора освобождаются - с конца старого файла или с начала соответственно, выбор не существенен). А для вписывания дескриптора в середину придется увеличить и полное количество файлов и количество удаленных файлов на диске (изменив дескриптор диска в секторе #08 дорожки #00), сдвинуть все дескрипторы файла после нашего файла на 1 номер вниз, и только тогда вписать наш дескриптор удаленного файла.
Одним словом, файл всегда одинаковой длины в секторах?
Если да, все довольно просто.
Если нет, то все довольно сложно.
Тогда только шаги (1), (2), (3), (5) из перечисленных выше. И, наверное, без 6, так как и длина файла в байтах, конечно одинаковая?
Код:; шаг 1
LD HL,<адрес 9 байт имени и типа файла>
LD C,#13
CALL #3D13
; шаг 2
LD A,9
LD (5D06),A
LD C,#0A
CALL #3D13
; шаг 3
LD A,C
INC C
JR Z,ERROR
LD C,#08
CALL #3D13
INC C
DEC C
JR NZ,ERROR
; шаг 5
LD DE,(5CEB)
LD A,(5CEA)
LD B,A
LD C,06
LD A,255
LD HL,<адрес нового содержимого файла>
CALL 3D13
INC C
DEC C
JR NZ,ERROR
...
; сюда переход, если перезапись не удалась
ERROR:
...