void InitSysGlbls() { sys_timer=0; sys_jiffies=0; rnd_SEED = 93186752; time_stamp_freq=2676302000; //give reasonable value time_stamp_kHz_freq=time_stamp_freq/1000; sys_cur_focus_task=Fs; sys_update_screen_tss=NULL; MemSet(sema_irqs,0,NUM_IRQ_SEMAS*sizeof(sema)); MemSet(sema_irq_busy,0,NUM_IRQ_SEMAS*sizeof(sema)); num_spawned_users=0; compiled_lines=0; compiled_functions=0; ext[EXT_IRQ00]=&SimpleTimerIrq; StrCpy(sys_temp_filename,"HOME/Temp.TXZ"); sys_macro_queue.next=&sys_macro_queue; sys_macro_queue.last=&sys_macro_queue; mouse_evt_time=0; kbd_evt_time=0; kbdmouse_fifo=NewU1Fifo(128); MemSet(&sys_put_key_queue,0,sizeof(KeyDevStruct)); sys_put_key_queue.next=&sys_put_key_queue; sys_put_key_queue.last=&sys_put_key_queue; AddKeyDev(&InputFilterPutKey,&InputFilterPutS,0x40000000); AddKeyDev(&RawCrtPutKey,&RawCrtPutS,0x60000000); macro_util_tss=NULL; ip_inhibit_win_operations=FALSE; local_time_offset=0; ltcd_base=NULL; ltdc_hash_table=NULL; sysdbg0=0; sysdbg1=0; sysdbg2=0; sysdbg3=0; progress1=0; progress2=0; progress3=0; progress4=0; default_iso_name="::/Temp/CDDVD.ISO"; #exe { I1 *buf; LTDate ltdt; buf=PmtStr("Start-up Accnt(ENTER will prompt):",""); ExePrintF("sys_startup_account=\"%s\";\r\n",buf); Free(buf); ltdt=GetCurTimeLTDate; ExePrintF("sys_compile_time=0x%X;\r\n",ltdt); buf=PmtStr("Disk Cache Size, gets rounded-up funny, (ENTER will use default of %s Bytes):","0x8000000"); ExePrintF("LTDCInitCache(%s);",buf); Free(buf); } } void AddModuleHash(I1 *name,U8 base) { SysHashEntry *temph; temph=MAllocZ(sizeof(SysHashEntry)); temph->type=HTT_MODULE|HTT_PUBLIC; temph->use_cnt=0; temph->user_data0=base; temph->source_link=NULL; temph->str=NewStr(name); AddSysHashEntry(temph,Fs->hash_table); } void AddOsMapSymbols() { SysHashEntry *temph; I1 *sptr; U1 *ptr; U4 *dd; U8 type; I8 i,code; code=sys_boot_base; AddModuleHash("/LT/OSMain/OS",code); ptr=sys_boot_header_base; while ((type=*ptr++)!=EIE_END) { //PASS 1 dd=ptr; ptr+=4; i=*dd; sptr=ptr; ptr+=StrLen(sptr)+1; if (type<=EIE_LIT_EXPORT) { temph=MAllocZ(sizeof(SysHashEntry)); temph->type=HTT_SYS_SYMBOL; temph->use_cnt=0; temph->user_data0=i+code; temph->source_link=NULL; temph->str=NewStr(sptr); AddSysHashEntry(temph,Fs->hash_table); } else if (typefile_size)!=LT_XSUM) throw(EXCEPT_ARC_XSUM); absname=AbsoluteFileName(fbuf); Free(fbuf); fbuf=NewStr(absname); RemoveLastSeg(fbuf,"."); if (fbuf[1]==':' && StrLen(fbuf)>2) AddModuleHash(fbuf+2,code); Free(fbuf); ptr=bfh+bfh->header_offset; while ((etype=*ptr++)!=EIE_END) { //PASS 1 dd=ptr; ptr+=sizeof(U4); i=*dd; sptr=ptr; ptr+=StrLen(sptr)+1; if (etype<=EIE_LIT_EXPORT) { temph=MAllocZ(sizeof(SysHashEntry)); temph->str=NewStr(sptr); temph->type=HTT_SYS_SYMBOL; temph->use_cnt=0; n=StrLen(absname); temph->source_link=MAlloc(n+4); StrCpy(temph->source_link,"FI:"); StrCat(temph->source_link,absname); if (etype==EIE_LIT_EXPORT) temph->user_data0=i; else temph->user_data0=i+code; AddSysHashEntry(temph,Fs->hash_table); } else if (etypetype & HTT_FUNCTION) { tempc=saved_hash_ptr; if (etype & 1) i=tempc->executable_address; else i=tempc->executable_address-code; } else if (saved_hash_ptr->type & HTT_GLBL_VAR) { tempg=saved_hash_ptr; if (etype & 1) i=tempg->data_address; else i=tempg->data_address-code; } else { if (etype & 1) i=saved_hash_ptr->user_data0; else i=saved_hash_ptr->user_data0-code; } if (etype<=EIE_LIT_U1) *bb=i+*bb; else if (etype<=EIE_LIT_U2) *ww=i+*ww; else if (etype<=EIE_LIT_U4) *dd=i+*dd; else if (etype<=EIE_LIT_U8) *qq=i+*qq; } } else if (etype==EIE_ABSOLUTE_ADDRESS) { if (no_abs) ptr+=i*sizeof(U4); else { cnt=i; for (j=0;jheader_offset; while ((etype=*ptr++)!=EIE_END) { //PASS 2 dd=ptr; ptr+=sizeof(U4); i=*dd; sptr=ptr; ptr+=StrLen(sptr)+1; if (etype<=EIE_LIT_EXPORT) { } else if (etype>8); } void InitIrqs() { //Init 8259 OutP(0x20,0x11); //IW1 OutP(0xA0,0x11); //IW1 PortNop; OutP(0x21,0x20); //IW2 OutP(0xA1,0x28); //IW2 PortNop; OutP(0x21,0x04); //IW3 OutP(0xA1,0x02); //IW3 PortNop; OutP(0x21,0x0D); //IW4 OutP(0xA1,0x09); //IW4 PortNop; OutP(0x21,0x24); //Mask OutP(0xA1,0x37); PortNop; } GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height,TssStruct *tss=NULL) { //This only allows widths which are divisible by 8 GrBitMap *result; if (!tss) tss=Fs; result=MAllocZ(sizeof(GrBitMap),tss); result->win_tss=tss; result->mem_tss=tss; result->type=type; result->width=width; result->internal_width=(width+7)&~7; result->height=height; result->left_margin=0; result->right_margin=width; result->top_margin=0; result->bottom_margin=height; switch (type) { case BMT_COLOR4: result->plane_size=(result->internal_width*result->height)>>3; result->body=MAllocZ(result->plane_size<<2,tss); break; case BMT_MONO: result->plane_size=(result->internal_width*result->height)>>3; result->body=MAllocZ(result->plane_size,tss); break; default: throw(EXCEPT_GRAPHICS,1); } result->pen_width=1; result->r=MAllocZ(16<<3,tss); result->r[0].u4[1]=1; result->r[5].u4[1]=1; result->r[10].u4[1]=1; result->r[15].u4[1]=1; result->speedline_scale=0.04; result->bitmap_signature=BMS_SIGNATURE; return result; } void InitGraphics() { dc_col=0; dc_flags=0; dc_cursor_blink=0; grfont=sys_font_8x8; //TODO free old allocated stuff grbase2=GrBitMapNew(BMT_COLOR4,GR_WIDTH+128,GR_HEIGHT+32); grbase2->left_margin=64; grbase2->right_margin=GR_WIDTH+grbase2->left_margin; grbase2->top_margin=16; grbase2->bottom_margin=grbase2->height-16; grbase2->flags|=BMF_SCREEN_BITMAP; vga_image=MAlloc(GR_WIDTH*GR_HEIGHT>>1); textbase=MAlloc(GR_WIDTH/FONT_WIDTH*(GR_HEIGHT/FONT_HEIGHT)<<2); Gs->grbase=GrBitMapNew(BMT_COLOR4,GR_WIDTH,GR_HEIGHT); Gs->grbase->flags|=BMF_SCREEN_BITMAP; GrClear2(Gs->grbase); gr_merge_base=GrBitMapNew(BMT_COLOR4,GR_WIDTH,GR_HEIGHT); gr_merge_base->flags|=BMF_SCREEN_BITMAP; OutP(VGA_SC_INDEX,VGA_MAP_MASK); OutP(VGA_SC_DATA,0x0F); MemSet(0xA0000,0,GR_HEIGHT*GR_WIDTH>>3); } asm {CP_REBOOT:} void Reboot() { U2 *d=0x472; Cli; if (mp_cnt>1) { MPHalt; BusyWait(100); } *d=0; OutP(0x70,0x8F); OutP(0x71,0x00); OutP(0x70,0x00); OutP(0x92,InP(0x92)|1); Hlt; } asm {CP_OS_MAIN:} void OsMain() { U8 i,j; adam_tss=Fs; StrCpy(Fs->task_descriptor2,"Adam Task CPU#0"); StrCpy(Fs->task_descriptor,Fs->task_descriptor2); reverse_bits_table=MAllocZ(256); for (i=0;i<256;i++) for (j=0;j<8;j++) if (Bt(&i,7-j)) Bts(reverse_bits_table+i,j); set_bits_table=MAllocZ(256); for (i=0;i<256;i++) for (j=0;j<8;j++) if (Bt(&i,j)) set_bits_table[i]++; ext=MAllocZ(EXT_TABLE_SIZE*sizeof(void *)); ctrl_alt_letter_routines=MAllocZ(26*sizeof(void *)); InitGraphics(); InitSysTask; AddOsMapSymbols; InitSysGlbls; //Before this point use $LK,"Sound","MN:Sound"$() and $LK,"BusyWait","MN:BusyWait"$() //to debug. After this point, use $LK,"DbgNum","MN:DbgNum"$() LoadSysStrs; MPInit; InitTimer; InitIrqs; coutln "Enable IRQ's"; SetFlags(SYS_NORMAL_RFLAGS); Preempt(ON); time_stamp_start=GetTimeStamp; sys_timer_start=ReadSysTimer; coutln "InitAllBlkDevs"; InitAllBlkDevs; coutln "Select Default Drive"; SelectDefaultDrive; cout "Loading Compiler..."; Cd("/LT/Compiler"); Load("Compiler"); coutln "Done"; CallExtStr("AdamStartUpFile"); //Continues here $LK,"AdamStartUpFile","FF:::/LT/Compiler/CmpMain.CPZ,AdamStartUpFile"$ ContinueServantTask; //Never to return } asm { ALIGN 16,0x90 SYS_CS_SIZE::}