/* Helper function to add string preceded by * ESC to smap table */ static void add_esc_smap(const char *str, int func) { char buf[1000]; buf[0] = 0x1B; /* esc */ bstrncpy(buf+1, str, sizeof(buf)-1); add_smap(buf, func); }
/* Set raw mode on terminal file. Basically, get the terminal into a mode in which all characters can be read as they are entered. CBREAK mode is not sufficient. */ static void rawmode(FILE *input) { struct termios t; static char term_buf[2048]; static char *term_buffer = term_buf; char *termtype = (char *)getenv("TERM"); /* Make sure we are dealing with a terminal */ if (!isatty(fileno(input))) { return; } if (tcgetattr(0, &old_term_params) != 0) { printf("conio: Cannot tcgetattr()\n"); exit(1); } old_term_params_set = true; t = old_term_params; t.c_cc[VMIN] = 1; /* satisfy read after 1 char */ t.c_cc[VTIME] = 0; t.c_iflag &= ~(BRKINT | IGNPAR | PARMRK | INPCK | ISTRIP | ICRNL | IXON | IXOFF | INLCR | IGNCR); t.c_iflag |= IGNBRK; t.c_oflag |= ONLCR; t.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL | ICANON | NOFLSH | TOSTOP); tcflush(0, TCIFLUSH); if (tcsetattr(0, TCSANOW, &t) == -1) { printf("Cannot tcsetattr()\n"); } /* Defaults, the main program can override these */ signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGINT, sigintcatcher); signal(SIGWINCH, SIG_IGN); if (!termtype) { printf("Cannot get terminal type.\n"); normode(); exit(1); } if (tgetent(term_buffer, termtype) < 0) { printf("Cannot get terminal termcap entry.\n"); normode(); exit(1); } t_width = t_height = -1; /* Note (char *)casting is due to really stupid compiler warnings */ t_width = tgetnum((char *)"co") - 1; t_height = tgetnum((char *)"li"); BC = NULL; UP = NULL; t_cm = (char *)tgetstr((char *)"cm", &term_buffer); t_cs = (char *)tgetstr((char *)"cl", &term_buffer); /* clear screen */ t_cl = (char *)tgetstr((char *)"ce", &term_buffer); /* clear line */ t_dl = (char *)tgetstr((char *)"dl", &term_buffer); /* delete line */ t_il = (char *)tgetstr((char *)"al", &term_buffer); /* insert line */ t_honk = (char *)tgetstr((char *)"bl", &term_buffer); /* beep */ t_ti = (char *)tgetstr((char *)"ti", &term_buffer); t_te = (char *)tgetstr((char *)"te", &term_buffer); t_up = (char *)tgetstr((char *)"up", &term_buffer); t_do = (char *)tgetstr((char *)"do", &term_buffer); t_sf = (char *)tgetstr((char *)"sf", &term_buffer); num_stab = MAX_STAB; /* get default stab size */ stab = (stab_t **)malloc(sizeof(stab_t *) * num_stab); memset(stab, 0, sizeof(stab_t *) * num_stab); /* Key bindings */ kl = (char *)tgetstr((char *)"kl", &term_buffer); kr = (char *)tgetstr((char *)"kr", &term_buffer); ku = (char *)tgetstr((char *)"ku", &term_buffer); kd = (char *)tgetstr((char *)"kd", &term_buffer); kh = (char *)tgetstr((char *)"kh", &term_buffer); kb = (char *)tgetstr((char *)"kb", &term_buffer); kD = (char *)tgetstr((char *)"kD", &term_buffer); kI = (char *)tgetstr((char *)"kI", &term_buffer); kN = (char *)tgetstr((char *)"kN", &term_buffer); kP = (char *)tgetstr((char *)"kP", &term_buffer); kH = (char *)tgetstr((char *)"kH", &term_buffer); kE = (char *)tgetstr((char *)"kE", &term_buffer); add_smap(kl, F_CSRLFT); add_smap(kr, F_CSRRGT); add_smap(ku, F_CSRUP); add_smap(kd, F_CSRDWN); add_smap(kI, F_TINS); add_smap(kN, F_PAGDWN); add_smap(kP, F_PAGUP); add_smap(kH, F_HOME); add_smap(kE, F_EOF); add_esc_smap("[A", F_CSRUP); add_esc_smap("[B", F_CSRDWN); add_esc_smap("[C", F_CSRRGT); add_esc_smap("[D", F_CSRLFT); add_esc_smap("[1~", F_HOME); add_esc_smap("[2~", F_TINS); add_esc_smap("[3~", F_DELCHR); add_esc_smap("[4~", F_EOF); add_esc_smap("f", F_NXTWRD); add_esc_smap("b", F_PRVWRD); }
void bios_create_smap() { rm_ctx ctx; e820map map; e820entry *ent, tmp; u32 base, size; int i; /* setup initial context */ btab->p_set_ctx(0, &ctx); /* get system memory map */ map.n_map = 0; base = bdat->bd_base; size = bdat->bd_size; do { ctx.eax = 0x0000E820; ctx.edx = 0x534D4150; ctx.ecx = sizeof(e820entry); ctx.es = rm_seg(&map.map[map.n_map]); ctx.di = rm_off(&map.map[map.n_map]); if ( (btab->p_bios_call(0x15, &ctx) == 0) || (ctx.eax != 0x534D4150) ) { break; } } while ( (++map.n_map < E820MAX) && (ctx.ebx != 0) ); /* append my real mode block to second region */ if ( (map.n_map >= 2) && (map.map[0].type == E820_RAM) && (map.map[1].type == E820_RESERVED) && (map.map[0].base == 0) && (map.map[1].base == map.map[0].size) && (base + size == map.map[0].size) ) { map.map[0].size = base; map.map[1].base = map.map[0].size; map.map[1].size += size; } /* build new memory map without my regions */ for (i = 0; i < map.n_map; i++) { ent = &map.map[i]; if ( (ent->type == E820_RAM) && (in_reg(base, ent->base, ent->size) != 0) ) { tmp.base = ent->base; tmp.size = base - ent->base; tmp.type = ent->type; add_smap(&tmp); tmp.base = base; tmp.size = size; tmp.type = E820_RESERVED; add_smap(&tmp); if (ent->base + ent->size > base + size) { tmp.base = base + size; tmp.size = ent->base + ent->size - tmp.base; tmp.type = ent->type; add_smap(&tmp); } } else { add_smap(ent); } } }