1458db832SDavid du Colombier #include "u.h" 2458db832SDavid du Colombier #include "../port/lib.h" 3458db832SDavid du Colombier #include "mem.h" 4458db832SDavid du Colombier #include "dat.h" 5458db832SDavid du Colombier #include "io.h" 6458db832SDavid du Colombier #include "fns.h" 7458db832SDavid du Colombier #include "ureg.h" 8458db832SDavid du Colombier 9458db832SDavid du Colombier static ulong clkreload; 10458db832SDavid du Colombier 11458db832SDavid du Colombier void delayloopinit(void)12458db832SDavid du Colombierdelayloopinit(void) 13458db832SDavid du Colombier { 14458db832SDavid du Colombier ulong v; 15458db832SDavid du Colombier uvlong x; 16458db832SDavid du Colombier 17458db832SDavid du Colombier /* initial value for loopconst set in machinit */ 1828495efeSDavid du Colombier m->loopconst = 1000; 19458db832SDavid du Colombier v = getdec(); 20458db832SDavid du Colombier delay(1000); 21458db832SDavid du Colombier v -= getdec(); 22458db832SDavid du Colombier 23458db832SDavid du Colombier x = m->loopconst; 24458db832SDavid du Colombier x *= m->dechz; 25458db832SDavid du Colombier x /= v; 26458db832SDavid du Colombier m->loopconst = x; 27458db832SDavid du Colombier } 28458db832SDavid du Colombier 29458db832SDavid du Colombier void clockinit(void)30458db832SDavid du Colombierclockinit(void) 31458db832SDavid du Colombier { 32458db832SDavid du Colombier m->dechz = m->bushz/4; /* true for all 604e */ 33458db832SDavid du Colombier m->tbhz = m->dechz; /* conjecture; manual doesn't say */ 34458db832SDavid du Colombier 35458db832SDavid du Colombier delayloopinit(); 36458db832SDavid du Colombier 37458db832SDavid du Colombier clkreload = m->dechz/HZ-1; 38458db832SDavid du Colombier putdec(clkreload); 39458db832SDavid du Colombier } 40458db832SDavid du Colombier 41458db832SDavid du Colombier void clockintr(Ureg *)42458db832SDavid du Colombierclockintr(Ureg *) 43458db832SDavid du Colombier { 44458db832SDavid du Colombier long v; 45458db832SDavid du Colombier 46458db832SDavid du Colombier v = -getdec(); 4706578a4fSDavid du Colombier if(v > (clkreload >> 1)){ 48458db832SDavid du Colombier if(v > clkreload) 49458db832SDavid du Colombier m->ticks += v/clkreload; 50458db832SDavid du Colombier v = 0; 51458db832SDavid du Colombier } 52458db832SDavid du Colombier putdec(clkreload-v); 53458db832SDavid du Colombier } 54458db832SDavid du Colombier 55458db832SDavid du Colombier void delay(int l)56458db832SDavid du Colombierdelay(int l) 57458db832SDavid du Colombier { 58458db832SDavid du Colombier ulong i, j; 59458db832SDavid du Colombier 60*4de34a7eSDavid du Colombier j = 0; 61*4de34a7eSDavid du Colombier if(m) 62458db832SDavid du Colombier j = m->loopconst; 63*4de34a7eSDavid du Colombier if(j == 0) 64*4de34a7eSDavid du Colombier j = 1096; 65458db832SDavid du Colombier while(l-- > 0) 66458db832SDavid du Colombier for(i=0; i < j; i++) 67458db832SDavid du Colombier ; 68458db832SDavid du Colombier } 69458db832SDavid du Colombier 70458db832SDavid du Colombier void microdelay(int l)71458db832SDavid du Colombiermicrodelay(int l) 72458db832SDavid du Colombier { 73458db832SDavid du Colombier ulong i; 74458db832SDavid du Colombier 75458db832SDavid du Colombier l *= m->loopconst; 76458db832SDavid du Colombier l += 500; 77458db832SDavid du Colombier l /= 1000; 78458db832SDavid du Colombier if(l <= 0) 79458db832SDavid du Colombier l = 1; 80458db832SDavid du Colombier for(i = 0; i < l; i++) 81458db832SDavid du Colombier ; 82458db832SDavid du Colombier } 83458db832SDavid du Colombier 84458db832SDavid du Colombier ulong perfticks(void)85458db832SDavid du Colombierperfticks(void) 86458db832SDavid du Colombier { 87458db832SDavid du Colombier return (ulong)fastticks(nil); 88458db832SDavid du Colombier } 89