Flatfs reading and writing files and directories done

This commit is contained in:
Aaron Hance 2022-02-03 01:21:37 +00:00
parent f88a282893
commit 27177979a2
2 changed files with 110 additions and 70 deletions

View File

@ -340,7 +340,7 @@ begin
console.writestringln('IDE (writePIO28) ERROR: Invalid LBA!');
end;
push_trace('IDE.readPIO28.2');
// push_trace('IDE.readPIO28.2');
//Add last 4 bits of LBA to device port
if IDEDevices[drive].isMaster then begin
@ -352,7 +352,7 @@ begin
device_select($F0 or ((LBA and $0F000000) shr 24)); //LBA primary slave
end;
push_trace('IDE.readPIO28.3');
// push_trace('IDE.readPIO28.3');
no_interrupt(device);
port_write(ATA_REG_ERROR, 0);
@ -363,7 +363,7 @@ begin
port_write(ATA_REG_LBA1, (LBA and $0000FF00) shr 8);
port_write(ATA_REG_LBA2, (LBA and $00FF0000) shr 16);
push_trace('IDE.readPIO28.4');
// push_trace('IDE.readPIO28.4');
//send read command
port_write(ATA_REG_COMMAND, ATA_CMD_READ_PIO);
@ -381,7 +381,7 @@ begin
i:= i + 2;
end;
push_trace('IDE.readPIO28.5');
// push_trace('IDE.readPIO28.5');
end;
procedure writePIO28(drive : uint8; LBA : uint32; buffer : puint8);

View File

