static char sccsid
[] = "@(#)opset.c 1.1 (Berkeley) 2/25/86";
/* instruction printing */
OPTAB ioptab
[256]; /* index by opcode to optab */
mkioptab() {/* set up ioptab */
short argno
; /* argument index */
REG r
; /* register name */
REG d
; /* assembled byte, word, long or float */
if((ip
=ioptab
[ins
]) == (OPTAB
)0) {
printf("%s%8t",ip
->iname
);
for (argno
=0; argno
<ip
->nargs
; argno
++,ap
++) {
if (argno
!=0) printc(',');
mode
= 0xAF + ((*ap
&7)<<5); /* branch displacement */
mode
= bchkget(inkdot(incp
),idsp
); ++incp
;
printf("[%s]",regname
[r
]);
printf("(%s)",regname
[r
]);
printf("-(%s)",regname
[r
]);
if(r
==0xF || mode
==8 && (r
==8 || r
==9)) {
d
= snarf((r
&03)+1, idsp
);
} else { /*it's not PC immediate or abs*/
printf("(%s)+",regname
[r
]);
if(ins
== KCALL
&& d
>=0 && d
<SYSSIZ
) {
case 0xB: /* byte displacement deferred */
case 0xD: /* word displacement deferred */
case 0xF: /* long displacement deferred */
case 0xA: /* byte displacement */
case 0xC: /* word displacement */
case 0xE: /* long displacement */
d
= snarf(1<<((mode
>>1&03)-1), idsp
);
if (r
==0xF) { /* PC offset addressing */
printf("(%s)",regname
[r
]);
} /* end of the mode switch */
if(inkdot(incp
)&01) /* align */
for (argno
=0; argno
<=var
[2]; ++argno
) {
printf(" %R: ",argno
+var
[1]);
d
=shorten(get(inkdot(incp
+argno
+argno
),idsp
));
if (d
&0x8000) d
-= 0x10000;
psymoff(inkdot(incp
)+d
,type
,"");
long snarf (nbytes
, idsp
)
value
= chkget(inkdot(incp
), idsp
);
return(value
>>(4-nbytes
)*8);