/***************************************************************** ** C A P T U R E . C ** Address Tracing System, Scott Harrington, Spring 94 ** Command line options: ** [-r port] port #(200,220,240,...,3E0) default 220 ** [-s D|E] segment (D000 or E000) ** [-w(ord)] Use 16 bit reads and writes */ #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <dos.h> #define STAT_Empty0 0x01 #define STAT_Empty1 0x02 #define STAT_Empty2 0x04 #define STAT_Empty3 0x08 #define STAT_nExtract 0x10 #define STAT_nProgram 0x20 #define STAT_nInit 0x40 #define STAT_SACK 0x80 enum {OUT_Config=0, OUT_NOP1, OUT_StartWrite, OUT_StartRead, OUT_Remote, OUT_Local, OUT_E000, OUT_D000, OUT_Sel0, OUT_Sel1, OUT_Sel2, OUT_Sel3, OUT_UnSelAll, OUT_SelAll, OUT_NOP14, OUT_Reset}; unsigned char readMem8(void); unsigned int readMem16(void); void BullwinkleStatus(void); unsigned int ioPort = 0x300; unsigned int bullwinkleReg = 256; int page_E = 0; int Use8bit = 1; void main(int argc, char *argv[]) { int i, ch; char *parmstr, *endptr; for (i=1; i<argc; i++) { if (argv[i][0] == '-' && argv[i][1]) { switch (argv[i][1]) { case 'p': parmstr = (argv[i][2]) ? &argv[i][2] : argv[++i]; ioPort = (unsigned int)strtoul(parmstr, &endptr, 0); break; case 's': parmstr = (argv[i][2]) ? &argv[i][2] : argv[++i]; page_E = (parmstr[0] == 'E' || parmstr[0] == 'e'); break; case 'w': Use8bit = 0; break; case 'h': default: printf("Usage: %s [-p port] [-s D|E] [-w (16bit)]\n", argv[0]); exit(-1); } } else { printf("Usage: %s [-p port] [-s D|E] [-w (16bit)]\n", argv[0]); exit(-1); } } if (ioPort != (ioPort&0x3E0)) { printf("Valid ports are 0x200, 220, 240, ..., 3E0.\n"); exit(-1); } BullwinkleStatus(); printf("Bullwinkle: select all modules, enter Acquire mode\n"); outportb(ioPort + OUT_Remote, 0); outportb(ioPort + OUT_StartWrite, 0); outportb(ioPort + OUT_SelAll, 0); while (!kbhit()) { BullwinkleStatus(); if (!(bullwinkleReg & STAT_nExtract) && (bullwinkleReg & STAT_Empty1)) { /* We read all the SRAM contents, start acquiring again */ printf("Bullwinkle: enter Acquire mode\n"); outportb(ioPort + OUT_StartWrite, 0); } else if (bullwinkleReg & STAT_SACK) { /* Bullwinkle has been granted a Stall, dump SRAM contents */ if (bullwinkleReg & STAT_nExtract) { printf("Bullwinkle: begin Host Read\n"); outportb(ioPort + OUT_StartRead, 0); } else { if (Use8bit) printf("[%2x] ", readMem8()); else printf("[%4x] ", readMem16()); } } } BullwinkleStatus(); } void BullwinkleStatus() { unsigned int d; d = inportb(ioPort); if (d != bullwinkleReg) { printf("BULLWINKLE: %s %s %s %s Empty:%d%d%d%d\n", (d & STAT_SACK) ? "SACK":"sack", (d & STAT_nInit) ? "af":"AF", (d & STAT_nProgram) ? "pgm":"PGM", (d & STAT_nExtract) ? "ext":"EXT", (d & STAT_Empty0) ? 1:0, (d & STAT_Empty1) ? 1:0, (d & STAT_Empty2) ? 1:0, (d & STAT_Empty3) ? 1:0); bullwinkleReg = d; } } unsigned int readMem16() { static unsigned int offset; unsigned int far *memptr; /* ensure word-alignment */ if (offset&1) offset = 0; memptr = MK_FP(page_E ? 0xE000:0xD000, offset); offset += 2; /* 16-bit int causes segment wraparound */ return *memptr; } unsigned char readMem8() { static unsigned int offset; unsigned char far *memptr; memptr = MK_FP(page_E ? 0xE000:0xD000, offset); offset++; return *memptr; }