#include /* MONITOR THE BITS ON THE 8255 I/O BOARD AT SPECIFIED PORT ADDRESS * erco 05/29/00 - (yes, memorial day weekend) */ /* WRITE STRING TO VIDEO MEMORY * Supply Y position, array of characters, array of attributes for each * char, and 'overwrite' to end of line flag. Used exclusivly by RUNBAR(). */ void bar(int, int, char *); void bar(x,y, string) int x,y; /* y location on screen */ char *string; /* the string to put on screen */ { register t; static char *mono, /* MUST BE LARGE MODEL */ *cga; /* MUST BE LARGE MODEL */ mono = (char *)(0xb0000000 + (y-1)*160+(x*2)); cga = (char *)(0xb8000000 + (y-1)*160+(x*2)); for (t=0; string[t]; t++) { *mono = string[t]; mono += 2; *cga = string[t]; cga += 2; } } /* SCROLL LINE RIGHT STARTING AT x,y */ void scrollright(x,y) { register t; static char *mono, /* MUST BE LARGE MODEL */ *cga; /* MUST BE LARGE MODEL */ mono = (char *)(0xb0000000 + (y-1)*160+(78*2)); cga = (char *)(0xb8000000 + (y-1)*160+(78*2)); for ( ; x < 79; x++ ) { *(mono+2) = *mono; mono--; *(mono+2) = *mono; mono--; *(cga+2) = *cga; cga--; *(cga+2) = *cga; cga--; } } void InitScreen(port) { int position = 1, t, bitcount, val; printf("\033[2J\033[1H\r Pin Port Mask State", port); for ( t=0; t<3; port++, t++ ) { int bitmask = 1; for ( bitcount=0; bitcount<8; bitcount++ ) { ++position; printf("\033[%d;1H\033[0m\r", position); /* HANDLE PRINTING VERTICAL BRACKETS */ switch ( bitcount ) { case 0: printf(" %c%c ", 0xda, 0xc4); break; case 4: printf("%c %c ", 'A'+t, 0xb3); break; default: printf(" %c ", 0xb3); break; case 7: printf(" %c%c ", 0xc0, 0xc4); break; } printf("%s%02d 0x%04x 0x%02x - ", ( bitmask == 1 ) ? "\033[1m" : "\033[0m", 00, port, bitmask); bitmask <<= 1; } } } int main(argc, argv) int argc; char **argv; { int cursor_pos = 1; /* 1 thru 24 */ int portbase = 0x0300; /* whatever the 8255 port address is */ char s[80]; /* PARSE COMMAND LINE */ if ( argc >= 2 ) { if ( argv[1][0] == '-' || sscanf(argv[1], "%x", &portbase) != 1 ) { fprintf(stderr,"8255 - monitor 3 ports on an 8255 I/O board\n"); fprintf(stderr,"Greg Ercolano 05/29/00. Public domain software.\n"); fprintf(stderr,"\n"); fprintf(stderr," usage: 8255 [port base in hex]\n"); fprintf(stderr,"example: 8255 0300 # monitor ports 0x300-302\n"); fprintf(stderr,"\n"); fprintf(stderr,"If unspecified, default port base is 0x300\n"); exit(1); } } /* SETUP INITIAL SCREEN LAYOUT */ InitScreen(portbase); /* UPDATE LOOP */ while ( 1 ) { int port, y = 2, x = 23; for ( port = portbase; port < portbase+3; port++ ) { int byte = inp(port), bitmask = 1, bitcount; for ( bitcount = 0; bitcount<8; bitcount++ , bitmask <<= 1, y++) { sprintf(s, "%s %c", ((byte & bitmask) ? "SET" : "clr"), ((byte & bitmask) ? '-' : '_')); scrollright(26, y); bar(x, y, s); } } if ( kbhit() ) break; } }