forked from nogueira04/projeto-bootloader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboot2.asm
159 lines (124 loc) · 2.76 KB
/
boot2.asm
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
org 0x500
jmp 0x0000:start
logos db ' Produzindo as logos...', 8
preto db 0
verde db 2
%macro print 4
pusha
mov ah, 02h
mov bh, 0
mov dh, %3
mov dl, %4
int 10h
mov si, %1
mov bl, %2
call print_string
popa
%endmacro
delay:
cmp al, '.'
mov bp, 1500
mov cx, 1500
je .delaydot
mov bp, 250
mov cx, 250
.delayloop:
dec bp
nop
jnz .delayloop
dec cx
jnz .delayloop
ret
.delaydot:
dec bp
nop
jnz .delaydot
dec cx
jnz .delaydot
ret
limpaTela:
;; Limpa a tela dos caracteres colocados pela BIOS
; Set the cursor to top left-most corner of screen
mov dx, 0
mov bh, 0
mov ah, 0x2
int 0x10
; print 2000 blank chars to clean
mov cx, 2000
mov bh, 0
mov al, 0x20 ; blank char
mov ah, 0x9
int 0x10
;Reset cursor to top left-most corner of screen
mov dx, 0
mov bh, 0
mov ah, 0x2
int 0x10
ret
print_string:
lodsb
cmp al, 8
je end
call delay
mov ah, 0xe
mov bh, 0
int 10h
jmp print_string
end:
mov ah, 0eh
mov al, 0xd
int 10h
mov al, 0xa
int 10h
ret
start:
xor ax, ax
mov ds, ax
mov es, ax
;parte pra printar as mensagens que quisermos
mov ah, 0
mov al, 12h
int 10h
mov ah, 0xb
mov bh, 0
mov bl, [preto]
int 10h
call limpaTela
mov ah, 0x02
mov bh, 0
mov dh, 12 ; coordenada da linha para "Produzindo as logos..."
mov dl, 25 ; coordenada da coluna para "Produzindo as logos..."
int 10h
mov si, logos
mov bl, [verde]
call print_string
call delay
mov al, '.'
call delay
call limpaTela
mov ah, 0xb
mov bh, 0
mov bl, [preto]
int 10h
reset:
mov ah, 00h ;reseta o controlador de disco
mov dl, 0 ;floppy disk
int 13h
jc reset ;se o acesso falhar, tenta novamente
jmp load_kernel
load_kernel:
;Setando a posição do disco onde kernel.asm foi armazenado(ES:BX = [0x7E00:0x0])
mov ax, 0x7E0 ;0x7E0<<1 + 0 = 0x7E00
mov es, ax
xor bx, bx ;Zerando o offset
mov ah, 0x02 ;le o setor do disco
mov al, 20 ;porção de setores ocupados pelo kernel.asm
mov ch, 0 ;track 0
mov cl, 3 ;setor 3
mov dh, 0 ;head 0
mov dl, 0 ;drive 0
int 13h
jc load_kernel ;se o acesso falhar, tenta novamente
jmp 0x7e00 ;pula para o setor de endereço 0x7e00, que é o kernel
times 510-($-$$) db 0 ;512 bytes
dw 0xaa55