CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
KMisc.txt309 linesDownload Raw Back to Kernel
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