@ -64,6 +64,7 @@ procedure detect_volumes(disk : PStorage_Device);
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);
procedure read_file(volume : PStorage_Volume; fileName : pchar; data : PuInt32; status : PuInt32);
implementation
@ -138,7 +139,14 @@ begin
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);
write_file(volume, '/logs/log2.txt', PuInt32(data), 1, status);
write_file(volume, '/logs/log3.txt', PuInt32(data), 1, status);
read_directory(volume, '/logs', status);
kfree(puint32(data));
read_file(volume, '/logs/log.txt', PuInt32(data), status);
writestringlnWND(pchar(data), getterminalhwnd());
end;
procedure write_directory(volume : PStorage_Volume; directory : pchar; status : PuInt32);
@ -228,67 +236,52 @@ var
compString : PChar;
afterString : PChar;
slash : PChar;
compStringLength : uint32;
fileCount : uint32 = 1000;
slashArray : array[0..1] of char = '/';
begin
writeStringlnWnd('read_directory', getTerminalHWND());
redrawWindows();
compString := pchar(kalloc(60));
memset(uint32(compString), 0, 60);
afterString := pchar(kalloc(60));
memset(uint32(afterString), 0, 60);
slash := stringNew(2);
memcpy(uint32(@slashArray), uint32(slash), 1);
directories := STRLL_New();
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));
push_trace('read_directory.after_read');
writeStringlnWnd('read_directory_1', getTerminalHWND());
redrawWindows();
for i := 0 to fileCount - 1 do begin
// if fileEntrys[i].attribues and $10 = $10 then begin
writeStringlnWnd('read_directory_loop1', getTerminalHWND());
redrawWindows();
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));
afterString := stringSub(fileEntrys[i].name, stringSize(directory), stringSize(fileEntrys[i].name)-1);
writeStringlnWnd('read_directory_loop2', getTerminalHWND());
redrawWindows();
writestringlnWND(afterString, getterminalhwnd());
push_trace('read_directory.loop3');
push_trace('read_directory_2');
if stringEquals(compString, directory) and
(not stringContains(afterString, '/')) then begin
(not stringContains(afterString, slash)) then begin
console.writestringlnWND(afterString, getTerminalHWND());
writestringlnWND(fileEntrys[i].name, getterminalhwnd());
STRLL_Add(directories, afterString);
end;
// end;
end;
push_trace('read_directory.after_loop');
push_trace('read_directory_3');
Kfree(puint32(fileEntrys));
@ -347,6 +340,8 @@ end;
function find_free_space(volume : PStorage_Volume; size : uint32; status : PuInt32) : uint32;
var
fileEntrys : PFile_Entry;
confirmedFileEntrys : PFile_Entry;
confirmedFileEntrysCount : uint32 = 0;
fileEntry : PFile_Entry;
i : uint32;
fileCount : uint32 = 1000;
@ -354,39 +349,51 @@ var
baseAddress : uint32;
begin
fileEntrys := PFile_Entry(Kalloc(sizeof(TFile_Entry) * fileCount + 512));
push_trace('find_free_space.before_read');
confirmedFileEntrys := PFile_Entry(Kalloc(sizeof(TFile_Entry) * fileCount + 512));
memset(uint32(fileEntrys), 0, sizeof(TFile_Entry) * fileCount + 512);
memset(uint32(confirmedFileEntrys), 0, sizeof(TFile_Entry) * fileCount + 512);
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);
for i := 0 to fileCount - 1 do begin
if fileEntrys[i].attribues <> 0 then begin
confirmedFileEntrys[confirmedFileEntrysCount] := fileEntrys[i];
confirmedFileEntrysCount := confirmedFileEntrysCount + 1;
end;
end;
//sort file table by start address using quicksort
//quicksort_start(fileEntrys, 0, fileCount - 1);
quicksort_start(confirmedFileEntrys, 0, confirmedFileEntrysCount - 1);
//find free space big enough to fit size //TODO: make this work
for i := 0 to fileCount - 1 do begin
for i := 0 to confirmedFileEntrysCount - 1 do begin
if fileEntrys[i+1].start = 0 then begin
if confirmedFileEntrys[i+1].attribues = 0 then begin
if fileEntrys[i].size = 0 then begin
if confirmedFileEntrys[i].size = 0 then begin
find_free_space := baseAddress;
break;
end else begin
find_free_space := baseAddress + fileEntrys[i].start;
find_free_space := confirmedFileEntrys[i].start + confirmedFileEntrys[i].size;
break;
end;
break;
end;
if fileEntrys[i+1].start - (fileEntrys[i].start + fileEntrys[i].size) > size+1 then begin
find_free_space := fileEntrys[i].start + fileEntrys[i].size;
status^ := 0;
break;
if confirmedFileEntrys[i].size <> 0 then begin
if confirmedFileEntrys[i+1].start - (confirmedFileEntrys[i].start + confirmedFileEntrys[i].size) > size+1 then begin
find_free_space := confirmedFileEntrys[i].start + confirmedFileEntrys[i].size;
status^ := 0;
break;
end;
end;
end;
Kfree(puint32(fileEntrys));
Kfree(puint32(confirmedFileEntrys));
end;
procedure write_file(volume : PStorage_Volume; fileName : pchar; data : PuInt32; size : uint32; status : PuInt32);
@ -408,7 +415,6 @@ var
elm : puint32;
begin
push_trace('flatfs.write_file');
//load file table
@ -417,11 +423,8 @@ begin
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
for i := 0 to fileCount - 1 do begin
//fileEntry^ := fileEntries[i];
if stringEquals(fileEntries[i].name, fileName) then begin
exsists := true;
@ -439,25 +442,11 @@ begin
//if entry is directory then exit
if fileEntries[p].attribues and $10 = $10 then begin
status^ := 1;
writestringlnWND('write_file: file is directory', getTerminalHWND());
exit;
end;
push_trace('flatfs.write_file.after_loop');
// //allocate file table
// buffer := PuInt32(Kalloc(512));
// 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
// offset := (p * sizeof(TFile_Entry)) mod 512;
// offset := offset div sizeof(TFile_Entry);
//if file exists update entry else create new entry
if exsists then begin
@ -478,26 +467,77 @@ begin
fileEntries[p].attribues := $01;
//add file name
// fileEntry^.name := fileName;
memcpy(uint32(fileName), uint32(@fileEntries[p].name), 14);
end;
writestringlnWND('write_file: writing file', getTerminalHWND());
//fileEntries[i] := fileEntry^;
//write file table
volume^.device^.writeCallback(volume^.device, volume^.sectorStart + 1 , 1, puint32(@fileEntries[position])); /////
writeIntLnWND(fileEntries[p].start, getTerminalHWND());
volume^.device^.writeCallback(volume^.device, volume^.sectorStart + 1 , 1, puint32(@fileEntries[position]));
//write file
volume^.device^.writeCallback(volume^.device, fileEntries[p].start, size, data);
//free buffer
Kfree(puint32(fileEntries));
end;
procedure read_file(volume : PStorage_Volume; fileName : pchar; data : PuInt32; status : PuInt32);
var
directories : PLinkedListBase;
i : uint32;
p : uint32;
fileEntries : PFile_Entry;
fileEntry : PFile_Entry;
fileCount : uint32 = 1000;
exsists : boolean = false;
size : uint32;
begin
//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));
//check if file exists else exit
for i := 0 to fileCount - 1 do begin
if stringEquals(fileEntries[i].name, fileName) then begin
exsists := true;
p:= i;
break;
end;
end;
//if entry is directory then exit
if fileEntries[p].attribues and $10 = $10 then begin
status^ := 1;
exit;
end;
//if entry is not found exit
if fileEntries[i].attribues = 0 then begin
exsists := false;
p:= i;
exit;
end;
//file size rounded up to nearest 512
size := (fileEntries[p].size + 511) and -512;
//read file
data := Kalloc(size);
volume^.device^.readCallback(volume^.device, fileEntries[p].start, size, data);
//free buffer
Kfree(puint32(buffer));
Kfree(puint32(fileEntries));
status^ := 0;
end;
procedure detect_volumes(disk : PStorage_Device);