989 lines
55 KiB
Plaintext
989 lines
55 KiB
Plaintext
1
|
|
2 %include "bootdef.inc"
|
|
3 <1>
|
|
4 <1> %define VERSION "0.1.2" ;HOS version
|
|
5 <1>
|
|
6 <1> %define BOOT_FAT_SEG 0x07E0 ;right after boot sector
|
|
7 <1> %define BOOT_ROOT_SEG 0x0900 ;right after FAT
|
|
8 <1> %define BOOT_KERNEL_SEG 0x0AC0 ;right after ROOT_DIR
|
|
9 <1> %define BOOT_STAGE2_SEG 0x0B00 ;right after KERNEL_SEG
|
|
10 <1> %define BOOT_STAGE2_ADD 0xB000 ;address of stage2 to jump to, org at
|
|
11 <1> %define BOOT_KERNEL_ADD 0x100000 ;final pmode kernel destination - physical
|
|
12 <1> %define BOOT_RD_ADD 0x200000 ;2mb for ram disk
|
|
13 <1>
|
|
14 <1> %define BOOT_DATA_SEG 0x9000 ;data gathered by stage2 loader goes here
|
|
15 <1>
|
|
16 <1> %define BOOT_HASRD 0x0000 ;1
|
|
17 <1> %define BOOT_VESA 0x0002 ;2 - 0 for console, otherwise VESA mode
|
|
18 <1> %define BOOT_VESA_OEM 0x0004 ;258 - null-terminated OEM identification string
|
|
19 <1> %define BOOT_VESA_VBE 0x0106 ;512 - copy of VESA VBEInfoBlock
|
|
20 <1> %define BOOT_VESA_INFO 0x0306 ;256 - copy of VESA ModeInfoBlock for selected mode
|
|
21 <1> %define BOOT_MEMENTRIES 0x040A ;4 - dword = number of memmap entries
|
|
22 <1> %define BOOT_MEMMAP 0x2000 ;? - memory map information
|
|
23 <1>
|
|
24 <1>
|
|
25 <1>
|
|
26 <1> %define BOOT_DRIVE 0x7C24 ;1 - boot drive
|
|
27 <1>
|
|
28 <1>
|
|
29
|
|
30 %define VESA_MODEINFO_SEG 0x0120
|
|
31 %define VESA_MODELIST_SEG 0x0140
|
|
32 %define GOOD_MODELIST_SEG 0x0160
|
|
33
|
|
34 [bits 16]
|
|
35
|
|
36 org BOOT_STAGE2_ADD
|
|
37
|
|
38
|
|
39 ;k now read root directory
|
|
40 00000000 BB0009 mov bx, BOOT_ROOT_SEG
|
|
41 00000003 8EDB mov ds, bx
|
|
42 00000005 31F6 xor si, si ;k now ds:si points to beginning of root directory
|
|
43 00000007 8EC6 mov es, si
|
|
44 00000009 B9E000 mov cx, 224 ;max root entries
|
|
45 loop_compare:
|
|
46 0000000C BF[FD07] mov di, kernel
|
|
47 0000000F 51 push cx
|
|
48 00000010 56 push si ;save pointer to root dir entry
|
|
49 00000011 B90B00 mov cx, 11
|
|
50 loop_name:
|
|
51 00000014 A6 cmpsb
|
|
52 00000015 E1FD loopz loop_name
|
|
53 00000017 7505 jnz goon ;cx didn't get to zero, bad file
|
|
54 00000019 5E pop si
|
|
55 0000001A 59 pop cx
|
|
56 0000001B E90600 jmp found_file ;good file, ds:si points to start of root directory entry
|
|
57 goon:
|
|
58 0000001E 5E pop si
|
|
59 0000001F 59 pop cx
|
|
60 00000020 E2EA loop loop_compare
|
|
61
|
|
62 error:
|
|
63 00000022 EBFE jmp $ ;halt! no kernel file found!
|
|
64
|
|
65 found_file: ;ds:si points to root dir entry of kernel file
|
|
66 00000024 31C0 xor ax, ax
|
|
67 00000026 8EE8 mov gs, ax
|
|
68 00000028 3E8B441A mov ax, [ds:si+26]
|
|
69 0000002C BBE007 mov bx, BOOT_FAT_SEG
|
|
70 0000002F 8EDB mov ds, bx ;ds points to beginning of FAT
|
|
71 00000031 66BF00001000 mov edi, BOOT_KERNEL_ADD
|
|
72
|
|
73 readkernel_loop:
|
|
74 00000037 3DF70F cmp ax, 0xff7
|
|
75 0000003A 7F52 jg readkernel_done
|
|
76 0000003C 50 push ax
|
|
77 0000003D E85C07 call getCHSfromCluster
|
|
78 00000040 B80102 mov ax, 0x0201
|
|
79 00000043 658A16247C mov dl, [gs:BOOT_DRIVE]
|
|
80 00000048 BBC00A mov bx, BOOT_KERNEL_SEG
|
|
81 0000004B 8EC3 mov es, bx
|
|
82 0000004D 31DB xor bx, bx
|
|
83 0000004F CD13 int 0x13
|
|
84 00000051 B90001 mov cx, 256
|
|
85 00000054 31C0 xor ax, ax
|
|
86 00000056 8EC0 mov es, ax
|
|
87 00000058 66BE00AC0000 mov esi, BOOT_KERNEL_SEG*16
|
|
88 copykernel_loop:
|
|
89 0000005E 26678B06 mov ax, [es:esi]
|
|
90 00000062 26678907 mov [es:edi], ax
|
|
91 00000066 6646 inc esi
|
|
92 00000068 6646 inc esi
|
|
93 0000006A 6647 inc edi
|
|
94 0000006C 6647 inc edi
|
|
95 0000006E E2EE loop copykernel_loop
|
|
96
|
|
97 00000070 58 pop ax ;current logical cluster #
|
|
98
|
|
99 00000071 89C1 mov cx, ax ;cx=logical cluster
|
|
100 00000073 BA0300 mov dx, 3
|
|
101 00000076 F7E2 mul dx
|
|
102 00000078 D1E8 shr ax, 1 ;ax=logical cluster * 3 / 2
|
|
103 0000007A 89C6 mov si, ax
|
|
104 0000007C F6C101 test cl, 1 ;is bit0 set?
|
|
105 0000007F 7507 jnz odd_cluster
|
|
106 even_cluster:
|
|
107 00000081 AD lodsw
|
|
108 00000082 25FF0F and ax, 0x0fff
|
|
109 00000085 E90400 jmp got_cluster
|
|
110 odd_cluster:
|
|
111 00000088 AD lodsw
|
|
112 00000089 C1E804 shr ax, 4
|
|
113 got_cluster:
|
|
114 0000008C EBA9 jmp readkernel_loop
|
|
115
|
|
116 ;------------------------------------------------------
|
|
117 readkernel_done: ;-------------put more real mode init stuff here!
|
|
118 ;----ask to load RD from floppy
|
|
119 0000008E B800B8 mov ax, 0xb800
|
|
120 00000091 8EC0 mov es, ax
|
|
121 00000093 31C0 xor ax, ax
|
|
122 00000095 8ED8 mov ds, ax
|
|
123 00000097 31FF xor di, di
|
|
124 00000099 B9D007 mov cx, 2000
|
|
125 0000009C B80007 mov ax, 0x0700
|
|
126 cls_loop:
|
|
127 0000009F AB stosw
|
|
128 000000A0 E2FD loop cls_loop
|
|
129
|
|
130 000000A2 BAD403 mov dx, 0x3d4 ;move cursor off screen...
|
|
131 000000A5 B00E mov al, 0x0e
|
|
132 000000A7 EE out dx, al
|
|
133 000000A8 42 inc dx
|
|
134 000000A9 B0FF mov al, 0xff
|
|
135 000000AB EE out dx, al
|
|
136 000000AC 4A dec dx
|
|
137 000000AD B00F mov al, 0x0f
|
|
138 000000AF EE out dx, al
|
|
139 000000B0 42 inc dx
|
|
140 000000B1 EE out dx, al
|
|
141
|
|
142 000000B2 31FF xor di, di
|
|
143 000000B4 BE[FB05] mov si, txt_welcome
|
|
144 000000B7 B41F mov ah, 0x1f
|
|
145 000000B9 E83E04 call puts
|
|
146
|
|
147 000000BC BFA000 mov di, 160
|
|
148 000000BF BE[4C06] mov si, txt_rd1
|
|
149 000000C2 B407 mov ah, 7
|
|
150 000000C4 E83304 call puts
|
|
151
|
|
152 000000C7 BE[6F06] mov si, txt_rd2
|
|
153 000000CA BF4001 mov di, 160*2
|
|
154 000000CD E82A04 call puts
|
|
155
|
|
156 000000D0 BFE001 mov di, 160*3
|
|
157 000000D3 BE[9406] mov si, txt_input
|
|
158 000000D6 E82104 call puts
|
|
159
|
|
160 get_rd:
|
|
161 000000D9 31C0 xor ax, ax
|
|
162 000000DB CD16 int 0x16
|
|
163 000000DD 3C31 cmp al, '1'
|
|
164 000000DF 7404 jz got_rd
|
|
165 000000E1 3C32 cmp al, '2'
|
|
166 000000E3 75F4 jnz get_rd
|
|
167 got_rd:
|
|
168 000000E5 AA stosb
|
|
169 000000E6 2C31 sub al, '1'
|
|
170 000000E8 1E push ds
|
|
171 000000E9 BB0090 mov bx, BOOT_DATA_SEG ;segment for data to send kernel
|
|
172 000000EC 8EDB mov ds, bx
|
|
173 000000EE 3EA20000 mov [ds:BOOT_HASRD], al
|
|
174 000000F2 1F pop ds ;ds=0
|
|
175 000000F3 3C00 cmp al, 0 ;dont load rd
|
|
176 000000F5 746F jz no_rd
|
|
177
|
|
178 000000F7 B95000 mov cx, 80
|
|
179 000000FA 66BF80820B00 mov edi, 0xb8000+160*4
|
|
180 filler_loop:
|
|
181 00000100 3E67C707B104 mov word [ds:edi], 0x0400+177
|
|
182 00000106 6647 inc edi
|
|
183 00000108 6647 inc edi
|
|
184 0000010A E2F4 loop filler_loop
|
|
185 0000010C B95000 mov cx, 80 ;80 cylinders to read
|
|
186 0000010F 31F6 xor si, si
|
|
187 00000111 66BF00002000 mov edi, BOOT_RD_ADD ;ram disk address
|
|
188 read_cylinder:
|
|
189 00000117 51 push cx
|
|
190 00000118 BB0001 mov bx, 0x0100
|
|
191 0000011B 8EC3 mov es, bx
|
|
192 0000011D 31DB xor bx, bx
|
|
193 0000011F B82402 mov ax, 0x0224
|
|
194 00000122 89F1 mov cx, si
|
|
195 00000124 88CD mov ch, cl
|
|
196 00000126 B101 mov cl, 1
|
|
197 00000128 31D2 xor dx, dx
|
|
198 0000012A 658A16247C mov dl, [gs:BOOT_DRIVE]
|
|
199 0000012F CD13 int 0x13
|
|
200
|
|
201 00000131 66BB00800B00 mov ebx, 0xb8000
|
|
202 00000137 01F3 add bx, si
|
|
203 00000139 D0E3 shl bl, 1
|
|
204 0000013B 3E67C78380020000DB- mov word [ds:ebx+160*4], 0x0200+219
|
|
205 00000144 02
|
|
206
|
|
207 00000145 56 push si
|
|
208 00000146 66BE00100000 mov esi, 0x1000
|
|
209 0000014C B90024 mov cx, 0x2400
|
|
210 copydisk_loop:
|
|
211 0000014F 3E678B06 mov ax, [ds:esi]
|
|
212 00000153 6646 inc esi
|
|
213 00000155 6646 inc esi
|
|
214 00000157 3E678907 mov [ds:edi], ax
|
|
215 0000015B 6647 inc edi
|
|
216 0000015D 6647 inc edi
|
|
217 0000015F E2EE loop copydisk_loop
|
|
218
|
|
219 00000161 5E pop si ;what cylinder# we are on...
|
|
220 00000162 46 inc si
|
|
221 00000163 59 pop cx
|
|
222 00000164 E2B1 loop read_cylinder
|
|
223
|
|
224 ;------------------------------------------------------
|
|
225 no_rd:
|
|
226 00000166 B80090 mov ax, BOOT_DATA_SEG
|
|
227 00000169 8EC0 mov es, ax
|
|
228 0000016B BF0020 mov di, BOOT_MEMMAP ;store memmap info in es:di for kernel
|
|
229 0000016E 6631D2 xor edx, edx
|
|
230 00000171 B80001 mov ax, 0x0100
|
|
231 00000174 8ED8 mov ds, ax
|
|
232 00000176 6631DB xor ebx, ebx
|
|
233 getmemmap_loop:
|
|
234 00000179 06 push es
|
|
235 0000017A 57 push di
|
|
236 0000017B 6652 push edx
|
|
237 0000017D B80001 mov ax, 0x0100 ;get memory map
|
|
238 00000180 8EC0 mov es, ax
|
|
239 00000182 31FF xor di, di
|
|
240 00000184 66B820E80000 mov eax, 0x0000E820
|
|
241 0000018A 66B914000000 mov ecx, 0x00000014
|
|
242 ;mov ebx, 0x00000000
|
|
243 00000190 66BA50414D53 mov edx, 0x534D4150 ;'SMAP'
|
|
244 00000196 CD15 int 0x15
|
|
245 00000198 7239 jc getmemmap_carry
|
|
246 0000019A 663D50414D53 cmp eax, 0x534D4150 ;eax should be 'SMAP' on return...
|
|
247 000001A0 751A jnz getmemmap_error
|
|
248 000001A2 6681FB00000000 cmp ebx, 0
|
|
249 000001A9 742A jz getmemmap_done
|
|
250
|
|
251 000001AB 665A pop edx ;now, copy memmap entry to es:di on the stack
|
|
252 000001AD 5F pop di
|
|
253 000001AE 07 pop es
|
|
254 000001AF 31F6 xor si, si
|
|
255 000001B1 B91400 mov cx, 20
|
|
256 getmemmap_copymem_loop:
|
|
257 000001B4 AC lodsb
|
|
258 000001B5 AA stosb
|
|
259 000001B6 E2FC loop getmemmap_copymem_loop
|
|
260 000001B8 6642 inc edx
|
|
261 000001BA EBBD jmp getmemmap_loop
|
|
262
|
|
263 getmemmap_error:
|
|
264 000001BC B800B8 mov ax, 0xb800
|
|
265 000001BF 8EC0 mov es, ax
|
|
266 000001C1 BF000F mov di, 160*24
|
|
267 000001C4 31C0 xor ax, ax
|
|
268 000001C6 8ED8 mov ds, ax
|
|
269 000001C8 BE[5D07] mov si, txt_memerror
|
|
270 000001CB B404 mov ah, 0x04
|
|
271 000001CD E82A03 call puts
|
|
272 000001D0 F4 hlt
|
|
273 000001D1 EBFE jmp $
|
|
274
|
|
275 getmemmap_carry:
|
|
276 000001D3 664A dec edx
|
|
277 getmemmap_done:
|
|
278 000001D5 665A pop edx
|
|
279 000001D7 5F pop di
|
|
280 000001D8 07 pop es
|
|
281
|
|
282 000001D9 31F6 xor si, si
|
|
283 000001DB B91400 mov cx, 20
|
|
284 getmemmap_done_copymem_loop:
|
|
285 000001DE AC lodsb
|
|
286 000001DF AA stosb
|
|
287 000001E0 E2FC loop getmemmap_done_copymem_loop
|
|
288 000001E2 6642 inc edx
|
|
289
|
|
290 000001E4 BF0A04 mov di, BOOT_MEMENTRIES
|
|
291 000001E7 26668915 mov [es:di], edx ;save # of memmap entries for kernel
|
|
292
|
|
293 ;on to vesa info...
|
|
294 000001EB 31C0 xor ax, ax
|
|
295 000001ED 8EE8 mov gs, ax
|
|
296 000001EF 8ED8 mov ds, ax
|
|
297 000001F1 B800B8 mov ax, 0xb800
|
|
298 000001F4 8EC0 mov es, ax
|
|
299 000001F6 BFA000 mov di, 160
|
|
300 000001F9 B98007 mov cx, 2000-80
|
|
301 000001FC B80007 mov ax, 0x0700
|
|
302 cls_vesa_loop:
|
|
303 000001FF AB stosw
|
|
304 00000200 E2FD loop cls_vesa_loop
|
|
305 00000202 BE[AB06] mov si, txt_vesa
|
|
306 00000205 BFA000 mov di, 160*1
|
|
307 00000208 B407 mov ah, 7
|
|
308 0000020A E8ED02 call puts
|
|
309
|
|
310 0000020D 57 push di
|
|
311 0000020E B80001 mov ax, 0x0100
|
|
312 00000211 8EC0 mov es, ax
|
|
313 00000213 31FF xor di, di
|
|
314 00000215 2666C70532454256 mov dword [es:di], "2EBV"
|
|
315 0000021D B8004F mov ax, 0x4F00
|
|
316
|
|
317 00000220 CD10 int 0x10
|
|
318 00000222 5F pop di
|
|
319 00000223 3D4F00 cmp ax, 0x004F
|
|
320 00000226 741C jz vesa_good
|
|
321 00000228 BE[E406] mov si, txt_novesa
|
|
322 0000022B B800B8 mov ax, 0xb800
|
|
323 0000022E 8EC0 mov es, ax
|
|
324 00000230 B407 mov ah, 7
|
|
325 00000232 E8C502 call puts
|
|
326 00000235 B80090 mov ax, BOOT_DATA_SEG
|
|
327 00000238 8ED8 mov ds, ax
|
|
328 0000023A 3EC70602000000 mov word [ds:BOOT_VESA], 0
|
|
329 00000241 E9B302 jmp vesa_done
|
|
330 vesa_good:
|
|
331 00000244 B800B8 mov ax, 0xb800
|
|
332 00000247 8EC0 mov es, ax
|
|
333 00000249 B80001 mov ax, 0x0100
|
|
334 0000024C 8ED8 mov ds, ax
|
|
335 0000024E 31F6 xor si, si
|
|
336 00000250 8B1E0400 mov bx, [4]
|
|
337 00000254 88F8 mov al, bh
|
|
338 00000256 E85203 call puthex
|
|
339 00000259 B02E mov al, '.'
|
|
340 0000025B AA stosb
|
|
341 0000025C B007 mov al, 7
|
|
342 0000025E AA stosb
|
|
343 0000025F 88D8 mov al, bl
|
|
344 00000261 E84703 call puthex
|
|
345 00000264 81C70400 add di, 4
|
|
346 00000268 80FF02 cmp bh, 2
|
|
347 0000026B 7D1B jge vesa_good2
|
|
348 0000026D 31C0 xor ax, ax
|
|
349 0000026F 8ED8 mov ds, ax
|
|
350 00000271 BE[1007] mov si, txt_vesaold
|
|
351 00000274 B407 mov ah, 7
|
|
352 00000276 E88102 call puts
|
|
353 00000279 B80090 mov ax, BOOT_DATA_SEG
|
|
354 0000027C 8ED8 mov ds, ax
|
|
355 0000027E 3EC70602000000 mov word [ds:BOOT_VESA], 0
|
|
356 00000285 E96F02 jmp vesa_done
|
|
357 vesa_good2:
|
|
358 00000288 668B1E0600 mov ebx, [6] ;something like 0x00000E60
|
|
359 0000028D 668B160E00 mov edx, [14]
|
|
360 00000292 89DE mov si, bx
|
|
361 00000294 66C1EB10 shr ebx, 16
|
|
362 00000298 8EDB mov ds, bx ;ds:si points to null-terminated OEM identification string
|
|
363 0000029A B402 mov ah, 2
|
|
364 0000029C 56 push si
|
|
365 0000029D E85A02 call puts
|
|
366 000002A0 5E pop si
|
|
367 000002A1 B80090 mov ax, BOOT_DATA_SEG
|
|
368 000002A4 8EC0 mov es, ax
|
|
369 000002A6 BF0400 mov di, BOOT_VESA_OEM
|
|
370 vesa_copyoem:
|
|
371 000002A9 AC lodsb
|
|
372 000002AA AA stosb
|
|
373 000002AB 08C0 or al, al
|
|
374 000002AD 75FA jnz vesa_copyoem
|
|
375 000002AF B80001 mov ax, 0x0100
|
|
376 000002B2 8ED8 mov ds, ax
|
|
377 000002B4 31F6 xor si, si
|
|
378 000002B6 BF0601 mov di, BOOT_VESA_VBE
|
|
379 000002B9 B90002 mov cx, 512
|
|
380 vesa_copyvbe:
|
|
381 000002BC AC lodsb
|
|
382 000002BD AA stosb
|
|
383 000002BE E2FC loop vesa_copyvbe
|
|
384
|
|
385 000002C0 89D6 mov si, dx
|
|
386 000002C2 66C1EA10 shr edx, 16
|
|
387 000002C6 8EDA mov ds, dx ;ds:si points to video mode list
|
|
388 000002C8 B84001 mov ax, VESA_MODELIST_SEG
|
|
389 000002CB 8EC0 mov es, ax
|
|
390 000002CD 31FF xor di, di
|
|
391 vesa_copymodes:
|
|
392 000002CF AD lodsw
|
|
393 000002D0 AB stosw
|
|
394 000002D1 3DFFFF cmp ax, 0xffff
|
|
395 000002D4 75F9 jnz vesa_copymodes
|
|
396
|
|
397 000002D6 B86001 mov ax, GOOD_MODELIST_SEG
|
|
398 000002D9 8EC0 mov es, ax
|
|
399 000002DB 31FF xor di, di
|
|
400 000002DD B90001 mov cx, 256
|
|
401 000002E0 B8FFFF mov ax, 0xffff
|
|
402 clear_good_mode_list_loop:
|
|
403 000002E3 AB stosw
|
|
404 000002E4 E2FD loop clear_good_mode_list_loop
|
|
405
|
|
406 000002E6 B84001 mov ax, VESA_MODELIST_SEG
|
|
407 000002E9 8ED8 mov ds, ax
|
|
408 000002EB 31F6 xor si, si ;ds:si points to video mode list where we can edit it :)
|
|
409 000002ED B86001 mov ax, GOOD_MODELIST_SEG
|
|
410 000002F0 8EC0 mov es, ax
|
|
411 000002F2 31FF xor di, di
|
|
412 000002F4 31D2 xor dx, dx ;dx=what good mode # we are on
|
|
413 vesa_readmodeinfo_loop:
|
|
414 000002F6 AD lodsw
|
|
415 000002F7 3DFFFF cmp ax, 0xffff
|
|
416 000002FA 7414 jz vesa_endofmodes
|
|
417 000002FC 50 push ax ;save mode#
|
|
418 000002FD E85401 call checkmode
|
|
419 00000300 3D0000 cmp ax, 0
|
|
420 00000303 7403 jz vesa_readmodeinfo_good
|
|
421 00000305 58 pop ax
|
|
422 00000306 EBEE jmp vesa_readmodeinfo_loop
|
|
423 vesa_readmodeinfo_good:
|
|
424 00000308 58 pop ax ;restore mode#
|
|
425 00000309 AB stosw
|
|
426 0000030A E8BA00 call vesa_showmodeinfo
|
|
427 0000030D 42 inc dx
|
|
428 0000030E EBE6 jmp vesa_readmodeinfo_loop
|
|
429
|
|
430 vesa_endofmodes: ;here we have a list of good modes at GOOD_MODELIST_SEG:0
|
|
431 00000310 31C0 xor ax, ax
|
|
432 00000312 8ED8 mov ds, ax
|
|
433 00000314 BE[4707] mov si, txt_consolemode
|
|
434 00000317 B800B8 mov ax, 0xb800
|
|
435 0000031A 8EC0 mov es, ax
|
|
436 0000031C BF4001 mov di, 160*2
|
|
437 0000031F B407 mov ah, 7
|
|
438 00000321 E8D601 call puts
|
|
439 00000324 BFE001 mov di, 160*3
|
|
440 00000327 89D1 mov cx, dx
|
|
441 00000329 B062 mov al, 'b'
|
|
442 vesa_displaylabels:
|
|
443 0000032B AA stosb
|
|
444 0000032C 50 push ax
|
|
445 0000032D B007 mov al, 7
|
|
446 0000032F AA stosb
|
|
447 00000330 B02E mov al, '.'
|
|
448 00000332 AA stosb
|
|
449 00000333 B007 mov al, 7
|
|
450 00000335 AA stosb
|
|
451 00000336 58 pop ax
|
|
452 00000337 FEC0 inc al
|
|
453 00000339 81C79C00 add di, 160-4
|
|
454 0000033D E2EC loop vesa_displaylabels ;done drawing screen of VESA choices, now ask for one
|
|
455 ;valid options are 'a' through (al-1)
|
|
456 0000033F 88C3 mov bl, al
|
|
457 00000341 31C0 xor ax, ax
|
|
458 00000343 8ED8 mov ds, ax
|
|
459 00000345 BF000F mov di, 160*24
|
|
460 00000348 BE[9406] mov si, txt_input
|
|
461 0000034B B40E mov ah, 14
|
|
462 0000034D E8AA01 call puts
|
|
463 vesa_getchoice:
|
|
464 00000350 31C0 xor ax, ax
|
|
465 00000352 CD16 int 0x16
|
|
466 00000354 3C61 cmp al, 'a'
|
|
467 00000356 7CF8 jl vesa_getchoice
|
|
468 00000358 38D8 cmp al, bl
|
|
469 0000035A 7DF4 jge vesa_getchoice
|
|
470 0000035C AA stosb
|
|
471 0000035D 50 push ax
|
|
472 0000035E B00E mov al, 14
|
|
473 00000360 AA stosb
|
|
474 00000361 58 pop ax
|
|
475 00000362 30E4 xor ah, ah
|
|
476 00000364 2D6100 sub ax, 'a'
|
|
477 00000367 3D0000 cmp ax, 0
|
|
478 0000036A 744C jz vesa_consolemode_only
|
|
479 0000036C 89C1 mov cx, ax ;cx holds good mode# (1=first good vesa mode)
|
|
480 0000036E 49 dec cx
|
|
481 0000036F B86001 mov ax, GOOD_MODELIST_SEG
|
|
482 00000372 8ED8 mov ds, ax
|
|
483 00000374 D1E1 shl cx, 1
|
|
484 00000376 89CE mov si, cx ;ds:si points to word containing selected mode#
|
|
485 00000378 AD lodsw
|
|
486 00000379 89C1 mov cx, ax
|
|
487 0000037B 89C2 mov dx, ax ;cx and dx hold mode#
|
|
488
|
|
489 0000037D B82001 mov ax, VESA_MODEINFO_SEG
|
|
490 00000380 8EC0 mov es, ax
|
|
491 00000382 31FF xor di, di
|
|
492 00000384 B8014F mov ax, 0x4F01
|
|
493 00000387 CD10 int 0x10
|
|
494 00000389 E87A01 call checkvesa
|
|
495
|
|
496 0000038C B82001 mov ax, VESA_MODEINFO_SEG
|
|
497 0000038F 8ED8 mov ds, ax
|
|
498 00000391 31F6 xor si, si
|
|
499 00000393 B80090 mov ax, BOOT_DATA_SEG
|
|
500 00000396 8EC0 mov es, ax
|
|
501 00000398 BF0603 mov di, BOOT_VESA_INFO
|
|
502 0000039B B90001 mov cx, 256
|
|
503 vesa_copymodeinfo_loop:
|
|
504 0000039E AC lodsb
|
|
505 0000039F AA stosb
|
|
506 000003A0 E2FC loop vesa_copymodeinfo_loop ;store ModeInfoBlock for current
|
|
507
|
|
508 000003A2 2689160200 mov [es:BOOT_VESA], dx ;store mode# for kernel
|
|
509
|
|
510 ; mov ax, 0xb800
|
|
511 ; mov es, ax
|
|
512 ; xor di, di
|
|
513 ; mov al, dh
|
|
514 ; call puthex2
|
|
515 ; mov al, dl
|
|
516 ; call puthex2
|
|
517
|
|
518 000003A7 89D3 mov bx, dx
|
|
519 000003A9 81CB0040 or bx, 0x4000 ;set "use LFB" bit of mode#
|
|
520 000003AD B8024F mov ax, 0x4F02
|
|
521 000003B0 CD10 int 0x10 ;switch to graphics mode!!!
|
|
522 000003B2 E85101 call checkvesa
|
|
523
|
|
524 000003B5 E93F01 jmp vesa_done
|
|
525
|
|
526 vesa_consolemode_only:
|
|
527 000003B8 B80090 mov ax, BOOT_DATA_SEG
|
|
528 000003BB 8EC0 mov es, ax
|
|
529 000003BD 26C70602000000 mov word [es:BOOT_VESA], 0
|
|
530
|
|
531 000003C4 E93001 jmp vesa_done
|
|
532
|
|
533 ;------------------------------------------------------
|
|
534 vesa_showmodeinfo:
|
|
535 000003C7 60 pusha
|
|
536 000003C8 06 push es
|
|
537 000003C9 1E push ds
|
|
538 000003CA B82001 mov ax, VESA_MODEINFO_SEG
|
|
539 000003CD 8ED8 mov ds, ax
|
|
540 000003CF 31F6 xor si, si
|
|
541 000003D1 B800B8 mov ax, 0xb800
|
|
542 000003D4 8EC0 mov es, ax
|
|
543
|
|
544 000003D6 89D1 mov cx, dx
|
|
545
|
|
546 000003D8 B8A000 mov ax, 160
|
|
547 000003DB F7E2 mul dx ;ax=160*mod#
|
|
548 000003DD 05E601 add ax, 160*3+6 ;offset first line of modes and room on left for label
|
|
549 000003E0 89C7 mov di, ax
|
|
550
|
|
551 000003E2 3EA11200 mov ax, [ds:18]
|
|
552 000003E6 E83901 call console_putDec
|
|
553 000003E9 81C70A00 add di, 10
|
|
554 000003ED B078 mov al, 'x'
|
|
555 000003EF E8B401 call console_putChar
|
|
556 000003F2 47 inc di
|
|
557 000003F3 47 inc di
|
|
558 000003F4 3EA11400 mov ax, [ds:20]
|
|
559 000003F8 E82701 call console_putDec
|
|
560 000003FB 81C70A00 add di, 10
|
|
561 000003FF B078 mov al, 'x'
|
|
562 00000401 E8A201 call console_putChar
|
|
563 00000404 47 inc di
|
|
564 00000405 47 inc di
|
|
565 00000406 30E4 xor ah, ah
|
|
566 00000408 3EA01900 mov al, [ds:25]
|
|
567 0000040C E81301 call console_putDec
|
|
568 0000040F 81C70800 add di, 8
|
|
569 00000413 3EA00000 mov al, [ds:0]
|
|
570 00000417 A880 test al, 0x80
|
|
571 00000419 7435 jz vesa_showmodeinfo_done
|
|
572 0000041B B04C mov al, 'L'
|
|
573 0000041D E88601 call console_putChar
|
|
574 00000420 B046 mov al, 'F'
|
|
575 00000422 E88101 call console_putChar
|
|
576 00000425 B042 mov al, 'B'
|
|
577 00000427 E87C01 call console_putChar
|
|
578 0000042A 47 inc di
|
|
579 0000042B 47 inc di
|
|
580 0000042C 3E668B1E2800 mov ebx, [ds:40]
|
|
581 00000432 6689D8 mov eax, ebx
|
|
582 00000435 66C1E818 shr eax, 24
|
|
583 00000439 E89901 call puthex2
|
|
584 0000043C 6689D8 mov eax, ebx
|
|
585 0000043F 66C1E810 shr eax, 16
|
|
586 00000443 E88F01 call puthex2
|
|
587 00000446 88F8 mov al, bh
|
|
588 00000448 E88A01 call puthex2
|
|
589 0000044B 88D8 mov al, bl
|
|
590 0000044D E88501 call puthex2
|
|
591 vesa_showmodeinfo_done:
|
|
592 00000450 1F pop ds
|
|
593 00000451 07 pop es
|
|
594 00000452 61 popa
|
|
595 00000453 C3 ret
|
|
596
|
|
597 ;------------------------------------------------------
|
|
598 checkmode:
|
|
599 00000454 53 push bx
|
|
600 00000455 51 push cx
|
|
601 00000456 52 push dx
|
|
602 00000457 06 push es
|
|
603 00000458 1E push ds
|
|
604 00000459 57 push di
|
|
605 0000045A 56 push si
|
|
606 0000045B 89C1 mov cx, ax ;cx=modenumber
|
|
607 0000045D B82001 mov ax, VESA_MODEINFO_SEG
|
|
608 00000460 8EC0 mov es, ax
|
|
609 00000462 31FF xor di, di
|
|
610 00000464 B8014F mov ax, 0x4F01
|
|
611 00000467 CD10 int 0x10
|
|
612 00000469 E89A00 call checkvesa
|
|
613 0000046C 31FF xor di, di ;es:di -> ModeInfoBlock struc
|
|
614 0000046E 268B05 mov ax, [es:di] ;ModeAttributes
|
|
615 00000471 A801 test al, 1 ;mode supported
|
|
616 00000473 7477 jz vesa_modenogood
|
|
617 00000475 A808 test al, 8 ;color mode
|
|
618 00000477 7473 jz vesa_modenogood
|
|
619 00000479 A810 test al, 0x10 ;graphics mode
|
|
620 0000047B 746F jz vesa_modenogood
|
|
621 0000047D A880 test al, 0x80 ;Linear Frame Buffer supported
|
|
622 0000047F 746B jz vesa_modenogood
|
|
623 00000481 268A4519 mov al, [es:di+25] ;BitsPerPixel
|
|
624 00000485 3C10 cmp al, 16
|
|
625 00000487 7408 jz vesa_bppok
|
|
626 00000489 3C18 cmp al, 24
|
|
627 0000048B 7404 jz vesa_bppok
|
|
628 0000048D 3C20 cmp al, 32
|
|
629 0000048F 755B jnz vesa_modenogood
|
|
630 vesa_bppok:
|
|
631 00000491 268B4512 mov ax, [es:di+18] ;XResolution
|
|
632 00000495 268B5D14 mov bx, [es:di+20] ;YResolution
|
|
633 00000499 3D8002 cmp ax, 640 ;640x480
|
|
634 0000049C 7509 jnz res_goon1
|
|
635 0000049E 81FBE001 cmp bx, 480
|
|
636 000004A2 7548 jnz vesa_modenogood
|
|
637 000004A4 E93B00 jmp vesa_modegood
|
|
638 res_goon1:
|
|
639 000004A7 3D2003 cmp ax, 800
|
|
640 000004AA 7509 jnz res_goon2
|
|
641 000004AC 81FB5802 cmp bx, 600
|
|
642 000004B0 753A jnz vesa_modenogood
|
|
643 000004B2 E92D00 jmp vesa_modegood
|
|
644 res_goon2:
|
|
645 000004B5 3D0004 cmp ax, 1024
|
|
646 000004B8 7509 jnz res_goon3
|
|
647 000004BA 81FB0003 cmp bx, 768
|
|
648 000004BE 752C jnz vesa_modenogood
|
|
649 000004C0 E91F00 jmp vesa_modegood
|
|
650 res_goon3:
|
|
651 000004C3 3D0005 cmp ax, 1280
|
|
652 000004C6 750F jnz res_goon4
|
|
653 000004C8 81FB0004 cmp bx, 1024
|
|
654 000004CC 7414 jz vesa_modegood
|
|
655 000004CE 81FBC003 cmp bx, 960
|
|
656 000004D2 740E jz vesa_modegood
|
|
657 000004D4 E91500 jmp vesa_modenogood
|
|
658 res_goon4:
|
|
659 000004D7 3D4006 cmp ax, 1600
|
|
660 000004DA 7510 jnz vesa_modenogood
|
|
661 000004DC 81FBB004 cmp bx, 1200
|
|
662 000004E0 750A jnz vesa_modenogood
|
|
663 vesa_modegood:
|
|
664 000004E2 5E pop si
|
|
665 000004E3 5F pop di
|
|
666 000004E4 1F pop ds
|
|
667 000004E5 07 pop es
|
|
668 000004E6 5A pop dx
|
|
669 000004E7 59 pop cx
|
|
670 000004E8 5B pop bx
|
|
671 000004E9 31C0 xor ax, ax
|
|
672 000004EB C3 ret
|
|
673 vesa_modenogood:
|
|
674 000004EC 5E pop si
|
|
675 000004ED 5F pop di
|
|
676 000004EE 1F pop ds
|
|
677 000004EF 07 pop es
|
|
678 000004F0 5A pop dx
|
|
679 000004F1 59 pop cx
|
|
680 000004F2 5B pop bx
|
|
681 000004F3 B8FFFF mov ax, 0xffff
|
|
682 000004F6 C3 ret
|
|
683
|
|
684 ;------------------------------------------------------
|
|
685 vesa_done:
|
|
686
|
|
687 ; xor ax, ax ;wait for keypress...
|
|
688 ; int 0x16
|
|
689
|
|
690 000004F7 E9D902 jmp go_pm
|
|
691
|
|
692 ;------------------------------------------------------
|
|
693 puts:
|
|
694 000004FA AC lodsb
|
|
695 000004FB 08C0 or al, al
|
|
696 000004FD 7406 jz puts_done
|
|
697 000004FF AA stosb
|
|
698 00000500 88E0 mov al, ah
|
|
699 00000502 AA stosb
|
|
700 00000503 EBF5 jmp puts
|
|
701 puts_done:
|
|
702 00000505 C3 ret
|
|
703
|
|
704 ;------------------------------------------------------
|
|
705 checkvesa:
|
|
706 00000506 3D4F00 cmp ax, 0x004F
|
|
707 00000509 7501 jnz vesaerror
|
|
708 0000050B C3 ret
|
|
709 vesaerror:
|
|
710 0000050C B800B8 mov ax, 0xb800
|
|
711 0000050F 8EC0 mov es, ax
|
|
712 00000511 31C0 xor ax, ax
|
|
713 00000513 8ED8 mov ds, ax
|
|
714 00000515 BE[BA06] mov si, txt_vesaerror
|
|
715 00000518 BF000F mov di, 160*24
|
|
716 0000051B B404 mov ah, 4
|
|
717 0000051D E8DAFF call puts
|
|
718 00000520 FA cli
|
|
719 00000521 F4 hlt
|
|
720
|
|
721 ;-------Function console_putDec
|
|
722 ;input:
|
|
723 ; AX = number to display
|
|
724 ;output:
|
|
725 ; number written in decimal to es:di
|
|
726 console_putDec:
|
|
727 00000522 60 pusha
|
|
728 00000523 31D2 xor dx, dx
|
|
729 00000525 30FF xor bh, bh ;no characters written yet
|
|
730 00000527 B91027 mov cx, 10000
|
|
731 0000052A F7F1 div cx ;ax=quotiont, dx=remainder
|
|
732 0000052C 053000 add ax, '0'
|
|
733 0000052F 3D3000 cmp ax, '0'
|
|
734 00000532 7405 je .goon1
|
|
735 00000534 E86F00 call console_putChar
|
|
736 00000537 B701 mov bh, 1
|
|
737
|
|
738 .goon1:
|
|
739 00000539 89D0 mov ax, dx ;load remainder to ax
|
|
740 0000053B 31D2 xor dx, dx
|
|
741 0000053D B9E803 mov cx, 1000
|
|
742 00000540 F7F1 div cx ;ax=quotiont, dx=remainder
|
|
743 00000542 053000 add ax, '0'
|
|
744 00000545 3D3000 cmp ax, '0'
|
|
745 00000548 7408 je .goon11
|
|
746 0000054A E85900 call console_putChar
|
|
747 0000054D B701 mov bh, 1
|
|
748 0000054F E90800 jmp .goon2
|
|
749 .goon11:
|
|
750 00000552 80FF00 cmp bh, 0
|
|
751 00000555 7403 je .goon2
|
|
752 00000557 E84C00 call console_putChar
|
|
753
|
|
754 .goon2:
|
|
755 0000055A 89D0 mov ax, dx ;load remainder to ax
|
|
756 0000055C 31D2 xor dx, dx
|
|
757 0000055E B96400 mov cx, 100
|
|
758 00000561 F7F1 div cx ;ax=quotiont, dx=remainder
|
|
759 00000563 053000 add ax, '0'
|
|
760 00000566 3D3000 cmp ax, '0'
|
|
761 00000569 7408 je .goon21
|
|
762 0000056B E83800 call console_putChar
|
|
763 0000056E B701 mov bh, 1
|
|
764 00000570 E90800 jmp .goon3
|
|
765 .goon21:
|
|
766 00000573 80FF00 cmp bh, 0
|
|
767 00000576 7403 je .goon3
|
|
768 00000578 E82B00 call console_putChar
|
|
769
|
|
770 .goon3:
|
|
771 0000057B 89D0 mov ax, dx ;load remainder to ax
|
|
772 0000057D 31D2 xor dx, dx
|
|
773 0000057F B90A00 mov cx, 10
|
|
774 00000582 F7F1 div cx ;ax=quotiont, dx=remainder
|
|
775 00000584 053000 add ax, '0'
|
|
776 00000587 3D3000 cmp ax, '0'
|
|
777 0000058A 7408 je .goon31
|
|
778 0000058C E81700 call console_putChar
|
|
779 0000058F B701 mov bh, 1
|
|
780 00000591 E90800 jmp .goon4
|
|
781 .goon31:
|
|
782 00000594 80FF00 cmp bh, 0
|
|
783 00000597 7403 je .goon4
|
|
784 00000599 E80A00 call console_putChar
|
|
785 .goon4: ;here dx contains last remainder
|
|
786 0000059C 89D0 mov ax, dx
|
|
787 0000059E 053000 add ax, '0'
|
|
788 000005A1 E80200 call console_putChar
|
|
789
|
|
790 000005A4 61 popa
|
|
791 000005A5 C3 ret
|
|
792
|
|
793 ;------------------------------------------------------
|
|
794 console_putChar:
|
|
795 000005A6 AA stosb
|
|
796 000005A7 B007 mov al, 7
|
|
797 000005A9 AA stosb
|
|
798 000005AA C3 ret
|
|
799
|
|
800 ;------------------------------------------------------
|
|
801 puthex:
|
|
802 ;es:di points to video memory
|
|
803 ;al holds hex value
|
|
804
|
|
805 000005AB 50 push ax
|
|
806 000005AC 88C4 mov ah, al
|
|
807 000005AE C1E804 shr ax, 4
|
|
808 000005B1 240F and al, 0x0F
|
|
809 000005B3 0430 add al, '0'
|
|
810 000005B5 3C39 cmp al, '9'
|
|
811 000005B7 7E02 jle puthex_goon1
|
|
812 000005B9 0407 add al, 'A'-'9'-1
|
|
813 puthex_goon1:
|
|
814 000005BB 3C30 cmp al, '0'
|
|
815 000005BD 7404 jz puthex_skipzero
|
|
816 000005BF AA stosb
|
|
817 000005C0 B007 mov al, 7
|
|
818 000005C2 AA stosb
|
|
819 puthex_skipzero:
|
|
820 000005C3 58 pop ax
|
|
821 000005C4 50 push ax
|
|
822 000005C5 240F and al, 0x0F
|
|
823 000005C7 0430 add al, '0'
|
|
824 000005C9 3C39 cmp al, '9'
|
|
825 000005CB 7E02 jle puthex_goon2
|
|
826 000005CD 0407 add al, 'A'-'9'-1
|
|
827 puthex_goon2:
|
|
828 000005CF AA stosb
|
|
829 000005D0 B007 mov al, 7
|
|
830 000005D2 AA stosb
|
|
831 000005D3 58 pop ax
|
|
832 000005D4 C3 ret
|
|
833
|
|
834 ;------------------------------------------------------
|
|
835 puthex2:
|
|
836 ;es:di points to video memory, always displays 2 characters!
|
|
837 ;al holds hex value
|
|
838
|
|
839 000005D5 50 push ax
|
|
840 000005D6 88C4 mov ah, al
|
|
841 000005D8 C1E804 shr ax, 4
|
|
842 000005DB 240F and al, 0x0F
|
|
843 000005DD 0430 add al, '0'
|
|
844 000005DF 3C39 cmp al, '9'
|
|
845 000005E1 7E02 jle puthex2_goon1
|
|
846 000005E3 0407 add al, 'A'-'9'-1
|
|
847 puthex2_goon1:
|
|
848 000005E5 AA stosb
|
|
849 000005E6 B007 mov al, 7
|
|
850 000005E8 AA stosb
|
|
851 000005E9 58 pop ax
|
|
852 000005EA 50 push ax
|
|
853 000005EB 240F and al, 0x0F
|
|
854 000005ED 0430 add al, '0'
|
|
855 000005EF 3C39 cmp al, '9'
|
|
856 000005F1 7E02 jle puthex2_goon2
|
|
857 000005F3 0407 add al, 'A'-'9'-1
|
|
858 puthex2_goon2:
|
|
859 000005F5 AA stosb
|
|
860 000005F6 B007 mov al, 7
|
|
861 000005F8 AA stosb
|
|
862 000005F9 58 pop ax
|
|
863 000005FA C3 ret
|
|
864
|
|
865 ;------------------------------------------------------
|
|
866 000005FB 202020202020202020- txt_welcome: db " Welcome to HOS v", VERSION, "! ", 0
|
|
867 00000604 202020202020202020-
|
|
868 0000060D 202020202020202020-
|
|
869 00000616 202057656C636F6D65-
|
|
870 0000061F 20746F20484F532076-
|
|
871 00000628 302E312E3221202020-
|
|
872 00000631 202020202020202020-
|
|
873 0000063A 202020202020202020-
|
|
874 00000643 202020202020202000
|
|
875 0000064C 312E20446F206E6F74- txt_rd1: db "1. Do not load an initial ram disk", 0
|
|
876 00000655 206C6F616420616E20-
|
|
877 0000065E 696E697469616C2072-
|
|
878 00000667 616D206469736B00
|
|
879 0000066F 322E204C6F61642069- txt_rd2: db "2. Load initial ram disk from floppy", 0
|
|
880 00000678 6E697469616C207261-
|
|
881 00000681 6D206469736B206672-
|
|
882 0000068A 6F6D20666C6F707079-
|
|
883 00000693 00
|
|
884 00000694 456E74657220796F75- txt_input: db "Enter your selection: ", 0
|
|
885 0000069D 722073656C65637469-
|
|
886 000006A6 6F6E3A2000
|
|
887 000006AB 564553412076657273- txt_vesa: db "VESA version: ", 0
|
|
888 000006B4 696F6E3A2000
|
|
889 000006BA 564553412066756E63- txt_vesaerror: db "VESA function call error! Halting system!", 0
|
|
890 000006C3 74696F6E2063616C6C-
|
|
891 000006CC 206572726F72212048-
|
|
892 000006D5 616C74696E67207379-
|
|
893 000006DE 7374656D2100
|
|
894 000006E4 56455341206E6F7420- txt_novesa: db "VESA not found. Starting in console mode...", 0
|
|
895 000006ED 666F756E642E205374-
|
|
896 000006F6 617274696E6720696E-
|
|
897 000006FF 20636F6E736F6C6520-
|
|
898 00000708 6D6F64652E2E2E00
|
|
899 00000710 564553412076657273- txt_vesaold: db "VESA version 2.0 required. Starting in console mode...", 0
|
|
900 00000719 696F6E20322E302072-
|
|
901 00000722 657175697265642E20-
|
|
902 0000072B 5374617274696E6720-
|
|
903 00000734 696E20636F6E736F6C-
|
|
904 0000073D 65206D6F64652E2E2E-
|
|
905 00000746 00
|
|
906 00000747 612E20436F6E736F6C- txt_consolemode: db "a. Console mode only.", 0
|
|
907 00000750 65206D6F6465206F6E-
|
|
908 00000759 6C792E00
|
|
909 0000075D 457874656E64656420- txt_memerror: db "Extended Memory Map information unavailable! Halting system...", 0
|
|
910 00000766 4D656D6F7279204D61-
|
|
911 0000076F 7020696E666F726D61-
|
|
912 00000778 74696F6E20756E6176-
|
|
913 00000781 61696C61626C652120-
|
|
914 0000078A 48616C74696E672073-
|
|
915 00000793 797374656D2E2E2E00
|
|
916
|
|
917 ;------------------------------------------------------
|
|
918 getCHSfromCluster:
|
|
919 ;input: ax=lba of sector on floppy (0-2879)
|
|
920 0000079C 051F00 add ax, 31 ;convert logical cluster# to lba#
|
|
921 0000079F 31D2 xor dx, dx ;lba->chs
|
|
922 000007A1 BB1200 mov bx, 18
|
|
923 000007A4 F7F3 div bx
|
|
924 000007A6 42 inc dx
|
|
925 000007A7 88D1 mov cl, dl ;sector# (1-18)
|
|
926 000007A9 31D2 xor dx, dx
|
|
927 000007AB BB0200 mov bx, 2
|
|
928 000007AE F7F3 div bx
|
|
929 000007B0 88C5 mov ch, al ;cylinder# (0-79)
|
|
930 000007B2 88D6 mov dh, dl ;head# (0-1)
|
|
931 000007B4 C3 ret
|
|
932
|
|
933
|
|
934 ;-------------------------------------------------------
|
|
935 gdtr:
|
|
936 000007B5 1700 dw gdt_end-gdt-1
|
|
937 000007B7 [BB070000] dd gdt
|
|
938 gdt:
|
|
939 000007BB 00000000 dd 0
|
|
940 000007BF 00000000 dd 0
|
|
941
|
|
942 KERNEL_CODE equ $-gdt
|
|
943 000007C3 FF db 0xff ;limit 7:0
|
|
944 000007C4 FF db 0xff ;limit 15:8
|
|
945 000007C5 00 db 0x00 ;base 7:0
|
|
946 000007C6 00 db 0x00 ;base 15:8
|
|
947 000007C7 00 db 0x00 ;base 23:16
|
|
948 000007C8 9A db 0x9a ;access
|
|
949 000007C9 CF db 0xcf ;flags / limit 19:16
|
|
950 000007CA 00 db 0x00 ;base 31:24
|
|
951
|
|
952 KERNEL_DATA equ $-gdt
|
|
953 000007CB FF db 0xff ;segment 16 = 4gb data
|
|
954 000007CC FF db 0xff
|
|
955 000007CD 00 db 0x00
|
|
956 000007CE 00 db 0x00
|
|
957 000007CF 00 db 0x00
|
|
958 000007D0 92 db 0x92
|
|
959 000007D1 CF db 0xcf ;cf
|
|
960 000007D2 00 db 0x00
|
|
961
|
|
962 gdt_end:
|
|
963
|
|
964 ;------------------------------------------------------
|
|
965 go_pm:
|
|
966 000007D3 31C0 xor ax, ax
|
|
967 000007D5 8ED8 mov ds, ax
|
|
968 000007D7 0F0116[B507] lgdt [gdtr]
|
|
969 000007DC FA cli
|
|
970 000007DD 0F20C0 mov eax, cr0
|
|
971 000007E0 6640 inc eax
|
|
972 000007E2 0F22C0 mov cr0, eax
|
|
973
|
|
974 000007E5 EA[EA07]0800 jmp KERNEL_CODE:pmode
|
|
975
|
|
976 bits 32
|
|
977 pmode:
|
|
978 000007EA 66B81000 mov ax, KERNEL_DATA
|
|
979 000007EE 8EC0 mov es, ax
|
|
980 000007F0 8ED8 mov ds, ax
|
|
981 000007F2 8EE0 mov fs, ax
|
|
982 000007F4 8EE8 mov gs, ax
|
|
983 000007F6 EA000010000800 jmp KERNEL_CODE:BOOT_KERNEL_ADD
|
|
984
|
|
985 000007FD 4B45524E454C202042- kernel: db "KERNEL BIN", 0
|
|
986 00000806 494E00
|
|
987
|
|
988
|