1 changed files with 258 additions and 0 deletions
@ -0,0 +1,258 @@ |
|||
ORG 0x7C00 |
|||
BITS 16 |
|||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|||
; SLRboot |
|||
; Bootloader for SingOS |
|||
; version 0.2.0.0-exp |
|||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|||
cli |
|||
mov [disk_identifier], dl |
|||
mov ax, 0x1000 |
|||
mov ss, ax |
|||
mov sp, 0xb000 |
|||
mov ax, 0 |
|||
mov ds, ax |
|||
mov es, ax |
|||
sti |
|||
mov si, 0x7c00 |
|||
mov di, 0x600 |
|||
mov cx, 0x200 |
|||
rep movsb |
|||
mov bx, relocated |
|||
sub bx, 0x7600 ; Calculate the offset. |
|||
push bx |
|||
retf ; Return far |
|||
;jmp long 0:bx |
|||
|
|||
relocated: |
|||
|
|||
mov si, message ; Put address of the null-terminated string to output into 'si' |
|||
call print ; Call our string-printing routine |
|||
|
|||
;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 |
|||
mov ah, 2 |
|||
mov al, 0x08 |
|||
mov bx, 0x7c00 |
|||
mov BYTE dl, [disk_identifier] |
|||
mov BYTE dh, [partition_2.start_CHS + 1] ;byte [si + 1] |
|||
mov BYTE cl, [partition_2.start_CHS + 2] |
|||
mov BYTE ch, [partition_2.start_CHS] ;First sector to read (bits 0-5), upper bits of cylinder (bits 6-7) |
|||
int 0x13 |
|||
;mov ax, 0x0 |
|||
;mov ds, ax |
|||
mov ax, 89 ; lba adress |
|||
jmp long 0x0:0x7c00 |
|||
|
|||
cli |
|||
hlt |
|||
|
|||
|
|||
%IF 1 |
|||
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 |
|||
|
|||
; 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 |
|||
|
|||
mov ax, 0x0 |
|||
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 |
|||
%ENDIF |
|||
; 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 'SLRboot for SingOS! v0.2.0.0-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 |
|||
partition_1: |
|||
.active_partition db 0x00 |
|||
.start_CHS db 0x00, 0x00, 0x11;0x20, 0x21, 0x00 |
|||
.disk_type db 0x83 |
|||
.end_CHS db 0x8C, 0x3D, 0x0F |
|||
.start_LBA db 0x00, 0x08, 0x00, 0x00 |
|||
.size db 0x00, 0xC8, 0x03, 0x00 |
|||
|
|||
partition_2: |
|||
.active_partition db 0x80 |
|||
.start_CHS db 0x8C, 0x3E, 0x0F |
|||
.disk_type db 0x83 |
|||
.end_CHS db 0xFF, 0xFF, 0xFF |
|||
.start_LBA db 0x00, 0xD0, 0x03, 0x00 |
|||
.size db 0x00, 0x28, 0x1C, 0x03 |
|||
|
|||
partition_3: |
|||
.active_partition db 0x00 |
|||
.start_CHS db 0x00, 0x00, 0x00 |
|||
.disk_type db 0x00 |
|||
.end_CHS db 0x00, 0x00, 0x00 |
|||
.start_LBA db 0x00, 0x00, 0x00, 0x00 |
|||
.size db 0x00, 0x00, 0x00, 0x00 |
|||
|
|||
partition_4: |
|||
.active_partition db 0x00 |
|||
.start_CHS db 0x00, 0x00, 0x00 |
|||
.disk_type db 0x00 |
|||
.end_CHS db 0x00, 0x00, 0x00 |
|||
.start_LBA db 0x00, 0x00, 0x00, 0x00 |
|||
.size db 0x00, 0x00, 0x00, 0x00 |
|||
|
|||
times 510-($-$$) db 0 |
|||
dw 0xAA55 ; => 0x55 0xAA (little endian byte order) |
|||
; bootloder debug_mode goes here |
|||
|
|||
times 8192-($-$$) db 0 |
|||
|
|||
|
|||
|
|||
; mov si, 0x7be |
|||
; cmp byte [si], al |
|||
; jne 0x33 |
|||
; add si, 0x10 |
|||
; cmp si, 0x7fe |
|||
; jne 0x24 |
|||
; jmp 0x49 |
|||
; mov ah, 2 |
|||
; mov al, 1 |
|||
; mov bx, 0x7c00 |
|||
; mov dl, 0x80 |
|||
; mov dh, byte [si + 1] |
|||
; mov cx, word [si + 2] |
|||
; int 0x13 |
|||
; jmp long 0:0x7c00 |
|||
|
|||
; jmp 0x49 |
Loading…
Reference in new issue