From b45ac1b6ca3409b37a2250cf7793ab1056806412 Mon Sep 17 00:00:00 2001 From: Rhodez-x Date: Fri, 14 Dec 2018 14:10:57 +0100 Subject: [PATCH] Clean up - and correct detection handling of multiple active partitions --- slrboot.bin | Bin 8192 -> 8192 bytes slrboot.nasm | 159 ++++++++++----------------------------------------- 2 files changed, 30 insertions(+), 129 deletions(-) diff --git a/slrboot.bin b/slrboot.bin index 1e81093ba69582847fbf08eb231094f5a4c84ccf..6f6c217941503e3852a640be7912f9ac461f3518 100644 GIT binary patch delta 312 zcmZp0XmFSyRo_tidmls1eg?Lk42++b?l!Dxe9cf6e0ZN&?TgC{hPMq*F5FjZ(@@H? zn~}kB;W;qVaW@mg!h29AGsA*+wYCimrEHG7Sr~qOY5vJrBCw@xryRqshL*FUh6lDV zo)z1%ueSL&V+mXH0RivVUz-nbbRIT5(9OQMv)1i}8$YZ+?xHP!;naOx6ks68uO#Fh4np@snnetp?jQTxIOL?_k0(3*HriDLurS%D2) zX9XsH(C{(UO|2;4rZqJWocaxJ6dWC5nQ$@>@u7#lX9XEc-p08CU$-2eap diff --git a/slrboot.nasm b/slrboot.nasm index 5d7b53f..19f844a 100644 --- a/slrboot.nasm +++ b/slrboot.nasm @@ -3,7 +3,7 @@ BITS 16 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SLRboot ; Bootloader for SingOS -; version 0.2.0.3-exp +; version 0.2.1.0-exp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cli jmp long 0x0000:start @@ -36,34 +36,36 @@ call print ; Call our string-printing routine xor bx, bx xor cx, cx mov ax, [partition_1.active_partition] -cmp ax, 0x80 +cmp al, 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 +cmp al, 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 +cmp al, 0x80 jne check_p_4 inc cx mov bx, 0x03 ; Partion 3 active check_p_4: -mov ax, [partition_4.active_partition] +mov al, [partition_4.active_partition] cmp ax, 0x80 jne eval_active_partion_number inc cx mov bx, 0x04 ; Partion 4 active - +cli +hlt 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: @@ -76,18 +78,14 @@ xor ax, ax mov ah, 0x01 ; BIOS call to wait for key int 0x16 - boot_partition: ; IMPORTANT bx, has to hold the value 1-4 for the partiotion that wanted to be booted. -mov bx, 2 - mov ax, partition_1 .loop: cmp bx, 1 je break add ax, 0x10 - ;call dumpax dec bx jmp .loop break: @@ -102,7 +100,6 @@ add bx, 2 ; next part mov ax, [bx] mov WORD [DAPACK.lba_addr_dw_low + 1], ax call dumpax - mov WORD [DAPACK.blkcnt], 0x01 mov WORD [DAPACK.db_addr_segment], 0x0000 mov WORD [DAPACK.db_addr_offset], 0x7c00 @@ -112,109 +109,28 @@ mov ah, 0x42 ; READ mov dl, [disk_identifier] int 0x13 +jc endcarrycheck ; An error ocurred when reading from disk. + +; If no error then jump to volume boot record +notcarry: jmp long 0x0:0x7c00 cli hlt - -%IF 0 -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 - +; If we did not suceed to read from disk endcarrycheck: +mov si, error_str +call print cli ; Clear the Interrupt Flag (disable external interrupts) hlt ; Halt the CPU (until the next external interrupt) debug_mode: -mov si, .welcome_debug +mov si, welcome_debug call print cli ; Clear the Interrupt Flag (disable external interrupts) hlt -.welcome_debug db 'This is debug mode', 0 - -printCRLF: -mov ah, 0xE -mov al, 13 -int 0x10 -mov al, 10 -int 0x10 -ret -%ENDIF - ;Routine for printing a 'ax' as hex dumpax: pusha ; save registers @@ -237,6 +153,14 @@ 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 @@ -251,13 +175,10 @@ jmp .printchar ; Repeat for the next character ret data: -message db 'SLRboot for SingOS! v0.2.0.3-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 +message db 'SLRboot for SingOS! v0.2.1.0-exp',13,10,0 +enter_debug_mode db 'Press d to enter bootloader debug mode',13,10,0 +welcome_debug db 'Debug mode v.0.0.1:',13,10,0 +error_str db 'Error', 0 boot_this_partition: dw 0 disk_identifier db 0 @@ -283,7 +204,7 @@ partition_1: .size db 0x00, 0xC8, 0x03, 0x00 partition_2: -.active_partition db 0x80 +.active_partition db 0x00 .start_CHS db 0x8C, 0x3E, 0x0F .disk_type db 0x83 .end_CHS db 0xFF, 0xFF, 0xFF @@ -310,24 +231,4 @@ 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 +times 8192-($-$$) db 0 \ No newline at end of file