|
|
@ -1,192 +1,196 @@ |
|
|
|
ORG 0x7c00 |
|
|
|
BITS 16 |
|
|
|
%define DISK_SERVICE 0x0050:0x0256 |
|
|
|
%define KERNEL 0x0050:0x0512 |
|
|
|
%define DISK_SERVICE 0x0050:0x0000 |
|
|
|
%define KERNEL 0x2500:0x0000 ;0x0050:0x0512 |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
jmp short vbr_lfsf |
|
|
|
nop ; Used later as a FLAG byte for extended INT 13 Disk Func.'s (See instruction at: 7CADh). |
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
; Disk description table, to make it a valid floppy |
|
|
|
; Note: some of these values are hard-coded in the source! |
|
|
|
; Values are those used by IBM for 1.44 MB, 3.5" diskette |
|
|
|
; NOTE(jakob): From MikeOS |
|
|
|
; Why do we need this... damn BIOS |
|
|
|
;times 71 - ($-$$) db 0 |
|
|
|
OEMLabel db "SingOs " ; Disk label |
|
|
|
; BytesPerSector dw 512 ; Bytes per sector |
|
|
|
; SectorsPerCluster db 1 ; Sectors per cluster |
|
|
|
; ReservedForBoot dw 1 ; Reserved sectors for boot record |
|
|
|
; NumberOfFats db 2 ; Number of copies of the FAT |
|
|
|
; RootDirEntries dw 224 ; Number of entries in root dir |
|
|
|
; ; (224 * 32 = 7168 = 14 sectors to read) |
|
|
|
; LogicalSectors dw 0x4000 ; Number of logical sectors |
|
|
|
; MediumByte db 0xF0 ; Medium descriptor byte |
|
|
|
; SectorsPerFat dw 9 ; Sectors per FAT |
|
|
|
; SectorsPerTrack dw 18 ; Sectors per track (36/cylinder) |
|
|
|
; Sides dw 2 ; Number of sides/heads |
|
|
|
; HiddenSectors dd 0 ; Number of hidden sectors |
|
|
|
; LargeSectors dd 0 ; Number of LBA sectors |
|
|
|
; DriveNo dw 0 ; Drive No: 0 |
|
|
|
; Signature db 0 ; Drive signature: 41 for floppy |
|
|
|
; VolumeID dd 0x00000000 ; Volume ID: any number |
|
|
|
; VolumeLabel db "SingOs "; Volume Label: any 11 chars |
|
|
|
; FileSystem db "VSFS " ; File system type: don't change! |
|
|
|
|
|
|
|
vbr_lfsf: |
|
|
|
; Volume Boot Record |
|
|
|
; This will start SingOS from the disk |
|
|
|
; The disk format has to be LessSimpleFileSystem |
|
|
|
; Loading /kernel/kernel.bin which should contain the kernel for the system |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
|
|
|
|
; Ensure that the data segment and extra segment is set to 0x00 |
|
|
|
mov ax, 0x00 |
|
|
|
mov ds, ax |
|
|
|
mov es, ax |
|
|
|
|
|
|
|
; loading essentials for SingOS to run |
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
; SYSTEM CALL TABLE STARTING AT POSITION 0x0050:0x0000 |
|
|
|
; To already support 64-bit, the entries is 64-bit |
|
|
|
; But in 16-bit, the adresses is only 16-bit |
|
|
|
; These are stored in the first 16-bits |
|
|
|
; There is reserved 2 sectors to the table witch means that we have room for |
|
|
|
; 128 System Calls |
|
|
|
; |----|----------------------------------------------------------------------------| |
|
|
|
; | 1 | Master Table| call [0x0050:0x0000] Pointer to the Master File Table | |
|
|
|
; |----|----------------------------------------------------------------------------| |
|
|
|
; | 2 | FILE SYSTEM | call [0x0050:0x0008] for arguments see under the file system | |
|
|
|
; |----|----------------------------------------------------------------------------| |
|
|
|
; | 3 | OS_LIB | call [0x0050:0x0016] for arguments see under the file system | |
|
|
|
; |----|----------------------------------------------------------------------------| |
|
|
|
; | 1 | FILE SYSTEM | call [0x0050:0x0000] for arguments see under the file system | |
|
|
|
; |----|----------------------------------------------------------------------------| |
|
|
|
; | 2 | OS_LIB | call [0x0050:0x0008] for arguments see under the file system | |
|
|
|
; |----|----------------------------------------------------------------------------| |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
|
|
|
|
mov [vbr_disk_identifier], dl ; saving disk_identifier, this is the number the disk that we are booting from. |
|
|
|
; This number is set by the bios |
|
|
|
|
|
|
|
xor ax, ax |
|
|
|
mov al, dl |
|
|
|
; Setup stack |
|
|
|
mov ax, 0x8fc0 |
|
|
|
mov ss, ax ; Set 'ss' to this location (the beginning of our stack region) |
|
|
|
mov sp, 0xffff ; Set 'ss:sp' to the top of our 8K stack |
|
|
|
mov bp, sp |
|
|
|
|
|
|
|
mov al, [vbr_disk_identifier] |
|
|
|
mov [global_disk_identifier], dl ; saving disk_identifier, this is the number the disk that we are booting from. |
|
|
|
|
|
|
|
mov [vbr_lba_position_at_disk], ax ; From the MBR we need information of where we are located at the disk. |
|
|
|
; If this fails, we could lookup our self, in the MBR where we are located. |
|
|
|
;mov ax, 0x50 |
|
|
|
;mov cs, ax |
|
|
|
;mov ds, ax |
|
|
|
;mov ax, 0x8fc0 |
|
|
|
;mov ss, ax ; Set 'ss' to this location (the beginning of our stack region) |
|
|
|
;mov sp, 0xffff ; Set 'ss:sp' to the top of our 8K stack |
|
|
|
;mov bp, sp |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
; The system has to support int13 bios extended system calls, otherwise is SingOS not supporting the hardware. |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
mov ah, 0x41 ;Set AH = 0x41 |
|
|
|
mov bx, 0x55aa ;BX = 0x55AA |
|
|
|
mov dl, [vbr_disk_identifier] ;DL = disk_id |
|
|
|
int 0x13 ;Issue an INT 0x13. |
|
|
|
jc .is_not_supported |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
; The system is suportted |
|
|
|
; We are now loading the filesystem |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
|
|
|
|
;mov WORD bx, [vbr_lba_position_at_disk] |
|
|
|
mov WORD [DAPACK.lba_addr_dw_low], 89 |
|
|
|
mov WORD [DAPACK.blkcnt], 0x08 ; Read to sectors, that is what the space is for the buffer in svim |
|
|
|
mov WORD [DAPACK.db_addr_segment], 0x50 |
|
|
|
mov WORD [DAPACK.db_addr_offset], 0x256 |
|
|
|
mov si, DAPACK ; address of "disk address packet" |
|
|
|
mov ah, 0x42 ; READ |
|
|
|
mov dl, [vbr_disk_identifier] |
|
|
|
int 0x13 |
|
|
|
;call dumpax |
|
|
|
;call DISK_SERVICE |
|
|
|
|
|
|
|
mov [vbr_disk_identifier], dl |
|
|
|
mov al, dl |
|
|
|
;call DISK_SERVICE |
|
|
|
|
|
|
|
;mov ax, 0 |
|
|
|
;mov ah, 0x10 |
|
|
|
;int 0x16 |
|
|
|
|
|
|
|
;mov ah, 0x0e |
|
|
|
;mov al, 66 ; backspace |
|
|
|
;int 0x10 ; print char |
|
|
|
|
|
|
|
;call DISK_SERVICE |
|
|
|
mov dl, [global_disk_identifier] ;DL = disk_id |
|
|
|
int 0x13 ;Issue an INT 0x13. |
|
|
|
jnc ext_disk_supported |
|
|
|
; The System does support exented read write |
|
|
|
mov si, vbr_lsfs_disk_error_msg |
|
|
|
call 0x00:tmp_print |
|
|
|
cli |
|
|
|
hlt |
|
|
|
|
|
|
|
;mov ax, 0 |
|
|
|
;mov ah, 0x10 |
|
|
|
;int 0x16 |
|
|
|
|
|
|
|
;mov ah, 0x0e |
|
|
|
;mov al, 66 ; backspace |
|
|
|
;int 0x10 ; print char |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
; The disk service is now loaded. |
|
|
|
; Now we are going to load the Master table. |
|
|
|
; |
|
|
|
; We are now loading the filesystem |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
;Routine for printing a 'ax' as hex |
|
|
|
;tmp_dumpax: |
|
|
|
;pusha ; save registers |
|
|
|
;mov bx, ax |
|
|
|
;mov ah, 0xE ; Teletype output |
|
|
|
|
|
|
|
;mov cx, 4 ; 4 nipples in a 16 bit word |
|
|
|
;.loop: |
|
|
|
;rol bx, 4 ; rotate to next nipple |
|
|
|
;mov al, bl ; we copy to al because we need to mask only the low 4 bits |
|
|
|
;and al, 1111b ; Do the masking |
|
|
|
;add al, '0' ; convert to ASCII |
|
|
|
;cmp al, '9' ; If we are greater than 9 ascii, we add 7 to make digit 10 be represented as 'A' |
|
|
|
;jbe .skip ; -|- |
|
|
|
;add al, 7 ; -|- |
|
|
|
;.skip: ; -|- |
|
|
|
;int 0x10 ; BIOS call 'output' |
|
|
|
;loop .loop |
|
|
|
|
|
|
|
;popa ; restore registers |
|
|
|
;retf |
|
|
|
|
|
|
|
tmp_print: |
|
|
|
; Prints string in si |
|
|
|
; IN si: zero terminated string to print |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
;mov ax, 0x7e55 |
|
|
|
;mov ax, si |
|
|
|
;call 0x00:tmp_dumpax |
|
|
|
mov ah, 0xE ; Specify 'int 0x10' 'teletype output' function |
|
|
|
; [AL = Character, BH = Page Number, BL = Colour (in graphics mode)] |
|
|
|
.printchar: |
|
|
|
lodsb ; Load byte at address SI into AL, and increment SI |
|
|
|
test al, al |
|
|
|
jz .done ; If the character is zero (NUL), stop writing the string |
|
|
|
int 0x10 ; Otherwise, print the character via 'int 0x10' |
|
|
|
jmp .printchar ; Repeat for the next character |
|
|
|
.done: |
|
|
|
retf |
|
|
|
|
|
|
|
mov WORD [DAPACK.lba_addr_dw_low], 97 |
|
|
|
mov WORD [DAPACK.blkcnt], 0x1f |
|
|
|
mov WORD [DAPACK.db_addr_segment], 0x50 |
|
|
|
mov WORD [DAPACK.db_addr_offset], 0x0512 |
|
|
|
; loading essentials for SingOS to run |
|
|
|
; starting by loading the rest of the VBR: |
|
|
|
ext_disk_supported: |
|
|
|
mov si, vbr_message |
|
|
|
call 0x00:tmp_print |
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
; The system is suportted |
|
|
|
; We are now loading the kernel "/kernel/kernel.bin" |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
|
|
|
|
; INPUT |
|
|
|
; ax = sector index for the FSCI that has to be loaded. |
|
|
|
; bx = segment |
|
|
|
;mov ax, [vbr_LBA_FSCI] |
|
|
|
;mov bx, 0x00 |
|
|
|
;call lsfs_load_fsci_info; |
|
|
|
|
|
|
|
;INPUT |
|
|
|
; ax = filename |
|
|
|
; bx = pointer to buffer |
|
|
|
; cx = buffer_size |
|
|
|
; dx = offset in file |
|
|
|
; es = segment to read in data |
|
|
|
;call lsfs_read_file |
|
|
|
; RETURN |
|
|
|
; ax preserved |
|
|
|
; bx preserved |
|
|
|
; cx preserved |
|
|
|
; dx data read |
|
|
|
; es = remember to restore es if this has to be saved. |
|
|
|
|
|
|
|
mov ax, [vbr_LBA_address] |
|
|
|
inc ax |
|
|
|
mov dl, [global_disk_identifier] |
|
|
|
mov WORD [DAPACK.lba_addr_dw_low], ax |
|
|
|
mov WORD [DAPACK.blkcnt], 0x10 |
|
|
|
mov WORD [DAPACK.db_addr_segment], 0x7e0 |
|
|
|
mov WORD [DAPACK.db_addr_offset], 0x00 |
|
|
|
mov si, DAPACK ; address of "disk address packet" |
|
|
|
mov ah, 0x42 ; READ |
|
|
|
mov dl, [vbr_disk_identifier] |
|
|
|
mov dl, [global_disk_identifier] |
|
|
|
int 0x13 |
|
|
|
|
|
|
|
;call dumpax |
|
|
|
|
|
|
|
|
|
|
|
xor ax, ax |
|
|
|
mov dl, [vbr_disk_identifier] |
|
|
|
mov al, dl |
|
|
|
;call dumpax |
|
|
|
|
|
|
|
mov dl, [vbr_disk_identifier] |
|
|
|
|
|
|
|
jmp KERNEL |
|
|
|
mov cx, [vbr_LBA_FSCI] |
|
|
|
mov bx, ds |
|
|
|
mov ax, 0x1 |
|
|
|
push cx |
|
|
|
push bx |
|
|
|
push ax |
|
|
|
mov cx, 0x7e0 |
|
|
|
mov ds, cx |
|
|
|
mov es, cx |
|
|
|
call 0x7e0:0x00 |
|
|
|
add sp, 0x6 ; skip the paramerts |
|
|
|
mov cx, 0x0 |
|
|
|
mov ds, cx |
|
|
|
mov es, cx |
|
|
|
|
|
|
|
; Set the Parameter_Struct |
|
|
|
mov ax, lsfs_path |
|
|
|
mov [Parameter_Struct.path], ax |
|
|
|
mov WORD [Parameter_Struct.buffer_segment], 0x50 |
|
|
|
mov WORD [Parameter_Struct.buffer_address], 0x00 |
|
|
|
mov WORD [Parameter_Struct.buffer_size], 0xFFFF |
|
|
|
mov WORD [Parameter_Struct.byte_offset_into_file], 0x00 |
|
|
|
|
|
|
|
mov cx, Parameter_Struct |
|
|
|
mov bx, ds |
|
|
|
mov ax, 0x2 |
|
|
|
push cx |
|
|
|
push bx |
|
|
|
push ax |
|
|
|
mov cx, 0x7e0 |
|
|
|
mov ds, cx |
|
|
|
mov es, cx |
|
|
|
call 0x7e0:0x00 |
|
|
|
add sp, 0x6 ; skip the paramerts |
|
|
|
mov cx, 0x0 |
|
|
|
mov ds, cx |
|
|
|
mov es, cx |
|
|
|
|
|
|
|
; Set the Parameter_Struct |
|
|
|
mov ax, kernel_path |
|
|
|
mov [Parameter_Struct.path], ax |
|
|
|
mov WORD [Parameter_Struct.buffer_segment], 0x2500 |
|
|
|
mov WORD [Parameter_Struct.buffer_address], 0x00 |
|
|
|
mov WORD [Parameter_Struct.buffer_size], 0xFFFF |
|
|
|
mov WORD [Parameter_Struct.byte_offset_into_file], 0x00 |
|
|
|
|
|
|
|
mov cx, Parameter_Struct |
|
|
|
mov bx, ds |
|
|
|
mov ax, 0x2 |
|
|
|
push cx |
|
|
|
push bx |
|
|
|
push ax |
|
|
|
mov cx, 0x7e0 |
|
|
|
mov ds, cx |
|
|
|
mov es, cx |
|
|
|
call 0x7e0:0x00 |
|
|
|
add sp, 0x6 ; skip the paramerts |
|
|
|
mov cx, 0x0 |
|
|
|
mov ds, cx |
|
|
|
mov es, cx |
|
|
|
|
|
|
|
|
|
|
|
; ready to jump to the kernel |
|
|
|
mov bx, [vbr_LBA_FSCI] |
|
|
|
mov dl, [global_disk_identifier] |
|
|
|
jmp KERNEL |
|
|
|
|
|
|
|
nop |
|
|
|
cli |
|
|
|
hlt |
|
|
|
|
|
|
|
.is_not_supported: |
|
|
|
; The System does support exented read write |
|
|
|
mov si, lsfs_disk_error_msg |
|
|
|
;call print |
|
|
|
|
|
|
|
;Routine for printing a 'ax' as hex |
|
|
|
dumpax: |
|
|
|
pusha ; save registers |
|
|
|
mov bx, ax |
|
|
|
mov ah, 0xE ; Teletype output |
|
|
|
|
|
|
|
mov cx, 4 ; 4 nipples in a 16 bit word |
|
|
|
.loop: |
|
|
|
rol bx, 4 ; rotate to next nipple |
|
|
|
mov al, bl ; we copy to al because we need to mask only the low 4 bits |
|
|
|
and al, 1111b ; Do the masking |
|
|
|
add al, '0' ; convert to ASCII |
|
|
|
cmp al, '9' ; If we are greater than 9 ascii, we add 7 to make digit 10 be represented as 'A' |
|
|
|
jbe .skip ; -|- |
|
|
|
add al, 7 ; -|- |
|
|
|
.skip: ; -|- |
|
|
|
int 0x10 ; BIOS call 'output' |
|
|
|
loop .loop |
|
|
|
|
|
|
|
popa ; restore registers |
|
|
|
ret |
|
|
|
|
|
|
|
|
|
|
|
vbr_disk_identifier db 0 |
|
|
|
vbr_lba_position_at_disk dw 0 |
|
|
|
lsfs_disk_error_msg db 'The system does not support disk operations,', 13, 10, 0 |
|
|
|
|
|
|
|
DAPACK: |
|
|
|
.dap_Size: db 0x10 ; This is always 16 bytes (0x10) |
|
|
|
.rev_byte: db 0x0 ; reserved byte, should always be zero |
|
|
@ -196,97 +200,32 @@ DAPACK: |
|
|
|
.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 ) |
|
|
|
|
|
|
|
times 4096-($-$$) db 0 |
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
; HERE START THE FILE SYSTEM |
|
|
|
; This is the Master Table |
|
|
|
; This is the fixed entries when the system is compilet |
|
|
|
; DEFAULT SIZE IS 64 FILES |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
|
|
|
|
; Entry one: |
|
|
|
;.filename: |
|
|
|
db 'LSFS v0.1.4-exp', 13, 10, '(LessSimpelFileSystem)', 13, 10, 'Developed to SingOS', 13, 10, 'by Jorn Guldberg', 13, 10, 0 ; 66 chars + 8 bytes |
|
|
|
times 175 db 0 ; 256 bytes file system informaiton |
|
|
|
dw 24, 0x00, 0x00, 0x00 ; offset on disk asb LBA address |
|
|
|
dw 23, 0x00, 0x00, 0x00 ; offset on disk asb LBA address |
|
|
|
dw 2306, 0x00, 0x00, 0x00 ; Next free LBA partition index free |
|
|
|
dw 0x04, 0x00, 0x00, 0x00 ; Next free uniqe ID |
|
|
|
dw 0x00, 0x00, 0x00, 0x00 ; next_sector_reuse_pointer |
|
|
|
dw 0xff, 0xff, 0xff, 0xff ; last_sector_index_on_partition |
|
|
|
dw 0x00, 0x00, 0x00, 0x00 ; sectors_size_on_disk |
|
|
|
times 200 db 0 |
|
|
|
|
|
|
|
;db 'File_System_Control_information', 0 |
|
|
|
;times 224 db 0 |
|
|
|
;.file_id: |
|
|
|
;dw 0x0, 0x0, 0x0, 0x00 ; 64-bits |
|
|
|
;.file_size |
|
|
|
;dw 512, 0x0, 0x0, 0x0 ; 64-bits Should be the actual number of bytes. |
|
|
|
;.ext_file_data 64-bits (Extended data about the file, timestamps etc.) |
|
|
|
;dw 0x0, 0x0, 0x0, 0x0 |
|
|
|
;control_bits 64-bits |
|
|
|
;dw 0x0, 0x0, 0x0, 0x0 |
|
|
|
;.file_data_pointers |
|
|
|
;dw 88, 0x0, 0x0, 0x0 |
|
|
|
;times 216 db 0 |
|
|
|
|
|
|
|
; Entry Two: |
|
|
|
db 'LessSimpelFileSystem.module', 0 |
|
|
|
times 228 db 0 |
|
|
|
;.file_id: |
|
|
|
dw 0x01, 0x0, 0x0, 0x0 |
|
|
|
;.file_size |
|
|
|
dw 4096, 0x0, 0x0, 0x0 |
|
|
|
;.ext_file_data 64-bits (Extended data about the file, timestamps etc.) |
|
|
|
dw 0x0, 0x0, 0x0, 0x0 |
|
|
|
;control_bits 32-bits |
|
|
|
db 0x0, 0x0, 0x0, 0x0 |
|
|
|
|
|
|
|
; entry kind |
|
|
|
db 0x1 ; 1 is file |
|
|
|
|
|
|
|
db 0x0, 0x0, 0x0 |
|
|
|
;.file_data_pointers |
|
|
|
dw 89, 0x0, 0x0, 0x0 |
|
|
|
times 216 db 0 |
|
|
|
|
|
|
|
; Entry Three: |
|
|
|
db 'kernel', 0 |
|
|
|
times 249 db 0 |
|
|
|
;.file_id: |
|
|
|
dw 0x02, 0x0, 0x0, 0x0 |
|
|
|
;.file_size |
|
|
|
dw 0x00, 0x10, 0x0, 0x0 |
|
|
|
;.ext_file_data 64-bits (Extended data about the file, timestamps etc.) |
|
|
|
dw 0x0, 0x0, 0x0, 0x0 |
|
|
|
;control_bits 32-bits |
|
|
|
db 0x0, 0x0, 0x0, 0x0 |
|
|
|
; entry kind |
|
|
|
db 0x1 ; 1 is file |
|
|
|
db 0x0, 0x0, 0x0 |
|
|
|
;.file_data_pointers |
|
|
|
dw 97, 0x0, 0x0, 0x0 |
|
|
|
times 216 db 0 |
|
|
|
|
|
|
|
; Entry Three: |
|
|
|
db 'First_Folder', 0 |
|
|
|
times 243 db 0 |
|
|
|
;.file_id: |
|
|
|
dw 0x03, 0x0, 0x0, 0x0 |
|
|
|
;.file_size |
|
|
|
dw 0x20, 0x00, 0x0, 0x0 |
|
|
|
;.ext_file_data 64-bits (Extended data about the file, timestamps etc.) |
|
|
|
dw 0x0, 0x0, 0x0, 0x0 |
|
|
|
;control_bits 32-bits |
|
|
|
db 0x0, 0x0, 0x0, 0x0 |
|
|
|
; entry kind |
|
|
|
db 0x2 ; 1 is folder |
|
|
|
db 0x0, 0x0, 0x0 |
|
|
|
;.file_data_pointers |
|
|
|
dw 0x0, 0x0, 0x0, 0x0 |
|
|
|
times 216 db 0 |
|
|
|
|
|
|
|
|
|
|
|
times 4096 + (32768-($-$$)) db 0 |
|
|
|
Parameter_Struct: |
|
|
|
.path dw 0x00 ; char* |
|
|
|
.new_path dw 0x00 ; char* |
|
|
|
.buffer_segment dw 0x00 ; int |
|
|
|
.buffer_address dw 0x00 ; int |
|
|
|
.buffer_size dw 0x00 ; int |
|
|
|
.data_length dw 0x00 ; int |
|
|
|
.byte_offset_into_file dw 0x00 ; int |
|
|
|
.entry_kind dw 0x00 ; Table_Entry_Kind |
|
|
|
|
|
|
|
|
|
|
|
global_disk_identifier db 0 |
|
|
|
vbr_message db 'VBR: Less Simple File System', 13, 10, 'Loading system', 13, 10, 0 |
|
|
|
vbr_lsfs_disk_error_msg db 'The system does not support disk operations', 0 |
|
|
|
lsfs_path db '/kernel/utils/lsfs.bin', 0 |
|
|
|
kernel_path db '/kernel/kernel.bin', 0 |
|
|
|
|
|
|
|
times 446-($-$$) db 0 |
|
|
|
vbr_size_in_bytes dw 0x00, 0x00, 0x00, 0x00 ; size of the VBR in secotrs (Such that we can load the rest of the VBR) |
|
|
|
vbr_LBA_address dw 0x00, 0x00, 0x00, 0x00 ; Abselout LBA adress of this VBR, such that we know where to find the FSCI (offset 1MB) |
|
|
|
vbr_LBA_FSCI dw 0x00, 0x00, 0x00, 0x00 |
|
|
|
times 510-($-$$) db 0 |
|
|
|
dw 0x1818; Signature, homemade, sshould it be 0xAA55? |
|
|
|
|
|
|
|
; rest of VBR, which has to be loaded in the first part of the VBR |
|
|
|
;%include "filesystems/lsfs/lsfs.nasm" |
|
|
|
incbin "../lsfs_16-bit/disk.out" |
|
|
|
; By specification the max size can be 1MB of the compiled file. |