home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / adb / opset.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  7.0 KB  |  378 lines

  1. #
  2. /*
  3.  *
  4.  *    UNIX debugger
  5.  *
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10. STRING        errflg;
  11. L_INT        dot;
  12. INT        dotinc;
  13. L_INT        var[];
  14.  
  15.  
  16. /* instruction printing */
  17.  
  18. #define    DOUBLE    0
  19. #define DOUBLW    1
  20. #define    SINGLE    2
  21. #define SINGLW    3
  22. #define    REVERS    4
  23. #define    BRANCH    5
  24. #define    NOADDR    6
  25. #define    DFAULT    7
  26. #define    TRAP    8
  27. #define    SYS    9
  28. #define    SOB    10
  29. #define JMP    11
  30. #define JSR    12
  31.  
  32.  
  33. TYPE    struct optab    *OPTAB;
  34. struct optab {
  35.     int    mask;
  36.     int    val;
  37.     int    itype;
  38.     char    *iname;
  39. } optab[] {
  40.     0107777, 0010000, DOUBLE, "mov",
  41.     0107777, 0020000, DOUBLE, "cmp",
  42.     0107777, 0030000, DOUBLE, "bit",
  43.     0107777, 0040000, DOUBLE, "bic",
  44.     0107777, 0050000, DOUBLE, "bis",
  45.     0007777, 0060000, DOUBLE, "add",
  46.     0007777, 0160000, DOUBLE, "su",
  47.     0100077, 0005000, SINGLE, "clr",
  48.     0100077, 0005100, SINGLE, "com",
  49.     0100077, 0005200, SINGLE, "inc",
  50.     0100077, 0005300, SINGLE, "dec",
  51.     0100077, 0005400, SINGLE, "neg",
  52.     0100077, 0005500, SINGLE, "adc",
  53.     0100077, 0005600, SINGLE, "sbc",
  54.     0100077, 0005700, SINGLE, "tst",
  55.     0100077, 0006000, SINGLE, "ror",
  56.     0100077, 0006100, SINGLE, "rol",
  57.     0100077, 0006200, SINGLE, "asr",
  58.     0100077, 0006300, SINGLE, "asl",
  59.     0000077, 0000100, JMP,    "jmp",
  60.     0000077, 0000300, SINGLE, "swab",
  61.     0000077, 0170100, SINGLW, "ldfps",
  62.     0000077, 0170200, SINGLW, "stfps",
  63.     0000077, 0170300, SINGLW, "stst",
  64.     0000077, 0170400, SINGLW, "clrf",
  65.     0000077, 0170500, SINGLW, "tstf",
  66.     0000077, 0170600, SINGLW, "absf",
  67.     0000077, 0170700, SINGLW, "negf",
  68.     0000077, 0006700, SINGLW, "sxt",
  69.     0000077, 0006600, SINGLW, "mtpi",
  70.     0000077, 0106600, SINGLW, "mtpd",
  71.     0000077, 0006500, SINGLW, "mfpi",
  72.     0000077, 0106500, SINGLW, "mfpd",
  73.     0000777, 0070000, REVERS, "mul",
  74.     0000777, 0071000, REVERS, "div",
  75.     0000777, 0072000, REVERS, "ash",
  76.     0000777, 0073000, REVERS, "ashc",
  77.     LOBYTE,  0000400, BRANCH, "br",
  78.     LOBYTE,  0001000, BRANCH, "bne",
  79.     LOBYTE,  0001400, BRANCH, "beq",
  80.     LOBYTE,  0002000, BRANCH, "bge",
  81.     LOBYTE,  0002400, BRANCH, "blt",
  82.     LOBYTE,  0003000, BRANCH, "bgt",
  83.     LOBYTE,  0003400, BRANCH, "ble",
  84.     LOBYTE,  0100000, BRANCH, "bpl",
  85.     LOBYTE,  0100400, BRANCH, "bmi",
  86.     LOBYTE,  0101000, BRANCH, "bhi",
  87.     LOBYTE,  0101400, BRANCH, "blos",
  88.     LOBYTE,  0102000, BRANCH, "bvc",
  89.     LOBYTE,  0102400, BRANCH, "bvs",
  90.     LOBYTE,  0103000, BRANCH, "bcc",
  91.     LOBYTE,  0103400, BRANCH, "bcs",
  92.     0000000, 0000000, NOADDR, "halt",
  93.     0000000, 0000001, NOADDR, "wait",
  94.     0000000, 0000002, NOADDR, "rti",
  95.     0000000, 0000003, NOADDR, "bpt",
  96.     0000000, 0000004, NOADDR, "iot",
  97.     0000000, 0000005, NOADDR, "reset",
  98.     LOBYTE,  0171000, REVERS, "mulf",
  99.     LOBYTE,  0171400, REVERS, "modf",
  100.     LOBYTE,  0172000, REVERS, "addf",
  101.     LOBYTE,  0172400, REVERS, "movf",
  102.     LOBYTE,  0173000, REVERS, "subf",
  103.     LOBYTE,  0173400, REVERS, "cmpf",
  104.     LOBYTE,  0174000, DOUBLW, "movf",
  105.     LOBYTE,  0174400, REVERS, "divf",
  106.     LOBYTE,  0175000, DOUBLW, "movei",
  107.     LOBYTE,  0175400, DOUBLW, "movfi",
  108.     LOBYTE,  0176000, DOUBLW, "movfo",
  109.     LOBYTE,  0176400, REVERS, "movie",
  110.     LOBYTE,  0177000, REVERS, "movif",
  111.     LOBYTE,  0177400, REVERS, "movof",
  112.     0000000, 0170000, NOADDR, "cfcc",
  113.     0000000, 0170001, NOADDR, "setf",
  114.     0000000, 0170002, NOADDR, "seti",
  115.     0000000, 0170011, NOADDR, "setd",
  116.     0000000, 0170012, NOADDR, "setl",
  117.     0000777, 0004000, JSR,    "jsr",
  118.     0000777, 0074000, DOUBLE, "xor",
  119.     0000007, 0000200, SINGLE, "rts",
  120.     0000017, 0000240, DFAULT, "cflg",
  121.     0000017, 0000260, DFAULT, "sflg",
  122.     LOBYTE,  0104000, TRAP,   "emt",
  123.     LOBYTE,  0104400, SYS,    "sys",
  124.     0000077, 0006400, TRAP,   "mark",
  125.     0000777, 0077000, SOB,    "sob",
  126.     0000007, 0000230, TRAP,   "spl",
  127.     0177777, 0000000, DFAULT, "",
  128. };
  129.  
  130. #define SYSTAB struct systab
  131. SYSTAB {
  132.     int    argc;
  133.     char    *sname;
  134. } systab[] {
  135.     1, "indir",
  136.     0, "exit",
  137.     0, "fork",
  138.     2, "read",
  139.     2, "write",
  140.     2, "open",
  141.     0, "close",
  142.     0, "wait",
  143.     2, "creat",
  144.     2, "link",
  145.     1, "unlink",
  146.     2, "exec",
  147.     1, "chdir",
  148.     0, "time",
  149.     3, "mknod",
  150.     2, "chmod",
  151.     2, "chown",
  152.     1, "break",
  153.     2, "stat",
  154.     2, "seek",
  155.     0, "getpid",
  156.     3, "mount",
  157.     1, "umount",
  158.     0, "setuid",
  159.     0, "getuid",
  160.     0, "stime",
  161.     3, "ptrace",
  162.     0, "alarm",
  163.     1, "fstat",
  164.     0, "pause",
  165.     1, "30",
  166.     1, "stty",
  167.     1, "gtty",
  168.     0, "access",
  169.     0, "nice",
  170.     0, "sleep",
  171.     0, "sync",
  172.     1, "kill",
  173.     0, "csw",
  174.     0, "setpgrp",
  175.     0, "tell",
  176.     0, "dup",
  177.     0, "pipe",
  178.     1, "times",
  179.     4, "profil",
  180.     0, "tiu",
  181.     0, "setgid",
  182.     0, "getgid",
  183.     2, "signal",
  184.     0, "49",
  185.     0, "50",
  186.     0, "51",
  187.     0, "52",
  188.     0, "53",
  189.     0, "54",
  190.     0, "55",
  191.     0, "56",
  192.     0, "57",
  193.     0, "58",
  194.     0, "59",
  195.     0, "60",
  196.     0, "61",
  197.     0, "62",
  198.     0, "63",
  199. };
  200.  
  201. STRING    regname[] { "r0", "r1", "r2", "r3", "r4", "r5", "sp", "pc"};
  202.  
  203. POS    type, space, incp;
  204.  
  205. printins(f,idsp,ins)
  206. REG INT        ins;
  207. {
  208.     INT        byte;
  209.     REG OPTAB    p;
  210.  
  211.     type=DSYM; space=idsp; incp=2;
  212.     FOR p=optab;; p++
  213.     DO    IF (ins & ~p->mask) == p->val
  214.         THEN    break;
  215.         FI
  216.     OD
  217.     prints(p->iname); byte=ins&0100000; ins &= p->mask;
  218.     switch (p->itype) {
  219.  
  220.         case JMP:
  221.         type=ISYM;
  222.  
  223.         case SINGLE:
  224.         IF byte THEN printc('b'); FI
  225.         case SINGLW:
  226.         paddr("%8t",ins);
  227.         break;
  228.  
  229.         case REVERS:
  230.         doubl(ins&077,(ins>>6)&07);
  231.         break;
  232.  
  233.         case JSR:
  234.         type=ISYM;
  235.  
  236.         case DOUBLE:
  237.         IF byte THEN printc('b'); FI
  238.         case DOUBLW:
  239.         doubl(ins>>6,ins);
  240.  
  241.         case NOADDR:
  242.         break;
  243.  
  244.         case SOB:
  245.         paddr("%8t",(ins>>6)&07);
  246.         branch(",",-(ins&077));
  247.         break;
  248.  
  249.         case BRANCH:
  250.         branch("%8t",ins);
  251.         break;
  252.  
  253.         case SYS:
  254.         BEGIN
  255.            INT        indir;
  256.            REG INT    w;
  257.            printf("%8t%s", systab[ins &= 077].sname);
  258.            IF ins==0 ANDF f==0 ANDF idsp!=NSP    /* indir */
  259.            THEN w=dot; dot=chkget(inkdot(2),idsp);
  260.             prints(" {");
  261.             indir=get(dot,DSP);
  262.             IF errflg
  263.             THEN errflg=0; printc('?');
  264.             ELSE printins(1,DSP,indir);
  265.             FI
  266.             printc('}');
  267.             dot=w; incp=4;
  268.            ELSE w = systab[ins].argc;
  269.             WHILE w-- ANDF idsp!=NSP
  270.             DO prints("; ");
  271.                psymoff(leng(get(inkdot(incp),idsp)), NSYM, "");
  272.                incp += 2;
  273.             OD
  274.            FI
  275.         END
  276.         break;
  277.  
  278.         case TRAP:
  279.         case DFAULT:
  280.         default:
  281.         printf("%8t%o", ins);
  282.     }
  283.     dotinc=incp;
  284. }
  285.  
  286. doubl(a,b)
  287. {
  288.     paddr("%8t",a); paddr(",",b);
  289. }
  290.  
  291. branch(s,ins)
  292. STRING        s;
  293. REG INT        ins;
  294. {
  295.     printf(s);
  296.     IF ins&0200 THEN ins |= 0177400; FI
  297.     ins = shorten(dot) + (ins<<1) + 2;
  298.     psymoff(leng(ins),ISYM,"");
  299. }
  300.  
  301. paddr(s, a)
  302. STRING        s;
  303. REG INT        a;
  304. {
  305.     REG INT        r;
  306.  
  307.     var[2]=var[1];
  308.     r = a&07; a &= 070;
  309.  
  310.     printf(s);
  311.     IF r==7 ANDF a&020
  312.     THEN IF a&010 THEN printc('*'); FI
  313.          IF a&040
  314.          THEN IF space==NSP
  315.           THEN printc('?');
  316.           ELSE    var[1]=chkget(inkdot(incp),space) + shorten(inkdot(incp+2));
  317.                psymoff(var[1],(a&010?DSYM:type),"");
  318.           FI
  319.          ELSE printc('$');
  320.           IF space==NSP
  321.           THEN printc('?');
  322.           ELSE var[1]=chkget(inkdot(incp), space);
  323.             psymoff(var[1], (a&010?type:NSYM), "");
  324.           FI
  325.          FI
  326.          incp += 2;
  327.          return;
  328.     FI
  329.     r = regname[r];
  330.     switch (a) {
  331.         /* r */
  332.         case 000:
  333.         prints(r);
  334.         return;
  335.  
  336.         /* (r) */
  337.         case 010:
  338.         printf("(%s)", r);
  339.         return;
  340.  
  341.         /* *(r)+ */
  342.         case 030:
  343.         printc('*');
  344.  
  345.         /* (r)+ */
  346.         case 020:
  347.         printf("(%s)+", r);
  348.         return;
  349.  
  350.         /* *-(r) */
  351.         case 050:
  352.         printc('*');
  353.  
  354.         /* -(r) */
  355.         case 040:
  356.         printf("-(%s)", r);
  357.         return;
  358.  
  359.         /* *x(r) */
  360.         case 070:
  361.         printc('*');
  362.  
  363.         /* x(r) */
  364.         case 060:
  365.         IF space==NSP
  366.         THEN printc('?');
  367.         ELSE    var[1]=chkget(inkdot(incp), space);
  368.             psymoff(var[1], (a==070?type:NSYM), "");
  369.         FI
  370.         incp += 2;
  371.         printf("(%s)", r);
  372.         return;
  373.     }
  374. }
  375.  
  376.  
  377.  
  378.