// Adress to dump ax, 7C2A // Address to print 7C47 // // #include "std_singos/string.h" #include "driver/disk.h" #define SPACE_MBR_RECORD 2048 // Sectors #define SPACE_VBR_RECORD 2048 // Sectors #define SIZE_FSCI_RECORD 1 // Sectors #define DEFAULT_ENTRY_SIZE 1 // Sectors #define SECTOR_SIZE 512 // BYTES #define NUMBER_OF_MBR_PARTITIONS 4 #define DEFAULT_FILE_SIZE 4 // This is in sectors #define DEFAULT_DATA_POINTER_SIZE 4 // This is in sectors #define DEFAULT_TABLE_SIZE 16 #define NUM_DATA_POINTERS 27 void dump_ax(input); void print_stack(argument); typedef struct Directory_Table Directory_Table; typedef struct struct_table_entry struct_table_entry; typedef struct struct_partition_control partition_control; typedef struct File_System_Control_Information FSCI; typedef struct meta_information_format mif; typedef struct tag_record tag_record; typedef struct lsfs_file lsfs_file; typedef enum Table_Entry_Kind { // These are specific values since, is has to corrospond to the implementation in assembly ENTRY_EMPTY = 0, ENTRY_FILE = 1, ENTRY_DIRECTORY = 2, } Table_Entry_Kind; int number_low; int selector; struct File_System_Control_Information { char filesystem_information[256]; long master_table_index[2]; long this_partition_offset_on_disk[2]; long next_free_sector[2]; long next_uniqe_id[2]; // both files and directories gets this. long next_sector_reuse_pointer[2]; long last_sector_index_on_partition[2]; long maximum_sectors_on_disk[2]; long sector_size_on_disk[2]; long not_used[48]; }; struct test { char* first; char* second; }; int argument; void print(argument); int main(selector, path, path_segment, fsci_lba_index) int path_segment; int fsci_lba_index; char path[256]; { // selectot should be a "selector" for which disk service // one wnats to use. // 0 should not be used, to try to ensure that a value has been set explicitly. int local_segment = 0x7e0; char* local_path = "Hello world\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; struct test my_struct; char *fs_info; char *hello = "LessSimpleFileSystem_Hello"; char *yes = "Read file: "; int nubmer; my_struct.first = hello; my_struct.second = yes; if (selector == 1) { // SERVICE: READ FILE FSCI fsci; print(my_struct.first); print(my_struct.second); //strcpy(local_path, local_segment, path, path_segment); print(local_path); fsci.master_table_index[0] = 42; nubmer = 0x55; //dump_ax(fsci.master_table_index[0]); //dump_ax(nubmer); //fsci_lba_index = 0x1000; fsci.filesystem_information[0] = 'i'; fsci.filesystem_information[1] = '\0'; dump_ax(fsci_lba_index); stub(fsci_lba_index, 1, &fsci, 0x8fc0); //fs_info = fsci.filesystem_information; //dump_ax(&fsci); print_stack(fsci.filesystem_information); dump_ax(fsci.master_table_index[0]); } else { print(my_struct.first); return 0; } return 0; } void print(argument) { #asm push bp mov bp,sp mov si,4[bp] call 0x0000:0x7C47 pop bp #endasm } void print_stack(argument) { #asm push bp mov bp,sp push ds push ax mov ax, ss mov ds, ax mov si,4[bp] call 0x0000:0x7C47 pop ax pop ds pop bp #endasm } dump_ax_return(input) void* input; { return input; } void dump_ax(input) void* input; { // Force the variable in ax dump_ax_return(input) #asm push bp mov bp,sp call 0x000:0x7C2A pop bp #endasm }