std::string clsDisassem::disassem20(__int32 ad) { int nn, bu; std::string str; bu = 0; str = ""; for (nn = 0; nn < 20; nn++) { str = str + disassem(ad) + "\r\n"; bu = bu + bytesUsed; ad = ad + bytesUsed; } bytesUsed = bu; return str; }
/* FrontEnd - invokes the loader, parser, disassembler (if asm1), icode rewritter, and displays any useful information. */ void FrontEnd(char *filename, PCALL_GRAPH *pcallGraph) { PPROC pProc; PSYM psym; int i, c; FILE *fp = fopen(filename, "rb"); if (fp == NULL) fatalError(CANNOT_OPEN, filename); MZ_Header *hdr = read_mz_header(fp); if (hdr == NULL) { // .com not handled for now fprintf(stderr, "%s: File format not recognized\n", filename); fclose(fp); exit(EXIT_FAILURE); } // Load program into memory LoadImage(fp, hdr); if (option.verbose) { displayLoadInfo(hdr); } /* Do depth first flow analysis building call graph and procedure list, and attaching the I-code to each procedure */ parse(pcallGraph); if (option.asm1) { printf("%s: writing assembler file %s\n", progname, asm1_name); } // Search through code looking for impure references and flag them for (pProc = pProcList; pProc; pProc = pProc->next) { for (i = 0; i < pProc->Icode.numIcode; i++) { if (pProc->Icode.icode[i].ll.flg & (SYM_USE | SYM_DEF)) { psym = &symtab.sym[pProc->Icode.icode[i].ll.caseTbl.numEntries]; for (c = psym->label; c < psym->label + psym->size; c++) { if (BITMAP(c, BM_CODE)) { pProc->Icode.icode[i].ll.flg |= IMPURE; pProc->flg |= IMPURE; break; } } } } // Print assembler listing if (option.asm1) disassem(1, pProc); } if (option.Interact) { interactDis(pProcList, 0); // Interactive disassembler } // Converts jump target addresses to icode offsets for (pProc = pProcList; pProc; pProc = pProc->next) bindIcodeOff(pProc); // Print memory bitmap if (option.Map) displayMemMap(); }
int dbg_parse_line() { char ch; unsigned int ad; unsigned int ln; unsigned int regno; unsigned int ui; int nn; int n2; while (linendx < 84) { ch = dbg_getchar(); switch (ch) { case -1: return; case ' ': break; case '?': dbg_DisplayHelp(); break; case 'q': return 1; case 'a': dbg_arm(dbg_dbctrl); break; case 'i': ch = dbg_getchar(); switch(ch) { case '?': // query instruction breakpoints if (((dbg_dbctrl & 0x030000)==0) && (dbg_dbctrl & 1) == 1) printf("i0=%08X\r\n", dbg_GetDBAD(0)); if (((dbg_dbctrl & 0x300000)==0) && (dbg_dbctrl & 2) == 2) printf("i1=%08X\r\n", dbg_GetDBAD(1)); if (((dbg_dbctrl & 0x3000000)==0) && (dbg_dbctrl & 4) == 4) printf("i2=%08X\r\n", dbg_GetDBAD(2)); if (((dbg_dbctrl & 0x30000000)==0) && (dbg_dbctrl & 8) == 8) printf("i2=%08X\r\n", dbg_GetDBAD(3)); break; case '0': dbg_ReadSetIB(0); break; case '1': dbg_ReadSetIB(1); break; case '2': dbg_ReadSetIB(2); break; case '3': dbg_ReadSetIB(3); break; } break; case 'd': ch = dbg_getchar(); switch(ch) { case 'i': dbg_nextSpace(); nn = dbg_getHexNumber(&ad); if (nn > 0) { n2 = dbg_getDecNumber(&ln); if (n2 > 0) { for (; n2 > 0; n2--) disassem(&ad,0); } else disassem20(ad,0); } break; case '?': // query instruction breakpoints printf("\r\n"); if (((dbg_dbctrl & 0x030000)==0x30000) && (dbg_dbctrl & 1) == 1) printf("d0=%08X\r\n", dbg_GetDBAD(0)); if (((dbg_dbctrl & 0x300000)==0x300000) && (dbg_dbctrl & 2) == 2) printf("d1=%08X\r\n", dbg_GetDBAD(1)); if (((dbg_dbctrl & 0x3000000)==0x3000000) && (dbg_dbctrl & 4) == 4) printf("d2=%08X\r\n", dbg_GetDBAD(2)); if (((dbg_dbctrl & 0x30000000)==0x30000000) && (dbg_dbctrl & 8) == 8) printf("d2=%08X\r\n", dbg_GetDBAD(3)); break; case '0': dbg_ReadSetDB(0); break; case '1': dbg_ReadSetDB(1); break; case '2': dbg_ReadSetDB(2); break; case '3': dbg_ReadSetDB(3); break; case 's': ch = dbg_getchar(); switch(ch) { case '?': if (((dbg_dbctrl & 0x030000)==0x10000) && (dbg_dbctrl & 1) == 1) printf("ds0=%08X\r\n", dbg_GetDBAD(0)); if (((dbg_dbctrl & 0x300000)==0x100000) && (dbg_dbctrl & 2) == 2) printf("ds1=%08X\r\n", dbg_GetDBAD(1)); if (((dbg_dbctrl & 0x3000000)==0x1000000) && (dbg_dbctrl & 4) == 4) printf("ds2=%08X\r\n", dbg_GetDBAD(2)); if (((dbg_dbctrl & 0x30000000)==0x10000000) && (dbg_dbctrl & 8) == 8) printf("ds2=%08X\r\n", dbg_GetDBAD(3)); break; case '0': dbg_ReadSetDSB(0); break; case '1': dbg_ReadSetDSB(1); break; case '2': dbg_ReadSetDSB(2); break; case '3': dbg_ReadSetDSB(3); break; } break; default: dbg_nextSpace(); dbg_SetDBAD(0,0); dbg_SetDBAD(1,0); dbg_SetDBAD(2,0); dbg_SetDBAD(3,0); dbg_arm(0); break; } break; case 'r': dbg_processReg(); break; case 's': ch = dbg_getchar(); if (ch=='s') { ch = dbg_getchar(); if (ch=='-') { dbg_dbctrl &= 0x3FFFFFFFFFFFFFFFL; dbg_arm(dbg_dbctrl); ssm = 0; } else if (ch=='+' || ch=='m') { dbg_dbctrl |= 0x4000000000000000L; dbg_arm(dbg_dbctrl); ssm = 1; return 1; } } break; case 'f': ch = dbg_getchar(); if (ch=='/') dbg_getDumpFormat(); ch = dbg_getchar(); if (ch==',') { if (curfmt=='x') nn = dbg_getHexNumber(&ui); else nn = dbg_getDecNumber(&ui); if (nn > 0) curfill = ui; } switch(curfmt) { case 'x': switch(cursz) { case 'b': for (nn = 0; nn < currep; nn++) bmem[ad+nn] = curfill; break; case 'c': for (nn = 0; nn < currep; nn++) cmem[ad/2+nn] = curfill; break; case 'h': for (nn = 0; nn < currep; nn++) hmem[ad/4+nn] = curfill; break; case 'w': for (nn = 0; nn < currep; nn++) wmem[ad/8+nn] = curfill; break; } } break; case 'x': ch = dbg_getchar(); if (ch=='/') { dbg_getDumpFormat(); } switch(curfmt) { case 'i': printf("\r\n"); for (nn = 0; nn < currep; nn++) { if (getcharNoWait()==3) break; disassem(&curaddr,0); } break; case 's': for (nn = 0; nn < currep; nn++) { if (getcharNoWait()==3) break; curaddr += putstr(&cmem[curaddr/2],84) * 2; printf("\r\n"); } break; case 'x': for (nn = 0; nn < currep; nn++) { if (getcharNoWait()==3) break; if ((nn % muol)==0) { switch(cursz) { case 'b': printf("\r\n%06X ", curaddr+nn); break; case 'c': printf("\r\n%06X ", curaddr+nn*2); break; case 'h': printf("\r\n%06X ", curaddr+nn*4); break; case 'w': printf("\r\n%06X ", curaddr+nn*8); break; } } asm {; right here ; }; switch(cursz) { case 'b': printf("%02X ", bmem[curaddr+nn]); break; case 'c': printf("%04X ", cmem[curaddr/2+nn]); break; case 'h': printf("%08X ", hmem[curaddr/4+nn]); break; case 'w': printf("%016X ", wmem[curaddr/8+nn]); break; } } switch(cursz) { case 'b': curaddr += nn; break; case 'c': curaddr += nn * 2; break; case 'h': curaddr += nn * 4; break; case 'w': curaddr += nn * 8; break; } printf("\r\n"); break; } } } return 0; }