Re: EvoTools (ROM)
Posted:
08 Oct 2010, 16:59
by DimkaM
чета я ни хера не уследил ход сообщений.
Получается в дескрипторе файла будет хранится адрес дескриптора раздела?!
Re: EvoTools (ROM)
Posted:
08 Oct 2010, 17:09
by breeze
DimkaM wrote:чета я ни хера не уследил ход сообщений.
ну вот смотри:
+#0A 00 C0 - адрес под буфер для чтения
+#0C 01 00 - размер буфера
в выделяемой область памяти под буфер, будут хранится данные необходимые для работы системы. Здесь могут быть: a) временные переменные для внутреннего пользования; б) данные прочитанные с устройства (каталог, фат итд); ц) ещё какие-нибудь данные
Re: EvoTools (ROM)
Posted:
08 Oct 2010, 17:37
by deathsoft
Вот список функций которые нужно сделать для нормальной работы с дисками:
int opendev(DEV *dev, char *name); // Открытие утсройтсва
int closedev(DEV *dev); // Закрытие устройства
int open(FILE *file, DEV *dev, char *name); // Открытие файла на устройстве
int close(FILE *file); // Закрытие файла
int read(FILE *file, void *buf, int len); // Чтение файла
int write(FILE *file, void *buf, int len); // Запись файла
int seek(FILE *file, int type, int pos); // Сместить текущую позицию файла (относительно начала/текущей/конца)
int chdir(DEV *dev, char *name); // Смена текущего каталога на устройстве
int getcwd(DEV *dev, char *name); // Получение текущего каталога на устройстве
int opendir(FILE *dir, DEV *dev, char *name); // Открытие каталога
int readdir(FILE *dir, DIR *dir_entry); // Пеерчисление элементов каталога
int closedir(FILE *dir); // Закрытие каталога
Все функции возвращают статус.
DEV - описатель утсройства
FILE - описатель файла/каталога
DIR - публичная структура с элементами каталога (содержит 1 элемент каталога)
При запуске программы из командера в регистре HL (для примера) передается указатель на структуру DEV, чтобы можно было опреелить текущее устройство и каталог.
Устройства именовать например так:
SD0, SD1, ... - сд-карты
HD0, HD1, ... - винты
FD0, FD1, ... - дисководы
CD0, CD1, ... - сидюки
В именах файлов имя устройства не указывается!!!
Т.е. сначала открывается устройство и получается его описатель, а потом открывается файл на этом устройстве (файлы именуются от корня либо от текущего каталога):
"\mydir1\myfile" - абсолютный путь
"myfile" - путь относительно текущего каталога
Текущий каталог содержится в структуре DEV.
Re: EvoTools (ROM)
Posted:
08 Oct 2010, 17:39
by DimkaM
сигнатура раздела это нифига не временные данные, че мбр читать при каждом обращении к диску?
Re: EvoTools (ROM)
Posted:
08 Oct 2010, 17:42
by savelij
Хде скачать на посмотреть что вы тут понаписали?
Re: EvoTools (ROM)
Posted:
08 Oct 2010, 17:51
by breeze
deathsoft wrote:Вот список функций которые нужно сделать для нормальной работы с дисками:
хм… однако…
DimkaM wrote:че мбр читать при каждом обращении к диску?
а чё с момента последнего обращения к диску никаких изменений произойти не могло ?
Re: EvoTools (ROM)
Posted:
08 Oct 2010, 17:57
by breeze
savelij wrote:Хде скачать на посмотреть что вы тут понаписали?
ага
как вот напишем, так и сразу выложим
Re: EvoTools (ROM)
Posted:
08 Oct 2010, 18:21
by deathsoft
breeze wrote:хм… однако…
Большинство функций у Савелия и так готовы, все функции типа close... ничего не делают кроме установки флага в структуре что файл или диск закрыт, чтобы все последующие вызовы возвращали ошибку. Т.ч. реально там функций не так и много (собственно это набор файловых функций любой буханки).
Re: EvoTools (ROM)
Posted:
08 Oct 2010, 18:28
by DimkaM
вот выдернул откудато инициализацию:
- Code: Select all
unsigned char fatInit( unsigned char device)
{
//struct partrecord *pr;
struct bpb710 *bpb;
// read partition table
// TODO.... error checking
ataReadSectors(DRIVE0, 0, 1, SectorBuffer);
// map first partition record
// save partition information to global PartInfo
PartInfo = *((struct partrecord *) ((struct partsector *) SectorBuffer)->psPart);
// PartInfo = *pr;
// Read the Partition BootSector
// **first sector of partition in PartInfo.prStartLBA
ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
bpb = (struct bpb710 *) ((struct bootsector710 *) SectorBuffer)->bsBPB;
// setup global disk constants
FirstDataSector = PartInfo.prStartLBA;
if(bpb->bpbFATsecs)
{
// bpbFATsecs is non-zero and is therefore valid
FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
}
else
{
// bpbFATsecs is zero, real value is in bpbBigFATsecs
FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
}
SectorsPerCluster = bpb->bpbSecPerClust;
BytesPerSector = bpb->bpbBytesPerSec;
FirstFATSector = bpb->bpbResSectors + PartInfo.prStartLBA;
RootDirStartCluster = bpb->bpbRootClust;
// push data sector pointer to end of root directory area
// need this? FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
// set current directory to root (\)
CurrentDirStartCluster = RootDirStartCluster;
return 0;
}
Re: EvoTools (ROM)
Posted:
08 Oct 2010, 18:54
by DimkaM
кто возьмется на асм переписать?
я на телефоне ща сижу, много не понапишешь, до компа только послезавтра доберусь.