clock.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "u.h"
  2. #include "../port/lib.h"
  3. #include "mem.h"
  4. #include "dat.h"
  5. #include "io.h"
  6. #include "fns.h"
  7. #include "ureg.h"
  8. static ulong clkreload;
  9. void
  10. delayloopinit(void)
  11. {
  12. ulong v;
  13. uvlong x;
  14. /* initial value for loopconst set in machinit */
  15. v = getdec();
  16. delay(1000);
  17. v -= getdec();
  18. x = m->loopconst;
  19. x *= m->dechz;
  20. x /= v;
  21. m->loopconst = x;
  22. }
  23. void
  24. clockinit(void)
  25. {
  26. m->dechz = m->bushz/4; /* true for all 604e */
  27. m->tbhz = m->dechz; /* conjecture; manual doesn't say */
  28. delayloopinit();
  29. clkreload = m->dechz/HZ-1;
  30. putdec(clkreload);
  31. }
  32. void
  33. clockintr(Ureg *)
  34. {
  35. long v;
  36. v = -getdec();
  37. if(v > clkreload/2){
  38. if(v > clkreload)
  39. m->ticks += v/clkreload;
  40. v = 0;
  41. }
  42. putdec(clkreload-v);
  43. // timerintr(ureg, 0); We now use the 8260 fast clock
  44. }
  45. void
  46. delay(int l)
  47. {
  48. ulong i, j;
  49. j = m->loopconst;
  50. while(l-- > 0)
  51. for(i=0; i < j; i++)
  52. ;
  53. }
  54. void
  55. microdelay(int l)
  56. {
  57. ulong i;
  58. l *= m->loopconst;
  59. l += 500;
  60. l /= 1000;
  61. if(l <= 0)
  62. l = 1;
  63. for(i = 0; i < l; i++)
  64. ;
  65. }
  66. ulong
  67. perfticks(void)
  68. {
  69. return (ulong)fastticks(nil);
  70. }