|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)opset.c 1.1 (Berkeley) 2/25/86";
3: #endif
4: /*
5: *
6: * UNIX debugger
7: *
8: */
9:
10: #include "defs.h"
11: #include "optab.h"
12:
13: STRING errflg;
14: L_INT dot;
15: INT dotinc;
16: L_INT var[];
17:
18:
19: /* instruction printing */
20:
21: POS type, space, incp;
22:
23: OPTAB ioptab[256]; /* index by opcode to optab */
24:
25: mkioptab() {/* set up ioptab */
26: REG OPTAB p=optab;
27: while (p->iname){
28: ioptab[p->val&LOBYTE]=p;
29: p++;
30: }
31: }
32:
33: printins(idsp,ins)
34: REG L_INT ins;
35: {
36: short argno; /* argument index */
37: REG mode; /* mode */
38: REG r; /* register name */
39: REG d; /* assembled byte, word, long or float */
40: long snarf();
41: REG char * ap;
42: REG OPTAB ip;
43:
44: type = DSYM;
45: space = idsp;
46: ins = byte(ins);
47: if((ip=ioptab[ins]) == (OPTAB)0) {
48: printf("?%2x%8t", ins);
49: dotinc = 1;
50: return;
51: }
52: printf("%s%8t",ip->iname);
53: incp = 1;
54: ap = ip->argtype;
55: for (argno=0; argno<ip->nargs; argno++,ap++) {
56: var[argno] = 0x80000000;
57: if (argno!=0) printc(',');
58: top:
59: if (*ap&ACCB)
60: mode = 0xAF + ((*ap&7)<<5); /* branch displacement */
61: else{
62: mode = bchkget(inkdot(incp),idsp); ++incp;
63: }
64: r = mode&0xF;
65: mode >>= 4;
66: switch ((int)mode) {
67: case 0:
68: case 1:
69: case 2:
70: case 3:
71: /* short literal */
72: printc('$');
73: d = mode<<4|r;
74: goto immed;
75: case 4: /* [r] */
76: printf("[%s]",regname[r]);
77: goto top;
78: case 5: /* r */
79: printf("%s",regname[r]);
80: break;
81: case 6: /* (r) */
82: printf("(%s)",regname[r]);
83: break;
84: case 7: /* -(r) */
85: printf("-(%s)",regname[r]);
86: break;
87: case 9: /* *(r)+ */
88: printc('*');
89: case 8: /* (r)+ */
90: if(r==0xF || mode==8 && (r==8 || r==9)) {
91: printc('$');
92: d = snarf((r&03)+1, idsp);
93: } else { /*it's not PC immediate or abs*/
94: printf("(%s)+",regname[r]);
95: break;
96: }
97: immed:
98: if(ins == KCALL && d>=0 && d<SYSSIZ) {
99: if(systab[d])
100: printf(systab[d]);
101: else
102: printf("%R", d);
103: break;
104: }
105: goto disp;
106: case 0xB: /* byte displacement deferred */
107: case 0xD: /* word displacement deferred */
108: case 0xF: /* long displacement deferred */
109: printc('*');
110: case 0xA: /* byte displacement */
111: case 0xC: /* word displacement */
112: case 0xE: /* long displacement */
113: d = snarf(1<<((mode>>1&03)-1), idsp);
114: if (r==0xF) { /* PC offset addressing */
115: d += dot+incp;
116: psymoff(d,type,"");
117: var[argno]=d;
118: break;
119: }
120: disp:
121: if(d>=0 && d<maxoff)
122: printf("%R", d);
123: else
124: psymoff(d,type,"");
125: if (mode>=0xA)
126: printf("(%s)",regname[r]);
127: var[argno]=d;
128: break;
129: } /* end of the mode switch */
130: }
131: if (ins==CASEL) {
132: if(inkdot(incp)&01) /* align */
133: incp++;
134: for (argno=0; argno<=var[2]; ++argno) {
135: printc(EOR);
136: printf(" %R: ",argno+var[1]);
137: d=shorten(get(inkdot(incp+argno+argno),idsp));
138: if (d&0x8000) d -= 0x10000;
139: psymoff(inkdot(incp)+d,type,"");
140: }
141: incp += var[2]+var[2]+2;
142: }
143: dotinc=incp;
144: }
145:
146: long snarf (nbytes, idsp)
147: {
148: register long value;
149:
150: value = chkget(inkdot(incp), idsp);
151: incp += nbytes;
152: return(value>>(4-nbytes)*8);
153: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.