3 changed files with 340 additions and 108 deletions
@ -0,0 +1,8 @@
|
||||
# Volume Boot Record |
||||
## For Less Simple FileSystem |
||||
|
||||
This is the standard volume boot record for LSFS. |
||||
For now it loads a kernel at /kernel/kernel.bin. The kernel will start in 16-bit at location 0x2500:0000 |
||||
|
||||
The first 2048 bloks in LSFS is reserved for the VBR, and have an implementation of LSFS integrated which knows just enogh to |
||||
load the kernel from the path "kernel/kernel.bin" (as default). |
@ -0,0 +1,236 @@
|
||||
ORG 0x7c00 |
||||
BITS 16 |
||||
%define DISK_SERVICE 0x0050:0x0000 |
||||
%define KERNEL 0x2500:0x0000 ;0x0050:0x0512 |
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
; 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 |
||||
|
||||
; 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 [global_disk_identifier], dl ; saving disk_identifier, this is the number the disk that we are booting from. |
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
; 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, [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 |
||||
|
||||
;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 |
||||
|
||||
; 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, [global_disk_identifier] |
||||
int 0x13 |
||||
|
||||
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 |
||||
xor bx, bx |
||||
mov al, 0x48 |
||||
mov ah, 0x0E |
||||
int 0x10 |
||||
|
||||
mov bx, [vbr_LBA_FSCI] |
||||
mov dl, [global_disk_identifier] |
||||
jmp KERNEL |
||||
|
||||
nop |
||||
cli |
||||
hlt |
||||
|
||||
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 ) |
||||
|
||||
|
||||
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 0 ;'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 "disk.out" |
||||
; By specification the max size can be 1MB of the compiled file. |
Loading…
Reference in new issue