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.
 
 

218 lines
5.9 KiB

ORG 0x7C00
BITS 16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Bootloader for SingOS
; version 0.1.0.10-exp
;
; Please edit the version number if any changes is made, the last number
; represent the build number.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cli
jmp long 0x0000:start
start:
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov [disk_identifier], dl
; initialize stack
; Set up 4K stack after this bootloader
; [Remember: Effective Address = Segment*16 + Offset]
mov ax, 0x7C0 ; Set 'ax' equal to the location of this bootloader divided by 16
add ax, 0x20 ; Skip over the size of the bootloader divided by 16
mov ss, ax ; Set 'ss' to this location (the beginning of our stack region)
mov sp, 8192 ; Set 'ss:sp' to the top of our 8K stack
sti
mov si, message ; Put address of the null-terminated string to output into 'si'
call print ; Call our string-printing routine
mov si, enter_debug_mode
call print
call printCRLF
%IF 0
; here goes wait call, for the user to enter debug mode.
; Wating for 2 seconds:
mov ah, 0x86 ; code for waiting interupt call
mov cx, 0x001e ; high count of microseconds
mov dx, 0x8480 ; low count
int 0x15
.busy_wait_for_key:
xor ax, ax
mov ah, 0x01 ; BIOS call to wait for key
int 0x16
jnz debug_mode
%ENDIF
; entering system check:
mov si, enter_system_check
mov si, sys_check_ok ; Put address of the null-terminated string to output into 'si'
call print ; Call our string-printing routine
mov si, boot_system ; Put address of the null-terminated string to output into 'si'
call print ; Call our string-printing routine
;This goes first as to now overwrite %ah and %al.
mov ax, 0x0050
mov es, ax ;Section to write into
mov ah, 0x2 ;Read sectors from drive
mov al, 0x08 ;Number of sectors to read (31 * 512 = 15872 bytes)
mov ch, 0x0 ;Low 8 bits of cylinder
mov cl, 0x11 ;First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
mov dh, 0x0 ;Head number
mov dl, [disk_identifier] ;Drive number
mov bx, 0x0000 ;Offset into section
int 0x13 ;Low level disk services
jnc notcarry
mov si, error_str
call print
jmp endcarrycheck
notcarry:
mov si, success_str
call print
call printCRLF
;call printCRLF
;mov ax, cs
;call dumpax
;mov ax, start
;call dumpax
;call printCRLF
mov dl, [disk_identifier]
xor ax, ax
mov al, dl
call dumpax
call printCRLF
mov ax, 0x50
mov ds, ax
mov ax, 89 ; lba adress
jmp 0x50:0x0000 ; Jump to the kernel
endcarrycheck:
cli ; Clear the Interrupt Flag (disable external interrupts)
hlt ; Halt the CPU (until the next external interrupt)
debug_mode:
mov si, .welcome_debug
call print
cli ; Clear the Interrupt Flag (disable external interrupts)
hlt
.welcome_debug db 'This is debug mode', 0
;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
printCRLF:
mov ah, 0xE
mov al, 13
int 0x10
mov al, 10
int 0x10
ret
; Routine for outputting string in 'si' register to screen
print:
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
cmp al, 0
je .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:
ret
data:
message db 'Bootloader for SingOS! v0.1.0.10-exp',13,10,0
enter_debug_mode db 'Press d to enter bootloader debug mode',13,10,0
enter_system_check db 'Performing system check:',13,10,0
sys_check_ok db 'System check ok', 13, 10, 0
boot_system db 'Read SingOS from disk', 13, 10, 0
error_str db 'Error', 0
success_str db 'Success', 0
disk_identifier db 0
; Pad to 510 bytes (boot sector size minus 2) with 0s, and finish with the two-byte standard boot signature
times 446-($-$$) db 0 ; First partion entry
db 0x80 ; active partition
db 0, 0x00, 0x17 ; First sector CHS
db 0x18 ; Disk type (Other) (Why 18, answer ':' ^ ')' )
db 0xff, 0xff, 0xff ; Ending CHS values
db 0x18, 0, 0, 0x00 ; Staring LBA
db 0, 0xff, 0xff, 0xff ; Size
db 0x00
db 0x0, 0x0, 0x0
db 0x0
db 0x0, 0x0, 0x0
db 0x00, 0x00, 0x00, 0x00
db 0x0, 0x00, 0x00, 0x00
times 478-($-$$) db 0 ; Third partion entry
times 494-($-$$) db 0 ; Forth partion entry
times 510-($-$$) db 0
dw 0xAA55 ; => 0x55 0xAA (little endian byte order)
; bootloder debug_mode goes here
times 8192-($-$$) db 0
; From Version 0.0.3 we are concatinate the bootloader and the kernel after compile time
;%include "kernel.nasm"
;times 8192-($-$$) db 0
;80
;00 01 00
;00
;3F 60 21
;00 00 00 00
;00 10 09 00
;00
;FE FF FF
;EF
;FE FF FF
;B0 0E 00 00
;40 03 00 00
;00
;00 00 00
;00
;00 00 00
;00 00 00 00
;00 00 00 00
;00
;00
;00 00 00 00
;00 00 00 00
;00 00 00