/* 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 b2
,b3
,b0
,b1
;};
struct {char b0
,b1
,b2
,b3
;};
ip
=optab
+ioptab
[ins
]; printf("%s%8t",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 */
r
= ®name
[b
&0xF]; mode
= b
>>= 4;
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) var
[i
] += dot
+incp
;
if (r
!=regname
+0xF) goto base
;
d
.b0
= bchkget(inkdot(incp
),idsp
); ++incp
;
d
.b1
= bchkget(inkdot(incp
),idsp
); ++incp
;
if (d
&0x8000) d
-= 0x10000; fmat
=fmtr
;
d
.b0
= bchkget(inkdot(incp
),idsp
); ++incp
;
d
.b1
= bchkget(inkdot(incp
),idsp
); ++incp
;
d
.b2
= bchkget(inkdot(incp
),idsp
); ++incp
;
d
.b3
= bchkget(inkdot(incp
),idsp
); ++incp
;
} else {/* short literal */
if ((*ap
&7)==TYPF
|| (*ap
&7)==TYPD
) printf("$%s",fltimm
[b
]);
if (ins
==0xCF || ins
==0xAF || ins
==0x8F) {/* CASEx instr */
for (i
=0; i
<=var
[2]; ++i
) {
printc(EOR
); printf(" %R: ",i
+var
[1]);
d
=get(inkdot(incp
+i
+i
),idsp
)&0xFFFF;
if (d
&0x8000) d
-= 0x10000;
psymoff(inkdot(incp
)+d
,type
,"");