Commit | Line | Data |
---|---|---|
54ee7326 BJ |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | SCCSID(@(#)opset.c 2.3); | |
10 | ||
11 | STRING errflg; | |
12 | L_INT dot; | |
13 | INT dotinc; | |
14 | L_INT var[]; | |
15 | ||
16 | ||
17 | /* instruction printing */ | |
18 | ||
19 | /* | |
20 | * Argument access types | |
21 | */ | |
22 | #define ACCA (8<<3) /* address only */ | |
23 | #define ACCR (1<<3) /* read */ | |
24 | #define ACCW (2<<3) /* write */ | |
25 | #define ACCM (3<<3) /* modify */ | |
26 | #define ACCB (4<<3) /* branch displacement */ | |
27 | #define ACCI (5<<3) /* XFC code */ | |
28 | ||
29 | /* | |
30 | * Argument data types | |
31 | */ | |
32 | #define TYPB 0 /* byte */ | |
33 | #define TYPW 1 /* word */ | |
34 | #define TYPL 2 /* long */ | |
35 | #define TYPQ 3 /* quad */ | |
36 | #define TYPF 4 /* floating */ | |
37 | #define TYPD 5 /* double floating */ | |
38 | ||
39 | ||
40 | TYPE struct optab *OPTAB; | |
41 | struct optab { | |
42 | char *iname; | |
43 | char val; | |
44 | char nargs; | |
45 | char argtype[6]; | |
46 | } optab[]; | |
47 | #define SYSTAB struct systab | |
48 | SYSTAB { | |
49 | int argc; | |
50 | char *sname; | |
51 | } systab[]; | |
52 | STRING regname[]; | |
53 | STRING fltimm[]; | |
54 | POS type, space, incp; | |
55 | ||
56 | int ioptab[256]; /* index by opcode to optab */ | |
57 | ||
58 | mkioptab() {/* set up ioptab */ | |
59 | REG OPTAB p=optab; while (p->iname) {ioptab[p->val&LOBYTE]=p-optab; p++;} | |
60 | } | |
61 | ||
62 | extern char *fmtr; | |
63 | extern char *fmtR; | |
64 | ||
65 | printins(f,idsp,ins) | |
66 | #ifndef vax | |
67 | REG INT ins; | |
68 | #else | |
69 | REG L_INT ins; | |
70 | #endif | |
71 | { | |
72 | short i,b,mode; char **r; long d; char *fmat; | |
73 | REG char * ap; | |
74 | REG OPTAB ip; | |
75 | #ifndef vax | |
76 | struct {char b2,b3,b0,b1;}; | |
77 | #else | |
78 | struct {char b0,b1,b2,b3;}; | |
79 | #endif | |
80 | ||
81 | type=DSYM; space=idsp; | |
82 | ins &= LOBYTE; | |
83 | ip=optab+ioptab[ins]; printf("%s%8t",ip->iname); incp=1; | |
84 | ap=ip->argtype; | |
85 | for (i=0; i<ip->nargs; i++,ap++) { | |
86 | var[i]=0x80000000; | |
87 | if (i!=0) printc(','); | |
88 | top: | |
89 | if (*ap&ACCB) b= 0xAF + ((*ap&7)<<5); /* branch displacement */ | |
90 | else {b=bchkget(inkdot(incp),idsp); ++incp;} | |
91 | if (b&0300) {/* not short literal */ | |
92 | r= ®name[b&0xF]; mode= b >>= 4; | |
93 | mid: | |
94 | switch ((int)mode) { | |
95 | case 4: /* [r] */ printf("[%s]",*r); goto top; | |
96 | case 5: /* r */ printf("%s",*r); break; | |
97 | case 7: /* -(r) */ printc('-'); | |
98 | base: | |
99 | case 6: /* (r) */ printf("(%s)",*r); break; | |
100 | case 9: /* *(r)+ */ printc('*'); | |
101 | case 8: /* (r)+ */ | |
102 | if (r==(regname+0xF)) {/* PC: immediate or absolute */ | |
103 | printc('$'); if (b==9) goto abs; | |
104 | mode=((*ap&7)<<1)+0xA; goto mid; | |
105 | } | |
106 | printf("(%s)+",*r); break; | |
107 | case 0xB: printc('*'); | |
108 | case 0xA: d=bchkget(inkdot(incp),idsp); ++incp; | |
109 | if (d&0x80) d -= 0x100; fmat=fmtr; | |
110 | disp: | |
111 | var[i]=d; | |
112 | if (r==(regname+0xF) && b>=0xA) var[i] += dot+incp; | |
113 | psymoff(var[i],type,""); | |
114 | if (r!=regname+0xF) goto base; | |
115 | break; | |
116 | case 0xD: printc('*'); | |
117 | case 0xC: d=0; | |
118 | d.b0 = bchkget(inkdot(incp),idsp); ++incp; | |
119 | d.b1 = bchkget(inkdot(incp),idsp); ++incp; | |
120 | if (d&0x8000) d -= 0x10000; fmat=fmtr; | |
121 | goto disp; | |
122 | case 0xF: printc('*'); | |
123 | case 0xE: | |
124 | abs: | |
125 | d.b0 = bchkget(inkdot(incp),idsp); ++incp; | |
126 | d.b1 = bchkget(inkdot(incp),idsp); ++incp; | |
127 | d.b2 = bchkget(inkdot(incp),idsp); ++incp; | |
128 | d.b3 = bchkget(inkdot(incp),idsp); ++incp; | |
129 | fmat=fmtR; goto disp; | |
130 | } | |
131 | } else {/* short literal */ | |
132 | var[i]=b; | |
133 | if ((*ap&7)==TYPF || (*ap&7)==TYPD) printf("$%s",fltimm[b]); | |
134 | else printf("$%r",b); | |
135 | } | |
136 | } | |
137 | if (ins==0xCF || ins==0xAF || ins==0x8F) {/* CASEx instr */ | |
138 | for (i=0; i<=var[2]; ++i) { | |
139 | printc(EOR); printf(" %R: ",i+var[1]); | |
140 | d=get(inkdot(incp+i+i),idsp)&0xFFFF; | |
141 | if (d&0x8000) d -= 0x10000; | |
142 | psymoff(inkdot(incp)+d,type,""); | |
143 | } | |
144 | incp += var[2]+var[2]+2; | |
145 | } | |
146 | dotinc=incp; | |
147 | } |