/*** * clear vga screen */ void vga_clear() { vga_d_char_t *pos, *end; end = VGA_BUF + VGA_HEIGHT * VGA_WIDTH * sizeof(vga_d_char_t); for (pos = VGA_BUF; pos < end; pos++) { (*pos).c = NULL; (*pos).color = FORMAT_COLORS(VGA_STATE.fg, VGA_STATE.bg); } vga_update_cursor(0, 0); }
// bug char * scanf() { char* tmp = (char*)malloc(150 * sizeof(char)); char inp = ' '; int i = 0; vga_enable_cursor(); do { vga_update_cursor(); kbd_flush_buffer(); inp = kbd_pull_char(); if (inp != 0) { if (i > 149) break; else if (inp != '\b') { char* str = (char*)malloc(2*sizeof(char)); str[0] = inp; str[1] = '\0'; kprint_raw(str); free(str); if (inp != '\n') tmp[i] = inp; i++; } else { if (i > 0) { // Clear character in array i--; tmp[i] = 0; // Remove character from screen int new_pos = (vga_get_row() * 80 + vga_get_column()) - 1; vga_set_position(new_pos / 80, new_pos % 80); print_raw(" "); vga_set_position(new_pos / 80, new_pos % 80); } } } } while (inp != '\n'); tmp[i-1] = '\0'; vga_disable_cursor(); char* ret = (char*)malloc(strlen(tmp)+1 * sizeof(char)); for (int ii = 0; ii < strlen(tmp); ii++) ret[ii] = tmp[ii]; ret[strlen(tmp)] = '\0'; free(tmp); return ret; }
// Reposition the cursor, and possibly scroll the screen, so that the // cursor is in bounds. void vga_reposition() { if (vga_column >= kVgaWidth) { vga_column = 0; vga_row++; } int overhang = vga_row - kVgaHeight + 1; if (overhang > 0) { // We'll scroll the screen by 'overhang' rows. const int bytesToScroll = overhang * kVgaWidth * sizeof(VgaCharacter); memmove((void *) kVgaBuffer, (void *) (kVgaBuffer + bytesToScroll), kVgaWidth * kVgaHeight * sizeof(VgaCharacter) - bytesToScroll); for (unsigned row = kVgaHeight - overhang; row < kVgaHeight; row++) { vga_erase_row(row); } vga_row = kVgaHeight - 1; } vga_update_cursor(); }