diff --git a/src/driver/storage/IDE.pas b/src/driver/storage/IDE.pas index 1dec9787..e05d058d 100644 --- a/src/driver/storage/IDE.pas +++ b/src/driver/storage/IDE.pas @@ -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); diff --git a/src/driver/storage/flatfs.pas b/src/driver/storage/flatfs.pas index 8e7b917b..937e3f57 100644 --- a/src/driver/storage/flatfs.pas +++ b/src/driver/storage/flatfs.pas @@ -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);