]> git.lizzy.rs Git - nyax.git/blob - framebuffer.asm
Redesign kernel/stack/pagetable layout
[nyax.git] / framebuffer.asm
1 %include "colors.asm"
2 global print_chr, print_str, print_num, clear_screen
3 extern memcpy
4
5 section .data
6
7 pos:
8 .row: db 0
9 .col: db 0
10
11 cursor: dq 0xB8000
12 color: db COLOR_WHITE | (COLOR_BLACK << 4)
13
14 section .text
15
16 set_color:
17         shl sil, 4
18         add dil, sil
19         mov [color], dil
20
21 update_cursor:
22         mov rbx, [cursor]
23         sub rbx, 0xB8000
24         shr rbx, 1
25
26         mov dx, 0x3D4
27         mov al, 14
28         out dx, al
29
30         mov dx, 0x3D5
31         mov al, bh
32         out dx, al
33
34         mov dx, 0x3D4
35         mov al, 15
36         out dx, al
37
38         mov dx, 0x3D5
39         mov al, bl
40         out dx, al
41
42         ret
43
44 set_chr:
45         mov rax, [cursor]
46         mov byte[rax], dil
47         inc rax
48         mov dil, [color]
49         mov [rax], dil
50         inc rax
51         mov [cursor], rax
52         jmp update_cursor
53
54 vertical_tab:
55         mov al, [pos.row]
56         inc al
57         cmp al, 25
58         je .scroll
59         mov [pos.row], al
60         mov rax, [cursor]
61         add rax, 160
62         mov [cursor], rax
63         jmp update_cursor
64 .scroll:
65         mov rdi, 0xB8000
66         mov rsi, 0xB80A0
67         mov rdx, 0xF00
68         jmp memcpy
69
70 carriage_return:
71         mov rax, [cursor]
72         xor rbx, rbx
73         mov bl, [pos.col]
74         shl bl, 1
75         sub rax, rbx
76         mov [cursor], rax
77         mov byte[pos.col], 0
78         jmp update_cursor
79
80 newline:
81         call vertical_tab
82         jmp carriage_return
83
84 print_chr:
85         cmp dil, 10
86         je newline
87         cmp dil, 11
88         je vertical_tab
89         cmp dil, 13
90         je carriage_return
91         mov al, [pos.col]
92         inc al
93         cmp al, 80
94         je .newline
95         mov [pos.col], al
96         jmp set_chr
97 .newline:
98         push rdi
99         call newline
100         pop rdi
101         jmp set_chr
102
103 print_str:
104         mov rax, rdi
105 .print:
106         mov dil, [rax]
107         cmp dil, 0
108         je .return
109         push rax
110         call print_chr
111         pop rax
112         inc rax
113         jmp .print
114 .return:
115         ret
116
117 print_num:
118         mov rax, rdi
119         mov r10, 10
120         xor rcx, rcx
121 .convert:
122         inc rcx
123         xor rdx, rdx
124         div r10
125         add dl, '0'
126         push rdx
127         cmp rax, 0
128         jne .convert
129 .print:
130         cmp rcx, 0
131         je .return
132         dec rcx
133         pop rdi
134         push rcx
135         call print_chr
136         pop rcx
137         jmp .print
138 .return:
139         ret
140
141 clear_screen:
142         mov qword[cursor], 0xB8000
143 .clr:
144         cmp qword[cursor], 0xB8FA0
145         je .return
146         mov dil, ' '
147         call set_chr
148         jmp .clr
149 .return:
150         mov qword[cursor], 0xB8000
151         mov byte[pos.row], 0
152         mov byte[pos.col], 0
153         jmp update_cursor