home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / C / ROBOT01.ZIP / RCCL076 < prev    next >
Encoding:
Text File  |  1987-03-02  |  3.1 KB  |  145 lines

  1.  
  2. /* stick this in the LSI-11 */
  3.  
  4. #define DRC_ADDR    (struct drcdevice *) 0176670
  5. #define DRC_TIMEOUT     3000
  6.  
  7. #define    DRC_CSR0    01    /* CSR bit 0 (to user dev) */
  8. #define    DRC_CSR1    02    /* CSR bit 1 (to user dev) */
  9. #define    DRC_IEB        040    /* INTER Enable B */
  10. #define    DRC_IEA        0100    /* INTER Enable A */
  11. #define    DRC_REQA    0200    /* REQ A line from user dev */
  12. #define    DRC_REQB    0100000    /* REQ B line from user dev */
  13.  
  14. struct drcdevice {
  15.     short    drccsr;
  16.     short    drcobuf;
  17.     short    drcibuf;
  18. };
  19.  
  20. /*
  21.  * Called from LSI-11 clock inter routine..
  22.  * ib is a pointer for input buffer (short)
  23.  * ob is a pointer for output buffer (short)
  24.  * obwc is # of words to output.
  25.  * this routine
  26.  * 1) Interrupts VAX.
  27.  * 2) writes "obwc" words from ob to it (16 bit words)
  28.  * 3) reads words back from vax to "ib".
  29.  * 4) returns count of words read if successful
  30.  *    or "-1" for error (Vax or interface hung)
  31.  */
  32.  
  33. dr11(ib,ob,obwc)
  34. short *ib, *ob;
  35. register obwc;
  36. {
  37.     register struct drcdevice *dp;
  38.     register short ctr;
  39.     register short *bp;
  40.  
  41.     dp = DRC_ADDR;
  42.     dp->drccsr = 0;
  43.     dp->drccsr = DRC_CSR1;    /* interrupt VAX (on his REQB) */
  44.     ctr = DRC_TIMEOUT;
  45.     while ((dp->drccsr & DRC_REQB) == 0) {
  46.         if (--ctr == 0) {
  47.             dp->drccsr = 0;
  48.             return(-1);
  49.         }
  50.     }
  51.     dp->drccsr = 0;
  52. /*      ctr = DRC_TIMEOUT;      */
  53.     while (dp->drccsr & DRC_REQB) {
  54.         if (--ctr == 0) {
  55.             dp->drccsr = 0;
  56.             return(-2);
  57.         }
  58.     }
  59.     dp->drccsr = 0;
  60.     bp = ob;
  61.     /*
  62.      * write obwc words to VAX from ob.
  63.      */
  64.     while (obwc--) {
  65.         dp->drcobuf = *bp++;
  66.         dp->drccsr = DRC_CSR0;    /* set VAX REQA to say word rdy */
  67.     /*      ctr = DRC_TIMEOUT;      */
  68.         while ((dp->drccsr & DRC_REQA) == 0) {
  69.             if (--ctr == 0) {
  70.                 dp->drccsr = 0;
  71.                 return(-3);
  72.             }
  73.         }
  74.         dp->drccsr = 0;        /* Drop VAX REQA */
  75.      /*     ctr = DRC_TIMEOUT;      */
  76.         while (dp->drccsr & DRC_REQA) {
  77.             if (--ctr == 0) {
  78.                 dp->drccsr = 0;
  79.                 return(-4);
  80.             }
  81.         }
  82.     }
  83.     dp->drccsr = DRC_CSR1;    /* set VAX REQB to say EOF */
  84.  
  85. /*      ctr = DRC_TIMEOUT;      */
  86.     while ((dp->drccsr & DRC_REQB) == 0) {
  87.         if (--ctr == 0) {
  88.             dp->drccsr = 0;
  89.             return(-5);
  90.         }
  91.     }
  92.     dp->drccsr = 0;    /* drop VAX REQB */
  93. /*      ctr = DRC_TIMEOUT;      */
  94.     while (dp->drccsr & DRC_REQB) {
  95.         if (--ctr == 0) {
  96.             dp->drccsr = 0;
  97.             return(-6);
  98.         }
  99.     }
  100.  
  101.     /*
  102.      * read words from the VAX
  103.      */
  104.     bp = ib;
  105.     obwc = 0;
  106.  
  107.     while (1) {
  108.         /*
  109.          * wait for REQA to set (when VAX loads buffer)
  110.          */
  111. /*              ctr = DRC_TIMEOUT;      */
  112.         while ((dp->drccsr & (DRC_REQA|DRC_REQB)) == 0) {
  113.             if (--ctr == 0) {
  114.                 dp->drccsr = 0;
  115.                 return(-7);
  116.             }
  117.         }
  118.  
  119.         if (dp->drccsr & DRC_REQB) {    /* EOF read */
  120.             dp->drccsr = DRC_CSR1;
  121.     /*              ctr = DRC_TIMEOUT;      */
  122.             while (dp->drccsr & DRC_REQB) {
  123.                 if (--ctr == 0) {
  124.                     dp->drccsr = 0;
  125.                     return(-8);
  126.                 }
  127.             }
  128.             dp->drccsr = 0;
  129.             return(obwc);
  130.         }
  131.         *bp++ = dp->drcibuf;
  132.         dp->drccsr = DRC_CSR0;    /* Tell the VAX the word was read */
  133.         
  134.         obwc++;
  135.     /*      ctr = DRC_TIMEOUT;      */
  136.         while (dp->drccsr & DRC_REQA) {
  137.             if (--ctr == 0) {
  138.                 dp->drccsr = 0;
  139.                 return(-9);
  140.             }
  141.         }
  142.         dp->drccsr = 0;
  143.     }
  144. }
  145.