hschumann2/TempleOS-Source-Code
0838
1 2U0 PortNop()3{//Innoculous (reads IRQ Mask) which should take fixed time4//because it's an ISA-bus standard. It takes 1.0uS-2.0uS.5 InU8(0x21);6}7 8U16 EndianU16(U16 d)9{//Swap big<-->little endian.10 I64 res=0;11 res.u8[1]=d.u8[0];12 res.u8[0]=d.u8[1];13 return res;14}15 16U32 EndianU32(U32 d)17{//Swap big<-->little endian.18 I64 res=0;19 res.u8[3]=d.u8[0];20 res.u8[2]=d.u8[1];21 res.u8[1]=d.u8[2];22 res.u8[0]=d.u8[3];23 return res;24}25 26I64 EndianI64(I64 d)27{//Swap big<-->little endian.28 U64 res;29 res.u8[7]=d.u8[0];30 res.u8[6]=d.u8[1];31 res.u8[5]=d.u8[2];32 res.u8[4]=d.u8[3];33 res.u8[3]=d.u8[4];34 res.u8[2]=d.u8[5];35 res.u8[1]=d.u8[6];36 res.u8[0]=d.u8[7];37 return res;38}39 40I64 BCnt(I64 d)41{//Count set bits in I64.42 I64 res=0,i;43 for (i=0;i<8;i++)44 res+=set_bits_table[d.u8[i]];45 return res;46}47 48U0 IntCore0TimerHndlr(CTask *)49{//Called from IntCore0TimerHndlr50 I64 i;51 if (mp_cnt>1)52 while (LBts(&sys_semas[SEMA_SYS_TIMER],0))53 PAUSE54 lock cnts.jiffies++;55 cnts.timer+=SYS_TIMER0_PERIOD+1;56 LBtr(&sys_semas[SEMA_SYS_TIMER],0);57 for (i=1;i<mp_cnt;i++)58 MPInt(I_TIMER,i);59 OutU8(0x20,0x20); //Acknowledge PIC Interrupt60}61 62I64 SysTimerRead()63{//System timer count with overflow already handled.64 I64 i,res;65 PUSHFD66 CLI67 if (mp_cnt>1)68 while (LBts(&sys_semas[SEMA_SYS_TIMER],0))69 PAUSE70 OutU8(0x43,0); //Latch Timer071 if ((i=InU8(0x40)+InU8(0x40)<<8)==SYS_TIMER0_PERIOD) {72 if (InU8(0x20) & 1)73 i=-1;74 }75 res=cnts.timer+SYS_TIMER0_PERIOD-i;76 LBtr(&sys_semas[SEMA_SYS_TIMER],0);77 POPFD78 return res;79}80 81I64 HPET()82{ //Get high precision event timer.83 return *(dev.uncached_alias+HPET_MAIN_CNT)(I64 *);84}85 86I64 TimeStampFreqCal()87{88 static I64 time_stamp_start=0,timer_start=0,HPET_start=0;89 I64 i;90 if (time_stamp_start) {91 PUSHFD92 CLI93 if (HPET_start) {94 cnts.time_stamp_freq=cnts.HPET_freq*(GetTSC-time_stamp_start);95 i=HPET-HPET_start;96 } else {97 cnts.time_stamp_freq=SYS_TIMER_FREQ*(GetTSC-time_stamp_start);98 i=SysTimerRead-timer_start;99 }100 if (!i)101 AdamErr("Timer Cal Error");102 else {103 cnts.time_stamp_freq/=i;104 cnts.time_stamp_kHz_freq=cnts.time_stamp_freq/1000;105 cnts.time_stamp_calibrated=TRUE;106 }107 POPFD108 }109 PUSHFD110 CLI111 if (cnts.HPET_freq) {112 timer_start=0;113 HPET_start=HPET;114 } else {115 timer_start=SysTimerRead;116 HPET_start=0;117 }118 time_stamp_start=GetTSC;119 POPFD120 return cnts.time_stamp_freq;121}122 123F64 tS()124{//Time since boot in seconds as a float.125 if (cnts.HPET_freq)126 return ToF64(HPET-cnts.HPET_initial)/cnts.HPET_freq;127 else128 return SysTimerRead/ToF64(SYS_TIMER_FREQ);129}130 131Bool Blink(F64 Hz=2.5)132{//Return TRUE, then FALSE, then TRUE at given frequency.133 if (!Hz) return 0;134 return ToI64(cnts.jiffies*2*Hz/JIFFY_FREQ)&1;135}136 137U0 Busy(I64 uS)138{//Loosely timed.139 I64 i;140 if (cnts.HPET_freq) {141 i=HPET+cnts.HPET_freq*uS/1000000;142 while (HPET<i);143 } else144 for (i=0;i<uS;i++)145 PortNop;146}147 148U0 SleepUntil(I64 wake_jiffy)149{//Not for power-saving. It is to make a program pause without hogging the CPU.150 Bool old_idle=LBts(&Fs->task_flags,TASKf_IDLE);151 Fs->wake_jiffy=wake_jiffy;152 Yield;153 LBEqu(&Fs->task_flags,TASKf_IDLE,old_idle);154}155 156U0 Sleep(I64 mS)157{//Not for power-saving. It is to make a program pause without hogging the CPU.158 if (!mS)159 Yield;160 else161 SleepUntil(cnts.jiffies+mS*JIFFY_FREQ/1000);162}163 164F64 Ona2Freq(I8 ona)165{//Ona to freq. Ona=60 is 440.0Hz.166 if (ona==ONA_REST)167 return 0;168 else169 return 440.0/32*2.0`(ona/12.0);170}171 172I8 Freq2Ona(F64 freq)173{//Freq to Ona. 440.0Hz is Ona=60.174 if (freq>0)175 return ClampI64(12*Log2(32.0/440.0*freq),ONA_REST+1,I8_MAX);176 else177 return ONA_REST;178}179 180U0 Snd(I8 ona=ONA_REST)181{//Play ona, a piano key num. -128 means rest.182 I64 period;183 CSndData *d;184 if (!Bt(&sys_semas[SEMA_MUTE],0) &&185 !LBts(&sys_semas[SEMA_SND],0)) { //Mutex. Just throw-out if in use186 if (ona<=ONA_REST) {187 snd.ona=ona;188 OutU8(0x61,InU8(0x61)&~3);189 } else if (ona!=snd.ona) {190 snd.ona=ona;191 period=ClampI64(SYS_TIMER_FREQ/Ona2Freq(ona),1,U16_MAX);192 OutU8(0x43,0xB6);193 OutU8(0x42,period);194 OutU8(0x42,period.u8[1]);195 OutU8(0x61,3|InU8(0x61));196 }197 if (!IsDbgMode && snd.record) {198 d=ACAlloc(sizeof(CSndData));199 d->ona=ona;200 d->time=tS;201 QueIns(d,snd.record_head.last);202 }203 LBtr(&sys_semas[SEMA_SND],0);204 }205}206 207U0 SndRst()208{//Fix stuck sound.209 if (Bt(&sys_semas[SEMA_SND],0)) {210 Sleep(1);211 if (Bt(&sys_semas[SEMA_SND],0)) {212 Sleep(1);213 LBtr(&sys_semas[SEMA_SND],0);214 }215 }216 Snd;217}218 219U0 Beep(I8 ona=62,Bool busy=FALSE)220{//Make beep at given ona freq.221 Snd(ona);222 if (busy)223 Busy(500000);224 else225 Sleep(500);226 Snd;227 if (busy)228 Busy(200000);229 else230 Sleep(200);231}232 233Bool Mute(Bool val)234{//Turn-off sound.235 Bool res;236 if (val) {237 PUSHFD238 CLI239 Snd;240 res=LBts(&sys_semas[SEMA_MUTE],0);241 POPFD242 } else243 res=LBtr(&sys_semas[SEMA_MUTE],0);244 return res;245}246 247Bool IsMute()248{//Return is-mute flag.249 return Bt(&sys_semas[SEMA_MUTE],0);250}251 252Bool Silent(Bool val=ON)253{//Turn-off StdOut console text. (Not sound.)254 return LBEqu(&Fs->display_flags,DISPLAYf_SILENT,val);255}256 257Bool IsSilent()258{//Return StdOut turned-off?259 return Bt(&Fs->display_flags,DISPLAYf_SILENT);260}261 262Bool SysDbg(Bool val)263{//Set SysDbg bit you can use while debugging.264 return LBEqu(&sys_semas[SEMA_DEBUG],0,val);265}266 267Bool IsSysDbg()268{//Return SysDbg bit.269 return Bt(&sys_semas[SEMA_DEBUG],0);270}271 272Bool Raw(Bool val)273{//Set to direct scrn, BLACK & WHITE, non-windowed output mode.274 if (!val)275 VGAFlush;276 return !LBEqu(&Fs->display_flags,DISPLAYf_NOT_RAW,!val);277}278 279Bool IsRaw()280{//Are we in BLACK & WHITE raw scrn mode?281 return !Bt(&Fs->display_flags,DISPLAYf_NOT_RAW);282}283 284Bool SingleUser(Bool val)285{//Set single-user mode.286 return LBEqu(&sys_semas[SEMA_SINGLE_USER],0,val);287}288 289Bool IsSingleUser()290{//Return single-user mode.291 return Bt(&sys_semas[SEMA_SINGLE_USER],0);292}293 294Bool DbgMode(Bool val)295{//Set dbg-mode.296 return LBEqu(&sys_semas[SEMA_DBG_MODE],0,val);297}298 299Bool IsDbgMode()300{//Return dbg-mode.301 return Bt(&sys_semas[SEMA_DBG_MODE],0);302}303 304U0 ProgressBarsRst(U8 *path=NULL)305{//Reset all progress bars to zero.306 CallExtStr("ProgressBarsRegTf",path);307 MemSet(sys_progresses,0,sizeof(sys_progresses));308}309 