Trivial Solutions
                    The LoseThos 64-bit PC Operating System
File:/LT/OSMain/OSMain.CPZ
This, and all LoseThos files, are public domain.  Do whatever you like.
God is watching; God is just; God is never out-done in generosity.  He talks!

LoseThos code compiles with the 64-bit LoseThos compiler/assembler I wrote.
Boot the LoseThos CD and you can compile it.  Not in Kansas anymore!

Click here for preliminary compiler information you need.

Project: OSMain

U0 DateTimeFmtMapsRst()
{
  I64 i;
  for (i=0;i<NUM_DATE_FMTS;i++)
    date_fmt_map[i]=i;
  for (i=0;i<NUM_TIME_FMTS;i++)
    time_fmt_map[i]=i;
}

U0 SysGlblsInit()
{
  I64 i,j;
  U8 *m;
  RaxRbxRcxRdx ee;

  CpuId(0x1,&ee);
  sys_cache_line_width=ee.rbx.u8[1]*8;
  sys_pci_dev_root.next=sys_pci_dev_root.last=&sys_pci_dev_root;
  sys_rnd_seed = 93186752^GetTimeStamp;
  sys_focus_task=Fs;
  sys_macro_root.next=sys_macro_root.last=&sys_macro_root;
  sys_dft_iso_name="::/Temp/CDDVD.ISO";
  MemSet(mp_apic_ids,0,MP_MAX_PROCESSORS*sizeof(U8));
  MemSet(sys_usb_devs,0,MAX_USB*sizeof(LTUSB));

  InDbg(ON);

  reverse_bits_table=CAlloc(256);
  for (i=0;i<256;i++)
    for (j=0;j<8;j++)
      if (Bt(&i,7-j))
        LBts(reverse_bits_table+i,j);
  set_bits_table=CAlloc(256);
  for (i=0;i<256;i++)
    for (j=0;j<8;j++)
      if (Bt(&i,j))
        set_bits_table[i]++;

  ext=CAlloc(EXT_TABLE_SIZE*sizeof(U0 *));
  ext[EXT_DEBUGGER]=&SysDbgEnter;
  ext[EXT_EXIT_DEBUGGER]=&SysDbgExit;
  fp_mgets=&SysMGetS;

  fp_ctrl_alt_let_cbs=CAlloc(26*sizeof(U0 *));
  ctrl_alt_let_descs=CAlloc(26*sizeof(U8 *));;
  ctrl_alt_let_in_irq_flags=0;

  psect_cache=CAlloc(PSECT_CACHE_SIZE*sizeof(PSectCacheEntry));
  psect_cache_index=0;

  StrCpy(sys_temp_filename,"HOME/Temp.TXZ");
  MemSet(&sys_put_key_root,0,sizeof(KeyDevStruct));
  sys_put_key_root.next=sys_put_key_root.last=&sys_put_key_root;
  KeyDevAdd(&AKDInputFilterPutKey,&AKDInputFilterPutS,0x40000000,FALSE);
  KeyDevAdd(&AKDTaskPutKey,&AKDTaskPutS,0x50000000,TRUE);
  KeyDevAdd(&AKDRawDisplayPutKey,&AKDRawDisplayPutS,0x60000000,FALSE);
  #exe {
    StreamPrintF("sys_acct_name=\"%s\";",osmain_cfg->acct_name);
    StreamPutS("#exe{OptOff(OPTf_PAREN_WARN);}");
    StreamPrintF("LTDCInit(%s);",osmain_cfg->dsk_cache_size_exp);
    StreamPutS("#exe{OptOn(OPTf_PAREN_WARN);}");
  };
  pow10_I64=CAlloc(sizeof(F64)*(308+308+1));
  for (i=-308;i<309;i++)
    pow10_I64[i+309]=Pow10(i);

//Independent Heap Ctrl Example
  i=1; //Request 1 blk, we might get more.
  m=AllocUncachedMemBlks(&i,sys_code_bp);
  sys_uncached_heap=IndependentHeapCtrlInit(m,i*0x200000/0x200);
  ProgressBarsRst;
  date_fmt_map=MAlloc(NUM_DATE_FMTS);
  time_fmt_map=MAlloc(NUM_TIME_FMTS);
  DateTimeFmtMapsRst;
}

U0 SysGrInit()
{
//See SYS_BIOS_GR_MODE
//See ::/LT/Adam/Gr/GrCfg.APZ
  gr_font=sys_font_8x8;
  if (bios_gr_mode==0x12 || bios_gr_mode==0x6A) {
    text_mode=FALSE;

/*
Mode must be multiple of 32 wide
GrUpdateLine32().
GrDCBlotWithMask().
*/

    if (bios_gr_mode==0x6A) {
      gr_width =800;
      gr_height=600;
    } else {
      gr_width =640;
      gr_height=480;
    }
    text_cols=gr_width/FONT_WIDTH;
    text_rows=gr_height/FONT_HEIGHT;
    OutU8(VGA_SC_INDEX,VGA_MAP_MASK);
    OutU8(VGA_SC_DATA,0x0F);
    MemSet(VGA_GRAPHIC_MEM_BASE,0,gr_width*gr_height>>3);
    sys_dc_screen_image=CAlloc(gr_width*gr_height/8);
  } else {
    text_mode=TRUE;
    gr_width =640;
    gr_height=480;
    text_cols=80;
    text_rows=25;
    MemSet(VGA_TEXT_MEM_BASE,0,text_rows*text_cols<<1);
  }
}


