12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #include "u.h"
- #include "../port/lib.h"
- #include "mem.h"
- #include "dat.h"
- #include "io.h"
- #include "fns.h"
- #include "ureg.h"
- static ulong clkreload;
- void
- delayloopinit(void)
- {
- ulong v;
- uvlong x;
- /* initial value for loopconst set in machinit */
- m->loopconst = 1000;
- v = getdec();
- delay(1000);
- v -= getdec();
- x = m->loopconst;
- x *= m->dechz;
- x /= v;
- m->loopconst = x;
- }
- void
- clockinit(void)
- {
- m->dechz = m->bushz/4; /* true for all 604e */
- m->tbhz = m->dechz; /* conjecture; manual doesn't say */
- delayloopinit();
- clkreload = m->dechz/HZ-1;
- putdec(clkreload);
- }
- void
- clockintr(Ureg *)
- {
- long v;
- v = -getdec();
- if(v > (clkreload >> 1)){
- if(v > clkreload)
- m->ticks += v/clkreload;
- v = 0;
- }
- putdec(clkreload-v);
- }
- void
- delay(int l)
- {
- ulong i, j;
- j = 0;
- if(m)
- j = m->loopconst;
- if(j == 0)
- j = 1096;
- while(l-- > 0)
- for(i=0; i < j; i++)
- ;
- }
- void
- microdelay(int l)
- {
- ulong i;
- l *= m->loopconst;
- l += 500;
- l /= 1000;
- if(l <= 0)
- l = 1;
- for(i = 0; i < l; i++)
- ;
- }
- ulong
- perfticks(void)
- {
- return (ulong)fastticks(nil);
- }
|