Посему появилась идея добавить в прошивку (основную) или в виде отдельного банка (16к) набор утилит (процедур) для работы с файлами. (пока)
Прежде чем кидаться в бой и махать шашками, и что бы не наломать дров предлагаю обсудить, структуру и набор функциональности. Я думаю не стоит сильно мудрить и остановиться на классической схеме с JP, например:
- Code: Select all
#0000 jp _init ; инициализация (заглушка?) если кто-то случайно попадёт на адрес 0
#0003 jp _init_device ; инициализация устройства (если вдруг такое потребуется)
#0006 jp _read_dir ; прочитать содержимое директории в память
#0009 jp _read_file ; прочитать содержимое файла в память
#000С jp _write_file ; записать содержимое файла из памяти
#000F jp _rename_file ; переименовать файл (директорию)
#0012 jp _move_file ; переместить файл
#0015 ....
#0000 - Начальная ининциализация нужна для предотвращения случайного вызова и как следствия потери данных на устройстве
#0003 - Инициализация устройтва (возможно) при первоночальном обращении к устройству его необходимо инициализировать (например закрыть лоток у cd-rom)
#0006 - Чтение директории. Я думаю стоит вынести это в отдельный вызов(пример вызова):
- Code: Select all
addr equ #c000
blockSize equ #4000
blockNumber equ #00
ld hl,addr ; адрес куда прочитать содержимое директории
ld de,path ; указатель на строку с путём откуда прочитать данные
ld bc,blockSize ; собственно сколько байт прочитать. память у спекртрума не ризиновая и прочитать за раз 65535 байт думаю более чем достаточно
ld a,blockNumber ; номер блока (если каталог большой и его за раз прочитать не возможно, разбивается на блоки, и читается часть (blockSize * blockNumber))
jp #0006
path db "/" ; корень диска
на выходе в акк (A) код ошибки, если #00 - ошибок нет, #01 - путь не найден, #02 - устройство не готово, итд
#0009 - По аналогии с чтением директории, читается файл:
- Code: Select all
addr equ #c000
blockSize equ #4000
blockNumber equ #00
ld hl,addr ; адрес куда прочитать содержимое файла
ld de,path ; указатель на строку с путём откуда прочитать данные
ld bc,blockSize ; собственно сколько байт прочитать.
ld a,blockNumber ; номер блока
jp #0009
path db "/test.txt" ; файл в корене диска
#000С - Запись файла:
- Code: Select all
addr equ #c000
blockSize equ #4000
blockNumber equ #00
mSize equ #1000
hSize equ #0000
ld hl,addr ; адрес в памяти, где распологается содержимое файла
ld de,path ; указатель на строку с путём куда сохранить файл
exx
ld hl,mSize ; полный размер файла (младшая часть)
ld de,hSize ; старшая часть (#00001000 = 4096 байт)
exx
ld bc,blockSize ; собственно сколько байт сохранить за вызов.
ld a,blockNumber ; номер блока в который сохранить
jp #000С
path db "/test.txt" ; файл в корене диска (куда сохранять)
#000F - Переименование файла (директории)
- Code: Select all
ld hl,oldName
ld de,newName
jp #000F
oldName db "/test.txt"
newName db "/test2.txt"
#0012 - Переместить файл по аналогии с переименованием.
Вот вкратце такое видение картины. Жду здравую критику, ну а если это нафиг не упало… жаль потраченного времени, но не фатально