U0 TimersInit()
{
  U64 i,*qq;
  U32 *_d;

  OutU8(0x43,0x34);
  OutU8(0x40,SYS_TIMER0_PERIOD);
  OutU8(0x40,SYS_TIMER0_PERIOD>>8);

// High Precision Event Timer

  if (PCIReadU16(0,31,0,0)==0x8086) { //Intel?
    //D31 F0, cfg 0xF0=RCBA of PCI-LPC Bridge
    _d=PCIReadU32(0,31,0,0xF0)><(U8 *)&~0x3FFF+0x3404; //HPET cfg
  //7   enable
  //1:0 HPET is at 0xFED00000,0xFED01000, 0xFED02000 or 0xFED03000.
    *_d=*_d&3|0x80;
  }

  qq=HPET_GCAP_ID;
  i=*qq; //i.u32[1]= period in femtoS (10e-15)
  if (100000<i.u32[1]<1000000000) {
    HPET_freq    =1000000000000000/i.u32[1];
    HPET_kHz_freq=1000000000000/i.u32[1];
    qq=HPET_GEN_CONF;
    *qq|=1; //Enable counting
  } else {
    HPET_freq=0;
    HPET_kHz_freq=0;
  }
}

U0 IntsInit()
{
//Init 8259
  OutU8(0x20,0x11); //IW1
  OutU8(0xA0,0x11); //IW1
  PortNop;
  OutU8(0x21,0x20); //IW2
  OutU8(0xA1,0x28); //IW2
  PortNop;
  OutU8(0x21,0x04); //IW3
  OutU8(0xA1,0x02); //IW3
  PortNop;
  OutU8(0x21,0x0D); //IW4
  OutU8(0xA1,0x09); //IW4
  PortNop;
  OutU8(0x21,0xFA); //Mask all but IRQ0 (timer) and IRQ2 Cascade
  OutU8(0xA1,0xFF);
  PortNop;
}

U0 Reboot()
{
  U16 *d=0x472;
  Cli;
  if (mp_cnt>1)
    MPHalt;
  MemMarkPresent(d,TRUE);
  *d=0;
  OutU8(0x70,0x8F);
  OutU8(0x71,0x00);
  OutU8(0x70,0x00);
  OutU8(0x92,InU8(0x92)|1);
  SysHlt;
}

BoolI64 AdamStartUpScripts()
{
  BoolI8 result=TRUE;
  LexStruct *lx;
  Cd("/LT/OSMain");
  lx=LexNew(TextFileRead("Adam1.APZ"),1<<Lf_RAW_ERRORS,
    StrNew("::/LT/OSMain/Adam1.APZ"));
  InsQue(lx,Fs->last_lex);

  //Continues Here /LT/OSMain/Adam1.APZ
  try {
    Lex(lx);
    ExeCmdLine(lx);
    RemQue(lx);
    LexDel(lx);
  } catch {
    CatchAll;
    result=FALSE;
  }
  return result;
}

U0 OSMain()
{ //Continued from OSMain
  adam_task=Fs;
  HeapsInit;
  LBts(&sys_run_level,RLf_FULL_HEAP);
  Fs->hash_table=HashTableNew(ADAM_HASH_SIZE,Fs);

  SysGlblsInit;
  Mem32BitDevInit;
  MemMarkPagesNotPresent;
  LoadOSMain;
  SysGrInit;
  StrCpy(Fs->task_name,"Adam Task CPU#0");
  StrCpy(Fs->task_title,Fs->task_name);
  Fs->text_attr=WHITE<<4+PURPLE;
  Fs->border_attr=WHITE<<4+LTPURPLE;
  Fs->win_right=text_cols-2;
  Fs->win_top++;
  TaskDerivedValsUpdate;

  LoadSysStrs;
  MPInit;
  IDTInit;

//Before this point use Snd() and BusyWait()
//to debug.  After this point, use DbgNum()
  LBts(&sys_run_level,RLf_RAW);

  if (BIOSTotalMem<250*0x100000)
    Dbg("Requires 256 Meg of RAM Memory");

  TimersInit;
  IntsInit;
  IntsInit; //Maybe we had slave IRQ pending, so do it again

  "Enable IRQ's\n";
  SetFlags(SYS_NORMAL_RFLAGS);
  BusyWait(2000);
  IDTInitComplete;
  LBts(&sys_run_level,RLf_INTERRUPTS);
  TimeStampFreqCal;
  Preempt(ON);

#exe {
  if (!osmain_cfg->opts[CFG_NO_MP])
    StreamPutS("\"MultiCore Start\\r\\n\";"
               "MPStart;");
};
  LBts(&sys_run_level,RLf_MP);

//  USBInitAll;

  KbdMouseVarsInit;
  IPVarsInit;
  KbdInit;

  //Just call directly if debugging
  //MouseDriverInstall;
  if (mp_cnt>1)
    MPSpawn(&MouseDriverInstall);
  else
    Spawn(&MouseDriverInstall);

  "BlkDevsInitAll\n";
  BlkDevsInitAll;
  "BlkDevsInitAll Done\n";
#exe {
  if (osmain_cfg->cdrom_ports_pmt)
    StreamPutS("if (boot_drv_pmt) PutDefine(\"ST_CDROM_PORTS_PMT\");");
};
  DrvDftSelect;
  HomeDirRst;
  LBts(&sys_run_level,RLf_DSK);

  "Loading Compiler\n";
  Cd("/LT/Compiler");
  Load("Compiler",LDF_SILENT);

  time_stamp_freq_initial=TimeStampFreqCal;
  InDbg(OFF);
  LBts(&sys_run_level,RLf_COMPILER);

  "Adam Start-Up Scripts...\n";
  if (!AdamStartUpScripts)
    Dbg("Adam Start-Up Error");

  LBts(&sys_run_level,RLf_ADAM_SERVER);
  ServantTaskCont; //Never to return
}

asm {   ALIGN   16,OC_NOP
SYS_OSMAIN_END::}
Historical capture: 2012-03-09. Home | Power on LoseThos | Sources and changes