/* Public Domain code from INTERC3, repo hosted at * https://hg.pushbx.org/ecm/interc3/rev/77616b6c4040 */ /* intercep.h -- header file for intercep.c * typedefs, defaults, etc. * Ned Konz 8/1/87 */ #include /* what we record in our memory block about each interrupt */ typedef struct __attribute__ ((__packed__)) { uint16_t bp, di, si, ds, es, dx; uint16_t cx, bx, ax; uint16_t ip; uint16_t cs; uint16_t flags; uint16_t intnum; } swi_info; typedef struct __attribute__ ((__packed__)) { uint8_t vendor[8]; uint8_t product[8]; uint16_t offset; uint16_t segment; uint16_t version; uint16_t reserved; uint16_t intnum; } swi_info_amis; /* some defaults */ #define TFILENAME "interpre.dat" /* template file name */ #include #include void subst(char *regname, unsigned rval, char *template, char *dest); char *find_template(int intnum, unsigned axval); #define MAXLINELEN 200 /* maximum output line length */ #define HI(u) (((u)&0xff00)>>8) #define LO(u) ((u)&0x00ff) /* read swi_info records from input file * interpret them, and output to output file. */ void interpret_file(FILE *ifp, FILE *ofp, char *progname, int longmode, int quiet, int format) { swi_info rec; swi_info_amis * amis; char s1[ MAXLINELEN ]; char s2[ MAXLINELEN ]; char *templ; if (progname != NULL) fprintf (ofp, "INTERCEPT/INTERPRET by Ned Konz, 1987-08-02\n" " Extended by C. Masloch, 2021\n" "Dump of DOS/BIOS calls from program \"%s\"\n" "\n", progname); if (longmode) fprintf(ofp, " CS:IP INT AX BX CX DX DS ES SI DI BP\n"); while (fread(&rec, sizeof(swi_info), 1, ifp)) { if (format && (rec.intnum & 0xFF00) != 0) { switch (rec.intnum) { case 0x100: amis = (swi_info_amis *)&rec; fprintf(ofp, "Multiplexer replied:" " %04X:%04X -> \"%8.8s\" \"%8.8s\"" " version %04X\n", amis->segment, amis->offset, amis->vendor, amis->product, amis->version); break; default: break; } continue; } if ( (templ = find_template(rec.intnum, rec.ax)) ) { { char * src = templ; char * dest = s2; int ii; for (ii = 0; ii < 6; ++ii) { *dest++ = *src++; } if (*src == '?') { if (quiet) { continue; } ++ src; } strcpy(dest, src); } subst("AX", rec.ax, s2, s1); subst("AH", HI(rec.ax), s1, s2); subst("AL", LO(rec.ax), s2, s1); subst("BX", rec.bx, s1, s2); subst("BH", HI(rec.bx), s2, s1); subst("BL", LO(rec.bx), s1, s2); subst("CX", rec.cx, s2, s1); subst("CH", HI(rec.cx), s1, s2); subst("CL", LO(rec.cx), s2, s1); subst("DX", rec.dx, s1, s2); subst("DH", HI(rec.dx), s2, s1); subst("DL", LO(rec.dx), s1, s2); subst("BP", rec.bp, s2, s1); subst("DI", rec.di, s1, s2); subst("SI", rec.si, s2, s1); subst("DS", rec.ds, s1, s2); subst("ES", rec.es, s2, s1); subst("CS", rec.cs, s1, s2); subst("IP", rec.ip, s2, s1); fprintf(ofp, "%04X:%04X %s", rec.cs, rec.ip - 2, s1); } if ((templ==NULL) || longmode) { fprintf(ofp, "%04X:%04X %02X %04X " "%04X %04X %04X " "%04X %04X %04X %04X %04X\n", rec.cs, rec.ip - 2, rec.intnum, rec.ax, /*AX*/ rec.bx /*BX*/, rec.cx,/*CX*/ rec.dx, rec.ds, rec.es, rec.si, rec.di, rec.bp); } } /*while*/ return; }