aboutsummaryrefslogtreecommitdiffstats
path: root/src/boot.stage1.asm
blob: c5bab26a3179c229cb45a7018d06fdfa59e39499 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    ;; boot.stage1.asm

    %include "boot.common.asm"
    %include "boot.stage1.print.asm"
    [org 0x7c00]    
    [bits 16]

    %define READ_SECTORS_NUM 64
    %define BOOT_LOAD_ADDR 0x7c00
    %define SECTOR_SIZE 512

    entry _start

_start: 
    ;; Disable interrupts
    cli                         

    ;; Setup segment registers
    xor ax, ax
    mov ds, ax
    mov es, ax  
    mov ss, ax

    ;; Adjust Stack
    mov sp, _start

    mov si, [disk_addr_packet]
    mov ah, 0x42                ; BIOS extended read function
    mov dl, 0x80                ; Drive number
    int 0x13                    ; BIOS disk services
    jc _disk_read_err
    
    jmp 0x0000:0x7e00

_disk_read_err: 
    hlt
    jmp _disk_read_err

_end:
    hlt 
    jmp _end

disk_read_err_msg: db "Failed to read disk", 13, 10, 0
disk_read_success_msg: db "Read the disk successfully", 13, 10, 0
disk_addr_packet:  
    db 0x10 
    db 0x0
DAP_sectors_num:    
    dw READ_SECTORS_NUM         ; Number of read sectors
    dd (BOOT_LOAD_ADDR + SECTOR_SIZE) ; Destination address
    dq 1                              ; First sector after the boot sector

    ;; Padding and magic number
    times 510 - ($ - $$) db 0
    dw 0xaa55