home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Boot_Images / 2.11_on_rl02 / pdpsim.tz / pdpsim / nova_pt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-29  |  4.9 KB  |  183 lines

  1. /* nova_pt.c: NOVA paper tape read/punch simulator
  2.  
  3.    Copyright (c) 1993, 1994, 1995,
  4.    Robert M Supnik, Digital Equipment Corporation
  5.    Commercial use prohibited
  6.  
  7.    ptr        paper tape reader
  8.    ptp        paper tape punch
  9. */
  10.  
  11. #include "nova_defs.h"
  12.  
  13. extern int int_req, dev_busy, dev_done, dev_disable;
  14. int ptr_stopioe = 0, ptp_stopioe = 0;            /* stop on error */
  15. int ptr_svc (UNIT *uptr);
  16. int ptp_svc (UNIT *uptr);
  17. int ptr_reset (DEVICE *dptr);
  18. int ptp_reset (DEVICE *dptr);
  19. extern int sim_activate (UNIT *uptr, int interval);
  20. extern int sim_cancel (UNIT *uptr);
  21.  
  22. /* PTR data structures
  23.  
  24.    ptr_dev    PTR device descriptor
  25.    ptr_unit    PTR unit descriptor
  26.    ptr_reg    PTR register list
  27. */
  28.  
  29. UNIT ptr_unit = {
  30.     UDATA (&ptr_svc, UNIT_SEQ+UNIT_ATTABLE, 0), SERIAL_IN_WAIT };
  31.  
  32. REG ptr_reg[] = {
  33.     { ORDATA (BUF, ptr_unit.buf, 8) },
  34.     { FLDATA (BUSY, dev_busy, INT_V_PTR) },
  35.     { FLDATA (DONE, dev_done, INT_V_PTR) },
  36.     { FLDATA (DISABLE, dev_disable, INT_V_PTR) },
  37.     { FLDATA (INT, int_req, INT_V_PTR) },
  38.     { DRDATA (POS, ptr_unit.pos, 32), PV_LEFT },
  39.     { DRDATA (TIME, ptr_unit.wait, 24), PV_LEFT },
  40.     { FLDATA (STOP_IOE, ptr_stopioe, 0) },
  41.     { NULL }  };
  42.  
  43. DEVICE ptr_dev = {
  44.     "PTR", &ptr_unit, ptr_reg, NULL,
  45.     1, 10, 32, 1, 8, 8,
  46.     NULL, NULL, &ptr_reset,
  47.     NULL, NULL, NULL };
  48.  
  49. /* PTP data structures
  50.  
  51.    ptp_dev    PTP device descriptor
  52.    ptp_unit    PTP unit descriptor
  53.    ptp_reg    PTP register list
  54. */
  55.  
  56. UNIT ptp_unit = {
  57.     UDATA (&ptp_svc, UNIT_SEQ+UNIT_ATTABLE, 0), SERIAL_OUT_WAIT };
  58.  
  59. REG ptp_reg[] = {
  60.     { ORDATA (BUF, ptp_unit.buf, 8) },
  61.     { FLDATA (BUSY, dev_busy, INT_V_PTP) },
  62.     { FLDATA (DONE, dev_done, INT_V_PTP) },
  63.     { FLDATA (DISABLE, dev_disable, INT_V_PTP) },
  64.     { FLDATA (INT, int_req, INT_V_PTP) },
  65.     { DRDATA (POS, ptp_unit.pos, 32), PV_LEFT },
  66.     { DRDATA (TIME, ptp_unit.wait, 24), PV_LEFT },
  67.     { FLDATA (STOP_IOE, ptp_stopioe, 0) },
  68.     { NULL }  };
  69.  
  70. DEVICE ptp_dev = {
  71.     "PTP", &ptp_unit, ptp_reg, NULL,
  72.     1, 10, 32, 1, 8, 8,
  73.     NULL, NULL, &ptp_reset,
  74.     NULL, NULL, NULL };
  75.  
  76. /* Paper tape reader: IOT routine */
  77.  
  78. int ptr (int pulse, int code, int AC)
  79. {
  80. int iodata;
  81.  
  82. iodata = (code == ioDIA)? ptr_unit.buf & 0377: 0;
  83. switch (pulse) {                    /* decode IR<8:9> */
  84. case iopS:                         /* start */
  85.     dev_busy = dev_busy | INT_PTR;            /* set busy */
  86.     dev_done = dev_done & ~INT_PTR;            /* clear done, int */
  87.     int_req = int_req & ~INT_PTR;
  88.     sim_activate (&ptr_unit, ptr_unit.wait);    /* activate unit */
  89.     break;
  90. case iopC:                        /* clear */
  91.     dev_busy = dev_busy & ~INT_PTR;            /* clear busy */
  92.     dev_done = dev_done & ~INT_PTR;            /* clear done, int */
  93.     int_req = int_req & ~INT_PTR;
  94.     sim_cancel (&ptr_unit);                /* deactivate unit */
  95.     break;  }                    /* end switch */
  96. return iodata;
  97. }
  98.  
  99. /* Unit service */
  100.  
  101. int ptr_svc (UNIT *uptr)
  102. {
  103. int temp;
  104.  
  105. if ((ptr_unit.flags & UNIT_ATT) == 0)            /* attached? */
  106.     return IORETURN (ptr_stopioe, SCPE_UNATT);
  107. if ((temp = getc (ptr_unit.fileref)) == EOF) {        /* end of file? */
  108.     if (feof (ptr_unit.fileref)) {
  109.         if (ptr_stopioe) printf ("PTR end of file\n");
  110.         else return SCPE_OK;  }
  111.     else perror ("PTR I/O error");
  112.     clearerr (ptr_unit.fileref);
  113.     return SCPE_IOERR;  }
  114. dev_busy = dev_busy & ~INT_PTR;                /* clear busy */
  115. dev_done = dev_done | INT_PTR;                /* set done */
  116. int_req = (int_req & ~INT_DEV) | (dev_done & ~dev_disable);
  117. ptr_unit.buf = temp & 0377;
  118. ptr_unit.pos = ptr_unit.pos + 1;
  119. return SCPE_OK;
  120. }
  121.  
  122. /* Reset routine */
  123.  
  124. int ptr_reset (DEVICE *dptr)
  125. {
  126. ptr_unit.buf = 0;
  127. dev_busy = dev_busy & ~INT_PTR;                /* clear busy */
  128. dev_done = dev_done & ~INT_PTR;                /* clear done, int */
  129. int_req = int_req & ~INT_PTR;
  130. sim_cancel (&ptr_unit);                    /* deactivate unit */
  131. return SCPE_OK;
  132. }
  133.  
  134. /* Paper tape punch: IOT routine */
  135.  
  136. int ptp (int pulse, int code, int AC)
  137. {
  138. if (code == ioDOA) ptp_unit.buf = AC & 0377;
  139. switch (pulse) {                    /* decode IR<8:9> */
  140. case iopS:                         /* start */
  141.     dev_busy = dev_busy | INT_PTP;            /* set busy */
  142.     dev_done = dev_done & ~INT_PTP;            /* clear done, int */
  143.     int_req = int_req & ~INT_PTP;
  144.     sim_activate (&ptp_unit, ptp_unit.wait);    /* activate unit */
  145.     break;
  146. case iopC:                        /* clear */
  147.     dev_busy = dev_busy & ~INT_PTP;            /* clear busy */
  148.     dev_done = dev_done & ~INT_PTP;            /* clear done, int */
  149.     int_req = int_req & ~INT_PTP;
  150.     sim_cancel (&ptp_unit);                /* deactivate unit */
  151.     break;  }                    /* end switch */
  152. return 0;
  153. }
  154.  
  155. /* Unit service */
  156.  
  157. int ptp_svc (UNIT *uptr)
  158. {
  159. dev_busy = dev_busy & ~INT_PTP;                /* clear busy */
  160. dev_done = dev_done | INT_PTP;                /* set done */
  161. int_req = (int_req & ~INT_DEV) | (dev_done & ~dev_disable);
  162. if ((ptp_unit.flags & UNIT_ATT) == 0)            /* attached? */
  163.     return IORETURN (ptp_stopioe, SCPE_UNATT);
  164. if (putc (ptp_unit.buf, ptp_unit.fileref) == EOF) {
  165.     perror ("PTP I/O error");
  166.     clearerr (ptp_unit.fileref);
  167.     return SCPE_IOERR;  }
  168. ptp_unit.pos = ptp_unit.pos + 1;
  169. return SCPE_OK;
  170. }
  171.  
  172. /* Reset routine */
  173.  
  174. int ptp_reset (DEVICE *dptr)
  175. {
  176. ptp_unit.buf = 0;
  177. dev_busy = dev_busy & ~INT_PTP;                /* clear busy */
  178. dev_done = dev_done & ~INT_PTP;                /* clear done, int */
  179. int_req = int_req & ~INT_PTP;
  180. sim_cancel (&ptp_unit);                    /* deactivate unit */
  181. return SCPE_OK;
  182. }
  183.