1*26420Ssam #ifndef lint 2*26420Ssam static char sccsid[] = "@(#)opset.c 1.1 (Berkeley) 02/25/86"; 3*26420Ssam #endif 4*26420Ssam /* 5*26420Ssam * 6*26420Ssam * UNIX debugger 7*26420Ssam * 8*26420Ssam */ 9*26420Ssam 10*26420Ssam #include "defs.h" 11*26420Ssam #include "optab.h" 12*26420Ssam 13*26420Ssam STRING errflg; 14*26420Ssam L_INT dot; 15*26420Ssam INT dotinc; 16*26420Ssam L_INT var[]; 17*26420Ssam 18*26420Ssam 19*26420Ssam /* instruction printing */ 20*26420Ssam 21*26420Ssam POS type, space, incp; 22*26420Ssam 23*26420Ssam OPTAB ioptab[256]; /* index by opcode to optab */ 24*26420Ssam 25*26420Ssam mkioptab() {/* set up ioptab */ 26*26420Ssam REG OPTAB p=optab; 27*26420Ssam while (p->iname){ 28*26420Ssam ioptab[p->val&LOBYTE]=p; 29*26420Ssam p++; 30*26420Ssam } 31*26420Ssam } 32*26420Ssam 33*26420Ssam printins(idsp,ins) 34*26420Ssam REG L_INT ins; 35*26420Ssam { 36*26420Ssam short argno; /* argument index */ 37*26420Ssam REG mode; /* mode */ 38*26420Ssam REG r; /* register name */ 39*26420Ssam REG d; /* assembled byte, word, long or float */ 40*26420Ssam long snarf(); 41*26420Ssam REG char * ap; 42*26420Ssam REG OPTAB ip; 43*26420Ssam 44*26420Ssam type = DSYM; 45*26420Ssam space = idsp; 46*26420Ssam ins = byte(ins); 47*26420Ssam if((ip=ioptab[ins]) == (OPTAB)0) { 48*26420Ssam printf("?%2x%8t", ins); 49*26420Ssam dotinc = 1; 50*26420Ssam return; 51*26420Ssam } 52*26420Ssam printf("%s%8t",ip->iname); 53*26420Ssam incp = 1; 54*26420Ssam ap = ip->argtype; 55*26420Ssam for (argno=0; argno<ip->nargs; argno++,ap++) { 56*26420Ssam var[argno] = 0x80000000; 57*26420Ssam if (argno!=0) printc(','); 58*26420Ssam top: 59*26420Ssam if (*ap&ACCB) 60*26420Ssam mode = 0xAF + ((*ap&7)<<5); /* branch displacement */ 61*26420Ssam else{ 62*26420Ssam mode = bchkget(inkdot(incp),idsp); ++incp; 63*26420Ssam } 64*26420Ssam r = mode&0xF; 65*26420Ssam mode >>= 4; 66*26420Ssam switch ((int)mode) { 67*26420Ssam case 0: 68*26420Ssam case 1: 69*26420Ssam case 2: 70*26420Ssam case 3: 71*26420Ssam /* short literal */ 72*26420Ssam printc('$'); 73*26420Ssam d = mode<<4|r; 74*26420Ssam goto immed; 75*26420Ssam case 4: /* [r] */ 76*26420Ssam printf("[%s]",regname[r]); 77*26420Ssam goto top; 78*26420Ssam case 5: /* r */ 79*26420Ssam printf("%s",regname[r]); 80*26420Ssam break; 81*26420Ssam case 6: /* (r) */ 82*26420Ssam printf("(%s)",regname[r]); 83*26420Ssam break; 84*26420Ssam case 7: /* -(r) */ 85*26420Ssam printf("-(%s)",regname[r]); 86*26420Ssam break; 87*26420Ssam case 9: /* *(r)+ */ 88*26420Ssam printc('*'); 89*26420Ssam case 8: /* (r)+ */ 90*26420Ssam if(r==0xF || mode==8 && (r==8 || r==9)) { 91*26420Ssam printc('$'); 92*26420Ssam d = snarf((r&03)+1, idsp); 93*26420Ssam } else { /*it's not PC immediate or abs*/ 94*26420Ssam printf("(%s)+",regname[r]); 95*26420Ssam break; 96*26420Ssam } 97*26420Ssam immed: 98*26420Ssam if(ins == KCALL && d>=0 && d<SYSSIZ) { 99*26420Ssam if(systab[d]) 100*26420Ssam printf(systab[d]); 101*26420Ssam else 102*26420Ssam printf("%R", d); 103*26420Ssam break; 104*26420Ssam } 105*26420Ssam goto disp; 106*26420Ssam case 0xB: /* byte displacement deferred */ 107*26420Ssam case 0xD: /* word displacement deferred */ 108*26420Ssam case 0xF: /* long displacement deferred */ 109*26420Ssam printc('*'); 110*26420Ssam case 0xA: /* byte displacement */ 111*26420Ssam case 0xC: /* word displacement */ 112*26420Ssam case 0xE: /* long displacement */ 113*26420Ssam d = snarf(1<<((mode>>1&03)-1), idsp); 114*26420Ssam if (r==0xF) { /* PC offset addressing */ 115*26420Ssam d += dot+incp; 116*26420Ssam psymoff(d,type,""); 117*26420Ssam var[argno]=d; 118*26420Ssam break; 119*26420Ssam } 120*26420Ssam disp: 121*26420Ssam if(d>=0 && d<maxoff) 122*26420Ssam printf("%R", d); 123*26420Ssam else 124*26420Ssam psymoff(d,type,""); 125*26420Ssam if (mode>=0xA) 126*26420Ssam printf("(%s)",regname[r]); 127*26420Ssam var[argno]=d; 128*26420Ssam break; 129*26420Ssam } /* end of the mode switch */ 130*26420Ssam } 131*26420Ssam if (ins==CASEL) { 132*26420Ssam if(inkdot(incp)&01) /* align */ 133*26420Ssam incp++; 134*26420Ssam for (argno=0; argno<=var[2]; ++argno) { 135*26420Ssam printc(EOR); 136*26420Ssam printf(" %R: ",argno+var[1]); 137*26420Ssam d=shorten(get(inkdot(incp+argno+argno),idsp)); 138*26420Ssam if (d&0x8000) d -= 0x10000; 139*26420Ssam psymoff(inkdot(incp)+d,type,""); 140*26420Ssam } 141*26420Ssam incp += var[2]+var[2]+2; 142*26420Ssam } 143*26420Ssam dotinc=incp; 144*26420Ssam } 145*26420Ssam 146*26420Ssam long snarf (nbytes, idsp) 147*26420Ssam { 148*26420Ssam register long value; 149*26420Ssam 150*26420Ssam value = chkget(inkdot(incp), idsp); 151*26420Ssam incp += nbytes; 152*26420Ssam return(value>>(4-nbytes)*8); 153*26420Ssam } 154