clock.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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/2){
  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 = 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. }