static char sccsid
[] = "@(#)opset.c 4.1 %G%";
* Instruction printing routines.
/* instruction printing */
#define ACCA (8<<3) /* address only */
#define ACCR (1<<3) /* read */
#define ACCW (2<<3) /* write */
#define ACCM (3<<3) /* modify */
#define ACCB (4<<3) /* branch displacement */
#define ACCI (5<<3) /* XFC code */
#define TYPB 0 /* byte */
#define TYPW 1 /* word */
#define TYPL 2 /* long */
#define TYPQ 3 /* quad */
#define TYPF 4 /* floating */
#define TYPD 5 /* double floating */
TYPE
struct optab
*OPTAB
;
#define SYSTAB struct systab
int ioptab
[256]; /* index by opcode to optab */
mkioptab() {/* set up ioptab */
REG OPTAB p
=optab
; while (p
->iname
) {ioptab
[p
->val
&LOBYTE
]=p
-optab
; p
++;}
short i
,b
,mode
; char **r
; long d
; char *fmat
;
struct {char b_2
,b_3
,b_0
,b_1
;};
struct {char b_0
,b_1
,b_2
,b_3
;};
if (procp
->paddr
== dot
) {
printf("0x%04.4x", ins
& 0xffff);
ip
=optab
+ioptab
[ins
]; printf("%s\t",ip
->iname
); incp
=1;
for (i
=0; i
<ip
->nargs
; i
++,ap
++) {
if (*ap
&ACCB
) b
= 0xAF + ((*ap
&7)<<5); /* branch displacement */
else {b
=bchkget(inkdot(incp
),idsp
); ++incp
;}
if (b
&0300) {/* not short literal */
if (fmt
=='i' && regno
>= 6 && regno
<= 11 &&
adrtoregvar(regno
, procp
) != -1) {
case 4: /* [r] */ printf("[%s]",*r
); goto top
;
case 5: /* r */ printf("%s",*r
); break;
case 7: /* -(r) */ printc('-');
case 6: /* (r) */ printf("(%s)",*r
); break;
case 9: /* *(r)+ */ printc('*');
if (r
==(regname
+0xF)) {/* PC: immediate or absolute */
printc('$'); if (b
==9) goto abs
;
mode
=((*ap
&7)<<1)+0xA; goto mid
;
printf("(%s)+",*r
); break;
case 0xA: d
=bchkget(inkdot(incp
),idsp
); ++incp
;
if (d
&0x80) d
-= 0x100; fmat
=fmtr
;
if (r
==(regname
+0xF) && b
>=0xA) vvar
[i
] += dot
+incp
;
if (psymoff(vvar
[i
],r
,fmt
) && r
!=regname
+0xF)
d
.b_0
= bchkget(inkdot(incp
),idsp
); ++incp
;
d
.b_1
= bchkget(inkdot(incp
),idsp
); ++incp
;
if (d
&0x8000) d
-= 0x10000; fmat
=fmtr
;
d
.b_0
= bchkget(inkdot(incp
),idsp
); ++incp
;
d
.b_1
= bchkget(inkdot(incp
),idsp
); ++incp
;
d
.b_2
= bchkget(inkdot(incp
),idsp
); ++incp
;
d
.b_3
= bchkget(inkdot(incp
),idsp
); ++incp
;
} else {/* short literal */
if ((*ap
&7)==TYPF
|| (*ap
&7)==TYPD
)
if (ins
==0xCF || ins
==0xAF || ins
==0x8F) {/* CASEx instr */
for (i
=0; i
<=vvar
[2]; ++i
) {
printc(EOR
); printf(" %d: ",i
+vvar
[1]);
d
=get(inkdot(incp
+i
+i
),idsp
)&0xFFFF;
if (d
&0x8000) d
-= 0x10000;
psymoff(inkdot(incp
)+d
,type
,fmt
);
incp
+= vvar
[2]+vvar
[2]+2;
L_INT v
; char fmt
, **r
; {
if (r
== regname
+ 12) { /* parameter */
if ((diff
= adrtoparam((ADDR
) v
, adrtoprocp(dot
)))
if (r
== regname
+ 13) { /* local */
if ((diff
= adrtolocal((ADDR
) -v
, adrtoprocp(dot
))
if ((procp
= adrtoprocp((ADDR
) v
)) != badproc
) {
if ((diff
= adrtoext((ADDR
) v
)) != -1) {