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:
User avatar
breeze
 
Posts: 764
Joined: 07 Feb 2009, 17:19
Location: Оттуда
Group: Registered users

Postby breeze » 08 Oct 2010, 14:11

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


хм, я бы полностью с тобой согласился, но системе тоже нужно где-то выделить место в ОЗУ.
User avatar
breeze
 
Posts: 764
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:…но хватит уже думать категориями тырдоса!


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

Postby deathsoft » 08 Oct 2010, 14:24

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

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

Postby DimkaM » 08 Oct 2010, 14:54

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

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

Postby breeze » 08 Oct 2010, 14:55

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


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

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


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

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


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

Postby breeze » 08 Oct 2010, 14:56

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


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

Postby DimkaM » 08 Oct 2010, 15:13

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


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

Всё это по мотивам МС-ДОС.
ZX-Evo rev B, ZX-Evo rev C, ZXNetUsb rev A, ZXNetUsb rev С
http://nedoos.ru/ http://ti6.zxevo.ru/
DimkaM
 
Posts: 1387
Joined: 24 Mar 2010, 13:42
Location: джунгли Амазонки
Group: Registered users

Postby lvd » 08 Oct 2010, 15:24

Но всякей случой напомню:
оси на спецтруме брались писать многие. Большинство устраивали слифф. У некоторых получались мегажопные пиздецы в виде гибрида оси и нортонкомандера (ыздоз), без хотя бы поддержики фата. Третьи мужественно написали что-то и канули в лету (всякие днаос, доорс и прочие).
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1786
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby deathsoft » 08 Oct 2010, 15:26

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

Приведу примерчик на Ц:
Code: Select all
void myfunc(void *buf)
{
    FILE fl; // Та самая временная переменная (структура), в которой хрянятся параметры которые нужны файловым функциям
    open(&fl, "myfile.bin");
    read(&fl, buf, 100);
    close(&fl);
}
User avatar
deathsoft
 
Posts: 358
Joined: 07 Apr 2007, 01:58
Group: Registered users

Next

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

Who is online

Users browsing this forum: Google [Bot] and 1 guest

cron