* Copyright (c) 1991 The Regents of the University of California.
* This module is believed to contain source code proprietary to AT&T.
* Use and redistribution is subject to the Berkeley Software License
* Agreement and your Software Agreement with AT&T (Western Electric).
static char sccsid
[] = "@(#)opset.c 5.1 (Berkeley) 4/4/91";
* adb - instruction decoding
struct optab
*ioptab
[256]; /* index by opcode to optab */
register struct optab
*p
;
for (p
= optab
; p
->iname
; p
++)
* Print one instruction, and leave dotinc set to the number of bytes
u_char ins
; /* instruction opcode */
int argno
; /* argument index */
register int mode
; /* mode */
register int r
; /* register name */
register int d
; /* assembled byte, word, long or float */
register int dotoff
; /* offset from dot of current byte */
register struct optab
*ip
;
#define snarfbytes(nbytes) \
(void) adbread(space, inkdot(dotoff), &mem.b, nbytes); \
(void) adbread(space
, dot
, &ins
, 1);
if ((ip
= ioptab
[ins
]) == NULL
) {
adbprintf("%s%8t", ip
->iname
);
for (argno
= 0; argno
< ip
->nargs
; argno
++, ap
++) {
if (*ap
& ACCB
) /* branch displacement */
mode
= 0xAF + ((*ap
& 7) << 5);
case 0: case 1: case 2: case 3:
adbprintf("[%s]", regname
[r
]);
adbprintf("%s", regname
[r
]);
adbprintf("(%s)", regname
[r
]);
adbprintf("-(%s)", regname
[r
]);
} else if (mode
== 8 && (r
== 8 || r
== 9)) {
d
= r
== 8 ? mem
.b
: mem
.w
;
adbprintf("(%s)+", regname
[r
]);
if (ins
== KCALL
&& (u_int
)d
< nsys
&& syscalls
[d
])
case 0xA: /* byte displacement */
case 0xB: /* byte displacement deferred */
case 0xC: /* word displacement */
case 0xD: /* word displacement deferred */
case 0xE: /* long displacement */
case 0xF: /* long displacement deferred */
/* displacement or displacement deferred */
if (r
== 0xF) { /* PC offset addressing */
psymoff("%R", (addr_t
)d
, SP_DATA
, maxoff
, "");
adbprintf("%V(%s)", d
, regname
[r
]);
if (inkdot(dotoff
) & 01) /* align */
for (argno
= 0; argno
<= var
[2]; ++argno
) {
adbprintf("\n %R: ", argno
+ var
[1]);
psymoff("%R", adjdot
+ mem
.w
, SP_DATA
, maxoff
, "");