19a747e4fSDavid du Colombier #include "u.h" 29a747e4fSDavid du Colombier #include "../port/lib.h" 39a747e4fSDavid du Colombier #include "mem.h" 49a747e4fSDavid du Colombier #include "dat.h" 59a747e4fSDavid du Colombier #include "fns.h" 69a747e4fSDavid du Colombier #include "io.h" 79a747e4fSDavid du Colombier #include "ureg.h" 89a747e4fSDavid du Colombier 99a747e4fSDavid du Colombier static ulong clkreload; 109a747e4fSDavid du Colombier 119a747e4fSDavid du Colombier void delayloopinit(void)129a747e4fSDavid du Colombierdelayloopinit(void) 139a747e4fSDavid du Colombier { 149a747e4fSDavid du Colombier ulong v; 159a747e4fSDavid du Colombier uvlong x; 169a747e4fSDavid du Colombier 179a747e4fSDavid du Colombier m->loopconst = 5000; 189a747e4fSDavid du Colombier v = getdec(); 199a747e4fSDavid du Colombier delay(1000); 209a747e4fSDavid du Colombier v -= getdec(); 219a747e4fSDavid du Colombier 229a747e4fSDavid du Colombier x = m->loopconst; 239a747e4fSDavid du Colombier x *= m->dechz; 249a747e4fSDavid du Colombier x /= v; 259a747e4fSDavid du Colombier m->loopconst = x; 269a747e4fSDavid du Colombier } 279a747e4fSDavid du Colombier 289a747e4fSDavid du Colombier void clockinit(void)299a747e4fSDavid du Colombierclockinit(void) 309a747e4fSDavid du Colombier { 319a747e4fSDavid du Colombier /* XXX this should not be hard coded! */ 329a747e4fSDavid du Colombier m->cpuhz = 300000000; 339a747e4fSDavid du Colombier m->bushz = 66666666; 349a747e4fSDavid du Colombier 359a747e4fSDavid du Colombier m->dechz = m->bushz/4; /* true for all 604e */ 369a747e4fSDavid du Colombier m->tbhz = m->dechz; /* conjecture; manual doesn't say */ 379a747e4fSDavid du Colombier 389a747e4fSDavid du Colombier delayloopinit(); 399a747e4fSDavid du Colombier 409a747e4fSDavid du Colombier clkreload = m->dechz/HZ-1; 419a747e4fSDavid du Colombier putdec(clkreload); 429a747e4fSDavid du Colombier } 439a747e4fSDavid du Colombier 449a747e4fSDavid du Colombier void clockintr(Ureg * ureg)459a747e4fSDavid du Colombierclockintr(Ureg *ureg) 469a747e4fSDavid du Colombier { 479a747e4fSDavid du Colombier long v; 489a747e4fSDavid du Colombier 499a747e4fSDavid du Colombier v = -getdec(); 509a747e4fSDavid du Colombier if(v > clkreload/2){ 519a747e4fSDavid du Colombier if(v > clkreload) 529a747e4fSDavid du Colombier m->ticks += v/clkreload; 539a747e4fSDavid du Colombier v = 0; 549a747e4fSDavid du Colombier } 559a747e4fSDavid du Colombier putdec(clkreload-v); 569a747e4fSDavid du Colombier 579a747e4fSDavid du Colombier timerintr(ureg, 0); 589a747e4fSDavid du Colombier } 599a747e4fSDavid du Colombier 609a747e4fSDavid du Colombier void timerset(Tval)61*ea58ad6fSDavid du Colombiertimerset(Tval) 629a747e4fSDavid du Colombier { 639a747e4fSDavid du Colombier } 649a747e4fSDavid du Colombier 659a747e4fSDavid du Colombier void delay(int l)669a747e4fSDavid du Colombierdelay(int l) 679a747e4fSDavid du Colombier { 689a747e4fSDavid du Colombier ulong i, j; 699a747e4fSDavid du Colombier 709a747e4fSDavid du Colombier j = m->loopconst; 719a747e4fSDavid du Colombier while(l-- > 0) 729a747e4fSDavid du Colombier for(i=0; i < j; i++) 739a747e4fSDavid du Colombier ; 749a747e4fSDavid du Colombier } 759a747e4fSDavid du Colombier 769a747e4fSDavid du Colombier void microdelay(int l)779a747e4fSDavid du Colombiermicrodelay(int l) 789a747e4fSDavid du Colombier { 799a747e4fSDavid du Colombier ulong i; 809a747e4fSDavid du Colombier 819a747e4fSDavid du Colombier l *= m->loopconst; 829a747e4fSDavid du Colombier l += 500; 839a747e4fSDavid du Colombier l /= 1000; 849a747e4fSDavid du Colombier if(l <= 0) 859a747e4fSDavid du Colombier l = 1; 869a747e4fSDavid du Colombier for(i = 0; i < l; i++) 879a747e4fSDavid du Colombier ; 889a747e4fSDavid du Colombier } 899a747e4fSDavid du Colombier 909a747e4fSDavid du Colombier uvlong fastticks(uvlong * hz)919a747e4fSDavid du Colombierfastticks(uvlong *hz) 929a747e4fSDavid du Colombier { 939a747e4fSDavid du Colombier if(hz) 949a747e4fSDavid du Colombier *hz = HZ; 959a747e4fSDavid du Colombier return m->ticks; 969a747e4fSDavid du Colombier } 973ff48bf5SDavid du Colombier 98*ea58ad6fSDavid du Colombier ulong s(void)99*ea58ad6fSDavid du Colombierµs(void) 100*ea58ad6fSDavid du Colombier { 101*ea58ad6fSDavid du Colombier return fastticks2us(m->ticks); 102*ea58ad6fSDavid du Colombier } 103*ea58ad6fSDavid du Colombier 1043ff48bf5SDavid du Colombier /* 1053ff48bf5SDavid du Colombier * performance measurement ticks. must be low overhead. 1063ff48bf5SDavid du Colombier * doesn't have to count over a second. 1073ff48bf5SDavid du Colombier */ 1083ff48bf5SDavid du Colombier ulong perfticks(void)1093ff48bf5SDavid du Colombierperfticks(void) 1103ff48bf5SDavid du Colombier { 1113ff48bf5SDavid du Colombier return m->ticks; 1123ff48bf5SDavid du Colombier } 113