static void vgaterm_lf() { vgaterm_cr(); if (!scrolling) { for (uint16_t *p = screen + COLS; p < screen + SCREEN_SIZE; p++) { *(p - COLS) = *p; } for (uint16_t *p = screen + SCREEN_SIZE - COLS; p < screen + SCREEN_SIZE; p++) { *p = COLOR | SPACE; } } scrollback_cursor = vga_scrollback_buffer + scrollback_end; for (int i = 0; i < COLS; i++) *(scrollback_cursor + i) = SPACE; if (scrollback_end == scrollback_start) { scrollback_start += COLS; if (scrollback_start == scrollback_lines * COLS) scrollback_start = 0; if (scrolling) { scrollback_top--; if (scrollback_top < 0) scrollback_top = 0; } } scrollback_end += COLS; if (scrollback_end == scrollback_lines * COLS) scrollback_end = 0; if (scrolling) { scrollback_max++; if (scrollback_max >= scrollback_lines - ROWS) scrollback_max = scrollback_lines - ROWS; vgaterm_draw_scrollback(); } vga_set_cursor(cursor - screen); }
void vgaterm_write(char c) { switch (c) { case 10: vgaterm_lf(); return; default: if (c >= 32) { *scrollback_cursor++ = c; if (scrolling) { cursor++; } else { *cursor++ = COLOR | c; } if ((cursor - screen) % 80 == 0) vgaterm_lf(); vga_set_cursor(cursor - screen); } break; } }
// Disables the cursor void vga_disable_cursor() { if (cursor_enabled) { vga_set_cursor(255, 255); cursor_enabled = 0; } }
// Enables the cursor void vga_enable_cursor() { if (!cursor_enabled) { cursor_enabled = 1; vga_set_cursor(255, 255); } }
// Updates the cursor void vga_update_cursor() { vga_set_cursor(column, row); }