/* Copyright (c) 1982, Regents, University of California */ #define ADDQ 5 #define ADD 13 #define IMMED 074 /* These structures are here for looks, only */ struct add { short op:4, reg:3, mode:3, ea:6; } x; struct addq { short op:4, data:3, size:3, ea:6; } y; nargs(arg) long arg; /* this is only here for address calculation */ { register long *a5; register handy; register char reg, mode, ea; #define size mode #define data reg a5 = (&arg) - 2; /* this points to old a6 */ a5 = (long *) *a5; /* a5 now = my parents a6 */ a5 = (long *) a5[1]; /* pick up return address into a5 */ handy = * (short *)a5; ea = handy & 077; handy >>= 6; mode = handy & 07; handy >>= 3; reg = handy & 07; handy >>= 3; /* op = handy & 017; */ switch(handy & 017) { case ADD: if(reg!=7) return(0); /* this instruction doesn't adjust the sp */ if(ea!=IMMED) return(0); /* too hard to decode adjustment */ handy = (long) (1 + (short *) a5); if(mode==03) { /* addw #n,a7 */ handy = *(short *)handy; return(handy >> 2); } if(mode==07) { /* addl #n,a7 */ handy = *(long *)handy; return(handy >> 2); } else return(0); /* this was doing something to d7 */ case ADDQ: if(ea!=017) return(0); /* this doesn't adjust a7 */ if(size!=02) return(0); /* should complain -- we are doing addq[bw] something,a7 */ switch(data) { case 0: return(2); case 4: return(1); } } return(0); }