summaryrefslogtreecommitdiff
path: root/src/boot.asm
blob: eb3b2c97b7dd50b7cd2437fbd3c709c37af03aa1 (plain) (blame)
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
bits 16
org 0x7c3e

kernel_sectors equ 64
kernel_segment equ 0x3000

support_flags equ 0x4000
pci_hw_char equ 0x4001
pci_ver equ 0x4002

pci_support equ 0x80

vesa_segment equ 0x0420

  in al, 0x92
  or al, 0x02
  out 0x92, al

  xor ax, ax
  mov ss, ax
  mov sp, 0x7ffc

  mov ah, 0x01
  mov ch, 0x3f
  int 0x10

  mov ax, kernel_segment
  mov es, ax
  mov ax, 0x0200 + kernel_sectors
  xor bx, bx
  mov cx, 0x0002
  xor dh, dh
  int 0x13

  mov ax, 0xb101
  int 0x1a

  cmp edx, 0x20494350
  jne no_pci

  test ah, ah
  jnz no_pci

  mov byte [support_flags], pci_support
  mov byte [pci_hw_char], al
  mov word [pci_ver], bx

no_pci:
  mov dword [vesa_segment * 16], 'V' + 'B' * 256 + 'E' * 65535 + '2' * 16777216

  mov ax, vesa_segment
  mov es, ax
  xor di, di
  mov ax, 0x4f00
  int 0x10

  cmp ax, 0x004f
  jne no_vbe

  cli

  lgdt [gdt]

  mov eax, cr0
  or al, 0x01
  mov cr0, eax

  jmp 0x08:pmode

no_vbe:
  ;TODO

  cli

real_halt:
  hlt
  jmp real_halt

bits 32

pmode:
  mov ax, 0x10
  mov ds, ax
  mov ss, ax
  mov esp, 0x00040000

  xor ebp, ebp
  call kernel_segment * 16

halt:
  hlt
  jmp halt

times $$ + 0x018a - $ db 0

;0x7dc8
gdt:
  dw .e - .t
  dd .t
.t:
  dq 0x0000_0000_0000_0000
  dq 0x00c0_9a00_0000_0037
  dq 0x00c1_9200_0000_ffff
  dq 0x0000_0000_0000_0000;TODO: task
  dq 0x0000_0000_0000_0000
  dq 0x0000_0000_0000_0000
.e:

dw 0xaa55