diff --git a/src/driver/storage/FAT32.pas b/src/driver/storage/FAT32.pas index c110db2e..d08f78c7 100644 --- a/src/driver/storage/FAT32.pas +++ b/src/driver/storage/FAT32.pas @@ -15,6 +15,58 @@ interface uses console, storagemanagement; +type + + TBootRecord = bitpacked record + jmp2boot : ubit24; + OEMName : uint64; + sectorSize : uint16; + spc : uint8; + rsvSectors : uint16; + numFats : uint8; + numDirEnt : uint16; + numSecotrs : uint16; + mediaDescp : uint8; + sectorsPerFat : uint16; + sectorsPerTrack : uint16; + heads : uint16; + hiddenSecotrs : uint32; + manySectors : uint32; + end; + + TExtendedBootRecord = bitpacked record + FATSize : uint32; + flags : uint16; + signature : uint8; + FATVersion : uint16; + rootCluster : uint32; + FSInfoCluster : uint16; + backupCluster : uint16; + reserved0 : array[0..11] of uint8; + driveNumber : uint8; + reserved1 : uint8; + signature : uint8 = $28; + volumeID : uint32; + volumeLabel : array[0..10] of uint8; + identString : pchar = 'FAT32 '; + end; + + TDirectory = bitpacked record + fileName : uint64; + fileExtension : ubit24; + attributes : uint8; + reserved0 : uint8; + timeFine : uint8; + time : uint16; + date : uint16; + accessTime : uint16; + clusterHigh : uint16; + modifiedTime : uint16; + modifiedDate : uint16; + clusterLow : uint16; + byteSize : uint32; + end; + procedure init; procedure create_volume(disk : PStorage_Device; sectors : uint32; start : uint32); function detect_volumes(disk : PStorage_Device) : APStorage_volume; @@ -33,14 +85,29 @@ begin filesystem.sName:= 'FAT32'; filesystem.writecallback:= write; filesystem.readcallback:= read; + filesystem.createcallback:= create_volume; + filesystem.detectcallback:= detect_volumes; + storagemanagement.register_filesystem(filesystem); end; procedure read(volume : PStorage_volume; directory : pchar; byteCount : uint32; buffer : puint32); begin + end; procedure write(volume : PStorage_volume; directory : pchar; byteCount : uint32; buffer : puint32); begin + +end; + +procedure create_volume(disk : PStorage_Device; sectors : uint32; start : uint32); +begin + +end; + +function detect_volumes(disk : PStorage_Device) : APStorage_volume; +begin + end; end. \ No newline at end of file diff --git a/src/driver/storage/IDE.pas b/src/driver/storage/IDE.pas index f3abe7ce..7b1b9810 100644 --- a/src/driver/storage/IDE.pas +++ b/src/driver/storage/IDE.pas @@ -124,6 +124,7 @@ function load(ptr : void) : boolean; function identify_device(bus : uint8; drive : uint8) : TIdentResponse; procedure readPIO28(drive : uint8; LBA : uint32; sectorCount : uint8; buffer : puint32); procedure writePIO28(drive : uint8; LBA : uint32; sectorCount : uint8; buffer : Puint32); +//read/write must be capable of reading/writting any amknt of data upto disk size implementation diff --git a/src/driver/storage/storagemanagement.pas b/src/driver/storage/storagemanagement.pas index 5285dbc2..2e9b0faa 100644 --- a/src/driver/storage/storagemanagement.pas +++ b/src/driver/storage/storagemanagement.pas @@ -25,12 +25,17 @@ type TControllerType = (ControllerIDE, ControllerUSB, ControllerAHCI, ControllerNET); PStorage_volume = ^TStorage_Volume; + PStorage_device = ^TStorage_Device; PPIOHook = procedure(volume : PStorage_volume; directory : pchar; byteCount : uint32; buffer : puint32); + PPCreateHook = procedure(disk : PStorage_Device; sectors : uint32; start : uint32); + PPDetectHook = procedure(disk : PStorage_Device); TFilesystem = record sName : pchar; - writeCallback : PPIOHook; - readCallback : PPIOHook; + writeCallback : PPIOHook; + readCallback : PPIOHook; + createCallback : PPCreateHook; + detectCallback : PPDetectHook; end; TStorage_Volume = record @@ -50,7 +55,6 @@ type writable : boolean; volumes : array[0..255] of TStorage_Volume end; - PStorage_device = ^TStorage_Device; APStorage_Device = array[0..255] of PStorage_device; @@ -58,13 +62,12 @@ var storageDevices : array[0..255] of TStorage_Device; //index in this array is global drive id fileSystems : array[0..31] of TFilesystem; -//TODO need callback things for when new devices are connected procedure init(); procedure register_device(device : TStorage_Device); function get_all_devices() : APStorage_Device; -//procedure register_filesystem(filesystem : TFilesystem); +procedure register_filesystem(filesystem : TFilesystem); //procedure register_volume(volume : TStorage_Volume); @@ -106,6 +109,7 @@ begin if storageDevices[i].maxSectorCount = 0 then begin storageDevices[i]:= device; storageDevices[i].idx:= i; + //for all filesystems look for volumes break; end; end; @@ -124,4 +128,16 @@ begin get_all_devices:= devices; end; +procedure register_filesystem(filesystem : TFilesystem); +var + i : uint8; +begin + for i:= 0 to 31 do begin + if fileSystems[i].sName = nil then begin + fileSystems[i]:= filesystem; + break; + end; + end; +end; + end. \ No newline at end of file diff --git a/src/kernel.pas b/src/kernel.pas index 874ecc32..77dfce4c 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -35,8 +35,9 @@ uses USB, testdriver, E1000, - IDE, storagemanagement, - ipv4; + IDE, + storagemanagement; + //ipv4; procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall; @@ -83,20 +84,23 @@ var temp : uint32; atmp : puint32; - test : puint8; + test : puint8; begin multibootinfo:= mbinfo; multibootmagic:= mbmagic; - terminal.init(); - terminal.registerCommand('MEMINFO', @terminal_command_meminfo, 'Print Simple Memory Information.'); - terminal.registerCommand('BSOD', @terminal_command_bsod, 'Force a Panic Screen.'); - - drivermanagement.init(); - storagemanagement.init(); - console.init(); + console.writestringln('A'); + + + terminal.init(); + + console.writestringln('B'); + terminal.registerCommand('MEMINFO', @terminal_command_meminfo, 'Print Simple Memory Information.'); + + console.writestringln('C'); + terminal.registerCommand('BSOD', @terminal_command_bsod, 'Force a Panic Screen.'); console.writestringln('Booting Asuro...'); @@ -130,6 +134,9 @@ begin bios_data_area.init(); + drivermanagement.init(); + //storagemanagement.init(); + //asm INT 13 end; STI; isr32.hook(uint32(@bios_data_area.tick_update)); @@ -141,6 +148,7 @@ begin testdriver.init(); E1000.init(); IDE.init(); + //Nothing beyond here USB.init(); pci.init(); @@ -151,17 +159,6 @@ begin console.writestringln(''); console.setdefaultattribute(console.combinecolors(Green, Black)); console.writestringln('Asuro Booted Correctly!'); - console.writestringln(''); - console.setdefaultattribute(console.combinecolors(White, Black)); - console.writestring('Lower Memory = '); - console.writeint(multibootinfo^.mem_lower); - console.writestringln('KB'); - console.writestring('Higher Memory = '); - console.writeint(multibootinfo^.mem_upper); - console.writestringln('KB'); - console.writestring('Total Memory = '); - console.writeint(((multibootinfo^.mem_upper + 1000) div 1024) + 1); - console.writestringln('MB'); console.setdefaultattribute(console.combinecolors(White, Black)); console.writestringln(''); console.writestringln('Press any key to boot in to Asuro Terminal...'); diff --git a/src/pmemorymanager.pas b/src/pmemorymanager.pas index 6ee9e6c8..082b0e1d 100644 --- a/src/pmemorymanager.pas +++ b/src/pmemorymanager.pas @@ -114,6 +114,7 @@ begin force_alloc_block(0, 0); force_alloc_block(1, 0); force_alloc_block(2, 0); //First 12MiB reserved for Kernel/BIOS. + force_alloc_block(3, 0); console.output('PMM',' '); console.writeword(nPresent); console.writestringln('/1024 Block Available for Allocation.'); diff --git a/src/vmemorymanager.pas b/src/vmemorymanager.pas index 90047320..ace79c8f 100644 --- a/src/vmemorymanager.pas +++ b/src/vmemorymanager.pas @@ -97,6 +97,7 @@ begin map_page(KERNEL_PAGE_NUMBER + 0, 0); map_page(KERNEL_PAGE_NUMBER + 1, 1); map_page(KERNEL_PAGE_NUMBER + 2, 2); + map_page(KERNEL_PAGE_NUMBER + 3, 3); console.outputln('VMM','INIT END.'); end;