// 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);
|
|
|
|
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)
|
|
int path_segment;
|
|
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 *hello = "LessSimpleFileSystem";
|
|
char *yes = "Read file: ";
|
|
|
|
|
|
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] = 32;
|
|
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
|
|
}
|
|
|
|
dump_ax_return(input)
|
|
void* input;
|
|
{
|
|
return input;
|
|
}
|
|
|
|
void dump_ax(input)
|
|
void* input;
|
|
{
|
|
// Force the variable in ax
|
|
dump_ax_return(input)
|
|
#asm
|
|
call 0x000:0x7C2A
|
|
#endasm
|
|
}
|