diff --git a/slrboot.nasm b/slrboot.nasm index 74dc114..87e7ffe 100644 --- a/slrboot.nasm +++ b/slrboot.nasm @@ -32,18 +32,86 @@ relocated: mov si, message ; Put address of the null-terminated string to output into 'si' call print ; Call our string-printing routine -mov bx, [partition_1.start_LBA] +; Check for more than one active partition that we can start from. +xor bx, bx +xor cx, cx +mov ax, [partition_1.active_partition] +call dumpax +cli +hlt +cmp ax, 0x80 +jne check_p_2 +mov bx, 0x01 ; Partion 1 active +inc cx + +check_p_2: +mov ax, [partition_2.active_partition] +cmp ax, 0x80 +jne check_p_3 +inc cx +mov bx, 0x02 ; Partion 2 active + +check_p_3: +mov ax, [partition_3.active_partition] +cmp ax, 0x80 +jne check_p_4 +inc cx +mov bx, 0x03 ; Partion 3 active + +check_p_4: +mov ax, [partition_4.active_partition] +cmp ax, 0x80 +jne eval_active_partion_number +inc cx +mov bx, 0x04 ; Partion 4 active + +eval_active_partion_number: +cmp cx, 1 +je boot_partition: +; 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 + +mov bx, 1 + +boot_partition: +; IMPORTANT bx, has to hold the value 1-4 for the partiotion that wanted to be booted. + + +mov ax, partition_1 +.loop: + cmp bx, 1 + je break + add ax, 0x10 + dec bx + jmp .loop +break: + +add ax, 7 ; This is the offset to fetch the LBA start adress of the partition record + +mov bx, [ax] ; first part of LBA mov WORD [DAPACK.lba_addr_dw_low], bx -mov bx, [partition_1.start_LBA + 1] +inc ax ; next part +mov bx, [ax] mov WORD [DAPACK.lba_addr_dw_low + 1], bx -mov bx, [partition_1.start_LBA + 2] +inc ax ; next part +mov bx, [ax] mov WORD [DAPACK.lba_addr_dw_low + 2], bx -mov bx, [partition_1.start_LBA + 3] +inc ax ; next part +mov bx, [ax] mov WORD [DAPACK.lba_addr_dw_low + 3], bx mov WORD [DAPACK.blkcnt], 0x01 mov WORD [DAPACK.db_addr_segment], 0x0000 mov WORD [DAPACK.db_addr_offset], 0x7c00 -mov si, DAPACK ; address of "disk address packet" +mov si, DAPACK ; address of "disk address packet" +xor ax, ax mov ah, 0x42 ; READ mov dl, [disk_identifier] int 0x13 @@ -194,8 +262,10 @@ message db 'SLRboot for SingOS! v0.2.0.3-exp',13,10,0 ;boot_system db 'Read SingOS from disk', 13, 10, 0 ;error_str db 'Error', 0 ;success_str db 'Success', 0 +boot_this_partition: dw 0 disk_identifier db 0 + DAPACK: .dap_Size: db 0x10 ; This is always 16 bytes (0x10) .rev_byte: db 0x0 ; reserved byte, should always be zero @@ -217,7 +287,7 @@ partition_1: .size db 0x00, 0xC8, 0x03, 0x00 partition_2: -.active_partition db 0x00 +.active_partition db 0x80 .start_CHS db 0x8C, 0x3E, 0x0F .disk_type db 0x83 .end_CHS db 0xFF, 0xFF, 0xFF