Вход

Просмотр полной версии : Как ТР-ДОСе сделать overwrite файла на асме?



Protom
31.03.2010, 21:29
Привет,

Как ТР-ДОСе сделать overwrite файла на асме?

TomCaT
31.03.2010, 22:10
См. VIRT (zx.da.ru), раздел 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 номер вниз, и только тогда вписать наш дескриптор удаленного файла.

Одним словом, файл всегда одинаковой длины в секторах?

Если да, все довольно просто.

Если нет, то все довольно сложно.

Protom
31.03.2010, 22:18
См. VIRT (zx.da.ru), раздел 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 номер вниз, и только тогда вписать наш дескриптор удаленного файла.

Одним словом, файл всегда одинаковой длины в секторах?

Если да, все довольно просто.

Если нет, то все довольно сложно.

да файл всегда одинаковой длины в секторах

TomCaT
31.03.2010, 23:19
Тогда только шаги (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:
...