-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloader.asm
101 lines (94 loc) · 4.52 KB
/
loader.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
;===============================================================================
; Загрузчик ОС Gelios
;-------------------------------------------------------------------------------
; Загружает вторичный загрузчик, выполняющий все остальные функции
; по инициализации ядра, по физическому адресу 0x10000
;===============================================================================
BITS 16
org 0
jmp 0x07C0:init
init:
mov ax, cs
mov ds, ax
mov es, ax
mov byte [cs:DeviceID], dl ; сохраняем начальный номер устройства
mov ah, 0x08 ; номер функции
;mov dl, 0x80 ; DeviceID, остается при загрузке
int 0x13 ; вызываем функцию int13
jc error ; переход, если ошибка
mov al, cl
and eax, 00111111b
mov dword [cs:Sector], eax ; помещаем номер сектора + 0
mov al, cl
and eax, 11000000b
shl ax, 2
mov al, ch
inc eax
mov dword [cs:Cylinder], eax ; помещаем номер цилиндра + 1
movzx eax, dh
inc ax
mov dword [cs:Head], eax ; помещаем номер головки + 1
mov esi, 1;8197
mov ax, 0x1000
mov es, ax
mov bx, 0
call LBAtoCHS ; преобразуем в CHS
mov ah, 0x02 ; функция чтения данных
mov al, 64 ; читаем 64 сектора
mov dl, [cs:DeviceID] ; номер устройства
int 0x13
jc error ; переход, если ошибка
add bx, 64*512
add esi, 64
call LBAtoCHS ; преобразуем в CHS
mov ah, 0x02 ; функция чтения данных
mov al, 64 ; читаем 64 сектора
mov dl, [cs:DeviceID] ; номер устройства
int 0x13
jc error ; переход, если ошибка
mov dl, [cs:DeviceID]
jmp 0x1000:0 ; переход на вторичный загрузчик
error: ; если ошибка - переходим сюда
mov ax, 0xB800 ; адрес видеобуфера
mov es, ax
mov si, string ; адрес строки сообщения
mov di, 24*80*2 ; инициализируем указатель (последняя строка)
for:
mov al, [cs:si] ; выводим сообщение об ошибке
mov byte [es:di], al
inc di
mov byte [es:di], 00001100b ; красный цвет на черном фоне
inc di
inc si
cmp al, 0
jnz for
cli ; останавливаем систему
hlt
jmp $ ; на всякий случай ;)
;===============================================================================
; Функция преобразует LBA-адрес в CHS-адрес
;-------------------------------------------------------------------------------
; На входе: esi - линейный адрес сектора с нуля
; На выходе: координаты в формате int 13h
;-------------------------------------------------------------------------------
; s - sector, c - cylinder, h - head, m - max
LBAtoCHS:
mov eax, esi ; LBA=(c*mh+h)*ms+s
mov edx, 0
div dword [cs:Sector] ; /ms ; eax=c*mh+h ; edx=s-1
inc edx
mov cl, dl ; номер сектора (s)
mov edx, 0
div dword [cs:Head] ; /mh ; eax=c ; edx=h
mov ch, al ; номер цилиндра (c)
mov dh, dl ; номер головки (h)
ret
;===============================================================================
Sector: dd 0 ; максимальный номер сектора
Cylinder: dd 0 ; максимальный номер цилиндра + 1
Head: dd 0 ; максимальный номер головки + 1
DeviceID db 0 ; начальный номер устройства
string db 'Disk error! Please reboot the computer.'
db ' ', 0 ; сообщение об ошибке
TIMES 510-($-$$) db 0
db 0x55, 0xAA ; сигнатура загрузчика