From a5ac220a121f213834d8cdbae9917be164d3d411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rn=20Guldberg?= Date: Mon, 24 Jun 2019 13:04:23 +0200 Subject: [PATCH] First commit: files added, very first step on first edition c std-lib, and the lsfs implemenation --- build.sh | 6 +++ driver/disk.h | 33 ++++++++++++ main.c | 129 ++++++++++++++++++++++++++++++++++++++++++++ std_singos/string.h | 54 +++++++++++++++++++ 4 files changed, 222 insertions(+) create mode 100644 build.sh create mode 100644 driver/disk.h create mode 100644 main.c create mode 100644 std_singos/string.h diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..ff5e461 --- /dev/null +++ b/build.sh @@ -0,0 +1,6 @@ +bcc -S main.c +echo -e "jmp _main\n$(cat main.s)" > main.s +sed -i '/.globl ___mkargv/d' ./main.s +sed -i '/.globl _environ/d' ./main.s +sed -i '/.data/d' ./main.s +as86 -b disk.out main.s diff --git a/driver/disk.h b/driver/disk.h new file mode 100644 index 0000000..84e1af5 --- /dev/null +++ b/driver/disk.h @@ -0,0 +1,33 @@ + +int disk_service_read_data_from_disk(index, file_block_size, data_buffer, data_buffer_segment) +long* index; +long file_block_size; +void* data_buffer; +int data_buffer_segment; +{ + //fseek ( disk, (index * SECTOR_SIZE ), SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. + //int read = fread(data_buffer, 1, (file_block_size * SECTOR_SIZE), disk); + //return read; + #asm + lsfs_load_data: + mov dl, [global_disk_identifier] + mov WORD [DAPACK.lba_addr_dw_low], ax + mov WORD [DAPACK.blkcnt], 0x01 + mov WORD [DAPACK.db_addr_segment], bx + mov WORD [DAPACK.db_addr_offset], FSCI + mov si, DAPACK ; address of "disk address packet" + mov ah, 0x42 ; READ + mov dl, [global_disk_identifier] + int 0x13 + + DAPACK: + .dap_Size: db 0x10 ; This is always 16 bytes (0x10) + .rev_byte: db 0x0 ; reserved byte, should always be zero + .blkcnt: dw 0x0 ; int 13 resets this to # of blocks actually read/written + .db_addr_offset: dw 0x0 ; memory buffer destination address (0:7c00) + .db_addr_segment: dw 0x0 ; in memory page zero + .lba_addr_dw_low: dd 0x0 ; put the lba to read in this spot + .lba_addr_dw_high: dd 0x0 ; more storage bytes only for big lba's ( > 4 bytes ) + #endasm + +} \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..d7521e7 --- /dev/null +++ b/main.c @@ -0,0 +1,129 @@ +// 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 +} diff --git a/std_singos/string.h b/std_singos/string.h new file mode 100644 index 0000000..7a3c49c --- /dev/null +++ b/std_singos/string.h @@ -0,0 +1,54 @@ +void strcpy (destination, destination_segment, source, source_segment ); + +void strcpy (destination, destination_segment, source, source_segment ) +char *destination; +int destination_segment; +char *source; +int source_segment; +{ + #asm + ; copy two strings + ; IN si: the first (zero terminated) string + ; IN di: the second (zero terminated) string + ; OUT SF and ZF (same semantics as cmp) + + #define DESTINATION 4[bp]; + #define DESTINATION_SEGMENT 6[bp]; + #define SOURCE 8[bp]; + #define SOURCE_SEGMENT 10[bp]; + + push bp + mov bp,sp + stringcompare: + push ax + push bx + push di + push es + push si + push ds + mov ax, DESTINATION; + mov di, ax + mov ax, DESTINATION_SEGMENT; + mov es, ax + mov ax, SOURCE; + mov si, ax + mov ax, SOURCE_SEGMENT; + mov ds, ax + mov cx, 0x050 + .loop: + movsb + cmp cx, 0x0 + je .end + dec cx + jmp .loop + .end: + pop ds + pop si + pop es + pop di + pop bx + pop ax + pop bp + + #endasm +}