-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathboot-loader.asm
More file actions
161 lines (131 loc) · 2.64 KB
/
Copy pathboot-loader.asm
File metadata and controls
161 lines (131 loc) · 2.64 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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
[ORG 0x00]
[BITS 16]
SECTION .text
; Far jump to force CS:IP to a known state.
; This handles BIOS variants that load to 0000:7C00 instead of 07C0:0000.
jmp 0x07c0:START
TOTALSECTORCOUNT: dw 2
KERNEL32SECTORCOUNT: dw 2
START:
mov ax, 0x07c0
mov ds, ax
mov ax, 0xb800
mov es, ax
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFE
mov bp, 0xFFFE
mov si, 0
; Local label to prevent naming collisions
.SCREENCLEARLOOP:
mov byte [ es: si ], 0
mov byte [ es: si + 1 ], 0x0a
add si, 2
cmp si, 80 * 25 * 2 ; size of screen
jl .SCREENCLEARLOOP
push MESSAGE1
push 0
push 0
call PRINTMESSAGE
add sp, 6
push IMAGELOADINGMESSAGE
push 1
push 0
call PRINTMESSAGE
add sp, 6
RESETDISK:
mov ax, 0
mov dl, 0
int 0x13
jc HANDLEDISKERROR
mov si, 0x1000
mov es, si
mov bx, 0x0000
mov di, word [ TOTALSECTORCOUNT ]
READDATA:
cmp di, 0
je READEND
sub di, 0x1
mov ah, 0x02
mov al, 0x1
mov ch, byte [ TRACKNUMBER ]
mov cl, byte [ SECTORNUMBER ]
mov dh, byte [ HEADNUMBER ]
mov dl, 0x00
int 0x13
jc HANDLEDISKERROR
add si, 0x0020
mov es, si
mov al, byte [ SECTORNUMBER ]
add al, 0x01
mov byte [ SECTORNUMBER ], al
cmp al, 19
jl READDATA
xor byte [ HEADNUMBER ], 0x01
mov byte [ SECTORNUMBER ], 0x01
cmp byte [ HEADNUMBER ], 0x00
jne READDATA
add byte [ TRACKNUMBER ], 0x01
jmp READDATA
READEND:
push LOADINGCOMPLETEMESSAGE
push 1
push 20
call PRINTMESSAGE
add sp, 6
jmp 0x1000:0x0000 ; OS is not exist yet
HANDLEDISKERROR:
push DISKERRORMESSAGE
push 1
push 20
call PRINTMESSAGE
jmp $
PRINTMESSAGE:
push bp
mov bp, sp
push es
push si
push di
push ax
push cx
push dx
mov ax, 0xb800
mov es, ax
mov ax, word [ bp + 6 ]
mov si, 160
mul si
mov di, ax
mov ax, word [ bp + 4 ]
mov si, 2
mul si
add di, ax
mov si, word [ bp + 8 ]
.MESSAGELOOP:
mov cl, byte [ si ]
cmp cl, 0
je .MESSAGEEND
mov byte [ es: di ], cl
add si, 1
add di, 2
jmp .MESSAGELOOP
.MESSAGEEND:
pop dx
pop cx
pop ax
pop di
pop si
pop es
pop bp
ret
MESSAGE1: db 'REIN OS Boot Loader Start', 0
DISKERRORMESSAGE: db 'DISK ERROR', 0
IMAGELOADINGMESSAGE: db 'OS Image Loading...', 0
LOADINGCOMPLETEMESSAGE: db 'Complete', 0
SECTORNUMBER: db 0x02
HEADNUMBER: db 0x00
TRACKNUMBER: db 0x00
times 510 - ( $ - $$ ) db 0x00
db 0x55
db 0xaa
; (instruction code...) 0x00 0x00 ... 0x55 0xaa
; total length: 512 bytes