Repository navigation
Expand file tree
/
Copy pathkernel.asm
More file actions
168 lines (125 loc) · 2.64 KB
/
Copy pathkernel.asm
File metadata and controls
168 lines (125 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
162
163
164
165
166
167
168
BITS 32
VGA_WIDTH equ 80
VGA_HEIGHT equ 25
VGA_COLOR_BLACK equ 0
VGA_COLOR_BLUE equ 1
VGA_COLOR_GREEN equ 2
VGA_COLOR_CYAN equ 3
VGA_COLOR_RED equ 4
VGA_COLOR_MAGENTA equ 5
VGA_COLOR_BROWN equ 6
VGA_COLOR_LIGHT_GREY equ 7
VGA_COLOR_DARK_GREY equ 8
VGA_COLOR_LIGHT_BLUE equ 9
VGA_COLOR_LIGHT_GREEN equ 10
VGA_COLOR_LIGHT_CYAN equ 11
VGA_COLOR_LIGHT_RED equ 12
VGA_COLOR_LIGHT_MAGENTA equ 13
VGA_COLOR_LIGHT_BROWN equ 14
VGA_COLOR_WHITE equ 15
global kernel_main
kernel_main:
mov dh, VGA_COLOR_LIGHT_GREY
mov dl, VGA_COLOR_BLACK
call terminal_set_color
mov esi, hello_string
call terminal_write_string
jmp $
; IN = dl: y, dh: x
; OUT = dx: Index with offset 0xB8000 at VGA buffer
; Other registers preserved
terminal_getidx:
push ax; preserve registers
shl dh, 1 ; multiply by two because every entry is a word that takes up 2 bytes
mov al, VGA_WIDTH
mul dl
mov dl, al
shl dl, 1 ; same
add dl, dh
mov dh, 0
pop ax
ret
; IN = dl: bg color, dh: fg color
; OUT = none
terminal_set_color:
shl dl, 4
or dl, dh
mov [terminal_color], dl
ret
; IN = dl: y, dh: x, al: ASCII char
; OUT = none
terminal_putentryat:
pusha
call terminal_getidx
mov ebx, edx
mov dl, [terminal_color]
mov byte [0xB8000 + ebx], al
mov byte [0xB8001 + ebx], dl
popa
ret
; IN = al: ASCII char
terminal_putchar:
mov dx, [terminal_cursor_pos] ; This loads terminal_column at DH, and terminal_row at DL
call terminal_putentryat
inc dh
cmp dh, VGA_WIDTH
jne .cursor_moved
mov dh, 0
inc dl
cmp dl, VGA_HEIGHT
jne .cursor_moved
mov dl, 0
.cursor_moved:
; Store new cursor position
mov [terminal_cursor_pos], dx
ret
; IN = cx: length of string, ESI: string location
; OUT = none
terminal_write:
pusha
.loopy:
mov al, [esi]
call terminal_putchar
dec cx
cmp cx, 0
je .done
inc esi
jmp .loopy
.done:
popa
ret
; IN = ESI: zero delimited string location
; OUT = ECX: length of string
terminal_strlen:
push eax
push esi
mov ecx, 0
.loopy:
mov al, [esi]
cmp al, 0
je .done
inc esi
inc ecx
jmp .loopy
.done:
pop esi
pop eax
ret
; IN = ESI: string location
; OUT = none
terminal_write_string:
pusha
call terminal_strlen
call terminal_write
popa
ret
; Exercises:
; - Newline support
; - Terminal scrolling when screen is full
; Note:
; - The string is looped through twice on printing.
hello_string db "Hello, kernel World!", 0xA, 0 ; 0xA = line feed
terminal_color db 0
terminal_cursor_pos:
terminal_column db 0
terminal_row db 0