This repository has been archived by the owner on Nov 27, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathkernel.asm
78 lines (67 loc) · 2.15 KB
/
kernel.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
;===============================================================================
; Copyright (C) Andrzej Adamczyk (at https://blackdev.org/). All rights reserved.
; GPL-3.0 License
;
; Main developer:
; Andrzej Adamczyk
;===============================================================================
struc KERNEL_VIDEO_STRUCTURE_MODE_INFO_BLOCK
.mode_attributes resb 2
.win_a_attributes resb 1
.win_b_attributes resb 1
.win_granularity resb 2
.win_size resb 2
.win_a_segment resb 2
.win_b_segment resb 2
.win_func_ptr resb 4
.bytes_per_scanline resb 2
.x_resolution resb 2
.y_resolution resb 2
.x_char_size resb 1
.y_char_size resb 1
.number_of_planes resb 1
.bits_per_pixel resb 1
.number_of_banks resb 1
.memory_model resb 1
.bank_size resb 1
.number_of_image_pages resb 1
.reserved0 resb 1
.red_mask_size resb 1
.red_field_position resb 1
.green_mask_size resb 1
.green_field_position resb 1
.blue_mask_size resb 1
.blue_field_position resb 1
.rsvd_mask_size resb 1
.direct_color_mode_info resb 2
.physical_base_address resb 4
.reserved1 resb 212
endstruc
; 64 bitowy kod jądra systemu
[bits 64]
; położenie kodu jądra systemu w pamięci fizycznej
[org 0x0000000000100000]
; nagłówek poszukiwany przez program rozruchowy Zero
align 0x08 ; wyrównaj nagłówek do pełnego adresu
header:
db "Z E R O " ; czysta magija
dq kernel ; wskaźnik do głównej procedury jądra systemu
;===============================================================================
kernel:
; domyślny kolor tła
mov eax, 0x00D400C5
; pobierz ilość pikseli na osi Y
mov bx, word [rdx + KERNEL_VIDEO_STRUCTURE_MODE_INFO_BLOCK.y_resolution]
; pobierz adres fizyczny przestrzeni pamięci karty graficznej
mov edi, dword [rdx + KERNEL_VIDEO_STRUCTURE_MODE_INFO_BLOCK.physical_base_address]
.loop:
; pobierz ilość pikseli na osi X
mov cx, word [rdx + KERNEL_VIDEO_STRUCTURE_MODE_INFO_BLOCK.x_resolution]
rep stosd
; wypełniono całą przestrzeń?
dec bx
jnz .loop ; nie
; zatrzymaj dalsze wykonywanie kodu jądra systemu
jmp $
; wyrównaj kod jądra systemu do pełnego rozmiaru strony
align 0x1000