Page 1 of 6

EvoTools (ROM)

PostPosted: 08 Oct 2010, 13:45
by breeze
Бурно обсуждая в соседнем топике о необходимости реструктуризации 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:

Re: EvoTools (ROM)

PostPosted: 08 Oct 2010, 14:11
by breeze
TS-Labs wrote:Не стоит использовать чтение папки в ОЗУ. Оно тебе не нужно - хай система сама разгребает работу с файлами.


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

Re: EvoTools (ROM)

PostPosted: 08 Oct 2010, 14:13
by breeze
TS-Labs wrote:КРИК ДУШИ: народ! перестаньте думать в 8-ми битах!


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

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


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


что-то тут вообще не улавливаю мысль, причём тут трдос ?)

Re: EvoTools (ROM)

PostPosted: 08 Oct 2010, 14:24
by deathsoft
breeze wrote:хм, я бы полностью с тобой согласился, но системе тоже нужно где-то выделить место в ОЗУ.

Место под системные данные ты должен указывать сам через регистр, чтобы не было как с системными переменными трдоса. Т.е. например дескриптор файла - передается не номер файла - а указатель сразу на структуру (для юзер программы внутренность этой структуры не важна, void *, важен только ее размер)

Re: EvoTools (ROM)

PostPosted: 08 Oct 2010, 14:54
by DimkaM
Нужно добавить процедуры:
Указать-получить текущее устройство.
Указать-получить текущий каталог.

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

Re: EvoTools (ROM)

PostPosted: 08 Oct 2010, 14:55
by breeze
TS-Labs wrote:Я понимаю. что мы начинаем писать первую версию МС-ДОСа, но...


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

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


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

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


можно примерчик на асме как ты это видишь, мне так проще понять будет, а то с абстракциями у меня туго :)

Re: EvoTools (ROM)

PostPosted: 08 Oct 2010, 14:56
by breeze
DimkaM wrote:Т.к. запущенной проге иногда требуется знать откуда её запустили.


согласен, но в ПЗУ эти данные мы хранить не сможем, значит вариант как у TR-DOS, выделить где-то в ОЗУ место где хранить системные переменные

Re: EvoTools (ROM)

PostPosted: 08 Oct 2010, 15:13
by DimkaM
breeze wrote:согласен, но в ПЗУ эти данные мы хранить не сможем, значит вариант как у TR-DOS, выделить где-то в ОЗУ место где хранить системные переменные


У каждой проги, например по адресу #C000, должно быть выделено место(допустим 64байта) под нужды ОСи. куда будут сохранятся регистры(когда предаётся управление ОС), передаватся операнды командной строки(при вызове проги), а также передаватся путь(или хотябы номер первого кластера) откуда её запустили.

Всё это по мотивам МС-ДОС.

Re: EvoTools (ROM)

PostPosted: 08 Oct 2010, 15:24
by lvd
Но всякей случой напомню:
оси на спецтруме брались писать многие. Большинство устраивали слифф. У некоторых получались мегажопные пиздецы в виде гибрида оси и нортонкомандера (ыздоз), без хотя бы поддержики фата. Третьи мужественно написали что-то и канули в лету (всякие днаос, доорс и прочие).

Re: EvoTools (ROM)

PostPosted: 08 Oct 2010, 15:26
by deathsoft
breeze wrote:можно примерчик на асме как ты это видишь, мне так проще понять будет, а то с абстракциями у меня туго :)

Приведу примерчик на Ц:
Code: Select all
void myfunc(void *buf)
{
    FILE fl; // Та самая временная переменная (структура), в которой хрянятся параметры которые нужны файловым функциям
    open(&fl, "myfile.bin");
    read(&fl, buf, 100);
    close(&fl);
}