Progress on flatfs

This commit is contained in:
Aaron Hance 2022-02-02 23:19:30 +00:00
parent ff4c597ff3
commit f88a282893

View File

@ -47,7 +47,8 @@ type
TFile_Entry = bitpacked record TFile_Entry = bitpacked record
attribues : uint8; // 0x00 = does not exsist, 0x01 = file, 0x02 = hidden, 0x04 = system/read only, 0x10 = directory, 0x20 = archive attribues : uint8; // 0x00 = does not exsist, 0x01 = file, 0x02 = hidden, 0x04 = system/read only, 0x10 = directory, 0x20 = archive
name: array[0..54] of char; //max file name length is 55 name: array[0..53] of char; //max file name length is 54
rsv : uint8;
size: uint32; size: uint32;
start : uint32; start : uint32;
end; end;
@ -61,6 +62,8 @@ procedure init;
procedure create_volume(volume : PStorage_Volume; sectors : uint32; start : uint32; config : puint32); procedure create_volume(volume : PStorage_Volume; sectors : uint32; start : uint32; config : puint32);
procedure detect_volumes(disk : PStorage_Device); procedure detect_volumes(disk : PStorage_Device);
function read_directory(volume : PStorage_Volume; directory : pchar; status : PuInt32) : PLinkedListBase; function read_directory(volume : PStorage_Volume; directory : pchar; status : PuInt32) : PLinkedListBase;
procedure write_directory(volume : PStorage_Volume; directory : pchar; status : PuInt32);
procedure write_file(volume : PStorage_Volume; fileName : pchar; data : PuInt32; size : uint32; status : PuInt32);
implementation implementation
@ -73,11 +76,15 @@ var
directories : PLinkedListBase; directories : PLinkedListBase;
status : PuInt32; status : PuInt32;
data : pchar;
const const
asuroArray : array[0..7] of char = 'ASURO'; asuroArray : array[0..7] of char = 'ASURO';
systemArray : array[0..6] of char = '/system'; systemArray : array[0..6] of char = '/system';
programsArray : array[0..8] of char = '/programs'; programsArray : array[0..8] of char = '/programs';
userArray : array[0..4] of char = '/user'; userArray : array[0..4] of char = '/user';
testArray : array[0..23] of char = 'ASURO TEST DATA ARRAY';
begin begin
info := PDisk_Info(Kalloc(512)); info := PDisk_Info(Kalloc(512));
@ -117,12 +124,21 @@ begin
entryTable[2].start := 0; entryTable[2].start := 0;
//write file table //write file table
// volume^.device^.writeCallback(volume^.device, start + 1, ((sizeof(TFile_Entry) * info^.fileCount) div 512), puint32(entryTable)); volume^.device^.writeCallback(volume^.device, start + 1, ((sizeof(TFile_Entry) * info^.fileCount) div 512), puint32(entryTable));
volume^.device^.writeCallback(volume^.device, start + 1, 1, puint32(entryTable)); //volume^.device^.writeCallback(volume^.device, start + 1, 1, puint32(entryTable));
//temp read //temp read
status := PuInt32(Kalloc(sizeof(uint32))); status := PuInt32(Kalloc(sizeof(uint32)));
directories := read_directory(volume, '/', status); // directories := read_directory(volume, '/', status);
data := stringNew(1024);
memset(uint32(data), 0, 513);
memcpy(uint32(@testArray), uint32(data), 23);
write_directory(volume, '/logs', status);
write_directory(volume, '/logs/test', status);
write_file(volume, '/logs/log.txt', PuInt32(data), 1, status);
//read_directory(volume, '/logs', status);
end; end;
procedure write_directory(volume : PStorage_Volume; directory : pchar; status : PuInt32); procedure write_directory(volume : PStorage_Volume; directory : pchar; status : PuInt32);
@ -130,6 +146,8 @@ var
directories : PLinkedListBase; directories : PLinkedListBase;
i : uint32; i : uint32;
fileEntries : PFile_Entry;
fileEntry : PFile_Entry; fileEntry : PFile_Entry;
buffer : PuInt32; buffer : PuInt32;
@ -139,27 +157,42 @@ var
const const
fileCount : uint32 = 1000; fileCount : uint32 = 1000;
begin begin
status^ = 0; status^ := 0;
directories := read_directory(volume, directory, status); //directories := read_directory(volume, directory, status);
fileEntries := PFile_Entry(Kalloc(sizeof(TFile_Entry) * fileCount + 512));
memset(uint32(fileEntries), 0, sizeof(TFile_Entry) * fileCount + 512);
volume^.device^.readCallback(volume^.device, volume^.sectorStart + 1, (sizeof(TFile_Entry) * fileCount) div 512, PuInt32(fileEntries));
if status^ = 0 then begin if status^ = 0 then begin
for i := 0 to fileCount - 1 do begin for i := 0 to fileCount - 1 do begin
fileEntry := PFile_Entry(LL_Get(directories, i));
push_trace('write_directory_2');
//fileEntry := PFile_Entry(STRLL_Get(directories, i));
fileEntry := @fileEntries[i];
if fileEntry^.attribues = 0 then begin if fileEntry^.attribues = 0 then begin
fileEntry^.attribues := $10; fileEntry^.attribues := $10;
fileEntry^.size := 0; fileEntry^.size := 0;
fileEntry^.start := 0; fileEntry^.start := 0;
memcpy(uint32(@fileEntry^.name), uint32(@directory), strlen(directory)); memcpy(uint32(directory), uint32(@fileEntry^.name), stringSize(directory));
push_trace('write_directory_3');
//write file table //write file table
buffer := PuInt32(Kalloc(512)); buffer := PuInt32(Kalloc(513));
memset(uint32(buffer), 0, 512); memset(uint32(buffer), 0, 512);
push_trace('write_directory.b4_read');
//read file table cointaining entry of interest //read file table cointaining entry of interest
position := (i * sizeof(TFile_Entry)) div 512; position := (i * sizeof(TFile_Entry)) div 512;
volume^.device^.readCallback(volume^.device, sectorStart + 1 + position, 1, buffer); volume^.device^.readCallback(volume^.device, volume^.sectorStart + 1 + position, 1, buffer);
push_trace('write_directory.after_read');
//calculate entry offset into sector //calculate entry offset into sector
offset := (i * sizeof(TFile_Entry)) mod 512; offset := (i * sizeof(TFile_Entry)) mod 512;
@ -169,10 +202,12 @@ begin
PFile_Entry(buffer)[offset] := fileEntry^; PFile_Entry(buffer)[offset] := fileEntry^;
//write updated file table sector //write updated file table sector
volume^.device^.writeCallback(volume^.device, sectorStart + 1 + position, 1, buffer); volume^.device^.writeCallback(volume^.device, volume^.sectorStart + 1 + position, 1, buffer);
Kfree(buffer); Kfree(buffer);
push_trace('write_directory.after_write');
break; break;
end; end;
@ -183,7 +218,6 @@ begin
status^ := 1; status^ := 1;
end; end;
LL_Destroy(directories);
end; end;
function read_directory(volume : PStorage_Volume; directory : pchar; status : PuInt32) : PLinkedListBase; function read_directory(volume : PStorage_Volume; directory : pchar; status : PuInt32) : PLinkedListBase;
@ -200,6 +234,9 @@ var
begin begin
writeStringlnWnd('read_directory', getTerminalHWND());
redrawWindows();
compString := pchar(kalloc(60)); compString := pchar(kalloc(60));
memset(uint32(compString), 0, 60); memset(uint32(compString), 0, 60);
@ -208,17 +245,38 @@ begin
directories := STRLL_New(); directories := STRLL_New();
fileEntrys := PFile_Entry(Kalloc(sizeof(TFile_Entry) * fileCount)); fileEntrys := PFile_Entry(Kalloc(sizeof(TFile_Entry) * fileCount + 512));
push_trace('read_directory.b4_read');
volume^.device^.readCallback(volume^.device, volume^.sectorStart + 1, sizeof(TFile_Entry) * fileCount div 512, puint32(fileEntrys)); volume^.device^.readCallback(volume^.device, volume^.sectorStart + 1, sizeof(TFile_Entry) * fileCount div 512, puint32(fileEntrys));
push_trace('read_directory.after_read');
writeStringlnWnd('read_directory_1', getTerminalHWND());
redrawWindows();
for i := 0 to fileCount - 1 do begin for i := 0 to fileCount - 1 do begin
// if fileEntrys[i].attribues and $10 = $10 then begin // if fileEntrys[i].attribues and $10 = $10 then begin
writeStringlnWnd('read_directory_loop1', getTerminalHWND());
redrawWindows();
writestringlnWND(fileEntrys[i].name, getterminalhwnd()); writestringlnWND(fileEntrys[i].name, getterminalhwnd());
push_trace('read_directory.loop1');
if uint32(fileEntrys[i].name[0]) = 0 then begin
writestringlnWND('fileEntry^.name = nil', getterminalhwnd());
break;
end;
push_trace('read_directory.loop2');
compString := stringSub(fileEntrys[i].name, 0, stringSize(directory)); compString := stringSub(fileEntrys[i].name, 0, stringSize(directory));
afterString := stringSub(fileEntrys[i].name, stringSize(directory), stringSize(fileEntrys[i].name)-1); afterString := stringSub(fileEntrys[i].name, stringSize(directory), stringSize(fileEntrys[i].name)-1);
writeStringlnWnd('read_directory_loop2', getTerminalHWND());
redrawWindows();
push_trace('read_directory.loop3');
if stringEquals(compString, directory) and if stringEquals(compString, directory) and
(not stringContains(afterString, '/')) then begin (not stringContains(afterString, '/')) then begin
@ -226,9 +284,12 @@ begin
STRLL_Add(directories, afterString); STRLL_Add(directories, afterString);
end; end;
// end; // end;
end; end;
push_trace('read_directory.after_loop');
Kfree(puint32(fileEntrys)); Kfree(puint32(fileEntrys));
read_directory := directories; read_directory := directories;
@ -244,6 +305,9 @@ var
tempFileEntry : PFile_Entry; tempFileEntry : PFile_Entry;
begin begin
tempFileEntry := PFile_Entry(Kalloc(sizeof(TFile_Entry)));
memset(uint32(tempFileEntry), 0, sizeof(TFile_Entry));
i:=begining; i:=begining;
j:=stop; j:=stop;
@ -259,9 +323,9 @@ begin
end; end;
if i <= j then begin if i <= j then begin
tempFileEntry := list[i]; tempFileEntry^ := list[i];
list[i] := list[j]; list[i] := list[j];
list[j] := tempFileEntry; list[j] := tempFileEntry^;
i := i + 1; i := i + 1;
j := j - 1; j := j - 1;
@ -276,23 +340,45 @@ begin
quicksort_start(list, i, stop); quicksort_start(list, i, stop);
end; end;
Kfree(puint32(tempFileEntry));
end; end;
function find_free_space(volume : PStorage_Volume; size : uint32; status : PuInt32) : uint32; function find_free_space(volume : PStorage_Volume; size : uint32; status : PuInt32) : uint32;
var var
fileEntrys : PFile_Entry; fileEntrys : PFile_Entry;
fileEntry : TFile_Entry; fileEntry : PFile_Entry;
i : uint32; i : uint32;
fileCount : uint32 = 1000; fileCount : uint32 = 1000;
baseAddress : uint32;
begin begin
fileEntrys := PFile_Entry(Kalloc(sizeof(TFile_Entry) * fileCount)); fileEntrys := PFile_Entry(Kalloc(sizeof(TFile_Entry) * fileCount + 512));
push_trace('find_free_space.before_read');
volume^.device^.readCallback(volume^.device, volume^.sectorStart + 1, sizeof(TFile_Entry) * fileCount div 512, puint32(fileEntrys)); volume^.device^.readCallback(volume^.device, volume^.sectorStart + 1, sizeof(TFile_Entry) * fileCount div 512, puint32(fileEntrys));
push_trace('find_free_space.after_read');
baseAddress := volume^.sectorStart + 2 + ( (fileCount * sizeof(TFile_Entry)) div 512);
//sort file table by start address using quicksort //sort file table by start address using quicksort
quicksort(fileEntrys, 0, fileCount - 1); //quicksort_start(fileEntrys, 0, fileCount - 1);
//find free space big enough to fit size //find free space big enough to fit size //TODO: make this work
for i := 0 to fileCount - 1 do begin for i := 0 to fileCount - 1 do begin
if fileEntrys[i+1].start = 0 then begin
if fileEntrys[i].size = 0 then begin
find_free_space := baseAddress;
break;
end else begin
find_free_space := baseAddress + fileEntrys[i].start;
break;
end;
break;
end;
if fileEntrys[i+1].start - (fileEntrys[i].start + fileEntrys[i].size) > size+1 then begin if fileEntrys[i+1].start - (fileEntrys[i].start + fileEntrys[i].size) > size+1 then begin
find_free_space := fileEntrys[i].start + fileEntrys[i].size; find_free_space := fileEntrys[i].start + fileEntrys[i].size;
status^ := 0; status^ := 0;
@ -301,15 +387,15 @@ begin
end; end;
Kfree(puint32(fileEntrys)); Kfree(puint32(fileEntrys));
find_free_space := freeSpace;
end; end;
procedure write_file(volume : PStorage_Volume; fileName : pchar; data : PuInt32; size : uint32; status : PuInt32); procedure write_file(volume : PStorage_Volume; fileName : pchar; data : PuInt32; size : uint32; status : PuInt32);
var var
directories : PLinkedListBase; directories : PLinkedListBase;
i : uint32; i : uint32;
p : uint32;
fileEntries : PFile_Entry;
fileEntry : PFile_Entry; fileEntry : PFile_Entry;
buffer : PuInt32; buffer : PuInt32;
@ -319,81 +405,99 @@ var
fileCount : uint32 = 1000; fileCount : uint32 = 1000;
exsists : boolean; exsists : boolean;
elm : puint32;
begin begin
//load file table push_trace('flatfs.write_file');
directories := read_directory(volume, '/', status);
//load file table
fileEntries := PFile_Entry(Kalloc(sizeof(TFile_Entry) * fileCount + 512));
memset(uint32(fileEntries), 0, sizeof(TFile_Entry) * fileCount);
volume^.device^.readCallback(volume^.device, volume^.sectorStart + 1, sizeof(TFile_Entry) * fileCount div 512, puint32(fileEntries));
push_trace('flatfs.write_file.after_read');
//check if file exists else find free entry //check if file exists else find free entry
for i := 0 to fileCount - 1 do begin for i := 0 to fileCount - 1 do begin
fileEntry := PFile_Entry(LL_Get(directories, i)); //fileEntry^ := fileEntries[i];
if stringEquals(fileEntry^.name, fileName) then begin if stringEquals(fileEntries[i].name, fileName) then begin
exsists := true; exsists := true;
p:= i;
break; break;
end; end;
if fileEntry^.attribues = 0 then begin if fileEntries[i].attribues = 0 then begin
exsists := false; exsists := false;
p:= i;
break; break;
end; end;
end; end;
//if entry is directory then exit //if entry is directory then exit
if fileEntry^.attribues and $10 = $10 then begin if fileEntries[p].attribues and $10 = $10 then begin
status^ := 1; status^ := 1;
writestringlnWND('write_file: file is directory', getTerminalHWND());
exit; exit;
end; end;
//allocate file table push_trace('flatfs.write_file.after_loop');
buffer := PuInt32(Kalloc(512));
memset(uint32(buffer), 0, 512);
//read file table cointaining entry of interest // //allocate file table
position := (i * sizeof(TFile_Entry)) div 512; // buffer := PuInt32(Kalloc(512));
volume^.device^.readCallback(volume^.device, sectorStart + 1 + position, 1, buffer); // memset(uint32(buffer), 0, 512);
// //read file table cointaining entry of interest
position := (p * sizeof(TFile_Entry)) div 512;
// volume^.device^.readCallback(volume^.device, volume^.sectorStart + 1 + position, 1, buffer);
//calculate entry offset into sector //calculate entry offset into sector
offset := (i * sizeof(TFile_Entry)) mod 512; // offset := (p * sizeof(TFile_Entry)) mod 512;
offset := offset div sizeof(TFile_Entry); // offset := offset div sizeof(TFile_Entry);
//if file exists update entry else create new entry //if file exists update entry else create new entry
if exsists then do begin if exsists then begin
//check if size is greater than current size //check if size is greater than current size
if size > fileEntry^.size then begin if size > fileEntries[p].size then begin
//find free space //find free space
fileEntry^.start := find_free_space(volume, size); fileEntries[p].start := find_free_space(volume, size, status);
fileEntry^.size := size; fileEntries[p].size := size;
end else begin end else begin
//update size //update size
fileEntry^.size := size; fileEntries[p].size := size;
end; end;
end else begin end else begin
//find free space //find free space
fileEntry^.start := find_free_space(volume, size); fileEntries[p].start := find_free_space(volume, size, status);
fileEntry^.size := size; fileEntries[p].size := size;
fileEntry^.attribues := $01; fileEntries[p].attribues := $01;
//add file name //add file name
fileEntry^.name := fileName; // fileEntry^.name := fileName;
memcpy(uint32(fileName), uint32(@fileEntries[p].name), 14);
//add file to table
LL_Add(directories, fileEntry);
end; end;
writestringlnWND('write_file: writing file', getTerminalHWND());
//fileEntries[i] := fileEntry^;
//write file table //write file table
volume^.device^.writeCallback(volume^.device, sectorStart + 1 + position, 1, buffer); volume^.device^.writeCallback(volume^.device, volume^.sectorStart + 1 , 1, puint32(@fileEntries[position])); /////
writeIntLnWND(fileEntries[p].start, getTerminalHWND());
//write file //write file
volume^.device^.writeCallback(volume^.device, fileEntry^.start, size div 512 + 1, data); volume^.device^.writeCallback(volume^.device, fileEntries[p].start, size, data);
//free buffer //free buffer
Kfree(puint32(buffer)); Kfree(puint32(buffer));
Kfree(puint32(fileEntries));
//free directories
LL_Free(directories);
end; end;
procedure detect_volumes(disk : PStorage_Device); procedure detect_volumes(disk : PStorage_Device);