void InitSysGlbls() { sys_timer=0; jiffies=0; rnd_SEED = 93186752; sys_cur_focus_task=Fs; num_spawned_users=0; compiled_lines=0; ext[EXT_IRQ00]=&SimpleTimerIrq; StrCpy(sys_temp_filename,"::/LT/DOC/TEMP.TXZ"); sys_macro_queue.next=&sys_macro_queue; sys_macro_queue.last=&sys_macro_queue; macro_util_tss=NULL; ip_inhibit_win_operations=FALSE; LTDCBase=NULL; LTDCHashTable=NULL; exe { I1 *buf,*buf2; LTDate ltdt; buf=PmtStr("Start-up Accnt(ENTER will prompt):",""); buf2=PmtStr("Wordstat directory list(separated by ';'):",""); ExePrintF("sys_startup_account=\"%s\";\r\n",buf); ExePrintF("wordstat_mask=\"%s\";\r\n",buf2); Free(buf); Free(buf2); ltdt=GetCurTimeLTDate; ExePrintF("sys_compile_time=\"%D %T\";\r\n",ltdt.date,ltdt.time); buf=PmtStr("Disk Cache Size (ENTER will use default of %s Bytes):","0x1000000"); ExePrintF("LTDCInitCache(%s);",buf); Free(buf); } } void AddModuleHash(I1 *name,U8 base) { SysHashEntry *temph,**temph1; temph=MAllocZ(sizeof(SysHashEntry)); temph->type=HTT_MODULE|HTT_PUBLIC; temph->use_cnt=0; temph->user0=base; temph->source_link=NULL; temph->string=NewString(name); temph1=FindHashBucket(temph->string,Fs->hash_table); temph->next=*temph1; *temph1=temph; } void AddOsMapSymbols() { SysHashEntry *temph,**temph1; 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->user0=i+code; temph->source_link=NULL; temph->string=NewString(sptr); temph1=FindHashBucket(temph->string,Fs->hash_table); temph->next=*temph1; *temph1=temph; } else if (typefile_size)!=LT_XSUM) throw(EXCEPT_ARC_XSUM); absname=AbsoluteFileName(fbuf); Free(fbuf); fbuf=NewString(absname); fbuf2=NewString(absname); RemoveLastSeg(fbuf,".",fbuf2); if (fbuf[1]==':' && StrLen(fbuf)>2) AddModuleHash(fbuf+2,code); Free(fbuf); Free(fbuf2); 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->string=NewString(sptr); temph->type=HTT_SYS_SYMBOL; temph->use_cnt=0; l=StrLen(absname); temph->source_link=MAlloc(l+4); StrCpy(temph->source_link,"FI:"); StrCat(temph->source_link,absname); if (etype==EIE_LIT_EXPORT) temph->user0=i; else temph->user0=i+code; temph1=FindHashBucket(temph->string,Fs->hash_table); temph->next=*temph1; *temph1=temph; } 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->user0; else i=saved_hash_ptr->user0-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_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,0x20); //Mask OutP(0xA1,0x2F); //Mask PortNop; } GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height) { //This only allows widths which are divisible by 8 GrBitMap *result; result=MAllocZ(sizeof(GrBitMap)); result->type=type; result->width=width; result->internal_width=(width+7)&-8; 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); break; case BMT_MONO: result->plane_size=(result->internal_width*result->height)>>3; result->body=MAllocZ(result->plane_size); break; default: throw(EXCEPT_GRAPHICS,1); } result->pen_width=1; result->r=MAllocZ(9<<3); result->r[0].u4[1]=1; result->r[4].u4[1]=1; result->r[8].u4[1]=1; return result; } void InitGraphics(I8 mode) { dc_col=0; //TODO reinit VGA without BIOS grmode=mode; grfont=SYS_FONT_8x8; switch (grmode) { case 1: grwidth=640; grheight=480; break; case 2: grwidth=800; grheight=600; break; } //TODO free old allocated stuff grbase=GrBitMapNew(BMT_COLOR4,grwidth,grheight); grbase->flags|=BMF_SCREEN_BITMAP; grbase2=GrBitMapNew(BMT_COLOR4,grwidth+64,grheight+64); grbase2->left_margin=32; grbase2->right_margin=grbase2->internal_width-32; grbase2->top_margin=32; grbase2->bottom_margin=grbase2->height-32; grbase2->flags|=BMF_SCREEN_BITMAP; vga_image=MAllocZ(grwidth*grheight>>1); textbase=MAlloc(grwidth/FONT_WIDTH*(grheight/FONT_HEIGHT)<<2); GrClear2(grbase); ClearWindowText; OutP(VGA_SC_INDEX,VGA_MAP_MASK); OutP(VGA_SC_DATA,0x0F); MemSet(0xA0000,0,grheight*grwidth>>3); } asm {CP_OS_MAIN:} void OsMain() { void my_AdamStartUpFile(); adam_tss=Fs; InitTimer; InitIrqs; ext=MAllocZ(EXT_TABLE_SIZE<<2); InitGraphics(grmode); $FG,5$//$BK,1$WARNING$BK,0$ do not do cout before here (null ext[]) //DbgNum(), DbgStr() are okay, however.$FG$ coutln "InitSysTask"; InitSysTask; coutln "AddOsMapSymbols"; AddOsMapSymbols; coutln "InitSysGlbls"; InitSysGlbls; coutln "LoadSysStrings"; LoadSysStrings; coutln "ENABLE IRQ's"; SetFlags(SYS_DEFAULT_FLAGS); InitKeyboard; coutln "InitAllBlkDevs"; InitAllBlkDevs; coutln "Select Default Drive"; SelectDefaultDrive; cout "Loading Compiler..."; Cd("/LT/COMPILE"); Load("CMP"); coutln "Done"; my_AdamStartUpFile=FindExtern("AdamStartUpFile"); my_AdamStartUpFile(); ContinueServantTask; //Never to return } asm { ALIGN 16,0x90 SYS_CS_SIZE::}