diff options
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 1856 |
1 files changed, 928 insertions, 928 deletions
@@ -32,142 +32,142 @@ extern volatile int mstr_cpu; extern volatile int bail; struct ascii_map_str { - int ascii; - int keycode; + int ascii; + int keycode; }; -inline void reboot(void) +void reboot(void) { - /* tell the BIOS to do a cold start */ - *((unsigned short *)0x472) = 0x0; + /* tell the BIOS to do a cold start */ + *((unsigned short *)0x472) = 0x0; - while(1) - { - outb(0xFE, 0x64); - outb(0x02, 0xcf9); /* reset that doesn't rely on the keyboard controller */ - outb(0x04, 0xcf9); - outb(0x0E, 0xcf9); - } + while(1) + { + outb(0xFE, 0x64); + outb(0x02, 0xcf9); /* reset that doesn't rely on the keyboard controller */ + outb(0x04, 0xcf9); + outb(0x0E, 0xcf9); + } } -int strlen(char * string){ - int i=0; - while(*string++){i++;}; - return i; +int mt86_strlen(char * string){ + int i=0; + while(*string++){i++;}; + return i; } -int strstr(char *haystack, char * needle) +int mt86_strstr(char *haystack, char * needle) { - int i=0,j=0; - int here=0; - while(1){ - if(needle[i]==haystack[j]) - { - if(here==0) - here=j; - i++;j++; - if(i>=strlen(needle)) - { - return here; - } - if(j>=strlen(haystack)) - { - return -1; - } - } else { - j++;i=0;here=0; - } - } + int i=0,j=0; + int here=0; + while(1){ + if(needle[i]==haystack[j]) + { + if(here==0) + here=j; + i++;j++; + if(i>=mt86_strlen(needle)) + { + return here; + } + if(j>=mt86_strlen(haystack)) + { + return -1; + } + } else { + j++;i=0;here=0; + } + } } -int memcmp(const void *s1, const void *s2, ulong count) +int mt86_memcmp(const void *s1, const void *s2, ulong count) { - const unsigned char *src1 = s1, *src2 = s2; - int i; - for(i = 0; i < count; i++) { - if (src1[i] != src2[i]) { - return (int)src1[i] - (int)src2[i]; - } - } - return 0; + const unsigned char *src1 = s1, *src2 = s2; + int i; + for(i = 0; i < count; i++) { + if (src1[i] != src2[i]) { + return (int)src1[i] - (int)src2[i]; + } + } + return 0; } -int strncmp(const char *s1, const char *s2, ulong n) { - signed char res = 0; - while (n) { - res = *s1 - *s2; - if (res != 0) - return res; - if (*s1 == '\0') - return 0; - ++s1, ++s2; - --n; - } - return res; +int mt86_strncmp(const char *s1, const char *s2, ulong n) { + signed char res = 0; + while (n) { + res = *s1 - *s2; + if (res != 0) + return res; + if (*s1 == '\0') + return 0; + ++s1, ++s2; + --n; + } + return res; } -void *memmove(void *dest, const void *src, ulong n) +void *mt86_memmove(void *dest, const void *src, ulong n) { - long i; - char *d = (char *)dest, *s = (char *)src; - - /* If src == dest do nothing */ - if (dest < src) { - for(i = 0; i < n; i++) { - d[i] = s[i]; - } - } - else if (dest > src) { - for(i = n -1; i >= 0; i--) { - d[i] = s[i]; - } - } - return dest; + long i; + char *d = (char *)dest, *s = (char *)src; + + /* If src == dest do nothing */ + if (dest < src) { + for(i = 0; i < n; i++) { + d[i] = s[i]; + } + } + else if (dest > src) { + for(i = n -1; i >= 0; i--) { + d[i] = s[i]; + } + } + return dest; } char toupper(char c) { - if (c >= 'a' && c <= 'z') - return c + 'A' -'a'; - else - return c; + if (c >= 'a' && c <= 'z') + return c + 'A' -'a'; + else + return c; } -int isdigit(char c) +int mt86_isdigit(char c) { - return c >= '0' && c <= '9'; + return c >= '0' && c <= '9'; } int isxdigit(char c) { - return isdigit(c) || (toupper(c) >= 'A' && toupper(c) <= 'F'); } + return mt86_isdigit(c) || (toupper(c) >= 'A' && toupper(c) <= 'F'); } unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base) { - unsigned long result = 0, value; - - if (!base) { - base = 10; - if (*cp == '0') { - base = 8; - cp++; - if (toupper(*cp) == 'X' && isxdigit(cp[1])) { - cp++; - base = 16; - } - } - } else if (base == 16) { - if (cp[0] == '0' && toupper(cp[1]) == 'X') - cp += 2; - } - while (isxdigit(*cp) && - (value = isdigit(*cp) ? *cp-'0' : toupper(*cp)-'A'+10) < base) { - result = result*base + value; - cp++; - } - if (endp) - *endp = (char *)cp; - return result; + unsigned long result = 0, value; + + if (!base) { + base = 10; + if (*cp == '0') { + base = 8; + cp++; + if (toupper(*cp) == 'X' && isxdigit(cp[1])) { + cp++; + base = 16; + } + } + } else if (base == 16) { + if (cp[0] == '0' && toupper(cp[1]) == 'X') + cp += 2; + } + while (isxdigit(*cp) && + (value = mt86_isdigit(*cp) ? *cp-'0' : toupper(*cp)-'A'+10) < base) { + result = result*base + value; + cp++; + } + if (endp) + *endp = (char *)cp; + return result; } /* @@ -176,34 +176,34 @@ unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base) { */ void scroll(void) { - int i, j; - char *s, tmp; - - /* Only scroll if at the bottom of the screen */ - if (v->msg_line < 23) { - v->msg_line++; - } else { - /* If scroll lock is on, loop till it is cleared */ - while (slock) { - check_input(); - } - for (i=LINE_SCROLL; i<23; i++) { - s = (char *)(SCREEN_ADR + ((i+1) * 160)); - for (j=0; j<160; j+=2, s+=2) { - *(s-160) = *s; - tmp = get_scrn_buf(i+1, j/2); - set_scrn_buf(i, j/2, tmp); - } - } - /* Clear the newly opened line */ - s = (char *)(SCREEN_ADR + (23 * 160)); - for (j=0; j<80; j++) { - *s = ' '; - set_scrn_buf(23, j, ' '); - s += 2; - } - tty_print_region(LINE_SCROLL, 0, 23, 79); + int i, j; + char *s, tmp; + + /* Only scroll if at the bottom of the screen */ + if (vv->msg_line < 23) { + vv->msg_line++; + } else { + /* If scroll lock is on, loop till it is cleared */ + while (slock) { + check_input(); + } + for (i=LINE_SCROLL; i<23; i++) { + s = (char *)(SCREEN_ADR + ((i+1) * 160)); + for (j=0; j<160; j+=2, s+=2) { + *(s-160) = *s; + tmp = get_scrn_buf(i+1, j/2); + set_scrn_buf(i, j/2, tmp); + } } + /* Clear the newly opened line */ + s = (char *)(SCREEN_ADR + (23 * 160)); + for (j=0; j<80; j++) { + *s = ' '; + set_scrn_buf(23, j, ' '); + s += 2; + } + tty_print_region(LINE_SCROLL, 0, 23, 79); + } } /* @@ -211,14 +211,14 @@ void scroll(void) */ void clear_scroll(void) { - int i; - char *s; - - s = (char*)(SCREEN_ADR+LINE_HEADER*160); - for(i=0; i<80*(24-LINE_HEADER); i++) { - *s++ = ' '; - *s++ = 0x17; - } + int i; + char *s; + + s = (char*)(SCREEN_ADR+LINE_HEADER*160); + for(i=0; i<80*(24-LINE_HEADER); i++) { + *s++ = ' '; + *s++ = 0x17; + } } /* @@ -226,10 +226,10 @@ void clear_scroll(void) */ void cplace(int y, int x, const char c) { - char *dptr; + char *dptr; - dptr = (char *)(SCREEN_ADR + (160*y) + (2*x)); - *dptr = c; + dptr = (char *)(SCREEN_ADR + (160*y) + (2*x)); + *dptr = c; } /* @@ -237,57 +237,57 @@ void cplace(int y, int x, const char c) */ void cprint(int y, int x, const char *text) { - register int i; - char *dptr; - - dptr = (char *)(SCREEN_ADR + (160*y) + (2*x)); - for (i=0; text[i]; i++) { - *dptr = text[i]; - dptr += 2; - } - tty_print_line(y, x, text); + register int i; + char *dptr; + + dptr = (char *)(SCREEN_ADR + (160*y) + (2*x)); + for (i=0; text[i]; i++) { + *dptr = text[i]; + dptr += 2; + } + tty_print_line(y, x, text); } void itoa(char s[], int n) { - int i, sign; - - if((sign = n) < 0) - n = -n; - i=0; - do { - s[i++] = n % 10 + '0'; - } while ((n /= 10) > 0); - if(sign < 0) - s[i++] = '-'; - s[i] = '\0'; - reverse(s); + int i, sign; + + if((sign = n) < 0) + n = -n; + i=0; + do { + s[i++] = n % 10 + '0'; + } while ((n /= 10) > 0); + if(sign < 0) + s[i++] = '-'; + s[i] = '\0'; + reverse(s); } void reverse(char s[]) { - int c, i, j; - for(j = 0; s[j] != 0; j++) - ; - - for(i=0, j = j - 1; i < j; i++, j--) { - c = s[i]; - s[i] = s[j]; - s[j] = c; - } + int c, i, j; + for(j = 0; s[j] != 0; j++) + ; + + for(i=0, j = j - 1; i < j; i++, j--) { + c = s[i]; + s[i] = s[j]; + s[j] = c; + } } void memcpy (void *dst, void *src, int len) { - char *s = (char*)src; - char *d = (char*)dst; - int i; - - if (len <= 0) { - return; - } - for (i = 0 ; i < len; i++) { - *d++ = *s++; - } + char *s = (char*)src; + char *d = (char*)dst; + int i; + + if (len <= 0) { + return; + } + for (i = 0 ; i < len; i++) { + *d++ = *s++; + } } /* @@ -295,23 +295,23 @@ void memcpy (void *dst, void *src, int len) */ void aprint(int y, int x, ulong page) { - /* page is in multiples of 4K */ - if ((page << 2) < 9999) { - dprint(y, x, page << 2, 4, 0); - cprint(y, x+4, "K"); - } - else if ((page >>8) < 9999) { - dprint(y, x, (page + (1 << 7)) >> 8, 4, 0); - cprint(y, x+4, "M"); - } - else if ((page >>18) < 9999) { - dprint(y, x, (page + (1 << 17)) >> 18, 4, 0); - cprint(y, x+4, "G"); - } - else { - dprint(y, x, (page + (1 << 27)) >> 28, 4, 0); - cprint(y, x+4, "T"); - } + /* page is in multiples of 4K */ + if ((page << 2) < 9999) { + dprint(y, x, page << 2, 4, 0); + cprint(y, x+4, "K"); + } + else if ((page >>8) < 9999) { + dprint(y, x, (page + (1 << 7)) >> 8, 4, 0); + cprint(y, x+4, "M"); + } + else if ((page >>18) < 9999) { + dprint(y, x, (page + (1 << 17)) >> 18, 4, 0); + cprint(y, x+4, "G"); + } + else { + dprint(y, x, (page + (1 << 27)) >> 28, 4, 0); + cprint(y, x+4, "T"); + } } /* @@ -319,57 +319,57 @@ void aprint(int y, int x, ulong page) */ void dprint(int y, int x, ulong val, int len, int right) { - ulong j, k; - int i, flag=0; - char buf[18]; - - if (val > 999999999 || len > 9) { - return; - } - for(i=0, j=1; i<len-1; i++) { - j *= 10; - } - if (!right) { - for (i=0; j>0; j/=10) { - k = val/j; - if (k > 9) { - j *= 100; - continue; - } - if (flag || k || j == 1) { - buf[i++] = k + '0'; - flag++; - } else { - buf[i++] = ' '; - } - val -= k * j; - } - } else { - for(i=0; i<len; j/=10) { - if (j) { - k = val/j; - if (k > 9) { - j *= 100; - len++; - continue; - } - if (k == 0 && flag == 0) { - continue; - } - buf[i++] = k + '0'; - val -= k * j; - } else { - if (flag == 0 && i < len-1) { - buf[i++] = '0'; - } else { - buf[i++] = ' '; - } - } - flag++; - } - } - buf[i] = 0; - cprint(y,x,buf); + ulong j, k; + int i, flag=0; + char buf[18]; + + if (val > 999999999 || len > 9) { + return; + } + for(i=0, j=1; i<len-1; i++) { + j *= 10; + } + if (!right) { + for (i=0; j>0; j/=10) { + k = val/j; + if (k > 9) { + j *= 100; + continue; + } + if (flag || k || j == 1) { + buf[i++] = k + '0'; + flag++; + } else { + buf[i++] = ' '; + } + val -= k * j; + } + } else { + for(i=0; i<len; j/=10) { + if (j) { + k = val/j; + if (k > 9) { + j *= 100; + len++; + continue; + } + if (k == 0 && flag == 0) { + continue; + } + buf[i++] = k + '0'; + val -= k * j; + } else { + if (flag == 0 && i < len-1) { + buf[i++] = '0'; + } else { + buf[i++] = ' '; + } + } + flag++; + } + } + buf[i] = 0; + cprint(y,x,buf); } /* @@ -377,33 +377,33 @@ void dprint(int y, int x, ulong val, int len, int right) */ void hprint2(int y,int x, unsigned long val, int digits) { - unsigned long j; - int i, idx, flag = 0; - char buf[18]; - - for (i=0, idx=0; i<8; i++) { - j = val >> (28 - (4 * i)); - j &= 0xf; - if (j < 10) { - if (flag || j || i == 7) { - buf[idx++] = j + '0'; - flag++; - } else { - buf[idx++] = '0'; - } - } else { - buf[idx++] = j + 'a' - 10; - flag++; - } + unsigned long j; + int i, idx, flag = 0; + char buf[18]; + + for (i=0, idx=0; i<8; i++) { + j = val >> (28 - (4 * i)); + j &= 0xf; + if (j < 10) { + if (flag || j || i == 7) { + buf[idx++] = j + '0'; + flag++; + } else { + buf[idx++] = '0'; + } + } else { + buf[idx++] = j + 'a' - 10; + flag++; } - if (digits > 8) { - digits = 8; - } - if (flag > digits) { - digits = flag; - } - buf[idx] = 0; - cprint(y,x,buf + (idx - digits)); + } + if (digits > 8) { + digits = 8; + } + if (flag > digits) { + digits = flag; + } + buf[idx] = 0; + cprint(y,x,buf + (idx - digits)); } /* @@ -411,28 +411,28 @@ void hprint2(int y,int x, unsigned long val, int digits) */ void hprint3(int y,int x, unsigned long val, int digits) { - unsigned long j; - int i, idx, flag = 0; - char buf[18]; - - for (i=0, idx=0; i<digits; i++) { - j = 0xf & val; - val /= 16; - - if (j < 10) { - if (flag || j || i == 7) { - buf[digits - ++idx] = j + '0'; - flag++; - } else { - buf[digits - ++idx] = '0'; - } - } else { - buf[digits - ++idx] = j + 'a' - 10; - flag++; - } - } - buf[idx] = 0; - cprint(y,x,buf); + unsigned long j; + int i, idx, flag = 0; + char buf[18]; + + for (i=0, idx=0; i<digits; i++) { + j = 0xf & val; + val /= 16; + + if (j < 10) { + if (flag || j || i == 7) { + buf[digits - ++idx] = j + '0'; + flag++; + } else { + buf[digits - ++idx] = '0'; + } + } else { + buf[digits - ++idx] = j + 'a' - 10; + flag++; + } + } + buf[idx] = 0; + cprint(y,x,buf); } /* @@ -440,7 +440,7 @@ void hprint3(int y,int x, unsigned long val, int digits) */ void hprint(int y, int x, unsigned long val) { - return hprint2(y, x, val, 8); + return hprint2(y, x, val, 8); } /* @@ -448,394 +448,394 @@ void hprint(int y, int x, unsigned long val) */ void xprint(int y,int x, ulong val) { - ulong j; - - j = (val & 0xffc00000) >> 20; - dprint(y, x, j, 4, 0); - cprint(y, x+4, "m"); - j = (val & 0xffc00) >> 10; - dprint(y, x+5, j, 4, 0); - cprint(y, x+9, "k"); - j = val & 0x3ff; - dprint(y, x+10, j, 4, 0); + ulong j; + + j = (val & 0xffc00000) >> 20; + dprint(y, x, j, 4, 0); + cprint(y, x+4, "m"); + j = (val & 0xffc00) >> 10; + dprint(y, x+5, j, 4, 0); + cprint(y, x+9, "k"); + j = val & 0x3ff; + dprint(y, x+10, j, 4, 0); } char *codes[] = { - " Divide", - " Debug", - " NMI", - " Brkpnt", - "Overflow", - " Bound", - " Inv_Op", - " No_Math", - "Double_Fault", - "Seg_Over", - " Inv_TSS", - " Seg_NP", - "Stack_Fault", - "Gen_Prot", - "Page_Fault", - " Resvd", - " FPE", - "Alignment", - " Mch_Chk", - "SIMD FPE" + " Divide", + " Debug", + " NMI", + " Brkpnt", + "Overflow", + " Bound", + " Inv_Op", + " No_Math", + "Double_Fault", + "Seg_Over", + " Inv_TSS", + " Seg_NP", + "Stack_Fault", + "Gen_Prot", + "Page_Fault", + " Resvd", + " FPE", + "Alignment", + " Mch_Chk", + "SIMD FPE" }; struct eregs { - ulong ss; - ulong ds; - ulong esp; - ulong ebp; - ulong esi; - ulong edi; - ulong edx; - ulong ecx; - ulong ebx; - ulong eax; - ulong vect; - ulong code; - ulong eip; - ulong cs; - ulong eflag; + ulong ss; + ulong ds; + ulong esp; + ulong ebp; + ulong esi; + ulong edi; + ulong edx; + ulong ecx; + ulong ebx; + ulong eax; + ulong vect; + ulong code; + ulong eip; + ulong cs; + ulong eflag; }; /* Handle an interrupt */ void inter(struct eregs *trap_regs) { - int i, line; - unsigned char *pp; - ulong address = 0; - int my_cpu_num = smp_my_cpu_num(); - - /* Get the page fault address */ - if (trap_regs->vect == 14) { - __asm__("movl %%cr2,%0":"=r" (address)); - } + int i, line; + unsigned char *pp; + ulong address = 0; + int my_cpu_num = smp_my_cpu_num(); + + /* Get the page fault address */ + if (trap_regs->vect == 14) { + __asm__("movl %%cr2,%0":"=r" (address)); + } #ifdef PARITY_MEM - /* Check for a parity error */ - if (trap_regs->vect == 2) { - parity_err(trap_regs->edi, trap_regs->esi); - return; - } + /* Check for a parity error */ + if (trap_regs->vect == 2) { + parity_err(trap_regs->edi, trap_regs->esi); + return; + } #endif - /* clear scrolling region */ - pp=(unsigned char *)(SCREEN_ADR+(2*80*(LINE_SCROLL-2))); - for(i=0; i<2*80*(24-LINE_SCROLL-2); i++, pp+=2) { - *pp = ' '; - } - line = LINE_SCROLL-2; - - cprint(line, 0, "Unexpected Interrupt - Halting CPU"); - dprint(line, COL_MID + 4, my_cpu_num, 2, 1); - cprint(line+2, 0, " Type: "); - if (trap_regs->vect <= 19) { - cprint(line+2, 7, codes[trap_regs->vect]); - } else { - hprint(line+2, 7, trap_regs->vect); - } - cprint(line+3, 0, " PC: "); - hprint(line+3, 7, trap_regs->eip); - cprint(line+4, 0, " CS: "); - hprint(line+4, 7, trap_regs->cs); - cprint(line+5, 0, "Eflag: "); - hprint(line+5, 7, trap_regs->eflag); - cprint(line+6, 0, " Code: "); - hprint(line+6, 7, trap_regs->code); - cprint(line+7, 0, " DS: "); - hprint(line+7, 7, trap_regs->ds); - cprint(line+8, 0, " SS: "); - hprint(line+8, 7, trap_regs->ss); - if (trap_regs->vect == 14) { - /* Page fault address */ - cprint(line+7, 0, " Addr: "); - hprint(line+7, 7, address); - } - - cprint(line+2, 20, "eax: "); - hprint(line+2, 25, trap_regs->eax); - cprint(line+3, 20, "ebx: "); - hprint(line+3, 25, trap_regs->ebx); - cprint(line+4, 20, "ecx: "); - hprint(line+4, 25, trap_regs->ecx); - cprint(line+5, 20, "edx: "); - hprint(line+5, 25, trap_regs->edx); - cprint(line+6, 20, "edi: "); - hprint(line+6, 25, trap_regs->edi); - cprint(line+7, 20, "esi: "); - hprint(line+7, 25, trap_regs->esi); - cprint(line+8, 20, "ebp: "); - hprint(line+8, 25, trap_regs->ebp); - cprint(line+9, 20, "esp: "); - hprint(line+9, 25, trap_regs->esp); - - cprint(line+1, 38, "Stack:"); - for (i=0; i<10; i++) { - hprint(line+2+i, 38, trap_regs->esp+(4*i)); - hprint(line+2+i, 47, *(ulong*)(trap_regs->esp+(4*i))); - hprint(line+2+i, 57, trap_regs->esp+(4*(i+10))); - hprint(line+2+i, 66, *(ulong*)(trap_regs->esp+(4*(i+10)))); - } - - cprint(line+11, 0, "CS:EIP: "); - pp = (unsigned char *)trap_regs->eip; - for(i = 0; i < 9; i++) { - hprint2(line+11, 8+(3*i), pp[i], 2); - } - - while(1) { - check_input(); - } + /* clear scrolling region */ + pp=(unsigned char *)(SCREEN_ADR+(2*80*(LINE_SCROLL-2))); + for(i=0; i<2*80*(24-LINE_SCROLL-2); i++, pp+=2) { + *pp = ' '; + } + line = LINE_SCROLL-2; + + cprint(line, 0, "Unexpected Interrupt - Halting CPU"); + dprint(line, COL_MID + 4, my_cpu_num, 2, 1); + cprint(line+2, 0, " Type: "); + if (trap_regs->vect <= 19) { + cprint(line+2, 7, codes[trap_regs->vect]); + } else { + hprint(line+2, 7, trap_regs->vect); + } + cprint(line+3, 0, " PC: "); + hprint(line+3, 7, trap_regs->eip); + cprint(line+4, 0, " CS: "); + hprint(line+4, 7, trap_regs->cs); + cprint(line+5, 0, "Eflag: "); + hprint(line+5, 7, trap_regs->eflag); + cprint(line+6, 0, " Code: "); + hprint(line+6, 7, trap_regs->code); + cprint(line+7, 0, " DS: "); + hprint(line+7, 7, trap_regs->ds); + cprint(line+8, 0, " SS: "); + hprint(line+8, 7, trap_regs->ss); + if (trap_regs->vect == 14) { + /* Page fault address */ + cprint(line+7, 0, " Addr: "); + hprint(line+7, 7, address); + } + + cprint(line+2, 20, "eax: "); + hprint(line+2, 25, trap_regs->eax); + cprint(line+3, 20, "ebx: "); + hprint(line+3, 25, trap_regs->ebx); + cprint(line+4, 20, "ecx: "); + hprint(line+4, 25, trap_regs->ecx); + cprint(line+5, 20, "edx: "); + hprint(line+5, 25, trap_regs->edx); + cprint(line+6, 20, "edi: "); + hprint(line+6, 25, trap_regs->edi); + cprint(line+7, 20, "esi: "); + hprint(line+7, 25, trap_regs->esi); + cprint(line+8, 20, "ebp: "); + hprint(line+8, 25, trap_regs->ebp); + cprint(line+9, 20, "esp: "); + hprint(line+9, 25, trap_regs->esp); + + cprint(line+1, 38, "Stack:"); + for (i=0; i<10; i++) { + hprint(line+2+i, 38, trap_regs->esp+(4*i)); + hprint(line+2+i, 47, *(ulong*)(trap_regs->esp+(4*i))); + hprint(line+2+i, 57, trap_regs->esp+(4*(i+10))); + hprint(line+2+i, 66, *(ulong*)(trap_regs->esp+(4*(i+10)))); + } + + cprint(line+11, 0, "CS:EIP: "); + pp = (unsigned char *)trap_regs->eip; + for(i = 0; i < 9; i++) { + hprint2(line+11, 8+(3*i), pp[i], 2); + } + + while(1) { + check_input(); + } } void set_cache(int val) { - switch(val) { - case 0: - cache_off(); - break; - case 1: - cache_on(); - break; - } + switch(val) { + case 0: + cache_off(); + break; + case 1: + cache_on(); + break; + } } int get_key() { - int c; - - c = inb(0x64); - if ((c & 1) == 0) { - if (serial_cons) { - int comstat; - comstat = serial_echo_inb(UART_LSR); - if (comstat & UART_LSR_DR) { - c = serial_echo_inb(UART_RX); - /* Pressing '.' has same effect as 'c' - on a keyboard. - Oct 056 Dec 46 Hex 2E Ascii . - */ - return (ascii_to_keycode(c)); - } - } - return(0); - } - c = inb(0x60); - return((c)); + int c; + + c = inb(0x64); + if ((c & 1) == 0) { + if (serial_cons) { + int comstat; + comstat = serial_echo_inb(UART_LSR); + if (comstat & UART_LSR_DR) { + c = serial_echo_inb(UART_RX); + /* Pressing '.' has same effect as 'c' + on a keyboard. + Oct 056 Dec 46 Hex 2E Ascii . + */ + return (ascii_to_keycode(c)); + } + } + return(0); + } + c = inb(0x60); + return((c)); } void check_input(void) { - unsigned char c; - - if ((c = get_key())) { - switch(c & 0x7f) { - case 1: - /* "ESC" key was pressed, bail out. */ - cprint(LINE_RANGE, COL_MID+23, "Halting... "); - v->exit++; + unsigned char c; + + if ((c = get_key())) { + switch(c & 0x7f) { + case 1: + /* "ESC" key was pressed, bail out. */ + cprint(LINE_RANGE, COL_MID+23, "Halting... "); + vv->exit++; bail++; - break; - case 46: - /* c - Configure */ - get_config(); - break; - case 28: - /* CR - clear scroll lock */ - slock = 0; - footer(); - break; - case 57: - /* SP - set scroll lock */ - slock = 1; - footer(); - break; - case 0x26: - /* ^L/L - redraw the display */ - tty_print_screen(); - break; - } - } + break; + case 46: + /* c - Configure */ + get_config(); + break; + case 28: + /* CR - clear scroll lock */ + slock = 0; + footer(); + break; + case 57: + /* SP - set scroll lock */ + slock = 1; + footer(); + break; + case 0x26: + /* ^L/L - redraw the display */ + tty_print_screen(); + break; + } + } } void footer() { - cprint(24, 0, "(ESC)exit (c)configuration (SP)scroll_lock (CR)scroll_unlock"); - if (slock) { - cprint(24, 74, "Locked"); - } else { - cprint(24, 74, " "); - } + cprint(24, 0, "(ESC)exit (c)configuration (SP)scroll_lock (CR)scroll_unlock"); + if (slock) { + cprint(24, 74, "Locked"); + } else { + cprint(24, 74, " "); + } } ulong getval(int x, int y, int result_shift) { - unsigned long val; - int done; - int c; - int i, n; - int base; - int shift; - char buf[16]; - - for(i = 0; i < sizeof(buf)/sizeof(buf[0]); i++ ) { - buf[i] = ' '; - } - buf[sizeof(buf)/sizeof(buf[0]) -1] = '\0'; + unsigned long val; + int done; + int c; + int i, n; + int base; + int shift; + char buf[16]; + + for(i = 0; i < sizeof(buf)/sizeof(buf[0]); i++ ) { + buf[i] = ' '; + } + buf[sizeof(buf)/sizeof(buf[0]) -1] = '\0'; - wait_keyup(); - done = 0; - n = 0; - base = 10; - while(!done) { - /* Read a new character and process it */ - c = get_key(); - switch(c) { - case 0x26: /* ^L/L - redraw the display */ - tty_print_screen(); - break; - case 0x1c: /* CR */ - /* If something has been entered we are done */ - if(n) done = 1; - break; - case 0x19: /* p */ buf[n] = 'p'; break; - case 0x22: /* g */ buf[n] = 'g'; break; - case 0x32: /* m */ buf[n] = 'm'; break; - case 0x25: /* k */ buf[n] = 'k'; break; - case 0x2d: /* x */ - /* Only allow 'x' after an initial 0 */ - if (n == 1 && (buf[0] == '0')) { - buf[n] = 'x'; - } - break; - case 0x0e: /* BS */ - if (n > 0) { - n -= 1; - buf[n] = ' '; - } - break; - /* Don't allow entering a number not in our current base */ - case 0x0B: if (base >= 1) buf[n] = '0'; break; - case 0x02: if (base >= 2) buf[n] = '1'; break; - case 0x03: if (base >= 3) buf[n] = '2'; break; - case 0x04: if (base >= 4) buf[n] = '3'; break; - case 0x05: if (base >= 5) buf[n] = '4'; break; - case 0x06: if (base >= 6) buf[n] = '5'; break; - case 0x07: if (base >= 7) buf[n] = '6'; break; - case 0x08: if (base >= 8) buf[n] = '7'; break; - case 0x09: if (base >= 9) buf[n] = '8'; break; - case 0x0A: if (base >= 10) buf[n] = '9'; break; - case 0x1e: if (base >= 11) buf[n] = 'a'; break; - case 0x30: if (base >= 12) buf[n] = 'b'; break; - case 0x2e: if (base >= 13) buf[n] = 'c'; break; - case 0x20: if (base >= 14) buf[n] = 'd'; break; - case 0x12: if (base >= 15) buf[n] = 'e'; break; - case 0x21: if (base >= 16) buf[n] = 'f'; break; - default: - break; - } - /* Don't allow anything to be entered after a suffix */ - if (n > 0 && ( - (buf[n-1] == 'p') || (buf[n-1] == 'g') || - (buf[n-1] == 'm') || (buf[n-1] == 'k'))) { - buf[n] = ' '; - } - /* If we have entered a character increment n */ - if (buf[n] != ' ') { - n++; - } - buf[n] = ' '; - /* Print the current number */ - cprint(x, y, buf); - - /* Find the base we are entering numbers in */ - base = 10; - if ((buf[0] == '0') && (buf[1] == 'x')) { - base = 16; - } - else if (buf[0] == '0') { - base = 8; - } - } - /* Compute our current shift */ - shift = 0; - switch(buf[n-1]) { - case 'g': /* gig */ shift = 30; break; - case 'm': /* meg */ shift = 20; break; - case 'p': /* page */ shift = 12; break; - case 'k': /* kilo */ shift = 10; break; - } - shift -= result_shift; - - /* Compute our current value */ - val = simple_strtoul(buf, 0, base); - if (shift > 0) { - if (shift >= 32) { - val = 0xffffffff; - } else { - val <<= shift; - } - } else { - if (-shift >= 32) { - val = 0; - } - else { - val >>= -shift; - } - } - return val; + wait_keyup(); + done = 0; + n = 0; + base = 10; + while(!done) { + /* Read a new character and process it */ + c = get_key(); + switch(c) { + case 0x26: /* ^L/L - redraw the display */ + tty_print_screen(); + break; + case 0x1c: /* CR */ + /* If something has been entered we are done */ + if(n) done = 1; + break; + case 0x19: /* p */ buf[n] = 'p'; break; + case 0x22: /* g */ buf[n] = 'g'; break; + case 0x32: /* m */ buf[n] = 'm'; break; + case 0x25: /* k */ buf[n] = 'k'; break; + case 0x2d: /* x */ + /* Only allow 'x' after an initial 0 */ + if (n == 1 && (buf[0] == '0')) { + buf[n] = 'x'; + } + break; + case 0x0e: /* BS */ + if (n > 0) { + n -= 1; + buf[n] = ' '; + } + break; + /* Don't allow entering a number not in our current base */ + case 0x0B: if (base >= 1) buf[n] = '0'; break; + case 0x02: if (base >= 2) buf[n] = '1'; break; + case 0x03: if (base >= 3) buf[n] = '2'; break; + case 0x04: if (base >= 4) buf[n] = '3'; break; + case 0x05: if (base >= 5) buf[n] = '4'; break; + case 0x06: if (base >= 6) buf[n] = '5'; break; + case 0x07: if (base >= 7) buf[n] = '6'; break; + case 0x08: if (base >= 8) buf[n] = '7'; break; + case 0x09: if (base >= 9) buf[n] = '8'; break; + case 0x0A: if (base >= 10) buf[n] = '9'; break; + case 0x1e: if (base >= 11) buf[n] = 'a'; break; + case 0x30: if (base >= 12) buf[n] = 'b'; break; + case 0x2e: if (base >= 13) buf[n] = 'c'; break; + case 0x20: if (base >= 14) buf[n] = 'd'; break; + case 0x12: if (base >= 15) buf[n] = 'e'; break; + case 0x21: if (base >= 16) buf[n] = 'f'; break; + default: + break; + } + /* Don't allow anything to be entered after a suffix */ + if (n > 0 && ( + (buf[n-1] == 'p') || (buf[n-1] == 'g') || + (buf[n-1] == 'm') || (buf[n-1] == 'k'))) { + buf[n] = ' '; + } + /* If we have entered a character increment n */ + if (buf[n] != ' ') { + n++; + } + buf[n] = ' '; + /* Print the current number */ + cprint(x, y, buf); + + /* Find the base we are entering numbers in */ + base = 10; + if ((buf[0] == '0') && (buf[1] == 'x')) { + base = 16; + } + else if (buf[0] == '0') { + base = 8; + } + } + /* Compute our current shift */ + shift = 0; + switch(buf[n-1]) { + case 'g': /* gig */ shift = 30; break; + case 'm': /* meg */ shift = 20; break; + case 'p': /* page */ shift = 12; break; + case 'k': /* kilo */ shift = 10; break; + } + shift -= result_shift; + + /* Compute our current value */ + val = simple_strtoul(buf, 0, base); + if (shift > 0) { + if (shift >= 32) { + val = 0xffffffff; + } else { + val <<= shift; + } + } else { + if (-shift >= 32) { + val = 0; + } + else { + val >>= -shift; + } + } + return val; } void ttyprint(int y, int x, const char *p) { - static char sx[3]; - static char sy[3]; - - sx[0]='\0'; - sy[0]='\0'; - x++; y++; - itoa(sx, x); - itoa(sy, y); - serial_echo_print("["); - serial_echo_print(sy); - serial_echo_print(";"); - serial_echo_print(sx); - serial_echo_print("H"); - serial_echo_print(p); + static char sx[3]; + static char sy[3]; + + sx[0]='\0'; + sy[0]='\0'; + x++; y++; + itoa(sx, x); + itoa(sy, y); + serial_echo_print("["); + serial_echo_print(sy); + serial_echo_print(";"); + serial_echo_print(sx); + serial_echo_print("H"); + serial_echo_print(p); } void serial_echo_init(void) { - int comstat, hi, lo, serial_div; - unsigned char lcr; - - /* read the Divisor Latch */ - comstat = serial_echo_inb(UART_LCR); - serial_echo_outb(comstat | UART_LCR_DLAB, UART_LCR); - hi = serial_echo_inb(UART_DLM); - lo = serial_echo_inb(UART_DLL); - serial_echo_outb(comstat, UART_LCR); - - /* now do hardwired init */ - lcr = serial_parity | (serial_bits - 5); - serial_echo_outb(lcr, UART_LCR); /* No parity, 8 data bits, 1 stop */ - serial_div = 115200 / serial_baud_rate; - serial_echo_outb(0x80|lcr, UART_LCR); /* Access divisor latch */ - serial_echo_outb(serial_div & 0xff, UART_DLL); /* baud rate divisor */ - serial_echo_outb((serial_div >> 8) & 0xff, UART_DLM); - serial_echo_outb(lcr, UART_LCR); /* Done with divisor */ - - /* Prior to disabling interrupts, read the LSR and RBR - * registers */ - comstat = serial_echo_inb(UART_LSR); /* COM? LSR */ - comstat = serial_echo_inb(UART_RX); /* COM? RBR */ - serial_echo_outb(0x00, UART_IER); /* Disable all interrupts */ - - clear_screen_buf(); - - return; + int comstat, serial_div; + unsigned char lcr; + + /* read the Divisor Latch */ + comstat = serial_echo_inb(UART_LCR); + serial_echo_outb(comstat | UART_LCR_DLAB, UART_LCR); + /*hi =*/ serial_echo_inb(UART_DLM); + /*lo =*/ serial_echo_inb(UART_DLL); + serial_echo_outb(comstat, UART_LCR); + + /* now do hardwired init */ + lcr = serial_parity | (serial_bits - 5); + serial_echo_outb(lcr, UART_LCR); /* No parity, 8 data bits, 1 stop */ + serial_div = 115200 / serial_baud_rate; + serial_echo_outb(0x80|lcr, UART_LCR); /* Access divisor latch */ + serial_echo_outb(serial_div & 0xff, UART_DLL); /* baud rate divisor */ + serial_echo_outb((serial_div >> 8) & 0xff, UART_DLM); + serial_echo_outb(lcr, UART_LCR); /* Done with divisor */ + + /* Prior to disabling interrupts, read the LSR and RBR + * registers */ + comstat = serial_echo_inb(UART_LSR); /* COM? LSR */ + comstat = serial_echo_inb(UART_RX); /* COM? RBR */ + serial_echo_outb(0x00, UART_IER); /* Disable all interrupts */ + + clear_screen_buf(); + + return; } /* @@ -843,37 +843,37 @@ void serial_echo_init(void) */ int getnum(ulong val) { - int len = 0; - int i = 1; + int len = 0; + int i = 1; - while(i <= val) - { - len++; - i *= 10; - } + while(i <= val) + { + len++; + i *= 10; + } - return len; + return len; } void serial_echo_print(const char *p) { - if (!serial_cons) { - return; - } - /* Now, do each character */ - while (*p) { - WAIT_FOR_XMITR; - - /* Send the character out. */ - serial_echo_outb(*p, UART_TX); - if(*p==10) { - WAIT_FOR_XMITR; - serial_echo_outb(13, UART_TX); - } - p++; - } + if (!serial_cons) { + return; + } + /* Now, do each character */ + while (*p) { + WAIT_FOR_XMITR; + + /* Send the character out. */ + serial_echo_outb(*p, UART_TX); + if(*p==10) { + WAIT_FOR_XMITR; + serial_echo_outb(13, UART_TX); + } + p++; + } } /* Except for multi-character key sequences this mapping @@ -884,149 +884,149 @@ void serial_echo_print(const char *p) * else we should switch on the character... */ struct ascii_map_str ser_map[] = -/*ascii keycode ascii keycode*/ -{ - /* Special cases come first so I can leave - * their ``normal'' mapping in the table, - * without it being activated. - */ - { 27, 0x01}, /* ^[/ESC -> ESC */ - { 127, 0x0e}, /* DEL -> BS */ - { 8, 0x0e}, /* ^H/BS -> BS */ - { 10, 0x1c}, /* ^L/NL -> CR */ - { 13, 0x1c}, /* ^M/CR -> CR */ - { 9, 0x0f}, /* ^I/TAB -> TAB */ - { 19, 0x39}, /* ^S -> SP */ - { 17, 28}, /* ^Q -> CR */ - - { ' ', 0x39}, /* SP -> SP */ - { 'a', 0x1e}, - { 'A', 0x1e}, - { 1, 0x1e}, /* ^A -> A */ - { 'b', 0x30}, - { 'B', 0x30}, - { 2, 0x30}, /* ^B -> B */ - { 'c', 0x2e}, - { 'C', 0x2e}, - { 3, 0x2e}, /* ^C -> C */ - { 'd', 0x20}, - { 'D', 0x20}, - { 4, 0x20}, /* ^D -> D */ - { 'e', 0x12}, - { 'E', 0x12}, - { 5, 0x12}, /* ^E -> E */ - { 'f', 0x21}, - { 'F', 0x21}, - { 6, 0x21}, /* ^F -> F */ - { 'g', 0x22}, - { 'G', 0x22}, - { 7, 0x22}, /* ^G -> G */ - { 'h', 0x23}, - { 'H', 0x23}, - { 8, 0x23}, /* ^H -> H */ - { 'i', 0x17}, - { 'I', 0x17}, - { 9, 0x17}, /* ^I -> I */ - { 'j', 0x24}, - { 'J', 0x24}, - { 10, 0x24}, /* ^J -> J */ - { 'k', 0x25}, - { 'K', 0x25}, - { 11, 0x25}, /* ^K -> K */ - { 'l', 0x26}, - { 'L', 0x26}, - { 12, 0x26}, /* ^L -> L */ - { 'm', 0x32}, - { 'M', 0x32}, - { 13, 0x32}, /* ^M -> M */ - { 'n', 0x31}, - { 'N', 0x31}, - { 14, 0x31}, /* ^N -> N */ - { 'o', 0x18}, - { 'O', 0x18}, - { 15, 0x18}, /* ^O -> O */ - { 'p', 0x19}, - { 'P', 0x19}, - { 16, 0x19}, /* ^P -> P */ - { 'q', 0x10}, - { 'Q', 0x10}, - { 17, 0x10}, /* ^Q -> Q */ - { 'r', 0x13}, - { 'R', 0x13}, - { 18, 0x13}, /* ^R -> R */ - { 's', 0x1f}, - { 'S', 0x1f}, - { 19, 0x1f}, /* ^S -> S */ - { 't', 0x14}, - { 'T', 0x14}, - { 20, 0x14}, /* ^T -> T */ - { 'u', 0x16}, - { 'U', 0x16}, - { 21, 0x16}, /* ^U -> U */ - { 'v', 0x2f}, - { 'V', 0x2f}, - { 22, 0x2f}, /* ^V -> V */ - { 'w', 0x11}, - { 'W', 0x11}, - { 23, 0x11}, /* ^W -> W */ - { 'x', 0x2d}, - { 'X', 0x2d}, - { 24, 0x2d}, /* ^X -> X */ - { 'y', 0x15}, - { 'Y', 0x15}, - { 25, 0x15}, /* ^Y -> Y */ - { 'z', 0x2c}, - { 'Z', 0x2c}, - { 26, 0x2c}, /* ^Z -> Z */ - { '-', 0x0c}, - { '_', 0x0c}, - { 31, 0x0c}, /* ^_ -> _ */ - { '=', 0x0c}, - { '+', 0x0c}, - { '[', 0x1a}, - { '{', 0x1a}, - { 27, 0x1a}, /* ^[ -> [ */ - { ']', 0x1b}, - { '}', 0x1b}, - { 29, 0x1b}, /* ^] -> ] */ - { ';', 0x27}, - { ':', 0x27}, - { '\'', 0x28}, - { '"', 0x28}, - { '`', 0x29}, - { '~', 0x29}, - { '\\', 0x2b}, - { '|', 0x2b}, - { 28, 0x2b}, /* ^\ -> \ */ - { ',', 0x33}, - { '<', 0x33}, - { '.', 0x34}, - { '>', 0x34}, - { '/', 0x35}, - { '?', 0x35}, - { '1', 0x02}, - { '!', 0x02}, - { '2', 0x03}, - { '@', 0x03}, - { '3', 0x04}, - { '#', 0x04}, - { '4', 0x05}, - { '$', 0x05}, - { '5', 0x06}, - { '%', 0x06}, - { '6', 0x07}, - { '^', 0x07}, - { 30, 0x07}, /* ^^ -> 6 */ - { '7', 0x08}, - { '&', 0x08}, - { '8', 0x09}, - { '*', 0x09}, - { '9', 0x0a}, - { '(', 0x0a}, - { '0', 0x0b}, - { ')', 0x0b}, - { 0, 0} -}; + /*ascii keycode ascii keycode*/ + { + /* Special cases come first so I can leave + * their ``normal'' mapping in the table, + * without it being activated. + */ + { 27, 0x01}, /* ^[/ESC -> ESC */ + { 127, 0x0e}, /* DEL -> BS */ + { 8, 0x0e}, /* ^H/BS -> BS */ + { 10, 0x1c}, /* ^L/NL -> CR */ + { 13, 0x1c}, /* ^M/CR -> CR */ + { 9, 0x0f}, /* ^I/TAB -> TAB */ + { 19, 0x39}, /* ^S -> SP */ + { 17, 28}, /* ^Q -> CR */ + + { ' ', 0x39}, /* SP -> SP */ + { 'a', 0x1e}, + { 'A', 0x1e}, + { 1, 0x1e}, /* ^A -> A */ + { 'b', 0x30}, + { 'B', 0x30}, + { 2, 0x30}, /* ^B -> B */ + { 'c', 0x2e}, + { 'C', 0x2e}, + { 3, 0x2e}, /* ^C -> C */ + { 'd', 0x20}, + { 'D', 0x20}, + { 4, 0x20}, /* ^D -> D */ + { 'e', 0x12}, + { 'E', 0x12}, + { 5, 0x12}, /* ^E -> E */ + { 'f', 0x21}, + { 'F', 0x21}, + { 6, 0x21}, /* ^F -> F */ + { 'g', 0x22}, + { 'G', 0x22}, + { 7, 0x22}, /* ^G -> G */ + { 'h', 0x23}, + { 'H', 0x23}, + { 8, 0x23}, /* ^H -> H */ + { 'i', 0x17}, + { 'I', 0x17}, + { 9, 0x17}, /* ^I -> I */ + { 'j', 0x24}, + { 'J', 0x24}, + { 10, 0x24}, /* ^J -> J */ + { 'k', 0x25}, + { 'K', 0x25}, + { 11, 0x25}, /* ^K -> K */ + { 'l', 0x26}, + { 'L', 0x26}, + { 12, 0x26}, /* ^L -> L */ + { 'm', 0x32}, + { 'M', 0x32}, + { 13, 0x32}, /* ^M -> M */ + { 'n', 0x31}, + { 'N', 0x31}, + { 14, 0x31}, /* ^N -> N */ + { 'o', 0x18}, + { 'O', 0x18}, + { 15, 0x18}, /* ^O -> O */ + { 'p', 0x19}, + { 'P', 0x19}, + { 16, 0x19}, /* ^P -> P */ + { 'q', 0x10}, + { 'Q', 0x10}, + { 17, 0x10}, /* ^Q -> Q */ + { 'r', 0x13}, + { 'R', 0x13}, + { 18, 0x13}, /* ^R -> R */ + { 's', 0x1f}, + { 'S', 0x1f}, + { 19, 0x1f}, /* ^S -> S */ + { 't', 0x14}, + { 'T', 0x14}, + { 20, 0x14}, /* ^T -> T */ + { 'u', 0x16}, + { 'U', 0x16}, + { 21, 0x16}, /* ^U -> U */ + { 'v', 0x2f}, + { 'V', 0x2f}, + { 22, 0x2f}, /* ^V -> V */ + { 'w', 0x11}, + { 'W', 0x11}, + { 23, 0x11}, /* ^W -> W */ + { 'x', 0x2d}, + { 'X', 0x2d}, + { 24, 0x2d}, /* ^X -> X */ + { 'y', 0x15}, + { 'Y', 0x15}, + { 25, 0x15}, /* ^Y -> Y */ + { 'z', 0x2c}, + { 'Z', 0x2c}, + { 26, 0x2c}, /* ^Z -> Z */ + { '-', 0x0c}, + { '_', 0x0c}, + { 31, 0x0c}, /* ^_ -> _ */ + { '=', 0x0c}, + { '+', 0x0c}, + { '[', 0x1a}, + { '{', 0x1a}, + { 27, 0x1a}, /* ^[ -> [ */ + { ']', 0x1b}, + { '}', 0x1b}, + { 29, 0x1b}, /* ^] -> ] */ + { ';', 0x27}, + { ':', 0x27}, + { '\'', 0x28}, + { '"', 0x28}, + { '`', 0x29}, + { '~', 0x29}, + { '\\', 0x2b}, + { '|', 0x2b}, + { 28, 0x2b}, /* ^\ -> \ */ + { ',', 0x33}, + { '<', 0x33}, + { '.', 0x34}, + { '>', 0x34}, + { '/', 0x35}, + { '?', 0x35}, + { '1', 0x02}, + { '!', 0x02}, + { '2', 0x03}, + { '@', 0x03}, + { '3', 0x04}, + { '#', 0x04}, + { '4', 0x05}, + { '$', 0x05}, + { '5', 0x06}, + { '%', 0x06}, + { '6', 0x07}, + { '^', 0x07}, + { 30, 0x07}, /* ^^ -> 6 */ + { '7', 0x08}, + { '&', 0x08}, + { '8', 0x09}, + { '*', 0x09}, + { '9', 0x0a}, + { '(', 0x0a}, + { '0', 0x0b}, + { ')', 0x0b}, + { 0, 0} + }; /* * Given an ascii character, return the keycode @@ -1038,12 +1038,12 @@ struct ascii_map_str ser_map[] = */ int ascii_to_keycode (int in) { - struct ascii_map_str *p; - for (p = ser_map; p->ascii; p++) { - if (in ==p->ascii) - return p->keycode; - } - return 0; + struct ascii_map_str *p; + for (p = ser_map; p->ascii; p++) { + if (in ==p->ascii) + return p->keycode; + } + return 0; } /* @@ -1052,22 +1052,22 @@ int ascii_to_keycode (int in) * serial console. */ void wait_keyup( void ) { - /* Check to see if someone lifted the keyboard key */ - while (1) { - if ((get_key() & 0x80) != 0) { - return; - } - /* Trying to simulate waiting for a key release with - * the serial port is to nasty to let live. - * In particular some menus don't even display until - * you release the key that caused to to get there. - * With the serial port this results in double pressing - * or something worse for just about every key. - */ - if (serial_cons) { - return; - } - } + /* Check to see if someone lifted the keyboard key */ + while (1) { + if ((get_key() & 0x80) != 0) { + return; + } + /* Trying to simulate waiting for a key release with + * the serial port is to nasty to let live. + * In particular some menus don't even display until + * you release the key that caused to to get there. + * With the serial port this results in double pressing + * or something worse for just about every key. + */ + if (serial_cons) { + return; + } + } } /* @@ -1081,123 +1081,123 @@ void wait_keyup( void ) { */ void serial_console_setup(char *param) { - char *option, *end; - unsigned long tty; - unsigned long baud_rate; - unsigned char parity, bits; + char *option, *end; + unsigned long tty; + unsigned long baud_rate; + unsigned char parity, bits; - if (strncmp(param, "ttyS", 4)) - return; /* not a serial port */ + if (mt86_strncmp(param, "ttyS", 4)) + return; /* not a serial port */ - param += 4; + param += 4; - tty = simple_strtoul(param, &option, 10); + tty = simple_strtoul(param, &option, 10); - if (option == param) - return; /* there were no digits */ + if (option == param) + return; /* there were no digits */ - if (tty > 1) - return; /* only ttyS0 and ttyS1 supported */ + if (tty > 1) + return; /* only ttyS0 and ttyS1 supported */ - if (*option == '\0' || *option == ' ') - goto save_tty; /* no options given, just ttyS? */ + if (*option == '\0' || *option == ' ') + goto save_tty; /* no options given, just ttyS? */ - if (*option != ',') - return; /* missing the comma separator */ + if (*option != ',') + return; /* missing the comma separator */ - /* baud rate must follow */ - option++; - baud_rate = simple_strtoul(option, &end, 10); + /* baud rate must follow */ + option++; + baud_rate = simple_strtoul(option, &end, 10); - if (end == option) - return; /* no baudrate after comma */ + if (end == option) + return; /* no baudrate after comma */ - if (baud_rate == 0 || (115200 % baud_rate) != 0) - return; /* wrong baud rate */ + if (baud_rate == 0 || (115200 % baud_rate) != 0) + return; /* wrong baud rate */ - if (*end == '\0' || *end == ' ') - goto save_baud_rate; /* no more options given */ + if (*end == '\0' || *end == ' ') + goto save_baud_rate; /* no more options given */ - switch (toupper(*end)) { - case 'N': - parity = 0; - break; - case 'O': - parity = UART_LCR_PARITY; - break; - case 'E': - parity = UART_LCR_PARITY | UART_LCR_EPAR; - break; - default: - /* Unknown parity */ - return; - } + switch (toupper(*end)) { + case 'N': + parity = 0; + break; + case 'O': + parity = UART_LCR_PARITY; + break; + case 'E': + parity = UART_LCR_PARITY | UART_LCR_EPAR; + break; + default: + /* Unknown parity */ + return; + } - end++; - if (*end == '\0' || *end == ' ') - goto save_parity; + end++; + if (*end == '\0' || *end == ' ') + goto save_parity; - /* word length (bits) */ - if (*end < '7' || *end > '8') - return; /* invalid number of bits */ + /* word length (bits) */ + if (*end < '7' || *end > '8') + return; /* invalid number of bits */ - bits = *end - '0'; + bits = *end - '0'; - end++; + end++; - if (*end != '\0' || *end != ' ') - return; /* garbage at the end */ + if (*end != '\0' || *end != ' ') + return; /* garbage at the end */ - serial_bits = bits; - save_parity: - serial_parity = parity; - save_baud_rate: - serial_baud_rate = (int) baud_rate; - save_tty: - serial_tty = (short) tty; - serial_cons = 1; + serial_bits = bits; + save_parity: + serial_parity = parity; + save_baud_rate: + serial_baud_rate = (int) baud_rate; + save_tty: + serial_tty = (short) tty; + serial_cons = 1; } /* Get a comma seperated list of numbers */ void get_list(int x, int y, int len, char *buf) { - int c, n = 0; - - len--; - wait_keyup(); - while(1) { - /* Read a new character and process it */ - c = get_key(); - switch(c) { - case 0x1c: /* CR */ - /* If something has been entered we are done */ - if(n) { - buf[n] = 0; - return; - } - break; - case 0x0e: /* BS */ - if (n > 0) { - n -= 1; - buf[n] = ' '; - } - break; - case 0x0B: buf[n++] = '0'; break; - case 0x02: buf[n++] = '1'; break; - case 0x03: buf[n++] = '2'; break; - case 0x04: buf[n++] = '3'; break; - case 0x05: buf[n++] = '4'; break; - case 0x06: buf[n++] = '5'; break; - case 0x07: buf[n++] = '6'; break; - case 0x08: buf[n++] = '7'; break; - case 0x09: buf[n++] = '8'; break; - case 0x0a: buf[n++] = '9'; break; - case 0x33: buf[n++] = ','; break; - } - cprint(x, y, buf); - if (n >= len) { - buf[n] = 0; - return; - } - } + int c, n = 0; + + len--; + wait_keyup(); + while(1) { + /* Read a new character and process it */ + c = get_key(); + switch(c) { + case 0x1c: /* CR */ + /* If something has been entered we are done */ + if(n) { + buf[n] = 0; + return; + } + break; + case 0x0e: /* BS */ + if (n > 0) { + n -= 1; + buf[n] = ' '; + } + break; + case 0x0B: buf[n++] = '0'; break; + case 0x02: buf[n++] = '1'; break; + case 0x03: buf[n++] = '2'; break; + case 0x04: buf[n++] = '3'; break; + case 0x05: buf[n++] = '4'; break; + case 0x06: buf[n++] = '5'; break; + case 0x07: buf[n++] = '6'; break; + case 0x08: buf[n++] = '7'; break; + case 0x09: buf[n++] = '8'; break; + case 0x0a: buf[n++] = '9'; break; + case 0x33: buf[n++] = ','; break; + } + cprint(x, y, buf); + if (n >= len) { + buf[n] = 0; + return; + } + } } |