EvoTools (ROM)

ZX evolution software and hardware

Postby breeze » 08 Oct 2010, 13:45

Бурно обсуждая в соседнем топике о необходимости реструктуризации Evo Reset Service, мы пришли к выводу, что было бы не плохо иметь некий набор инструментов, который бы беспрепятственно (не зависимо от устройства и файловой системы) позволил бы сторонним программам читать/писать файлы с этих самых устройств (HDD/CDROM/SD/NGS).

Посему появилась идея добавить в прошивку (основную) или в виде отдельного банка (16к) набор утилит (процедур) для работы с файлами. (пока) :agent:

Прежде чем кидаться в бой и махать шашками, и что бы не наломать дров предлагаю обсудить, структуру и набор функциональности. Я думаю не стоит сильно мудрить и остановиться на классической схеме с 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 - Переместить файл по аналогии с переименованием.

Вот вкратце такое видение картины. Жду здравую критику, ну а если это нафиг не упало… жаль потраченного времени, но не фатально :crazy:
Image
User avatar
breeze
 
Posts: 758
Joined: 07 Feb 2009, 17:19
Location: Оттуда
Group: Registered users

Postby TS-Labs » 08 Oct 2010, 13:59

Не стоит использовать чтение папки в ОЗУ. Оно тебе не нужно - хай система сама разгребает работу с файлами. Папки могут быть оооочень большими. То же и с фатом.
Твоя задача указать системе устройство, путь и имя. Задача системы - инициализировать дескриптор файла/папки.
User avatar
TS-Labs
 
Posts: 1316
Joined: 19 Apr 2010, 11:10
Location: Wildest West
Group: Registered users

Postby TS-Labs » 08 Oct 2010, 14:08

Апдейт: и возможно, не одного. Я бы предусмотрел возможность работы до с 255 дескрипторами одновременно. Память юзается под это дело по мере открывания файлов.
КРИК ДУШИ: народ! перестаньте думать в 8-ми битах! Перестаньте писать в хардкоде! Все должно быть масштабируемым в пределах разумного минимума. Не надо писать виндовс висту, но хватит уже думать категориями тырдоса!
User avatar
TS-Labs
 
Posts: 1316
Joined: 19 Apr 2010, 11:10
Location: Wildest West
Group: Registered users

Postby breeze » 08 Oct 2010, 14:11

TS-Labs wrote:Не стоит использовать чтение папки в ОЗУ. Оно тебе не нужно - хай система сама разгребает работу с файлами.


хм, я бы полностью с тобой согласился, но системе тоже нужно где-то выделить место в ОЗУ.
Image
User avatar
breeze
 
Posts: 758
Joined: 07 Feb 2009, 17:19
Location: Оттуда
Group: Registered users

Postby breeze » 08 Oct 2010, 14:13

TS-Labs wrote:КРИК ДУШИ: народ! перестаньте думать в 8-ми битах!


ээээ… ну мы как бы и пишем под 8бит, разве нет ?

TS-Labs wrote:Перестаньте писать в хардкоде!


хардкода тут как такового нет.
TS-Labs wrote:…но хватит уже думать категориями тырдоса!


что-то тут вообще не улавливаю мысль, причём тут трдос ?)
Image
User avatar
breeze
 
Posts: 758
Joined: 07 Feb 2009, 17:19
Location: Оттуда
Group: Registered users

Postby TS-Labs » 08 Oct 2010, 14:21

breeze wrote:ээээ… ну мы как бы и пишем под 8бит, разве нет ?

Я не то имел в виду. Многие спектрумисты замечены в некоторой узости границ восприятия.

breeze wrote:м, я бы полностью с тобой согласился, но системе тоже нужно где-то выделить место в ОЗУ.

А вот потому нужен диспетчер ОЗУ. Памяти не меряно, но разгребать ее должна одна "служба". Система себе знает, сколько памяти ей необходимо, а странички ей выделит диспетчер. Буфер не безразмерный, а минимально необходимый.
Я понимаю. что мы начинаем писать первую версию МС-ДОСа, но если ее с умом продумать и грамотно написать, для спека она же и будет последней. Удобной и надежной.
User avatar
TS-Labs
 
Posts: 1316
Joined: 19 Apr 2010, 11:10
Location: Wildest West
Group: Registered users

Postby deathsoft » 08 Oct 2010, 14:24

breeze wrote:хм, я бы полностью с тобой согласился, но системе тоже нужно где-то выделить место в ОЗУ.

Место под системные данные ты должен указывать сам через регистр, чтобы не было как с системными переменными трдоса. Т.е. например дескриптор файла - передается не номер файла - а указатель сразу на структуру (для юзер программы внутренность этой структуры не важна, void *, важен только ее размер)
User avatar
deathsoft
 
Posts: 348
Joined: 07 Apr 2007, 01:58
Group: Registered users

Postby DimkaM » 08 Oct 2010, 14:54

Нужно добавить процедуры:
Указать-получить текущее устройство.
Указать-получить текущий каталог.

Т.к. запущенной проге иногда требуется знать откуда её запустили.
ZX-Evo rev C, ZXNetUsb rev A
DimkaM
 
Posts: 1157
Joined: 24 Mar 2010, 13:42
Location: джунгли Амазонки
Group: Registered users

Postby breeze » 08 Oct 2010, 14:55

TS-Labs wrote:Я понимаю. что мы начинаем писать первую версию МС-ДОСа, но...


не, я думаю это слишком заоблачные дали, начинать надо с малого, с того что на данный момент сильно востребовано… а если подходить с вопросом ос - то мы дальше разговоров так и не уйдём, был уже печальный опыт, когда благие намерения вылились в банальный срач…

deathsoft wrote:Место под системные данные ты должен указывать сам…


да, этот момент я упустил из виду…

deathsoft wrote:а указатель сразу на структуру....


можно примерчик на асме как ты это видишь, мне так проще понять будет, а то с абстракциями у меня туго :)
Image
User avatar
breeze
 
Posts: 758
Joined: 07 Feb 2009, 17:19
Location: Оттуда
Group: Registered users

Postby breeze » 08 Oct 2010, 14:56

DimkaM wrote:Т.к. запущенной проге иногда требуется знать откуда её запустили.


согласен, но в ПЗУ эти данные мы хранить не сможем, значит вариант как у TR-DOS, выделить где-то в ОЗУ место где хранить системные переменные
Image
User avatar
breeze
 
Posts: 758
Joined: 07 Feb 2009, 17:19
Location: Оттуда
Group: Registered users

Next

Return to Пентева - софт и железо

Who is online

Users browsing this forum: No registered users and 1 guest

cron