/*======================================================================* flush *======================================================================*/ PRIVATE void flush(CONSOLE* p_con) { if (is_current_console(p_con)) { set_cursor(p_con->cursor); set_video_start_addr(p_con->current_start_addr); } }
/*======================================================================* select_console *======================================================================*/ PUBLIC void select_console(int nr_console) { if ((nr_console <0) || (nr_console >= NR_CONSOLES)) { return; } nr_current_console = nr_console; set_video_start_addr(console_table[nr_console].current_start_addr); set_cursor(console_table[nr_console].cursor); }
/*======================================================================* clear_screen *======================================================================*/ PUBLIC void clear_screen(CONSOLE* p_con) { p_con->cursor = 0; for (int i = 0; i <= 25; i++) { for (int j = 0; j <= 40; j++) { out_string(p_con, " ", White); } } p_con->cursor = 0; if (p_con == console_table + nr_current_console){ set_cursor(p_con->cursor); set_video_start_addr(p_con->original_addr); } }
/*====================================================================== scroll_screen *======================================================================*/ PUBLIC void scroll_screen(CONSOLE* p_con, int direction) { if (direction == SCR_UP) { if (p_con->current_start_addr > p_con->original_addr) { p_con->current_start_addr -= SCREEN_WIDTH; } } else if (direction == SCR_DN) { if (p_con->current_start_addr + SCREEN_SIZE < p_con->original_addr + p_con->v_mem_limit) { p_con->current_start_addr += SCREEN_WIDTH; } } set_video_start_addr(p_con->current_start_addr); set_cursor(p_con->cursor); }
int select_tty(int tty_index) { int ret =0; if ( 0 <= cur_tty_index && cur_tty_index < TTY_NUM) cur_tty_index = tty_index; else ret = -1; //s32_print_int(tty_table[cur_tty_index].console->vm_start, (u8*)(0xb8000+160*1), 16); int org_x, org_y; get_xy(tty_table[cur_tty_index].console, &org_x, &org_y); set_xy(tty_table[cur_tty_index].console, 0, 0); s32_console_print_str(tty_table[cur_tty_index].console, "simple os tty "); switch (cur_tty_index) { case 0: s32_console_print_char(tty_table[cur_tty_index].console, '1'); break; case 1: s32_console_print_char(tty_table[cur_tty_index].console, '2'); break; case 2: s32_console_print_char(tty_table[cur_tty_index].console, '3'); break; default: break; } s32_console_print_str(tty_table[cur_tty_index].console, "\r\nfake login: "******"\r\n\r\n"); set_xy(tty_table[cur_tty_index].console, org_x, org_y); u16 cur_console_vm_start = (tty_table[cur_tty_index].console->vm_start-0xb8000)/2; set_video_start_addr(cur_console_vm_start); //set_cursor(cur_console_vm_start + tty_table[cur_tty_index].console->cur_x + tty_table[cur_tty_index].console->cur_y*80); set_cursor(cur_console_vm_start + org_x + org_y*80); return ret; }
/** * Set the cursor and starting address of a console by writing the * CRT Controller Registers. * * @param con The console to be set. *****************************************************************************/ PUBLIC void flush(CONSOLE* con) { if (is_current_console(con)) { set_cursor(con->cursor); set_video_start_addr(con->crtc_start); } #ifdef __TTY_DEBUG__ int lineno = 0; for (lineno = 0; lineno < con->con_size / SCR_WIDTH; lineno++) { u8 * pch = (u8*)(V_MEM_BASE + (con->orig + (lineno + 1) * SCR_WIDTH) * 2 - 4); *pch++ = lineno / 10 + '0'; *pch++ = RED_CHAR; *pch++ = lineno % 10 + '0'; *pch++ = RED_CHAR; } #endif }
// prefix s32 means simple, 32bit code (in x86 protected mode) // this version don't specify video address // for console io void s32_print_char(u8 ch) { switch (ch) { case '\r': //cur_x = cur_x - (cur_x % 80); cur_x = 0; text_vb = (u8*)((u32)text_vb - (((u32)text_vb-0xb8000) % 160)); cur_pos = (((u32)text_vb - 0xb8000)/2); s32_print_int(cur_pos, (u8*)(0xb8000+160*1 + 18*2+20), 16); break; case '\n': text_vb+=160; cur_pos += 80; s32_print_int(cur_pos, (u8*)(0xb8000+160*1 + 18*2+40), 16); ++cur_y; break; case 0x20 ... 0x7e: // ascii printable char. gnu extension: I don't want use gnu extension, but it is very convenience. *text_vb = ch; *(text_vb+1) = (text_fg|text_bg); text_vb+=2; ++cur_x; ++cur_pos; break; default: break; } set_cursor(cur_pos); s32_print_int(cur_pos, (u8*)(0xb8000+160*1 + 18*2+60), 16); clear_line(18); s32_print_int(cur_x, (u8*)(0xb8000+160*18 + 23*2+40), 10); s32_print_int(cur_y, (u8*)(0xb8000+160*18 + 23*2+60), 10); if (cur_y >= 25 ) set_video_start_addr(80*(cur_y - 24)); }
void s32_console_print_char(Console *console, u8 ch) { if (console->type == GRAPHIC_CONSOLE) { //BOCHS_MB //draw_char(console->cur_x, console->cur_y, ch); draw_8x16_ch(console->cur_x, console->cur_y, ch, 5); console->cur_x += 8; if (console->cur_x >= 320) { console->cur_x = 0; console->cur_y += 16; } #if 1 if (ch == '`') { static u8 odd=0; extern u8 bg_raw_data[]; extern int bg_w; extern int bg_h; extern u8 palette_data[]; extern u8 os_bg_raw_data[]; extern int os_bg_w; extern int os_bg_h; extern u8 os_palette_data[]; draw_256_grid(); switch (odd) { case 0: { draw_bg(120, 0, bg_raw_data, bg_w, bg_h, palette_data); break; } case 1: { draw_bg(0, 0, os_bg_raw_data, os_bg_w, os_bg_h, os_palette_data); break; } case 2: { draw_bg(0, 0, pe_320_180_256_bmp, pe_320_180_256_wb, pe_320_180_256_hb, pe_320_180_256_palette_data); break; } } odd = (odd+1) % 3; } #endif return; } u8 *console_vb = (u8*)console->cur_vm; u32 vm = console->vm_start; //u8 *console_vb = (u8*)(0xb8000); //s32_put_char(ch, (u8*)(0xb8000+160*19)); //if (console->cur_y >= ((VIDEO_RAM_SIZE/4000) * 25) ) if (console->cur_y >= 50) return; switch (ch) { case '\r': console->cur_x = 0; break; case '\n': ++console->cur_y; break; case 0x20 ... 0x7e: // ascii printable char. gnu extension: I don't want use gnu extension, but it is very convenience. //*console_vb = ch; //*(console_vb+1) = (text_fg|text_bg); *((u8 *)(vm + (console->cur_x + console->cur_y * 80)*2)) = ch; *((u8 *)(vm + (console->cur_x + console->cur_y * 80)*2)+1) = 7; // WHITE ++console->cur_x; if (console->cur_x >= 80) { console->cur_x = 0; ++console->cur_y; } break; default: break; } console_vb = (console->cur_x + console->cur_y*80)*2 + console->vm_start; if (console->cur_y >= 25 ) set_video_start_addr(80*(console->cur_y - 24)); set_cursor((console->vm_start - 0xb8000)/2 + console->cur_x + console->cur_y * 80); console->cur_vm = (u32)console_vb; }