📄 sun.c
字号:
register Optab *o; o = &optab[0]; while (o->mask != 0 and (inst&o->mask) != o->match) { ++o; } return o;}private Address printop(addr)Address addr;{ Optab *o; short inst; printf("%08x ", addr); iread(&inst, addr, sizeof(inst)); o = decode(inst, addr); if (o->mask == 0) { printf("\tbadop"); instaddr = addr + sizeof(inst); } else { printing = true; following = false; instaddr = addr + sizeof(inst); (*o->opfun)(inst, o->farg); printing = false; } printf("\n"); return instaddr;}/* * Quickly find the return address of the current procedure or function * while single stepping. Just get the word pointed at by sp. */private Address currtnaddr (){ Address retaddr; dread(&retaddr, reg(STKP), sizeof(retaddr)); return retaddr;}/* * Print out the effective address for the given parameters. */private printea(mode, reg, size)long mode, reg;int size;{ long index, disp; static char *aregs[] = { "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp" }; Byte b; short w; long l; switch ((int)(mode)) { case 0: if (printing) { printf("d%D", reg); } break; case 1: if (printing) { printf("%s", aregs[reg]); } break; case 2: if (printing) { printf("%s@", aregs[reg]); } break; case 3: if (printing) { printf("%s@+", aregs[reg]); } break; case 4: if (printing) { printf("%s@-", aregs[reg]); } break; case 5: instread(w); if (printing) { printf("%s@(%D)", aregs[reg], w); } break; case 6: instread(w); if (printing) { index = w; disp = (char)(index&0377); printf("%s@(%d,%c%D:%c)", aregs[reg], disp, (index&0100000)?'a':'d',(index>>12)&07, (index&04000)?'l':'w'); } break; case 7: switch ((int)(reg)) { case 0: instread(w); if (printing) { index = w; psymoff(index); } break; case 1: instread(l); if (printing) { index = l; psymoff(index); } break; case 2: instread(w); if (printing) { disp = w; psymoff(disp + instaddr); } break; case 3: instread(w); if (printing) { index = w; disp = (char)(index&0377); printf("pc@(%D,%c%D:%c)", disp, (index&0100000)?'a':'d',(index>>12)&07, (index&04000)?'l':'w'); } break; case 4: switch (size) { case sizeof(b): instread(w); index = (w&0xff); break; case sizeof(w): instread(w); index = w; break; case sizeof(l): instread(l); index = l; break; default: if (printing) { printf("unexpected size %d in printea\n", size); } instread(l); index = l; break; } if (printing) { printf(IMDF, index); } break; default: if (printing) { printf("???"); } break; } break; default: if (printing) { printf("???"); } break; }}private printEA(ea, size)long ea;int size;{ printea((ea>>3)&07, ea&07, size);}private mapsize(inst)register long inst;{ int m; inst >>= 6; inst &= 03; switch (inst) { case 0: m = 1; break; case 1: m = 2; break; case 2: m = 4; break; default: m = -1; break; } return m;}private char suffix(size)int size;{ char c; switch (size) { case 1: c = 'b'; break; case 2: c = 'w'; break; case 4: c = 'l'; break; default: panic("bad size %d in suffix", size); } return c;}/* * Print an address offset. Eventually this should attempt to be symbolic, * but for now its just printed in hex. */private psymoff (off)Word off;{ Symbol f; f = whatblock((Address) (off + FUNCOFFSET)); if (codeloc(f) == off + FUNCOFFSET) { printf("%s", symname(f)); } else { printf("0x%x", off); }}/* * Instruction class specific routines. */public omove(inst, s)long inst;String s;{ register int c; int size; c = s[0]; if (printing) { printf("\tmov%c\t", c); } size = ((c == 'b') ? 1 : (c == 'w') ? 2 : 4); printea((inst>>3)&07, inst&07, size); if (printing) { printf(","); } printea((inst>>6)&07, (inst>>9)&07, size);}/* * Two types: bsr (4 bytes) and bsrs (2 bytes) */public obranch(inst, dummy)long inst;{ long disp; String s; short w; Address startingaddr; /* address of branch instruction */ int branchtype; /* type of branch (0 = unconditional) */ Address dest; Address retaddr; /* for bsr instruction */ startingaddr = instaddr - 2; disp = inst&0377; s = "s "; if (disp == 0) { retaddr = startingaddr + 4; } else { retaddr = startingaddr + 2; } if (disp > 127) { disp |= ~0377; } else if (disp == 0){ s = " "; instread(w); disp = w; } branchtype = (int)((inst>>8)&017); dest = startingaddr + 2 + disp; if (printing) { printf("\tb%s%s\t", bname[branchtype], s); psymoff(dest); } if (following) { /* * If we're to follow the dynamic flow of instructions, * we must see where the branch leads. A branchtype of 0 * indicates an unconditional branch which we simply take * as the new instruction address. For a conditional branch, * we continue execution up to the current address, single step, * and keep going. */ if (branchtype == 0) { instaddr = dest; } else if (branchtype == 01) { /* bsr */ if (followcalls) { steppast(startingaddr); curfunc = whatblock(pc, true); if (not isbperr()) { printstatus(); /* NOTREACHED */ } bpact(); if (nosource(curfunc) and canskip(curfunc) and nlhdr.nlines != 0) { stepto(retaddr); instaddr = pc; bpact(); } else { callnews(/* iscall = */ true); } } } else { steppast(startingaddr); } }}public odbcc(inst, form)long inst;String form;{ long disp; short w; instread(w); if (printing) { printf(form, dbname[(int)((inst>>8)&017)], inst&07); psymoff(w + sizeof(w)); }}public oscc(inst, dummy)long inst;long dummy;{ if (printing) { printf("\ts%s\t", cname[(int)((inst>>8)&017)]); } printea((inst>>3)&07, inst&07, 1);}public biti(inst, dummy)long inst;long dummy;{ short w; if (printing) { printf("\t%s\t", bit[(int)((inst>>6)&03)]); } if (inst&0x0100) { if (printing) { printf("d%D,", inst>>9); } } else { instread(w); if (printing) { printf(IMDF, w); printf(","); } } printEA(inst);}public opmode(inst, opcode)long inst;long opcode;{ register int opmode; register int reg; int size; opmode = (int)((inst>>6) & 07); reg = (int)((inst>>9) & 07); if (opmode == 0 or opmode == 4) { size = 1; } else if (opmode == 1 or opmode == 3 or opmode == 5) { size = 2; } else { size = 4; } if (printing) { printf("\t%s%c\t", opcode, suffix(size)); } if (opmode >= 4 and opmode <= 6) { if (printing) { printf("d%d,", reg); } printea((inst>>3)&07, inst&07, size); } else { printea((inst>>3)&07, inst&07, size); if (printing) { printf(",%c%d",(opmode<=2) ? 'd' : 'a', reg); } }}public shroi(inst, ds)long inst;String ds;{ int rx, ry; String opcode; if ((inst & 0xC0) == 0xC0) { opcode = shro[(int)((inst>>9)&03)]; if (printing) { printf("\t%s%s\t", opcode, ds); } printEA(inst); } else { if (printing) { opcode = shro[(int)((inst>>3)&03)]; printf("\t%s%s%c\t", opcode, ds, suffix(mapsize(inst))); rx = (int)((inst>>9)&07); ry = (int)(inst&07); if ((inst>>5)&01) { printf("d%d,d%d", rx, ry); } else { printf(IMDF, (rx ? rx : 8)); printf(",d%d", ry); } } }} public oimmed(inst, opcode)long inst;register String opcode;{ register int size; long const; short w; size = mapsize(inst); if (size > 0) { if (size == 4) { instread(const); } else { instread(w); const = w; } if (printing) { printf("\t%s%c\t", opcode, suffix(size)); printf(IMDF, const); printf(","); } printEA(inst, size); } else { if (printing) { printf("\tbadop"); } }}public oreg(inst, opcode)long inst;register String opcode;{ if (printing) { printf(opcode, (inst & 07)); }}public extend(inst, opcode)long inst;String opcode;{ register int size; int ry, rx; char c; if (printing) { size = mapsize(inst); ry = (inst&07); rx = ((inst>>9)&07); c = ((inst & 0x1000) ? suffix(size) : ' '); printf("\t%s%c\t", opcode, c); if (opcode[0] == 'e') { if (inst & 0x0080) { printf("d%D,a%D", rx, ry); } else if (inst & 0x0008) { printf("a%D,a%D", rx, ry); } else { printf("d%D,d%D", rx, ry); } } else if ((inst & 0xF000) == 0xB000) { printf("a%D@+,a%D@+", ry, rx); } else if (inst & 0x8) { printf("a%D@-,a%D@-", ry, rx); } else { printf("d%D,d%D", ry, rx); } }}public olink(inst, dummy)long inst;long dummy;{ short w; instread(w); if (printing) { printf("\tlink\ta%D,", inst&07); printf(IMDF, w); }}public otrap(inst, dummy)long inst;{ if (printing) { printf("\ttrap\t"); printf(IMDF, inst&017); }}public oneop(inst, opcode)long inst;register String opcode;{ if (printing) { printf("\t%s",opcode); } printEA(inst);}public jsrop(inst, opcode)long inst;register String opcode;{ Address startingaddr; /* beginning of jsr instruction */ Address retaddr; /* can't call return_addr (frame not set up yet) */ startingaddr = instaddr - 2; switch ((inst >> 3) & 07) { case 2: retaddr = instaddr; /* two byte instruction */ break; case 5: case 6: retaddr = instaddr + 2; /* four byte instruction */ break; case 7: default: switch (inst & 07) { case 0: case 2: case 3: retaddr = instaddr + 2; break; case 1: default: retaddr = instaddr + 4; /* six byte instruction */ break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -