/* cmosdump -- CMOS Memory Dump for IBM-PC and Compatibles * * file name cmosdump.c * ver.1.0 Sep.25 92 * expert msu@mix */ #include #include #include FILE *tab; main ( int ac, char **av ) { if (ac > 1) { if ((tab = fopen(*++av,"r")) == NULL) { printf("inout file %s not found\n",*av); exit(1); } } else if ((tab = fopen("CMOSDUMP.TAB","r")) == NULL) { printf("CMOSDUMP.TAB file cot found\n"); exit(1); } while (getentry()); } int getentry() { int i, c, e, m, n, j, v; unsigned long seg; unsigned short off; unsigned char *t; unsigned char far *cmos; int nums, size; char cbuf[256]; char last; # define Xdig(c) (isdigit(c) ? c-'0' : toupper(c)-'A'+10) union { unsigned long word; unsigned char byte[4]; } value; cbuf[0] = '/'; do { if (cbuf[0] != '/') { puts(cbuf); cbuf[0] = '/'; } if (feof(tab)) return 0; i = seg = off = 0; while ((c = getc(tab)) >= 0) { if (c == '\n') { cbuf[i] = '\0'; break; } else { if (i < 254) { cbuf[i++] = c; if (isxdigit(c)) { if (i < 3) seg = (seg<<4) + Xdig(c); else if (i < 6) off = (off<<4) + Xdig(c); } } last = c; } } } while (seg < 0x40 || seg > 0x50 || cbuf[2] != ':' || cbuf[5] != ' ' || (cbuf[6] != '%' && !isdigit(cbuf[6]))); if (last == '!' || last == '#') cbuf[i-1] = '|'; cmos = (unsigned char far *)((seg << 16) | off); t = strchr(cbuf,'\t'); cbuf[5] = *t = '\0'; fputs(cbuf,stdout); if (cbuf[6] == '%') { size = (cbuf[8]-'0')/2; if (size < 1 || size > 4) return 0; for (value.word=i=0; i 0 && (i%16) == 0) printf(" "); printf(" %02.2x", cmos[i]); if ((i%16) == 15 && i < size-1) printf("\n"); } printf("\n\t\t%s\n",t+1); last = '|'; } if (last != '!' && last != '#') return 1; while (1) { if (feof(tab)) return 0; i = e = j = v = n = 0; m = 0x80; if ((c = cbuf[i++] = getc(tab)) != ' ') { ungetc(c, tab); return 1; } while ((c = getc(tab)) >= 0) { if (c == '\n') { cbuf[i] = '\0'; break; } else { if (i < 254) { if (j == 0) { if (c == '=' && e == 0) { e = 1; cbuf[i] = c; } else if (c == '\t') { j = 1; cbuf[i] = c; } else if (last == '!') { if (c == 'x') { if (m&value.word) { cbuf[i] = '1'; v = (v<<1) + 1; } else { cbuf[i] = '0'; v <<= 1; } m >>= 1; n = (n<<1) + 1; } else if (c == '1') { v = (v<<1) + 1; cbuf[i] = c; m >>= 1; n = (n<<1) + 1; } else if (c == '0') { v <<= 1; cbuf[i] = c; m >>= 1; n = (n<<1) + 1; } else if (c == '.') { v <<= 1; cbuf[i] = c; m >>= 1; n <<= 1; } else { cbuf[i] = c; } } else { if (isxdigit(c)) v = (v<<4) + Xdig(c); cbuf[i] = c; } } else { cbuf[i] = c; } i++; } } } if (n != 0) { if (v == (value.word&n)) printf("%s\n",cbuf); } else if (e) { if (v == value.word) printf("%s\n",cbuf); } else { printf("%s\n",cbuf); } } return 1; }