clean up awk syntax
[unix-history] / usr / src / old / adb / adb.tahoe / opset.c
CommitLineData
6c7af193
SL
1#ifndef lint
2static char sccsid[] = "@(#)opset.c 1.1 (Berkeley) %G%";
3#endif
4/*
5 *
6 * UNIX debugger
7 *
8 */
9
10#include "defs.h"
11#include "optab.h"
12
13STRING errflg;
14L_INT dot;
15INT dotinc;
16L_INT var[];
17
18
19/* instruction printing */
20
21POS type, space, incp;
22
23OPTAB ioptab[256]; /* index by opcode to optab */
24
25mkioptab() {/* set up ioptab */
26 REG OPTAB p=optab;
27 while (p->iname){
28 ioptab[p->val&LOBYTE]=p;
29 p++;
30 }
31}
32
33printins(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
146long 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}