]> git.lizzy.rs Git - nyax.git/blob - stage3/framebuffer.asm
Force make to use bash (#1)
[nyax.git] / stage3 / framebuffer.asm
1 %include "stage3/colors.asm"
2 global print_chr, print_str, print_dec, print_hex, clear_screen, newline
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_hex:
118         mov rsi, 0x10
119         jmp print_num
120 print_dec:
121         mov rsi, 10
122 print_num:
123         mov rax, rdi
124         xor rcx, rcx
125 .convert:
126         inc rcx
127         xor rdx, rdx
128         div rsi
129         cmp dl, 10
130         jb .digit
131         add dl, 'A'-10
132         jmp .next
133 .digit:
134         add dl, '0'
135 .next:
136         push rdx
137         cmp rax, 0
138         jne .convert
139 .print:
140         cmp rcx, 0
141         je .return
142         dec rcx
143         pop rdi
144         push rcx
145         call print_chr
146         pop rcx
147         jmp .print
148 .return:
149         ret
150
151 clear_screen:
152         mov qword[cursor], 0xB8000
153 .clr:
154         cmp qword[cursor], 0xB8FA0
155         je .return
156         mov dil, ' '
157         call set_chr
158         jmp .clr
159 .return:
160         mov qword[cursor], 0xB8000
161         mov byte[pos.row], 0
162         mov byte[pos.col], 0
163         jmp update_cursor