You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

231 lines
7.5 KiB

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
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 '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.