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

  1. /* pdp8_clk.c: PDP-8 real-time clock simulator
  2.  
  3.    Copyright (c) 1993, 1994, Robert M Supnik, Digital Equipment Corporation
  4.    Commercial use prohibited
  5.  
  6.    clk        real-time clock
  7.  
  8.    Note: includes the IOT's for both the PDP-8/E and PDP-8/A clocks
  9. */
  10.  
  11. #include "pdp8_defs.h"
  12.  
  13. extern int int_req, dev_enable, dev_done, stop_inst;
  14. int clk_svc (UNIT *uptr);
  15. int clk_reset (DEVICE *dptr);
  16. extern int sim_activate (UNIT *uptr, int interval);
  17. extern int sim_cancel (UNIT *uptr);
  18.  
  19. /* CLK data structures
  20.  
  21.    clk_dev    CLK device descriptor
  22.    clk_unit    CLK unit descriptor
  23.    clk_reg    CLK register list
  24. */
  25.  
  26. UNIT clk_unit = { UDATA (&clk_svc, 0, 0), 5000 };
  27.  
  28. REG clk_reg[] = {
  29.     { FLDATA (DONE, dev_done, INT_V_CLK) },
  30.     { FLDATA (ENABLE, dev_enable, INT_V_CLK) },
  31.     { FLDATA (INT, int_req, INT_V_CLK) },
  32.     { DRDATA (TIME, clk_unit.wait, 24), REG_NZ + PV_LEFT },
  33.     { NULL }  };
  34.  
  35. DEVICE clk_dev = {
  36.     "CLK", &clk_unit, clk_reg, NULL,
  37.     1, 0, 0, 0, 0, 0,
  38.     NULL, NULL, &clk_reset,
  39.     NULL, NULL, NULL };
  40.  
  41. /* IOT routine
  42.  
  43.    IOT's 6131-6133 are the PDP-8/E clock
  44.    IOT's 6135-6137 the PDP-8/A clock
  45. */
  46.  
  47. int clk (int pulse, int AC)
  48. {
  49. switch (pulse) {                    /* decode IR<9:11> */
  50. case 1:                            /* CLEI */
  51.     dev_enable = dev_enable | INT_CLK;        /* enable clk ints */
  52.     int_req = INT_UPDATE;                /* update interrupts */
  53.     return AC;
  54. case 2:                            /* CLDI */
  55.     dev_enable = dev_enable & ~INT_CLK;        /* disable clk ints */
  56.     int_req = int_req & ~INT_CLK;            /* update interrupts */
  57.     return AC;
  58. case 3:                            /* CLSC */
  59.     if (dev_done & INT_CLK) {            /* flag set? */
  60.         dev_done = dev_done & ~INT_CLK;        /* clear flag */
  61.         int_req = int_req & ~INT_CLK;        /* clear int req */
  62.         return IOT_SKP + AC;  }
  63.     return AC;
  64. case 5:                            /* CLLE */
  65.     if (AC & 1) dev_enable = dev_enable | INT_CLK;    /* test AC<11> */
  66.     else dev_enable = dev_enable & ~INT_CLK;
  67.     int_req = INT_UPDATE;                /* update interrupts */
  68.     return AC;
  69. case 6:                            /* CLCL */
  70.     dev_done = dev_done & ~INT_CLK;            /* clear flag */
  71.     int_req = int_req & ~INT_CLK;            /* clear int req */
  72.     return AC;
  73. case 7:                            /* CLSK */
  74.     return (dev_done & INT_CLK)? IOT_SKP + AC: AC;
  75. default:
  76.     return (stop_inst << IOT_V_REASON) + AC;  }    /* end switch */
  77. }
  78.  
  79. /* Unit service */
  80.  
  81. int clk_svc (UNIT *uptr)
  82. {
  83. dev_done = dev_done | INT_CLK;                /* set done */
  84. int_req = INT_UPDATE;                    /* update interrupts */
  85. sim_activate (&clk_unit, clk_unit.wait);        /* reactivate unit */
  86. return SCPE_OK;
  87. }
  88.  
  89. /* Reset routine */
  90.  
  91. int clk_reset (DEVICE *dptr)
  92. {
  93. dev_done = dev_done & ~INT_CLK;                /* clear done, int */
  94. int_req = int_req & ~INT_CLK;
  95. dev_enable = dev_enable & ~INT_CLK;            /* clear enable */
  96. sim_activate (&clk_unit, clk_unit.wait);        /* activate unit */
  97. return SCPE_OK;
  98. }
  99.