clock.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. m->loopconst = 1000;
  16. v = getdec();
  17. delay(1000);
  18. v -= getdec();
  19. x = m->loopconst;
  20. x *= m->dechz;
  21. x /= v;
  22. m->loopconst = x;
  23. }
  24. void
  25. clockinit(void)
  26. {
  27. m->dechz = m->bushz/4; /* true for all 604e */
  28. m->tbhz = m->dechz; /* conjecture; manual doesn't say */
  29. delayloopinit();
  30. clkreload = m->dechz/HZ-1;
  31. putdec(clkreload);
  32. }
  33. void
  34. clockintr(Ureg *)
  35. {
  36. long v;
  37. v = -getdec();
  38. if(v > (clkreload >> 1)){
  39. if(v > clkreload)
  40. m->ticks += v/clkreload;
  41. v = 0;
  42. }
  43. putdec(clkreload-v);
  44. }
  45. void
  46. delay(int l)
  47. {
  48. ulong i, j;
  49. j = 0;
  50. if(m)
  51. j = m->loopconst;
  52. if(j == 0)
  53. j = 1096;
  54. while(l-- > 0)
  55. for(i=0; i < j; i++)
  56. ;
  57. }
  58. void
  59. microdelay(int l)
  60. {
  61. ulong i;
  62. l *= m->loopconst;
  63. l += 500;
  64. l /= 1000;
  65. if(l <= 0)
  66. l = 1;
  67. for(i = 0; i < l; i++)
  68. ;
  69. }
  70. ulong
  71. perfticks(void)
  72. {
  73. return (ulong)fastticks(nil);
  74. }