%include "colors.asm" global print_chr, print_str, print_num, clear_screen extern memcpy section .data pos: .row: db 0 .col: db 0 cursor: dq 0xB8000 color: db COLOR_WHITE | (COLOR_BLACK << 4) section .text set_color: shl sil, 4 add dil, sil mov [color], dil update_cursor: mov rbx, [cursor] sub rbx, 0xB8000 shr rbx, 1 mov dx, 0x3D4 mov al, 14 out dx, al mov dx, 0x3D5 mov al, bh out dx, al mov dx, 0x3D4 mov al, 15 out dx, al mov dx, 0x3D5 mov al, bl out dx, al ret set_chr: mov rax, [cursor] mov byte[rax], dil inc rax mov dil, [color] mov [rax], dil inc rax mov [cursor], rax jmp update_cursor vertical_tab: mov al, [pos.row] inc al cmp al, 25 je .scroll mov [pos.row], al mov rax, [cursor] add rax, 160 mov [cursor], rax jmp update_cursor .scroll: mov rdi, 0xB8000 mov rsi, 0xB80A0 mov rdx, 0xF00 jmp memcpy carriage_return: mov rax, [cursor] xor rbx, rbx mov bl, [pos.col] shl bl, 1 sub rax, rbx mov [cursor], rax mov byte[pos.col], 0 jmp update_cursor newline: call vertical_tab jmp carriage_return print_chr: cmp dil, 10 je newline cmp dil, 11 je vertical_tab cmp dil, 13 je carriage_return mov al, [pos.col] inc al cmp al, 80 je .newline mov [pos.col], al jmp set_chr .newline: push rdi call newline pop rdi jmp set_chr print_str: mov rax, rdi .print: mov dil, [rax] cmp dil, 0 je .return push rax call print_chr pop rax inc rax jmp .print .return: ret print_num: mov rax, rdi mov r10, 10 xor rcx, rcx .convert: inc rcx xor rdx, rdx div r10 add dl, '0' push rdx cmp rax, 0 jne .convert .print: cmp rcx, 0 je .return dec rcx pop rdi push rcx call print_chr pop rcx jmp .print .return: ret clear_screen: mov qword[cursor], 0xB8000 .clr: cmp qword[cursor], 0xB8FA0 je .return mov dil, ' ' call set_chr jmp .clr .return: mov qword[cursor], 0xB8000 mov byte[pos.row], 0 mov byte[pos.col], 0 jmp update_cursor