]> git.dujemihanovic.xyz Git - nameless-os.git/blob - boot.s
a40b7508781e9dbc59b82587e003f2ccca6a21f8
[nameless-os.git] / boot.s
1 bits 16
2 org 7C00h
3
4 KERNEL_OFFSET equ 1000h
5
6 mov [BOOT_DRIVE], dl
7
8 mov bp, 9000h
9 mov sp, bp
10
11 mov di, 0
12
13 xor ax, ax
14 int 13h
15 jc reset_error
16
17 mov ah, 2
18 mov al, 10
19 xor ch, ch
20 mov cl, 2
21 xor dh, dh
22 xor bx, bx
23 mov es, bx
24 mov bx, KERNEL_OFFSET
25 int 13h
26 jc read_error
27 cmp al, 10
28 jl read_error
29 jmp switch_to_pm
30
31 reset_error
32 mov bx, 0B800h
33 mov es, bx
34 mov byte [es:di], '1'
35 jmp halt
36
37 read_error
38 mov bx, 0B800h
39 mov es, bx
40 mov byte [es:di], '2'
41 jmp halt
42
43 call switch_to_pm
44
45 halt
46 jmp $
47
48 switch_to_pm
49 mov bx, 0B800h
50 mov es, bx
51 mov byte [es:0], 'L'
52
53 cli
54 xor ax, ax
55 mov ds, ax
56 lgdt [gdt_desc]
57
58 mov eax, cr0
59 or eax, 1
60 mov cr0, eax
61 jmp CODE_SEG:protected
62
63 bits 32
64 protected
65 mov ax, DATA_SEG
66 mov ds, ax
67 mov ss, ax
68 mov es, ax
69 mov fs, ax
70 mov gs, ax
71
72 mov ebp, 090000h
73 mov esp, ebp
74
75 mov ebx, pm_success
76 call pmprint
77
78 call KERNEL_OFFSET
79
80 jmp $
81
82 pmprint
83 pusha
84 mov edx, video_memory
85
86 .loop
87 mov al, [ebx]
88 mov ah, 0Fh
89
90 cmp al, 0
91 je .done
92
93 mov [edx], al
94 mov [edx+1], ah
95
96 inc ebx
97 add edx, 2
98
99 jmp .loop
100
101 .done
102 popa
103 ret
104
105 pm_success db "Now in protected mode", 0
106 video_memory equ 0B8000h
107
108 gdt_start
109 null_seg
110 dq 0
111 code_seg
112 dw 0FFFFh
113 dw 0
114 db 0
115 db 10011010b
116 db 11001111b
117 db 0
118 data_seg
119 dw 0FFFFh
120 dw 0
121 db 0
122 db 10010010b
123 db 11001111b
124 db 0
125 gdt_end
126 gdt_desc
127 dw gdt_end - gdt_start - 1
128 dd gdt_start
129 CODE_SEG equ code_seg - gdt_start
130 DATA_SEG equ data_seg - gdt_start
131
132 BOOT_DRIVE db 0
133
134 times 510-($-$$) db 0
135 dw 0AA55h