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_clk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-29  |  2.4 KB  |  89 lines

  1. /* nova_clk.c: NOVA real-time clock simulator
  2.  
  3.    Copyright (c) 1993, 1994, 1995,
  4.    Robert M Supnik, Digital Equipment Corporation
  5.    Commercial use prohibited
  6.  
  7.    clk        real-time clock
  8. */
  9.  
  10. #include "nova_defs.h"
  11.  
  12. extern int int_req, dev_busy, dev_done, dev_disable;
  13. int clk_sel = 0;                    /* selected freq */
  14. int clk_alt_time[4] = { 16000, 100000, 10000, 1000 };    /* freq table */
  15. int clk_svc (UNIT *uptr);
  16. int clk_reset (DEVICE *dptr);
  17. extern int sim_activate (UNIT *uptr, int interval);
  18. extern int sim_cancel (UNIT *uptr);
  19.  
  20. /* CLK data structures
  21.  
  22.    clk_dev    CLK device descriptor
  23.    clk_unit    CLK unit descriptor
  24.    clk_reg    CLK register list
  25. */
  26.  
  27. UNIT clk_unit = { UDATA (&clk_svc, 0, 0), 16000 };
  28.  
  29. REG clk_reg[] = {
  30.     { ORDATA (SELECT, clk_sel, 2) },
  31.     { FLDATA (BUSY, dev_busy, INT_V_CLK) },
  32.     { FLDATA (DONE, dev_done, INT_V_CLK) },
  33.     { FLDATA (DISABLE, dev_disable, INT_V_CLK) },
  34.     { FLDATA (INT, int_req, INT_V_CLK) },
  35.     { DRDATA (TIME0, clk_alt_time[0], 24), REG_NZ + PV_LEFT },
  36.     { DRDATA (TIME1, clk_alt_time[1], 24), REG_NZ + PV_LEFT },
  37.     { DRDATA (TIME2, clk_alt_time[2], 24), REG_NZ + PV_LEFT },
  38.     { DRDATA (TIME3, clk_alt_time[3], 24), REG_NZ + PV_LEFT },
  39.     { NULL }  };
  40.  
  41. DEVICE clk_dev = {
  42.     "CLK", &clk_unit, clk_reg, NULL,
  43.     1, 0, 0, 0, 0, 0,
  44.     NULL, NULL, &clk_reset,
  45.     NULL, NULL, NULL };
  46.  
  47. /* IOT routine */
  48.  
  49. int clk (int pulse, int code, int AC)
  50. {
  51. if (code == ioDOA) clk_sel = AC & 3;
  52. switch (pulse) {                    /* decode IR<8:9> */
  53. case iopS:                         /* start */
  54.     dev_busy = dev_busy | INT_CLK;            /* set busy */
  55.     dev_done = dev_done & ~INT_CLK;            /* clear done, int */
  56.     int_req = int_req & ~INT_CLK;
  57.     sim_activate (&clk_unit, clk_alt_time[clk_sel]); /* activate unit */
  58.     break;
  59. case iopC:                        /* clear */
  60.     dev_busy = dev_busy & ~INT_CLK;            /* clear busy */
  61.     dev_done = dev_done & ~INT_CLK;            /* clear done, int */
  62.     int_req = int_req & ~INT_CLK;
  63.     sim_cancel (&clk_unit);                /* deactivate unit */
  64.     break;  }                    /* end switch */
  65. return 0;
  66. }
  67.  
  68. /* Unit service */
  69.  
  70. int clk_svc (UNIT *uptr)
  71. {
  72. dev_done = dev_done | INT_CLK;                /* set done */
  73. int_req = (int_req & ~INT_DEV) | (dev_done & ~dev_disable);
  74. sim_activate (&clk_unit, clk_alt_time[clk_sel]);    /* reactivate unit */
  75. return SCPE_OK;
  76. }
  77.  
  78. /* Reset routine */
  79.  
  80. int clk_reset (DEVICE *dptr)
  81. {
  82. clk_sel = 0;
  83. dev_busy = dev_busy & ~INT_CLK;                /* clear busy */
  84. dev_done = dev_done & ~INT_CLK;                /* clear done, int */
  85. int_req = int_req & ~INT_CLK;
  86. sim_cancel (&clk_unit);                    /* deactivate unit */
  87. return SCPE_OK;
  88. }
  89.