void screen_puts(const char *str) { int i; for (i = 0; str[i]; ++i) screen_putc(str[i]); }
u08 chunk_handle_char(u08 ch) { // something to process in raw chunk? if(bytes_left > 0) { // chunk with color? if((type=='B')&&(cell==0)) { cur_col = ch; cell = 1; } // text char else { if(type == 0) { screen_putc(cur_x, cur_y, ch); } else { screen_putch(cur_x, cur_y, ch, cur_col, cur_flags); } span--; if(span == 0) { cur_x = pos_x; span = width; cur_y ++; // answer each span with a hash as a handshake uart_send('#'); } else { cur_x ++; } cell = 0; } bytes_left--; return 1; } else { return 0; } }
void keyboard_callback(registers_t regs) { // screen_puts("recieved interrupt: "); unsigned char scancode; /* Read from the keyboard's data buffer */ scancode = inb(0x60); if (scancode & 0x80) { // a key is released if (scancode == 0xAA || scancode == 0xB6) { // shift released shift = 0; } } else if (scancode == 0x2A || scancode == 0x36) { // shift pressed but yet released shift = 1; } else { // screen_putc(scancode); switch(scancode) { case 0x48: decrement_cursor_y(); move_cursor(); break; case 0x50: increment_cursor_y(); move_cursor(); break; case 0x4B: decrement_cursor_x(); move_cursor(); break; case 0x4D: increment_cursor_x(); move_cursor(); break; default: if (shift) { screen_putc(kbdus_shift[scancode]); } else { screen_putc(kbdus[scancode]); } break; } } }
void diag_puts(char *str) { while (*str) screen_putc(*str++); screen_move_cursor(); }
void welcome() { char* welcome_msg = "Hello! Welcome to SOS, Sean's Operating System.\n"; screen_puts(welcome_msg); screen_puts("This is a hex number:"); screen_putx(256); screen_putc('\n'); }
// ===================================================================================================================== static int screen_write(struct device* dev, struct device_request* req) { uint8_t* p = (uint8_t*)req->data; for (size_t i = 0; i < req->size; ++i) screen_putc(p[i]); device_request_finished(req, (int)req->size); return 0; }
static void timer_callback(registers_t regs) { tick++; char* t = "Time tick: " ; screen_puts(t); screen_putd(tick); screen_putc('\n'); // short* vram = (short *)0xb8000; // char* msg = "yo!"; // vram[tick] = msg[0] | '[' << 8; }
//FIXME: now only display message on console. static void kputc(int c) { int pad_nr = 0; if(c < 0) return; if(c == 0) c = '@'; if(console_pos_x >= TTY_COLUMNS_NR) { console_pos_x = 0; console_pos_y += 1; } if(console_pos_y >= TTY_LINES_NR) { screen_scrollup(); console_pos_y -= 1; } switch(c) { case '\n': console_pos_x = 0; console_pos_y += 1; break; case '\t' : pad_nr = TTY_TABWIDTH - (console_pos_x % TTY_TABWIDTH); while(pad_nr --) { screen_putc(console_pos_x, console_pos_y, ' '); console_pos_x += 1; } break; default: screen_putc(console_pos_x, console_pos_y, c); console_pos_x += 1; break; } }
static void screen_put_gbk(int c) { static int left = 0; if (left) { char buf[3] = { left, c }; convert(CONVERT_G2U, buf, 3, NULL, 0, screen_put_gbk_helper, NULL); left = 0; } else if (c & 0x80) { left = c; } else { screen_putc(c); } }
void screen_puti(u32int num) { char stack[10]; char *sptr = stack; if (num == 0) { screen_putc(ZEROASCII); return; } while (num != 0) { *sptr++ = num % 10 + ZEROASCII; num = num / 10; } while ((sptr - stack) > 0) { screen_putc(*(--sptr)); } }
int screen_puts(const char * s) { int i; int val = 0; for (i = 0; s[i] != '\0'; ++i) { val += screen_putc(s[i]); } return val; }
void screen_putca(char c, char attr) { if (c == '\n') { x = 0; y++; if (y >= LINES - 1) screen_scroll(); return; } int pos = (x + y * COLUMNS) * 2; *(video + pos) = c; *(video + pos + 1) = attr; x++; if (x >= COLUMNS) screen_putc('\n'); }
void clear_screen(void) { int flags; int x, y; local_irq_save(flags); set_screen_pos_x(0); set_screen_pos_y(0); for(x = 0; x < TTY_COLUMNS_NR; x++) for(y = 0; y < TTY_LINES_NR; y++) { screen_putc(x, y, '\0'); } set_screen_pos_x(0); set_screen_pos_y(0); local_irq_restore(flags); }
static int _tui_input(int line, int col, const char *prompt, char *buf, int len, int echo, int clear, bool utf8) { extern int RMSG; extern int msg_num; if (clear) buf[0] = '\0'; buf[len - 1] = '\0'; int real_x = prompt ? screen_display_width(prompt, utf8) : 0; int cur, clen; cur = clen = strlen(buf); bool inited = screen_inited(), prompted = false; while (1) { if (inited || !prompted) { screen_move(line, col); clrtoeol(); if (prompt) { if (utf8) screen_printf("%s", prompt); else prints("%s", prompt); } prompted = true; } if (inited) { if (echo) prints("%s", buf); else tui_repeat_char('*', clen); screen_move(line, real_x + cur); } if (RMSG) screen_flush(); int ch = terminal_getchar(); if (RMSG && msg_num == 0) { if (ch == Ctrl('Z') || ch == KEY_UP) { buf[0] = Ctrl('Z'); clen = 1; break; } if (ch == Ctrl('A') || ch == KEY_DOWN) { buf[0] = Ctrl('A'); clen = 1; break; } } if (ch == '\n' || ch == '\r') break; if (!inited) { if (ch == '\x7f' || ch == Ctrl('H')) { int dec = remove_character(buf, &cur, clen, true); if (dec) { clen -= dec; screen_puts("\x8 \x8", 3); } } else if (isprint2(ch) && clen < len - 1) { buf[cur] = ch; buf[++cur] = '\0'; ++clen; screen_putc(echo ? ch : '*'); } continue; } if (ch == '\x7f' || ch == Ctrl('H')) { clen -= remove_character(buf, &cur, clen, true); } else if (ch == KEY_DEL) { clen -= remove_character(buf, &cur, clen, false); } else if (ch == KEY_LEFT) { if (cur > 0) --cur; } else if (ch == KEY_RIGHT) { if (cur < clen) ++cur; } else if (ch == Ctrl('E') || ch == KEY_END) { cur = clen; } else if (ch == Ctrl('A') || ch == KEY_HOME) { cur = 0; } else if (isprint2(ch) && clen < len - 1) { if (buf[cur] != '\0') memmove(buf + cur + 1, buf + cur, clen - cur); buf[cur++] = ch; buf[++clen] = '\0'; } } screen_putc('\n'); screen_flush(); return clen; }
void screen_puts(const char* s) { while (*s) screen_putc(*s++); }
/** * 格式化输出到屏幕 * 支持形如%d %ld %c %s %-7s %7s的格式 * @param[in] fmt 格式字符串 * @param[in] utf8 输入是否为UTF-8编码 * @param[in] ap 参数列表 */ static void screen_vprintf(const char *fmt, bool utf8, va_list ap) { const char *ptr = fmt; while (*fmt != '\0') { if (*fmt == '%') { _put_string(ptr, fmt, utf8); bool left_adjust = false, long_ = false; size_t width = 0; ++fmt; switch (*fmt) { case '-': left_adjust = true; ++fmt; break; case 'l': long_ = true; ++fmt; break; } while (isdigit(*fmt)) { width *= 10; width += *fmt - '0'; ++fmt; } switch (*fmt) { case 's': { const char *ptr = va_arg(ap, const char *); _print_string(ptr, width, utf8, left_adjust); break; } case 'd': { int64_t n; if (long_) { n = va_arg(ap, int64_t); } else { n = va_arg(ap, int); } char buf[24]; snprintf(buf, sizeof(buf), "%ld", n); _print_string(buf, width, true, left_adjust); break; } case 'c': { int i = va_arg(ap, int); screen_putc(i); break; } case '\0': return; default: if (utf8) screen_putc(*fmt); else screen_put_gbk(*fmt); break; } ptr = ++fmt; } else { ++fmt;