U0 SysGlblsInit() { I64 i,j; CRAXRBCRCXRDX ee; CPUId(0x1,&ee); sys_cache_line_width=ee.rbx.u8[1]*8; sys_focus_task=Fs; QueInit(&sys_macro_head); blkdev.dft_iso_filename =AStrNew(DFT_ISO_FILENAME); blkdev.dft_iso_c_filename =AStrNew(DFT_ISO_C_FILENAME); blkdev.tmp_filename =AStrNew("~/Tmp.DD.Z"); blkdev.dvd_boot_is_good=TRUE; #exe { if (!kernel_cfg->mount_ide_auto_hd_let) kernel_cfg->mount_ide_auto_hd_let='C'; if (!kernel_cfg->mount_ide_auto_cd_let) kernel_cfg->mount_ide_auto_cd_let='T'; StreamPrint("blkdev.first_hd_drv_let=%d;", kernel_cfg->mount_ide_auto_hd_let); StreamPrint("blkdev.first_dvd_drv_let=%d;", kernel_cfg->mount_ide_auto_cd_let); } DbgMode(ON); rev_bits_table=CAlloc(256); set_bits_table=CAlloc(256); for (i=0;i<256;i++) for (j=0;j<8;j++) { if (Bt(&i,7-j)) LBts(rev_bits_table+i,j); if (Bt(&i,j)) set_bits_table[i]++; } ext=CAlloc(EXT_EXTS_NUM*sizeof(U8 *)); fp_getstr2=&SysGetStr2; KeyDevInit; #exe { StreamPrint("blkdev.boot_drv_let='%C';",kernel_cfg->boot_drv_let); StreamPrint("#exe{Option(OPTf_WARN_PAREN,OFF);}"); StreamPrint("DskCacheInit(%s);",kernel_cfg->dsk_cache_size_exp); StreamPrint("#exe{Option(OPTf_WARN_PAREN,ON);}"); }; pow10_I64=CAlloc(sizeof(F64)*(308+308+1)); for (i=-308;i<309;i++) pow10_I64[i+309]=Pow10(i); snd.ona=ONA_REST; QueInit(&snd.record_head); snd.record_head.time=tS; ProgressBarsRst; QueInit(&dev.pci_head); dev.mem64_ptr=mem_mapped_space; dbg.fun_seg_cache=CAlloc(FUN_SEG_CACHE_SIZE*sizeof(CFunSegCache)); dbg.int_fault_code=IntFaultHndlrsNew; } U0 SysGrInit() { text.font=sys_font_std; text.aux_font=sys_font_cyrillic; text.vga_alias =dev.uncached_alias+VGAM_GRAPHICS; text.vga_text_alias =dev.uncached_alias+VGAM_TEXT; if (!Bt(&sys_run_level,RLf_VGA)) { //if text mode text.cols=80; text.rows=25; MemSet(text.vga_text_alias,0,text.rows*text.cols<<1); text.border_chars[2] (I64)='........'; text.border_chars[10](U32)='....'; } else { //if 640x480 16 color text.cols=GR_WIDTH/FONT_WIDTH; text.rows=GR_HEIGHT/FONT_HEIGHT; OutU8(VGAP_IDX,VGAR_MAP_MASK); OutU8(VGAP_DATA,0x0F); MemSet(text.vga_alias,0,GR_WIDTH*GR_HEIGHT>>3); text.raw_scrn_image=CAlloc(GR_WIDTH*GR_HEIGHT/8); text.border_chars[2] (I64)=0x0908070605040302; text.border_chars[10](U32)=0x0D0C0B0A; } } U0 TimersInit() { I64 i,*_q; 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; } _q=dev.uncached_alias+HPET_GCAP_ID; i=*_q; //i.u32[1]= period in femtoS (10e-15) if (100000<i.u32[1]<1000000000) { cnts.HPET_freq =1000000000000000/i.u32[1]; cnts.HPET_kHz_freq=1000000000000/i.u32[1]; _q=dev.uncached_alias+HPET_GEN_CONF; *_q|=1; //Enable counting cnts.HPET_initial=HPET; } else { cnts.HPET_freq=0; cnts.HPET_kHz_freq=0; cnts.HPET_initial=0; } } U0 Reboot() {//Hardware reset. CLI if (mp_cnt>1) MPHalt; *0x472(U16 *)=0; OutU8(0x70,0x8F); OutU8(0x71,0x00); OutU8(0x70,0x00); OutU8(0x92,InU8(0x92)|1); SysHlt; } U0 KMain() {//Continued from KStart64.HC CBlkDev *bd; OutU8(0x61,InU8(0x61)&~3); //Snd; adam_task=Fs; BlkPoolsInit; SysGlblsInit; Mem32DevInit; UncachedAliasAlloc; LoadKernel; SysGrInit; StrCpy(Fs->task_name,"Adam Task CPU00"); StrCpy(Fs->task_title,Fs->task_name); Fs->title_src=TTS_TASK_NAME; Fs->win_right=text.cols-2; Fs->win_top++; TaskDerivedValsUpdate; SysDefinesLoad; Core0Init; IntInit1; //Before this point use Snd() and Busy() //to debug. After this point, use RawPrint() LBts(&sys_run_level,RLf_RAW); "TempleOS V%5.3f\t%D %T\n\n", sys_os_version,sys_compile_time,sys_compile_time; TimersInit; if (BIOSTotalMem<ToI64(0.95*MEM_MIN_MEG*0x100000)) RawPrint(4000,"!!! Requires 512Meg of RAM Memory !!!"); IntsInit; "Enable IRQ's\n"; SetRFlags(RFLAGG_NORMAL); Busy(2000); IntInit2; LBts(&sys_run_level,RLf_INTERRUPTS); TimeStampFreqCal; BlkDevsInitAll; "DskChg(':');\n"; DskChg(':'); #exe { StreamPrint("HomeSet(\"%s\");\n" "blkdev.ins_base0=%d;blkdev.ins_base1=%d;blkdev.ins_unit =%d;\n", kernel_cfg->home_dir, blkdev.ins_base0,blkdev.ins_base1,blkdev.ins_unit); } Gs->idle_task->cur_dv=blkdev.let_to_drv[*blkdev.home_dir-'A']; DrvRep; if (blkdev.dvd_boot_is_good) { bd=Let2BlkDev(':'); if (bd->type==BDT_ATAPI) { blkdev.ins_base0=bd->base0; blkdev.ins_base1=bd->base1; blkdev.ins_unit =bd->unit; } } LBts(&sys_run_level,RLf_BLKDEV); #exe { if (!kernel_cfg->opts[CFG_NO_MP]) StreamPrint("\"MultiCore Start\\n\\n\";" "Core0StartMP;" "LBts(&sys_run_level,RLf_MP);"); }; KbdMsInit; MsInit; KbdInit; Spawn(&MsHardDrvrInstall); "Loading Compiler\n"; Cd("/Compiler"); Load("Compiler",LDF_SILENT); LBts(&sys_run_level,RLf_COMPILER); DbgMode(OFF); cnts.time_stamp_freq_initial=TimeStampFreqCal; Cd("/"); try ExeFile("StartOS"); //Continues /StartOS.HC catch { Raw(ON); Silent(OFF); GetOutOfDollar; PutExcept; Dbg; } LBts(&sys_run_level,RLf_ADAM_SERVER); SrvTaskCont; //Never to return } asm { ALIGN 16,OC_NOP SYS_KERNEL_END:: #exe { if (kernel_cfg->opts[CFG_DBG_DISTRO]) StreamPrint("DU8 0x%X-(SYS_KERNEL_END-SYS_KERNEL+" "BOOT_RAM_BASE+sizeof(CBinFile)) DUP (0);" "BINFILE \"%s\";",kernel_cfg->dbg_distro_start, kernel_cfg->dbg_distro_file); }; }