-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathboot.asm
More file actions
144 lines (121 loc) · 2.05 KB
/
Copy pathboot.asm
File metadata and controls
144 lines (121 loc) · 2.05 KB
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
; boot.asm - Simple 16-bit bootloader
[org 0x7c00]
bits 16
KERNEL_LOAD_ADDR equ 0x8000
KERNEL_SECTOR equ 2
KERNEL_SECTORS equ 20
start:
cli
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
sti
mov [boot_drive], dl
mov si, msgLoading
call print_string
; Reset disk
mov ah, 0
mov dl, [boot_drive]
int 0x13
; Check LBA
mov ah, 0x41
mov bx, 0x55AA
mov dl, [boot_drive]
int 0x13
jc use_chs
; LBA Read
mov ah, 0x42
mov dl, [boot_drive]
mov si, dap
int 0x13
jc disk_error
jmp kernel_loaded
use_chs:
mov ah, 0x02
mov al, KERNEL_SECTORS
mov ch, 0
mov cl, KERNEL_SECTOR
mov dh, 0
mov dl, [boot_drive]
mov bx, KERNEL_LOAD_ADDR
int 0x13
jc disk_error
kernel_loaded:
mov si, msgKernelLoaded
call print_string
; Mode 13h
mov ah, 0x00
mov al, 0x13
int 0x10
; Switch to Protected Mode
cli
lgdt [gdt_descriptor]
mov eax, cr0
or eax, 0x1
mov cr0, eax
jmp CODE_SEG:protected_mode_start
; Data
msgLoading db 'Loading...', 0
msgKernelLoaded db ' Done.', 0Dh, 0Ah, 0
msgDiskError db 'Disk Error!', 0Dh, 0Ah, 0
boot_drive db 0
dap:
db 0x10
db 0
dw KERNEL_SECTORS
dw KERNEL_LOAD_ADDR
dw 0
dq KERNEL_SECTOR - 1
bits 32
protected_mode_start:
mov ax, DATA_SEG
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp, 0x90000
jmp KERNEL_LOAD_ADDR
disk_error:
mov si, msgDiskError
call print_string
jmp $
print_string:
.loop:
lodsb
or al, al
jz .done
mov ah, 0x0E
int 0x10
jmp .loop
.done:
ret
; GDT
gdt_start:
gdt_null:
dd 0x0
dd 0x0
gdt_code:
dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xCF
db 0x00
gdt_data:
dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xCF
db 0x00
gdt_end:
gdt_descriptor:
dw gdt_end - gdt_start - 1
dd gdt_start
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start
times 510 - ($ - $$) db 0
dw 0xAA55