-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathboot.asm
More file actions
165 lines (144 loc) · 2.88 KB
/
boot.asm
File metadata and controls
165 lines (144 loc) · 2.88 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
[BITS 16]
[ORG 0x7C00]
VIDEO_MEM equ 0xB800
SCREEN_WIDTH equ 80
SCREEN_HEIGHT equ 25
MAX_CHARS equ SCREEN_WIDTH * SCREEN_HEIGHT
start:
cli
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
sti
mov ax, 0x03 ; Text mode 80x25
int 0x10
call set_blue_background ; Set blue background
call display_logo ; Display the logo
mov si, welcome_msg
call print_text
main_loop:
call get_key
cmp al, 0x1B ; ESC - exit
je halt_system
cmp al, 0x08 ; Backspace
je handle_backspace
cmp al, 0x0D ; Enter
je handle_enter
call add_char_to_buffer
call print_char
jmp main_loop
handle_backspace:
call remove_last_char
jmp main_loop
handle_enter:
call check_clear_cmd
call new_line
jmp main_loop
halt_system:
cli
hlt
set_blue_background:
push es
mov ax, VIDEO_MEM
mov es, ax
xor di, di
mov cx, SCREEN_WIDTH * SCREEN_HEIGHT
mov ax, 0x1F20 ; Space (0x20) with white text (0x1F) on blue background
rep stosw
pop es
ret
display_logo:
push es
mov ax, VIDEO_MEM
mov es, ax
mov di, (SCREEN_WIDTH * 10 * 2) + 35 * 2
mov byte [es:di], '#'
mov byte [es:di + 1], 0x1F
add di, 2
mov byte [es:di], 'C'
mov byte [es:di + 1], 0x1F
add di, 2
mov byte [es:di], 'H'
mov byte [es:di + 1], 0x1F
add di, 2
mov byte [es:di], 'I'
mov byte [es:di + 1], 0x1F
add di, 2
mov byte [es:di], 'L'
mov byte [es:di + 1], 0x1F
add di, 2
mov byte [es:di], 'O'
mov byte [es:di + 1], 0x1F
add di, 2
mov byte [es:di], 'S'
mov byte [es:di + 1], 0x1F
add di, 2
mov byte [es:di], '#'
mov byte [es:di + 1], 0x1F
pop es
ret
print_text:
lodsb
test al, al
jz .done
mov ah, 0x0E
int 0x10
jmp print_text
.done:
ret
print_char:
mov ah, 0x0E
int 0x10
ret
get_key:
xor ah, ah
int 0x16
ret
add_char_to_buffer:
cmp cx, 64
jae .done
mov si, buffer
add si, cx
mov [si], al
inc cx
.done:
ret
remove_last_char:
test cx, cx
jz .done
dec cx
mov al, 0x08
call print_char
mov al, ' '
call print_char
mov al, 0x08
call print_char
.done:
ret
check_clear_cmd:
mov si, buffer
mov di, clear_cmd
mov cx, 5
repe cmpsb
jne .done
call clear_screen
.done:
ret
clear_screen:
call set_blue_background
xor cx, cx
ret
new_line:
mov al, 0x0D
call print_char
mov al, 0x0A
call print_char
xor cx, cx
ret
welcome_msg db 'Type "clear" to clean.', 0
clear_cmd db 'clear', 0
buffer times 64 db 0
times 510 - ($ - $$) db 0
dw 0xAA55