section .text org 0x7c00 start: mov ax, 0 mov ds, ax mov es, ax mov gs, ax mov fs, ax mov ax, 0x7e00 mov ss, ax mov sp, 256 mov bp, 256 mov si, dx ; save the origin disk number mov ax, 0x7c00 add ax, 446 ; ax now points to the start of the partition table xor di, di call initialize_video_mode .search_partition: mov bx, ax ; get the offset of the current entry add bx, 4 ; go to the offset of the partition type mov cl, [bx] cmp cl, 0x9d je .load_partition inc di ; leave and print debug message if the last partition entry ; did not provide the wanted bootloader - partition cmp di, 4 je .no_boot_partition add ax, 16 jmp .search_partition .load_partition: ; ax is the start of the bootloader's partition entry in the mbr ; read the chs-entry and push it onto the stack ; head xor dx, dx mov bx, ax add bx, 1 mov dl, [bx] push dx ; cylinder xor dx, dx mov bx, ax add bx, 3 mov dh, [bx] mov bx, ax add bx, 2 mov dl, [bx] shr dx, 6 push dx ; sector xor dx, dx mov bx, ax add bx, 2 mov dl, [bx] and dl, 0b00111111 push dx ; push the partition's length mov bx, ax add bx, 12 mov dx, [bx] push dx ; lower part mov bx, ax add bx, 14 mov dx, [bx] push dx ; higher part ; load it all and read from disk mov bx, sp add bx, 4 mov al, [bx] ; sector-count add bx, 2 mov cl, [bx] ; start-sector add bx, 2 mov ch, [bx] ; start-cylinder mov dx, si ; drive mov bx, 0x0800 mov es, bx ; output segment mov bx, sp add bx, 8 mov dh, [bx] ; start-head call .write_hex mov cl, 2 mov ah, 0x02 mov al, 1 mov bx, 0x0000 ; output address in es - segment int 13h mov cx, 8 mov si, 0x8000 mov dh, 12 mov dl, 32 call print_string jmp .keepalive .no_boot_partition: mov cx, LEN_TEXT_NO_BOOT_PARTITION mov si, error_texts.no_boot_partition mov dh, 12 mov dl, 32 call print_string .keepalive: jmp .keepalive .write_hex: push bx push cx mov bx, error_texts.hextab and cx, 0x0f add bx, cx mov cl, [bx] mov bx, error_texts.hexbuf inc bx mov [bx], cl mov bx, error_texts.hextab and cx, 0xf0 shr cx, 4 add bx, cx mov cl, [bx] mov bx, error_texts.hexbuf mov [bx], cl mov cx, 2 mov si, error_texts.hexbuf mov dh, 12 mov dl, 32 call print_string pop cx pop bx ret ; %include "exfat.asm" %include "gdt.asm" %include "utility.asm" LEN_TEXT_NO_BOOT_PARTITION equ 17 error_texts: .no_boot_partition: ;db "NO_BOOT_PARTITION" .hextab: db "0123456789abcdef" .hexbuf: resb 4 times 446 - ($-$$) db 0 db 0x80 db 0, 2, 0 db 0x9d db 0, 3, 0 dd 1 dd 1 times 510 - ($-$$) db 0 db 0x55 db 0xAA db "################"