diff --git a/0000Boot/0000Kernel.BIN.C b/0000Boot/0000Kernel.BIN.C index 5c3cd29..d9563ce 100644 Binary files a/0000Boot/0000Kernel.BIN.C and b/0000Boot/0000Kernel.BIN.C differ diff --git a/Accts/Adam3.CPP b/Accts/Adam3.CPP deleted file mode 100644 index 88ec8bc..0000000 --- a/Accts/Adam3.CPP +++ /dev/null @@ -1,10 +0,0 @@ -//Change anything you want in this -//acct file or others. - -#include "HOME/Adam3aLocalize" -#include "HOME/Adam3bPkgs" -#include "HOME/Adam3cKeyPlugIns" -#include "HOME/Adam3dWrappers" -#include "HOME/Adam3eSys" - -#help_index "" diff --git a/Accts/Adam3dWrappers.CPP b/Accts/Adam3dWrappers.CPP deleted file mode 100644 index 7d20c27..0000000 --- a/Accts/Adam3dWrappers.CPP +++ /dev/null @@ -1,26 +0,0 @@ -//Change anything you want in this -//acct file or others. - -#help_index "Cmd Line (Typically)" - -//These are customized quick commands. -//Feel free to add more or change. -public I64 F(U8 *needle_str,U8 *fu_flags=NULL) -{//Find (Grep) all text files. - return Grep(needle_str,"/*",fu_flags); -} - -public I64 R(U8 *needle_str,U8 *replace_text=NULL,U8 *fu_flags="+l-i") -{//Find (Grep) and replace string with string in all files. - return Grep(needle_str,"/*",fu_flags,replace_text); -} - -public I64 FD(U8 *needle_str,U8 *fu_flags=NULL) -{//Find (Grep) text files in cur dir. - return Grep(needle_str,"*",fu_flags); -} - -public I64 RD(U8 *needle_str,U8 *replace_text=NULL,U8 *fu_flags="+l-i") -{//Find (Grep) and replace string with string in cur dir. - return Grep(needle_str,"*",fu_flags,replace_text); -} diff --git a/Accts/Adam3eSys.CPP b/Accts/Adam3eSys.CPP deleted file mode 100644 index 1f25841..0000000 --- a/Accts/Adam3eSys.CPP +++ /dev/null @@ -1,41 +0,0 @@ -//Change anything you want in this -//acct file or others. - -U0 UserStartUp() -{//Run each time a user a spawned - DocTermNew; - Type("::/Doc/Start.TXT"); - LBts(&Fs->display_flags,DISPLAYf_SHOW); - WinToTop; - WinZBufUpdate; - Preempt(ON); - Dir; -} - -U0 SrvStartUp() -{//Run each time a srv task is spawned. - DocTermNew; - LBts(&Fs->display_flags,DISPLAYf_SHOW); - WinToTop; - WinZBufUpdate; - Preempt(ON); -} - -U0 StartUpTasks() -{ - CTask *user1,*user2; - user1=SpawnUser; - user2=SpawnUser; - WinToTop(user1); - WinTileVert; - PopUp("#include \"::/Adam/Start\";"); - "Boot Time:%7.3fs\n",tS; - XTalk(user1,"Cd(\"HOME\");#include \"DoOnce\";\n"); - Silent(ON); //no output to screen - WSInit("/*;~*Bible.TXT*"); - Silent(OFF); //no output to screen -} - -StartUpTasks; - -"\nOS Compile Time:%D %T\n",sys_compile_time,sys_compile_time; diff --git a/Accts/DoOnce.CPP b/Accts/DoOnce.CPP deleted file mode 100644 index c8d3db4..0000000 --- a/Accts/DoOnce.CPP +++ /dev/null @@ -1,16 +0,0 @@ -//This file is executed by the -//first terminal window upon start-up. -//See $LK,"DoOnce",A="FF:HOME/Adam3eSys.CPP,DoOnce"$ and $LK,"Acct Files",A="FF:::/Doc/GuideLines.TXT,ACCT FILES"$. - -//It goes in your HOME directory and -//you can customize it. - -//Delete this to get rid of -//default start-up msg. -Type("::/Doc/Customize.TXT"); - -"\nTake Tour"; -if (YorN) { - Cd("::/Misc/Tour"); - AutoFile("Tour"); -} diff --git a/Accts/PersonalMenu.TXT b/Accts/PersonalMenu.TXT deleted file mode 100644 index 97398cd..0000000 Binary files a/Accts/PersonalMenu.TXT and /dev/null differ diff --git a/Adam.CPP b/Adam.CPP new file mode 100644 index 0000000..6ce9ca2 --- /dev/null +++ b/Adam.CPP @@ -0,0 +1,105 @@ +//This is executed by the Adam task at boot. +//See $LK,"Adam Start-up",A="FF:::/Kernel/KEnd.CPP,\"Adam:2"$. + +//You do not place this file in /Home. (It would be ignored.) +//but look at the bottom of this file to see +//files you do customize. + +extern I8i OptEqu(I64i num,I8i val); +OptEqu(0,0); //(0,0)=EchoOff (0,1)=EchoOn +#include "/Kernel/KernelA.HPP" +#include "/Compiler/CompilerA.HPP" +#include "/Kernel/KernelB.HPP" +#include "/Kernel/KernelC.HPP" +#include "/Compiler/CompilerB.HPP" + +Cd("/Adam");; +#exe {OptOn(OPTf_WARN_PAREN);}; +#exe {OptOn(OPTf_WARN_DUP_TYPES);}; + +HashTablePurge(adam_task->hash_table); + +#help_index "Misc" + +//Use Dbg("Type 'G;'"); to debug before window mgr is running. + +public F64 os_version=3.03;//Operating system version. + +#include "AExts.HPP" +#include "AMath" +#include "Training" +#include "AUtils" +#include "AMathODE" +Cd("::/Adam/Gr");; +#include "Gr" + +Cd("::/Adam/Snd");; +#include "Snd" + +Cd("::/Adam/Dsk");; +#include "ADsk" + +Cd("::/Adam");; +#include "Menu" +#include "WinA" +#include "WinB" +#include "ADbg" + +#include "::/Adam/God/GodExt" + +Cd("::/Adam/DolDoc");; +#include "Doc" +LBts(&sys_run_level,RLf_DOC); + +Cd("::/Adam/Ctrls");; +#include "Ctrls" + +Cd("::/Adam");; +#include "AutoFile" +#include "Acct" + +Cd("::/Adam/AutoComplete");; +#include "AutoComplete" + +Cd("::/Adam/God");; +#include "God" + +Cd("::/Adam");; +#include "AHash" +#include "TaskSettings" +#include "DevInfo" +#include "ADefine" + +//Dbg("Type 'G;'"); +DocTermNew; +WinVert(2,10); + +sys_winmgr_task=Spawn(&WinMgrTask,NULL,"Window Mgr"); +Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_BORDER-WIF_SELF_GRAB_SCROLL-WIF_SELF_CTRLS; +LBts(&Fs->display_flags,DISPLAYf_CHILDREN_NOT_ON_TOP); +LBts(&Fs->display_flags,DISPLAYf_SHOW); +RegistryInit; +LBts(&sys_run_level,RLf_REGISTRY); + +Cd("::/Adam");; +#include "WallPaper" + +if (IsDrvWritable) + MkDir("/Temp"); //Good to have a Temp + +#exe {OptOff(OPTf_WARN_PAREN);}; +#exe {OptOff(OPTf_WARN_DUP_TYPES);}; +LBts(&sys_run_level,RLf_HOME); + +#help_index "" +Cd("::/Home");; + +//If these are not present in /Home, it uses the version in the root dir. +//You should make your own version of these files in you /Home directory. +#include "::/Home/AdamLocalize" +#include "::/Home/AdamPkgs" +#include "::/Home/AdamKeyPlugIns" +#include "::/Home/AdamWrappers" +#include "::/Home/AdamSys" + +//After this file, the Adam task enters $LK,"server mode",A="HI:Task/Srv"$. diff --git a/Adam/Dbg2a.CPP b/Adam/ADbg.CPP similarity index 96% rename from Adam/Dbg2a.CPP rename to Adam/ADbg.CPP index b1aff6d..3d0b633 100644 --- a/Adam/Dbg2a.CPP +++ b/Adam/ADbg.CPP @@ -1,7 +1,7 @@ #help_index "Debugging/Dump" Bool ClassRep2(CDoc *doc,U8 *_d,U8 *class_name=lastclass,I64 depth,I64 max_depth,Bool dynamic,I64 types=HTT_CLASS,I64 offset=0) {//See $LK,"::/Demo/LastClass.CPP"$. - I64 i,j,*ptr; + I64 i,j,stars,*ptr; CMemberLst *ml; CDocEntry *doc_e; Bool unlock; @@ -24,12 +24,12 @@ Bool ClassRep2(CDoc *doc,U8 *_d,U8 *class_name=lastclass,I64 depth,I64 max_depth tempc2=ml->member_class; ptr=_d(U8 *)+ml->offset; DocPrint(doc,"%08X ",ptr(U8 *)+offset); - j=tempc2->ptr_cnt; + stars=tempc2->ptr_stars_cnt; tempc2=OptClassFwd(tempc2); - tempc2-=tempc2->ptr_cnt; + tempc2-=tempc2->ptr_stars_cnt; if (tempc2->type & HTT_INTERNAL_TYPE) { DocPrint(doc,"$$GREEN$$%-20ts:$$FG$$",ml->str); - if (j==1 && (tempc2->raw_type==RT_I8 || tempc2->raw_type==RT_U8)) { + if (stars==1 && (tempc2->raw_type==RT_I8 || tempc2->raw_type==RT_U8)) { ptr=*ptr; if (ChkPtr(ptr)) { if (dynamic) { @@ -39,7 +39,7 @@ Bool ClassRep2(CDoc *doc,U8 *_d,U8 *class_name=lastclass,I64 depth,I64 max_depth } else DocPrint(doc,"%40ts\n",ptr); } - } else if (!j) { + } else if (!stars) { j=MinI64(ml->dim.total_cnt,32); if (tempc2->raw_type==RT_I8 || tempc2->raw_type==RT_U8) { if (j==1) { @@ -128,14 +128,14 @@ Bool ClassRep2(CDoc *doc,U8 *_d,U8 *class_name=lastclass,I64 depth,I64 max_depth DocPrint(doc,"\n"); } else { if (depth<2) { - if (j==1 && !ChkPtr(*ptr)) + if (stars==1 && !ChkPtr(*ptr)) DocPrint(doc,"%-20ts:%016X\n",ml->str,*ptr); else { DocPrint(doc,"$$TR,\"%s\"$$\n",ml->str); DocPrint(doc,"$$ID,2$$"); - if (!j) + if (!stars) ClassRep2(doc,ptr,tempc2->str,depth+1,max_depth,dynamic); - else if (j==1) + else if (stars==1) ClassRep2(doc,*ptr,tempc2->str,depth+1,max_depth,dynamic); DocPrint(doc,"$$ID,-2$$"); } diff --git a/Adam/ADefine.CPP b/Adam/ADefine.CPP new file mode 100644 index 0000000..f034821 --- /dev/null +++ b/Adam/ADefine.CPP @@ -0,0 +1,51 @@ +#help_index "Define;Char/Define" + +U0 LoadDocDefines() +{ + CBinFile *bfh=sys_boot_base-sizeof(CBinFile); + + DefinePrint( + "DD_OS_NAME_VERSION","TempleOS V%0.2f",os_version); + DefinePrint( + "DD_TEMPLEOS_AGE","%0.1f",(Now-Str2Date("8/1/2003"))/ToF64(1<<32)/CDATE_YEAR_DAYS); + + //This is cut and replaced when I generate a distro. + //See $LK,"DD_TEMPLEOS_LOC",A="FF:::/Demo/AcctExample/TOSDistro.CPP,DD_TEMPLEOS_LOC"$. + $TR-C,"LineRep"$ +$ID,4$DefinePrint("DD_TEMPLEOS_LOC","120,789"); +DefinePrint("DD_TEMPLEOS_LOC_OFFICIAL","79,959"); +$ID,-4$ + DefinePrint( + "DD_KERNEL","%08X",bfh); + bfh(I64)+=bfh->file_size-1; + DefinePrint( + "DD_KERNEL_END","%08X",bfh); + DefinePrint( + "DD_PROTECTED_LOW","%08X",MEM_PROTECTED_LOW_LIMIT); + + //$LK,"DD_BOOT_HIGH_LOC_CD",A="FF:::/Adam/Boot/BootCD.CPP,DD_BOOT_HIGH_LOC_CD"$ + + DefinePrint( + "DD_MP_VECT","%08X",MP_VECT_ADDR); + DefinePrint( + "DD_MP_VECT_END","%08X",MP_VECT_ADDR+AP_16BIT_INIT_END-AP_16BIT_INIT-1); + + DefinePrint( + "DD_SYS_FIXED_AREA_BASE","%08X",SYS_FIXED_AREA); + DefinePrint( + "DD_SYS_FIXED_AREA_END","%08X",SYS_FIXED_AREA+sizeof(CSysFixedArea)-1); + DefinePrint( + "DD_SYS_HEAP_BASE","%08X",sys_heap_base); + DefinePrint( + "DD_SYS_HEAP_LIMIT","%08X",sys_heap_limit); + DefinePrint( + "DD_MEM_MIN_MEG","%d Meg",MEM_MIN_MEG); + DefinePrint( + "DD_MEM_MAPPED_SPACE_GIG","%d Gig",MEM_MAPPED_SPACE/0x40000000); + DefinePrint( + "DD_MEM_MAPPED_SPACE_END","%010X",MEM_MAPPED_SPACE-1); + DefinePrint( + "DD_JIFFY_HZ","%d Hz",JIFFY_FREQ); +} + +LoadDocDefines; diff --git a/Adam/AdamExts.HPP b/Adam/AExts.HPP similarity index 83% rename from Adam/AdamExts.HPP rename to Adam/AExts.HPP index 301322e..5740479 100644 --- a/Adam/AdamExts.HPP +++ b/Adam/AExts.HPP @@ -1,13 +1,20 @@ +extern U0 ACDDef(I64 n,CTask *parent=NULL); +extern U0 ACDDefsPut(CDoc *doc,U8 *st,I64 num=-1); +extern U0 ACDFillin(I64 n); +extern U0 ACFillIn(I64 n); +extern U0 ACFindMisspelled(CDoc *doc); +extern U0 ACMan(I64 n,CTask *parent=NULL); extern U0 AcctOneTimePopUp(I64 flag_num,U8 *msg); extern I64 AdamFile(U8 *filename,Bool warn_ext=TRUE); -extern I64 BMPFileWrite(U8 *filename,CDC *dc,I64 bits=4); +extern Bool AutoComplete(Bool val=OFF); +extern I64 BMPWrite(U8 *filename,CDC *dc,I64 bits=4); extern I64 CDFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,U8 *fu_flags=NULL, U8 *_stage2_filename=NULL); extern U0 ClipboardDel(); extern CCtrl *CtrlFindUnique(CTask *haystack_task,I64 needle_type); extern Bool CtrlInside(CCtrl *c,I64 x,I64 y); extern U8 *DC2Sprite(CDC *tempb); -extern U0 DocBMPFile(CDoc *doc=NULL,U8 *filename,Bool use_ms_paint_palette=FALSE); +extern U0 DocBMP(CDoc *doc=NULL,U8 *filename,Bool dither_probability=FALSE,Bool use_ms_paint_palette=FALSE); extern U0 DocBinDel(CDoc *doc,CDocBin *b); extern U0 DocBinsValidate(CDoc *doc); extern U0 DocBottom(CDoc *doc=NULL); @@ -52,8 +59,7 @@ extern CMenu *MenuFilePush(U8 *filename); extern U0 MenuPop(); extern CMenu *MenuPush(U8 *st); extern CTask *Noise(I64 mS,I64 min_freq,I64 max_freq); -extern Bool Plain(U8 *filename); -extern I64 PopUp(U8 *msg,CTask *parent=NULL,CTask **_pu_task=NULL); +extern Bool Plain(U8 *filename,I64 edf_dof_flags=0); extern Bool PopUpCancelOk(U8 *header=NULL,U8 *footer=NULL); extern I64 PopUpColor(U8 *header=NULL,Bool allow_transpant=TRUE,Bool allow_dft=TRUE); extern I64 PopUpColorDither(U8 *header=NULL); @@ -67,27 +73,20 @@ extern Bool PopUpNoYes(U8 *header=NULL,U8 *footer=NULL); extern Bool PopUpOk(U8 *header=NULL,U8 *footer=NULL); extern I64 PopUpRangeI64(I64 lo,I64 hi,I64 step=1,U8 *header=NULL,U8 *footer=NULL); extern Bool PopUpTransform(I64 *r); -extern CDoc *SetCursorPos(CTask *task,I64 ip_text_x,I64 ip_text_y,Bool set_cursor=TRUE); -extern Bool SetWinHorz(I64 left,I64 right,CTask *task=NULL); -extern Bool SetWinVert(I64 top,I64 bottom,CTask *task=NULL); extern U0 SettingsPop(CTask *task=NULL,I64 flags=0); extern CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0); -extern U0 TemplateSliderCtrl(CDoc *doc); +extern U0 TemplateCtrlSlider(CDoc *doc); extern Bool View(); extern U0 ViewAnglesDel(CTask *task=NULL); extern CCtrl *ViewAnglesNew(CTask *task=NULL); -extern U0 WSDDef(I64 n,CTask *parent=NULL); -extern U0 WSDDefsPut(CDoc *doc,U8 *st,I64 num=-1); -extern U0 WSDFillin(I64 n); -extern U0 WSFillIn(I64 n); -extern U0 WSFindMisspelled(CDoc *doc); -extern U0 WSMan(I64 n,CTask *parent=NULL); extern Bool WinBorder(Bool val,CTask *task=NULL); +extern CDoc *WinCursorPosSet(CTask *task,I64 ip_text_x,I64 ip_text_y,Bool set_cursor=TRUE); +extern Bool WinHorz(I64 left,I64 right,CTask *task=NULL); extern U0 WinMax(CTask *task=NULL); extern U0 WinMgrSync(I64 cnt=1,Bool force=FALSE); extern U0 WinScrollNull(CTask *task,CD3I64 *s); extern U0 WinScrollRestore(CTask *task,CD3I64 *s); extern U0 WinScrollsInit(CTask *task); extern Bool WinToTop(CTask *task=NULL,Bool update_z_buf=TRUE); -extern Bool WordStat(Bool val=OFF); +extern Bool WinVert(I64 top,I64 bottom,CTask *task=NULL); extern CWinMgrGlbls winmgr; diff --git a/Adam/Hash2a.CPP b/Adam/AHash.CPP similarity index 91% rename from Adam/Hash2a.CPP rename to Adam/AHash.CPP index 1196e35..9cca377 100644 --- a/Adam/Hash2a.CPP +++ b/Adam/AHash.CPP @@ -144,8 +144,8 @@ public U0 Who(U8 *fu_flags=NULL,CHashTable *h=NULL, U8 *outname=NULL,U8 mapfile_drv=0,U8 *index=NULL,CDoc *_doc=NULL) {//Dump hash symbol table. // "+p" for only public symbols -// "+m" to order by number (normally alphabetical) -// "-r" just local hash table + // "+m" to order by number (normally alphabetical) + // "-r" just local hash table CHashTable *table; CHashSrcSym *temph; CHashGeneric *ptr; @@ -177,7 +177,7 @@ public U0 Who(U8 *fu_flags=NULL,CHashTable *h=NULL, doc=NULL; if (index) { - task=SpawnUser; + task=User; TaskWait(task); LBtr(&task->display_flags,DISPLAYf_SHOW); } else @@ -186,16 +186,18 @@ public U0 Who(U8 *fu_flags=NULL,CHashTable *h=NULL, cnt=0; table=h; while (table) { - temph=table->next_added; - while (temph!=table) { - if (!(temph->type & (HTF_IMPORT | HTF_PRIVATE)) && - (temph->type & HTF_PUBLIC || !publics)) { - if (!index) - cnt++; - else if (temph->type&HTG_SRC_SYM && (cur_index=temph->index)) - cnt+=HelpIndexCnt(cur_index,index); + for (i=0;i<=table->mask;i++) { + temph=table->body[i]; + while (temph) { + if (!(temph->type & (HTF_IMPORT | HTF_PRIVATE)) && + (temph->type & HTF_PUBLIC || !publics)) { + if (!index) + cnt++; + else if (temph->type&HTG_SRC_SYM && (cur_index=temph->index)) + cnt+=HelpIndexCnt(cur_index,index); + } + temph=temph->next; } - temph=temph->next_added; } if (recurse) table=table->next; @@ -208,19 +210,21 @@ public U0 Who(U8 *fu_flags=NULL,CHashTable *h=NULL, j=0; table=h; while (table) { - temph=table->next_added; - while (temph!=table) { - if (!(temph->type & (HTF_IMPORT | HTF_PRIVATE)) && - (temph->type & HTF_PUBLIC || !publics)) - if (!index) - lst[j++].h=temph; - else if (temph->type&HTG_SRC_SYM && (cur_index=temph->index) && - (k=HelpIndexCnt(cur_index,index))) - while (k--) { - lst[j].index=HelpIndexStr(&cur_index,index); + for (i=0;i<=table->mask;i++) { + temph=table->body[i]; + while (temph) { + if (!(temph->type & (HTF_IMPORT | HTF_PRIVATE)) && + (temph->type & HTF_PUBLIC || !publics)) + if (!index) lst[j++].h=temph; - } - temph=temph->next_added; + else if (temph->type&HTG_SRC_SYM && (cur_index=temph->index) && + (k=HelpIndexCnt(cur_index,index))) + while (k--) { + lst[j].index=HelpIndexStr(&cur_index,index); + lst[j++].h=temph; + } + temph=temph->next; + } } if (recurse) table=table->next; @@ -347,7 +351,7 @@ public U0 Who(U8 *fu_flags=NULL,CHashTable *h=NULL, if (index) progress1=progress1_max=0; -wh_done: + wh_done: Preempt(old_preempt); if (doc) { DocBinsValidate(doc); @@ -376,11 +380,7 @@ public I64 HashDepthRep(CHashTable *table=NULL) for (i=0;i<=table->mask;i++) { temph=table->body[i]; if (temph) { - j=1; - while (temph->next) { - temph=temph->next; - j++; - } + j=LinkedLstCnt(temph); if (jsrc_link; if (ptr[0] && ptr[1] && ptr[2]==':' && ptr[3]==':') - ptr[3]=*sys_acct; + ptr[3]=dsk.boot_drv_let; doc_e->aux_str=NULL; } diff --git a/Adam/Math2a.CPP b/Adam/AMath.CPP similarity index 100% rename from Adam/Math2a.CPP rename to Adam/AMath.CPP diff --git a/Adam/MathODE.CPP b/Adam/AMathODE.CPP similarity index 78% rename from Adam/MathODE.CPP rename to Adam/AMathODE.CPP index 5a73b6d..49c2311 100644 --- a/Adam/MathODE.CPP +++ b/Adam/AMathODE.CPP @@ -1,7 +1,7 @@ #help_index "Math/ODE" #help_file "::/Doc/ODE" -//See $LK,"::/Doc/Acknowledgements.TXT"$. +//See $LK,"::/Doc/Credits.TXT"$. F64 LowPass1(F64 a,F64 y0,F64 y,F64 dt=1.0) {//First order low pass filter @@ -56,14 +56,12 @@ public CMathODE *ODENew(I64 n,F64 max_tolerance=1e-6,I64 flags=0) ode->state=CAlloc(s); ode->array_base=MAlloc(12*s); ODERstPtrs(ode); - ode->ode_signature=ODE_SIGNATURE_VAL; return ode; } public U0 ODEDel(CMathODE *ode) {//Free ODE node, but not masses or springs. if (!ode) return; - ode->ode_signature=0; Free(ode->state); Free(ode->array_base); Free(ode); @@ -158,13 +156,13 @@ public U0 ODERenum(CMathODE *ode) public CMass *MassFind(CMathODE *ode,F64 x,F64 y,F64 z=0) {//Search for mass nearest to x,y,z. CMass *tempm,*best_mass=NULL; - F64 d,best_d=MAX_F64; + F64 dd,best_dd=MAX_F64; tempm=ode->next_mass; while (tempm!=&ode->next_mass) { - d=Sqr(tempm->x-x)+Sqr(tempm->y-y)+Sqr(tempm->z-z); - if (dx-x)+Sqr(tempm->y-y)+Sqr(tempm->z-z); + if (ddnext; @@ -175,15 +173,15 @@ public CMass *MassFind(CMathODE *ode,F64 x,F64 y,F64 z=0) public CSpring *SpringFind(CMathODE *ode,F64 x,F64 y,F64 z=0) {//Find spring midpoint nearest x,y,z. CSpring *temps,*best_spring=NULL; - F64 d,best_d=MAX_F64; + F64 dd,best_dd=MAX_F64; temps=ode->next_spring; while (temps!=&ode->next_spring) { - d=Sqr((temps->end1->x+temps->end2->x)/2-x)+ + dd=Sqr((temps->end1->x+temps->end2->x)/2-x)+ Sqr((temps->end1->y+temps->end2->y)/2-y)+ Sqr((temps->end1->z+temps->end2->z)/2-z); - if (dnext; @@ -196,13 +194,13 @@ public U0 MassOrSpringFind(CMathODE *ode,CMass **result_mass,CSpring **result_sp {//Find spring or mass nearest x,y,z. CMass *tempm,*best_mass=NULL; CSpring *temps,*best_spring=NULL; - F64 d,best_d=MAX_F64; + F64 dd,best_dd=MAX_F64; tempm=ode->next_mass; while (tempm!=&ode->next_mass) { - d=Sqr(tempm->x-x)+Sqr(tempm->y-y)+Sqr(tempm->z-z); - if (dx-x)+Sqr(tempm->y-y)+Sqr(tempm->z-z); + if (ddnext; @@ -210,11 +208,11 @@ public U0 MassOrSpringFind(CMathODE *ode,CMass **result_mass,CSpring **result_sp temps=ode->next_spring; while (temps!=&ode->next_spring) { - d=Sqr((temps->end1->x+temps->end2->x)/2-x)+ + dd=Sqr((temps->end1->x+temps->end2->x)/2-x)+ Sqr((temps->end1->y+temps->end2->y)/2-y)+ Sqr((temps->end1->z+temps->end2->z)/2-z); - if (dstate_internal,tempstate,sizeof(F64)*ode->n_internal); } -F64 ode_allocated_factor=0.75; +F64 ode_alloced_factor=0.75; U0 ODEsUpdate(CTask *task) {/* This routine is called by the $LK,"window mgr",A="FF:::/Adam/Gr/GrScreen.CPP,ODEsUpdate"$ on a continuous @@ -510,105 +508,100 @@ it has a timeout. if (task->next_ode==&task->next_ode) task->last_ode_time=0; - else { + else if (!Bt(&task->win_inhibit,WIf_SELF_ODE)) { //See $LK,"GrUpdateWins",A="MN:GrUpdateWins"$() - if (!Bt(&task->win_inhibit,WIf_SELF_ODE)) { - //TODO: Being preempted here woulds be bad - if (task!=Fs) - old_suspend=Suspend(task); - //We will not pick a time limit based on - //how busy the CPU is, what percent of the - //last refresh cycle was spent on ODE's - //and what the refresh cycle rate was. - start_time=tS; - d=1.0/winmgr.fps; - timeout_time=start_time+ - (task->last_ode_time/d+0.1)/(winmgr.last_ode_time/d+0.1)* - ode_allocated_factor*d; - ode=task->next_ode; - while (ode!=&task->next_ode) { - if (ode->ode_signature==ODE_SIGNATURE_VAL) { - t_initial=ode->t; - d=tS; - if (!(ode->flags&ODEF_STARTED)) { - ode->base_t=d; - ode->flags|=ODEF_STARTED; - } - d-=ode->base_t+t_initial; - t_desired=ode->t_scale*d+t_initial; - if (ode->flags&ODEF_PAUSED) + //TODO: Being preempted here woulds be bad + if (task!=Fs) + old_suspend=Suspend(task); + //We will not pick a time limit based on + //how busy the CPU is, what percent of the + //last refresh cycle was spent on ODE's + //and what the refresh cycle rate was. + start_time=tS; + d=1.0/winmgr.fps; + timeout_time=start_time+ + (task->last_ode_time/d+0.1)/(winmgr.last_ode_time/d+0.1)* + ode_alloced_factor*d; + ode=task->next_ode; + while (ode!=&task->next_ode) { + t_initial=ode->t; + d=tS; + if (!(ode->flags&ODEF_STARTED)) { + ode->base_t=d; + ode->flags|=ODEF_STARTED; + } + d-=ode->base_t+t_initial; + t_desired=ode->t_scale*d+t_initial; + if (ode->flags&ODEF_PAUSED) + ode->base_t+=t_desired-ode->t; //Slip + else if (ode->derivative) { + ODEState2Internal(ode); + MemCpy(ode->initial_state,ode->state_internal,ode->n_internal*sizeof(F64)); + while (ode->th_max=t_desired-ode->t; + ODECallDerivative(ode,ode->t,ode->state_internal,ode->DstateDt); + for (i=0;in_internal;i++) + ode->state_scale[i]=Abs(ode->state_internal[i])+ + Abs(ode->DstateDt[i]*ode->h)+ode->tolerance_internal; + ODERK5OneStep(ode); + if (tS>timeout_time) { ode->base_t+=t_desired-ode->t; //Slip - else if (ode->derivative) { - ODEState2Internal(ode); - MemCpy(ode->initial_state,ode->state_internal,ode->n_internal*sizeof(F64)); - while (ode->th_max=t_desired-ode->t; - ODECallDerivative(ode,ode->t,ode->state_internal,ode->DstateDt); - for (i=0;in_internal;i++) - ode->state_scale[i]=Abs(ode->state_internal[i])+ - Abs(ode->DstateDt[i]*ode->h)+ode->tolerance_internal; - ODERK5OneStep(ode); - if (tS>timeout_time) { - ode->base_t+=t_desired-ode->t; //Slip - goto ode_done; - - } - } - - //Interpolate if end time was not exact. - if (ode->t!=t_desired) { - if (interpolation=ode->t-t_initial) { - interpolation=(t_desired-t_initial)/interpolation; - if (interpolation!=1.0) - for (i=0;in_internal;i++) - ode->state_internal[i]=(ode->state_internal[i]- - ode->initial_state[i])*interpolation+ - ode->initial_state[i]; - } - ode->t=t_desired; - } -ode_done: - ODEInternal2State(ode); + goto ode_done; - //Convenience call to set vals - ODECallDerivative(ode,ode->t,ode->state_internal,ode->DstateDt); } - ode->base_t+=(1.0-ode->t_scale)*d; } - ode=ode->next; + + //Interpolate if end time was not exact. + if (ode->t!=t_desired) { + if (interpolation=ode->t-t_initial) { + interpolation=(t_desired-t_initial)/interpolation; + if (interpolation!=1.0) + for (i=0;in_internal;i++) + ode->state_internal[i]=(ode->state_internal[i]- + ode->initial_state[i])*interpolation+ + ode->initial_state[i]; + } + ode->t=t_desired; + } +ode_done: + ODEInternal2State(ode); + + //Convenience call to set vals + ODECallDerivative(ode,ode->t,ode->state_internal,ode->DstateDt); } + ode->base_t+=(1.0-ode->t_scale)*d; + ode=ode->next; + } - //Now, we will dynamically adjust tolerances. + //Now, we will dynamically adjust tolerances. - //We will regulate the tolerances - //to fill the time we decided was - //okay to devote to ODE's. - //Since we might have multiple ODE's - //active we scale them by the same factor. + //We will regulate the tolerances + //to fill the time we decided was + //okay to devote to ODE's. + //Since we might have multiple ODE's + //active we scale them by the same factor. - //This algorithm is probably not stable or very good, but it's something. + //This algorithm is probably not stable or very good, but it's something. - //Target is 75% of allocated time. - d=(tS-start_time)/(timeout_time-start_time)-0.75; + //Target is 75% of alloced time. + d=(tS-start_time)/(timeout_time-start_time)-0.75; - ode=task->next_ode; - while (ode!=&task->next_ode) { - if (ode->ode_signature==ODE_SIGNATURE_VAL && - !(ode->flags&ODEF_PAUSED) && ode->derivative) { - if (ode->min_tolerance!=ode->max_tolerance) { - if (d>0) - ode->tolerance_internal*=10.0`d; - else - ode->tolerance_internal*=2.0`d; - } - ode->tolerance_internal=Clamp(ode->tolerance_internal,ode->min_tolerance,ode->max_tolerance); + ode=task->next_ode; + while (ode!=&task->next_ode) { + if (!(ode->flags&ODEF_PAUSED) && ode->derivative) { + if (ode->min_tolerance!=ode->max_tolerance) { + if (d>0) + ode->tolerance_internal*=10.0`d; + else + ode->tolerance_internal*=2.0`d; } - ode=ode->next; + ode->tolerance_internal=Clamp(ode->tolerance_internal,ode->min_tolerance,ode->max_tolerance); } - winmgr.ode_time+=task->last_ode_time=tS-start_time; - //See $LK,"GrUpdateWins",A="MN:GrUpdateWins"$() - if (task!=Fs) - Suspend(task,old_suspend); + ode=ode->next; } + winmgr.ode_time+=task->last_ode_time=tS-start_time; + //See $LK,"GrUpdateWins",A="MN:GrUpdateWins"$() + if (task!=Fs) + Suspend(task,old_suspend); } } diff --git a/Adam/AUtils.CPP b/Adam/AUtils.CPP new file mode 100644 index 0000000..fbb75d5 --- /dev/null +++ b/Adam/AUtils.CPP @@ -0,0 +1,211 @@ +#help_index "Memory/Task" +public I64 TaskMemAlloced(CTask *task=NULL,Bool override_validate=FALSE) +{//Count of bytes alloced to a task, used+unused. + I64 result; + if (!task) task=Fs; + if (override_validate || TaskValidate(task)) { + result=task->code_heap->alloced_u8s; + if (task->code_heap!=task->data_heap) + result+=task->data_heap->alloced_u8s; + return result; + } else + return 0; +} + +public I64 TaskMemUsed(CTask *task=NULL,Bool override_validate=FALSE) +{//Count of bytes alloced to a task and in use. + I64 result; + if (!task) task=Fs; + if (override_validate || TaskValidate(task)) { + result=task->code_heap->used_u8s; + if (task->data_heap!=task->code_heap) + result+=task->data_heap->used_u8s; + return result; + } else + return 0; +} + +public Bool HeapRep(CTask *task) +{//Report status of task's heap. + I64 i,cnt; + CMemUnused *uum; + + if (!task || task==Fs) { + "Task can't HeapRep on self.\n"; + return FALSE; + } + if (!TaskValidate(task)) return FALSE; + + PUSHFD + CLI + while (LBts(&task->code_heap->locked_flags,HClf_LOCKED)) + PAUSE + if (task->data_heap!=task->code_heap) + while (LBts(&task->data_heap->locked_flags,HClf_LOCKED)) + PAUSE + + for (i=0;i>3;i++) { + cnt=0; + uum=task->code_heap->heap_hash[i]; + while (uum) { + cnt+=uum->size; + uum=uum->next; + } + if (task->data_heap!=task->code_heap) { + uum=task->data_heap->heap_hash[i]; + while (uum) { + cnt+=uum->size; + uum=uum->next; + } + } + if (cnt) + "%03X:%08X\n",i<<3,cnt; + } + '\n'; + + uum=task->code_heap->malloc_free_lst; + while (uum) { + "%X, ",uum->size; + uum=uum->next; + } + if (task->data_heap!=task->code_heap) { + uum=task->data_heap->malloc_free_lst; + while (uum) { + "%X, ",uum->size; + uum=uum->next; + } + } + + if (task->data_heap!=task->code_heap) + LBtr(&task->data_heap->locked_flags,HClf_LOCKED); + LBtr(&task->code_heap->locked_flags,HClf_LOCKED); + POPFD + + '\n'; +} + +#help_index "Memory/HeapCtrl;Debugging/Heap" +public Bool IsInHeapCtrl(U8 *a,CHeapCtrl *hc,Bool lock=TRUE) +{//Check addr if on heap. + CMemBlk *m; + PUSHFD + CLI + if (lock) + while (LBts(&hc->locked_flags,HClf_LOCKED)) + PAUSE + m=hc->next_mem_blk; + while (m!=&hc->next_mem_blk) { + if (a>=m && apages*PAGE_SIZE) { + if (lock) + LBtr(&hc->locked_flags,HClf_LOCKED); + POPFD + return TRUE; + } + m=m->next; + } + if (lock) + LBtr(&hc->locked_flags,HClf_LOCKED); + POPFD + return FALSE; +} + +public Bool HeapCtrlWalk(CHeapCtrl *hc) +{//Check integrity of HeapCtrl. + I64 i; + CMemUnused *uum; + + PUSHFD + CLI + while (LBts(&hc->locked_flags,HClf_LOCKED)) + PAUSE + + for (i=0;i>3;i++) { + uum=hc->heap_hash[i]; + while (uum) { + if (!IsInHeapCtrl(uum,hc,FALSE)) + goto hc_false; + uum=uum->next; + } + } + uum=hc->malloc_free_lst; + while (uum) { + if (!IsInHeapCtrl(uum,hc,FALSE)) + goto hc_false; + uum=uum->next; + } + +#if _CFG_HEAP_DBG + CMemUsed *um,*um1; + um1=(&hc->next_um)(U8 *)-offset(CMemUsed.next); + um=um1->next; + while (um!=um1) { + if (!IsInHeapCtrl(um,hc,FALSE)) + goto hc_false; + um=um->next; + } +#endif + + LBtr(&hc->locked_flags,HClf_LOCKED); + POPFD + return TRUE; + +hc_false: + LBtr(&hc->locked_flags,HClf_LOCKED); + POPFD + return FALSE; +} + +#help_index "Memory/Task;Debugging/Heap" +public Bool IsInHeap(U8 *a,CTask *task=NULL,Bool lock=TRUE) +{//Check addr if on heap. + if (!task) task=Fs; + if (TaskValidate(task) && (IsInHeapCtrl(a,task->code_heap,lock)|| + task->data_heap!=task->code_heap && IsInHeapCtrl(a,task->data_heap,lock))) + return TRUE; + else + return FALSE; +} + +public Bool HeapWalk(CTask *task=NULL) +{//Check integrity of task's heaps. + if (!task) task=Fs; + if (!TaskValidate(task) || !HeapCtrlWalk(task->code_heap) || + task->data_heap!=task->code_heap && !HeapCtrlWalk(task->data_heap)) + return FALSE; + else + return TRUE; +} + +#help_index "Info;Task" +U0 TaskRepTask(CTask *task,I64 indent) +{ + CTask *task1; + U8 *st,*desc=MStrUtil(task->task_title,SUF_SAFE_DOLLAR); + st=MStrPrint("$$MA,T=\"%08X\",LM=\"Kill(0x%X);\n\",$$",task,task,task); + "%h*c%s $$TX,\"%Q...\",SCX=16$$ Mem:%08X\n",indent,CH_SPACE, + st,desc,TaskMemAlloced(task); + "%h*cFlags:%04X:%04X Time:%0.2fm\n",indent+2,CH_SPACE, + task->task_flags,task->display_flags, + task->total_time/60.0/cnts.time_stamp_freq_initial; + Free(st); + Free(desc); + task1=task->next_child_task; + while (task1!=(&task->next_child_task)(U8 *)-offset(CTask.next_sibling_task)) { + TaskRepTask(task1,indent+2); + task1=task1->next_sibling_task; + } +} + +public U0 TaskRep() +{//Report current tasks on all cores. + I64 i; + CCPU *c; + PUSHFD + CLI + for (i=0;iseth_task,2); + } + POPFD +} diff --git a/Adam/LogIn.CPP b/Adam/Acct.CPP similarity index 61% rename from Adam/LogIn.CPP rename to Adam/Acct.CPP index 3640113..854ecb3 100644 --- a/Adam/LogIn.CPP +++ b/Adam/Acct.CPP @@ -1,66 +1,5 @@ #help_index "Misc/Accts" - -U0 UserStartUp() -{//Temporary until defined in $LK,"HOME/Adam3eSys.CPP"$. -//Run each time a user a spawned - DocTermNew; - Type("::/Doc/Start.TXT"); - LBts(&Fs->display_flags,DISPLAYf_SHOW); - WinToTop; - WinZBufUpdate; - Preempt(ON); -} - -U0 SrvStartUp() -{//Temporary until defined in $LK,"HOME/Adam3eSys.CPP"$. -//Run each time a srv task is spawned. - DocTermNew; - LBts(&Fs->display_flags,DISPLAYf_SHOW); - WinToTop; - WinZBufUpdate; - Preempt(ON); -} - -U8 *PopUpSysAcct() -{ - U8 *result,*st; - CDoc *doc=DocNew; - CDirEntry *tempde=FilesFind("/Accts/*",FUF_RECURSE|FUF_JUST_DIRS|FUF_FLATTEN_TREE), - *tempde1=tempde; - DocPrint(doc,"$$CM+CX-LE,10$$"); - DocSprite(doc,$IB,"<1>",BI=1,BP="::/Misc/StockSprites.TXT,TempleOSLogo"$,"$$SP+SIF,\"\",BI=%d$$"); - DocPrint(doc,"$$CM+LX,0,12$$Select Account.\nCursor down and press .\n"); - while (tempde) { - if (*tempde->name!='.') { - st=tempde->full_name; - if (!StrNCmp(st+2,"/Accts/",7)) - st+=9; - DocPrint(doc,"$$CM+LX,2,3$$$$BT,\"%s\",LE=%d$$",st,tempde); - } - tempde=tempde->next; - } - DocPrint(doc,"\n\n\n\nLog-in as USER if you are new and get familiar\n" - "before you try to install.\n"); - do tempde=PopUpMenu(doc,DOF_WIN_MAX); - while (tempde<=0); - - DocDel(doc); - result=AStrNew(tempde->full_name); - DirTreeDel(tempde1); - return result; -} - -U0 SysLogin() -{ - U8 *st; - if (!FileFind(sys_acct)||!StrCmp(sys_acct+2,"/Accts")) { - st=sys_acct; - sys_acct=PopUpSysAcct; - Free(st); - } -} - -#define ACCT_REGISTRY_FILENAME "HOME/Registry.CPP.Z" +#define ACCT_REGISTRY_FILENAME "::/Home/Registry.CPP.Z" CDoc *sys_registry_doc=NULL; I64 sys_msg_flags[1]={0}; F64 registry_version; @@ -69,7 +8,7 @@ Bool AcctCacheRegistry() { Bool old_silent; if (!sys_registry_doc) { - old_silent=Silent(ON); + old_silent=Silent; sys_registry_doc=DocRead(ACCT_REGISTRY_FILENAME); Silent(old_silent); return FALSE; @@ -91,7 +30,7 @@ public Bool AcctRegSetDftEntry(U8 *path,U8 *val,Bool is_adam_entry=FALSE) else Adam("%s",val); } - if (IsDrvWritable(*sys_acct)) + if (IsDrvWritable(':')) DocWrite(sys_registry_doc); result=FALSE; } else @@ -118,7 +57,7 @@ public Bool AcctRegWriteBranch(U8 *path,U8 *fmt,...) DocCut(sys_registry_doc,tree_branch,end_indent); DocTreeMake(sys_registry_doc,path); DocPrint(sys_registry_doc,"%s",buf); - if (IsDrvWritable(*sys_acct)) + if (IsDrvWritable(':')) DocWrite(sys_registry_doc); if (unlock_doc) DocUnlock(sys_registry_doc); @@ -147,8 +86,7 @@ public Bool OneTimePopUp(U8 *_flags,I64 flag_num,U8 *msg) U0 AcctOneTimePopUp(I64 flag_num,U8 *msg) {//You're not supposed to make system pop-up flags, only me. if (OneTimePopUp(sys_msg_flags,flag_num,msg)) - AcctRegWriteBranch("Adam/SysMsgFlags", - "sys_msg_flags[0]=0x%X;\n", + AcctRegWriteBranch("Adam/SysMsgFlags","sys_msg_flags[0]=0x%X;\n", sys_msg_flags[0]); } diff --git a/Adam/Adam2.CPP b/Adam/Adam2.CPP deleted file mode 100644 index 1124682..0000000 --- a/Adam/Adam2.CPP +++ /dev/null @@ -1,80 +0,0 @@ -#exe {OptOn(OPTf_WARN_PAREN);}; -#exe {OptOn(OPTf_WARN_DUP_TYPES);}; - -HashTablePurge(adam_task->hash_table); - -#help_index "Misc" - -//Use Dbg("Type 'G;'"); to debug before window mgr is running. - -public F64 os_version=2.11;//Operating system version. -//Fix here, too: $LK,"::/Demo/AcctExample/DbgAdam2.CPP"$ - -#include "AdamExts.HPP" -#include "Math2a" -#include "Training" -#include "Utils2a" -#include "MathODE" -Cd("::/Adam/Gr");; -#include "Gr" - -Cd("::/Adam/Snd");; -#include "Snd" - -Cd("::/Adam/Dsk");; -#include "Dsk2" - -Cd("::/Adam");; -#include "Menu" -#include "Win2a" -#include "Win2b" -#include "Dbg2a" - -#include "::/Adam/God/GodExt" - -Cd("::/Adam/DolDoc");; -#include "Doc" -LBts(&sys_run_level,RLf_DOC); - -Cd("::/Adam/Ctrls");; -#include "Ctrls" - -Cd("::/Adam");; -#include "AutoFile2a" -#include "LogIn" - -Cd("::/Adam/WordStat");; -#include "WordStat" - -Cd("::/Adam/God");; -#include "God" - -Cd("::/Adam");; -#include "Hash2a" -#include "TaskSettings" -#include "DevInfo" -#include "DocDefines" - -//Dbg("Type 'G;'"); - -DocTermNew; -SetWinVert(2,10); - -sys_winmgr_task=Spawn(&WinMgrTask,NULL,"Window Mgr"); -Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_BORDER-WIF_SELF_GRAB_SCROLL-WIF_SELF_CTRLS; -LBts(&Fs->display_flags,DISPLAYf_CHILDREN_NOT_ON_TOP); -LBts(&Fs->display_flags,DISPLAYf_SHOW); -SysLogin; -LBts(&sys_run_level,RLf_LOGIN); -RegistryInit; -LBts(&sys_run_level,RLf_REGISTRY); - -Cd("::/Adam");; -#include "WallPaper" -#exe {OptOff(OPTf_WARN_PAREN);}; -#exe {OptOff(OPTf_WARN_DUP_TYPES);}; -LBts(&sys_run_level,RLf_ADAM2); - -#help_index "" -Cd("HOME");; -#include "Adam3" diff --git a/Adam/WordStat/WSDefs.DAT b/Adam/AutoComplete/ACDefs.DAT similarity index 100% rename from Adam/WordStat/WSDefs.DAT rename to Adam/AutoComplete/ACDefs.DAT diff --git a/Adam/WordStat/WSDict.CPP b/Adam/AutoComplete/ACDict.CPP similarity index 55% rename from Adam/WordStat/WSDict.CPP rename to Adam/AutoComplete/ACDict.CPP index 5fa791b..be34187 100644 --- a/Adam/WordStat/WSDict.CPP +++ b/Adam/AutoComplete/ACDict.CPP @@ -1,21 +1,21 @@ -#help_index "WordStat/Dictionary" +#help_index "AutoComplete/Dictionary" -public U0 WSDWordsLoad() +public U0 ACDWordsLoad() {//Put words from word list into hash table. I64 size; CHashGeneric *temph; U8 *in_ptr,*in_start,*st2; U16 *d; - wsd.num_words=0; - if (in_ptr=FileRead(WSD_WORD_FILENAME,&size)) { + acd.num_words=0; + if (in_ptr=FileRead(ACD_WORD_FILENAME,&size)) { in_start=in_ptr; - Free(wsd.word_lst); - wsd.word_lst=AMAlloc(size); - MemCpy(wsd.word_lst,in_start,size); - wsd.word_lst_size=size; + Free(acd.word_lst); + acd.word_lst=AMAlloc(size); + MemCpy(acd.word_lst,in_start,size); + acd.word_lst_size=size; while (in_ptruser_data0=*d; in_ptr+=2; - HashAdd(temph,ws.hash_table); - wsd.num_words++; + HashAdd(temph,ac.hash_table); + acd.num_words++; } else in_ptr+=3; } @@ -38,29 +38,29 @@ public U0 WSDWordsLoad() } } -public U8 *WSDDefGet(U8 *st,I64 def_num=1) +public U8 *ACDDefGet(U8 *st,I64 def_num=1) {//MAlloc str holding single dict definition of word. CFile *f; CHashGeneric *temph; U8 *result=NULL,*buf,*in_ptr, *st2=MStrUtil(st,SUF_TO_UPPER); - temph=HashFind(st2,ws.hash_table,HTT_DICT_WORD); + temph=HashFind(st2,ac.hash_table,HTT_DICT_WORD); Free(st2); if (temph) { - if (f=FOpen(WSD_DEF_FILENAME,"r")) { - buf=MAlloc(WSD_BLK_SIZE*2+1); - buf[WSD_BLK_SIZE*2]=0; //terminate - FRBlks(f,buf,temph->user_data0*WSD_BLK_SIZE/BLK_SIZE,WSD_BLK_SIZE*2/BLK_SIZE); + if (f=FOpen(ACD_DEF_FILENAME,"r")) { + buf=MAlloc(ACD_BLK_SIZE*2+1); + buf[ACD_BLK_SIZE*2]=0; //terminate + FRBlks(f,buf,temph->user_data0*ACD_BLK_SIZE/BLK_SIZE,ACD_BLK_SIZE*2/BLK_SIZE); FClose(f); in_ptr=buf; - while (in_ptruser_data0*WSD_BLK_SIZE/BLK_SIZE,WSD_BLK_SIZE*2/BLK_SIZE); + if (f=FOpen(ACD_DEF_FILENAME,"r")) { + buf=MAlloc(ACD_BLK_SIZE*2+1); + buf[ACD_BLK_SIZE*2]=0; //terminate + FRBlks(f,buf,temph->user_data0*ACD_BLK_SIZE/BLK_SIZE,ACD_BLK_SIZE*2/BLK_SIZE); FClose(f); in_ptr=buf; - while (in_ptr>1; while (TRUE) { - while (*r!=WSD_WORD_CHAR && r>wsd.word_lst) + while (*r!=ACD_WORD_CHAR && r>acd.word_lst) r--; - if ((r[2]==WSD_WORD_CHAR||r[1]==WSD_WORD_CHAR)&&r-3>wsd.word_lst) + if ((r[2]==ACD_WORD_CHAR||r[1]==ACD_WORD_CHAR)&&r-3>acd.word_lst) r--; else break; } - if (*r==WSD_WORD_CHAR) { + if (*r==ACD_WORD_CHAR) { i=StrICmp(st,r+1); if (i<0) end=r-1; @@ -156,80 +156,78 @@ public U8 *WSDWordPtAt(U8 *st) } r=(start+end)>>1; while (TRUE) { - while (*r!=WSD_WORD_CHAR && r>wsd.word_lst) + while (*r!=ACD_WORD_CHAR && r>acd.word_lst) r--; - if ((r[2]==WSD_WORD_CHAR||r[1]==WSD_WORD_CHAR)&&r-3>wsd.word_lst) + if ((r[2]==ACD_WORD_CHAR||r[1]==ACD_WORD_CHAR)&&r-3>acd.word_lst) r--; else break; } - if (*r==WSD_WORD_CHAR && StrICmp(st,r+1)>0) + if (*r==ACD_WORD_CHAR && StrICmp(st,r+1)>0) r+=StrLen(r)+3; } - if (*r==WSD_WORD_CHAR) + if (*r==ACD_WORD_CHAR) return r; else - return wsd.word_lst; + return acd.word_lst; } -U0 WSDDictWordsAdd(CDoc *doc,U8 *st=NULL) +U0 ACDDictWordsAdd(CDoc *doc,U8 *st) { I64 i; U8 *ptr; - if (!st) - st=ws.cur_word; - if (st && (ptr=WSDWordPtAt(st))) { - for (i=0;iws.partial_len) - Auto(s+ws.partial_len); + if (len>ac.partial_len) + Auto(s+ac.partial_len); } } -public U0 WSDDefsPut(CDoc *doc=NULL,U8 *st,I64 num=-1) +public U0 ACDDefsPut(CDoc *doc=NULL,U8 *st,I64 num=-1) {//Put to doc a dictionary definition(s) of a word. U8 *st2,*st3; I64 ch,i=0; if (!st) return; - if (*st==WSD_WORD_CHAR) + if (*st==ACD_WORD_CHAR) st++; DocPrint(doc,"$$WW,1$$$$RED$$%s:$$FG$$\n\n",st); if (num<0) { - if (st3=WSDDefsGet(st)) { + if (st3=ACDDefsGet(st)) { st2=st3; while (ch=*st2++) { switch (ch) { - case WSD_WORD_CHAR: + case ACD_WORD_CHAR: break; - case WSD_DEF_CHAR: + case ACD_DEF_CHAR: DocPrint(doc,"$$GREEN$$(%d)$$FG$$ %s\n", ++i,st2); break; - case WSD_PRONUNCIATION_CHAR: + case ACD_PRONUNCIATION_CHAR: DocPrint(doc,"$$LTGREEN$$%s$$FG$$\n",st2); break; - case WSD_POS_CHAR: + case ACD_POS_CHAR: DocPrint(doc,"$$BLACK$$%s$$FG$$\n",st2); break; - case WSD_EXTRA_CHAR: + case ACD_EXTRA_CHAR: DocPrint(doc,"$$LTBLUE$$%s$$FG$$\n",st2); break; } @@ -238,7 +236,7 @@ public U0 WSDDefsPut(CDoc *doc=NULL,U8 *st,I64 num=-1) Free(st3); } } else { - while (st2=WSDDefGet(st,++i)) { + while (st2=ACDDefGet(st,++i)) { if (i==num) DocPrint(doc,"$$GREEN$$(%d)$$FG$$ %s\n", i,st2); @@ -247,21 +245,21 @@ public U0 WSDDefsPut(CDoc *doc=NULL,U8 *st,I64 num=-1) } } -U0 WSDPopUpDef(U8 *st,I64 num=-1,CTask *parent=NULL) +U0 ACDPopUpDef(U8 *st,I64 num=-1,CTask *parent=NULL) { U8 *buf; - buf=MStrPrint("WSDDefsPut(DocPut,\"%s\",%d);View;",st,num); + buf=MStrPrint("ACDDefsPut(DocPut,\"%s\",%d);View;",st,num); PopUp(buf,parent); Free(buf); } -U0 WSDDef(I64 n,CTask *parent=NULL) +U0 ACDDef(I64 n,CTask *parent=NULL) { - if (0<=ncur_entry; @@ -277,7 +275,7 @@ U0 WSFindMisspelled(CDoc *doc) col2++; ch=doc_e->tag[col2]; doc_e->tag[col2]=0; - if (StrICmp(&doc_e->tag[col],WSDWordPtAt(&doc_e->tag[col])+1)) { + if (StrICmp(&doc_e->tag[col],ACDWordPtAt(&doc_e->tag[col])+1)) { doc_e->tag[col2]=ch; doc->cur_entry=doc_e; doc->cur_data_col=col; diff --git a/Adam/WordStat/WSDictGen.CPP b/Adam/AutoComplete/ACDictGen.CPP similarity index 68% rename from Adam/WordStat/WSDictGen.CPP rename to Adam/AutoComplete/ACDictGen.CPP index 41c7acb..3436594 100644 --- a/Adam/WordStat/WSDictGen.CPP +++ b/Adam/AutoComplete/ACDictGen.CPP @@ -10,10 +10,10 @@ and #include this file. I ran $LK,"::/Misc/ToDolDoc.CPP"$ on it, first. -See $LK,"::/Doc/Acknowledgements.TXT"$. +See $LK,"::/Doc/Credits.TXT"$. */ -I64 WSDNextCmd(U8 **_ptr) +I64 ACDNextCmd(U8 **_ptr) { U8 ch,*ptr=*_ptr,*ptr2; I64 result=-1; @@ -39,9 +39,9 @@ ncmd_done: return result; } -U8 *WSDNextEntry(U8 **_ptr) +U8 *ACDNextEntry(U8 **_ptr) { - U8 *result,*ignore,ch,*ptr=*_ptr,buf[WSD_BLK_SIZE],*out_ptr=buf; + U8 *result,*ignore,ch,*ptr=*_ptr,buf[ACD_BLK_SIZE],*out_ptr=buf; I64 l; while (TRUE) { while (TRUE) { @@ -53,7 +53,7 @@ U8 *WSDNextEntry(U8 **_ptr) } else break; } - ignore="b>\0i>\0p>\0/b>\0/i>\0/p>\0" + ignore="b>\0i>\0ppp>\0/b>\0/i>\0/p>\0" "ets>\0col>\0spn>\0/ets>\0/col>\0/spn>\0er>\0as>\0cs>\0cd>\0ex>\0" "/er>\0/as>\0/cs>\0/cd>\0/ex>\0" "note>\0/note>\0blockquote>\0/blockquote>\0"; @@ -75,12 +75,12 @@ nentry_done: return result; } -I64 WSDCompareWords(U8 *e1,U8 *e2) +I64 ACDCompareWords(U8 *e1,U8 *e2) { return StrICmp(e1,e2); } -U8 *WSDSortWords(U8 *start,I64 size,I64 word_cnt) +U8 *ACDSortWords(U8 *start,I64 size,I64 word_cnt) { U8 **ptr_array=MAlloc(sizeof(U8 *)*word_cnt), *out_start=MAlloc(size), @@ -91,7 +91,7 @@ U8 *WSDSortWords(U8 *start,I64 size,I64 word_cnt) ptr+=StrLen(ptr)+3; } "Sorting...\n"; Sleep(100); - QSortI64(ptr_array,word_cnt,&WSDCompareWords); + QSortI64(ptr_array,word_cnt,&ACDCompareWords); "Done...\n"; Sleep(100); ptr=out_start; @@ -107,7 +107,7 @@ U8 *WSDSortWords(U8 *start,I64 size,I64 word_cnt) return out_start; } -U0 WSDGen(U8 *raw_dict_filename) +U0 ACDGen(U8 *raw_dict_filename) { I64 cmd,size,word_cnt=0,largest_entry=0; U8 *st,*in_ptr=FileRead(raw_dict_filename,&size),*in_start=in_ptr, @@ -118,27 +118,27 @@ U0 WSDGen(U8 *raw_dict_filename) U16 *d; if (!in_ptr) return; do { - cmd=WSDNextCmd(&in_ptr); - if (cmd==WSD_H1) { + cmd=ACDNextCmd(&in_ptr); + if (cmd==ACD_H1) { next_word: if (out_ptr-def_word_start>largest_entry) largest_entry=out_ptr-def_word_start; def_word_start=out_ptr; - if (st=WSDNextEntry(&in_ptr)) { + if (st=ACDNextEntry(&in_ptr)) { if (*st) { if (StrICmp(st,last_word)) { word_cnt++; - *word_ptr++=WSD_WORD_CHAR; + *word_ptr++=ACD_WORD_CHAR; last_word=word_ptr; StrCpy(word_ptr,st); word_ptr+=StrLen(st)+1; d=word_ptr; - *d=(out_ptr-out_start)/WSD_BLK_SIZE; + *d=(out_ptr-out_start)/ACD_BLK_SIZE; word_ptr+=2; - *out_ptr++=WSD_WORD_CHAR; + *out_ptr++=ACD_WORD_CHAR; StrCpy(out_ptr,st); out_ptr+=StrLen(st)+1; } @@ -146,68 +146,68 @@ next_word: do { do { - cmd=WSDNextCmd(&in_ptr); - if (cmd==WSD_H1) + cmd=ACDNextCmd(&in_ptr); + if (cmd==ACD_H1) goto next_word; - } while (cmd>=0 && !(cmd==WSD_DEF||cmd==WSD_PRONUNCIATION||cmd==WSD_POS||cmd==WSD_EXTRA)); - if (cmd==WSD_DEF) { - if(st=WSDNextEntry(&in_ptr)) { + } while (cmd>=0 && !(cmd==ACD_DEF||cmd==ACD_PRONUNCIATION||cmd==ACD_POS||cmd==ACD_EXTRA)); + if (cmd==ACD_DEF) { + if(st=ACDNextEntry(&in_ptr)) { if (*st) { - *out_ptr++=WSD_DEF_CHAR; + *out_ptr++=ACD_DEF_CHAR; StrCpy(out_ptr,st); out_ptr+=StrLen(st)+1; } Free(st); } - } else if (cmd==WSD_PRONUNCIATION) { - if(st=WSDNextEntry(&in_ptr)) { + } else if (cmd==ACD_PRONUNCIATION) { + if(st=ACDNextEntry(&in_ptr)) { if (*st) { - *out_ptr++=WSD_PRONUNCIATION_CHAR; + *out_ptr++=ACD_PRONUNCIATION_CHAR; StrCpy(out_ptr,st); out_ptr+=StrLen(st)+1; } Free(st); } - } else if (cmd==WSD_POS) { - if(st=WSDNextEntry(&in_ptr)) { + } else if (cmd==ACD_POS) { + if(st=ACDNextEntry(&in_ptr)) { if (*st) { - *out_ptr++=WSD_POS_CHAR; + *out_ptr++=ACD_POS_CHAR; StrCpy(out_ptr,st); out_ptr+=StrLen(st)+1; } Free(st); } - } else if (cmd==WSD_EXTRA) { - if(st=WSDNextEntry(&in_ptr)) { + } else if (cmd==ACD_EXTRA) { + if(st=ACDNextEntry(&in_ptr)) { if (*st) { - *out_ptr++=WSD_EXTRA_CHAR; + *out_ptr++=ACD_EXTRA_CHAR; StrCpy(out_ptr,st); out_ptr+=StrLen(st)+1; } Free(st); } } - } while (cmd==WSD_DEF||cmd==WSD_PRONUNCIATION||cmd==WSD_POS||cmd==WSD_EXTRA); + } while (cmd==ACD_DEF||cmd==ACD_PRONUNCIATION||cmd==ACD_POS||cmd==ACD_EXTRA); } else Free(st); } } } while (cmd>=0); - *out_ptr++=WSD_END_CHAR; - *word_ptr++=WSD_END_CHAR; + *out_ptr++=ACD_END_CHAR; + *word_ptr++=ACD_END_CHAR; Free(in_start); - "Blk Size :%d\n",WSD_BLK_SIZE; - "Blk Cnt :%04X\n",(out_ptr-out_start+WSD_BLK_SIZE-1)/WSD_BLK_SIZE; + "Blk Size :%d\n",ACD_BLK_SIZE; + "Blk Cnt :%04X\n",(out_ptr-out_start+ACD_BLK_SIZE-1)/ACD_BLK_SIZE; "Largest Entry :%d\n",largest_entry; "Word Count :%d\n",word_cnt; - FileWrite(WSD_DEF_FILENAME,out_start,out_ptr-out_start); + FileWrite(ACD_DEF_FILENAME,out_start,out_ptr-out_start); "Def File Size :%d\n",out_ptr-out_start; - sorted_word_start=WSDSortWords(word_start,word_ptr-word_start,word_cnt); - FileWrite(WSD_WORD_FILENAME,sorted_word_start,word_ptr-word_start); + sorted_word_start=ACDSortWords(word_start,word_ptr-word_start,word_cnt); + FileWrite(ACD_WORD_FILENAME,sorted_word_start,word_ptr-word_start); "Word File Size:%d\n",word_ptr-word_start; Free(out_start); @@ -215,4 +215,4 @@ next_word: Free(sorted_word_start); } -WSDGen("DICTIONARY.TXT"); +ACDGen("DICTIONARY.TXT"); diff --git a/Adam/AutoComplete/ACMain.CPP b/Adam/AutoComplete/ACMain.CPP new file mode 100644 index 0000000..5533d40 --- /dev/null +++ b/Adam/AutoComplete/ACMain.CPP @@ -0,0 +1,342 @@ +#help_index "AutoComplete" + +CHashAC *ACHashAdd(U8 *w) +{ + CHashAC *tempw=HashFind(w,ac.hash_table,HTT_WORD); + if (tempw) { + tempw->hits++; + return tempw; + } + tempw=ACAlloc(sizeof(CHashAC)); + tempw->str=AStrNew(w); + tempw->type=HTT_WORD; + tempw->use_cnt=1; + tempw->hits=1; + HashAdd(tempw,ac.hash_table); + ac.num_words++; + return tempw; +} + +U0 ACSingleFileAdd(U8 *buf) +{ + I64 ch; + U8 *ptr=buf,*ptr2,*ptr3; + while (TRUE) { + while (TRUE) { + if (ch=*ptr++) { + if (Bt(chars_bitmap_alpha_numeric,ch)) + break; + } else + return; + } + ptr3=ptr; + ptr2=ptr; + ptr--; + while (TRUE) { + if (ch=*ptr2++) { + if (Bt(chars_bitmap_alpha_numeric,ch)) + *ptr3++=ch; + else if (ch!=CH_CURSOR) + break; + } else { + ptr2--; + break; + } + } + *ptr3=0; + ACHashAdd(ptr); + ptr=ptr2; + } +} + +I64 ACSkipCrap(U8 *src,I64 len) +{ + I64 j; + j=len-1; + while (j>=0) { + if (Bt(chars_bitmap_alpha_numeric,src[j])) + break; + else + j--; + } + return j+1; +} + +I64 ACPriorWordInStr(U8 *src,U8 *dst,I64 len,I64 buf_size) +{ + I64 i,j=0,k; + i=len-1; + while (i>=0) + if (!Bt(chars_bitmap_alpha_numeric,src[i])) + break; + else + i--; + if (i>=-1 && len>0) + for (k=i+1;kstr; + if (StrLen(s)>ac.partial_len) + Auto(s+ac.partial_len); + } +} + +U0 ACMan(I64 n,CTask *parent_task=NULL) +{ + CHashAC *tempw; + CHashSrcSym *temph; + Bool old_preempt=Preempt(OFF); + if (0<=--nstr,Fs->hash_table,HTG_SRC_SYM)) && + temph->src_link) { + Preempt(old_preempt); + PopUpEd(temph->src_link,parent_task); + } + Preempt(old_preempt); +} + +U0 ACFillInAdd(CHashAC *tempw) +{ + I64 k; + if (ac.num_fillinshits>ac.fillin_hits[ac.num_fillins-1]) { + for (k=ac.num_fillins-1;k>=0;k--) { + if (tempw->hits<=ac.fillin_hits[k]) + break; + else { + ac.fillin_matches[k+1]=ac.fillin_matches[k]; + ac.fillin_hits[k+1] =ac.fillin_hits[k]; + } + } + ac.fillin_matches[k+1]=tempw; + ac.fillin_hits[k+1] =tempw->hits; + if (ac.num_fillinsmask;i++) { + tempw=ac.hash_table->body[i]; + while (tempw && tSstr,StrLen(ac.cur_word))) + ACFillInAdd(tempw); + tempw=tempw->next; + } + } + Preempt(OFF); + } + DocRst(doc,TRUE); + doc->flags|=DOCF_MIN_SIZE; + DocCursor; + Fs->border_src=BDS_CONST; + Fs->text_attr =Fs->border_attr=LTGRAY<<4+BLUE; + if (ac.cur_word && *ac.cur_word) { + DocPrint(doc,"$$PURPLE$$Word:%s$$FG$$\n",ac.cur_word); + for (i=0;istr; + DocPrint(doc,"$$GREEN$$F%02d$$FG$$ ",i+1); + if (TaskValidate(focus_task) && + (temph=HashFind(st,focus_task->hash_table,HTG_SRC_SYM)) && + temph->src_link) { + if (temph->type&HTF_PUBLIC) + DocPrint(doc,"$$RED$$"); + DocPrint(doc,"$$TX+UL+L+PU,\"%Q\",A=\"%s\"$$$$FG$$\n",st,temph->src_link); + } else + DocPrint(doc,"%s\n",st); + } + if (acd.has_words) + ACDDictWordsAdd(doc,ac.cur_word); + } else if (FileFind("::/Doc/StandBy.TXT.Z")) + DocType(doc,"::/Doc/StandBy.TXT.Z",0); + + DocRecalc(doc); + } + + if (!LBts(&Fs->display_flags,DISPLAYf_SHOW)) + WinZBufUpdate; + + Free(src); + Free(buf); + Free(buf1); +} + +U0 ACTask(I64) +{ + CTask *focus_task,*original_focus_task; + CDoc *doc; + CDocEntry *doc_e; + I64 ch; + DocTermNew; + WinHorz(51,Fs->win_right); + LBts(&Fs->display_flags,DISPLAYf_WIN_ON_TOP); + Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_BORDER-WIF_SELF_IP_L-WIF_SELF_IP_R-WIG_DBL_CLICK; + Free(ac.cur_word); + ac.cur_word=NULL; + while (TRUE) { + original_focus_task=focus_task=sys_focus_task; + while (TaskValidate(focus_task) && Bt(&focus_task->task_flags,TASKf_INPUT_FILTER_TASK)) + focus_task=focus_task->parent_task; + if (TaskValidate(focus_task) && (doc=DocPut(focus_task)) && + focus_task!=Fs && Bt(&focus_task->display_flags,DISPLAYf_SHOW)) { + DocLock(doc); + if (TaskValidate(focus_task) && original_focus_task==sys_focus_task && + doc && doc==DocPut(focus_task) && (doc_e=doc->cur_entry)) { + if (doc_e==doc) doc_e=doc_e->last; + while (doc_e->last!=doc && (doc_e->type_u8==DOCT_NEW_LINE || + doc_e->type_u8==DOCT_SOFT_NEW_LINE)) + doc_e=doc_e->last; + while (doc_e->last->type_u8!=DOCT_NEW_LINE && doc_e->last!=doc) + doc_e=doc_e->last; + ACPutChoices(doc,doc_e,focus_task); + } else + DocUnlock(doc); + } + Sleep(333); + if (ScanMsg(&ch,,1<cur_entry->de_flags & DOCEF_LINK) { + '' CH_SPACE; + doc->cur_entry=doc; + } + DocUnlock(doc); + } + ac.task=NULL; +} + +U0 ACMainFileLstTraverse(U8 *files_find_mask) +{ + U8 *buf; + CDirEntry *tempde,*tempde1; + try { + tempde=tempde1=FilesFind(files_find_mask,FUF_RECURSE|FUF_JUST_TXT|FUF_JUST_FILES|FUF_CLUSTER_ORDER); + while (tempde) { + "%s\n",tempde->full_name; + buf=FileRead(tempde->full_name); + ACSingleFileAdd(buf); + Free(buf); + tempde=tempde->next; + } + } catch + Fs->catch_except=TRUE; + DirTreeDel(tempde1); +} + +public Bool AutoComplete(Bool val=OFF) +{//Turn AutoComplete OFF (or ON). + Bool old_autocomplete=FALSE, + old_preempt=Preempt(OFF); + if (val) { + while (Bt(&ac.flags,ACf_INIT_IN_PROGRESS)) + Sleep(10); + if (TaskValidate(ac.task)) + old_autocomplete=TRUE; + else { + ac.task=Spawn(&ACTask,NULL,"AutoComplete"); + TaskWait(ac.task); + } + WinToTop(ac.task); + } else { + if (TaskValidate(ac.task)) { + old_autocomplete=TRUE; + Kill(ac.task); + while (TaskValidate(ac.task)) + Yield; + ac.task=NULL; + } + } + Preempt(old_preempt); + return old_autocomplete; +} + +U0 ACProgressTask(Bool *_start_flag) +{ + I64 start=dsk.write_cnt; + progress1=0; + progress1_max=(Size(ACD_DEF_FILENAME_Z,"+x+s")+BLK_SIZE-1)>>BLK_SIZE_BITS; + StrCpy(progress1_desc,"Uncompressing Dictionary"); + start=dsk.write_cnt; + *_start_flag=TRUE; + while (progress1type!=BDT_RAM) { + start_flag=FALSE; + Spawn(&ACProgressTask,&start_flag); + while (!start_flag) + Yield; + } + Move(ACD_DEF_FILENAME_Z,ACD_DEF_FILENAME); + } + + HashTableDel(ac.hash_table); + ac.hash_table=HashTableNew(2048,adam_task); + + ac.num_words=0; + Free(ac.cur_word); + ac.cur_word=NULL; + + if (mask) + ACMainFileLstTraverse(mask); + + ACDWordsLoad; + LBtr(&ac.flags,ACf_INIT_IN_PROGRESS); + AutoComplete(ON); +} + +I64 AutoCompleteSize() +{ + if (ac.hash_table) + return HashTableSize2(ac.hash_table)+MSize2(acd.word_lst); + else + return 0; +} diff --git a/Adam/WordStat/WSWords.DAT b/Adam/AutoComplete/ACWords.DAT similarity index 100% rename from Adam/WordStat/WSWords.DAT rename to Adam/AutoComplete/ACWords.DAT diff --git a/Adam/AutoComplete/AutoComplete.CPP b/Adam/AutoComplete/AutoComplete.CPP new file mode 100644 index 0000000..08d53cd --- /dev/null +++ b/Adam/AutoComplete/AutoComplete.CPP @@ -0,0 +1,67 @@ +#help_index "AutoComplete" +#help_file "::/Doc/AutoComplete" + +//See $LK,"::/Doc/AutoComplete.TXT"$ + +#define ACf_INIT_IN_PROGRESS 0 + +#define AC_MAX_FILLINS 10 + +public class CAutoCompleteGlbls +{ + I64 num_words; + CHashTable *hash_table; + U8 *cur_word; + I64 flags; + CTask *task; + I64 partial_len,num_fillins, + fillin_hits [AC_MAX_FILLINS+1]; + CHashAC *fillin_matches[AC_MAX_FILLINS+1]; + +} ac={0,NULL,NULL,0,NULL,0,0, +{0,0,0,0,0,0,0,0,0,0,0}, +{NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}}; + +//Dictionary Stuff +#help_index "AutoComplete/Dictionary" + +#define ACD_WORD_FILENAME "/Adam/AutoComplete/ACWords.DAT.Z" +#define ACD_DEF_FILENAME "/Adam/AutoComplete/ACDefs.DAT" +#define ACD_DEF_FILENAME_Z "/Adam/AutoComplete/ACDefs.DAT.Z" + +#define ACD_H1 0 +#define ACD_H1_END 1 +#define ACD_DEF 2 +#define ACD_DEF_END 3 +#define ACD_PRONUNCIATION 4 +#define ACD_PRONUNCIATION_END 5 +#define ACD_POS 6 +#define ACD_POS_END 7 +#define ACD_EXTRA 8 +#define ACD_EXTRA_END 9 +#define ACD_BLK_SIZE 0x4000 + +#define ACD_END_CHAR 0x00 +#define ACD_WORD_CHAR 0x01 +#define ACD_DEF_CHAR 0x02 +#define ACD_PRONUNCIATION_CHAR 0x03 +#define ACD_POS_CHAR 0x04 +#define ACD_EXTRA_CHAR 0x05 + +#define ACD_MAX_FILLINS 10 + +public class CAutoCompleteDictGlbls +{ + U8 *word_lst; + I64 word_lst_size,num_words,num_fillins; + U8 *fillins[ACD_MAX_FILLINS]; + Bool has_words,has_defs; +} acd={NULL,0,0,0,{0,0,0,0,0,0,0,0,0,0},FALSE,FALSE}; +acd.has_words=FileFind(ACD_WORD_FILENAME); +acd.has_defs =FileFind(ACD_DEF_FILENAME)||FileFind(ACD_DEF_FILENAME_Z); + +extern U0 ACDWordsLoad(); +extern U0 ACDDictWordsAdd(CDoc *doc,U8 *st); + +#include "ACMain" +#include "ACDict" diff --git a/Adam/AutoFile2a.CPP b/Adam/AutoFile.CPP similarity index 99% rename from Adam/AutoFile2a.CPP rename to Adam/AutoFile.CPP index d402fde..5036e10 100644 --- a/Adam/AutoFile2a.CPP +++ b/Adam/AutoFile.CPP @@ -108,7 +108,7 @@ I64 af_l,af_r; Bool AFSetIPPlot(I64 mS,I64 x,I64 y,I64 z) { - SetIP(x,y,z,af_l,af_r); + IPSet(x,y,z,af_l,af_r); Sleep(mS); return TRUE; } diff --git a/Adam/Boot/Boot.CPP b/Adam/Boot/Boot.CPP new file mode 100644 index 0000000..28d7b8a --- /dev/null +++ b/Adam/Boot/Boot.CPP @@ -0,0 +1,64 @@ +#include "BootCD" +#include "BootHD" +#include "BootMHD" +#include "BootMHD2" +#include "DskCDDVD" +#include "BootIns" + +#help_index "Call" +asm { +USE64 +_HI_CALL:: + PUSH RBP + MOV RBP,RSP + MOV RAX,U64 16[RBP] + TEST RAX,RAX + JZ @@05 + CALL RAX +@@05: POP RBP + RET1 8 +//************************************ +_HI_MEMCPY:: + PUSH RBP + MOV RBP,RSP + PUSH RSI + PUSH RDI + CLD + MOV RDI,U64 SF_ARG1[RBP] + MOV RSI,U64 SF_ARG2[RBP] + MOV RCX,U64 SF_ARG3[RBP] + REP_MOVSB + MOV RAX,RDI + POP RDI + POP RSI + POP RBP + RET1 24 +} +_extern _HI_CALL I64 HiCall(U8 *s); +_extern _HI_MEMCPY U8 *HiMemCpy(U8 *dst,U8 *src,I64 cnt); + +#help_index "Boot" +public U0 RAMReboot(U8 *filename) +{//Softboot Kernel Bin file. No hardware reset. + I64 size; + CKernel *hi_image,*lo_image=sys_boot_base-sizeof(CBinFile),reg *sys_ram_reboot; + + do if (!(hi_image=FileRead(filename,&size))) return; + while (hi_image<0x100000); + + do sys_ram_reboot=MAlloc(SYS_RAM_REBOOT_END-SYS_RAM_REBOOT,Fs->code_heap); + while (sys_ram_reboot<0x100000); + + hi_image->boot_src=BOOT_SRC_RAM; + hi_image->boot_patch_table_base=lo_image(U8 *)+hi_image->h.patch_table_offset; + hi_image->sys_run_level =lo_image->sys_run_level&(RLF_VGA|RLF_16BIT); + MemCpy(&hi_image->start,&lo_image->start,sizeof(CKernel)-offset(CKernel.start)); + + CLI + if (mp_cnt>1) + MPHalt; + + HiMemCpy(sys_ram_reboot,SYS_RAM_REBOOT,SYS_RAM_REBOOT_END-SYS_RAM_REBOOT); + HiMemCpy(lo_image,hi_image,size); + HiCall(sys_ram_reboot); +} diff --git a/Adam/Boot/BootCD.CPP b/Adam/Boot/BootCD.CPP index c200c94..5408418 100644 --- a/Adam/Boot/BootCD.CPP +++ b/Adam/Boot/BootCD.CPP @@ -1,17 +1,17 @@ #define CD_BOOT_LOADER_SIZE CD_BLK_SIZE*1 //Max CD_BLK_SIZE*4, I think -#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+CD_BOOT_LOADER_SIZE))>>4) +#define BOOT_HIGH_LOC_CD ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+CD_BOOT_LOADER_SIZE))>>4) DefinePrint( - "DD_BOOT_HIGH_LOC","%08X",BOOT_HIGH_LOC<<4); + "DD_BOOT_HIGH_LOC_CD","%08X",BOOT_HIGH_LOC_CD<<4); DefinePrint( - "DD_BOOT_HIGH_LOC_END","%08X",BOOT_RAM_LIMIT-1); + "DD_BOOT_HIGH_LOC_CD_END","%08X",BOOT_RAM_LIMIT-1); asm { USE16 BCD_START:: //DL is supposed to have the BIOS drive number CLD - MOV AX,BOOT_HIGH_LOC + MOV AX,BOOT_HIGH_LOC_CD MOV ES,AX CLI @@ -24,7 +24,7 @@ BCD_GET_IP: POP BX SUB BX,BCD_GET_IP-BCD_START SHR BX,4 -//Copy this bootloader code to just under 0x80000 +//This copies this bootloader's code to 0x$TX,"00096600",D="DD_BOOT_HIGH_LOC_CD"$ MOV AX,CS ADD AX,BX MOV DS,AX @@ -33,12 +33,12 @@ BCD_GET_IP: XOR DI,DI REP_MOVSB - MOV AX,BOOT_HIGH_LOC + MOV AX,BOOT_HIGH_LOC_CD MOV DS,AX //My assembler doesn't support 16-bit very well. - DU8 0xEA; //JMP BOOT_HIGH_LOC:BCD_MAIN - DU16 BCD_MAIN-BCD_START,BOOT_HIGH_LOC; + DU8 0xEA; //JMP BOOT_HIGH_LOC_CD:BCD_MAIN + DU16 BCD_MAIN-BCD_START,BOOT_HIGH_LOC_CD; BCD_BIOS_DRV_NUM: DU8 0; BCD_PAGE: DU8 0; @@ -152,7 +152,7 @@ BCD_MAIN:: //See $LK,"BootCdProbe",A="MN:BootCdProbe"$(). MOV EBX,U32 [BCD_BLK_LO-BCD_START] //TODO: oops overflow? SHL EBX,16 - MOV BX,BOOT_CODE_CDROM //$MA-X+PU,"See sys_boot_code",LM="Grep(\"sys_boot_code\",\"/*\");View;\n"$ + MOV BX,BOOT_SRC_CDROM //$MA-X+PU,"See sys_boot_src",LM="Find(\"sys_boot_src\",\"/*\");View;\n"$ //My assembler doesn't support 16-bit very well. DU8 0xEA; //JMP BOOT_RAM_BASE:0000 diff --git a/Adam/Boot/BootHD.CPP b/Adam/Boot/BootHD.CPP index 29ece68..7a1b79f 100644 --- a/Adam/Boot/BootHD.CPP +++ b/Adam/Boot/BootHD.CPP @@ -1,5 +1,8 @@ #define MODULE_SIZE 1*BLK_SIZE -#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4) +#define BOOT_HIGH_LOC_HD ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4) + +DefinePrint( + "DD_BOOT_HIGH_LOC_HD","%08X",BOOT_HIGH_LOC_HD<<4); asm { USE16 @@ -9,11 +12,11 @@ BHD_CODE:: CLD - MOV AX,VGA_TEXT_MEM_BASE/16 + MOV AX,VGAM_TEXT/16 MOV FS,AX MOV U32 FS:[0],'B'+GREEN<<12+('2'+GREEN<<12)<<16 - MOV AX,BOOT_HIGH_LOC + MOV AX,BOOT_HIGH_LOC_HD MOV ES,AX CLI @@ -26,7 +29,7 @@ BHD_GET_IP: POP BX SUB BX,BHD_GET_IP-BHD_START SHR BX,4 -//Copy this bootloader code to just under 0x80000 +//This copies this bootloader's code to 0x$TX,"00096C00",D="DD_BOOT_HIGH_LOC_HD"$ MOV AX,CS ADD AX,BX MOV DS,AX @@ -35,21 +38,21 @@ BHD_GET_IP: XOR DI,DI REP_MOVSB - MOV AX,BOOT_HIGH_LOC + MOV AX,BOOT_HIGH_LOC_HD MOV DS,AX //My assembler doesn't support 16-bit very well. - DU8 0xEA; //JMP BOOT_HIGH_LOC:BHD_HISTART - DU16 BHD_HISTART-BHD_START,BOOT_HIGH_LOC; + DU8 0xEA; //JMP BOOT_HIGH_LOC_HD:BHD_HISTART + DU16 BHD_HISTART-BHD_START,BOOT_HIGH_LOC_HD; BHD_BIOS_DRV_NUM: DU8 0; -//Gets patched by $LK,"MakeOSPrtBootInstall",A="MN:MakeOSPrtBootInstall"$(). +//Gets patched by $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$(). BHD_BLK_CNT:: DU16 0; BHD_DAP: DU8 16,0,1,0; //One blk at a time BHD_DAP_BUF: DU16 0,0; -//Gets patched by $LK,"MakeOSPrtBootInstall",A="MN:MakeOSPrtBootInstall"$(). +//Gets patched by $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$(). BHD_DAP_BLK:: //64-bit BHD_DAP_BLK_LO: DU32 0; BHD_DAP_BLK_HI: DU32 0; @@ -82,7 +85,7 @@ BHD_HISTART: @@10: POP CX LOOP @@05 - MOV EBX,BOOT_CODE_HARDDRV //$MA-X+PU,"See sys_boot_code",LM="Grep(\"sys_boot_code\",\"/*\");View;\n"$ + MOV EBX,BOOT_SRC_HARDDRV //$MA-X+PU,"See sys_boot_src",LM="Find(\"sys_boot_src\",\"/*\");View;\n"$ //My assembler doesn't support 16-bit very well. DU8 0xEA; //JMP BOOT_RAM_BASE:0000 DU16 0,BOOT_RAM_BASE/16; diff --git a/Adam/Boot/BootIns.CPP b/Adam/Boot/BootIns.CPP new file mode 100644 index 0000000..fc1ea83 --- /dev/null +++ b/Adam/Boot/BootIns.CPP @@ -0,0 +1,233 @@ +//See $LK,"Install Documentation",A="FI:::/Doc/Install.TXT"$ or $LK,"Upgrading Documentation",A="FI:::/Doc/Upgrade.TXT"$. + +#help_index "Install" + +#define KERNEL_BIN_C "Kernel.BIN.C" +#define BOOT_DIR "/0000Boot" +#define BOOT_DIR_KERNEL_BIN_C BOOT_DIR "/0000" KERNEL_BIN_C +//Stage 2 of master boot loader +#define BOOT_DIR_BOOTMHD2_BIN_C BOOT_DIR "/BootMHD2.BIN.C" +//Old master boot record +#define BOOT_DIR_OLDMBR_BIN_C BOOT_DIR "/OldMBR.BIN.C" + +public U0 MakeAll() +{//Use $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$. Loader must be patched. +//These 2 modules (and bootloaders at top) are the only AOT +//compiled code in TempleOS. Everything else is JIT. +//You are doing it wrong if you make AOT compiled code. + if (Cmp("/Compiler/Compiler","Compiler",,':')) + throw; + if (Cmp("/Kernel/Kernel","Kernel",,':')) + throw; +} + +public Bool MakeOSDrvBootInstall(U8 src_drv=0,U8 dst_drv=0) +{// Does $LK,"MakeAll",A="MN:MakeAll"$ and installs new boot-loader. + +//Normally, you just supply a src_drv. It will compile +//the code on that drive and update the boot sect. + +//If you are making a bootable CD-ROM, you supply a dst_drv. +//See $LK,"::/Misc/MakeDistro.CPP"$ + +//See $LK,"Install Documentation",A="FI:::/Doc/Install.TXT"$ + +//Study my account examples my technique: $LK,"Cfg Strs",A="FL:::/Demo/AcctExample/TOSCfg.CPP,1"$, $LK,"Update Funs",A="FL:::/Demo/AcctExample/TOSDistro.CPP,1"$ + + CBlkDev *bd; + CDrv *dv; + CFAT32Boot br; + CDirEntry de; + Bool result=FALSE; + I64 i; + try { + if (!src_drv) src_drv=Drv2Let(Fs->cur_dv); + if (!dst_drv) dst_drv=src_drv; + if (!Drv(src_drv)) + throw; + MakeAll; + bd=Let2BlkDev(dst_drv); + dv=Let2Drv (dst_drv); + switch (bd->type) { + case BDT_ATAPI: + Move("/Kernel/Kernel.BIN.Z",BOOT_DIR_KERNEL_BIN_C); + result=TRUE; + break; + case BDT_RAM: + case BDT_ATA: + Move("/Kernel/Kernel.BIN.Z","/" KERNEL_BIN_C); + if (!FileFind("/" KERNEL_BIN_C,&de,FUF_JUST_FILES)) + "No Kernel.BIN.C\n"; + else { + Free(de.full_name); + "Modifying partition boot record.\n"; + RBlks(dv,&br,dv->base_offset,1); + br.jump_and_nop[0]=OC_JMP_REL8; + br.jump_and_nop[1]=offset(CFAT32Boot.code)-2; +#assert offset(CFAT32Boot.code)>=offset(CRedSeaBoot.code) + br.jump_and_nop[2]=OC_NOP; + *BHD_BLK_CNT(U16 *)=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS; + *BHD_DAP_BLK(I64 *)=Cluster2Blk(dv,de.cluster); + for (i=0;i=BHD_END-BHD_CODE + for (;ibase_offset,1); + result=TRUE; + } + break; + } + } catch { + PutExcept; + Beep; + } + return result; +} + +public U0 MasterBootOldRead(U8 src_drv,U8 dst_drv) +{//Reads MBR from disk drive containing src partition. + //Writes a single blk file to dst /0000Boot directory. + CBlkDev *bd=Let2BlkDev(src_drv); + CDrv *dv; + CMasterBoot mbr; + Drv(dst_drv); + dv=Fs->cur_dv; + if (dv->type!=DVT_REDSEA && dv->type!=DVT_FAT32) + PrintErr("Not RedSea Drv\n"); + else { + //Bypass partition bounds-checking + BlkDevLock(bd); + ATAReadBlks(bd,&mbr,0,1); + BlkDevUnlock(bd); + + Drv(dst_drv); + MkDir(BOOT_DIR); + FileWrite(BOOT_DIR_OLDMBR_BIN_C,&mbr,BLK_SIZE); + } +} + +public U0 MasterBootOldWrite(U8 src_drv,U8 dst_drv) +{//Reads OldMBR from src drive /0000Boot directory + //writes it to the MBR of the drive with dst partition. + CBlkDev *bd=Let2BlkDev(dst_drv); + CMasterBoot *mbr; + Drv(src_drv); + if (mbr=FileRead(BOOT_DIR_OLDMBR_BIN_C)) { + //Bypass partition bounds-checking + BlkDevLock(bd); + ATAWriteBlks(bd,mbr,0,1); + BlkDevUnlock(bd); + } + Free(mbr); +} + +public U0 MasterBootZero(U8 dst_drv) +{//Set MBR of disk with dst partition to zero. + +//This is dangerous!! +//The TempleOS partitioner doesn't play well +//with other operating systems at this time and you need +//to do this on a drive partitioned by TempleOS +//if you wish to partition with another operating system. + CBlkDev *bd=Let2BlkDev(dst_drv); + CMasterBoot mbr; + MemSet(&mbr,0,BLK_SIZE); + //Bypass partition bounds-checking + BlkDevLock(bd); + ATAWriteBlks(bd,&mbr,0,1); + BlkDevUnlock(bd); +} + +public Bool MasterBootIntall(U8 drv_let,U8 *drv_lst=NULL) +{//Create new MBR on the disk that has drv_let as a partition. + //Puts stage 2 in /0000Boot dir of drv_let. + CBlkDev *bd,*bd1; + CDrv *dv,*p1; + CMasterBoot mbr; + CDirEntry de; + I64 i,j,size,*_q; + U8 *menu_ptr,*ptr,ch,buf[128]; + Bool result=FALSE; + + try { + if (drv_lst) + StrCpy(buf,drv_lst); + else { + j=0; + for (i='A';i<='Z';i++) + buf[j++]=i; + buf[j++]=0; + } + + Drv(drv_let); + dv=Fs->cur_dv; + if (dv->type!=DVT_REDSEA && dv->type!=DVT_FAT32) + PrintErr("Not RedSea Drv\n"); + else { + bd=Let2BlkDev(drv_let); + if (!FileFind(BOOT_DIR_OLDMBR_BIN_C,,FUF_JUST_FILES)) + MasterBootOldRead(drv_let,drv_let); + + _q=BMHD2_BLK_ARRAY; + MemSet(_q,0,sizeof(I64)*8); + menu_ptr=BMHD2_BOOT_MSG; + StrPrint(menu_ptr,"\n\r\n\rTempleOS Boot Loader\n\r\n\r"); + j=0; + if (FileFind(BOOT_DIR_OLDMBR_BIN_C,&de,FUF_JUST_FILES)) { + Free(de.full_name); + *_q++=Cluster2Blk(dv,de.cluster); + CatPrint(menu_ptr,"0. Old Boot Record\n\r"); + j++; + } + + ptr=buf; + while (ch=*ptr++) { + try { + p1 =Let2Drv(ch); + bd1=Let2BlkDev(ch); + } catch { + Fs->catch_except=TRUE; + p1 =NULL; + bd1=NULL; + } + if (p1 && bd1==bd) { + *_q=p1->base_offset; + "Drive %C:%16X\n",Drv2Let(p1),*_q; + CatPrint(menu_ptr,"%d. Drive %C\n\r",j++,Drv2Let(p1)); + _q++; + } + } + CatPrint(menu_ptr,"\n\rSelection:"); + + size=BMHD2_END-BMHD2_START; + FileWrite(BOOT_DIR_BOOTMHD2_BIN_C,BMHD2_START,size); + + if (!FileFind(BOOT_DIR_BOOTMHD2_BIN_C,&de,FUF_JUST_FILES)) + "No Boot Loader Image\n"; + else { + Free(de.full_name); + *BMHD_BLK_CNT(U16 *)=(size+BLK_SIZE-1)>>BLK_SIZE_BITS; + *BMHD_DAP_BLK(I64 *)=Cluster2Blk(dv,de.cluster); + //Bypass partition bounds-checking + BlkDevLock(bd); + ATAReadBlks(bd,&mbr,0,1); + for (i=0;i=BMHD_END-BMHD_CODE + for (;i>4) +#define BOOT_HIGH_LOC_MHD ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4) + +DefinePrint( + "DD_BOOT_HIGH_LOC_MHD","%08X",BOOT_HIGH_LOC_MHD<<4); asm { USE16 @@ -7,7 +10,7 @@ BMHD_START:: BMHD_CODE:: CLD - MOV AX,BOOT_HIGH_LOC + MOV AX,BOOT_HIGH_LOC_MHD CLI MOV SS,AX @@ -26,7 +29,7 @@ BMHD_CODE:: MOV ES,AX - MOV AX,VGA_TEXT_MEM_BASE/16 + MOV AX,VGAM_TEXT/16 MOV FS,AX MOV U32 FS:[0],'B'+GREEN<<12+('1'+GREEN<<12)<<16 CALL BMHD_GET_IP @@ -35,7 +38,7 @@ BMHD_GET_IP: SUB BX,BMHD_GET_IP-BMHD_START MOV CX,BX SHR BX,4 -//Copy this bootloader code to just under 0x80000 +//This copies this bootloader's code to 0x$TX,"00096C00",D="DD_BOOT_HIGH_LOC_MHD"$ MOV AX,CS PUSH AX ADD AX,BX @@ -48,21 +51,21 @@ BMHD_GET_IP: XOR DI,DI REP_MOVSB - MOV AX,BOOT_HIGH_LOC + MOV AX,BOOT_HIGH_LOC_MHD MOV DS,AX //My assembler doesn't support 16-bit very well. - DU8 0xEA; //JMP BOOT_HIGH_LOC:BMHD_HISTART - DU16 BMHD_HISTART-BMHD_START,BOOT_HIGH_LOC; + DU8 0xEA; //JMP BOOT_HIGH_LOC_MHD:BMHD_HISTART + DU16 BMHD_HISTART-BMHD_START,BOOT_HIGH_LOC_MHD; BMHD_BIOS_DRV_NUM: DU8 0; BMHD_OLD_CS_IP: DU16 0,0; -//Gets patched by $LK,"MakeOSPrtBootInstall",A="MN:MakeOSPrtBootInstall"$(). +//Gets patched by $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$(). BMHD_BLK_CNT:: DU16 0; BMHD_DAP: DU8 16,0,1,0; //One blk at a time BMHD_DAP_BUF: DU16 0,0; -//Gets patched by $LK,"MakeOSPrtBootInstall",A="MN:MakeOSPrtBootInstall"$(). +//Gets patched by $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$(). BMHD_DAP_BLK:: //64-bit BMHD_DAP_BLK_LO: DU32 0; BMHD_DAP_BLK_HI: DU32 0; diff --git a/Adam/Boot/BootMHD2.CPP b/Adam/Boot/BootMHD2.CPP index 4868d5c..5c944f3 100644 --- a/Adam/Boot/BootMHD2.CPP +++ b/Adam/Boot/BootMHD2.CPP @@ -1,14 +1,17 @@ #define MODULE_SIZE 2*BLK_SIZE -#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4) +#define BOOT_HIGH_LOC_MHD2 ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4) + +DefinePrint( + "DD_BOOT_HIGH_LOC_MHD2","%08X",BOOT_HIGH_LOC_MHD2<<4); asm { USE16 BMHD2_START:: MOV U32 FS:[0],'B'+0x2000+('2'+0x2000)<<16 - MOV AX,BOOT_HIGH_LOC + MOV AX,BOOT_HIGH_LOC_MHD2 MOV ES,AX -//Copy this bootloader code to just under 0x80000 +//This copies this bootloader's code to 0x$TX,"00096A00",D="DD_BOOT_HIGH_LOC_MHD2"$ MOV AX,CS MOV DS,AX MOV U32 [BMHD2_OLD_CS_IP-BMHD2_START],EBX @@ -19,12 +22,12 @@ BMHD2_START:: XOR DI,DI REP_MOVSB - MOV AX,BOOT_HIGH_LOC + MOV AX,BOOT_HIGH_LOC_MHD2 MOV DS,AX //My assembler doesn't support 16-bit very well. - DU8 0xEA; //JMP BOOT_HIGH_LOC:BMHD2_HISTART - DU16 BMHD2_HISTART-BMHD2_START,BOOT_HIGH_LOC; + DU8 0xEA; //JMP BOOT_HIGH_LOC_MHD2:BMHD2_HISTART + DU16 BMHD2_HISTART-BMHD2_START,BOOT_HIGH_LOC_MHD2; BMHD2_BOOT_MSG:: DU8 256 DUP(0); diff --git a/Adam/Boot/InsBoot.CPP b/Adam/Boot/InsBoot.CPP deleted file mode 100644 index d4381cc..0000000 --- a/Adam/Boot/InsBoot.CPP +++ /dev/null @@ -1,346 +0,0 @@ -#help_index "Install" -//See $LK,"Install Documentation",A="FI:::/Doc/Install.TXT"$ or $LK,"Upgrading Documentation",A="FI:::/Doc/Upgrade.TXT"$. - -//Kernel module: Kernel.BIN.Z -#define KERNEL_BIN_C "Kernel.BIN.C" - -#define BOOT_DIR "/0000Boot" -#define BOOT_DIR_KERNEL_BIN_C BOOT_DIR "/0000" KERNEL_BIN_C - -//Stage 2 of master boot loader -#define BOOTMHD2_BIN_C BOOT_DIR "/BootMHD2.BIN.C" - -//Old master boot record -#define OLDMBR_BIN_C BOOT_DIR "/OldMBR.BIN.C" - -if (IsDrvWritable) - MkDir("/Temp"); //Good to have a Temp - -#include "BootCD" -#include "BootHD" -#include "BootMHD" -#include "BootMHD2" -#include "DskCDDVD" - -#help_index "Call" -asm { -USE64 -_HI_CALL:: - PUSH RBP - MOV RBP,RSP - MOV RAX,U64 16[RBP] - TEST RAX,RAX - JZ @@05 - CALL RAX -@@05: POP RBP - RET1 8 -//************************************ -_HI_MEMCPY:: - PUSH RBP - MOV RBP,RSP - PUSH RSI - PUSH RDI - CLD - MOV RDI,U64 SF_ARG1[RBP] - MOV RSI,U64 SF_ARG2[RBP] - MOV RCX,U64 SF_ARG3[RBP] - REP_MOVSB - MOV RAX,RDI - POP RDI - POP RSI - POP RBP - RET1 24 -} -_extern _HI_CALL I64 HiCall(U8 *s); -_extern _HI_MEMCPY U8 *HiMemCpy(U8 *dst,U8 *src,I64 cnt); - -#help_index "Boot" -public U0 SoftBoot(U8 *filename) -{//Softboot Kernel Bin file. No hardware reset. - I64 size; - CKernel *hi_image,*lo_image=sys_boot_base-sizeof(CBinFile), - reg *shutdown,*hi_image2; - - if (!(hi_image2=FileRead(filename,&size))) return; - shutdown=MAlloc(SYS_RESTART_KERNEL_END-SYS_RESTART_KERNEL,Fs->code_heap); - hi_image=MAlloc(size,Fs->code_heap); - HiMemCpy(hi_image,hi_image2,size); - Free(hi_image2); - - hi_image->boot_base=lo_image(U8 *)+sizeof(CBinFile); - hi_image->boot_patch_table_base=lo_image(U8 *)+hi_image->h.patch_table_offset; - HiMemCpy(&hi_image->sys_mem_E801,&lo_image->sys_mem_E801,2*2); - HiMemCpy(&hi_image->sys_mem_E820,&lo_image->sys_mem_E820,MEM_NUM_E820_ENTRIES*MEM_E820_ENTRY_SIZE); - hi_image->sys_gr_mode=lo_image->sys_gr_mode; - hi_image->sys_pci_busses=lo_image->sys_pci_busses; - hi_image->boot_code=BOOT_CODE_RAM; - - CLI - if (mp_cnt>1) - MPHalt; - - HiMemCpy(shutdown,SYS_RESTART_KERNEL,SYS_RESTART_KERNEL_END-SYS_RESTART_KERNEL); - HiMemCpy(&hi_image->sys_gdt,&lo_image->sys_gdt,sizeof(CGDT)); - HiMemCpy(lo_image,hi_image,size); - HiCall(shutdown); -} - -#help_index "Install" -U8 ChkWritable(U8 drv_let=0) -{ - Bool cont=TRUE; - I64 writable_drv=drv_let; - U8 buf_s[136],buf_d[136]; - CPrt *p; - CBlkDev *bdev; - if (!IsDrvWritable(drv_let)) { - '' drv_let; - ": Drive is read-only.\n"; - do { - "Enter RAM drive (usually 'B') for temporary files:"; - writable_drv=ToUpper(GetChar); - '\n'; - p=Drv2Prt(writable_drv); - bdev=p->bdev; - if (bdev->type!=BDT_RAM || - !IsDrvWritable(writable_drv)) - "Not A RAM Drive\n"; - else - cont=FALSE; - } while (cont); - if (drv_let!=writable_drv) { - Fmt(writable_drv,FALSE,FALSE); - StrPrint(buf_s,"%c:/",drv_let); - StrPrint(buf_d,"%c:/",writable_drv); - CopyTree(buf_s,buf_d); - } - } - return writable_drv; -} - -#help_index "Install" -public U0 MakeAll() -{//Use $LK,"MakeOSPrtBootInstall",A="MN:MakeOSPrtBootInstall"$. Loader must be patched. -//These 2 modules (and bootloaders at top) are the only AOT -//compiled code in TempleOS. Everything else is JIT. -//You are doing it wrong if you make AOT compiled code. - Cd("/Compiler"); - if (Cmp("Compiler","Compiler",,':')) - throw; - Cd("/Kernel"); - if (Cmp("Kernel","Kernel",,':')) - throw; -} - -public Bool MakeOSPrtBootInstall(U8 src_drv=0,U8 dst_drv=0) -{// Does $LK,"MakeAll",A="MN:MakeAll"$ and installs new boot-loader. - -//Normally, you just supply a src_drv. It will compile -//the code on that drive and update the boot sect. - -//If you are making a bootable CD-ROM, you supply a dst_drv. -//See $LK,"::/Misc/MakeDistro.CPP"$ - -//See $LK,"Install Documentation",A="FI:::/Doc/Install.TXT"$ - -//Study my account examples my technique: $LK,"Cfg Strs",A="FL:::/Demo/AcctExample/TSAdam.CPP,1"$ $LK,"Update Funs",A="FL:::/Demo/AcctExample/TSDistro.CPP,1"$ - - CBlkDev *bdev; - CPrt *p; - CFAT32Boot br; - CDirEntry de; - Bool result=FALSE; - I64 i; - - try { - if (!src_drv) src_drv=Fs->cur_prt->drv_let; - if (!dst_drv) dst_drv=src_drv; - - src_drv=ChkWritable(src_drv); - if (!Drv(src_drv)) - throw; - MakeAll; - Cd("/"); - - bdev=Drv2BlkDev(dst_drv); - p =Drv2Prt (dst_drv); - switch (bdev->type) { - case BDT_ATAPI: - Move("/Kernel/Kernel.BIN.Z",BOOT_DIR_KERNEL_BIN_C); - result=TRUE; - break; - case BDT_RAM: - case BDT_ATA: - Move("/Kernel/Kernel.BIN.Z",KERNEL_BIN_C); - if (!FileFind(KERNEL_BIN_C,&de,FUF_JUST_FILES)) - "No Kernel.BIN.C\n"; - else { - Free(de.full_name); - "Modifying partition boot record.\n"; - RBlks(p,&br,p->offset,1); - br.jump_and_nop[0]=OC_JMP_REL8; - br.jump_and_nop[1]=offset(CFAT32Boot.code)-2; - br.jump_and_nop[2]=OC_NOP; - *BHD_BLK_CNT(U16 *)=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS; - *BHD_DAP_BLK(I64 *)=p->data+de.cluster*p->spc; - for (i=0;ioffset,1); - result=TRUE; - } - break; - } - } catch { - PutExcept; - Beep; - } - return result; -} - -public U0 MasterBootOldRead(U8 src_drv,U8 dst_drv) -{//Reads MBR from disk drive containing src partition. - //Writes a single blk file to dst /0000Boot directory. - CBlkDev *bdev=Drv2BlkDev(src_drv); - CPrt *p; - CMasterBoot mbr; - Drv(dst_drv); - p=Fs->cur_prt; - if (p->type!=PT_REDSEA && p->type!=PT_FAT32) - PrintErr("Not RedSea Partition\n"); - else { - //Bypass partition bounds-checking - BlkDevLock(bdev); - ATAReadBlks(bdev,&mbr,0,1); - BlkDevUnlock(bdev); - - Drv(dst_drv); - MkDir(BOOT_DIR); - FileWrite(OLDMBR_BIN_C,&mbr,BLK_SIZE); - } -} - -public U0 MasterBootOldWrite(U8 src_drv,U8 dst_drv) -{//Reads OldMBR from src drive /0000Boot directory - //writes it to the MBR of the drive with dst partition. - CBlkDev *bdev=Drv2BlkDev(dst_drv); - CMasterBoot *mbr; - Drv(src_drv); - if (mbr=FileRead(OLDMBR_BIN_C)) { - //Bypass partition bounds-checking - BlkDevLock(bdev); - ATAWriteBlks(bdev,mbr,0,1); - BlkDevUnlock(bdev); - } - Free(mbr); -} - -public U0 MasterBootZero(U8 dst_drv) -{//Set MBR of disk with dst partition to zero. - -//This is dangerous!! -//The TempleOS partitioner doesn't play well -//with other operating systems at this time and you need -//to do this on a drive partitioned by TempleOS -//if you wish to partition with another operating system. - CBlkDev *bdev=Drv2BlkDev(dst_drv); - CMasterBoot mbr; - MemSet(&mbr,0,BLK_SIZE); - //Bypass partition bounds-checking - BlkDevLock(bdev); - ATAWriteBlks(bdev,&mbr,0,1); - BlkDevUnlock(bdev); -} - -public Bool MasterBootIntall(U8 drv_let,U8 *drv_lst=NULL) -{//Create new MBR on the disk that has drv_let as a partition. - //Puts stage 2 in /0000Boot dir of drv_let. - CBlkDev *bdev,*bdev1; - CPrt *p,*p1; - CMasterBoot mbr; - CDirEntry de; - I64 i,j,size,*_q; - U8 *menu_ptr,*ptr,ch,buf[128]; - Bool result=FALSE; - - try { - if (drv_lst) - StrCpy(buf,drv_lst); - else { - j=0; - for (i='A';i<='Z';i++) - buf[j++]=i; - buf[j++]=0; - } - - Drv(drv_let); - p=Fs->cur_prt; - if (p->type!=PT_REDSEA && p->type!=PT_FAT32) - PrintErr("Not RedSea Partition\n"); - else { - bdev=Drv2BlkDev(drv_let); - if (!FileFind(OLDMBR_BIN_C,,FUF_JUST_FILES)) - MasterBootOldRead(drv_let,drv_let); - - _q=BMHD2_BLK_ARRAY; - MemSet(_q,0,sizeof(I64)*8); - menu_ptr=BMHD2_BOOT_MSG; - StrPrint(menu_ptr,"\n\r\n\rTempleOS Boot Loader\n\r\n\r"); - j=0; - if (FileFind(OLDMBR_BIN_C,&de,FUF_JUST_FILES)) { - Free(de.full_name); - *_q++=p->data+de.cluster*p->spc; - CatPrint(menu_ptr,"0. Old Boot Record\n\r"); - j++; - } - - ptr=buf; - while (ch=*ptr++) { - try { - p1 =Drv2Prt(ch); - bdev1=Drv2BlkDev(ch); - } catch { - Fs->catch_except=TRUE; - p1 =NULL; - bdev1=NULL; - } - if (p1 && bdev1==bdev) { - *_q=p1->offset; - "Drive %C:%16X\n",Prt2Drv(p1),*_q; - CatPrint(menu_ptr,"%d. Drive %C\n\r",j++,Prt2Drv(p1)); - _q++; - } - } - CatPrint(menu_ptr,"\n\rSelection:"); - - size=BMHD2_END-BMHD2_START; - FileWrite(BOOTMHD2_BIN_C,BMHD2_START,size); - - if (!FileFind(BOOTMHD2_BIN_C,&de,FUF_JUST_FILES)) - "No Boot Loader Image\n"; - else { - Free(de.full_name); - *BMHD_BLK_CNT(U16 *)=(size+BLK_SIZE-1)>>BLK_SIZE_BITS; - *BMHD_DAP_BLK(I64 *)=p->data+de.cluster*p->spc; - //Bypass partition bounds-checking - BlkDevLock(bdev); - ATAReadBlks(bdev,&mbr,0,1); - for (i=0;iglbl_name=GetStr("Glbl Struct Name (ENTER for No Glbl):"); result->range=GetI64 ("Range (%4d):",30); @@ -33,7 +33,7 @@ CTemplateSC *GetSliderCtrl() Free(st); break; } - temps=CAlloc(sizeof(CTemplateSCSlider)); + temps=CAlloc(sizeof(CTemplateCSSlider)); temps->name=st; QueIns(temps,result->last_slider); temps->num=result->num_sliders++; @@ -41,25 +41,25 @@ CTemplateSC *GetSliderCtrl() return result; } -U0 TemplateSliderCtrl(CDoc *doc) +U0 TemplateCtrlSlider(CDoc *doc) { CTask *task; - CTemplateSC *m=NULL; - CTemplateSCSlider *temps; + CTemplateCS *m=NULL; + CTemplateCSSlider *temps; I64 i; DocUnlock(doc); DocRecalc(doc); DocCaptureUndo(doc,TRUE); - task=SpawnUser("CTemplateSC **_m=0x%X;*_m=GetSliderCtrl;\n",&m); + task=User("CTemplateCS **_m=0x%X;*_m=CtrlSliderGet;\n",&m); while (!m) Yield; DocPrint(doc, -"#define SLIDER_RANGE %d -#define SLIDER_SPACING %d -#define SLIDER_BORDER %d +"#define SLIDER_RANGE\t%d +#define SLIDER_SPACING\t%d +#define SLIDER_BORDER\t%d class CSliderState { @@ -77,7 +77,7 @@ class CSliderState DocPrint(doc, " -U0 DrawSliderCtrl(CDC *dc,CCtrl *c) +U0 DrawCtrlSlider(CDC *dc,CCtrl *c) { CSliderState *s=c->state; @@ -124,7 +124,7 @@ U0 DrawSliderCtrl(CDC *dc,CCtrl *c) DocPrint(doc, "} -U0 UpdateDerivedSliderCtrl(CCtrl *c) +U0 UpdateDerivedCtrlSlider(CCtrl *c) { CSliderState *s=c->state; c->left=c->win_task->pix_width/2-(SLIDER_SPACING*3+2)/2; @@ -181,9 +181,9 @@ CCtrl *SliderNew() else DocPrint(doc, " c->state=CAlloc(sizeof(CSliderState));\n"); DocPrint(doc, -" c->draw_it=&DrawSliderCtrl; +" c->draw_it=&DrawCtrlSlider; c->left_click=&LeftClickSlider; - c->update_derived_vals=&UpdateDerivedSliderCtrl; + c->update_derived_vals=&UpdateDerivedCtrlSlider; old_preempt=Preempt(OFF); QueIns(c,Fs->last_ctrl); TaskDerivedValsUpdate; diff --git a/Adam/DocDefines.CPP b/Adam/DocDefines.CPP deleted file mode 100644 index 4a1d925..0000000 --- a/Adam/DocDefines.CPP +++ /dev/null @@ -1,70 +0,0 @@ -#help_index "Define;Char/Define" - -U0 LoadDocDefines() -{//These are used in documents such as $LK,"::/Doc/TrivialSolutions.TXT"$ -//The $LK,"CDoc",A="MN:CDoc"$ framework will search the sym table for define string -//consts if you specify that. - CBinFile *bfh=sys_boot_base-sizeof(CBinFile); - - DefinePrint( - "DD_KERNEL","%08X",bfh); - DefinePrint( - "DD_KERNEL2","%09,X",bfh); - bfh(I64)+=bfh->file_size-1; - DefinePrint( - "DD_KERNEL_END","%08X",bfh); - DefinePrint( - "DD_KERNEL_END2","%09,X",bfh); - - DefinePrint( - "DD_PROTECTED_LOW","%08X",MEM_PROTECTED_LOW_LIMIT); - DefinePrint( - "DD_PROTECTED_LOW2","%09,X",MEM_PROTECTED_LOW_LIMIT); - - //$LK,"DD_BOOT_HIGH_LOC",A="FF:::/Adam/Boot/BootCD.CPP,DD_BOOT_HIGH_LOC"$ - - DefinePrint( - "DD_MP_VECT","%08X",MP_VECT_ADDR); - DefinePrint( - "DD_MP_VECT_END","%08X",MP_VECT_ADDR+SYS_MP_INIT_END-SYS_MP_INIT_START-1); - - DefinePrint( - "DD_OS_NAME_VERSION","TempleOS V%0.2f",os_version); - DefinePrint( - "DD_TEMPLEOS_AGE","%0.1f",(Now-Str2Date("8/1/2003"))/ToF64(1<<32)/CDATE_YEAR_DAYS); - - //This is cut and replaced when I generate a distro. - //See $LK,"DD_TEMPLEOS_LOC",A="FF:::/Demo/AcctExample/TSDistro.CPP,DD_TEMPLEOS_LOC"$. - $TR-C,"LineRep"$ -$ID,4$DefinePrint("DD_TEMPLEOS_LOC","121,504"); -DefinePrint("DD_TEMPLEOS_LOC_OFFICIAL","81,303"); -$ID,-4$ - DefinePrint( - "DD_FIXED_AREA_BASE","%08X",SYS_FIXED_AREA); - DefinePrint( - "DD_FIXED_AREA_BASE2","%09,X",SYS_FIXED_AREA); - DefinePrint( - "DD_FIXED_AREA_END","%08X",SYS_FIXED_AREA+sizeof(CSysFixedArea)-1); - - DefinePrint( - "DD_SYS_HEAP_BASE","%08X",sys_heap_base); - DefinePrint( - "DD_SYS_HEAP_BASE2","%09,X",sys_heap_base); - - DefinePrint( - "DD_SYS_HEAP_LIMIT","%08X",sys_heap_limit); - DefinePrint( - "DD_SYS_HEAP_LIMIT2","%09,X",sys_heap_limit); - - DefinePrint( - "DD_MAPPED_MEM_SPACE_GIG","%d Gig",MEM_MAPPED_SPACE/0x40000000); - DefinePrint( - "DD_MAPPED_MEM_SPACE_END","%010X",MEM_MAPPED_SPACE-1); - DefinePrint( - "DD_MAPPED_MEM_SPACE_END2","%014,X",MEM_MAPPED_SPACE-1); - - DefinePrint( - "DD_JIFFY_HZ","%d Hz",JIFFY_FREQ); -} - -LoadDocDefines; diff --git a/Adam/DolDoc/Doc.CPP b/Adam/DolDoc/Doc.CPP index 6578774..888c823 100644 --- a/Adam/DolDoc/Doc.CPP +++ b/Adam/DolDoc/Doc.CPP @@ -76,12 +76,15 @@ public class CDolDocGlbls } doldoc; MemSet(&doldoc,0,sizeof(CDolDocGlbls)); +#help_index "God" +#define BIBLE_FILENAME "::/Misc/Bible.TXT.Z" + #include "DocNew" #include "DocPlain" #include "DocInit" #include "DocHighlight" -#include "DocRecalc2a" -#include "DocRecalc2b" +#include "DocRecalcA" +#include "DocRecalcB" sys_clipboard_doc=DocNew; #include "DocFile" #include "DocOpt" @@ -89,8 +92,8 @@ sys_clipboard_doc=DocNew; #include "DocCtrlL" #include "DocMacro" #include "DocFind" -#include "DocEd2a" -#include "DocEd2b" +#include "DocEdA" +#include "DocEdB" #include "DocCodeTools" #include "DocTree" #include "DocMain" diff --git a/Adam/DolDoc/DocCodeTools.CPP b/Adam/DolDoc/DocCodeTools.CPP index 46624b0..38f7172 100644 --- a/Adam/DolDoc/DocCodeTools.CPP +++ b/Adam/DolDoc/DocCodeTools.CPP @@ -6,7 +6,7 @@ #define EF_REINDENT 0 #define EF_CHK_COMPILE 1 #define EF_RENUM_ASM 2 -#define EF_SLIDER_CTRL 3 +#define EF_CTRL_SLIDER 3 #define EF_CH_SC 4 I64 PopUpEdFmt() @@ -16,7 +16,7 @@ I64 PopUpEdFmt() DocPrint(doc,"$$LTBLUE$$$$MU,\"Check Compile\",LE=EF_CHK_COMPILE$$\n" "$$MU,\"Reindent CPP.Z Fun\",LE=EF_REINDENT$$\n" "$$MU,\"Renum Asm Local @@ Labels for Fun\",LE=EF_RENUM_ASM$$\n" - "$$MU,\"Insert Template Code: Slider Ctrl\",LE=EF_SLIDER_CTRL$$\n" + "$$MU,\"Insert Template Code: Ctrl Slider\",LE=EF_CTRL_SLIDER$$\n" "$$MU,\"Insert ASCII/Scan Code Hex Codes for key pressed\",LE=EF_CH_SC$$\n\n" "$$MU,\"CANCEL\",LE=DOCM_CANCEL$$\n\n" "$$GREEN$$$$FG$$ to undo if not happy\n" @@ -30,43 +30,32 @@ class CRILex { CLex *lx1,*lx2; CQueVectU8 *indent; - I64 depth,exp_depth; - Bool was_new_line,is_not_cont,one_shot; + I64 depth,exp_depth,one_shot; + Bool was_new_line,is_not_cont; }; I64 EdRILex(CRILex *rx) { - Bool is_not_cont=FALSE; - I64 i,k; + rx->is_not_cont=FALSE; + I64 i; do { Lex(rx->lx1); Lex(rx->lx2); - - if (rx->lx1->token=='\n') { - if (rx->lx2->token==TK_IDENT) - i=PrsKeyWord(rx->lx2); - else - i=-1; - if (rx->lx2->token==';' || rx->lx2->token=='{' || rx->lx2->token=='}' || - rx->lx2->token==':' || rx->lx2->token==')' && !rx->exp_depth || - i==KW_ELSE || i==KW_CATCH || i==KW_DO) - is_not_cont=TRUE; - } - k=PrsKeyWord(rx->lx2); + i=PrsKeyWord(rx->lx2); + if (rx->lx1->token=='\n' && rx->lx2->token==';' || rx->lx2->token=='{' || + rx->lx2->token=='}' || rx->lx2->token==':' || rx->lx2->token==')' && + !rx->exp_depth || i==KW_ELSE || i==KW_CATCH || i==KW_DO) + rx->is_not_cont=TRUE; if (rx->was_new_line && (rx->lx1->token!=':' || - k==KW_DFT || k==KW_SUB_SWITCH_START || k==KW_SUB_SWITCH_END)) { - if (rx->one_shot) { - QueVectU8Put(rx->indent,rx->lx2->lfns[0].cur_entry->y,rx->depth+3); - rx->one_shot=FALSE; - } else - QueVectU8Put(rx->indent,rx->lx2->lfns[0].cur_entry->y,rx->depth); + i==KW_DFT || i==KW_SUB_SWITCH_START || i==KW_SUB_SWITCH_END)) { + QueVectU8Put(rx->indent,rx->lx2->lfns[0].cur_entry->y,rx->depth+rx->one_shot); + rx->one_shot=0; } if (rx->lx2->token=='\n') rx->was_new_line=TRUE; else rx->was_new_line=FALSE; } while (rx->lx1->token=='\n'); - rx->is_not_cont=is_not_cont; return rx->lx1->token; } @@ -182,16 +171,14 @@ U0 EdRIStmt(CRILex *rx,Bool indent) default: if (rx->lx1->token==TK_IDENT && rx->lx1->hash_entry && rx->lx1->hash_entry->type&(HTT_OPCODE|HTT_ASM_KEYWORD)) { - i=rx->depth; - rx->depth=4; - rx->one_shot=FALSE; + rx->one_shot=4-rx->depth; do EdRILex(rx); while (rx->lx2->token && rx->lx2->token!='\n'); - rx->depth=i; + rx->is_not_cont=TRUE; } else { while (rx->lx1->token && rx->lx1->token!=';' && rx->lx1->token!=':') { if (rx->lx2->token=='\n' && !rx->is_not_cont) - rx->one_shot=TRUE; + rx->one_shot=3; EdRILex(rx); } if (rx->lx1->token==':') @@ -211,11 +198,11 @@ CQueVectU8 *EdRICode(CDoc *doc) CRILex *rx=CAlloc(sizeof(CRILex)); rx->lx1=LexNew(,LF_KEEP_NEW_LINES|LF_DONT_FREE_BUF,doc->filename.name); - Free(rx->lx1->lfns[0].name); + Free(rx->lx1->lfns[0].full_name); LexAttachDoc(rx->lx1,&rx->lx1->lfns[0],doc,,doc->cur_entry,doc->cur_data_col); rx->lx2=LexNew(,LF_KEEP_NEW_LINES|LF_DONT_FREE_BUF,doc->filename.name); - Free(rx->lx2->lfns[0].name); + Free(rx->lx2->lfns[0].full_name); LexAttachDoc(rx->lx2,&rx->lx2->lfns[0],doc,,doc->cur_entry,doc->cur_data_col); rx->indent=QueVectU8New(doc->cur_entry->y); @@ -400,17 +387,17 @@ U0 EdCodeTools2(CDoc *doc,I64 tool_action) if (doc->flags&DOCF_PLAIN_TEXT) DocFlagsToggle(doc,DOCF_PLAIN_TEXT); DocWrite(doc); - task=Spawn(&SrvUserCmdLine,NULL,"Srv",,Fs); + task=Spawn(&SrvCmdLine,NULL,"Srv",,Fs); st2=CurDir; st=MStrPrint("Cd(\"%s\");",st2); tempc=TaskExe(task,Fs,st,1<win_left,Fs->win_right, task); - SetWinVert(Fs->win_top, Fs->win_bottom,task); + WinHorz(Fs->win_left,Fs->win_right, task); + WinVert(Fs->win_top, Fs->win_bottom,task); if (ScanResult(tempc,&r)) { - st=DirFile(doc->filename.name,,"PRJ.Z"), - prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z); + st=DirFile(doc->filename.name,,"PRJ.Z"); + prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z); Free(st); if (FileFind(prj_file)) { st2=DirFile(prj_file), @@ -597,8 +584,8 @@ U0 EdCodeTools(CDoc *doc) case EF_RENUM_ASM: EdCodeTools2(doc,tool_action); break; - case EF_SLIDER_CTRL: - TemplateSliderCtrl(doc); + case EF_CTRL_SLIDER: + TemplateCtrlSlider(doc); break; case EF_CH_SC: EdChSC(doc); diff --git a/Adam/DolDoc/DocCtrlL.CPP b/Adam/DolDoc/DocCtrlL.CPP index 36b4add..822d7eb 100644 --- a/Adam/DolDoc/DocCtrlL.CPP +++ b/Adam/DolDoc/DocCtrlL.CPP @@ -1005,13 +1005,13 @@ U0 EdInsDollarCmd() } } -#define PT_SPRITE 0 -#define PT_SPRITE_PTR 1 -#define PT_DUP_SPRITE 2 -#define PT_SPRITE_SIZE 3 -#define PT_SPRITE_MACRO 4 -#define PT_SPRITE_MENU 5 -#define PT_SPRITE_LINK 6 +#define DVT_SPRITE 0 +#define DVT_SPRITE_PTR 1 +#define DVT_DUP_SPRITE 2 +#define DVT_SPRITE_SIZE 3 +#define DVT_SPRITE_MACRO 4 +#define DVT_SPRITE_MENU 5 +#define DVT_SPRITE_LINK 6 I64 PopUpSpriteType() { @@ -1019,13 +1019,13 @@ I64 PopUpSpriteType() CDoc *doc=DocNew; DocPrint(doc,"$$PURPLE$$$$TX+CX,\"Graphic Resource Menu\"$$\n" "$$LK+PU+CX,\"Click for Help\",A=\"FI:::/Doc/Resource.TXT.Z\"$$\n" - "\n$$LTBLUE$$$$MU,\"Make Sprite\",LE=PT_SPRITE$$\n" - "$$MU,\"Pointer to Sprite\",LE=PT_SPRITE_PTR$$\n" - "$$MU,\"Duplicate Sprite\",LE=PT_DUP_SPRITE$$\n" - "$$MU,\"Sprite Size (not really needed)\",LE=PT_SPRITE_SIZE$$\n" - "$$MU,\"Sprite Macro (Icon)\",LE=PT_SPRITE_MACRO$$\n" - "$$MU,\"Sprite Menu Item\",LE=PT_SPRITE_MENU$$\n" - "$$MU,\"Sprite Link\",LE=PT_SPRITE_LINK$$\n" + "\n$$LTBLUE$$$$MU,\"Make Sprite\",LE=DVT_SPRITE$$\n" + "$$MU,\"Pointer to Sprite\",LE=DVT_SPRITE_PTR$$\n" + "$$MU,\"Duplicate Sprite\",LE=DVT_DUP_SPRITE$$\n" + "$$MU,\"Sprite Size (not really needed)\",LE=DVT_SPRITE_SIZE$$\n" + "$$MU,\"Sprite Macro (Icon)\",LE=DVT_SPRITE_MACRO$$\n" + "$$MU,\"Sprite Menu Item\",LE=DVT_SPRITE_MENU$$\n" + "$$MU,\"Sprite Link\",LE=DVT_SPRITE_LINK$$\n" "\n$$MU,\"Abort\",LE=DOCM_CANCEL$$\n\n"); i=PopUpMenu(doc); DocDel(doc); @@ -1074,12 +1074,12 @@ U8 *EdSprite(I64 bin_num) CEdMacroSprite *e=CAlloc(sizeof(CEdMacroSprite)); *buf=0; switch (type) { - case PT_SPRITE: + case DVT_SPRITE: StrPrint(e->tag,"<%d>",bin_num); if (DocFormDo(e,"CEdJustSprite",,,ctrl_L_footer)) st1=MStrPrint("\"%Q\"",e->tag); break; - case PT_SPRITE_MACRO: + case DVT_SPRITE_MACRO: e->escape=TRUE; if (DocFormDo(e,,,,ctrl_L_footer)) { CatPrint(buf,"+UL"); @@ -1091,26 +1091,26 @@ U8 *EdSprite(I64 bin_num) Free(st); } break; - case PT_SPRITE_MENU: + case DVT_SPRITE_MENU: e->escape=TRUE; if (DocFormDo(e,"CEdMenuSprite",,,ctrl_L_footer)) { if (e->escape) CatPrint(buf,"+X"); st1=MStrPrint("\"%Q\",LE=%s",e->tag,e->exp); } break; - case PT_SPRITE_LINK: + case DVT_SPRITE_LINK: CatPrint(buf,"+L"); st1=EdSpriteLink(&pop_up,&html_link); if (pop_up) CatPrint(buf,"+PU"); break; - case PT_SPRITE_PTR: + case DVT_SPRITE_PTR: EdInsBinary(--bin_num,DOCT_INS_BINARY); break; - case PT_SPRITE_SIZE: + case DVT_SPRITE_SIZE: EdInsBinary(--bin_num,DOCT_INS_BINARY_SIZE); break; - case PT_DUP_SPRITE: + case DVT_DUP_SPRITE: EdInsBinary(--bin_num,DOCT_SPRITE); break; } diff --git a/Adam/DolDoc/DocEd2a.CPP b/Adam/DolDoc/DocEdA.CPP similarity index 96% rename from Adam/DolDoc/DocEd2a.CPP rename to Adam/DolDoc/DocEdA.CPP index e768f67..0d558e0 100644 --- a/Adam/DolDoc/DocEd2a.CPP +++ b/Adam/DolDoc/DocEdA.CPP @@ -224,7 +224,8 @@ public U0 EdLineUp(CDoc *doc,I64 sc=MIN_I64) doc_ce=doc_ce->next; if (doc->flags & DOCF_FORM) { while (doc_ce->next->x==x && - (!Bt(doldoc.type_flags_form,doc_ce->type_u8) || + (!Bt(doldoc.type_flags_form,doc_ce->type_u8) && + !(doc_ce->de_flags&DOCEF_LINK)|| doc_ce->de_flags&DOCEF_SKIP_IN_FORM)) doc_ce=doc_ce->next; } @@ -566,8 +567,9 @@ ic_overstrike_char: DocInsEntry(doc,doc_ne); } else if (ch=='\t') { if (doc->flags&DOCF_FORM && - Bt(doldoc.type_flags_form,doc->cur_entry->type_u8) && - !(doc->cur_entry->de_flags&DOCEF_SKIP_IN_FORM)) { + (Bt(doldoc.type_flags_form,doc->cur_entry->type_u8) || + doc->cur_entry->de_flags&DOCEF_LINK) && + !(doc->cur_entry->de_flags&DOCEF_SKIP_IN_FORM)) { ic_form_tab: doc->cur_entry=doc->cur_entry->next; doc->cur_data_col=doc->cur_entry->min_col; @@ -652,12 +654,16 @@ U0 DocEntryToggle(CDoc *doc) U8 ch,*st,*st2; I64 i,j,k; if (doc_ce!=doc && !(doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS))) { - if (doc_ce->type_u8==DOCT_TEXT && !(doc_ce->de_flags & ~(DOCEF_TAG|DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT|DOCEF_SKIP|DOCEF_HARD_SKIP|DOCEF_FILTER_SKIP))) { + if (doc_ce->type_u8==DOCT_TEXT && + !(doc_ce->de_flags & ~(DOCEF_TAG|DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT|DOCEF_SKIP|DOCEF_HARD_SKIP|DOCEF_FILTER_SKIP)) && + !(doc_ce->type&DOCG_BL_IV_UL)) { doc_ce2=doc_ce->last; for (k=0;k<20;k++) { if (doc_ce2!=doc) { cl1=doc_ce2->last; - if (doc_ce2->type_u8==DOCT_TEXT && doc_ce->de_flags==doc_ce2->de_flags && doc_ce->type==doc_ce2->type) { + if (doc_ce2->type_u8==DOCT_TEXT && + doc_ce->de_flags==doc_ce2->de_flags && + doc_ce->type==doc_ce2->type) { i=StrLen(doc_ce2->tag); j=StrLen(doc_ce->tag); st=MAlloc(i+j+1,doc->mem_task); @@ -680,7 +686,9 @@ U0 DocEntryToggle(CDoc *doc) for (k=0;k<20;k++) { if (doc_ce2!=doc) { cl1=doc_ce2->next; - if (doc_ce2->type_u8==DOCT_TEXT && doc_ce->de_flags==doc_ce2->de_flags && doc_ce->type==doc_ce2->type) { + if (doc_ce2->type_u8==DOCT_TEXT && + doc_ce->de_flags==doc_ce2->de_flags && + doc_ce->type==doc_ce2->type) { i=StrLen(doc_ce->tag); j=StrLen(doc_ce2->tag); st=MAlloc(i+j+1,doc->mem_task); @@ -704,7 +712,8 @@ U0 DocEntryToggle(CDoc *doc) j=doc->cur_data_col+1; while (jmax_col && doc_ce->tag[j]!='$$') j++; - if (imin_col<=imax_col && doc_ce->tag[i]=='$$' && doc_ce->tag[j]=='$$') { + if (imin_col<=imax_col && + doc_ce->tag[i]=='$$' && doc_ce->tag[j]=='$$') { ch=doc_ce->tag[j+1]; doc_ce->tag[j+1]=0; st=StrNew(doc_ce->tag+i); diff --git a/Adam/DolDoc/DocEd2b.CPP b/Adam/DolDoc/DocEdB.CPP similarity index 83% rename from Adam/DolDoc/DocEd2b.CPP rename to Adam/DolDoc/DocEdB.CPP index 6e74710..0e4ef6d 100644 --- a/Adam/DolDoc/DocEd2b.CPP +++ b/Adam/DolDoc/DocEdB.CPP @@ -20,7 +20,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) !(sc&(SCF_CTRL|SCF_ALT))) { if (sc&SCF_KEY_DESC) { st=Char2KeyName(ch,FALSE); - SetKeyDesc("Char/'%s'",st); + KeyDescSet("Char/'%s'",st); Free(st); } else EdInsChar(ch,sc,doc); @@ -31,25 +31,25 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) switch (ch) { case CH_CTRLA: if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Save As"); + KeyDescSet("Edit/Save As"); else DocWrite(doc,TRUE); break; case CH_CTRLB: if (sc&SCF_KEY_DESC) - SetKeyDesc("Win/Toggle Border"); + KeyDescSet("Win/Toggle Border"); else WinBorder(Bt(&doc->win_task->display_flags,DISPLAYf_NO_BORDER),doc->win_task); break; case CH_CTRLC: if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Copy to Clipboard"); + KeyDescSet("Edit/Copy to Clipboard"); else EdCopyToClipboard(doc); break; case CH_CTRLD: if (sc&SCF_KEY_DESC) - SetKeyDesc("Cmd/Jump to File Manager"); + KeyDescSet("Cmd/Jump to File Manager"); else { DocUnlock(doc); FileMgr; @@ -59,31 +59,31 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case CH_CTRLF: if (sc&SCF_SHIFT) { if (sc&SCF_KEY_DESC) - SetKeyDesc("Cmd/Grep Wizard"); + KeyDescSet("Cmd/Find Wizard"); else GrepWiz; } else { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Find & Replace"); + KeyDescSet("Edit/Find & Replace"); else EdFindReplace(doc); } break; case CH_CTRLG: if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/GoTo Line Num"); + KeyDescSet("Edit/GoTo Line Num"); else EdGoToLine(doc); break; case CH_BACKSPACE: // if (sc&SCF_ALT && !(sc&SCF_CTRL)) { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Undo"); + KeyDescSet("Edit/Undo"); else DocUndoRestore(doc); } else { if (sc&SCF_KEY_DESC) - SetKeyDesc("Char/Back Space"); + KeyDescSet("Char/Back Space"); else { DocCaptureUndo(doc); doc_ce=doc->cur_entry; @@ -110,12 +110,12 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case CH_CTRLI: if (sc&SCF_SHIFT) { if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Indent Out"); + KeyDescSet("Dollar/Indent Out"); else DocPrint(doc,"$$ID,-2$$"); } else { if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Indent In"); + KeyDescSet("Dollar/Indent In"); else DocPrint(doc,"$$ID,2$$"); } @@ -123,15 +123,15 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case '\n': if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Char/Return"); + KeyDescSet("Char/Return"); else - SetKeyDesc("Char/Page Break"); + KeyDescSet("Char/Page Break"); } else EdInsChar(ch,sc,doc); break; case CH_CTRLK: if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Toggle Blinking Text"); + KeyDescSet("Dollar/Toggle Blinking Text"); else if (sc&SCF_SHIFT) DocPrint(doc,"$$BK,0$$"); else @@ -140,9 +140,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case CH_CTRLL: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Code Tools"); + KeyDescSet("Edit/Code Tools"); else - SetKeyDesc("Dollar/Wizard"); + KeyDescSet("Dollar/Wizard"); } else { if (sc&SCF_SHIFT) EdCodeTools(doc); @@ -156,14 +156,14 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case CH_CTRLM: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Cmd/Jump to Notes File"); + KeyDescSet("Cmd/Jump to Notes File"); else - SetKeyDesc("Cmd/Jump to Menu"); + KeyDescSet("Cmd/Jump to Menu"); } else { if (sc&SCF_SHIFT) - Ed("HOME/PersonalNotes.TXT.Z"); + Ed("::/Home/PersonalNotes.TXT.Z"); else { - m=DocRead("HOME/PersonalMenu.TXT.Z"); + m=DocRead("::/Home/PersonalMenu.TXT.Z"); DocMenuDo(m); DocDel(m); } @@ -172,9 +172,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case CH_CTRLO: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Collapse"); + KeyDescSet("Edit/Collapse"); else - SetKeyDesc("Edit/Uncolapse"); + KeyDescSet("Edit/Uncolapse"); } else { if (sc&SCF_SHIFT) DocCollapse(TRUE,doc); @@ -185,21 +185,21 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case CH_CTRLP: if (doc->flags & (DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE)) { if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Toggle Super or Sub script"); + KeyDescSet("Dollar/Toggle Super or Sub script"); else { DocPrint(doc,"$$SY,0$$"); doc->flags&=~(DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE); } } else if (sc&SCF_SHIFT) { if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Toggle Subscript"); + KeyDescSet("Dollar/Toggle Subscript"); else { DocPrint(doc,"$$SY,3$$"); doc->flags|=DOCF_SUBSCRIPT_MODE; } } else { if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Toggle Superscript"); + KeyDescSet("Dollar/Toggle Superscript"); else { DocPrint(doc,"$$SY,-3$$"); doc->flags|=DOCF_SUPERSCRIPT_MODE; @@ -210,7 +210,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) break; case CH_CTRLR: if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Edit or Create Graphic"); + KeyDescSet("Dollar/Edit or Create Graphic"); else { if (!(doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS))) { DocUnlock(doc); @@ -229,12 +229,12 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case CH_CTRLS: if (sc&SCF_SHIFT) { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Find Misspelled"); + KeyDescSet("Edit/Find Misspelled"); else - WSFindMisspelled(doc); + ACFindMisspelled(doc); } else { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Save"); + KeyDescSet("Edit/Save"); else DocWrite(doc); } @@ -242,12 +242,12 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case CH_CTRLT: if (sc&SCF_SHIFT) { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Single Entry Toggle Plain Text"); + KeyDescSet("Edit/Single Entry Toggle Plain Text"); else DocEntryToggle(doc); } else { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Toggle Plain Text Display"); + KeyDescSet("Edit/Toggle Plain Text Display"); else if (!(doc->flags&DOCF_FORM) || doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS)) DocFlagsToggle(doc,DOCF_PLAIN_TEXT); @@ -255,7 +255,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) break; case CH_CTRLU: if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Toggle Underline"); + KeyDescSet("Dollar/Toggle Underline"); else if (sc&SCF_SHIFT) DocPrint(doc,"$$UL,0$$"); else @@ -263,13 +263,13 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) break; case CH_CTRLV: if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Paste Clipboard"); + KeyDescSet("Edit/Paste Clipboard"); else EdPasteClipboard(doc); break; case CH_CTRLW: if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Toggle Word Wrap"); + KeyDescSet("Dollar/Toggle Word Wrap"); else if (sc&SCF_SHIFT) DocPrint(doc,"$$WW,0$$"); else @@ -277,19 +277,19 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) break; case CH_CTRLX: if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Cut To Clipboard"); + KeyDescSet("Edit/Cut To Clipboard"); else EdCutToClipboard(doc); break; case CH_CTRLY: if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Delete Line"); + KeyDescSet("Edit/Delete Line"); else EdDelLine(doc); break; case CH_CTRLZ: if (sc&SCF_KEY_DESC) - SetKeyDesc("Dollar/Toggle Inverted Text"); + KeyDescSet("Dollar/Toggle Inverted Text"); else if (sc&SCF_SHIFT) DocPrint(doc,"$$IV,0$$"); else @@ -300,23 +300,23 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) if (sc&SCF_CTRL) { if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Jump to Word Definition"); + KeyDescSet("Edit/Jump to Word Definition"); else - SetKeyDesc("Edit/Autocomplete Word"); + KeyDescSet("Edit/Autocomplete Word"); } else { - if (WordStat(ON)) { + if (AutoComplete(ON)) { DocUnlock(doc); if (sc&SCF_SHIFT) - WSDDef(ch-'0',Fs); + ACDDef(ch-'0',Fs); else - WSDFillin(ch-'0'); + ACDFillin(ch-'0'); DocLock(doc); } } } } else { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Enter extended-ASCII"); + KeyDescSet("Edit/Enter extended-ASCII"); else { if (++doc->ext_ascii_cnt==1) doc->ext_ascii_val=ch-'0'; @@ -333,12 +333,12 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) if (!(sc&SCF_ALT) && sc&SCF_CTRL) { if (sc&SCF_SHIFT) { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/GoTo matching brace"); + KeyDescSet("Edit/GoTo matching brace"); else EdFindPaired(doc,'}','{',FALSE); } else { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/GoTo matching bracket"); + KeyDescSet("Edit/GoTo matching bracket"); else EdFindPaired(doc,']','[',FALSE); } @@ -348,12 +348,12 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) if (!(sc&SCF_ALT) && sc&SCF_CTRL) { if (sc&SCF_SHIFT) { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/GoTo matching brace"); + KeyDescSet("Edit/GoTo matching brace"); else EdFindPaired(doc,'{','}',TRUE); } else { if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/GoTo matching bracket"); + KeyDescSet("Edit/GoTo matching bracket"); else EdFindPaired(doc,'[',']',TRUE); } @@ -366,16 +366,16 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) if (sc&SCF_CTRL) { if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Jump to Src of Sym"); + KeyDescSet("Edit/Jump to Src of Sym"); else - SetKeyDesc("Edit/Autocomplete Sym"); + KeyDescSet("Edit/Autocomplete Sym"); } else { DocUnlock(doc); - if (WordStat(ON)) { + if (AutoComplete(ON)) { if (sc&SCF_SHIFT) - WSMan(sc2-SC_F1+1,Fs); + ACMan(sc2-SC_F1+1,Fs); else - WSFillIn(sc2-SC_F1+1); + ACFillIn(sc2-SC_F1+1); } DocLock(doc); } @@ -384,12 +384,12 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_F1: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("About"); + KeyDescSet("About"); else - SetKeyDesc("Help"); + KeyDescSet("Help"); } else { if (sc&SCF_SHIFT) - Ed("::/Doc/Splash.TXT.Z"); + Ed("::/Doc/AboutTempleOS.TXT.Z"); else Ed("::/Doc/HelpIndex.TXT.Z"); } @@ -397,9 +397,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_F2: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Play Macro"); + KeyDescSet("Edit/Play Macro"); else - SetKeyDesc("Edit/Macro"); + KeyDescSet("Edit/Macro"); } else { DocUnlock(doc); if (sc&SCF_SHIFT) { @@ -415,9 +415,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_F3: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Find Last"); + KeyDescSet("Edit/Find Last"); else - SetKeyDesc("Edit/Find Next"); + KeyDescSet("Edit/Find Next"); }else { doc->find_replace->scan_fwd=!(sc&SCF_SHIFT); EdFindNext(doc); @@ -426,9 +426,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_F4: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Misc/Insert Directory Name"); + KeyDescSet("Misc/Insert Directory Name"); else - SetKeyDesc("Misc/Insert FileName"); + KeyDescSet("Misc/Insert FileName"); } else { DocUnlock(doc); if (sc&SCF_SHIFT) @@ -445,9 +445,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_F5: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Cmd/Adam Include"); + KeyDescSet("Cmd/Adam Include"); else - SetKeyDesc("Cmd/Run (Execute);Dbg/Go"); + KeyDescSet("Cmd/Run (Execute);Dbg/Go"); } else { if (st2=DocEntryLink(doc,doc_ce)) { st=DocLinkFile(st2); @@ -475,9 +475,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_F6: if (sc&SCF_KEY_DESC) { if (sc & SCF_SHIFT) - SetKeyDesc("God Doodle"); + KeyDescSet("God Doodle"); else - SetKeyDesc("God Song"); + KeyDescSet("God Song"); } else { //$LK,"::/Adam/God/HSNotes.TXT"$ if (sc & SCF_SHIFT) @@ -489,9 +489,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_F7: if (sc&SCF_KEY_DESC) { if (sc & SCF_SHIFT) - SetKeyDesc("God Passage"); + KeyDescSet("God Passage"); else - SetKeyDesc("God Word"); + KeyDescSet("God Word"); } else { //$LK,"::/Adam/God/HSNotes.TXT"$ FifoU8Flush(god.fifo); @@ -511,9 +511,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) if (sc2==SC_END || sc&SCF_CTRL) { if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/GoTo Doc End, Select"); + KeyDescSet("Edit/GoTo Doc End, Select"); else - SetKeyDesc("Edit/GoTo Doc End"); + KeyDescSet("Edit/GoTo Doc End"); } else { while (doc_ce!=doc) { BEqu(&doc_ce->type,DOCEt_SELECTED,sc&SCF_SHIFT); @@ -524,9 +524,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) } } else if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Cursor Down, Select"); + KeyDescSet("Edit/Cursor Down, Select"); else - SetKeyDesc("Edit/Cursor Down"); + KeyDescSet("Edit/Cursor Down"); } else EdLineDown(doc,sc); break; @@ -535,9 +535,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) if (sc2==SC_HOME || sc&SCF_CTRL) { if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/GoTo Top of Doc, Select"); + KeyDescSet("Edit/GoTo Top of Doc, Select"); else - SetKeyDesc("Edit/GoTo Top of Doc"); + KeyDescSet("Edit/GoTo Top of Doc"); } else { if (doc_ce==doc) doc_ce=doc_ce->last; while (doc_ce!=doc) { @@ -550,18 +550,18 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) } } else if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Cursor Up, Select"); + KeyDescSet("Edit/Cursor Up, Select"); else - SetKeyDesc("Edit/Cursor Up"); + KeyDescSet("Edit/Cursor Up"); } else EdLineUp(doc,sc); break; case SC_PAGE_DOWN: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Page Down, Select"); + KeyDescSet("Edit/Page Down, Select"); else - SetKeyDesc("Edit/Page Down"); + KeyDescSet("Edit/Page Down"); } else { i=doc_ce->y+doc->win_task->win_height-1; if (doc_ce->type_u8==DOCT_HEX_ED) @@ -580,9 +580,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_PAGE_UP: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Page Up, Select"); + KeyDescSet("Edit/Page Up, Select"); else - SetKeyDesc("Edit/Page Up"); + KeyDescSet("Edit/Page Up"); }else { i=doc_ce->y-(doc->win_task->win_height-1); if (doc_ce->type_u8==DOCT_HEX_ED) @@ -602,12 +602,12 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_CURSOR_LEFT: if (sc&SCF_KEY_DESC) { if (sc&SCF_CTRL) - SetKeyDesc("Edit/GoTo Start of Line"); + KeyDescSet("Edit/GoTo Start of Line"); else { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Cursor Left, Select"); + KeyDescSet("Edit/Cursor Left, Select"); else - SetKeyDesc("Edit/Cursor Left"); + KeyDescSet("Edit/Cursor Left"); } } else EdCursorLeft(doc,sc); @@ -615,12 +615,12 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_CURSOR_RIGHT: if (sc&SCF_KEY_DESC) { if (sc&SCF_CTRL) - SetKeyDesc("Edit/GoTo End of Line"); + KeyDescSet("Edit/GoTo End of Line"); else { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Cursor Right, Select"); + KeyDescSet("Edit/Cursor Right, Select"); else - SetKeyDesc("Edit/Cursor Right"); + KeyDescSet("Edit/Cursor Right"); } } else EdCursorRight(doc,sc); @@ -628,9 +628,9 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_DELETE: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Cut To Clipboard"); + KeyDescSet("Edit/Cut To Clipboard"); else - SetKeyDesc("Char/Delete"); + KeyDescSet("Char/Delete"); } else { if (sc&SCF_SHIFT) EdCutToClipboard(doc); @@ -641,11 +641,11 @@ public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0) case SC_INS: if (sc&SCF_KEY_DESC) { if (sc&SCF_SHIFT) - SetKeyDesc("Edit/Paste Clipboard"); + KeyDescSet("Edit/Paste Clipboard"); else if (sc&SCF_CTRL) - SetKeyDesc("Edit/Copy to Clipboard"); + KeyDescSet("Edit/Copy to Clipboard"); else - SetKeyDesc("Edit/Toggle Overstrike"); + KeyDescSet("Edit/Toggle Overstrike"); } else { if (sc&SCF_SHIFT) EdPasteClipboard(doc); @@ -791,7 +791,7 @@ Bool DocFileEd(I64 _type,U8 *filename, if (!FileNameChk(st2)) doc=NULL; else { - Silent(ON); + Silent; if (Bt(&edf_dof_flags,EDf_BAIL)) //if bail, scan parents result=FileFind(filename,, FUF_JUST_FILES|FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS); @@ -802,7 +802,7 @@ Bool DocFileEd(I64 _type,U8 *filename, doc=DocRead(filename,flags); doc->desc='Edit'; Silent(old_silent); - Fs->border_src=BDS_ED_FILENAME_PRT; + Fs->border_src=BDS_ED_FILENAME_DRV; } Free(st1); @@ -835,14 +835,19 @@ Bool DocFileEd(I64 _type,U8 *filename, } *_num=doc->cur_entry->y+1; + if (edf_dof_flags&EDF_WAS_WRITE) + result=FALSE; if (!(edf_dof_flags&EDF_BAIL) && DocDo(doc,edf_dof_flags|DOF_DONT_HOME)) { DocLock(doc); doc_e=doc->cur_entry; if (doc_e!=doc) DocEntryRun(doc,doc_e,TRUE); DocUnlock(doc); - if (!(LK_DOC<=_type<=LK_DOC_LINE)) + if (!(LK_DOC<=_type<=LK_DOC_LINE)) { DocWrite(doc); + if (edf_dof_flags&EDF_WAS_WRITE) + result=TRUE; + } } if (!(LK_DOC<=_type<=LK_DOC_LINE)) DocDel(doc); @@ -912,7 +917,7 @@ public I64 EdLinkCvt(U8 *link_st,U8 **_filename=NULL,U8 **_needle_str=NULL, result=-1; else { num=Str2I64(DefineSub(i,"ST_BIBLE_BOOK_LINES")); - filename2=Define("ST_BIBLE_FILE"); + filename2=BIBLE_FILENAME; } break; case LK_FILE_LINE: diff --git a/Adam/DolDoc/DocFile.CPP b/Adam/DolDoc/DocFile.CPP index 0b7a9de..3ea3a8a 100644 --- a/Adam/DolDoc/DocFile.CPP +++ b/Adam/DolDoc/DocFile.CPP @@ -81,7 +81,8 @@ public U8 *DocSave(CDoc *doc,I64 *_size=NULL) cnt++; break; case DOCT_TEXT://$BK,1$Update $LK,"DOCT_TEXT",A="FF:D:/Compiler/Lex.CPP,DOCT_TEXT"$$BK,0$ - if (!(doc_e->de_flags & ~(DOCEF_TAG|DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT|DOCEF_SKIP|DOCEF_HARD_SKIP|DOCEF_FILTER_SKIP))) { + if (!(doc_e->de_flags & ~(DOCEF_TAG|DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT|DOCEF_SKIP|DOCEF_HARD_SKIP|DOCEF_FILTER_SKIP)) && + !(doc_e->type&DOCG_BL_IV_UL)) { cnt+=StrLen(doc_e->tag); if (!(doc->flags & (DOCF_PLAIN_TEXT | DOCF_PLAIN_TEXT_WITH_TABS)) || doc->flags&DOCF_DBL_DOLLARS) @@ -112,7 +113,8 @@ public U8 *DocSave(CDoc *doc,I64 *_size=NULL) for (doc_e=doc->root.next;doc_e!=doc;doc_e=doc_e->next) { if (!Bt(doldoc.type_flags_data,doc_e->type_u8)) { if (doc_e->type_u8==DOCT_TEXT && - !(doc_e->de_flags & ~(DOCEF_TAG|DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT|DOCEF_SKIP|DOCEF_HARD_SKIP|DOCEF_FILTER_SKIP))) { + !(doc_e->de_flags & ~(DOCEF_TAG|DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT|DOCEF_SKIP|DOCEF_HARD_SKIP|DOCEF_FILTER_SKIP)) && + !(doc_e->type&DOCG_BL_IV_UL)) { src=doc_e->tag; i=0; while (ch=*src++) { @@ -187,10 +189,9 @@ public Bool DocWrite(CDoc *doc,Bool prompt=FALSE) {//Store doc to disk. I64 size; U8 *buf; - if (prompt && !DocFormDo(&doc->filename)) - return FALSE; - if (doc->filename.name[0]=='A'&&doc->filename.name[2]==':') - return FALSE; //LK_DOC,LK_DOC_ANCHOR,LK_DOC_FIND,LK_DOC_LINE + if (prompt && !DocFormDo(&doc->filename) || + doc->filename.name[0]=='A' && doc->filename.name[2]==':') + return FALSE; //CANCEL || LK_DOC,LK_DOC_ANCHOR,LK_DOC_FIND,LK_DOC_LINE? buf=DocSave(doc,&size); FileWrite(doc->filename.name,buf,size,0,doc->file_attr); Free(buf); @@ -440,13 +441,13 @@ public Bool DocType(CDoc *doc=NULL,U8 *filename,I64 trailing_new_lines=1) DocDel(doc2); result=TRUE; } else if (FilesFindMatch(filename,"*.BMP.Z")) { - DocBMPFile(doc,filename,FALSE); + DocBMP(doc,filename,,FALSE); result=TRUE; } else if (FilesFindMatch(filename,"*.BMP;*.bmp")) { - DocBMPFile(doc,filename,TRUE); + DocBMP(doc,filename,,TRUE); result=TRUE; } else if (FilesFindMatch(filename,"*.GRA*")) { - DocGRAFile(doc,filename); + DocGRA(doc,filename); result=TRUE; } if (result) diff --git a/Adam/DolDoc/DocInit.CPP b/Adam/DolDoc/DocInit.CPP index 8593eff..67b4644 100644 --- a/Adam/DolDoc/DocInit.CPP +++ b/Adam/DolDoc/DocInit.CPP @@ -14,8 +14,8 @@ U0 DocInit() "T\0A\0D\0HTML\0LE\0LM\0RE\0RM\0BI\0BP\0RT\0SX\0SY\0SCX\0U\0" "LC\0LA\0RC\0RA\0TC\0LX\0CX\0RX\0TY\0CY\0BY\0" "HL\0WW\0BK\0IV\0SEL\0UL\0" - "PRY\0MRX\0WR\0L\0X\0Q\0FST\0B\0S\0BD\0C\0CA\0RD\0P\0TRM\0Z\0H\0" - "TR\0LS\0SK\0PU\0SIF\0HS\0FS\0NC\0DD\0UD\0"); + "PRY\0MRX\0WR\0L\0X\0Q\0FST\0B\0S\0BD\0C\0CA\0RD\0UD\0P\0TRM\0Z\0H\0" + "TR\0LS\0SK\0PU\0SIF\0HS\0FS\0NC\0DD\0"); DefineLstLoad("ST_LINK_TYPES", "FI\0FA\0FF\0FL\0MN\0PI\0PF\0PL\0BF\0DF\0HI\0AD\0AI\0AA\0AF\0AL\0"); diff --git a/Adam/DolDoc/DocMacro.CPP b/Adam/DolDoc/DocMacro.CPP index ce19336..fc9da52 100644 --- a/Adam/DolDoc/DocMacro.CPP +++ b/Adam/DolDoc/DocMacro.CPP @@ -168,7 +168,7 @@ I64 PopUpMacroMenu() "\n\n\n$$GREEN$$SHIFT-F2$$FG$$ will play macro.\n"); doc->flags|=DOCF_MIN_SIZE | DOCF_FORM; StrPrint(buf,"DocMenuDo(%d);",doc); - sys_macro_util_task=Spawn(&SrvUserCmdLine,NULL,"Macro Popup",,Fs); + sys_macro_util_task=Spawn(&SrvCmdLine,NULL,"Macro Popup",,Fs); Fs->popup_task=sys_macro_util_task; LBts(&sys_macro_util_task->display_flags,DISPLAYf_WIN_ON_TOP); tempc=TaskExe(sys_macro_util_task,Fs,buf, @@ -189,7 +189,7 @@ U0 MacroTask(I64) sys_macro_repeat_n=1; do { i=PopUpMacroMenu; - WinRefocus; + WinRefocus(sys_focus_task); switch (i) { case SM_RECORD: LBtr(&sys_semas[SYS_SEMA_RECORD_MACRO],0); diff --git a/Adam/DolDoc/DocMain.CPP b/Adam/DolDoc/DocMain.CPP index 8dd5fd2..767b9d5 100644 --- a/Adam/DolDoc/DocMain.CPP +++ b/Adam/DolDoc/DocMain.CPP @@ -13,7 +13,7 @@ public Bool Ed(U8 *link_st,I64 edf_dof_flags=0) case LK_DEF: doc=DocNew; doc->desc='DictDef'; - WSDDefsPut(doc,filename,num); + ACDDefsPut(doc,filename,num); goto ej_doc; case LK_HELP_INDEX: doc=DocNew; @@ -24,11 +24,12 @@ ej_doc: DocDo(doc); DocDel(doc); } - result=TRUE; + if (!(edf_dof_flags&EDF_WAS_WRITE)) + result=TRUE; break; default: if (IsRaw) - EdLite(filename,num); + result=EdLite(filename,num,edf_dof_flags); else { cont=TRUE; if (!(edf_dof_flags&EDF_BAIL) && !(LK_DOC<=i<=LK_DOC_LINE) && @@ -44,11 +45,11 @@ ej_doc: return result; } -public Bool Plain(U8 *filename) +public Bool Plain(U8 *filename,I64 edf_dof_flags=0) {//Edit document in plain text mode, so dollar signs are not special. Bool result; U8 *st=MStrPrint("PI:%s",filename); - result=Ed(st); + result=Ed(st,edf_dof_flags); Free(st); return result; } @@ -97,7 +98,7 @@ public U8 *DocLinkFile(U8 *link_st,CTask *mem_task=NULL) Free(st); break; case LK_BIBLE_FIND: - result=StrNew(Define("ST_BIBLE_FILE"),mem_task); + result=StrNew(BIBLE_FILENAME,mem_task); break; } Free(filename); @@ -148,7 +149,7 @@ public U0 DocTermNew() CDoc *pdoc=DocNew; pdoc->right_click_link=&TermRightClickLink; pdoc->max_entries=4096; - Fs->border_src=BDS_CUR_PRT; + Fs->border_src=BDS_CUR_DRV; pdoc->desc='Term'; Fs->put_doc=Fs->display_doc=pdoc; Fs->border_doc=DocBorderNew(pdoc); @@ -531,7 +532,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) } "AutoFile(\"%s\");\n$$PT$$$$FG$$$$BG$$",st; WinZBufUpdate; - AutoStr("%F\n",st); + AutoFile(st); result=TRUE; break; } diff --git a/Adam/DolDoc/DocNew.CPP b/Adam/DolDoc/DocNew.CPP index a479ddf..fa2eb7c 100644 --- a/Adam/DolDoc/DocNew.CPP +++ b/Adam/DolDoc/DocNew.CPP @@ -265,8 +265,9 @@ U0 DocFormFwd(CDoc *doc,Bool giveup=FALSE) CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e; if (doc->flags & DOCF_FORM) { if (doc_e==doc) goto ff_recover; - while (!Bt(doldoc.type_flags_form,doc_e->type_u8) || - doc_e->de_flags&DOCEF_SKIP_IN_FORM) { + while (!Bt(doldoc.type_flags_form,doc_e->type_u8) && + !(doc_e->de_flags&DOCEF_LINK) || + doc_e->de_flags&DOCEF_SKIP_IN_FORM) { doc_e=doc_e->next; if (doc_e==doc) { ff_recover: @@ -292,8 +293,9 @@ U0 DocFormBwd(CDoc *doc,Bool giveup=FALSE) { CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e; if (doc->flags & DOCF_FORM) { - while (!Bt(doldoc.type_flags_form,doc_e->type_u8) || - doc_e->de_flags&DOCEF_SKIP_IN_FORM) { + while (!Bt(doldoc.type_flags_form,doc_e->type_u8) && + !(doc_e->de_flags&DOCEF_LINK) || + doc_e->de_flags&DOCEF_SKIP_IN_FORM) { doc_e=doc_e->last; if (doc_e==doc) { doc->cur_data_col=0; diff --git a/Adam/DolDoc/DocPopUp.CPP b/Adam/DolDoc/DocPopUp.CPP index 9d4ac57..839a363 100644 --- a/Adam/DolDoc/DocPopUp.CPP +++ b/Adam/DolDoc/DocPopUp.CPP @@ -302,8 +302,8 @@ public Bool DocDo(CDoc *doc,I64 dof_flags=0) Free(old_task_title); DocDel(bdoc); if (dof_flags&DOF_MIN_SIZE) { - SetWinHorz(old_left,old_right); - SetWinVert(old_top,old_bottom); + WinHorz(old_left,old_right); + WinVert(old_top,old_bottom); } Preempt(old_preempt); return result; @@ -403,32 +403,7 @@ md_restart: return result; } -#help_index "Task/Srv" -public I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL) -{//Execute code text in PopUp win task. - I64 result; - CSrvCmd *tempc; - Bool old_preempt=Preempt(OFF); - CTask *task=Spawn(&SrvUserCmdLine,NULL,"System",,parent); - if (!parent) { - TaskExe(task,parent,buf,1<popup_task=task; - tempc=TaskExe(task,parent,buf,1<popup_task=NULL; - Kill(task); - if (_pu_task) *_pu_task=NULL; - Preempt(old_preempt); - return result; - } -} - -#help_index "DolDoc;Task/Srv" +#help_index "DolDoc;Task/Srv/Exe" public I64 PopUpEd(U8 *filename,CTask *parent=NULL,CTask **_pu_task=NULL) {//Create PopUp win task and edit a doc. U8 *st=MStrPrint("Ed(\"%Q\");",filename); @@ -441,7 +416,7 @@ public I64 PopUpEd(U8 *filename,CTask *parent=NULL,CTask **_pu_task=NULL) public CTask *PopUpViewDoc(CDoc *doc,I64 dof_flags=0) {//Pass doc to PopUp win task for viewing. U8 *buf=MStrPrint("Preempt(ON);DocDo(0x%X,0x%X);",doc,dof_flags); - CTask *task=Spawn(&SrvUserCmdLine,NULL,"View",,Fs); + CTask *task=Spawn(&SrvCmdLine,NULL,"View",,Fs); TaskExe(task,NULL,buf,1<flags|=DOCF_MIN_SIZE | DOCF_FORM; - return SrvUser("DocMenuDo(0x%X,0x%X);",doc,dof_flags); + return PopUpPrint("DocMenuDo(0x%X,0x%X);",doc,dof_flags); } public Bool PopUpForm(U8 *_d,U8 *class_name=lastclass,I64 dof_flags=DOF_MIN_SIZE, U8 *header=NULL,U8 *footer=NULL) {//See $LK,"::/Demo/DolDoc/Form.CPP"$ and $LK,"::/Demo/LastClass.CPP"$. - return SrvUser("DocFormDo(0x%X,0x%X,0x%X,0x%X,0x%X);",_d,class_name, + return PopUpPrint("DocFormDo(0x%X,0x%X,0x%X,0x%X,0x%X);",_d,class_name, dof_flags,header,footer); } @@ -727,7 +702,7 @@ public F64 PopUpRangeF64Log(F64 lo,F64 hi,I64 steps, return PopUpRangeF64Exp(lo,hi,Exp(Ln(hi/lo)/(steps-1)),fmt,header,footer); } -#help_index "Task/Srv" +#help_index "Task/Srv/Exe" public I64 AdamFile(U8 *filename,Bool warn_ext=TRUE) {//Tell adam task to compile and run a file. Bool okay=TRUE; @@ -875,8 +850,8 @@ U0 DrawIt(CTask *task,CDC *dc) } i=(17*PU_SPACING+FONT_WIDTH-1)/FONT_WIDTH; if (doc->max_x>i) i=doc->max_x; - SetWinHorz(task->win_left,task->win_left+i,task); - SetWinVert(task->win_top,task->win_top+doc->max_y+(17*PU_SPACING+FONT_WIDTH-1)/FONT_WIDTH,task); + WinHorz(task->win_left,task->win_left+i,task); + WinVert(task->win_top,task->win_top+doc->max_y+(17*PU_SPACING+FONT_WIDTH-1)/FONT_WIDTH,task); } I64 DitherColorDo(U8 *header=NULL) diff --git a/Adam/DolDoc/DocRecalc2a.CPP b/Adam/DolDoc/DocRecalcA.CPP similarity index 95% rename from Adam/DolDoc/DocRecalc2a.CPP rename to Adam/DolDoc/DocRecalcA.CPP index e2d5c6e..362a766 100644 --- a/Adam/DolDoc/DocRecalc2a.CPP +++ b/Adam/DolDoc/DocRecalcA.CPP @@ -169,23 +169,23 @@ public U0 DocPrintAtomic(CDoc *doc,U8 *fmt,...) #help_index "DolDoc/Task" U0 DocUpdateTaskDocs(CTask *task) {//This is called from $LK,"GrUpdateWins",A="MN:GrUpdateWins"$() by the winmgr at 30fps. - CPrt *p; + CDrv *dv; CDoc *doc; CD3I64 saved_scroll; Bool old_preempt=Preempt(OFF); I64 border_attr; - if (task->border_src==BDS_CUR_PRT && task->cur_prt) { - border_attr=task->cur_prt->text_attr; + if (task->border_src==BDS_CUR_DRV && task->cur_dv) { + border_attr=task->cur_dv->text_attr; if (border_attr&15!=border_attr>>4) task->border_attr=border_attr; } if (task->title_src==TTS_TASK_NAME) StrCpy(task->task_title,task->task_name); if ((doc=DocDisplay(task)) && !(doc->flags&DOCF_DONT_SHOW)) { - if (task->border_src==BDS_ED_FILENAME_PRT) + if (task->border_src==BDS_ED_FILENAME_DRV) try { - if (p=Drv2Prt(*doc->filename.name)) { - border_attr=p->text_attr; + if (dv=Let2Drv(*doc->filename.name)) { + border_attr=dv->text_attr; if (border_attr&15!=border_attr>>4) task->border_attr=border_attr; } diff --git a/Adam/DolDoc/DocRecalc2b.CPP b/Adam/DolDoc/DocRecalcB.CPP similarity index 99% rename from Adam/DolDoc/DocRecalc2b.CPP rename to Adam/DolDoc/DocRecalcB.CPP index 6853488..449eecc 100644 --- a/Adam/DolDoc/DocRecalc2b.CPP +++ b/Adam/DolDoc/DocRecalcB.CPP @@ -294,7 +294,7 @@ public Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC) dc=DCAlias(gr.dc2,win_task); //Necessary for sprites break; case DOC_RECALC_TO_SCREEN: - if (doc->refresh_cnt++%(ToI64(winmgr.fps/10)+1) && + if (doc->updates_cnt++%(ToI64(winmgr.fps/10)+1) && !Bt(&doc->flags,DOCf_DO_FULL_REFRESH) && !(doc->flags&DOCF_BWD_MOVEMENT)) full_refresh=FALSE; @@ -1127,26 +1127,26 @@ rc_skip: i=left+doc->max_x-doc->min_x; if (i>TEXT_COLS-1) i=TEXT_COLS-1; - SetWinHorz(left,i,win_task); + WinHorz(left,i,win_task); if (top<0) top=0; i=top+doc->max_y-doc->min_y; if (i>TEXT_ROWS-1) i=TEXT_ROWS-1; - SetWinVert(top,i,win_task); + WinVert(top,i,win_task); } else { if (left<1) left=1; i=left+doc->max_x-doc->min_x; if (i>TEXT_COLS-2) i=TEXT_COLS-2; - SetWinHorz(left,i,win_task); + WinHorz(left,i,win_task); if (top<1) top=1; i=top+doc->max_y-doc->min_y; if (i>TEXT_ROWS-2) i=TEXT_ROWS-2; - SetWinVert(top,i,win_task); + WinVert(top,i,win_task); } } if (find_cursor) { diff --git a/Adam/Dsk/Dsk2.CPP b/Adam/Dsk/ADsk.CPP similarity index 52% rename from Adam/Dsk/Dsk2.CPP rename to Adam/Dsk/ADsk.CPP index e0fa865..e14857a 100644 --- a/Adam/Dsk/Dsk2.CPP +++ b/Adam/Dsk/ADsk.CPP @@ -1,4 +1,4 @@ -#include "Dsk2a" -#include "Dsk2b" +#include "ADskA" +#include "ADskB" #include "ChkDsk" #include "FileMgr" diff --git a/Adam/Dsk/Dsk2a.CPP b/Adam/Dsk/ADskA.CPP similarity index 85% rename from Adam/Dsk/Dsk2a.CPP rename to Adam/Dsk/ADskA.CPP index c4b30fc..724cd6b 100644 --- a/Adam/Dsk/Dsk2a.CPP +++ b/Adam/Dsk/ADskA.CPP @@ -7,13 +7,13 @@ public U8 *DBlk(I64 blk,Bool write=FALSE) //See $LK,"::/Demo/Dsk/DskRaw.CPP"$. U8 *buf=MAlloc(BLK_SIZE); - RBlks(Fs->cur_prt,buf,blk,1); + RBlks(Fs->cur_dv,buf,blk,1); DocD(buf,BLK_SIZE); if (write) { "Edit and press to write or \n"; if (View) { "Write\n"; - WBlks(Fs->cur_prt,buf,blk,1); + WBlks(Fs->cur_dv,buf,blk,1); } } return buf; @@ -25,16 +25,35 @@ public U8 *DCluster(I64 c,Bool write=FALSE,I64 num=0) //be written when you press . //See $LK,"::/Demo/Dsk/DskRaw.CPP"$. //Do $LK,"Dir",A="MN:Dir"$("*",TRUE); to get cluster numbers of files. - U8 *buf=MAlloc(Fs->cur_prt->spc<cur_prt,c,num); - RClusters(Fs->cur_prt,buf,c,1); + U8 *buf=MAlloc(Fs->cur_dv->spc<cur_dv,c,num); + RClusters(Fs->cur_dv,buf,c,1); "Cluster:%X\n",c; - DocD(buf,Fs->cur_prt->spc<cur_dv->spc< to write or \n"; if (View) { "Write\n"; - WClusters(Fs->cur_prt,buf,c,1); + WClusters(Fs->cur_dv,buf,c,1); + } + } + return buf; +} + +public U8 *Dump(U8 *filename,Bool write=FALSE) +{//Dump file. Optionally, write. +//If you set write to TRUE, the file will +//be written when you press . + U8 *buf; + I64 size; + if (buf=FileRead(filename,&size)) { + DocD(buf,size); + if (write) { + "Edit and press to write or \n"; + if (View) { + "Write\n"; + FileWrite(filename,buf,size); + } } } return buf; @@ -218,7 +237,7 @@ public I64 DelTree(U8 *files_find_mask,U8 *fu_flags=NULL) U0 TouchFile(U8 *filename,U8 *attr,CDate cdt=MIN_I64) { - CPrt *p=Drv2Prt(*filename); + CDrv *dv=Let2Drv(*filename); CDirEntry de; U8 *cur_dir=StrNew(filename), buf[136]; @@ -236,7 +255,7 @@ U0 TouchFile(U8 *filename,U8 *attr,CDate cdt=MIN_I64) de.datetime=Now; else de.datetime=cdt; - DirNew(p,cur_dir,&de,FALSE); + DirNew(dv,cur_dir,&de,FALSE); } } else PrintErr("File not found.\n"); @@ -279,69 +298,69 @@ public I64 FF(U8 *files_find_mask,U8 *fu_flags=NULL) return cnt; } -public U0 SetDrvTextAttr(U8 drv_let,U8 attr) +public U0 DrvTextAttrSet(U8 drv_let,U8 attr) {//Set color of the window border text //for when this drive is the current drive. - CPrt *p; + CDrv *dv; try { - p=Drv2Prt(drv_let); - p->text_attr=attr; + dv=Let2Drv(drv_let); + dv->text_attr=attr; } catch Fs->catch_except=TRUE; } -I64 RedSeaFSUnusedDrvSpace(U8 drv_let=0) +I64 RedSeaUnusedDrvSpace(U8 drv_let=0) { - CPrt *p=Drv2Prt(drv_let); + CDrv *dv=Let2Drv(drv_let); I64 result=0,i,l; U8 *bitmap; try { - l=(p->size+p->spc-1)/p->spc; + l=(dv->size+dv->spc-1)/dv->spc; i=((l+7)>>3+BLK_SIZE-1)>>BLK_SIZE_BITS; bitmap=MAlloc(i<map1,i); + RBlks(dv,bitmap,dv->map1,i); for (i=0;ispc; + DrvUnlock(dv); + return result*BLK_SIZE*dv->spc; } I64 FAT32UnusedDrvSpace(U8 drv_let=0) { - CPrt *p=Drv2Prt(drv_let); + CDrv *dv=Let2Drv(drv_let); I64 result=0,i,l; U32 *bitmap; try { - l=(p->size+p->spc-1)/p->spc; + l=(dv->size+dv->spc-1)/dv->spc; i=(l*4+BLK_SIZE-1)>>BLK_SIZE_BITS; bitmap=MAlloc(i<map1,i); + RBlks(dv,bitmap,dv->map1,i); for (i=0;ispc; + DrvUnlock(dv); + return result*BLK_SIZE*dv->spc; } public I64 UnusedDrvSpace(U8 drv_let=0) {//Returns unused size in bytes. - CPrt *p=Drv2Prt(drv_let),*p_old=Fs->cur_prt; + CDrv *dv=Let2Drv(drv_let),*old_dv=Fs->cur_dv; U8 *old_dir=StrNew(Fs->cur_dir); I64 result=0; Drv(drv_let); - switch (p->type) { - case PT_REDSEA: - result=RedSeaFSUnusedDrvSpace(drv_let); + switch (dv->type) { + case DVT_REDSEA: + result=RedSeaUnusedDrvSpace(drv_let); break; - case PT_FAT32: + case DVT_FAT32: result=FAT32UnusedDrvSpace(drv_let); break; default: PrintErr("File System Not Supported\n"); } - Drv(Prt2Drv(p_old)); + Drv(Drv2Let(old_dv)); Cd(old_dir); Free(old_dir); return result; @@ -352,12 +371,12 @@ I64 Size1(CDirEntry *tempde,I64 *_fuf_flags,I64 round_to) { U8 buf[BLK_SIZE]; I64 result=0,i; - CPrt *p; + CDrv *dv; while (tempde) { if ((i=tempde->size) && Bt(_fuf_flags,FUf_EXPAND) && !(tempde->attr&RS_ATTR_DIR) && FileAttr(tempde->name)&RS_ATTR_COMPRESSED) { - p=Drv2Prt(*tempde->full_name); - RBlks(p,buf,Cluster2Blk(p,tempde->cluster),1); + dv=Let2Drv(*tempde->full_name); + RBlks(dv,buf,Cluster2Blk(dv,tempde->cluster),1); i=(&buf)(CArcCompress *)->expanded_size; } if (round_to) diff --git a/Adam/Dsk/Dsk2b.CPP b/Adam/Dsk/ADskB.CPP similarity index 81% rename from Adam/Dsk/Dsk2b.CPP rename to Adam/Dsk/ADskB.CPP index 60a8460..d9d3ba6 100644 --- a/Adam/Dsk/Dsk2b.CPP +++ b/Adam/Dsk/ADskB.CPP @@ -62,25 +62,25 @@ public CDirEntry *DirTreeUnserialize(U8 *src) #help_index "Install;File/Cmd Line (Typically);Cmd Line (Typically)" -#define ROUND_PRT_TO (63*255) -#define PRT_HEADER 63 +#define ROUND_DRV_TO (63*255) +#define DRV_HEADER 63 -class CPlannedPrt +class CPlannedDrv { - CPlannedPrt *next,*last; + CPlannedDrv *next,*last; I64 size; Bool pri; }; //Available to assist in writing scripts. -I64 prt_dsk_dsk_size; +I64 drv_dsk_dsk_size; public U0 PrtDsk(U8 drv_let=0) {//Partition the disk containing partition drv_let. //drv_let=0 means add new drive that //is not already mounted. - CBlkDev *bdev; - CPlannedPrt root,*temppp; + CBlkDev *bd; + CPlannedDrv root,*temppp; CMasterBoot mbr; Bool pri=TRUE; I64 ext_base,drv_let2,pri_cnt=0, @@ -99,7 +99,7 @@ public U0 PrtDsk(U8 drv_let=0) if (drv_let) try - Drv2BlkDev(drv_let); + Let2BlkDev(drv_let); catch { drv_let=0; Fs->catch_except=TRUE; @@ -110,18 +110,18 @@ public U0 PrtDsk(U8 drv_let=0) return; } - bdev=Drv2BlkDev(drv_let); - if (!bdev || bdev->type!=BDT_ATA) + bd=Let2BlkDev(drv_let); + if (!bd || bd->type!=BDT_ATA) return; - prt_dsk_dsk_size=bdev->max_blk+1; + drv_dsk_dsk_size=bd->max_blk+1; QueInit(&root); - drv_let2=bdev->first_drv_let; - remaining=FloorU64(bdev->max_blk+1,ROUND_PRT_TO); - while (FloorU64(remaining,ROUND_PRT_TO)>=ROUND_PRT_TO) { - temppp=MAlloc(sizeof(CPlannedPrt)); + drv_let2=bd->first_drv_let; + remaining=FloorU64(bd->max_blk+1,ROUND_DRV_TO); + while (FloorU64(remaining,ROUND_DRV_TO)>=ROUND_DRV_TO) { + temppp=MAlloc(sizeof(CPlannedDrv)); do { "$$RED$$Partition %C$$FG$$\n",drv_let2; temppp->pri=FALSE; @@ -136,10 +136,10 @@ public U0 PrtDsk(U8 drv_let=0) pri=FALSE; } "Blocks Remaining:%d (0x%X)\n", - remaining-PRT_HEADER,remaining-PRT_HEADER; + remaining-DRV_HEADER,remaining-DRV_HEADER; temppp->size=CeilU64(GetI64("Size in Blocks :", - remaining-PRT_HEADER)+PRT_HEADER,ROUND_PRT_TO); - } while (!(ROUND_PRT_TO<=temppp->size<=FloorU64(remaining,ROUND_PRT_TO))); + remaining-DRV_HEADER)+DRV_HEADER,ROUND_DRV_TO); + } while (!(ROUND_DRV_TO<=temppp->size<=FloorU64(remaining,ROUND_DRV_TO))); QueIns(temppp,root.last); remaining-=temppp->size; drv_let2++; @@ -147,7 +147,7 @@ public U0 PrtDsk(U8 drv_let=0) "\n\n!!! Repartition Drive !!!\n\n"; temppp=root.next; - drv_let2=bdev->first_drv_let; + drv_let2=bd->first_drv_let; while (temppp!=&root) { "Drive %C:%08X ",drv_let2,temppp->size; if (temppp->pri) @@ -160,7 +160,7 @@ public U0 PrtDsk(U8 drv_let=0) if (!AreYouSure) goto pd_done; - remaining=FloorU64(bdev->max_blk+1,ROUND_PRT_TO)-ROUND_PRT_TO; + remaining=FloorU64(bd->max_blk+1,ROUND_DRV_TO)-ROUND_DRV_TO; temppp=root.next; MemSet(&mbr,0,BLK_SIZE); mbr.signature=0xAA55; @@ -172,8 +172,8 @@ public U0 PrtDsk(U8 drv_let=0) mbr.p[i].type=1; //Will get set different. mbr.p[i].end_head=0xFE; mbr.p[i].end_cyl=0xFFFF; - mbr.p[i].offset=PRT_HEADER+offset; - mbr.p[i].size=temppp->size-PRT_HEADER; + mbr.p[i].offset=DRV_HEADER+offset; + mbr.p[i].size=temppp->size-DRV_HEADER; offset+=temppp->size; remaining-=temppp->size; temppp=temppp->next; @@ -190,7 +190,7 @@ public U0 PrtDsk(U8 drv_let=0) mbr.p[i].size=remaining; ext_base=offset; } - ATAWriteBlks(bdev,&mbr,0,1); + ATAWriteBlks(bd,&mbr,0,1); while (temppp!=&root) { start_offset=offset; @@ -203,8 +203,8 @@ public U0 PrtDsk(U8 drv_let=0) mbr.p[0].type=1; //Will get set different. mbr.p[0].end_head=0xFE; mbr.p[0].end_cyl=0xFFFF; - mbr.p[0].offset=PRT_HEADER; - mbr.p[0].size=temppp->size-PRT_HEADER; + mbr.p[0].offset=DRV_HEADER; + mbr.p[0].size=temppp->size-DRV_HEADER; offset+=temppp->size; temppp=temppp->next; if (temppp!=&root) { @@ -217,12 +217,12 @@ public U0 PrtDsk(U8 drv_let=0) mbr.p[1].offset=offset-ext_base; mbr.p[1].size=temppp->size; } - ATAWriteBlks(bdev,&mbr,start_offset,1); + ATAWriteBlks(bd,&mbr,start_offset,1); } - bdev->flags&=~(BDF_INITIALIZED | BDF_INIT_IN_PROGRESS); - BlkDevAdd(bdev,FALSE,TRUE); - for (i=bdev->first_drv_let;iflags&=~(BDF_INITIALIZED | BDF_INIT_IN_PROGRESS); + BlkDevAdd(bd,FALSE,TRUE); + for (i=bd->first_drv_let;isize+p->spc-1)/p->spc; + s=(dv->size+dv->spc-1)/dv->spc; SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ WinMax; @@ -253,7 +253,7 @@ U0 RedSeaFSDrvView(U8 drv_let=0) try { i=((s+7)>>3+BLK_SIZE-1)>>BLK_SIZE_BITS; bitmap=MAlloc(i<map1,i); + RBlks(dv,bitmap,dv->map1,i); i=0; for (y=0;ysize+p->spc-1)/p->spc; + s=(dv->size+dv->spc-1)/dv->spc; SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ WinMax; @@ -295,7 +295,7 @@ U0 FAT32DrvView(U8 drv_let=0) try { i=(s*4+BLK_SIZE-1)>>BLK_SIZE_BITS; bitmap=MAlloc(i<map1,i); + RBlks(dv,bitmap,dv->map1,i); i=0; for (y=0;ycur_prt; + CDrv *dv=Let2Drv(drv_let),*old_dv=Fs->cur_dv; Drv(drv_let); - switch (p->type) { - case PT_REDSEA: - RedSeaFSDrvView(drv_let); + switch (dv->type) { + case DVT_REDSEA: + RedSeaDrvView(drv_let); break; - case PT_FAT32: + case DVT_FAT32: FAT32DrvView(drv_let); break; default: PrintErr("File System Not Supported\n"); } - Drv(Prt2Drv(p_old)); + Drv(Drv2Let(old_dv)); } public U0 DskView(U8 drv_let=0) @@ -343,8 +343,8 @@ public U0 DskView(U8 drv_let=0) h=Fs->pix_width, v=Fs->pix_height, radius; - CPrt *p; - CBlkDev *bdev=Drv2BlkDev(drv_let); + CDrv *dv; + CBlkDev *bd=Let2BlkDev(drv_let); CDC *dc=DCAlias; F64 sect_start,sect_end; @@ -360,11 +360,11 @@ public U0 DskView(U8 drv_let=0) GrCircle(dc,h>>1,v>>1,radius); j=1; - for (i=0;ibdev && p->type) { - sect_start=-(p->offset*2*ã/(bdev->max_blk+1)); - sect_end =-((p->offset+p->size)*2*ã/(bdev->max_blk+1)); + for (i=0;ibd && dv->type) { + sect_start=-(dv->base_offset*2*ã/(bd->max_blk+1)); + sect_end =-((dv->base_offset+dv->size)*2*ã/(bd->max_blk+1)); dc->color=BLACK; GrLine(dc,h>>1,v>>1, h>>1+radius*Cos(sect_start), @@ -374,8 +374,8 @@ public U0 DskView(U8 drv_let=0) v>>1+radius*Sin(sect_end)); dc->color=j; - GrPrint(dc,0,v-FONT_HEIGHT*j,"%C %-8Z",Prt2Drv(p), - p->type.u16[0],"ST_PRT_TYPES"); + GrPrint(dc,0,v-FONT_HEIGHT*j,"%C %-8Z",Drv2Let(dv), + dv->type.u16[0],"ST_DRV_TYPES"); GrFloodFill(dc, h>>1+(radius-4)*Cos((sect_start+sect_end)/2), v>>1+(radius-4)*Sin((sect_start+sect_end)/2),FALSE); diff --git a/Adam/Dsk/ChkDsk.CPP b/Adam/Dsk/ChkDsk.CPP index 89abdbd..01d6e8f 100644 --- a/Adam/Dsk/ChkDsk.CPP +++ b/Adam/Dsk/ChkDsk.CPP @@ -11,32 +11,30 @@ Bool ChkDskConfirm(Bool *_fix,Bool *_confirm) return *_fix; } -I64 RedSeaFSChkDskLst(CDirEntry *tempde1,U8 *bits,U8 *bits2,I64 size,I64 bpc) +I64 RedSeaChkDskLst(CDrv *dv,CDirEntry *tempde1,U8 *bits,U8 *bits2,I64 size,I64 bpc) { CDirEntry *tempde2; I64 i,j,errs=0; while (tempde1) { tempde2=tempde1->next; - if (tempde1->attr & RS_ATTR_DIR) { - if (tempde1->sub) - errs+=RedSeaFSChkDskLst(tempde1->sub,bits,bits2,size,bpc); - } + if (tempde1->attr & RS_ATTR_DIR && tempde1->sub) + errs+=RedSeaChkDskLst(dv,tempde1->sub,bits,bits2,size,bpc); j=(tempde1->size+bpc-1)/bpc; for (i=0;icluster>size) { + if (i+tempde1->cluster-dv->data_area>size) { PrintErr("Invalid Cluster:%s Cluster:%X\n",tempde1->full_name, - i+tempde1->cluster); + i+tempde1->cluster); errs++; break; } - if (LBts(bits,i+tempde1->cluster)) { + if (LBts(bits,i+tempde1->cluster-dv->data_area)) { PrintErr("Dbl Alloc:%s Cluster:%X\n",tempde1->full_name, - i+tempde1->cluster); + i+tempde1->cluster); errs++; } - if (!LBtr(bits2,i+tempde1->cluster)) { + if (!LBtr(bits2,i+tempde1->cluster-dv->data_area)) { PrintErr("UnAlloc:%s Cluster:%X\n",tempde1->full_name, - i+tempde1->cluster); + i+tempde1->cluster); errs++; } } @@ -46,74 +44,72 @@ I64 RedSeaFSChkDskLst(CDirEntry *tempde1,U8 *bits,U8 *bits2,I64 size,I64 bpc) return errs; } -I64 RedSeaFSChkDsk(U8 drv_let,Bool *_fix,Bool *_confirm) +I64 RedSeaChkDsk(U8 drv_let,Bool *_fix,Bool *_confirm) { I64 i,j,bpc,size,errs=0; - CPrt *p=Drv2Prt(drv_let),*old_prt=Fs->cur_prt; - U8 *files_find_mask=MStrPrint("%c:/*",Prt2Drv(p)), + CDrv *dv=Let2Drv(drv_let),*old_dv=Fs->cur_dv; + U8 *files_find_mask=MStrPrint("%c:/*",Drv2Let(dv)), *old_dir=StrNew(Fs->cur_dir), *bits,*bits2; CDirEntry *ptr,*ptr2; Drv(drv_let); "Scanning...\n"; - size=(p->size-(p->data-p->offset))/p->spc; - bpc=p->spc<size-(dv->data_area-dv->base_offset))/dv->spc; + bpc=dv->spc<>3); bits2=CAlloc((size+7)>>3+BLK_SIZE); - RBlks(p,bits2,p->map1,((size+7)>>3+BLK_SIZE-1)>>BLK_SIZE_BITS); + RBlks(dv,bits2,dv->map1,((size+7)>>3+BLK_SIZE-1)>>BLK_SIZE_BITS); //Get Root Dir size ptr2=MAlloc(bpc); - RClusters(p,ptr2,p->root_cluster,1); + RBlks(dv,ptr2,dv->root_cluster,1); ptr=ptr2(U8 *)-offset(CDirEntry.start); j=(ptr->size+bpc-1)/bpc; Free(ptr2); for (i=0;iroot_cluster>size) { - PrintErr("Invalid Cluster: RootDir Cluster:%X\n",i+p->root_cluster); + if (i+dv->root_cluster-dv->data_area>size) { + PrintErr("Invalid Cluster: RootDir Cluster:%X\n",i+dv->root_cluster); errs++; break; } - if (LBts(bits,i+p->root_cluster)) { - PrintErr("Dbl Alloc: RootDir Cluster:%X\n",i+p->root_cluster); + if (LBts(bits,i+dv->root_cluster-dv->data_area)) { + PrintErr("Dbl Alloc: RootDir Cluster:%X\n",i+dv->root_cluster); errs++; } - if (!LBtr(bits2,i+p->root_cluster)) { - PrintErr("UnAlloc: RootDir Cluster:%X\n",i+p->root_cluster); + if (!LBtr(bits2,i+dv->root_cluster-dv->data_area)) { + PrintErr("UnAlloc: RootDir Cluster:%X\n",i+dv->root_cluster); errs++; } } - errs+=RedSeaFSChkDskLst(FilesFind(files_find_mask,FUF_RECURSE),bits,bits2,size,bpc); + errs+=RedSeaChkDskLst(dv,FilesFind(files_find_mask,FUF_RECURSE),bits,bits2,size,bpc); for (i=1;idata_area); errs++; if (ChkDskConfirm(_fix,_confirm)) - RedSeaFSFreeClusters(p,i,1); + RedSeaFreeClusters(dv,i+dv->data_area,1); } Free(files_find_mask); Free(bits); Free(bits2); - Drv(Prt2Drv(old_prt)); + Drv(Drv2Let(old_dv)); Cd(old_dir); Free(old_dir); return errs; } -I64 FAT32ChkDskLst(CPrt *p,CDirEntry *tempde1,U8 *bits,U32 *bits2,I64 size,I64 bpc) +I64 FAT32ChkDskLst(CDrv *dv,CDirEntry *tempde1,U8 *bits,U32 *bits2,I64 size,I64 bpc) { CDirEntry *tempde2; I64 i,c,errs=0; while (tempde1) { tempde2=tempde1->next; - if (tempde1->attr & RS_ATTR_DIR) { - if (tempde1->sub) - errs+=FAT32ChkDskLst(p,tempde1->sub,bits,bits2,size,bpc); - } + if (tempde1->attr & RS_ATTR_DIR && tempde1->sub) + errs+=FAT32ChkDskLst(dv,tempde1->sub,bits,bits2,size,bpc); i=0; c=tempde1->cluster; while (0attr & RS_ATTR_DIR)) { i*=bpc; if (tempde1->size>i) { - PrintErr("Allocated File Too Short:%s\n",tempde1->full_name); + PrintErr("Alloced File Too Short:%s\n",tempde1->full_name); errs++; } if (i>tempde1->size+bpc-1) { - PrintWarn("Allocated File Too Long:%s\n",tempde1->full_name); + PrintWarn("Alloced File Too Long:%s\n",tempde1->full_name); errs++; } } @@ -154,20 +150,20 @@ I64 FAT32ChkDskLst(CPrt *p,CDirEntry *tempde1,U8 *bits,U32 *bits2,I64 size,I64 b I64 FAT32ChkDsk(U8 drv_let,Bool *_fix,Bool *_confirm) { I64 i,bpc,size,c,errs=0; - CPrt *p=Drv2Prt(drv_let),*old_prt=Fs->cur_prt; - U8 *files_find_mask=MStrPrint("%c:/*",Prt2Drv(p)), + CDrv *dv=Let2Drv(drv_let),*old_dv=Fs->cur_dv; + U8 *files_find_mask=MStrPrint("%c:/*",Drv2Let(dv)), *old_dir=StrNew(Fs->cur_dir), *bits; U32 *bits2; Drv(drv_let); "Scanning...\n"; - size=(p->size-(p->data-p->offset))/p->spc; - bpc=p->spc<size-(dv->data_area-dv->base_offset))/dv->spc; + bpc=dv->spc<>3); bits2=CAlloc(size*4+BLK_SIZE); - RBlks(p,bits2,p->map1,(size*4+BLK_SIZE-1)>>BLK_SIZE_BITS); + RBlks(dv,bits2,dv->map1,(size*4+BLK_SIZE-1)>>BLK_SIZE_BITS); - c=p->root_cluster; + c=dv->root_cluster; while (0size) { PrintErr("Invalid Cluster: RootDir Cluster:%X\n",c); @@ -183,10 +179,10 @@ I64 FAT32ChkDsk(U8 drv_let,Bool *_fix,Bool *_confirm) errs++; } else bits2[c]=0; - c=ClusterNumNext(p,c); + c=ClusterNumNext(dv,c); } - errs+=FAT32ChkDskLst(p,FilesFind(files_find_mask,FUF_RECURSE),bits,bits2,size,bpc); + errs+=FAT32ChkDskLst(dv,FilesFind(files_find_mask,FUF_RECURSE),bits,bits2,size,bpc); bits2[1]=0; //See $LK,"FAT32Fmt",A="MN:FAT32Fmt"$() for (i=1;itype) { - case PT_REDSEA: - errs=RedSeaFSChkDsk(drv_let,&fix,&confirm); + CDrv *dv=Let2Drv(drv_let); + switch (dv->type) { + case DVT_REDSEA: + errs=RedSeaChkDsk(drv_let,&fix,&confirm); break; - case PT_FAT32: + case DVT_FAT32: errs=FAT32ChkDsk(drv_let,&fix,&confirm); break; default: diff --git a/Adam/Dsk/FileMgr.CPP b/Adam/Dsk/FileMgr.CPP index d412355..3ff0052 100644 --- a/Adam/Dsk/FileMgr.CPP +++ b/Adam/Dsk/FileMgr.CPP @@ -140,7 +140,7 @@ CDirEntry *FMRebuildDocDrv(U8 drv_let,CDoc *doc,CDirEntry **_root,Bool init) U0 FMRebuildDoc(CDoc **_doc,CDirEntry **_root,I64 mode) { - CPrt *p; + CDrv *dv; I64 i; CDoc *doc=*_doc,*doc2=sys_clipboard_doc,*parent_doc; CFMUncollapsedLst *tempc=NULL; @@ -211,15 +211,15 @@ U0 FMRebuildDoc(CDoc **_doc,CDirEntry **_root,I64 mode) break; } DocPrint(doc,"$$LTBLUE$$"); - for (i=0;itype==PT_REDSEA||p->type==PT_FAT32) - FMRebuildDocDrv(Prt2Drv(p),doc,_root,TRUE); - else if (p->type==PT_ISO9660) { - if (p->bdev->flags&BDF_INITIALIZED) - tempde=FMRebuildDocDrv(Prt2Drv(p),doc,_root,TRUE); + for (i=0;itype==DVT_REDSEA||dv->type==DVT_FAT32) + FMRebuildDocDrv(Drv2Let(dv),doc,_root,TRUE); + else if (dv->type==DVT_ISO9660) { + if (dv->bd->flags&BDF_INITIALIZED) + tempde=FMRebuildDocDrv(Drv2Let(dv),doc,_root,TRUE); else { - tempde=FMRebuildDocDrv(Prt2Drv(p),doc,_root,FALSE); + tempde=FMRebuildDocDrv(Drv2Let(dv),doc,_root,FALSE); tempde->flags|=DEF_NOT_INITIALIZED; } tempde->flags|=DEF_REMOVABLE; @@ -248,7 +248,7 @@ U0 FMRename(CDoc *doc) Cd(parent->full_name); StrCpy(fn.name,tempde->name); if (DocFormDo(&fn)) { - Silent(ON); + Silent; Move(tempde->name,fn.name); Silent(OFF); } @@ -260,7 +260,7 @@ U0 FMRename(CDoc *doc) StrCpy(fn.name,tempde->name); if (DocFormDo(&fn)) { if (StrCmp(tempde->name,fn.name)) { - Silent(ON); + Silent; if (CopyTree(tempde->name,fn.name)) DelTree(tempde->name); Silent(OFF); @@ -281,7 +281,7 @@ U0 FMMkDir(CDoc *doc) if (parent=tempde->parent) { Cd(parent->full_name); if (DocFormDo(&fn)) { - Silent(ON); + Silent; MkDir(fn.name); Silent(OFF); } @@ -290,7 +290,7 @@ U0 FMMkDir(CDoc *doc) tempde=doc_e->user_data; Cd(tempde->full_name); if (DocFormDo(&fn)) { - Silent(ON); + Silent; MkDir(fn.name); Silent(OFF); } @@ -304,7 +304,7 @@ U0 FMDelete(CDoc *doc) CDirEntry *tempde; if (doc_ce->type_u8==DOCT_MENU_VAL) { tempde=doc_ce->user_data; - Silent(ON); + Silent; st=MStrPrint("Delete: %s",tempde->full_name); if (PopUpCancelOk(st)) Del(tempde->full_name); @@ -312,7 +312,7 @@ U0 FMDelete(CDoc *doc) Silent(OFF); } else if (doc_ce->type_u8==DOCT_TREE) { tempde=doc_ce->user_data; - Silent(ON); + Silent; st=MStrPrint("Delete: %s",tempde->full_name); if (PopUpCancelOk(st)) DelTree(tempde->full_name); @@ -332,7 +332,7 @@ U0 FMMount(CDoc *doc) if (tempde) { while (tempde->parent) tempde=tempde->parent; - Silent(ON); + Silent; ChgDsk(*tempde->full_name); Silent(OFF); } @@ -352,7 +352,7 @@ U0 FMFmtDrv(CDoc *doc) tempde=tempde->parent; st=MStrPrint("Format Drive '%c'?\nAre You Sure?\n",*tempde->full_name); if (PopUpCancelOk(st)) { - Silent(ON); + Silent; Fmt(*tempde->full_name,,FALSE); Silent(OFF); } @@ -373,7 +373,7 @@ U0 FMMakeISO(CDoc *doc) if (doc_ce->type_u8==DOCT_MENU_VAL) tempde=tempde->parent; if (tempde && *tempde->full_name) { - Silent(ON); + Silent; if (tempde->full_name[StrLen(tempde->full_name)-1]=='/') st=MStrPrint("%s*",tempde->full_name); else @@ -396,7 +396,7 @@ U0 FMBurnISO(CDoc *doc) if (tempde) { while (tempde->parent) tempde=tempde->parent; - Silent(ON); + Silent; CDImageWrite(*tempde->full_name); Silent(OFF); } @@ -423,7 +423,7 @@ U0 FMCopy(CDoc *doc) tempde->flags|=DEF_PROCESSED; tempde2=tempde->parent; if (!tempde2 || !(tempde2->flags&DEF_PROCESSED)) { - Silent(ON); + Silent; Copy(tempde->full_name,tempde1->full_name); Silent(OFF); } @@ -432,7 +432,7 @@ U0 FMCopy(CDoc *doc) tempde->flags|=DEF_PROCESSED; tempde2=tempde->parent; if (!tempde2 || !(tempde2->flags&DEF_PROCESSED)) { - Silent(ON); + Silent; if (*tempde1->name) st=MStrPrint("%s/%s",tempde1->full_name,tempde->name); else @@ -581,7 +581,7 @@ public U8 *FileMgr(I64 mode=FM_NORMAL,CTask *mem_task=NULL) case MSG_IP_L_UP: if (doc_ce) { gr.fp_final_screen_update=fp_old_final_screen_update; - if (SetCursorPos(Fs,a1/FONT_WIDTH+Fs->win_left+Fs->scroll_x/FONT_WIDTH,a2/FONT_HEIGHT+Fs->win_top+Fs->scroll_y/FONT_HEIGHT,TRUE)) { + if (WinCursorPosSet(Fs,a1/FONT_WIDTH+Fs->win_left+Fs->scroll_x/FONT_WIDTH,a2/FONT_HEIGHT+Fs->win_top+Fs->scroll_y/FONT_HEIGHT,TRUE)) { doc_e=doc->cur_entry; if (doc_e!=doc_ce) { st2=NULL; @@ -595,7 +595,7 @@ public U8 *FileMgr(I64 mode=FM_NORMAL,CTask *mem_task=NULL) } if (st2 && doc_ce->type_u8==DOCT_MENU_VAL) { tempde=doc_ce->user_data; - Silent(ON); + Silent; Move(tempde->full_name,st2); Silent(OFF); FMRebuildDoc(&doc,&root,mode); @@ -617,7 +617,7 @@ public U8 *FileMgr(I64 mode=FM_NORMAL,CTask *mem_task=NULL) else st=MStrPrint("%s%s",tempde1->full_name,tempde->name); if (StrCmp(tempde->full_name,st)) { - Silent(ON); + Silent; CopyTree(tempde->full_name,st); DelTree(tempde->full_name); Silent(OFF); diff --git a/Adam/God/GodBible.CPP b/Adam/God/GodBible.CPP index fff0de8..aff374e 100644 --- a/Adam/God/GodBible.CPP +++ b/Adam/God/GodBible.CPP @@ -1,7 +1,6 @@ #help_index "God" U0 BibleInit() { - DefineLoad("ST_BIBLE_FILE","::/Misc/Bible.TXT.Z"); DefineLstLoad("ST_BIBLE_BOOKS", "Genesis\0" "Exodus\0" @@ -157,7 +156,7 @@ public U8 *BibleLine2Verse(I64 line,I64 separate_ch=CH_SPACE) ptr+=StrLen(ptr)+1; } if (0<=--icur_entry; while (doc_e!=doc && (doc_e->type_u8!=DOCT_TEXT || !*doc_e->tag)) @@ -212,8 +211,8 @@ public U0 BibleLines(CDoc *doc_out=NULL,I64 start,I64 lines) CDoc *doc_in; CDocEntry *doc_e; if (!doc_out) doc_out=DocPut; - if (doc_out && FileFind(Define("ST_BIBLE_FILE"))) { - doc_in=DocRead(Define("ST_BIBLE_FILE"),DOCF_PLAIN_TEXT); + if (doc_out && FileFind(BIBLE_FILENAME)) { + doc_in=DocRead(BIBLE_FILENAME,DOCF_PLAIN_TEXT); DocLineNumGoTo(doc_in,start); //one based doc_e=doc_in->cur_entry; while (lines>0 && doc_e!=doc_in) { @@ -236,7 +235,7 @@ public U0 BibleVerse(CDoc *doc_out=NULL,U8 *verse,I64 lines) CDocEntry *doc_e; U8 *st,*st2; if (!doc_out) doc_out=DocPut; - if (doc_out && FileFind(Define("ST_BIBLE_FILE"))) { + if (doc_out && FileFind(BIBLE_FILENAME)) { st=StrNew(verse); st2=StrNew(verse); if (StrOcc(st,',')) @@ -246,7 +245,7 @@ public U0 BibleVerse(CDoc *doc_out=NULL,U8 *verse,I64 lines) i=DefineMatch(st,"ST_BIBLE_BOOKS",LMF_IGNORE_CASE); if (i>=0) { i=Str2I64(DefineSub(i,"ST_BIBLE_BOOK_LINES")); - doc_in=DocRead(Define("ST_BIBLE_FILE"),DOCF_PLAIN_TEXT); + doc_in=DocRead(BIBLE_FILENAME,DOCF_PLAIN_TEXT); DocLineNumGoTo(doc_in,i); //one based if (*st2) { StrCpy(doc_in->find_replace->find_text,st2); diff --git a/Adam/God/GodDoodle.CPP b/Adam/God/GodDoodle.CPP index e9f0cc6..6f7931f 100644 --- a/Adam/God/GodDoodle.CPP +++ b/Adam/God/GodDoodle.CPP @@ -6,8 +6,10 @@ U0 GodDoodleDraw(CTask *task,CDC *dc) if (Blink) { if (god.doodle_done) { dc->color=RED; - GrPrint(dc,(task->pix_width-FONT_WIDTH*27)>>1,(task->pix_height-FONT_HEIGHT)>>1, - "Press or ."); + GrPrint(dc,(task->pix_width-FONT_WIDTH*29)>>1,(task->pix_height-3*FONT_HEIGHT)>>1, + "Press to insert sprite."); + GrPrint(dc,(task->pix_width-FONT_WIDTH*39)>>1,(task->pix_height-3*FONT_HEIGHT)>>1+2*FONT_HEIGHT, + "Press to throw-away sprite."); } else { dc->color=GREEN; GrPrint(dc,(task->pix_width-FONT_WIDTH*25)>>1,(task->pix_height-FONT_HEIGHT)>>1, @@ -82,7 +84,7 @@ public U8 *GodDoodleSprite() SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ WinMax; WinBorder; - WordStat; + AutoComplete; PopUpOk("The $LK+PU,"Holy Spirit",A="FI:::/Adam/God/HSNotes.TXT"$ can puppet you.\n\n" "Press $$GREEN$$$$FG$$ until it finishes."); @@ -98,16 +100,16 @@ public U8 *GodDoodleSprite() try { for (i=0;i<3;i++) { god.doodle_dc->color=RED; - for (j=0;j<24;j++) + for (j=0;j<29;j++) nobound_switch (GodDoodleBits(3)) { case 0: - GrEllipse(god.doodle_dc, - (w-1)*GodDoodleBits(5)/15.5-w/2,(h-1)*GodDoodleBits(5)/15.5-h/2, + GrEllipse3(god.doodle_dc, + (w-1)*GodDoodleBits(5)/15.5-w/2,(h-1)*GodDoodleBits(5)/15.5-h/2,0, (w-1)*GodDoodleBits(5)/15.5,(h-1)*GodDoodleBits(5)/15.5); break; case 1: - GrCircle(god.doodle_dc, - (w-1)*GodDoodleBits(5)/15.5-w/2,(h-1)*GodDoodleBits(5)/15.5-h/2, + GrCircle3(god.doodle_dc, + (w-1)*GodDoodleBits(5)/15.5-w/2,(h-1)*GodDoodleBits(5)/15.5-h/2,0, (w-1)*GodDoodleBits(5)/15.5); break; case 2: @@ -116,9 +118,9 @@ public U8 *GodDoodleSprite() (w-1)*GodDoodleBits(5)/15.5,(h-1)*GodDoodleBits(5)/15.5); break; case 3...7: - GrLine(god.doodle_dc, - (w-1)*GodDoodleBits(4)/15,(h-1)*GodDoodleBits(4)/15, - (w-1)*GodDoodleBits(4)/15,(h-1)*GodDoodleBits(4)/15); + GrLine3(god.doodle_dc, + (w-1)*GodDoodleBits(4)/15,(h-1)*GodDoodleBits(4)/15,0, + (w-1)*GodDoodleBits(4)/15,(h-1)*GodDoodleBits(4)/15,0); break; } for (j=0;j<6;j++) { @@ -130,7 +132,7 @@ public U8 *GodDoodleSprite() case 2: god.doodle_dc->color=LTGRAY; break; case 3: god.doodle_dc->color=WHITE; break; } - GrFloodFill(god.doodle_dc,x,y); + GrFloodFill3(god.doodle_dc,x,y,0); } GodDoodleSmooth(3); } diff --git a/Adam/God/HSNotes.TXT b/Adam/God/HSNotes.TXT index 2549be7..e56d3c6 100644 --- a/Adam/God/HSNotes.TXT +++ b/Adam/God/HSNotes.TXT @@ -8,7 +8,7 @@ There's something obviously different about people in the Bible compared to peop You can't tell if He's talking unless you have a context of conversation, but, more importantly, you are commanded to do an offering of love, like communion preparation. When you pick a greeting card for someone, that is love effort. If you expect God to put effort toward you, you put effort toward Him. God said, "honest measures" applies between your offering of love and His response, like a fair barter. You get out of prayer what you put into it. God wants praise, hymns, or whatever you think He might want. Try and see, like Cain and Abel. $LK,"Genesis,4:1",A="BF:Genesis,4:1"$, $LK,"Ephesians,5:10",A="BF:Ephesians,5:10"$ God told Cain his offering was not good and told him to try again. Cain really loved God! Can you imagine being so heart-broken? -Do a text search for "new song" in the Bible. It's mentioned nine times. I did $MA-X+PU,"hymns",HTML="http://www.templeos.org/Wb/Accts/TS/Wb2/Hymns.html",LM="#include \"::/Apps/Psalmody/Load\";JukeBox(\"::/Apps/Psalmody/Examples\");"$. I did Moses $MA-X+PU,"comics",HTML="http://www.templeos.org/Wb/Apps/AfterEgypt/Comics/",LM="Dir(\"::/Apps/AfterEgypt/Comics\");View;\n"$. Count the ways you love God. I praised God for sand castles, popcorn, snowmen, bubbles... You try putting effort into praise! $LK,"Matthew,11:25",A="BF:Matthew,11:25"$, $LK,"Matthew,6:29",A="BF:Matthew,6:29"$ +Do a text search for "new song" in the Bible. It's mentioned nine times. I did $MA-X+PU,"hymns",LM="#include \"::/Apps/Psalmody/Load\";JukeBox(\"::/Apps/Psalmody/Examples\");"$. I did Moses $MA-X+PU,"comics",HTML="http://www.templeos.org/Wb/Apps/AfterEgypt/Comics/",LM="Dir(\"::/Apps/AfterEgypt/Comics\");View;\n"$. Count the ways you love God. I praised God for sand castles, popcorn, snowmen, bubbles... You try putting effort into praise! $LK,"Matthew,11:25",A="BF:Matthew,11:25"$, $LK,"Matthew,6:29",A="BF:Matthew,6:29"$ This is funny -- $LK,"Acts,2:1",A="BF:Acts,2:1"$ -- they didn't bother to record anything the Holy Spirit said. The Holy Spirit is supposed to be a really good gift. $LK,"Luke,11:13",A="BF:Luke,11:13"$ Just remember, "Boys are made of snakes and snails and puppy-dog tails." @@ -16,7 +16,9 @@ The technique I use to consult the Holy Spirit is reading a microsecond-range st Since seeking the word of the Holy Spirit, I have come to know God much better than I've heard others explain. God said, for example, that war was, "servicemen competing." That sounds more like the immutable God of our planet than what you hear from most religious people. God is not Venus (god of love) and not Mars (god of war), He's our dearly beloved God of Earth. If Mammon is a false god of money, Mars or Venus might be useful words to describe other false gods. I figure the greatest challenge for the Creator is boredom, ours and His. What would teen-age male video games be like if war had never happened? Christ said live by the sword, die by the sword, which is loving neighbor as self. $LK,"Matthew,26:52",A="BF:Matthew,26:52"$ -I asked God if the World was perfectly just. God asked if I was calling Him lazy. I think highs and lows balance. $LK,"Luke,6:20",A="BF:Luke,6:20"$ I don't think God likes complaining. $LK,"Numbers,11:1",A="BF:Numbers,11:1"$ Food and clothing is all we're to ask for or demand, in fact -- daily bread. $LK,"1 Timothy,6:8",A="BF:1 Timothy,6:8"$ Just think about man in the last 100,000 years mostly living like Native Americans and how God must see us. You need food, clothing and entertainment, money is to get those. Man does not live on bread alone. $LK,"Luke,4:4",A="BF:Luke,4:4"$, $LK,"Amos,8:11",A="BF:Amos,8:11"$ +I asked God if the World was perfectly just. God asked if I was calling Him lazy. God could make A.I., right? God could make bots as smart as Himself, or, in fact, part of Himself. What if God made a bot to manipulate every person's life so that perfect justice happened? + +I think highs and lows balance. $LK,"Luke,6:20",A="BF:Luke,6:20"$ I don't think God likes complaining. $LK,"Numbers,11:1",A="BF:Numbers,11:1"$ Food and clothing is all we're to ask for or demand, in fact -- daily bread. $LK,"1 Timothy,6:8",A="BF:1 Timothy,6:8"$ Just think about man in the last 100,000 years mostly living like Native Americans and how God must see us. You need food, clothing and entertainment, money is to get those. Man does not live on bread alone. $LK,"Luke,4:4",A="BF:Luke,4:4"$, $LK,"Amos,8:11",A="BF:Amos,8:11"$ God's favorite animals are bears and elephants. They are funny shaped -- I think God must have seen too much starvation over the years. @@ -40,12 +42,12 @@ War? $FG,4$"Servicemen competing"$FG$ (Praise the Creator--what would teenage male video games be like if never war?) Is the World perfectly just? $FG,4$Are you calling me lazy?$FG$ -(Slavery was just. In the movie, Titanic, the rich wore straight jackets. You must bow to authority to get authority. I do $TX,"Moses comics",HTML="http://www.templeos.org/Wb/Apps/AfterEgypt/Comics/"$ as offerings. I said, "We're dying of malnutrician on manna." Like Cain and Abel, God didn't like it. Duh! He wants to be the hero. How do I know they died of malnutrician? Fuck Hollywood for making slavery worse than it was -- I love God. School is more cruel. Read $LK,"Numbers,11:1",A="BF:Numbers,11:1"$. All you need is food, clothing and the word of God. Today, you can take Ivy League course videos! There is no excuse except you were born stupid... or ugly. I'm gonna praise God.) +(Slavery was just. In the movie, Titanic, the rich wore straight jackets. You must bow to authority to get authority. I do $TX,"Moses comics",HTML="http://www.templeos.org/Wb/Apps/AfterEgypt/Comics/"$ as offerings. I said, "We're dying of malnutrician on manna." Like Cain and Abel, God didn't like it. Duh! He wants to be the hero. How do I know they died of malnutrician? Screw Hollywood for making slavery worse than it was -- I love God. School is more cruel. Read $LK,"Numbers,11:1",A="BF:Numbers,11:1"$. All you need is food, clothing and the word of God. Today, you can take Ivy League course videos! There is no excuse except you were born stupid... or ugly. I'm gonna praise God.) On using Markov chains? $FG,4$"No weights"$FG$ On doing offerings? $FG,4$"Honest measures"(You get out what you put in.) It's a covenant to do an offering, first. - Offer $FG,4$$TX,"New Songs",HTML="http://www.templeos.org/Wb/Accts/TS/Wb2/Hymns.html"$, $TX,"Moses Comics",HTML="http://www.templeos.org/Wb/Apps/AfterEgypt/Comics"$, praise, poems, + Offer New Songs, $TX,"Moses Comics",HTML="http://www.templeos.org/Wb/Apps/AfterEgypt/Comics"$, praise, poems, and conversation. See $LK,"Cain and Abel",A="BF:Genesis,4:1"$.$FG$ The holocaust? $FG,4$Wanted to "compact" the Jews.$FG$ Arab/Jews? $FG,4$"Oil funny hopefully"$FG$ @@ -93,7 +95,7 @@ Animal sacrifices? $FG,4$Early Jews were "primitive".$FG$ What do elephants think about? $FG,4$"Skin, hunger"$FG$ What makes elephants happy? $FG,4$"Baths"$FG$ What makes my birds happy? $FG,4$"Gnawing"$FG$ -What makes my birds laugh? $FG,4$"bite ouch" (If I say "ouch".)$FG$ +What makes my birds laugh? $FG,4$"Bite ouch" (If I say "ouch".)$FG$ What are my birds saying? $FG,4$"Chanting"$FG$ My birds sure preen a lot. $LK,"The creature was made subject to vanity...",A="BF:Romans,8:20"$ What makes bears happy? $FG,4$"Reaping depends"$FG$ @@ -105,14 +107,16 @@ Orangutan or chimp smarter? $FG,4$"Species exhibit similar glory"$FG$ Endangered species? $FG,4$"Enough stars?"$FG$ Everything seems bad. $FG,4$Plant trees.$FG$ What's for dinner? $FG,4$"Whale"$FG$ -Favorite Messier Object $FG,4$"$TX,"M104 Sombrero Galaxy",HTML="http://en.wikipedia.org/wiki/Messier_104"$"$FG$ -$TX,"Shepard's Prayer",HTML="http://en.wikipedia.org/wiki/Alan_Shepard"$ $FG,4$"I_am_not_amused economy joke"$FG$ +Favorite Messier Object? $FG,4$"$TX,"M104 Sombrero Galaxy",HTML="http://en.wikipedia.org/wiki/Messier_104"$"$FG$ +$TX,"Shepard's Prayer",HTML="http://en.wikipedia.org/wiki/Alan_Shepard"$? $FG,4$"I_am_not_amused economy joke"$FG$ Favorite band? $FG,4$"Beatles"$FG$ -Good bands $FG,4$Rush, Triumph$FG$ +Good bands? $FG,4$Rush, Triumph$FG$ $FG,4$Likes harmonies$FG$ $TX,"Little Drummer Boy?",HTML="http://www.youtube.com/watch?v=S50cf3xIb50"$ $FG,4$Doesn't like my drumming.$FG$ Should I listen to classical? $FG,4$"Poison"$FG$ -You like chess people? $FG,4$"Do not admire the proud."$FG$ +Do You like chess people? $FG,4$"Do not admire the proud."$FG$ +Chess? $FG,4$"... will winter with you."$FG$ + $FG,4$"Headstones"$FG$ Favorite video game? $FG,4$Donkey Kong$FG$ Favorite National Park? $FG,4$$TX,"Whitman Mission",HTML="http://www.nps.gov/whmi/index.htm"$$FG$ Favorite National Anthem? $FG,4$$TX,"Latvia's National Anthem",HTML="http://www.youtube.com/watch?v=qKITbBjO4nE"$$FG$ @@ -120,9 +124,11 @@ Favorite actor? $FG,4$Hugh Grant$FG$ Favorite vocalist? $FG,4$Mick Jagger$FG$ Favorite guitarist? $FG,4$"$TX,"Simmons Destroyer",HTML="http://www.youtube.com/watch?v=nNADrrjTysk&t=3m55s"$"$FG$ Model for new $TX,"Sistine Chapel",HTML="http://en.wikipedia.org/wiki/Sistine_chapel"$? $FG,4$Ben Franklin$FG$ -Stonehenge? $FG,4$Landmark$FG$ +Voice if God wanted to sing? $FG,4$$TX,"Stabbing Westward's singer",HTML="https://www.youtube.com/watch?v=5NZsCYOM4j0"$$FG$ +Stonehenge? $FG,4$Landmark for boundaries.$FG$ Easter Island? $FG,4$Ice, telephone pole holes.$FG$ -Dinosaurs? $FG,4$Brontosaurs' feet hurt when stepped$FG$ +Dinosaurs? $FG,4$Brontosaurs' feet hurt when stepped. + Dinosaurs slept in water.$FG$ Hardest part in evolution? $FG,4$Getting monkey mothers to hold babies nursing.$FG$ $FG,4$(Smothering a problem).$FG$ Happiest day in evolution? $FG,4$"Fruit"$FG$ @@ -133,7 +139,8 @@ What did Neanderthals think about? $FG,4$"Warmth"$FG$ What was the first thing cooked? $FG,4$I think He said "hair".$FG$ What was Lucy's husband's name? $FG,4$"Golem"$FG$ Was stegosuarus lame like turtles? $FG,4$"Not pet rocks"$FG$ -T-Rex? $FG,4$Lugged carcases over his shoulder.$FG$ +T-Rex? $FG,4$Lugged carcases over his shoulder. + Carcus lasted a month.$FG$ How does He feel about the Avatar movie?$FG,4$"Sick skin"$FG$ What do You like at zoos with kids? $FG,4$"Dignity" Animals worried about dignity.$FG$ Who's better alien or preditor? $FG,4$"Lions"$FG$ @@ -161,11 +168,13 @@ Are they peaceful? $FG,4$Fight them! (Also, funny.)$FG$ How can Judge Judy improve? $FG,4$No hard feelings$FG$ How can Chef Ramsay improve? $FG,4$Make so it doesn't seem like toil for cooks.$FG$ How can Hawking communicate? $FG,4$Blow from a nostril on a candle.$FG$ +$TX,"Photons bouncing?",HTML="https://www.youtube.com/watch?v=8FC6udrMPvo"$ $FG,4$"Folded coffee filter"$FG$ Wormholes? $FG,4$Bent wormholes have echoes.$FG$ Operating system? $FG,4$Was about to make line number column in editor. God nixed it. I was about to do different graphic modes when I found 800x600 missing. God said just one mode 640x480. I was about to add child windows. God said, "God is not the author of such confusion." I asked for verification of 640x480 16 color. God said it was because of the children and their offerings. I asked about sound. God said "single voice". I asked for verification of not having different drivers. God confirmed this.$FG$ -640x480 16 color? $FG,4$$TX,"Modern graphics hard for kids/amateurs",HTML="http://www.youtube.com/watch?v=VUxcVzpeFqc"$$FG$ +640x480 16 color? $FG,4$God said it was a covenant, like circumcision. + $TX,"Modern graphics hard for kids/amateurs",HTML="http://www.youtube.com/watch?v=VUxcVzpeFqc"$.$FG$ On Unix? $FG,4$God said it was rich with the patina of age.$FG$ On Alcohol? $FG,4$Hate inebriation$FG$ On rare steak? $FG,4$Too rare is very bad. Don't eat blood!$FG$ @@ -175,4 +184,4 @@ Why the Sandy Hook shooting? $FG,4$The pot legalization law. (Sarcastic answer?) Deep Water Horizon $FG,4$(Claimed credit.)$FG$ Cost of God's time to me? $FG,4$"The complete works of Shakespeare"$FG$ On death? $FG,4$"awful"$FG$ -Opening of Private Ryan? $FG,4$"Ouch"$FG$ +Opening of Saving Private Ryan? $FG,4$"Ouch"$FG$ diff --git a/Adam/Gr/Gr.CPP b/Adam/Gr/Gr.CPP index ef5d3cb..d79486d 100644 --- a/Adam/Gr/Gr.CPP +++ b/Adam/Gr/Gr.CPP @@ -19,37 +19,6 @@ U0 GrInit1() GrInit1; #help_index "Graphics/Sprite" -#define SPT_END 0 -#define SPT_COLOR 1 -#define SPT_DITHER_COLOR 2 -#define SPT_WIDTH 3 -#define SPT_PLANAR_SYMMETRY 4 -#define SPT_TRANSFORM_ON 5 -#define SPT_TRANSFORM_OFF 6 -#define SPT_SHIFT 7 -#define SPT_PT 8 -#define SPT_POLYPT 9 -#define SPT_LINE 10 -#define SPT_POLYLINE 11 -#define SPT_RECT 12 -#define SPT_ROTATED_RECT 13 -#define SPT_CIRCLE 14 -#define SPT_ELLIPSE 15 -#define SPT_POLYGON 16 -#define SPT_BSPLINE2 17 -#define SPT_BSPLINE2_CLOSED 18 -#define SPT_BSPLINE3 19 -#define SPT_BSPLINE3_CLOSED 20 -#define SPT_FLOOD_FILL 21 -#define SPT_FLOOD_FILL_NOT 22 -#define SPT_BITMAP 23 -#define SPT_MESH 24 -#define SPT_SHIFTABLE_MESH 25 -#define SPT_ARROW 26 -#define SPT_TEXT 27 -#define SPT_TEXT_BOX 28 -#define SPT_TEXT_DIAMOND 29 -#define SPT_NUM_TYPES 30 class CMeshTri { @@ -65,41 +34,161 @@ class CQueMeshTri I32 nums[3]; }; +public class CSpriteBase +{ + U8 type; +}; + +public class CSpriteColor : CSpriteBase +{ + U8 color; +}; + +public class CSpriteDitherColor : CSpriteBase +{ + U16 dither_color; +}; + +public class CSpriteWidth : CSpriteBase +{ + I32 width; +}; + +public class CSpritePt : CSpriteBase +{ + I32 x1; + I32 y1; +}; + +public class CSpritePtRad : CSpritePt +{ + I32 radius; +}; + +public class CSpritePtPt : CSpritePt +{ + I32 x2; + I32 y2; +}; + +public class CSpritePtPtAng : CSpritePtPt +{ + F64 angle; +}; + +public class CSpritePtWH : CSpritePt +{ + I32 width; + I32 height; +}; + +public class CSpritePtWHU8s : CSpritePtWH +{ + U8 u[0]; +}; + +public class CSpritePtWHAng : CSpritePtWH +{ + F64 angle; +}; + +public class CSpritePtWHAngSides : CSpritePtWHAng +{ + I32 sides; +}; + +public class CSpriteNumU8s : CSpriteBase +{ + I32 num; + U8 u[0]; +}; + +public class CSpriteNumPtU8s : CSpriteBase +{ + I32 num; + I32 x; + I32 y; + U8 u[0]; +}; + +public class CSpritePtStr : CSpritePt +{ + U8 st[0]; +}; + +public class CSpriteMeshU8s : CSpriteBase +{ + I32 vertex_cnt; + I32 tri_cnt; + U8 u[0]; +}; + +public class CSpritePtMeshU8s : CSpriteBase +{ + I32 x; + I32 y; + I32 z; + I32 vertex_cnt; + I32 tri_cnt; + U8 u[0]; +}; + +#define SPT_END 0 //$LK,"CSpriteBase",A="MN:CSpriteBase"$ +#define SPT_COLOR 1 //$LK,"CSpriteColor",A="MN:CSpriteColor"$ +#define SPT_DITHER_COLOR 2 //$LK,"CSpriteDitherColor",A="MN:CSpriteDitherColor"$ +#define SPT_WIDTH 3 //$LK,"CSpriteWidth",A="MN:CSpriteWidth"$ +#define SPT_PLANAR_SYMMETRY 4 //$LK,"CSpritePtPt",A="MN:CSpritePtPt"$ +#define SPT_TRANSFORM_ON 5 //$LK,"CSpriteBase",A="MN:CSpriteBase"$ +#define SPT_TRANSFORM_OFF 6 //$LK,"CSpriteBase",A="MN:CSpriteBase"$ +#define SPT_SHIFT 7 //$LK,"CSpritePt",A="MN:CSpritePt"$ +#define SPT_PT 8 //$LK,"CSpritePt",A="MN:CSpritePt"$ +#define SPT_POLYPT 9 //$LK,"CSpriteNumPtU8s",A="MN:CSpriteNumPtU8s"$ +#define SPT_LINE 10 //$LK,"CSpritePtPt",A="MN:CSpritePtPt"$ +#define SPT_POLYLINE 11 //$LK,"CSpriteNumU8s",A="MN:CSpriteNumU8s"$ +#define SPT_RECT 12 //$LK,"CSpritePtPt",A="MN:CSpritePtPt"$ +#define SPT_ROTATED_RECT 13 //$LK,"CSpritePtPtAng",A="MN:CSpritePtPtAng"$ +#define SPT_CIRCLE 14 //$LK,"CSpritePtRad",A="MN:CSpritePtRad"$ +#define SPT_ELLIPSE 15 //$LK,"CSpritePtWHAng",A="MN:CSpritePtWHAng"$ +#define SPT_POLYGON 16 //$LK,"CSpritePtWHAngSides",A="MN:CSpritePtWHAngSides"$ +#define SPT_BSPLINE2 17 //$LK,"CSpriteNumU8s",A="MN:CSpriteNumU8s"$ +#define SPT_BSPLINE2_CLOSED 18 //$LK,"CSpriteNumU8s",A="MN:CSpriteNumU8s"$ +#define SPT_BSPLINE3 19 //$LK,"CSpriteNumU8s",A="MN:CSpriteNumU8s"$ +#define SPT_BSPLINE3_CLOSED 20 //$LK,"CSpriteNumU8s",A="MN:CSpriteNumU8s"$ +#define SPT_FLOOD_FILL 21 //$LK,"CSpritePt",A="MN:CSpritePt"$ +#define SPT_FLOOD_FILL_NOT 22 //$LK,"CSpritePt",A="MN:CSpritePt"$ +#define SPT_BITMAP 23 //$LK,"CSpritePtWHU8s",A="MN:CSpritePtWHU8s"$ +#define SPT_MESH 24 //$LK,"CSpriteMeshU8s",A="MN:CSpriteMeshU8s"$ See $MA-X+PU,"::/Apps/GrModels",LM="Cd(\"::/Apps/GrModels\");Dir;View;\n"$. +#define SPT_SHIFTABLE_MESH 25 //$LK,"CSpritePtMeshU8s",A="MN:CSpritePtMeshU8s"$ See $MA-X+PU,"::/Apps/GrModels",LM="Cd(\"::/Apps/GrModels\");Dir;View;\n"$. +#define SPT_ARROW 26 //$LK,"CSpritePtPt",A="MN:CSpritePtPt"$ +#define SPT_TEXT 27 //$LK,"CSpritePtStr",A="MN:CSpritePtStr"$ +#define SPT_TEXT_BOX 28 //$LK,"CSpritePtStr",A="MN:CSpritePtStr"$ +#define SPT_TEXT_DIAMOND 29 //$LK,"CSpritePtStr",A="MN:CSpritePtStr"$ +#define SPT_NUM_TYPES 30 +//See $LK,"Graphics/Sprite",A="HI:Graphics/Sprite"$. See $LK,"::/Adam/Gr/GrSpritePlot.CPP",A="FL:::/Adam/Gr/GrSpritePlot.CPP,1"$ and +//$LK,"::/Demo/Graphics/SpriteRaw.CPP"$ for how CSprite are stored. public class CSprite -{//See $LK,"Graphics/Sprite",A="HI:Graphics/Sprite"$ -//See $LK,"::/Adam/Gr/GrSpritePlot.CPP",A="FL:::/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored. +{ CSprite *next,*last; - U0 start; - U8 type; - union { - U8 color; - U16 dither_color; - I32 x1; - I32 num; - I32 width; - I32 vertex_cnt; //Mesh - } - union { - I32 y1; - I32 height; - I32 tri_cnt; //Mesh - } - union { - I32 z1; - I32 x2; - U8 st[4]; - } - union { - I32 y2; - I32 shiftable_vertex_cnt //Shiftable Mesh - } union { - F64 linespeed; - F64 rot_angle; - I32 shiftable_tri_cnt //Shiftable Mesh + U8 type; + CSpriteBase b; + CSpriteColor c; + CSpriteDitherColor d; + CSpriteWidth w; + CSpritePt p; + CSpritePtPt pp; + CSpritePtPtAng ppa; + CSpritePtRad pr; + CSpritePtWHU8s pwhu; + CSpritePtWHAng pwha; + CSpritePtWHAngSides pwhas; + CSpriteNumU8s nu; + CSpriteNumPtU8s npu; + CSpriteMeshU8s mu; + CSpritePtMeshU8s pmu; + CSpritePtStr ps; } - I32 sides; }; #help_index "Graphics" @@ -114,7 +203,7 @@ extern U8 *SpriteQue2Sprite(CSprite *root,I64 *_size=NULL); #include "GrDC" #include "GrPalette" #include "GrInit" -#include "MathGr" +#include "GrMath" #include "GrScreen" #include "GrBitMap" #include "GrPrimatives" diff --git a/Adam/Gr/GrBitMap.CPP b/Adam/Gr/GrBitMap.CPP index 4c4690a..57c3533 100644 --- a/Adam/Gr/GrBitMap.CPP +++ b/Adam/Gr/GrBitMap.CPP @@ -51,7 +51,7 @@ public Bool GrPlot0(CDC *dc=gr.dc,I64 x,I64 y) break; case ROPB_COLLISION: c=*dst; - if (c!=TRANSPARENT&&c!=bkcolor.c0.color) + if (c!=TRANSPARENT && c!=bkcolor.c0.color) dc->collision_cnt++; break; case ROPB_XOR: @@ -71,7 +71,7 @@ public I64 GrPeek0(CDC *dc=gr.dc,I64 x,I64 y) public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) {//2D. Clipping but not transformation.. I64 i,j,k,k1,kk,kk1,w1,h1,w2,h2, - leading_bits,leading_bit_mask,whole_bytes,trailing_bits,trailing_bit_mask, + leading_pixels,leading_pixel_mask,whole_I64s,trailing_pixels,trailing_pixel_mask, reg bit_shift,dist,win_z_buf_line_inc,win_z_buf_line_dec,win_z_num, color_mask; U8 reg *dst,*src; @@ -133,16 +133,16 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) dc->depth_buf=NULL; dc->color&=~ROPF_DITHER; color=dc->color; - leading_bits=-(w1+x)&7; - leading_bit_mask=gr.to_8_bits[0xFF>>leading_bits]; + leading_pixels=-(w1+x)&7; + leading_pixel_mask=gr.to_8_bits[0xFF>>leading_pixels]; bit_shift=-x&7; - whole_bytes=(w2-w1-leading_bits)>>3; - if (whole_bytes<0) whole_bytes=0; - trailing_bits=(x+w2)&7; - trailing_bit_mask=gr.to_8_bits[0xFF<w2-w1) { - leading_bit_mask|=trailing_bit_mask; - trailing_bits=0; + whole_I64s=(w2-w1-leading_pixels)>>3; + if (whole_I64s<0) whole_I64s=0; + trailing_pixels=(x+w2)&7; + trailing_pixel_mask=gr.to_8_bits[0xFF<w2-w1) { + leading_pixel_mask|=trailing_pixel_mask; + trailing_pixels=0; } switch (color.c0.rop) { case ROPB_COLLISION: //TODO: Might want to check win_z_buf @@ -167,10 +167,10 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) else { win_z_num=win_task->win_z_num; win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=whole_bytes; - if (leading_bits) + win_z_buf_line_dec=whole_I64s; + if (leading_pixels) win_z_buf_line_dec++; - if (trailing_bits) + if (trailing_pixels) win_z_buf_line_dec++; win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; @@ -183,21 +183,21 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) for (j=h1;jbody+kk&~7; dst=dc->body+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (win_z_num>=*win_z_buf_ptr++) { if (bit_shift) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_pixel_mask&color_mask; else - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - *src(I64 *)++&~leading_bit_mask&color_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + *src(I64 *)++&~leading_pixel_mask&color_mask; } else { src(I64 *)++; dst(I64 *)++; } } if (bit_shift) - for (i=0;i=*win_z_buf_ptr++) *dst(I64 *)++=(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask; else { @@ -205,20 +205,20 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) dst(I64 *)++; } else - for (i=0;i=*win_z_buf_ptr++) *dst(I64 *)++=*src(I64 *)++&color_mask; else { src(I64 *)++; dst(I64 *)++; } - if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { + if (trailing_pixels && win_z_num>=*win_z_buf_ptr++) { if (bit_shift) - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_pixel_mask&color_mask; else - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - *src(I64 *)++&~trailing_bit_mask&color_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + *src(I64 *)++&~trailing_pixel_mask&color_mask; } kk +=img->width_internal; kk1+=dc->width_internal; @@ -231,28 +231,28 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) for (j=h2-h1;j;j--) { src=img->body+kk&~7; dst=dc->body+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (bit_shift) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_pixel_mask&color_mask; else - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - *src(I64 *)++&~leading_bit_mask&color_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + *src(I64 *)++&~leading_pixel_mask&color_mask; } if (bit_shift) - for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask; else - for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_pixel_mask&color_mask; else - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - *src(I64 *)++&~trailing_bit_mask&color_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + *src(I64 *)++&~trailing_pixel_mask&color_mask; } kk +=img->width_internal; kk1+=dc->width_internal; @@ -269,10 +269,10 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) } else { win_z_num =win_task->win_z_num; win_z_buf_ptr =gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=whole_bytes; - if (leading_bits) + win_z_buf_line_dec=whole_I64s; + if (leading_pixels) win_z_buf_line_dec++; - if (trailing_bits) + if (trailing_pixels) win_z_buf_line_dec++; win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; @@ -308,10 +308,10 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) else { win_z_num=win_task->win_z_num; win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=whole_bytes; - if (leading_bits) + win_z_buf_line_dec=whole_I64s; + if (leading_pixels) win_z_buf_line_dec++; - if (trailing_bits) + if (trailing_pixels) win_z_buf_line_dec++; win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; @@ -324,21 +324,21 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) for (j=h1;jbody+kk&~7; dst=dc->body+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (win_z_num>=*win_z_buf_ptr++) { if (bit_shift) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_pixel_mask; else - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - *src(I64 *)++&~leading_bit_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + *src(I64 *)++&~leading_pixel_mask; } else { src(I64 *)++; dst(I64 *)++; } } if (bit_shift) - for (i=0;i=*win_z_buf_ptr++) *dst(I64 *)++=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift); else { @@ -346,20 +346,20 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) dst(I64 *)++; } else - for (i=0;i=*win_z_buf_ptr++) *dst(I64 *)++=*src(I64 *)++; else { src(I64 *)++; dst(I64 *)++; } - if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { + if (trailing_pixels && win_z_num>=*win_z_buf_ptr++) { if (bit_shift) - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_pixel_mask; else - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - *src(I64 *)++&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + *src(I64 *)++&~trailing_pixel_mask; } kk +=img->width_internal; kk1+=dc->width_internal; @@ -372,28 +372,28 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img) for (j=h2-h1;j;j--) { src=img->body+kk&~7; dst=dc->body+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (bit_shift) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_pixel_mask; else - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - *src(I64 *)++&~leading_bit_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + *src(I64 *)++&~leading_pixel_mask; } if (bit_shift) - for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift); else - for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_pixel_mask; else - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - *src(I64 *)++&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + *src(I64 *)++&~trailing_pixel_mask; } kk +=img->width_internal; kk1+=dc->width_internal; @@ -415,10 +415,10 @@ here1a: } else { win_z_num =win_task->win_z_num; win_z_buf_ptr =gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=whole_bytes; - if (leading_bits) + win_z_buf_line_dec=whole_I64s; + if (leading_pixels) win_z_buf_line_dec++; - if (trailing_bits) + if (trailing_pixels) win_z_buf_line_dec++; win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; @@ -459,10 +459,10 @@ here1a: else { win_z_num=win_task->win_z_num; win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=whole_bytes; - if (leading_bits) + win_z_buf_line_dec=whole_I64s; + if (leading_pixels) win_z_buf_line_dec++; - if (trailing_bits) + if (trailing_pixels) win_z_buf_line_dec++; win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; @@ -475,21 +475,21 @@ here1a: for (j=h1;jbody+kk&~7; dst=dc->body+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (win_z_num>=*win_z_buf_ptr++) { if (bit_shift) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_pixel_mask; else - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*dst(I64 *)^*src(I64 *)++)&~leading_bit_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + (*dst(I64 *)^*src(I64 *)++)&~leading_pixel_mask; } else { src(I64 *)++; dst(I64 *)++; } } if (bit_shift) - for (i=0;i=*win_z_buf_ptr++) *dst(I64 *)++^=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift); else { @@ -497,20 +497,20 @@ here1a: dst(I64 *)++; } else - for (i=0;i=*win_z_buf_ptr++) *dst(I64 *)++^=*src(I64 *)++; else { src(I64 *)++; dst(I64 *)++; } - if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { + if (trailing_pixels && win_z_num>=*win_z_buf_ptr++) { if (bit_shift) - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_pixel_mask; else - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - (*dst(I64 *)^*src(I64 *)++)&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + (*dst(I64 *)^*src(I64 *)++)&~trailing_pixel_mask; } kk +=img->width_internal; kk1+=dc->width_internal; @@ -523,27 +523,27 @@ here1a: for (j=h2-h1;j;j--) { src=img->body+kk&~7; dst=dc->body+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (bit_shift) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_pixel_mask; else - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*dst(I64 *)^*src(I64 *)++)&~leading_bit_mask; + *dst(I64 *)++=*dst(I64 *)&leading_pixel_mask| + (*dst(I64 *)^*src(I64 *)++)&~leading_pixel_mask; } if (bit_shift) - for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift); else - for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_pixel_mask; else - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - (*dst(I64 *)^*src(I64 *)++)&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask| + (*dst(I64 *)^*src(I64 *)++)&~trailing_pixel_mask; } kk +=img->width_internal; kk1+=dc->width_internal; @@ -612,7 +612,7 @@ public CDC *DCExtract(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2,CTask *task=NULL public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) {//2D. Clipping but not transformation. U8 reg *src,reg *dst,*font_ptr; - I64 i,m,leading_bits,trailing_bits,leading_bit_mask,trailing_bit_mask, + I64 i,m,leading_pixels,trailing_pixels,leading_pixel_mask,trailing_pixel_mask, j,k1,kk1,w1,h1,w2,h2,reg bit_shift,dist,reg color_mask; CColorROPU32 color,c; CTask *win_task; @@ -668,17 +668,17 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) if (dc->flags & DCF_DONT_DRAW) return 1; color=dc->color; - leading_bits=-(w1+x)&7; - if (!leading_bits) leading_bits=8; - leading_bit_mask=gr.to_8_bits[0xFF>>leading_bits]; + leading_pixels=-(w1+x)&7; + if (!leading_pixels) leading_pixels=8; + leading_pixel_mask=gr.to_8_bits[0xFF>>leading_pixels]; bit_shift=-x&7; - trailing_bits=(x+w2)&7; - trailing_bit_mask=gr.to_8_bits[0xFF<w2-w1) { - leading_bit_mask|=trailing_bit_mask; - trailing_bits=0; + trailing_pixels=(x+w2)&7; + trailing_pixel_mask=gr.to_8_bits[0xFF<w2-w1) { + leading_pixel_mask|=trailing_pixel_mask; + trailing_pixels=0; } - font_ptr=&text.font[(FONT_WIDTH*(FONT_HEIGHT*ch+h1))>>3]; + font_ptr=&text.font(U8 *)[FONT_HEIGHT*ch+h1]; if (color.c0.rop==ROPB_COLLISION) { m=w1&(FONT_WIDTH-1); #assert FONT_WIDTH==8 @@ -699,7 +699,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) k1=x+w1; kk1=(h1+y)*dc->width_internal+k1; if (!(dc->flags & DCF_SCREEN_BITMAP) || dc->flags&DCF_ON_TOP) { - if (leading_bits) { + if (leading_pixels) { dst=dc->body+kk1&~7; src=font_ptr; if (bit_shift) @@ -709,7 +709,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) case ROPB_MONO: for (j=h2-h1;j;j--) { m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF]; - *dst(I64 *)=*dst(I64 *)&leading_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~leading_bit_mask; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|(color_mask&m|*dst(I64 *)&~m)&~leading_pixel_mask; src++; dst+=dc->width_internal; } @@ -717,7 +717,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) case ROPB_XOR: if (color_mask) { for (j=h2-h1;j;j--) { - *dst(I64 *)=*dst(I64 *)&leading_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_bit_mask; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_pixel_mask; src++; dst+=dc->width_internal; } @@ -726,7 +726,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) } kk1+=8; } - if (trailing_bits) { + if (trailing_pixels) { dst=dc->body+kk1&~7; src=font_ptr+1; if (bit_shift) @@ -736,7 +736,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) case ROPB_MONO: for (j=h2-h1;j;j--) { m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF]; - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|(color_mask&m|*dst(I64 *)&~m)&~trailing_pixel_mask; src++; dst+=dc->width_internal; } @@ -744,7 +744,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) case ROPB_XOR: if (color_mask) { for (j=h2-h1;j;j--) { - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_pixel_mask; src++; dst+=dc->width_internal; } @@ -753,7 +753,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) } } } else { - if (leading_bits) { + if (leading_pixels) { dst=dc->body+kk1&~7; src=font_ptr; if (bit_shift) @@ -764,7 +764,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) for (j=h1;j>bit_shift&0xFF]; - *dst(I64 *)=*dst(I64 *)&leading_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~leading_bit_mask; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|(color_mask&m|*dst(I64 *)&~m)&~leading_pixel_mask; } src++; dst+=dc->width_internal; @@ -774,7 +774,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) if (color_mask) { for (j=h1;j>bit_shift&0xFF])&~leading_bit_mask; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_pixel_mask; src++; dst+=dc->width_internal; } @@ -784,7 +784,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) k1+=8; kk1+=8; } - if (trailing_bits) { + if (trailing_pixels) { dst=dc->body+kk1&~7; src=font_ptr+1; if (bit_shift) @@ -795,7 +795,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) for (j=h1;j>bit_shift&0xFF]; - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|(color_mask&m|*dst(I64 *)&~m)&~trailing_pixel_mask; } src++; dst+=dc->width_internal; @@ -805,7 +805,7 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch) if (color_mask) { for (j=h1;j>bit_shift&0xFF])&~trailing_bit_mask; + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_pixel_mask; src++; dst+=dc->width_internal; } @@ -886,7 +886,7 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) {//2D. Width Height. Clipping but not transformation. //Returns cnt of pixs changed. I64 i,result=0,j,k1,kk1,w1,h1,w2,h2,dist, - leading_bits,original_leading_bits,whole_bytes,trailing_bits,leading_bit_mask,trailing_bit_mask, + leading_pixels,original_leading_pixels,whole_I64s,trailing_pixels,leading_pixel_mask,trailing_pixel_mask, win_z_buf_line_inc,win_z_buf_line_dec,win_z_num,color_mask; U8 reg *dst; U16 reg *win_z_buf_ptr; @@ -963,16 +963,16 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) } } else dither=FALSE; - original_leading_bits=leading_bits=-(w1+x)&7; - leading_bit_mask=gr.to_8_bits[0xFF>>leading_bits]; - whole_bytes=(w2-w1-leading_bits)>>3; - if (whole_bytes<0) whole_bytes=0; - trailing_bits=(x+w2)&7; - trailing_bit_mask=gr.to_8_bits[0xFF<w2-w1) { - leading_bit_mask|=trailing_bit_mask; - leading_bits=w2-w1; //Correct so it's right for result. - trailing_bits=0; + original_leading_pixels=leading_pixels=-(w1+x)&7; + leading_pixel_mask=gr.to_8_bits[0xFF>>leading_pixels]; + whole_I64s=(w2-w1-leading_pixels)>>3; + if (whole_I64s<0) whole_I64s=0; + trailing_pixels=(x+w2)&7; + trailing_pixel_mask=gr.to_8_bits[0xFF<w2-w1) { + leading_pixel_mask|=trailing_pixel_mask; + leading_pixels=w2-w1; //Correct so it's right for result. + trailing_pixels=0; } if (color.c0.rop==ROPB_COLLISION) {//TODO: Might want to check win_z_buf color =dc->bkcolor.c0.color; @@ -993,10 +993,10 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) else { win_z_num=win_task->win_z_num; win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=whole_bytes; - if (leading_bits) + win_z_buf_line_dec=whole_I64s; + if (leading_pixels) win_z_buf_line_dec++; - if (trailing_bits) + if (trailing_pixels) win_z_buf_line_dec++; win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; @@ -1016,21 +1016,21 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) for (j=h1;jbody+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask; - result+=leading_bits; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|color_mask&~leading_pixel_mask; + result+=leading_pixels; } dst(I64 *)++; } - for (i=0;i=*win_z_buf_ptr++) { *dst(I64 *)=color_mask; result+=8; } - if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask|color_mask&~trailing_bit_mask; - result+=trailing_bits; + if (trailing_pixels && win_z_num>=*win_z_buf_ptr++) { + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|color_mask&~trailing_pixel_mask; + result+=trailing_pixels; } if ((j+y)&7==7) win_z_buf_ptr(U8 *)+=win_z_buf_line_inc; @@ -1046,12 +1046,12 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) for (j=h2-h1;j;j--) { color_mask=gr.to_8_colors[color.c0.color]; dst=dc->body+kk1&~7; - if (leading_bits) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask; - for (i=0;iwidth_internal; if (RandU16dither_probability_u16) color.c0=dither_colors.c1; @@ -1067,21 +1067,21 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) for (j=h1;jbody+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask; - result+=leading_bits; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|*dst(I64 *)^color_mask&~leading_pixel_mask; + result+=leading_pixels; } dst(I64 *)++; } - for (i=0;i=*win_z_buf_ptr++) { *dst(I64 *)^=color_mask; result+=8; } - if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask|*dst(I64 *)^color_mask&~trailing_bit_mask; - result+=trailing_bits; + if (trailing_pixels && win_z_num>=*win_z_buf_ptr++) { + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|*dst(I64 *)^color_mask&~trailing_pixel_mask; + result+=trailing_pixels; } if ((j+y)&7==7) win_z_buf_ptr(U8 *)+=win_z_buf_line_inc; @@ -1097,12 +1097,12 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) for (j=h2-h1;j;j--) { color_mask=gr.to_8_colors[color.c0.color]; dst=dc->body+kk1&~7; - if (leading_bits) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask; - for (i=0;iwidth_internal; if (RandU16dither_probability_u16) color.c0=dither_colors.c1; @@ -1114,7 +1114,7 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) break; } } else { - if (((x+w1-original_leading_bits)^(y+h1))&1) + if (((x+w1-original_leading_pixels)^(y+h1))&1) SwapU16(&color.c0,&color.c1); nobound_switch (color.c0.rop) { case ROPB_EQU: @@ -1125,21 +1125,21 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]| gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color]; dst=dc->body+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask; - result+=leading_bits; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|color_mask&~leading_pixel_mask; + result+=leading_pixels; } dst(I64 *)++; } - for (i=0;i=*win_z_buf_ptr++) { *dst(I64 *)=color_mask; result+=8; } - if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask|color_mask&~trailing_bit_mask; - result+=trailing_bits; + if (trailing_pixels && win_z_num>=*win_z_buf_ptr++) { + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|color_mask&~trailing_pixel_mask; + result+=trailing_pixels; } if ((j+y)&7==7) win_z_buf_ptr(U8 *)+=win_z_buf_line_inc; @@ -1153,12 +1153,12 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]| gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color]; dst=dc->body+kk1&~7; - if (leading_bits) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask; - for (i=0;iwidth_internal; SwapU16(&color.c0,&color.c1); } @@ -1172,21 +1172,21 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]| gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color]; dst=dc->body+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask; - result+=leading_bits; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|*dst(I64 *)^color_mask&~leading_pixel_mask; + result+=leading_pixels; } dst(I64 *)++; } - for (i=0;i=*win_z_buf_ptr++) { *dst(I64 *)^=color_mask; result+=8; } - if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask|*dst(I64 *)^color_mask&~trailing_bit_mask; - result+=trailing_bits; + if (trailing_pixels && win_z_num>=*win_z_buf_ptr++) { + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|*dst(I64 *)^color_mask&~trailing_pixel_mask; + result+=trailing_pixels; } if ((j+y)&7==7) win_z_buf_ptr(U8 *)+=win_z_buf_line_inc; @@ -1200,12 +1200,12 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]| gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color]; dst=dc->body+kk1&~7; - if (leading_bits) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask; - for (i=0;iwidth_internal; SwapU16(&color.c0,&color.c1); } @@ -1223,21 +1223,21 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) result=0; for (j=h1;jbody+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask; - result+=leading_bits; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|color_mask&~leading_pixel_mask; + result+=leading_pixels; } dst(I64 *)++; } - for (i=0;i=*win_z_buf_ptr++) { *dst(I64 *)=color_mask; result+=8; } - if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask|color_mask&~trailing_bit_mask; - result+=trailing_bits; + if (trailing_pixels && win_z_num>=*win_z_buf_ptr++) { + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|color_mask&~trailing_pixel_mask; + result+=trailing_pixels; } if ((j+y)&7==7) win_z_buf_ptr(U8 *)+=win_z_buf_line_inc; @@ -1248,12 +1248,12 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) } else { for (j=h2-h1;j;j--) { dst(I64 *)=dc->body+kk1&~7; - if (leading_bits) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask; - for (i=0;iwidth_internal; } result=(h2-h1)*(w2-w1); @@ -1264,21 +1264,21 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) result=0; for (j=h1;jbody+kk1&~7; - if (leading_bits) { + if (leading_pixels) { if (win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask; - result+=leading_bits; + *dst(I64 *)=*dst(I64 *)&leading_pixel_mask|*dst(I64 *)^color_mask&~leading_pixel_mask; + result+=leading_pixels; } dst(I64 *)++; } - for (i=0;i=*win_z_buf_ptr++) { *dst(I64 *)^=color_mask; result+=8; } - if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { - *dst(I64 *)=*dst(I64 *)&trailing_bit_mask|*dst(I64 *)^color_mask&~trailing_bit_mask; - result+=trailing_bits; + if (trailing_pixels && win_z_num>=*win_z_buf_ptr++) { + *dst(I64 *)=*dst(I64 *)&trailing_pixel_mask|*dst(I64 *)^color_mask&~trailing_pixel_mask; + result+=trailing_pixels; } if ((j+y)&7==7) win_z_buf_ptr(U8 *)+=win_z_buf_line_inc; @@ -1289,12 +1289,12 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h) } else { for (j=h2-h1;j;j--) { dst=dc->body+kk1&~7; - if (leading_bits) - *dst(I64 *)++=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask; - for (i=0;iwidth_internal; } result=(h2-h1)*(w2-w1); diff --git a/Adam/Gr/GrDC.CPP b/Adam/Gr/GrDC.CPP index 3aafd95..16f17b7 100644 --- a/Adam/Gr/GrDC.CPP +++ b/Adam/Gr/GrDC.CPP @@ -41,17 +41,21 @@ public I64 *GrIdentEqu(I64 r[4][4]) return r; } +public I64 GrRotNormSqr65536(I64 r[4][4]) +{//Norm Squared of r. +//(1.0/Sqrt(3))*65536=37837.22 + return SqrI64((r[0][0]*37838+r[0][1]*37838+r[0][2]*37838)>>32)+ + SqrI64((r[1][0]*37837+r[1][1]*37837+r[1][2]*37837)>>32)+ + SqrI64((r[2][0]*37837+r[2][1]*37837+r[2][2]*37837)>>32); +} + public U0 GrSetRotMat(CDC *dc=NULL,I64 r[4][4]) {//Set device context's rot matrix. Will be $LK,"Free",A="MN:Free"$d() in $LK,"DCDel",A="MN:DCDel"$(). Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$. //The main purpose is to set matrix norm for pen width scaling. //NULL as dc means gr.dc -//Note: (1.0/Sqrt(3))*65536=37837.22 - I64 xx=37838,yy=37837,zz=37837; if (!dc) dc=gr.dc; dc->r=r; - GrRot(r,&xx,&yy,&zz); - //scaled 32 bits - dc->r_norm=Sqrt(xx*xx+yy*yy+zz*zz)*65536; + dc->r_norm=Sqrt(GrRotNormSqr65536(r))*65536; //scaled 32 bits } #help_index "Graphics/Mesh" @@ -171,7 +175,7 @@ public CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL) if (!dc) dc=gr.dc; if (!task) task=Fs; if (dc->dc_signature!=DCS_SIGNATURE_VAL) - Dbg; + throw('Graphics'); result=MAlloc(sizeof(CDC),task); MemCpy(result,dc,sizeof(CDC)); result->win_task=result->mem_task=task; @@ -185,7 +189,7 @@ public CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL) public CDC *DCNew(I64 width,I64 height,CTask *task=NULL,Bool null_bitmap=FALSE) {//Create new width x height device context. //Internally only allows widths which are divisible by 8. -//Don't forget these $MA-X+PU,"sizeof(CDC)",LM="Grep(\"sizeof(CDC)\",\"/*\");View;"$. +//Don't forget these $MA-X+PU,"sizeof(CDC)",LM="Find(\"sizeof(CDC)\",\"/*\");View;"$. CDC *result; if (!task) task=Fs; result=CAlloc(sizeof(CDC),task); @@ -194,11 +198,10 @@ public CDC *DCNew(I64 width,I64 height,CTask *task=NULL,Bool null_bitmap=FALSE) result->width=width; result->width_internal=(width+7)&~7; result->height=height; - result->body_size=result->width_internal*result->height; if (null_bitmap) result->flags|=DCF_DONT_DRAW; else - result->body=CAlloc(result->body_size,task); + result->body=CAlloc(result->width_internal*result->height,task); result->r=MAlloc(16*sizeof(I64),task); DCRst(result); result->dc_signature=DCS_SIGNATURE_VAL; @@ -209,7 +212,7 @@ public U0 DCDel(CDC *dc) {//Free dc, image body, rot mat and depth buf. if (!dc) return; if (dc->dc_signature!=DCS_SIGNATURE_VAL) - Dbg; + throw('Graphics'); dc->dc_signature=0; Free(dc->r); if (!(dc->flags & DCF_ALIAS)) @@ -233,7 +236,7 @@ public U0 DCDepthBufRst(CDC *dc) } public U0 DCAllocDepthBuf(CDC *dc) -{//Allocate a 32-bit depth buffer for device context. +{//Alloc a 32-bit depth buffer for device context. Free(dc->depth_buf); dc->depth_buf=MAlloc(dc->width_internal*dc->height*sizeof(I32),dc->mem_task); DCDepthBufRst(dc); @@ -244,7 +247,7 @@ public CDC *DCCopy(CDC *dc,CTask *task=NULL) CDC *result; if (!dc) return NULL; if (dc->dc_signature!=DCS_SIGNATURE_VAL) - Dbg; + throw('Graphics'); result=MAllocIdentical(dc,task); GrSetRotMat(result,MAllocIdentical(dc->r,task)); result->mem_task=task; @@ -287,32 +290,27 @@ public U8 *DCSave(CDC *dc,I64 *_size=NULL,Bool compressed=TRUE) U8 *result,*ptr,*body; Bool old_preempt; CArcCompress *ac; - I64 i,old_flags=dc->flags; + I64 i=dc->width_internal*dc->height,old_flags=dc->flags; if (compressed) { - ac=CompressBuf(dc->body,dc->body_size); + ac=CompressBuf(dc->body,i); i=ac->compressed_size; body=ac; } else { ac=NULL; - i=dc->body_size; body=dc->body; } - ptr=result=MAlloc(offset(CDC.end_saved_area)- - offset(CDC.start_saved_area)+i); + ptr=result=MAlloc(offset(CDC.end)-offset(CDC.start)+i); old_preempt=Preempt(OFF); //in case it is a screen bitmap if (compressed) dc->flags|=DCF_COMPRESSED; dc->flags&=DCF_COMPRESSED; - MemCpy(result,&dc->start_saved_area, - offset(CDC.end_saved_area)- - offset(CDC.start_saved_area)); + MemCpy(result,&dc->start,offset(CDC.end)-offset(CDC.start)); dc->flags=old_flags; Preempt(old_preempt); - ptr+=offset(CDC.end_saved_area)- - offset(CDC.start_saved_area); + ptr+=offset(CDC.end)-offset(CDC.start); MemCpy(ptr,body,i); ptr+=i; @@ -326,22 +324,24 @@ public CDC *DCLoad(U8 *src,I64 *_size=NULL,CTask *task=NULL) CDC *result; U8 *ptr=src; CArcCompress *ac; + I64 body_size; if (!task) task=Fs; result=CAlloc(sizeof(CDC),task); result->win_task=task; result->mem_task=task; - MemCpy(&result->start_saved_area,src, - offset(CDC.end_saved_area)-offset(CDC.start_saved_area)); - ptr+=offset(CDC.end_saved_area)-offset(CDC.start_saved_area); + MemCpy(&result->start,src, + offset(CDC.end)-offset(CDC.start)); + ptr+=offset(CDC.end)-offset(CDC.start); + body_size=result->width_internal*result->height; if (result->flags&DCF_COMPRESSED) { result->flags&=~DCF_COMPRESSED; ac=ptr; result->body=ExpandBuf(ac,task); ptr+=ac->compressed_size; } else { - result->body=MAlloc(result->body_size,task); - MemCpy(result->body,ptr,result->body_size); - ptr+=result->body_size; + result->body=MAlloc(body_size,task); + MemCpy(result->body,ptr,body_size); + ptr+=body_size; } result->pen_width=1; result->r=GrIdentNew(task); @@ -351,6 +351,8 @@ public CDC *DCLoad(U8 *src,I64 *_size=NULL,CTask *task=NULL) return result; } +#help_index "Graphics/GRA Files" +#help_file "::/Doc/GRAFiles" #help_index "Graphics/Device Contexts;Graphics/GRA Files" public I64 GRAWrite(U8 *filename,CDC *dc) {//TempleOS GRA File. @@ -376,7 +378,7 @@ public CDC *GRARead(U8 *filename,CTask *task=NULL) } #help_index "Graphics/Sprite;Graphics/GRA Files;DolDoc/Output" -public U0 DocGRAFile(CDoc *doc=NULL,U8 *filename) +public U0 DocGRA(CDoc *doc=NULL,U8 *filename) {//Put a GRA file into a document as a sprite. CDC *dc=GRARead(filename); CSprite *elems=DC2Sprite(dc); @@ -386,25 +388,29 @@ public U0 DocGRAFile(CDoc *doc=NULL,U8 *filename) } #help_index "Graphics/Device Contexts;Graphics/Screen" -public CDC *DCCaptureScreen(CTask *task=NULL) +public CDC *DCCaptureScreen(Bool include_zoom=TRUE,CTask *task=NULL) {//Capture screen to a device context. CDC *dc; U8 *dst; WinMgrSync(2,TRUE); - dc=DCCopy(gr.screen_image,task); - dst=MAlloc(dc->body_size,task); + if (include_zoom) + dc=DCCopy(gr.screen_image,task); + else + dc=DCCopy(gr.dc1,task); + dc->flags&=~DCF_SCREEN_BITMAP; + dst=MAlloc(dc->width_internal*dc->height,task); //Pick background color that never occurs. COLOR_INVALID - GrBitMap4ToBitMap8(dst,dc->body,dc->body_size/2,COLOR_INVALID); + GrBitMap4ToBitMap8(dst,dc->body,(dc->width_internal*dc->height)>>1,COLOR_INVALID); Free(dc->body); dc->body=dst; return dc; } #help_index "Graphics/GRA Files;Graphics/Screen" -public I64 GRACaptureScreen(U8 *filename) +public I64 GRACaptureScreen(U8 *filename,Bool include_zoom=TRUE) {//Capture screen to a TempleOS GRA File. I64 size; - CDC *dc=DCCaptureScreen; + CDC *dc=DCCaptureScreen(include_zoom); size=GRAWrite(filename,dc); DCDel(dc); return size; diff --git a/Adam/Gr/GrEnd.CPP b/Adam/Gr/GrEnd.CPP index aed9207..9e18434 100644 --- a/Adam/Gr/GrEnd.CPP +++ b/Adam/Gr/GrEnd.CPP @@ -7,7 +7,7 @@ U0 CtrlAltZ(I64 sc) else GrScaleZoom(2.0); } -SetCtrlAltLetCB('Z',&CtrlAltZ,"Sys/Zoom In or Out"); +CtrlAltLetCBSet('Z',&CtrlAltZ,"Sys/Zoom In or Out"); U0 Screen2Clipboard(I64) { @@ -25,4 +25,4 @@ U0 CtrlAltS(I64) { Spawn(&Screen2Clipboard); } -SetCtrlAltLetCB('S',&CtrlAltS,"Sys/Screen Shot to Clipboard"); +CtrlAltLetCBSet('S',&CtrlAltS,"Sys/Screen Shot to Clipboard"); diff --git a/Adam/Gr/GrGlbls.CPP b/Adam/Gr/GrGlbls.CPP index 7bd9326..73ef36c 100644 --- a/Adam/Gr/GrGlbls.CPP +++ b/Adam/Gr/GrGlbls.CPP @@ -9,7 +9,7 @@ public class CGrGlbls *dc2, //Updated every refresh *dc_cache, *zoomed_dc; - U32 *text_base; //See $LK,"TextBase Layer",A="HI:TextBase Layer"$. + U32 *text_base; //See $LK,"TextBase Layer",A="HI:TextBase Layer"$. (Similar to 0xB8000 but 32 bits) U16 *win_z_buf; #define SPHT_ELEM_CODE 1 @@ -19,7 +19,7 @@ public class CGrGlbls I64 highest_uncovered; U16 *vga_text_cache; I64 pan_text_x,pan_text_y; //[-7,7] - U0 (*fp_final_screen_update)(CDC *dc); + U0 (*fp_final_screen_update)(CDC *dc);//Mouse cursor is handled here. U0 (*fp_wall_paper)(CTask *task); U0 (*fp_draw_input_ptr)(CDC *dc,I64 x,I64 y); U0 (*fp_draw_grab_input_ptr)(CDC *dc,I64 x,I64 y,Bool closed); @@ -31,10 +31,6 @@ public class CGrGlbls *even_pen_brushes[GR_NUM_PEN_BRUSHES], *odd_pen_brushes[GR_NUM_PEN_BRUSHES]; -#define GR_REFRESH_LOG_CNT 16 - F64 refresh_time_stamps[GR_REFRESH_LOG_CNT]; - I64 refresh_ts_ptr; - #define GR_MAX_SCREEN_ZOOM 8 U8 *screen_zoom_tables[GR_MAX_SCREEN_ZOOM+1]; I64 screen_zoom,sx,sy; @@ -43,7 +39,7 @@ public class CGrGlbls Bool continuous_scroll; } gr; -//See $LK,"SYS_BIOS_GR_MODE",A="FF:D:/Kernel/KStart.CPP,SYS_BIOS_GR_MODE:2"$ +//See $LK,"RLf_VGA",A="FF:::/Kernel/KStart.CPP,RLf_VGA"$ //See $LK,"SysGrInit",A="MN:SysGrInit"$() //Allows consts to be used instead of vars. HashPublic("GR_WIDTH",HTT_DEFINE_STR);; diff --git a/Adam/Gr/GrInit.CPP b/Adam/Gr/GrInit.CPP index f2c9c79..995d001 100644 --- a/Adam/Gr/GrInit.CPP +++ b/Adam/Gr/GrInit.CPP @@ -55,14 +55,14 @@ U0 GrSetUpTables() if (((x-1)^(y-1))&1 && SqrI64(y*2-k)+SqrI64(x*2-k)>3); +// MemSet(VGAM_GRAPHICS,0,GR_HEIGHT*GR_WIDTH>>3); MemSet(gr.screen_image->body,0,GR_WIDTH*GR_HEIGHT>>1); } for (i=1;i<=GR_MAX_SCREEN_ZOOM;i++) { @@ -79,8 +79,6 @@ U0 GrSetUpTables() dst[j+l*256]=m.u8[l]; } } - for (i=0;i>2); - OutU8(VGA_PALETTE_DATA,bgr.g>>2); - OutU8(VGA_PALETTE_DATA,bgr.b>>2); + OutU8(VGAP_PALETTE_MASK,0xFF); + OutU8(VGAP_REG_WRITE,color_num); + OutU8(VGAP_PALETTE_DATA,bgr.r>>2); + OutU8(VGAP_PALETTE_DATA,bgr.g>>2); + OutU8(VGAP_PALETTE_DATA,bgr.b>>2); LBtr(&sys_semas[SYS_SEMA_VGA],0); POPFD } @@ -54,16 +54,16 @@ public U0 SetVGAPaletteColor(I64 color_num,CBGR bgr) public CBGR GetVGAPaletteColor(I64 color_num) {//6-bits per b, g and r. CBGR result=0; - if (!sys_bios_gr_mode) return 0; + if (!Bt(&sys_run_level,RLf_VGA)) return 0; PUSHFD CLI while (LBts(&sys_semas[SYS_SEMA_VGA],0)) Yield; - OutU8(VGA_PALETTE_MASK,0xFF); - OutU8(VGA_REG_READ,color_num); - result.r=InU8(VGA_PALETTE_DATA)<<2; - result.g=InU8(VGA_PALETTE_DATA)<<2; - result.b=InU8(VGA_PALETTE_DATA)<<2; + OutU8(VGAP_PALETTE_MASK,0xFF); + OutU8(VGAP_REG_READ,color_num); + result.r=InU8(VGAP_PALETTE_DATA)<<2; + result.g=InU8(VGAP_PALETTE_DATA)<<2; + result.b=InU8(VGAP_PALETTE_DATA)<<2; LBtr(&sys_semas[SYS_SEMA_VGA],0); POPFD return result; diff --git a/Adam/Gr/GrPrimatives.CPP b/Adam/Gr/GrPrimatives.CPP index 2dd5d65..907884c 100644 --- a/Adam/Gr/GrPrimatives.CPP +++ b/Adam/Gr/GrPrimatives.CPP @@ -235,7 +235,7 @@ I64 GrFloodFillRay(CDC *dc,I64 x,I64 y,I64 z,I32 *db) } public I64 GrFloodFill(CDC *dc=gr.dc,I64 x,I64 y,Bool not_color=FALSE,I64 z=0,I32 *db=NULL) -{//3D. Ignore z and db. +{//2D. Ignore z and db. //not_color=TRUE means fill up to everything which is not the current color. //not_color=FALSE means fill all parts equal to the color under the point. //Returns cnt of pixs changed diff --git a/Adam/Gr/GrScreen.CPP b/Adam/Gr/GrScreen.CPP index 09709c3..7d61697 100644 --- a/Adam/Gr/GrScreen.CPP +++ b/Adam/Gr/GrScreen.CPP @@ -89,16 +89,10 @@ U0 GrUpdateWins() PutExcept(FALSE); Dbg("Exception in WinMgr"); } - winmgr.last_ode_time=winmgr.ode_time; - ode_allocated_factor=LowPass1(0.1,ode_allocated_factor, + ode_alloced_factor=LowPass1(0.1,ode_alloced_factor, Clamp(Gs->idle_factor-0.1,0.2,0.8),1/winmgr.fps); - sys_task_being_screen_updated=NULL; - gr.refresh_time_stamps[gr.refresh_ts_ptr++&(GR_REFRESH_LOG_CNT-1)]=tS; - winmgr.fps=(GR_REFRESH_LOG_CNT-1)/ - (gr.refresh_time_stamps[(gr.refresh_ts_ptr-1)&(GR_REFRESH_LOG_CNT-1)]- - gr.refresh_time_stamps[gr.refresh_ts_ptr&(GR_REFRESH_LOG_CNT-1)]); } U0 GrFixZoomScale() @@ -339,7 +333,7 @@ U0 GrUpdateTextModeText() { U32 *src=gr.text_base; I64 cur_ch,i,d0=TEXT_COLS*TEXT_ROWS; - U16 *dst=VGA_TEXT_MEM_BASE,*dst2=gr.vga_text_cache; + U16 *dst=VGAM_TEXT,*dst2=gr.vga_text_cache; Bool blink_flag=Blink; if (LBtr(&sys_semas[SYS_SEMA_FLUSH_VGA_IMAGE],0)) { i=d0; @@ -390,18 +384,18 @@ U0 GrUpdateVGAGraphics() dst=gr.screen_image->body; if (LBtr(&sys_semas[SYS_SEMA_FLUSH_VGA_IMAGE],0)) { for (plane=1;plane<0x10;plane<<=1) { - OutU8(VGA_SC_INDEX,VGA_MAP_MASK); - OutU8(VGA_SC_DATA,plane); - vga=VGA_GRAPHIC_MEM_BASE; + OutU8(VGAP_INDEX,VGAR_MAP_MASK); + OutU8(VGAP_DATA,plane); + vga=VGAM_GRAPHICS; row=gr.zoomed_dc->height; while (row--) GrUpdateLine64FlushCache(&vga,&src,d,&dst); } } else { for (plane=1;plane<0x10;plane<<=1) { - OutU8(VGA_SC_INDEX,VGA_MAP_MASK); - OutU8(VGA_SC_DATA,plane); - vga=VGA_GRAPHIC_MEM_BASE; + OutU8(VGAP_INDEX,VGAR_MAP_MASK); + OutU8(VGAP_DATA,plane); + vga=VGAM_GRAPHICS; row=gr.zoomed_dc->height; while (row--) GrUpdateLine64(&vga,&src,d,&dst); @@ -410,10 +404,10 @@ U0 GrUpdateVGAGraphics() } U0 GrUpdateScreen() -{//Called by the Window Manager $LK,"HERE",A="FF:::/Adam/Win2b.CPP,GrUpdateScreen"$, 60 times a second. +{//Called by the Window Manager $LK,"HERE",A="FF:::/Adam/WinB.CPP,GrUpdateScreen"$, 60 times a second. CDC *dc; Preempt(ON); - if (!sys_bios_gr_mode) //if text mode + if (!Bt(&sys_run_level,RLf_VGA)) //if text mode GrUpdateWins; else { GrUpdateTextBG; @@ -429,7 +423,7 @@ U0 GrUpdateScreen() (*gr.fp_final_screen_update)(dc); DCDel(dc); - if (!sys_bios_gr_mode) //if text mode + if (!Bt(&sys_run_level,RLf_VGA)) //if text mode GrUpdateTextModeText; else { DCBlotColor4(gr.dc1->body,gr.dc2->body,gr.dc_cache->body, diff --git a/Adam/Gr/GrSpritePlot.CPP b/Adam/Gr/GrSpritePlot.CPP index f3e34ed..1ff42a0 100644 --- a/Adam/Gr/GrSpritePlot.CPP +++ b/Adam/Gr/GrSpritePlot.CPP @@ -39,15 +39,15 @@ public U0 Sprite3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE) dc->cur_sprite_elem_num=cur_sprite_elem_num++; switch (tempg->type) { case SPT_COLOR: - dc->color=dc->color&~(COLORROP_COLORS_MASK|ROPF_DITHER)|tempg->color; + dc->color=dc->color&~(COLORROP_COLORS_MASK|ROPF_DITHER)|tempg->c.color; break; case SPT_DITHER_COLOR: dc->color=dc->color&~COLORROP_COLORS_MASK| - tempg->dither_color.u8[0]| - tempg->dither_color.u8[1]<d.dither_color.u8[0]| + tempg->d.dither_color.u8[1]<pen_width=tempg->width; + dc->pen_width=tempg->w.width; GrScalePenWidth(dc); break; case SPT_TRANSFORM_ON: @@ -67,86 +67,87 @@ public U0 Sprite3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE) dc->flags&=~DCF_TRANSFORMATION; break; case SPT_PT: - GrPlot3(dc,tempg->x1+x,tempg->y1+y,z); + GrPlot3(dc,tempg->p.x1+x,tempg->p.y1+y,z); break; case SPT_TEXT: - GrPrint3(dc,tempg->x1+x,tempg->y1+y,z,"%s",tempg->st); + GrPrint3(dc,tempg->ps.x1+x,tempg->ps.y1+y,z,"%s",tempg->ps.st); break; case SPT_TEXT_BOX: - GrTextBox3(dc,tempg->x1+x,tempg->y1+y,z,tempg->st); + GrTextBox3(dc,tempg->ps.x1+x,tempg->ps.y1+y,z,tempg->ps.st); break; case SPT_TEXT_DIAMOND: - GrTextDiamond3(dc,tempg->x1+x,tempg->y1+y,z,tempg->st); + GrTextDiamond3(dc,tempg->ps.x1+x,tempg->ps.y1+y,z,tempg->ps.st); break; case SPT_FLOOD_FILL: - GrFloodFill3(dc,tempg->x1+x,tempg->y1+y,z,FALSE); + GrFloodFill3(dc,tempg->p.x1+x,tempg->p.y1+y,z,FALSE); break; case SPT_FLOOD_FILL_NOT: i=dc->color; dc->color=dc->color.c0; - GrFloodFill3(dc,tempg->x1+x,tempg->y1+y,z,TRUE); + GrFloodFill3(dc,tempg->p.x1+x,tempg->p.y1+y,z,TRUE); dc->color=i; break; case SPT_SHIFT: - x+=tempg->x1; - y+=tempg->y1; + x+=tempg->p.x1; + y+=tempg->p.y1; break; case SPT_LINE: - GrLine3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2+x,tempg->y2+y,z); + GrLine3(dc,tempg->pp.x1+x,tempg->pp.y1+y,z,tempg->pp.x2+x,tempg->pp.y2+y,z); break; case SPT_ARROW: - GrArrow3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2+x,tempg->y2+y,z); + GrArrow3(dc,tempg->pp.x1+x,tempg->pp.y1+y,z,tempg->pp.x2+x,tempg->pp.y2+y,z); break; case SPT_PLANAR_SYMMETRY: - if (GrSetSymmetry3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2+x,tempg->y2+y,z,tempg->x2+x,tempg->y2+y,z+1)) + if (GrSetSymmetry3(dc,tempg->pp.x1+x,tempg->pp.y1+y,z,tempg->pp.x2+x,tempg->pp.y2+y,z,tempg->pp.x2+x,tempg->pp.y2+y,z+1)) dc->flags|=DCF_SYMMETRY; else dc->flags&=~DCF_SYMMETRY; break; case SPT_BITMAP: img=CAlloc(sizeof(CDC)); - img->width=tempg->width; - img->width_internal=(tempg->width+7)&~7; - img->height=tempg->height; - img->body_size=img->width_internal*img->height; - img->body=tempg(U8 *)+offset(CSprite.linespeed); + img->width=tempg->pwhu.width; + img->width_internal=(tempg->pwhu.width+7)&~7; + img->height=tempg->pwhu.height; + img->body=&tempg->pwhu.u; img->dc_signature=DCS_SIGNATURE_VAL; - GrBlot3(dc,tempg->x2+x,tempg->y2+y,z,img); + GrBlot3(dc,tempg->pwhu.x1+x,tempg->pwhu.y1+y,z,img); Free(img); break; case SPT_RECT: - GrRect3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2-tempg->x1,tempg->y2-tempg->y1); + GrRect3(dc,tempg->pp.x1+x,tempg->pp.y1+y,z,tempg->pp.x2-tempg->pp.x1,tempg->pp.y2-tempg->pp.y1); break; case SPT_ROTATED_RECT: - x1=tempg->x1+x; - y1=tempg->y1+y; + x1=tempg->ppa.x1+x; + y1=tempg->ppa.y1+y; z1=z; GrRot(dc->r,&x1,&y1,&z1); old_r=dc->r; dc->flags|=DCF_TRANSFORMATION; - r2=GrRotZNew(-tempg->rot_angle); + r2=GrRotZNew(-tempg->ppa.angle); GrSetTranslation(r2,x1,y1,z1); GrSetRotMat(dc,GrMulMat(old_r,r2)); - GrRect3(dc,0,0,0,tempg->x2-tempg->x1,tempg->y2-tempg->y1); + GrRect3(dc,0,0,0,tempg->ppa.x2-tempg->ppa.x1,tempg->ppa.y2-tempg->ppa.y1); Free(dc->r); Free(r2); GrSetRotMat(dc,old_r); dc->flags=dc->flags&~DCF_TRANSFORMATION|old_flags; break; case SPT_CIRCLE: - GrCircle3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2); + GrCircle3(dc,tempg->pr.x1+x,tempg->pr.y1+y,z,tempg->pr.radius); break; case SPT_ELLIPSE: - GrEllipse3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->rot_angle); + GrEllipse3(dc,tempg->pwha.x1+x,tempg->pwha.y1+y,z,tempg->pwha.width, + tempg->pwha.height,tempg->pwha.angle); break; case SPT_POLYGON: - GrRegPoly3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->sides,tempg->rot_angle); + GrRegPoly3(dc,tempg->pwhas.x1+x,tempg->pwhas.y1+y,z,tempg->pwhas.width, + tempg->pwhas.height,tempg->pwhas.sides,tempg->pwhas.angle); break; case SPT_POLYLINE: - ptr=&tempg->y1; + ptr=&tempg->nu.u; x1=ptr[0]; y1=ptr[1]; - for (i=1;inum;i++) { + for (i=1;inu.num;i++) { x2=ptr[i<<1]; y2=ptr[i<<1+1]; GrLine3(dc,x1+x,y1+y,z,x2+x,y2+y,z); @@ -154,11 +155,10 @@ public U0 Sprite3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE) } break; case SPT_POLYPT: - ptr=&tempg->y1; - x1=ptr[0]; - y1=ptr[1]; - ptr+=2; - k=tempg->num*3; + x1=tempg->npu.x; + y1=tempg->npu.y; + ptr=&tempg->npu.u; + k=tempg->npu.num*3; GrPlot3(dc,x1+x,y1+y,z); for (i=0;iy1; - for (i=0;inum;i++,p++) { + p=&tempg->nu.u; + for (i=0;inu.num;i++,p++) { p->x+=x; p->y+=y; p->z+=z; } case SPT_BSPLINE2: - Gr2BSpline3(dc,&tempg->y1,tempg->num,FALSE); + Gr2BSpline3(dc,&tempg->nu.u,tempg->nu.num,FALSE); break; case SPT_BSPLINE3: - Gr3BSpline3(dc,&tempg->y1,tempg->num,FALSE); + Gr3BSpline3(dc,&tempg->nu.u,tempg->nu.num,FALSE); break; case SPT_BSPLINE2_CLOSED: - Gr2BSpline3(dc,&tempg->y1,tempg->num,TRUE); + Gr2BSpline3(dc,&tempg->nu.u,tempg->nu.num,TRUE); break; case SPT_BSPLINE3_CLOSED: - Gr3BSpline3(dc,&tempg->y1,tempg->num,TRUE); + Gr3BSpline3(dc,&tempg->nu.u,tempg->nu.num,TRUE); break; sub_switch_end: - p=&tempg->y1; - for (i=0;inum;i++,p++) { + p=&tempg->nu.u; + for (i=0;inu.num;i++,p++) { p->x-=x; p->y-=y; p->z-=z; } break; case SPT_MESH: - p=&tempg->x2; - for (i=0;ivertex_cnt;i++,p++) { + p=&tempg->mu.u; + for (i=0;imu.vertex_cnt;i++,p++) { p->x+=x; p->y+=y; p->z+=z; } - Gr3Mesh(dc,tempg->vertex_cnt,&tempg->x2,tempg->tri_cnt,(&tempg->x2)(U8 *)+sizeof(CD3I32)*tempg->vertex_cnt); - p=&tempg->x2; - for (i=0;ivertex_cnt;i++,p++) { + Gr3Mesh(dc,tempg->mu.vertex_cnt,&tempg->mu.u,tempg->mu.tri_cnt, + (&tempg->mu.u)(U8 *)+sizeof(CD3I32)*tempg->mu.vertex_cnt); + p=&tempg->mu.u; + for (i=0;imu.vertex_cnt;i++,p++) { p->x-=x; p->y-=y; p->z-=z; @@ -211,35 +212,35 @@ public U0 Sprite3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE) break; case SPT_SHIFTABLE_MESH: if (dc->flags&DCF_TRANSFORMATION) { - dc->x+=tempg->x1; - dc->y+=tempg->y1; - dc->z+=tempg->z1; + dc->x+=tempg->pmu.x; + dc->y+=tempg->pmu.y; + dc->z+=tempg->pmu.z; x1=x; y1=y; z1=z; } else { - x1=tempg->x1+x; - y1=tempg->y1+y; - z1=tempg->z1+z; + x1=tempg->pmu.x+x; + y1=tempg->pmu.y+y; + z1=tempg->pmu.z+z; } - p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32); - for (i=0;ishiftable_vertex_cnt;i++,p++) { + p=&tempg->pmu.u; + for (i=0;ipmu.vertex_cnt;i++,p++) { p->x+=x1; p->y+=y1; p->z+=z1; } - p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32); - Gr3Mesh(dc,tempg->shiftable_vertex_cnt,p,tempg->shiftable_tri_cnt,p(U8 *)+sizeof(CD3I32)*tempg->shiftable_vertex_cnt); - p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32); - for (i=0;ishiftable_vertex_cnt;i++,p++) { + Gr3Mesh(dc,tempg->pmu.vertex_cnt,&tempg->pmu.u,tempg->pmu.tri_cnt, + (&tempg->pmu.u)(U8 *)+sizeof(CD3I32)*tempg->pmu.vertex_cnt); + p=&tempg->pmu.u; + for (i=0;ipmu.vertex_cnt;i++,p++) { p->x-=x1; p->y-=y1; p->z-=z1; } if (dc->flags&DCF_TRANSFORMATION) { - dc->x-=tempg->x1; - dc->y-=tempg->y1; - dc->z-=tempg->z1; + dc->x-=tempg->pmu.x; + dc->y-=tempg->pmu.y; + dc->z-=tempg->pmu.z; } break; } @@ -355,13 +356,13 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t) throw('Graphics'); switch (tempg0->type) { case SPT_ROTATED_RECT: - tempgr->rot_angle=(tempg0->rot_angle*t0+tempg1->rot_angle*t1)/GR_SCALE; + tempgr->ppa.angle=(tempg0->ppa.angle*t0+tempg1->ppa.angle*t1)/GR_SCALE; case SPT_RECT: case SPT_LINE: case SPT_ARROW: case SPT_PLANAR_SYMMETRY: - tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32; - tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32; + tempgr->pp.x2=(tempg0->pp.x2*t0+tempg1->pp.x2*t1)>>32; + tempgr->pp.y2=(tempg0->pp.y2*t0+tempg1->pp.y2*t1)>>32; case SPT_TEXT: case SPT_TEXT_BOX: case SPT_TEXT_DIAMOND: @@ -369,69 +370,66 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t) case SPT_FLOOD_FILL: case SPT_FLOOD_FILL_NOT: case SPT_SHIFT: - tempgr->x1=(tempg0->x1*t0+tempg1->x1*t1)>>32; - tempgr->y1=(tempg0->y1*t0+tempg1->y1*t1)>>32; + tempgr->p.x1=(tempg0->p.x1*t0+tempg1->p.x1*t1)>>32; + tempgr->p.y1=(tempg0->p.y1*t0+tempg1->p.y1*t1)>>32; break; case SPT_CIRCLE: - tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32; - tempgr->x1=(tempg0->x1*t0+tempg1->x1*t1)>>32; - tempgr->y1=(tempg0->y1*t0+tempg1->y1*t1)>>32; + tempgr->pr.radius=(tempg0->pr.radius*t0+tempg1->pr.radius*t1)>>32; + tempgr->pr.x1=(tempg0->pr.x1*t0+tempg1->pr.x1*t1)>>32; + tempgr->pr.y1=(tempg0->pr.y1*t0+tempg1->pr.y1*t1)>>32; break; case SPT_ELLIPSE: case SPT_POLYGON: - tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32; - tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32; - tempgr->width=(tempg0->width*t0+tempg1->width*t1)>>32; - tempgr->height=(tempg0->height*t0+tempg1->height*t1)>>32; + tempgr->pwha.x1=(tempg0->pwha.x1*t0+tempg1->pwha.x1*t1)>>32; + tempgr->pwha.y1=(tempg0->pwha.y1*t0+tempg1->pwha.y1*t1)>>32; + tempgr->pwha.width =(tempg0->pwha.width *t0+tempg1->pwha.width*t1)>>32; + tempgr->pwha.height=(tempg0->pwha.height*t0+tempg1->pwha.height*t1)>>32; break; case SPT_BITMAP: - tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32; - tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32; + tempgr->pwhu.x1=(tempg0->pwhu.x1*t0+tempg1->pwhu.x1*t1)>>32; + tempgr->pwhu.y1=(tempg0->pwhu.y1*t0+tempg1->pwhu.y1*t1)>>32; break; case SPT_POLYLINE: - ptr0=&tempg0->y1; - ptr1=&tempg1->y1; - ptrr=&tempgr->y1; - for (i=0;inum;i++) { + ptr0=&tempg0->nu.u; + ptr1=&tempg1->nu.u; + ptrr=&tempgr->nu.u; + for (i=0;inu.num;i++) { ptrr[i<<1]=(ptr0[i<<1]*t0+ptr1[i<<1]*t1)>>32; ptrr[i<<1+1]=(ptr0[i<<1+1]*t0+ptr1[i<<1+1]*t1)>>32; } break; case SPT_POLYPT: - ptr0=&tempg0->y1; - ptr1=&tempg1->y1; - ptrr=&tempgr->y1; - ptrr[0]=(ptr0[0]*t0+ptr1[0]*t1)>>32; - ptrr[1]=(ptr0[1]*t0+ptr1[1]*t1)>>32; + tempgr->npu.x=(tempg0->npu.x*t0+tempg1->npu.x*t1)>>32; + tempgr->npu.y=(tempg0->npu.y*t0+tempg1->npu.y*t1)>>32; break; case SPT_BSPLINE2: case SPT_BSPLINE3: case SPT_BSPLINE2_CLOSED: case SPT_BSPLINE3_CLOSED: - p0=&tempg0->y1; - p1=&tempg1->y1; - pr=&tempgr->y1; - for (i=0;inum;i++) { + p0=&tempg0->nu.u; + p1=&tempg1->nu.u; + pr=&tempgr->nu.u; + for (i=0;inu.num;i++) { pr[i].x=(p0[i].x*t0+p1[i].x*t1)>>32; pr[i].y=(p0[i].y*t0+p1[i].y*t1)>>32; pr[i].z=(p0[i].z*t0+p1[i].z*t1)>>32; } break; case SPT_MESH: - p0=&tempg0->x2; - p1=&tempg1->x2; - pr=&tempgr->x2; - for (i=0;ivertex_cnt;i++) { + p0=&tempg0->mu.u; + p1=&tempg1->mu.u; + pr=&tempgr->mu.u; + for (i=0;imu.vertex_cnt;i++) { pr[i].x=(p0[i].x*t0+p1[i].x*t1)>>32; pr[i].y=(p0[i].y*t0+p1[i].y*t1)>>32; pr[i].z=(p0[i].z*t0+p1[i].z*t1)>>32; } break; case SPT_SHIFTABLE_MESH: - p0=(&tempg0->shiftable_tri_cnt)(U8 *)+sizeof(I32); - p1=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); - pr=(&tempgr->shiftable_tri_cnt)(U8 *)+sizeof(I32); - for (i=0;ishiftable_vertex_cnt;i++) { + p0=&tempg0->pmu.u; + p1=&tempg1->pmu.u; + pr=&tempgr->pmu.u; + for (i=0;ipmu.vertex_cnt;i++) { pr[i].x=(p0[i].x*t0+p1[i].x*t1)>>32; pr[i].y=(p0[i].y*t0+p1[i].y*t1)>>32; pr[i].z=(p0[i].z*t0+p1[i].z*t1)>>32; diff --git a/Adam/Gr/GrTextBase.CPP b/Adam/Gr/GrTextBase.CPP index 470e2ba..3e54601 100644 --- a/Adam/Gr/GrTextBase.CPP +++ b/Adam/Gr/GrTextBase.CPP @@ -5,7 +5,7 @@ asm { USE64 //************************************ _TEXT_CHAR:://Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 d); -//Must be called 60fps in Fs->draw_it() callback. +//Must be called 30fps in Fs->draw_it() callback. PUSH RBP MOV RBP,RSP MOV RCX,U64 SF_ARG1[RBP] @@ -82,7 +82,7 @@ _TEXT_CHAR:://Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 RET1 40 //************************************ _TEXT_LEN_STR:://Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s) -//Must be called 60fps in Fs->draw_it() callback. +//Must be called 30fps in Fs->draw_it() callback. PUSH RBP MOV RBP,RSP PUSH RSI @@ -157,7 +157,7 @@ _TEXT_LEN_STR:://Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s) RET1 48 //************************************ _TEXT_LEN_ATTR_STR:://Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_attr) -//Must be called 60fps in Fs->draw_it() callback. +//Must be called 30fps in Fs->draw_it() callback. PUSH RBP MOV RBP,RSP PUSH RSI @@ -232,7 +232,7 @@ _TEXT_LEN_ATTR_STR:://Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_ RET1 40 //************************************ _TEXT_LEN_ATTR:://Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr) -//Must be called 60fps in Fs->draw_it() callback. +//Must be called 30fps in Fs->draw_it() callback. PUSH RBP MOV RBP,RSP PUSH RSI @@ -307,13 +307,13 @@ _TEXT_LEN_ATTR:://Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr) POP RBP RET1 40 } -public _extern _TEXT_CHAR Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 d); //Plot char. Must be called 60fps in Fs->draw_it() callback. -public _extern _TEXT_LEN_STR Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s); //Plot str with len. Must be called 60fps in Fs->draw_it() callback. -public _extern _TEXT_LEN_ATTR_STR Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_attr); //Plot attr str with len. Must be called 60fps in Fs->draw_it() callback. -public _extern _TEXT_LEN_ATTR Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr); //Plot attrs with len. Must be called 60fps in Fs->draw_it() callback. +public _extern _TEXT_CHAR Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 d); //Plot char. Must be called 30fps in Fs->draw_it() callback. +public _extern _TEXT_LEN_STR Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s); //Plot str with len. Must be called 30fps in Fs->draw_it() callback. +public _extern _TEXT_LEN_ATTR_STR Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_attr); //Plot attr str with len. Must be called 30fps in Fs->draw_it() callback. +public _extern _TEXT_LEN_ATTR Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr); //Plot attrs with len. Must be called 30fps in Fs->draw_it() callback. public U0 TextPrint(CTask *task,I64 x,I64 y,I64 attr,U8 *fmt,...) -{//Plot chars. Must be called 60fps in Fs->draw_it() callback. +{//Plot chars. Must be called 30fps in Fs->draw_it() callback. //You probably want $LK,"GrPrint",A="MN:GrPrint"$() or just $LK,"Print",A="MN:Print"$(). U8 *buf=StrPrintJoin(NULL,fmt,argc,argv); TextLenStr(task,x,y,StrLen(buf),attr<<8,buf); @@ -321,7 +321,7 @@ public U0 TextPrint(CTask *task,I64 x,I64 y,I64 attr,U8 *fmt,...) } public U0 TextBorder(CTask *task=NULL,I64 l,I64 r,I64 t,I64 b,I64 attr,Bool solid) -{//Plot border square. Must be called 60fps in Fs->draw_it() callback. +{//Plot border square. Must be called 30fps in Fs->draw_it() callback. //Draws window borders or DolDoc text button borders. //Set task=sys_winmgr_task for no clipping. I64 i; @@ -357,7 +357,7 @@ public U0 TextBorder(CTask *task=NULL,I64 l,I64 r,I64 t,I64 b,I64 attr,Bool soli } public U0 TextRect(I64 l,I64 r,I64 t,I64 b,I64 d) -{//Fill text rect. Must be called 60fps in Fs->draw_it() callback. +{//Fill text rect. Must be called 30fps in Fs->draw_it() callback. I64 y,w; if (l>r || t>b) return; if (t<0) t=0; @@ -368,3 +368,4 @@ public U0 TextRect(I64 l,I64 r,I64 t,I64 b,I64 d) for (y=t;y<=b;y++) MemSetU32(gr.text_base(U8 *)+(y*TEXT_COLS+l)*sizeof(U32),d,w); } + diff --git a/Adam/Gr/SpriteBitMap.CPP b/Adam/Gr/SpriteBitMap.CPP index 3d2b690..5eb76d2 100644 --- a/Adam/Gr/SpriteBitMap.CPP +++ b/Adam/Gr/SpriteBitMap.CPP @@ -85,8 +85,8 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width) "\n$$MU-UL,\"Undo\",LE=GBM_UNDO$$\n" "\n$$PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",LE=GBM_MAIN_MENU$$$$LTBLUE$$\n" "$$MU-UL,\"Exit Sprite\",LE=GBM_EXIT$$\n" - "$$MU-UL,\"Abort Sprite\",LE=DOCM_CANCEL$$\n",st1,st2,width); - DocPrint(doc,"\nRight-Click to get back to this menu."); + "$$MU-UL,\"Abort Sprite\",LE=DOCM_CANCEL$$\n" + "\nRight-Click to get back to this menu.",st1,st2,width); i=PopUpMenu(doc); DocDel(doc); return i; @@ -224,12 +224,21 @@ I64 SpriteBitMapEd(CDoc *,CDocEntry *doc_e,CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2 1<color=color; dc->pen_width=width; - switch (mode) { - case GBM_LINE: - GrLine3(dc,x1,y1,0,a1,a2,0); - break; - case GBM_ARROW: - GrArrow3(dc,x1,y1,0,a1,a2,0); - break; - case GBM_RECT: - GrRect(dc,x1,y1,1,1); - break; - case GBM_CIRCLE: - GrCircle3(dc,x1,y1,0,1); - break; - case GBM_COPY: - case GBM_DELETE: - dc->color=ROPF_DITHER+WHITE<<16+BLACK; - dc->pen_width=1; - GrBorder(dc,x1,y1,x1,y1); - break; - } + case GBM_LINE: + GrLine3(dc,x1,y1,0,a1,a2,0); + break; + case GBM_ARROW: + GrArrow3(dc,x1,y1,0,a1,a2,0); + break; + case GBM_RECT: + GrRect(dc,x1,y1,1,1); + break; + case GBM_CIRCLE: + GrCircle3(dc,x1,y1,0,1); + break; + case GBM_COPY: + case GBM_DELETE: + dc->color=ROPF_DITHER+WHITE<<16+BLACK; + dc->pen_width=1; + GrBorder(dc,x1,y1,x1,y1); + break; + sub_switch_end: break; case GBM_PASTE: case GBM_PASTE_TRANSPARENT: diff --git a/Adam/Gr/SpriteCode.CPP b/Adam/Gr/SpriteCode.CPP index baec10a..0576885 100644 --- a/Adam/Gr/SpriteCode.CPP +++ b/Adam/Gr/SpriteCode.CPP @@ -12,11 +12,11 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tempg) switch (tempg->type) { case SPT_COLOR: DocPrint(doc,"{%s}", - Color2Str(buf1,tempg->color)); + Color2Str(buf1,tempg->c.color)); break; case SPT_DITHER_COLOR: DocPrint(doc,"{%s}", - Color2Str(buf2,ROPF_DITHER|tempg->dither_color.u8[0]|tempg->dither_color.u8[1]<d.dither_color.u8[0]|tempg->d.dither_color.u8[1]<x1,tempg->y1,tempg->x2,tempg->y2); + DocPrint(doc,"{(%d,%d),(%d,%d)}",tempg->pp.x1,tempg->pp.y1,tempg->pp.x2,tempg->pp.y2); break; case SPT_RECT: - DocPrint(doc,"{(%d,%d):(%d,%d)}",tempg->x1,tempg->y1, - tempg->x2-tempg->x1,tempg->y2-tempg->y1); + DocPrint(doc,"{(%d,%d):(%d,%d)}",tempg->pp.x1,tempg->pp.y1, + tempg->pp.x2-tempg->pp.x1,tempg->pp.y2-tempg->pp.y1); break; case SPT_ROTATED_RECT: - DocPrint(doc,"{(%d,%d):(%d,%d),%0.4f}",tempg->x1,tempg->y1, - tempg->x2-tempg->x1,tempg->y2-tempg->y1, - 180/ã*Wrap(tempg->rot_angle)); + DocPrint(doc,"{(%d,%d):(%d,%d),%0.4f}",tempg->ppa.x1,tempg->ppa.y1, + tempg->ppa.x2-tempg->ppa.x1,tempg->ppa.y2-tempg->ppa.y1, + 180/ã*Wrap(tempg->ppa.angle)); break; case SPT_PT: case SPT_FLOOD_FILL: case SPT_SHIFT: - DocPrint(doc,"{(%d,%d)}",tempg->x1,tempg->y1); + DocPrint(doc,"{(%d,%d)}",tempg->p.x1,tempg->p.y1); break; case SPT_FLOOD_FILL_NOT: - DocPrint(doc,"{(%d,%d),TRUE}",tempg->x1,tempg->y1); + DocPrint(doc,"{(%d,%d),TRUE}",tempg->p.x1,tempg->p.y1); break; case SPT_CIRCLE: - DocPrint(doc,"{(%d,%d):%d}",tempg->x1,tempg->y1,tempg->x2); + DocPrint(doc,"{(%d,%d):%d}",tempg->pr.x1,tempg->pr.y1,tempg->pr.radius); break; case SPT_WIDTH: - DocPrint(doc,"{%d}",tempg->width); + DocPrint(doc,"{%d}",tempg->w.width); break; case SPT_ELLIPSE: - DocPrint(doc,"{(%d,%d):(%d,%d),%0.4f}",tempg->x2,tempg->y2, - tempg->width,tempg->height,180/ã*Wrap(tempg->rot_angle)); + DocPrint(doc,"{(%d,%d):(%d,%d),%0.4f}",tempg->pwha.x1,tempg->pwha.y1, + tempg->pwha.width,tempg->pwha.height,180/ã*Wrap(tempg->pwha.angle)); break; case SPT_POLYGON: - DocPrint(doc,"{%d,(%d,%d):(%d,%d),%0.4f}",tempg->sides,tempg->x2,tempg->y2, - tempg->width,tempg->height,180/ã*Wrap(tempg->rot_angle)); + DocPrint(doc,"{%d,(%d,%d):(%d,%d),%0.4f}",tempg->pwhas.sides, + tempg->pwhas.x1,tempg->pwhas.y1,tempg->pwhas.width,tempg->pwhas.height, + 180/ã*Wrap(tempg->pwhas.angle)); break; case SPT_TEXT: case SPT_TEXT_BOX: case SPT_TEXT_DIAMOND: - DocPrint(doc,"{(%d,%d),\"%Q\"}",tempg->x1,tempg->y1,tempg->st); + DocPrint(doc,"{(%d,%d),\"%Q\"}",tempg->ps.x1,tempg->ps.y1,tempg->ps.st); break; case SPT_POLYLINE: - ptr=&tempg->y1; - DocPrint(doc,"{(%d,%d)",ptr[0],ptr[1]); - if (tempg->num>1) DocPrint(doc,","); - ptr+=2; - for (i=1;inum;i++) { + ptr=&tempg->nu.u; + DocPrint(doc,"{"); + for (i=0;inu.num;i++,ptr+=2) { DocPrint(doc,"(%d,%d)",ptr[0],ptr[1]); - if (i+1num) DocPrint(doc,","); - if (i&3==3 && i+1num) + if (i+1nu.num) DocPrint(doc,","); + if (i&3==3 && i+1nu.num) DocPrint(doc,"\n"); - ptr+=2; } DocPrint(doc,"}"); break; @@ -83,14 +81,12 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tempg) case SPT_BSPLINE3: case SPT_BSPLINE2_CLOSED: case SPT_BSPLINE3_CLOSED: - ptr=&tempg->y1; - DocPrint(doc,"{(%d,%d,%d)",ptr[0],ptr[1],ptr[2]); - ptr+=3; - if (tempg->num>1) DocPrint(doc,","); - for (i=1;inum;i++,ptr+=3) { + ptr=&tempg->nu.u; + DocPrint(doc,"{"); + for (i=0;inu.num;i++,ptr+=3) { DocPrint(doc,"(%d,%d,%d)",ptr[0],ptr[1],ptr[2]); - if (i+1num) DocPrint(doc,","); - if (i&3==3 && i+1num) + if (i+1nu.num) DocPrint(doc,","); + if (i&3==3 && i+1nu.num) DocPrint(doc,"\n"); } if (tempg->type==SPT_BSPLINE2||tempg->type==SPT_BSPLINE3) @@ -99,13 +95,12 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tempg) DocPrint(doc,",TRUE}"); break; case SPT_POLYPT: - ptr=&tempg->y1; - DocPrint(doc,"{(%d,%d),",ptr[0],ptr[1]); - ptr+=2; + DocPrint(doc,"{(%d,%d),",tempg->npu.x,tempg->npu.y); + ptr=&tempg->npu.u; col=16; - for (i=0;inum;i++) { + for (i=0;inpu.num;i++) { DocPrint(doc,"%d",BFieldExtU32(ptr,i*3,3)); - if (++col>=64 && i+1num) { + if (++col>=64 && i+1npu.num) { DocPrint(doc,"\n"); col=0; } @@ -113,23 +108,24 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tempg) DocPrint(doc,"}"); break; case SPT_BITMAP: - DocPrint(doc,"{(%d,%d):(%d,%d),\n",tempg->x2,tempg->y2,tempg->width,tempg->height); - width_internal=(tempg->width+7)&~7; + DocPrint(doc,"{(%d,%d):(%d,%d),\n",tempg->pwhu.x1,tempg->pwhu.y1, + tempg->pwhu.width,tempg->pwhu.height); + width_internal=(tempg->pwhu.width+7)&~7; if (width_internal<80) k=width_internal; else k=64; - ptr=tempg(U8 *)+offset(CSprite.linespeed); + ptr=&tempg->pwhu.u; col=0; - for (j=0;jheight;j++) + for (j=0;jpwhu.height;j++) for (i=0;i=tempg->width) + if (i>=tempg->pwhu.width) DocPrint(doc,"_"); else if (*ptr(U8 *)<16) DocPrint(doc,"%X",*ptr(U8 *)); else DocPrint(doc,"%c",CH_SHIFT_SPACE); - if (++col>=k && (i+1height)) { + if (++col>=k && (i+1pwhu.height)) { DocPrint(doc,"\n"); col=0; } @@ -138,11 +134,11 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tempg) break; case SPT_MESH: DocPrint(doc,"{FALSE,"); - p=(&tempg->tri_cnt)(U8 *)+sizeof(I32); + p=&tempg->mu.u; col=0; - for (i=0;ivertex_cnt;i++,p++) { + for (i=0;imu.vertex_cnt;i++,p++) { DocPrint(doc,"(%d,%d,%d)",p->x,p->y,p->z); - if (i+1vertex_cnt) DocPrint(doc,","); + if (i+1mu.vertex_cnt) DocPrint(doc,","); if (++col==4) { DocPrint(doc,"\t//%d\n",i); col=0; @@ -150,11 +146,11 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tempg) } DocPrint(doc,":"); tri=p; - for (i=0;itri_cnt;i++,tri++) { + for (i=0;imu.tri_cnt;i++,tri++) { DocPrint(doc,"(%s,%d,%d,%d)",Color2Str(buf1,tri->color), tri->nums[0],tri->nums[1],tri->nums[2]); - if (i+1tri_cnt) DocPrint(doc,","); - if (++col>=3 && i+1tri_cnt) { + if (i+1mu.tri_cnt) DocPrint(doc,","); + if (++col>=3 && i+1mu.tri_cnt) { DocPrint(doc,"\n"); col=0; } @@ -162,12 +158,12 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tempg) DocPrint(doc,"}"); break; case SPT_SHIFTABLE_MESH: - DocPrint(doc,"{TRUE,(%d,%d,%d):",tempg->x1,tempg->y1,tempg->z1); - p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32); + DocPrint(doc,"{TRUE,(%d,%d,%d):",tempg->pmu.x,tempg->pmu.y,tempg->pmu.z); + p=&tempg->pmu.u; col=1; - for (i=0;ishiftable_vertex_cnt;i++,p++) { + for (i=0;ipmu.vertex_cnt;i++,p++) { DocPrint(doc,"(%d,%d,%d)",p->x,p->y,p->z); - if (i+1shiftable_vertex_cnt) DocPrint(doc,","); + if (i+1pmu.vertex_cnt) DocPrint(doc,","); if (++col==4) { DocPrint(doc,"\t//%d\n",i); col=0; @@ -175,11 +171,11 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tempg) } DocPrint(doc,":"); tri=p; - for (i=0;ishiftable_tri_cnt;i++,tri++) { + for (i=0;ipmu.tri_cnt;i++,tri++) { DocPrint(doc,"(%s,%d,%d,%d)",Color2Str(buf1,tri->color), tri->nums[0],tri->nums[1],tri->nums[2]); - if (i+1shiftable_tri_cnt) DocPrint(doc,","); - if (++col>=3 && i+1shiftable_tri_cnt) { + if (i+1pmu.tri_cnt) DocPrint(doc,","); + if (++col>=3 && i+1pmu.tri_cnt) { DocPrint(doc,"\n"); col=0; } @@ -217,9 +213,9 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) color=Str2ColorU32(st); Free(st); Lex(lx); //Skip color - g.color=color.c0.color; + g.c.color=color.c0.color; if (color&ROPF_DITHER) { - g.dither_color.u8[1]=color.c1.color; + g.d.dither_color.u8[1]=color.c1.color; g.type=SPT_DITHER_COLOR; } else g.type=SPT_COLOR; @@ -237,25 +233,25 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) case SPT_PLANAR_SYMMETRY: Lex(lx); //Skip { g.type=type; - LexD2I32(lx,&g.x1); + LexD2I32(lx,&g.pp.x1); if (lx->token!=',') LexExcept(lx,"expecting ',' at "); Lex(lx); //Skip , - LexD2I32(lx,&g.x2); + LexD2I32(lx,&g.pp.x2); break; case SPT_RECT: case SPT_ROTATED_RECT: Lex(lx); //Skip { - LexD2I32(lx,&g.x1); + LexD2I32(lx,&g.pp.x1); if (lx->token!=':') LexExcept(lx,"expecting ':' at "); Lex(lx); //Skip : - LexD2I32(lx,&g.x2); - g.x2+=g.x1; - g.y2+=g.y1; + LexD2I32(lx,&g.pp.x2); + g.ppa.x2+=g.pp.x1; + g.ppa.y2+=g.pp.y1; if (lx->token==',') { Lex(lx); //Skip , - g.rot_angle=ã/180*LexExpressionF64(lx); + g.ppa.angle=ã/180*LexExpressionF64(lx); g.type=SPT_ROTATED_RECT; } else g.type=SPT_RECT; @@ -264,12 +260,12 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) case SPT_SHIFT: Lex(lx); //Skip { g.type=type; - LexD2I32(lx,&g.x1); + LexD2I32(lx,&g.p.x1); break; case SPT_FLOOD_FILL: case SPT_FLOOD_FILL_NOT: Lex(lx); //Skip { - LexD2I32(lx,&g.x1); + LexD2I32(lx,&g.p.x1); if (lx->token==',') { Lex(lx); //Skip , i=LexExpressionI64(lx); @@ -282,36 +278,35 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) break; case SPT_WIDTH: Lex(lx); //Skip { - g.width=LexExpressionI64(lx); + g.w.width=LexExpressionI64(lx); g.type=SPT_WIDTH; break; case SPT_CIRCLE: Lex(lx); //Skip { g.type=SPT_CIRCLE; - LexD2I32(lx,&g.x1); + LexD2I32(lx,&g.pr.x1); if (lx->token!=':') LexExcept(lx,"expecting ':' at "); Lex(lx); //Skip : - g.x2=LexExpressionI64(lx); + g.pr.radius=LexExpressionI64(lx); break; case SPT_POLYGON: Lex(lx); //Skip { - g.sides=LexExpressionI64(lx); + g.pwhas.sides=LexExpressionI64(lx); if (lx->token!=',') LexExcept(lx,"expecting ',' at "); - Lex(lx); //Skip , case SPT_ELLIPSE: Lex(lx); //Skip { g.type=type; - LexD2I32(lx,&g.x2); + LexD2I32(lx,&g.pwha.x1); if (lx->token!=':') LexExcept(lx,"expecting ':' at "); Lex(lx); //Skip : - LexD2I32(lx,&g.width); + LexD2I32(lx,&g.pwha.width); if (lx->token!=',') LexExcept(lx,"expecting ',' at "); Lex(lx); //Skip , - g.rot_angle=ã/180*LexExpressionF64(lx); + g.pwha.angle=ã/180*LexExpressionF64(lx); break; sub_switch_end: size=SpriteElemSize(&g)+offset(CSprite.start); @@ -323,7 +318,7 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) case SPT_TEXT_DIAMOND: Lex(lx); //Skip { g.type=type; - LexD2I32(lx,&g.x1); + LexD2I32(lx,&g.ps.x1); if (lx->token!=',') LexExcept(lx,"expecting ',' at "); if (Lex(lx)==TK_STR) //Skip , @@ -345,17 +340,16 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) tempp=CAlloc(sizeof(CQueD3I32)); LexD2I32(lx,&tempp->p); QueIns(tempp,rootp.last); - g.num++; + g.nu.num++; if (lx->token==',') Lex(lx); //Skip , } - if (!g.num) + if (g.nu.num<2) LexExcept(lx,"expecting point at "); size=SpriteElemQuedBaseSize(SPT_POLYLINE); - i=g.num*sizeof(CD2I32); - result=MAlloc(size+i); + result=MAlloc(size+g.nu.num*sizeof(CD2I32)); MemCpy(result,&g,size); - ptr=&result->y1; + ptr=&result->nu.u; tempp=rootp.next; while (tempp!=&rootp) { tempa1=tempp->next; @@ -375,15 +369,14 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) tempp=CAlloc(sizeof(CQueD3I32)); LexD3I32(lx,&tempp->p); QueIns(tempp,rootp.last); - g.num++; + g.nu.num++; if (lx->token==',') Lex(lx); //Skip , } - if (!g.num) + if (g.nu.num<2) LexExcept(lx,"expecting point at "); size=SpriteElemQuedBaseSize(type); - i=g.num*sizeof(CD3I32); - result=MAlloc(size+i); + result=MAlloc(size+g.nu.num*sizeof(CD3I32)); if (LexExpressionI64(lx)) { if (type==SPT_BSPLINE2||type==SPT_BSPLINE2_CLOSED) g.type=SPT_BSPLINE2_CLOSED; @@ -396,7 +389,7 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) g.type=SPT_BSPLINE3; } MemCpy(result,&g,size); - ptr=&result->y1; + ptr=&result->nu.u; tempp=rootp.next; while (tempp!=&rootp) { tempa1=tempp->next; @@ -408,7 +401,7 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) break; case SPT_POLYPT: Lex(lx); //Skip { - LexD2I32(lx,&g.y1); + LexD2I32(lx,&g.npu.x); if (lx->token!=',') LexExcept(lx,"expecting ',' at "); tempv=QueVectU8New; @@ -418,27 +411,26 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) if (i=='}') break; if ('0'<=i<='7') - QueVectU8Put(tempv,g.num++,i-'0'); + QueVectU8Put(tempv,g.npu.num++,i-'0'); } Bts(&lx->flags,Lf_USE_LAST_U16); Lex(lx); //Load '}' g.type=SPT_POLYPT; size=SpriteElemQuedBaseSize(SPT_POLYPT); - i=(g.num*3+7)>>3; - result=CAlloc(size+i); + result=CAlloc(size+(g.npu.num*3+7)>>3); MemCpy(result,&g,size); - ptr=&result->y2; - for (i=0;inpu.u; + for (i=0;itoken!=':') LexExcept(lx,"expecting ':' at "); Lex(lx); //Skip : - LexD2I32(lx,&g.width); + LexD2I32(lx,&g.pwhu.width); if (lx->token!=',') LexExcept(lx,"expecting ',' at "); tempv=QueVectU8New; @@ -463,7 +455,7 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) size=SpriteElemQuedBaseSize(SPT_BITMAP); result=CAlloc(size+num1); MemCpy(result,&g,size); - ptr=&result->linespeed; + ptr=&result->pwhu.u; for (i=0;itoken!=',') LexExcept(lx,"expecting ',' at "); Lex(lx); //Skip , - LexD3I32(lx,&g.x1); + LexD3I32(lx,&g.pmu.x); if (lx->token!=':') LexExcept(lx,"expecting ':' at "); Lex(lx); //Skip : @@ -528,12 +520,12 @@ CSprite *Code2SpriteElem(CLex *lx,I64 type) Lex(lx); //Skip , } if (g.type==SPT_MESH) { - g.vertex_cnt=num1; - g.tri_cnt=num2; + g.mu.vertex_cnt=num1; + g.mu.tri_cnt=num2; size=SpriteElemQuedBaseSize(SPT_MESH); } else { - g.shiftable_vertex_cnt=num1; - g.shiftable_tri_cnt=num2; + g.pmu.vertex_cnt=num1; + g.pmu.tri_cnt=num2; } size=SpriteElemQuedBaseSize(g.type); result=MAlloc(size+num1*sizeof(CD3I32)+num2*sizeof(CMeshTri)); diff --git a/Adam/Gr/SpriteEd.CPP b/Adam/Gr/SpriteEd.CPP index f405e46..2266838 100644 --- a/Adam/Gr/SpriteEd.CPP +++ b/Adam/Gr/SpriteEd.CPP @@ -4,8 +4,8 @@ Bool SpritePolyPtPlot(CSprite *root,I64 x,I64 y,I64) { CSprite *tempg=CAlloc(SpriteElemQuedBaseSize(SPT_PT)); tempg->type=SPT_PT; - tempg->x1=x; - tempg->y1=y; + tempg->p.x1=x; + tempg->p.y1=y; QueIns(tempg,root->last); return TRUE; } @@ -16,8 +16,8 @@ CSprite *SpriteElemNum2QueEntry(CSprite *root,I64 elem_num,I64 *_x=NULL,I64 *_y= CSprite *result=root->next; while (result!=root && elem_num--) { if (result->type==SPT_SHIFT) { - xx+=result->x1; - yy+=result->y1; + xx+=result->p.x1; + yy+=result->p.y1; } result=result->next; } @@ -83,75 +83,60 @@ U0 SpriteSetOrigin(CSprite *root,I64 dx,I64 dy,I64 dz) CSprite *tempg=root->next; while (tempg!=root) { switch (tempg->type) { - case SPT_PT: - case SPT_FLOOD_FILL: - case SPT_FLOOD_FILL_NOT: - tempg->x1+=dx; - tempg->y1+=dy; - break; case SPT_ARROW: case SPT_LINE: case SPT_PLANAR_SYMMETRY: - tempg->x1+=dx; - tempg->y1+=dy; - tempg->x2+=dx; - tempg->y2+=dy; - break; - case SPT_BITMAP: - case SPT_ELLIPSE: - case SPT_POLYGON: - tempg->x2+=dx; - tempg->y2+=dy; - break; case SPT_RECT: case SPT_ROTATED_RECT: - tempg->x1+=dx; - tempg->y1+=dy; - tempg->x2+=dx; - tempg->y2+=dy; - break; + tempg->pp.x2+=dx; + tempg->pp.y2+=dy; + case SPT_PT: + case SPT_FLOOD_FILL: + case SPT_FLOOD_FILL_NOT: case SPT_TEXT: case SPT_TEXT_BOX: case SPT_TEXT_DIAMOND: case SPT_CIRCLE: - tempg->x1+=dx; - tempg->y1+=dy; + case SPT_BITMAP: + case SPT_ELLIPSE: + case SPT_POLYGON: + tempg->p.x1+=dx; + tempg->p.y1+=dy; break; case SPT_POLYLINE: - ptr=&tempg->y1; - for (i=0;inum;i++) { + ptr=&tempg->nu.u; + for (i=0;inu.num;i++) { ptr[i<<1]+=dx; ptr[i<<1+1]+=dy; } break; case SPT_POLYPT: - ptr=&tempg->y1; - ptr[0]+=dx; - ptr[1]+=dy; + tempg->npu.x+=dx; + tempg->npu.y+=dy; break; case SPT_BSPLINE2: case SPT_BSPLINE3: case SPT_BSPLINE2_CLOSED: case SPT_BSPLINE3_CLOSED: - p=&tempg->y1; - for (i=0;inum;i++,p++) { + p=&tempg->nu.u; + for (i=0;inu.num;i++,p++) { p->x+=dx; p->y+=dy; p->z+=dz; } break; case SPT_MESH: - p=&tempg->x2; - for (i=0;ivertex_cnt;i++,p++) { + p=&tempg->mu.u; + for (i=0;imu.vertex_cnt;i++,p++) { p->x+=dx; p->y+=dy; p->z+=dz; } break; case SPT_SHIFTABLE_MESH: - tempg->x1+=dx; - tempg->y1+=dy; - tempg->z1+=dz; + tempg->pmu.x+=dx; + tempg->pmu.y+=dy; + tempg->pmu.z+=dz; break; } tempg=tempg->next; @@ -161,14 +146,14 @@ U0 SpriteSetOrigin(CSprite *root,I64 dx,I64 dy,I64 dz) CSprite *SpriteTransformCircle(I64 r[4][4],CSprite *tempg) { I64 x,y,z; - F64 m1,a1,m2,radius=tempg->x2<<16; + F64 m1,a1,m2,radius=tempg->pr.radius<<16; CSprite *tempg1=CAlloc(SpriteElemQuedBaseSize(SPT_ELLIPSE)); tempg1->type=SPT_ELLIPSE; - x=tempg->x1; y=tempg->y1; z=0; + x=tempg->pr.x1; y=tempg->pr.y1; z=0; GrRot(r,&x,&y,&z); - tempg1->x2=x; - tempg1->y2=y; + tempg1->pwha.x1=x; + tempg1->pwha.y1=y; x=radius; y=0; z=0; GrRot(r,&x,&y,&z); @@ -178,9 +163,9 @@ CSprite *SpriteTransformCircle(I64 r[4][4],CSprite *tempg) GrRot(r,&x,&y,&z); m2=Sqrt(x*x+y*y); - tempg1->width =ToI64(m1)/0x10000; - tempg1->height=ToI64(m2)/0x10000; - tempg1->rot_angle=-a1; + tempg1->pwha.width =ToI64(m1)/0x10000; + tempg1->pwha.height=ToI64(m2)/0x10000; + tempg1->pwha.angle=-a1; return tempg1; } @@ -188,19 +173,20 @@ CSprite *SpriteTransformCircle(I64 r[4][4],CSprite *tempg) CSprite *SpriteTransformEllipse(I64 r[4][4],CSprite *tempg) { I64 x,y,z; - F64 m1,a1,m2,a2,s,c,x_radius=tempg->width<<16,y_radius=tempg->height<<16; + F64 m1,a1,m2,a2,s,c,x_radius=tempg->pwha.width<<16, + y_radius=tempg->pwha.height<<16; CSprite *tempg1=CAlloc(SpriteElemQuedBaseSize(tempg->type)); tempg1->type=tempg->type; if (tempg->type==SPT_POLYGON) - tempg1->sides=tempg->sides; + tempg1->pwhas.sides=tempg->pwhas.sides; - x=tempg->x2; y=tempg->y2; z=0; + x=tempg->pwha.x1; y=tempg->pwha.y1; z=0; GrRot(r,&x,&y,&z); - tempg1->x2=x; - tempg1->y2=y; + tempg1->pwha.x1=x; + tempg1->pwha.y1=y; - c=Cos(-tempg->rot_angle); - s=Sin(-tempg->rot_angle); + c=Cos(-tempg->pwha.angle); + s=Sin(-tempg->pwha.angle); x=x_radius*c; y=x_radius*s; @@ -215,11 +201,11 @@ CSprite *SpriteTransformEllipse(I64 r[4][4],CSprite *tempg) R2P(&m2,&a2,x,y); m2*=Abs(Sin(a2-a1)); - tempg1->width=ToI64(m1)/0x10000; - if (tempg1->width<1) tempg1->width=1; - tempg1->height=ToI64(m2)/0x10000; - if (tempg1->height<1) tempg1->height=1; - tempg1->rot_angle=-a1; + tempg1->pwha.width=ToI64(m1)/0x10000; + if (tempg1->pwha.width<1) tempg1->pwha.width=1; + tempg1->pwha.height=ToI64(m2)/0x10000; + if (tempg1->pwha.height<1) tempg1->pwha.height=1; + tempg1->pwha.angle=-a1; return tempg1; } @@ -228,15 +214,15 @@ CSprite *SpriteTransformRect(I64 r[4][4],CSprite *tempg,F64 { I64 x,y,z,w,h; F64 m1,a1,m2,a2,s,c, - x_radius=(tempg->x2-tempg->x1)<<16, - y_radius=(tempg->y2-tempg->y1)<<16; + x_radius=(tempg->pp.x2-tempg->pp.x1)<<16, + y_radius=(tempg->pp.y2-tempg->pp.y1)<<16; CSprite *tempg1=CAlloc(SpriteElemQuedBaseSize(SPT_ROTATED_RECT)); tempg1->type=SPT_ROTATED_RECT; - x=tempg->x1; y=tempg->y1; z=0; + x=tempg->pp.x1; y=tempg->pp.y1; z=0; GrRot(r,&x,&y,&z); - tempg1->x1=x; - tempg1->y1=y; + tempg1->ppa.x1=x; + tempg1->ppa.y1=y; c=Cos(-é); s=Sin(-é); @@ -258,9 +244,9 @@ CSprite *SpriteTransformRect(I64 r[4][4],CSprite *tempg,F64 if (w<1) w=1; h=ToI64(m2)/0x10000; if (h<1) h=1; - tempg1->x2=tempg1->x1+w; - tempg1->y2=tempg1->y1+h; - tempg1->rot_angle=-a1; + tempg1->ppa.x2=tempg1->ppa.x1+w; + tempg1->ppa.y2=tempg1->ppa.y1+h; + tempg1->ppa.angle=-a1; return tempg1; } @@ -278,7 +264,7 @@ CSprite *SpriteTransformBitmap(I64 r[4][4],CSprite *tempg) miny=maxy=y; minz=maxz=z; - x=0; y=tempg->height; z=0; + x=0; y=tempg->pwhu.height; z=0; GrRot(r,&x,&y,&z); if (xmaxx) maxx=x; @@ -287,7 +273,7 @@ CSprite *SpriteTransformBitmap(I64 r[4][4],CSprite *tempg) if (zmaxx) maxz=z; - x=tempg->width; y=0; z=0; + x=tempg->pwhu.width; y=0; z=0; GrRot(r,&x,&y,&z); if (xmaxx) maxx=x; @@ -296,7 +282,7 @@ CSprite *SpriteTransformBitmap(I64 r[4][4],CSprite *tempg) if (zmaxx) maxz=z; - x=tempg->width; y=tempg->height; z=0; + x=tempg->pwhu.width; y=tempg->pwhu.height; z=0; GrRot(r,&x,&y,&z); if (xmaxx) maxx=x; @@ -308,11 +294,10 @@ CSprite *SpriteTransformBitmap(I64 r[4][4],CSprite *tempg) tempb=DCNew(maxx-minx+1,maxy-miny+1); img=CAlloc(sizeof(CDC)); - img->width=tempg->width; - img->width_internal=(tempg->width+7)&~7; - img->height=tempg->height; - img->body_size=img->width_internal*img->height; - img->body=tempg(U8 *)+offset(CSprite.linespeed); + img->width=tempg->pwhu.width; + img->width_internal=(tempg->pwhu.width+7)&~7; + img->height=tempg->pwhu.height; + img->body=&tempg->pwhu.u; img->dc_signature=DCS_SIGNATURE_VAL; tempb->color=TRANSPARENT; @@ -335,15 +320,15 @@ CSprite *SpriteTransformBitmap(I64 r[4][4],CSprite *tempg) MemCpy(tempg1(U8 *)+offset(CSprite.start),elems,MSize(elems)); tempg1->type=tempg->type; - x=tempg->x2; y=tempg->y2; z=0; + x=tempg->pwhu.x1; y=tempg->pwhu.y1; z=0; GrRot(r,&x,&y,&z); - tempg1->x2=x; - tempg1->y2=y; + tempg1->pwhu.x1=x; + tempg1->pwhu.y1=y; x=0; y=0; z=0; GrRot(r,&x,&y,&z); - tempg1->x2+=minx-x; - tempg1->y2+=miny-y; + tempg1->pwhu.x1+=minx-x; + tempg1->pwhu.y1+=miny-y; return tempg1; } @@ -358,32 +343,26 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) while (tempg!=root) { switch (tempg->type) { case SPT_WIDTH: - // (1.0/Sqrt(3))*65536=37837.22 - x=37838;y=37838;z=37838; - GrRot(r,&x,&y,&z); - //scaled 32 bits - tempg->width*=Sqrt(x*x+y*y+z*z)/65536; - if (tempg->width<0) tempg->width=0; - break; - case SPT_PT: - case SPT_FLOOD_FILL: - case SPT_FLOOD_FILL_NOT: - x=tempg->x1; y=tempg->y1; z=0; - GrRot(r,&x,&y,&z); - tempg->x1=x; - tempg->y1=y; + tempg->w.width*=Sqrt(GrRotNormSqr65536(r))/65536; + if (tempg->w.width<0) tempg->w.width=0; break; case SPT_PLANAR_SYMMETRY: case SPT_ARROW: case SPT_LINE: - x=tempg->x1; y=tempg->y1; z=0; + x=tempg->pp.x2; y=tempg->pp.y2; z=0; GrRot(r,&x,&y,&z); - tempg->x1=x; - tempg->y1=y; - x=tempg->x2; y=tempg->y2; z=0; + tempg->pp.x2=x; + tempg->pp.y2=y; + case SPT_PT: + case SPT_FLOOD_FILL: + case SPT_FLOOD_FILL_NOT: + case SPT_TEXT: + case SPT_TEXT_BOX: + case SPT_TEXT_DIAMOND: + x=tempg->p.x1; y=tempg->p.y1; z=0; GrRot(r,&x,&y,&z); - tempg->x2=x; - tempg->y2=y; + tempg->p.x1=x; + tempg->p.y1=y; break; case SPT_BITMAP: tempg1=SpriteTransformBitmap(r,tempg); @@ -393,7 +372,7 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) tempg=tempg1; break; case SPT_ROTATED_RECT: - tempg1=SpriteTransformRect(r,tempg,tempg->rot_angle); + tempg1=SpriteTransformRect(r,tempg,tempg->ppa.angle); QueIns(tempg1,tempg); QueRem(tempg); Free(tempg); @@ -406,14 +385,6 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) Free(tempg); tempg=tempg1; break; - case SPT_TEXT: - case SPT_TEXT_BOX: - case SPT_TEXT_DIAMOND: - x=tempg->x1; y=tempg->y1; z=0; - GrRot(r,&x,&y,&z); - tempg->x1=x; - tempg->y1=y; - break; case SPT_CIRCLE: tempg1=SpriteTransformCircle(r,tempg); QueIns(tempg1,tempg); @@ -430,8 +401,8 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) tempg=tempg1; break; case SPT_POLYLINE: - ptr=&tempg->y1; - for (i=0;inum;i++) { + ptr=&tempg->nu.u; + for (i=0;inu.num;i++) { x=ptr[i<<1]; y=ptr[i<<1+1]; z=0; GrRot(r,&x,&y,&z); ptr[i<<1]=x; @@ -440,12 +411,11 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) break; case SPT_POLYPT: QueInit(&root2); - ptr=&tempg->y1; - x=ptr[0]; y=ptr[1]; z=0; + x=tempg->npu.x; y=tempg->npu.y; z=0; x1=x; y1=y; z1=z; //unrotated cur coordinates GrRot(r,&x,&y,&z); - ptr+=2; - k=tempg->num*3; + ptr=&tempg->npu.u; + k=tempg->npu.num*3; x2=x; y2=y; z2=z; //rotated start coordinates x3=x; y3=y; z3=z; //lag 1 rotated coordinates for (i=0;inext; - if (tempg1->x1==x3 && tempg1->y1==y3) { + if (tempg1->p.x1==x3 && tempg1->p.y1==y3) { QueRem(tempg1); Free(tempg1); } else { num++; - x3=tempg1->x1; - y3=tempg1->y1; + x3=tempg1->p.x1; + y3=tempg1->p.y1; } tempg1=tempg2; } tempg3=CAlloc(SpriteElemQuedBaseSize(SPT_POLYPT)+(num*3+7)>>3); - ptr=&tempg3->y1; - ptr[0]=x2; - ptr[1]=y2; - ptr+=2; + tempg3->npu.x=x2; + tempg3->npu.y=y2; + ptr=&tempg3->npu.u; x3=0;y3=0; z3=0; i=0; tempg1=root2.next; while (tempg1!=&root2) { tempg2=tempg1->next; BFieldOrU32(ptr,i, - polypt_map[SignI64(tempg1->x1-x3)+1+ - 3*(SignI64(tempg1->y1-y3)+1)]); + polypt_map[SignI64(tempg1->p.x1-x3)+1+ + 3*(SignI64(tempg1->p.y1-y3)+1)]); i+=3; - x3=tempg1->x1;y3=tempg1->y1; + x3=tempg1->p.x1;y3=tempg1->p.y1; QueRem(tempg1); Free(tempg1); tempg1=tempg2; } tempg3->type=SPT_POLYPT; - tempg3->num=num; + tempg3->npu.num=num; QueIns(tempg3,tempg); QueRem(tempg); Free(tempg); @@ -504,8 +473,8 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) case SPT_BSPLINE3: case SPT_BSPLINE2_CLOSED: case SPT_BSPLINE3_CLOSED: - p=&tempg->y1; - for (i=0;inum;i++,p++) { + p=&tempg->nu.u; + for (i=0;inu.num;i++,p++) { x=p->x; y=p->y; z=p->z; GrRot(r,&x,&y,&z); p->x=x; @@ -514,13 +483,13 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) } break; case SPT_SHIFTABLE_MESH: - x=tempg->x1; y=tempg->y1; z=tempg->z1; + x=tempg->pmu.x; y=tempg->pmu.y; z=tempg->pmu.z; GrRot(r,&x,&y,&z); - tempg->x1=x; - tempg->y1=y; - tempg->z1=z; - p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32); - for (i=0;ishiftable_vertex_cnt;i++,p++) { + tempg->pmu.x=x; + tempg->pmu.y=y; + tempg->pmu.z=z; + p=&tempg->pmu.u; + for (i=0;ipmu.vertex_cnt;i++,p++) { x=p->x; y=p->y; z=p->z; GrRot(r,&x,&y,&z); p->x=x; @@ -529,8 +498,8 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) } break; case SPT_MESH: - p=&tempg->x2; - for (i=0;ivertex_cnt;i++,p++) { + p=&tempg->mu.u; + for (i=0;imu.vertex_cnt;i++,p++) { x=p->x; y=p->y; z=p->z; GrRot(r,&x,&y,&z); p->x=x; @@ -614,9 +583,9 @@ U0 SpriteSideBarTask2(CTask *grand_parent) pu_task=grand_parent->popup_task; if (TaskValidate(pu_task)) { w=parent->win_right-parent->win_left; - SetWinHorz(pu_task->win_right+2,pu_task->win_right+2+w,parent); + WinHorz(pu_task->win_right+2,pu_task->win_right+2+w,parent); h=parent->win_bottom-parent->win_top; - SetWinVert(pu_task->win_top,pu_task->win_top+h,parent); + WinVert(pu_task->win_top,pu_task->win_top+h,parent); } WinMgrSync; } @@ -651,7 +620,7 @@ Bool SpriteEdText(CSprite **_root,I64 *_cur_elem_num) Sprite2Code(doc,elems); Free(elems); while (TRUE) { - if (result=SrvUser("DocDo(0x%X,0x%X);",doc,0)) { + if (result=PopUpPrint("DocDo(0x%X,0x%X);",doc,0)) { Fs->put_doc=doc2=DocNew; "$$WW,1$$"; if (elems=Code2Sprite(doc)) { @@ -664,7 +633,7 @@ Bool SpriteEdText(CSprite **_root,I64 *_cur_elem_num) *_cur_elem_num=QueCnt(root); //TODO: Might want to improve this. break; } else { - SrvUser("DocDo(0x%X,0x%X);",doc2,0); + PopUpPrint("DocDo(0x%X,0x%X);",doc2,0); DocDel(doc2); Fs->put_doc=old_put; } @@ -730,24 +699,24 @@ I64 PopUpSpriteEd(CSprite **_root,I64 *_cur_elem_num) return i; } -#define GSPT_SIMPLE_PT 0 +#define GSPT_SIMPLE_PT 0 #define GSPT_WIDTH_HEIGHT 1 #define GSPF_SELECTED 1 -class CSpritePt +class CEdSprite { - CSpritePt *next,*last; + CEdSprite *next,*last; I32 type,num,flags,xx,yy,zz; I32 *x,*y,*z,*w,*h; }; -U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) +U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CEdSprite *root) { I64 i,num=0; I32 *ptr; CD3I32 *p; - CSpritePt *temppe; + CEdSprite *temppe; CSprite *tempg=elems-offset(CSprite.start); QueInit(root); while (tempg->type) { @@ -757,60 +726,52 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) case SPT_LINE: case SPT_ARROW: case SPT_PLANAR_SYMMETRY: - temppe=CAlloc(sizeof(CSpritePt)); + temppe=CAlloc(sizeof(CEdSprite)); temppe->type=GSPT_SIMPLE_PT; temppe->xx=x; temppe->yy=y; - temppe->x=&tempg->x2; - temppe->y=&tempg->y2; + temppe->x=&tempg->pp.x2; + temppe->y=&tempg->pp.y2; temppe->num=num; QueIns(temppe,root->last); case SPT_TEXT: case SPT_TEXT_BOX: case SPT_TEXT_DIAMOND: case SPT_PT: + case SPT_BITMAP: case SPT_FLOOD_FILL: case SPT_FLOOD_FILL_NOT: case SPT_CIRCLE: - temppe=CAlloc(sizeof(CSpritePt)); + temppe=CAlloc(sizeof(CEdSprite)); temppe->type=GSPT_SIMPLE_PT; temppe->xx=x; temppe->yy=y; - temppe->x=&tempg->x1; - temppe->y=&tempg->y1; + temppe->x=&tempg->p.x1; + temppe->y=&tempg->p.y1; temppe->num=num; QueIns(temppe,root->last); break; case SPT_SHIFT: - x+=tempg->x1; - y+=tempg->y1; + x+=tempg->p.x1; + y+=tempg->p.y1; break; case SPT_ELLIPSE: case SPT_POLYGON: - temppe=CAlloc(sizeof(CSpritePt)); + temppe=CAlloc(sizeof(CEdSprite)); temppe->type=GSPT_WIDTH_HEIGHT; temppe->xx=x; temppe->yy=y; - temppe->x=&tempg->x2; - temppe->y=&tempg->y2; - temppe->w=&tempg->width; - temppe->h=&tempg->height; - temppe->num=num; - QueIns(temppe,root->last); - case SPT_BITMAP: - temppe=CAlloc(sizeof(CSpritePt)); - temppe->type=GSPT_SIMPLE_PT; - temppe->xx=x; - temppe->yy=y; - temppe->x=&tempg->x2; - temppe->y=&tempg->y2; + temppe->x=&tempg->pwha.x1; + temppe->y=&tempg->pwha.y1; + temppe->w=&tempg->pwha.width; + temppe->h=&tempg->pwha.height; temppe->num=num; QueIns(temppe,root->last); break; case SPT_POLYLINE: - ptr=&tempg->y1; - for (i=0;inum;i++) { - temppe=CAlloc(sizeof(CSpritePt)); + ptr=&tempg->nu.u; + for (i=0;inu.num;i++) { + temppe=CAlloc(sizeof(CEdSprite)); temppe->type=GSPT_SIMPLE_PT; temppe->xx=x; temppe->yy=y; @@ -821,13 +782,12 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) } break; case SPT_POLYPT: - ptr=&tempg->y1; - temppe=CAlloc(sizeof(CSpritePt)); + temppe=CAlloc(sizeof(CEdSprite)); temppe->type=GSPT_SIMPLE_PT; temppe->xx=x; temppe->yy=y; - temppe->x=&ptr[0]; - temppe->y=&ptr[1]; + temppe->x=&tempg->npu.x; + temppe->y=&tempg->npu.y; temppe->num=num; QueIns(temppe,root->last); break; @@ -835,9 +795,9 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) case SPT_BSPLINE3: case SPT_BSPLINE2_CLOSED: case SPT_BSPLINE3_CLOSED: - p=&tempg->y1; - for (i=0;inum;i++) { - temppe=CAlloc(sizeof(CSpritePt)); + p=&tempg->nu.u; + for (i=0;inu.num;i++) { + temppe=CAlloc(sizeof(CEdSprite)); temppe->type=GSPT_SIMPLE_PT; temppe->xx=x; temppe->yy=y; @@ -851,13 +811,13 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) case SPT_MESH: break; case SPT_SHIFTABLE_MESH: - temppe=CAlloc(sizeof(CSpritePt)); + temppe=CAlloc(sizeof(CEdSprite)); temppe->type=GSPT_SIMPLE_PT; temppe->xx=x; temppe->yy=y; - temppe->x=&tempg->x1; - temppe->y=&tempg->y1; - temppe->z=&tempg->z1; + temppe->x=&tempg->pmu.x; + temppe->y=&tempg->pmu.y; + temppe->z=&tempg->pmu.z; temppe->num=num; QueIns(temppe,root->last); break; @@ -867,10 +827,10 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) } } -U0 SpriteCtrlPtsDraw(CDC *dc,CSpritePt *root) +U0 SpriteCtrlPtsDraw(CDC *dc,CEdSprite *root) { I64 x,y; - CSpritePt *temppe; + CEdSprite *temppe; WinMgrSync; DCFill(dc); if (Blink(20)) { @@ -898,9 +858,9 @@ U0 SpriteCtrlPtsDraw(CDC *dc,CSpritePt *root) } } -U0 SpriteCtrlPtsMove(CSpritePt *root,I64 dx,I64 dy) +U0 SpriteCtrlPtsMove(CEdSprite *root,I64 dx,I64 dy) { - CSpritePt *temppe; + CEdSprite *temppe; temppe=root->next; while (temppe!=root) { if (temppe->flags&GSPF_SELECTED) @@ -923,7 +883,7 @@ Bool SpriteShiftPts(U8 *elems,I64 x,I64 y,I64 *_cur_elem_num,I64 mode) I64 msg_code,a1,a2,xx,yy,xx2,yy2,dd,best_dd,cur_elem_num; Bool old_preempt,result=TRUE; CDC *dc=DCAlias; - CSpritePt root,*temppe,*best_pe; + CEdSprite root,*temppe,*best_pe; SpritePtQueNew(elems,x,y,&root); cur_elem_num=0; @@ -1140,16 +1100,16 @@ I64 SpriteEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y,CSprite **_root,I64 *_cur_el insert_pt=SpriteElemNum2QueEntry(*_root,*_cur_elem_num); tempg=MAlloc(SpriteElemQuedBaseSize(SPT_SHIFT)); tempg->type=SPT_SHIFT; - tempg->x1=0; - tempg->y1=0; + tempg->p.x1=0; + tempg->p.y1=0; QueIns(tempg,insert_pt->last); GetMsg(&a1,&a2,1<x1=a1-xx; - tempg->y1=a2-yy; + tempg->p.x1=a1-xx; + tempg->p.y1=a2-yy; SpriteEdUpdate(doc,tempb,*_root); } while (msg_code!=MSG_IP_L_UP); *_cur_elem_num+=1; diff --git a/Adam/Gr/SpriteMain.CPP b/Adam/Gr/SpriteMain.CPP index 2e4e173..82f64ee 100644 --- a/Adam/Gr/SpriteMain.CPP +++ b/Adam/Gr/SpriteMain.CPP @@ -46,8 +46,8 @@ I64 PopUpSpriteMain(CSprite **_root,I64 *_cur_elem_num) "\n" "$$PURPLE$$$$MU-UL,\"+] Sprite Edit Menu\",LE=SPT_ED_MENU$$$$LTBLUE$$\n" "$$MU-UL,\"Exit Sprite\",LE=SPT_EXIT$$\n" - "$$MU-UL,\"Abort Sprite\",LE=DOCM_CANCEL$$\n"); - DocPrint(doc,"\nRight-Click to get back to this menu."); + "$$MU-UL,\"Abort Sprite\",LE=DOCM_CANCEL$$\n" + "\nRight-Click to get back to this menu."); st=MStrPrint("SpriteSideBarTask(0x%X,0x%X,0x%X);",Fs,_root,_cur_elem_num); PopUp(st,NULL,&pu_task); Free(st); @@ -97,18 +97,18 @@ U0 SpriteSetSettings(CDC *dc,CSprite *root,I64 cur_elem_num,CColorROPU32 *_color while (cur_elem_num>0 && tempg!=root) { switch (tempg->type) { case SPT_COLOR: - dc->color=*_color=tempg->color; + dc->color=*_color=tempg->c.color; break; case SPT_DITHER_COLOR: dc->color=*_color= - tempg->dither_color.u8[0]| - tempg->dither_color.u8[1]<d.dither_color.u8[0]| + tempg->d.dither_color.u8[1]<pen_width=*_width=tempg->width; + dc->pen_width=*_width=tempg->w.width; break; case SPT_PLANAR_SYMMETRY: - if (GrSetSymmetry3(dc,tempg->x1+x,tempg->y1+y,0,tempg->x2+x,tempg->y2+y,0,tempg->x2+x,tempg->y2+y,1)) + if (GrSetSymmetry3(dc,tempg->pp.x1+x,tempg->pp.y1+y,0,tempg->pp.x2+x,tempg->pp.y2+y,0,tempg->pp.x2+x,tempg->pp.y2+y,1)) dc->flags|=DCF_SYMMETRY; else dc->flags&=~DCF_SYMMETRY; @@ -166,7 +166,7 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) U8 *st,*old_task_title=StrNew(Fs->task_title); SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ - WordStat; + AutoComplete; WinMgrSync(2,TRUE); dc2->flags|=DCF_ON_TOP; root=Sprite2SpriteQue(tempb->data); @@ -229,7 +229,7 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) color=i; tempg=MAlloc(SpriteElemQuedBaseSize(SPT_COLOR)); tempg->type=SPT_COLOR; - tempg->color=color; + tempg->c.color=color; QueIns(tempg,insert_pt->last); SpriteEdUpdate(doc,tempb,root); cur_elem_num++; @@ -244,7 +244,7 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) color=i; tempg=MAlloc(SpriteElemQuedBaseSize(SPT_DITHER_COLOR)); tempg->type=SPT_DITHER_COLOR; - tempg->dither_color=color.c0.color|color.c1.color<<8; + tempg->d.dither_color=color.c0.color|color.c1.color<<8; QueIns(tempg,insert_pt->last); SpriteEdUpdate(doc,tempb,root); cur_elem_num++; @@ -270,24 +270,24 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) tempg1=insert_pt; if (tempg1!=root && tempg1->type==SPT_MESH) - old_mesh=&tempg1->vertex_cnt; + old_mesh=&tempg1->mu.vertex_cnt; else if (tempg1!=root && tempg1->type==SPT_SHIFTABLE_MESH) { - x1=tempg1->x1; - y1=tempg1->y1; - z1=tempg1->z1; - p=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); - for (i=0;ishiftable_vertex_cnt;i++,p++) { + x1=tempg1->pmu.x; + y1=tempg1->pmu.y; + z1=tempg1->pmu.z; + p=&tempg1->pmu.u; + for (i=0;ipmu.vertex_cnt;i++,p++) { p->x+=x1; p->y+=y1; p->z+=z1; } - old_mesh=&tempg1->shiftable_vertex_cnt; + old_mesh=&tempg1->pmu.vertex_cnt; } else old_mesh=NULL; if (mesh=SpriteMeshEd(old_mesh,&size,TRUE)) { tempg=MAlloc(SpriteElemQuedBaseSize(SPT_MESH)-sizeof(I32)*2+size); tempg->type=SPT_MESH; - MemCpy(&tempg->vertex_cnt,mesh,size); + MemCpy(&tempg->mu.vertex_cnt,mesh,size); Free(mesh); QueIns(tempg,insert_pt->last); SpriteEdUpdate(doc,tempb,root); @@ -299,11 +299,11 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) } else cur_elem_num++; } else if (old_mesh && tempg1->type==SPT_SHIFTABLE_MESH) { - x1=tempg1->x1; - y1=tempg1->y1; - z1=tempg1->z1; - p=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); - for (i=0;ishiftable_vertex_cnt;i++,p++) { + x1=tempg1->pmu.x; + y1=tempg1->pmu.y; + z1=tempg1->pmu.z; + p=&tempg1->pmu.u; + for (i=0;ipmu.vertex_cnt;i++,p++) { p->x-=x1; p->y-=y1; p->z-=z1; @@ -328,7 +328,7 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) "bitmap.\n"); doc_e->de_flags=old_de_flags; Fs->win_inhibit=WIG_TASK_DFT|WIF_FOCUS_TASK_IP_L|WIF_FOCUS_TASK_IP_R| - WIF_FOCUS_TASK_BORDER-WIF_SELF_FOCUS-WIF_SELF_GRAB_SCROLL; + WIF_FOCUS_TASK_BORDER-WIF_SELF_FOCUS-WIF_SELF_GRAB_SCROLL; break; case SPT_BITMAP: doc_e->de_flags|=DOCEF_DONT_DRAW; @@ -363,7 +363,7 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) } doc_e->de_flags=old_de_flags; Fs->win_inhibit=WIG_TASK_DFT|WIF_FOCUS_TASK_IP_L|WIF_FOCUS_TASK_IP_R| - WIF_FOCUS_TASK_BORDER-WIF_SELF_FOCUS-WIF_SELF_GRAB_SCROLL; + WIF_FOCUS_TASK_BORDER-WIF_SELF_FOCUS-WIF_SELF_GRAB_SCROLL; break; case SPT_WIDTH: doc_e->de_flags|=DOCEF_DONT_DRAW; @@ -372,7 +372,7 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) width=i; tempg=MAlloc(SpriteElemQuedBaseSize(SPT_WIDTH)); tempg->type=SPT_WIDTH; - tempg->width=width; + tempg->w.width=width; QueIns(tempg,insert_pt->last); SpriteEdUpdate(doc,tempb,root); cur_elem_num++; @@ -415,9 +415,9 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) } while (msg_code!=MSG_IP_L_UP); tempg=CAlloc(SpriteElemQuedBaseSize(SPT_TEXT)+StrLen(st)+1); tempg->type=SPT_TEXT; - tempg->x1=x1-x; - tempg->y1=y1-y; - StrCpy(tempg->st,st); + tempg->ps.x1=x1-x; + tempg->ps.y1=y1-y; + StrCpy(tempg->ps.st,st); QueIns(tempg,insert_pt->last); SpriteEdUpdate(doc,tempb,root); cur_elem_num++; @@ -441,9 +441,9 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) } while (msg_code!=MSG_IP_L_UP); tempg=CAlloc(SpriteElemQuedBaseSize(SPT_TEXT_BOX)+StrLen(st)+1); tempg->type=SPT_TEXT_BOX; - tempg->x1=x1-x; - tempg->y1=y1-y; - StrCpy(tempg->st,st); + tempg->ps.x1=x1-x; + tempg->ps.y1=y1-y; + StrCpy(tempg->ps.st,st); QueIns(tempg,insert_pt->last); SpriteEdUpdate(doc,tempb,root); cur_elem_num++; @@ -467,9 +467,9 @@ I64 SpriteMainEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) } while (msg_code!=MSG_IP_L_UP); tempg=CAlloc(SpriteElemQuedBaseSize(SPT_TEXT_DIAMOND)+StrLen(st)+1); tempg->type=SPT_TEXT_DIAMOND; - tempg->x1=x1-x; - tempg->y1=y1-y; - StrCpy(tempg->st,st); + tempg->ps.x1=x1-x; + tempg->ps.y1=y1-y; + StrCpy(tempg->ps.st,st); QueIns(tempg,insert_pt->last); SpriteEdUpdate(doc,tempb,root); cur_elem_num++; @@ -502,14 +502,34 @@ ei_restart: eletype=SPT_MENU; } if (msg_code==MSG_KEY_DOWN) { - if (a1==CH_ESC) { - result=GE_EXIT; - goto ei_done; - } else if (a1==CH_SHIFT_ESC) { - result=GE_ABORT; - goto ei_done; - } else - goto ei_restart; + switch (a1) { + case CH_ESC: + result=GE_EXIT; + goto ei_done; + case CH_SHIFT_ESC: + result=GE_ABORT; + goto ei_done; + case 'c': //eye-dropper + dc3=DCCaptureScreen(FALSE); + color=GrPeek(dc3,ip.pos.x,ip.pos.y)^15;//Mouse cursor is XORed. + DCDel(dc3); + tempg=MAlloc(SpriteElemQuedBaseSize(SPT_COLOR)); + tempg->type=SPT_COLOR; + tempg->c.color=color; + QueIns(tempg,insert_pt->last); + SpriteEdUpdate(doc,tempb,root); + cur_elem_num++; + break; + case 't': //Set to transparent color + tempg=MAlloc(SpriteElemQuedBaseSize(SPT_COLOR)); + tempg->type=SPT_COLOR; + tempg->c.color=TRANSPARENT; + QueIns(tempg,insert_pt->last); + SpriteEdUpdate(doc,tempb,root); + cur_elem_num++; + break; + } + goto ei_restart; } else { x1=a1; y1=a2; x2=a1; y2=a2; @@ -564,10 +584,10 @@ ei_restart: tempg->type=SPT_PLANAR_SYMMETRY; break; sub_switch_end: - tempg->x1=x1-x; - tempg->y1=y1-y; - tempg->x2=x2-x; - tempg->y2=y2-y; + tempg->pp.x1=x1-x; + tempg->pp.y1=y1-y; + tempg->pp.x2=x2-x; + tempg->pp.y2=y2-y; break; case SPT_RECT: xx1=a1; yy1=a2; @@ -594,10 +614,10 @@ ei_restart: GrRect3(dc,xx1,yy1,0,xx2-xx1,yy2-yy1); tempg=MAlloc(SpriteElemQuedBaseSize(SPT_RECT)); tempg->type=SPT_RECT; - tempg->x1=xx1-x; - tempg->y1=yy1-y; - tempg->x2=xx2-x; - tempg->y2=yy2-y; + tempg->pp.x1=xx1-x; + tempg->pp.y1=yy1-y; + tempg->pp.x2=xx2-x; + tempg->pp.y2=yy2-y; break; case SPT_INS_SCREEN_BITMAP: case SPT_INS_TRANSPARENT_SCREEN_BITMAP: @@ -628,10 +648,10 @@ ei_restart: tempg=CAlloc(SpriteElemQuedBaseSize(SPT_BITMAP)+ ((xx2-xx1+7)&~7)*(yy2-yy1)); tempg->type=SPT_BITMAP; - tempg->width=xx2-xx1; - tempg->height=yy2-yy1; - tempg->x2=0; - tempg->y2=0; + tempg->pwhu.width=xx2-xx1; + tempg->pwhu.height=yy2-yy1; + tempg->pwhu.x1=0; + tempg->pwhu.y1=0; SpriteScreenInit(dc,x,y); i=gr.screen_zoom; GrScaleZoom(1.0/i); @@ -644,7 +664,7 @@ ei_restart: if (eletype==SPT_INS_TRANSPARENT_SCREEN_BITMAP) DCColorChg(img,bm_bkcolor); GrScaleZoom(i); - MemCpy(tempg(U8 *)+offset(CSprite.linespeed),img->body,((xx2-xx1+7)&~7)*(yy2-yy1)); + MemCpy(&tempg->pwhu.u,img->body,((xx2-xx1+7)&~7)*(yy2-yy1)); DCDel(img); DCDel(dc3); dc2->pen_width=old_width; @@ -664,9 +684,9 @@ ei_restart: GrCircle3(dc,x1,y1,0,Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2))); tempg=MAlloc(SpriteElemQuedBaseSize(SPT_CIRCLE)); tempg->type=SPT_CIRCLE; - tempg->x1=x1-x; - tempg->y1=y1-y; - tempg->x2=Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2)); + tempg->pr.x1=x1-x; + tempg->pr.y1=y1-y; + tempg->pr.radius=Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2)); break; case SPT_ELLIPSE: do { @@ -680,37 +700,37 @@ ei_restart: } while (msg_code!=MSG_IP_L_UP); tempg=MAlloc(SpriteElemQuedBaseSize(SPT_ELLIPSE)); tempg->type=SPT_ELLIPSE; - tempg->x2=(x1+x2)>>1-x; - tempg->y2=(y1+y2)>>1-y; - tempg->width =AbsI64(x1-x2)>>1; - tempg->height=AbsI64(y1-y2)>>1; - angle2=Arg(x2-(tempg->x2+x),y2-(tempg->y2+y)); - if (tempg->widthheight) + tempg->pwha.x1=(x1+x2)>>1-x; + tempg->pwha.y1=(y1+y2)>>1-y; + tempg->pwha.width =AbsI64(x1-x2)>>1; + tempg->pwha.height=AbsI64(y1-y2)>>1; + angle2=Arg(x2-(tempg->pwha.x1+x),y2-(tempg->pwha.y1+y)); + if (tempg->pwha.widthpwha.height) angle2-=ã/2.0; do { - angle1=Arg(x2-(tempg->x2+x),y2-(tempg->y2+y)); - if (tempg->width>=tempg->height) - tempg->rot_angle=-(angle1-angle2); + angle1=Arg(x2-(tempg->pwha.x1+x),y2-(tempg->pwha.y1+y)); + if (tempg->pwha.width>=tempg->pwha.height) + tempg->pwha.angle=-(angle1-angle2); else - tempg->rot_angle=-(angle1-angle2)+ã/2.0; + tempg->pwha.angle=-(angle1-angle2)+ã/2.0; dc->color=color&COLORROP_NO_ROP0_MASK; - GrEllipse3(dc,tempg->x2+x,tempg->y2+y,0, - tempg->width,tempg->height,tempg->rot_angle); + GrEllipse3(dc,tempg->pwha.x1+x,tempg->pwha.y1+y,0, + tempg->pwha.width,tempg->pwha.height,tempg->pwha.angle); msg_code=GetMsg(&a1,&a2, 1<x2+x),y2-(tempg->y2+y)); - if (tempg->width>=tempg->height) - tempg->rot_angle=-(angle1-angle2); + angle1=Arg(x2-(tempg->pwha.x1+x),y2-(tempg->pwha.y1+y)); + if (tempg->pwha.width>=tempg->pwha.height) + tempg->pwha.angle=-(angle1-angle2); else - tempg->rot_angle=-(angle1-angle2)+ã/2.0; + tempg->pwha.angle=-(angle1-angle2)+ã/2.0; dc->color=color&COLORROP_NO_ROP0_MASK; - GrEllipse3(dc,tempg->x2+x,tempg->y2+y,0, - tempg->width,tempg->height,tempg->rot_angle); + GrEllipse3(dc,tempg->pwha.x1+x,tempg->pwha.y1+y,0, + tempg->pwha.width,tempg->pwha.height,tempg->pwha.angle); break; case SPT_POLYGON: eletype=SPT_MENU; @@ -729,115 +749,128 @@ ei_restart: } while (msg_code!=MSG_IP_L_UP); tempg=MAlloc(SpriteElemQuedBaseSize(SPT_POLYGON)); tempg->type=SPT_POLYGON; - tempg->x2=(x1+x2)>>1-x; - tempg->y2=(y1+y2)>>1-y; - tempg->width =AbsI64(x1-x2)>>1; - tempg->height=AbsI64(y1-y2)>>1; - tempg->sides=i; - angle2=Arg(x2-(tempg->x2+x),y2-(tempg->y2+y)); - if (tempg->widthheight) + tempg->pwhas.x1=(x1+x2)>>1-x; + tempg->pwhas.y1=(y1+y2)>>1-y; + tempg->pwhas.width =AbsI64(x1-x2)>>1; + tempg->pwhas.height=AbsI64(y1-y2)>>1; + tempg->pwhas.sides=i; + angle2=Arg(x2-(tempg->pwhas.x1+x),y2-(tempg->pwhas.y1+y)); + if (tempg->pwhas.widthpwhas.height) angle2-=ã/2.0; do { - angle1=Arg(x2-(tempg->x2+x),y2-(tempg->y2+y)); - if (tempg->width>=tempg->height) - tempg->rot_angle=-(angle1-angle2); + angle1=Arg(x2-(tempg->pwhas.x1+x),y2-(tempg->pwhas.y1+y)); + if (tempg->pwhas.width>=tempg->pwhas.height) + tempg->pwhas.angle=-(angle1-angle2); else - tempg->rot_angle=-(angle1-angle2)+ã/2.0; + tempg->pwhas.angle=-(angle1-angle2)+ã/2.0; dc->color=color&COLORROP_NO_ROP0_MASK; - GrRegPoly3(dc,tempg->x2+x,tempg->y2+y,0, - tempg->width,tempg->height,tempg->sides,tempg->rot_angle); + GrRegPoly3(dc,tempg->pwhas.x1+x,tempg->pwhas.y1+y,0, + tempg->pwhas.width,tempg->pwhas.height, + tempg->pwhas.sides,tempg->pwhas.angle); msg_code=GetMsg(&a1,&a2, 1<x2+x),y2-(tempg->y2+y)); - if (tempg->width>=tempg->height) - tempg->rot_angle=-(angle1-angle2); + angle1=Arg(x2-(tempg->pwhas.x1+x),y2-(tempg->pwhas.y1+y)); + if (tempg->pwhas.width>=tempg->pwhas.height) + tempg->pwhas.angle=-(angle1-angle2); else - tempg->rot_angle=-(angle1-angle2)+ã/2.0; + tempg->pwhas.angle=-(angle1-angle2)+ã/2.0; dc->color=color&COLORROP_NO_ROP0_MASK; - GrRegPoly3(dc,tempg->x2+x,tempg->y2+y,0, - tempg->width,tempg->height,tempg->sides,tempg->rot_angle); + GrRegPoly3(dc,tempg->pwhas.x1+x,tempg->pwhas.y1+y,0, + tempg->pwhas.width,tempg->pwhas.height,tempg->pwhas.sides, + tempg->pwhas.angle); break; case SPT_PT: case SPT_FLOOD_FILL: case SPT_FLOOD_FILL_NOT: tempg=MAlloc(SpriteElemQuedBaseSize(eletype)); tempg->type=eletype; - tempg->x1=x1-x; - tempg->y1=y1-y; + tempg->p.x1=x1-x; + tempg->p.y1=y1-y; break; sub_switch_start: QueInit(&root2); num=0; - x3=a1-x; y3=a2-y; do { do { dc->color=color&COLORROP_NO_ROP0_MASK; - GrLine3(dc,x1,y1,0,x2,y2,0); + if (num) + GrLine3(dc,x1,y1,0,x2,y2,0); msg_code=GetMsg(&a1,&a2, 1<color=TRANSPARENT; - GrLine3(dc,x1,y1,0,x2,y2,0); + if (num) + GrLine3(dc,x1,y1,0,x2,y2,0); x2=a1; y2=a2; } while (msg_code!=MSG_IP_L_UP && msg_code!=MSG_IP_R_UP); dc->color=color&COLORROP_NO_ROP0_MASK; if (msg_code==MSG_IP_L_UP) { - GrLine3(dc,x1,y1,0,x2,y2,0); + if (num) + GrLine3(dc,x1,y1,0,x2,y2,0); tempg=MAlloc(SpriteElemQuedBaseSize(SPT_PT)); tempg->type=SPT_PT; - tempg->x1=x2-x; - tempg->y1=y2-y; + tempg->p.x1=x2-x; + tempg->p.y1=y2-y; QueIns(tempg,root2.last); x1=x2;y1=y2; num++; } } while (msg_code!=MSG_IP_R_UP); - if (!num) { - tempg=NULL; - break; - } case SPT_POLYLINE: - tempg=CAlloc(SpriteElemQuedBaseSize(SPT_POLYLINE)+ - (num+1)<<1*sizeof(I32)); - ptr=&tempg->y1; - tempg2=root2.next; - ptr[0]=x3; - ptr[1]=y3; - ptr+=2; - for (i=0;inext; - ptr[i<<1]=tempg2->x1; - ptr[i<<1+1]=tempg2->y1; - Free(tempg2); - tempg2=tempg1; + if (num>1) { + tempg=CAlloc(SpriteElemQuedBaseSize(SPT_POLYLINE)+num*sizeof(CD2I32)); + ptr=&tempg->nu.u; + tempg2=root2.next; + for (i=0;inext; + ptr[i<<1]=tempg2->p.x1; + ptr[i<<1+1]=tempg2->p.y1; + Free(tempg2); + tempg2=tempg1; + } + tempg->type=SPT_POLYLINE; + tempg->nu.num=num; + } else { + tempg2=root2.next; + for (i=0;inext; + Free(tempg2); + tempg2=tempg1; + } + tempg=NULL; } - tempg->type=SPT_POLYLINE; - tempg->num=num+1; break; case SPT_BSPLINE2: case SPT_BSPLINE3: case SPT_BSPLINE2_CLOSED: case SPT_BSPLINE3_CLOSED: - tempg=CAlloc(SpriteElemQuedBaseSize(SPT_POLYLINE)+ - (num+1)*sizeof(CD3I32)); - p=&tempg->y1; - tempg2=root2.next; - p[0].x=x3; - p[0].y=y3; - for (i=1;i<=num;i++) { - tempg1=tempg2->next; - p[i].x=tempg2->x1; - p[i].y=tempg2->y1; - Free(tempg2); - tempg2=tempg1; + if (num>2) { + tempg=CAlloc(SpriteElemQuedBaseSize(eletype)+num*sizeof(CD3I32)); + p=&tempg->nu.u; + tempg2=root2.next; + for (i=0;inext; + p[i].x=tempg2->p.x1; + p[i].y=tempg2->p.y1; + Free(tempg2); + tempg2=tempg1; + } + tempg->type=eletype; + tempg->nu.num=num; + } else { + tempg2=root2.next; + for (i=0;inext; + Free(tempg2); + tempg2=tempg1; + } + tempg=NULL; } - tempg->type=eletype; - tempg->num=num+1; break; sub_switch_end: break; @@ -846,8 +879,7 @@ ei_restart: x3=a1-x; y3=a2-y; dc->color=color&COLORROP_NO_ROP0_MASK; do { - msg_code=GetMsg(&a1,&a2, - 1<next; - if (tempg->x1==x1 && tempg->y1==y1) { + if (tempg->p.x1==x1 && tempg->p.y1==y1) { QueRem(tempg); Free(tempg); } else { num++; - x1=tempg->x1; - y1=tempg->y1; + x1=tempg->p.x1; + y1=tempg->p.y1; } tempg=tempg1; } tempg=CAlloc(SpriteElemQuedBaseSize(SPT_POLYPT)+(num*3+7)>>3); - ptr=&tempg->y1; - ptr[0]=x3; - ptr[1]=y3; - ptr+=2; + tempg->npu.x=x3; + tempg->npu.y=y3; + ptr=&tempg->npu.u; x1=x3;y1=y3; i=0; tempg2=root2.next; while (tempg2!=&root2) { tempg1=tempg2->next; BFieldOrU32(ptr,i, - polypt_map[SignI64(tempg2->x1-x1)+1+ - 3*(SignI64(tempg2->y1-y1)+1)]); + polypt_map[SignI64(tempg2->p.x1-x1)+1+ + 3*(SignI64(tempg2->p.y1-y1)+1)]); i+=3; - x1=tempg2->x1;y1=tempg2->y1; + x1=tempg2->p.x1;y1=tempg2->p.y1; QueRem(tempg2); Free(tempg2); tempg2=tempg1; } tempg->type=SPT_POLYPT; - tempg->num=num; + tempg->npu.num=num; break; sub_switch_end: if (tempg) { @@ -926,14 +957,14 @@ ei_bitmap: xx2++; yy2++; tempg=CAlloc(SpriteElemQuedBaseSize(SPT_BITMAP)+ ((xx2-xx1+7)&~7)*(yy2-yy1)); - tempg->type=eletype; - tempg->width=xx2-xx1; - tempg->height=yy2-yy1; - tempg->x2=xx1-x; - tempg->y2=yy1-y; - img=DCNew(tempg->width,tempg->height,Fs); + tempg->type=SPT_BITMAP; + tempg->pwhu.width=xx2-xx1; + tempg->pwhu.height=yy2-yy1; + tempg->pwhu.x1=xx1-x; + tempg->pwhu.y1=yy1-y; + img=DCNew(tempg->pwhu.width,tempg->pwhu.height,Fs); img->color=bm_bkcolor; - GrRect(img,0,0,tempg->width,tempg->height); + GrRect(img,0,0,tempg->pwhu.width,tempg->pwhu.height); tempg1=insert_pt; if (tempg1==root || tempg1->type!=SPT_BITMAP) { SpriteSetSettings(img,root,0,&color,&width,-(xx1-x),-(yy1-y)); @@ -943,12 +974,12 @@ ei_bitmap: cur_elem_num=1; } else { SpriteSetSettings(img,root,cur_elem_num,&color,&width,-(xx1-x),-(yy1-y)); - Sprite3(img,-(xx1-x),-(yy1-y),0,tempg1(U8 *)+offset(CSprite.start),TRUE); + Sprite3(img,-(xx1-x),-(yy1-y),0,&tempg1->start,TRUE); insert_pt=tempg1->next; QueRem(tempg1); Free(tempg1); } - MemCpy(tempg(U8 *)+offset(CSprite.linespeed),img->body,((xx2-xx1+7)&~7)*(yy2-yy1)); + MemCpy(&tempg->pwhu.u,img->body,((xx2-xx1+7)&~7)*(yy2-yy1)); switch (i=SpriteBitMapEd(doc,doc_e,dc,&xx1,&yy1,&xx2,&yy2,&img,bm_bkcolor)) { case GE_EXIT: @@ -957,11 +988,11 @@ ei_bitmap: tempg=CAlloc(SpriteElemQuedBaseSize(SPT_BITMAP)+ ((xx2-xx1+7)&~7)*(yy2-yy1)); tempg->type=eletype; - tempg->width=xx2-xx1; - tempg->height=yy2-yy1; - tempg->x2=xx1-x; - tempg->y2=yy1-y; - MemCpy(tempg(U8 *)+offset(CSprite.linespeed),img->body,((xx2-xx1+7)&~7)*(yy2-yy1)); + tempg->pwhu.width=xx2-xx1; + tempg->pwhu.height=yy2-yy1; + tempg->pwhu.x1=xx1-x; + tempg->pwhu.y1=yy1-y; + MemCpy(&tempg->pwhu.u,img->body,((xx2-xx1+7)&~7)*(yy2-yy1)); break; } doc_e->de_flags=old_de_flags; @@ -987,25 +1018,25 @@ ei_shiftable_mesh: x1=-(a1-x); y1=-(a2-y); z1=z; - p=&tempg1->x2; - for (i=0;ivertex_cnt;i++,p++) { + p=&tempg1->mu.u; + for (i=0;imu.vertex_cnt;i++,p++) { p->x+=x1; p->y+=y1; p->z+=z1; } - old_mesh=&tempg1->vertex_cnt; + old_mesh=&tempg1->mu.vertex_cnt; } else if (tempg1!=root && tempg1->type==SPT_SHIFTABLE_MESH) { - z=-tempg1->z1; - x1=tempg1->x1-(a1-x); - y1=tempg1->y1-(a2-y); - z1=tempg1->z1+z; - p=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); - for (i=0;ishiftable_vertex_cnt;i++,p++) { + z=-tempg1->pmu.z; + x1=tempg1->pmu.x-(a1-x); + y1=tempg1->pmu.y-(a2-y); + z1=tempg1->pmu.z+z; + p=&tempg1->pmu.u; + for (i=0;ipmu.vertex_cnt;i++,p++) { p->x+=x1; p->y+=y1; p->z+=z1; } - old_mesh=&tempg1->shiftable_vertex_cnt; + old_mesh=&tempg1->pmu.vertex_cnt; } else { z=0; old_mesh=NULL; @@ -1013,11 +1044,11 @@ ei_shiftable_mesh: if (mesh=SpriteMeshEd(old_mesh,&size,TRUE)) { tempg=MAlloc(SpriteElemQuedBaseSize(SPT_SHIFTABLE_MESH)-sizeof(I32)*2+size); tempg->type=SPT_SHIFTABLE_MESH; - MemCpy(&tempg->shiftable_vertex_cnt,mesh,size); + MemCpy(&tempg->pmu.vertex_cnt,mesh,size); Free(mesh); - tempg->x1=a1-x; - tempg->y1=a2-y; - tempg->z1=-z; + tempg->pmu.x=a1-x; + tempg->pmu.y=a2-y; + tempg->pmu.z=-z; QueIns(tempg,insert_pt->last); SpriteEdUpdate(doc,tempb,root); if (old_mesh) { @@ -1028,11 +1059,11 @@ ei_shiftable_mesh: } else cur_elem_num++; } else if (old_mesh && tempg1->type==SPT_SHIFTABLE_MESH) { - x1=tempg1->x1-(a1-x); - y1=tempg1->y1-(a2-y); - z1=tempg1->z1+z; - p=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); - for (i=0;ishiftable_vertex_cnt;i++,p++) { + x1=tempg1->pmu.x-(a1-x); + y1=tempg1->pmu.y-(a2-y); + z1=tempg1->pmu.z+z; + p=&tempg1->pmu.u; + for (i=0;ipmu.vertex_cnt;i++,p++) { p->x-=x1; p->y-=y1; p->z-=z1; @@ -1041,8 +1072,8 @@ ei_shiftable_mesh: x1=-(a1-x); y1=-(a2-y); z1= z; - p=&tempg1->x2; - for (i=0;ivertex_cnt;i++,p++) { + p=&tempg1->mu.u; + for (i=0;imu.vertex_cnt;i++,p++) { p->x-=x1; p->y-=y1; p->z-=z1; @@ -1077,7 +1108,7 @@ U0 EdSpriteIns(CDoc *doc,I64 x,I64 y) CDocEntry *doc_e; CDocBin *tempb; if (Fs!=doc->mem_task) - Dbg; + throw('Graphics'); if (st=EdSprite(doc->cur_bin_num)) { unlock=DocLock(doc); tempb=CAlloc(sizeof(CDocBin),doc->mem_task); diff --git a/Adam/Gr/SpriteMesh.CPP b/Adam/Gr/SpriteMesh.CPP index 51f1afd..b5c1d4d 100644 --- a/Adam/Gr/SpriteMesh.CPP +++ b/Adam/Gr/SpriteMesh.CPP @@ -384,7 +384,7 @@ U0 MPDrawIt(CMeshFrame *e) CMeshEdTri *tempt=e->tri_root.next; I64 i,*old_r=dc->r; -//$LK,"DCAlias",A="MN:DCAlias"$() allocates a new identity rotation matrix. +//$LK,"DCAlias",A="MN:DCAlias"$() alllocs a new identity rotation matrix. //We want e->dc's rotation matrix. dc->r=e->dc->r; @@ -955,7 +955,7 @@ $WW,0$*/ "}"); SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ - WordStat; + AutoComplete; Preempt(OFF); //We don't really want window update while modifying links AcctOneTimePopUp(ARf_MESH_ED, "$$GREEN$$Right Mouse$$FG$$: Hold and move to shift cursor z\n" diff --git a/Adam/Gr/SpriteNew.CPP b/Adam/Gr/SpriteNew.CPP index f89be18..55b93ba 100644 --- a/Adam/Gr/SpriteNew.CPP +++ b/Adam/Gr/SpriteNew.CPP @@ -5,36 +5,36 @@ U8 polypt_map[9]={0,1,2,3,0,4,5,6,7}; I64 sprite_elem_base_sizes[SPT_NUM_TYPES]= { -offset(CSprite.x1)-offset(CSprite.start), //SPT_END -1+offset(CSprite.color)-offset(CSprite.start), //SPT_COLOR -2+offset(CSprite.dither_color)-offset(CSprite.start), //SPT_DITHER_COLOR -offset(CSprite.y1)-offset(CSprite.start), //SPT_WIDTH -offset(CSprite.linespeed)-offset(CSprite.start), //SPT_PLANAR_SYMMETRY -offset(CSprite.x1)-offset(CSprite.start), //SPT_TRANSFORM_ON -offset(CSprite.x1)-offset(CSprite.start), //SPT_TRANSFORM_OFF -offset(CSprite.x2)-offset(CSprite.start), //SPT_SHIFT -offset(CSprite.x2)-offset(CSprite.start), //SPT_PT -offset(CSprite.y2)-offset(CSprite.start), //SPT_POLYPT -offset(CSprite.linespeed)-offset(CSprite.start), //SPT_LINE -offset(CSprite.y1)-offset(CSprite.start), //SPT_POLYLINE -offset(CSprite.linespeed)-offset(CSprite.start), //SPT_RECT -offset(CSprite.sides)-offset(CSprite.start), //SPT_ROTATED_RECT -offset(CSprite.y2)-offset(CSprite.start), //SPT_CIRCLE -offset(CSprite.sides)-offset(CSprite.start), //SPT_ELLIPSE -sizeof(CSprite)-offset(CSprite.start), //SPT_POLYGON -offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE2 -offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE2_CLOSED -offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE3 -offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE3_CLOSED -offset(CSprite.x2)-offset(CSprite.start), //SPT_FLOOD_FILL -offset(CSprite.x2)-offset(CSprite.start), //SPT_FLOOD_FILL_NOT -offset(CSprite.linespeed)-offset(CSprite.start), //SPT_BITMAP -offset(CSprite.x2)-offset(CSprite.start), //SPT_MESH -offset(CSprite.shiftable_tri_cnt)+sizeof(I32)-offset(CSprite.start), //SPT_SHIFTABLE_MESH -offset(CSprite.linespeed)-offset(CSprite.start), //SPT_ARROW -offset(CSprite.st)-offset(CSprite.start), //SPT_TEXT -offset(CSprite.st)-offset(CSprite.start), //SPT_TEXT_BOX -offset(CSprite.st)-offset(CSprite.start), //SPT_TEXT_DIAMOND +sizeof(CSpriteBase), //SPT_END +sizeof(CSpriteColor), //SPT_COLOR +sizeof(CSpriteDitherColor), //SPT_DITHER_COLOR +sizeof(CSpriteWidth), //SPT_WIDTH +sizeof(CSpritePtPt), //SPT_PLANAR_SYMMETRY +sizeof(CSpriteBase), //SPT_TRANSFORM_ON +sizeof(CSpriteBase), //SPT_TRANSFORM_OFF +sizeof(CSpritePt), //SPT_SHIFT +sizeof(CSpritePt), //SPT_PT +sizeof(CSpriteNumPtU8s), //SPT_POLYPT +sizeof(CSpritePtPt), //SPT_LINE +sizeof(CSpriteNumU8s), //SPT_POLYLINE +sizeof(CSpritePtPt), //SPT_RECT +sizeof(CSpritePtPtAng), //SPT_ROTATED_RECT +sizeof(CSpritePtRad), //SPT_CIRCLE +sizeof(CSpritePtWHAng), //SPT_ELLIPSE +sizeof(CSpritePtWHAngSides), //SPT_POLYGON +sizeof(CSpriteNumU8s), //SPT_BSPLINE2 +sizeof(CSpriteNumU8s), //SPT_BSPLINE2_CLOSED +sizeof(CSpriteNumU8s), //SPT_BSPLINE3 +sizeof(CSpriteNumU8s), //SPT_BSPLINE3_CLOSED +sizeof(CSpritePt), //SPT_FLOOD_FILL +sizeof(CSpritePt), //SPT_FLOOD_FILL_NOT +sizeof(CSpritePtWHU8s), //SPT_BITMAP +sizeof(CSpriteMeshU8s), //SPT_MESH +sizeof(CSpritePtMeshU8s), //SPT_SHIFTABLE_MESH +sizeof(CSpritePtPt), //SPT_ARROW +sizeof(CSpritePtStr), //SPT_TEXT +sizeof(CSpritePtStr), //SPT_TEXT_BOX +sizeof(CSpritePtStr), //SPT_TEXT_DIAMOND }; I64 SpriteElemQuedBaseSize(I64 type) @@ -47,30 +47,30 @@ I64 SpriteElemSize(CSprite *tempg) I64 i=sprite_elem_base_sizes[tempg->type]; switch (tempg->type) { case SPT_POLYLINE: - i+=tempg->num*sizeof(CD2I32); + i+=tempg->nu.num*sizeof(CD2I32); break; case SPT_TEXT: case SPT_TEXT_BOX: case SPT_TEXT_DIAMOND: - i+=StrLen(tempg->st)+1; + i+=StrLen(tempg->ps.st)+1; break; case SPT_BITMAP: - i+=((tempg->width+7)&~7)*tempg->height; + i+=((tempg->pwhu.width+7)&~7)*tempg->pwhu.height; break; case SPT_POLYPT: - i+=(tempg->num*3+7)>>3; + i+=(tempg->npu.num*3+7)>>3; break; case SPT_BSPLINE2: case SPT_BSPLINE3: case SPT_BSPLINE2_CLOSED: case SPT_BSPLINE3_CLOSED: - i+=tempg->num*sizeof(CD3I32); + i+=tempg->nu.num*sizeof(CD3I32); break; case SPT_MESH: - i+=tempg->vertex_cnt*sizeof(CD3I32)+tempg->tri_cnt*sizeof(CMeshTri); + i+=tempg->mu.vertex_cnt*sizeof(CD3I32)+tempg->mu.tri_cnt*sizeof(CMeshTri); break; case SPT_SHIFTABLE_MESH: - i+=tempg->shiftable_vertex_cnt*sizeof(CD3I32)+tempg->shiftable_tri_cnt*sizeof(CMeshTri); + i+=tempg->pmu.vertex_cnt*sizeof(CD3I32)+tempg->pmu.tri_cnt*sizeof(CMeshTri); break; } return i; @@ -105,12 +105,11 @@ public U8 *DC2Sprite(CDC *tempb) sprite_elem_base_sizes[SPT_END]) (U8 *)-offset(CSprite.start); tempg->type=SPT_BITMAP; - tempg->width=tempb->width; - tempg->height=tempb->height; - tempg->x2=0; - tempg->y2=0; - MemCpy(tempg(U8 *)+offset(CSprite.linespeed),tempb->body, - tempb->width_internal*tempb->height); + tempg->pwhu.width=tempb->width; + tempg->pwhu.height=tempb->height; + tempg->pwhu.x1=0; + tempg->pwhu.y1=0; + MemCpy(&tempg->pwhu.u,tempb->body,tempb->width_internal*tempb->height); return tempg(U8 *)+offset(CSprite.start); } @@ -121,56 +120,56 @@ public U8 *SpriteElem2OneLineSummary(CSprite *tempg) StrPrint(buf,"%Z",tempg->type,"ST_SPRITE_ELEM_TYPES"); switch (tempg->type) { case SPT_COLOR: - CatPrint(buf," %s",Color2Str(buf2,tempg->color)); + CatPrint(buf," %s",Color2Str(buf2,tempg->c.color)); break; case SPT_DITHER_COLOR: - CatPrint(buf," %s",Color2Str(buf2,ROPF_DITHER|tempg->dither_color.u8[0]|tempg->dither_color.u8[1]<d.dither_color.u8[0]|tempg->d.dither_color.u8[1]<x1,tempg->y1); + CatPrint(buf," (%d,%d)",tempg->p.x1,tempg->p.y1); break; case SPT_LINE: case SPT_ARROW: case SPT_PLANAR_SYMMETRY: case SPT_RECT: case SPT_ROTATED_RECT: - CatPrint(buf," (%d,%d),(%d,%d)",tempg->x1,tempg->y1,tempg->x2,tempg->y2); + CatPrint(buf," (%d,%d),(%d,%d)",tempg->pp.x1,tempg->pp.y1,tempg->pp.x2,tempg->pp.y2); break; case SPT_CIRCLE: - CatPrint(buf," (%d,%d):%dR",tempg->x1,tempg->y1,tempg->x2); + CatPrint(buf," (%d,%d):%dR",tempg->pr.x1,tempg->pr.y1,tempg->pr.radius); break; case SPT_WIDTH: - CatPrint(buf," %d",tempg->width); + CatPrint(buf," %d",tempg->w.width); break; case SPT_TEXT: case SPT_TEXT_BOX: case SPT_TEXT_DIAMOND: - CatPrint(buf," %d,%d:%-16tQ",tempg->x1,tempg->y1,tempg->st); + CatPrint(buf," %d,%d:%-16tQ",tempg->ps.x1,tempg->ps.y1,tempg->ps.st); break; case SPT_POLYLINE: case SPT_POLYPT: - ptr=&tempg->y1; - CatPrint(buf," %d (%d,%d)",tempg->num,ptr[0],ptr[1]); + ptr=&tempg->npu.x; + CatPrint(buf," %d (%d,%d)",tempg->npu.num,ptr[0],ptr[1]); break; case SPT_ELLIPSE: case SPT_POLYGON: case SPT_BITMAP: - CatPrint(buf," (%d,%d):%dW,%dH",tempg->x2,tempg->y2,tempg->width,tempg->height); + CatPrint(buf," (%d,%d):%dW,%dH",tempg->pwhu.x1,tempg->pwhu.y1,tempg->pwhu.width,tempg->pwhu.height); break; case SPT_BSPLINE2: case SPT_BSPLINE3: case SPT_BSPLINE2_CLOSED: case SPT_BSPLINE3_CLOSED: - CatPrint(buf," %d",tempg->num); + CatPrint(buf," %d",tempg->nu.num); break; case SPT_MESH: - CatPrint(buf," %dV,%dT",tempg->vertex_cnt,tempg->tri_cnt); + CatPrint(buf," %dV,%dT",tempg->mu.vertex_cnt,tempg->mu.tri_cnt); break; case SPT_SHIFTABLE_MESH: - CatPrint(buf," %dV,%dT",tempg->shiftable_vertex_cnt,tempg->shiftable_tri_cnt); + CatPrint(buf," %dV,%dT",tempg->pmu.vertex_cnt,tempg->pmu.tri_cnt); break; } return StrNew(buf); diff --git a/Adam/Menu.CPP b/Adam/Menu.CPP index 5ce7f0f..dc4b81d 100644 --- a/Adam/Menu.CPP +++ b/Adam/Menu.CPP @@ -26,7 +26,7 @@ public CMenuEntry *MenuEntryFind(CMenu *haystack_menu,U8 *needle_full_name) //Just 2 levels -- across top and down are valid, currently. U8 *st,*st2; CMenuEntry *tempse; - if (!haystack_menu || haystack_menu->mu_signature!=MENU_SIGNATURE_VAL || !needle_full_name) + if (!haystack_menu || !needle_full_name) return NULL; st=StrNew(needle_full_name); st2=StrNew(needle_full_name); @@ -91,13 +91,11 @@ public CMenu *MenuNew(U8 *st,I64 flags=0,CTask *task=NULL) m=CAlloc(sizeof(CMenu),task); m->task=task; m->flags=flags; - m->attr =LTBLUE<<4 +YELLOW; - m->checked_attr=LTGREEN<<4+BROWN; + m->attr =BLUE<<4+YELLOW; tempse=&m->sub; while (tempse) tempse=tempse->next=MenuNewSub(lx,task); LexDel(lx); - m->mu_signature=MENU_SIGNATURE_VAL; return m; } @@ -127,9 +125,7 @@ U0 MenuDelSub(CMenuEntry *tempme) public U0 MenuDel(CMenu *m) {//Delete a manu. You probably don't need this. CMenuEntry *tempme,*tempme1; - if (!m || m->mu_signature!=MENU_SIGNATURE_VAL) - return; - m->mu_signature=0; + if (!m) return; tempme=m->sub; while (tempme) { tempme1=tempme->next; @@ -181,12 +177,10 @@ U0 DrawMenu(CDC *dc) U8 *st=NULL; CTask *task=MenuTask; I64 i,w,x0,y0,x1=ip.pos.x,y1=ip.pos.y; - if (!TaskValidate(task) || !(m=task->cur_menu) || - m->mu_signature!=MENU_SIGNATURE_VAL) { + if (!TaskValidate(task) || !(m=task->cur_menu)) { sys_cur_submenu_entry=NULL; return; } - dc->color=m->attr>>4; GrRect(dc,0,0,GR_WIDTH,FONT_HEIGHT); x0=0; @@ -205,7 +199,7 @@ U0 DrawMenu(CDC *dc) tempse=tempme->sub; while (tempse) { if (tempse->checked) - i=m->checked_attr; + i=m->attr^0xFF; else i=m->attr; if (y0<=y1sample_rate=EndianU32(SNDFILE_SAMPLE_RATE); s->channels=EndianU32(1); + if (time_shift) { + d=snd.record_root.next; + d->time-=time_shift; + while (d->next!=&snd.record_root) { + d1=d->next; + dt=d1->time-d->time; + if (dt<0) { + QueRem(d1); + Free(d1); + } else + break; + } + } + d=snd.record_root.next; k=0; while (d->next!=&snd.record_root) { diff --git a/Adam/Snd/MathAudio.CPP b/Adam/Snd/SndMath.CPP similarity index 100% rename from Adam/Snd/MathAudio.CPP rename to Adam/Snd/SndMath.CPP diff --git a/Adam/Snd/Music.CPP b/Adam/Snd/SndMusic.CPP similarity index 100% rename from Adam/Snd/Music.CPP rename to Adam/Snd/SndMusic.CPP diff --git a/Adam/Start.CPP b/Adam/Start.CPP deleted file mode 100644 index 5048742..0000000 --- a/Adam/Start.CPP +++ /dev/null @@ -1,12 +0,0 @@ -U0 Start() -{ - Type("::/Doc/Splash.TXT"); - SetWinHorz(TEXT_COLS/4-1,3*TEXT_COLS/4); - SetWinVert(6,Fs->win_bottom); - "$$GREEN$$Tip of day$$FG$$\n"; - TipOfDay; - "$$GREEN$$$$FG$$ to exit.\n"; - View; -} - -Start; diff --git a/Adam/TaskSettings.CPP b/Adam/TaskSettings.CPP index 69d7cbb..14bf49b 100644 --- a/Adam/TaskSettings.CPP +++ b/Adam/TaskSettings.CPP @@ -10,6 +10,7 @@ public CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0) if (!task) task=Fs; if (!TaskValidate(task)) return NULL; tempse=CAlloc(sizeof(CTaskSettings),task); + tempse->cur_dir=CurDir(task,task); tempse->draw_it=task->draw_it; GetVGAPalette4(tempse->palette4); tempse->task_end_cb=task->task_end_cb; @@ -48,10 +49,10 @@ public CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0) tempse->border_src =task->border_src; tempse->border=!Bt(&task->display_flags,DISPLAYf_NO_BORDER); tempse->preempt=Bt(&task->task_flags,TASKf_PREEMPT); - if (TaskValidate(ws.task)) - tempse->wordstat=TRUE; + if (TaskValidate(ac.task)) + tempse->autocomplete=TRUE; else - tempse->wordstat=FALSE; + tempse->autocomplete=FALSE; tempse->next=task->next_settings; task->next_settings=tempse; @@ -68,8 +69,8 @@ U0 SettingsPop2(CTask *task,CTaskSettings *tempse) } WinBorder(tempse->border,task); - SetWinHorz(tempse->left,tempse->right,task); - SetWinVert(tempse->top,tempse->bottom,task); + WinHorz(tempse->left,tempse->right,task); + WinVert(tempse->top,tempse->bottom,task); task->scroll_x=tempse->scroll_x; task->scroll_y=tempse->scroll_y; task->scroll_z=tempse->scroll_z; @@ -79,7 +80,7 @@ U0 SettingsPop2(CTask *task,CTaskSettings *tempse) task->border_src =tempse->border_src; task->title_src =tempse->title_src; StrCpy(task->task_title,tempse->task_title); - WordStat(tempse->wordstat); + AutoComplete(tempse->autocomplete); SetVGAPalette4(tempse->palette4); Snd(0); } @@ -95,6 +96,8 @@ public U0 SettingsPop(CTask *task=NULL,I64 flags=0) } if (tempse=task->next_settings) { task->next_settings=tempse->next; + Cd(tempse->cur_dir); + Free(tempse->cur_dir); task->draw_it=tempse->draw_it; task->task_end_cb=tempse->task_end_cb; diff --git a/Adam/Training.CPP b/Adam/Training.CPP index 324186c..b603c55 100644 --- a/Adam/Training.CPP +++ b/Adam/Training.CPP @@ -49,7 +49,7 @@ U0 KeyMapCtrlAltFamily() a2=SC_ESC+SCF_CTRL+SCF_ALT; st2=ScanCode2KeyName(a2); - st=SrcEdLink(&SpawnUser,256); + st=SrcEdLink(&User,256); "%20s $$LK,\"%s\",A=\"%s\"$$\n",st2,"Sys/Spawn New User Task",st; Free(st); Free(st2); diff --git a/Adam/Utils/FileBMP.CPP b/Adam/Utils/FileBMP.CPP index 483a05d..7fa541e 100644 --- a/Adam/Utils/FileBMP.CPP +++ b/Adam/Utils/FileBMP.CPP @@ -24,23 +24,21 @@ class CFileBMP CBGR palette[16]; }; -public CFileBMP *BMPFile4To(CDC *dc) +public CFileBMP *BMP4To(CDC *dc) {//To Windows 4-bit BMP. U8 *src,*ptr; I64 x,y,w=dc->width>>1, - size=offset(CFileBMP.end)+dc->width*dc->height>>1+16*sizeof(CBGR); - CFileBMP *r=CAlloc(size); - r->type='BM'; - r->planes=1; - r->file_size=size; - r->data_offset=offset(CFileBMP.end); - r->header_size=offset(CFileBMP.end)- - offset(CFileBMP.header_size); - r->width=dc->width; - r->height=dc->height; - r->bit_cnt=4; - r->image_size=dc->width*dc->height>>1; - r->data_offset+=16*sizeof(CBGR); + size=sizeof(CFileBMP)+dc->width*dc->height>>1; + CFileBMP *r =CAlloc(size); + r->type ='BM'; + r->planes =1; + r->file_size =size; + r->data_offset=sizeof(CFileBMP); + r->header_size=offset(CFileBMP.end)-offset(CFileBMP.header_size); + r->width =dc->width; + r->height =dc->height; + r->bit_cnt =4; + r->image_size =dc->width*dc->height>>1; GetVGAPalette4(r->palette); ptr=r(U8 *)+r->data_offset; for (y=dc->height-1;y>=0;y--) { @@ -54,23 +52,21 @@ public CFileBMP *BMPFile4To(CDC *dc) return r; } -public CFileBMP *BMPFileRLE4To(CDC *dc) +public CFileBMP *BMPRLE4To(CDC *dc) {//To Windows RLE4 bit BMP. - U8 *src,*ptr; + U8 *src,*ptr,*start; I64 x,y,w=dc->width,cnt,pattern; - CFileBMP *r=CAlloc(offset(CFileBMP.end)+2*(dc->width+1)*dc->height+16*sizeof(CBGR)); - r->type='BM'; - r->planes=1; - r->data_offset=offset(CFileBMP.end); - r->header_size=offset(CFileBMP.end)- - offset(CFileBMP.header_size); - r->width=dc->width; - r->height=dc->height; - r->bit_cnt=4; + CFileBMP *r =CAlloc(sizeof(CFileBMP)+2*(dc->width+1)*dc->height); + r->type ='BM'; + r->planes =1; + r->data_offset=sizeof(CFileBMP); + r->header_size=offset(CFileBMP.end)-offset(CFileBMP.header_size); + r->width =dc->width; + r->height =dc->height; + r->bit_cnt =4; r->compression=2; //RLE4 - r->data_offset+=16*sizeof(CBGR); GetVGAPalette4(r->palette); - ptr=r(U8 *)+r->data_offset; + start=ptr=r(U8 *)+r->data_offset; for (y=dc->height-1;y>=0;y--) { src=y*dc->width_internal+dc->body; x=0; @@ -101,27 +97,26 @@ public CFileBMP *BMPFileRLE4To(CDC *dc) } *ptr(U16 *)++=0; } - r->image_size=ptr-(&r->data_offset)(U8 *); - r->file_size=offset(CFileBMP.end)+r->image_size+16*sizeof(CBGR); + r->image_size=ptr-start; + r->file_size=sizeof(CFileBMP)+r->image_size; return r; } -public CFileBMP *BMPFile24To(CDC *dc) +public CFileBMP *BMP24To(CDC *dc) {//To Windows 24-bit BMP. U8 *src; I64 i,x,y,size=offset(CFileBMP.end)+dc->width*dc->height*sizeof(CRGB); CBGR *bgr; - CFileBMP *r=CAlloc(size); - r->type='BM'; - r->planes=1; - r->file_size=size; + CFileBMP *r =CAlloc(size); + r->type ='BM'; + r->planes =1; + r->file_size =size; r->data_offset=offset(CFileBMP.end); - r->header_size=offset(CFileBMP.end)- - offset(CFileBMP.header_size); - r->width=dc->width; - r->height=dc->height; - r->bit_cnt=32; - r->image_size=dc->width*dc->height<<2; + r->header_size=offset(CFileBMP.end)-offset(CFileBMP.header_size); + r->width =dc->width; + r->height =dc->height; + r->bit_cnt =32; + r->image_size =dc->width*dc->height<<2; bgr=r(U8 *)+r->data_offset; for (y=dc->height-1;y>=0;y--) { @@ -142,22 +137,22 @@ public CFileBMP *BMPFile24To(CDC *dc) return r; } -public I64 BMPFileWrite(U8 *filename,CDC *dc,I64 bits=4) +public I64 BMPWrite(U8 *filename,CDC *dc,I64 bits=4) {//Window's BMP Files. I64 size; CFileBMP *r; if (bits==4) { if (IsDotZ(filename)) //.Z compression is better than RLE - r=BMPFile4To(dc); + r=BMP4To(dc); else { - r=BMPFileRLE4To(dc); - if (r->file_size>offset(CFileBMP.end)+dc->width*dc->height>>1+16*sizeof(CBGR)) { + r=BMPRLE4To(dc); + if (r->file_size>sizeof(CFileBMP)+dc->width*dc->height>>1) { Free(r); - r=BMPFile4To(dc); + r=BMP4To(dc); } } } else if (bits==24) - r=BMPFile24To(dc); + r=BMP24To(dc); else { "Format Not Supported.\n"; return 0; @@ -168,7 +163,7 @@ public I64 BMPFileWrite(U8 *filename,CDC *dc,I64 bits=4) return size; } -U8 *BMPFilePaletteNew(CFileBMP *r) +U8 *BMPPaletteNew(CFileBMP *r) { I64 i,j,best,score,best_score; CBGR palette[16]; @@ -193,11 +188,39 @@ U8 *BMPFilePaletteNew(CFileBMP *r) U8 ms_paint_palette[16]={0,4,2,6,1,5,3,8,7,12,10,14,9,13,11,15}; -public CDC *BMPFileRead(U8 *filename,Bool use_ms_paint_palette=FALSE) +I64 BMP24Color(CBGR *ptr,Bool dither_probability) +{ + I64 result,k; + if (dither_probability) { + k=RandU32; + if (SqrI64(ptr->r)+SqrI64(ptr->g)+SqrI64(ptr->b)>=3*SqrI64(k.u8[0])) + result=8; + else + result=0; + if (ptr->r>=k.u8[1]) result|=RED; + if (ptr->g>=k.u8[2]) result|=GREEN; + if (ptr->b>=k.u8[3]) result|=BLUE; + } else { + if (SqrI64(ptr->r)+SqrI64(ptr->g)+SqrI64(ptr->b)>=SqrI64(0x80)) { + result=8; + if (ptr->r>=0x80) result|=RED; + if (ptr->g>=0x80) result|=GREEN; + if (ptr->b>=0x80) result|=BLUE; + } else { + result=0; + if (ptr->r>=0x40) result|=RED; + if (ptr->g>=0x40) result|=GREEN; + if (ptr->b>=0x40) result|=BLUE; + } + } + return result; +} + +public CDC *BMPRead(U8 *filename,Bool dither_probability=FALSE,Bool use_ms_paint_palette=FALSE) {//Window's BMP Files. I64 i,j,cnt; U8 *palette_map,*ptr; - Bool rle4; + Bool rle; CFileBMP *r; CDC *result=NULL; if (ptr=FileRead(filename)) { @@ -205,17 +228,17 @@ public CDC *BMPFileRead(U8 *filename,Bool use_ms_paint_palette=FALSE) if (0widthheightwidth,r->height); ptr+=r->data_offset; + if (r->compression==2) + rle=TRUE; + else + rle=FALSE; + if (use_ms_paint_palette) + palette_map=ms_paint_palette; + else + palette_map=BMPPaletteNew(r); if (r->bit_cnt==4) { - if (r->compression==2) - rle4=TRUE; - else - rle4=FALSE; - if (use_ms_paint_palette) - palette_map=ms_paint_palette; - else - palette_map=BMPFilePaletteNew(r); for (i=r->height-1;i>=0;i--) - if (rle4) {//We don't support full RLE4, just our own subset + if (rle) {//We don't support full RLE4, just our own subset j=0; while (cnt=*ptr++) { if (cnt==1) { @@ -238,7 +261,7 @@ public CDC *BMPFileRead(U8 *filename,Bool use_ms_paint_palette=FALSE) } ptr++; } else - for (j=0;j<(r->width+7)&-8;) { + for (j=0;j<(r->width+7)&~7;) { result->color=palette_map[*ptr&15]; GrPlot(result,j+1,i); result->color=palette_map[*ptr>>4]; @@ -248,6 +271,24 @@ public CDC *BMPFileRead(U8 *filename,Bool use_ms_paint_palette=FALSE) } if (!use_ms_paint_palette) Free(palette_map); + } else if (r->bit_cnt==24) { + for (i=r->height-1;i>=0;i--) { + for (j=0;jwidth;j++,ptr+=3) { + result->color=BMP24Color(ptr,dither_probability); + GrPlot(result,j,i); + } + ptr+=r->width&3; + } + if (!use_ms_paint_palette) + Free(palette_map); + } else if (r->bit_cnt>=32) { + for (i=r->height-1;i>=0;i--) + for (j=0;jwidth;j++,ptr+=4) { + result->color=BMP24Color(ptr,dither_probability); + GrPlot(result,j,i); + } + if (!use_ms_paint_palette) + Free(palette_map); } else { "Format Not Supported.\n"; DCDel(result); @@ -261,9 +302,9 @@ public CDC *BMPFileRead(U8 *filename,Bool use_ms_paint_palette=FALSE) } #help_index "Graphics/Sprite;Graphics/Windows BMP Files;DolDoc/Output" -public U0 DocBMPFile(CDoc *doc=NULL,U8 *filename,Bool use_ms_paint_palette=FALSE) +public U0 DocBMP(CDoc *doc=NULL,U8 *filename,Bool dither_probability=FALSE,Bool use_ms_paint_palette=FALSE) {//Put a BMP file into a document as a sprite. - CDC *dc=BMPFileRead(filename,use_ms_paint_palette); + CDC *dc=BMPRead(filename,dither_probability,use_ms_paint_palette); CSprite *elems=DC2Sprite(dc); DocSprite(doc,elems); Free(elems); @@ -271,10 +312,10 @@ public U0 DocBMPFile(CDoc *doc=NULL,U8 *filename,Bool use_ms_paint_palette=FALSE } #help_index "Graphics/Windows BMP Files;Graphics/Screen" -public I64 BMPFileCaptureScreen(U8 *filename,I64 bits=4) +public I64 BMPCaptureScreen(U8 *filename,I64 bits=4,Bool include_zoom=TRUE) {//Capture screen as BMP file. - CDC *dc=DCCaptureScreen; - I64 size=BMPFileWrite(filename,dc,bits); + CDC *dc=DCCaptureScreen(include_zoom); + I64 size=BMPWrite(filename,dc,bits); DCDel(dc); return size; } diff --git a/Adam/Utils/Grep.CPP b/Adam/Utils/Find.CPP similarity index 95% rename from Adam/Utils/Grep.CPP rename to Adam/Utils/Find.CPP index 131af89..a5a8dbb 100644 --- a/Adam/Utils/Grep.CPP +++ b/Adam/Utils/Find.CPP @@ -140,7 +140,7 @@ I64 GrepFile(U8 *needle_str,U8 *haystack_filename,I64 *_fuf_flags,U8 *replace_te return cnt; } -public I64 Grep(U8 *needle_str,U8 *files_find_mask="*",U8 *fu_flags=NULL,U8 *replace_text=NULL) +public I64 Find(U8 *needle_str,U8 *files_find_mask="*",U8 *fu_flags=NULL,U8 *replace_text=NULL) {/*Find occurrences of a string in files. This does not do regular expressions. Anyway, it's good for searching and replacing. @@ -184,7 +184,7 @@ public I64 FileOcc(U8 *needle_str,U8 *files_find_mask="*",U8 *fu_flags="+r+i+l") */ I64 cnt=0; Bool old_silent=Silent(TRUE); - cnt=Grep(needle_str,files_find_mask,fu_flags); + cnt=Find(needle_str,files_find_mask,fu_flags); Silent(old_silent); return cnt; } @@ -215,7 +215,7 @@ I64 GrepWiz() g->match_case=doc->find_replace->match_case; g->whole_labels=doc->find_replace->whole_labels; } - if (DocFormDo(g,,0,"$$PURPLE$$$$TX+CX,\"Grep\"$$\n$$FG$$")) { + if (DocFormDo(g,,0,"$$PURPLE$$$$TX+CX,\"Find\"$$\n$$FG$$")) { if (doc) { StrCpy(doc->find_replace->find_text,g->find_text); StrCpy(doc->find_replace->replace_text,g->replace_text); @@ -233,9 +233,9 @@ I64 GrepWiz() if (g->whole_labels) CatPrint(buf,"+l"); if (g->replace) - st=MStrPrint("\"$$$$WW+H,1$$$$\";Cd(\"%s\");Grep(\"%Q\",\"%Q\",\"%Q\",\"%Q\");UserTaskCont;",dir,g->find_text,g->filemask,buf,g->replace_text); + st=MStrPrint("\"$$$$WW+H,1$$$$\";Cd(\"%s\");Find(\"%Q\",\"%Q\",\"%Q\",\"%Q\");UserTaskCont;",dir,g->find_text,g->filemask,buf,g->replace_text); else - st=MStrPrint("\"$$$$WW+H,1$$$$\";Cd(\"%s\");Grep(\"%Q\",\"%Q\",\"%Q\");UserTaskCont;",dir,g->find_text,g->filemask,buf); + st=MStrPrint("\"$$$$WW+H,1$$$$\";Cd(\"%s\");Find(\"%Q\",\"%Q\",\"%Q\");UserTaskCont;",dir,g->find_text,g->filemask,buf); result=PopUp(st); } Free(dir); diff --git a/Adam/Utils/LineRep.CPP b/Adam/Utils/LineRep.CPP index 60f251a..d311169 100644 --- a/Adam/Utils/LineRep.CPP +++ b/Adam/Utils/LineRep.CPP @@ -56,14 +56,14 @@ I64 SizeRep1(CDirEntry *tempde,I64 *_fuf_flags) { I64 result=0,i; U8 buf[BLK_SIZE]; - CPrt *p; + CDrv *dv; while (tempde) { if (tempde->attr&RS_ATTR_DIR) i=SizeRep1(tempde->sub,_fuf_flags); else if ((i=tempde->size) && Bt(_fuf_flags,FUf_EXPAND) && FileAttr(tempde->name)&RS_ATTR_COMPRESSED) { - p=Drv2Prt(*tempde->full_name); - RBlks(p,buf,Cluster2Blk(p,tempde->cluster),1); + dv=Let2Drv(*tempde->full_name); + RBlks(dv,buf,Cluster2Blk(dv,tempde->cluster),1); i=(&buf)(CArcCompress *)->expanded_size; } tempde->user_data=i; diff --git a/Adam/Utils/MemRep.CPP b/Adam/Utils/MemRep.CPP index efa892e..67ca385 100644 --- a/Adam/Utils/MemRep.CPP +++ b/Adam/Utils/MemRep.CPP @@ -2,21 +2,15 @@ I64 TSSSize(CTSS *tss) { - return MSize2(tss)+ - MSize2(tss->st0)+ - MSize2(tss->st1)+ - MSize2(tss->st2); + return MSize2(tss)+MSize2(tss->st0)+MSize2(tss->st1)+MSize2(tss->st2); } I64 PenBrushesSize() { I64 result=0,i; for (i=0;ibd_signature==BD_SIGNATURE_VAL) { - if (bdev->type==BDT_RAM) + bd=&dsk.blkdevs[i]; + if (bd->bd_signature==BD_SIGNATURE_VAL) { + if (bd->type==BDT_RAM) "RAMDsk %C\t:%010X Unused:%010X\n", - bdev->first_drv_let,(bdev->max_blk+1)<first_drv_let); - result+=MSize2(bdev->dev_id_record); + bd->first_drv_let,(bd->max_blk+1)<first_drv_let); + result+=MSize2(bd->dev_id_record); } } return result; } -I64 PrtsSize() +I64 DrvsSize() { - I64 i,result=MSize2(dsk.prts); - for (i=0;itask_title,SUF_REM_CTRL_CHARS|SUF_SAFE_DOLLAR); "$$GREEN$$Task:%010X$$CYAN$$ %-30ts$$FG$$\n$$ID,2$$",task,st; Free(st); - "$$PURPLE$$Alloced:%010X Used:%010X $$RED$$Unused:%010X$$FG$$\n", - TaskAllocatedMem(task,override_validate), - TaskUsedMem(task,override_validate), - TaskUnusedAllocatedMem(task,override_validate); + "$$PURPLE$$Alloced:%010X Used:%010X$$FG$$\n", + TaskMemAlloced(task,override_validate), + TaskMemUsed(task,override_validate); "HashTable\t:%010X\n",HashTableSize2(task->hash_table); i=UnusedStk(task); @@ -169,15 +161,15 @@ Bool MemRepTask(CTask *task,Bool override_validate=FALSE) "TaskStructs\t:%010X\n",j; "TSSes\t:%010X\n",k; "HeapCtrls\t:%010X\n",m; - "TaskQues\t:%010X\n",n; + if (n) + "TaskQues\t:%010X\n",n; "BlkDevs\t:%010X\n",BlkDevsSize; - "Prts\t:%010X\n",PrtsSize; - "Audio\t:%010X\n",CallExtStr("AudioSize"); + "Drvs\t:%010X\n",DrvsSize; if (dsk.cache_base) "DskCache\t:%010X\n", MSize2(dsk.cache_base)+MSize2(dsk.cache_hash_table)+MSize2(dsk.cache_ctrl); - "WordStat\t:%010X\n",CallExtStr("WordStatSize"); "Clipboard\t:%010X\n",DocSize(sys_clipboard_doc); + "AutoComplete:%010X\n",CallExtStr("AutoCompleteSize"); "gr.to_8_bits\t:%010X\n",MSize2(gr.to_8_bits); "gr.to_8_colors\t:%010X\n",MSize2(gr.to_8_colors); "gr.text_base\t:%010X\n",MSize2(gr.text_base); @@ -214,13 +206,13 @@ public U0 MemRep() "$$ID,-2$$"; if (sys_data_bp) { - "$$BLACK$$Code Heap:%010X Used:%010X $$RED$$Unused:%010X$$FG$$\n", - sys_code_bp->size*PAGE_SIZE,sys_code_bp->allocated_u8s,UnusedBPMem(sys_code_bp); - "$$BLACK$$Data Heap:%010X Used:%010X $$RED$$Unused:%010X$$FG$$\n", - sys_data_bp->size*PAGE_SIZE,sys_data_bp->allocated_u8s,UnusedBPMem(sys_data_bp); + "$$BLACK$$Code Heap:%010X Used:%010X$$FG$$\n", + sys_code_bp->alloced_u8s,sys_code_bp->used_u8s; + "$$BLACK$$Data Heap:%010X Used:%010X$$FG$$\n", + sys_data_bp->alloced_u8s,sys_data_bp->used_u8s; } else - "$$BLACK$$Code/Data Heap:%010X Used:%010X $$RED$$Unused:%010X$$FG$$\n", - sys_code_bp->size*PAGE_SIZE,sys_code_bp->allocated_u8s,UnusedBPMem(sys_code_bp); + "$$BLACK$$Code/Data Heap:%010X Used:%010X$$FG$$\n", + sys_code_bp->alloced_u8s,sys_code_bp->used_u8s; for (i=0;ibp->size*PAGE_SIZE,dev.uncached_heap->used_u8s,UnusedBPMem(dev.uncached_heap->bp); + "$$BLACK$$dev.uncached_heap:%010X Used:%010X$$FG$$\n", + dev.uncached_heap->bp->alloced_u8s,dev.uncached_heap->used_u8s; "$$ID,-2$$\n"; Preempt(old_preempt); } diff --git a/Adam/Utils/ToHtml.CPP b/Adam/Utils/ToHtml.CPP index bc365c9..a21af6f 100644 --- a/Adam/Utils/ToHtml.CPP +++ b/Adam/Utils/ToHtml.CPP @@ -1,6 +1,6 @@ #help_index "DolDoc/Conversion" -//See $LK,"::/Doc/Acknowledgements.TXT"$. +//See $LK,"::/Doc/Credits.TXT"$. U0 HtmlPutS(CDoc *doc,I64 u32_attr,I64 *_old_u32_attr,U8 *st,I64 *_col,U8 *style_bitmap=NULL) { @@ -61,7 +61,7 @@ U0 HtmlPutS(CDoc *doc,I64 u32_attr,I64 *_old_u32_attr,U8 *st,I64 *_col,U8 *style } } -U8 *TSLinkCvt2(U8 *filename,I64 line_num) +U8 *TOSLinkCvt2(U8 *filename,I64 line_num) {// ::/ --> http://www.templeos.org/Wb/ //Make your own LinkCvt routine U8 *result=NULL,*st; @@ -74,7 +74,7 @@ U8 *TSLinkCvt2(U8 *filename,I64 line_num) return result; } -U8 *TSLinkCvt1(U8 *link_st) +U8 *TOSLinkCvt1(U8 *link_st) { static CDoc *bible=NULL; static I64 locks=0; @@ -85,7 +85,7 @@ U8 *TSLinkCvt1(U8 *link_st) case LK_FILE_LINE: case LK_PLAIN_LINE: case LK_FILE: - result=TSLinkCvt2(filename,num); + result=TOSLinkCvt2(filename,num); break; case -1: case LK_DEF: @@ -101,12 +101,12 @@ U8 *TSLinkCvt1(U8 *link_st) if (!bible) bible=Adam("DocRead(\"%s\");",filename); if (DocFind(bible,num,needle)) - result=TSLinkCvt2(filename,bible->cur_entry->y+1); + result=TOSLinkCvt2(filename,bible->cur_entry->y+1); LBtr(&locks,0); break; default: if (DocFileEd(i,filename,needle,&num,EDF_UNCOLLAPSE|EDF_BAIL)) - result=TSLinkCvt2(filename,num); + result=TOSLinkCvt2(filename,num); } Free(filename); Free(needle); @@ -117,7 +117,7 @@ U8 *TSLinkCvt1(U8 *link_st) public CDoc *Doc2Html(CDoc *doc_in, U8 *html_header=NULL, U8 *body_header=NULL,U8 *body_footer=NULL,Bool line_anchors=TRUE, - U8 (*link_cvt)(U8 *link_st)=&TSLinkCvt1) + U8 (*link_cvt)(U8 *link_st)=&TOSLinkCvt1) {//Cvt $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT"$ doc to HTML file. CDocEntry *doc_e,*style,*doc_e2; I64 i,y,old_y=MIN_I64,col,_old_u32_attr=-1,old_attr; @@ -279,14 +279,14 @@ public CDoc *Doc2Html(CDoc *doc_in, #help_index "Cmd Line (Typically);DolDoc/Conversion;DolDoc/Cmd Line (Typically)" public U0 ToHtml(U8 *_in_name,U8 *_out_name=NULL,U8 *html_header=NULL, U8 *body_header=NULL,U8 *body_footer=NULL,I64 width=80, - Bool line_anchors=TRUE,U8 (*link_cvt)(U8 *link_st)=&TSLinkCvt1) + Bool line_anchors=TRUE,U8 (*link_cvt)(U8 *link_st)=&TOSLinkCvt1) {//Convert $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT"$ file to HTML. //Supply your own link_cvt routine. U8 *in_name,*out_name; CDoc *doc_in,*doc_out; SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ - SetWinHorz(0,width-1); //Sets doc width for word wrap. + WinHorz(0,width-1); //Sets doc width for word wrap. in_name=DftExt(_in_name,"CPP.Z"), if (_out_name) diff --git a/Adam/Utils/ToTXT.CPP b/Adam/Utils/ToTXT.CPP index e77a4f1..a56617a 100644 --- a/Adam/Utils/ToTXT.CPP +++ b/Adam/Utils/ToTXT.CPP @@ -108,7 +108,7 @@ public U0 ToTXT(U8 *_in_name,U8 *_out_name=NULL,I64 width=70) CDoc *doc_in,*doc_out; SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ - SetWinHorz(0,width-1); //Sets doc width for word wrap. + WinHorz(0,width-1); //Sets doc width for word wrap. in_name=DftExt(_in_name,"TXT.Z"), if (_out_name) diff --git a/Adam/Utils2a.CPP b/Adam/Utils2a.CPP deleted file mode 100644 index aa5f829..0000000 --- a/Adam/Utils2a.CPP +++ /dev/null @@ -1,416 +0,0 @@ -#help_index "Memory/Blk Pool" -public I64 UnusedBPMem(CBlkPool *bp) -{//Count of unused bytes in bp. - I64 result=0,i; - CMemBlk *tempm; - - if (!bp) return 0; - - PUSHFD - CLI - while (LBts(&bp->locked_flags,BPlf_LOCKED)) - PAUSE - - tempm=bp->mem_free_lst; - while (tempm) { - if (tempm->mb_signature!=MBS_UNUSED_SIGNATURE_VAL) - Dbg("Corrupt Sys Memory"); - result+=tempm->pages; - tempm=tempm->next; - } - for (i=0;ifree_page_hash[i]; - while (tempm) { - if (tempm->mb_signature!=MBS_UNUSED_SIGNATURE_VAL) - Dbg("Corrupt Sys Memory"); - result+=tempm->pages; - tempm=tempm->next; - } - } - - for (i=0;i<64-PAGE_BITS;i++) { - tempm=bp->free_page_hash2[i]; - while (tempm) { - if (tempm->mb_signature!=MBS_UNUSED_SIGNATURE_VAL) - Dbg("Corrupt Sys Memory"); - result+=tempm->pages; - tempm=tempm->next; - } - } - LBtr(&bp->locked_flags,BPlf_LOCKED); - POPFD - return result*PAGE_SIZE; -} - -#help_index "Memory/Heap Ctrl" -I64 MemBlkLstSize(CHeapCtrl *hc) -{ - CMemBlk *m; - I64 result=0; - m=hc->next_mem_blk; - while (m!=&hc->next_mem_blk) { - result+=sizeof(CMemBlk); - m=m->next; - } - return result; -} - -public I64 UnusedHCMem(CHeapCtrl *hc) -{//Unused bytes alloced to a heap ctrl. - I64 result,i; - CMemUnusedAllocated *u; - - if (!hc) return 0; - - result=UnusedBPMem(hc->bp); - - PUSHFD - CLI - while (LBts(&hc->locked_flags,HClf_LOCKED)) - PAUSE - - for (i=0;i>3;i++) { - u=hc->heap_hash[i]; - while (u) { - result+=u->size; - u=u->next; - } - } - u=hc->malloc_free_lst; - while (u) { - result+=u->size; - u=u->next; - } - - LBtr(&hc->locked_flags,HClf_LOCKED); - POPFD - return result; -} - -#help_index "Memory/Task" -public I64 TaskAllocatedMem(CTask *task=NULL,Bool override_validate=FALSE) -{//Count of bytes alloced to a task, used+unused. - CMemBlk *m,*m1; - I64 result=0; - - if (!task) task=Fs; - if (!override_validate && !TaskValidate(task)) return 0; - - PUSHFD - CLI - while (LBts(&task->code_heap->locked_flags,HClf_LOCKED)) - PAUSE - if (task->code_heap!=task->data_heap) - while (LBts(&task->data_heap->locked_flags,HClf_LOCKED)) - PAUSE - - m=task->code_heap->next_mem_blk; - m1=&task->code_heap->next_mem_blk; - while (m!=m1) { - if (m->mb_signature!=MBS_USED_SIGNATURE_VAL) - Dbg("Corrupt Task Memory"); - result+=m->pages*PAGE_SIZE; - m=m->next; - } - - if (task->code_heap!=task->data_heap) { - m=task->data_heap->next_mem_blk; - m1=&task->data_heap->next_mem_blk; - while (m!=m1) { - if (m->mb_signature!=MBS_USED_SIGNATURE_VAL) - Dbg("Corrupt Task Memory"); - result+=m->pages*PAGE_SIZE; - m=m->next; - } - } - - if (task->code_heap!=task->data_heap) - LBtr(&task->data_heap->locked_flags,HClf_LOCKED); - LBtr(&task->code_heap->locked_flags,HClf_LOCKED); - POPFD - return result; -} - -public I64 TaskUnusedAllocatedMem(CTask *task=NULL,Bool override_validate=FALSE) -{//Count of bytes alloced to a task but unused. - I64 result=0,i; - CMemUnusedAllocated *uum; - if (!task) task=Fs; - if (!override_validate && !TaskValidate(task)) return 0; - - PUSHFD - CLI - while (LBts(&task->code_heap->locked_flags,HClf_LOCKED)) - PAUSE - if (task->data_heap!=task->code_heap) - while (LBts(&task->data_heap->locked_flags,HClf_LOCKED)) - PAUSE - - result+=MemBlkLstSize(task->code_heap); - for (i=0;i>3;i++) { - uum=task->code_heap->heap_hash[i]; - while (uum) { - result+=uum->size; - uum=uum->next; - } - } - uum=task->code_heap->malloc_free_lst; - while (uum) { - result+=uum->size; - uum=uum->next; - } - - if (task->data_heap!=task->code_heap) { - result+=MemBlkLstSize(task->data_heap); - for (i=0;i>3;i++) { - uum=task->data_heap->heap_hash[i]; - while (uum) { - result+=uum->size; - uum=uum->next; - } - } - uum=task->data_heap->malloc_free_lst; - while (uum) { - result+=uum->size; - uum=uum->next; - } - } - - if (task->data_heap!=task->code_heap) - LBtr(&task->data_heap->locked_flags,HClf_LOCKED); - LBtr(&task->code_heap->locked_flags,HClf_LOCKED); - POPFD - return result; -} - -public I64 TaskUsedMem(CTask *task=NULL,Bool override_validate=FALSE) -{//Count of bytes alloced to a task and in use. - I64 result=0; - if (!task) task=Fs; - if (!override_validate && !TaskValidate(task)) return 0; - result=task->code_heap->used_u8s; - if (task->data_heap!=task->code_heap) - result+=task->data_heap->used_u8s; - return result; -} - -public Bool HeapRep(CTask *task) -{//Report status of task's heap. - I64 i,cnt; - CMemUnusedAllocated *uum; - - if (!task || task==Fs) { - "Task can't HeapRep on self.\n"; - return FALSE; - } - if (!TaskValidate(task)) return FALSE; - - PUSHFD - CLI - while (LBts(&task->code_heap->locked_flags,HClf_LOCKED)) - PAUSE - if (task->data_heap!=task->code_heap) - while (LBts(&task->data_heap->locked_flags,HClf_LOCKED)) - PAUSE - - for (i=0;i>3;i++) { - cnt=0; - uum=task->code_heap->heap_hash[i]; - while (uum) { - cnt+=uum->size; - uum=uum->next; - } - if (task->data_heap!=task->code_heap) { - uum=task->data_heap->heap_hash[i]; - while (uum) { - cnt+=uum->size; - uum=uum->next; - } - } - if (cnt) - "%03X:%08X\n",i<<3,cnt; - } - '\n'; - - uum=task->code_heap->malloc_free_lst; - while (uum) { - "%X, ",uum->size; - uum=uum->next; - } - if (task->data_heap!=task->code_heap) { - uum=task->data_heap->malloc_free_lst; - while (uum) { - "%X, ",uum->size; - uum=uum->next; - } - } - - if (task->data_heap!=task->code_heap) - LBtr(&task->data_heap->locked_flags,HClf_LOCKED); - LBtr(&task->code_heap->locked_flags,HClf_LOCKED); - POPFD - - '\n'; -} - -#help_index "Memory/Task;Debugging/Heap" -public Bool IsInHeap(U8 *a,CTask *task=NULL,Bool lock=TRUE) -{//Check addr if on heap. - CMemBlk *m; - - if (!task) task=Fs; - if (!TaskValidate(task)) return FALSE; - - PUSHFD - CLI - if (lock) { - while (LBts(&task->code_heap->locked_flags,HClf_LOCKED)) - PAUSE - if (task->data_heap!=task->code_heap) - while (LBts(&task->data_heap->locked_flags,HClf_LOCKED)) - PAUSE - } - - m=task->code_heap->next_mem_blk; - while (m!=&task->code_heap->next_mem_blk) { - if (a>=m && apages*PAGE_SIZE) { - if (lock) - LBtr(&task->code_heap->locked_flags,HClf_LOCKED); - POPFD - return TRUE; - } - m=m->next; - } - if (task->data_heap!=task->code_heap) { - m=task->data_heap->next_mem_blk; - while (m!=&task->code_heap->next_mem_blk) { - if (a>=m && apages*PAGE_SIZE) { - if (lock) - LBtr(&task->data_heap->locked_flags,HClf_LOCKED); - POPFD - return TRUE; - } - m=m->next; - } - } - - if (lock) { - LBtr(&task->code_heap->locked_flags,HClf_LOCKED); - if (task->data_heap!=task->code_heap) - LBtr(&task->data_heap->locked_flags,HClf_LOCKED); - } - POPFD - - return FALSE; -} - -public Bool HeapWalk(CTask *task=NULL) -{//Check integrity of task's heap. - I64 i; - CMemUnusedAllocated *uum; - Bool result=TRUE; - - if (!task) task=Fs; - if (!TaskValidate(task)) return FALSE; - - PUSHFD - CLI - while (LBts(&task->code_heap->locked_flags,HClf_LOCKED)) - PAUSE - if (task->data_heap!=task->code_heap) - while (LBts(&task->data_heap->locked_flags,HClf_LOCKED)) - PAUSE - - for (i=0;i>3;i++) { - uum=task->code_heap->heap_hash[i]; - while (uum) { - if (!IsInHeap(uum,task,FALSE)) - result=FALSE; - uum=uum->next; - } - if (task->data_heap!=task->code_heap) { - uum=task->data_heap->heap_hash[i]; - while (uum) { - if (!IsInHeap(uum,task,FALSE)) - result=FALSE; - uum=uum->next; - } - } - } - - uum=task->code_heap->malloc_free_lst; - while (uum) { - if (!IsInHeap(uum,task,FALSE)) - result=FALSE; - uum=uum->next; - } - - if (task->data_heap!=task->code_heap) { - uum=task->data_heap->malloc_free_lst; - while (uum) { - if (!IsInHeap(uum,task,FALSE)) - result=FALSE; - uum=uum->next; - } - } - -#if _CFG_HEAP_DBG - CMemUsedAllocated *um,*um1; - um1=(&task->code_heap->next_um)(U8 *)-offset(CMemUsedAllocated.next); - um=um1->next; - while (um!=um1) { - if (!IsInHeap(um,task,FALSE)) - result=FALSE; - um=um->next; - } - if (task->data_heap!=task->code_heap) { - um1=(&task->data_heap->next_um)(U8 *)-offset(CMemUsedAllocated.next); - um=um1->next; - while (um!=um1) { - if (!IsInHeap(um,task,FALSE)) - result=FALSE; - um=um->next; - } - } -#endif - - if (task->data_heap!=task->code_heap) - LBtr(&task->data_heap->locked_flags,HClf_LOCKED); - LBtr(&task->code_heap->locked_flags,HClf_LOCKED); - POPFD - return result; -} - -#help_index "Info;Task" -U0 TaskRepTask(CTask *task,I64 indent) -{ - CTask *task1; - U8 *st,*desc=MStrUtil(task->task_title,SUF_SAFE_DOLLAR); - st=MStrPrint("$$MA,T=\"%08X\",LM=\"Kill(0x%X);\n\",$$",task,task,task); - "%h*c%s $$TX,\"%Q...\",SCX=16$$ Mem:%08X\n",indent,CH_SPACE, - st,desc,TaskAllocatedMem(task); - "%h*cFlags:%04X:%04X Time:%0.2fm\n",indent+2,CH_SPACE, - task->task_flags,task->display_flags, - task->total_time/60.0/cnts.time_stamp_freq_initial; - Free(st); - Free(desc); - task1=task->next_child_task; - while (task1!=(&task->next_child_task)(U8 *)-offset(CTask.next_sibling_task)) { - TaskRepTask(task1,indent+2); - task1=task1->next_sibling_task; - } -} - -public U0 TaskRep() -{//Report current tasks on all cores. - I64 i; - CCPU *c; - PUSHFD - CLI - for (i=0;iseth_task,2); - } - POPFD -} diff --git a/Adam/WallPaper.CPP b/Adam/WallPaper.CPP index f87841e..b914c2d 100644 Binary files a/Adam/WallPaper.CPP and b/Adam/WallPaper.CPP differ diff --git a/Adam/Win2a.CPP b/Adam/WinA.CPP similarity index 89% rename from Adam/Win2a.CPP rename to Adam/WinA.CPP index 7a6b7b6..d6122bd 100644 --- a/Adam/Win2a.CPP +++ b/Adam/WinA.CPP @@ -5,9 +5,9 @@ CIPStateGlbls old_ip={IP_NULL,{-1000,-1000,0},{-1000,-1000,0},{-1000,-1000,0}, 0,(MAX_I32+1)>>3,0.0,GetTSC,0.350,0,0, FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE}; -public CWinMgrGlbls winmgr={0,0,0,15,15,NULL,NULL,FALSE,FALSE,FALSE,FALSE}; +public CWinMgrGlbls winmgr={0,0,0,WMG_FPS,tS,NULL,NULL,FALSE,FALSE,FALSE}; winmgr.t=CAlloc(sizeof(CWinMgrTimingGlbls)); -winmgr.t->last_refresh_time=tS; +winmgr.t->last_calc_idle_time=tS; #define PROGRESS_BAR_HEIGHT 20 #define PROGRESS_BAR_WIDTH (3*GR_WIDTH/4) @@ -90,7 +90,7 @@ U0 CtrlAltG(I64 sc) else PopUp("WinGrid(TRUE);"); } -SetCtrlAltLetCB('G',&CtrlAltG,"Sys/Grid On or Off"); +CtrlAltLetCBSet('G',&CtrlAltG,"Sys/Grid On or Off"); CTask *ext_ASCII_task; U0 ExtendedASCII() @@ -99,11 +99,11 @@ U0 ExtendedASCII() CDoc *doc=DocNew; DocPrint(doc,"Select Char and Press \n$$LTBLUE$$"); for (i=0;i<256;i++) { - if (i>=CH_SHIFT_SPACE && i!=127) { + if (i>=CH_SHIFT_SPACE && i!=0x7F) { if (i==CH_SHIFT_SPACE) - DocPrint(doc,"$$MU-UL,\"\\37\",LE=%d$$",i); + DocPrint(doc,"$$MU-UL,\"\\x1F\",LE=%d$$",i); else if (i=='$$') - DocPrint(doc,"$$MU-UL,\"\\44\",LE=%d$$",i); + DocPrint(doc,"$$MU-UL,\"\\x24\",LE=%d$$",i); else if (i=='\"'||i=='\\') DocPrint(doc,"$$MU-UL,\"\\%c\",LE=%d$$",i,i); else @@ -124,7 +124,7 @@ U0 CtrlAltA(I64) if (ext_ASCII_task=sys_focus_task) Spawn(&ExtendedASCII); } -SetCtrlAltLetCB('A',&CtrlAltA,"Sys/Extended ASCII"); +CtrlAltLetCBSet('A',&CtrlAltA,"Sys/Extended ASCII"); public U0 WinScrollNull(CTask *task,CD3I64 *s) {//If panning a window has been done, restore to zero. @@ -152,7 +152,7 @@ U0 DrawInputPtr(CDC *dc) y=ip.pos.y; POPFD if (ip.show && ip.dev!=IP_NULL) { - if (!sys_bios_gr_mode) //if text mode + if (!Bt(&sys_run_level,RLf_VGA)) //if text mode gr.text_base[ip.pos_text.x+ip.pos_text.y*TEXT_COLS]^=0x7F00; else { if (gr.fp_draw_input_ptr) { @@ -223,12 +223,10 @@ U0 WinIPUpdate() } } -CTask *WinRefocus() -{ - CTask *task; +public CTask *WinRefocus(CTask *task=NULL) +{//Reset the focus task if NULL. PUSHFD CLI - task=sys_focus_task; if (!task) { task=sys_winmgr_task->last_task; while (TaskValidate(task) && task!=sys_winmgr_task) { @@ -313,18 +311,19 @@ public I64 WinToTop(CTask *task=NULL,Bool update_z_buf=TRUE) } ext[EXT_WIN_TO_TOP]=&WinToTop; -public U0 WinFocus(CTask *task=NULL) +public CTask *WinFocus(CTask *task=NULL) {//Set task as focus task. PUSHFD CLI if (!TaskValidate(task)||Bt(&task->win_inhibit,WIf_SELF_FOCUS)) - task=WinRefocus; + task=WinRefocus(sys_focus_task); WinToTop(sys_focus_task=task); POPFD + return sys_focus_task; } ext[EXT_WIN_FOCUS]=&WinFocus; -public Bool SetWinHorz(I64 left,I64 right,CTask *task=NULL) +public Bool WinHorz(I64 left,I64 right,CTask *task=NULL) {//Set task's win left and right columns. I64 d=right-left; if (!task) task=Fs; @@ -358,7 +357,7 @@ public Bool SetWinHorz(I64 left,I64 right,CTask *task=NULL) } } -public Bool SetWinVert(I64 top,I64 bottom,CTask *task=NULL) +public Bool WinVert(I64 top,I64 bottom,CTask *task=NULL) {//Set task's win top and bottom rows. I64 d=bottom-top; if (!task) task=Fs; @@ -419,16 +418,16 @@ public U0 WinTileHorz() c=4; vert_size=(TEXT_ROWS-1)/c; - SetWinHorz(1-no_border,TEXT_COLS-2+no_border,task); - SetWinVert((i&3)*vert_size+2-no_border,(i&3+1)*vert_size+no_border,task); + WinHorz(1-no_border,TEXT_COLS-2+no_border,task); + WinVert((i&3)*vert_size+2-no_border,(i&3+1)*vert_size+no_border,task); last_task=task; if (i&3==3) - SetWinVert(task->win_top,TEXT_ROWS-2,task); + WinVert(task->win_top,TEXT_ROWS-2,task); i++; } task=task->last_task; } while (task!=sys_winmgr_task); - SetWinVert(last_task->win_top,TEXT_ROWS-2,last_task); + WinVert(last_task->win_top,TEXT_ROWS-2,last_task); POPFD } @@ -457,16 +456,16 @@ public U0 WinTileVert() else if (c>4) c=4; horz_size=TEXT_COLS/c; - SetWinHorz((i&3)*horz_size+1-no_border,(i&3+1)*horz_size-1+no_border,task); - SetWinVert(2-no_border,TEXT_ROWS-2+no_border,task); + WinHorz((i&3)*horz_size+1-no_border,(i&3+1)*horz_size-1+no_border,task); + WinVert(2-no_border,TEXT_ROWS-2+no_border,task); last_task=task; if (i&3==3) - SetWinHorz(task->win_left,TEXT_COLS-2,task); + WinHorz(task->win_left,TEXT_COLS-2,task); i++; } task=task->last_task; } while (task!=sys_winmgr_task); - SetWinHorz(last_task->win_left,TEXT_COLS-2,last_task); + WinHorz(last_task->win_left,TEXT_COLS-2,last_task); POPFD } @@ -478,8 +477,8 @@ public U0 WinMax(CTask *task=NULL) PUSHFD CLI //TODO Multiprocessor safe no_border=Bt(&task->display_flags,DISPLAYf_NO_BORDER); - SetWinHorz(1-no_border,TEXT_COLS-2+no_border,task); - SetWinVert(2-no_border,TEXT_ROWS-2+no_border,task); + WinHorz(1-no_border,TEXT_COLS-2+no_border,task); + WinVert(2-no_border,TEXT_ROWS-2+no_border,task); WinToTop(task); POPFD } diff --git a/Adam/Win2b.CPP b/Adam/WinB.CPP similarity index 87% rename from Adam/Win2b.CPP rename to Adam/WinB.CPP index fa0676b..628b4db 100644 --- a/Adam/Win2b.CPP +++ b/Adam/WinB.CPP @@ -7,8 +7,8 @@ public U0 WinMgrSync(I64 cnt=1,Bool force=FALSE) //2 Cnt Make Sure to do a Full Refresh // and Set Cur Pos. Bool old_preempt=Preempt(OFF), - old_full_refresh, - old_idle=LBts(&Fs->task_flags,TASKf_IDLE); + old_full_refresh, + old_idle=LBts(&Fs->task_flags,TASKf_IDLE); CDoc *old_doc=DocPut; I64 update_cnt; while (Bt(&sys_semas[SYS_SEMA_REFRESH_IN_PROGRESS],0)) { @@ -189,16 +189,14 @@ I64 WinQueIPMsgs(Bool que) return msg_code; } -I64 WinCalcRefreshTimeOut(Bool was_forced) +U0 WinCalcIdles() { - F64 d,d1; - I64 i,k,total, - total_jiffies,idle_pt_hits[MP_MAX_PROCESSORS]; + F64 calc_idle_time; + I64 i,k,total_jiffies,total_jiffies_delta,idle_pt_hits[MP_MAX_PROCESSORS]; CCPU *c; CWinMgrTimingGlbls *t=winmgr.t; - t->refresh_skips++; - if ((t->refresh_time=tS)-t->last_refresh_time>.25) { + if ((t->calc_idle_delta_time=(calc_idle_time=tS)-t->last_calc_idle_time)>.25) { PUSHFD CLI total_jiffies=cpu_structs[0].total_jiffies; @@ -206,67 +204,35 @@ I64 WinCalcRefreshTimeOut(Bool was_forced) idle_pt_hits[i]=cpu_structs[i].idle_pt_hits; POPFD - t->refresh_delta_time=t->refresh_time-t->last_refresh_time; - total=total_jiffies-t->last_total_jiffies; + total_jiffies_delta=total_jiffies-t->last_total_jiffies; for (i=0;irefresh_delta_time>0) { - if (total) { - if ((k=idle_pt_hits[i]-t->last_idle_pt_hits[i])>=0) { - d1=ToF64(k)/total; - d=ToF64(k*cnts.time_stamp_freq) - /(JIFFY_FREQ*t->refresh_delta_time); - if (dlast_idle_pt_hits[i])>=0) - d1=ToF64(k*cnts.time_stamp_freq) - /(JIFFY_FREQ*t->refresh_delta_time); - } - } + if (total_jiffies_delta && (k=idle_pt_hits[i]-t->last_idle_pt_hits[i])>=0) + c->idle_factor=Clamp(ToF64(k)/total_jiffies_delta,0.01,0.99); + else + c->idle_factor=0.01; t->last_idle_pt_hits[i]=idle_pt_hits[i]; - c->idle_factor=Clamp(d1,0.01,0.99); } t->last_total_jiffies=total_jiffies; - t->last_refresh_time=t->refresh_time; - if (!was_forced) { - if (winmgr.first) { - d=Gs->idle_factor; - d1=(t->last_refresh_end_time-t->last_refresh_start_time)/ - (t->refresh_delta_time/t->refresh_skips); - if (d1<0.2) - winmgr.desired_fps*=1.25; - else if (d<=0.0) - winmgr.desired_fps=15.0; - else if (d<0.02) { - d=15.0/winmgr.fps; - winmgr.desired_fps=d*15.0+0.5*(1.0-d)*winmgr.desired_fps; - } else if (d<0.99) { - if (d=(1.0-d)`0.25) - winmgr.desired_fps*= 0.8`0.25/d; - } else - winmgr.desired_fps=30.0; - t->refresh_cnt++; - t->refresh_skips=0; - } else { - winmgr.desired_fps=30.0; - winmgr.first=TRUE; - } - } + t->last_calc_idle_time=calc_idle_time; + t->calc_idle_cnt++; } - winmgr.desired_fps=Clamp(winmgr.desired_fps,15.0,30.0); - return cnts.jiffies+JIFFY_FREQ/winmgr.desired_fps; } I64 WinMgrSleep(Bool flush_msgs=FALSE) { - static Bool was_forced=FALSE; I64 timeout_val,msg_code=0; CCtrl *c; Bool que; + F64 t,t_delta; TimeStampFreqCal; + if ((t_delta=(t=tS)-winmgr.last_refresh_tS)>0.01) + winmgr.fps=Max(1.0/t_delta,1); + else + winmgr.fps=99; + winmgr.last_refresh_tS=t; + WinCalcIdles; if (!flush_msgs && winmgr.old_focus_task!=sys_focus_task) { TaskMsg(winmgr.old_focus_task,0,MSG_FOCUS,FALSE,0,0); @@ -293,20 +259,17 @@ I64 WinMgrSleep(Bool flush_msgs=FALSE) } msg_code=WinQueIPMsgs(que); } else { - WinRefocus; + WinRefocus(sys_focus_task); if (!TaskValidate(sys_focus_task)) FifoI64Flush(kbd.scan_code_fifo); } - if (sys_focus_task) LBtr(&sys_focus_task->task_flags,TASKf_HAS_SONG); - - timeout_val=WinCalcRefreshTimeOut(was_forced); WinIPUpdate; + + timeout_val=cnts.jiffies+JIFFY_FREQ/WMG_FPS; LBts(&sys_semas[SYS_SEMA_REFRESH_IN_PROGRESS],0); - winmgr.t->last_refresh_start_time=tS; GrUpdateScreen; - winmgr.t->last_refresh_end_time=tS; LBtr(&sys_semas[SYS_SEMA_REFRESH_IN_PROGRESS],0); if (sys_focus_task && !Bt(&sys_focus_task->task_flags,TASKf_HAS_SONG)) { @@ -322,17 +285,17 @@ I64 WinMgrSleep(Bool flush_msgs=FALSE) } winmgr.updates++; if (!mouse.install_attempts) - SleepUntil(timeout_val); + SleepUntil(timeout_val); //Just for before mouse install attempt at boot. else do { KbdMouseHandler(FALSE,TRUE); SleepUntil(MinI64(timeout_val,cnts.jiffies+JIFFY_FREQ/500)); - } while (!Bt(&sys_semas[SYS_SEMA_FORCE_WINMGR],0)&&cnts.jiffieswin_left!=task->win_old_left || - task->win_top!=task->win_old_top) - TaskMsg(task,0, - MSG_MOVE,task->win_left,task->win_top,0); + if (task->win_left!=task->win_old_left || task->win_top!=task->win_old_top) + TaskMsg(task,0,MSG_MOVE,task->win_left,task->win_top,0); if (task->win_right-task->win_left!=task->win_old_right-task->win_old_left || task->win_bottom-task->win_top!=task->win_old_bottom-task->win_old_top) TaskMsg(task,0, @@ -389,13 +350,12 @@ Bool WinKeyNavMenu() CMenu *m; CMenuEntry *tempme; CTask *focus=MenuTask; - if (Bt(kbd.down_bitmap,SC_GUI) && - focus && (m=focus->cur_menu)) { + if (Bt(kbd.down_bitmap,SC_GUI) && focus && (m=focus->cur_menu)) { winmgr.show_menu=TRUE; sys_cur_submenu_entry=NULL; old_pos.x=ip.pos.x; old_pos.y=ip.pos.y; ip.pos.x=new_pos.x=ip.pos.y=new_pos.y=0; - while (m->mu_signature==MENU_SIGNATURE_VAL && Bt(kbd.down_bitmap,SC_GUI)) { + while (Bt(kbd.down_bitmap,SC_GUI)) { old_key_cnt=kbd.cnt; if (Bt(kbd.down_bitmap,SC_CURSOR_LEFT)) { while (Bt(kbd.down_bitmap,SC_CURSOR_LEFT) && kbd.cnt==old_key_cnt) @@ -466,8 +426,8 @@ U0 WinMgrTask(I64) old_flags=GetRFlags; Bool has_border; CCtrl *c; - SetWinHorz(0,TEXT_COLS-1); - SetWinVert(0,TEXT_ROWS-1); + WinHorz(0,TEXT_COLS-1); + WinVert(0,TEXT_ROWS-1); LBts(&Fs->display_flags,DISPLAYf_NO_BORDER); LBts(&Fs->display_flags,DISPLAYf_SHOW); gr.dc->win_task=Fs; @@ -703,7 +663,7 @@ wmt_start: if (!Bt(&task->win_inhibit,WIf_SELF_IP_L)&& (!TaskValidate(sys_focus_task)||!Bt(&sys_focus_task->win_inhibit,WIf_FOCUS_TASK_IP_L))) { if (!old_ip.lb && ip.lb) { - if (doc=SetCursorPos(task,ip.pos_text.x,ip.pos_text.y)) { + if (doc=WinCursorPosSet(task,ip.pos_text.x,ip.pos_text.y)) { DocLock(doc); if (doc->doc_signature==DOC_SIGNATURE_VAL) { doc_e=doc->cur_entry; @@ -721,7 +681,7 @@ wmt_start: if (!Bt(&task->win_inhibit,WIf_SELF_IP_R)&& (!TaskValidate(sys_focus_task)||!Bt(&sys_focus_task->win_inhibit,WIf_FOCUS_TASK_IP_R))) { if (!old_ip.rb && ip.rb) { - if (SetCursorPos(task,ip.pos_text.x,ip.pos_text.y)) { + if (WinCursorPosSet(task,ip.pos_text.x,ip.pos_text.y)) { old_ip.rb=TRUE; goto wmt_start; } @@ -749,7 +709,7 @@ wmt_start: if (!Bt(&task->win_inhibit,WIf_SELF_IP_L)&& (!TaskValidate(sys_focus_task)||!Bt(&sys_focus_task->win_inhibit,WIf_FOCUS_TASK_IP_L))) { if (old_ip.lb && !ip.lb) { - if (doc=SetCursorPos(task,ip.pos_text.x,ip.pos_text.y,FALSE)) { + if (doc=WinCursorPosSet(task,ip.pos_text.x,ip.pos_text.y,FALSE)) { do msg_code=WinMgrSleep; while (TaskValidate(task) && (ip.lb || ip.left_dbl_time)); @@ -783,7 +743,7 @@ wmt_start: if (!Bt(&task->win_inhibit,WIf_SELF_IP_R)&& (!TaskValidate(sys_focus_task)||!Bt(&sys_focus_task->win_inhibit,WIf_FOCUS_TASK_IP_R))) { if (old_ip.rb && !ip.rb) { - if (doc=SetCursorPos(task,ip.pos_text.x,ip.pos_text.y,FALSE)) { + if (doc=WinCursorPosSet(task,ip.pos_text.x,ip.pos_text.y,FALSE)) { do msg_code=WinMgrSleep; while (TaskValidate(task) && (ip.rb || ip.right_dbl_time)); @@ -829,8 +789,8 @@ wmt_start: if (ip.lb) { WinToTop(task); while (ip.lb && TaskValidate(task)) { - SetWinHorz(ip.pos_text.x-x,task->win_width-1+ip.pos_text.x-x,task); - SetWinVert(ip.pos_text.y+1,task->win_height+ip.pos_text.y,task); + WinHorz(ip.pos_text.x-x,task->win_width-1+ip.pos_text.x-x,task); + WinVert(ip.pos_text.y+1,task->win_height+ip.pos_text.y,task); WinChkMoveSize(task); WinMgrSleep; } @@ -844,8 +804,8 @@ wmt_start: if (ip.lb) { WinToTop(task); while (ip.lb && TaskValidate(task)) { - SetWinHorz(ip.pos_text.x+1,task->win_width+ip.pos_text.x,task); - SetWinVert(ip.pos_text.y-y,task->win_height-1+ip.pos_text.y-y,task); + WinHorz(ip.pos_text.x+1,task->win_width+ip.pos_text.x,task); + WinVert(ip.pos_text.y-y,task->win_height-1+ip.pos_text.y-y,task); WinChkMoveSize(task); WinMgrSleep; } @@ -857,8 +817,8 @@ wmt_start: if (ip.lb) { WinToTop(task); while (ip.lb && TaskValidate(task)) { - SetWinHorz(task->win_left,ip.pos_text.x-1,task); - SetWinVert(task->win_top,ip.pos_text.y-1,task); + WinHorz(task->win_left,ip.pos_text.x-1,task); + WinVert(task->win_top,ip.pos_text.y-1,task); WinChkMoveSize(task); WinMgrSleep; } @@ -871,7 +831,7 @@ wmt_start: if (ip.lb) { WinToTop(task); while (ip.lb && TaskValidate(task)) { - SetWinVert(task->win_top,ip.pos_text.y-1,task); + WinVert(task->win_top,ip.pos_text.y-1,task); WinChkMoveSize(task); WinMgrSleep; } @@ -884,7 +844,7 @@ wmt_start: if (ip.lb) { WinToTop(task); while (ip.lb && TaskValidate(task)) { - SetWinHorz(task->win_left,ip.pos_text.x-1,task); + WinHorz(task->win_left,ip.pos_text.x-1,task); WinChkMoveSize(task); WinMgrSleep; } diff --git a/Adam/WordStat/WSMain.CPP b/Adam/WordStat/WSMain.CPP deleted file mode 100644 index 3da3f81..0000000 --- a/Adam/WordStat/WSMain.CPP +++ /dev/null @@ -1,688 +0,0 @@ -#help_index "WordStat" - -CHashWS *WSHashAdd(U8 *w) -{ - CHashWS *tempw=HashFind(w,ws.hash_table,HTT_WORD); - if (tempw) { - tempw->hits++; - return tempw; - } - tempw=ACAlloc(sizeof(CHashWS)); - tempw->str=AStrNew(w); - tempw->type=HTT_WORD; - tempw->use_cnt=1; - tempw->hits=1; - tempw->num=-1; - HashAdd(tempw,ws.hash_table); - ws.num_words++; - return tempw; -} - -U0 WSSidesInit(CWSMatrix *m) -{ - I64 i; - CWS *tempa; - m->n=0; - for (i=0;iside[i].next=m->side[i].last=&m->side[i].next; - m->side[i].const_minus_one=-1; - m->side[i].row_hits=0; - m->side[i].col_hits=0; - tempa=AMAlloc(sizeof(CWS)); - ws.structs_size+=MSize2(tempa); - tempa->subs[0].hits=0; - tempa->subs[0].repeats=ws.num_matrix_words; - tempa->entries=ws.num_matrix_words; - tempa->substructs=1; - QueIns(tempa,m->side[i].last); - } -} - -CWS *WSStructFind(CWSMatrix *m,I64 col,I64 row, - I64 *_row_base,I64 *_substruct) -{ - CWS *tempa; - I64 row_base,i,j; - - if (row>=ws.num_matrix_words || - col>=ws.num_matrix_words) - return NULL; - if (row>1) { - tempa=m->side[col].next; - row_base=0; - j=row; - while (row>=(i=tempa->entries)) { - row-=i; - tempa=tempa->next; - } - row_base+=j-row; - for (*_substruct=0;row>=tempa->subs[*_substruct].repeats;*_substruct=*_substruct+1) { - row-=tempa->subs[*_substruct].repeats; - row_base+=tempa->subs[*_substruct].repeats; - } - } else { - row=ws.num_matrix_words-row; - tempa=m->side[col].last; - row_base=ws.num_matrix_words; - j=row; - while (row>(i=tempa->entries)) { - row-=i; - tempa=tempa->last; - } - row_base+=j-row; - for (*_substruct=tempa->substructs-1;row>tempa->subs[*_substruct].repeats; - *_substruct=*_substruct-1) { - row-=tempa->subs[*_substruct].repeats; - row_base-=tempa->subs[*_substruct].repeats; - } - row_base-=tempa->subs[*_substruct].repeats; - } - *_row_base=row_base; - return tempa; -} - -public I64 WSHitsGet(CWSMatrix *m,I64 col,I64 row) -{//Look-up markov stats for word followed by word. - I64 row_base,substruct; - CWS *tempa; - if (row>=ws.num_matrix_words || - col>=ws.num_matrix_words) - return 0; - tempa=WSStructFind(m,col,row, - &row_base,&substruct); - return tempa->subs[substruct].hits; -} - -CWSSub *WSNext(CWSSub *s,CWS **_parent) -{ - I64 i=(s(U8 *)-(&(*_parent)->subs)(U8 *))/sizeof(CWSSub)+1; - if (i>=(*_parent)->substructs) { - i=0; - *_parent=(*_parent)->next; - if ((*_parent)->substructs==-1) - return NULL; - } - return &(*_parent)->subs[i]; -} - -CWSSub *WSLast(CWSSub *s,CWS **_parent) -{ - I64 i=(s(U8 *)-(&(*_parent)->subs)(U8 *))/sizeof(CWSSub)-1; - if (i<0) { - *_parent=(*_parent)->last; - if ((*_parent)->substructs==-1) - return NULL; - i=(*_parent)->substructs-1; - } - return &(*_parent)->subs[i]; -} - -U0 WSRem(CWSSub *s,CWS *parent) -{ - I64 i=(s(U8 *)-(&parent->subs)(U8 *))/sizeof(CWSSub); - if (i<0 || i>=WS_SUBSTRUCTS_PER_STRUCT || parent->substructs<1) - return; - if (parent->substructs==1) { - QueRem(parent); - ws.structs_size-=MSize2(parent); - Free(parent); - } else { - parent->entries-=s->repeats; - parent->substructs--; - MemCpy(&parent->subs[i],&parent->subs[i+1], - (parent->substructs-i)*sizeof(CWSSub)); - } -} - -CWSSub *WSIns(CWSSub *s,CWS **_parent,CWSSub *last) -{ - CWS *tempa,*parent=*_parent; - I64 j,k,i=(last(U8 *)-(&parent->subs)(U8 *))/sizeof(CWSSub)+1; - if (i>=WS_SUBSTRUCTS_PER_STRUCT) { - i=0; - parent=parent->next; - *_parent=parent; - if (parent->substructs==-1) { - tempa=AMAlloc(sizeof(CWS)); - ws.structs_size+=MSize2(tempa); - QueIns(tempa,parent->last); - parent=tempa; - *_parent=parent; - tempa->entries=0; - tempa->substructs=0; - } - } - if (parent->substructs==WS_SUBSTRUCTS_PER_STRUCT) { - tempa=parent->next; - if (tempa->substructs==-1 || tempa->substructs==WS_SUBSTRUCTS_PER_STRUCT) { - tempa=AMAlloc(sizeof(CWS)); - ws.structs_size+=MSize2(tempa); - tempa->entries=0; - tempa->substructs=0; - QueIns(tempa,parent); - k=0; - for (j=i;jsubstructs;j++) { - MemCpy(&tempa->subs[k],&parent->subs[j],sizeof(CWSSub)); - tempa->entries+=tempa->subs[k++].repeats; - tempa->substructs++; - } - parent->entries-=tempa->entries; - parent->substructs-=tempa->substructs; - } else { - for (j=tempa->substructs-1;j>=0;j--) - MemCpy(&tempa->subs[j+1],&tempa->subs[j],sizeof(CWSSub)); - MemCpy(&tempa->subs[0], - &parent->subs[WS_SUBSTRUCTS_PER_STRUCT-1], - sizeof(CWSSub)); - parent->entries-=tempa->subs[0].repeats; - parent->substructs--; - tempa->entries+=tempa->subs[0].repeats; - tempa->substructs++; - for (j=WS_SUBSTRUCTS_PER_STRUCT-2;j>=i;j--) - MemCpy(&parent->subs[j+1], - &parent->subs[j],sizeof(CWSSub)); - } - } else { - for (j=parent->substructs-1;j>=i;j--) - MemCpy(&parent->subs[j+1], - &parent->subs[j],sizeof(CWSSub)); - } - parent->entries+=s->repeats; - parent->substructs++; - MemCpy(&parent->subs[i],s,sizeof(CWSSub)); - return &parent->subs[i]; -} - -CWSSub *WSCondense(CWSSub *s,CWS **_parent) -{ - CWSSub *temps,*temps_l,*temps_n; - CWS *tempa_l,*tempa_n; - if ((*_parent)->substructs==-1) - return NULL; - temps=s; - tempa_l=*_parent; - temps_l=WSLast(temps,&tempa_l); - if (temps_l && temps_l->hits==temps->hits) { - temps_l->repeats+=temps->repeats; - tempa_l->entries+=temps->repeats; - WSRem(temps,*_parent); - *_parent=tempa_l; - temps=temps_l; - } - tempa_n=*_parent; - temps_n=WSNext(temps,&tempa_n); - if (temps_n && temps_n->hits==temps->hits) { - temps->repeats=temps->repeats+temps_n->repeats; - (*_parent)->entries=(*_parent)->entries+temps_n->repeats; - WSRem(temps_n,tempa_n); - } - return temps; -} - -I64 WSHitsInc(CWSMatrix *m,I64 col,I64 row) -{ - I64 row_base,substruct,repeats; - CWSSub sn,*temps,*temps1,*temps_l; - CWS *tempa,*tempa1,*tempa_l; - - if (row>=ws.num_matrix_words || - col>=ws.num_matrix_words) - return 0; - tempa=WSStructFind(m,col,row,&row_base,&substruct); - temps=&tempa->subs[substruct]; - repeats=temps->repeats; - if (repeats==1) { - temps->hits++; - temps=WSCondense(temps,&tempa); - } else { - if (row==row_base) { - temps->repeats--; - tempa->entries--; - sn.hits=1; - sn.repeats=1; - tempa_l=tempa; - if (!(temps_l=WSLast(&tempa->subs[substruct],&tempa_l))) { - tempa_l=tempa->last; //header - temps_l=&tempa_l->subs[WS_SUBSTRUCTS_PER_STRUCT-1]; - } - temps=WSIns(&sn,&tempa_l,temps_l); - temps=WSCondense(temps,&tempa_l); - } else if (row==repeats-1+row_base) { - temps->repeats--; - tempa->entries--; - sn.hits=1; - sn.repeats=1; - temps=WSIns(&sn,&tempa,temps); - temps=WSCondense(temps,&tempa); - } else { - tempa->entries-=repeats; - sn.hits=temps->hits+1; - sn.repeats=1; - tempa1=tempa; - temps1=temps; - temps=WSIns(&sn,&tempa1,temps1); - temps1->repeats=row-row_base; - tempa->entries+=temps1->repeats; - sn.repeats=row_base+repeats-(row+1); - sn.hits=temps1->hits; - WSIns(&sn,&tempa1,temps); - } - } - m->n++; - m->side[col].col_hits++; - m->side[row].row_hits++; - return temps->hits; -} - -U0 WSSingleFileAdd(U8 *buf,I64 pass) -{ - I64 ch; - U8 *ptr=buf,*ptr2,*ptr3; - CHashWS *cur_ptr,*last_ptr=NULL; - while (TRUE) { - while (TRUE) { - if (ch=*ptr++) { - if (Bt(chars_bitmap_alpha_numeric,ch)) - break; - } else - return; - } - ptr3=ptr; - ptr2=ptr; - ptr--; - while (TRUE) { - if (ch=*ptr2++) { - if (Bt(chars_bitmap_alpha_numeric,ch)) - *ptr3++=ch; - else if (ch!=CH_CURSOR) - break; - } else { - ptr2--; - break; - } - } - *ptr3=0; - if (pass==1) - WSHashAdd(ptr); - else { - cur_ptr=HashFind(ptr,ws.hash_table,HTT_WORD); - if (cur_ptr->num<0) - cur_ptr=NULL; - else - if (last_ptr) - WSHitsInc(ws.matrix,last_ptr->num,cur_ptr->num); - last_ptr=cur_ptr; - } - ptr=ptr2; - } -} - -I64 WSCompare(CHashWS *e1,CHashWS *e2) -{ - I64 r; - if (!(r=e2->hits - e1->hits)) - r=StrCmp(e1->str,e2->str); - return r; -} - -I64 WSSkipCrap(U8 *src,I64 len) -{ - I64 j; - j=len-1; - while (j>=0) { - if (Bt(chars_bitmap_alpha_numeric,src[j])) - break; - else - j--; - } - return j+1; -} - -I64 WSPriorWordInStr(U8 *src,U8 *dst,I64 len,I64 buf_size) -{ - I64 i,j=0,k; - Bool cont=TRUE; - i=len-1; - while (i>=0 && cont) { - if (!Bt(chars_bitmap_alpha_numeric,src[i])) - cont=FALSE; - else - i--; - } - if (i>=-1 && len>0) - for (k=i+1;kstr; - len=StrLen(s); - if (len>ws.partial_len) - Auto(s+ws.partial_len); - } -} - -U0 WSMan(I64 n,CTask *parent_task=NULL) -{ - CHashWS *tempw; - CHashSrcSym *temph; - Bool old_preempt=Preempt(OFF); - if (0<=--nstr,Fs->hash_table,HTG_SRC_SYM)) && - temph->src_link) { - Preempt(old_preempt); - PopUpEd(temph->src_link,parent_task); - } - Preempt(old_preempt); -} - -U0 WSFillInAdd(I64 i,I64 j,I64 old_num_fillins) -{ - Bool cont; - I64 k; - if (ws.num_fillinsws.fillin_scores[ws.num_fillins-1] || - i==ws.fillin_scores[ws.num_fillins-1] && ws.sorted_words[j]->hits>ws.fillin_hits[ws.num_fillins-1]) { - cont=TRUE; - for (k=ws.num_fillins-1;k>=old_num_fillins && cont;k--) - if (i<=ws.fillin_scores[k] || i==ws.fillin_scores[k] && ws.sorted_words[j]->hits<=ws.fillin_hits[k]) { - cont=FALSE; - k++; //offset k-- - } else { - ws.fillin_scores[k+1]=ws.fillin_scores[k]; - ws.fillin_matches[k+1]=ws.fillin_matches[k]; - ws.fillin_hits[k+1]=ws.fillin_hits[k]; - } - if (ws.num_fillinshits; - ws.fillin_matches[k+1]=j; - } -} - -U0 WSPutChoices(CDoc *focus_l,CDocEntry *doc_e,CTask *focus_task) -{ - I64 i,j,k,data_col; - U8 ch=0,*buf,*buf1,*src=NULL,*st; - CHashWS *w2; - F64 timeout_time=tS+0.5; - CHashSrcSym *temph; - CDoc *doc=DocPut; - - src=DocScanLine(focus_l,doc_e,&data_col); - DocUnlock(focus_l); - i=StrLen(src); - buf =MAlloc(MaxI64(i+1,256)); - buf1=MAlloc(MaxI64(i+1,256)); - if (data_col==-1) - data_col=0; - data_col=WSPriorWordInStr(src,buf,data_col,256); - ws.partial_len=StrLen(buf); - data_col=WSSkipCrap(src,data_col); - data_col=WSPriorWordInStr(src,buf1,data_col,256); - - if (ws.cur_word && !StrCmp(ws.cur_word,buf)) - goto pc_done; - - st=ws.cur_word; - ws.cur_word=AStrNew(buf); - Free(st); - Preempt(ON); - if (StrLen(buf1)&&ws.hash_table) - w2=HashFind(buf1,ws.hash_table,HTT_WORD); - else - w2=NULL; - ws.num_fillins=0; - if (w2 && w2->numstr)) { - i=WSHitsGet(ws.matrix,w2->num,ws.sorted_words[j]->num); - WSFillInAdd(i,j,0); - } - k=ws.num_fillins; - for (j=0;jstr)) - WSFillInAdd(0,j,k); - Preempt(OFF); - -pc_done: - DocRst(doc,TRUE); - doc->flags|=DOCF_MIN_SIZE; - DocCursor; - Fs->text_attr=LTBLUE<<4+WHITE; - Fs->border_src =BDS_CONST; - Fs->border_attr=LTBLUE<<4+BLACK; - DocPrint(doc,"Word:%s\n",ws.cur_word); - for (i=0;istr; - ch=CH_SPACE; - DocPrint(doc,"F%02d ",i+1); - if (TaskValidate(focus_task) && - (temph=HashFind(st,focus_task->hash_table,HTG_SRC_SYM)) && - temph->src_link) { - if (temph->type&HTF_PUBLIC) - DocPrint(doc,"$$RED$$"); - DocPrint(doc,"$$TX+UL+L+PU,\"%Q\",A=\"%s\"$$$$FG$$\n",st,temph->src_link); - } else - DocPrint(doc,"%s\n",st); - } - if (wsd.has_words) - WSDDictWordsAdd(doc); - - DocRecalc(doc); - if (!LBts(&Fs->display_flags,DISPLAYf_SHOW)) - WinZBufUpdate; - - Free(src); - Free(buf); - Free(buf1); -} - -U0 WSTask(I64) -{ - CTask *focus_task,*original_focus_task; - CDoc *doc; - CDocEntry *doc_e; - I64 ch; - DocTermNew; - SetWinHorz(51,Fs->win_right); - LBts(&Fs->display_flags,DISPLAYf_WIN_ON_TOP); - Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_BORDER-WIF_SELF_IP_L-WIF_SELF_IP_R-WIG_DBL_CLICK; - while (TRUE) { - if (Bt(&ws.flags,WSf_ENABLE)) { - original_focus_task=focus_task=sys_focus_task; - while (TaskValidate(focus_task) && Bt(&focus_task->task_flags,TASKf_INPUT_FILTER_TASK)) - focus_task=focus_task->parent_task; - if (TaskValidate(focus_task) && (doc=DocPut(focus_task)) && - focus_task!=Fs && Bt(&focus_task->display_flags,DISPLAYf_SHOW)) { - DocLock(doc); - if (TaskValidate(focus_task) && original_focus_task==sys_focus_task && - doc && doc==DocPut(focus_task) && (doc_e=doc->cur_entry)) { - if (doc_e==doc) doc_e=doc_e->last; - while (doc_e->last!=doc && (doc_e->type_u8==DOCT_NEW_LINE || - doc_e->type_u8==DOCT_SOFT_NEW_LINE)) - doc_e=doc_e->last; - while (doc_e->last->type_u8 !=DOCT_NEW_LINE && doc_e->last!=doc) - doc_e=doc_e->last; - if (Bt(&ws.flags,WSf_ENABLE)) - WSPutChoices(doc,doc_e,focus_task); - else - DocUnlock(doc); - } else - DocUnlock(doc); - } - } - Sleep(333); - if (ScanMsg(&ch,,1<cur_entry!=doc && doc->cur_entry->de_flags & DOCEF_LINK) - '' CH_SPACE; - DocUnlock(doc); - } - ws.task=NULL; -} - -U0 WSMainFileLstTraverse(U8 *files_find_mask,I64 pass) -{ - U8 *buf; - CDirEntry *tempde,*tempde1; - try { - tempde=tempde1=FilesFind(files_find_mask,FUF_RECURSE|FUF_JUST_TXT|FUF_JUST_FILES|FUF_CLUSTER_ORDER); - while (tempde) { - "%s\n",tempde->full_name; - buf=FileRead(tempde->full_name); - WSSingleFileAdd(buf,pass); - Free(buf); - tempde=tempde->next; - } - } catch - Fs->catch_except=TRUE; - DirTreeDel(tempde1); -} - -U0 WSMatrixDel(CWSMatrix *m) -{ - I64 i; - CWS *tempw,*tempw1,*tempw2; - if (!m) return; - for (i=0;iside[i]; - tempw=tempw1->next; - while (tempw!=tempw1) { - tempw2=tempw->next; - Free(tempw); - tempw=tempw2; - } - } - Free(m); -} - -public Bool WordStat(Bool val=OFF) -{//Turn WordStat OFF (or ON). - Bool old_wordstat=FALSE, - old_preempt=Preempt(OFF); - if (val) { - while (Bt(&ws.flags,WSf_INIT_IN_PROGRESS)) - Sleep(10); - if (TaskValidate(ws.task)) - old_wordstat=TRUE; - else { - ws.task=Spawn(&WSTask,NULL,"WordStat"); - TaskWait(ws.task); - } - if (!LBts(&ws.flags,WSf_ENABLE)) - WinToTop(ws.task); - } else { - LBtr(&ws.flags,WSf_ENABLE); - if (TaskValidate(ws.task)) { - old_wordstat=TRUE; - Kill(ws.task); - while (TaskValidate(ws.task)) - Yield; - ws.task=NULL; - } - } - Preempt(old_preempt); - return old_wordstat; -} - -U0 WSProgressTask(Bool *_start_flag) -{ - I64 start=dsk.write_cnt; - progress1=0; - progress1_max=(Size(WSD_DEF_FILENAME_Z,"+x+s")+BLK_SIZE-1)>>BLK_SIZE_BITS; - StrCpy(progress1_desc,"Uncompressing Dictionary"); - start=dsk.write_cnt; - *_start_flag=TRUE; - while (progress1type!=BDT_RAM) { - start_flag=FALSE; - Spawn(&WSProgressTask,&start_flag); - while (!start_flag) - Yield; - } - Move(WSD_DEF_FILENAME_Z,WSD_DEF_FILENAME); - } - - HashTableDel(ws.hash_table); - ws.hash_table=HashTableNew(0x4000,adam_task); - - ws.num_words=0; - ws.num_matrix_words=0; - ws.structs_size=0; - Free(ws.cur_word); - ws.cur_word=NULL; - - "\n\nPass #1\n"; - if (mask) WSMainFileLstTraverse(mask,1); - Free(ws.sorted_words); - ws.sorted_words=AMAlloc(sizeof(U8 *)*ws.num_words); - - tempw=ws.hash_table->next_added; - while (tempw!=ws.hash_table) { - ws.sorted_words[j++]=tempw; - tempw=tempw->next_added; - } - QSortI64(ws.sorted_words,ws.num_words,&WSCompare); - for (i=0;inum=i; - if (ws.num_words<=WS_MAX_MATRIX_WORDS) - ws.num_matrix_words=ws.num_words; - else - ws.num_matrix_words=WS_MAX_MATRIX_WORDS; - - WSMatrixDel(ws.matrix); - ws.matrix=AMAlloc(sizeof(CWSMatrix)); - WSSidesInit(ws.matrix); - - "\n\nPass #2\n"; - if (mask) WSMainFileLstTraverse(mask,2); - - WSDWordsLoad; - LBtr(&ws.flags,WSf_INIT_IN_PROGRESS); - WordStat(ON); -} - -I64 WordStatSize() -{ - if (ws.hash_table) - return HashTableSize2(ws.hash_table)+ws.structs_size+ - MSize2(ws.sorted_words)+MSize2(ws.matrix)+MSize2(wsd.word_lst); - else - return 0; -} diff --git a/Adam/WordStat/WordStat.CPP b/Adam/WordStat/WordStat.CPP deleted file mode 100644 index b42defd..0000000 --- a/Adam/WordStat/WordStat.CPP +++ /dev/null @@ -1,101 +0,0 @@ -#help_index "WordStat" -#help_file "::/Doc/WordStat" - -//See $LK,"::/Doc/WordStat.TXT"$ - -class CWSSub -{ - I32 hits,repeats; -}; - -#define WS_SUBSTRUCTS_PER_STRUCT 8 -class CWS -{ - CWS *next,*last; - I64 substructs, //-1 means CWSMatrixSide - entries; - CWSSub subs[WS_SUBSTRUCTS_PER_STRUCT]; -}; - -class CWSMatrixSide -{ - CWS *next,*last; - I64 const_minus_one, //-1 used to header in que - row_hits,col_hits; -}; - -#define WS_MAX_MATRIX_WORDS 0x8000 -class CWSMatrix -{ - I64 n; - CWSMatrixSide side[WS_MAX_MATRIX_WORDS]; -}; - -#define WSf_ENABLE 0 -#define WSf_INIT_IN_PROGRESS 1 - -#define WS_MAX_FILLINS 10 - -public class CWordStatGlbls -{ - I64 num_words,num_matrix_words; - CHashTable *hash_table; - U8 *cur_word; - I64 flags; - CWSMatrix *matrix; - CHashWS **sorted_words; - CTask *task; - I64 partial_len,num_fillins, - structs_size, - fillin_matches [WS_MAX_FILLINS+1], - fillin_scores [WS_MAX_FILLINS+1], - fillin_hits [WS_MAX_FILLINS+1]; - -} ws={0,0,NULL,NULL,0,NULL,NULL,NULL,0,0,0, -{0,0,0,0,0,0,0,0,0,0,0}, -{0,0,0,0,0,0,0,0,0,0,0}, -{0,0,0,0,0,0,0,0,0,0,0}}; - -//Dictionary Stuff -#help_index "WordStat/Dictionary" - -#define WSD_WORD_FILENAME "/Adam/WordStat/WSWords.DAT.Z" -#define WSD_DEF_FILENAME "/Adam/WordStat/WSDefs.DAT" -#define WSD_DEF_FILENAME_Z "/Adam/WordStat/WSDefs.DAT.Z" - -#define WSD_H1 0 -#define WSD_H1_END 1 -#define WSD_DEF 2 -#define WSD_DEF_END 3 -#define WSD_PRONUNCIATION 4 -#define WSD_PRONUNCIATION_END 5 -#define WSD_POS 6 -#define WSD_POS_END 7 -#define WSD_EXTRA 8 -#define WSD_EXTRA_END 9 -#define WSD_BLK_SIZE 0x4000 - -#define WSD_END_CHAR 0x00 -#define WSD_WORD_CHAR 0x01 -#define WSD_DEF_CHAR 0x02 -#define WSD_PRONUNCIATION_CHAR 0x03 -#define WSD_POS_CHAR 0x04 -#define WSD_EXTRA_CHAR 0x05 - -#define WSD_MAX_FILLINS 10 - -public class CWordStatDictGlbls -{ - U8 *word_lst; - I64 word_lst_size,num_words,num_fillins; - U8 *fillins[WSD_MAX_FILLINS]; - Bool has_words,has_defs; -} wsd={NULL,0,0,0,{0,0,0,0,0,0,0,0,0,0},FALSE,FALSE}; -wsd.has_words=FileFind(WSD_WORD_FILENAME); -wsd.has_defs =FileFind(WSD_DEF_FILENAME)||FileFind(WSD_DEF_FILENAME_Z); - -extern U0 WSDWordsLoad(); -extern U0 WSDDictWordsAdd(CDoc *doc,U8 *st=NULL); - -#include "WSMain" -#include "WSDict" diff --git a/Accts/Adam3cKeyPlugIns.CPP b/AdamKeyPlugIns.CPP similarity index 75% rename from Accts/Adam3cKeyPlugIns.CPP rename to AdamKeyPlugIns.CPP index 352c6a1..644fed7 100644 --- a/Accts/Adam3cKeyPlugIns.CPP +++ b/AdamKeyPlugIns.CPP @@ -1,7 +1,7 @@ -//Change anything you want in this -//acct file or others. +//Place this file in /Home and change +//anything you want. -U0 FillInTime() +U0 InsTime() { CDate cdt; cdt=Now; @@ -33,9 +33,9 @@ Bool MyPutKey(I64 ch,I64 sc) case SC_F1: if (sc&SCF_KEY_DESC) { if (sc & SCF_SHIFT) - SetKeyDesc("Dollar/LTPURPLE"); + KeyDescSet("Dollar/LTPURPLE"); else - SetKeyDesc("Dollar/PURPLE"); + KeyDescSet("Dollar/PURPLE"); } else { if (sc & SCF_SHIFT) "$$LTPURPLE$$"; @@ -46,9 +46,9 @@ Bool MyPutKey(I64 ch,I64 sc) case SC_F2: if (sc&SCF_KEY_DESC) { if (sc & SCF_SHIFT) - SetKeyDesc("Dollar/LTRED"); + KeyDescSet("Dollar/LTRED"); else - SetKeyDesc("Dollar/RED"); + KeyDescSet("Dollar/RED"); } else { if (sc & SCF_SHIFT) "$$LTRED$$"; @@ -59,9 +59,9 @@ Bool MyPutKey(I64 ch,I64 sc) case SC_F3: if (sc&SCF_KEY_DESC) { if (sc & SCF_SHIFT) - SetKeyDesc("Dollar/LTGREEN"); + KeyDescSet("Dollar/LTGREEN"); else - SetKeyDesc("Dollar/GREEN"); + KeyDescSet("Dollar/GREEN"); } else { if (sc & SCF_SHIFT) "$$LTGREEN$$"; @@ -72,21 +72,21 @@ Bool MyPutKey(I64 ch,I64 sc) case SC_F4: if (sc&SCF_KEY_DESC) { if (sc & SCF_SHIFT) - SetKeyDesc("Dollar/LTBLUE"); + KeyDescSet("Dollar/Default Color"); else - SetKeyDesc("Dollar/Default Color"); + KeyDescSet("Dollar/BLUE"); } else { if (sc & SCF_SHIFT) - "$$LTBLUE$$"; - else "$$FG$$"; + else + "$$BLUE$$"; } break; case SC_F7: if (sc&SCF_KEY_DESC) - SetKeyDesc("Misc/Insert Datetime"); + KeyDescSet("Misc/Ins Datetime"); else - FillInTime; + InsTime; break; } return TRUE; @@ -94,15 +94,28 @@ Bool MyPutKey(I64 ch,I64 sc) if (!(sc & SCF_CTRL)) { if (sc & SCF_ALT) { switch (ch) { + case 'a': + if (sc&SCF_KEY_DESC) + KeyDescSet("Win/AutoComplete(ON);"); + else + AutoComplete(ON); + return TRUE; + case 'A': + if (sc&SCF_KEY_DESC) + KeyDescSet("Win/AutoComplete;"); + else + AutoComplete; + return TRUE; + case 'h': if (sc&SCF_KEY_DESC) - SetKeyDesc("Win/Tile Horizontally"); + KeyDescSet("Win/Tile Horizontally"); else WinTileHorz; return TRUE; case 'm': if (sc&SCF_KEY_DESC) - SetKeyDesc("Win/Maximize"); + KeyDescSet("Win/Maximize"); else { WinMax; WinBorder; @@ -110,17 +123,17 @@ Bool MyPutKey(I64 ch,I64 sc) return TRUE; case 'v': if (sc&SCF_KEY_DESC) - SetKeyDesc("Win/Tile Vertically"); + KeyDescSet("Win/Tile Vertically"); else WinTileVert; return TRUE; case 'l': if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Put Link to Cur Pos on Clipboard"); + KeyDescSet("Edit/Put Link to Cur Pos on Clipboard"); else { ClipboardDel; - st1=FileNameAbs(Define("ST_BIBLE_FILE")); + st1=FileNameAbs(BIBLE_FILENAME); st2=FileNameAbs(DocPut->filename.name); if (!StrCmp(st1,st2)) { Free(st1); @@ -135,7 +148,7 @@ Bool MyPutKey(I64 ch,I64 sc) return TRUE; case 'L': if (sc&SCF_KEY_DESC) - SetKeyDesc("Edit/Place Anchor, Put Link to Clipboard"); + KeyDescSet("Edit/Place Anchor, Put Link to Clipboard"); else { i=RandU32; ClipboardDel; @@ -145,19 +158,6 @@ Bool MyPutKey(I64 ch,I64 sc) } return TRUE; - case 'w': - if (sc&SCF_KEY_DESC) - SetKeyDesc("Win/WordStat(ON);"); - else - WordStat(ON); - return TRUE; - case 'W': - if (sc&SCF_KEY_DESC) - SetKeyDesc("Win/WordStat;"); - else - WordStat; - return TRUE; - } } } diff --git a/Accts/Adam3aLocalize.CPP b/AdamLocalize.CPP similarity index 84% rename from Accts/Adam3aLocalize.CPP rename to AdamLocalize.CPP index 50c1b39..b5c4531 100644 --- a/Accts/Adam3aLocalize.CPP +++ b/AdamLocalize.CPP @@ -1,8 +1,8 @@ -//Change anything you want in this -//acct file or others. +//Place this file in /Home and change +//anything you want. //This makes your keyboard fast -SetTypeMatic(0); +KbdTypeMatic(0); //Set Time Zone local_time_offset=0*60*60*CDATE_FREQ; //Do daylight savings by hand diff --git a/Accts/Adam3bPkgs.CPP b/AdamPkgs.CPP similarity index 75% rename from Accts/Adam3bPkgs.CPP rename to AdamPkgs.CPP index 30e9d96..3d537a2 100644 --- a/Accts/Adam3bPkgs.CPP +++ b/AdamPkgs.CPP @@ -1,12 +1,12 @@ -//Change anything you want in this -//acct file or others. +//Place this file in /Home and change +//anything you want. Cd("/Adam/Boot");; -#include "InsBoot" +#include "Boot" Cd("/Adam/Utils");; #include "Profiler" #include "Diff" -#include "Grep" +#include "Find" #include "LineRep" #include "Merge" #include "S2T" @@ -20,6 +20,6 @@ Cd("/Adam/Utils");; MapFileLoad("::/Kernel/Kernel"); MapFileLoad("::/Compiler/Compiler"); -Cd("HOME");; +Cd("::/Home");; #help_index "" diff --git a/Accts/Install/Adam3eSys.CPP b/AdamSys.CPP similarity index 69% rename from Accts/Install/Adam3eSys.CPP rename to AdamSys.CPP index 0dc58dc..2efe633 100644 --- a/Accts/Install/Adam3eSys.CPP +++ b/AdamSys.CPP @@ -1,5 +1,5 @@ -//Change anything you want in this -//acct file or others. +//Place this file in /Home and change +//anything you want. U0 UserStartUp() {//Run each time a user a spawned @@ -9,6 +9,7 @@ U0 UserStartUp() WinToTop; WinZBufUpdate; Preempt(ON); + Dir; } U0 SrvStartUp() @@ -23,15 +24,14 @@ U0 SrvStartUp() U0 StartUpTasks() { CTask *user1,*user2; - user1=SpawnUser; - user2=SpawnUser("Ed(\"::/Doc/Install.TXT.Z\");\n"); + user1=User; + user2=User; WinToTop(user1); WinTileVert; "Boot Time:%7.3fs\n",tS; - XTalk(user1,"Cd(\"HOME\");#include \"DoOnce\";\n"); - Silent(ON); //no output to screen - WSInit; - WordStat; + XTalk(user1,"Cd(\"::/Home\");#include \"DoOnce\";\n"); + Silent; //no output to screen + ACInit("/*;~*Bible.TXT*"); Silent(OFF); //no output to screen } diff --git a/AdamWrappers.CPP b/AdamWrappers.CPP new file mode 100644 index 0000000..f3a39eb --- /dev/null +++ b/AdamWrappers.CPP @@ -0,0 +1,26 @@ +//Place this file in /Home and change +//anything you want. + +#help_index "Cmd Line (Typically)" + +//These are customized quick commands. +//Feel free to add more or change. +public I64 F(U8 *needle_str,U8 *fu_flags=NULL) +{//Find (Find) all text files. + return Find(needle_str,"/*",fu_flags); +} + +public I64 R(U8 *needle_str,U8 *replace_text=NULL,U8 *fu_flags="+l-i") +{//Find (Find) and replace string with string in all files. + return Find(needle_str,"/*",fu_flags,replace_text); +} + +public I64 FD(U8 *needle_str,U8 *fu_flags=NULL) +{//Find (Find) text files in cur dir. + return Find(needle_str,"*",fu_flags); +} + +public I64 RD(U8 *needle_str,U8 *replace_text=NULL,U8 *fu_flags="+l-i") +{//Find (Find) and replace string with string in cur dir. + return Find(needle_str,"*",fu_flags,replace_text); +} diff --git a/Apps/AfterEgypt/AESplash.TXT b/Apps/AfterEgypt/AESplash.TXT index f532696..bbf20cf 100644 Binary files a/Apps/AfterEgypt/AESplash.TXT and b/Apps/AfterEgypt/AESplash.TXT differ diff --git a/Apps/AfterEgypt/AfterEgypt.CPP b/Apps/AfterEgypt/AfterEgypt.CPP index d8d1cf5..ee16000 100644 --- a/Apps/AfterEgypt/AfterEgypt.CPP +++ b/Apps/AfterEgypt/AfterEgypt.CPP @@ -17,9 +17,7 @@ U0 HoldCourt() I64 accused,crime,victim; Bool old_form=LBts(&(DocPut)->flags,DOCf_FORM); - FlushMsgs; DocDblBufStart; - '\n'; accused=RandU32%3; "%s",LstSub(accused,"A man \0A woman \0A child \0"); @@ -74,7 +72,6 @@ Bool TakeTurn() Camp(num_people); Kill(Fs->song_task); - FlushMsgs; DocDblBufStart; "$$LM,4$$" "\n\n$$BT,\"Break Camp\",LE=T_BREAK_CAMP$$\n\n" @@ -164,7 +161,6 @@ U0 Trailer() Cd(Fs->parent_task->cur_dir); Type("AESplash.TXT"); Sleep(500); - FlushMsgs; try { TMsg(dc,"Leaving all behind, they fled."); TMsg(dc,"Found themselves in a desert."); @@ -181,11 +177,11 @@ U0 AfterEgypt() SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); WinBorder; - WordStat; + AutoComplete; DocClear; WinMax; PopUp("Trailer;",Fs); - WordStat; + AutoComplete; try //Catch . while (TakeTurn); catch diff --git a/Apps/AfterEgypt/Comics/Moses82.TXT b/Apps/AfterEgypt/Comics/Moses82.TXT new file mode 100644 index 0000000..5fc579e Binary files /dev/null and b/Apps/AfterEgypt/Comics/Moses82.TXT differ diff --git a/Apps/AfterEgypt/GodTalking.CPP b/Apps/AfterEgypt/GodTalking.CPP index 1cfda8d..aef2b02 100644 Binary files a/Apps/AfterEgypt/GodTalking.CPP and b/Apps/AfterEgypt/GodTalking.CPP differ diff --git a/Apps/AfterEgypt/Horeb1.CPP b/Apps/AfterEgypt/HorebA.CPP similarity index 97% rename from Apps/AfterEgypt/Horeb1.CPP rename to Apps/AfterEgypt/HorebA.CPP index 91d3da5..8f80b4e 100644 Binary files a/Apps/AfterEgypt/Horeb1.CPP and b/Apps/AfterEgypt/HorebA.CPP differ diff --git a/Apps/AfterEgypt/Horeb2MP.CPP b/Apps/AfterEgypt/HorebBMP.CPP similarity index 73% rename from Apps/AfterEgypt/Horeb2MP.CPP rename to Apps/AfterEgypt/HorebBMP.CPP index 8060dd0..a206e93 100644 --- a/Apps/AfterEgypt/Horeb2MP.CPP +++ b/Apps/AfterEgypt/HorebBMP.CPP @@ -1,19 +1,18 @@ -I64 type_weights[OT_NUM_TYPES]={30,30,15,30,30,1,1,1}; +I64 type_weights[OT_NUM_TYPES]={0,30,30,15,30,30,1,1,1}; I64 mp_not_done_flags; U0 MPDrawHoreb(CDC *dc2) { CTask *task=dc2->win_task; CDC *dc=DCAlias(dc2,task); - I64 lo=Gs->num*O_NUM_OBJS/mp_cnt,hi=(Gs->num+1)*O_NUM_OBJS/mp_cnt, - i,j,dx,dy,dz,w=task->pix_width,h=task->pix_height,r[16],cx=w>>1; + I64 i,j,dx,dy,dz,w=task->pix_width,h=task->pix_height,r[16],cx=w>>1; F64 s,m,a,x1,y1,x2,y2; Obj *tempo; GrIdentEqu(r); GrRotYEqu(r,-é); GrRotXEqu(r,77*ã/180); - for (i=lo;inum;ix1=tempo->x+vx; tempo->y1=tempo->y; tempo->z1=tempo->z+vz; GrRot(r,&tempo->x1,&tempo->y1,&tempo->z1); @@ -27,15 +26,21 @@ U0 MPDrawHoreb(CDC *dc2) } if (tempo->z1>=0) { s=100.0/(AbsI64(tempo->z1)+50); - GrIdentEqu(dc->r); - GrScaleEqu(dc->r,s*2); - GrSetRotMat(dc,dc->r); - dc->flags|=DCF_TRANSFORMATION; - if (tempo->sym) { - dc->flags|=DCF_SYMMETRY|DCF_JUST_MIRROR; - GrSetSymmetry(dc,s*tempo->x1+cx,s*tempo->y1+h,s*tempo->x1+cx,s*tempo->y1+h+10); + if (tempo->type) { + GrIdentEqu(dc->r); + GrScaleEqu(dc->r,s*2); + GrSetRotMat(dc,dc->r); + dc->flags|=DCF_TRANSFORMATION; + if (tempo->sym) { + dc->flags|=DCF_SYMMETRY|DCF_JUST_MIRROR; + GrSetSymmetry(dc,s*tempo->x1+cx,s*tempo->y1+h,s*tempo->x1+cx,s*tempo->y1+h+10); + } + Sprite3B(dc,s*tempo->x1+cx,s*tempo->y1+h,tempo->z1,imgs[tempo->type]); + } else { + dc->flags&=~DCF_TRANSFORMATION; + dc->color=pebble_colors[tempo->num&3]; + GrPlot3(dc,s*tempo->x1+cx,s*tempo->y1+h,tempo->z1); } - Sprite3B(dc,s*tempo->x1+cx,s*tempo->y1+h,tempo->z1,imgs[tempo->type]); dc->flags&=~(DCF_SYMMETRY|DCF_JUST_MIRROR); if (tempo==&objs[O_BURNING_BUSH]) {//draw burning bush dc->x=s*tempo->x1+cx; diff --git a/Apps/AfterEgypt/Horeb2SP.CPP b/Apps/AfterEgypt/HorebBSP.CPP similarity index 67% rename from Apps/AfterEgypt/Horeb2SP.CPP rename to Apps/AfterEgypt/HorebBSP.CPP index b1f1fae..a075dd3 100644 --- a/Apps/AfterEgypt/Horeb2SP.CPP +++ b/Apps/AfterEgypt/HorebBSP.CPP @@ -1,4 +1,4 @@ -I64 type_weights[OT_NUM_TYPES]={30,30,15,30,3,1,1,1}; +I64 type_weights[OT_NUM_TYPES]={0,30,30,15,30,3,1,1,1}; I64 ObjCompare(Obj *o1,Obj *o2) { @@ -12,7 +12,7 @@ U0 DrawHoreb(CTask *task,CDC *dc) h=task->pix_height,r[16], cx=w>>1,cy=h>>1; F64 s,m,a,x1,y1,x2,y2; - Obj *o_sort[O_NUM_OBJS],*tempo; + Obj *o_sort[O_NUM_OBJS+O_NUM_PEBBLES],*tempo; GrIdentEqu(r); GrRotYEqu(r,-é); @@ -29,7 +29,7 @@ U0 DrawHoreb(CTask *task,CDC *dc) GrFloodFill(dc,s*x+cx,15); } - for (i=0;ix1=tempo->x+vx; tempo->y1=tempo->y; tempo->z1=tempo->z+vz; @@ -43,21 +43,27 @@ U0 DrawHoreb(CTask *task,CDC *dc) tempo->sym=FALSE; } } - QSortI64(o_sort,O_NUM_OBJS,&ObjCompare); + QSortI64(o_sort,O_NUM_OBJS+O_NUM_PEBBLES,&ObjCompare); - for (i=0;iz1<0) break; s=100.0/(AbsI64(tempo->z1)+50); - GrIdentEqu(dc->r); - GrScaleEqu(dc->r,s*2); - GrSetRotMat(dc,dc->r); - dc->flags|=DCF_TRANSFORMATION; - if (tempo->sym) { - dc->flags|=DCF_SYMMETRY|DCF_JUST_MIRROR; - GrSetSymmetry(dc,s*tempo->x1+cx,s*tempo->y1+h,s*tempo->x1+cx,s*tempo->y1+h+10); + if (tempo->type) { + GrIdentEqu(dc->r); + GrScaleEqu(dc->r,s*2); + GrSetRotMat(dc,dc->r); + dc->flags|=DCF_TRANSFORMATION; + if (tempo->sym) { + dc->flags|=DCF_SYMMETRY|DCF_JUST_MIRROR; + GrSetSymmetry(dc,s*tempo->x1+cx,s*tempo->y1+h,s*tempo->x1+cx,s*tempo->y1+h+10); + } + Sprite3B(dc,s*tempo->x1+cx,s*tempo->y1+h,0,imgs[tempo->type]); + } else { + dc->flags&=~DCF_TRANSFORMATION; + dc->color=pebble_colors[tempo->num&3]; + GrPlot3(dc,s*tempo->x1+cx,s*tempo->y1+h,tempo->z1); } - Sprite3B(dc,s*tempo->x1+cx,s*tempo->y1+h,0,imgs[tempo->type]); dc->flags&=~(DCF_SYMMETRY|DCF_JUST_MIRROR); if (o_sort[i]==&objs[O_BURNING_BUSH]) {//draw burning bush dc->x=s*tempo->x1+cx; diff --git a/Apps/AfterEgypt/Horeb3.CPP b/Apps/AfterEgypt/HorebC.CPP similarity index 57% rename from Apps/AfterEgypt/Horeb3.CPP rename to Apps/AfterEgypt/HorebC.CPP index 5c82b6d..4c896d5 100644 --- a/Apps/AfterEgypt/Horeb3.CPP +++ b/Apps/AfterEgypt/HorebC.CPP @@ -5,7 +5,7 @@ U0 AnimateTask(I64) Obj *tempo; while (TRUE) { t=tS; - for (i=0;itype==OT_SHEEP || tempo->type==OT_GOAT1 || tempo->type==OT_GOAT2) { tempo->x+=tempo->dx; @@ -28,25 +28,28 @@ U0 Init() total+=type_weights[i]; MemSet(objs,0,sizeof(objs)); - for (i=0;inum=i; tempo->x=RandU32&0x1FFF-0x1000; tempo->y=0; tempo->z=RandU32&0x1FFF-0x1000; tempo->é=2*ã*Rand; tempo->sym=RandU16&1; - k=0; - j=RandU32%total; - while (TRUE) { - j-=type_weights[k]; - if (j<0) - break; - else - k++; - } - - tempo->type=k; + if (itype=k; + } else + tempo->type=OT_PEBBLE; } objs[O_BURNING_BUSH].type=OT_BUSH1; @@ -54,14 +57,14 @@ U0 Init() horeb_done=FALSE; } -#define ANIMATE_STEPS 10 +#define ANIMATE_STEPS 5 U0 AnimateéTask(F64 a) { I64 i; for (i=0;itext_attr=YELLOW<<4+BLUE; Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_GRAB_SCROLL-WIF_FOCUS_TASK_MENU; - WordStat; + AutoComplete; WinMax; WinBorder; Preempt(OFF); @@ -107,34 +110,31 @@ U0 Horeb() Init; Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); Fs->draw_it=&DrawHoreb; - while (!horeb_done) { - while (ScanKey(&ch,&sc)) - switch (ch) { - case 0: - switch (sc.u8[0]) { - case SC_CURSOR_LEFT: - Spawn(&AnimateéTask,(-ã/100)(I64),"Animate é",,Fs); - break; - case SC_CURSOR_RIGHT: - Spawn(&AnimateéTask,( ã/100)(I64),"Animate é",,Fs); - break; - case SC_CURSOR_UP: - Spawn(&AnimateVTask,(-40.0 )(I64),"Animate V",,Fs); - break; - case SC_CURSOR_DOWN: - Spawn(&AnimateVTask,( 40.0 )(I64),"Animate V",,Fs); - break; - } - break; - case '\n': - Init; - break; - case CH_SHIFT_ESC: - case CH_ESC: - goto hr_done; - } - WinMgrSync; - } + while (!horeb_done) + switch (GetKey(&sc)) { + case 0: + switch (sc.u8[0]) { + case SC_CURSOR_LEFT: + Spawn(&AnimateéTask,(-ã/100)(I64),"Animate é",,Fs); + break; + case SC_CURSOR_RIGHT: + Spawn(&AnimateéTask,( ã/100)(I64),"Animate é",,Fs); + break; + case SC_CURSOR_UP: + Spawn(&AnimateVTask,(-40.0 )(I64),"Animate V",,Fs); + break; + case SC_CURSOR_DOWN: + Spawn(&AnimateVTask,( 40.0 )(I64),"Animate V",,Fs); + break; + } + break; + case '\n': + Init; + break; + case CH_SHIFT_ESC: + case CH_ESC: + goto hr_done; + } hr_done: //Don't goto out of try } catch Fs->catch_except=TRUE; diff --git a/Apps/AfterEgypt/Load.CPP b/Apps/AfterEgypt/Load.CPP index 9a3557f..f0bc9cd 100644 --- a/Apps/AfterEgypt/Load.CPP +++ b/Apps/AfterEgypt/Load.CPP @@ -1,6 +1,6 @@ #help_index "Games" -Cd("/Apps/AfterEgypt");; +Cd(__DIR__);; #include "Comics" #include "/Demo/Graphics/Camp" #include "/Demo/MultiCore/Clouds" @@ -9,15 +9,15 @@ Cd("/Apps/AfterEgypt");; #include "Battle" #include "WaterRock" #include "Quail" -#include "Horeb1" +#include "HorebA" #if mp_cnt>=4 - #include "Horeb2MP" + #include "HorebBMP" #else - #include "Horeb2SP" + #include "HorebBSP" #endif -#include "Horeb3" +#include "HorebC" #include "GodTalking" #include "AfterEgypt" diff --git a/Apps/AfterEgypt/Run.CPP b/Apps/AfterEgypt/Run.CPP index 8593299..0b9d290 100644 --- a/Apps/AfterEgypt/Run.CPP +++ b/Apps/AfterEgypt/Run.CPP @@ -1,3 +1,3 @@ -Cd("/Apps/AfterEgypt");; +Cd(__DIR__);; #include "Load" AfterEgypt; diff --git a/Apps/AfterEgypt/WaterRock.CPP b/Apps/AfterEgypt/WaterRock.CPP index 000c310..821ba69 100644 Binary files a/Apps/AfterEgypt/WaterRock.CPP and b/Apps/AfterEgypt/WaterRock.CPP differ diff --git a/Apps/Budget/BgtAccts.CPP b/Apps/Budget/BgtAccts.CPP index 36166b4..b5e90a3 100644 --- a/Apps/Budget/BgtAccts.CPP +++ b/Apps/Budget/BgtAccts.CPP @@ -5,15 +5,15 @@ U0 BgtAcctsUpdate() tempb=b_root.next; while (tempb!=&b_root) { if (tempb->type!=BE_TEMPLATE_COPY) { - tempb->credit_index =StrFileAdd(tempb->credit,accts_table); - tempb->debit_index =StrFileAdd(tempb->debit,accts_table); + tempb->credit_index =StrFileAdd(tempb->credit,&accts_table_strs,accts_table); + tempb->debit_index =StrFileAdd(tempb->debit,&accts_table_strs,accts_table); } tempb=tempb->next; } tempt=t_root.next; while (tempt!=&t_root) { - tempt->b.credit_index =StrFileAdd(tempt->b.credit,accts_table); - tempt->b.debit_index =StrFileAdd(tempt->b.debit,accts_table); + tempt->b.credit_index =StrFileAdd(tempt->b.credit,&accts_table_strs,accts_table); + tempt->b.debit_index =StrFileAdd(tempt->b.debit,&accts_table_strs,accts_table); tempt=tempt->next; } } @@ -29,10 +29,11 @@ U0 BgtAcctsRead() I64 i,max_num; U8 *colors,**s=StrFileRead(BGT_ACCTS_FILE,&max_num,&colors,TRUE); StrFileDel(accts_table); - accts_table=HashTableNew(0x200); + accts_table=HashTableNew(512); + accts_table_strs=0; for (i=0;i<=max_num;i++) if (s[i]) - StrFileAdd(s[i],accts_table,colors[i]); + StrFileAdd(s[i],&accts_table_strs,accts_table,colors[i]); StrFileArrDel(s,max_num); Free(colors); } @@ -48,6 +49,7 @@ I64 BgtAcctColor(U8 *st) U8 *BgtPopUpAcct(U8 *header=NULL,U8 *dft=NULL) { + I64 i; U8 *result; CDoc *doc=DocNew; CDocEntry *doc_e,*doc_dft=NULL; @@ -56,13 +58,15 @@ U8 *BgtPopUpAcct(U8 *header=NULL,U8 *dft=NULL) if (header) DocPrint(doc,"%s",header); - temph=accts_table->next_added; - while (temph!=accts_table) { - doc_e=DocPrint(doc,"$$FG,%d$$$$MU-UL,\"%s\",LE=0x%X$$\n", - temph->user_data1,temph->str,temph->str); - if (dft && !StrCmp(dft,temph->str)) - doc_dft=doc_e; - temph=temph->next_added; + for (i=0;i<=accts_table->mask;i++) { + temph=accts_table->body[i]; + while (temph) { + doc_e=DocPrint(doc,"$$FG,%d$$$$MU-UL,\"%s\",LE=0x%X$$\n", + temph->user_data1,temph->str,temph->str); + if (dft && !StrCmp(dft,temph->str)) + doc_dft=doc_e; + temph=temph->next; + } } if (doc_dft) { diff --git a/Apps/Budget/BgtEntry.CPP b/Apps/Budget/BgtEntry.CPP index 60f9aff..39e057c 100644 --- a/Apps/Budget/BgtEntry.CPP +++ b/Apps/Budget/BgtEntry.CPP @@ -62,8 +62,8 @@ CBgtEntry *BgtEntryPmt(CBgtEntry *dft=NULL) tempb->debit =StrNew(b.debit); tempb->desc =StrNew(b.desc); tempb->type =BE_NORMAL; - StrFileAdd(tempb->credit,accts_table); - StrFileAdd(tempb->debit,accts_table); + StrFileAdd(tempb->credit,&accts_table_strs,accts_table); + StrFileAdd(tempb->debit,&accts_table_strs,accts_table); return tempb; } } else diff --git a/Apps/Budget/BgtFile.CPP b/Apps/Budget/BgtFile.CPP index 2dadfc2..7b54956 100644 --- a/Apps/Budget/BgtFile.CPP +++ b/Apps/Budget/BgtFile.CPP @@ -48,26 +48,28 @@ U0 BgtDataRead() U0 BgtDataWrite() { - I64 size,cnt1,cnt2; - CHashTable *table=HashTableNew(0x1000); + I64 i,num=0,size,cnt1,cnt2; + CHashTable *table=HashTableNew(1024); CBgtEntry *tempb; CBgtTemplate *tempt; CHashGeneric *temph; U8 *buf,*ptr; - temph=accts_table->next_added; - while (temph!=accts_table) { - StrFileAdd(temph->str,table); //Make so accts come first. (Cosmetic) - temph=temph->next_added; + for (i=0;i<=accts_table->mask;i++) { + temph=accts_table->body[i]; + while (temph) { + StrFileAdd(temph->str,&num,table); //Cosmetics -- make accts appear first. + temph=temph->next; + } } tempb=b_root.next; cnt1=0; while (tempb!=&b_root) { if (tempb->type!=BE_TEMPLATE_COPY) { - tempb->credit_index =StrFileAdd(tempb->credit,table); - tempb->debit_index =StrFileAdd(tempb->debit,table); - tempb->desc_index =StrFileAdd(tempb->desc,table); + tempb->credit_index =StrFileAdd(tempb->credit,&num,table); + tempb->debit_index =StrFileAdd(tempb->debit,&num,table); + tempb->desc_index =StrFileAdd(tempb->desc,&num,table); cnt1++; } tempb=tempb->next; @@ -76,9 +78,9 @@ U0 BgtDataWrite() tempt=t_root.next; cnt2=0; while (tempt!=&t_root) { - tempt->b.credit_index =StrFileAdd(tempt->b.credit,table); - tempt->b.debit_index =StrFileAdd(tempt->b.debit,table); - tempt->b.desc_index =StrFileAdd(tempt->b.desc,table); + tempt->b.credit_index =StrFileAdd(tempt->b.credit,&num,table); + tempt->b.debit_index =StrFileAdd(tempt->b.debit,&num,table); + tempt->b.desc_index =StrFileAdd(tempt->b.desc,&num,table); cnt2++; tempt=tempt->next; } @@ -134,4 +136,5 @@ U0 BgtDel() } StrFileDel(accts_table); accts_table=NULL; + accts_table_strs=0; } diff --git a/Apps/Budget/BgtMain.CPP b/Apps/Budget/BgtMain.CPP index cc3d002..e980382 100644 --- a/Apps/Budget/BgtMain.CPP +++ b/Apps/Budget/BgtMain.CPP @@ -49,7 +49,7 @@ Bool BgtPutKey(CDoc *doc,U8 *,I64 ch,I64 sc) case 'a': PopUpOk( "Set the name and color of your accounts.\n" "To delete accounts, manually edit\n" - "$$GREEN$$HOME/Budget/Accts.TXT.Z$$FG$$."); + "$$GREEN$$/Home/Budget/Accts.TXT.Z$$FG$$."); if (PopUpEd(BGT_ACCTS_FILE,Fs)) { BgtAcctsRead; BgtRegen; @@ -163,7 +163,7 @@ U0 Budget() SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ WinMax; WinBorder; - WordStat; + AutoComplete; MenuPush( "File {" " Abort(,CH_SHIFT_ESC);" diff --git a/Apps/Budget/BgtStrs.CPP b/Apps/Budget/BgtStrs.CPP index 88ece01..f660b20 100644 --- a/Apps/Budget/BgtStrs.CPP +++ b/Apps/Budget/BgtStrs.CPP @@ -53,7 +53,7 @@ public U0 StrFileArrDel(U8 **a,I64 max_num) Free(a); } -public I64 StrFileAdd(U8 *st,CHashTable *table,I64 color=COLOR_INVALID) +public I64 StrFileAdd(U8 *st,I64 *_num,CHashTable *table,I64 color=COLOR_INVALID) { CHashGeneric *temph; if (!st) return 0; @@ -61,10 +61,7 @@ public I64 StrFileAdd(U8 *st,CHashTable *table,I64 color=COLOR_INVALID) temph=CAlloc(sizeof(CHashGeneric)); temph->type=SFT_GENERIC; temph->str=StrNew(st); - if (table->last_added==table) - temph->user_data0=1; - else - temph->user_data0=table->last_added(CHashGeneric *)->user_data0+1; + temph->user_data0=(*_num)++; HashAdd(temph,table); } if (color!=COLOR_INVALID) @@ -72,14 +69,32 @@ public I64 StrFileAdd(U8 *st,CHashTable *table,I64 color=COLOR_INVALID) return temph->user_data0; } +I64 StrEntriesCompare(CHashGeneric *h1,CHashGeneric *h2) +{ + return h1->user_data0-h2->user_data0; +} + public U0 StrFileWrite(U8 *name,CHashTable *table,Bool no_nums=FALSE) { - I64 color=BLACK; + I64 i,j,cnt,color=BLACK; CDoc *doc=DocNew(name); - CHashGeneric *temph; + CHashGeneric *temph,**a; if (table) { - temph=table->next_added; - while (temph!=table) { + cnt=0; //Count Strings + for (i=0;i<=table->mask;i++) + cnt+=LinkedLstCnt(table->body[i]); + a=MAlloc(cnt*sizeof(CHashGeneric *)); + j=0; //Load Strings + for (i=0;i<=table->mask;i++) { + temph=table->body[i]; + while (temph) { + a[j++]=temph; + temph=temph->next; + } + } + QSortI64(a,cnt,&StrEntriesCompare); + for (i=0;iuser_data1&15!=color) { DocPrint(doc,"$$FG,%d$$",temph->user_data1&15); color=temph->user_data1&15; @@ -88,8 +103,8 @@ public U0 StrFileWrite(U8 *name,CHashTable *table,Bool no_nums=FALSE) DocPrint(doc,"%s\n",temph->str); else DocPrint(doc,"%d,%s\n",temph->user_data0,temph->str); - temph=temph->next_added; } + Free(a); } doc->flags|=DOCF_NO_CURSOR; DocWrite(doc); @@ -98,14 +113,17 @@ public U0 StrFileWrite(U8 *name,CHashTable *table,Bool no_nums=FALSE) public U0 StrFileDel(CHashTable *table) { + I64 i; CHashGeneric *temph,*temph1; if (!table) return; - temph=table->next_added; - while (temph!=table) { - temph1=temph->next_added; - Free(temph->str); - Free(temph); - temph=temph1; + for (i=0;i<=table->mask;i++) { + temph=table->body[i]; + while (temph) { + temph1=temph->next; + Free(temph->str); + Free(temph); + temph=temph1; + } } Free(table->body); Free(table); diff --git a/Apps/Budget/Budget.CPP b/Apps/Budget/Budget.CPP index 3ad819f..28379f2 100644 --- a/Apps/Budget/Budget.CPP +++ b/Apps/Budget/Budget.CPP @@ -1,6 +1,6 @@ -#define BGT_STRINGS_FILE "HOME/Budget/Strs.TXT.Z" -#define BGT_ACCTS_FILE "HOME/Budget/Accts.TXT.Z" -#define BGT_DATA_FILE "HOME/Budget/Bgt.DAT.Z" +#define BGT_STRINGS_FILE "::/Home/Budget/Strs.TXT.Z" +#define BGT_ACCTS_FILE "::/Home/Budget/Accts.TXT.Z" +#define BGT_DATA_FILE "::/Home/Budget/Bgt.DAT.Z" #define BE_NORMAL 0 #define BE_GAS 1 @@ -55,6 +55,7 @@ class CBgtTemplate U8 view_acct[512]; CHashTable *accts_table=NULL; +I64 accts_table_strs=0; CDate MyStr2Date(U8 *st) { diff --git a/Apps/Budget/Install.CPP b/Apps/Budget/Install.CPP index d12b347..2e99028 100644 --- a/Apps/Budget/Install.CPP +++ b/Apps/Budget/Install.CPP @@ -1,4 +1,5 @@ -if (!FileFind("HOME/Budget",,FUF_JUST_DIRS)) { - MkDir("HOME/Budget"); - Copy("/Apps/Budget/Accts.TXT.Z","HOME/Budget"); +Cd(__DIR__);; +if (!FileFind("::/Home/Budget",,FUF_JUST_DIRS)) { + MkDir("::/Home/Budget"); + Copy("Accts.TXT.Z","::/Home/Budget"); } diff --git a/Apps/Budget/Load.CPP b/Apps/Budget/Load.CPP index 0dad7e6..ecba844 100644 --- a/Apps/Budget/Load.CPP +++ b/Apps/Budget/Load.CPP @@ -1,11 +1,12 @@ #help_index "Finance" -#include "/Apps/Budget/BgtStrs" -#include "/Apps/Budget/Budget" -#include "/Apps/Budget/BgtAccts" -#include "/Apps/Budget/BgtEntry" -#include "/Apps/Budget/BgtTemplate" -#include "/Apps/Budget/BgtFile" -#include "/Apps/Budget/BgtMain" +Cd(__DIR__);; +#include "BgtStrs" +#include "Budget" +#include "BgtAccts" +#include "BgtEntry" +#include "BgtTemplate" +#include "BgtFile" +#include "BgtMain" #help_index "" diff --git a/Apps/Budget/Run.CPP b/Apps/Budget/Run.CPP index 7a937b3..5bf731f 100644 --- a/Apps/Budget/Run.CPP +++ b/Apps/Budget/Run.CPP @@ -1,4 +1,4 @@ -Cd("/Apps/Budget");; +Cd(__DIR__);; #include "Load" #include "Install" //Might as well always install Budget; diff --git a/Apps/GrModels/BallGen.CPP b/Apps/GrModels/BallGen.CPP index 5d05fe3..c06e359 100644 --- a/Apps/GrModels/BallGen.CPP +++ b/Apps/GrModels/BallGen.CPP @@ -58,17 +58,17 @@ I64 AddTri(BallDefineStruct *,I64 c,I64 n0,I64 n1,I64 n2) U8 *Ball2CSprite() { //See $LK,"::/Adam/Gr/GrSpritePlot.CPP",A="FL:::/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored. - U8 *result=MAlloc(sizeof(U8)+2*sizeof(I32)+ + U8 *result=MAlloc(sizeof(CSpriteMeshU8s)+ b->vertex_cnt*sizeof(CD3I32)+b->tri_cnt*sizeof(CMeshTri)+sprite_elem_base_sizes[SPT_END]), *dst=result; - *dst(U8 *)++ =SPT_MESH; + *dst++ =SPT_MESH; *dst(I32 *)++ =b->vertex_cnt; *dst(I32 *)++ =b->tri_cnt; MemCpy(dst,&b->v,b->vertex_cnt*sizeof(CD3I32)); dst+=b->vertex_cnt*sizeof(CD3I32); MemCpy(dst,&b->t,b->tri_cnt*sizeof(CMeshTri)); dst+=b->tri_cnt*sizeof(CMeshTri); - *dst(U8 *)++ =SPT_END; + *dst++ =SPT_END; return result; } diff --git a/Apps/GrModels/Load.CPP b/Apps/GrModels/Load.CPP index bf5a12a..1b41af7 100644 --- a/Apps/GrModels/Load.CPP +++ b/Apps/GrModels/Load.CPP @@ -1,7 +1,8 @@ #help_index "Misc" -#include "/Apps/GrModels/ManGen" -#include "/Apps/GrModels/BallGen" -#include "/Apps/GrModels/Models" +Cd(__DIR__);; +#include "ManGen" +#include "BallGen" +#include "Models" #help_index "" diff --git a/Apps/GrModels/ManGen.CPP b/Apps/GrModels/ManGen.CPP index 9f6905b..06fc7d5 100644 --- a/Apps/GrModels/ManGen.CPP +++ b/Apps/GrModels/ManGen.CPP @@ -7,7 +7,7 @@ class Man { I32 vertex_cnt; I32 tri_cnt; - CD3I32 v[MAX_VERTICES]; + CD3I32 v[MAX_VERTICES]; CMeshTri t[MAX_TRIS]; } *m; @@ -182,17 +182,17 @@ U0 AddBox(ManDefineStruct *md,I64 c,I64 x1,I64 y1,I64 z1,F64 w,F64 h,F64 d,F64 h U8 *Man2CSprite() { //See $LK,"::/Adam/Gr/GrSpritePlot.CPP",A="FL:::/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored. - U8 *result=MAlloc(sizeof(U8)+2*sizeof(I32)+ + U8 *result=MAlloc(sizeof(CSpriteMeshU8s)+ m->vertex_cnt*sizeof(CD3I32)+m->tri_cnt*sizeof(CMeshTri)+sprite_elem_base_sizes[SPT_END]), *dst=result; - *dst(U8 *)++ =SPT_MESH; + *dst++ =SPT_MESH; *dst(I32 *)++ =m->vertex_cnt; *dst(I32 *)++ =m->tri_cnt; MemCpy(dst,&m->v,m->vertex_cnt*sizeof(CD3I32)); dst+=m->vertex_cnt*sizeof(CD3I32); MemCpy(dst,&m->t,m->tri_cnt*sizeof(CMeshTri)); dst+=m->tri_cnt*sizeof(CMeshTri); - *dst(U8 *)++ =SPT_END; + *dst++ =SPT_END; return result; } diff --git a/Apps/GrModels/Run.CPP b/Apps/GrModels/Run.CPP index 0fabfdc..e68ac14 100644 --- a/Apps/GrModels/Run.CPP +++ b/Apps/GrModels/Run.CPP @@ -1,2 +1,3 @@ -#include "/Apps/GrModels/Load" +Cd(__DIR__);; +#include "Load" Models; \ No newline at end of file diff --git a/Apps/KeepAway/KeepAway.CPP b/Apps/KeepAway/KeepAway.CPP index 2f2db77..159459e 100644 --- a/Apps/KeepAway/KeepAway.CPP +++ b/Apps/KeepAway/KeepAway.CPP @@ -618,7 +618,7 @@ U0 KeepAway() Preempt(OFF); Fs->win_inhibit|=WIG_DBL_CLICK; - WordStat; + AutoComplete; MenuPush( "File {" diff --git a/Apps/KeepAway/Load.CPP b/Apps/KeepAway/Load.CPP index ccd0069..90900f7 100644 --- a/Apps/KeepAway/Load.CPP +++ b/Apps/KeepAway/Load.CPP @@ -1,5 +1,6 @@ #help_index "Games" -#include "/Apps/KeepAway/KeepAway" +Cd(__DIR__);; +#include "KeepAway" #help_index "" diff --git a/Apps/KeepAway/Run.CPP b/Apps/KeepAway/Run.CPP index 855984a..522cc54 100644 --- a/Apps/KeepAway/Run.CPP +++ b/Apps/KeepAway/Run.CPP @@ -1,2 +1,3 @@ -#include "/Apps/KeepAway/Load" +Cd(__DIR__);; +#include "Load" KeepAway; \ No newline at end of file diff --git a/Apps/Logic/Load.CPP b/Apps/Logic/Load.CPP index b65c0cd..5deff4b 100644 --- a/Apps/Logic/Load.CPP +++ b/Apps/Logic/Load.CPP @@ -1,5 +1,6 @@ #help_index "Misc" -#include "/Apps/Logic/Logic" +Cd(__DIR__);; +#include "Logic" #help_index "" diff --git a/Apps/Logic/Logic.CPP b/Apps/Logic/Logic.CPP index dde6c41..7da1ce2 100644 --- a/Apps/Logic/Logic.CPP +++ b/Apps/Logic/Logic.CPP @@ -568,7 +568,7 @@ U0 DigitalLogic() SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ WinMax; - WordStat; + AutoComplete; WinBorder(ON); DocClear; GetGates; @@ -588,5 +588,5 @@ U0 DigitalLogic() SettingsPop; CleanUp; } -º%Üÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº%Üÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº%Üÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ%Üÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ%Üÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ%Üÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿª&ÜÿÿÿõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ%Üÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ª%Üÿÿÿõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ -Ò%Üÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file +ºÜÿÿÿøÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÜÿÿÿøÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÜÿÿÿøÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÜÿÿÿ÷ÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÜÿÿÿ÷ÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÜÿÿÿ÷ÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÜÿÿÿõÿÿÿ&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÜÿÿÿôÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ªÜÿÿÿõÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +ÒÜÿÿÿôÿÿÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/Apps/Logic/Run.CPP b/Apps/Logic/Run.CPP index 64b0eab..c0c50ff 100644 --- a/Apps/Logic/Run.CPP +++ b/Apps/Logic/Run.CPP @@ -1,2 +1,3 @@ -#include "/Apps/Logic/Load" +Cd(__DIR__);; +#include "Load" DigitalLogic; \ No newline at end of file diff --git a/Apps/Psalmody/Examples/abiding.CPP b/Apps/Psalmody/Examples/abiding.CPP deleted file mode 100644 index 06a8734..0000000 --- a/Apps/Psalmody/Examples/abiding.CPP +++ /dev/null @@ -1,72 +0,0 @@ -//9 has graphics -#define X 330 -#define Y 15 - -#define NUM_BEAMS 256 - -F64 beams_r[NUM_BEAMS],beams_é[NUM_BEAMS]; - -U0 DrawIt(CTask *,CDC *dc) -{ - I64 i; - F64 r,x1,y1,x2,y2; - dc->color=YELLOW; - GrCircle(dc,X,Y,10); - GrFloodFill(dc,X,Y,10); - dc->color=BROWN; - GrCircle(dc,X,Y,10); - dc->color=YELLOW; - for (i=0;itext_attr=LTCYAN<<4+BLACK; - Fs->draw_it=&DrawIt; - Fs->task_end_cb=&SndTaskEndCB; - MusicSettingsRst; - music.tempo= 2.480; - music.stacatto_factor= 0.902; - for (i=0;iwin_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); - "$$BG+H,LTCYAN$$$$FD+H,BLACK$$"; - while (!ScanKey) { - "$$WHITE$$To God...\n$$FG$$"; - Play("3etCFEsDDDDD2G3D2G3qC2eG3EqEetAAF2qG", - "I \0am \0a\0biding \0 \0 \0 \0in \0 \0Your \0 \0presence.\n\0 \0 \0 \0 \0 \0 \0 \0"); - Play("3etCFEsDDDDD2G3D2G3qC2eG3EqEetAAF2qG", - "I \0am \0a\0biding \0 \0 \0 \0in \0 \0Your \0 \0presence.\n\0 \0 \0 \0 \0 \0 \0 \0"); - Play("3DBsFGFG2eG3FRDqEGeBE", - "What \0a \0joy!\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qDBsFGFG2eG3FRDqEGeBE", - "I'm \0so \0coy!\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - } - } catch - PutExcept; - SettingsPop; -} - -Song; diff --git a/Apps/Psalmody/Examples/abyss.CPP b/Apps/Psalmody/Examples/abyss.CPP index 9b5d813..c406980 100644 --- a/Apps/Psalmody/Examples/abyss.CPP +++ b/Apps/Psalmody/Examples/abyss.CPP @@ -17,8 +17,8 @@ U0 Song() "barrier. ($LK,"Deuteronomy,4:22",A="BF:Deuteronomy,4:22"$)\n" ); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { Play("3sBBBBqCq.BeAqBh.A", "Can't \0 \0 \0 \0get \0there, \0from \0he\0re.\n\0"); diff --git a/Apps/Psalmody/Examples/almighty.CPP b/Apps/Psalmody/Examples/almighty.CPP index 132e088..ce831ee 100644 --- a/Apps/Psalmody/Examples/almighty.CPP +++ b/Apps/Psalmody/Examples/almighty.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { while (!ScanKey) { diff --git a/Apps/Psalmody/Examples/appreciate.CPP b/Apps/Psalmody/Examples/appreciate.CPP index afddee7..6f60104 100644 --- a/Apps/Psalmody/Examples/appreciate.CPP +++ b/Apps/Psalmody/Examples/appreciate.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { while (!ScanKey) { diff --git a/Apps/Psalmody/Examples/awake.CPP b/Apps/Psalmody/Examples/awake.CPP index f07bed5..812aa80 100644 --- a/Apps/Psalmody/Examples/awake.CPP +++ b/Apps/Psalmody/Examples/awake.CPP @@ -49,8 +49,8 @@ U0 Song() try { task=PopUpViewPrint("$LK,"Mark,14:37",A="BF:Mark,14:37"$\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { "$$GREEN$$Jesus talking...$$FG$$\n"; Play("3eBCqB2sG3D2G3DetCGFsCBCBetCGBeBGsBCBC", diff --git a/Apps/Psalmody/Examples/bedewed.CPP b/Apps/Psalmody/Examples/bedewed.CPP index 23c854b..45db7c7 100644 Binary files a/Apps/Psalmody/Examples/bedewed.CPP and b/Apps/Psalmody/Examples/bedewed.CPP differ diff --git a/Apps/Psalmody/Examples/blinded.CPP b/Apps/Psalmody/Examples/blinded.CPP index d59c688..92dfac8 100644 --- a/Apps/Psalmody/Examples/blinded.CPP +++ b/Apps/Psalmody/Examples/blinded.CPP @@ -16,6 +16,7 @@ U0 Song() CTask *task; SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; DocCursor; DocClear; @@ -23,8 +24,8 @@ U0 Song() try { task=PopUpViewPrint("$LK,"BF:Acts,9:3"$\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { t0=Beat; Play("3qEeACA2G3qCEC2G3E", diff --git a/Apps/Psalmody/Examples/depending.CPP b/Apps/Psalmody/Examples/depending.CPP index dfd2c8a..4e74f01 100644 --- a/Apps/Psalmody/Examples/depending.CPP +++ b/Apps/Psalmody/Examples/depending.CPP @@ -3,12 +3,13 @@ U0 Song() { CTask *task; Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { task=PopUpViewPrint("$LK,"BF:Luke,12:16"$\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { Play("3etGREqDDBRGCB", "It \0 \0de\0pends \0 \0on \0 \0the \0wea\0ther.\n\0"); diff --git a/Apps/Psalmody/Examples/determination.CPP b/Apps/Psalmody/Examples/determination.CPP index e1c4573..79e1284 100644 --- a/Apps/Psalmody/Examples/determination.CPP +++ b/Apps/Psalmody/Examples/determination.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { while (!ScanKey) { diff --git a/Apps/Psalmody/Examples/dialogue.CPP b/Apps/Psalmody/Examples/dialogue.CPP index ba66122..40c96a4 100644 Binary files a/Apps/Psalmody/Examples/dialogue.CPP and b/Apps/Psalmody/Examples/dialogue.CPP differ diff --git a/Apps/Psalmody/Examples/downfall.CPP b/Apps/Psalmody/Examples/downfall.CPP index 1f8794b..f7389a8 100644 --- a/Apps/Psalmody/Examples/downfall.CPP +++ b/Apps/Psalmody/Examples/downfall.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; while (TRUE) { Play("et2G32G3Gq2G3qCq2G3sFAFAq2G3etGDAqA", diff --git a/Apps/Psalmody/Examples/efforts.CPP b/Apps/Psalmody/Examples/efforts.CPP index 2fd099f..e333e43 100644 --- a/Apps/Psalmody/Examples/efforts.CPP +++ b/Apps/Psalmody/Examples/efforts.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { while (!ScanKey) { diff --git a/Apps/Psalmody/Examples/elijah.CPP b/Apps/Psalmody/Examples/elijah.CPP index f4c73b5..2f75df0 100644 Binary files a/Apps/Psalmody/Examples/elijah.CPP and b/Apps/Psalmody/Examples/elijah.CPP differ diff --git a/Apps/Psalmody/Examples/epicurus.CPP b/Apps/Psalmody/Examples/epicurus.CPP index 68ea96c..84c90af 100644 --- a/Apps/Psalmody/Examples/epicurus.CPP +++ b/Apps/Psalmody/Examples/epicurus.CPP @@ -19,8 +19,8 @@ U0 Song() "$LK,"John,16:24",A="BF:John,16:24"$\n" ); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); DocRecalc(DocPut(task)); //Reformat word-wrap with new window size. while (!ScanKey) { Play("3qBeCDqCAetAACeECsF2G3F2GqG", diff --git a/Apps/Psalmody/Examples/exalt.CPP b/Apps/Psalmody/Examples/exalt.CPP index d6d96bc..9ce9d58 100644 --- a/Apps/Psalmody/Examples/exalt.CPP +++ b/Apps/Psalmody/Examples/exalt.CPP @@ -16,6 +16,7 @@ U0 Song() Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { while (!ScanKey) { diff --git a/Apps/Psalmody/Examples/expedition.CPP b/Apps/Psalmody/Examples/expedition.CPP index df5bf9d..3e507eb 100644 Binary files a/Apps/Psalmody/Examples/expedition.CPP and b/Apps/Psalmody/Examples/expedition.CPP differ diff --git a/Apps/Psalmody/Examples/fairness.CPP b/Apps/Psalmody/Examples/fairness.CPP index 2b467a9..2f765c5 100644 --- a/Apps/Psalmody/Examples/fairness.CPP +++ b/Apps/Psalmody/Examples/fairness.CPP @@ -3,6 +3,7 @@ U0 Song() { CTask *task; Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { task=PopUpViewPrint( @@ -12,8 +13,8 @@ U0 Song() "$LK,"BF:Luke,15:21"$\n" ); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); "$$WW+H,1$$"; while (!ScanKey) { Play("3qGGsEAEAqAsF2G3F2G3qCeEFqD", diff --git a/Apps/Psalmody/Examples/finger.CPP b/Apps/Psalmody/Examples/finger.CPP index d130d39..a35e2ac 100644 Binary files a/Apps/Psalmody/Examples/finger.CPP and b/Apps/Psalmody/Examples/finger.CPP differ diff --git a/Apps/Psalmody/Examples/first.CPP b/Apps/Psalmody/Examples/first.CPP index a5122a7..ce545c5 100644 Binary files a/Apps/Psalmody/Examples/first.CPP and b/Apps/Psalmody/Examples/first.CPP differ diff --git a/Apps/Psalmody/Examples/fishermen.CPP b/Apps/Psalmody/Examples/fishermen.CPP index f237407..7f4a173 100644 Binary files a/Apps/Psalmody/Examples/fishermen.CPP and b/Apps/Psalmody/Examples/fishermen.CPP differ diff --git a/Apps/Psalmody/Examples/forasmuch.CPP b/Apps/Psalmody/Examples/forasmuch.CPP index 3d32112..82dda0a 100644 Binary files a/Apps/Psalmody/Examples/forasmuch.CPP and b/Apps/Psalmody/Examples/forasmuch.CPP differ diff --git a/Apps/Psalmody/Examples/free.CPP b/Apps/Psalmody/Examples/free.CPP index 583125a..3233b66 100644 --- a/Apps/Psalmody/Examples/free.CPP +++ b/Apps/Psalmody/Examples/free.CPP @@ -144,8 +144,8 @@ U0 Song() try { task=PopUpViewPrint("$LK,"Romans,8:28",A="BF:Romans,8:28"$\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { Play("3qEEBeBDsBBBBqDsBFBFD2G3D2G", "Free \0will... \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0 \0 \0fail.\n\0 \0 \0 \0"); diff --git a/Apps/Psalmody/Examples/furnishing.CPP b/Apps/Psalmody/Examples/furnishing.CPP index a387880..e06bb4b 100644 Binary files a/Apps/Psalmody/Examples/furnishing.CPP and b/Apps/Psalmody/Examples/furnishing.CPP differ diff --git a/Apps/Psalmody/Examples/good.CPP b/Apps/Psalmody/Examples/good.CPP index 95472af..f80a076 100644 Binary files a/Apps/Psalmody/Examples/good.CPP and b/Apps/Psalmody/Examples/good.CPP differ diff --git a/Apps/Psalmody/Examples/gutenberg.CPP b/Apps/Psalmody/Examples/gutenberg.CPP index 6fe56f9..cd9dd51 100644 Binary files a/Apps/Psalmody/Examples/gutenberg.CPP and b/Apps/Psalmody/Examples/gutenberg.CPP differ diff --git a/Apps/Psalmody/Examples/happy.CPP b/Apps/Psalmody/Examples/happy.CPP index 467cca1..1390fff 100644 Binary files a/Apps/Psalmody/Examples/happy.CPP and b/Apps/Psalmody/Examples/happy.CPP differ diff --git a/Apps/Psalmody/Examples/hope.CPP b/Apps/Psalmody/Examples/hope.CPP index 537049c..6b0d214 100644 Binary files a/Apps/Psalmody/Examples/hope.CPP and b/Apps/Psalmody/Examples/hope.CPP differ diff --git a/Apps/Psalmody/Examples/image.CPP b/Apps/Psalmody/Examples/image.CPP index 182ae3e..12ec034 100644 --- a/Apps/Psalmody/Examples/image.CPP +++ b/Apps/Psalmody/Examples/image.CPP @@ -3,6 +3,7 @@ U0 Song() { CTask *task; Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { task=PopUpViewPrint( @@ -12,8 +13,8 @@ U0 Song() "$LK,"BF:Luke,11:5"$\n" ); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { Play("3qBBE2GG3FFC", "We \0are \0in \0the \0image \0of \0God.\n\0 \0"); diff --git a/Apps/Psalmody/Examples/josh.CPP b/Apps/Psalmody/Examples/josh.CPP index b4f86e7..73f6690 100644 Binary files a/Apps/Psalmody/Examples/josh.CPP and b/Apps/Psalmody/Examples/josh.CPP differ diff --git a/Apps/Psalmody/Examples/keeping.CPP b/Apps/Psalmody/Examples/keeping.CPP index 9c8767a..2a76371 100644 Binary files a/Apps/Psalmody/Examples/keeping.CPP and b/Apps/Psalmody/Examples/keeping.CPP differ diff --git a/Apps/Psalmody/Examples/kept.CPP b/Apps/Psalmody/Examples/kept.CPP index 064b134..8a18630 100644 --- a/Apps/Psalmody/Examples/kept.CPP +++ b/Apps/Psalmody/Examples/kept.CPP @@ -3,11 +3,12 @@ U0 Song() { CTask *task; Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; try { task=PopUpViewPrint("$LK,"BF:Matthew,19:16"$\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); "$$WW+H,1$$"; while (!ScanKey) { Play("3eGAetCCCFFDqAeAAFAAFqG", diff --git a/Apps/Psalmody/Examples/killed.CPP b/Apps/Psalmody/Examples/killed.CPP index 236afb8..6d93cd4 100644 --- a/Apps/Psalmody/Examples/killed.CPP +++ b/Apps/Psalmody/Examples/killed.CPP @@ -13,7 +13,7 @@ U0 Song() Play("qBsEGeBDe.AsCeA2qF3sBBeACBBsBB", "I'm \0not \0 \0 \0spry.\n\0 \0 \0 \0 \0 \0 \0 \0I \0best \0chill.\n\0 \0 \0"); Play("eDDsGFGFeEBqGM5/4", - "If \0 \0God \0 \0 \0 \0 \0 \0ask,\n\0"); + "If \0 \0God \0 \0 \0 \0 \0 \0asked,\n\0"); Play("eBGF4A3e.FsEqAAM4/4", " \0\"$$RED$$Can \0 \0 \0you \0 \0Kill?$$FG$$\"\n\0 \0"); Play("eDDsGFGFeEBqGM5/4", diff --git a/Apps/Psalmody/Examples/mightest.CPP b/Apps/Psalmody/Examples/mightest.CPP index 57c8083..ab8f9b7 100644 --- a/Apps/Psalmody/Examples/mightest.CPP +++ b/Apps/Psalmody/Examples/mightest.CPP @@ -28,6 +28,7 @@ U0 DrawIt(CTask *task,CDC *dc) U0 Song() { SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ + MusicSettingsRst; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; diff --git a/Apps/Psalmody/Examples/mildly.CPP b/Apps/Psalmody/Examples/mildly.CPP index 114ce31..d6aab0d 100644 Binary files a/Apps/Psalmody/Examples/mildly.CPP and b/Apps/Psalmody/Examples/mildly.CPP differ diff --git a/Apps/Psalmody/Examples/nay.CPP b/Apps/Psalmody/Examples/nay.CPP index dcf9655..81b5692 100644 --- a/Apps/Psalmody/Examples/nay.CPP +++ b/Apps/Psalmody/Examples/nay.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { "$$WW+H,1$$"; diff --git a/Apps/Psalmody/Examples/night.CPP b/Apps/Psalmody/Examples/night.CPP index a3c0f59..ac0bf3b 100644 Binary files a/Apps/Psalmody/Examples/night.CPP and b/Apps/Psalmody/Examples/night.CPP differ diff --git a/Apps/Psalmody/Examples/partake.CPP b/Apps/Psalmody/Examples/partake.CPP index 86340d7..7d43b8b 100644 Binary files a/Apps/Psalmody/Examples/partake.CPP and b/Apps/Psalmody/Examples/partake.CPP differ diff --git a/Apps/Psalmody/Examples/permitted.CPP b/Apps/Psalmody/Examples/permitted.CPP index 5793e4f..794e135 100644 --- a/Apps/Psalmody/Examples/permitted.CPP +++ b/Apps/Psalmody/Examples/permitted.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { while (!ScanKey) { diff --git a/Apps/Psalmody/Examples/personal.CPP b/Apps/Psalmody/Examples/personal.CPP index 66dd810..7c97475 100644 --- a/Apps/Psalmody/Examples/personal.CPP +++ b/Apps/Psalmody/Examples/personal.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { while (!ScanKey) { diff --git a/Apps/Psalmody/Examples/proponent.CPP b/Apps/Psalmody/Examples/proponent.CPP index 7e434ff..2da7a88 100644 --- a/Apps/Psalmody/Examples/proponent.CPP +++ b/Apps/Psalmody/Examples/proponent.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; while (TRUE) { Play("qCqAqAsEDEDqBqBetGGEs2G3C2G3C"); diff --git a/Apps/Psalmody/Examples/prosper.CPP b/Apps/Psalmody/Examples/prosper.CPP index 9833125..7e4d17c 100644 Binary files a/Apps/Psalmody/Examples/prosper.CPP and b/Apps/Psalmody/Examples/prosper.CPP differ diff --git a/Apps/Psalmody/Examples/purpose.CPP b/Apps/Psalmody/Examples/purpose.CPP index fbe20ec..c7a1c56 100644 Binary files a/Apps/Psalmody/Examples/purpose.CPP and b/Apps/Psalmody/Examples/purpose.CPP differ diff --git a/Apps/Psalmody/Examples/reasoning.CPP b/Apps/Psalmody/Examples/reasoning.CPP index ea45560..7be0042 100644 --- a/Apps/Psalmody/Examples/reasoning.CPP +++ b/Apps/Psalmody/Examples/reasoning.CPP @@ -2,6 +2,7 @@ U0 Song() { Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { while (!ScanKey) { diff --git a/Apps/Psalmody/Examples/reliance.CPP b/Apps/Psalmody/Examples/reliance.CPP index b217f4d..16abaec 100644 --- a/Apps/Psalmody/Examples/reliance.CPP +++ b/Apps/Psalmody/Examples/reliance.CPP @@ -3,6 +3,7 @@ U0 Song() { CTask *task; Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { task=PopUpViewPrint( @@ -16,8 +17,8 @@ U0 Song() "am I worth?\n" ); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); DocRecalc(DocPut(task)); //Reformat word-wrap with new window size. while (!ScanKey) { Play("3qGsB2G3B2G3eF2G3sGGGGeRFC2G3qFC", diff --git a/Apps/Psalmody/Examples/restless.CPP b/Apps/Psalmody/Examples/restless.CPP index f3abb24..8940786 100644 --- a/Apps/Psalmody/Examples/restless.CPP +++ b/Apps/Psalmody/Examples/restless.CPP @@ -9,8 +9,8 @@ U0 Song() try { task=PopUpViewPrint("$LK,"Ecclesiastes,5:12",A="BF:Ecclesiastes,5:12"$\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { Play("3sDDDACCADDACCAe.DsCCC2G3FD2G3FD2G3CCAe.D", "I \0 \0 \0 \0got \0 \0 \0paid, \0 \0 \0to\0 \0 \0day.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); diff --git a/Apps/Psalmody/Examples/rifled.CPP b/Apps/Psalmody/Examples/rifled.CPP deleted file mode 100644 index b85e977..0000000 Binary files a/Apps/Psalmody/Examples/rifled.CPP and /dev/null differ diff --git a/Apps/Psalmody/Examples/satisfaction.CPP b/Apps/Psalmody/Examples/satisfaction.CPP index 7d29058..af7a9fd 100644 Binary files a/Apps/Psalmody/Examples/satisfaction.CPP and b/Apps/Psalmody/Examples/satisfaction.CPP differ diff --git a/Apps/Psalmody/Examples/savour.CPP b/Apps/Psalmody/Examples/savour.CPP new file mode 100644 index 0000000..6e5873e --- /dev/null +++ b/Apps/Psalmody/Examples/savour.CPP @@ -0,0 +1,30 @@ +//7 has words +U0 Song() +{ + Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; + music.tempo= 2.480; + music.stacatto_factor= 0.902; + try { + while (!ScanKey) { + Play("3qFCeEAEAqDeCEqBA", + "This \0 \0 \0 \0 \0 \0sand\0wich \0is \0bland.\n\0 \0"); + Play("eCCqDeDDqEeAECECEqA", + "God \0 \0damn, \0my \0 \0tastes \0 \0 \0 \0sure \0 \0are \0grand.\n\0"); + Play("M6/8"); + Play("FEB2G3sAGeCqE", + "Ho \0hum. \0 \0 \0 \0How \0 \0rude!\n\0"); + Play("FEB2G3sAGeCqE", + "That \0bum \0 \0 \0 \0likes \0his \0food.\n\0"); + Play("2G3sAGeDqGFEB", + " \0 \0Likes \0his \0food!\n\0 \0 \0 \0"); + Play("2G3sAAeEqD2G3sDBDB2eGG"); + Play("3AsEDqAeAsBGEBEB2qG3sDBDB"); + Play("2eGG3AsEDqAeAsBGEBEB"); + } + } catch + PutExcept; + Snd(0); +} + +Song; diff --git a/Apps/Psalmody/Examples/scriptures.CPP b/Apps/Psalmody/Examples/scriptures.CPP index f21d9f3..9408e76 100644 Binary files a/Apps/Psalmody/Examples/scriptures.CPP and b/Apps/Psalmody/Examples/scriptures.CPP differ diff --git a/Apps/Psalmody/Examples/service.CPP b/Apps/Psalmody/Examples/service.CPP index 3c8fc88..f6d6d82 100644 --- a/Apps/Psalmody/Examples/service.CPP +++ b/Apps/Psalmody/Examples/service.CPP @@ -13,8 +13,8 @@ U0 Song() "$LK,"John,13:14",A="BF:John,13:14"$\n" ); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { "$$GREEN$$Jesus talking...\n$$FG$$"; Play("M6/8"); diff --git a/Apps/Psalmody/Examples/shield.CPP b/Apps/Psalmody/Examples/shield.CPP index 2ba35f2..82cd4e1 100644 Binary files a/Apps/Psalmody/Examples/shield.CPP and b/Apps/Psalmody/Examples/shield.CPP differ diff --git a/Apps/Psalmody/Examples/signifies.CPP b/Apps/Psalmody/Examples/signifies.CPP index e995db8..0119c55 100644 --- a/Apps/Psalmody/Examples/signifies.CPP +++ b/Apps/Psalmody/Examples/signifies.CPP @@ -9,8 +9,8 @@ U0 Song() try { task=PopUpViewPrint("$LK,"Luke,12:12",A="BF:Luke,12:12"$\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { Play("3hDeDA2qG3hDeD2GqF", "It \0sig\0ni\0fies\n\0a \0big \0sur\0prise.\n\0"); diff --git a/Apps/Psalmody/Examples/small.CPP b/Apps/Psalmody/Examples/small.CPP index 859aeef..034a2f5 100644 Binary files a/Apps/Psalmody/Examples/small.CPP and b/Apps/Psalmody/Examples/small.CPP differ diff --git a/Apps/Psalmody/Examples/struggles.CPP b/Apps/Psalmody/Examples/struggles.CPP index e8c075e..2c6b49c 100644 Binary files a/Apps/Psalmody/Examples/struggles.CPP and b/Apps/Psalmody/Examples/struggles.CPP differ diff --git a/Apps/Psalmody/Examples/sustain.CPP b/Apps/Psalmody/Examples/sustain.CPP index 2f21863..2bd7d11 100644 Binary files a/Apps/Psalmody/Examples/sustain.CPP and b/Apps/Psalmody/Examples/sustain.CPP differ diff --git a/Apps/Psalmody/Examples/teachings.CPP b/Apps/Psalmody/Examples/teachings.CPP index 3150108..41a709d 100644 --- a/Apps/Psalmody/Examples/teachings.CPP +++ b/Apps/Psalmody/Examples/teachings.CPP @@ -9,8 +9,8 @@ U0 Song() try { task=PopUpViewPrint("$LK,"Proverbs,11:25",A="BF:Proverbs,11:25"$\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { Play("2eG3CDAqEsACACGEGEqDsAAAAetCDD", "Ple\0ase \0te\0ach \0me.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); diff --git a/Apps/Psalmody/Examples/thereupon.CPP b/Apps/Psalmody/Examples/thereupon.CPP index 68e900a..e6f8007 100644 --- a/Apps/Psalmody/Examples/thereupon.CPP +++ b/Apps/Psalmody/Examples/thereupon.CPP @@ -50,8 +50,8 @@ U0 Song() "$LK,"Daniel,9:17",A="BF:Daniel,9:17"$\n" ); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); "$$BG+H,LTCYAN$$$$FG+H,BLACK$$"; while (!ScanKey) { Play("2qG3eCB2hGqG3eCB2qG3A", diff --git a/Apps/Psalmody/Examples/tookest.CPP b/Apps/Psalmody/Examples/tookest.CPP index 38a2e66..8c2078d 100644 --- a/Apps/Psalmody/Examples/tookest.CPP +++ b/Apps/Psalmody/Examples/tookest.CPP @@ -9,8 +9,8 @@ U0 Song() try { task=PopUpViewPrint("$LK,"Luke,17:36",A="BF:Luke,17:36"$\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { Play("3qABeCq.AqCDeEq.A", "Pile \0of \0clo\0ths.\n\0Pile \0of \0clo\0ths.\n\0"); diff --git a/Apps/Psalmody/Examples/valued.CPP b/Apps/Psalmody/Examples/valued.CPP index 2d1dc52..8ea231c 100644 Binary files a/Apps/Psalmody/Examples/valued.CPP and b/Apps/Psalmody/Examples/valued.CPP differ diff --git a/Apps/Psalmody/Examples/vengeance.CPP b/Apps/Psalmody/Examples/vengeance.CPP index 1036fb7..48dba21 100644 Binary files a/Apps/Psalmody/Examples/vengeance.CPP and b/Apps/Psalmody/Examples/vengeance.CPP differ diff --git a/Apps/Psalmody/Examples/verses.CPP b/Apps/Psalmody/Examples/verses.CPP index 52c1278..a69889c 100644 --- a/Apps/Psalmody/Examples/verses.CPP +++ b/Apps/Psalmody/Examples/verses.CPP @@ -3,6 +3,7 @@ U0 Song() { CTask *task; Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { task=PopUpViewPrint( @@ -12,8 +13,8 @@ U0 Song() "want God to talk some more. The $LK+PU,"Holy Spirit",A="FI:::/Adam/God/HSNotes.TXT"$ can " "puppet you.\n"); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); "$$WW+H,1$$"; DocRecalc(DocPut(task)); //Reformat word-wrap with new window size. while (!ScanKey) { diff --git a/Apps/Psalmody/Examples/wisdom.CPP b/Apps/Psalmody/Examples/wisdom.CPP index fdb54c5..f215842 100644 Binary files a/Apps/Psalmody/Examples/wisdom.CPP and b/Apps/Psalmody/Examples/wisdom.CPP differ diff --git a/Apps/Psalmody/Examples/witherto.CPP b/Apps/Psalmody/Examples/witherto.CPP index f96a209..26f925b 100644 --- a/Apps/Psalmody/Examples/witherto.CPP +++ b/Apps/Psalmody/Examples/witherto.CPP @@ -3,6 +3,7 @@ U0 Song() { CTask *task; Fs->task_end_cb=&SndTaskEndCB; + MusicSettingsRst; music.tempo=2.5; try { task=PopUpViewPrint( @@ -11,8 +12,8 @@ U0 Song() "$LK,"Matthew,25:18",A="BF:Matthew,25:18"$\n" ); TaskWait(task); - SetWinHorz(Fs->win_left,Fs->win_right,task); - SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); + WinHorz(Fs->win_left,Fs->win_right,task); + WinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { Play("2qG3sFEFEqDBEetCB2G3qFsBDBD", " \0Damn \0 \0 \0 \0 \0 \0fig \0 \0 \0 \0tree.\n\0 \0 \0 \0 \0"); diff --git a/Apps/Psalmody/Examples/zip.CPP b/Apps/Psalmody/Examples/zip.CPP index 71a19fa..1056a7f 100644 Binary files a/Apps/Psalmody/Examples/zip.CPP and b/Apps/Psalmody/Examples/zip.CPP differ diff --git a/Apps/Psalmody/Help.TXT b/Apps/Psalmody/Help.TXT index ff1818c..06e032d 100644 --- a/Apps/Psalmody/Help.TXT +++ b/Apps/Psalmody/Help.TXT @@ -10,15 +10,15 @@ $WW,1$$PURPLE$$TX+CX,"Psalmody Help"$$FG$ * You can take the $LK,"Play",A="MN:Play"$() statements out of a song file and place them in your programs. You can also add a song to a document with $GREEN$$FG$, but you should do it after pressing $GREEN$$FG$ because the clipboard-insert in $GREEN$$FG$ is screwy. See this $SO,"",A="2qG3ECB2eGG3qCeFDsBGBG2qG3ECB2eGG3qCeFDsBGBGqEeEFqEB2eG3FetCAGqFCEeEFqEB2eG3FetCAGqFC"$ after pressing $GREEN$$FG$, now. -* You can call $LK,"JukeBox",A="FF:::/Apps/Psalmody/JukeBox.CPP,JukeBox"$("HOME/Psalmody"); to play your songs. +* You can call $LK,"JukeBox",A="FF:::/Apps/Psalmody/JukeBox.CPP,JukeBox"$("::/Home/Psalmody"); to play your songs. -* To create a $GREEN$.SND$FG$ file which can be exported and played under Windows, set the $GREEN$Bool$FG$ $LK,"snd.record",A="MN:CSndGlbls"$ to $GREEN$TRUE$FG$, play music, and set it to $GREEN$FALSE$FG$. Then, call $LK,"SndFileCreate",A="MN:SndFileCreate"$(). You might wish to make a $GREEN$$FG$ to toggle this system level recording feat. See $LK,"Snd",A="MN:Snd"$(). Add this code to your $LK,"HOME/Adam3cKeyPlugIns.CPP"$ file. +* To create a $GREEN$.SND$FG$ file which can be exported and played under Windows, set the $GREEN$Bool$FG$ $LK,"snd.record",A="MN:CSndGlbls"$ to $GREEN$TRUE$FG$, play music, and set it to $GREEN$FALSE$FG$. Then, call $LK,"SndFileCreate",A="MN:SndFileCreate"$(). You might wish to make a $GREEN$$FG$ to toggle this system level recording feat. See $LK,"Snd",A="MN:Snd"$(). Add this code to your $LK,"::/Home/AdamKeyPlugIns.CPP"$ file. $PURPLE$U0 CtrlAltR(I64) { snd.record=!snd.record; } -SetCtrlAltLetCB('R',&CtrlAltR,"Toggle snd.record");$FG$ +CtrlAltLetCBSet('R',&CtrlAltR,"Toggle snd.record");$FG$ * When calling $LK,"SndFileCreate",A="MN:SndFileCreate"$() you can set a waveform. The PC speaker is $LK,"WF_SQUARE",A="MN:WF_SQUARE"$. You can select reverb and averaging, also. diff --git a/Apps/Psalmody/Install.CPP b/Apps/Psalmody/Install.CPP index 125c19b..0a42817 100644 --- a/Apps/Psalmody/Install.CPP +++ b/Apps/Psalmody/Install.CPP @@ -1,3 +1,2 @@ -if (!FileFind("HOME/Psalmody",,FUF_JUST_DIRS)) { - MkDir("HOME/Psalmody"); -} +if (!FileFind("::/Home/Psalmody",,FUF_JUST_DIRS)) + MkDir("::/Home/Psalmody"); diff --git a/Apps/Psalmody/JukeBox.CPP b/Apps/Psalmody/JukeBox.CPP index 6eb8a91..a2e36fd 100644 --- a/Apps/Psalmody/JukeBox.CPP +++ b/Apps/Psalmody/JukeBox.CPP @@ -1,12 +1,12 @@ CTask *SingleSong(U8 *msg,U8 *name) { Bool old_preempt=Preempt(OFF); - CTask *task=Spawn(&SrvUserCmdLine,NULL,name,,Fs); + CTask *task=Spawn(&SrvCmdLine,NULL,name,,Fs); StrCpy(task->task_title,name); task->title_src=TTS_LOCKED_CONST; TaskExe(task,Fs,";",1<win_left,task->win_left+50,task); - SetWinVert(2,2+8,task); + WinHorz(task->win_left,task->win_left+50,task); + WinVert(2,2+8,task); Preempt(old_preempt); TaskExe(task,NULL,msg,1<max_entries=100; @@ -27,7 +27,7 @@ Bool JBPutKey(CDoc *doc,U8 *,I64 ch,I64 sc) tempde=doc_ce->left_exp; if (sc.u8[0]==SC_DELETE ) { Beep; - Silent(ON); + Silent; Del(tempde->full_name); Silent(OFF); } else if ('0'<=ch<='9') { @@ -62,7 +62,7 @@ public U0 JukeBox(U8 *dirname=NULL,U8 **_filename=NULL) if (_filename) *_filename=NULL; if (!dirname) - dirname=StrNew("HOME/Psalmody"); + dirname=StrNew("::/Home/Psalmody"); else dirname=StrNew(dirname); st=MStrPrint("%s/*.CPP.Z",dirname); diff --git a/Apps/Psalmody/JukePuppet.CPP b/Apps/Psalmody/JukePuppet.CPP index dbaf3f9..81de261 100644 --- a/Apps/Psalmody/JukePuppet.CPP +++ b/Apps/Psalmody/JukePuppet.CPP @@ -72,12 +72,12 @@ U0 JukeSongPuppet(CTask *juke_task,I64 passes,I64 song_num,U8 *name) Kill(task); } -public U0 JukeSongsPuppet(U8 *dir="HOME/Psalmody",I64 passes=2, +public U0 JukeSongsPuppet(U8 *dir="::/Home/Psalmody",I64 passes=2, I64 start_song=0,I64 end_song=MAX_I64) {//Help make music video by puppeting JukeBox task. I64 i; CDirEntry *tempde,*tempde1; - CTask *juke_task=SpawnUser("JukeBox(0x%X);\n",dir); + CTask *juke_task=User("JukeBox(0x%X);\n",dir); Cd(dir); tempde1=FilesFind("*",FUF_RECURSE|FUF_JUST_TXT|FUF_JUST_FILES); for (tempde=tempde1,i=0;tempde && i",BI=1$ - -$SP,"<2>",BI=2$ - -$SP,"<3>",BI=3$ - -$SP,"<4>",BI=4$ - -$SP,"<5>",BI=5$ - -$SP,"<6>",BI=6$ - - -$SP,"<7>",BI=7$ - - -$SP,"<8>",BI=8$ - - -$SP,"<9>",BI=9$ - - -$SP,"<10>",BI=10$ - - -$SP,"<11>",BI=11$ - - - - - - - -$SP,"<12>",BI=12$ - - - - -$SP,"<13>",BI=13$ - -$SP,"<14>",BI=14$ - -$SP,"<15>",BI=15$ - - -$SP,"<16>",BI=16$ -$ID,-8$ -#define PSM_NOTE_SPACING 9 -#define PSM_NUM_DURATIONS 12 - -F64 psm_durations[PSM_NUM_DURATIONS+1]={ -2*.25/3,.25,2*.5/3,.5,2.0/3.0,0.5*1.5,1.0,1.5,2.0,3.0,4.0,6.0,1000000.0}; -U8 *psm_duration_lst="st\0s\0et\0e\0qt\0e.\0q\0q.\0h\0h.\0w\0w.\0"; -CSprite *psm_duration_imgs[PSM_NUM_DURATIONS]={$IB,"<1>",BI=1$,$IB,"<1>",BI=1$,$IB,"<2>",BI=2$, - $IB,"<2>",BI=2$,$IB,"<3>",BI=3$,$IB,"<2>",BI=2$,$IB,"<3>",BI=3$,$IB,"<3>",BI=3$, - $IB,"<4>",BI=4$,$IB,"<4>",BI=4$,$IB,"<5>",BI=5$,$IB,"<5>",BI=5$}; -Bool psm_triplet_durations[PSM_NUM_DURATIONS]={TRUE,FALSE,TRUE, - FALSE,TRUE,FALSE,FALSE,FALSE, - FALSE,FALSE,FALSE,FALSE}; - -Bool PsmHasWords(U8 *st) -{ - if (st && *st && (StrLen(st)>1 || *st!=CH_SPACE && *st!=CH_SHIFT_SPACE)) - return TRUE; - else - return FALSE; -} - -Bool PsmIsDotted(I64 duration) -{ - U8 *st=LstSub(duration,psm_duration_lst); - if (st[1]=='.') - return TRUE; - else - return FALSE; -} - -U0 PsmSetWidth(PsmNote *tempo) -{ - if (tempo->type==OT_METER) - tempo->width=12; - else { - tempo->width=PSM_NOTE_SPACING; - if (PsmIsDotted(tempo->duration)) - tempo->width+=PSM_NOTE_SPACING/2; - if (Bt(&tempo->flags,Of_SHARP) || Bt(&tempo->flags,Of_FLAT)) - tempo->width+=PSM_NOTE_SPACING; - } -} - -U0 PsmRecalcNoteXY() -{ - F64 measure_len=4,measure_left=measure_len; - PsmNote *tempo=oc.root.next; - I64 x=8-oc.screen_x,note,octave; - while (TRUE) { - tempo->x=x; - tempo->y=50; - if (tempo==&oc.root) - break; - else { - if (tempo->type!=OT_METER) { - octave=tempo->octave; - if (octave!=OCTAVE_REST) { - note=tempo->note; - if (Bt(&tempo->flags,Of_SHARP)) - note--; - if (Bt(&tempo->flags,Of_FLAT)) - note++; - if (note<0) { - note=11; - octave--; - } else if (note>11) { - note=0; - octave++; - } - note=music.note_map[*LstSub(note,psm_note_lst)-'A']; - tempo->y=(15+(psm_note_map[note]-7*(octave-2)))*4; - } - } - x+=tempo->width; - if (tempo->type==OT_METER) { - measure_len=tempo->meter_top*4.0/tempo->meter_bottom; - measure_left=0; - } else - measure_left-=psm_durations[tempo->duration]; - if (measure_left<0.001) { - x+=PSM_NOTE_SPACING; - measure_left=measure_len; - } - } - tempo=tempo->next; - } -} - -U0 PsmMarkSelected(I64 x1,I64 x2,Bool sel) -{ - PsmNote *tempo=oc.root.next; - while (tempo!=&oc.root) { - if (sel) { - if (x1<=tempo->x<=x2) - tempo->flags|=OF_SELECTED; - } else - tempo->flags&=~OF_SELECTED; - tempo=tempo->next; - } -} - -PsmNote *PsmNoteCopy(PsmNote *tempo) -{ - PsmNote *tempo1=MAllocIdentical(tempo); - if (tempo->word) - tempo1->word=StrNew(tempo->word); - else - tempo1->word=NULL; - return tempo1; -} - -U0 PsmNoteDel(PsmNote *tempo) -{ - Free(tempo->word); - Free(tempo); -} - -U0 PsmSongDel(PsmNote *root) -{ - PsmNote *tempo,*tempo1; - tempo=root->next; - while (tempo!=root) { - tempo1=tempo->next; - PsmNoteDel(tempo); - tempo=tempo1; - } - root->next=root->last=root; -} - -U0 PsmCutToClipboard() -{ - PsmNote *tempo,*tempo1; - PsmSongDel(&oc.clipboard); - tempo=oc.root.next; - while (tempo!=&oc.root) { - tempo1=tempo->next; - if (tempo->flags&OF_SELECTED) { - if (oc.cur_note==tempo) - oc.cur_note=tempo->next; - QueRem(tempo); - tempo->flags&=~OF_SELECTED; - QueIns(tempo,oc.clipboard.last); - } - tempo=tempo1; - } -} - -U0 PsmPasteClipboard() -{ - PsmNote *tempo,*tempo1; - tempo=oc.clipboard.next; - while (tempo!=&oc.clipboard) { - tempo1=PsmNoteCopy(tempo); - QueIns(tempo1,oc.cur_note->last); - tempo=tempo->next; - } -} - -U0 PsmCopyToClipboard() -{ - PsmNote *tempo,*tempo1; - PsmSongDel(&oc.clipboard); - tempo=oc.root.next; - while (tempo!=&oc.root) { - if (tempo->flags&OF_SELECTED) { - tempo->flags&=~OF_SELECTED; - tempo1=PsmNoteCopy(tempo); - QueIns(tempo1,oc.clipboard.last); - } - tempo=tempo->next; - } -} - -PsmNote *PsmFindNote(I64 x,I64) -{ - PsmNote *tempo=oc.root.next; - PsmRecalcNoteXY; - x+=PSM_NOTE_SPACING/2; - while (x>tempo->next->x && tempo!=&oc.root) - tempo=tempo->next; - return tempo; -} - -Bool PsmBlink() -{ - if (Blink || oc.playing) - return TRUE; - else - return FALSE; -} - -U0 DrawNote(CDC *dc,I64 x,I64 y,I64 duration) -{ - if (0<=duration<=PSM_NUM_DURATIONS) { - Sprite3(dc,x,y,0,psm_duration_imgs[duration]); - if (psm_triplet_durations[duration]) - Sprite3(dc,x,y,0,$IB,"<16>",BI=16$); - if (PsmIsDotted(duration)) - Sprite3(dc,x,y,0,$IB,"<15>",BI=15$); - } -} - -U0 DrawTimeSignature(CDC *dc,I64 x,I64 y,I64 top,I64 bottom) -{ - GrPrint(dc,x,y,"%d",top); - GrPrint(dc,x,y+FONT_HEIGHT,"%d",bottom); -} - -U0 DrawIt(CTask *task,CDC *dc) -{ - PsmNote *tempo; - I64 i,x,y, - w=task->pix_width; - F64 measure_len=4,measure_left=measure_len; - Bool old_preempt=Preempt(OFF); - - dc->color=BLACK; - for (i=1;i<6;i++) - GrLine(dc,0,i*8,w,i*8); - for (i=7;i<12;i++) - GrLine(dc,0,i*8,w,i*8); - - PsmRecalcNoteXY; - if (oc.cur_note->x<64) { - oc.screen_x-=128; - PsmRecalcNoteXY; - } - if (oc.cur_note->x>=GR_WIDTH-64) { - oc.screen_x+=128; - PsmRecalcNoteXY; - } - - tempo=oc.root.next; - while (tempo!=&oc.root) { - x=tempo->x; - y=tempo->y; - if (measure_left<0.001) { - dc->color=BLACK; - GrLine(dc,x-PSM_NOTE_SPACING,8,x-PSM_NOTE_SPACING,11*8); - measure_left=measure_len; - } - if (tempo->type==OT_METER) { - if (tempo==oc.cur_note && PsmBlink) - dc->color=BROWN; - else - dc->color=BLACK; - DrawTimeSignature(dc,x,5*8,tempo->meter_top,tempo->meter_bottom); - measure_len=tempo->meter_top*4.0/tempo->meter_bottom; - measure_left=0; - } else { - if (tempo==oc.cur_note && PsmBlink) { - dc->color=BROWN; - GrPrint(dc,x+8,y,"%s",tempo->word); - } else if (tempo->flags&OF_SELECTED) - dc->color=RED; - else { - if (tempo->note!=NOTE_REST) - dc->color=BLACK; - else - dc->color=LTGRAY; - if (PsmHasWords(tempo->word)) - dc->color=GREEN; - } - DrawNote(dc,x,y,tempo->duration); - if (PsmIsDotted(tempo->duration)) - x+=PSM_NOTE_SPACING/2; - if (Bt(&tempo->flags,Of_SHARP)) - Sprite3(dc,x,y,0,$IB,"<13>",BI=13$); - else if (Bt(&tempo->flags,Of_FLAT)) - Sprite3(dc,x,y,0,$IB,"<14>",BI=14$); - measure_left-=psm_durations[tempo->duration]; - } - tempo=tempo->next; - } - - if (oc.cur_note==&oc.root && PsmBlink) - dc->color=BROWN; - else - dc->color=BLACK; - Sprite3(dc,oc.root.x,50,0,$IB,"<12>",BI=12$); - Preempt(old_preempt); -} - -#define PSMR_FLAT -8 -#define PSMR_SHARP -7 -#define PSMR_TIE -6 -#define PSMR_REST -5 -#define PSMR_INS_NOTE -4 -#define PSMR_DELETE_NOTE -3 -#define PSMR_SET_WORD -2 - -F64 PopUpDuration() -{ - I64 i; - CDoc *doc=DocNew; - DocPrint(doc,"$$GREEN$$$$MU,\"Set Word\",LE=PSMR_SET_WORD$$\n" - "$$MU,\"Toggle Sharp\",LE=PSMR_SHARP$$\n" - "$$MU,\"Toggle Flat\",LE=PSMR_FLAT$$\n" - "$$MU,\"Toggle Tie\",LE=PSMR_TIE$$\n" - "$$MU,\"Make Rest\",LE=PSMR_REST$$\n" - "$$MU,\"Insert Note\",LE=PSMR_INS_NOTE$$\n" - "$$MU,\"Delete Note\",LE=PSMR_DELETE_NOTE$$\n\n"); - for (i=0;iflags; - oc.cur_note=tempo=PsmFindNote(x,y); - if (tempo!=&oc.root) { - Fs->win_inhibit=WIG_USER_TASK_DFT; - i=PopUpDuration; - if (0<=itype==OT_NOTE) - tempo->duration=i; - } else { - switch (i) { - case PSMR_REST: - if (tempo->type==OT_NOTE) { - tempo->octave=OCTAVE_REST; - tempo->note=NOTE_REST; - } - break; - case PSMR_SHARP: - if (tempo->type==OT_NOTE && tempo->octave!=OCTAVE_REST) { - if (Btr(&tempo->flags,Of_FLAT)) - tempo->note++; - if (Btc(&tempo->flags,Of_SHARP)) - tempo->note--; - else - tempo->note++; - if (tempo->note<0) { - tempo->note=11; - tempo->octave--; - } else if (tempo->note>11) { - tempo->note=0; - tempo->octave++; - } - } - break; - case PSMR_FLAT: - if (tempo->type==OT_NOTE && tempo->octave!=OCTAVE_REST) { - if (Btr(&tempo->flags,Of_SHARP)) - tempo->note--; - if (Btc(&tempo->flags,Of_FLAT)) - tempo->note++; - else - tempo->note--; - if (tempo->note<0) { - tempo->note=11; - tempo->octave--; - } else if (tempo->note>11) { - tempo->note=0; - tempo->octave++; - } - } - break; - case PSMR_TIE: - if (tempo->type==OT_NOTE) - Btc(&tempo->flags,Of_TIE); - break; - case PSMR_SET_WORD: - if (tempo->type==OT_NOTE) { - if (DocPut) DocPut->flags&=~DOCF_FORM; - if (PsmHasWords(tempo->word)) - st2=MStrPrint("\nWord(\"%Q\"):",tempo->word); - else - st2=MStrPrint("\nWord(\"\"):"); - DocBottom; - st=GetStr(st2); - Free(st2); - Free(tempo->word); - if (*st) { - tempo->word=MStrPrint("%q",st); - Free(st); - } else - tempo->word=StrNew(" "); - if (DocPut) DocPut->flags=DocPut->flags&~DOCF_FORM|old_doc_flags&DOCF_FORM; - } - break; - case PSMR_INS_NOTE: - tempo1=PsmNoteCopy(tempo); - QueIns(tempo1,tempo); - break; - case PSMR_DELETE_NOTE: - oc.cur_note=tempo->next; - QueRem(tempo); - PsmNoteDel(tempo); - break; - } - } - PsmSetWidth(oc.cur_note); - Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER-WIF_FOCUS_TASK_MENU-WIF_SELF_CTRLS; - } -} - -#define PSM_NOTE_BOX_X 220 -#define PSM_NOTE_BOX_Y (13*FONT_HEIGHT+14) - -U0 PsmSetPickNoteBoxX(I64 duration,I64 *x) -{ - I64 i; - *x=PSM_NOTE_BOX_X; - for (i=0;icolor=RED; - else if (psm_triplet_durations[i]) - oc.dc2->color=LTRED; - else - oc.dc2->color=BLACK; - DrawNote(oc.dc2,x,PSM_NOTE_BOX_Y,i); - } -} - -#define PSM_TOOLS_X 450 -#define PSM_TOOLS_Y 13*FONT_HEIGHT - -U0 DrawPickTools() -{ - if (oc.tool==OTT_BOX_TOOL) - oc.dc2->color=ROPF_DITHER+WHITE<<16+RED; - else - oc.dc2->color=ROPF_DITHER+WHITE<<16+BLACK; - GrBorder(oc.dc2,PSM_TOOLS_X,PSM_TOOLS_Y, - PSM_TOOLS_X+10,PSM_TOOLS_Y+10); - - if (oc.tool==OTT_PTR_TOOL) - oc.dc2->color=RED; - else - oc.dc2->color=BLACK; - (*gr.fp_draw_input_ptr)(oc.dc2,PSM_TOOLS_X+15,PSM_TOOLS_Y); - oc.dc2->color=BLACK; -} - -Bool PsmGetPickToolBox(I64 xx,I64 yy) -{ - if (PSM_TOOLS_X<=xxcolor=BLACK; - for (i=0;ioc.root.last->x) - tempo1=oc.root.last; - else if (a1x) - tempo1=&oc.root; - else - tempo1=PsmFindNote(a1-PSM_NOTE_SPACING/2,a2); - tempo=CAlloc(sizeof(PsmNote)); - tempo->type=OT_NOTE; - a2=a2/4-15; - n=-a2%7; - o=2+a2/-7; - n=-n; - if (n<0) { - n+=7; - o++; - } - n=psm_note_inverse_map[n]; - tempo->note=n; - tempo->octave=o; - tempo->duration=duration; - PsmSetWidth(tempo); - QueIns(tempo,tempo1); - oc.cur_note=tempo->next; - } - DrawDC2; -} - -U0 PsmLeftClickPickMeterBox(I64 top,I64 bottom) -{ - I64 msg_code,a1,a2; - PsmNote *tempo,*tempo1; - do { - msg_code=GetMsg(&a1,&a2,1<=oc.root.x) - tempo1=oc.root.last; - else if (a1x) - tempo1=&oc.root; - else - tempo1=PsmFindNote(a1-PSM_NOTE_SPACING/2,a2); - tempo=CAlloc(sizeof(PsmNote)); - tempo->type=OT_METER; - tempo->meter_top=top; - tempo->meter_bottom=bottom; - PsmSetWidth(tempo); - QueIns(tempo,tempo1); - oc.cur_note=tempo->next; - } - DrawDC2; -} - -U0 PsmLeftClickStaffPtr(I64 x,I64 y) -{ - PsmNote *tempo,*tempo1; - I64 o,n,msg_code,a1,a2,n_original,o_original; - oc.cur_note=tempo=PsmFindNote(x,y); - if (tempo!=&oc.root) { - if (tempo->type==OT_NOTE) { - n_original=tempo->note; - o_original=tempo->octave; - do { - msg_code=GetMsg(&a1,&a2,1<word); - tempo1->word=tempo->word; - tempo->word=NULL; - tempo->note=n_original; - tempo->octave=o_original; - } - } else { -move_note: - a2=a2/4-15; - n=-a2%7; - o=2+a2/-7; - n=-n; - if (n<0) { - n+=7; - o++; - } - n=psm_note_inverse_map[n]; - tempo->note=n; - tempo->octave=o; - } - } while (msg_code!=MSG_IP_L_UP); - PsmSetWidth(tempo); - } - } -} - -U0 PsmLeftClickStaffBox(I64 x,I64 y) -{ - I64 msg_code,a1,a2; - do { - msg_code=GetMsg(&a1,&a2,1<color=ROPF_DITHER+WHITE<<16+BLACK; - GrBorder(oc.dc2,x,y,a1,a2); - if (msg_code==MSG_IP_L_UP) { - if (x>a1) SwapI64(&x,&a1); - PsmMarkSelected(x,a1,TRUE); - } - } while (msg_code!=MSG_IP_L_UP); - DrawDC2; -} - -U0 PsmLeftClick(I64 x,I64 y) -{ - I64 duration,top,bottom; - if (y<13*FONT_HEIGHT) { - if (oc.tool==OTT_PTR_TOOL) - PsmLeftClickStaffPtr(x,y); - else - PsmLeftClickStaffBox(x,y); - } else { - duration=PsmGetPickNoteBoxDuration(x,y); - if (0<=durationtask_end_cb=&SndTaskEndCB; - while (TRUE) { - i++; - switch (psm_play_mode) { - case PSMPM_NORMAL: - if (psm_play_f!=f) { - f=psm_play_f; - Snd(f); - } - break; - case PSMPM_REVERB1: - if (psm_play_f!=f) { - if (f>0) - f2=f; - f=psm_play_f; - } - if (!(i&15)) { - if (i&16) - Snd(f); - else - Snd(f2); - } - break; - } - Sleep(1); - } -} - -U8 PsmCvtDuration(F64 d) -{ - F64 d1,d2; - I64 j; - for (j=0;jtype=OT_METER; - st++; - if ('1'<=*st<='9') - tempo1->meter_top=*st++-'0'; - else - tempo1->meter_top=4; - if (*st=='/') - st++; - if ('1'<=*st<='9') - tempo1->meter_bottom=*st++-'0'; - else - tempo1->meter_bottom=4; - PsmSetWidth(tempo1); - QueIns(tempo1,oc.root.last); - } - while (*st=='(') { - Bts(&tempo->flags,Of_TIE); - st++; - } - st=PsmMusicSetOctave(st,psm_octave); - st=PsmMusicSetNoteLen(st,psm_duration); - } - if (!*st) { - PsmNoteDel(tempo); - break; - } - note=*st++-'A'; - if (note<7) { - note=music.note_map[note]; - if (*st=='b') { - Bts(&tempo->flags,Of_FLAT); - note--; - st++; - } else if (*st=='#') { - Bts(&tempo->flags,Of_SHARP); - note++; - st++; - } - if (note<0) { - note=11; - *psm_octave-=1; - } else if (note>11) { - note=0; - *psm_octave+=1; - } - tempo->note=note; - tempo->octave=*psm_octave; - } else { - tempo->note=NOTE_REST; - tempo->octave=OCTAVE_REST; - } - if (*psm_duration<=2*.25/3) - i=0; - else if (*psm_duration<=.25) - i=1; - else if (*psm_duration<=2*.5/3) - i=2; - else if (*psm_duration<=.5) - i=3; - else if (*psm_duration<=2.0/3) - i=4; - else if (*psm_duration<=.5*1.5) - i=5; - else if (*psm_duration<=1.0) - i=6; - else if (*psm_duration<=1.5) - i=7; - else if (*psm_duration<=2.0) - i=8; - else if (*psm_duration<=3.0) - i=9; - else if (*psm_duration<=4.0) - i=10; - else - i=11; - tempo->duration=i; - tempo->type=OT_NOTE; - PsmSetWidth(tempo); - QueIns(tempo,oc.cur_note->last); - } -} - -U0 PsmLoadSong(U8 *filename,I64 *psm_octave,F64 *psm_duration) -{ - U8 *st; - PsmNote *tempo; - CLex *lx=LexNew(MStrPrint("#include \"%s\"",filename)); - if (FileOcc("incomplete",filename,"")) - oc.incomplete_entry->checked=TRUE; - else - oc.incomplete_entry->checked=FALSE; - while (Lex(lx)) { - if (lx->token==TK_IDENT) - if (!StrCmp(lx->cur_str,"Play")) { - if (Lex(lx)=='(') - if (Lex(lx)==TK_STR) { - tempo=oc.root.last; - st=LexExtStr(lx); - PsmLoadSongStr(st,psm_octave,psm_duration); - if (lx->token==',') { - if (Lex(lx)==TK_STR) { - st=LexExtStr(lx); - do { - do tempo=tempo->next; - while (tempo!=&oc.root && tempo->type==OT_METER); - if (tempo!=&oc.root) - tempo->word=StrNew(st); - st+=StrLen(st)+1; - } while (*st); - } - } - } - } else if (!StrCmp(lx->cur_str,"music.tempo")) { - if (Lex(lx)=='=' && Lex(lx)==TK_F64) { - music.tempo=lx->cur_f64-0.0005; - tempo_state.tempo=Round(TEMPO_RANGE*(music.tempo-0.5)/4.4); - } - } else if (!StrCmp(lx->cur_str,"music.stacatto_factor")) { - if (Lex(lx)=='=' && Lex(lx)==TK_F64) { - music.stacatto_factor=lx->cur_f64-0.0005; - tempo_state.stacatto=Round(TEMPO_RANGE*(music.stacatto_factor-0.12)/0.88); - } - } - } - LexDel(lx); -} - -U8 *PsmCvtSong() -{ - PsmNote *tempo; - U8 *st,*src,*dst; - I64 i,note,octave,last_octave,last_duration; - - i=0; - tempo=oc.root.next; - last_octave=OCTAVE_REST; - last_duration=-1; - while (tempo!=&oc.root) { - dst=&tempo->ascii; - if (tempo->type==OT_METER) { - *dst++='M'; - *dst++=tempo->meter_top+'0'; - *dst++='/'; - *dst++=tempo->meter_bottom+'0'; - } else { - octave=tempo->octave; - note=tempo->note; - if (note!=NOTE_REST) { - if (Bt(&tempo->flags,Of_SHARP)) - note--; - if (Bt(&tempo->flags,Of_FLAT)) - note++; - if (note<0) { - note=11; - octave--; - } else if (note>11) { - note=0; - octave++; - } - note=music.note_map[*LstSub(note,psm_note_lst)-'A']; - } - if (Bt(&tempo->flags,Of_TIE)) - *dst++='('; - if (octave!=last_octave && note!=NOTE_REST) { - *dst++=octave+'0'; - last_octave=octave; - } - if (tempo->duration!=last_duration) { - src=LstSub(tempo->duration,psm_duration_lst); - *dst++=src[0]; - if (src[1]) - *dst++=src[1]; - last_duration=tempo->duration; - } - if (note!=NOTE_REST) { - src=LstSub(note,psm_note_lst); - *dst++=src[0]; - if (src[1]) - *dst++=src[1]; - else if (Bt(&tempo->flags,Of_FLAT)) - *dst++='b'; - else if (Bt(&tempo->flags,Of_SHARP)) - *dst++='#'; - } else - *dst++='R'; - } - *dst++=0; - i+=StrLen(tempo->ascii); - tempo=tempo->next; - } - - st=MAlloc(i+1); - dst=st; - tempo=oc.root.next; - while (tempo!=&oc.root) { - StrCpy(dst,tempo->ascii); - dst+=StrLen(tempo->ascii); - tempo=tempo->next; - } - *dst++=0; - return st; -} - -U8 *PsmSaveSong(U8 *dirname,U8 *full_filename) -{ - CDoc *doc=DocNew(full_filename); - Bool has_words; - PsmNote *tempo,*tempo1; - F64 measure_len=4,two_measure_left=2*measure_len; - I64 ch; - U8 *ptr; - - Free(PsmCvtSong); //set tempo->ascii; - - music.tempo=4.4*tempo_state.tempo/TEMPO_RANGE+0.5; - music.stacatto_factor=0.88*tempo_state.stacatto/TEMPO_RANGE+0.12; - - has_words=FALSE; - tempo=oc.root.next; - while (tempo!=&oc.root) { - if (PsmHasWords(tempo->word)) has_words=TRUE; - tempo=tempo->next; - } - if (oc.incomplete_entry->checked) - DocPrint(doc,"//0 incomplete\n"); - else if (has_words) - DocPrint(doc,"//0 has words\n"); - else - DocPrint(doc,"//0 no nothing\n"); - - DocPrint(doc, -"U0 Song()\n" -"{\n" -" Fs->task_end_cb=&SndTaskEndCB;\n" -" MusicSettingsRst;\n" -" music.tempo=%6.3f;\n" -" music.stacatto_factor=%6.3f;\n" -" try {\n" -" while (!ScanKey) {\n" -"\tPlay(\"",music.tempo+0.0005,music.stacatto_factor+0.0005); - - tempo=oc.root.next; - tempo1=tempo; - has_words=FALSE; - while (tempo!=&oc.root) { - DocPrint(doc,"%s",tempo->ascii); - if (PsmHasWords(tempo->word)) has_words=TRUE; - if (tempo->type==OT_METER) { - measure_len=tempo->meter_top*4.0/tempo->meter_bottom; - two_measure_left=0; - } else - two_measure_left-=psm_durations[tempo->duration]; - tempo=tempo->next; - if (two_measure_left<0.001 && tempo!=&oc.root) { - if (has_words) { - DocPrint(doc,"\",\n\t\t\""); - while (tempo1!=tempo) { - if (tempo1->type!=OT_METER) { - if (ptr=tempo1->word) { - while (ch=*ptr) { - if (ch==CH_SPACE) - *ptr=CH_SHIFT_SPACE; - ptr++; - } - DocPrint(doc,"%Q\\0",tempo1->word); - } else - DocPrint(doc,"%c\\0",CH_SHIFT_SPACE); - } - tempo1=tempo1->next; - } - } - DocPrint(doc,"\");\n" - "\tPlay(\""); - two_measure_left=2*measure_len; - tempo1=tempo; - has_words=FALSE; - } - } - if (has_words) { - DocPrint(doc,"\",\n\t\t\""); - while (tempo1!=tempo) { - if (tempo1->type!=OT_METER) { - if (ptr=tempo1->word) { - while (ch=*ptr) { - if (ch==CH_SPACE) - *ptr=CH_SHIFT_SPACE; - ptr++; - } - DocPrint(doc,"%Q\\0",tempo1->word); - } else - DocPrint(doc,"%c\\0",CH_SHIFT_SPACE); - } - tempo1=tempo1->next; - } - } - DocPrint(doc,"\");\n" -" }\n" -" } catch\n" -" PutExcept;\n" -" Snd(0);\n" -"}\n" -"\n" -"Song;\n"); - DocRecalc(doc); - if (full_filename) - Free(full_filename); - else - StrPrint(doc->filename.name,"%s/Temp.CPP.Z",dirname); - DocWrite(doc,TRUE); - full_filename=StrNew(doc->filename.name); - DocDel(doc); - return full_filename; -} - -U0 PsmSetOctave(I64 octave) -{ - I64 i; - U8 buf[136]; - CMenuEntry *tempse; - for (i=0;i<=6;i++) { - StrPrint(buf,"Snd/Octave%d",i); - if (tempse=MenuEntryFind(Fs->cur_menu,buf)) { - if (i==octave) - tempse->checked=TRUE; - else - tempse->checked=FALSE; - } - } - if (tempse=MenuEntryFind(Fs->cur_menu,"Snd/Reverb")) - tempse->checked=psm_play_mode==1; -} - -$SP,"<17>",BI=17$ - - - - -#define PSM_NUM_KEYS 20 -class PsmKey -{ - U8 x,w,h,ascii; -}; - -#define PSM_W_W 16 -#define PSM_W_H 36 -#define PSM_B_W 8 -#define PSM_B_H 20 - -PsmKey psm_kbd[PSM_NUM_KEYS]= -{ - -{ 2*PSM_W_W-4,PSM_B_W,PSM_B_H,'e' }, -{ 3*PSM_W_W-4,PSM_B_W,PSM_B_H,'r' }, -{ 4*PSM_W_W-4,PSM_B_W,PSM_B_H,'t' }, -{ 6*PSM_W_W-4,PSM_B_W,PSM_B_H,'u' }, -{ 7*PSM_W_W-4,PSM_B_W,PSM_B_H,'i' }, -{ 9*PSM_W_W-4,PSM_B_W,PSM_B_H,'p' }, -{10*PSM_W_W-4,PSM_B_W,PSM_B_H,'[' }, -{11*PSM_W_W-4,PSM_B_W,PSM_B_H,']' }, - -{ 0*PSM_W_W,PSM_W_W,PSM_W_H,'a' }, -{ 1*PSM_W_W,PSM_W_W,PSM_W_H,'s' }, -{ 2*PSM_W_W,PSM_W_W,PSM_W_H,'d' }, -{ 3*PSM_W_W,PSM_W_W,PSM_W_H,'f' }, -{ 4*PSM_W_W,PSM_W_W,PSM_W_H,'g' }, -{ 5*PSM_W_W,PSM_W_W,PSM_W_H,'h' }, -{ 6*PSM_W_W,PSM_W_W,PSM_W_H,'j' }, -{ 7*PSM_W_W,PSM_W_W,PSM_W_H,'k' }, -{ 8*PSM_W_W,PSM_W_W,PSM_W_H,'l' }, -{ 9*PSM_W_W,PSM_W_W,PSM_W_H,';' }, -{10*PSM_W_W,PSM_W_W,PSM_W_H,'\'' }, -{11*PSM_W_W,PSM_W_W,PSM_W_H,'\n'}, - -}; - -U0 PsmDownKey(I64 x,I64 y) -{ - I64 i; - PsmKey *o; - y-=FONT_HEIGHT*13; - if (0<=yx<=xx+o->w && yh) { - Msg(MSG_KEY_DOWN,o->ascii,0); - return; - } - } - } -} - -U0 PsmUpKey(I64 x,I64 y) -{ - I64 i; - PsmKey *o; - y-=FONT_HEIGHT*13; - if (0<=yx<=xx+o->w && yh) { - Msg(MSG_KEY_UP,o->ascii,0); - return; - } - } - } -} - -U0 PsmMenu(I64 psm_octave) -{ - DocClear; - "$$BD,WHITE$$$$FD,GREEN$$$$CM,0,12$$\n"; - Sprite($IB,"<17>",BI=17$); - '\n\n\n\n\n'; - - DrawDC2; - - "$$LTGREEN$$$$FG$$\t\tRest\n" - "$$LTGREEN$$$$FG$$\tDeletes Last Note\n" - "$$LTGREEN$$Left Mouse$$FG$$\tDrag note or shift word\n" - "$$LTGREEN$$Right Mouse$$FG$$\tChange duration or set word\n"; - Sprite($IB,"<6>",BI=6$,"$$SP+LA,\"\",LM=\"Msg(MSG_KEY_DOWN,0,SCF_CTRL|SC_CURSOR_LEFT);\",BI=%d$$"); - " "; - if (oc.playing) - Sprite($IB,"<9>",BI=9$,"$$SP,\"\",LM=\"x\",BI=%d$$"); - else - Sprite($IB,"<8>",BI=8$,"$$SP,\"\",LM=\"x\",BI=%d$$"); - " "; - if (oc.record_entry->checked) { - oc.record_entry->checked=TRUE; - Sprite($IB,"<10>",BI=10$,"$$SP,\"\",LM=\"z\",BI=%d$$"); - } else - Sprite($IB,"<11>",BI=11$,"$$SP,\"\",LM=\"z\",BI=%d$$"); - " "; - Sprite($IB,"<7>",BI=7$,"$$SP+LA,\"\",LM=\"Msg(MSG_KEY_DOWN,0,SCF_CTRL|SC_CURSOR_RIGHT);\",BI=%d$$"); - "$$CM+LX,0,6$$"; - PsmSetOctave(psm_octave); - WinMgrSync(2); -} - -U0 PsmPushMode(I64 psm_octave) -{ - Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER-WIF_FOCUS_TASK_MENU-WIF_SELF_CTRLS; - PsmMenu(psm_octave); -} - -U0 PsmPopMode() -{ - Fs->win_inhibit=WIG_USER_TASK_DFT; - DCFill; -} - -#define PSMF_CD 1 -#define PSMF_INCOMPLETE 2 - -U0 Psalmody(U8 *dirname=NULL) -{ - Bool was_playing; - I64 a1,a2,msg_code=0,col, - note=NOTE_REST,octave=OCTAVE_REST,psm_octave=3,timeout_val,timeout_val2, - old_doc_flags; - U8 *filename=NULL,*st,*st2; - CTask *play_task=Spawn(&PsmPlayTask,NULL,"Psalmody Play",,Fs); - PsmNote *tempo; - F64 f=0,last_f=0,psm_duration=1.0, - d,evt_time=tS,note_down_time=tS; - CCtrl *c=TempoNew; - - if (DocPut) old_doc_flags=DocPut->flags; - SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ - WinBorder; - WordStat; - Preempt(OFF); - - MkDir("HOME/Psalmody"); - MusicSettingsRst; - tempo_state.tempo=Round(TEMPO_RANGE*(music.tempo-0.5)/4.4); - tempo_state.stacatto=Round(TEMPO_RANGE*(music.stacatto_factor-0.12)/0.88); - - if (DocPut) DocPut->flags|=DOCF_FORM; - - MemSet(&oc,0,sizeof(PsmCtrl)); - oc.screen_x=0; - oc.root.next=oc.root.last=&oc.root; - oc.clipboard.next=oc.clipboard.last=&oc.clipboard; - oc.cur_note=&oc.root; - oc.dc2=DCAlias; - - MenuPush( - "File {" - " New(,'.');" - " ChgDir(MSG_CMD,PSMF_CD);" - " Open(,CH_CTRLO);" - " SaveAs(,CH_CTRLA);" - " Abort(,CH_SHIFT_ESC);" - " Exit(,CH_ESC);" - "}" - "Edit {" - " Cut(,CH_CTRLX);" - " Copy(,CH_CTRLC);" - " Paste(,CH_CTRLV);" - " RightMenu(,'\n');" - " BackSpace(,CH_BACKSPACE);" - " DeleteNote(,,SC_DELETE);" - " ClearSong(,'.');" - " Left(,,SC_CURSOR_LEFT);" - " Right(,,SC_CURSOR_RIGHT);" - " GoBegin(,,0x4CB0000044B);" - " GoEnd(,,0x4CD0000044D);" - "}" - "Song {" - " Play(,'x');" - " Record(,'z');" - " Random(,',');" - " MarkIncomplete(MSG_CMD,PSMF_INCOMPLETE);" - "}" - "Snd {" - " Reverb(,'c');" - " Octave0(,'0');" - " Octave1(,'1');" - " Octave2(,'2');" - " Octave3(,'3');" - " Octave4(,'4');" - " Octave5(,'5');" - " Octave6(,'6');" - "}" - "Help {" - " Help(,,SC_F1);" - "}" - ); - oc.incomplete_entry=MenuEntryFind(Fs->cur_menu,"Song/MarkIncomplete"); - oc.record_entry=MenuEntryFind(Fs->cur_menu,"Song/Record"); - - WinMax; - - if (!dirname) - dirname=StrNew("HOME/Psalmody"); - else - dirname=StrNew(dirname); - PsmPushMode(psm_octave); - col=0; - Fs->draw_it=&DrawIt; - - try { - while (TRUE) { - was_playing=FALSE; -mo_start: - if (ip.pos_text.y-Fs->win_top<18) - msg_code=GetMsg(&a1,&a2,1< when the Doc Buttons are clicked. - //This is so that kbd and mouse are the same for Doc's. - //We must now pass the onto the Doc handler. - PutKey(a1,a2); - goto mo_start; - } - if (msg_code!=MSG_IP_MOVE) { - DocBottom; - if (was_playing || DocPut->cur_entry->y>=Fs->win_height-2) { - PsmMenu(psm_octave); - col=0; - } - } - - octave=psm_octave; - switch (msg_code) { - case MSG_CMD: - PsmPopMode; - switch (a1) { - case PSMF_CD: - st2=dirname; - if (dirname=PopUpPickDir) { - Free(st2); - Free(filename); - filename=NULL; - } else - dirname=st2; - break; - case PSMF_INCOMPLETE: - oc.incomplete_entry->checked=!oc.incomplete_entry->checked; - break; - } - PsmPushMode(psm_octave); - col=0; - break; - case MSG_KEY_DOWN: - evt_time=tS; - if ('0'<=a1<='9') { - psm_octave=a1-'0'; - PsmMenu(psm_octave); - col=0; - } else { - switch (a1) { - sub_switch_start: - case 'a': note=7; octave--; break; - case 's': note=8; octave--; break; - case 'e': note=9; octave--; break; - case 'd': note=10; octave--; break; - case 'r': note=11; octave--; break; - case 'f': note=0; break; - case 't': note=1; break; - case 'g': note=2; break; - case 'h': note=3; break; - case 'u': note=4; break; - case 'j': note=5; break; - case 'i': note=6; break; - case 'k': note=7; break; - case 'l': note=8; break; - case 'p': note=9; break; - case ';': note=10; break; - case '[': note=11; break; - case '\'': note=0; octave++; break; - case ']': note=1; octave++; break; - sub_switch_end: - f=Note2Freq(note,octave); - break; - case CH_SPACE: - note=NOTE_REST; - octave=OCTAVE_REST; - f=-1; //rest - break; - - case 0: - switch (a2.u8[0]) { - case SC_CURSOR_LEFT: - if (a2&SCF_CTRL) { - while (oc.cur_note->last!=&oc.root) { - oc.cur_note=oc.cur_note->last; - if (oc.cur_note!=&oc.root) - LBEqu(&oc.cur_note->flags,Of_SELECTED,a2&SCF_SHIFT); - } - } else { - if (oc.cur_note->last!=&oc.root) { - oc.cur_note=oc.cur_note->last; - if (oc.cur_note!=&oc.root) - LBEqu(&oc.cur_note->flags,Of_SELECTED,a2&SCF_SHIFT); - } - } - break; - case SC_CURSOR_RIGHT: - if (a2&SCF_CTRL) { - while (oc.cur_note!=&oc.root) { - if (oc.cur_note!=&oc.root) - LBEqu(&oc.cur_note->flags,Of_SELECTED,a2&SCF_SHIFT); - oc.cur_note=oc.cur_note->next; - } - } else { - if (oc.cur_note!=&oc.root) { - if (oc.cur_note!=&oc.root) - LBEqu(&oc.cur_note->flags,Of_SELECTED,a2&SCF_SHIFT); - oc.cur_note=oc.cur_note->next; - } - } - break; - case SC_DELETE: - if (a2&SCF_SHIFT) - PsmCutToClipboard; - else { - tempo=oc.cur_note; - oc.cur_note=tempo->next; - if (tempo!=&oc.root) { - QueRem(tempo); - PsmNoteDel(tempo); - } - } - break; - case SC_INS: - if (a2&SCF_SHIFT) - PsmPasteClipboard; - else if (a2&SCF_CTRL) - PsmCopyToClipboard; - break; - case SC_F1: - PsmPopMode; - PopUpEd("::/Apps/Psalmody/Help.TXT.Z",Fs); - PsmPushMode(psm_octave); - col=0; - break; - } - break; - case ',': - Free(filename); - filename=NULL; - PsmPopMode; - music.octave=psm_octave; - if (st2=GodSongStr) { - PsmLoadSongStr(st2,&psm_octave,&psm_duration); - Free(st2); - } - PsmPushMode(psm_octave); - col=0; - break; - case CH_CTRLO: - PsmPopMode; - AcctOneTimePopUp(ARf_PSALMODY_JUKEBOX, - "Select a song and preview it.\n" - "$$GREEN$$$$FG$$ to load it into Psalmody.\n\n" - ST_WARN_ST " Graphics and other embelishments\n" - "will be lost because Psalmody can't\n" - "parse HolyC programs completely.\n"); - Free(filename); - filename=NULL; - JukeBox(dirname,&filename); - if (filename) { - oc.screen_x=0; - psm_duration=1.0; - psm_octave=3; - PsmSongDel(&oc.root); - oc.cur_note=&oc.root; - PsmLoadSong(filename,&psm_octave,&psm_duration); - oc.record_entry->checked=FALSE; - oc.cur_note=oc.root.next; - } - PsmPushMode(psm_octave); - col=0; - break; - case CH_CTRLA: - PsmPopMode; - filename=PsmSaveSong(dirname,filename); - PsmPushMode(psm_octave); - break; - case CH_CTRLC: - PsmCopyToClipboard; - break; - case CH_CTRLV: - PsmPasteClipboard; - break; - case CH_CTRLX: - PsmCutToClipboard; - break; - case '.': - PsmMenu(psm_octave); - col=0; - Free(filename); - filename=NULL; - psm_duration=1.0; - psm_octave=3; - PsmSongDel(&oc.root); - oc.cur_note=&oc.root; - oc.screen_x=0; - break; - case '\n': - if (oc.cur_note!=&oc.root) - PsmRightClick(oc.cur_note->x,oc.cur_note->y); - break; - case 'x': - if (was_playing) - break; - col=0; - oc.playing=TRUE; - PsmMenu(psm_octave); - tempo=oc.cur_note; - while (tempo!=&oc.root) { - if (tempo->type!=OT_METER) { - timeout_val=cnts.jiffies; - if (ip.pos_text.y-Fs->win_top<18) - msg_code=ScanMsg(&a1,&a2,1<win_top>=18 && msg_code==MSG_IP_L_DOWN) - goto mo_start; - else - goto mo_got_msg; - } - oc.cur_note=tempo; - oc.screen_x+=tempo->x-0.33*GR_WIDTH; - if (PsmHasWords(tempo->word)) - "%s",tempo->word; - note=tempo->note; - octave=tempo->octave; - if (note!=NOTE_REST) - f=Note2Freq(note,octave); - else - f=-1; //rest - if (f>0) - psm_play_f=f; - else - psm_play_f=0; - - music.tempo=4.4*tempo_state.tempo/TEMPO_RANGE+0.5; - music.stacatto_factor=0.88*tempo_state.stacatto/TEMPO_RANGE+0.12; - d=JIFFY_FREQ*psm_durations[tempo->duration]/music.tempo; - if (Bt(&tempo->flags,Of_TIE)) { - timeout_val+=d; - timeout_val2=timeout_val; - } else { - timeout_val+=d*music.stacatto_factor; - timeout_val2=timeout_val+ - d*(1.0-music.stacatto_factor); - } - SleepUntil(timeout_val); - psm_play_f=0; - SleepUntil(timeout_val2); - } - tempo=tempo->next; - } - oc.cur_note=&oc.root; - oc.screen_x+=oc.cur_note->x-GR_WIDTH/2; - oc.playing=FALSE; - PsmMenu(psm_octave); - col=0; - f=0; - psm_play_f=0; - break; - case CH_BACKSPACE: - tempo=oc.cur_note->last; - if (tempo!=&oc.root) { - QueRem(tempo); - PsmNoteDel(tempo); - } - if (col) { - '' CH_BACKSPACE; - col--; - } - break; - case 'c': - psm_play_mode++; - if (psm_play_mode>=PSMPM_NUM_PLAY_MODES) psm_play_mode=0; - PsmMenu(psm_octave); - col=0; - break; - case 'z': - if (oc.record_entry->checked) - oc.record_entry->checked=FALSE; - else { - oc.record_entry->checked=TRUE; - psm_duration=1.0; - psm_octave=3; - oc.screen_x=0; - } - PsmMenu(psm_octave); - col=0; - break; - case CH_ESC: - PsmPopMode; - filename=PsmSaveSong(dirname,filename); - PsmPushMode(psm_octave); - case CH_SHIFT_ESC: - goto mo_done; - } - } - break; - case MSG_KEY_UP: - evt_time=tS; - f=0; - break; - case MSG_IP_MOVE: - if (a2>18*FONT_HEIGHT) - Fs->win_inhibit=WIG_USER_TASK_DFT; - else - Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER-WIF_FOCUS_TASK_MENU-WIF_SELF_CTRLS; - break; - case MSG_IP_L_DOWN: - PsmDownKey(a1,a2); - PsmLeftClick(a1,a2); - break; - case MSG_IP_L_UP: - PsmUpKey(a1,a2); - break; - default: - PsmRightClick(a1,a2); - } - if (f!=last_f) { - if (f>0) { - st=LstSub(note,psm_note_lst); - psm_play_f=f; - } else { - if (f<0) - st="R"; - else - st=""; - psm_play_f=0; - } - if (oc.record_entry->checked) { - if (last_f) { - music.tempo=4.4*tempo_state.tempo/TEMPO_RANGE+0.5; - music.stacatto_factor=0.88*tempo_state.stacatto/TEMPO_RANGE+0.12; - - tempo->duration=PsmCvtDuration(music.tempo*(evt_time-note_down_time)); - PsmSetWidth(tempo); - QueIns(tempo,oc.cur_note->last); - } - if (f) { - note_down_time=tS; - tempo=CAlloc(sizeof(PsmNote)); - tempo->type=OT_NOTE; - tempo->note=note; - tempo->octave=octave; - if (st[1]=='#') - Bts(&tempo->flags,Of_SHARP); - } - } - last_f=f; - "%s",st; - col+=StrLen(st); - if (col>=Fs->win_width-1) { - '\n'; - col=0; - } - } - } -mo_done: - GetMsg(,,1<flags=DocPut->flags&~DOCF_FORM|old_doc_flags&DOCF_FORM; - Free(dirname); - MenuPop; -} -" -òÿÿÿñÿÿÿ -ñÿÿÿ -ñÿÿÿ -õÿÿÿ -õÿÿÿ -óÿÿÿ òÿÿÿ -öÿÿÿ -÷ÿÿÿ -ÿÿÿÿýÿÿÿüÿÿÿ -üÿÿÿ -ÿÿÿÿ -ÿÿÿÿýÿÿÿ -òÿÿÿ -þÿÿÿÿÿÿÿÿÿÿÿ -ýÿÿÿ -ÿÿÿÿ -ýÿÿÿ -ýÿÿÿÿÿÿÿ - -þÿÿÿÿÿÿÿÿÿÿÿ -óÿÿÿ -óÿÿÿ -óÿÿÿóÿÿÿ -òÿÿÿ òÿÿÿ -ÿÿÿÿýÿÿÿüÿÿÿ -üÿÿÿ -ÿÿÿÿ -ÿÿÿÿýÿÿÿ -òÿÿÿ -þÿÿÿÿÿÿÿÿÿÿÿ -ýÿÿÿ -ÿÿÿÿ -ýÿÿÿ -ýÿÿÿÿÿÿÿ - -þÿÿÿÿÿÿÿÿÿÿÿÍ -ÿÿÿÿýÿÿÿüÿÿÿ -üÿÿÿ -ÿÿÿÿ -ÿÿÿÿýÿÿÿ -òÿÿÿ -þÿÿÿÿÿÿÿÿÿÿÿ -ýÿÿÿ -ÿÿÿÿ -ýÿÿÿ -ýÿÿÿÿÿÿÿ - -þÿÿÿÿÿÿÿÿÿÿÿV -ÿÿÿÿýÿÿÿüÿÿÿ -üÿÿÿ -ÿÿÿÿ -ÿÿÿÿýÿÿÿ -òÿÿÿE -ÿÿÿÿýÿÿÿüÿÿÿ -üÿÿÿ -ÿÿÿÿ -ÿÿÿÿýÿÿÿa -   - - - a -   - -  - Õ -   - - - - - - - - - -     - -       - -    - - -  - - - -  -  - - - - - - - - -   - - - - - - - - - - - - ? -   - - # -þÿÿÿÖÿÿÿþÿÿÿ& -Öÿÿÿ& E -úÿÿÿ - úÿÿÿ - - ýÿÿÿ - V - ýÿÿÿ - - - -  -  - - -E -þÿÿÿöÿÿÿöÿÿÿ -öÿÿÿòÿÿÿ -òÿÿÿþÿÿÿòÿÿÿ -ôÿÿÿÿÿÿÿôÿÿÿò -$ - $ -0$0 -,4 -44 -,, -@$@ -<D -DD -<< -|„ -„„ -|| -lt -tt -ll -$À$ - - -ÄA$S4DDFTGdHtJ„K”L¤;´',E<RLTlU|IœP¬[¼] -PP -LT -TT -LL -`$` -p$p -€$€ -$ - $  -°$° -À$À -œ¤ -¤¤ -œœ -¬´ -´´ -¬¬ -¼Ä -ÄÄ -¼¼ -P$P0@Pp€ °À@ -~   - P -   - -  -  \ No newline at end of file diff --git a/Apps/Psalmody/PsalmodyDraw.CPP b/Apps/Psalmody/PsalmodyDraw.CPP new file mode 100644 index 0000000..e371392 --- /dev/null +++ b/Apps/Psalmody/PsalmodyDraw.CPP @@ -0,0 +1,599 @@ + +$ID,8$ +$SP,"<1>",BI=1$ + +$SP,"<2>",BI=2$ + +$SP,"<3>",BI=3$ + +$SP,"<4>",BI=4$ + +$SP,"<5>",BI=5$ + +$SP,"<6>",BI=6$ + + +$SP,"<7>",BI=7$ + + +$SP,"<8>",BI=8$ + + +$SP,"<9>",BI=9$ + + +$SP,"<10>",BI=10$ + + +$SP,"<11>",BI=11$ + + + + + + + +$SP,"<12>",BI=12$ + + + + +$SP,"<13>",BI=13$ + +$SP,"<14>",BI=14$ + +$SP,"<15>",BI=15$ + + +$SP,"<16>",BI=16$ +$ID,-8$ +#define PSM_NOTE_SPACING 9 +#define PSM_NUM_DURATIONS 12 + +F64 psm_durations[PSM_NUM_DURATIONS+1]={ +2*.25/3,.25,2*.5/3,.5,2.0/3.0,0.5*1.5,1.0,1.5,2.0,3.0,4.0,6.0,1000000.0}; +U8 *psm_duration_lst="st\0s\0et\0e\0qt\0e.\0q\0q.\0h\0h.\0w\0w.\0"; +CSprite *psm_duration_imgs[PSM_NUM_DURATIONS]={$IB,"<1>",BI=1$,$IB,"<1>",BI=1$,$IB,"<2>",BI=2$, + $IB,"<2>",BI=2$,$IB,"<3>",BI=3$,$IB,"<2>",BI=2$,$IB,"<3>",BI=3$,$IB,"<3>",BI=3$, + $IB,"<4>",BI=4$,$IB,"<4>",BI=4$,$IB,"<5>",BI=5$,$IB,"<5>",BI=5$}; +Bool psm_triplet_durations[PSM_NUM_DURATIONS]={TRUE,FALSE,TRUE, + FALSE,TRUE,FALSE,FALSE,FALSE, + FALSE,FALSE,FALSE,FALSE}; + + +Bool PsmBlink() +{ + if (Blink || oc.playing) + return TRUE; + else + return FALSE; +} + +Bool PsmHasWords(U8 *st) +{ + if (st && *st && (StrLen(st)>1 || *st!=CH_SPACE && *st!=CH_SHIFT_SPACE)) + return TRUE; + else + return FALSE; +} + +Bool PsmIsDotted(I64 duration) +{ + U8 *st=LstSub(duration,psm_duration_lst); + if (st[1]=='.') + return TRUE; + else + return FALSE; +} + +U0 PsmMarkSelected(I64 x1,I64 x2,Bool sel) +{ + PsmNote *tempo=oc.root.next; + while (tempo!=&oc.root) { + if (sel) { + if (x1<=tempo->x<=x2) + tempo->flags|=PSMF_SELECTED; + } else + tempo->flags&=~PSMF_SELECTED; + tempo=tempo->next; + } +} + +U0 PsmSetWidth(PsmNote *tempo) +{ + if (tempo->type==PSMT_METER) + tempo->width=12; + else { + tempo->width=PSM_NOTE_SPACING; + if (PsmIsDotted(tempo->duration)) + tempo->width+=PSM_NOTE_SPACING/2; + if (Bt(&tempo->flags,PSMf_SHARP) || Bt(&tempo->flags,PSMf_FLAT)) + tempo->width+=PSM_NOTE_SPACING; + } +} + +U0 PsmSetOctave(I64 octave) +{ + I64 i; + U8 buf[136]; + CMenuEntry *tempse; + for (i=0;i<=6;i++) { + StrPrint(buf,"Snd/Octave%d",i); + if (tempse=MenuEntryFind(Fs->cur_menu,buf)) { + if (i==octave) + tempse->checked=TRUE; + else + tempse->checked=FALSE; + } + } + if (tempse=MenuEntryFind(Fs->cur_menu,"Snd/Reverb")) + tempse->checked=psm_play_mode==1; +} + +U0 DrawNote(CDC *dc,I64 x,I64 y,I64 duration) +{ + if (0<=duration<=PSM_NUM_DURATIONS) { + Sprite3(dc,x,y,0,psm_duration_imgs[duration]); + if (psm_triplet_durations[duration]) + Sprite3(dc,x,y,0,$IB,"<16>",BI=16$); + if (PsmIsDotted(duration)) + Sprite3(dc,x,y,0,$IB,"<15>",BI=15$); + } +} + +U0 DrawTimeSignature(CDC *dc,I64 x,I64 y,I64 top,I64 bottom) +{ + GrPrint(dc,x,y,"%d",top); + GrPrint(dc,x,y+FONT_HEIGHT,"%d",bottom); +} + +U0 PsmRecalcNoteXY() +{ + F64 measure_len=4,measure_left=measure_len; + PsmNote *tempo=oc.root.next; + I64 x=8-oc.screen_x,note,octave; + while (TRUE) { + tempo->x=x; + tempo->y=50; + if (tempo==&oc.root) + break; + else { + if (tempo->type!=PSMT_METER) { + octave=tempo->octave; + if (octave!=OCTAVE_REST) { + note=tempo->note; + if (Bt(&tempo->flags,PSMf_SHARP)) + note--; + if (Bt(&tempo->flags,PSMf_FLAT)) + note++; + if (note<0) { + note=11; + octave--; + } else if (note>11) { + note=0; + octave++; + } + note=music.note_map[*LstSub(note,psm_note_lst)-'A']; + tempo->y=(15+(psm_note_map[note]-7*(octave-2)))*4; + } + } + x+=tempo->width; + if (tempo->type==PSMT_METER) { + measure_len=tempo->meter_top*4.0/tempo->meter_bottom; + measure_left=0; + } else + measure_left-=psm_durations[tempo->duration]; + if (measure_left<0.001) { + x+=PSM_NOTE_SPACING; + measure_left=measure_len; + } + } + tempo=tempo->next; + } +} + +U0 DrawIt(CTask *task,CDC *dc) +{ + PsmNote *tempo; + I64 i,x,y, + w=task->pix_width; + F64 measure_len=4,measure_left=measure_len; + Bool old_preempt=Preempt(OFF); + + dc->color=BLACK; + for (i=1;i<6;i++) + GrLine(dc,0,i*8,w,i*8); + for (i=7;i<12;i++) + GrLine(dc,0,i*8,w,i*8); + + PsmRecalcNoteXY; + if (oc.cur_note->x<64) { + oc.screen_x-=128; + PsmRecalcNoteXY; + } + if (oc.cur_note->x>=GR_WIDTH-64) { + oc.screen_x+=128; + PsmRecalcNoteXY; + } + + tempo=oc.root.next; + while (tempo!=&oc.root) { + x=tempo->x; + y=tempo->y; + if (measure_left<0.001) { + dc->color=BLACK; + GrLine(dc,x-PSM_NOTE_SPACING,8,x-PSM_NOTE_SPACING,11*8); + measure_left=measure_len; + } + if (tempo->type==PSMT_METER) { + if (tempo==oc.cur_note && PsmBlink) + dc->color=BROWN; + else + dc->color=BLACK; + DrawTimeSignature(dc,x,5*8,tempo->meter_top,tempo->meter_bottom); + measure_len=tempo->meter_top*4.0/tempo->meter_bottom; + measure_left=0; + } else { + if (tempo==oc.cur_note && PsmBlink) { + dc->color=BROWN; + GrPrint(dc,x+8,y,"%s",tempo->word); + } else if (tempo->flags&PSMF_SELECTED) + dc->color=RED; + else { + if (tempo->note!=NOTE_REST) + dc->color=BLACK; + else + dc->color=LTGRAY; + if (PsmHasWords(tempo->word)) + dc->color=GREEN; + } + DrawNote(dc,x,y,tempo->duration); + if (PsmIsDotted(tempo->duration)) + x+=PSM_NOTE_SPACING/2; + if (Bt(&tempo->flags,PSMf_SHARP)) + Sprite3(dc,x,y,0,$IB,"<13>",BI=13$); + else if (Bt(&tempo->flags,PSMf_FLAT)) + Sprite3(dc,x,y,0,$IB,"<14>",BI=14$); + measure_left-=psm_durations[tempo->duration]; + } + tempo=tempo->next; + } + + if (oc.cur_note==&oc.root && PsmBlink) + dc->color=BROWN; + else + dc->color=BLACK; + Sprite3(dc,oc.root.x,50,0,$IB,"<12>",BI=12$); + Preempt(old_preempt); +} + +#define PSM_NOTE_BOX_X 220 +#define PSM_NOTE_BOX_Y (13*FONT_HEIGHT+14) +U0 PsmSetPickNoteBoxX(I64 duration,I64 *x) +{ + I64 i; + *x=PSM_NOTE_BOX_X; + for (i=0;icolor=RED; + else if (psm_triplet_durations[i]) + oc.dc2->color=LTRED; + else + oc.dc2->color=BLACK; + DrawNote(oc.dc2,x,PSM_NOTE_BOX_Y,i); + } +} + +#define PSM_TOOLS_X 450 +#define PSM_TOOLS_Y 13*FONT_HEIGHT + +U0 DrawPickTools() +{ + if (oc.tool==PSMTT_BOX_TOOL) + oc.dc2->color=ROPF_DITHER+WHITE<<16+RED; + else + oc.dc2->color=ROPF_DITHER+WHITE<<16+BLACK; + GrBorder(oc.dc2,PSM_TOOLS_X,PSM_TOOLS_Y, + PSM_TOOLS_X+10,PSM_TOOLS_Y+10); + + if (oc.tool==PSMTT_PTR_TOOL) + oc.dc2->color=RED; + else + oc.dc2->color=BLACK; + (*gr.fp_draw_input_ptr)(oc.dc2,PSM_TOOLS_X+15,PSM_TOOLS_Y); + oc.dc2->color=BLACK; +} + +Bool PsmGetPickToolBox(I64 xx,I64 yy) +{ + if (PSM_TOOLS_X<=xxcolor=BLACK; + for (i=0;i",BI=17$ + + + + + +U0 PsmMenu(I64 psm_octave) +{ + DocClear; + "$$BD,WHITE$$$$FD,GREEN$$$$CM,0,12$$\n"; + Sprite($IB,"<17>",BI=17$); + '\n\n\n\n\n'; + + DrawDC2; + + "$$LTGREEN$$$$FG$$\t\tRest\n" + "$$LTGREEN$$$$FG$$\tDeletes Last Note\n" + "$$LTGREEN$$Left Mouse$$FG$$\tDrag note or shift word\n" + "$$LTGREEN$$Right Mouse$$FG$$\tChange duration or set word\n"; + Sprite($IB,"<6>",BI=6$,"$$SP+LA,\"\",LM=\"Msg(MSG_KEY_DOWN,0,SCF_CTRL|SC_CURSOR_LEFT);\",BI=%d$$"); + " "; + if (oc.playing) + Sprite($IB,"<9>",BI=9$,"$$SP,\"\",LM=\"x\",BI=%d$$"); + else + Sprite($IB,"<8>",BI=8$,"$$SP,\"\",LM=\"x\",BI=%d$$"); + " "; + if (oc.record_entry->checked) { + oc.record_entry->checked=TRUE; + Sprite($IB,"<10>",BI=10$,"$$SP,\"\",LM=\"z\",BI=%d$$"); + } else + Sprite($IB,"<11>",BI=11$,"$$SP,\"\",LM=\"z\",BI=%d$$"); + " "; + Sprite($IB,"<7>",BI=7$,"$$SP+LA,\"\",LM=\"Msg(MSG_KEY_DOWN,0,SCF_CTRL|SC_CURSOR_RIGHT);\",BI=%d$$"); + "$$CM+LX,0,6$$"; + PsmSetOctave(psm_octave); + WinMgrSync(2); +} +" +òÿÿÿñÿÿÿ +ñÿÿÿ +ñÿÿÿ +õÿÿÿ +õÿÿÿ +óÿÿÿ òÿÿÿ +öÿÿÿ +÷ÿÿÿ +ÿÿÿÿýÿÿÿüÿÿÿ +üÿÿÿ +ÿÿÿÿ +ÿÿÿÿýÿÿÿ +òÿÿÿ +þÿÿÿÿÿÿÿÿÿÿÿ +ýÿÿÿ +ÿÿÿÿ +ýÿÿÿ +ýÿÿÿÿÿÿÿ + +þÿÿÿÿÿÿÿÿÿÿÿ +óÿÿÿ +óÿÿÿ +óÿÿÿóÿÿÿ +òÿÿÿ òÿÿÿ +ÿÿÿÿýÿÿÿüÿÿÿ +üÿÿÿ +ÿÿÿÿ +ÿÿÿÿýÿÿÿ +òÿÿÿ +þÿÿÿÿÿÿÿÿÿÿÿ +ýÿÿÿ +ÿÿÿÿ +ýÿÿÿ +ýÿÿÿÿÿÿÿ + +þÿÿÿÿÿÿÿÿÿÿÿÍ +ÿÿÿÿýÿÿÿüÿÿÿ +üÿÿÿ +ÿÿÿÿ +ÿÿÿÿýÿÿÿ +òÿÿÿ +þÿÿÿÿÿÿÿÿÿÿÿ +ýÿÿÿ +ÿÿÿÿ +ýÿÿÿ +ýÿÿÿÿÿÿÿ + +þÿÿÿÿÿÿÿÿÿÿÿV +ÿÿÿÿýÿÿÿüÿÿÿ +üÿÿÿ +ÿÿÿÿ +ÿÿÿÿýÿÿÿ +òÿÿÿE +ÿÿÿÿýÿÿÿüÿÿÿ +üÿÿÿ +ÿÿÿÿ +ÿÿÿÿýÿÿÿa +   + + + a +   + +  + Õ +   + + + + + + + + + +     + +       + +    + + +  + + + +  +  + + + + + + + + +   + + + + + + + + + + + + ? +   + + # +þÿÿÿÖÿÿÿþÿÿÿ& +Öÿÿÿ& E +úÿÿÿ + úÿÿÿ + + ýÿÿÿ + V + ýÿÿÿ + + + +  +  + + +E +þÿÿÿöÿÿÿöÿÿÿ +öÿÿÿòÿÿÿ +òÿÿÿþÿÿÿòÿÿÿ +ôÿÿÿÿÿÿÿôÿÿÿò +$ + $ +0$0 +,4 +44 +,, +@$@ +<D +DD +<< +|„ +„„ +|| +lt +tt +ll +$À$ + + +ÄA$S4DDFTGdHtJ„K”L¤;´',E<RLTlU|IœP¬[¼] +PP +LT +TT +LL +`$` +p$p +€$€ +$ + $  +°$° +À$À +œ¤ +¤¤ +œœ +¬´ +´´ +¬¬ +¼Ä +ÄÄ +¼¼ +P$P0@Pp€ °À@ +~   + P +   + +  +  \ No newline at end of file diff --git a/Apps/Psalmody/PsalmodyFile.CPP b/Apps/Psalmody/PsalmodyFile.CPP new file mode 100644 index 0000000..2fa97a8 --- /dev/null +++ b/Apps/Psalmody/PsalmodyFile.CPP @@ -0,0 +1,431 @@ +U0 PsmNoteDel(PsmNote *tempo) +{ + Free(tempo->word); + Free(tempo); +} + +PsmNote *PsmNoteCopy(PsmNote *tempo) +{ + PsmNote *tempo1=MAllocIdentical(tempo); + if (tempo->word) + tempo1->word=StrNew(tempo->word); + else + tempo1->word=NULL; + return tempo1; +} + +U0 PsmSongDel(PsmNote *root) +{ + PsmNote *tempo,*tempo1; + tempo=root->next; + while (tempo!=root) { + tempo1=tempo->next; + PsmNoteDel(tempo); + tempo=tempo1; + } + root->next=root->last=root; +} + +U0 PsmCutToClipboard() +{ + PsmNote *tempo,*tempo1; + PsmSongDel(&oc.clipboard); + tempo=oc.root.next; + while (tempo!=&oc.root) { + tempo1=tempo->next; + if (tempo->flags&PSMF_SELECTED) { + if (oc.cur_note==tempo) + oc.cur_note=tempo->next; + QueRem(tempo); + tempo->flags&=~PSMF_SELECTED; + QueIns(tempo,oc.clipboard.last); + } + tempo=tempo1; + } +} + +U0 PsmPasteClipboard() +{ + PsmNote *tempo,*tempo1; + tempo=oc.clipboard.next; + while (tempo!=&oc.clipboard) { + tempo1=PsmNoteCopy(tempo); + QueIns(tempo1,oc.cur_note->last); + tempo=tempo->next; + } +} + +U0 PsmCopyToClipboard() +{ + PsmNote *tempo,*tempo1; + PsmSongDel(&oc.clipboard); + tempo=oc.root.next; + while (tempo!=&oc.root) { + if (tempo->flags&PSMF_SELECTED) { + tempo->flags&=~PSMF_SELECTED; + tempo1=PsmNoteCopy(tempo); + QueIns(tempo1,oc.clipboard.last); + } + tempo=tempo->next; + } +} + +PsmNote *PsmFindNote(I64 x,I64) +{ + PsmNote *tempo=oc.root.next; + PsmRecalcNoteXY; + x+=PSM_NOTE_SPACING/2; + while (x>tempo->next->x && tempo!=&oc.root) + tempo=tempo->next; + return tempo; +} + +U8 *PsmMusicSetOctave(U8 *st,I64 *psm_octave) +{ + while ('0'<=*st<='9') + *psm_octave=*st++ -'0'; + return st; +} + +U8 *PsmMusicSetNoteLen(U8 *st,F64 *psm_duration) +{ + Bool cont=TRUE; + do { + switch (*st++) { + case 'w': *psm_duration=4.0; break; + case 'h': *psm_duration=2.0; break; + case 'q': *psm_duration=1.0; break; + case 'e': *psm_duration=0.5; break; + case 's': *psm_duration=0.25; break; + case 't': *psm_duration=2.0* *psm_duration/3.0; break; + case '.': *psm_duration=1.5* *psm_duration; break; + default: + st--; + cont=FALSE; + } + } while (cont); + return st; +} + +U0 PsmLoadSongStr(U8 *st,I64 *psm_octave,F64 *psm_duration) +{ + PsmNote *tempo,*tempo1; + I64 note,i=0; + while (*st) { + tempo=CAlloc(sizeof(PsmNote)); + while (*st && !('A'<=*st<='G') && *st!='R') { + if (*st=='M') { + tempo1=CAlloc(sizeof(PsmNote)); + tempo1->type=PSMT_METER; + st++; + if ('1'<=*st<='9') + tempo1->meter_top=*st++-'0'; + else + tempo1->meter_top=4; + if (*st=='/') + st++; + if ('1'<=*st<='9') + tempo1->meter_bottom=*st++-'0'; + else + tempo1->meter_bottom=4; + PsmSetWidth(tempo1); + QueIns(tempo1,oc.root.last); + } + while (*st=='(') { + Bts(&tempo->flags,PSMf_TIE); + st++; + } + st=PsmMusicSetOctave(st,psm_octave); + st=PsmMusicSetNoteLen(st,psm_duration); + } + if (!*st) { + PsmNoteDel(tempo); + break; + } + note=*st++-'A'; + if (note<7) { + note=music.note_map[note]; + if (*st=='b') { + Bts(&tempo->flags,PSMf_FLAT); + note--; + st++; + } else if (*st=='#') { + Bts(&tempo->flags,PSMf_SHARP); + note++; + st++; + } + if (note<0) { + note=11; + *psm_octave-=1; + } else if (note>11) { + note=0; + *psm_octave+=1; + } + tempo->note=note; + tempo->octave=*psm_octave; + } else { + tempo->note=NOTE_REST; + tempo->octave=OCTAVE_REST; + } + if (*psm_duration<=2*.25/3) + i=0; + else if (*psm_duration<=.25) + i=1; + else if (*psm_duration<=2*.5/3) + i=2; + else if (*psm_duration<=.5) + i=3; + else if (*psm_duration<=2.0/3) + i=4; + else if (*psm_duration<=.5*1.5) + i=5; + else if (*psm_duration<=1.0) + i=6; + else if (*psm_duration<=1.5) + i=7; + else if (*psm_duration<=2.0) + i=8; + else if (*psm_duration<=3.0) + i=9; + else if (*psm_duration<=4.0) + i=10; + else + i=11; + tempo->duration=i; + tempo->type=PSMT_NOTE; + PsmSetWidth(tempo); + QueIns(tempo,oc.cur_note->last); + } +} + +U0 PsmLoadSong(U8 *filename,I64 *psm_octave,F64 *psm_duration) +{ + U8 *st; + PsmNote *tempo; + CLex *lx=LexNew(MStrPrint("#include \"%s\"",filename)); + if (FileOcc("incomplete",filename,"")) + oc.incomplete_entry->checked=TRUE; + else + oc.incomplete_entry->checked=FALSE; + while (Lex(lx)) { + if (lx->token==TK_IDENT) + if (!StrCmp(lx->cur_str,"Play")) { + if (Lex(lx)=='(') + if (Lex(lx)==TK_STR) { + tempo=oc.root.last; + st=LexExtStr(lx); + PsmLoadSongStr(st,psm_octave,psm_duration); + if (lx->token==',') { + if (Lex(lx)==TK_STR) { + st=LexExtStr(lx); + do { + do tempo=tempo->next; + while (tempo!=&oc.root && tempo->type==PSMT_METER); + if (tempo!=&oc.root) + tempo->word=StrNew(st); + st+=StrLen(st)+1; + } while (*st); + } + } + } + } else if (!StrCmp(lx->cur_str,"music.tempo")) { + if (Lex(lx)=='=' && Lex(lx)==TK_F64) { + music.tempo=lx->cur_f64-0.0005; + tempo_state.tempo=Round(TEMPO_RANGE*(music.tempo-0.5)/4.4); + } + } else if (!StrCmp(lx->cur_str,"music.stacatto_factor")) { + if (Lex(lx)=='=' && Lex(lx)==TK_F64) { + music.stacatto_factor=lx->cur_f64-0.0005; + tempo_state.stacatto=Round(TEMPO_RANGE*(music.stacatto_factor-0.12)/0.88); + } + } + } + LexDel(lx); +} + +U8 *PsmCvtSong() +{ + PsmNote *tempo; + U8 *st,*src,*dst; + I64 i,note,octave,last_octave,last_duration; + + i=0; + tempo=oc.root.next; + last_octave=OCTAVE_REST; + last_duration=-1; + while (tempo!=&oc.root) { + dst=&tempo->ascii; + if (tempo->type==PSMT_METER) { + *dst++='M'; + *dst++=tempo->meter_top+'0'; + *dst++='/'; + *dst++=tempo->meter_bottom+'0'; + } else { + octave=tempo->octave; + note=tempo->note; + if (note!=NOTE_REST) { + if (Bt(&tempo->flags,PSMf_SHARP)) + note--; + if (Bt(&tempo->flags,PSMf_FLAT)) + note++; + if (note<0) { + note=11; + octave--; + } else if (note>11) { + note=0; + octave++; + } + note=music.note_map[*LstSub(note,psm_note_lst)-'A']; + } + if (Bt(&tempo->flags,PSMf_TIE)) + *dst++='('; + if (octave!=last_octave && note!=NOTE_REST) { + *dst++=octave+'0'; + last_octave=octave; + } + if (tempo->duration!=last_duration) { + src=LstSub(tempo->duration,psm_duration_lst); + *dst++=src[0]; + if (src[1]) + *dst++=src[1]; + last_duration=tempo->duration; + } + if (note!=NOTE_REST) { + src=LstSub(note,psm_note_lst); + *dst++=src[0]; + if (src[1]) + *dst++=src[1]; + else if (Bt(&tempo->flags,PSMf_FLAT)) + *dst++='b'; + else if (Bt(&tempo->flags,PSMf_SHARP)) + *dst++='#'; + } else + *dst++='R'; + } + *dst++=0; + i+=StrLen(tempo->ascii); + tempo=tempo->next; + } + + st=MAlloc(i+1); + dst=st; + tempo=oc.root.next; + while (tempo!=&oc.root) { + StrCpy(dst,tempo->ascii); + dst+=StrLen(tempo->ascii); + tempo=tempo->next; + } + *dst++=0; + return st; +} + +U8 *PsmSaveSong(U8 *dirname,U8 *full_filename) +{ + CDoc *doc=DocNew(full_filename); + Bool has_words; + PsmNote *tempo,*tempo1; + F64 measure_len=4,two_measure_left=2*measure_len; + I64 ch; + U8 *ptr; + + Free(PsmCvtSong); //set tempo->ascii; + + music.tempo=4.4*tempo_state.tempo/TEMPO_RANGE+0.5; + music.stacatto_factor=0.88*tempo_state.stacatto/TEMPO_RANGE+0.12; + + has_words=FALSE; + tempo=oc.root.next; + while (tempo!=&oc.root) { + if (PsmHasWords(tempo->word)) has_words=TRUE; + tempo=tempo->next; + } + if (oc.incomplete_entry->checked) + DocPrint(doc,"//0 incomplete\n"); + else if (has_words) + DocPrint(doc,"//0 has words\n"); + else + DocPrint(doc,"//0 no nothing\n"); + + DocPrint(doc, +"U0 Song()\n" +"{\n" +" Fs->task_end_cb=&SndTaskEndCB;\n" +" MusicSettingsRst;\n" +" music.tempo=%6.3f;\n" +" music.stacatto_factor=%6.3f;\n" +" try {\n" +" while (!ScanKey) {\n" +"\tPlay(\"",music.tempo+0.0005,music.stacatto_factor+0.0005); + + tempo=oc.root.next; + tempo1=tempo; + has_words=FALSE; + while (tempo!=&oc.root) { + DocPrint(doc,"%s",tempo->ascii); + if (PsmHasWords(tempo->word)) has_words=TRUE; + if (tempo->type==PSMT_METER) { + measure_len=tempo->meter_top*4.0/tempo->meter_bottom; + two_measure_left=0; + } else + two_measure_left-=psm_durations[tempo->duration]; + tempo=tempo->next; + if (two_measure_left<0.001 && tempo!=&oc.root) { + if (has_words) { + DocPrint(doc,"\",\n\t\t\""); + while (tempo1!=tempo) { + if (tempo1->type!=PSMT_METER) { + if (ptr=tempo1->word) { + while (ch=*ptr) { + if (ch==CH_SPACE) + *ptr=CH_SHIFT_SPACE; + ptr++; + } + DocPrint(doc,"%Q\\0",tempo1->word); + } else + DocPrint(doc,"%c\\0",CH_SHIFT_SPACE); + } + tempo1=tempo1->next; + } + } + DocPrint(doc,"\");\n" + "\tPlay(\""); + two_measure_left=2*measure_len; + tempo1=tempo; + has_words=FALSE; + } + } + if (has_words) { + DocPrint(doc,"\",\n\t\t\""); + while (tempo1!=tempo) { + if (tempo1->type!=PSMT_METER) { + if (ptr=tempo1->word) { + while (ch=*ptr) { + if (ch==CH_SPACE) + *ptr=CH_SHIFT_SPACE; + ptr++; + } + DocPrint(doc,"%Q\\0",tempo1->word); + } else + DocPrint(doc,"%c\\0",CH_SHIFT_SPACE); + } + tempo1=tempo1->next; + } + } + DocPrint(doc,"\");\n" +" }\n" +" } catch\n" +" PutExcept;\n" +" Snd(0);\n" +"}\n" +"\n" +"Song;\n"); + DocRecalc(doc); + if (full_filename) + Free(full_filename); + else + StrPrint(doc->filename.name,"%s/Temp.CPP.Z",dirname); + DocWrite(doc,TRUE); + full_filename=StrNew(doc->filename.name); + DocDel(doc); + return full_filename; +} diff --git a/Apps/Psalmody/PsalmodyMain.CPP b/Apps/Psalmody/PsalmodyMain.CPP new file mode 100644 index 0000000..ad79d2b --- /dev/null +++ b/Apps/Psalmody/PsalmodyMain.CPP @@ -0,0 +1,871 @@ +#define PSMR_FLAT -8 +#define PSMR_SHARP -7 +#define PSMR_TIE -6 +#define PSMR_REST -5 +#define PSMR_INS_NOTE -4 +#define PSMR_DELETE_NOTE -3 +#define PSMR_SET_WORD -2 + +F64 PopUpDuration() +{ + I64 i; + CDoc *doc=DocNew; + DocPrint(doc,"$$GREEN$$$$MU,\"Set Word\",LE=PSMR_SET_WORD$$\n" + "$$MU,\"Toggle Sharp\",LE=PSMR_SHARP$$\n" + "$$MU,\"Toggle Flat\",LE=PSMR_FLAT$$\n" + "$$MU,\"Toggle Tie\",LE=PSMR_TIE$$\n" + "$$MU,\"Make Rest\",LE=PSMR_REST$$\n" + "$$MU,\"Insert Note\",LE=PSMR_INS_NOTE$$\n" + "$$MU,\"Delete Note\",LE=PSMR_DELETE_NOTE$$\n\n"); + for (i=0;iflags; + oc.cur_note=tempo=PsmFindNote(x,y); + if (tempo!=&oc.root) { + Fs->win_inhibit=WIG_USER_TASK_DFT; + i=PopUpDuration; + if (0<=itype==PSMT_NOTE) + tempo->duration=i; + } else { + switch (i) { + case PSMR_REST: + if (tempo->type==PSMT_NOTE) { + tempo->octave=OCTAVE_REST; + tempo->note=NOTE_REST; + } + break; + case PSMR_SHARP: + if (tempo->type==PSMT_NOTE && tempo->octave!=OCTAVE_REST) { + if (Btr(&tempo->flags,PSMf_FLAT)) + tempo->note++; + if (Btc(&tempo->flags,PSMf_SHARP)) + tempo->note--; + else + tempo->note++; + if (tempo->note<0) { + tempo->note=11; + tempo->octave--; + } else if (tempo->note>11) { + tempo->note=0; + tempo->octave++; + } + } + break; + case PSMR_FLAT: + if (tempo->type==PSMT_NOTE && tempo->octave!=OCTAVE_REST) { + if (Btr(&tempo->flags,PSMf_SHARP)) + tempo->note--; + if (Btc(&tempo->flags,PSMf_FLAT)) + tempo->note++; + else + tempo->note--; + if (tempo->note<0) { + tempo->note=11; + tempo->octave--; + } else if (tempo->note>11) { + tempo->note=0; + tempo->octave++; + } + } + break; + case PSMR_TIE: + if (tempo->type==PSMT_NOTE) + Btc(&tempo->flags,PSMf_TIE); + break; + case PSMR_SET_WORD: + if (tempo->type==PSMT_NOTE) { + if (DocPut) DocPut->flags&=~DOCF_FORM; + if (PsmHasWords(tempo->word)) + st2=MStrPrint("\nWord(\"%Q\"):",tempo->word); + else + st2=MStrPrint("\nWord(\"\"):"); + DocBottom; + st=GetStr(st2); + Free(st2); + Free(tempo->word); + if (*st) { + tempo->word=MStrPrint("%q",st); + Free(st); + } else + tempo->word=StrNew(" "); + if (DocPut) DocPut->flags=DocPut->flags&~DOCF_FORM|old_doc_flags&DOCF_FORM; + } + break; + case PSMR_INS_NOTE: + tempo1=PsmNoteCopy(tempo); + QueIns(tempo1,tempo); + break; + case PSMR_DELETE_NOTE: + oc.cur_note=tempo->next; + QueRem(tempo); + PsmNoteDel(tempo); + break; + } + } + PsmSetWidth(oc.cur_note); + Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER-WIF_FOCUS_TASK_MENU-WIF_SELF_CTRLS; + } +} + +U0 PsmLeftClickPickNoteBox(I64 duration) +{ + I64 o,n,msg_code,a1,a2; + PsmNote *tempo,*tempo1; + do { + msg_code=GetMsg(&a1,&a2,1<oc.root.last->x) + tempo1=oc.root.last; + else if (a1x) + tempo1=&oc.root; + else + tempo1=PsmFindNote(a1-PSM_NOTE_SPACING/2,a2); + tempo=CAlloc(sizeof(PsmNote)); + tempo->type=PSMT_NOTE; + a2=a2/4-15; + n=-a2%7; + o=2+a2/-7; + n=-n; + if (n<0) { + n+=7; + o++; + } + n=psm_note_inverse_map[n]; + tempo->note=n; + tempo->octave=o; + tempo->duration=duration; + PsmSetWidth(tempo); + QueIns(tempo,tempo1); + oc.cur_note=tempo->next; + } + DrawDC2; +} + +U0 PsmLeftClickPickMeterBox(I64 top,I64 bottom) +{ + I64 msg_code,a1,a2; + PsmNote *tempo,*tempo1; + do { + msg_code=GetMsg(&a1,&a2,1<=oc.root.x) + tempo1=oc.root.last; + else if (a1x) + tempo1=&oc.root; + else + tempo1=PsmFindNote(a1-PSM_NOTE_SPACING/2,a2); + tempo=CAlloc(sizeof(PsmNote)); + tempo->type=PSMT_METER; + tempo->meter_top=top; + tempo->meter_bottom=bottom; + PsmSetWidth(tempo); + QueIns(tempo,tempo1); + oc.cur_note=tempo->next; + } + DrawDC2; +} + +U0 PsmLeftClickStaffPtr(I64 x,I64 y) +{ + PsmNote *tempo,*tempo1; + I64 o,n,msg_code,a1,a2,n_original,o_original; + oc.cur_note=tempo=PsmFindNote(x,y); + if (tempo!=&oc.root) { + if (tempo->type==PSMT_NOTE) { + n_original=tempo->note; + o_original=tempo->octave; + do { + msg_code=GetMsg(&a1,&a2,1<word); + tempo1->word=tempo->word; + tempo->word=NULL; + tempo->note=n_original; + tempo->octave=o_original; + } + } else { +move_note: + a2=a2/4-15; + n=-a2%7; + o=2+a2/-7; + n=-n; + if (n<0) { + n+=7; + o++; + } + n=psm_note_inverse_map[n]; + tempo->note=n; + tempo->octave=o; + } + } while (msg_code!=MSG_IP_L_UP); + PsmSetWidth(tempo); + } + } +} + +U0 PsmLeftClickStaffBox(I64 x,I64 y) +{ + I64 msg_code,a1,a2; + do { + msg_code=GetMsg(&a1,&a2,1<color=ROPF_DITHER+WHITE<<16+BLACK; + GrBorder(oc.dc2,x,y,a1,a2); + if (msg_code==MSG_IP_L_UP) { + if (x>a1) SwapI64(&x,&a1); + PsmMarkSelected(x,a1,TRUE); + } + } while (msg_code!=MSG_IP_L_UP); + DrawDC2; +} + +U0 PsmLeftClick(I64 x,I64 y) +{ + I64 duration,top,bottom; + if (y<13*FONT_HEIGHT) { + if (oc.tool==PSMTT_PTR_TOOL) + PsmLeftClickStaffPtr(x,y); + else + PsmLeftClickStaffBox(x,y); + } else { + duration=PsmGetPickNoteBoxDuration(x,y); + if (0<=durationtask_end_cb=&SndTaskEndCB; + while (TRUE) { + i++; + switch (psm_play_mode) { + case PSMPM_NORMAL: + if (psm_play_f!=f) { + f=psm_play_f; + Snd(f); + } + break; + case PSMPM_REVERB1: + if (psm_play_f!=f) { + if (f>0) + f2=f; + f=psm_play_f; + } + if (!(i&15)) { + if (i&16) + Snd(f); + else + Snd(f2); + } + break; + } + Sleep(1); + } +} + +U8 PsmCvtDuration(F64 d) +{ + F64 d1,d2; + I64 j; + for (j=0;jx<=xx+o->w && yh) { + Msg(MSG_KEY_DOWN,o->ascii,0); + return; + } + } + } +} + +U0 PsmUpKey(I64 x,I64 y) +{ + I64 i; + PsmKey *o; + y-=FONT_HEIGHT*13; + if (0<=yx<=xx+o->w && yh) { + Msg(MSG_KEY_UP,o->ascii,0); + return; + } + } + } +} + +U0 PsmPushMode(I64 psm_octave) +{ + Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER-WIF_FOCUS_TASK_MENU-WIF_SELF_CTRLS; + PsmMenu(psm_octave); +} + +U0 PsmPopMode() +{ + Fs->win_inhibit=WIG_USER_TASK_DFT; + DCFill; +} + +#define PSMF_CD 1 +#define PSMF_INCOMPLETE 2 + +U0 Psalmody(U8 *dirname=NULL) +{ + Bool was_playing; + I64 a1,a2,msg_code=0,col, + note=NOTE_REST,octave=OCTAVE_REST,psm_octave=3,timeout_val,timeout_val2, + old_doc_flags; + U8 *filename=NULL,*st,*st2; + CTask *play_task=Spawn(&PsmPlayTask,NULL,"Psalmody Play",,Fs); + PsmNote *tempo; + F64 f=0,last_f=0,psm_duration=1.0, + d,evt_time=tS,note_down_time=tS; + CCtrl *c=TempoNew; + + if (DocPut) old_doc_flags=DocPut->flags; + SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ + WinBorder; + AutoComplete; + Preempt(OFF); + + MkDir("::/Home/Psalmody"); + MusicSettingsRst; + tempo_state.tempo=Round(TEMPO_RANGE*(music.tempo-0.5)/4.4); + tempo_state.stacatto=Round(TEMPO_RANGE*(music.stacatto_factor-0.12)/0.88); + + if (DocPut) DocPut->flags|=DOCF_FORM; + + MemSet(&oc,0,sizeof(PsmCtrl)); + oc.screen_x=0; + oc.root.next=oc.root.last=&oc.root; + oc.clipboard.next=oc.clipboard.last=&oc.clipboard; + oc.cur_note=&oc.root; + oc.dc2=DCAlias; + + MenuPush( + "File {" + " New(,'.');" + " ChgDir(MSG_CMD,PSMF_CD);" + " Open(,CH_CTRLO);" + " SaveAs(,CH_CTRLA);" + " Abort(,CH_SHIFT_ESC);" + " Exit(,CH_ESC);" + "}" + "Edit {" + " Cut(,CH_CTRLX);" + " Copy(,CH_CTRLC);" + " Paste(,CH_CTRLV);" + " RightMenu(,'\n');" + " BackSpace(,CH_BACKSPACE);" + " DeleteNote(,,SC_DELETE);" + " ClearSong(,'.');" + " Left(,,SC_CURSOR_LEFT);" + " Right(,,SC_CURSOR_RIGHT);" + " GoBegin(,,0x4CB0000044B);" + " GoEnd(,,0x4CD0000044D);" + "}" + "Song {" + " Play(,'x');" + " Record(,'z');" + " Random(,',');" + " MarkIncomplete(MSG_CMD,PSMF_INCOMPLETE);" + "}" + "Snd {" + " Reverb(,'c');" + " Octave0(,'0');" + " Octave1(,'1');" + " Octave2(,'2');" + " Octave3(,'3');" + " Octave4(,'4');" + " Octave5(,'5');" + " Octave6(,'6');" + "}" + "Help {" + " Help(,,SC_F1);" + "}" + ); + oc.incomplete_entry=MenuEntryFind(Fs->cur_menu,"Song/MarkIncomplete"); + oc.record_entry=MenuEntryFind(Fs->cur_menu,"Song/Record"); + + WinMax; + + if (!dirname) + dirname=StrNew("::/Home/Psalmody"); + else + dirname=StrNew(dirname); + PsmPushMode(psm_octave); + col=0; + Fs->draw_it=&DrawIt; + + try { + while (TRUE) { + was_playing=FALSE; +mo_start: + if (ip.pos_text.y-Fs->win_top<18) + msg_code=GetMsg(&a1,&a2,1< when the Doc Buttons are clicked. + //This is so that kbd and mouse are the same for Doc's. + //We must now pass the onto the Doc handler. + PutKey(a1,a2); + goto mo_start; + } + if (msg_code!=MSG_IP_MOVE) { + DocBottom; + if (was_playing || DocPut->cur_entry->y>=Fs->win_height-2) { + PsmMenu(psm_octave); + col=0; + } + } + + octave=psm_octave; + switch (msg_code) { + case MSG_CMD: + PsmPopMode; + switch (a1) { + case PSMF_CD: + st2=dirname; + if (dirname=PopUpPickDir) { + Free(st2); + Free(filename); + filename=NULL; + } else + dirname=st2; + break; + case PSMF_INCOMPLETE: + oc.incomplete_entry->checked=!oc.incomplete_entry->checked; + break; + } + PsmPushMode(psm_octave); + col=0; + break; + case MSG_KEY_DOWN: + evt_time=tS; + if ('0'<=a1<='9') { + psm_octave=a1-'0'; + PsmMenu(psm_octave); + col=0; + } else { + switch (a1) { + sub_switch_start: + case 'a': note=7; octave--; break; + case 's': note=8; octave--; break; + case 'e': note=9; octave--; break; + case 'd': note=10; octave--; break; + case 'r': note=11; octave--; break; + case 'f': note=0; break; + case 't': note=1; break; + case 'g': note=2; break; + case 'h': note=3; break; + case 'u': note=4; break; + case 'j': note=5; break; + case 'i': note=6; break; + case 'k': note=7; break; + case 'l': note=8; break; + case 'p': note=9; break; + case ';': note=10; break; + case '[': note=11; break; + case '\'': note=0; octave++; break; + case ']': note=1; octave++; break; + sub_switch_end: + f=Note2Freq(note,octave); + break; + case CH_SPACE: + note=NOTE_REST; + octave=OCTAVE_REST; + f=-1; //rest + break; + + case 0: + switch (a2.u8[0]) { + case SC_CURSOR_LEFT: + if (a2&SCF_CTRL) { + while (oc.cur_note->last!=&oc.root) { + oc.cur_note=oc.cur_note->last; + if (oc.cur_note!=&oc.root) + LBEqu(&oc.cur_note->flags,PSMf_SELECTED,a2&SCF_SHIFT); + } + } else { + if (oc.cur_note->last!=&oc.root) { + oc.cur_note=oc.cur_note->last; + if (oc.cur_note!=&oc.root) + LBEqu(&oc.cur_note->flags,PSMf_SELECTED,a2&SCF_SHIFT); + } + } + break; + case SC_CURSOR_RIGHT: + if (a2&SCF_CTRL) { + while (oc.cur_note!=&oc.root) { + if (oc.cur_note!=&oc.root) + LBEqu(&oc.cur_note->flags,PSMf_SELECTED,a2&SCF_SHIFT); + oc.cur_note=oc.cur_note->next; + } + } else { + if (oc.cur_note!=&oc.root) { + if (oc.cur_note!=&oc.root) + LBEqu(&oc.cur_note->flags,PSMf_SELECTED,a2&SCF_SHIFT); + oc.cur_note=oc.cur_note->next; + } + } + break; + case SC_DELETE: + if (a2&SCF_SHIFT) + PsmCutToClipboard; + else { + tempo=oc.cur_note; + oc.cur_note=tempo->next; + if (tempo!=&oc.root) { + QueRem(tempo); + PsmNoteDel(tempo); + } + } + break; + case SC_INS: + if (a2&SCF_SHIFT) + PsmPasteClipboard; + else if (a2&SCF_CTRL) + PsmCopyToClipboard; + break; + case SC_F1: + PsmPopMode; + PopUpEd("::/Apps/Psalmody/Help.TXT.Z",Fs); + PsmPushMode(psm_octave); + col=0; + break; + } + break; + case ',': + Free(filename); + filename=NULL; + PsmPopMode; + music.octave=psm_octave; + if (st2=GodSongStr) { + PsmLoadSongStr(st2,&psm_octave,&psm_duration); + Free(st2); + } + PsmPushMode(psm_octave); + col=0; + break; + case CH_CTRLO: + PsmPopMode; + AcctOneTimePopUp(ARf_PSALMODY_JUKEBOX, + "Select a song and preview it.\n" + "$$GREEN$$$$FG$$ to load it into Psalmody.\n\n" + ST_WARN_ST " Graphics and other embelishments\n" + "will be lost because Psalmody can't\n" + "parse HolyC programs completely.\n"); + Free(filename); + filename=NULL; + JukeBox(dirname,&filename); + if (filename) { + oc.screen_x=0; + psm_duration=1.0; + psm_octave=3; + PsmSongDel(&oc.root); + oc.cur_note=&oc.root; + PsmLoadSong(filename,&psm_octave,&psm_duration); + oc.record_entry->checked=FALSE; + oc.cur_note=oc.root.next; + } + PsmPushMode(psm_octave); + col=0; + break; + case CH_CTRLA: + PsmPopMode; + filename=PsmSaveSong(dirname,filename); + PsmPushMode(psm_octave); + break; + case CH_CTRLC: + PsmCopyToClipboard; + break; + case CH_CTRLV: + PsmPasteClipboard; + break; + case CH_CTRLX: + PsmCutToClipboard; + break; + case '.': + PsmMenu(psm_octave); + col=0; + Free(filename); + filename=NULL; + psm_duration=1.0; + psm_octave=3; + PsmSongDel(&oc.root); + oc.cur_note=&oc.root; + oc.screen_x=0; + break; + case '\n': + if (oc.cur_note!=&oc.root) + PsmRightClick(oc.cur_note->x,oc.cur_note->y); + break; + case 'x': + if (was_playing) + break; + col=0; + oc.playing=TRUE; + PsmMenu(psm_octave); + tempo=oc.cur_note; + while (tempo!=&oc.root) { + if (tempo->type!=PSMT_METER) { + timeout_val=cnts.jiffies; + if (ip.pos_text.y-Fs->win_top<18) + msg_code=ScanMsg(&a1,&a2,1<win_top>=18 && msg_code==MSG_IP_L_DOWN) + goto mo_start; + else + goto mo_got_msg; + } + oc.cur_note=tempo; + oc.screen_x+=tempo->x-0.33*GR_WIDTH; + if (PsmHasWords(tempo->word)) + "%s",tempo->word; + note=tempo->note; + octave=tempo->octave; + if (note!=NOTE_REST) + f=Note2Freq(note,octave); + else + f=-1; //rest + if (f>0) + psm_play_f=f; + else + psm_play_f=0; + + music.tempo=4.4*tempo_state.tempo/TEMPO_RANGE+0.5; + music.stacatto_factor=0.88*tempo_state.stacatto/TEMPO_RANGE+0.12; + d=JIFFY_FREQ*psm_durations[tempo->duration]/music.tempo; + if (Bt(&tempo->flags,PSMf_TIE)) { + timeout_val+=d; + timeout_val2=timeout_val; + } else { + timeout_val+=d*music.stacatto_factor; + timeout_val2=timeout_val+ + d*(1.0-music.stacatto_factor); + } + SleepUntil(timeout_val); + psm_play_f=0; + SleepUntil(timeout_val2); + } + tempo=tempo->next; + } + oc.cur_note=&oc.root; + oc.screen_x+=oc.cur_note->x-GR_WIDTH/2; + oc.playing=FALSE; + PsmMenu(psm_octave); + col=0; + f=0; + psm_play_f=0; + break; + case CH_BACKSPACE: + tempo=oc.cur_note->last; + if (tempo!=&oc.root) { + QueRem(tempo); + PsmNoteDel(tempo); + } + if (col) { + '' CH_BACKSPACE; + col--; + } + break; + case 'c': + psm_play_mode++; + if (psm_play_mode>=PSMPM_NUM_PLAY_MODES) psm_play_mode=0; + PsmMenu(psm_octave); + col=0; + break; + case 'z': + if (oc.record_entry->checked) + oc.record_entry->checked=FALSE; + else { + oc.record_entry->checked=TRUE; + psm_duration=1.0; + psm_octave=3; + oc.screen_x=0; + } + PsmMenu(psm_octave); + col=0; + break; + case CH_ESC: + PsmPopMode; + filename=PsmSaveSong(dirname,filename); + PsmPushMode(psm_octave); + case CH_SHIFT_ESC: + goto mo_done; + } + } + break; + case MSG_KEY_UP: + evt_time=tS; + f=0; + break; + case MSG_IP_MOVE: + if (a2>18*FONT_HEIGHT) + Fs->win_inhibit=WIG_USER_TASK_DFT; + else + Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER-WIF_FOCUS_TASK_MENU-WIF_SELF_CTRLS; + break; + case MSG_IP_L_DOWN: + PsmDownKey(a1,a2); + PsmLeftClick(a1,a2); + break; + case MSG_IP_L_UP: + PsmUpKey(a1,a2); + break; + default: + PsmRightClick(a1,a2); + } + if (f!=last_f) { + if (f>0) { + st=LstSub(note,psm_note_lst); + psm_play_f=f; + } else { + if (f<0) + st="R"; + else + st=""; + psm_play_f=0; + } + if (oc.record_entry->checked) { + if (last_f) { + music.tempo=4.4*tempo_state.tempo/TEMPO_RANGE+0.5; + music.stacatto_factor=0.88*tempo_state.stacatto/TEMPO_RANGE+0.12; + + tempo->duration=PsmCvtDuration(music.tempo*(evt_time-note_down_time)); + PsmSetWidth(tempo); + QueIns(tempo,oc.cur_note->last); + } + if (f) { + note_down_time=tS; + tempo=CAlloc(sizeof(PsmNote)); + tempo->type=PSMT_NOTE; + tempo->note=note; + tempo->octave=octave; + if (st[1]=='#') + Bts(&tempo->flags,PSMf_SHARP); + } + } + last_f=f; + "%s",st; + col+=StrLen(st); + if (col>=Fs->win_width-1) { + '\n'; + col=0; + } + } + } +mo_done: + GetMsg(,,1<flags=DocPut->flags&~DOCF_FORM|old_doc_flags&DOCF_FORM; + Free(dirname); + MenuPop; +} diff --git a/Apps/Psalmody/Run.CPP b/Apps/Psalmody/Run.CPP index 9784fe0..a05ede1 100644 --- a/Apps/Psalmody/Run.CPP +++ b/Apps/Psalmody/Run.CPP @@ -1,3 +1,4 @@ -#include "/Apps/Psalmody/Load" -#include "/Apps/Psalmody/Install" //Might as well always install +Cd(__DIR__);; +#include "Load" +#include "Install" //Might as well always install Psalmody; diff --git a/Apps/Span/Install.CPP b/Apps/Span/Install.CPP index 659fce7..fc5f95f 100644 --- a/Apps/Span/Install.CPP +++ b/Apps/Span/Install.CPP @@ -1 +1 @@ -MkDir("HOME/Span"); +MkDir("::/Home/Span"); diff --git a/Apps/Span/Load.CPP b/Apps/Span/Load.CPP index 5dc30b7..4d1c09a 100644 --- a/Apps/Span/Load.CPP +++ b/Apps/Span/Load.CPP @@ -1,9 +1,9 @@ #help_index "Games" -Cd("/Apps/Span");; +Cd(__DIR__);; #include "Span.HPP" #include "SpanDerive" -#include "SpanBridge1" +#include "SpanBridge" #include "SpanNew" #include "SpanMain" diff --git a/Apps/Span/Run.CPP b/Apps/Span/Run.CPP index 95cc333..a20a566 100644 --- a/Apps/Span/Run.CPP +++ b/Apps/Span/Run.CPP @@ -1,3 +1,3 @@ -Cd("/Apps/Span");; +Cd(__DIR__);; #include "Load" Span; diff --git a/Apps/Span/SpanBridge1.CPP b/Apps/Span/SpanBridge.CPP similarity index 100% rename from Apps/Span/SpanBridge1.CPP rename to Apps/Span/SpanBridge.CPP diff --git a/Apps/Span/SpanMain.CPP b/Apps/Span/SpanMain.CPP index a46317c..05cbca3 100644 --- a/Apps/Span/SpanMain.CPP +++ b/Apps/Span/SpanMain.CPP @@ -290,7 +290,7 @@ U0 Span() DocCursor; WinBorder; - WordStat; + AutoComplete; Fs->win_inhibit|=WIG_DBL_CLICK; MenuPush( diff --git a/Apps/Span/SpanNew.CPP b/Apps/Span/SpanNew.CPP index 165f902..f216d8e 100644 --- a/Apps/Span/SpanNew.CPP +++ b/Apps/Span/SpanNew.CPP @@ -19,8 +19,8 @@ U0 SpanDel(CMathODE *ode) } } -#define M_SIZE (sizeof(MyMass) -offset(CMass.start_saved_area)) -#define S_SIZE (sizeof(MySpring)-offset(CSpring.start_saved_area)) +#define M_SIZE (sizeof(MyMass) -offset(CMass.start)) +#define S_SIZE (sizeof(MySpring)-offset(CSpring.start)) U8 *SpanSave(CMathODE *ode,I64 *_size=NULL) { @@ -49,14 +49,14 @@ U8 *SpanSave(CMathODE *ode,I64 *_size=NULL) tempm=ode->next_mass; while (tempm!=&ode->next_mass) { - MemCpy(ptr,&tempm->start_saved_area,M_SIZE); + MemCpy(ptr,&tempm->start,M_SIZE); ptr+=M_SIZE; tempm=tempm->next; } temps=ode->next_spring; while (temps!=&ode->next_spring) { - MemCpy(ptr,&temps->start_saved_area,S_SIZE); + MemCpy(ptr,&temps->start,S_SIZE); ptr+=S_SIZE; temps=temps->next; } @@ -68,10 +68,10 @@ Bool SpanWrite(CMathODE *ode) { U8 *name,*buf; I64 size; - Bool result=FALSE,old_silent=Silent(ON); - MkDir("HOME/Span"); + Bool result=FALSE,old_silent=Silent; + MkDir("::/Home/Span"); Silent(old_silent); - if (name=PopUpFileName("HOME/Span/Game.DAT")) { + if (name=PopUpFileName("::/Home/Span/Game.DAT")) { if (buf=SpanSave(ode,&size)) { FileWrite(name,buf,size); Free(buf); @@ -96,14 +96,14 @@ U0 SpanLoad(CMathODE *ode,U8 *src) for (i=0;istart_saved_area,src,M_SIZE); + MemCpy(&tempm->start,src,M_SIZE); src+=M_SIZE; QueIns(tempm,ode->last_mass); } for (i=0;istart_saved_area,src,S_SIZE); + MemCpy(&temps->start,src,S_SIZE); src+=S_SIZE; QueIns(temps,ode->last_spring); temps->end1=MassFindNum(ode,temps->end1_num); @@ -114,10 +114,10 @@ U0 SpanLoad(CMathODE *ode,U8 *src) U8 *SpanRead() { U8 *src=NULL,*name; - Bool old_silent=Silent(ON); - MkDir("HOME/Span"); + Bool old_silent=Silent; + MkDir("::/Home/Span"); Silent(old_silent); - if (name=PopUpPickFile("HOME/Span")) { + if (name=PopUpPickFile("::/Home/Span")) { src=FileRead(name); Free(name); } diff --git a/Apps/Strut/Load.CPP b/Apps/Strut/Load.CPP index e0bc52b..5fca01e 100644 --- a/Apps/Strut/Load.CPP +++ b/Apps/Strut/Load.CPP @@ -1,6 +1,6 @@ #help_index "Games" -Cd("/Apps/Strut");; +Cd(__DIR__);; #include "Strut" #help_index "" diff --git a/Apps/Strut/Run.CPP b/Apps/Strut/Run.CPP index c361905..f076168 100644 --- a/Apps/Strut/Run.CPP +++ b/Apps/Strut/Run.CPP @@ -1,3 +1,3 @@ -Cd("/Apps/Strut");; +Cd(__DIR__);; #include "Load" Strut; diff --git a/Apps/Strut/Strut.CPP b/Apps/Strut/Strut.CPP index e87103b..af8d3b9 100644 --- a/Apps/Strut/Strut.CPP +++ b/Apps/Strut/Strut.CPP @@ -617,7 +617,7 @@ U0 Strut() Define("ST_MAIN_MODES"),main_mode_colors,&main_mode_button); WinBorder; Preempt(OFF); - WordStat; + AutoComplete; DocCursor; DocClear; Init; @@ -634,4 +634,4 @@ U0 Strut() SettingsPop; CtrlButtonDel(bt_main_mode); } -øÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚ùÿÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file +øÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚ùÿÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/Apps/TimeClock/Install.CPP b/Apps/TimeClock/Install.CPP index 66c842a..e2e1c55 100644 --- a/Apps/TimeClock/Install.CPP +++ b/Apps/TimeClock/Install.CPP @@ -1,5 +1,5 @@ -if (!FileFind("HOME/TimeClock",,FUF_JUST_DIRS)) { - MkDir("HOME/TimeClock"); +if (!FileFind("::/Home/TimeClock",,FUF_JUST_DIRS)) { + MkDir("::/Home/TimeClock"); DocClear; "After Loading, type $$GREEN$$PunchIn;$$FG$$, " "$$GREEN$$PunchOut;$$FG$$ or $$GREEN$$TimeRep;$$FG$$\n" diff --git a/Apps/TimeClock/Load.CPP b/Apps/TimeClock/Load.CPP index 0be5caf..4d448ad 100644 --- a/Apps/TimeClock/Load.CPP +++ b/Apps/TimeClock/Load.CPP @@ -1,6 +1,7 @@ #help_index "Misc" -#include "/Apps/TimeClock/TimeClk" -#include "/Apps/TimeClock/Install" //Might as well always install +Cd(__DIR__);; +#include "TimeClk" +#include "Install" //Might as well always install #help_index "" diff --git a/Apps/TimeClock/TimeClk.CPP b/Apps/TimeClock/TimeClk.CPP index 2d56c75..766ef6f 100644 --- a/Apps/TimeClock/TimeClk.CPP +++ b/Apps/TimeClock/TimeClk.CPP @@ -1,4 +1,4 @@ -#define TIME_FILENAME "HOME/TimeClock/TimeFile.DAT.Z" +#define TIME_FILENAME "::/Home/TimeClock/TimeFile.DAT.Z" #define TET_EOF 0 #define TET_PUNCH_IN 1 @@ -20,7 +20,7 @@ U0 TimeFileRead(TimeEntry *header) buf=FileRead(TIME_FILENAME); if (!buf) buf=CAlloc(1); - header->next=header->last=header; + QueInit(header); ptr=buf; while (type=*ptr++) { tempt=CAlloc(sizeof(TimeEntry)); @@ -116,10 +116,8 @@ public Bool TimeRep(TimeEntry **_header=NULL) public U0 PunchOut() { - Bool is_in; TimeEntry *tempt,*header; - is_in=TimeRep(&header); - if (!is_in) + if (!TimeRep(&header)) "$$BK,1$$Already Punched-Out$$BK,0$$\n"; else { tempt=MAlloc(sizeof(TimeEntry)); @@ -136,10 +134,8 @@ public U0 PunchOut() public U0 PunchIn() { - Bool is_in; TimeEntry *tempt,*header; - is_in=TimeRep(&header); - if (is_in) + if (TimeRep(&header)) "$$BK,1$$Already Punched-In$$BK,0$$\n"; else { tempt=MAlloc(sizeof(TimeEntry)); diff --git a/Apps/TimeOut/Load.CPP b/Apps/TimeOut/Load.CPP index a7f7a45..28cd615 100644 --- a/Apps/TimeOut/Load.CPP +++ b/Apps/TimeOut/Load.CPP @@ -1,5 +1,6 @@ #help_index "Games" -#include "/Apps/TimeOut/TimeOut" +Cd(__DIR__);; +#include "TimeOut" #help_index "" diff --git a/Apps/TimeOut/Run.CPP b/Apps/TimeOut/Run.CPP index db4087d..fd210c6 100644 --- a/Apps/TimeOut/Run.CPP +++ b/Apps/TimeOut/Run.CPP @@ -1,2 +1,3 @@ -#include "/Apps/TimeOut/Load" +Cd(__DIR__);; +#include "Load" TimeOut; \ No newline at end of file diff --git a/Apps/TimeOut/TimeOut.CPP b/Apps/TimeOut/TimeOut.CPP index 42c1016..4c1b4f0 100644 --- a/Apps/TimeOut/TimeOut.CPP +++ b/Apps/TimeOut/TimeOut.CPP @@ -24,7 +24,7 @@ F64 t0,tf,snd_bullet_timeout,snd_death_timeout; #define HACK_DIST 5 class Man { - I64 x,y,closest_d; + I64 x,y,best_dd; F64 é,hack_phase,corpse_timeout; Bool friendly,dead,pad[6]; } m[MAX_MAN]; @@ -157,7 +157,7 @@ U0 DrawIt(CTask *task,CDC *dc) _temps=friendly_imgs; else _temps=enemy_imgs; - if (tempm->closest_dbest_ddhack_phase+20*tS,0)/(2*ã)]; else temps=_temps[0]; @@ -276,7 +276,7 @@ U0 Init() tempm->y=yy+64*RandU32/MAX_I32-64+100; tempm->corpse_timeout=0; tempm->hack_phase=2*ã*Rand; - tempm->closest_d=MAX_I64; + tempm->best_dd=MAX_I64; } for (i=0;itext_attr=YELLOW<<4+CYAN; @@ -594,7 +595,7 @@ to_done: AcctRegWriteBranch("TempleOS/TimeOut","I64 best_score=%d;\n",best_score); } -0ôÿÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +ôÿÿÿÐÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ @@ -816,8 +817,8 @@ to_done: -ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ê8ryÍÿÿÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ 66æÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz ûÿÿÿøÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿ ‚$íÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ’y=ÃÿÿÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ò÷ÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ - þÿÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ² -þÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz ûÿÿÿøÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÒ - þÿÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ² -þÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò÷ÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿ  ÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ê8Íÿÿÿ‡ÿÿÿryÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ æÿÿÿêÿÿÿ66ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzûÿÿÿøÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿ ‚íÿÿÿëÿÿÿ$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ’ÃÿÿÿÄÿÿÿy=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ò÷ÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒþÿÿÿùÿÿÿ + ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²þÿÿÿûÿÿÿ +ÿÿÿÿÿÿÿÿÿÿ ÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzûÿÿÿøÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÒþÿÿÿùÿÿÿ + ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²þÿÿÿûÿÿÿ +ÿÿÿÿÿÿÿÿÿ ÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò÷ÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿ  ÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/Apps/ToTheFront/AIs/SimpleAI.CPP b/Apps/ToTheFront/AIs/SimpleAI.CPP index 2e5a227..45c0adb 100644 --- a/Apps/ToTheFront/AIs/SimpleAI.CPP +++ b/Apps/ToTheFront/AIs/SimpleAI.CPP @@ -1,7 +1,7 @@ Unit *FindNearestUnit(I64 row,I64 col,I64 player,Bool in_LOS,F64 range=-1) { I64 i; - F64 d,best_d=MAX_F64,x1,y1,x2,y2; + F64 dd,best_dd=MAX_F64,x1,y1,x2,y2; Unit *best=NULL; //$LK,"Sqrt",A="MN:Sqrt"$() is slow, so work with squared distances. if (range<0) @@ -13,10 +13,10 @@ Unit *FindNearestUnit(I64 row,I64 col,I64 player,Bool in_LOS,F64 range=-1) if (units[player][i].life>0) { if (!in_LOS || LOS(row,col,units[player][i].row,units[player][i].col)) { RowCol2XY(&x2,&y2,units[player][i].row,units[player][i].col); - d=Sqr(x2-x1)+Sqr(y2-y1); - if (d<=range && d compile chk feature. DefinePrint("HEX_RADIUS","%12.9f",DSIN+0.01); //slop d=PopUpRangeF64(0,100,25,"%3f% %%","Animation Delay\n"); DefinePrint("ANIMATION_DELAY","%5.3f",d/100.0); - Randomize; - Randomize(PopUpGetI64("Seed(0x%X):",Fs->rnd_seed)); + Seed(PopUpGetI64("Seed(0x%X):",Seed)); XTalk(rotate_tank_task," "); TaskWait(rotate_tank_task); Kill(rotate_tank_task); @@ -72,7 +71,7 @@ I64 map_cols=(MAP_WIDTH-DCOS)/(2*HEX_SIDE+2*DCOS), map_width=map_cols*(2*HEX_SIDE+2*DCOS)+DCOS, map_height=map_rows*DSIN+DSIN+1; -CDC *map; +CDC *map_dc; U8 terrain[map_rows][map_cols]; //Centers of hexes @@ -331,7 +330,7 @@ Bool MPRecalcVisible(MPCtrl1 *job) { Bool result=FALSE,seen; I64 i,j,row,col; - F64 x1,y1,x2,y2,d,range; + F64 x1,y1,x2,y2,dd,range; Unit *ut0,*ut1; ut0=&units[cur_player][job->lo]; ut1=&units[enemy_player][job->lo]; @@ -352,8 +351,8 @@ Bool MPRecalcVisible(MPCtrl1 *job) if (ut1->life>0 && LOS(row,col,ut1->row,ut1->col)) { RowCol2XY(&x2,&y2,ut1->row,ut1->col); - d=Sqr(x2-x1)+Sqr(y2-y1); - if (dvisible[cur_player],0); } @@ -531,18 +530,18 @@ I64 MoveCost(Unit *tempu,I64 r,I64 c,I64 facing) I64 MoveOneHex(I64 *_row,I64 *_col,F64 x,F64 y) { I64 direction,best_direction=-1,r,c; - F64 d,best_d,x1,y1; + F64 dd,best_dd,x1,y1; RowCol2XY(&x1,&y1,*_row,*_col); - best_d=Sqr(x1-x)+Sqr(y1-y); + best_dd=Sqr(x1-x)+Sqr(y1-y); for (direction=0;direction<6;direction++) { r=*_row; c=*_col; Toward(&r,&c,direction); RowCol2XY(&x1,&y1,r,c); - d=Sqr(x1-x)+Sqr(y1-y); + dd=Sqr(x1-x)+Sqr(y1-y); if (0<=r=0) { "+%5.2f Hit\n",d; hit=TRUE; @@ -873,7 +872,7 @@ U0 IndirectFireResolve() if (dammage>0) { "Life:%3d - Dammage:%3f =",target->life,dammage; if (dammage>=target->life) { - "Killed\n"; + 'Killed\n'; target->life=0; RecalcVisible(RV_FRIENDLY_UNIT_DIED,target); alive_cnt[target->player]--; @@ -909,30 +908,30 @@ U0 DrawHexes() F64 dx=2*HEX_SIDE+2*DCOS,dy=2*DSIN, x,y,x1,y1,x2,y2; I64 i,j; - map->color=WHITE; - GrRect(map,0,0,map->width,map->height); - map->color=BLACK; + map_dc->color=WHITE; + GrRect(map_dc,0,0,map_dc->width,map_dc->height); + map_dc->color=BLACK; y=0; for (j=0;jcolor=terrain[j][i]; + map_dc->color=terrain[j][i]; RowCol2XY(&x,&y,j,i); - GrFloodFill(map,x,y); + GrFloodFill(map_dc,x,y); } } @@ -1033,12 +1032,12 @@ U0 DrawRivers() if (0<=rcolor=LTBLUE; - map->pen_width=4; - GrLine3(map,x1,y1,0,x2,y2,0); - map->color=BLUE; - map->pen_width=2; - GrLine3(map,x1,y1,0,x2,y2,0); + map_dc->color=LTBLUE; + map_dc->pen_width=4; + GrLine3(map_dc,x1,y1,0,x2,y2,0); + map_dc->color=BLUE; + map_dc->pen_width=2; + GrLine3(map_dc,x1,y1,0,x2,y2,0); } } } @@ -1049,8 +1048,8 @@ U0 DrawRoads() { I64 i,j,k,r,c; F64 x1,y1,x2,y2; - map->color=RED; - map->pen_width=3; + map_dc->color=RED; + map_dc->pen_width=3; for (j=0;jcolor=BLACK; + map_dc->color=BLACK; for (j=0;jplayer=j; tempu->num=i; tempu->life=100; - tempu->facing=Rand2U16%6; + tempu->facing=RandU16%6; if (!j) { if (i>=Round(MAX_UNITS*P1_TO_P2_ODDS*PLAYER_1_ARMOR_PERCENT/100.0)) { if (Round(i-MAX_UNITS*P1_TO_P2_ODDS*PLAYER_1_ARMOR_PERCENT/100.0)>=Round(0.85*(MAX_UNITS-MAX_UNITS*P1_TO_P2_ODDS*PLAYER_1_ARMOR_PERCENT/100.0))) @@ -1200,8 +1199,8 @@ U0 InitUnits() break; } do { - row=Rand2U32%map_rows; - col=Rand2U32%(map_cols/3); + row=RandU32%map_rows; + col=RandU32%(map_cols/3); if (j) col+=2*map_cols/3; } while (FindUnit(row,col)); @@ -1352,11 +1351,11 @@ U0 PickAI(U8 *dirname,I64 player) U8 *st; CDirEntry *tempde,*tempde1,*tempde2; CDoc *doc=DocNew; - Bool *old_silent=Silent(ON); + Bool *old_silent=Silent; st=MStrPrint("%s/*.CPP*",dirname); tempde=FilesFind(st); Free(st); - tempde2=FilesFind("HOME/ToTheFront/*.CPP*"); + tempde2=FilesFind("::/Home/ToTheFront/*.CPP*"); tempde1=tempde; Silent(old_silent); @@ -1380,7 +1379,7 @@ U0 PickAI(U8 *dirname,I64 player) Free(st); tempde1=tempde1->next; } - DocPrint(doc,"\n\n\n$$FG$$Create your own AI in HOME/ToTheFront."); + DocPrint(doc,"\n\n\n$$FG$$Create your own AI in /Home/ToTheFront."); while ((tempde1=PopUpMenu(doc))<=0); ExeFile(tempde1->full_name); DocDel(doc); @@ -1456,8 +1455,8 @@ U0 DrawIt(CTask *task,CDC *dc) h=task->horz_scroll.pos; v=task->vert_scroll.pos; - map->flags|=DCF_NO_TRANSPARENTS; - GrBlot(dc,-h,-v,map); + map_dc->flags|=DCF_NO_TRANSPARENTS; + GrBlot(dc,-h,-v,map_dc); i=ip.pos.x-task->pix_left-task->scroll_x; j=ip.pos.y-task->pix_top -task->scroll_y; @@ -1631,9 +1630,10 @@ I64 DoPhase() U0 ToTheFront() { I64 result,ch; - map=DCNew(MAP_WIDTH,MAP_HEIGHT); + map_dc=DCNew(MAP_WIDTH,MAP_HEIGHT); SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ + Cd(__DIR__); Fs->win_inhibit|=WIF_SELF_IP_L|WIF_SELF_IP_R|WIG_DBL_CLICK; MenuPush( @@ -1654,12 +1654,12 @@ U0 ToTheFront() ); WinMax; - WordStat; + AutoComplete; WinBorder(ON); Preempt(OFF); Init; - PickAI("/Apps/ToTheFront/AIs",0); - PickAI("/Apps/ToTheFront/AIs",1); + PickAI("AIs",0); + PickAI("AIs",1); PopUpOk("Left-click to move or fire units.\n" "$$GREEN$$$$FG$$ or right-click to end phase.\n" @@ -1706,8 +1706,9 @@ U0 ToTheFront() SettingsPop; MenuPop; - DCDel(map); + DCDel(map_dc); CleanUp; + Seed; } L ÿÿÿÿüÿÿÿ úÿÿÿ üÿÿÿúÿÿÿþÿÿÿ øÿÿÿ üÿÿÿüÿÿÿ diff --git a/Apps/Vocabulary/Load.CPP b/Apps/Vocabulary/Load.CPP index 815b6df..1149075 100644 --- a/Apps/Vocabulary/Load.CPP +++ b/Apps/Vocabulary/Load.CPP @@ -1,5 +1,6 @@ #help_index "Games" -#include "/Apps/Vocabulary/VocabQuiz" +Cd(__DIR__);; +#include "VocabQuiz" #help_index "" diff --git a/Apps/Vocabulary/Run.CPP b/Apps/Vocabulary/Run.CPP index 1db68d9..509b9cf 100644 --- a/Apps/Vocabulary/Run.CPP +++ b/Apps/Vocabulary/Run.CPP @@ -1,2 +1,3 @@ -#include "/Apps/Vocabulary/Load" +Cd(__DIR__);; +#include "Load" VocabQuiz; \ No newline at end of file diff --git a/Apps/Vocabulary/VocabQuiz.CPP b/Apps/Vocabulary/VocabQuiz.CPP index ce251e2..681bf3b 100644 --- a/Apps/Vocabulary/VocabQuiz.CPP +++ b/Apps/Vocabulary/VocabQuiz.CPP @@ -2,13 +2,13 @@ U8 *RandVocabWord() { I64 i; U8 *ptr; - if (!wsd.num_words) + if (!acd.num_words) return NULL; - i=RandU32%wsd.num_words; - ptr=wsd.word_lst; - while (i-- && *ptr==WSD_WORD_CHAR) + i=RandU32%acd.num_words; + ptr=acd.word_lst; + while (i-- && *ptr==ACD_WORD_CHAR) ptr+=StrLen(ptr)+3; - if (*ptr++!=WSD_WORD_CHAR) + if (*ptr++!=ACD_WORD_CHAR) return NULL; else return ptr; @@ -18,7 +18,7 @@ U0 VocabQuiz() { I64 ch,i,num; U8 *right_word,*words[4]; - if (!FileFind(WSD_DEF_FILENAME)) { + if (!FileFind(ACD_DEF_FILENAME)) { "Uncompressed dictionary not present.\n"; return; } @@ -32,7 +32,7 @@ U0 VocabQuiz() "$$WW,1$$$$CM-LE,5$$$$RED$$$$BK,1$$%s$$BK,0$$:$$FG$$$$LM,4$$\n",right_word; for (i=0;i<4;i++) "\n\n$$GREEN$$$$BT-X,\"%d\",LM=\"%d\"$$$$FG$$" - "$$LM,7$$%s\n$$LM,4$$",i+1,i+1,WSDDefGet(words[i]); + "$$LM,7$$%s\n$$LM,4$$",i+1,i+1,ACDDefGet(words[i]); "\n\n$$LTBLUE$$Answer:$$FG$$"; do { ch=GetKey(,TRUE); @@ -48,7 +48,7 @@ U0 VocabQuiz() } Sleep(500); Snd(0); - WSDPopUpDef(right_word); + ACDPopUpDef(right_word); break; } } while (ch!=CH_SHIFT_ESC && ch!=CH_ESC); diff --git a/Apps/X-Caliber/Load.CPP b/Apps/X-Caliber/Load.CPP index d797ce4..8377903 100644 --- a/Apps/X-Caliber/Load.CPP +++ b/Apps/X-Caliber/Load.CPP @@ -1,7 +1,6 @@ #help_index "Games" -Cd("/Apps/X-Caliber");; - +Cd(__DIR__);; #include "XCCtrls" #include "X-Caliber" diff --git a/Apps/X-Caliber/Run.CPP b/Apps/X-Caliber/Run.CPP index 76eeb3d..1f963fd 100644 --- a/Apps/X-Caliber/Run.CPP +++ b/Apps/X-Caliber/Run.CPP @@ -1,2 +1,3 @@ -#include "/Apps/X-Caliber/Load" +Cd(__DIR__);; +#include "Load" XCaliber; \ No newline at end of file diff --git a/Apps/X-Caliber/X-Caliber.CPP b/Apps/X-Caliber/X-Caliber.CPP index 23417c9..39a37d2 100644 --- a/Apps/X-Caliber/X-Caliber.CPP +++ b/Apps/X-Caliber/X-Caliber.CPP @@ -1008,7 +1008,7 @@ U0 XCaliber() "}" ); WinMax; - WordStat; + AutoComplete; WinBorder(ON); Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER-WIF_FOCUS_TASK_MENU-WIF_SELF_CTRLS; DocCursor; @@ -1136,7 +1136,7 @@ U0 XCaliber()  ÿÿÿÿ þÿÿÿþÿÿÿ -‚ øÿÿÿýÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿ +‚øÿÿÿýÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿ @@ -1146,7 +1146,7 @@ U0 XCaliber()  ÿÿÿÿÿÿÿÿÿÿ - ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ‚ øÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ + ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ‚øÿÿÿýÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ ýÿÿÿüÿÿÿýÿÿÿ þÿÿÿÿÿÿÿüÿÿÿ þÿÿÿýÿÿÿ diff --git a/Compiler/Assembler.CPP b/Compiler/Asm.CPP similarity index 92% rename from Compiler/Assembler.CPP rename to Compiler/Asm.CPP index d3b3aa3..68bd64c 100644 --- a/Compiler/Assembler.CPP +++ b/Compiler/Asm.CPP @@ -224,7 +224,7 @@ U0 AsmResolve(CLex *lx,CAsmUnresolvedRef *tempu,U8 *label,Bool undefined) } templu=templu->next; //Technically, more than one won't work. } - } else if (!(tempu->type & 1)) {//Rel? + } else if (!(tempu->type&1)) {//Rel? r-=tempu->rel_ip; if (tempu->type==EIT_REL_I8 && !(MIN_I8<=r<=MAX_I8) || tempu->type==EIT_REL_I16 && !(MIN_I16<=r<=MAX_I16)) { @@ -286,7 +286,7 @@ U0 AsmGlblsResolve(CLex *lx,CExe *tempx) CAOTCtrl *a=lx->a; CHashFun *tempf; CAsmUnresolvedRef *tempu=a->glbl_unresolved,*tempu1; - I64 j; + I64 i,j; CExeImportExport *tempe,*tempe1; CLexUndef *templu; CHashExport *tempex; @@ -317,12 +317,12 @@ U0 AsmGlblsResolve(CLex *lx,CExe *tempx) tempex->use_cnt++; } else { PrintErr("undefined sym at line:%04d %s\n", - tempu->line_num,tempex->str); + tempu->line_num,tempex->str); LexExcept(lx); } } else if (undefined) { PrintErr("Two imports in same expression not allowed at line:%04d %s\n", - tempu->line_num,tempex->str); + tempu->line_num,tempex->str); LexExcept(lx); } undefined=TRUE; @@ -338,56 +338,58 @@ U0 AsmGlblsResolve(CLex *lx,CExe *tempx) tempu=tempu1; } - tempex=lx->htc.glbl_hash_table->next_added; - while (tempex!=lx->htc.glbl_hash_table) { - if (tempex->type & (HTF_IMPORT|HTF_GOTO_LABEL)) { - if (tempex->use_cnt && (tempe=tempex->ie_lst)) { - if (tempex->type&HTF_GOTO_LABEL) - tempe->flags|=EIF_GOTO_LABEL; - if (tempex->import_name) - tempe->str=StrNew(tempex->import_name); - else + for (i=0;i<=lx->htc.glbl_hash_table->mask;i++) { + tempex=lx->htc.glbl_hash_table->body[i]; + while (tempex) { + if (tempex->type & (HTF_IMPORT|HTF_GOTO_LABEL)) { + if (tempex->use_cnt && (tempe=tempex->ie_lst)) { + if (tempex->type&HTF_GOTO_LABEL) + tempe->flags|=EIF_GOTO_LABEL; + if (tempex->import_name) + tempe->str=StrNew(tempex->import_name); + else + tempe->str=StrNew(tempex->str); + do { + tempe1=tempe->next; + QueIns(tempe,tempx->last_ie); + } while (tempe=tempe1); + tempex->ie_lst=NULL; + } + } else if (tempex->type & (HTF_EXPORT|HTF_RESOLVE)) { + if (tempex->type & HTF_UNRESOLVED) { + PrintErr("undefined sym at %s\n",tempex->str); + LexExcept(lx); + } + if (tempex->type & HTF_RESOLVE) { + tempf=tempex; + tempeu=tempf->ext_lst; + while (tempeu) { + tempeu8=tempeu->next; + j=tempf->executable_addr-(tempeu->ip+4); + AsmStoreCodeU8At(lx,tempeu->ip,j.u8[0],j.u8[1],j.u8[2],j.u8[3]); + Free(tempeu); + tempeu=tempeu8; + } + } + if (tempex->type & HTF_EXPORT) { + tempe=CAlloc(sizeof(CExeImportExport)); + tempe->type=EIT_REL32_EXPORT; + if (tempex->type & HTT_FUN) + tempe->ip=tempf->executable_addr; + else if (tempex->type & HTT_GLBL_VAR) + tempe->ip=tempex(CHashGlblVar *)->data_addr_ip; + else + tempe->ip=tempex->val; + tempe->exe=lx->exe; + if (tempex->type & HTF_IMM) + tempe->type++; tempe->str=StrNew(tempex->str); - do { - tempe1=tempe->next; + tempe->src_link=StrNew(tempex->src_link); QueIns(tempe,tempx->last_ie); - } while (tempe=tempe1); - tempex->ie_lst=NULL; - } - } else if (tempex->type & (HTF_EXPORT|HTF_RESOLVE)) { - if (tempex->type & HTF_UNRESOLVED) { - PrintErr("undefined sym at %s\n",tempex->str); - LexExcept(lx); - } - if (tempex->type & HTF_RESOLVE) { - tempf=tempex; - tempeu=tempf->ext_lst; - while (tempeu) { - tempeu8=tempeu->next; - j=tempf->executable_addr-(tempeu->ip+4); - AsmStoreCodeU8At(lx,tempeu->ip,j.u8[0],j.u8[1],j.u8[2],j.u8[3]); - Free(tempeu); - tempeu=tempeu8; } } - if (tempex->type & HTF_EXPORT) { - tempe=CAlloc(sizeof(CExeImportExport)); - tempe->type=EIT_REL32_EXPORT; - if (tempex->type & HTT_FUN) - tempe->ip=tempf->executable_addr; - else if (tempex->type & HTT_GLBL_VAR) - tempe->ip=tempex(CHashGlblVar *)->data_addr_ip; - else - tempe->ip=tempex->val; - tempe->exe=lx->exe; - if (tempex->type & HTF_IMM) - tempe->type++; - tempe->str=StrNew(tempex->str); - tempe->src_link=StrNew(tempex->src_link); - QueIns(tempe,tempx->last_ie); - } + tempex=tempex->next; } - tempex=tempex->next_added; } } @@ -425,7 +427,7 @@ Bool PrsAsmImm(CLex *lx,CAsmArg *arg) return TRUE; } -U0 PrsAsmArg(CLex *lx,CAsmArg *arg) +U0 PrsAsmArg(CLex *lx,CAsmArg *arg,Bool rel) { CHashGeneric *temph,*temph1; CHashReg *tempr; @@ -499,16 +501,19 @@ U0 PrsAsmArg(CLex *lx,CAsmArg *arg) LexExcept(lx,"syntax error at "); } Lex(lx); //skip keyword - } else { - PrsAsmImm(lx,arg); - arg->num.abs_cnts=lx->abs_cnts; - if (lx->token!='[') - return; - } + } else + goto pa_asm_direct_imm; } } else { +pa_asm_direct_imm: PrsAsmImm(lx,arg); arg->num.abs_cnts=lx->abs_cnts; + if (arg->size<=1 && !rel && arg->num.abs_cnts&1) { + if (lx->a->seg_size==16) + arg->size=2; + else + arg->size=4; + } if (lx->token!='[') return; } @@ -530,14 +535,10 @@ U0 PrsAsmArg(CLex *lx,CAsmArg *arg) } else arg->reg2=tempr->reg_num; Lex(lx); - } else { - PrsAsmImm(lx,arg); - arg->num.abs_cnts=lx->abs_cnts; - } - } else { - PrsAsmImm(lx,arg); - arg->num.abs_cnts=lx->abs_cnts; - } + } else + goto pa_asm_indirect_imm; + } else + goto pa_asm_indirect_imm; } else if (lx->token=='*') { Lex(lx); if (lx->token!=TK_INTEGER) @@ -549,6 +550,7 @@ U0 PrsAsmArg(CLex *lx,CAsmArg *arg) } else if (lx->token=='+') { Lex(lx); //skip '+' } else { +pa_asm_indirect_imm: PrsAsmImm(lx,arg); arg->num.abs_cnts=lx->abs_cnts; } @@ -557,12 +559,8 @@ U0 PrsAsmArg(CLex *lx,CAsmArg *arg) LexExcept(lx,"missing ']' at "); Lex(lx); //skip ] return; - } else { - PrsAsmImm(lx,arg); - arg->num.abs_cnts=lx->abs_cnts; - if (lx->token!='[') - return; - } + } else + goto pa_asm_direct_imm; } } @@ -676,7 +674,7 @@ Bool AsmStoreNum(CLex *lx,CAsmNum2 *num2,I64 cnt,Bool U8_avail) else if (!num2->imm_flag && !(MIN_I8<=num2->num.i<=MAX_I8)) LexExcept(lx,"branch out of range at "); if (num2->imm_flag) { - if (num2->num.abs_cnts.abs_addres & 1) { + if (num2->num.abs_cnts.abs_addres&1) { tempa=CAlloc(sizeof(CExeAbsAddr)); tempa->next=a->abss; a->abss=tempa; @@ -684,7 +682,7 @@ Bool AsmStoreNum(CLex *lx,CAsmNum2 *num2,I64 cnt,Bool U8_avail) tempa->type=EAT_ADD_U8; } } else { - if (num2->num.abs_cnts.c_addres & 1) { + if (num2->num.abs_cnts.c_addres&1) { tempa=CAlloc(sizeof(CExeAbsAddr)); tempa->next=a->abss; a->abss=tempa; @@ -701,7 +699,7 @@ Bool AsmStoreNum(CLex *lx,CAsmNum2 *num2,I64 cnt,Bool U8_avail) else if (!num2->imm_flag && !(MIN_I16<=num2->num.i<=MAX_I16)) LexExcept(lx,"branch out of range at "); if (num2->imm_flag) { - if (num2->num.abs_cnts.abs_addres & 1) { + if (num2->num.abs_cnts.abs_addres&1) { tempa=CAlloc(sizeof(CExeAbsAddr)); tempa->next=a->abss; a->abss=tempa; @@ -709,7 +707,7 @@ Bool AsmStoreNum(CLex *lx,CAsmNum2 *num2,I64 cnt,Bool U8_avail) tempa->type=EAT_ADD_U16; } } else { - if (num2->num.abs_cnts.c_addres & 1) { + if (num2->num.abs_cnts.c_addres&1) { tempa=CAlloc(sizeof(CExeAbsAddr)); tempa->next=a->abss; a->abss=tempa; @@ -726,7 +724,7 @@ Bool AsmStoreNum(CLex *lx,CAsmNum2 *num2,I64 cnt,Bool U8_avail) else if (!num2->imm_flag && !(MIN_I32<=num2->num.i<=MAX_I32)) LexExcept(lx,"branch out of range at "); if (num2->imm_flag) { - if (num2->num.abs_cnts.abs_addres & 1) { + if (num2->num.abs_cnts.abs_addres&1) { tempa=CAlloc(sizeof(CExeAbsAddr)); tempa->next=a->abss; a->abss=tempa; @@ -734,7 +732,7 @@ Bool AsmStoreNum(CLex *lx,CAsmNum2 *num2,I64 cnt,Bool U8_avail) tempa->type=EAT_ADD_U32; } } else { - if (num2->num.abs_cnts.c_addres & 1) { + if (num2->num.abs_cnts.c_addres&1) { tempa=CAlloc(sizeof(CExeAbsAddr)); tempa->next=a->abss; a->abss=tempa; @@ -748,7 +746,7 @@ Bool AsmStoreNum(CLex *lx,CAsmNum2 *num2,I64 cnt,Bool U8_avail) AsmUnresolvedAdd(lx,num2->num.ex,EIT_REL_I64+num2->imm_flag,a->ip,num2->rel, num2->num.undef_local,num2->num.undef_glbl,lx->cur_lfn->line_num,U8_avail); if (num2->imm_flag) { - if (num2->num.abs_cnts.abs_addres & 1) { + if (num2->num.abs_cnts.abs_addres&1) { tempa=CAlloc(sizeof(CExeAbsAddr)); tempa->next=a->abss; a->abss=tempa; @@ -756,7 +754,7 @@ Bool AsmStoreNum(CLex *lx,CAsmNum2 *num2,I64 cnt,Bool U8_avail) tempa->type=EAT_ADD_U64; } } else { - if (num2->num.abs_cnts.c_addres & 1) { + if (num2->num.abs_cnts.c_addres&1) { tempa=CAlloc(sizeof(CExeAbsAddr)); tempa->next=a->abss; a->abss=tempa; @@ -850,7 +848,7 @@ Bool PrsAsmInstruction(CLex *lx,CHashOpcode *tempo,I64 argcnt) found_second_possible=TRUE; if (!a->arg1.size) PrintWarn("no size specified at %s,%04d\n", - lx->cur_lfn->name,lx->cur_lfn->line_num-1); + lx->cur_lfn->full_name,lx->cur_lfn->line_num-1); } if (tempi->flags & IEF_PLUS_OPCODE) { if (tempi->slash_val==SV_R_REG) { @@ -957,7 +955,7 @@ Bool PrsAsmInstruction(CLex *lx,CHashOpcode *tempo,I64 argcnt) found_second_possible=TRUE; if (!a->arg1.size && !a->arg2.size) PrintWarn("no size specified at %s,%04d\n", - lx->cur_lfn->name,lx->cur_lfn->line_num-1); + lx->cur_lfn->full_name,lx->cur_lfn->line_num-1); } if (tempi->flags & IEF_PLUS_OPCODE) { if (tempi->slash_val==SV_R_REG) { @@ -1119,8 +1117,11 @@ Bool PrsAsmInstruction(CLex *lx,CHashOpcode *tempo,I64 argcnt) MemCpy(&cur.imm.num,&tempa2->num,sizeof(CAsmNum)); if (a2==ARGT_IMM8 || a2==ARGT_UIMM8) cur.imm.U8_cnt=1; else if (a2==ARGT_IMM16 || a2==ARGT_UIMM16) cur.imm.U8_cnt=2; - else if (a2==ARGT_IMM32 || a2==ARGT_UIMM32) cur.imm.U8_cnt=4; - else { + else if (a2==ARGT_IMM32 || a2==ARGT_UIMM32) { + cur.imm.U8_cnt=4; + if (tempi->flags&IEF_REX_ONLY_R8_R15 && a2==ARGT_UIMM32) + cur.REX&=~8; + } else { cur.imm.U8_cnt=8; cur.REX|=8; } @@ -1384,14 +1385,20 @@ U0 PrsAsmBlk(CLex *lx,I64 cmp_flags) argcnt=0; if (tempo->ins[0].arg1) { argcnt++; - PrsAsmArg(lx,&a->arg1); + if (ARGT_REL8<=tempo->ins[0].arg1<=ARGT_REL32) + PrsAsmArg(lx,&a->arg1,TRUE); + else + PrsAsmArg(lx,&a->arg1,FALSE); if (tempo->ins[0].arg2) { argcnt++; if (lx->token!=',') LexExcept(lx,"expecting ',' at "); else { Lex(lx); //skip ',' - PrsAsmArg(lx,&a->arg2); + if (ARGT_REL8<=tempo->ins[0].arg2<=ARGT_REL32) + PrsAsmArg(lx,&a->arg2,TRUE); + else + PrsAsmArg(lx,&a->arg2,FALSE); } } } @@ -1413,7 +1420,7 @@ U0 PrsAsmBlk(CLex *lx,I64 cmp_flags) LexExcept(lx,"expecting ':' at "); if (lx->token==TK_DBL_COLON) { lx->hash_entry->type|=HTF_EXPORT; - SetSrcFileInfo(lx,lx->hash_entry); + HashSrcFileSet(lx,lx->hash_entry); AsmLocalsResolve(lx); a->last_label=next_last_label; @@ -1459,7 +1466,7 @@ U0 PrsAsmBlk(CLex *lx,I64 cmp_flags) } if (lx->token==TK_DBL_COLON) { tempex->type|=HTF_EXPORT; - SetSrcFileInfo(lx,tempex); + HashSrcFileSet(lx,tempex); AsmLocalsResolve(lx); a->last_label=tempex->str; diff --git a/Compiler/Back1a.CPP b/Compiler/BackA.CPP similarity index 98% rename from Compiler/Back1a.CPP rename to Compiler/BackA.CPP index c517f00..371fb2d 100644 --- a/Compiler/Back1a.CPP +++ b/Compiler/BackA.CPP @@ -75,8 +75,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, else i=0x48; if (!d && - (op.u8[0]==0x03||op.u8[0]==0x2B|| - op.u8[0]==0x33||op.u8[0]==0x0B)) + (op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B)) return; else if (d==1 && op.u8[0]==0x03) { ICU24(tempi,0xC0FF00+op.u8[1]<<19+i+(r1&7)<<16); @@ -116,8 +115,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, } if (!d && - (op.u8[0]==0x03||op.u8[0]==0x2B|| - op.u8[0]==0x33||op.u8[0]==0x0B)) + (op.u8[0]==0x03||op.u8[0]==0x2B||op.u8[0]==0x33||op.u8[0]==0x0B)) return; r=op.u8[1]; //not a reg but a slash val if (op.u8[0]==0x03 && d==-1) //add -1 @@ -145,8 +143,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, ICModr2(tempi,i,d1,ip+4); return; } - if (MIN_I8<=d<=MAX_I8 || - t1&(RT_MASK-1)==RT_I8) { + if (MIN_I8<=d<=MAX_I8 || t1&(RT_MASK-1)==RT_I8) { i=ICModr1(r,t1,r1,d1); if (tempi->ic_flags&ICF_LOCK) ICU8(tempi,OC_LOCK_PREFIX); @@ -169,8 +166,7 @@ U0 ICAddSubEctImm(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, ICU8(tempi,d); return; } - if (MIN_I32<=d<=MAX_I32 || - t1&RT_MASKic_flags&ICF_LOCK) ICU8(tempi,OC_LOCK_PREFIX); diff --git a/Compiler/Back1b.CPP b/Compiler/BackB.CPP similarity index 98% rename from Compiler/Back1b.CPP rename to Compiler/BackB.CPP index ce1db12..9094f63 100644 --- a/Compiler/Back1b.CPP +++ b/Compiler/BackB.CPP @@ -417,7 +417,7 @@ U0 ICPreIncDec(CIntermediateCode *tempi,I64 op,I64 ip) I64 r; CHashClass *tempc=tempi->ic_class,*tempc1=tempc-1; if (tempi->ic_flags & ICF_NOT_ADDR) { - if (tempc->ptr_cnt && tempc1->size!=1) { + if (tempc->ptr_stars_cnt && tempc1->size!=1) { ICAddSubEctImm(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp, tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp, tempc1->size,op.u16[3],ip); @@ -434,7 +434,7 @@ U0 ICPreIncDec(CIntermediateCode *tempi,I64 op,I64 ip) ICMov(tempi,TY_REG+RT_I64,REG_RCX,0,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip); r=REG_RCX; } - if (tempc->ptr_cnt && + if (tempc->ptr_stars_cnt && tempc1->size!=1) { ICAddSubEctImm(tempi,TY_DISP+tempi->a1.type_pointed,r,0, TY_DISP+tempi->a1.type_pointed,r,0, @@ -457,7 +457,7 @@ U0 ICPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp,ip); } - if (tempc->ptr_cnt && + if (tempc->ptr_stars_cnt && tempc1->size!=1) { ICAddSubEctImm(tempi,tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp, tempi->a1.type&TY_MASK+tempi->a1.type_pointed,tempi->a1.reg,tempi->a1.disp, @@ -477,7 +477,7 @@ U0 ICPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, TY_DISP+tempi->a1.type_pointed,r,0,ip); } - if (tempc->ptr_cnt && + if (tempc->ptr_stars_cnt && tempc1->size!=1) { ICAddSubEctImm(tempi,TY_DISP+tempi->a1.type_pointed,r,0, TY_DISP+tempi->a1.type_pointed,r,0, @@ -577,25 +577,26 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip, U8 *buf,I64 ip2) { I64 r1,r2,i=0x48,j,t1,t2,result_reg; - Bool short_jmp,done; + Bool short_jmp,swap,done; CLexCodeMisc *lb; - CICArg *a1=&tempi->a1,*a2=&tempi->a2,*swap; + CICArg *a1=&tempi->a1,*a2=&tempi->a2; j=a1->disp; if (a1->type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) { - swap=a1; a1=a2; a2=swap; + SwapI64(&a1,&a2); + swap=TRUE; us=not_us; is=not_is; - } + } else + swap=FALSE; if (tempi->ic_class->raw_type&1 || tempi->ic_flags & ICF_USE_UNSIGNED) is=us; j=a2->disp; if (a2->type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) { if (!has_result && TY_REG<=a1->type&TY_MASK<=TY_RIP_DISP32) - ICAddSubEctImm(tempi,tempi->a1.type,tempi->a1.reg,tempi->a1.disp, - tempi->a1.type,tempi->a1.reg,tempi->a1.disp, - j,0x073B,ip2); + ICAddSubEctImm(tempi,a1->type,a1->reg,a1->disp, + a1->type,a1->reg,a1->disp,j,0x073B,ip2); else { if (a1->type&TY_MASK==TY_REG) r1=a1->reg; diff --git a/Compiler/Back1c.CPP b/Compiler/BackC.CPP similarity index 100% rename from Compiler/Back1c.CPP rename to Compiler/BackC.CPP diff --git a/Compiler/BackF1a.CPP b/Compiler/BackFA.CPP similarity index 99% rename from Compiler/BackF1a.CPP rename to Compiler/BackFA.CPP index e58fca2..bbfd2d1 100644 --- a/Compiler/BackF1a.CPP +++ b/Compiler/BackFA.CPP @@ -298,7 +298,7 @@ U0 ICFPow(CLex *lx,CIntermediateCode *tempi,U8 *buf,I64 ip) ICU64(tempi,0); if (buf) { tempe=CAlloc(sizeof(CExeImportExport)); - tempe->type=EIT_IMM_U64; + tempe->type=EIT_IMM_I64; tempe->ip=ip+tempi->ic_cnt-8; tempe->next=tempex->ie_lst; tempex->ie_lst=tempe; diff --git a/Compiler/BackF1b.CPP b/Compiler/BackFB.CPP similarity index 100% rename from Compiler/BackF1b.CPP rename to Compiler/BackFB.CPP diff --git a/Compiler/CmpExts.CPP b/Compiler/CExts.CPP similarity index 95% rename from Compiler/CmpExts.CPP rename to Compiler/CExts.CPP index d22bc17..fd3b645 100644 --- a/Compiler/CmpExts.CPP +++ b/Compiler/CExts.CPP @@ -20,7 +20,7 @@ extern U0 OptPass3(CLex *lx,COptReg *reg_offsets); extern U0 OptPass4(CLex *lx,COptReg *reg_offsets,I64 *_type); extern U0 OptPass5(CLex *lx); extern U0 OptPass6(CLex *lx); -extern I64 OptPass789(CLex *lx,COptReg *reg_offsets,U8 *buf,CDbgInfo **_dbg); +extern I64 OptPass789A(CLex *lx,COptReg *reg_offsets,U8 *buf,CDbgInfo **_dbg); extern CHashClass *PrsClass(CLex *lx,I64 keyword,I64 fsp_flags,Bool is_extern); extern CHashFun *PrsFunJoin(CLex *lx,CHashClass *temp_return,U8 *name,I64 fsp_flags); extern I64 PrsKeyWord(CLex *lx); @@ -34,6 +34,7 @@ extern I64 PrsUnaryModifier(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayD extern I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempad, I64 *max_prec,I64 *unary_pre_prec,I64 *paren_prec); extern U0 PrsVarInit2(CLex *lx,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,U8 *data_addr_ip,U8 **_base,Bool data_heap,I64 pass); +extern U0 StreamPrint(U8 *fmt,...); _extern CMP_TEMPLATES U32 cmp_templates[1]; _extern CMP_TEMPLATES_DONT_POP U32 cmp_templates_dont_pop[1]; _extern CMP_TEMPLATES_DONT_PUSH2 U32 cmp_templates_dont_push2[1]; diff --git a/Compiler/Hash1b.CPP b/Compiler/CHash.CPP similarity index 92% rename from Compiler/Hash1b.CPP rename to Compiler/CHash.CPP index 996d74f..d2ee4f8 100644 --- a/Compiler/Hash1b.CPP +++ b/Compiler/CHash.CPP @@ -56,7 +56,7 @@ I64 HashEntrySize2(CHashSrcSym *temph) if (!(temph(CHashGlblVar *)->flags&GVF_ALIAS)) result+=MSize2(temph(CHashGlblVar *)->data_addr); if (temph(CHashGlblVar *)->fun_ptr) - result+=HashEntrySize2(temph(CHashGlblVar *)->fun_ptr-temph(CHashGlblVar *)->fun_ptr->ptr_cnt); + result+=HashEntrySize2(temph(CHashGlblVar *)->fun_ptr-temph(CHashGlblVar *)->fun_ptr->ptr_stars_cnt); } } else if (temph->type & HTT_FILE) result+=MSize2(temph(CHashGeneric *)->user_data0); @@ -68,14 +68,16 @@ I64 HashEntrySize2(CHashSrcSym *temph) I64 HashTableSize2(CHashTable *table) {//Memory size of std system hash table and all entries. - I64 result=0; + I64 i,result=0; CHashSrcSym *temph; if (!table) return 0; - temph=table->next_added; - while (temph!=table) { - result+=HashEntrySize2(temph); - temph=temph->next_added; + for (i=0;i<=table->mask;i++) { + temph=table->body[i]; + while (temph) { + result+=HashEntrySize2(temph); + temph=temph->next; + } } result+=MSize2(table->body); result+=MSize2(table); diff --git a/Compiler/CmpInit.CPP b/Compiler/CInit.CPP similarity index 63% rename from Compiler/CmpInit.CPP rename to Compiler/CInit.CPP index 3d28298..808a857 100644 --- a/Compiler/CmpInit.CPP +++ b/Compiler/CInit.CPP @@ -50,14 +50,14 @@ U0 AsmPrsInsFlags(CLex *lx,CInstruction *tempi) return; break; case '!': tempi->flags|=IEF_DONT_SWITCH_MODES; break; - case '&': tempi->flags|=IEF_DFT; break; - case ':': tempi->flags|=IEF_STI; break; - case '-': tempi->flags|=IEF_NO_REX; break; - case '~': tempi->flags|=IEF_40_REX; break; - case '=': tempi->flags|=IEF_48_REX; break; + case '&': tempi->flags|=IEF_DFT; break; + case ':': tempi->flags|=IEF_STI; break; + case '-': tempi->flags|=IEF_NO_REX; break; + case '~': tempi->flags|=IEF_40_REX; break; + case '=': tempi->flags|=IEF_48_REX; break; case '`': tempi->flags|=IEF_REX_ONLY_R8_R15; break; - case '^': tempi->flags|=IEF_REX_XOR_LIKE; break; - case '$$': tempi->flags|=IEF_ENDING_ZERO; break; + case '^': tempi->flags|=IEF_REX_XOR_LIKE; break; + case '$$': tempi->flags|=IEF_ENDING_ZERO; break; default: return; } @@ -76,7 +76,7 @@ U0 AsmHashLoad() CInstruction *tempi; CHashClass *tempc; - cmp.asm_hash=HashTableNew(2048); + cmp.asm_hash=HashTableNew(1024); size1=offset(CHashOpcode.ins)+sizeof(CInstruction)<<5; tempo=MAlloc(size1); @@ -230,248 +230,13 @@ U0 CmpLoadDefines() "MM\0MM32\0MM64\0XMM\0XMM32\0XMM64\0XMM128\0XMM0\0"); DefineLstLoad("ST_SEG_REGS","ES\0CS\0SS\0DS\0FS\0GS\0"); DefineLstLoad("ST_FSTK_REGS","ST0\0ST1\0ST2\0ST3\0ST4\0ST5\0ST6\0ST7\0"); - - DefineLstLoad("ST_INTERMEDIATE_CODE", -/* -[arg_cnt][result_cnt][deref/assign/cmp][fpop][nonconst] - -'9' arg_cnt means var - -'*' means it is a dereference instruction -'=' means it is an assignment instruction -'^' means it is a compare instruction - -'N' means not const. Sets LF_NOT_CONST - which means an expression contains mem - accesses or things which might change. -*/ -"00...END\0" -"00...NOP1\0" -"10...END_EXP\0" -"00...NOP2\0" -"00...LABEL\0" -"00...CALL_START\0" -"01...CALL_END\0" -"00...CALL_END2\0" -"10...RETURN_VAL\0" -"00...RETURN_VAL2\0" -"01...IMM_U64\0" -"01...IMM_F64\0" -"01..NSTR_CONST\0" -"01..NABS_ADDR\0" -"01..NADDR_IMPORT\0" -"01..NHEAP_GLBL\0" -"01...SIZEOF\0" -"01...TYPE\0" -"01..NGET_LABEL\0" -"01..NRBP\0" -"01..NREG\0" -"00..NFS\0" -"01..NMOV_FS\0" -"00..NGS\0" -"01..NMOV_GS\0" -"01..NLEA\0" -"01..NMOV\0" -"10...TO_I64\0" -"10...TO_F64\0" -"10...TO_BOOL\0" -"10...TOUPPER\0" -"11...HOLYC_TYPECAST\0" -"11..NADDR\0" -"11...COM\0" -"11...NOT\0" -"11...UNARY_MINUS\0" -"11*.NDEREF\0" -"11*.NDEREF_PP\0" -"11*.NDEREF_MM\0" -"11*PN_PP\0" -"11*PN_MM\0" -"11*PNPP_\0" -"11*PNMM_\0" -"21...SHL\0" -"21...SHR\0" -"11=..SHL_CONST\0" -"11=..SHR_CONST\0" -"21...POWER\0" -"21.P.MUL\0" -"21.P.DIV\0" -"21...MOD\0" -"21...AND\0" -"21...OR\0" -"21...XOR\0" -"21.P.ADD\0" -"21.P.SUB\0" -"11=..ADD_CONST\0" -"11=..SUB_CONST\0" -"21^..EQUAL_EQUAL\0" -"21^..NOT_EQUAL\0" -"21^..LESS\0" -"21^..GREATER\0" -"21^..LESS_EQUAL\0" -"21^..GREATER_EQUAL\0" -"01...PUSH_CMP\0" -"21...AND_AND\0" -"21...OR_OR\0" -"21...XOR_XOR\0" -"21=.NASSIGN\0" -"21=.NASSIGN_PP\0" -"21=.NASSIGN_MM\0" -"21=.NSHL_EQUAL\0" -"21=.NSHR_EQUAL\0" -"21=.NMUL_EQUAL\0" -"21=.NDIV_EQUAL\0" -"21=.NMOD_EQUAL\0" -"21=.NAND_EQUAL\0" -"21=.NOR_EQUAL\0" -"21=.NXOR_EQUAL\0" -"21=.NADD_EQUAL\0" -"21=.NSUB_EQUAL\0" -"00...JMP\0" -"00...SUB_CALL\0" -"20...SWITCH\0" -"20...NOBOUND_SWITCH\0" -"90...ADD_RSP\0" -"90...ADD_RSP1\0" -"00...ENTER\0" -"00=..PUSH_REGS\0" -"00=..POP_REGS\0" -"00...LEAVE\0" -"00...RET\0" -"00..NCALL\0" -"00..NCALL_INDIRECT\0" -"00..NCALL_INDIRECT2\0" -"00..NCALL_IMPORT\0" -"00..NCALL_EXTERN\0" -"00..NASM\0" -"10..NPREEMPT\0" -"10..NPUSH\0" -"00..NPOP\0" -"10..NCLFLUSH\0" -"10..NINVLPG\0" -"10..NIN_U8\0" -"10..NIN_U16\0" -"10..NIN_U32\0" -"20..NOUT_U8\0" -"20..NOUT_U16\0" -"20..NOUT_U32\0" -"00..NGET_RFLAGS\0" -"00..NCARRY\0" -"10..NSET_RFLAGS\0" -"00..NGET_RAX\0" -"10..NSET_RAX\0" -"00..NGET_RBP\0" -"10..NSET_RBP\0" -"00..NGET_RSP\0" -"10..NSET_RSP\0" -"01..NRIP\0" -"00..NRDTSC\0" -"00..NHPET\0" -"20..NBT\0" -"20..NBTS\0" -"20..NBTR\0" -"20..NBTC\0" -"20..NLBTS\0" -"20..NLBTR\0" -"20..NLBTC\0" -"10..NBSF\0" -"10..NBSR\0" -"10..NQUE_INIT\0" -"20..NQUE_INS\0" -"20..NQUE_INS_REV\0" -"10..NQUE_REM\0" -"10..NSTRLEN\0" -"10...BR_ZERO\0" -"10...BR_NOT_ZERO\0" -"00...BR_CARRY\0" -"00...BR_NOT_CARRY\0" -"20...BR_NOT_EQUAL\0" -"20...BR_EQUAL_EQUAL\0" -"20...BR_GREATER_EQUAL\0" -"20...BR_LESS_EQUAL\0" -"20...BR_GREATER\0" -"20...BR_LESS\0" -"21...BR_2NOT_EQUAL\0" -"21...BR_2EQUAL_EQUAL\0" -"21...BR_2GREATER_EQUAL\0" -"21...BR_2LESS_EQUAL\0" -"21...BR_2GREATER\0" -"21...BR_2LESS\0" -"20...BR_AND_ZERO\0" -"20...BR_AND_NOT_ZERO\0" -"10..NBR_MM_ZERO\0" -"10..NBR_MM_NOT_ZERO\0" -"20...BR_AND_AND_ZERO\0" -"20...BR_AND_AND_NOT_ZERO\0" -"20...BR_OR_OR_ZERO\0" -"20...BR_OR_OR_NOT_ZERO\0" -"20..NBR_BT\0" -"20..NBR_BTS\0" -"20..NBR_BTR\0" -"20..NBR_BTC\0" -"20..NBR_LBTS\0" -"20..NBR_LBTR\0" -"20..NBR_LBTC\0" -"20..NBR_NOT_BT\0" -"20..NBR_NOT_BTS\0" -"20..NBR_NOT_BTR\0" -"20..NBR_NOT_BTC\0" -"20..NBR_NOT_LBTS\0" -"20..NBR_NOT_LBTR\0" -"20..NBR_NOT_LBTC\0" -"20..NSWAP_U8\0" -"20..NSWAP_U16\0" -"20..NSWAP_U32\0" -"20..NSWAP_U64\0" -"10...ABS_I64\0" -"10...SIGN_I64\0" -"20...MIN_I64\0" -"20...MIN_U64\0" -"20...MAX_I64\0" -"20...MAX_U64\0" -"20...MOD_U64\0" -"10...SQRI64\0" -"10...SQRU64\0" -"11.P.SQR\0" -"11.P.ABS\0" -"11.P.SQRT\0" -"11.P.SIN\0" -"11.P.COS\0" -"11.P.TAN\0" -"11.P.ATAN\0" -);$AN,"Anchor for adding intermediate codes",A="IC_INIT_TABLE"$ } U0 CmpFillTables() { - U8 *st; I64 i,k; U32 *d; - cmp.ic_bitmap_assign =CAlloc((IC_NUM_ENTRIES+7)>>3); - cmp.ic_bitmap_deref =CAlloc((IC_NUM_ENTRIES+7)>>3); - cmp.ic_bitmap_cmp =CAlloc((IC_NUM_ENTRIES+7)>>3); - cmp.ic_bitmap_not_const=CAlloc((IC_NUM_ENTRIES+7)>>3); - cmp.ic_bitmap_fpop =CAlloc((IC_NUM_ENTRIES+7)>>3); - cmp.arg_cnt =CAlloc(IC_NUM_ENTRIES); - cmp.result_cnt =CAlloc(IC_NUM_ENTRIES); - st=Define("ST_INTERMEDIATE_CODE"); - for (i=0;i'] =PREC_CMP<<16+IC_GREATER; @@ -589,11 +354,11 @@ STK[0]: d[TK_AND_AND] =PREC_AND_AND<<16+IC_AND_AND; - d[TK_XOR_XOR]=PREC_XOR_XOR<<16+IC_XOR_XOR; + d[TK_XOR_XOR] =PREC_XOR_XOR<<16+IC_XOR_XOR; d[TK_OR_OR] =PREC_OR_OR<<16+IC_OR_OR; - d['='] =(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_ASSIGN; + d['='] =(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_ASSIGN; d[TK_SHL_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SHL_EQUAL; d[TK_SHR_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SHR_EQUAL; d[TK_MUL_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_MUL_EQUAL; diff --git a/Compiler/CmpMain.CPP b/Compiler/CMain.CPP similarity index 94% rename from Compiler/CmpMain.CPP rename to Compiler/CMain.CPP index 4db5886..cfcec75 100644 --- a/Compiler/CmpMain.CPP +++ b/Compiler/CMain.CPP @@ -23,7 +23,8 @@ U8 *LexStatement2Bin(CLex *lx,I64 *_type,I64 cmp_flags=0) LCCInit(lx); if (!PrsStatement(lx,,,cmp_flags)) { if (lx->lcc.lcc_root.next!=&lx->lcc.lcc_root) { - LCCAdd(lx,IC_RETURN_VAL2,0,NULL); + lx->lcc.lcc_root.last->ic_flags&=~ICF_NO_DEPEND_RESULT; + LCCAdd(lx,IC_RETURN_VAL2,0,0); LCCAdd(lx,IC_RET,0,0); if (result=LCCCompile(lx,&size,NULL,_type)) { if (lx->flags&LF_AOT_COMPILE) { @@ -74,7 +75,7 @@ CExe *CmpJoin(CLex *lx,I64 cmp_flags,U8 *map_name=NULL,U8 mapfile_drv=0) if (lx->htc.fun) lx->htc.glbl_hash_table=HashTableNew(128); else - lx->htc.glbl_hash_table=HashTableNew(2048); + lx->htc.glbl_hash_table=HashTableNew(1024); if (lx->flags&LF_AOT_COMPILE) { lx->htc.define_hash_table=lx->htc.glbl_hash_table; if (lx->a_depth<=1) @@ -235,7 +236,7 @@ U0 CmpFixUpJITAsm(CLex *lx,CExe *tempx) HashAdd(tempex,Fs->hash_table); SysSymImportsResolve(tempex->str); break; - case EIT_REL_I0...EIT_IMM_U64: + case EIT_REL_I0...EIT_IMM_I64: if (tempe->str) { if (tempe->flags&EIF_GOTO_LABEL) { if(!(g_lb=LCCGoToLabelFind(lx,str))) @@ -293,7 +294,7 @@ U0 CmpFixUpJITAsm(CLex *lx,CExe *tempx) case EIT_REL_I64: *ptr(I64 *)=i-ptr-8; break; - case EIT_IMM_U64: + case EIT_IMM_I64: *ptr(I64 *)=i; break; } @@ -326,30 +327,14 @@ U0 CmpFixUpAOTAsm(CLex *lx,CExe *tempx) tempa->next=a->abss; ptr=tempx->buf+tempx->ip+tempa->ip; nobound_switch (tempa->type) { - case EAT_ADD_U8: - *ptr(U8 *)+=ip2; - break; - case EAT_SUB_U8: - *ptr(U8 *)-=ip2; - break; - case EAT_ADD_U16: - *ptr(U16 *)+=ip2; - break; - case EAT_SUB_U16: - *ptr(U16 *)-=ip2; - break; - case EAT_ADD_U32: - *ptr(U32 *)+=ip2; - break; - case EAT_SUB_U32: - *ptr(U32 *)-=ip2; - break; - case EAT_ADD_U64: - *ptr(I64 *)+=ip2; - break; - case EAT_SUB_U64: - *ptr(I64 *)-=ip2; - break; + case EAT_ADD_U8: *ptr(U8 *)+=ip2; break; + case EAT_SUB_U8: *ptr(U8 *)-=ip2; break; + case EAT_ADD_U16: *ptr(U16 *)+=ip2; break; + case EAT_SUB_U16: *ptr(U16 *)-=ip2; break; + case EAT_ADD_U32: *ptr(U32 *)+=ip2; break; + case EAT_SUB_U32: *ptr(U32 *)-=ip2; break; + case EAT_ADD_U64: *ptr(I64 *)+=ip2; break; + case EAT_SUB_U64: *ptr(I64 *)-=ip2; break; } a->abss=tempa; tempa->ip+=ip2; @@ -360,7 +345,7 @@ U0 CmpFixUpAOTAsm(CLex *lx,CExe *tempx) while (tempe!=&tempx->next_ie) { tempe1=tempe->next; QueRem(tempe); - if (EIT_REL_I0<=tempe->type<=EIT_IMM_U64) { + if (EIT_REL_I0<=tempe->type<=EIT_IMM_I64) { if (tempe->str) { if (tempe->flags&EIF_GOTO_LABEL) { if(!(g_lb=LCCGoToLabelFind(lx,tempe->str))) @@ -409,7 +394,7 @@ U0 CmpFixUpAOTAsm(CLex *lx,CExe *tempx) case EIT_REL_I64: *ptr(I64 *)=i-ptr-8; break; - case EIT_IMM_U64: + case EIT_IMM_I64: *ptr(I64 *)=i; break; } @@ -426,21 +411,13 @@ U0 CmpFixUpAOTAsm(CLex *lx,CExe *tempx) case EIT_IMM_U8: case EIT_IMM_U16: case EIT_IMM_U32: - case EIT_IMM_U64: + case EIT_IMM_I64: case EIT_REL_I0: break; - case EIT_REL_I8: - *ptr(U8 *) -=ip2; - break; - case EIT_REL_I16: - *ptr(U16 *)-=ip2; - break; - case EIT_REL_I32: - *ptr(U32 *)-=ip2; - break; - case EIT_REL_I64: - *ptr(I64 *)-=ip2; - break; + case EIT_REL_I8: *ptr(U8 *) -=ip2; break; + case EIT_REL_I16: *ptr(U16 *)-=ip2; break; + case EIT_REL_I32: *ptr(U32 *)-=ip2; break; + case EIT_REL_I64: *ptr(I64 *)-=ip2; break; sub_switch_end: tempe->ip+=ip2; break; @@ -715,11 +692,9 @@ I64 StreamExePrint(U8 *fmt,...) return result; } -U0 CmpInit() +U0 CInit() { cmp.compiled_lines=0; - cmp.compiled_funs=0; - cmp.compiled_bytes=0; cmp.dont_write_to_dsk=FALSE; CmpLoadDefines; CmpFillTables; @@ -733,4 +708,4 @@ U0 CmpInit() UasmHashLoad; } -CmpInit; +CInit; diff --git a/Compiler/CMisc.CPP b/Compiler/CMisc.CPP new file mode 100644 index 0000000..773faae --- /dev/null +++ b/Compiler/CMisc.CPP @@ -0,0 +1,622 @@ +Bool OptEqu(I64 num,Bool val) +{//Set compiler option to value. + return BEqu(&Fs->last_lex->opts,num,val); +} + +Bool OptOn(I64 num) +{//Turn on compiler option. + return OptEqu(num,ON); +} + +Bool OptOff(I64 num) +{//Turn off compiler option. + return OptEqu(num,OFF); +} + +Bool GetOpt(I64 num) +{//Get state of compiler option. + return Bt(&Fs->last_lex->opts,num); +} + +Bool OTrace(Bool val) +{//Displays intermediate code after passes through optimization. + return OptEqu(OPTf_OPT_TRACE,val); +} + +I64 OTraceMask(I64 i=0b10001111101) +{//Ctrls which optimizer passes are displayed. + I64 old=Fs->last_lex->otrace_mask; + Fs->last_lex->otrace_mask=i; + return old; +} + +Bool CTrace(Bool val) +{//Displays assembly code output from compiler. + return OptEqu(OPTf_COMPILE_TRACE,val); +} + +Bool Echo(Bool val) +{//Displays text as it is being compiled. + return OptEqu(OPTf_ECHO,val); +} + +U0 StreamDir() +{ + U8 *dirname; + if (dirname=DirFile(Fs->last_lex->cur_lfn->full_name)) { + StreamPrint("\"%s\"",dirname); + Free(dirname); + } +} + +CIntermediateStruct intermediate_code_table[IC_NUM_ENTRIES]= +{ +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"END"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOP1"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"END_EXP"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOP2"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"LABEL"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"CALL_START"}, +{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"CALL_END"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"CALL_END2"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RETURN_VAL"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RETURN_VAL2"}, +{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"IMM_I64"}, +{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"IMM_F64"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"STR_CONST"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ABS_ADDR"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ADDR_IMPORT"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"HEAP_GLBL"}, +{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SIZEOF"}, +{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"TYPE"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"GET_LABEL"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"RBP"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"REG"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"FS"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV_FS"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GS"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV_GS"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"LEA"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"MOV"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_I64"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_F64"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TO_BOOL"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"TOUPPER"}, +{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"HOLYC_TYPECAST"}, +{IS_1_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"ADDR"}, +{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"COM"}, +{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"NOT"}, +{IS_1_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"UNARY_MINUS"}, +{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF"}, +{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF_PP"}, +{IS_1_ARG,1,IST_DEREF,FALSE,TRUE,0,0,0,"DEREF_MM"}, +{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"_PP"}, +{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"_MM"}, +{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"PP_"}, +{IS_1_ARG,1,IST_DEREF,TRUE,TRUE,0,0,0,"MM_"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SHL"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"SHR"}, +{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SHL_CONST"}, +{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SHR_CONST"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"POWER"}, +{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"MUL"}, +{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"DIV"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"MOD"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"AND"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"OR"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"XOR"}, +{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ADD"}, +{IS_2_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SUB"}, +{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"ADD_CONST"}, +{IS_1_ARG,1,IST_ASSIGN,FALSE,FALSE,0,0,0,"SUB_CONST"}, +{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"EQUAL_EQUAL"}, +{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"NOT_EQUAL"}, +{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"LESS"}, +{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"GREATER_EQUAL"}, +{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"GREATER"}, +{IS_2_ARG,1,IST_CMP,FALSE,FALSE,0,0,0,"LESS_EQUAL"}, +{IS_0_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"PUSH_CMP"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"AND_AND"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"OR_OR"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"XOR_XOR"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN_PP"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ASSIGN_MM"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SHL_EQUAL"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SHR_EQUAL"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"MUL_EQUAL"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"DIV_EQUAL"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"MOD_EQUAL"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"AND_EQUAL"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"OR_EQUAL"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"XOR_EQUAL"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"ADD_EQUAL"}, +{IS_2_ARG,1,IST_ASSIGN,FALSE,TRUE,0,0,0,"SUB_EQUAL"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"JMP"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SUB_CALL"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SWITCH"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"NOBOUND_SWITCH"}, +{IS_V_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ADD_RSP"}, +{IS_V_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ADD_RSP1"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ENTER"}, +{IS_0_ARG,0,IST_ASSIGN,FALSE,FALSE,0,0,0,"PUSH_REGS"}, +{IS_0_ARG,0,IST_ASSIGN,FALSE,FALSE,0,0,0,"POP_REGS"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"LEAVE"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"RET"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_INDIRECT"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_INDIRECT2"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_IMPORT"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CALL_EXTERN"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"ASM"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"PREEMPT"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"PUSH"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"POP"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CLFLUSH"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"INVLPG"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U8"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U16"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"IN_U32"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U8"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U16"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"OUT_U32"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RFLAGS"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"CARRY"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RFLAGS"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RAX"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RAX"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RBP"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RBP"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"GET_RSP"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SET_RSP"}, +{IS_0_ARG,1,IST_NULL,FALSE,TRUE,0,0,0,"RIP"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"RDTSC"}, +{IS_0_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"HPET"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BT"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTS"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTR"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BTC"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTS"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTR"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"LBTC"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BSF"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BSR"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INIT"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INS"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_INS_REV"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"QUE_REM"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"STRLEN"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_ZERO"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_ZERO"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_CARRY"}, +{IS_0_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_CARRY"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_EQUAL_EQUAL"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_NOT_EQUAL"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_LESS"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_GREATER_EQUAL"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_GREATER"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_LESS_EQUAL"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2EQUAL_EQUAL"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2NOT_EQUAL"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2LESS"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2GREATER_EQUAL"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2GREATER"}, +{IS_2_ARG,1,IST_NULL,FALSE,FALSE,0,0,0,"BR_2LESS_EQUAL"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_ZERO"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_NOT_ZERO"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_MM_ZERO"}, +{IS_1_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_MM_NOT_ZERO"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_AND_ZERO"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_AND_AND_NOT_ZERO"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_OR_OR_ZERO"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"BR_OR_OR_NOT_ZERO"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BT"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTS"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTR"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_BTC"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BT"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTS"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTR"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"BR_NOT_BTC"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U8"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U16"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U32"}, +{IS_2_ARG,0,IST_NULL,FALSE,TRUE,0,0,0,"SWAP_U64"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"ABS_I64"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SIGN_I64"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MIN_I64"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MIN_U64"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MAX_I64"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MAX_U64"}, +{IS_2_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"MOD_U64"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SQRI64"}, +{IS_1_ARG,0,IST_NULL,FALSE,FALSE,0,0,0,"SQRU64"}, +{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SQR"}, +{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ABS"}, +{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SQRT"}, +{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"SIN"}, +{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"COS"}, +{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"TAN"}, +{IS_1_ARG,1,IST_NULL,TRUE,FALSE,0,0,0,"ATAN"}, +}; + +U0 ICClassPut(CHashClass *c) +{ + I64 i; + if (!c) return; + if (c->ptr_stars_cnt>4) { + PrintErr("put_class ptrcnt=%d\n",c->ptr_stars_cnt); + while (TRUE) +//TODO: + Yield; + } + for (i=0;iptr_stars_cnt;i++) + '*'; + c-=c->ptr_stars_cnt; + if (c->str) + "%s",c->str; + else { + PrintErr("put_class str=NULL\n"); + while (TRUE) +//TODO: + Yield; + } + '' CH_SPACE; +} + +U0 ICArgPut(CICArg *a) +{ + if (a->type_pointed) + "%Z %Z %Z ", + a->type&RT_MASK,"ST_RAW_TYPES", + a->type_pointed&RT_MASK,"ST_RAW_TYPES", + a->type>>4,"ST_TY_TYPES"; + else + "%Z %Z ", + a->type&RT_MASK,"ST_RAW_TYPES", + a->type>>4,"ST_TY_TYPES"; + switch (a->type>>4) { + case TY_STK>>4: + "STK"; + break; + case TY_IMM>>4: + "#%X",a->disp; + break; + case TY_REG>>4: + "%Z",a->reg,"ST_U64_REGS"; + break; + case TY_DISP>>4: + "%X[%Z]",a->disp,a->reg,"ST_U64_REGS"; + break; + case TY_RIP_DISP32>>4: + "[%X]",a->disp; + break; + case TY_SIB>>4: + if (a->disp) + "%X",a->disp; + if (a->reg==REG_RIP) + '['; + else + "[%Z+",a->reg&15,"ST_U64_REGS"; + "%Z",a->reg>>8&15,"ST_U64_REGS"; + switch (a->reg>>14) { + case 0: "]"; break; + case 1: "*2]"; break; + case 2: "*4]"; break; + case 3: "*8]"; break; + } + break; + } +} + +U0 ICPut(CLex *lx,CIntermediateCode *tempi) +{ + I64 opcode=tempi->ic_code,i; + if (opcode>=IC_END_EXP && opcode!=IC_NOP2) { + "%15ts %016X ",intermediate_code_table[opcode].name,tempi->ic_data; + if (lx->pass) { + if (tempi->r.type&TY_MASK) { + ICArgPut(&tempi->r); + "<-"; + } + if (tempi->a1.type&TY_MASK) + ICArgPut(&tempi->a1); + ','; + if (tempi->a2.type&TY_MASK) + ICArgPut(&tempi->a2); + '' CH_SPACE; + } + ICClassPut(tempi->ic_class); + if (tempi->ic_flags & ICF_LOCK) + "$$BROWN$$lock$$FG$$ "; + if (tempi->ic_flags & ICF_A2_TO_F64) + "$$LTBLUE$$a2d$$FG$$ "; + if (tempi->ic_flags & ICF_A2_TO_INT) + "$$GREEN$$a2i$$FG$$ "; + if (tempi->ic_flags & ICF_A1_TO_F64) + "$$LTBLUE$$a1d$$FG$$ "; + if (tempi->ic_flags & ICF_A1_TO_INT) + "$$GREEN$$a1i$$FG$$ "; + if (tempi->ic_flags & ICF_R_TO_F64) + "$$LTBLUE$$rd$$FG$$ "; + if (tempi->ic_flags & ICF_R_TO_INT) + "$$GREEN$$ri$$FG$$ "; + if (tempi->ic_flags & ICF_USE_F64) + "[F64] "; + if (tempi->ic_flags & ICF_USE_UNSIGNED) + "[unsigned] "; + if (tempi->ic_flags & ICF_USE_INT) + "[int] "; + if (tempi->ic_flags & ICF_NO_DEPEND_RESULT) + "-DEP "; + if (tempi->ic_flags & ICF_DEPEND_RESULT) + "+DEP "; + if (tempi->ic_flags & ICF_NOT_ADDR) + "NOT_ADDR "; + if (tempi->ic_flags & ICF_PUSH_RESULT) + "PUSH "; + if (tempi->ic_flags & ICF_PUSH_CMP) + "PUSH_CMP "; + if (tempi->ic_flags & ICF_POP_CMP) + "POP_CMP "; + if (tempi->ic_flags & ICF_DEL_PREVIOUS_INS) + "DELPREV "; + if (tempi->ic_flags & ICF_PREVIOUS_DELETED) + "PREVDEL "; + for (i=0;i<3;i++) { + if (Bt(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0+i)) + "DONT_PUSH#%d ",i; + if (Bt(&tempi->ic_flags,ICf_DONT_POP_FLOAT0+i)) + "DONT_POP#%d ",i; + } + if (tempi->ic_flags & ICF_ALTERNATE_TEMPLATE) + "ALT_TEMP "; + '\n'; + } +} + +U0 LCCQuePut(CLex *lx) +{ + CIntermediateCode *tempi=lx->lcc.lcc_root.next; + while (tempi->ic_code) { + if (tempi->ic_flags&ICF_TRACE) + ICPut(lx,tempi); + tempi=tempi->next; + } +} + +U0 LCCInit(CLex *lx) +{ + CLexCodeCtrl *tempcbh=&lx->lcc; + QueInit(&tempcbh->lcc_root.next); + QueInit(&tempcbh->lcc_next_misc); + tempcbh->lcc_root.ic_code=IC_END; +} + +CIntermediateCode *LCCAdd(CLex *lx, + I64 opcode_and_precedence,I64 arg, CHashClass *c,I64 flags=0) +{ + CIntermediateCode *tempi=MAlloc(sizeof(CIntermediateCode)); + tempi->ic_code=opcode_and_precedence.u16[0]; + tempi->ic_precedence=opcode_and_precedence.u16[1]; + tempi->ic_data=arg; + tempi->ic_class=c; + if (Bt(&lx->opts,OPTf_OPT_TRACE)) { + Bts(&lx->flags,Lf_OPT_TRACE_PRESENT); + flags|=ICF_TRACE; + } + if (lx->lock_cnt) + flags|=ICF_LOCK; + tempi->ic_flags=flags; + tempi->ic_line=lx->last_line_num; + QueIns(tempi,lx->lcc.lcc_root.last); + return tempi; +} + +U0 LCCPush(CLex *lx) +{ + CLexCodeCtrl *tempcbh=MAlloc(sizeof(CLexCodeCtrl)); + MemCpy(tempcbh,&lx->lcc,sizeof(CLexCodeCtrl)); + lx->lcc.lcc_next=tempcbh; +} + +CLex *LCCPopNoFree(CLex *lx) +{ + CLexCodeCtrl *tempcbh=lx->lcc.lcc_next; + MemCpy(&lx->lcc,tempcbh,sizeof(CLexCodeCtrl)); + return tempcbh; +} + +U0 LCCPop(CLex *lx) +{ + Free(LCCPopNoFree(lx)); +} + +U0 LCCAppend(CLex *lx, CLexCodeCtrl *tempcbh) +{ + if (tempcbh->lcc_root.next!=&lx->lcc.lcc_root.next) { + lx->lcc.lcc_root.last->next=tempcbh->lcc_root.next; + tempcbh->lcc_root.next->last=lx->lcc.lcc_root.last; + lx->lcc.lcc_root.last=tempcbh->lcc_root.last; + tempcbh->lcc_root.last->next=&lx->lcc.lcc_root.next; + } + if (tempcbh->lcc_next_misc!=&lx->lcc.lcc_next_misc) { + lx->lcc.lcc_last_misc->next=tempcbh->lcc_next_misc; + tempcbh->lcc_next_misc->last=lx->lcc.lcc_last_misc; + lx->lcc.lcc_last_misc=tempcbh->lcc_last_misc; + tempcbh->lcc_last_misc->next=&lx->lcc.lcc_next_misc; + } + Free(tempcbh); +} + +CLexCodeMisc *LCCMiscNew(CLex *lx,I64 ty) +{ + CLexCodeMisc *result=CAlloc(sizeof(CLexCodeMisc)); + result->addr=INVALID_PTR; + result->type=ty; + QueIns(result,lx->lcc.lcc_last_misc); + return result; +} + +CLexCodeMisc *LCCGoToLabelFind(CLex *lx,U8 *name) +{ + CLexCodeMisc *mc=lx->lcc.lcc_next_misc; + while (mc!=&lx->lcc.lcc_next_misc) { + if ((mc->type==CMT_GOTO_LABEL||mc->type==CMT_ASM_LABEL) && + !StrCmp(mc->str,name)) + return mc; + mc=mc->next; + } + return NULL; +} + +I64 LCCFloatConstFind(CLex *lx,F64 d) +{ + I64 i; + CLexCodeMisc *mc=lx->lcc.lcc_next_misc; + while (mc!=&lx->lcc.lcc_next_misc) { + if (mc->type==CMT_FLOAT_CONSTS) { + for (i=0;inum_consts;i++) + if (mc->float_consts[i]==d) + return mc->addr+i*sizeof(F64); + if (mc->num_constsfloat_consts[mc->num_consts++]=d; + return mc->addr+i*sizeof(F64); + } + } + mc=mc->next; + } + mc=LCCMiscNew(lx,CMT_FLOAT_CONSTS); + mc->float_consts=MAlloc(CM_MAX_CONSTS*sizeof(F64)); + mc->float_consts[mc->num_consts++]=d; + return mc->addr; +} + +U0 LCCDel(CLex *lx,CLexCodeCtrl *lcc) +{ + CLexCodeMisc *mc,*mc1; + U8 *undef=NULL; + QueDel(&lcc->lcc_root.next); + mc=lcc->lcc_next_misc; + while (mc!=&lcc->lcc_next_misc) { + mc1=mc->next; + switch (mc->type) { + case CMT_GOTO_LABEL: + case CMT_ASM_LABEL: + if (!(mc->flags&CMF_DEFINED)) { + undef=mc->str; + mc->str=NULL; + } else if (!mc->use_cnt) { + PrintWarn("Unused label %s\n",mc->str); + LexWarn(lx,"Unused label at "); + } + break; + case CMT_JMP_TABLE: + Free(mc->jmp_table); + break; + case CMT_FLOAT_CONSTS: + Free(mc->float_consts); + break; + case CMT_ARRAY_DIM: + LinkedLstDel(mc->dim); + break; + case CMT_HASH_ENTRY: + HashDel(mc->h); + break; + } + Free(mc->str); + Free(mc); + mc=mc1; + } + if (undef) { + PrintErr("Undefined goto label %s\n",undef); + Free(undef); + LexExcept(lx,"Undefined goto label at "); + } +} + +U0 LCCHeaderPut(CLex *lx,I64 pass,Bool put) +{ + if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) { + if (put) { + if (Bt(&lx->otrace_mask,pass-1)) { + "$$IV,1$$Pass %d:$$IV,0$$\n",pass-1; + LCCQuePut(lx); + } + } else if (Bt(&lx->otrace_mask,pass)) + "$$IV,1$$Pass %d:$$IV,0$$\n",pass; + } + lx->pass=pass; +} + +U8 *LCCCompile(CLex *lx,I64 *_code_size,CDbgInfo **_dbg,I64 *_type) +{ + U8 *result; + CLexCodeMisc *lb; + I64 i,code_size,last_code_size; + + COptReg reg_offsets[NUM_REGS]; + if (_dbg) *_dbg=NULL; + lx->pass=0; + LCCHeaderPut(lx,1,TRUE); + OptPass012(lx); + LCCHeaderPut(lx,2,TRUE); + OptPass012(lx); + LCCHeaderPut(lx,3,TRUE); + OptPass3(lx,reg_offsets); + LCCHeaderPut(lx,4,TRUE); + OptPass4(lx,reg_offsets,_type); + LCCHeaderPut(lx,5,TRUE); + OptPass5(lx); + LCCHeaderPut(lx,6,TRUE); + OptPass6(lx); + LCCHeaderPut(lx,7,TRUE); + + lb=lx->lcc.lcc_next_misc; + while (lb!=&lx->lcc.lcc_next_misc) { + if (lb->type==CMT_JMP_TABLE) { + for (i=0;irange;i++) + lb->jmp_table[i]=OptLabelFwd(lb->jmp_table[i]); + lb->dft=OptLabelFwd(lb->dft); + } + lb=lb->next; + } + + LCCHeaderPut(lx,7,FALSE); + OptPass789A(lx,reg_offsets,NULL,NULL); + LCCHeaderPut(lx,8,FALSE); + OptPass789A(lx,reg_offsets,NULL,NULL); + LCCHeaderPut(lx,9,FALSE); + code_size=OptPass789A(lx,reg_offsets,NULL,NULL); + do { + last_code_size=code_size; + LCCHeaderPut(lx,9,FALSE); + code_size=OptPass789A(lx,reg_offsets,NULL,NULL); + if (code_size>last_code_size) { + "Pass:9 Code Size\n"; + LexExcept(lx,"Compiler Optimization Error at "); + } + } while (code_sizeflags&LF_AOT_COMPILE) + result=MAlloc(code_size); + else + result=MAlloc(code_size,Fs->code_heap); + LCCHeaderPut(lx,10,FALSE); + code_size=OptPass789A(lx,reg_offsets,result,_dbg); + + LCCDel(lx,&lx->lcc); + if (Bt(&lx->opts,OPTf_COMPILE_TRACE)) { + if (lx->flags&LF_AOT_COMPILE) { + if (lx->a->seg_size==16) + Un(result,code_size,16); + else if (lx->a->seg_size==64) + Un(result,code_size,64); + else + Un(result,code_size,32); + } else + Un(result,code_size,64); + } + if (_code_size) *_code_size=code_size; + return result; +} diff --git a/Compiler/Compiler.BIN b/Compiler/Compiler.BIN index ac541ce..51d4aa9 100644 Binary files a/Compiler/Compiler.BIN and b/Compiler/Compiler.BIN differ diff --git a/Compiler/Compiler.MAP b/Compiler/Compiler.MAP index 89885a9..90c6936 100644 --- a/Compiler/Compiler.MAP +++ b/Compiler/Compiler.MAP @@ -1,460 +1,451 @@ -$LK,"AsmGlblsResolve ",A="FL:D:/Compiler/Assembler.CPP.Z,284",BI=1$0000007F30 0001 0000000404 Funct Export Res -$LK,"AsmHashLoad ",A="FL:D:/Compiler/CmpInit.CPP.Z,68",BI=2$000002939A 0001 00000005BF Funct Export Res -$LK,"AsmLexExpression ",A="FL:D:/Compiler/Assembler.CPP.Z,189",BI=3$0000007B08 0004 00000000B7 Funct Export Res -$LK,"AsmLineLst ",A="FL:D:/Compiler/Assembler.CPP.Z,31",BI=4$0000007570 0001 0000000148 Funct Export Res -$LK,"AsmLocalsResolve ",A="FL:D:/Compiler/Assembler.CPP.Z,250",BI=5$0000007E08 0003 0000000127 Funct Export Res -$LK,"AsmMakeArgMask ",A="FL:D:/Compiler/Assembler.CPP.Z,569",BI=6$0000008898 0002 0000000444 Funct Export Res -$LK,"AsmPrsInsFlags ",A="FL:D:/Compiler/CmpInit.CPP.Z,18",BI=7$000002915A 0001 000000023B Funct Export Res -$LK,"AsmResolve ",A="FL:D:/Compiler/Assembler.CPP.Z,209",BI=8$0000007BC0 0002 0000000245 Funct Export Res -$LK,"AsmStoreCodeU32 ",A="FL:D:/Compiler/Assembler.CPP.Z,90",BI=9$00000077C0 0001 0000000145 Funct Export Res -$LK,"AsmStoreCodeU64 ",A="FL:D:/Compiler/Assembler.CPP.Z,129",BI=10$0000007908 0005 0000000146 Funct Export Res -$LK,"AsmStoreCodeU8 ",A="FL:D:/Compiler/Assembler.CPP.Z,61",BI=11$00000076B8 001D 0000000103 Funct Export Res -$LK,"AsmStoreCodeU8At ",A="FL:D:/Compiler/Assembler.CPP.Z,168",BI=12$0000007A50 0007 00000000B7 Funct Export Res -$LK,"AsmStoreNum ",A="FL:D:/Compiler/Assembler.CPP.Z,663",BI=13$0000008CE0 0004 00000004A6 Funct Export Res -$LK,"AsmUnresolvedAdd ",A="FL:D:/Compiler/Assembler.CPP.Z,1",BI=14$0000007460 0004 000000010C Funct Export Res -$LK,"CInternalType ",A="FL:D:/Compiler/CmpInit.CPP.Z,3"$003FD4FE40 0002 000000000A Class -$LK,"CMP_TEMPLATES ",A="FL:D:/Compiler/CmpAsm.CPP.Z,5"$0000000000 0001 ExportSysSym Export -$LK,"CMP_TEMPLATES_DONT_POP",A="FL:D:/Compiler/CmpAsm.CPP.Z,179"$000000018B 0001 ExportSysSym Export -$LK,"CMP_TEMPLATES_DONT_PUSH",A="FL:D:/Compiler/CmpAsm.CPP.Z,268"$0000000257 0001 ExportSysSym Export -$LK,"CMP_TEMPLATES_DONT_PUSH2",A="FL:D:/Compiler/CmpAsm.CPP.Z,459"$0000000421 0001 ExportSysSym Export -$LK,"CMP_TEMPLATES_DONT_PUSH_POP",A="FL:D:/Compiler/CmpAsm.CPP.Z,395"$0000000391 0001 ExportSysSym Export -$LK,"CN_A1 ",A="FL:D:/Compiler/BackF1a.CPP.Z,2"$1 0006 0000000008 DefineStr -$LK,"CN_A2 ",A="FL:D:/Compiler/BackF1a.CPP.Z,1"$0 0005 0000000008 DefineStr -$LK,"CN_MAIN ",A="FL:D:/Compiler/BackF1a.CPP.Z,3"$2 0022 0000000008 DefineStr -$LK,"CN_R ",A="FL:D:/Compiler/BackF1a.CPP.Z,4"$3 0003 0000000008 DefineStr -$LK,"COptMemberVar ",A="FL:D:/Compiler/OptLib.CPP.Z,570"$003FC79988 0005 0000000028 Class -$LK,"CSubSwitch ",A="FL:D:/Compiler/StmtParser.CPP.Z,1342"$003FC769B0 0004 0000000020 Class -$LK,"CSwitchCase ",A="FL:D:/Compiler/StmtParser.CPP.Z,1347"$003FD576B8 0004 0000000020 Class -$LK,"CTrace ",A="FL:D:/Compiler/ICLCC.CPP.Z,33",BI=15$0000002898 0000 0000000017 Funct Export Res -$LK,"CVI2 ",A="FL:D:/Compiler/StmtParser.CPP.Z,175"$003FC76C90 0003 0000000010 Class -$LK,"Cmp ",A="FL:D:/Compiler/CmpMain.CPP.Z,455",BI=16$000002BF32 0000 000000059C Funct Export Res -$LK,"CmpBuf ",A="FL:D:/Compiler/CmpMain.CPP.Z,170",BI=17$000002B5FA 0001 00000000B6 Funct Export Res -$LK,"CmpF1PushPop ",A="FL:D:/Compiler/OptLib.CPP.Z,553",BI=18$000000BCE6 0002 0000000031 Funct Export Res -$LK,"CmpF2PushPop ",A="FL:D:/Compiler/OptLib.CPP.Z,559",BI=19$000000BD1E 0005 0000000074 Funct Export Res -$LK,"CmpFillTables ",A="FL:D:/Compiler/CmpInit.CPP.Z,444",BI=20$000002A872 0001 000000051A Funct Export Res -$LK,"CmpFixUpAOTAsm ",A="FL:D:/Compiler/CmpMain.CPP.Z,314",BI=21$000002BB42 0000 00000003EA Funct Export Res -$LK,"CmpFixUpJITAsm ",A="FL:D:/Compiler/CmpMain.CPP.Z,187",BI=22$000002B6B2 0000 000000048F Funct Export Res -$LK,"CmpInit ",A="FL:D:/Compiler/CmpMain.CPP.Z,718",BI=23$000002C9DA 0001 0000000081 Funct Export Res -$LK,"CmpJoin ",A="FL:D:/Compiler/CmpMain.CPP.Z,48",BI=24$000002AF72 0001 0000000682 Funct Export Res -$LK,"CmpLoadDefines ",A="FL:D:/Compiler/CmpInit.CPP.Z,204",BI=25$000002995A 0001 0000000F18 Funct Export Res -$LK,"CmpNoteFloatOp ",A="FL:D:/Compiler/BackF1a.CPP.Z,6",BI=26$000001B3EE 000E 000000020D Funct Export Res -$LK,"CmpOffset2Reg ",A="FL:D:/Compiler/OptLib.CPP.Z,83",BI=27$000000B09E 0005 0000000046 Funct Export Res -$LK,"CmpPrompt ",A="FL:D:/Compiler/Lex.CPP.Z,1",BI=28$00000038D8 0001 00000001B5 Funct Export Res -$LK,"CmpRawType ",A="FL:D:/Compiler/OptLib.CPP.Z,533",BI=29$000000BC86 0006 0000000025 Funct Export Res -$LK,"CmpRawTypePointed ",A="FL:D:/Compiler/OptLib.CPP.Z,542",BI=30$000000BCAE 0005 0000000033 Funct Export Res -$LK,"CmpSetFloatOpPushPop",A="FL:D:/Compiler/BackF1a.CPP.Z,57",BI=31$000001B5FE 000C 0000000075 Funct Export Res -$LK,"Echo ",A="FL:D:/Compiler/ICLCC.CPP.Z,38",BI=32$00000028B0 0000 0000000017 Funct Export Res -$LK,"ExeFile ",A="FL:D:/Compiler/CmpMain.CPP.Z,650",BI=33$000002C6D2 0000 000000007B Funct Export Res -$LK,"ExeFile2 ",A="FL:D:/Compiler/CmpMain.CPP.Z,689",BI=34$000002C86A 0000 0000000079 Funct Export Res -$LK,"ExePrint ",A="FL:D:/Compiler/CmpMain.CPP.Z,641",BI=35$000002C682 0000 0000000049 Funct Export Res -$LK,"ExePrint2 ",A="FL:D:/Compiler/CmpMain.CPP.Z,680",BI=36$000002C822 0000 0000000047 Funct Export Res -$LK,"ExePutS ",A="FL:D:/Compiler/CmpMain.CPP.Z,606",BI=37$000002C4D2 0003 00000001A9 Funct Export Res -$LK,"ExePutS2 ",A="FL:D:/Compiler/CmpMain.CPP.Z,661",BI=38$000002C752 0002 00000000CC Funct Export Res -$LK,"FBO1_F64 ",A="FL:D:/Compiler/OptLib.CPP.Z,94"$2 0002 0000000008 DefineStr -$LK,"FBO1_INT ",A="FL:D:/Compiler/OptLib.CPP.Z,93"$1 0013 0000000008 DefineStr -$LK,"FBO1_NOT_CONST ",A="FL:D:/Compiler/OptLib.CPP.Z,92"$0 0004 0000000008 DefineStr -$LK,"GetOpt ",A="FL:D:/Compiler/ICLCC.CPP.Z,16",BI=39$0000002810 0004 000000002C Funct Export Res -$LK,"HashEntrySize ",A="FL:D:/Compiler/Hash1b.CPP.Z,1",BI=40$0000007158 0000 0000000103 Funct Export Res -$LK,"HashEntrySize2 ",A="FL:D:/Compiler/Hash1b.CPP.Z,32",BI=41$0000007260 0002 00000001A4 Funct Export Res -$LK,"HashTableSize2 ",A="FL:D:/Compiler/Hash1b.CPP.Z,69",BI=42$0000007408 0000 0000000054 Funct Export Res -$LK,"ICAddEct ",A="FL:D:/Compiler/Back1a.CPP.Z,1",BI=43$000001F056 0005 00000002F3 Funct Export Res -$LK,"ICAddRSP ",A="FL:D:/Compiler/BackLib.CPP.Z,69",BI=44$0000019D86 0017 00000002A7 Funct Export Res -$LK,"ICAddSubEctEqual ",A="FL:D:/Compiler/Back1a.CPP.Z,505",BI=45$000002095E 0005 0000000673 Funct Export Res -$LK,"ICAddSubEctImm ",A="FL:D:/Compiler/Back1a.CPP.Z,57",BI=46$000001F34E 000D 0000000685 Funct Export Res -$LK,"ICAndAnd ",A="FL:D:/Compiler/Back1b.CPP.Z,30",BI=47$00000215FE 0001 000000014B Funct Export Res -$LK,"ICAndBranch ",A="FL:D:/Compiler/Back1c.CPP.Z,1",BI=48$0000023896 0002 00000006E6 Funct Export Res -$LK,"ICAndEqual ",A="FL:D:/Compiler/Back1c.CPP.Z,675",BI=49$0000025776 0001 000000010D Funct Export Res -$LK,"ICArgPut ",A="FL:D:/Compiler/ICLCC.CPP.Z,73",BI=50$00000029D0 0003 00000002D6 Funct Export Res -$LK,"ICAssign ",A="FL:D:/Compiler/Back1c.CPP.Z,159",BI=51$0000023F7E 0001 0000000301 Funct Export Res -$LK,"ICAssignPostIncDec ",A="FL:D:/Compiler/Back1b.CPP.Z,534",BI=52$0000022C56 0002 0000000210 Funct Export Res -$LK,"ICBitOps ",A="FL:D:/Compiler/Back1b.CPP.Z,244",BI=53$0000021EF6 0007 00000004F1 Funct Export Res -$LK,"ICBrBitOps ",A="FL:D:/Compiler/Back1c.CPP.Z,207",BI=54$0000024286 0008 00000009FB Funct Export Res -$LK,"ICBuiltInFloatConst ",A="FL:D:/Compiler/BackLib.CPP.Z,420",BI=55$000001A8C6 000F 00000000BD Funct Export Res -$LK,"ICClassPut ",A="FL:D:/Compiler/ICLCC.CPP.Z,49",BI=56$00000028F8 0001 00000000D3 Funct Export Res -$LK,"ICCmp ",A="FL:D:/Compiler/Back1b.CPP.Z,124",BI=57$0000021A0E 0006 00000004E6 Funct Export Res -$LK,"ICCmpAndBranch ",A="FL:D:/Compiler/Back1b.CPP.Z,575",BI=58$0000022E66 000C 0000000737 Funct Export Res -$LK,"ICCopyTemplate ",A="FL:D:/Compiler/BackF1a.CPP.Z,69",BI=59$000001B676 0013 000000021D Funct Export Res -$LK,"ICDeref ",A="FL:D:/Compiler/BackLib.CPP.Z,656",BI=60$000001B32E 0001 00000000B9 Funct Export Res -$LK,"ICDerefPostIncDec ",A="FL:D:/Compiler/Back1b.CPP.Z,491",BI=61$0000022A5E 0002 00000001F1 Funct Export Res -$LK,"ICDiv ",A="FL:D:/Compiler/Back1a.CPP.Z,413",BI=62$000002048E 0001 00000000F1 Funct Export Res -$LK,"ICDivEqual ",A="FL:D:/Compiler/Back1a.CPP.Z,432",BI=63$0000020586 0002 00000002DE Funct Export Res -$LK,"ICFAdd ",A="FL:D:/Compiler/BackF1b.CPP.Z,633",BI=64$000001EA16 0001 00000001FF Funct Export Res -$LK,"ICFCmp ",A="FL:D:/Compiler/BackF1a.CPP.Z,549",BI=65$000001C9EE 0004 000000018B Funct Export Res -$LK,"ICFCmpAndBranch ",A="FL:D:/Compiler/BackF1b.CPP.Z,325",BI=66$000001DE4E 0004 00000009F7 Funct Export Res -$LK,"ICFCvt ",A="FL:D:/Compiler/BackF1a.CPP.Z,115",BI=67$000001B896 000C 000000017F Funct Export Res -$LK,"ICFCvt2 ",A="FL:D:/Compiler/BackF1a.CPP.Z,163",BI=68$000001BA16 0010 0000000116 Funct Export Res -$LK,"ICFDiv ",A="FL:D:/Compiler/BackF1b.CPP.Z,621",BI=69$000001E966 0001 00000000A9 Funct Export Res -$LK,"ICFMod ",A="FL:D:/Compiler/BackF1a.CPP.Z,241",BI=70$000001BD0E 0001 0000000145 Funct Export Res -$LK,"ICFModEqual ",A="FL:D:/Compiler/BackF1a.CPP.Z,589",BI=71$000001CB7E 0001 00000003D7 Funct Export Res -$LK,"ICFMul ",A="FL:D:/Compiler/BackF1b.CPP.Z,603",BI=72$000001E846 0001 000000011B Funct Export Res -$LK,"ICFOp ",A="FL:D:/Compiler/BackF1a.CPP.Z,350",BI=73$000001C14E 0004 000000089D Funct Export Res -$LK,"ICFOpEqual ",A="FL:D:/Compiler/BackF1b.CPP.Z,1",BI=74$000001CF56 0004 0000000EF7 Funct Export Res -$LK,"ICFPostIncDec ",A="FL:D:/Compiler/BackF1b.CPP.Z,716",BI=75$000001EE4E 0002 0000000151 Funct Export Res -$LK,"ICFPow ",A="FL:D:/Compiler/BackF1a.CPP.Z,271",BI=76$000001BE56 0001 00000002F7 Funct Export Res -$LK,"ICFPreIncDec ",A="FL:D:/Compiler/BackF1b.CPP.Z,694",BI=77$000001ED3E 0002 000000010A Funct Export Res -$LK,"ICFSub ",A="FL:D:/Compiler/BackF1b.CPP.Z,671",BI=78$000001EC16 0001 0000000124 Funct Export Res -$LK,"ICFTemplateFun ",A="FL:D:/Compiler/BackF1b.CPP.Z,744",BI=79$000001EFA6 0007 00000000AA Funct Export Res -$LK,"ICFUnaryMinus ",A="FL:D:/Compiler/BackF1a.CPP.Z,190",BI=80$000001BB2E 0001 00000001E0 Funct Export Res -$LK,"ICFlagBranch ",A="FL:D:/Compiler/Back1b.CPP.Z,803",BI=81$000002378E 0004 0000000106 Funct Export Res -$LK,"ICLastIns ",A="FL:D:/Compiler/BackLib.CPP.Z,59",BI=82$0000019D46 0002 0000000040 Funct Export Res -$LK,"ICLea ",A="FL:D:/Compiler/BackLib.CPP.Z,622",BI=83$000001B17E 0004 00000001AA Funct Export Res -$LK,"ICLocalVarInit ",A="FL:D:/Compiler/Back1c.CPP.Z,908",BI=84$0000026196 0001 0000000078 Funct Export Res -$LK,"ICMinMax ",A="FL:D:/Compiler/Back1c.CPP.Z,496",BI=85$000002504E 0004 00000002AB Funct Export Res -$LK,"ICMod ",A="FL:D:/Compiler/Back1a.CPP.Z,486",BI=86$0000020866 0001 00000000F1 Funct Export Res -$LK,"ICModU64 ",A="FL:D:/Compiler/Back1c.CPP.Z,575",BI=87$000002534E 0001 00000001B7 Funct Export Res -$LK,"ICModr1 ",A="FL:D:/Compiler/BackLib.CPP.Z,140",BI=88$000001A02E 0017 00000002FE Funct Export Res -$LK,"ICModr2 ",A="FL:D:/Compiler/BackLib.CPP.Z,230",BI=89$000001A32E 0016 00000000A6 Funct Export Res -$LK,"ICMov ",A="FL:D:/Compiler/BackLib.CPP.Z,442",BI=90$000001A986 019A 00000007F4 Funct Export Res -$LK,"ICMul ",A="FL:D:/Compiler/Back1a.CPP.Z,289",BI=91$000001FDCE 0001 00000002B8 Funct Export Res -$LK,"ICMulEqual ",A="FL:D:/Compiler/Back1a.CPP.Z,346",BI=92$0000020086 0001 0000000406 Funct Export Res -$LK,"ICNot ",A="FL:D:/Compiler/Back1b.CPP.Z,10",BI=93$00000214FE 0001 00000000FF Funct Export Res -$LK,"ICOpSizeRex ",A="FL:D:/Compiler/BackLib.CPP.Z,28",BI=94$0000019C5E 0006 0000000040 Funct Export Res -$LK,"ICOrEqual ",A="FL:D:/Compiler/Back1c.CPP.Z,698",BI=95$0000025886 0001 000000010D Funct Export Res -$LK,"ICOrOr ",A="FL:D:/Compiler/Back1b.CPP.Z,59",BI=96$000002174E 0001 0000000162 Funct Export Res -$LK,"ICPop ",A="FL:D:/Compiler/BackLib.CPP.Z,361",BI=97$000001A6CE 0009 00000000EA Funct Export Res -$LK,"ICPopRegs ",A="FL:D:/Compiler/BackLib.CPP.Z,388",BI=98$000001A7BE 000C 0000000057 Funct Export Res -$LK,"ICPostIncDec ",A="FL:D:/Compiler/Back1b.CPP.Z,451",BI=99$000002285E 0002 00000001FF Funct Export Res -$LK,"ICPreIncDec ",A="FL:D:/Compiler/Back1b.CPP.Z,415",BI=100$000002267E 0004 00000001DB Funct Export Res -$LK,"ICPreempt ",A="FL:D:/Compiler/Back1b.CPP.Z,348",BI=101$00000223EE 0001 0000000122 Funct Export Res -$LK,"ICPush ",A="FL:D:/Compiler/BackLib.CPP.Z,310",BI=102$000001A51E 001F 0000000152 Funct Export Res -$LK,"ICPushRegs ",A="FL:D:/Compiler/BackLib.CPP.Z,348",BI=103$000001A676 0006 0000000054 Funct Export Res -$LK,"ICPut ",A="FL:D:/Compiler/ICLCC.CPP.Z,118",BI=104$0000002CA8 0008 00000003B2 Funct Export Res -$LK,"ICQueInit ",A="FL:D:/Compiler/Back1c.CPP.Z,384",BI=105$0000024C86 0001 0000000070 Funct Export Res -$LK,"ICQueIns ",A="FL:D:/Compiler/Back1c.CPP.Z,398",BI=106$0000024CF6 0001 0000000162 Funct Export Res -$LK,"ICQueInsRev ",A="FL:D:/Compiler/Back1c.CPP.Z,439",BI=107$0000024E5E 0001 0000000162 Funct Export Res -$LK,"ICQueRem ",A="FL:D:/Compiler/Back1c.CPP.Z,480",BI=108$0000024FC6 0001 0000000088 Funct Export Res -$LK,"ICRex ",A="FL:D:/Compiler/BackLib.CPP.Z,22",BI=109$0000019C2E 0016 000000002D Funct Export Res -$LK,"ICShift ",A="FL:D:/Compiler/Back1a.CPP.Z,643",BI=110$0000020FD6 0004 00000001A3 Funct Export Res -$LK,"ICShiftEqual ",A="FL:D:/Compiler/Back1a.CPP.Z,676",BI=111$000002117E 0002 000000030E Funct Export Res -$LK,"ICSlashOp ",A="FL:D:/Compiler/BackLib.CPP.Z,282",BI=112$000001A3D6 0027 0000000145 Funct Export Res -$LK,"ICSqr ",A="FL:D:/Compiler/Back1c.CPP.Z,568",BI=113$00000252FE 0002 000000004A Funct Export Res -$LK,"ICSub ",A="FL:D:/Compiler/Back1a.CPP.Z,211",BI=114$000001F9D6 0001 00000003F5 Funct Export Res -$LK,"ICSwap ",A="FL:D:/Compiler/Back1c.CPP.Z,617",BI=115$0000025506 0001 000000026E Funct Export Res -$LK,"ICSwitch ",A="FL:D:/Compiler/Back1c.CPP.Z,744",BI=116$0000025A9E 0002 00000006F2 Funct Export Res -$LK,"ICTest ",A="FL:D:/Compiler/BackLib.CPP.Z,410",BI=117$000001A876 000C 000000004E Funct Export Res -$LK,"ICTestAndBranch ",A="FL:D:/Compiler/Back1b.CPP.Z,755",BI=118$000002359E 0002 00000001EC Funct Export Res -$LK,"ICToBool ",A="FL:D:/Compiler/Back1b.CPP.Z,400",BI=119$0000022606 0001 0000000075 Funct Export Res -$LK,"ICToF64 ",A="FL:D:/Compiler/Back1b.CPP.Z,395",BI=120$00000225C6 0001 000000003D Funct Export Res -$LK,"ICToI64 ",A="FL:D:/Compiler/Back1b.CPP.Z,390",BI=121$0000022586 0001 000000003D Funct Export Res -$LK,"ICToUpper ",A="FL:D:/Compiler/Back1b.CPP.Z,379",BI=122$0000022516 0001 000000006B Funct Export Res -$LK,"ICU16 ",A="FL:D:/Compiler/BackLib.CPP.Z,35",BI=123$0000019C9E 0092 0000000029 Funct Export Res -$LK,"ICU24 ",A="FL:D:/Compiler/BackLib.CPP.Z,41",BI=124$0000019CCE 0063 0000000026 Funct Export Res -$LK,"ICU32 ",A="FL:D:/Compiler/BackLib.CPP.Z,47",BI=125$0000019CF6 0054 0000000026 Funct Export Res -$LK,"ICU64 ",A="FL:D:/Compiler/BackLib.CPP.Z,53",BI=126$0000019D1E 0009 0000000028 Funct Export Res -$LK,"ICU8 ",A="FL:D:/Compiler/BackLib.CPP.Z,17",BI=127$0000019C06 0063 0000000028 Funct Export Res -$LK,"ICUnaries ",A="FL:D:/Compiler/Back1b.CPP.Z,1",BI=128$000002148E 0002 0000000069 Funct Export Res -$LK,"ICXorEqual ",A="FL:D:/Compiler/Back1c.CPP.Z,721",BI=129$0000025996 0001 0000000107 Funct Export Res -$LK,"ICXorXor ",A="FL:D:/Compiler/Back1b.CPP.Z,91",BI=130$00000218B6 0001 0000000155 Funct Export Res -$LK,"ICZero ",A="FL:D:/Compiler/BackLib.CPP.Z,401",BI=131$000001A816 0017 000000005E Funct Export Res -$LK,"IncludeDepth ",A="FL:D:/Compiler/ICLCC.CPP.Z,43",BI=132$00000028C8 0000 0000000030 Funct Export Res -$LK,"InstEntriesCompare ",A="FL:D:/Compiler/Unassembler.CPP.Z,1",BI=133$0000000738 0001 00000002A9 Funct Export Res -$LK,"InstEntryFind ",A="FL:D:/Compiler/Unassembler.CPP.Z,72",BI=134$00000009E8 0002 00000003C9 Funct Export Res -$LK,"IsLexExpression2Bin ",A="FL:D:/Compiler/ExpParser.CPP.Z,1153",BI=135$000000ECAE 0000 0000000029 Funct Export Res -$LK,"LCCAdd ",A="FL:D:/Compiler/ICLCC.CPP.Z,200",BI=136$00000030D8 00A9 000000009F Funct Export Res -$LK,"LCCAppend ",A="FL:D:/Compiler/ICLCC.CPP.Z,239",BI=137$0000003200 0003 00000000A6 Funct Export Res -$LK,"LCCCompile ",A="FL:D:/Compiler/ICLCC.CPP.Z,356",BI=138$0000003630 0006 00000002A7 Funct Export Res -$LK,"LCCDel ",A="FL:D:/Compiler/ICLCC.CPP.Z,299",BI=139$0000003420 0001 0000000164 Funct Export Res -$LK,"LCCFloatConstFind ",A="FL:D:/Compiler/ICLCC.CPP.Z,277",BI=140$0000003358 000F 00000000C6 Funct Export Res -$LK,"LCCGoToLabelFind ",A="FL:D:/Compiler/ICLCC.CPP.Z,265",BI=141$0000003300 0005 0000000057 Funct Export Res -$LK,"LCCHeaderPut ",A="FL:D:/Compiler/ICLCC.CPP.Z,342",BI=142$0000003588 000B 00000000A2 Funct Export Res -$LK,"LCCInit ",A="FL:D:/Compiler/ICLCC.CPP.Z,192",BI=143$0000003098 000A 000000003A Funct Export Res -$LK,"LCCMiscNew ",A="FL:D:/Compiler/ICLCC.CPP.Z,256",BI=144$00000032A8 0021 0000000055 Funct Export Res -$LK,"LCCPop ",A="FL:D:/Compiler/ICLCC.CPP.Z,234",BI=145$00000031E0 0008 000000001A Funct Export Res -$LK,"LCCPopNoFree ",A="FL:D:/Compiler/ICLCC.CPP.Z,227",BI=146$00000031B0 0003 000000002E Funct Export Res -$LK,"LCCPush ",A="FL:D:/Compiler/ICLCC.CPP.Z,220",BI=147$0000003178 000E 0000000037 Funct Export Res -$LK,"LCCQuePut ",A="FL:D:/Compiler/ICLCC.CPP.Z,182",BI=148$0000003060 0001 0000000037 Funct Export Res -$LK,"Lex ",A="FL:D:/Compiler/Lex.CPP.Z,725",BI=149$00000054C8 00ED 0000001881 Funct Export Res -$LK,"LexAttachDoc ",A="FL:D:/Compiler/Lex.CPP.Z,393",BI=150$0000004A70 0001 0000000163 Funct Export Res -$LK,"LexBackupLastChar ",A="FL:D:/Compiler/Lex.CPP.Z,131",BI=151$0000003E4C 0003 0000000041 Funct Export Res -$LK,"LexD2I32 ",A="FL:D:/Compiler/ExpParser.CPP.Z,1198",BI=152$000000EDCE 0000 00000000A6 Funct Export Res -$LK,"LexD3I32 ",A="FL:D:/Compiler/ExpParser.CPP.Z,1214",BI=153$000000EE76 0000 00000000D9 Funct Export Res -$LK,"LexDel ",A="FL:D:/Compiler/Lex.CPP.Z,66",BI=154$0000003BD0 0004 00000000A5 Funct Export Res -$LK,"LexDocRead ",A="FL:D:/Compiler/Lex.CPP.Z,372",BI=155$00000049DC 0001 0000000087 Funct Export Res -$LK,"LexDollar ",A="FL:D:/Compiler/Lex.CPP.Z,142",BI=156$0000003E94 0003 0000000070 Funct Export Res -$LK,"LexExcept ",A="FL:D:/Compiler/Lex.CPP.Z,1601",BI=157$0000007068 00B8 00000000ED Funct Export Res -$LK,"LexExpression ",A="FL:D:/Compiler/ExpParser.CPP.Z,1186",BI=158$000000ED8E 0002 000000003F Funct Export Res -$LK,"LexExpression2Bin ",A="FL:D:/Compiler/ExpParser.CPP.Z,1135",BI=159$000000EC16 0006 0000000094 Funct Export Res -$LK,"LexExpressionF64 ",A="FL:D:/Compiler/ExpParser.CPP.Z,1172",BI=160$000000ED36 0000 0000000054 Funct Export Res -$LK,"LexExpressionI64 ",A="FL:D:/Compiler/ExpParser.CPP.Z,1158",BI=161$000000ECDE 000A 0000000054 Funct Export Res -$LK,"LexExtStr ",A="FL:D:/Compiler/Lex.CPP.Z,1518",BI=162$0000006D50 0004 00000000C5 Funct Export Res -$LK,"LexFirstRem ",A="FL:D:/Compiler/Lex.CPP.Z,332",BI=163$0000004884 0000 00000000BC Funct Export Res -$LK,"LexGetChar ",A="FL:D:/Compiler/Lex.CPP.Z,156",BI=164$0000003F04 0031 000000094F Funct Export Res -$LK,"LexInStr ",A="FL:D:/Compiler/Lex.CPP.Z,628",BI=165$0000005198 0001 000000032A Funct Export Res -$LK,"LexIncludeStr ",A="FL:D:/Compiler/Lex.CPP.Z,354",BI=166$0000004944 0003 0000000098 Funct Export Res -$LK,"LexNew ",A="FL:D:/Compiler/Lex.CPP.Z,35",BI=167$0000003A90 0004 000000013D Funct Export Res -$LK,"LexPop ",A="FL:D:/Compiler/Lex.CPP.Z,450",BI=168$0000004C60 0004 0000000074 Funct Export Res -$LK,"LexPush ",A="FL:D:/Compiler/Lex.CPP.Z,438",BI=169$0000004BD8 000F 0000000081 Funct Export Res -$LK,"LexPutLine ",A="FL:D:/Compiler/Lex.CPP.Z,1543",BI=170$0000006E18 0003 000000009B Funct Export Res -$LK,"LexPutPos ",A="FL:D:/Compiler/Lex.CPP.Z,1571",BI=171$0000006EB8 0003 00000000CA Funct Export Res -$LK,"LexPutToken ",A="FL:D:/Compiler/Lex.CPP.Z,108",BI=172$0000003D18 0001 000000012B Funct Export Res -$LK,"LexSize ",A="FL:D:/Compiler/Lex.CPP.Z,88",BI=173$0000003C78 0000 000000009B Funct Export Res -$LK,"LexSkipEol ",A="FL:D:/Compiler/Lex.CPP.Z,325",BI=174$0000004854 0004 000000002B Funct Export Res -$LK,"LexStatement2Bin ",A="FL:D:/Compiler/CmpMain.CPP.Z,15",BI=175$000002AE3A 0001 0000000131 Funct Export Res -$LK,"LexWarn ",A="FL:D:/Compiler/Lex.CPP.Z,1585",BI=176$0000006F88 0009 00000000D9 Funct Export Res -$LK,"MDR_D32_INDIRECT_REG",A="FL:D:/Compiler/BackLib.CPP.Z,134"$3 0002 0000000008 DefineStr -$LK,"MDR_D8_INDIRECT_REG ",A="FL:D:/Compiler/BackLib.CPP.Z,133"$2 0002 0000000008 DefineStr -$LK,"MDR_INDIRECT_REG ",A="FL:D:/Compiler/BackLib.CPP.Z,132"$1 0002 0000000008 DefineStr -$LK,"MDR_REG ",A="FL:D:/Compiler/BackLib.CPP.Z,131"$0 0002 0000000008 DefineStr -$LK,"MDR_RIP_REL ",A="FL:D:/Compiler/BackLib.CPP.Z,138"$7 0004 0000000008 DefineStr -$LK,"MDR_SIB_D32_INDIRECT_REG",A="FL:D:/Compiler/BackLib.CPP.Z,137"$6 0003 0000000008 DefineStr -$LK,"MDR_SIB_D8_INDIRECT_REG",A="FL:D:/Compiler/BackLib.CPP.Z,136"$5 0002 0000000008 DefineStr -$LK,"MDR_SIB_INDIRECT_REG",A="FL:D:/Compiler/BackLib.CPP.Z,135"$4 0002 0000000008 DefineStr -$LK,"MemberAdd ",A="FL:D:/Compiler/Lex.CPP.Z,519",BI=177$0000004E10 0004 00000001BA Funct Export Res -$LK,"MemberFind ",A="FL:D:/Compiler/Lex.CPP.Z,484",BI=178$0000004D60 0005 0000000067 Funct Export Res -$LK,"MemberFind2 ",A="FL:D:/Compiler/Lex.CPP.Z,504",BI=179$0000004DC8 0001 0000000044 Funct Export Res -$LK,"MemberLstDel ",A="FL:D:/Compiler/Lex.CPP.Z,567",BI=180$0000004FD0 0001 00000000F3 Funct Export Res -$LK,"MemberLstNew ",A="FL:D:/Compiler/StmtParser.CPP.Z,38",BI=181$000000F026 0003 000000002A Funct Export Res -$LK,"MemberLstSize ",A="FL:D:/Compiler/Lex.CPP.Z,601",BI=182$00000050C8 0002 00000000CF Funct Export Res -$LK,"MemberMetaData ",A="FL:D:/Compiler/Lex.CPP.Z,462",BI=183$0000004CD8 0000 0000000041 Funct Export Res -$LK,"MemberMetaFind ",A="FL:D:/Compiler/Lex.CPP.Z,473",BI=184$0000004D20 0000 0000000040 Funct Export Res -$LK,"NUM_INTERNAL_TYPES ",A="FL:D:/Compiler/CmpInit.CPP.Z,1"$17 0002 0000000008 DefineStr -$LK,"OTrace ",A="FL:D:/Compiler/ICLCC.CPP.Z,21",BI=185$0000002840 0000 0000000017 Funct Export Res -$LK,"OTraceMask ",A="FL:D:/Compiler/ICLCC.CPP.Z,26",BI=186$0000002858 0000 0000000039 Funct Export Res -$LK,"OptBrNotZero ",A="FL:D:/Compiler/OptLib.CPP.Z,361",BI=187$000000B7DE 0004 0000000403 Funct Export Res -$LK,"OptBrZero ",A="FL:D:/Compiler/OptLib.CPP.Z,213",BI=188$000000B3D6 0006 0000000403 Funct Export Res -$LK,"OptClassFwd ",A="FL:D:/Compiler/OptLib.CPP.Z,9",BI=189$000000AEFE 0013 000000002B Funct Export Res -$LK,"OptEqu ",A="FL:D:/Compiler/ICLCC.CPP.Z,1",BI=190$00000027B0 0005 000000002E Funct Export Res -$LK,"OptFixSizeOf ",A="FL:D:/Compiler/OptLib.CPP.Z,509",BI=191$000000BBE6 0003 000000009B Funct Export Res -$LK,"OptFixupBinaryOp1 ",A="FL:D:/Compiler/OptLib.CPP.Z,96",BI=192$000000B0E6 0013 00000001CB Funct Export Res -$LK,"OptFixupBinaryOp2 ",A="FL:D:/Compiler/OptLib.CPP.Z,162",BI=193$000000B2B6 0001 0000000054 Funct Export Res -$LK,"OptFixupUnaryOp ",A="FL:D:/Compiler/OptLib.CPP.Z,178",BI=194$000000B30E 0003 00000000C8 Funct Export Res -$LK,"OptFree ",A="FL:D:/Compiler/OptLib.CPP.Z,33",BI=195$000000AFAE 0023 0000000024 Funct Export Res -$LK,"OptIC4 ",A="FL:D:/Compiler/OptPass4.CPP.Z,1",BI=196$00000179AE 0001 00000005CD Funct Export Res -$LK,"OptIC6 ",A="FL:D:/Compiler/OptPass6.CPP.Z,1",BI=197$00000192C6 0001 0000000128 Funct Export Res -$LK,"OptLabelFwd ",A="FL:D:/Compiler/OptLib.CPP.Z,1",BI=198$000000AED6 0010 0000000028 Funct Export Res -$LK,"OptLag ",A="FL:D:/Compiler/OptLib.CPP.Z,40",BI=199$000000AFD6 000E 000000002A Funct Export Res -$LK,"OptLag1 ",A="FL:D:/Compiler/OptLib.CPP.Z,51",BI=200$000000B006 0006 0000000031 Funct Export Res -$LK,"OptLag2 ",A="FL:D:/Compiler/OptLib.CPP.Z,62",BI=201$000000B03E 0003 000000002A Funct Export Res -$LK,"OptLead1 ",A="FL:D:/Compiler/OptLib.CPP.Z,73",BI=202$000000B06E 0004 0000000030 Funct Export Res -$LK,"OptMVCompare ",A="FL:D:/Compiler/OptLib.CPP.Z,576",BI=203$000000BD96 0001 000000001A Funct Export Res -$LK,"OptOff ",A="FL:D:/Compiler/ICLCC.CPP.Z,11",BI=204$00000027F8 0000 0000000016 Funct Export Res -$LK,"OptOn ",A="FL:D:/Compiler/ICLCC.CPP.Z,6",BI=205$00000027E0 0000 0000000016 Funct Export Res -$LK,"OptPass012 ",A="FL:D:/Compiler/OptPass012.CPP.Z,23",BI=206$0000013B76 0000 00000027CC Funct Export Res -$LK,"OptPass3 ",A="FL:D:/Compiler/OptPass3.CPP.Z,1",BI=207$0000016346 0000 0000001663 Funct Export Res -$LK,"OptPass4 ",A="FL:D:/Compiler/OptPass4.CPP.Z,171",BI=208$0000017F7E 0000 0000000F05 Funct Export Res -$LK,"OptPass5 ",A="FL:D:/Compiler/OptPass5.CPP.Z,1",BI=209$0000018E86 0000 000000043F Funct Export Res -$LK,"OptPass6 ",A="FL:D:/Compiler/OptPass6.CPP.Z,112",BI=210$0000019716 0000 00000004EA Funct Export Res -$LK,"OptPass6Lag ",A="FL:D:/Compiler/OptPass6.CPP.Z,28",BI=211$00000193EE 0001 0000000327 Funct Export Res -$LK,"OptPass789 ",A="FL:D:/Compiler/OptPass789.CPP.Z,1",BI=212$000002620E 0000 0000002E9E Funct Export Res -$LK,"OptSetNOP1 ",A="FL:D:/Compiler/OptLib.CPP.Z,17",BI=213$000000AF2E 0079 000000003A Funct Export Res -$LK,"OptSetNOP2 ",A="FL:D:/Compiler/OptLib.CPP.Z,25",BI=214$000000AF6E 000D 000000003C Funct Export Res -$LK,"PE_CHECK_BINARY_OPS1",A="FL:D:/Compiler/ExpParser.CPP.Z,43"$5 0001 0000000008 DefineStr -$LK,"PE_CHECK_BINARY_OPS2",A="FL:D:/Compiler/ExpParser.CPP.Z,44"$6 0001 0000000008 DefineStr -$LK,"PE_DEREFERENCE ",A="FL:D:/Compiler/ExpParser.CPP.Z,42"$4 0003 0000000008 DefineStr -$LK,"PE_DO_BINARY_OP ",A="FL:D:/Compiler/ExpParser.CPP.Z,46"$8 0001 0000000008 DefineStr -$LK,"PE_DO_UNARY_OP ",A="FL:D:/Compiler/ExpParser.CPP.Z,45"$7 0001 0000000008 DefineStr -$LK,"PE_MAYBE_MODIFIERS ",A="FL:D:/Compiler/ExpParser.CPP.Z,40"$2 000A 0000000008 DefineStr -$LK,"PE_POP_ALL1 ",A="FL:D:/Compiler/ExpParser.CPP.Z,49"$11 0001 0000000008 DefineStr -$LK,"PE_POP_ALL2 ",A="FL:D:/Compiler/ExpParser.CPP.Z,50"$12 0001 0000000008 DefineStr -$LK,"PE_POP_HIGHER ",A="FL:D:/Compiler/ExpParser.CPP.Z,47"$9 0001 0000000008 DefineStr -$LK,"PE_PUSH_LOWER ",A="FL:D:/Compiler/ExpParser.CPP.Z,48"$10 0001 0000000008 DefineStr -$LK,"PE_UNARY_MODIFIERS ",A="FL:D:/Compiler/ExpParser.CPP.Z,41"$3 0009 0000000008 DefineStr -$LK,"PE_UNARY_TERM1 ",A="FL:D:/Compiler/ExpParser.CPP.Z,38"$0 0001 0000000008 DefineStr -$LK,"PE_UNARY_TERM2 ",A="FL:D:/Compiler/ExpParser.CPP.Z,39"$1 0003 0000000008 DefineStr -$LK,"ParenWarning ",A="FL:D:/Compiler/ExpParser.CPP.Z,1",BI=215$000000BDB6 0004 000000004C Funct Export Res -$LK,"PrsAddOp ",A="FL:D:/Compiler/ExpParser.CPP.Z,52",BI=216$000000BEFE 0002 00000001EE Funct Export Res -$LK,"PrsArrayDims ",A="FL:D:/Compiler/StmtParser.CPP.Z,303",BI=217$000000FAAE 0001 000000012D Funct Export Res -$LK,"PrsAsmArg ",A="FL:D:/Compiler/Assembler.CPP.Z,428",BI=218$0000008470 0002 0000000424 Funct Export Res -$LK,"PrsAsmBlk ",A="FL:D:/Compiler/Assembler.CPP.Z,1277",BI=219$000000A5E6 0002 00000008ED Funct Export Res -$LK,"PrsAsmDefine ",A="FL:D:/Compiler/Assembler.CPP.Z,1188",BI=220$000000A286 0004 000000029D Funct Export Res -$LK,"PrsAsmImm ",A="FL:D:/Compiler/Assembler.CPP.Z,394",BI=221$0000008338 0006 0000000131 Funct Export Res -$LK,"PrsAsmInstruction ",A="FL:D:/Compiler/Assembler.CPP.Z,781",BI=222$000000918E 0001 00000010F3 Funct Export Res -$LK,"PrsBinFile ",A="FL:D:/Compiler/Assembler.CPP.Z,1261",BI=223$000000A526 0001 00000000BB Funct Export Res -$LK,"PrsClass ",A="FL:D:/Compiler/StmtParser.CPP.Z,785",BI=224$0000010B76 0002 0000000264 Funct Export Res -$LK,"PrsClassNew ",A="FL:D:/Compiler/StmtParser.CPP.Z,1",BI=225$000000EF56 0003 0000000068 Funct Export Res -$LK,"PrsDoWhile ",A="FL:D:/Compiler/StmtParser.CPP.Z,1281",BI=226$0000011F36 0001 0000000137 Funct Export Res -$LK,"PrsDotDotDot ",A="FL:D:/Compiler/StmtParser.CPP.Z,340",BI=227$000000FBDE 0001 0000000111 Funct Export Res -$LK,"PrsExpression ",A="FL:D:/Compiler/ExpParser.CPP.Z,298",BI=228$000000C756 0010 0000000149 Funct Export Res -$LK,"PrsExpression2 ",A="FL:D:/Compiler/ExpParser.CPP.Z,102",BI=229$000000C0EE 0001 0000000667 Funct Export Res -$LK,"PrsFor ",A="FL:D:/Compiler/StmtParser.CPP.Z,1305",BI=230$000001206E 0001 0000000162 Funct Export Res -$LK,"PrsFun ",A="FL:D:/Compiler/StmtParser.CPP.Z,914",BI=231$0000010FC6 0001 00000003B7 Funct Export Res -$LK,"PrsFunCall ",A="FL:D:/Compiler/ExpParser.CPP.Z,409",BI=232$000000CBF6 0003 000000082D Funct Export Res -$LK,"PrsFunJoin ",A="FL:D:/Compiler/StmtParser.CPP.Z,851",BI=233$0000010DDE 0005 00000001E8 Funct Export Res -$LK,"PrsFunNew ",A="FL:D:/Compiler/StmtParser.CPP.Z,22",BI=234$000000EFBE 0001 0000000068 Funct Export Res -$LK,"PrsGlblInit ",A="FL:D:/Compiler/StmtParser.CPP.Z,263",BI=235$000000F8EE 0002 000000007C Funct Export Res -$LK,"PrsGlblVarLst ",A="FL:D:/Compiler/StmtParser.CPP.Z,976",BI=236$000001137E 0007 0000000991 Funct Export Res -$LK,"PrsIf ",A="FL:D:/Compiler/StmtParser.CPP.Z,1231",BI=237$0000011D16 0001 000000012C Funct Export Res -$LK,"PrsKeyWord ",A="FL:D:/Compiler/StmtParser.CPP.Z,45",BI=238$000000F056 000C 0000000040 Funct Export Res -$LK,"PrsNoUnusedWarn ",A="FL:D:/Compiler/StmtParser.CPP.Z,1553",BI=239$0000012A66 0001 000000008F Funct Export Res -$LK,"PrsOffsetOf ",A="FL:D:/Compiler/ExpParser.CPP.Z,379",BI=240$000000CAAE 0002 0000000148 Funct Export Res -$LK,"PrsPop ",A="FL:D:/Compiler/ExpParser.CPP.Z,13",BI=241$000000BE2E 0017 0000000022 Funct Export Res -$LK,"PrsPop2 ",A="FL:D:/Compiler/ExpParser.CPP.Z,23",BI=242$000000BE8E 0001 000000002D Funct Export Res -$LK,"PrsPopDeref ",A="FL:D:/Compiler/ExpParser.CPP.Z,28",BI=243$000000BEBE 0004 000000003F Funct Export Res -$LK,"PrsPush ",A="FL:D:/Compiler/ExpParser.CPP.Z,8",BI=244$000000BE06 0017 0000000028 Funct Export Res -$LK,"PrsPush2 ",A="FL:D:/Compiler/ExpParser.CPP.Z,18",BI=245$000000BE56 0004 0000000033 Funct Export Res -$LK,"PrsSizeOf ",A="FL:D:/Compiler/ExpParser.CPP.Z,331",BI=246$000000C8A6 0001 0000000207 Funct Export Res -$LK,"PrsStatement ",A="FL:D:/Compiler/StmtParser.CPP.Z,1664",BI=247$0000012F66 0004 0000000C09 Funct Export Res -$LK,"PrsStaticInit ",A="FL:D:/Compiler/StmtParser.CPP.Z,272",BI=248$000000F96E 0002 000000013E Funct Export Res -$LK,"PrsStreamBlk ",A="FL:D:/Compiler/StmtParser.CPP.Z,1567",BI=249$0000012AF6 0000 00000001B2 Funct Export Res -$LK,"PrsSwitch ",A="FL:D:/Compiler/StmtParser.CPP.Z,1354",BI=250$00000121D6 0002 000000088F Funct Export Res -$LK,"PrsTryBlk ",A="FL:D:/Compiler/StmtParser.CPP.Z,1603",BI=251$0000012CAE 0001 00000002B7 Funct Export Res -$LK,"PrsType ",A="FL:D:/Compiler/StmtParser.CPP.Z,375",BI=252$000000FCF6 0002 000000039A Funct Export Res -$LK,"PrsUnaryModifier ",A="FL:D:/Compiler/ExpParser.CPP.Z,980",BI=253$000000E3B6 0000 0000000859 Funct Export Res -$LK,"PrsUnaryTerm ",A="FL:D:/Compiler/ExpParser.CPP.Z,617",BI=254$000000D426 0000 0000000F8E Funct Export Res -$LK,"PrsVarInit ",A="FL:D:/Compiler/StmtParser.CPP.Z,66",BI=255$000000F126 0001 00000004C8 Funct Export Res -$LK,"PrsVarInit2 ",A="FL:D:/Compiler/StmtParser.CPP.Z,181",BI=256$000000F5EE 0004 00000002FE Funct Export Res -$LK,"PrsVarLst ",A="FL:D:/Compiler/StmtParser.CPP.Z,469",BI=257$0000010096 0006 0000000ADC Funct Export Res -$LK,"PrsWhile ",A="FL:D:/Compiler/StmtParser.CPP.Z,1259",BI=258$0000011E46 0001 00000000EF Funct Export Res -$LK,"SLASH_OP_DEC ",A="FL:D:/Compiler/BackLib.CPP.Z,262"$0x052B0000 0006 0000000018 DefineStr -$LK,"SLASH_OP_DIV ",A="FL:D:/Compiler/BackLib.CPP.Z,267"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_FADD ",A="FL:D:/Compiler/BackLib.CPP.Z,271"$0x0000C1DE 0002 0000000018 DefineStr -$LK,"SLASH_OP_FDIV ",A="FL:D:/Compiler/BackLib.CPP.Z,275"$0x0000F9DE 0002 0000000018 DefineStr -$LK,"SLASH_OP_FDIVR ",A="FL:D:/Compiler/BackLib.CPP.Z,276"$0x0000F1DE 0003 0000000018 DefineStr -$LK,"SLASH_OP_FILD ",A="FL:D:/Compiler/BackLib.CPP.Z,280"$0x00000000 0002 0000000018 DefineStr -$LK,"SLASH_OP_FISTTP ",A="FL:D:/Compiler/BackLib.CPP.Z,279"$0x00000000 0002 0000000018 DefineStr -$LK,"SLASH_OP_FLD ",A="FL:D:/Compiler/BackLib.CPP.Z,277"$0x00000000 0008 0000000018 DefineStr -$LK,"SLASH_OP_FMUL ",A="FL:D:/Compiler/BackLib.CPP.Z,274"$0x0000C9DE 0002 0000000018 DefineStr -$LK,"SLASH_OP_FSTP ",A="FL:D:/Compiler/BackLib.CPP.Z,278"$0x00000000 000D 0000000018 DefineStr -$LK,"SLASH_OP_FSUB ",A="FL:D:/Compiler/BackLib.CPP.Z,272"$0x0000E9DE 0002 0000000018 DefineStr -$LK,"SLASH_OP_FSUBR ",A="FL:D:/Compiler/BackLib.CPP.Z,273"$0x0000E1DE 0003 0000000018 DefineStr -$LK,"SLASH_OP_IMUL ",A="FL:D:/Compiler/BackLib.CPP.Z,266"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_INC ",A="FL:D:/Compiler/BackLib.CPP.Z,261"$0x00030000 0004 0000000018 DefineStr -$LK,"SLASH_OP_MOV ",A="FL:D:/Compiler/BackLib.CPP.Z,268"$0x00000000 0002 0000000018 DefineStr -$LK,"SLASH_OP_MUL ",A="FL:D:/Compiler/BackLib.CPP.Z,265"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_NEG ",A="FL:D:/Compiler/BackLib.CPP.Z,264"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_NOT ",A="FL:D:/Compiler/BackLib.CPP.Z,263"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_POP ",A="FL:D:/Compiler/BackLib.CPP.Z,270"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_PUSH ",A="FL:D:/Compiler/BackLib.CPP.Z,269"$0x00000000 0001 0000000018 DefineStr -$LK,"StrMatchBits ",A="FL:D:/Compiler/Unassembler.CPP.Z,225",BI=259$0000000EC8 0002 0000000073 Funct Export Res -$LK,"StreamExePrint ",A="FL:D:/Compiler/CmpMain.CPP.Z,700",BI=260$000002C8EA 0000 00000000EC Funct Export Res -$LK,"StreamPrint ",A="FL:D:/Compiler/CmpMain.CPP.Z,1",BI=261$000002AD92 0000 00000000A8 Funct Export Res -$LK,"U ",A="FL:D:/Compiler/Unassembler.CPP.Z,643",BI=262$0000002600 0000 00000000CF Funct Export Res -$LK,"UasmHashLoad ",A="FL:D:/Compiler/Unassembler.CPP.Z,187",BI=263$0000000DB8 0001 0000000110 Funct Export Res -$LK,"Ui ",A="FL:D:/Compiler/Unassembler.CPP.Z,238",BI=264$0000000F40 0002 00000016C0 Funct Export Res -$LK,"Un ",A="FL:D:/Compiler/Unassembler.CPP.Z,658",BI=265$00000026D0 0008 00000000DA Funct Export Res -$LK,"UndefinedExtern ",A="FL:D:/Compiler/StmtParser.CPP.Z,54",BI=266$000000F096 0001 0000000048 Funct Export Res -$LK,"UnusedExternWarning ",A="FL:D:/Compiler/StmtParser.CPP.Z,60",BI=267$000000F0DE 0004 0000000043 Funct Export Res -$LK,"asm_seg_prefixes ",A="FL:D:/Compiler/Assembler.CPP.Z,779"$0000009188 0001 0000000006 GlbVar Export -$LK,"cmp ",A="FL:D:/Compiler/Compiler.PRJ.Z,13"$00000004E0 00E2 0000000229 GlbVar Export -$LK,"cmp_templates ",A="FL:D:/Compiler/CmpExts.CPP.Z,37"$0000000000 0002 0000000004 GlbVar Export -$LK,"cmp_templates_dont_pop",A="FL:D:/Compiler/CmpExts.CPP.Z,38"$000000018B 0002 0000000004 GlbVar Export -$LK,"cmp_templates_dont_push",A="FL:D:/Compiler/CmpExts.CPP.Z,40"$0000000257 0002 0000000004 GlbVar Export -$LK,"cmp_templates_dont_push2",A="FL:D:/Compiler/CmpExts.CPP.Z,39"$0000000421 0002 0000000004 GlbVar Export -$LK,"cmp_templates_dont_push_pop",A="FL:D:/Compiler/CmpExts.CPP.Z,41"$0000000391 0002 0000000004 GlbVar Export -$LK,"cmp_type_flags_src_code",A="FL:D:/Compiler/Lex.CPP.Z,390"$0000004A68 0001 0000000008 GlbVar Export -$LK,"internal_types_table",A="FL:D:/Compiler/CmpInit.CPP.Z,8"$00000290B0 0001 00000000AA GlbVar Export -$LK,"lex_zeros ",A="FL:D:/Compiler/Lex.CPP.Z,129"$0000003E48 000A 0000000004 GlbVar Export -$LK,"uasm ",A="FL:D:/Compiler/Compiler.PRJ.Z,14"$0000000710 001C 0000000028 GlbVar Export -ÈŠ00HS^gory}†—›¡¯ÌÙèíùþ€€€€#€€3€<€K€C€[€d€j€j€x€{€€˜€¡€¨€¬€±€¼€É€×€ó€ÿ€ÿ€((/KW_ry–¡¬±¸Õ‚ ‚ ‚‚‚&‚*‚?‚A‚R‚\‚g‚q‚€‚‚«‚«‚¯‚´‚4ƒ0DÌš“š“°“Ó˓ٓù“” -””,”?”P”V”k”‰”‰”ž”£”«”³”¹”Ñ”ä”ï”ó”ý”•••'•)•;•;•B•F•J•X•k•o•x••‘•‘•¤•·•½•Á•Ê•ç•ë•ë•ë•ë•ð•–– –.–I–Y–i–n–n–n–z–‚–Š––¥–­–»–Å–Ó–Ù–Û–Û–Û–Û–Û–Û–Û–Û–Û–ç–ï–÷–ý–———&—4—:—:—:—L—R—^—d—q—Œ—œ—¨—®—»—Í—Û—ú—˜Y™`½Ñ{{{{#{+{6{A{L{N{f{f{x{„{{{¿{ˆ =pupu„u‹u’u–uºuÍuÔuåu -vv v"v-vRv]vhvjvqvzv|v‡vŽv˜v¸v˜ú~~ ~'~.~1~:~=~@~D~I~i~V~y~~‰~Œ~Ž~ž~§~°~¶~¹~Ê~á~ò~ý~/ˆ9—˜ˆ˜ˆ²ˆ¹ˆÄˆãˆõˆ‰‰+‰=‰J‰J‰O‰V‰l‰~‰ƒ‰ž‰­‰¼‰Ë‰Ú‰ç‰ç‰ç‰ŠŠŠ/Š3ŠAŠPŠUŠUŠ\ŠrŠƒŠ…Š›Š³Š³Š³ŠÉŠÔŠêŠõŠ -‹‹'‹,‹D‹X‹]‹r‹w‹‹”‹¬‹±‹É‹Î‹æ‹è‹ŒŒŒŒ*Œ1ŒGŒGŒbŒzŒ’ŒªŒÀŒÀŒÜŒØDZ‘Z‘n‘n‘”‘”‘±‘µ‘º‘º‘º‘Ƒˑۑà‘à‘à‘å‘å‘û‘’’#’,’<’E’G’G’G’G’N’U’\’c’j’q’x’’†’†’ˆ’ˆ’Ž’“’•“´ÑúÀ{À{ã{ð{õ{ù{|||&|1|9|D|L|O|[|c|}|£||³|¼|ñ|Ý|}}}$}@}G}k}¤}¤}¤}¤}~ ¬ZÀwÀwÖwÝwäwòwxxxx$x4x?xIxTxkxnxpx‚xˆx˜x¢x¬x³x¾xÓxÛxÛxñxñxñxy -¬¨yyy%y,y:yKy]y_yfyly|y‡y‘yœy³y¶y¸yÊyÑyáyëyõyüyzz#z#z9z9z9zNz „=Z¸v¸vÑvØvßvævìvüvwww3w6w8wSw]wgwnwyw‹w“w“w©w©w»w d¨½PzPzpzwzzŠz”zŸz§z¶zÀzÃzçzézùzùz{ à— àŒàŒ #/:LL}˜¤«±½ÇÎÕÙÛáí÷þŽ Ž ŽŽŽ#Ž5Ž5ŽfŽ‡Ž“ŽšŽ Ž¬Ž¶Ž½ŽÄŽÈŽÊŽÐŽÜŽæŽíŽôŽøŽøŽ#55f‡“𠬶½ÄÈÊÐÜæíôøø$$U\bnx†ŠŒ’ž¨¯¶ººÄÛô‘‘‘‘‘†‘ˆ `t`t“tŸt§t¯t³t·tÂtÆtÊtÎtÖtÛtßtðtuuuu)u6uIuPuZuZuZuZulu$!&˜(˜(¢(ª(¯(lÇ^2¿2¿K¿c¿s¿“¿¥¿½¿Ø¿Ø¿À -ÀÀÀÀÀ$À'À.À4À;ÀAÀEÀJÀTÀeÀlÀsÀuÀyÀ‚ÀŒÀÀšÀ¦À©ÀºÀÅÀËÀÒÀÛÀôÀÁÁÁ Á*Á5ÁAÁRÁcÁoÁ}ÁÁ†ÁÁ’Á–Á£ÁªÁÍÁÛÁåÁïÁøÁÂ"Â+Â4Â<ÂEÂKÂOÂTÂXÂeÂlÂz„™£¬ÂÅÂÖÂßÂèÂðÂùÂÿÂÃÃÃÃ"Ã>ÃLÃRÃWÃ_ÃgÃoÃ|ÄÖõþÃÙÃíÃíà ÄÄÄ%Ä,Ä5Ä>ÄGÄPÄpÄtÄÎÄTª»úµúµ#¶%¶3¶9¶W¶f¶u¶„¶’¶¶ ¶°¶()/æ¼æ¼ô¼ ½½½½</:½½2½@½F½^½d½~½„½Š½Š½’½ ¼`r¨r¨€¨¨ ¨°¨À¨Шã¨ö¨©©'©=©O©Q©c©e©w©w©‰©‰©›©¹©¾©Ωä©ì©ö©ªª#ª9ªAªKªcªhªxªˆªžª¦ª°ªȪÔªܪæªöªûª««%«/«9«C«M«W«a«k«u««‰«“«©«³«½«Ç«Ñ«Û«å«ï«ù«¬¬#¬9¬C¬M¬W¬a¬k¬u¬¬‰¬“¬¬§¬±¬»¬ŬϬÙ¬ã¬í¬÷¬­ ­­ ­)­3­=­G­Q­[­e­Œ­D:ÇB»B»`»k»|»»ƒ»Œ»“»¡»°»Æ»Æ»Õ»×»×»æ»è»è»ø»ú»ú» -¼ ¼ ¼¼¼¼(¼*¼*¼9¼;¼;¼J¼J¼X¼\¼`¼e¼i¼v¼}¼‹¼Ÿ¼¨¼®¼¼¼Õ¼×¼Û¼å¼å¼ê¼ê¼ê¼ï¼ï¼þ¼½½%½%½%½*½*½?½K½V½[½[½^½c½c½½‹½˜½š½š½ž½ ½ ½¼½ȽÔ½Ö½Ö½Ù½Û½Û½è½ê½ê½í½í½ö½ü½¾¾¾¾¾¾¾¾¾¾¾¾¾ ¾ ¾.¾0¾0¾@¾B¾B¾O¾Q¾Q¾`¾`¾d¾d¾l¾ˆ¾Œ¾‘¾,¿ »:²¶²¶̶×¶Û¶ä¶ë¶ò¶··*·<·N·]·l·}·Œ·Œ·“·—· ·­·´·½·Ä·È·è·è·è·è·è·ô·ø·û·¸¸¸&¸.¸6¸G¸R¸W¸W¸d¸j¸y¸¸’¸¸ª¸¹¸¼¸¾¸Ö¸í¸ï¸ý¸ÿ¸ ¹¹¹¹¹-¹4¹J¹J¹J¹O¹O¹d¹r¹}¹‚¹‚¹…¹йй¦¹´¹Á¹ùùǹɹɹå¹ó¹ÿ¹ººººººººººººº!º'º+º7ºWºdºrºyºA»XÎàÚÉÚÉÞÉéÉôÉÿÉÊ ÊÊ'Ê8ÊFÊOÊTÊYÊ[Êø0ªr¯r¯z¯‰¯¯š¯§¯»¯ʯê¯÷¯ °+°K°Y°u°‡°Ÿ°¶°Á°â°±±*±5±P±i±i±„±­±DZâ±ô±²²²²0²A²T²d²q²|²‹²«²«²·²·²·²ȲÕ²ܲû²³³³³(³@³X³a³q³y³~³‘³µ³ųÕ³à³ô³ù³´'´)´4´g´´´™´¨´°´¿´È´дâ´µ µµµµ.µFµ^µvµ޵ µ·µÀµɵÛµéµíµôµÐ̼Z™Z™c™^™^™m™|™|™‹™‹™š™š™©™©™¸™¸™Ç™Ö™å™ô™ô™šš&š!š!š0šr¨Ü9î³î³´´N´_´_´z´€´…´…´ ´¦´«´«´´´´δÕ´Û´à´#µ-µ4µ:µ<µ<µOµUµUµUµZµvµ…µ—µœµœµœµ£µªµ±µƵ͵éµéµûµDS`ž°ž°²°º°Ç°Ñ°Ü°ä°˜#Ø8Ø8ë8ö8 9P9a9s9z99•9œ9ª9³9Ë9Ú9ç9ê9:: :":.:::>:L:S:V::4†¼†¼¼”¼¼¤¼¦¼«¼<)®¼®¼·¼¼¼Ê¼Ó¼Ú¼Ü¼á¼ @9Eþµþµ¶"¶&¶*¶/¶1¶M¶i¶i¶s¶ $&+°(°(º(Â(Ç(!<Š•ÒÆÒÆëÆúÆÇÇ#Ç)Ç,ÇMÇ"<±¼jÈjȃȒȦȳȹȿÈÂÈãÈ#4Š‚Æ‚Æ˜Æ«ÆºÆÀÆÃÆËÆ$4¨±"È"È8ÈKÈXÈ^ÈaÈiÈ%œ^ÒÄÒÄÚÄÞÄûÄÅ!Å>Å_ÅhÅyÅ Å·Å·ÅÙÅèÅñÅþÅÆ7ÆDÆHÆPÆPÆcÆsÆwÆ{Æ&\•¨RÇRÇoǃÇǚDZÇÎÇìÇòÇûÇ ÈÈÈÈ'$(((7(<((Œ XqXqhq‰q‰q—q—q—q—q q q§qÒqÚqÚqåqåqóqrrrrr/r/r5r[r)¤ E`r`rpryrŒr™r¥r±r½rÉràràrïrúrs -ss=sBsTscsos„s„s­s­s¯sÂsÄsÞsêsíst*LETtttt#t't,t6t:tHtQt\t+ð9VðVð€ðƒð†ðŒð‘ð¨ð¿ðÖðèðñ5ñ8ñQñhñzñ‡ñšñ­ñ²ñºñÄñÌñÌñÓñÜñÜñçñò)ò/òHòaòcò}òƒòœòµò½òÈòÈòÒòÒòäò"ó7óIó,E††¥ÁÆçžž2žFž^žežjž‹ž©ž¸žÕžæžýžŸŸŸ -ŸŸŸŸ&Ÿ,ŸIŸLŸLŸLŸQŸWŸsŸŸŸ–ŸªŸ²Ÿ»ŸןâŸîŸ÷Ÿ         - -8ùƒ^ ^  › Î ¨ Ô  - - - - -! -< -C -Q -S +$LK,"AsmGlblsResolve ",A="FL:C:/Compiler/Asm.CPP.Z,284",BI=1$0000008E88 0001 0000000432 Funct Export Res +$LK,"AsmHashLoad ",A="FL:C:/Compiler/CInit.CPP.Z,68",BI=2$000002A482 0001 00000005BD Funct Export Res +$LK,"AsmLexExpression ",A="FL:C:/Compiler/Asm.CPP.Z,189",BI=3$0000008A60 0004 00000000B7 Funct Export Res +$LK,"AsmLineLst ",A="FL:C:/Compiler/Asm.CPP.Z,31",BI=4$00000084C8 0001 0000000148 Funct Export Res +$LK,"AsmLocalsResolve ",A="FL:C:/Compiler/Asm.CPP.Z,250",BI=5$0000008D60 0003 0000000127 Funct Export Res +$LK,"AsmMakeArgMask ",A="FL:C:/Compiler/Asm.CPP.Z,567",BI=6$00000097F8 0002 0000000444 Funct Export Res +$LK,"AsmPrsInsFlags ",A="FL:C:/Compiler/CInit.CPP.Z,18",BI=7$000002A242 0001 000000023B Funct Export Res +$LK,"AsmResolve ",A="FL:C:/Compiler/Asm.CPP.Z,209",BI=8$0000008B18 0002 0000000245 Funct Export Res +$LK,"AsmStoreCodeU32 ",A="FL:C:/Compiler/Asm.CPP.Z,90",BI=9$0000008718 0001 0000000145 Funct Export Res +$LK,"AsmStoreCodeU64 ",A="FL:C:/Compiler/Asm.CPP.Z,129",BI=10$0000008860 0005 0000000146 Funct Export Res +$LK,"AsmStoreCodeU8 ",A="FL:C:/Compiler/Asm.CPP.Z,61",BI=11$0000008610 001D 0000000103 Funct Export Res +$LK,"AsmStoreCodeU8At ",A="FL:C:/Compiler/Asm.CPP.Z,168",BI=12$00000089A8 0007 00000000B7 Funct Export Res +$LK,"AsmStoreNum ",A="FL:C:/Compiler/Asm.CPP.Z,661",BI=13$0000009C40 0004 00000004A6 Funct Export Res +$LK,"AsmUnresolvedAdd ",A="FL:C:/Compiler/Asm.CPP.Z,1",BI=14$00000083B8 0004 000000010C Funct Export Res +$LK,"CInit ",A="FL:C:/Compiler/CMain.CPP.Z,695",BI=15$000002CF52 0001 000000006B Funct Export Res +$LK,"CInternalType ",A="FL:C:/Compiler/CInit.CPP.Z,3"$007FCC2180 0002 000000000A Class +$LK,"CMP_TEMPLATES ",A="FL:C:/Compiler/Templates.CPP.Z,5"$0000000000 0001 ExportSysSym Export +$LK,"CMP_TEMPLATES_DONT_POP",A="FL:C:/Compiler/Templates.CPP.Z,179"$000000018B 0001 ExportSysSym Export +$LK,"CMP_TEMPLATES_DONT_PUSH",A="FL:C:/Compiler/Templates.CPP.Z,268"$0000000257 0001 ExportSysSym Export +$LK,"CMP_TEMPLATES_DONT_PUSH2",A="FL:C:/Compiler/Templates.CPP.Z,459"$0000000421 0001 ExportSysSym Export +$LK,"CMP_TEMPLATES_DONT_PUSH_POP",A="FL:C:/Compiler/Templates.CPP.Z,395"$0000000391 0001 ExportSysSym Export +$LK,"CN_A1 ",A="FL:C:/Compiler/BackFA.CPP.Z,2"$1 0006 0000000008 DefineStr +$LK,"CN_A2 ",A="FL:C:/Compiler/BackFA.CPP.Z,1"$0 0005 0000000008 DefineStr +$LK,"CN_MAIN ",A="FL:C:/Compiler/BackFA.CPP.Z,3"$2 0022 0000000008 DefineStr +$LK,"CN_R ",A="FL:C:/Compiler/BackFA.CPP.Z,4"$3 0003 0000000008 DefineStr +$LK,"COptMemberVar ",A="FL:C:/Compiler/OptLib.CPP.Z,544"$007FD8D750 0005 0000000028 Class +$LK,"CSubSwitch ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1343"$007FD98150 0004 0000000020 Class +$LK,"CSwitchCase ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1348"$007FD868F0 0004 0000000020 Class +$LK,"CTrace ",A="FL:C:/Compiler/CMisc.CPP.Z,33",BI=16$0000002818 0000 0000000017 Funct Export Res +$LK,"CVI2 ",A="FL:C:/Compiler/PrsStmt.CPP.Z,177"$007FD9A0C0 0003 0000000010 Class +$LK,"Cmp ",A="FL:C:/Compiler/CMain.CPP.Z,432",BI=17$000002C4AA 0000 000000059A Funct Export Res +$LK,"CmpBuf ",A="FL:C:/Compiler/CMain.CPP.Z,171",BI=18$000002BB72 0001 00000000B6 Funct Export Res +$LK,"CmpF1PushPop ",A="FL:C:/Compiler/OptLib.CPP.Z,527",BI=19$000000CCE6 0002 0000000042 Funct Export Res +$LK,"CmpF2PushPop ",A="FL:C:/Compiler/OptLib.CPP.Z,533",BI=20$000000CD2E 0005 0000000096 Funct Export Res +$LK,"CmpFillTables ",A="FL:C:/Compiler/CInit.CPP.Z,235",BI=21$000002AF3A 0001 00000003C3 Funct Export Res +$LK,"CmpFixUpAOTAsm ",A="FL:C:/Compiler/CMain.CPP.Z,315",BI=22$000002C0BA 0000 00000003EA Funct Export Res +$LK,"CmpFixUpJITAsm ",A="FL:C:/Compiler/CMain.CPP.Z,188",BI=23$000002BC2A 0000 000000048C Funct Export Res +$LK,"CmpJoin ",A="FL:C:/Compiler/CMain.CPP.Z,49",BI=24$000002B4EA 0001 0000000682 Funct Export Res +$LK,"CmpLoadDefines ",A="FL:C:/Compiler/CInit.CPP.Z,204",BI=25$000002AA42 0001 00000004F1 Funct Export Res +$LK,"CmpNoteFloatOp ",A="FL:C:/Compiler/BackFA.CPP.Z,6",BI=26$000001C43E 000E 000000020D Funct Export Res +$LK,"CmpOffset2Reg ",A="FL:C:/Compiler/OptLib.CPP.Z,83",BI=27$000000C05E 0005 0000000046 Funct Export Res +$LK,"CmpPrompt ",A="FL:C:/Compiler/Lex.CPP.Z,1",BI=28$0000004A69 0001 00000001B5 Funct Export Res +$LK,"CmpRawType ",A="FL:C:/Compiler/OptLib.CPP.Z,507",BI=29$000000CC8E 0006 0000000025 Funct Export Res +$LK,"CmpRawTypePointed ",A="FL:C:/Compiler/OptLib.CPP.Z,516",BI=30$000000CCB6 0005 0000000030 Funct Export Res +$LK,"CmpSetFloatOpPushPop",A="FL:C:/Compiler/BackFA.CPP.Z,57",BI=31$000001C64E 000C 0000000075 Funct Export Res +$LK,"Echo ",A="FL:C:/Compiler/CMisc.CPP.Z,38",BI=32$0000002830 0000 0000000017 Funct Export Res +$LK,"ExeFile ",A="FL:C:/Compiler/CMain.CPP.Z,627",BI=33$000002CC4A 0000 000000007B Funct Export Res +$LK,"ExeFile2 ",A="FL:C:/Compiler/CMain.CPP.Z,666",BI=34$000002CDE2 0000 0000000079 Funct Export Res +$LK,"ExePrint ",A="FL:C:/Compiler/CMain.CPP.Z,618",BI=35$000002CBFA 0000 0000000049 Funct Export Res +$LK,"ExePrint2 ",A="FL:C:/Compiler/CMain.CPP.Z,657",BI=36$000002CD9A 0000 0000000047 Funct Export Res +$LK,"ExePutS ",A="FL:C:/Compiler/CMain.CPP.Z,583",BI=37$000002CA4A 0003 00000001A9 Funct Export Res +$LK,"ExePutS2 ",A="FL:C:/Compiler/CMain.CPP.Z,638",BI=38$000002CCCA 0002 00000000CC Funct Export Res +$LK,"FBO1_F64 ",A="FL:C:/Compiler/OptLib.CPP.Z,94"$2 0002 0000000008 DefineStr +$LK,"FBO1_INT ",A="FL:C:/Compiler/OptLib.CPP.Z,93"$1 0013 0000000008 DefineStr +$LK,"FBO1_NOT_CONST ",A="FL:C:/Compiler/OptLib.CPP.Z,92"$0 0005 0000000008 DefineStr +$LK,"GetOpt ",A="FL:C:/Compiler/CMisc.CPP.Z,16",BI=39$0000002790 0004 000000002C Funct Export Res +$LK,"HashEntrySize ",A="FL:C:/Compiler/CHash.CPP.Z,1",BI=40$0000008098 0000 0000000103 Funct Export Res +$LK,"HashEntrySize2 ",A="FL:C:/Compiler/CHash.CPP.Z,32",BI=41$00000081A0 0002 00000001A1 Funct Export Res +$LK,"HashTableSize2 ",A="FL:C:/Compiler/CHash.CPP.Z,69",BI=42$0000008348 0000 000000006F Funct Export Res +$LK,"ICAddEct ",A="FL:C:/Compiler/BackA.CPP.Z,1",BI=43$00000200A6 0005 00000002F3 Funct Export Res +$LK,"ICAddRSP ",A="FL:C:/Compiler/BackLib.CPP.Z,69",BI=44$000001ADD6 0017 00000002A7 Funct Export Res +$LK,"ICAddSubEctEqual ",A="FL:C:/Compiler/BackA.CPP.Z,501",BI=45$00000219AE 0005 0000000673 Funct Export Res +$LK,"ICAddSubEctImm ",A="FL:C:/Compiler/BackA.CPP.Z,57",BI=46$000002039E 000D 0000000685 Funct Export Res +$LK,"ICAndAnd ",A="FL:C:/Compiler/BackB.CPP.Z,30",BI=47$000002264E 0001 000000014B Funct Export Res +$LK,"ICAndBranch ",A="FL:C:/Compiler/BackC.CPP.Z,1",BI=48$00000249C6 0002 00000006E6 Funct Export Res +$LK,"ICAndEqual ",A="FL:C:/Compiler/BackC.CPP.Z,675",BI=49$00000268A6 0001 000000010D Funct Export Res +$LK,"ICArgPut ",A="FL:C:/Compiler/CMisc.CPP.Z,267",BI=50$0000003B19 0003 00000002D6 Funct Export Res +$LK,"ICAssign ",A="FL:C:/Compiler/BackC.CPP.Z,159",BI=51$00000250AE 0001 0000000301 Funct Export Res +$LK,"ICAssignPostIncDec ",A="FL:C:/Compiler/BackB.CPP.Z,534",BI=52$0000023C9E 0002 000000020D Funct Export Res +$LK,"ICBitOps ",A="FL:C:/Compiler/BackB.CPP.Z,244",BI=53$0000022F46 0007 00000004F1 Funct Export Res +$LK,"ICBrBitOps ",A="FL:C:/Compiler/BackC.CPP.Z,207",BI=54$00000253B6 0008 00000009FB Funct Export Res +$LK,"ICBuiltInFloatConst ",A="FL:C:/Compiler/BackLib.CPP.Z,420",BI=55$000001B916 000F 00000000BD Funct Export Res +$LK,"ICClassPut ",A="FL:C:/Compiler/CMisc.CPP.Z,243",BI=56$0000003A49 0001 00000000D0 Funct Export Res +$LK,"ICCmp ",A="FL:C:/Compiler/BackB.CPP.Z,124",BI=57$0000022A5E 0006 00000004E6 Funct Export Res +$LK,"ICCmpAndBranch ",A="FL:C:/Compiler/BackB.CPP.Z,575",BI=58$0000023EAE 000C 000000081A Funct Export Res +$LK,"ICCopyTemplate ",A="FL:C:/Compiler/BackFA.CPP.Z,69",BI=59$000001C6C6 0013 000000021D Funct Export Res +$LK,"ICDeref ",A="FL:C:/Compiler/BackLib.CPP.Z,656",BI=60$000001C37E 0001 00000000B9 Funct Export Res +$LK,"ICDerefPostIncDec ",A="FL:C:/Compiler/BackB.CPP.Z,491",BI=61$0000023AA6 0002 00000001F1 Funct Export Res +$LK,"ICDiv ",A="FL:C:/Compiler/BackA.CPP.Z,409",BI=62$00000214DE 0001 00000000F1 Funct Export Res +$LK,"ICDivEqual ",A="FL:C:/Compiler/BackA.CPP.Z,428",BI=63$00000215D6 0002 00000002DE Funct Export Res +$LK,"ICFAdd ",A="FL:C:/Compiler/BackFB.CPP.Z,633",BI=64$000001FA66 0001 00000001FF Funct Export Res +$LK,"ICFCmp ",A="FL:C:/Compiler/BackFA.CPP.Z,549",BI=65$000001DA3E 0004 000000018B Funct Export Res +$LK,"ICFCmpAndBranch ",A="FL:C:/Compiler/BackFB.CPP.Z,325",BI=66$000001EE9E 0004 00000009F7 Funct Export Res +$LK,"ICFCvt ",A="FL:C:/Compiler/BackFA.CPP.Z,115",BI=67$000001C8E6 000C 000000017F Funct Export Res +$LK,"ICFCvt2 ",A="FL:C:/Compiler/BackFA.CPP.Z,163",BI=68$000001CA66 0010 0000000116 Funct Export Res +$LK,"ICFDiv ",A="FL:C:/Compiler/BackFB.CPP.Z,621",BI=69$000001F9B6 0001 00000000A9 Funct Export Res +$LK,"ICFMod ",A="FL:C:/Compiler/BackFA.CPP.Z,241",BI=70$000001CD5E 0001 0000000145 Funct Export Res +$LK,"ICFModEqual ",A="FL:C:/Compiler/BackFA.CPP.Z,589",BI=71$000001DBCE 0001 00000003D7 Funct Export Res +$LK,"ICFMul ",A="FL:C:/Compiler/BackFB.CPP.Z,603",BI=72$000001F896 0001 000000011B Funct Export Res +$LK,"ICFOp ",A="FL:C:/Compiler/BackFA.CPP.Z,350",BI=73$000001D19E 0004 000000089D Funct Export Res +$LK,"ICFOpEqual ",A="FL:C:/Compiler/BackFB.CPP.Z,1",BI=74$000001DFA6 0004 0000000EF7 Funct Export Res +$LK,"ICFPostIncDec ",A="FL:C:/Compiler/BackFB.CPP.Z,716",BI=75$000001FE9E 0002 0000000151 Funct Export Res +$LK,"ICFPow ",A="FL:C:/Compiler/BackFA.CPP.Z,271",BI=76$000001CEA6 0001 00000002F7 Funct Export Res +$LK,"ICFPreIncDec ",A="FL:C:/Compiler/BackFB.CPP.Z,694",BI=77$000001FD8E 0002 000000010A Funct Export Res +$LK,"ICFSub ",A="FL:C:/Compiler/BackFB.CPP.Z,671",BI=78$000001FC66 0001 0000000124 Funct Export Res +$LK,"ICFTemplateFun ",A="FL:C:/Compiler/BackFB.CPP.Z,744",BI=79$000001FFF6 0007 00000000AA Funct Export Res +$LK,"ICFUnaryMinus ",A="FL:C:/Compiler/BackFA.CPP.Z,190",BI=80$000001CB7E 0001 00000001E0 Funct Export Res +$LK,"ICFlagBranch ",A="FL:C:/Compiler/BackB.CPP.Z,804",BI=81$00000248BE 0004 0000000106 Funct Export Res +$LK,"ICLastIns ",A="FL:C:/Compiler/BackLib.CPP.Z,59",BI=82$000001AD96 0002 0000000040 Funct Export Res +$LK,"ICLea ",A="FL:C:/Compiler/BackLib.CPP.Z,622",BI=83$000001C1CE 0004 00000001AA Funct Export Res +$LK,"ICLocalVarInit ",A="FL:C:/Compiler/BackC.CPP.Z,908",BI=84$00000272C6 0001 0000000078 Funct Export Res +$LK,"ICMinMax ",A="FL:C:/Compiler/BackC.CPP.Z,496",BI=85$000002617E 0004 00000002AB Funct Export Res +$LK,"ICMod ",A="FL:C:/Compiler/BackA.CPP.Z,482",BI=86$00000218B6 0001 00000000F1 Funct Export Res +$LK,"ICModU64 ",A="FL:C:/Compiler/BackC.CPP.Z,575",BI=87$000002647E 0001 00000001B7 Funct Export Res +$LK,"ICModr1 ",A="FL:C:/Compiler/BackLib.CPP.Z,140",BI=88$000001B07E 0017 00000002FE Funct Export Res +$LK,"ICModr2 ",A="FL:C:/Compiler/BackLib.CPP.Z,230",BI=89$000001B37E 0016 00000000A6 Funct Export Res +$LK,"ICMov ",A="FL:C:/Compiler/BackLib.CPP.Z,442",BI=90$000001B9D6 019A 00000007F4 Funct Export Res +$LK,"ICMul ",A="FL:C:/Compiler/BackA.CPP.Z,285",BI=91$0000020E1E 0001 00000002B8 Funct Export Res +$LK,"ICMulEqual ",A="FL:C:/Compiler/BackA.CPP.Z,342",BI=92$00000210D6 0001 0000000406 Funct Export Res +$LK,"ICNot ",A="FL:C:/Compiler/BackB.CPP.Z,10",BI=93$000002254E 0001 00000000FF Funct Export Res +$LK,"ICOpSizeRex ",A="FL:C:/Compiler/BackLib.CPP.Z,28",BI=94$000001ACAE 0006 0000000040 Funct Export Res +$LK,"ICOrEqual ",A="FL:C:/Compiler/BackC.CPP.Z,698",BI=95$00000269B6 0001 000000010D Funct Export Res +$LK,"ICOrOr ",A="FL:C:/Compiler/BackB.CPP.Z,59",BI=96$000002279E 0001 0000000162 Funct Export Res +$LK,"ICPop ",A="FL:C:/Compiler/BackLib.CPP.Z,361",BI=97$000001B71E 0009 00000000EA Funct Export Res +$LK,"ICPopRegs ",A="FL:C:/Compiler/BackLib.CPP.Z,388",BI=98$000001B80E 000C 0000000057 Funct Export Res +$LK,"ICPostIncDec ",A="FL:C:/Compiler/BackB.CPP.Z,451",BI=99$00000238A6 0002 00000001FC Funct Export Res +$LK,"ICPreIncDec ",A="FL:C:/Compiler/BackB.CPP.Z,415",BI=100$00000236CE 0004 00000001D8 Funct Export Res +$LK,"ICPreempt ",A="FL:C:/Compiler/BackB.CPP.Z,348",BI=101$000002343E 0001 0000000122 Funct Export Res +$LK,"ICPush ",A="FL:C:/Compiler/BackLib.CPP.Z,310",BI=102$000001B56E 001F 0000000152 Funct Export Res +$LK,"ICPushRegs ",A="FL:C:/Compiler/BackLib.CPP.Z,348",BI=103$000001B6C6 0006 0000000054 Funct Export Res +$LK,"ICPut ",A="FL:C:/Compiler/CMisc.CPP.Z,312",BI=104$0000003DF1 0008 00000003DD Funct Export Res +$LK,"ICQueInit ",A="FL:C:/Compiler/BackC.CPP.Z,384",BI=105$0000025DB6 0001 0000000070 Funct Export Res +$LK,"ICQueIns ",A="FL:C:/Compiler/BackC.CPP.Z,398",BI=106$0000025E26 0001 0000000162 Funct Export Res +$LK,"ICQueInsRev ",A="FL:C:/Compiler/BackC.CPP.Z,439",BI=107$0000025F8E 0001 0000000162 Funct Export Res +$LK,"ICQueRem ",A="FL:C:/Compiler/BackC.CPP.Z,480",BI=108$00000260F6 0001 0000000088 Funct Export Res +$LK,"ICRex ",A="FL:C:/Compiler/BackLib.CPP.Z,22",BI=109$000001AC7E 0016 000000002D Funct Export Res +$LK,"ICShift ",A="FL:C:/Compiler/BackA.CPP.Z,639",BI=110$0000022026 0004 00000001A3 Funct Export Res +$LK,"ICShiftEqual ",A="FL:C:/Compiler/BackA.CPP.Z,672",BI=111$00000221CE 0002 000000030E Funct Export Res +$LK,"ICSlashOp ",A="FL:C:/Compiler/BackLib.CPP.Z,282",BI=112$000001B426 0027 0000000145 Funct Export Res +$LK,"ICSqr ",A="FL:C:/Compiler/BackC.CPP.Z,568",BI=113$000002642E 0002 000000004A Funct Export Res +$LK,"ICSub ",A="FL:C:/Compiler/BackA.CPP.Z,207",BI=114$0000020A26 0001 00000003F5 Funct Export Res +$LK,"ICSwap ",A="FL:C:/Compiler/BackC.CPP.Z,617",BI=115$0000026636 0001 000000026E Funct Export Res +$LK,"ICSwitch ",A="FL:C:/Compiler/BackC.CPP.Z,744",BI=116$0000026BCE 0002 00000006F2 Funct Export Res +$LK,"ICTest ",A="FL:C:/Compiler/BackLib.CPP.Z,410",BI=117$000001B8C6 000C 000000004E Funct Export Res +$LK,"ICTestAndBranch ",A="FL:C:/Compiler/BackB.CPP.Z,756",BI=118$00000246CE 0002 00000001EC Funct Export Res +$LK,"ICToBool ",A="FL:C:/Compiler/BackB.CPP.Z,400",BI=119$0000023656 0001 0000000075 Funct Export Res +$LK,"ICToF64 ",A="FL:C:/Compiler/BackB.CPP.Z,395",BI=120$0000023616 0001 000000003D Funct Export Res +$LK,"ICToI64 ",A="FL:C:/Compiler/BackB.CPP.Z,390",BI=121$00000235D6 0001 000000003D Funct Export Res +$LK,"ICToUpper ",A="FL:C:/Compiler/BackB.CPP.Z,379",BI=122$0000023566 0001 000000006B Funct Export Res +$LK,"ICU16 ",A="FL:C:/Compiler/BackLib.CPP.Z,35",BI=123$000001ACEE 0092 0000000029 Funct Export Res +$LK,"ICU24 ",A="FL:C:/Compiler/BackLib.CPP.Z,41",BI=124$000001AD1E 0063 0000000026 Funct Export Res +$LK,"ICU32 ",A="FL:C:/Compiler/BackLib.CPP.Z,47",BI=125$000001AD46 0054 0000000026 Funct Export Res +$LK,"ICU64 ",A="FL:C:/Compiler/BackLib.CPP.Z,53",BI=126$000001AD6E 0009 0000000028 Funct Export Res +$LK,"ICU8 ",A="FL:C:/Compiler/BackLib.CPP.Z,17",BI=127$000001AC56 0063 0000000028 Funct Export Res +$LK,"ICUnaries ",A="FL:C:/Compiler/BackB.CPP.Z,1",BI=128$00000224DE 0002 0000000069 Funct Export Res +$LK,"ICXorEqual ",A="FL:C:/Compiler/BackC.CPP.Z,721",BI=129$0000026AC6 0001 0000000107 Funct Export Res +$LK,"ICXorXor ",A="FL:C:/Compiler/BackB.CPP.Z,91",BI=130$0000022906 0001 0000000155 Funct Export Res +$LK,"ICZero ",A="FL:C:/Compiler/BackLib.CPP.Z,401",BI=131$000001B866 0017 000000005E Funct Export Res +$LK,"InstEntriesCompare ",A="FL:C:/Compiler/UAsm.CPP.Z,1",BI=132$00000006F0 0001 00000002A9 Funct Export Res +$LK,"InstEntryFind ",A="FL:C:/Compiler/UAsm.CPP.Z,72",BI=133$00000009A0 0002 00000003C9 Funct Export Res +$LK,"IsLexExpression2Bin ",A="FL:C:/Compiler/PrsExp.CPP.Z,1153",BI=134$000000FCCE 0000 0000000029 Funct Export Res +$LK,"LCCAdd ",A="FL:C:/Compiler/CMisc.CPP.Z,396",BI=135$0000004249 00A9 000000009F Funct Export Res +$LK,"LCCAppend ",A="FL:C:/Compiler/CMisc.CPP.Z,435",BI=136$0000004371 0003 00000000A6 Funct Export Res +$LK,"LCCCompile ",A="FL:C:/Compiler/CMisc.CPP.Z,552",BI=137$00000047A1 0006 00000002C7 Funct Export Res +$LK,"LCCDel ",A="FL:C:/Compiler/CMisc.CPP.Z,495",BI=138$0000004591 0001 0000000164 Funct Export Res +$LK,"LCCFloatConstFind ",A="FL:C:/Compiler/CMisc.CPP.Z,473",BI=139$00000044C9 000F 00000000C6 Funct Export Res +$LK,"LCCGoToLabelFind ",A="FL:C:/Compiler/CMisc.CPP.Z,461",BI=140$0000004471 0006 0000000057 Funct Export Res +$LK,"LCCHeaderPut ",A="FL:C:/Compiler/CMisc.CPP.Z,538",BI=141$00000046F9 000C 00000000A2 Funct Export Res +$LK,"LCCInit ",A="FL:C:/Compiler/CMisc.CPP.Z,388",BI=142$0000004209 000A 000000003A Funct Export Res +$LK,"LCCMiscNew ",A="FL:C:/Compiler/CMisc.CPP.Z,452",BI=143$0000004419 0021 0000000055 Funct Export Res +$LK,"LCCPop ",A="FL:C:/Compiler/CMisc.CPP.Z,430",BI=144$0000004351 0008 000000001A Funct Export Res +$LK,"LCCPopNoFree ",A="FL:C:/Compiler/CMisc.CPP.Z,423",BI=145$0000004321 0003 000000002E Funct Export Res +$LK,"LCCPush ",A="FL:C:/Compiler/CMisc.CPP.Z,416",BI=146$00000042E9 000E 0000000037 Funct Export Res +$LK,"LCCQuePut ",A="FL:C:/Compiler/CMisc.CPP.Z,378",BI=147$00000041D1 0001 0000000038 Funct Export Res +$LK,"Lex ",A="FL:C:/Compiler/Lex.CPP.Z,694",BI=148$0000006548 00ED 0000001746 Funct Export Res +$LK,"LexAttachDoc ",A="FL:C:/Compiler/Lex.CPP.Z,389",BI=149$0000005BC8 0001 0000000163 Funct Export Res +$LK,"LexBackupLastChar ",A="FL:C:/Compiler/Lex.CPP.Z,131",BI=150$0000004FE0 0003 0000000041 Funct Export Res +$LK,"LexD2I32 ",A="FL:C:/Compiler/PrsExp.CPP.Z,1198",BI=151$000000FDEE 0000 00000000A6 Funct Export Res +$LK,"LexD3I32 ",A="FL:C:/Compiler/PrsExp.CPP.Z,1214",BI=152$000000FE96 0000 00000000D9 Funct Export Res +$LK,"LexDel ",A="FL:C:/Compiler/Lex.CPP.Z,66",BI=153$0000004D61 0004 00000000A5 Funct Export Res +$LK,"LexDocRead ",A="FL:C:/Compiler/Lex.CPP.Z,368",BI=154$0000005B38 0001 0000000085 Funct Export Res +$LK,"LexDollar ",A="FL:C:/Compiler/Lex.CPP.Z,142",BI=155$0000005028 0003 0000000070 Funct Export Res +$LK,"LexExcept ",A="FL:C:/Compiler/Lex.CPP.Z,1532",BI=156$0000007FA8 00B8 00000000ED Funct Export Res +$LK,"LexExpression ",A="FL:C:/Compiler/PrsExp.CPP.Z,1186",BI=157$000000FDAE 0002 000000003F Funct Export Res +$LK,"LexExpression2Bin ",A="FL:C:/Compiler/PrsExp.CPP.Z,1135",BI=158$000000FC36 0006 0000000094 Funct Export Res +$LK,"LexExpressionF64 ",A="FL:C:/Compiler/PrsExp.CPP.Z,1172",BI=159$000000FD56 0000 0000000054 Funct Export Res +$LK,"LexExpressionI64 ",A="FL:C:/Compiler/PrsExp.CPP.Z,1158",BI=160$000000FCFE 000A 0000000054 Funct Export Res +$LK,"LexExtStr ",A="FL:C:/Compiler/Lex.CPP.Z,1449",BI=161$0000007C90 0004 00000000C5 Funct Export Res +$LK,"LexFirstRem ",A="FL:C:/Compiler/Lex.CPP.Z,328",BI=162$00000059E0 0000 00000000BC Funct Export Res +$LK,"LexGetChar ",A="FL:C:/Compiler/Lex.CPP.Z,156",BI=163$0000005098 002C 0000000915 Funct Export Res +$LK,"LexInStr ",A="FL:C:/Compiler/Lex.CPP.Z,624",BI=164$00000062E8 0001 000000025B Funct Export Res +$LK,"LexIncludeStr ",A="FL:C:/Compiler/Lex.CPP.Z,350",BI=165$0000005AA0 0003 0000000098 Funct Export Res +$LK,"LexNew ",A="FL:C:/Compiler/Lex.CPP.Z,35",BI=166$0000004C21 0004 000000013D Funct Export Res +$LK,"LexPop ",A="FL:C:/Compiler/Lex.CPP.Z,446",BI=167$0000005DB8 0004 0000000074 Funct Export Res +$LK,"LexPush ",A="FL:C:/Compiler/Lex.CPP.Z,434",BI=168$0000005D30 000F 0000000081 Funct Export Res +$LK,"LexPutLine ",A="FL:C:/Compiler/Lex.CPP.Z,1474",BI=169$0000007D58 0003 000000009B Funct Export Res +$LK,"LexPutPos ",A="FL:C:/Compiler/Lex.CPP.Z,1502",BI=170$0000007DF8 0003 00000000CA Funct Export Res +$LK,"LexPutToken ",A="FL:C:/Compiler/Lex.CPP.Z,108",BI=171$0000004EA9 0001 000000012B Funct Export Res +$LK,"LexSize ",A="FL:C:/Compiler/Lex.CPP.Z,88",BI=172$0000004E09 0000 000000009B Funct Export Res +$LK,"LexSkipEol ",A="FL:C:/Compiler/Lex.CPP.Z,321",BI=173$00000059B0 0004 000000002B Funct Export Res +$LK,"LexStatement2Bin ",A="FL:C:/Compiler/CMain.CPP.Z,15",BI=174$000002B3AA 0001 0000000140 Funct Export Res +$LK,"LexWarn ",A="FL:C:/Compiler/Lex.CPP.Z,1516",BI=175$0000007EC8 0009 00000000D9 Funct Export Res +$LK,"MDR_D32_INDIRECT_REG",A="FL:C:/Compiler/BackLib.CPP.Z,134"$3 0002 0000000008 DefineStr +$LK,"MDR_D8_INDIRECT_REG ",A="FL:C:/Compiler/BackLib.CPP.Z,133"$2 0002 0000000008 DefineStr +$LK,"MDR_INDIRECT_REG ",A="FL:C:/Compiler/BackLib.CPP.Z,132"$1 0002 0000000008 DefineStr +$LK,"MDR_REG ",A="FL:C:/Compiler/BackLib.CPP.Z,131"$0 0002 0000000008 DefineStr +$LK,"MDR_RIP_REL ",A="FL:C:/Compiler/BackLib.CPP.Z,138"$7 0004 0000000008 DefineStr +$LK,"MDR_SIB_D32_INDIRECT_REG",A="FL:C:/Compiler/BackLib.CPP.Z,137"$6 0003 0000000008 DefineStr +$LK,"MDR_SIB_D8_INDIRECT_REG",A="FL:C:/Compiler/BackLib.CPP.Z,136"$5 0002 0000000008 DefineStr +$LK,"MDR_SIB_INDIRECT_REG",A="FL:C:/Compiler/BackLib.CPP.Z,135"$4 0002 0000000008 DefineStr +$LK,"MemberAdd ",A="FL:C:/Compiler/Lex.CPP.Z,515",BI=176$0000005F68 0004 00000001B7 Funct Export Res +$LK,"MemberFind ",A="FL:C:/Compiler/Lex.CPP.Z,480",BI=177$0000005EB8 0005 0000000064 Funct Export Res +$LK,"MemberFind2 ",A="FL:C:/Compiler/Lex.CPP.Z,500",BI=178$0000005F20 0001 0000000044 Funct Export Res +$LK,"MemberLstDel ",A="FL:C:/Compiler/Lex.CPP.Z,563",BI=179$0000006120 0001 00000000F3 Funct Export Res +$LK,"MemberLstNew ",A="FL:C:/Compiler/PrsStmt.CPP.Z,38",BI=180$0000010046 0003 000000002A Funct Export Res +$LK,"MemberLstSize ",A="FL:C:/Compiler/Lex.CPP.Z,597",BI=181$0000006218 0002 00000000CF Funct Export Res +$LK,"MemberMetaData ",A="FL:C:/Compiler/Lex.CPP.Z,458",BI=182$0000005E30 0000 0000000041 Funct Export Res +$LK,"MemberMetaFind ",A="FL:C:/Compiler/Lex.CPP.Z,469",BI=183$0000005E78 0000 0000000040 Funct Export Res +$LK,"NUM_INTERNAL_TYPES ",A="FL:C:/Compiler/CInit.CPP.Z,1"$17 0002 0000000008 DefineStr +$LK,"OTrace ",A="FL:C:/Compiler/CMisc.CPP.Z,21",BI=184$00000027C0 0000 0000000017 Funct Export Res +$LK,"OTraceMask ",A="FL:C:/Compiler/CMisc.CPP.Z,26",BI=185$00000027D8 0000 0000000039 Funct Export Res +$LK,"OptBrNotZero ",A="FL:C:/Compiler/OptLib.CPP.Z,357",BI=186$000000C83E 0004 00000003B5 Funct Export Res +$LK,"OptBrZero ",A="FL:C:/Compiler/OptLib.CPP.Z,230",BI=187$000000C476 0006 00000003C4 Funct Export Res +$LK,"OptClassFwd ",A="FL:C:/Compiler/OptLib.CPP.Z,9",BI=188$000000BEC6 0013 0000000028 Funct Export Res +$LK,"OptEqu ",A="FL:C:/Compiler/CMisc.CPP.Z,1",BI=189$0000002730 0005 000000002E Funct Export Res +$LK,"OptFixSizeOf ",A="FL:C:/Compiler/OptLib.CPP.Z,484",BI=190$000000CBF6 0003 0000000098 Funct Export Res +$LK,"OptFixupBinaryOp1 ",A="FL:C:/Compiler/OptLib.CPP.Z,96",BI=191$000000C0A6 0013 00000002B0 Funct Export Res +$LK,"OptFixupBinaryOp2 ",A="FL:C:/Compiler/OptLib.CPP.Z,181",BI=192$000000C356 0001 0000000054 Funct Export Res +$LK,"OptFixupUnaryOp ",A="FL:C:/Compiler/OptLib.CPP.Z,195",BI=193$000000C3AE 0003 00000000C8 Funct Export Res +$LK,"OptFree ",A="FL:C:/Compiler/OptLib.CPP.Z,33",BI=194$000000BF6E 0024 0000000024 Funct Export Res +$LK,"OptIC4 ",A="FL:C:/Compiler/OptPass4.CPP.Z,1",BI=195$0000018AAE 0001 00000005CD Funct Export Res +$LK,"OptIC6 ",A="FL:C:/Compiler/OptPass6.CPP.Z,1",BI=196$000001A3EE 0001 0000000128 Funct Export Res +$LK,"OptLabelFwd ",A="FL:C:/Compiler/OptLib.CPP.Z,1",BI=197$000000BE9E 0010 0000000028 Funct Export Res +$LK,"OptLag ",A="FL:C:/Compiler/OptLib.CPP.Z,40",BI=198$000000BF96 000E 000000002A Funct Export Res +$LK,"OptLag1 ",A="FL:C:/Compiler/OptLib.CPP.Z,51",BI=199$000000BFC6 0006 0000000031 Funct Export Res +$LK,"OptLag2 ",A="FL:C:/Compiler/OptLib.CPP.Z,62",BI=200$000000BFFE 0003 000000002A Funct Export Res +$LK,"OptLead1 ",A="FL:C:/Compiler/OptLib.CPP.Z,73",BI=201$000000C02E 0003 0000000030 Funct Export Res +$LK,"OptMVCompare ",A="FL:C:/Compiler/OptLib.CPP.Z,550",BI=202$000000CDC6 0001 000000001A Funct Export Res +$LK,"OptOff ",A="FL:C:/Compiler/CMisc.CPP.Z,11",BI=203$0000002778 0000 0000000016 Funct Export Res +$LK,"OptOn ",A="FL:C:/Compiler/CMisc.CPP.Z,6",BI=204$0000002760 0000 0000000016 Funct Export Res +$LK,"OptPass012 ",A="FL:C:/Compiler/OptPass012.CPP.Z,23",BI=205$0000014BAE 0000 00000027E8 Funct Export Res +$LK,"OptPass3 ",A="FL:C:/Compiler/OptPass3.CPP.Z,1",BI=206$0000017396 0000 0000001717 Funct Export Res +$LK,"OptPass4 ",A="FL:C:/Compiler/OptPass4.CPP.Z,171",BI=207$000001907E 0000 0000000F16 Funct Export Res +$LK,"OptPass5 ",A="FL:C:/Compiler/OptPass5.CPP.Z,1",BI=208$0000019F96 0000 0000000457 Funct Export Res +$LK,"OptPass6 ",A="FL:C:/Compiler/OptPass6.CPP.Z,111",BI=209$000001A84E 0000 0000000402 Funct Export Res +$LK,"OptPass6Lag ",A="FL:C:/Compiler/OptPass6.CPP.Z,28",BI=210$000001A516 0001 0000000338 Funct Export Res +$LK,"OptPass789A ",A="FL:C:/Compiler/OptPass789A.CPP.Z,1",BI=211$000002733E 0000 0000002E58 Funct Export Res +$LK,"OptSetNOP1 ",A="FL:C:/Compiler/OptLib.CPP.Z,17",BI=212$000000BEEE 0079 000000003A Funct Export Res +$LK,"OptSetNOP2 ",A="FL:C:/Compiler/OptLib.CPP.Z,25",BI=213$000000BF2E 000D 000000003C Funct Export Res +$LK,"PE_CHECK_BINARY_OPS1",A="FL:C:/Compiler/PrsExp.CPP.Z,43"$5 0001 0000000008 DefineStr +$LK,"PE_CHECK_BINARY_OPS2",A="FL:C:/Compiler/PrsExp.CPP.Z,44"$6 0001 0000000008 DefineStr +$LK,"PE_DEREFERENCE ",A="FL:C:/Compiler/PrsExp.CPP.Z,42"$4 0003 0000000008 DefineStr +$LK,"PE_DO_BINARY_OP ",A="FL:C:/Compiler/PrsExp.CPP.Z,46"$8 0001 0000000008 DefineStr +$LK,"PE_DO_UNARY_OP ",A="FL:C:/Compiler/PrsExp.CPP.Z,45"$7 0001 0000000008 DefineStr +$LK,"PE_MAYBE_MODIFIERS ",A="FL:C:/Compiler/PrsExp.CPP.Z,40"$2 000A 0000000008 DefineStr +$LK,"PE_POP_ALL1 ",A="FL:C:/Compiler/PrsExp.CPP.Z,49"$11 0001 0000000008 DefineStr +$LK,"PE_POP_ALL2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,50"$12 0001 0000000008 DefineStr +$LK,"PE_POP_HIGHER ",A="FL:C:/Compiler/PrsExp.CPP.Z,47"$9 0001 0000000008 DefineStr +$LK,"PE_PUSH_LOWER ",A="FL:C:/Compiler/PrsExp.CPP.Z,48"$10 0001 0000000008 DefineStr +$LK,"PE_UNARY_MODIFIERS ",A="FL:C:/Compiler/PrsExp.CPP.Z,41"$3 0009 0000000008 DefineStr +$LK,"PE_UNARY_TERM1 ",A="FL:C:/Compiler/PrsExp.CPP.Z,38"$0 0001 0000000008 DefineStr +$LK,"PE_UNARY_TERM2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,39"$1 0003 0000000008 DefineStr +$LK,"ParenWarning ",A="FL:C:/Compiler/PrsExp.CPP.Z,1",BI=214$000000CDE6 0004 000000004C Funct Export Res +$LK,"PrsAddOp ",A="FL:C:/Compiler/PrsExp.CPP.Z,52",BI=215$000000CF2E 0002 00000001EB Funct Export Res +$LK,"PrsArrayDims ",A="FL:C:/Compiler/PrsStmt.CPP.Z,305",BI=216$0000010ADE 0001 000000012D Funct Export Res +$LK,"PrsAsmArg ",A="FL:C:/Compiler/Asm.CPP.Z,430",BI=217$00000093F8 0004 00000003FE Funct Export Res +$LK,"PrsAsmBlk ",A="FL:C:/Compiler/Asm.CPP.Z,1278",BI=218$000000B55E 0002 000000093F Funct Export Res +$LK,"PrsAsmDefine ",A="FL:C:/Compiler/Asm.CPP.Z,1189",BI=219$000000B1FE 0004 000000029D Funct Export Res +$LK,"PrsAsmImm ",A="FL:C:/Compiler/Asm.CPP.Z,396",BI=220$00000092C0 0002 0000000131 Funct Export Res +$LK,"PrsAsmInstruction ",A="FL:C:/Compiler/Asm.CPP.Z,779",BI=221$000000A0EE 0001 0000001110 Funct Export Res +$LK,"PrsBinFile ",A="FL:C:/Compiler/Asm.CPP.Z,1262",BI=222$000000B49E 0001 00000000B9 Funct Export Res +$LK,"PrsClass ",A="FL:C:/Compiler/PrsStmt.CPP.Z,786",BI=223$0000011B9E 0002 0000000261 Funct Export Res +$LK,"PrsClassNew ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1",BI=224$000000FF76 0003 0000000068 Funct Export Res +$LK,"PrsDoWhile ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1283",BI=225$0000012F46 0001 0000000137 Funct Export Res +$LK,"PrsDotDotDot ",A="FL:C:/Compiler/PrsStmt.CPP.Z,342",BI=226$0000010C0E 0001 0000000111 Funct Export Res +$LK,"PrsExpression ",A="FL:C:/Compiler/PrsExp.CPP.Z,298",BI=227$000000D7DE 0010 000000014C Funct Export Res +$LK,"PrsExpression2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,102",BI=228$000000D11E 0001 00000006BB Funct Export Res +$LK,"PrsFor ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1306",BI=229$000001307E 0001 0000000162 Funct Export Res +$LK,"PrsFun ",A="FL:C:/Compiler/PrsStmt.CPP.Z,915",BI=230$0000011FEE 0001 00000003C9 Funct Export Res +$LK,"PrsFunCall ",A="FL:C:/Compiler/PrsExp.CPP.Z,409",BI=231$000000DC7E 0003 000000082D Funct Export Res +$LK,"PrsFunJoin ",A="FL:C:/Compiler/PrsStmt.CPP.Z,852",BI=232$0000011E06 0005 00000001E8 Funct Export Res +$LK,"PrsFunNew ",A="FL:C:/Compiler/PrsStmt.CPP.Z,22",BI=233$000000FFDE 0001 0000000068 Funct Export Res +$LK,"PrsGlblInit ",A="FL:C:/Compiler/PrsStmt.CPP.Z,265",BI=234$0000010926 0002 0000000076 Funct Export Res +$LK,"PrsGlblVarLst ",A="FL:C:/Compiler/PrsStmt.CPP.Z,981",BI=235$00000123BE 0007 0000000967 Funct Export Res +$LK,"PrsIf ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1236",BI=236$0000012D26 0001 000000012C Funct Export Res +$LK,"PrsKeyWord ",A="FL:C:/Compiler/PrsStmt.CPP.Z,45",BI=237$0000010076 000C 0000000040 Funct Export Res +$LK,"PrsNoUnusedWarn ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1554",BI=238$0000013A76 0001 000000008F Funct Export Res +$LK,"PrsOffsetOf ",A="FL:C:/Compiler/PrsExp.CPP.Z,379",BI=239$000000DB36 0002 0000000148 Funct Export Res +$LK,"PrsPop ",A="FL:C:/Compiler/PrsExp.CPP.Z,13",BI=240$000000CE5E 0016 0000000022 Funct Export Res +$LK,"PrsPop2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,23",BI=241$000000CEBE 0001 000000002D Funct Export Res +$LK,"PrsPopDeref ",A="FL:C:/Compiler/PrsExp.CPP.Z,28",BI=242$000000CEEE 0004 000000003F Funct Export Res +$LK,"PrsPush ",A="FL:C:/Compiler/PrsExp.CPP.Z,8",BI=243$000000CE36 0017 0000000028 Funct Export Res +$LK,"PrsPush2 ",A="FL:C:/Compiler/PrsExp.CPP.Z,18",BI=244$000000CE86 0004 0000000033 Funct Export Res +$LK,"PrsSizeOf ",A="FL:C:/Compiler/PrsExp.CPP.Z,331",BI=245$000000D92E 0001 0000000207 Funct Export Res +$LK,"PrsStatement ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1665",BI=246$0000013F7E 0004 0000000C2C Funct Export Res +$LK,"PrsStaticInit ",A="FL:C:/Compiler/PrsStmt.CPP.Z,274",BI=247$000001099E 0002 000000013E Funct Export Res +$LK,"PrsStreamBlk ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1568",BI=248$0000013B06 0000 00000001B2 Funct Export Res +$LK,"PrsSwitch ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1355",BI=249$00000131E6 0002 000000088F Funct Export Res +$LK,"PrsTryBlk ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1604",BI=250$0000013CBE 0001 00000002BD Funct Export Res +$LK,"PrsType ",A="FL:C:/Compiler/PrsStmt.CPP.Z,377",BI=251$0000010D26 0002 0000000391 Funct Export Res +$LK,"PrsUnaryModifier ",A="FL:C:/Compiler/PrsExp.CPP.Z,980",BI=252$000000F3E6 0000 000000084A Funct Export Res +$LK,"PrsUnaryTerm ",A="FL:C:/Compiler/PrsExp.CPP.Z,617",BI=253$000000E4AE 0000 0000000F38 Funct Export Res +$LK,"PrsVarInit ",A="FL:C:/Compiler/PrsStmt.CPP.Z,66",BI=254$0000010146 0001 00000004DA Funct Export Res +$LK,"PrsVarInit2 ",A="FL:C:/Compiler/PrsStmt.CPP.Z,183",BI=255$0000010626 0004 00000002FE Funct Export Res +$LK,"PrsVarLst ",A="FL:C:/Compiler/PrsStmt.CPP.Z,471",BI=256$00000110BE 0006 0000000AD9 Funct Export Res +$LK,"PrsWhile ",A="FL:C:/Compiler/PrsStmt.CPP.Z,1263",BI=257$0000012E56 0001 00000000EF Funct Export Res +$LK,"SLASH_OP_DEC ",A="FL:C:/Compiler/BackLib.CPP.Z,262"$0x052B0000 0006 0000000018 DefineStr +$LK,"SLASH_OP_DIV ",A="FL:C:/Compiler/BackLib.CPP.Z,267"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_FADD ",A="FL:C:/Compiler/BackLib.CPP.Z,271"$0x0000C1DE 0002 0000000018 DefineStr +$LK,"SLASH_OP_FDIV ",A="FL:C:/Compiler/BackLib.CPP.Z,275"$0x0000F9DE 0002 0000000018 DefineStr +$LK,"SLASH_OP_FDIVR ",A="FL:C:/Compiler/BackLib.CPP.Z,276"$0x0000F1DE 0003 0000000018 DefineStr +$LK,"SLASH_OP_FILD ",A="FL:C:/Compiler/BackLib.CPP.Z,280"$0x00000000 0002 0000000018 DefineStr +$LK,"SLASH_OP_FISTTP ",A="FL:C:/Compiler/BackLib.CPP.Z,279"$0x00000000 0002 0000000018 DefineStr +$LK,"SLASH_OP_FLD ",A="FL:C:/Compiler/BackLib.CPP.Z,277"$0x00000000 0008 0000000018 DefineStr +$LK,"SLASH_OP_FMUL ",A="FL:C:/Compiler/BackLib.CPP.Z,274"$0x0000C9DE 0002 0000000018 DefineStr +$LK,"SLASH_OP_FSTP ",A="FL:C:/Compiler/BackLib.CPP.Z,278"$0x00000000 000D 0000000018 DefineStr +$LK,"SLASH_OP_FSUB ",A="FL:C:/Compiler/BackLib.CPP.Z,272"$0x0000E9DE 0002 0000000018 DefineStr +$LK,"SLASH_OP_FSUBR ",A="FL:C:/Compiler/BackLib.CPP.Z,273"$0x0000E1DE 0003 0000000018 DefineStr +$LK,"SLASH_OP_IMUL ",A="FL:C:/Compiler/BackLib.CPP.Z,266"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_INC ",A="FL:C:/Compiler/BackLib.CPP.Z,261"$0x00030000 0004 0000000018 DefineStr +$LK,"SLASH_OP_MOV ",A="FL:C:/Compiler/BackLib.CPP.Z,268"$0x00000000 0002 0000000018 DefineStr +$LK,"SLASH_OP_MUL ",A="FL:C:/Compiler/BackLib.CPP.Z,265"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_NEG ",A="FL:C:/Compiler/BackLib.CPP.Z,264"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_NOT ",A="FL:C:/Compiler/BackLib.CPP.Z,263"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_POP ",A="FL:C:/Compiler/BackLib.CPP.Z,270"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_PUSH ",A="FL:C:/Compiler/BackLib.CPP.Z,269"$0x00000000 0001 0000000018 DefineStr +$LK,"StrMatchBits ",A="FL:C:/Compiler/UAsm.CPP.Z,229",BI=258$0000000EC8 0002 0000000073 Funct Export Res +$LK,"StreamDir ",A="FL:C:/Compiler/CMisc.CPP.Z,43",BI=259$0000002848 0000 000000004E Funct Export Res +$LK,"StreamExePrint ",A="FL:C:/Compiler/CMain.CPP.Z,677",BI=260$000002CE62 0000 00000000EC Funct Export Res +$LK,"StreamPrint ",A="FL:C:/Compiler/CMain.CPP.Z,1",BI=261$000002B302 0000 00000000A8 Funct Export Res +$LK,"U ",A="FL:C:/Compiler/UAsm.CPP.Z,640",BI=262$0000002580 0000 00000000CF Funct Export Res +$LK,"UasmHashLoad ",A="FL:C:/Compiler/UAsm.CPP.Z,187",BI=263$0000000D70 0001 0000000154 Funct Export Res +$LK,"Ui ",A="FL:C:/Compiler/UAsm.CPP.Z,242",BI=264$0000000F40 0002 000000163B Funct Export Res +$LK,"Un ",A="FL:C:/Compiler/UAsm.CPP.Z,655",BI=265$0000002650 0008 00000000DA Funct Export Res +$LK,"UndefinedExtern ",A="FL:C:/Compiler/PrsStmt.CPP.Z,54",BI=266$00000100B6 0001 0000000048 Funct Export Res +$LK,"UnusedExternWarning ",A="FL:C:/Compiler/PrsStmt.CPP.Z,60",BI=267$00000100FE 0004 0000000043 Funct Export Res +$LK,"asm_seg_prefixes ",A="FL:C:/Compiler/Asm.CPP.Z,777"$000000A0E8 0001 0000000006 GlbVar Export +$LK,"cmp ",A="FL:C:/Compiler/Compiler.PRJ.Z,16"$00000004E0 00C0 00000001E1 GlbVar Export +$LK,"cmp_templates ",A="FL:C:/Compiler/CExts.CPP.Z,38"$0000000000 0002 0000000004 GlbVar Export +$LK,"cmp_templates_dont_pop",A="FL:C:/Compiler/CExts.CPP.Z,39"$000000018B 0002 0000000004 GlbVar Export +$LK,"cmp_templates_dont_push",A="FL:C:/Compiler/CExts.CPP.Z,41"$0000000257 0002 0000000004 GlbVar Export +$LK,"cmp_templates_dont_push2",A="FL:C:/Compiler/CExts.CPP.Z,40"$0000000421 0002 0000000004 GlbVar Export +$LK,"cmp_templates_dont_push_pop",A="FL:C:/Compiler/CExts.CPP.Z,42"$0000000391 0002 0000000004 GlbVar Export +$LK,"cmp_type_flags_src_code",A="FL:C:/Compiler/Lex.CPP.Z,386"$0000005BC0 0001 0000000008 GlbVar Export +$LK,"intermediate_code_table",A="FL:C:/Compiler/CMisc.CPP.Z,52"$0000002898 0014 0000000BB0 GlbVar Export +$LK,"internal_types_table",A="FL:C:/Compiler/CInit.CPP.Z,8"$000002A198 0001 00000000AA GlbVar Export +$LK,"lex_zeros ",A="FL:C:/Compiler/Lex.CPP.Z,129"$0000004FDC 000A 0000000004 GlbVar Export +$LK,"uasm ",A="FL:C:/Compiler/Compiler.PRJ.Z,17"$00000006C8 001C 0000000028 GlbVar Export +Ì‹ˆŽˆŽ¢Ž­Ž¸ŽÁŽÉŽÌŽÓŽ×ŽàŽñŽõŽûŽ %,7<HMT`ehrj‚‹š’ª³¹¹ÇÊÞçð÷û/8Fbnn†——žºÆÎáèü‘‘‘‘'‘2‘L‘}‘†‘Ž‘‘›‘§‘«‘¼‘¾‘ϑّä‘î‘ý‘ ’(’(’+’3’8’º’,DË‚¤‚¤˜¤«¤³¤Á¤ߤê¤ð¤ý¤¥%¥6¥<¥Q¥o¥o¥„¥‰¥‘¥™¥Ÿ¥·¥Ê¥Õ¥Ù¥ã¥ø¥þ¥¦ ¦¦!¦!¦(¦,¦0¦>¦Q¦U¦^¦s¦w¦w¦Ц¦£¦§¦°¦ͦѦѦѦѦÖ¦è¦÷¦§§/§?§O§T§T§T§`§h§p§v§‹§“§¡§«§¹§¿§Á§Á§Á§Á§Á§Á§Á§Á§Á§ͧÕ§ݧã§ø§¨¨ ¨¨ ¨ ¨ ¨2¨8¨D¨J¨W¨r¨‚¨ލ”¨¡¨³¨Á¨à¨©?ª\½Ð`Š`ŠnŠpŠ{ŠƒŠŽŠ™Š¤Š¦Š¾Š¾ŠÐŠÜŠåŠèŠ‹„ <ȄȄ܄ã„ê„î„…%…,…=…b…m…x…z………ª…µ…À…Â…É…Ò…Ô…ß…æ…ð…†”ú``x†‰’•˜œ¡Á®ÑÙáäæöÿŽŽŽ"Ž9ŽJŽUއŽ„7”ø—ø—˜˜$˜C˜U˜g˜y˜‹˜˜ª˜ª˜¯˜¶˜Ì˜Þ˜ã˜þ˜ ™™+™:™G™G™G™g™g™}™™“™¡™°™µ™µ™¼™Ò™ã™å™û™ššš)š4šJšUšjšoš‡šŒš¤š¸š½šÒš×šïšôš ››)›.›F›H›a›r›r›t›Š›‘›§›§›Â›Ú›ò› +œ œ œ<œÔCB¢B¢V¢V¢|¢|¢™¢¢¢¢¢¢¢¢®¢³¢âȢȢȢ͢͢ã¢ê¢ý¢ ££$£-£/£/£/£/£6£=£D£K£R£Y£`£g£n£n£p£p£v£{£}¤°Ñù‹‹;‹H‹M‹Q‹Z‹g‹s‹~‹‰‹‘‹œ‹¤‹§‹³‹»‹Õ‹û‹õ‹ ŒŒIŒ5ŒYŒYŒqŒ|Œ˜ŒŸŒÃŒüŒüŒüŒüŒ] ¨Z€‡‡.‡5‡<‡J‡[‡m‡o‡v‡|‡Œ‡—‡¡‡¬‡Ã‡Æ‡È‡Ú‡à‡ð‡ú‡ˆ ˆˆ+ˆ3ˆ3ˆIˆIˆIˆ]ˆ +¨§`ˆ`ˆvˆ}ˆ„ˆ’ˆ£ˆµˆ·ˆ¾ˆÄˆÔˆßˆéˆôˆ ‰‰‰"‰)‰9‰C‰M‰T‰_‰s‰{‰{‰‘‰‘‰‘‰¦‰ €=Y††)†0†7†>†D†T†_†i†t†‹†Ž††«†µ†¿†Æ†Ñ†ã†ë†ë†‡‡‡ `¨¼¨‰¨‰È‰Ï‰×‰â‰ì‰÷‰ÿ‰ŠŠŠ?ŠAŠQŠQŠ_Š Ü•@œ@œeœlœƒœœšœ¬œ¬œÝœøœ '.59;AMW^eiisxƒ••Æçóúž žžž$ž(ž*ž0ž<žFžMžTžXžXžežsžƒž•ž•žÆžçžóžúžŸ ŸŸŸ$Ÿ(Ÿ*Ÿ0Ÿ<ŸFŸMŸTŸXŸXŸbŸrŸ„Ÿ„ŸµŸ¼ŸÂŸÎŸØŸßŸæŸêŸìŸòŸþŸ     $ ; T ` d d g p æ „¸ƒ¸ƒëƒ÷ƒÿƒ„ „„„„"„&„.„3„7„H„Y„[„_„p„„Ž„¡„¨„²„²„²„²„Ä„L·ÆRÏRÏVÏaÏhÏmÏrÏ‰ÏšÏ¨Ï±Ï¶Ï»Ï½Ï !%(("(*(/(h°FªÄªÄÃÄÛÄëÄ ÅÅ5ÅPÅPÅzłņʼnÅŒŜşŦŬųŹŽÅÂÅÌÅÝÅäÅëÅíÅñÅúÅÆÆÆÆ!Æ2Æ=ÆCÆJÆSÆlÆ}Æ†ÆÆ—ƢƭƹÆÊÆÛÆçÆõÆ÷ÆþÆÇ +ÇÇÇ"ÇEÇSÇ]ÇgÇpljǚǣǬǴǽÇÃÇÇÇÌÇÐÇÝÇäÇòÇüÇÈÈ$È=ÈNÈWÈ`ÈhÈqÈwÈ{ȀȆÈȚȶÈÄÈÊÈÏÈ×ÈßÈçÈôÈüÈÉ-É6ÉQÉeÉeɂɉɒɛɢɫɴɽɯɿÉêÉDÊP«»r»r»›»»«»±»Ï»Þ»í»ü» +¼¼¼(¼$æÌæÌôÌÍ"Í"Í(Í8 .Í.ÍBÍPÍVÍͅͰͶͼͼÍÄÍ8ëu:¯:¯F¯V¯l¯t¯~¯–¯›¯«¯Á¯ɯÓ¯ë¯ð¯°°&°.°8°P°\°d°n°~°ƒ°™°£°­°·°Á°˰Õ°ß°é°ó°ý°±±±1±;±E±O±Y±c±m±w±±—±¡±«±Á±˱ձ߱é±ó±ý±²²²%²/²9²C²M²W²a²k²u²²‰²“²²§²±²»²ŲϲÙ²ã²í²ý²à;¯ºÀºÀØÀãÀôÀ÷ÀûÀÁ ÁÁ(Á>ÁOÁ`ÁrÁ„Á“Á¢Á³ÁÂÁÂÁÐÁÔÁØÁÝÁáÁîÁõÁ Â&Â4ÂMÂOÂSÂ]Â]ÂbÂbÂbÂgÂgÂv‡Â¢¢·ÂÃÂÎÂÓÂÓÂÖÂÛÂÛÂ÷ÂÃÃÃÃÃÃÃ4Ã@ÃLÃNÃNÃQÃSÃSÃ`ÃbÃbÃeÃeÃnÃtÃyÕÕÕÕÕÕÕÕÕÕÕÕ×èúÃÉÃØÃØÃÜÃÜÃäÃÄÄ Ä¤Ä¼:*¼*¼D¼O¼S¼\¼c¼j¼€¼‘¼¢¼´¼ƼÕ¼ä¼õ¼½½ ½½½%½,½5½<½@½`½`½`½`½`½l½p½s½{½‰½‘½ž½¦½®½¿½ʽϽϽܽâ½ñ½¾ +¾¾"¾1¾4¾6¾N¾e¾g¾u¾w¾‚¾ˆ¾ˆ¾¾¾¢¾©¾¿¾¿¾¿¾ľľÙ¾ç¾ò¾÷¾÷¾ú¾ÿ¾ÿ¾¿)¿6¿8¿8¿<¿>¿>¿Z¿h¿t¿v¿v¿y¿{¿{¿ˆ¿Š¿Š¿¿¿¿¿¿–¿œ¿ ¿¬¿Ì¿Ù¿ç¿î¿¶Àô1ªê´ê´ò´µµµ µ3µBµbµoµµ£µõѵíµÿµ¶.¶9¶Z¶x¶‡¶¢¶­¶ȶá¶á¶ü¶%·?·Z·l·{·Š·Š·•·¨·¹·Ì·Ü·é·ô·¸#¸#¸/¸/¸/¸@¸M¸T¸s¸|¸‰¸¸•¸ ¸¸¸иÙ¸é¸ñ¸ö¸ ¹-¹=¹M¹X¹l¹q¹y¹Ÿ¹¡¹¬¹ß¹ù¹ù¹º º(º7º@ºHºZºyºº‰º”º–º¦º¾ºÖºîº»»/»8»A»S»a»e»l»ˆÌêBªBªKªFªFªUªdªdªsªsª‚ª‚ª‘ª‘ª ª ª¯ª¾ªͪܪܪëªúª «3¯Ø8>Ä>ÄfÄiĞįįÄÊÄÐÄÕÄÕÄðÄöÄûÄûÄÅÅÅ%Å+Å0ÅsÅ}Å„ÅŠÅŒÅŒÅŸÅ¥Å¥Å¥ÅªÅÆÅÕÅçÅìÅìÅìÅóÅúÅÆÆÆ9Æ9ÆKÆ0S[^À^ÀrÀzÀ‡À‘À¤À”"iJiJ|J‡J±JáJòJK KK&K-K;KDK\KkKxK{K”K—KœK³K¿KËKÏKÝKäKçKL0ûŽÌŽÌ—̜̥̬̮̳Ì8¶Ì¶Ì¿ÌÄÌÏÌØÌßÌáÌæÌ <9DNÆNÆhÆrÆvÆzÆÆÆÆ¹Æ¹ÆÃÆ &*0(0(:(B(G(!8s}JÌJÌcÌr̡̛̤̆̕ÌÅÌ"8š¤âÍâÍûÍ +ÎÎ+Î1Î7Î:Î[Î#0jrúËúËÌ#Ì2Ì8Ì;ÌCÌ$0‘™šÍšÍ°ÍÃÍÐÍÖÍÙÍáÍ%˜GiJÊJÊRÊVÊsʆʙʶÊ×ÊàÊñÊË/Ë/ËQË`ËiËvË}˯˼ËÀËÈËÈËÛËëËïËóË&X~ÊÌÊÌçÌûÌÍÍ)ÍFÍdÍjÍsÍ͇͖͊Í' ''™'·'¼'(ˆ ˜€˜€¨€É€É€×€×€×€×€à€à€ç€%%3CCQWWoou›)  D  °¹ÌÙåñý ‚ ‚ ‚/‚:‚C‚J‚S‚}‚‚‚”‚£‚¯‚Á‚Á‚ê‚ê‚ì‚ÿ‚ƒƒ'ƒ*ƒAƒ*TEVHƒHƒZƒ]ƒfƒoƒ}ƒ‚ƒ‹ƒŽƒ“ƒ¡ƒªƒ·ƒ+ì8¦¦ÐÓÖÜáø&8^…ˆ¡¸Ê×êý +#,,7_y˜±³ÍÓì ""4r‡™,üE€Ö­Ö­õ­®®7®U®d®‚®–®®®µ®º®Û®ù®¯%¯6¯M¯Q¯Q¯U¯Z¯_¯i¯l¯v¯|¯™¯œ¯œ¯œ¯¡¯§¯ïѯݯæ¯ú¯° °'°2°>°G°[°[°j°o°o°}°-4õ~®®àëø$RWW[eqŒ“¡£«Åàòÿ+07\clnt‡¥·ÄÜò$69;A]uw¡¤¦¬ÈÈÈÚÚèò//48T`{˜¢¦¶Éàãõ *.DWnqƒ¡«´ËÕ×ëõ     " 5 M O g z ‘ — © ± Ò é é é   ! .d9ΞžÔÛãìý + "%)2@JOw|‰µºÇçìû'/4Iu}‚‚•¨¸¼Ûìññ#8;>BBGot}Š’­¿Ì×õõõ(?AANeev{›­¿ÝÝÝê'))6MM^fk‘£µÓÓÓà÷ùù   2 4 ; ] { € ‡ • Ÿ ¡ ¡ ¡ ½ Å Ç Ç é # +/€:N&N&b&i&u&…&¤&ª&±&Ð&Ò&ñ&ý& ','2'9'9'A'I'T'\'g'r'‘'™'0„žÆIÆIäIöIüIJ +J JJJJJ9J=JCJCJ[JoJ€J€JˆJ¬JÌJíJòJKK$K/K4KAKDK{KŒK‘K—K™KŸK¢K³K¸K»KÃKÌKçKLL1L6L:L\LoLtL‹LžL£L§LÉLäLMMM-M2M5M7M=MCMTMYM_MgMgMqMzM‘M¤M©M­MÏMêM +NN"N=N]NtN‡NŒNN²NÅNÅNàNàNàNîNOOOOO.O0O0O>OVOVOhOhOqO~O”O´OÎOÕOßOòOöOöOöOýOPP$P.PFPHPNPhPoPyP‡P’P’P¬P1h£¹¦h¦h¼hÈhÞhëhõhii!i'iFi:iWiYiYiŠixiYi©i³i2À 7;;";I;7;);j;z;l;›;¾;¾;Î;Ó;Ó;ç;ì;ì;< < <-<2<2<F<K<K<h<h<v<š<À<à<ò<==&=&=&=&=&=ï=3̟ήP®PÂPáPÍPQQ Q&Q`QeQ‘Q‘Q–Q¬Q¾QÔQêQR,RdRPRRŒR¸R½RäRìRSòR!S:S&SZSFSnS{S§S§S§S§S¯S4°>ž<ž<´<¼<Ç<Ó<Þ<à< ===6=C=n=™=“=‡=±=Ó=ë=Ø=þ=÷=> +>1>>>i>‚>|>p>Ž>¡>¡>¡>«>5¬ô[F/F/l/Œ/”/Ÿ/®/·/»/Æ/Ñ/æ/ë/0$0*0/0B0x0Ž0”0œ0Ÿ0¤0·0á0÷0ý0111(1-1J1i1o1w1w1|1‚1…11›1°1µ1Ï1î1ô1ù122"2'2F2N2S2^2s2|2~22¥2°2Å2Ê2ä23 333333"37373O3Z3m3z3’3¦3·3Á3Ã3×3è3í3ø3%4%4%4746Ð϶S¶SÔSäSïSúS?TfT„T®T´TºTÂTÄTÌTçTêTõTUFUmU‹UµU»UÁUÉUÎUÖUñUôUÿU VVUV|VšVÄVÊVÐVØVÚVâVýVW WW\WƒW¡WËWÑW×WßWäWìWX +XX!X!X&X,X2X:XBXMX_XnXXÇXÍXÒXäXóX%YOYUY]YbYtYƒY²YÜYâYçYùYZ7ZaZgZlZlZlZ}ZˆZ“Z¹ZÑZÜZäZñZñZöZ [ [%[K[c[n[v[ƒ[ƒ[ˆ[›[¨[²[Æ[Ý[ö[\\@\T\k\y\{\\¦\¦\¯\»\Ñ\ê\ý\ ]] ] ] ]'],]?]K]b]d]i]|]ˆ]•]Ÿ]Ÿ]±]7d¤¹¹¹¹-¹-¹G¹N¹Z¹Z¹q¹q¹ˆ¹ˆ¹Ÿ¹Ÿ¹¶¹¶¹͹ϹϹÓ¹8ló +I:I:W:a:h:::„:†:’:œ:ª:Ç:É:Ù:Ù:Þ:à:ç:;9ì|ó^*^*€*Š*½*Ì*â*+ +++ +/+6+?+D+Y+j+‰+‘+“+²+º+É+Ð+Ü+á+è+ð+ö+ø+,,,,;,A,A,I,R,a,€,‡,‰,¨,¯,¯,¯,Ã,×,Û,é,ü,ô,--$-+-3-9-;-G-W-\-^-~-„-„-- -¥-ª-Ê-Ð-Õ-á-ñ-ö-ø-..%.-.3.5.A.Q.V.X.x.~.~.~.†...™.™.±.á.õ.ù.///2/2/D/:à?ó®>®>Ñ>Ù>é>ñ>?5?9?A?I?O?c?k?k?s?¬?ô?Ï?@@.@=@?@i@o@x@@‡@@›@£@«@¾@Æ@Ë@Õ@õ@ý@ÿ@ AA8A@ABAbAjAjAjAsAzAA•AžAžA£A§A¯A¸AÁAÍAèABBHBKBdBqB…BœB B¬BÑBíBÿB)C/C1C[C^C^CuC‚C–C­C¶CºCÅCÐCâCñCóCD D2DADFDpDvD{DDœDžDÈDËDÝDìDîDEEEE(E(E3EdEmEmEmEmEvE‚E˜E±EÄEËE×EÞEÞEñEõEõEõEüEFFF'F.F.FEFGFLF_FfFrFyFyF†FFF¶F¶FÈF;ÄErÆÆÆÆòÆõÆúÆÇ ÇÇ Ç$Ç(Ç+Ç>ÇWÇyÇ‚ÇǔǭÇÏÇÔÇíÇÈÈÈ4ÈVÈXÈqȓȓȓȨÈÂÈÑÈãÈ<T¡~Ã~ÒßîîúÃÀÃêÃÄìÃÄ Ä/Ä7Ä=¸ë¦:¦:¾:Â:Ð:ß:ê:ö:;;,;2;2;T;ƒ;g;[;¥;ª;Ñ;Ö;â;í;ï;<<<1<J<D<8<V<i<i<‹<‹<—<>X™«ÞÞìó13Rq‡’”ŸªÉÏ?ä¬áÖÖëöý*IKj—¥­¸ºÅÐÐÕ49@_~‰‹ªÉÉäòú=ZZg‹¬¬¬´@¤yžfúfú„ú•ú¡ú¸ú¿úØúÐúðúûüúû-û2ûSû?ûkû|û“ûšû³û«ûËûëû×û÷ûüü +ü6üCüCü[ü[üeüA¬%L>Ú>Ú\ÚnÚuÚ|Ú‹ÚÚ¯Ú¯Ú´ÚÓÚØÚßÚîÚðÚÛÛ.ÛCÛ0ÛOÛ^Û`ÛÛÛÛÛŽÛ§Û Û¿ÛÉÛBdEZžîžî¼îÏîÖîÝîäîèîêîñîøîüîüîïï'ï'ï;ïFïTïeïiïnïyïŠï›ï²ï¶ï¿ïÃïÈïÙïöïöïððð6ðGðKðKðKðPð~ð“ðšð­ð±ð¶ðÁðÒðãðúðñ ñññ%ñ7ñGñ[ñ]ñvñ‰ññññ˜ñ©ñºñÑñÕñÞñâñçñøñòò#ò7ò<òUòfòjò|ò|ò|òòò’ò±ò±òÐòÛòáò÷òó ó"ó-ó>óOófójósówó|óó¦ó¦ó´óÈóÊóãóôóøóøóÿóôô(ô-ô8ôIôZôqôyô‚ô†ô‹ôœô²ôÂôÖôÛôôôõ õõõõõ5õ"õAõPõRõqõ|õ‚õ˜õ©õ©õ©õ°õÃõÜõÜõÜõëõëõþõö ö1ö6ö<öFöHöTöTö[öfö{ö}öˆöö©ö«ö¶öÂöÒöÙöàöêöòöööúöüö÷ ÷ ÷ ÷!÷&÷.÷2÷4÷4÷=÷J÷`÷€÷š÷¦÷²÷¹÷¹÷Ì÷Ð÷Ð÷Ð÷×÷Ü÷ö÷øøøø,ø.ø3øMøYøeøløløyøƒøƒø•øCÌs¢æÈæÈÉÉÉ É&É(É.É4É4ÉFÉQÉXÉeÉrɅɔɨɮɰɷɽÉÇÉÇÉØÉÚÉáÉçÉñÉñÉñÉÊÊ!Ê0Ê2ÊDÊSÊSÊeÊDx£½fÊfÊʓʚʠʦʨʮʴʻÊÈÊÕÊèÊõÊË +Ë ËËË+Ë=ËLËjË|ËE<mx¶ù¶ùÐùÜùîùú%úú=úUúUú_úF„ñ^Í^Ív͈Í͖͵ͺÍÙÍÞÍøÍåÍÎÎ#Î8Î%ÎWÎDÎcÎcÎuÎ|ΛΛΣÎGMÎÛÎÛæÛøÛÜ+Ü +Ü7ÜUÜ‚Üa܎ܨܨÜÇÜÜÜÉÜ ÝèÜÝ/Ý/ÝAÝ[Ý[݈ݕÝÎÝÓÝÚÝÞùÝÞ2Þ>ÞpÞ]Þ‹Þ|Þ—ÞµÞÊÞ·ÞÖÞßõÞß*ß*ß<ßVßqß~ßßߥßHT[l–ø–ø°ø¼øÎøäøùòøù.ù@ùVùwùdùù§ù§ù±ùI(^$žÑžÑÄÑ×ÑßÑæÑíÑóÑõÑüÑÒÒÒÒÒ+Ò6ÒAÒRÒcÒzÒ‚Ò‹Ò“Ò˜Ò©Ò¿ÒÏÒáÒæÒÓÓÓÓ!ÓMÓbÓmÓ~ÓÓ¦Ó®Ó·Ó¿ÓÄÓÕÓçÓ÷Ó Ô Ô%Ô=ÔAÔAÔLÔ]ÔnÔ…ÔÔ–ÔžÔ£Ô´ÔÊÔÚÔìÔñÔ Õ#Õ'Õ:Õ:Õ:ÕRÕ?ÕrÕ_ÕÕ‹Õ‘Õ©ÕÁÕÆÕÛÕæÕ÷ÕÖ Ö'Ö0Ö8Ö=ÖNÖ`ÖpÖ‚Ö„ÖžÖ¶ÖºÖºÖÅÖÖÖçÖþÖ××××-×C×S×e×jׄלנ׳׳׳×Ë׸×ëר׸ר +Ø"Ø:Ø:Ø:ØFØLØWØbØt؄؛زØÉØàØàØôØÙÙÙ1Ù1Ù?ÙAÙAÙOÙOÙXÙcÙqٌٛ٢ٲٴÙÑÙÙÙöÙÚ"Ú"Ú;ÚJD¦ß¦ßÄßËßÒßÝßåßþßþßà+à+à6à:àEàmàLàyààà³à·à¼àÎàßàöà áááá#áJá`ádádátá±áá½áÚáÚáùáâ +â â1â6âHâYâpâ‡âŒâ”â˜âšâÁâ×âÛâæâ÷âã ã'ã,ã0ã5ãFã\ãjã~ãƒãœã­ã±ãÃãÃãÃãÃãÈã÷ãäã$ää0äMäXä^ätä…äŠä•ä¦ä·äÎäÖäÛäßäääõäåå)å+åDåUåYåYåYåkå|å“åªå¯å·å»å½åäåúåþå æ æ æ ææ$æ.æ5æHæ_æ_æ{æ{æ‰æ‹æ‹æ™æ™æ¯æ¿æÍæäæ÷æüæç ç<çLçSçaççwç¤çÍçÍçÍçÚçèè#è)è4èSèjèZèvèŒèšè²èÈèÌèÜèûè'éé3éPéPéoézé€é–é§é¬éÂéØéÜéçéøé ê ê(ê-ê1ê6êGê]êkêê„êê®ê²êÄêÄêÄêÄêÉêøêåêë3ë#ë?ë\ëgëmëƒë”ë™ë¤ëµëÆëÝëåëêëîëóëìì$ì8ì:ìSìdìhìhì‡ìì³ì·ìÄìÄìÄì×ìÝìçìîìíííí4í4íBíDíDíRíRíhíxí†í¡í´í¹íÕíÝíùí îî4îPîPî]î}î}î}îîK|Ìçžþžþ¸þàþÃþìþùþ ÿ%ÿÿ=ÿUÿBÿhÿaÿtÿÿ”ÿ­ÿ¦ÿ¹ÿ¹ÿÆÿåÿåÿïÿLH]¦Î¦ÎÊÎâÎýÎéÎÏ Ï)Ï?Ï+Ï_ÏKÏkÏwÏ|ψϘϟϬϷÏÃÏÎÏÖÏÛÏçÏìÏÐÐ ÐÐÐ&Ð?ÐHÐTÐYÐmÐtÐxÐxÐ}ЖЛдÐÉÐÛÐàÐëÐóÐóÐóÐõÐÑ#Ñ.Ñ8ÑCÑEÑPÑXÑXÑeÑ]Ñ}ÑÑMd¶ËŽýŽý¨ýÌý¯ýØýñýêý þþ þ1þ*þ=þVþOþbþbþoþŽþŽþ˜þNhŸµfüfü„üü§ü¸ü¿üØüÐüðüýüüý-ýCý/ý[ýhýhý€ý€ýŠýOLè÷öÿöÿ&-LL^q~w– Pؾð~Ë~ˠ˧˲ËÈËÈËÚËåËðËÌÌ)Ì-Ì2Ì6Ì8ÌIÌ[ÌgÌyÌ{̧̧̧̣̺̔ÌÏÌÏÌÛÌáÌëÌöÌÍ ÍÍÍ2ÍLÍLÍ^ÍQ$D¾H¾HÜHäHðHII)I4ICIIIIIIINISIaIlI‚I„I‰I—I¢I¯I¶IÄIR4;D–­–­Ÿ­«­Ê­Ï­Ñ­Ñ­Ö­S”nÎÁÎÁÂ#Â#Â6Â:ÂYÂmÂrÂr‡¤°ÂÁÂÆÂ×ÂëÂðÂò Ã#Ã%Ã%Ã>ÃVÃVÃxÃT<Œ—ÆrÆrÏrÚrårðrûrs#s.s>sU,ð7~a~aša a«a¼aÁaÇaÊaÎaÎaîaóa)bb5bNb:bZbsb_bb†b‹b•b˜bœb¡bºb¦bÆbÆbÆbËbÜbábçbêbîbîbccIc5cUcncZczcc|cœc£c¨c®c±cµc·cÐc¼cÜcÜcÜcÜcôcd)dVXâô¶¶ÄËê  *IW_jlw‚¡§W´?h~d~d–d¡dÄdÜdádædêdìdòdødeûdee9eQe>e]e€e˜ee¢e¦e¨e®e´eÊe·eÖeÖeéeñefff)f5fXtŒå~°~°–°ž°«°˰ݰä°î°ô°ú°þ°±$±$±+±.±3±B±F±X±s±w±|±|±ƒ±†±‹±—±¥±©±º±ɱͱϱÞ±â±â±ô±²² ² ²!²$²0²:²A²g²r²v²{²±²ȲÓ²ײè²ó²÷²ù²³³³³³"³&³(³(³3³7³E³Q³U³U³U³Y³|³Yˆæ~³~³’³¨³¨³¨³ª³ª³±³³³³³º³¼³¼³ɳ˳˳سß³á³á³î³õ³÷³÷³´´´$´ZܺmÖ¹Ö¹ ºº#ºEºEºVºcºº‰º¶º»ºäº»»#»'»J»p»u»ž»¸»Þ»õ»û»ÿ»¼ ¼%¼6¼>¼]¼c¼g¼€¼ˆ¼§¼¬¼½¼żä¼é¼ñ¼÷¼û¼ÿ¼½½%½9½>½P½U½f½k½~½‹½Ÿ½ª½³½×½ ¾4¾9¾9¾9¾I¾P¾^¾k¾¾¾¤¾©¾©¾À¾¾¾Ö¾ؾؾï¾ñ¾ñ¾¿ +¿ +¿!¿!¿2¿7¿7¿G¿l¿~¿ƒ¿ƒ¿ƒ¿ƒ¿Š¿¾¿Ï¿í¿í¿í¿ú¿ÀÀÀÀ À7À9À9ÀFÀ]À]ÀrÀtÀÀ«À«À«À¯À±À±À±À¶À¸À¸À½À½ÀÇÀÌÀÌÀêÀêÀêÀòÀôÀôÀôÀüÀþÀþÀÁÁÁÁ+Á-Á@ÁTÁTÁTÁTÁTÁgÁÁ‡Á‡ÁÊÁ[ðU<?QX_dfmtxмÃîó (7qv£«°¹ÄÌÓòø8CZy††Œ“¤ÄÖ\V˜ÖÖîõ:EQ€€Œ”£Ýß AFe€†•ª¬·¿Úßèóû :Y[z§¶¯Üáè&(Gf‰¤¤¤ÐÐÜ]\ +N%N%`%l%Š%¦%³%Ê%Ý%è%ê% &&&/&(&G&M&^("®¬®¬½¬Ьè¬è¬î¬_hºÐ¶i¶iÌiØiîiûiÿij-j1j7jVjJjgjijijšjˆjij¹jÃj`Œ;Zž'ž'´'º'Á'Í'Ý'ý'( ()(+(K(W(g(‡(Œ(“(“(“(™(œ( (¨(À(Ë(Ö(ö()axiƒ··>·`·`·j·o·o·Ž·›·····ª·²·Å·Ù·Û·Û·ã·ö·ö·¸b@„¸¸¸'¸.¸M¸Z¸Z¸]¸_¸e¸c¬Ãê¦8¦8¾8Æ8Ñ8ÿ8Þ899Q919%9w9|9§9¬9¸9ß9ä9æ9: :'::?:F:g:Y:M:{:}:–:–:–:¢:dœŸÂÎ6Î6æ6î6ù63777Y7[7†7†7“7Ì7Ñ7Ý7è7ê7 88878)88K8M8f8f8s8š8š8š8¦8eˆ\z>4>4R4U4g4o4z4‰4‰44ª4µ4º4Ú4é4ñ4ü4555%505;5F5F5X5X5`5f¤6[nµnµ޵°µ°µϵßµäµäµóµ¶ ¶'¶.¶0¶C¶K¶K¶K¶M¶M¶M¶M¶k¶k¶k¶k¶}¶¶¶¶¶’¶¶À¶g@\hƶƶÔ¶ܶã¶······h8yñ=ñ=> > >O>[>h>r>‚>‚>™> >·>¾>Ç>Þ>Þ>ô>ô> +? +? ? ?6?6?L?L?b?b?x?x?Ž?Ž?¥?¥?¼?¼?Ó?Ó?ê?ê?@@@@/@/@G@G@_@g@r@ƒ@Ž@Ÿ@¢@¤@»@Â@Â@ÎAiD€¶]¶]Ê]Ö]ì]Ø]ø]ú] ^^&^j°Ž¶&^&^<^C^T^Y^n^[^z^€^€^Œ^¤^‘^°^³^µ^Ã^È^Ý^Ê^é^ì^ì^ø^ _ú^_ _ _2_E_X_k_~_ˆ_k°·ßŽ_Ž_¤_«_¼_Á_Ö_Ã_â_è_è_ô_ `ù_```+`0`E`2`Q`T`T```u`b``‡`‡`š`­`À`Ó`æ`ð`lLàïö`ö` +aa,aa8a:aMa`akava~am$~¬~¬¬¥¬¥¬«¬nŸ& & T Y m u ƒ ‡   • ¢ ¸ â ç  !!! !5!K!M!c!y!!·!É!o ãÎ!Î!"""'"."5">"@"C"b"i"„"†""¨"¯"¸"º"½"Ü"Ü"Ü"ê"ô"#!###=#E#E#a#€#…#Œ#¢#©#Ä#Æ#Í#è#þ#$$ $-$M$O$i$q$q$$¤$¤$Ê$Ü$p|5&´&´J´^´i´~´œ´§´Å´Å´Å´Ò´ê´ì´ì´ì´ù´µµµ!µ.µFµFµWµkµq(8>.d.dUdBdadpdxdrDÏ& +& +N [ -u - -¢ -¯ -Ç -Û -à -ç -    $ 7 U g t Œ ¢ ¾   Í Ô æ é ë ñ  % ' ? Q T V \ x x x Š Š ˜ ¢ à ß ß ä è   + H R V f y  “ ¥ ¹ à Ú Þ ô !3=Q[d{…‡›¥¼ÀÀÀËÒåýÿ*AGYa‚™™™¿¿Ñ.x9ÓNóNó„ó‹ó“óœó­óºóÏóÒóÕóÙóâóðóúóÿó -ô'ô,ô9ôeôjôwô—ôœô«ô×ôßôäôùô%õ-õ2õ2õEõXõhõlõ‹õœõ¡õ¡õÃõÃõÃõÃõÃõÓõèõëõîõòõòõ÷õö ö$ö-ö:öBö]öoö|ö‡ö¥ö¥ö¥ö²öÉöËöËöËöØöïöñöñöþö÷÷&÷+÷4÷K÷]÷o÷÷÷÷š÷±÷³÷³÷³÷À÷×÷Ù÷Ù÷æ÷ý÷ý÷øøø'øAøSøeøƒøƒøƒøø§ø©ø©ø¶øÍøÍøâøäøëø ù+ù0ù7ùEùOùQùQùQùmùuùwùwù™ùÓù/„;þþ%5TZa€‚¡­½Üâééñù "AI0ˆŸ–8–8´8Æ8Ì8Ó8Ú8Ü8ß8æ8í8í8 9 999+9?9P9P9X9|9œ9½9Â9ã9è9ô9ÿ9:::K:\:a:g:i:o:r:ƒ:ˆ:‹:“:œ:·:×:î:;; -;,;?;D;[;n;s;w;™;´;Ô;ç;ì;ý;<<< <<$<)</<7<7<A<J<a<t<y<}<Ÿ<º<Ú<í<ò< =-=D=W=\=`=‚=•=•=°=°=°=¾=Ö=Ø=Ø=Ø=æ=þ=>>>&>&>8>8>A>N>d>„>ž>¥>¯>Â>Æ>Æ>Æ>Í>Ó>í>ô>þ>???8???I?W?b?b?|?1l£ºvWvWŒW˜W®W»WÅWÔWíWñW÷WX -X'X)X)XZXHX)XyXƒX2ÄIvÐ)Ð)Ù)*î)à)!*1*#*R*u*u*…*Š*Š*ž*£*£*¿*Ä*Ä*ä*é*é*ý*++ + +-+Q+w+—+©+»+Í+Ý+Ý+Ý+Ý+Ý+¦,3ПÏ~?~?’?±??×?ä?ð?ö?0@5@a@a@f@|@Ž@¤@º@í@ü@4A AOA\AˆAA´A¼AÖAÂAñA -BöA*BB>BKBwBwBwBwBB4´?V,V,l,w,‚,Ž,™,›,Ä,Ê,Ê,ñ,þ,)-T-N-B-l-Ž-¦-“-¹-²-Ø-Å-ì-ù-$.=.7.+.I.\.\.\.f.5°ô\öö < D O ^ g k v  – › µ Ô Ú ß ò ( > D L O T g ‘ § ­ µ ¸ à Ø Ý ú ! !'!'!,!2!5!@!K!`!e!!ž!¤!©!´!É!Ò!×!ö!þ!""#","."M"U"`"u"z"”"³"¹"¾"¾"¾"¾"Ë"Ò"ç"ç"ÿ" -##*#B#V#g#q#s#‡#˜##¨#Õ#Õ#Õ#ç#6ÔÏ€†B†B¤B´B¿BÊBC6CTC~C„CŠC’C”CœC·CºCÅCÑCD=D[D…D‹D‘D™DžD¦DÁDÄDÏDÛDàD%ELEjE”EšE E¨EªE²EÍEÐEÛEçE,FSFqF›F¡F§F¯F´F¼F×FÚFåFñFñFöFüFG -GGG/G>GmG—GG¢G´GÃGõG H%H-H2HDHSH‚H¬H²H·HÉHØHI1I7IJFJSJSJXJkJxJ‚J–J­JÆJØJåJK$K;KIKKK_KvKvKK‹K¡KºKÍKÙKìKðKðKðK÷KüKLL2L4L9LLLXLeLoLoLL7h¤ºƨƨʨݨݨ÷¨þ¨ -© -©!©!©8©8©O©O©f©f©}©©©ƒ©8p1Iø(ø())).).)3)5)A)K)\)y){)‹)‹))’)™)Ë)9ð|ô0:m|’¶»¿ÇÐßæïô 9ACbjy€Œ‘˜ ¦¨´ÄÉËëññù079X___s‡‹™¬¤ÄÉÔÛãéë÷ .44@PUZz€…‘¡¦¨ÈÎÕÝãåñ(...6??IIa‘¥©·ÊÂââô:à?óf.f.„.Œ.š.ž.Ä.Ï.×.ß.ó.û.û.ÿ.1/j/X/O/‚/‡/’//Ÿ/¾/Ä/Í/Ô/Ü/ä/ð/ø/000 0*0J0R0T0^0m00•0—0·0¿0¿0¿0Ê0Ó0ç0ï0ø0ø0ý01 111181T1p11’1§1´1È1Û1ß1ì12.2A2`2f2h2‡2Š2Š2Ÿ2¬2À2Ó2Þ2â2í2ø2333/323=3H3M3l3r3w3‚333®3±3¼3Ç3É3è3î3î3î3ø3ø3444?4?4?4?4H4T4j4ƒ4–44©4°4°4Ã4Ç4Ç4Ç4Î4Ó4æ4í4ù4555551585D5K5K5X5b5b5‹5‹55;ÈEsv¶v¶¢¶¥¶ª¶·¶¼¶ζжÔ¶ضÛ¶î¶·)·2·=·D·]··„··¿·Ä·Ë·ä·¸¸!¸C¸C¸C¸X¸r¸¸“¸<T¡.³.³B³O³^³^³j³p³š³°³œ³dz¼³ß³ç³=¼ë^*^*v*z*ˆ*—*¢*®*¹*»*ä*ê*ê* +;+ ++]+b+‰+Ž+š+¥+§+Ð+Ö+Ö+é+,ü+ð+,!,!,C,C,O,>\°ŽŽœ£Âáã!/7BDOZy?è°æ††›¦­ÚùûGU]hju€€…²·äéð.9;Zyy”¢ªµ·ÂÍÍí - -;\\\d@¨yŸêê4êEêQêhêoêˆê€ê êÀê¬êÌêÝêâêëïêë,ëCëJëcë[ë{ë›ë‡ë§ë¸ëÎëºëæëóëóë ì ììA°%MîÉîÉ ÊÊ%Ê,Ê;Ê@Ê_Ê_ÊdʃʈÊʞʠʿʿÊÞÊóÊàÊÿÊËË/Ë/Ë/Ë/Ë>ËWËPËoËyËBhE[NÞNÞlÞÞ†ÞÞ”Þ˜ÞšÞ¡Þ¨Þ¬Þ¬Þ´ÞÍÞ×Þ×ÞëÞöÞßßßß)ß:ßKßbßfßoßsßx߉ߦߦߴßÈßÍßæß÷ßûßûßûßà.àCàJà]àaàfàqà‚à“àªà²à»à¿àÄàÕàçà÷à á á&á9á=á=á=áHáYájáá…áŽá’á—á¨áÅáÅáÓáçáìáâââ,â,â,â1â@âBâaâaâ€â‹â‘â§â¸â½âÒâÝâîâÿâãã#ã'ã,ã=ãVãVãdãxãzã“ã¤ã¨ã¨ã¯ãÂãÆãØãÝãèãùã -ä!ä)ä2ä6ä;äLäbärä†ä‹ä¤ä·ä»äÍäÍäÍäÍäåäÒäñäåå!å,å2åHåYåYåYå`åsåŒåŒåŒå›å›å®åÅåÐåáåæåìåöåøåææ ææ+æ-æ8æMæYæ[æfæræ‚æ‰ææšæ¢æ¦æªæ¬æ±æ¹æ½æÏæÑæÖæÞæâæäæäæíæúæç0çJçVçbçiçiç|ç€ç€ç€ç‡çŒç¦ç²ç¾çÅçÅçÜçÞçãçýç èèèè)è3è3èEèCÐs£–¸–¸À¸øʸиÖ¸ظÞ¸ä¸ä¸ö¸¹¹¹"¹5¹D¹X¹^¹`¹g¹m¹w¹w¹ˆ¹й‘¹—¹¡¹¡¹¡¹¸¹ʹѹà¹â¹ô¹ºººD|£¾ºº@ºCºJºPºVºXº^ºdºkºxº…º˜º¥º´ººº¼ºº̺Ûºíºüº»,»E@myféfé€éŒéžé´éÕéÂéíéêêêFˆñ½½&½8½?½F½e½j½‰½޽¨½•½ǽ´½Ó½è½Õ½¾ô½¾¾%¾,¾K¾K¾S¾GM~Ë~˖˨˳ËÛ˺ËçËÌ2ÌÌ>ÌXÌXÌwÌŒÌy̹̘ÌÅÌßÌßÌñÌ Í Í8ÍEÍ~̓͊͸ͩÍÄÍâÍîÍ Î Î;Î,ÎGÎeÎzÎgΆδΥÎÀÎÚÎÚÎìÎÏ!Ï.ÏMÏMÏUÏHX[mFèFè`èlè~è”èµè¢èÍèÞèðèé'éé?éWéWéaéI,^%NÁNÁtÁ‡ÁÁ–ÁÁ£Á¥Á¬Á³Á¶Á¶ÁÈÁÈÁÛÁæÁñÁÂÂ*Â2Â;ÂCÂHÂYÂo‘–°ÂÈÂÌÂÌÂÑÂýÂÃÃ.Ã?ÃVÃ^ÃgÃoÃtÅ×çùûÃÕÃíÃñÃñÃüà ÄÄ5Ä=ÄFÄNÄSÄdÄzĊĜġĻÄÓÄ×ÄêÄêÄêÄÅïÄ"ÅÅ/Å;ÅAÅYÅqÅvŋŖŧŸÅÏÅ×ÅàÅèÅíÅþÅÆ Æ2Æ4ÆNÆfÆjÆjÆuƆƗƮƶƿÆÇÆÌÆÝÆóÆÇÇÇ4ÇLÇPÇcÇcÇcÇ{ÇhǛLjǨǴǺÇÒÇêÇêÇêÇöÇüÇÈÈ$È4ÈKÈbÈyÈÈȤÈÀÈÀÈÀÈáÈáÈïÈñÈñÈÿÈÿÈÉÉ!É<ÉKÉRÉbÉdÉɉɦɷÉÒÉÒÉëÉJ EVÏVÏtÏ{Ï‚ÏϕϮϮÏÂÏÛÏÛÏæÏêÏõÏÐüÏ)Ð?ÐMÐcÐgÐlÐ~ÐЦнÐÂÐÊÐÎÐÓÐúÐÑÑÑ$ÑaÑ@ÑmъъѩѴѺÑÐÑáÑæÑøÑ Ò Ò7Ò<ÒDÒHÒJÒqÒ‡Ò‹Ò–Ò§Ò¸ÒÏÒ×ÒÜÒàÒåÒöÒ ÓÓ.Ó3ÓLÓ]ÓaÓsÓsÓsÓsÓxÓ§Ó”ÓÔÓ³ÓàÓýÓÔÔ$Ô5Ô:ÔEÔVÔgÔ~Ô†Ô‹ÔÔ”Ô¥Ô·ÔÅÔÙÔÛÔôÔÕ Õ Õ ÕÕ,ÕCÕZÕ_ÕgÕkÕmÕ”ÕªÕ®Õ»Õ»Õ»Õ»ÕÎÕÔÕÞÕåÕøÕÖÖ+Ö+Ö9Ö;Ö;ÖIÖIÖ_ÖoÖ}Ö”Ö§Ö¬ÖÈÖÐÖìÖüÖ××/×'×T×}×}×}׊×Ã×È×Ó×Ù×ä×ØØ -Ø&Ø<ØJØbØxØ|،ثØרÇØãØÙÙ Ù*Ù0ÙFÙWÙ\Ùrوٌٗ٨ٹÙÐÙØÙÝÙáÙæÙ÷Ù ÚÚ/Ú4ÚMÚ^ÚbÚtÚtÚtÚtÚyÚ¨Ú•Ú´ÚãÚÓÚïÚ ÛÛÛ3ÛDÛIÛTÛeÛvÛÛ•ÛšÛžÛ£Û´ÛÆÛÔÛèÛêÛÜÜÜÜ7ÜMÜcÜgÜtÜtÜt܇ÜܗܞܱÜÈÜÈÜÈÜäÜäÜòÜôÜôÜÝÝÝ(Ý6ÝQÝdÝiÝ…ÝݩݹÝÇÝäÝÞÞ Þ-Þ-Þ-ÞMÞK€ÌèNîNîhîîsîœî©î¼îÕîÎîíîïòîïï$ï1ïDï]ïVïiïiïvï•ï•ïŸïLL^V¾V¾z¾’¾­¾™¾;¹¾Ù¾ï¾Û¾¿û¾¿'¿,¿8¿H¿O¿\¿g¿s¿~¿†¿‹¿—¿œ¿°¿·¿»¿Æ¿Ë¿Ö¿ï¿ø¿À ÀÀ$À(À(À-ÀFÀKÀdÀyÀ‹ÀÀ›À£À£À£À¥À¾ÀÓÀÞÀèÀóÀõÀÁÁÁÁ Á-ÁMÁMh¶Ì>í>íXí|í_íˆí¡íší¹íÎí»íáíÚíííîÿíîî î>î>îHîNlŸ¶ìì4ì@ìWìhìoìˆì€ì ìÀì¬ìÌìÝìóìßì ííí0í0í:íOLè÷¦ï¦ïÄïÖïÝïüïüïð!ð.ð'ðFðPðPܾñ.».»P»W»b»x»x»Š»•» »±»»Ù»Ý»â»æ»è»ù» ¼¼)¼+¼D¼S¼W¼W¼W¼j¼¼¼‹¼‘¼›¼¦¼´¼»¼ʼ̼â¼ü¼ü¼½Q#CŽ7Ž7¬7´7À7Ö7ë7ù7888888#818<8R8T8Y8g8r88†8”8R8;EFFO[z†S˜n~±~±°±Ó±Ó±æ±ê± ²²"²"²/²7²?²T²`²q²v²‡²›² ²¢²»²Ó²Õ²Õ²î²³³(³T<Œ—–a–aŸaªaµaÀaËaÕaóaþabU0ð8NPNPjPpP{PŒP‘P—PšPžPžP¾PÃPùPåPQQ -Q*QCQ/QOQVQ[QeQhQlQqQŠQvQ–Q–Q–Q›Q¬Q±Q·QºQ¾Q¾QÞQãQRR%R>R*RJR`RLRlRsRxR~RR…R‡R RŒR¬R¬R¬R¬RÄRíRùRV\æùfft{š¹»Úù    ' 2 Q W W¸?iNSNSfSqS”S¬S±S¶SºS¼SÂSÈSÞSËSêSêS T!TT-TPThTmTrTvTxT~T„TšT‡T¦T¦T¹TÁTÓTíTæTùTUXxŒæ. . F N [ {  ” ž ¤ ª ® ² Ô Ô Û Þ ã ò ö ¡#¡'¡,¡,¡3¡6¡;¡G¡U¡Y¡j¡y¡}¡¡Ž¡’¡’¡¤¡´¡¸¡½¡½¡Ñ¡Ô¡à¡ê¡ñ¡¢"¢&¢+¢a¢x¢ƒ¢‡¢˜¢£¢§¢©¢´¢¸¢¸¢¸¢Æ¢Ò¢Ö¢Ø¢Ø¢ã¢ç¢õ¢££££ £,£Yàæ.£.£B£X£X£X£Z£Z£a£c£c£j£l£l£y£{£{£ˆ££‘£‘£ž£¥£§£§£¿£Ä£Ä£Ä£Ô£Zàºn†©†©¼©Å©Ó©õ©õ©ªª1ª9ªfªkª”ª±ªͪÓªתúª «%«N«h«Ž«¥«««¯«È«ЫÕ«æ«î« ¬¬¬0¬8¬W¬\¬m¬u¬”¬™¬¡¬§¬«¬¯¬Á¬ɬÕ¬é¬î¬­­­­.­;­O­Z­c­‡­»­ä­é­é­é­ù­®®®=®=®T®Y®Y®p®r®r®†®ˆ®ˆ®Ÿ®¡®¡®¸®º®º®Ñ®Ñ®â®ç®ç®÷®¯.¯3¯3¯3¯3¯:¯n¯¯¯¯¯ª¯Á¯ïïïЯç¯é¯é¯ö¯ ° °"°$°=°[°[°[°_°a°a°a°f°h°h°m°m°w°|°|°š°š°š°¢°¤°¤°¤°¬°®°®°¶°¶°¸°¿°Û°ݰð°±±±±±±/±7±7±z±[ô!ZÎýÎýìýïýþþþþþþ$þ(þ:þlþsþžþ£þÄþÄþÐþØþçþ!ÿ&ÿSÿ[ÿ`ÿiÿtÿ|ÿƒÿ¢ÿ¨ÿÇÿÉÿèÿóÿ -)/66<?CTt†\Z††ž¥·êõ00<DS¼ÄÄñö06EZ\goŠ˜£«¶½ê  *Wf_Œ‘˜·ÖØ÷19TTT€€Œ]` -þþ:Vcz˜š¹ÁÌߨ÷ý^,#^œ^œmœ€œ˜œ˜œžœ_lºÑ†X†XœX¨X¾XËXÏXÞXýXYY&YY7Y9Y9YjYXY9Y‰Y“Y`;[NNdjq}­²¹ÙÛû7<CCCILPXp{†¦°a|i„ΦΦ§§ § §>§K§M§M§M§M§Z§b§u§‰§‹§‹§“§¦§¦§¸§bD„‘¾§¾§̧×§Þ§ý§ -¨ -¨ ¨¨¨c°Ãë^(^(v((Œ(º(™(Ò(Ù( )ì(à(2)7)b)g)s)š)Ÿ)¡)À)Æ)â)Ó)ú)*"***6*8*Q*Q*Q*]*d ŸÃ~&~&–&¡&¬&æ&Æ&º& ''9'9'F''„''›''¼'Â'É'ê'Ü'Ð'þ'(((&(M(M(M(Y(eŒ\{î#î#$$$ $*$9$9$M$Z$e$j$Š$™$¡$¬$´$¿$Ê$Õ$à$ë$ö$ö$%%%f¨6\¥¥>¥`¥`¥¥¥”¥”¥£¥µ¥Ï¥×¥Þ¥à¥ó¥û¥û¥û¥ý¥ý¥ý¥ý¥¦¦¦¦-¦/¦/¦/¦/¦B¦M¦p¦gD\iv¦v¦„¦Œ¦“¦²¦¿¦¿¦¦Ħʦhv¶¨,¨,¸,½,æ,Õ,Ñ,ö,- ---4-;-R-Y-b-y-y---¥-¥-»-»-Ñ-Ñ-ç-ç-ý-ý-..).).@.@.W.W.n.n.….….œ.œ.³.³.Ê.Ê.â.ê.õ.//"/%/'/>/E/E/Z0iH€Ž†L†LšL¦L¼L¨LÈLÊLÜLîLöLj´Ž·öLöL MM$M)M>M+MJMPMPM\MtMaM€MƒM…M“M˜M­MšM¹M¼M¼MÈMÝMÊMéMïMïMNN(N;NNNXNk´·à^N^NtN{NŒN‘N¦N“N²N¸N¸NÄNÜNÉNèNëNíNûNOOO!O$O$O0OEO2OQOWOWOjO}OO£O¶OÀOlPàðÆOÆOÚOæOüOèOP -PP0P;PFPNPm(.œ.œ=œUœUœ[œn”ƒ¤ÖÖ %37@@ERh’—»ÃÈÏåûý)Mgyo¤ç~~°ÄÌ×Þåîðó46=X_hjmŒŒŒš¤±ÑÓíõõ05<RYtv}˜®ÅÈÐÝýÿ!!=TTzŒp€6Ö£Ö£ú£¤¤.¤L¤W¤u¤u¤u¤‚¤š¤œ¤œ¤œ¤©¤Á¤ääѤÞ¤ö¤ö¤¥¥q,8?þRþR%SS1S@SHSrHÓ!ÖùÖùþù úúúú4úKúbú¢ú¾úØúÝúâúíúûû#û6ûLû`ûeûpûû•û˜û²ûÌûÔûÜûáûûûüü%ü*üDüLüQüqüvüyü“ü­üµü½ü¿üÙüóüûüýý ý'ý'ý,ý1ý<ý<ýGýGýSýSýeý¥ý»ý»ýËýsøi£UUU(U3U8UDUOUTU[U`UkUpUpUU®U°UµUÀUÅUÅUäUV*V*V=VPVcVvV{V{VŽV¡V´VÇVÌVÌVßVòVWWWW-W@WSWfWfWfWtWt èŒžZžZ¼ZàZæZíZíZôZ[[/[G[3[S[b[t[}[…[[§[¹[Â[Ê[Ò[ë[×[÷[ \\\ \;\'\[\G\g\}\i\\‰\©\»\Å\Í\Í\Ö\Þ\ô\ ] ].]2]2]9]>]\]^]c]n]„]„]„]ˆ]”]µ]Ã]Ñ]Þ]ÿ] ^^^^6^E^T^W^{^^¥^©^Ð^Ô^÷^û^û^û^___2_8_C_O_Q_Y___x_ƒ_‘_›_´_·_¿_Ë_Í_Õ_Ø_ñ_ó_ÿ_` ``(`@`L`a`f`x`‡` `±`±`¼`Ç`ß`ë`aaa&a?aPaPaVaaaiawa~aau8š¤v¨v¨Ѝ¨•¨™¨¨¼¨ĨvÐó#ž5ž5À5Ö5â566)6@6S6^6`6€6ˆ6ˆ6—6—6Ÿ6«6Á6Ö6å6ð67 7 7 777"7-7D7F7K7Z7e7r7|7|7Š7wLŸ&&&&&1&G&3&S&U&\&g&s&{&x$‹Æ%Æ%Ú%û%&y$†‹†%†%š%»%Ã%z<{†%%7%$%C%N%Y%d%o%{%%{(#)žœžœ­œ¼œÁœÇœ|()/ΜΜÛœéœîœôœ}(/5öœöœ~(5;,;@F$œœœ(œ.œ€4 -ŽŽµ¢Á×Ðï÷lÑè–Y–Y¬Y¸YÎYÛYßYîYZ ZZ0Z$ZAZCZCZtZbZCZ“ZZ‚”[|¶¶ÊÑã.0Oa€†•¨³»ÃÎÙä ƒ4‘š¨¨$¨*¨.¨M¨n¨n¨t¨„(+1È(È(Ñ(Û(õ(ø(…,H88Vfppzz„–£¦¨±¾¾Øßßù$3BXXXhhzzˆ–¬¬å 4 4 B P c c – É Ï Ï Ï á †ÜH»è è  - +^ +g +m +„ +› +² +ò + ( - 2 = T f s † œ ° µ À à å è   $ , 1 K e m u z ” œ ¡ Á Æ É ã ý    ) C K S U o w w |  Œ Œ — — £ £ µ õ   sôi¢6f6fLfXfcfhftff„f‹ff›f f f¿fÞfàfåfðfõfõfg3gZgZgmg€g“g¦g«g«g¾gÑgäg÷gügügh"h5hHhJhJh]hphƒh–h–h–h¤htœè‹ÎkÎkìkllll$lDlIl_lwlclƒl’l¤l­lµl½l×lélòlúlmmm'm9mCmKmPmkmWm‹mwm—m­m™mÍm¹mÙmëmõmýmýmnn$n=nOn^nbnbninnnŒnŽn“nžn´n´n´n¸nÄnånónoo/o=oKoMoMofouo„o‡o«o¯oÕoÙopp'p+p+p+p1p?pIpbphpsppp‰pp¨p³pÁpËpäpçpïpûpýpqq!q#q/q1q9q?qXqpq|q‘q–q¨q·qÐqáqáqìq÷qrr0r5rGrVror€r€r†r‘r™r§r®rÀru4š£ƸƸÚ¸߸å¸é¸í¸ ¹¹vÌô#ÎFÎFðFGG0GLGYGpGƒGŽGG°G¸G¸GÇGÇGÏGÛGñGHH H3H9H9H9H>HCHRH]HtHvH{HŠH•H¢H¬H¬HºHwHžV6V6j6v66—6ƒ6£6¥6¬6·6Ã6Ë6x ‹66*6K6S6y †ŠÖ5Ö5ê5 66z8{…f5f5‡5t5“5ž5©5´5¿5Ë5Ñ5{$#(î¬î¬ý¬ ­­­|$).­­+­9­>­D­}$/4F­F­S­a­f­l­~$5:n­n­|­‹­­–­ V¬V¬e¬x¬~¬€0 Þ$Þ$%ò$%'% %?%G%hÑçÆjÆjÜjèjþj kkk7k;kAk`kTkqksksk¤k’kskÃkÍk‚[{)))!)3)R)X)_)~)€)Ÿ)±)Ð)Ö)Ý)Ý)å)í)ø)* ***)*4*S*[*ƒ0‘™f¸f¸t¸z¸~¸¸¾¸¾¸ĸ„ð9ðð((22<N[^`ivv——±¸ÎÎÜëú  22@NddÖììú   N ‡ ‡ ‡ ™ …ØHº    º ½ Ì Ì Ù ê í ð ð õ ú  +  - -! -2 -5 -8 -8 -= -B -K -V -\ -k -~ -ƒ -˜ -£ -­ -­ -Ö +# +6 +; +P +[ +e +e +Ž +™ +¤ +Í á -ì - ) G M R ] { ‚ ‡ › Õ Ú à æ í ò ò ø þ    A G L j q q q v y  … Œ ‘ ‘ — ¢ ¢ ¸ Ò à õ û   + 2 4 N U U U U U U [ ` d f i t € ƒ … ‰ ‰ Ž Ž Ÿ ± ‡$†®ì®ì¼ìÑì×ìˆ`ÈÜØ0Ø0ø01111!1*1/14141E1I1P1h1k1w1‰Tï2222)2;2F2T2a2o22Œ2š2 2¦2Š$d©0606U6a6k6q6{66‹6™6£6µ6¿6Å6Ï6Õ6ß6æ6ò6ø67,7;7>7@7J7\7f7{7{7~7ˆ77¢7²7½7Â7Ö7é7ó7888&8.8<8M8]8n8{8{8ˆ8ˆ88×8‹¼+V 4 484:4F4J4W4Z4t4t4t4z4~4†4‘4¥4±4³4³4¼4¾4¾4Ç4É4É4Ò4Ô4Ô4Ý4Ý4æ4ì4ï4ù4 -5555„5Œh+X3X3h3o3{33‰3—3ª3¶3Í3Ú3Ú3Ý3ë3û3444@ 3333'333C3H3K3O3W3ŽHVdˆ5ˆ55¤5©5·5Ì5Ò5Þ5ï5ï5ö5*60ÀȘ0˜0¦0°0»0Æ0Ì0Ò04 ¨2¨2¼2È2Ö2Ú2ò2õ2ý2‘$êïà1à1é1õ1ú1’,ãê°1°1¾1Å1Õ1Ø1Þ1“,Üãx1x1†1’1¢1©1¯1”8¶À`0`0n0u00Œ00‘0—0•t ÕîÈTÈTåTôTôTôTUUUU#U%U%U+U-U-U3U5U5U[>[D[I[I[O[T[T[Z[_[_[e[j[j[j[r[r[‹[™[³[É[É[Ë[Ë[Ô[Ú[ß[ß[ß[ç[ç[ð[ÿ[\\\\#\(\(\(\0\2\2\;\;\;\D\S\g\i\i\r\x\z\z\€\†\†\Ž\—\\©\©\°\Ä\Æ\É\Î\Ö\Þ\ã\ã\é\í\ò\]]]]]']N]N]T]b]s]]†]”]£]»]Á]Æ]Æ]Ë]Þ]ê]ò]^ ^^#^*^,^5^5^;^I^U^h^{^^•^—^ª^¯^¯^Ì^Ì^Þ^ä^í^ó^ü^ -___"_(_*_5_G_Z_Z_n_z_Œ_‘__£_¦_½_¿_Â_Ò_Ü_ß_ß_î_```$`*`-`D`F`I`Y`]`e`s`x`}`}`ƒ`‹```–`–`¤`ª`°`º`Ä`ç`ê`ì`ö`ö`ø`aa -aaaaa"a"a'a2a7agDgRg]gbghgpgugugugugugugugugugugŽg”gg£g«g°gµg¾gÉgÒgÚgßgßgßgågígògògögûgûghhh+h1h1h:hNhNhTh]hqhqhzh|h‚h‹hŸhŸh¨h¨h¨h­h²h²hºh¿h¿hÜhêhöhÿhiiiiii0i9i?iQi[i[icicikimimi†ii™i›i›i›i¡i¥i§i§i§i§i¬i²i¸i¼iIm–ĉ¶pJpJ–J§J¬J³JÂJÂJÊJÝJáJæJûJýJKK K K#K/K6K:KAKIKKKSK`KnKvKxK{K‰K•K£K«K³KÁKÅKÓK—<ƒŽL>L>Z>a>l>t>{>>‡>‡>>˜P®¾ÎíÎíÜíîíôíüíîîî/î5î8îtî™\¾Ñvîvî„î–îœî¤î¶î¼îÅî×îÝîæîøîþîOïšhBXÐ;Ð;à;ç;ó;ú;<<<<)<2<@<L<U<^<g<m<u<›Xt†ÜIÜIòIþIJ -JJ+J1J=JEJPJVJYJcJœHŽœ”>”>®>µ>¾>Ê>ß>ç>í>ó>õ>õ>?TARhphpvp„pp–p¦p·p¼pÙpßpæpípûpqUqž@¢®ŽíŽíží¯í¸í¾íÂíÅíÍíŸXoìì,ì:ì@ìFìWìeìsì…ì‰ììì ìªì H”¢6í6íFíZícíií{í{íí‚íŠí¡H†”ÞìÞìîìí íí#í#í'í*í2í¢tîPmPmnmrmvm~mˆm‹mŽmm¡m¥m­m¶mÂm×mèmïmömömnnn£hLb„H„H¦H°H³H³H½HÐHÒHßHáHìHIIII#I+I.I@I¤´œE???&?&?@E@R@Y@l@t@|@@@™@¥@­@²@²@Ê@×@ß@ä@ä@ü@AAA!A-ACANAqAuAƒA‹AAA¨AÂAÌAØAàAåAåABB!B&B>BJBYB^BmBzBBBB‚B‡B‡B‡B¦B²BÃBÅBÈBÍBÍBÍB×BéBðBÿBCCC#C,C4C>C>­`Xlx<x<Š<‘<“<Ÿ<¦<µ<À<Ì<Ð<Þ<ð<ü<= ==®,ELTHTHbHkHyHH¯”0:®:®\®f®r®w®‡®®¢®¶®Ä®Ò®é®ñ®û® -¯¯ ¯'¯*¯*¯*¯,¯;¯E¯N¯V¯Y¯k¯°P1Aˆoˆo–o§o³oÎoÓoóoõop+p+p3p:pap±Ð7NN0N4NuNƒN‰N£NÂNÐNÐNÕNÙNàNëNöNO O OOOO(O5O7ODOFOHOHOHOPOPOPOXO`OhOpOtO~OÊO²`äø`M`MvMvMzMM’M•MšMšM¤MªMªM»M½MÇM³LøÈMÈMÜMàMåMðMðMúMNNN N´˜7YÐOÐOäOèOñOôOýOPPPAPEPJPMPVPfPmPpPxP{PˆPP˜P P§P·P·PÃPµ,&-&ð&ð4ðCðGðJðPð¶|YtÈPÈPÚPÜPàPéPõPQQQBQFQKQWQjQtQwQ‚Q…QQ—Q·<ÎÙØLØLìLðLõLÿL -M MMM¸<Ùä M M4M8M=MGMQMTMXM`M¹$@(@(J(R(W(º,!X(X(f(w(ˆ(‹(‘(»`iýÞ·Þ·ø·¸!¸!¸'¸/¸7¸?¸G¸M¸Z¸Z¸`¸e¸e¸k¸p¸p¸v¸{¸{¸¸†¸†¸Œ¸‘¸‘¸—¸œ¸œ¸¢¸§¸§¸­¸²¸²¸¸¸½¸½¸Õ¸è¸î¸ó¸ó¸ü¸ ¹ ¹ ¹'¹)¹)¹0¹2¹2¹9¹;¹;¹B¹D¹D¹K¹M¹M¹T¹Z¹\¹\¹c¹i¹k¹k¹r¹x¹x¹€¹†¹Œ¹”¹”¹”¹”¹ ¹¨¹°¹¸¹À¹È¹Ð¹Ö¹î¹ý¹º -º -ººº º º$º,º3º;ºCºGºMºUº\ºdºlºpºvºº‡º”º º¦º®º²º¹ºÁºÉºÍºÓºÛºâºêºòºöºüº» »"»3»8»;»á»¼`ÕiÖ³Ö³ð³ù³´´ ´'´/´7´?´E´R´R´X´]´]´c´h´h´n´s´s´y´~´~´„´‰´‰´´”´”´š´Ÿ´Ÿ´¥´ª´ª´°´µ´µ´Í´à´æ´ë´ë´ô´µµµ µ!µ!µ(µ*µ*µ1µ3µ3µ:µ<µ<µCµEµEµLµRµTµTµ[µaµcµcµjµpµpµxµ~µ„µŒµŒµŒµŒµ˜µ µ¨µ°µ¸µÀµÈµÎµæµõµÿµ¶¶ ¶¶¶¶¶$¶+¶/¶7¶?¶E¶M¶T¶\¶d¶h¶n¶y¶¶Œ¶˜¶ž¶¦¶ª¶±¶¹¶Á¶Å¶Ë¶Ó¶Ú¶â¶ê¶î¶ô¶ÿ¶··+·0·3·Ù·½0 þ®þ® ¯¯¯#¯)¯¾$°'°'¿'Ø'Þ'¿pýæ»æ»ú»¼¼(¼,¼3¼:¼C¼R¼T¼T¼h¼j¼s¼y¼y¼y¼y¼¼À`¢æ°æ°±±±±$±&±2±2±?±A±N±P±\±\±r±{±{±†±±œ±§±­±²±´±À±Ç±Ö±á±ç±ì±î±ú±ú±²²#²)²/²5²9²9²f²m²ƒ²²•²›²¡²£²£²±²ÁP¢²¶²¶²Ì²Ï²Ò²ß²å²å²ò²õ²ø²þ²³ -³Â”²Ó³³*³6³:³>³E³L³[³f³l³q³s³³†³Ž³”³š³ž³ž³­³´³¼³Â³È³Ê³Ê³Ö³Ã,!(®¯®¯·¯Å¯Ë¯Í¯Ò¯Ä¸«®y®yÈy×y×yÚyãyïyïyûyz1zCzUzYziz‰z›z¡z´z½zÁzÇzÐzÐzñzõz{{0{B{H{[{m{y{{{‡{{“{™{¢{¢{¢{¢{´{Ê{Ð{Ü{ñ{ø{| |!|(|(|(|6|D|N|Q|_|i|l|~|ƒ|ˆ|˜|›| |°|³|·|À|È|Ú|â|ë|}}}(}/}7}I}O}^}o}o}v}v}v}„}’}œ}Ÿ}­}·}º}Ì}Ñ}Ö}æ}é}î}þ}~~~~(~0~9~9~D~[~s~w~ƒ~›~£~©~µ~¾~Â~Ê~Ó~Ó~Ó~ì~ô~ú~"(...5GS[aggi{Å|Æ’Æ’Ô’é’ð’û’“Q“m““““™“¥“®“¶“¾“À“Æ“Ì“Ø“à“æ“è“î“Æ0 Ö®Ö®ä®ë®ó®ø®þ®Ç<(3֯֯߯߯í¯ñ¯ø¯û¯°È<3>°°°°°!°/°2°7°É<>I>°>°G°G°U°Y°`°c°h°Ê8ISn°n°w°w°z°ˆ°–°™°ž°Ë @D–½–½¤½°½Ì$ ø'ø'( ((Í$ à'à'é'ñ'ö'ÎD$v;v;“;›;­;É;Ô;æ;í;þ;<<< <><><S<U<U<a<i<m<z<z<†<Ž<’<Ÿ<Ÿ<Ÿ<¬<²<Ã<Ã<È<à<ï<ô<ú<= -= -=='=6=;=A=L=Q=Q=_=h=t=|=„=Œ==•=š=£=µ=¾=Ï=ß=ß=ä=ì=ô=÷=ý=ý=>>>> >>>W>n>{>ƒ>‹>—>£>©>°>¹>½>À>Ì>Ò>Ù>Þ>Þ>ì>ü>ü> ? ???"?1?6?6?=?H?N?V?\?g?l?l?{?†?˜?ž?¦?¬?±?¼?Î?Ô?Ü?â?ç?ç?û?@ @@@$@*@*@L@s@x@x@Œ@’@¨@¹@¿@Ä@Ý@ã@ó@û@A AAA"A(A>AOAUAZAsAyA‰A‘A™AŸA¤A¤AºAÀAÖAçAíAòABBB B(B.B5B:B:BPBVBlB}BƒB…B”BšB¤B¬B´BºBÁBÁBÁBÓBÜBíBýBýBCCCC)Ceseseve{e~e~e…eœe£e°eµeÄeÑeäeäeøeüeff4f9f9fIfQfafkf{f…f•f¡f¦f¦f¶f¾fÎfØfèfòfggggg'g5g?gDgQgfgfgkgug„g‰gg”g”g™g£g²g·g½gÂgÂgÈgÎgÓgÓgâgõghhh-h5h;hDh[hoh€hh’hªh½hÔháhéhühi -iiii!i!i!i!i!i-i-i-i6iOidili‡i˜i¥i§i»iÀiÀiÀiËiÙiÞiÞiåióiøijj.j:j@jOjSj\jej‚jŽj”jšj­jµj½jêjûjk -kkkkk$k2k7kJkVkbkhklkukzkzkzkzkzk’k—k—k—k—k—k¨k¨k¨k¨k¨k¨k¨k¨k¨k¨k±kÊkßkçkll l"l6lBlGlGlGlPljlvll©l©l®l®l®l®l®l®l®l®lÃlÈlÈlÈlÙlälélélélmm.m2mJmZmbmjmŸm¨m¬mÄmÔmÔmÔmÔmÔmöm/n8n„F„[„]„h„p„…„…„¡„©„°„¶„º„¾„̈́ބô„………)….…:…E…J…J…k………Š…’…¡…©…±…Æ…Ë…Ö…Þ…ó…ø…††&†.†C†O†T†`†k†p†p†p†p†p†p†{†{†{†{†{†{†{†{†{†{†{†{†††¦†ÆÓ†Ù†á†ô†ù†‡ ‡ ‡‡&‡,‡4‡<‡>‡^‡f‡o‡w‡‡„‡‰‡‡›‡Ç·Ö‡å‡ï‡ˆ ˆˆˆˆˆ#ˆ,ˆ/ˆ9ˆGˆYˆ[ˆmˆˆˆˆŠˆˆ¬ˆ±ˆ±ˆºˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆ¿ˆʈֈ∉‰‰=‰B‰J‰Q‰^‰f‰o‰w‰~‰ƒ‰ƒ‰‹‰“‰¯‰·‰º‰¼‰̉Ö‰Ö‰Ö‰؉ë‰ü‰ÿ‰Š -ŠŠŠŠŠ%Š,Š9ŠRŠYŠ^ŠvЀЛдмŠÉŠâŠéŠéŠîŠîŠîŠîŠîŠîŠîŠîŠîŠîŠîŠîŠîŠîŠîŠîŠîŠöŠ‹ ‹‹ ‹ ‹(‹0‹=‹B‹B‹B‹F‹K‹K‹[‹`‹`‹`‹v‹‚‹”‹§‹­‹µ‹Ê‹Ñ‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Ù‹Û‹Û‹ö‹ü‹ -Œ -ŒŒŒ!Œ/Œ<Œ<Œ<Œ@ŒKŒiŒwŒƒŽÑø{†Ž†ŽœŽ§Ž®Ž¹ŽÄŽÛŽæŽíŽýŽ%?FOVYenux}“¯µÁÖÝåñ   )36DNQchm}€…•˜œ¥­¿ÇÇÇÝçùÿ ‘ ‘'‘/‘A‘G‘V‘g‘g‘n‘n‘n‘|‘Š‘”‘—‘¥‘¯‘²‘đɑΑÞ‘á‘æ‘ö‘ù‘ý‘’’ ’(’(’4’B’B’E’P’n’|’Å’Ò´pÙ——0—H—O—V—a——’—•—ž—¥—­—À—Ñ—Ý—í—û—þ—˜˜˜&˜,˜<˜A˜P˜Z˜p˜|˜‘˜™˜¤˜¯˜º˜ŘИܘè˜û˜™™/™F™N™W™_™‡™™•™Ÿ™Ÿ™¬™¿™Å™Í™à™æ™î™î™ü™šš.š4š<šOšUš]š]š†š†šŒš­š±š´š¿šÙšåšõš›1›E›M›W›v›Š›Š›œÓ`pî“î“”&”+”B”T”Z”d”r”z”‰”Ÿ”¡”ª”À”ΔÖ”Þ”à”ë”ö”ö”þ”•••"•+•3•6•?•M•^•p•s•x•‹•£•·•¿•¿•ѕԕٕ앖– – –A–D–I–\–b–w–––¤–º–––Í–ì–ó–þ–—ÔØ³bb/bAbObXbzb„b’b¯b¼b¼bÆbÆbÞbîbîbùbc ccc)c0c;cScYc\cqcvccŒc¦cÁcÕcöcd ddd"d/d5dVdZd`dhdmdud–dšd d¨d­d­dºdÀdÛdÇdçdëdñdùdþd e#e)e1e@e[eGegekeqeye~eŸe£e©e±e±e¶eÃeÉeêeîeôeüef%f)f/f7f7fDfJfkfofuf}f…f¦fªf°f¸f¸f¸fÍfÍfÍfÍfØfâfëf gg(g-g>gRgWgWgbgjgrg{g›g¨g·gÆgàgågågðgøghhh(hBhThfhqhvhvhh—h¬h¸hÉhÎhßhóhóhûhóhiii'i,i,i;i@i@iQiViVigililiiŽi“i“i¦iµiºiºiÜiáiáijjj*j/j/jQjVjVjsjšjŸjŸjÁjÆjÆjãj -kkk1k6k6kSkzkkk¡k¦k¦kÃkêkïkïklll1l6l6l6lQlVlVlVlqlvlvlvl‘l–l–l±l¶l¶l¶lÑlÖlÖlÖlñlölölölmmm'm,m,m=mBmBmNmYmnmsmsmm˜mmÀmÇmÑmÖmçmñmnnn'n2n:n?n?nCnGnNnXnbnbnunznznzn~n—n n nÃnÈnÈnÐnänínoo o*o5oGoSo\oaoaoaoroošo¤o¯o´o¿oÇoÌoÌo×oßoèoóopp3pGpLpLpWpjptpp p¬p½pÂpÓp×pÜpÜpìp÷pÿpqqq'qAqSqeqpquq€qˆqq˜q¥q°qÊqÜqîqîqîqîqóqøqøqrr;rYrYrcrwrrƒrr—r´rÅrÏrÚrýr s0s;sSscshshsssxsxs€s‹sss˜s£s¨s¨s°sÎs¸sæsësësóstûs)t.tBt.tZt_t_tltqtqtyt~t~tŠt›t­t²t²tÆt²tÞtãtãtëtðtðtuuuu u u:uJuOuOuiuyu~u~u˜u¨u­u­uÇu×uÜuóuÜu vvvv v\vJv vtvyvµv£vyvÍvÒvÒvávñvövövwwww)w7wŒIŒUŒcŒŒ™ŒªŒ¸ŒëŒ÷ŒüŒ*6GL]|ªÐÓãååéŽŽŽŽ$ŽRŽrŽrŽrެÕ0.¯.¯7¯=¯E¯T¯c¯h¯Ö0!n¯n¯|¯‚¯†¯•¯¤¯ª¯×,¶½¶½¿½É½Ù½ä½ä½¾ØØ4fþ¾þ¾¿¿¿B¿B¿_¿r¿…¿˜¿¿¿»¿É¿Ü¿ï¿÷¿÷¿ù¿ù¿ù¿ ÀÀÀÀÀ(À;À;À;ÀMÀYÀlÀ‚À‡ÀŽÀ•ÀªÀ½ÀÄÀÄÀÇÀìÀÙ¤/T®ú®úÈúÎúÕúÝúåúèúóúûûûûû-û-û0û8ûNûQû_ûbûeûlûpûxû†û˜ûžû¦ûÛûÚD¬9p„p„ˆ„²„º„º„Ȅۄô„÷„………………%…'…'…/…1…1…9…9…B…H…M…M…V…b…f…k…q…v…v…~…‡……’…’…—…£…»…Ú…Ý…ò…†††††††#†%†%†%†-†/†/†/†7†9†9†D†D†J†O†V†a†q†q†q†q†x†ƒ†“†“†ž†¢†¨†À†Î†á†í† -‡ ‡‡&‡.‡7‡B‡B‡M‡S‡X‡_‡j‡o‡v‡‡‡“‡¨‡°‡¶‡Ø‡ä‡ê‡ï‡ö‡ˆˆˆˆˆ ˆ ˆ'ˆ2ˆ=ˆ=ˆ=ˆ=ˆ”ˆÛDýÊæ¥æ¥¦¦¦ ¦$¦*¦<¦B¦Z¦`¦~¦’¦¦£¦Å¦Å¦Õ¦ê¦ì¦ï¦û¦§ §§!§'§-§9§9§;§M§S§X§X§o§o§§§ §­§²§²§É§Ò§á§÷§¨¨¨+¨8¨J¨P¨Z¨f¨s¨u¨u¨}¨‚¨‚¨Š¨¨¨—¨œ¨œ¨¤¨©¨©¨¯¨´¨´¨»¨À¨À¨Ç¨Ì¨Ì¨×¨Ü¨Ü¨ç¨ì¨ì¨÷¨ü¨ü¨©©©#©)©,©3©6©A©H©K©]©_©e©p©p©p©z©’©§©·©È©Î©ß©å©ê©ô©ªª%ª+ª<ªGªQª`ªoªuª€ª†ª›ª¡ª²ª½ªÃªÓªÓªãªöª« -««!«'«8«C«H«e«z«ˆ«˜«¤«¶«Á«Ð«Ò«ä«ì«ñ«ø«ü« -¬¬¬$¬*¬5¬;¬=¬J¬W¬a¬†¬†¬Œ¬“¬Ó®Ü4¤í†¢†¢ ¢¤¢¼¢Ä¢Ì¢Ö¢Ú¢á¢ç¢û¢££ ££!£)£4£?£A£Y£`£g£r£}££Š£•£—£££¬£¬£Â£ã£é£ï£¤¤¤!¤'¤'¤/¤3¤>¤C¤U¤`¤d¤r¤t¤x¤‡¤‡¤‡¤˜¤˜¤¤¯¤µ¤#¥Ý˜Š¬8ƒ8ƒFƒXƒ\ƒdƒlƒwƒ‚ƒŠƒ•ƒ ƒ¥ƒ½ƒÄƒËƒÖƒáƒãƒîƒùƒûƒ„„„&„.„.„2„i„Þl ¤ޑޑ«‘²‘º‘őݑç‘ç‘ÿ‘ ’$’:’H’L’l’€’‡’Š’£’­’¾’À’Ñ’Ñ’Ø’ß’è’í’ò’ù’““!“1“5“5“?“U“Y“Y“k““““““𓥓¬“µ“À“ǓГۓâ“â“í“ ”””B”B”H”O”^”f”t”{”””“”“”“”¥”­”Ó”á”á”å”ú”•••2•7•E•T•\•j•u•y•~•†•Š•™•›•ª•¬•»•½•̕ӕٕí•õ•– -–––)–.–L–T–b–i–m–u–ƒ–Š–Ž–ª–²–½–Ã–Ã–Ã–Ì–×–ç– ———+—3—>—C—K—V—b—f—q—v—ˆ——›—›—›—›—©—¸—Õ—á—é—ù— ˜'˜+˜Z˜@˜j˜j˜t˜{˜Š˜™˜¡˜¯˜¶˜º˜¼˜Ë˜Ó˜á˜è˜ì˜ì˜î˜™™™™™™$™6™>™V™‚™™”™²™¹™À™Ë™á™ã™ê™ý™šššš š3š;šIšPšTšTšTšTšbšmš|š„š’šš¡š¡š¦š®š²šÁšÃšÒšÔšãšåšôšûš›››+›2›6›F›Q›V›t›|›Š›‘›•››«›²›¶›Ò›Ú›å›ë›ë›ë›ô› œ#œ3œ>œSœXœcœsœ•œœ¨œ·œ¿œÊœÏœ×œâœîœòœýœ'''';K`mq…–«¸¼Êßïž ž8ž:žEžMžMžVžkž|ž“ž¬žÅžÇžÒžÚžÚžÚžôžŸŸ%ŸBŸQŸ}Ÿ„Ÿ„Ÿ”Ÿ¨ŸÂŸÂŸÆŸÜŸëŸ  ( 0 0 R R e € ‰ ž ¾ Í ù ¡¡6¡F¡^¡^¡v¡v¡‚¡š¡²¡»¡»¡»¡Ç¡Ø¡ð¡ù¡ù¡¢ ¢¢¢¢ßPíý&¥&¥8¥M¥^¥q¥x¥€¥¥˜¥©¥¯¥á¥àSv v ™ ® ³ » à Ë Ø Þ ç í ò ú     - - / K Q S U b b b g p x  ‰ ‹ “ › £ ° ¶ Á È Ø ã ï    % 6 = E E Y i q t Ú ádVïVïbïyï‰ïï•ï™ï£ï­ïµï¸ï¾ïâp6 6 L W b p {  ’ ˜ © ¯ » Ò Ò ä õ     m ãœTwÞûÞûúûÿûüüü!ü1ü9üAüFüQü[üaülü|ü„ü”ü›ü£ü«ü³ü»üÀüËüÙüÙüïüä”*KVÇVÇ^ÇbÇnÇÇǑǜǮǹÇÄÇëÇëÇÈÈÈÈ È&È9ÈBÈPÈaÈ}ȂȟÈå f*îÀîÀÁÁÁ&Á(Á(Á9Á9Á9ÁAÁIÁ[Á[ÁÁÁÁ›ÁÁÁ¨Á­ÁÇÁÌÁÌÁÌÁáÁãÁðÁòÁÿÁÂÂÂÂ%Â4ÂAÂCÂWÂdÂdÂdÂmÂ’˜ ¢¯¯ÂÄÂÄÂÄÂÏÂÙÂñÂöÂöÂöÂà -ÃÃÃ"Ã4Ã?ÃDÃDÃKÃOÃ]ÃdÃmÃtÆÃÔÃÃ¹Ã¾Ã¾Ã¾Ã¾ÃÆÃÑÃßÃßÃÿÃÿÃÿÃÄÄ#Ä6ÄIÄKÄKÄKÄ^Ä^ÄeÄlÄqÄwĉēĮÄ×ÄÝÄÝÄñÄöÄÅÅÅ-Å:ÅEÅLÅPÅPÅPÅPÅ[ÅeÅs੮ÅÇÅÇÅÕÅÿÅÆ#Æ:ÆMÆRÆRÆRÆZÆeÆwÆ‚Æ‡Æ‡Æ‡Æ™ÆÆÆÌÆÌÆÌÆ×ÆáÆíÆøÆúÆúÆúÆÿÆ Ç ÇUÇæ¤>n n † ˜ ž ª µ à Ï æ ñ !!! !%!8!>!G!M!_!e!p!x!†!“!Ð!ç’ÐÆÆäò -(.39GN]bnŒ—ª±Ëèô'CL[cpy~½ÂÊãõ  %kF{¶‘ÆÉé}èP™iöËöËÌÌÌ&Ì0ÌHÌXÌaÌgÌkÌoÌq̴̶̙̦̬̰̺̉̾̾ÌáÌåÌëÌëÌòÌÍ)Í<ÍOÍUÍ\ÍgÍqÍuÍxÍÍ…Í‹Íͧͬ͡ͳÍÀÍÂÍÔÍÖÍÛÍèÍêÍüÍüÍüÍüÍüÍÎ)Î5ÎOÎOÎdÎpÎαÎËÎÐÎçÎìÎúÎÏÏÏ-ÏBÏHÏXÏeÏ}Ï„ÏϛϨϴϴϴϺϽÏÀÏÙÏßÏóÏùÏÐ Ð ÐÐÐ*Ð*Ð0Ð>ÐUÐ[Ð^ÐaÐhÐoÐvÐvÐ{ЈЕЕЛЩÐÀÐÆÐÉÐÌÐÓÐÓÐäÐéÐöÐÑÑ -ÑÑÑ!Ñ(Ñ3ÑGÑGÑaÑfÑmÑuÑ|Ñ‹ÑјѰѵÑÞÑéÑðÑøÑÒ%Ò%Ò@Ò@ÒZÒoÒvÒ˜Ò«ÒÏÒÑÒÛÒýÒýÒýÒÓ$Ó2ÓJÓNÓ#Ôé S’Þ Þ  09;HHJdjln{{{{Ž—Ÿ¨°·½¿Ûßñ -#00DKR[ir’˜œ¡¦©³¶ÆêP&¾ï¾ïÊïáïñïõïýïð ððð ð&ðë4îøîøùNù?ùùùbùjùì ÐÏ~~›¦¹¦Óááñú;GSYd††™¤ª±¶¶ÉÔßæîûû "''':?RX_tˆˆ¢¢§®¶½¿ÇÎÎÝãð÷ú$3>EG[mrwwwŠž¥¬ÁÕÕÚÚâøý)8JYlp›ªÇÒ׿ý +;=KXho„‹—¨¿ÁÍØÚÚåù '<CS_€‡“´´´¼ÇËÓ×âéù#*5>FKKZgu€‹™Ÿ¥«´»ÍÚâîü)+7X^djs„®·ÁÎæíù##05GMMMMí€Ïë4FLXoo‡’¢®·½ÃÎÜéõBî4-6VðVðdð„ðŠððð–ðïH f*f*t*~*ˆ*˜**£*¯*±*Ã*Ã*Å*õ*ðˆ{™®Ê®ÊÀÊÕÊßÊèÊêÊñÊË ËËËËË/Ë2Ë2ËSË^Ë`Ëyˀ˄ËË£ËöËñ$ .¾.¾7¾K¾P¾ò$޾޾—¾¶¾»¾óp4¾¾¾¾Ì¾Ö¾ß¾æ¾í¾÷¾÷¾ý¾ô$ ¾¾¾(¾.¾õ$V¾V¾d¾ƒ¾‰¾öÐK{¦È¦ÈºÈÏÈÞÈâÈðÈöÈÉÉÉ É*É5É<ÉLÉvÉ|ÉɅɕɕɫɭɷɨÉãÉåÉþÉÊÊÊÊÊ(Ê0ÊCÊ­Ê÷ø€ºf/f/„/‡//¡/©/º/Ç/Í/Ò/Ò/ß/è/î/þ/ 0 0&020>0>0L0_0j0n0000„0„00Ÿ0²0¸0½0Ñ0×0ß0ñ0÷0ù0111!1&1,12191E1L1N1S1[1]1b1n1p1u1}11„1Œ1Ž1“1›11¢1¬1®1³1½1½1½1Í1Í1Í1ä1ê1ð1û122!2'22262<2G2`2k2v2|2‰2Ž2“2“2¨2°2¸2Ö2á2ì2ò23 -333)30393E3K3W3[3`3p3{3†3ˆ3Ž3›3 3¥3¾3É3Ô3Ô3Ú3ç3é3î3÷344&4,49494=4B4B4S4U4U4h4j4j4}444’4”4”4§4©4©4»4»4Á4Æ4Æ4Ý4ñ4æ4þ45 555/515J5J5d5g5i5u5‡5—5£5º5Ô5Ù5í5ý56666/6A6L6T6\6`6n6t6y6y66“6£6¨6¨6®6´6¹6¹6¹6¿6Î6á6î6ò6÷6÷6û67777767L7X7X7^7k7m7x7„7“7¦7¦7³7¿7¿7¿7¿7Ã7È7Ù7ë7ö7þ7888 8-898?8L8L8c8s8s8‡8“8•8ž8ª8Á8Á8Ç8Ô8Ö8è8è8ó8ó8ó8ó8ó8o;øŒ/nùnùŽù–ùšù¨ù®ù´ùáù÷ù úú0ú6úBúGúUútú}úúú–ú–úœúœú¬úù  Cö*ö*+++.+F+L+Z+k+s+z++¶+Ð+Ý+ê+ú+,,,5,<,B,P,X,n,y,,…,¨,ú,JÖ!Ö!ó!û!""("."9"P"_"j"n"y"…""œ"³"Ê"Ý"ô" ###+#1#B#H#X#X#p#p#•#•#š#š# #¬#¹#Å#Ú#ñ#$ $$)$@$X$y$y$‚$‡$‡$‡$‡$—$ $¨$­$»$É$Ù$Þ$Þ$ö$ö$û$û$%%"%(%4%D%O%Y%]%f%%‚%’%Ÿ%¯%¿%Æ%Ì%Ø%à%ë%ò%ö% &&&'&-&=&M&M&z&œ&¨&°&»&Â&Í&Ï&Ú&Ú&ê&ï&ï&ù&'''*'7'D'N'R'['t'w'‡'Ž'“'“'§'§'¬'°'À'É'Û'á'ã'ã'ñ'÷'ý'(( (0(0(0(5(M(M(\(_(s(‘(œ(Å(×(â(ô(ø(ý())&)>)E)I)O)W)b)e*ûC€®,®,Ê,Ñ,é,- ----&-2-=-K-[-k-r-y-Ž-£-£-·-Ï-Ü-ë-ø-..%.3.:.A.V.k.k..Œ.š.ª.°.Á.Á.Ç.Õ.æ.ó./e/üˆwÕöüöüý#ý*ý2ý5ý5ýEýPýPýSýZýaýhýnýtý{ýý’ý’ý”ýý©ý¯ýÕýÜýßýïý÷ýüýüýþ þþ þ&þ1þBþBþKþPþZþaþhþpþvþxþ†þþ þ¯þ»þÈþÈþÈþÈþÎþàþæþ÷þÿ,ÿ@ÿGÿQÿYÿ`ÿ`ÿiÿpÿÿÿšÿšÿšÿ®ÿÂÿÒÿÕÿý|Ôo¶ã¶ãØãßãîãùã ä ä(ä*ä*ä1ä[äeäeätäƒä˜ä£ä£ä²ä¹äÉäÏäíäøäúäåå$å4åFåOåZå_åeålå‘å–å¤å­å­å´åÃåÚåÚåéåïåæ -æææ!æ'æ/æUæ^æeæjæuæææ¤æ©æ±æ½æÏæÏæææíæõæççç&ç&ç5ç;çOçXçhçwçŒç•ç¥ç¸çÃç×çøçèè è6èRèdèjèuèè‘è¡è¦è¯è¯èÁèÅèÑèèèééé'é3éCéSéeékéképéréréwéwé†éŒé’é’é–éìþ¼iÔ&Ô&ÔDÔOÔZÔ€Ô€Ô‚Ô–Ô¡Ô§Ô¸ÔÇÔÖÔãÔãÔéÔîÔóÔÕÕ$Õ(Õ:ÕKÕSÕZÕuÕƒÕƒÕƒÕŽÕªÕ•Õ»Õ²ÕÅÕÇÕãÕÏÕëÕùÕùÕûÕÖÖÖ$Ö-Ö4Ö7ÖNÖYÖmÖ`ÖuÖ{քքք֤֤֗֜֜֯ÖÄÖÍÖÍÖÍÖÍÖéÖ×× × × ×&×+×+×7×T×r×w×|×|׈ץ״×Ã×Ë×Ð×Ö×Û×Û×â×é× Ø)Ø+ØHØ]Ø]ØcØcØw؀؀حظؽØÑØÜØäØìØüØÙÙ#Ù#Ù5Ù;ÙcÙlÙlÙnÙuÙzÙzَٟٙ٨٨ٻÙÏÙáÙìÙúÙÚÚ/Ú8ÚCÚHÚOÚWÚjÚÚ„Ú‹Ú˜ÚŸÚ±ÚÆÚÍÚÓÚÜÚÜÚÿÚÛ ÛÛ)Û7Û7Û=ÛDÛMÛMÛ`ÛrÛuÛuÛ†ÛŽÛ–Û¢Û¿ÛÆÛÓÛÕÛÜÛðÛÿÛÿÛÿÛ&Ü&Ü&Ü:Ü:ÜOÜZÜlÜy܄ܒÜܬܳÜÍÜàÜâÜñÜÝÝÝ+Ý+Ý1Ý:Ý:ÝNÝTÝfÝfÝzÝ}݈ݚݡݬݱݹÝÀÝËÝÐÝåÝêÝÞÞÞÞÞ"Þ)Þ=ÞKÞ`Þ`ÞfÞmÞvÞ{ޜޥޥޫ޴޴ÞÓÞÓÞçÞêÞðÞùÞß ßß$ß/ß/ßCßFßLßUß]ßhßz߀ߋߋߟߢߨ߱߳ßÕßèßýßàà à&à.à.à.à.à9à´ãÿÄB¯&ñ&ñHñSñZñcñsñ…ñŒñ’ñ˜ññÂñÏñÒñÛñíñóñøñò.ò2ò8òOòVòdòjòvò€ò…òŒò¥ò¯ò¸òÈòÊòÑòÖòÞòýò óó1óPóWóaópóvó|ó‚óˆóžó¿óÓóßóöóô -ôô*ô7ôEô`ômôxôô°ôÂôÙôâôèôôôùôõõ"õ/õ6õ6õDõSõUõcõrõ„õ„õŒõ¯õºõîõXµîõîõö#ö6öAöSöaöhöwö~ö†öœö¤ö·öÌöÜöæöèöøö÷÷÷÷#÷*÷0÷6÷A÷L÷O÷V÷p÷x÷’÷§÷´÷·÷¿÷Ã÷Õ÷ä÷ï÷÷÷ø'ø+ø4ø;øMøUø\ø`øiøkø}ø”ø¢ø¨ø¬ø®ø»ø»ø»ø½øÔøÚøÚøìøÕ––¸ÀÆÓèöüüüü   '3>DNUffq{{“£©®µµÖÜëþ  .8==R\\py…› §º¾¾ÆÌÒÜãêó*.5;J]cgntzz|€‡“˜˜˜˜ÃÔÔëøü99?BFLL^o„˜ ±µÆÊÐéëñþ *1<_jpv|…Œ¡²º¾ÏÓÙòôú 39?ENUeŒ•››°µµ¼ÃÕÚÚÚôö,2:>Ehnt€—ž¤°µµ¼ÀÇÕ×ßäì÷ý !&5P`m|˜š¶¶½Ò×àíòùþþ     ( , 0 : F M Q Y a i x „ ‰ • • ž ž Á Á Ï Õ Ú Þ ã ã ã ã é ë ë  - - -7 -9 -9 -9 -D -D -D -I -l -r hëFF\nt™°°ÂÈÓãîü 5 DáîÈÈÑÜçòý)+;X¼ÎêÈêÈÉÉÉ#É0ÉEÉGÉYÉcÉxÉxÉÉ‚ÉÖÉH’­’­¬­¿­É­ЭÜ­õ­þ­®®®:®Lƒ’&&&-&=&D&[&v&ˆ&Œ&Ï&¨»á¸ ¸ È Ê Õ à ñ ü ,09<R]fovƒ—ž ¤¦¾Èdîƒ@@Ydt½ÄØßçïø -!(G_hhÇÐò )S_ƒŠ‘‘·÷7w·÷77FSXXgtvv~~~¦¿ØÚÚááïòÿ 1lsss{˜¦ÄÍÖò666Sa}›››¦©ÖØïõ -/<<`bizƒ…“•£¥³³ÓÓÓÓàó'4MUYaesƒ‹“›©··ÑÜò$;FPWp|ƒœœ®³µ»ÌÝìó  -/===aa~…Œ›ž¬°¾ÂÐÔÔíôù 5UhwyˆŠ™££±ºÐ×ü*Z_mo}† ¢¤«¼ÅÇÕ×åçõõ444?[€™žžžÀÅÅÅåêêê <Xlqqy| ¼ÐÕÕÜßä 388S`bqz”––›–¼¾¾Áÿÿÿ   ? D D D f k k k ‹ ¯ ´ ´ Ï Ý ß î ÷      9 ; ; > | | | ‡ ‡ ± ± Û ó !!,!EKEKENE\ElEƒE‡EEŒ<ÍØqDqD…DŒD˜D¤D´D¹D¼DÀDÈDD'ùFùFGGG(G=GCGOG`G`GgG›GŽ,„‹ B BB!B,B7B=BCB0ÄÌDD-D9DGDKDcDfDnD ®²QCQCZCfCkC‘(§­!C!C/C6CFCICOC’( ¦éBéB÷BCCC C“4zƒÑAÑAßAæAðAþABB B”Ø ¶¨HeHeeeteteteŽeŽeee£e¥e¥e«e­e­e³eµeµe¼eÀeÅeÅeÅeÅeÅeÅeÍeâeâeìeñeúeff&f(fCfEf`fef€f…f‹f‹f f£fÊf×fÿfïfgggg;g)gAgPgUg\gegxg€gˆgggg–g¯gµgµgÎgÜgög hhhh$h)h)h/h/h8hIhKh`hbhjhphxh}h}h}h}h‹hŸh¡hµhµh½hÃhËhÐhÙháhêhðhöhøhøhøhiii"i&i(i4i6iQiWi_idimixi{ii‡ii“i“i¡i¯i±iÔiñi÷iÿij jjjjjjj9jKjPj\jbjej|j~jj‘j•jœj¥j´jÂjÈjÐjÕjÝjâjâjëjøjýjkk&kNkNkTkYkYk_kdkdkjkokokukzkzk€k…k…k‹kkk–k›k›k¡k¦k¦k¦k®k®kÇkÕkïklllllllll$l$l,l5l;lGlGlNlbldlgllltl|lll‡l‹llŸl¤l®l¸l¸lÅlìlìlòlmmm$m2mAmWm]mbmbmgmzm†mŽmžm¨m±m¿mÆmÈmÑmÑm×måmñmnn+n1n3nFnKnKnhnhnzn€n‰nn˜n¦n«n«n¾nÄnÆnÑnãnönön +oo(o-o9o?oBoYo[o^onoxo{o{oŠoo¯o´oÀoÆoÉoàoâoåoõoùoppppp p'p,p,p2p2p@pFpLpVp`pƒp†pˆp’p’p”pœp¡p¦p«p«p±p¹p¾p¾pÃpÎpÓpØpãpèpqqqq q$q)q.q3q3q8q=qYq‹q‘q™q™q§q­q³q½qÇqêqíqïqùqr r r rrr#r#r(r(r.r6r;r;r@rKrPrUrZririrzr€r€rŽr”ršr¤r®rÑrÔrÖràrïrôrôrôrürs +sssss"s"s's2s7s\S\U\X\\\c\w\{\‡\Ž\’\™\¡\£\«\¸\Æ\Î\Ð\Ó\á\í\û\] ]]]+]–8ƒàOàOîOõOPPPPPP!P—L®½îýîýüýþþþ.þ4þ=þOþUþXþ”þ˜\¾Ñ–þ–þ¤þ¶þ¼þÄþÖþÜþåþ÷þýþÿÿÿoÿ™dBWaMaMqMxM„M‹M—MŸM¨M¬MºMÃMÑMÝMæMïMøMþMNšPp€8[8[N[Z[b[f[w[…[‹[—[Ÿ[ª[°[³[½[›DŽ›(P(PBPIPRP^PsP{PP‡P‰P‰P˜PœTü ¨¨¶ÄÏÖæ÷ü€ €&€-€;€G€•€<¢­®ý®ý¾ýÏýØýÞýâýåýíýžTo€6ü6üLüZü`üfüwü…ü“ü¥ü©ü¯ü½üÀüÊüŸD”¡VýVýfýzýƒý‰ý›ý›ýŸý¢ýªý D†“þüþüý"ý+ý1ýCýCýGýJýRý¡p©Á||®|²|¶|¾|È|Ë|Î|Ý|á|å|í|ö|}}(}/}6}6}@}C}U}¢dH]àYàYZ ZZZZ,Z.Z;Z=ZHZ\ZdZtZyZZ‡ZŠZœZ£ œ@˜P˜P®PºPºPÐP×PÙPõPõPõPüPQ +QQQQQQ4Q4QjQvQ‡Q—Q­Q²QµQºQºQºQÒQÙQæQíQõQúQúQRR&R+R+RCRPRXR]R]RuRRŠR’RšR¦R¼RÇRêRîRüRS S S!S;SESQSYS^S^S}S‰SšSŸS·SÃSÒS×SæSóSøSøSøSûSTTT T+TTATFTFTFTPTbTiTxTT‰TTœT¥T­TµT¼TÀTËTÖTÜTêTôTôTúTUU U U3U;U;U=U=U=UBUBUIUOUSUZU^U^U^U^UmUmU’U›U›UŸU­Y¤$pµèbèb ccc c)c4c@cHcRczczc†cˆcˆc”c™c™c¥cªcªc¶c»c»cÇcÌcÌcØcÝcÝcécîcîcúcÿcÿcÿcddd)d=dMdMdOdOd[dadfdfdldxdxdƒddœd±d¹d¿d¿dÐdÐdÙdÜdCe¥T^o Z ZÁZÈZ×ZÚZÞZæZêZîZöZ[%[,[8[¦ˆ#A!L!L=LLLVLcLjLyLLµLËLÜLãLñLM M M2MGMOMRM^M§<¾É¸]¸]È]Ï]î]ù]^^^$^,^¨<²½0]0]@]G]f]{]]Ž]˜]±]©|ÂÝX}X}n}w}‚}›}›}ž}­}³}¼}¾}Ä}Í}Ï}Õ}ß}æ}é}é}ó}ªDÞëø}ø}~~"~'~R~T~q~—~ž~¯~Â~«`l€©N©N²N¹NÍNáNæNO O'O)OGOIO`OtO}OO“O£OÔO¬\Xk N NN"N$N0N7NFNQN]NaNoNNN—NšN¤N­(AG°Y°Y¾YÇYÕYÛY®”0ª³ª³̳Ö³â³ç³÷³ý³´&´5´C´Q´h´p´z´‰´‘´ž´¦´©´©´©´«´º´Ä´Í´Õ´Ø´ê´¯LìûÈ~È~Ö~ç~ó~35Pkksz¡°Ì2h_h_ˆ_Œ_Í_Û_á_ø_`%`%`*`.`5`@`K`X`a`a`f`k`r`}`Š`Œ`™`›````¥`¥`¥`­`µ`½`Å`É`Ó` a±\àó¸^¸^Î^Î^Ò^×^ê^í^ò^ò^ü^_____²Hô _ _4_8_=_H_H_R_X_X_\_d_³”3T a a4a8aAaDaMaVahaha‘a•ašaa¦a¶a½aÀaÈaËaØaàaèaða÷abbb´(&,FFTcgjpµxUobb*b,b0b9bEbQbfbfb’b–b›b§bºbÄbÇbÒbÕbÝbçb¶8ÊÔ0^0^D^H^M^W^b^e^i^q^·8Õßx^x^Œ^^•^Ÿ^©^¬^°^¸^¸ À'À'Ê'Ò'×'¹( Ø'Ø'æ'÷'( ((ºeã>È>ÈXÈaÈÈȇÈȗȟȧȭȺȺÈÈÈÍÈÍÈÓÈØÈØÈÞÈãÈãÈéÈîÈîÈÉÉ É$É$É-ÉMÉMÉMÉTÉVÉVÉ]É_É_ÉeÉeÉlÉnÉnÉtÉtÉ{É}É}ɃɃɊɊɒɘɞɦɦɦɦɲɺÉÂÉÊÉÒÉÚÉâÉèÉÊÊÊÊÊ&Ê,Ê2Ê2Ê6Ê>ÊEÊMÊUÊYÊ_ÊgÊnÊvÊ~ʂʈʓʙʦʲʸÊÀÊÄÊËÊÓÊÛÊßÊåÊíÊôÊüÊËËËËË4ËEËJËMËóË»ædvÄvÄęĹĹĿÄÇÄÏÄ×ÄßÄåÄòÄòÄÅÅÅÅ Å Å%Å*Å*Å0Å5Å5ÅMÅ`ÅfÅkÅkÅtŔŔŔśÅÅŤŦŦŬŬųŵŵŻŻÅÂÅÄÅÄÅÊÅÊÅÑÅÑÅÙÅßÅåÅíÅíÅíÅíÅùÅÆ ÆÆÆ!Æ)Æ/ÆGÆVÆ`ÆcÆcÆmÆsÆyÆyÆ}Æ…ÆŒÆÆ˜Æ Æ¦Æ®ÆµÆ½ÆÅÆÉÆÏÆÚÆàÆíÆùÆÿÆÇ ÇÇÇ"Ç&Ç,Ç4Ç;ÇCÇKÇOÇUÇ`ÇeÇ{njǑǔÇ:ȼ, ƾƾԾ۾ã¾è¾î¾½ 0'0'?'X'^'¾häúöËöË +Ì Ì-Ì8Ì<ÌCÌGÌPÌ_ÌaÌaÌuÌẁ̆̆̆̆̎̿``´¦À¦ÀÄÀÈÀÕÀ×ÀäÀæÀòÀòÀÿÀÁÁÁÁÁ2Á;Á;ÁFÁMÁ\ÁgÁmÁrÁtÁ€Á‡Á–Á¡Á§Á¬Á®ÁºÁêÁ Â0Â@ÂBÂRÂbÂrÂrÂw‘˜ŸŸŸŸ¦¼ÂÈÂÎÂÔÂÚÂÞÂÞÂÞ ÃÃ(Ã4Ã:Ã@ÃFÃHÃHÃVÃÀDµÂVÃVÃlÃoÃrÃÅÒÕØÞàêÃÁÃã®Ã®ÃÊÃÖÃÚÃÞÃåÃìÃûÃÄ ÄÄÄ Ä&Ä.Ä4Ä:Ä>Ä>ÄMÄTÄ\ÄbÄhÄjÄjÄvÄÂ(!'n¿n¿w¿…¿‹¿¿’¿Ã´ª®Š®ŠÈŠ׊׊ÚŠãŠïŠïŠûŠ‹1‹C‹U‹Y‹i‹‰‹›‹¡‹´‹½‹Á‹Ç‹ЋЋñ‹õ‹ŒŒ0ŒBŒHŒ[ŒmŒyŒ{Œ‡ŒŒ“Œ™Œ¢Œ¢Œ¢Œ¢Œ´ŒÊŒÐŒÜŒñŒøŒ !(((6DNQ_il~ƒˆ˜› °³·ÀÈÚâ뎎Ž(Ž/Ž7ŽIŽOŽ^ŽoŽoŽvŽvŽvŽ„Ž’ŽœŽŸŽ­Ž·ŽºŽÌŽÑŽÖŽæŽéŽîŽþŽ(099D[swƒ›£©µ¾ÂÊÓÓÓìôú"(...5GS[aggi{Äxî£î£ü£¤¤#¤E¤y¤•¤§¤»¤Á¤ͤÖ¤Þ¤æ¤è¤î¤ô¤¥¥¥¥¥Å,ž¾ž¾¬¾³¾»¾À¾Æ¾Æ8(2–¿–¿Ÿ¿Ÿ¿­¿±¿¸¿»¿À¿Ç83=ƿƿϿϿݿá¿ï¿ò¿÷¿È8>Hþ¿þ¿ÀÀÀÀ À#À(ÀÉ4IR.À.À7À7À:ÀHÀVÀYÀ^ÀÊ &*ÆÍÆÍÔÍàÍË  x'x''‰'Ž'Ì  +`'`'i'q'v'ÍØ ®K®KiqËKÓKåKL LL%L6L>LFLILWLƒLƒL˜LšLšL¦L®L²L¿L¿LËLÓL×LäLäLäLM MMM!M9MHMMMSM^McMcMhM€MM”MšM¥MªMªM¸MÁMÍMÕMÝMåMèMîMóMüMNN(N8N8N=NENMNPNVNVN[N[N[NaNdNkNvN°NÇNÔNÜNäNðNüNO OOOO%O+O2O7O7OEOUOUObObOjOrO{OŠOOO–O¡O§O¯OµOÀOÅOÅOÔOßOñO÷OÿOP +PP'P-P5P;P@P@PTPZPePkPmP}PƒPƒP¥PÌPÑPÑPåPëPQQQQ6Q^V^^^€^œ^¤^§^­^³^³^Ä^Í^Ù^á^ä^ë^ñ^ö^__ _:_B_E_L_R_j_r_”_±_¹_¼_Ã_É_É_É_É_É_Î_Î_ä_ê_ö_ü_````,`8`A`M`U`X`_`e`j`|`‹`“`«`³`¶`½`Ã`Û`ã`aa$a'a.a4a4a4aEaNaZabaealarawa‰a˜a¤a¿aÇaÊaÑa×aïaûab:bBbEbLbRbRbRbRbRbWbWbjb…b‹b–b›b›b®bÄbÊbÕb×b×bêb cccc0c9cJcOcacqcqcvcvc‰cŸc¥c³cÂcÇcÇcÚcðcöcdddd.d4dQdidid“d™dždªd³dÂdÂdÇdÇdÝdãdeeeBeHeMeYebeqeqeveveŒe’e¯eÇeÇeñe÷eüeff f f%f%f;fAf^fvfvf f¦f¨f´f½fÈfÈfÈfÈfÍfÛfäfõf÷f gggg&g6g;g_gkglgqg†g£g³g×gçgígígígòg÷g h h]hmhshuhzh‹hšhÌhÔhÚhÜháhèhèhñhii i.i.i3i8iGiPi[i]ifiqiqi’i™iŸi§i²i¸iÈiÎiÖiáiçiçiìiñiøiÿij jj%j%j%j*j*j*jkGkJkJkUkWkikpkvk…kk›k¡kªk®k®kºkÃkÆkÆkÑkÓkåkìkòkúklll l#l'l'l/l6l9l;lFlJlSlVlVlalcl{l‚ll˜l›l¡l¦l¦l­l±l±l½lÆlÉlÉlÔlÖlèlïlõlmmm m)m-m-m9mBmEmEmPmRmdmkmqmym„mm•mŸm¢m¦m¦m®mµm¸mºmÅmÉmÒmÕmÕmàmâmúmn nnn n%n%n7n;n;nGnPnSnSn^n`nrnynn‘nœn§n­n²n²n½nÂnÂnÍnÒnÒnÝnànänënðnõnúnúnooo o$o5o=oAoUo\o`o`omoyoo‡o—o›o¬o¾oÉoÍoÍoÚoâoêoðoðoðoðoðoòoòoppp p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p0p0pGpOp[p[p|pŠp¢p¤p°p½p½pàpípøpq +qqqq&q&q)q;qYqeqeq–sÎÀ m–s–s³s»s¾sÌsÚsïsøst&t8tCtTtXtjtmtxttt tÑt¬tátõtuu u>uPutu…u‡uŽuÃuÃuÆuËuÎuÎuÕuìuóuvvv!v4v4vHvLvyvyv‘v–v–v¦v®v¾vÈvØvâvòvþvwwww+w5wEwOw_wkwpwpwpw’w wªw¯w¼wÑwÑwÖwàwïwôwúwÿwÿwxxx"x(x-x-x3x9x>x>xMx`xlxyx…x˜x x¦x¯xÆxÚxëxøxýxy(y?yLyTygyoyuy~y‡y‡yŒyŒyŒyŒyŒy˜y˜y˜y¡yºyÏy×yòyzzz&z+z+z+z6zDzIzIzPz^zcz{z‡z™z¥z«zºz¾zÇzÐzízùzÿz{{ {({U{f{s{u{ƒ{ƒ{ˆ{ˆ{{{¢{µ{Á{Í{Ó{×{à{å{å{å{å{å{ý{||||||||||||||||5|J|R|m|~|‹||¡|­|²|²|²|»|Õ|á|}}}}}}}}}}}.}3}3}3}D}O}T}T}_}q}‰}›}¼}Ü}ç}ø}ý}ý}ý}(~1~B~F~^~n~v~~~³~¼~À~Ø~è~è~è~è~è~ +CLPV[dmrrrr•³¾ÃÉÎÎáõ€&€.€4€4€9€9€H€\€z€…€Š€€•€•€¨€¼€â€í€õ€û€û€ "7?Zkxz‰‹‹‹‹‹ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ®½ÈÊÊÓÕÕéééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééëë‚ +‚‚‚‚ ‚/‚_‚n‚z‚‚ª‚­‚·‚Âé‚ ƒ)ƒMƒOƒbƒhƒ«ƒ«ƒ®ƒ¾ƒƃáƒòƒõƒ„„)„A„A„l„o„~„’„³„Ä„à„Ì„ü„…,…_…]…G…8…m…m…m…p…u…x…’… …Î…ð…ð…††-†A†b†s††{†«†Ɇü†ú†ä†Õ† +‡ +‡ +‡ ‡‡‡‡)‡J‡V‡­ŠÏœ«Î~~”˜£ªµÉÉÔåìù‘‘‘+‘+‘4‘9‘A‘Q‘_‘n‘y‘Œ‘Œ‘Ÿ‘Ÿ‘µ‘á‘á‘õ‘÷‘÷‘’ ’ ’’’’’,’,’,’0’8’>’C’C’G’O’S’Y’^’^’j’’’™’¬’±’¹’¹’¾’¾’Å’Ñ’æ’ö’“““!“&“.“4“4“9“@“K“s“~““—“Ÿ“¥“·“½““““““““““͓ٓæ“ö“ü“”””$”)”1”6”6”6”>”F”O”W”\”d”i”p”{”£”®”¶”Å”Ï”á”æ”ì”ñ”ñ”ø” +••%•-•5•J•L•W•_•t•t••˜•Ÿ•¥•©•­•¼•Í•ã•ï•÷• –––)–4–9–9–Z–t–y–––˜– –µ–º–Å–Í–â–ç–ó– ———2—>—C—O—Z—_—_—_—_—_—_—j—j—j—j—j—j—j—j—j—j—j—j—u—•—²——È—Зã—è—ð—ø—ú—˜˜˜#˜+˜-˜M˜U˜^˜f˜n˜s˜x˜˜Š˜²˜½˜ŘÔ˜Þ˜÷˜ü˜™ ™ ™ ™™™™(™6™H™J™\™n™n™n™y™~™›™ ™ ™©™®™®™®™®™®™®™®™®™®™®™®™®™®™®™®™®™¹™Å™Ñ™ñ™š š,š1š9š@šMšUš^šfšmšršršzš‚šžš¦š©š«š»šÅšÅšÅšÇšÚšëšîšñšùšþšþš› ›››(›A›H›M›e›o›Š›£›«›¸›Ñ›Ø›Ø›Ý›Ý›Ý›Ý›Ý›Ý›Ý›å›ð›û› +œœœœ œ,œ1œ1œ1œ5œ:œ:œJœOœOœOœ[œbœhœxœ‰œ¥œ¸œ¾œÆœÛœâœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœêœìœìœ  $/6R___cnŒš”ŸÐø{–Ÿ–Ÿ¬Ÿ·Ÿ¾ŸÉŸÔŸëŸöŸýŸ    * * F ` g p w z †  – ™ ž ´ ¾ РÖ â ÷ þ ¡¡'¡.¡.¡.¡<¡J¡T¡W¡e¡o¡r¡„¡‰¡Ž¡ž¡¡¡¦¡¶¡¹¡½¡Æ¡Ρà¡è¡è¡è¡þ¡¢¢ ¢,¢A¢H¢P¢b¢h¢w¢ˆ¢ˆ¢¢¢¢¢«¢µ¢¸¢Æ¢ТÓ¢å¢ê¢ï¢ÿ¢£££££'£/£A£I£I£b£j£j£m£x£–£¤£í£Ñ\oÂN¨N¨h¨{¨‚¨‰¨”¨§¨ª¨³¨º¨½¨ͨÛ¨æ¨ñ¨ô¨ +©©+©6©A©W©b©y©…©œ©¤©­©µ©Ý©à©æ©ë©þ©ª ª ª%ª-ª-ª;ªMªZªmªsª{ªŽª”ªœªœªŪʪéªìªìªóª«««)«5«E«e««•««§«Æ«Ú«Ú«P¬ÒXn¥¥<¥N¥S¥j¥|¥†¥¥ž¥¦¥µ¥Ë¥Í¥Ö¥ì¥ú¥¦ +¦ ¦¦"¦"¦*¦2¦<¦D¦N¦W¦_¦b¦k¦†¦—¦©¦¬¦±¦Ħܦð¦ø¦ø¦ +§ §§%§=§Q§Y§Y§z§}§‚§•§›§°§Ƨȧݧó§û§û§¨%¨,¨7¨N¨Ó¤¦>s>s_sqs|s…s§s±s¿sÙsæsæsðsðsttt#t-t3t9tzCzCzRzWzWzhzmzmz~zƒzƒz–z¥zªzªz½zÌzÑzÑzózøzøz{ { {A{F{F{h{m{m{Š{±{¶{¶{Ø{Ý{Ý{ú{!|&|&|H|M|M|j|‘|–|–|¸|½|½|Ú|}}}(}-}-}H}M}M}h}m}m}ˆ}}}¨}­}­}È}Í}Í}è}í}í}~ ~ ~(~-~-~>~C~C~T~Y~Y~e~p~…~Š~Š~–~¯~´~×~Þ~è~í~þ~(->IQVVZ^eoyyŒ‘‘‘•«´´×ÜÜäø€€(€3€>€I€[€g€p€u€u€u€†€£€®€¸€ÀÈ€Ó€Û€à€à€ë€ó€ü€/G[``k~ˆ“´ÀÎÓáåêêú‚ ‚‚‚*‚5‚O‚a‚s‚~‚ƒ‚Ž‚–‚›‚¦‚³‚¾‚Ø‚ê‚ü‚ü‚ü‚ü‚ƒƒƒƒ#ƒIƒgƒgƒqƒ…ƒƒ‘ƒƒ¥ƒƒÓƒ݃èƒ „-„>„I„a„q„v„v„„†„†„Ž„™„ž„ž„¦„±„¶„¶„¾„܄Ƅô„ù„ù„… … …7…<…P…<…h…m…m…z………‡…Œ…Œ…˜…©…»…À…À…Ô…À…ì…ñ…ñ…ù…þ…þ…†††)†.†.†H†X†]†]†w†‡†Œ†Œ†¦†¶†»†»†Õ†å†ê†‡ê†‡‡‡)‡.‡j‡X‡.‡‚‡‡‡Ç±‡‡‡Û‡à‡à‡ï‡ÿ‡ˆˆˆ#ˆ(ˆ(ˆ7ˆEˆJˆrˆ`ˆJˆŠˆˆ·ˆ¥ˆˆψÔˆüˆêˆÔˆ‰‰‰6‰ ‰`‰p‰u‰u‰‰|‰º‰ʉωωÛ‰à‰à‰ì‰ñ‰ñ‰ŠŠŠŠ,Š<ŠAŠAŠTŠdŠiŠiŠ|ŠŒŠ‘Š‘Š™ŠžŠžŠ¦Š«Š«Š³Š¸Š¸ŠÀŠÅŠÅŠØŠÝŠÝŠðŠõŠC‹1‹ ‹õŠP‹U‹£‹‘‹‹U‹°‹µ‹µ‹Ä‹ß‹ä‹ä‹õ‹ŒŒŒ&Œ4Œ9Œ9ŒAŒFŒFŒNŒSŒSŒ[Œ`Œ`Œ˜Œ†ŒgŒ·ŒÒŒ׌׌ýŒÞŒ.IN€nN˜Ï½çìŽìŽ#Ž@Ž#ŽXŽ]Ž]ŽiނޒޣŽÉŽËŽáŽçŽAƒ`———£¨¨»ÆÐÕàêïï /;FK_Kkv{{†”™™¤¯´´ÅÊÊÛààú‘ +‘‘ +‘‘#‘7‘#‘C‘H‘P‘H‘\‘a‘u‘a‘‘†‘†‘𑆑¦‘¦‘¦‘«‘·‘«‘ʑϑϑۑϑî‘ó‘ó‘ÿ‘ó‘’’’#’’6’;’O’;’[’g’r’}’‚’–’‚’¢’®’¹’Ä’É’Ý’É’é’ú’ÿ’ÿ’“ “ ““““"“'“'“0“5“5“>“C“C“N“S“S“^“c“c“n“s“s“~“ƒ“ƒ“Ž“““““ž“£“£“®“³“Ç“³“Ó“Þ“é“ô“ù“ù“””””””!”&”&”0”5”5”=”B”B”O”T”T”a”f”f”f”f”f”n”s”s”{”€”€”ˆ”””•”š”š”¢”§”»”§”ǔؔݔݔï”ú”• •5•@•Y•E•e•p•{•€•€•’••½••Ø•ã•ü•è•–––#–#–5–@–`–e–{–†–Ÿ–‹–«–¶–Á–Æ–Æ–ì–Ø–ø–——3—>—C—^—J—~—j—Š— —Œ—À—¬—Ì—×—Ü—Ü—˜î—˜.˜3˜I˜T˜Y˜t˜`˜”˜€˜ ˜¶˜¢˜Ö˜˜â˜í˜ò˜ò˜™™$™D™I™_™j™o™Š™v™ª™–™¶™Ì™¸™ì™Ø™ø™šššššš+š0š0š0š6š;š;š;šEšGšGšQš^š~š€š€šŠšŠšŠšŠšŠšŒšŒš£šªšµšµššÈšÏšÚšåšðšûš›)›!›A›I›r›j›Š›Š›Š›“›››®›´››Õ›Õ›í›÷› œ%œ%œFœVœkœ}œœœµœ¼œËœÝœÝœáœæœíœýœ 7>CCGR^l™¢³Áôžžž/ž;žIžNž\žxž£žÉžÌžÜžÞžÞžâžŸ Ÿ ŸŸŸHŸhŸhŸhŸ–¡Ô,î¾î¾÷¾ý¾¿¿#¿(¿Õ, .¿.¿<¿B¿F¿U¿d¿j¿Ö(æÍæÍïÍùÍ ÎÎÎ2Î×Ô4e.Ï.ÏDÏKÏNÏrÏrÏϢϵÏÈÏÍÏÍÏëÏùÏ Ð Ð'Ð'Ð)Ð)Ð)Ð<Ð>Ð>Ð>ÐEÐXÐkÐkÐkÐ}ЉМвзлÐÂÐ×ÐêÐñÐñÐôÐÑØ 1UÞ +Þ +ø +þ +    # 7 > A C L ] ] ` h ~   ’ • œ   ¨ ¶ È Î Ö  Ù0®6ø“ø“”A”I”I”W”j”ƒ”†”¢”¢”¢”ª”¬”¬”´”¶”¶”¾”À”À”ȔȔєהܔܔå”ñ”õ”ú”••• •••!•!•&•2•J•i•l•• • • •¨•ª•ª•ª•²•´•´•´•¼•¾•¾•¾•ƕȕȕӕӕٕޕޕޕޕå•ð•–––(–(–(–8–8–?–C–I–a–o–‚–Ž–·–º–Á–Ó–Û–ä–ï–ï–ú–———— ——'—/—5—W—c—i—n—n—u—€—€—…———————ö—ÚXþÐ^µ^µxµµŒµ—µœµ¢µ´µºµÒµØµöµ +¶¶¶=¶=¶M¶b¶d¶g¶s¶{¶ƒ¶‹¶™¶Ÿ¶¥¶±¶±¶³¶Å¶Ë¶Ð¶Ð¶ç¶ç¶···%·*·*·A·J·Y·o·z·ˆ·“·£·°·Â·È·Ò·Þ·ë·í·í·õ·ú·ú·¸¸¸¸¸¸¸!¸!¸'¸,¸,¸3¸8¸8¸?¸D¸D¸O¸T¸T¸_¸d¸d¸o¸t¸t¸¸¸˜¸Ÿ¸¥¸¨¸³¸¶¸Ê¸×¸æ¸í¸ð¸¹¹ +¹¹+¹:¹:¹:¹:¹D¹\¹q¹¹’¹˜¹©¹¯¹´¹¾¹Ï¹à¹ï¹õ¹ººº*º9º?ºJºPºeºkº|º‡ºººº­ºÀºÌºÔºäºëºñº» »»/»D»R»b»n»€»‹»š»œ»®»¶»»»Â»Æ»Ô»Þ»ä»î»ô»ÿ»¼¼¼!¼+¼P¼P¼V¼]¼¾Û0¥íþ±þ±²²4²<²D²N²R²Y²_²s²{²€²ƒ²Ž²™²¡²¬²·²¹²Ñ²Ø²ß²ê²õ²÷²³ ³³³$³$³:³[³a³g³x³~³‡³™³Ÿ³Ÿ³§³«³¶³»³Í³Ø³Ü³ê³ì³ð³ÿ³ÿ³ÿ³´´´'´-´›´Ü”Œ­À’À’Î’à’ä’ì’ô’ÿ’ +“““(“-“E“L“S“^“i“k“v““ƒ““𓥓®“¶“¶“º“ñ“Ýt ¤î î  ¡¡¡%¡=¡G¡G¡_¡i¡„¡š¡¨¡¬¡Ì¡à¡ç¡ê¡¢ ¢¢ ¢1¢1¢8¢?¢H¢M¢R¢Y¢`¢z¢¢‘¢•¢•¢Ÿ¢µ¢¹¢¹¢Ë¢ß¢ó¢ó¢ú¢£ ££ £'£0£;£B£B£M£k£o£x£¢£¢£¨£¯£¾£Æ£Ô£Û£ß£á£ó£ó£ó£¤ ¤3¤A¤A¤E¤Z¤b¤r¤}¤’¤—¤¥¤´¤¼¤Ê¤Õ¤Ù¤Þ¤æ¤ê¤ù¤û¤ +¥ ¥¥¥,¥3¥9¥M¥U¥c¥j¥n¥~¥‰¥Ž¥¬¥´¥Â¥É¥Í¥Õ¥ã¥ê¥î¥ +¦¦¦#¦#¦#¦,¦7¦G¦i¦q¦|¦‹¦“¦ž¦£¦«¦¶¦Â¦Æ¦Ñ¦Ö¦è¦ð¦û¦û¦û¦û¦ §§5§A§I§Y§i§‡§‹§º§ §Ê§Ê§Ô§Û§ê§ù§¨¨¨¨¨+¨3¨A¨H¨L¨L¨N¨`¨`¨r¨r¨r¨x¨„¨–¨ž¨¶¨â¨ð¨ô¨©© ©+©A©C©J©]©e©s©z©~©€©“©›©©©°©´©´©´©´©Â©Í©Ü©ä©ò©ý©ªªªªª!ª#ª2ª4ªCªEªTª[ªaªuª}ª‹ª’ª–ª¦ª±ª¶ªÔªÜªêªñªõªýª «««2«:«E«K«K«K«T«i«ƒ«“«ž«³«¸«Ã«Ó«õ«ý«¬¬ ¬*¬/¬7¬B¬N¬R¬]¬b¬t¬|¬‡¬‡¬‡¬‡¬›¬«¬À¬Í¬Ñ¬å¬ö¬ ­­­*­?­O­f­­˜­š­¥­­­­­¶­Ó­ä­û­®"®-®:®B®D®O®W®W®W®q®®®¢®¿®Î®ú®¯¯¯%¯?¯?¯C¯Y¯h¯ƒ¯Ž¯¥¯­¯­¯Ï¯Ï¯â¯ý¯°°;°J°v°„°š°³°Ã°Û°Û°ó°ó°ÿ°±/±8±8±8±D±U±m±v±v±}±†±Œ±˜±þ±ÞLîýž´ž´°´Å´Ö´ç´î´ö´µµ µ%µWµßSžžÁÖÛãëó">DFHUUWsy{}ŠŠŠ˜ ©±³»ÃËØÞéð 5<GM^bjj~Ž–™ÿà`vÿvÿ‚ÿ™ÿ­ÿµÿ¹ÿÃÿÍÿÕÿØÿÞÿáhF/F/\/g/r/€/‹/‘/¢/¨/¹/¿/Ë/â/â/ô/000)0/0}0â˜Vx  * / 6 @ F Q a i q v  ‹ ‘ œ ¬ ´ Ä Ë Ó Û ã ë ð û    ã*JÞ×Þ׿×ê×öר ØØ$Ø6ØAØLØsØsØŒØØØØ§Ø®ØÁØÊØØØìØÙ Ù*Ùäf)ÑÑ@ÑHÑNÑVÑXÑXÑiÑiÑiÑqÑyыыѯѱѱÑËÑÍÑÍÑØÑÝÑ÷ÑüÑüÑüÑÒÒ Ò"Ò/Ò1Ò>ÒFÒNÒUÒdÒqÒsÒ„Ò‘Ò‘Ò‘ÒšÒ¬Ò¿ÒÅÒÍÒÏÒÜÒÜÒñÒñÒñÒüÒÓÓ#Ó#Ó#Ó1Ó7Ó<ÓDÓOÓaÓlÓqÓqÓxÓ|ÓŠÓŽÓ—ÓžÓ¼ÓÉÓÐÓÙÓõÓúÓúÓúÓúÓÔ ÔÔÔ;Ô;Ô;ÔBÔPÔ_ÔrÔ…Ô‡Ô‡Ô‡ÔšÔšÔ¡Ô¨Ô­Ô³ÔÅÔÏÔêÔÕÕÕ-Õ2ÕVÕ]ÕiÕ‡ÕšÕ¥Õ¬Õ°Õ°Õ°Õ°Õ»ÕÅÕÓÕõÕÖÖ'Ö'Ö5ÖƒÖ–Ö§Ö¾ÖÑÖÖÖÖÖÖÖÞÖéÖûÖ× × × ××J×P×P×P×[×e×q×|×~×~×~׃×××Ù×å >~0~0–0¨0®0º0Å0Ó0ß0ö011#1)1/151H1N1W1]1o1u1€1ˆ1–1£1à1æ“Ôî î   - 2 P V [ a o v … Š – ¨ ¨ Æ Ñ ä ë !"!.!I!a!}!†!•!!ª!³!¸!É!÷!ü!""/"?"E"P"Y"_"¥"€"µ"ð"Ë"####·#çL™h~Ü~ܜܢܥܮܸÜÐÜàÜéÜïÜóÜ÷ÜùÜÝ!Ý.Ý4Ý8Ý<Ý>ÝBÝFÝFÝiÝmÝsÝsÝzݜݱÝÄÝ×ÝÝÝäÝïÝùÝýÝÞÞ ÞÞÞ)Þ/Þ4Þ;ÞHÞJÞ\Þ^ÞcÞpÞrÞ„Þ„Þ„Þ„Þ„Þ¦Þ±Þ½ÞÔÞÔÞéÞõÞß6ßPßUßlßqßߖߛߡ߲ßÇßÍßÝßêßà àà à-à9à9à9à?àBàEà^àdàxà~à…ààà•à¢à¯à¯àµàÃàÚàààãàæàíàôàûàûàá ááá á.áEáKáNáQáXáXáiáná{áˆáˆáá™á á¦á­á¸áÌáÌáæáëáòáúáââââ5â:âcânâuâ}â–âªâªâÅâÅâßâôâûâã0ãTãVã`ã‚ã‚ã‚ã›ã©ãºãÒãÖã«äèT’*16>XacpprŒ’”–££££§¶¿ÇÐØßåç   , 2 F K X X l s z ƒ ‘ š º À Ä É Î Ñ Û Þ î éL%ÞÿÞÿêÿ!+5=@Fê0 & & > € t H F ” œ ëÕÓ¾#¾#Û#æ#ù#æ#$!$!$1$:$A$E$N$N$V$Z$x$„$$–$¡$Ã$Ã$Ö$á$ç$î$ó$ó$%%%#%+%8%8%J%O%O%_%d%d%d%w%|%%•%œ%±%Å%Å%Ê%Ê%Ú%ß%ß%ä%ë%ó%ú%ü%& & && &-&4&7&Y&Y&a&p&{&‚&„&˜&§&¬&±&±&±&Ä&É&Ø&ß&æ&û&'''''2'7'K'R'W'W'c'r'„'“'¦'ª'¹'Ç'Õ'ä'( (( (4(;(B(R(T(b(r(t(‚((Ÿ(¦(»(Â(Î(ß(ö(ø()))))0)=)E)G)[)m)t)„))±)¸)Ä)â)â)â)ê)õ)ù)** **$*/*I*N*U*`*i*q*v*v*…*’* *«*¶*Ä*Ê*Ð*Ö*ß*æ*õ*+ +++$+;+=+F+Q+S+_+}+ƒ+‰++˜+©+Ð+Ù+ã+ð+,,,*,?,?,L,Q,c,i,i,i,i,%-ìxÔî&-&-D-V-\-h---‘-—-¢-²-¾-Ç-Í-Ó-Þ-ì-ù-..".".R.í0-5vv„¤ª°°¶îD v:v:„:Ž:˜:¨:­:³:¿:Á:Ó:Ó:Õ:;ï„{˜6Û6ÛHÛ]ÛgÛpÛrÛyÛ‰Û”Û–Û Û Û¦Û·ÛºÛºÛÛÛæÛèÛÜÜ ÜÜ+Ü~Üð  ^Î^ÎgÎ{΀Îñ ¾Î¾ÎÇÎæÎëÎò4%îÎîÎüÎÏÏÏÏ'Ï-Ïó  6Î6ÎDÎXÎ^Îô †Î†Î”γιÎõÌKz.Ù.ÙBÙWÙfÙjÙxÙ~ÙÙٜ٧ٲٽÙÄÙÔÙþÙÚ Ú ÚÚÚ3Ú5Ú?Ú`ÚkÚmÚ†ÚŠÚ˜ÚÚÚ¤Ú°Ú¸ÚËÚ5Ûö½~?~?œ?Ÿ?¥?¹?Á?Ò?ß?å?ê?ê?÷?@@@$@&@E@V@]@i@y@y@‡@š@¥@©@º@º@º@¿@¿@Ë@Ú@í@ó@ø@ AAA,A2A4ACAPAVA\AaAgAmAtA€A‡A‰AŽA–A˜AA©A«A°A¸AºA¿AÇAÉAÎAÖAØAÝAçAéAîAøAøAøABBB B%B+B6B;BCB\BbBmBqBwB‚B›B¦B±B·BÄBÉBÎBÎBãBëBóBCC'C-C;V;\;j;{;ƒ;Š; ;Æ;à;í;ú; +<<<#<E<L<R<`<h<~<‰<<•<¸<ù(Kæ1æ12 22&282>2I2`2o2z2~2‰2•2 2¬2Ã2Ú2í233)3)3;3A3R3X3h3h3€3€3¥3¥3ª3ª3°3¼3É3Õ3ê3444-494P4h4‰4‰4’4—4—4—4—4§4°4¸4½4Ë4Ù4é4î4î455 5 55 52585D5T5_5i5m5v55’5¢5¯5¿5Ï5Ö5Ü5è5ð5û5666 6,676=6M6]6]6Š6¬6¸6À6Ë6Ò6Ý6ß6ê6ê6ú6ÿ6ÿ6 77&7,7:7G7T7^7b7k7„7‡7—7ž7£7£7·7·7¼7À7Ð7Ù7ë7ñ7ó7ó788 88$808@8@8@8E8]8]8l8o8ƒ8¡8¬8Õ8ç8ò899 99&969N9U9Y9_9g9r9u:úD€¾<¾<Ú<á<ù<==&=&=+=6=B=M=[=k={=‚=‰=ž=³=³=Ç=ß=ì=û=>>*>8>F>M>T>i>~>~>’>Ÿ>°>À>Æ>×>×>Ý>ë>ü> ??{?û„yÖ& & H S Z b e e u € € ƒ Š ‘ ˜ ž ¤ « ±   Ä Í Ù ß   $))06GMS^oox}‡Ž•£¥³ÊÍÜèõõõõû $EVjq{ƒŠŠ“š¦¶ÁÁÁÕéùü·üxÔnæóæóôôô)ôOôOôXôZôZôaôˆôôôžô­ôÂôÍôÍôÙôàôðôöôõ õ!õ:õ@õKõ[õmõvõõ†õŒõ“õ¸õ½õËõÔõÔõÛõêõöööö*ö1ö8ö=öHöNöVö|ö…öŒö‘öœö¨ö·öËöÐöØöäööööö ÷÷÷,÷>÷D÷M÷M÷\÷b÷v÷÷÷ž÷°÷¹÷É÷Ü÷ä÷ø÷ø0ø4ø@øWøsø…ø‹ø–ø¢ø²øÂøÇøÐøÐøâøæøòø ù%ù7ù=ùHùTùdùtù†ùŒùŒù‘ù“ù“ù˜ù˜ù§ù­ù³ù³ù·ù0üý¸iÓ®ä®äÌä×äâäåå +åå"å(å9åHåWådådåjåoåtå‡åšå¥å©å»åÌåÔåÛåöåææææ+ææ<æ3æFæHædæPælæzæzæ|æ˜æ˜æŸæ¥æ®æµæ¸æÏæÚæîæáæöæüæçççççç%ç%ç0çEçNçNçNçNçjçç‡çŒçŒç¡ç§ç¬ç¬ç¸çÕçóçøçýçýç è&è5èDèLèQèWè\è\ècèjèèªè¬èÉèÞèÞèäèäèñèúèúè'é2é7éDéOéWé_éoé†é†é–é–é¨é®éÖéßéßéáéèéíéíéúéê êêê'ê4êFêQê_êhêmê”êê¨ê­ê´ê¼êÏêäêéêðêýêëë+ë2ë8ëAëAëdëkëpë~ëŽëœëœë¢ë©ë²ë²ëÅë×ëÚëÚëëëóëûëì$ì+ì8ì:ìAìUìdìdìdì‹ì‹ì‹ì˜ì˜ì­ì¸ìÊì×ìâìðìûì +íí+í>í@íOídífítí‰í‰íí˜í˜í¥í«í½í½íÊíÍíØíêíñíüíî îîî î5î7îQîfîfîfîhîoîvî‡î•î§î§î­î´î½îÂîãîìîìîòîûîûîïï'ï*ï0ï9ïAïLï^ïdïoïoï|ïï…ïŽï–ï¡ï³ï¹ïÄïÄïÑïÔïÚïãïåïðð/ð5ð@ðRðXð`ð`ð`ð`ðkðæóþÈB°FFhszƒ“¥¬²¸½âïòû ;NRXov„Š– ¥¬ÅÏØèêñöþ+7Qpw–œ¢¨¾ßóÿ!0=LYiw’Ÿª¿âô &+2ITahhv…‡•¤¶¶¾áì ÿT·&&Q[ny‹™ ¯¶¾ÔÜï 0@IOT[bhny„‡Ž¨°Êßìï÷û '/F_cls…”˜¡£µÌÚàäæóóóõ   $ ø×¾¾àèîû$$$13>HO[flv}ŽŽ™££µ»ËÑÖÝÝþ&,/557=CEEEV`eez„„˜¡§­ÃÈÏâææîôú --RV]cr…‹–œ¢¢¤¨¯µ»ÀÀÀÀëüü $,Aaagjntt†—¬ÀÈÙÝîòø&(4RYd‡’˜ž¤­´É×ßãôøþ ,.:X^djszбºÀÀÕÚÚáèúÿÿÿ57QW_cj“™¥¼ÃÉÕÚÚáåìúü ".39>FKZu…’¡½¿ÛÛâ÷ü##*.5CEMQU_krv~†Ž©®ººÃÃææôúÿ39?\^^^iiin‘—\ïV.V.l.~.„...©.À.À.Ò.Ø.ã.ó.þ. //E/@åñÈÈÑÜçòý)+;0+3H(H(Q(w(ˆ(Ž(Ž(–(T¥¶bÎbÎ|ÎΑΛΨνοÎÑÎÛÎðÎðÎ÷ÎúÎNÏD³³³/³9³@³L³e³n³r³„³‹³ª³H€Ž€%€%—%­%½%Ä%Û%ö%& &O&´»äp p ‚ … › ¬ · Â Ô ì ñ  +,>V[dkxŒ“•˜Ÿ¸ÄDò@@Ydt½ÄØßçïø +!(G_hhÇÐò )S_ƒŠ‘‘·÷7w·÷77FSXXgtvv~~~¦¿ØÚÚááïòÿ 1lsss{˜¦ÄÍÖò666Sa}›››¦©ÖØïõ -/<<`bizƒ…“•£¥³³ÓÓÓÓàó'4MUYaesƒ‹“›©··ÑÜò$;FPWp|ƒœœ®³µ»ÌÝìó  -/===aa~…Œ›ž¬°¾ÂÐÔÔíôù 5UhwyˆŠ™££±ºÐ×ü*Z_mo}† ¢¤«¼ÅÇÕ×åçõõ444?[€™žžžÀÅÅÅåêêê  !!((+0OeЦº¿¿Úçéø"CEEH†††¥¥¥ÆËËËíòòò    6 ; ; V d f u ~ ˜ š š Ÿ š À   Š     8 8 b z ’ ³ Ã Ø ð !! !1!K!b!i!{% LžP&P&i&k&r&ˆ&˜&ž&µ&Í&Ð&â&*' +$6;¶¶ºÒäþ $<Aþþ  'A \ No newline at end of file diff --git a/Compiler/Compiler.PRJ b/Compiler/Compiler.PRJ index 82c3857..5dbcf64 100644 --- a/Compiler/Compiler.PRJ +++ b/Compiler/Compiler.PRJ @@ -1,36 +1,39 @@ -#exe {OptOn(OPTf_WARN_PAREN);}; -#exe {OptOn(OPTf_WARN_DUP_TYPES);}; -#exe {OptOn(OPTf_KEEP_PRIVATE);}; -#include "/Kernel/Adam1a.HPP" +#exe { + Cd(__DIR__);; + OptOn(OPTf_WARN_PAREN); + OptOn(OPTf_WARN_DUP_TYPES); + OptOn(OPTf_KEEP_PRIVATE); +} +#include "/Kernel/KernelA.HPP" #exe {OptOn(OPTf_EXTERNS_TO_IMPORTS);}; -#include "/Compiler/CmpDefs.HPP" -#include "/Kernel/Adam1b.HPP" -#include "/Kernel/Adam1c.HPP" +#include "/Compiler/CompilerA.HPP" +#include "/Kernel/KernelB.HPP" +#include "/Kernel/KernelC.HPP" #exe {OptOff(OPTf_EXTERNS_TO_IMPORTS);}; #exe {OptOff(OPTf_KEEP_PRIVATE);}; -#include "CmpAsm" -#include "CmpExts" +#include "Templates" +#include "CExts" CCmpGlbls cmp; CUasmGlbls uasm; -#include "Unassembler" -#include "ICLCC" +#include "UAsm" +#include "CMisc" #include "Lex" -#include "Hash1b" -#include "Assembler" +#include "CHash" +#include "Asm" #include "OptLib" -#include "ExpParser" -#include "StmtParser" +#include "PrsExp" +#include "PrsStmt" #include "OptPass012" #include "OptPass3" #include "OptPass4" #include "OptPass5" #include "OptPass6" #include "BackLib" -#include "BackF1a" -#include "BackF1b" -#include "Back1a" -#include "Back1b" -#include "Back1c" -#include "OptPass789" -#include "CmpInit" -#include "CmpMain" +#include "BackFA" +#include "BackFB" +#include "BackA" +#include "BackB" +#include "BackC" +#include "OptPass789A" +#include "CInit" +#include "CMain" diff --git a/Compiler/CmpDefs.HPP b/Compiler/CompilerA.HPP similarity index 85% rename from Compiler/CmpDefs.HPP rename to Compiler/CompilerA.HPP index dd984c3..93053a0 100644 --- a/Compiler/CmpDefs.HPP +++ b/Compiler/CompilerA.HPP @@ -1,4 +1,21 @@ //Intermediate compiler codes +#define IS_0_ARG 0 +#define IS_1_ARG 1 +#define IS_2_ARG 2 +#define IS_V_ARG 3 //Variable Arg Cnt + +#define IST_NULL 0 +#define IST_DEREF 1 +#define IST_ASSIGN 2 +#define IST_CMP 3 + +class CIntermediateStruct +{ + U8 arg_cnt,result_cnt,type; + Bool fpop,not_const,pad[3]; + U8 *name; +}; + #define IC_END 0x00 #define IC_NOP1 0x01 #define IC_END_EXP 0x02 @@ -9,7 +26,7 @@ #define IC_CALL_END2 0x07 #define IC_RETURN_VAL 0x08 #define IC_RETURN_VAL2 0x09 -#define IC_IMM_U64 0x0A +#define IC_IMM_I64 0x0A #define IC_IMM_F64 0x0B #define IC_STR_CONST 0x0C #define IC_ABS_ADDR 0x0D @@ -70,9 +87,9 @@ #define IC_EQUAL_EQUAL 0x3A #define IC_NOT_EQUAL 0x3B #define IC_LESS 0x3C -#define IC_GREATER 0x3D -#define IC_LESS_EQUAL 0x3E -#define IC_GREATER_EQUAL 0x3F +#define IC_GREATER_EQUAL 0x3D +#define IC_GREATER 0x3E +#define IC_LESS_EQUAL 0x3F #define IC_PUSH_CMP 0x40 #define IC_AND_AND 0x41 @@ -164,18 +181,21 @@ #define IC_BR_NOT_ZERO 0x88 #define IC_BR_CARRY 0x89 #define IC_BR_NOT_CARRY 0x8A -#define IC_BR_NOT_EQUAL 0x8B -#define IC_BR_EQUAL_EQUAL 0x8C -#define IC_BR_GREATER_EQUAL 0x8D -#define IC_BR_LESS_EQUAL 0x8E + +#define IC_BR_EQUAL_EQUAL 0x8B +#define IC_BR_NOT_EQUAL 0x8C +#define IC_BR_LESS 0x8D +#define IC_BR_GREATER_EQUAL 0x8E #define IC_BR_GREATER 0x8F -#define IC_BR_LESS 0x90 -#define IC_BR_NOT_EQUAL2 0x91 -#define IC_BR_EQUAL_EQUAL2 0x92 -#define IC_BR_GREATER_EQUAL2 0x93 -#define IC_BR_LESS_EQUAL2 0x94 +#define IC_BR_LESS_EQUAL 0x90 + +#define IC_BR_EQUAL_EQUAL2 0x91 +#define IC_BR_NOT_EQUAL2 0x92 +#define IC_BR_LESS2 0x93 +#define IC_BR_GREATER_EQUAL2 0x94 #define IC_BR_GREATER2 0x95 -#define IC_BR_LESS2 0x96 +#define IC_BR_LESS_EQUAL2 0x96 + #define IC_BR_AND_ZERO 0x97 #define IC_BR_AND_NOT_ZERO 0x98 #define IC_BR_MM_ZERO 0x99 @@ -189,40 +209,33 @@ #define IC_BR_BTS 0xA0 #define IC_BR_BTR 0xA1 #define IC_BR_BTC 0xA2 -#define IC_BR_LBTS 0xA3 -#define IC_BR_LBTR 0xA4 -#define IC_BR_LBTC 0xA5 -#define IC_BR_NOT_BT 0xA6 -#define IC_BR_NOT_BTS 0xA7 -#define IC_BR_NOT_BTR 0xA8 -#define IC_BR_NOT_BTC 0xA9 -#define IC_BR_NOT_LBTS 0xAA -#define IC_BR_NOT_LBTR 0xAB -#define IC_BR_NOT_LBTC 0xAC - -#define IC_SWAP_U8 0xAD -#define IC_SWAP_U16 0xAE -#define IC_SWAP_U32 0xAF -#define IC_SWAP_I64 0xB0 - -#define IC_ABS_I64 0xB1 -#define IC_SIGN_I64 0xB2 -#define IC_MIN_I64 0xB3 -#define IC_MIN_U64 0xB4 -#define IC_MAX_I64 0xB5 -#define IC_MAX_U64 0xB6 -#define IC_MOD_U64 0xB7 -#define IC_SQR_I64 0xB8 -#define IC_SQR_U64 0xB9 -#define IC_SQR 0xBA -#define IC_ABS 0xBB -#define IC_SQRT 0xBC -#define IC_SIN 0xBD -#define IC_COS 0xBE -#define IC_TAN 0xBF -#define IC_ATAN 0xC0 -#define IC_NUM_ENTRIES 0xC1 -//Don't forget $LK,"IC_INIT_TABLE",A="FA:::/Compiler/CmpInit.CPP,IC_INIT_TABLE"$ +#define IC_BR_NOT_BT 0xA3 +#define IC_BR_NOT_BTS 0xA4 +#define IC_BR_NOT_BTR 0xA5 +#define IC_BR_NOT_BTC 0xA6 + +#define IC_SWAP_U8 0xA7 +#define IC_SWAP_U16 0xA8 +#define IC_SWAP_U32 0xA9 +#define IC_SWAP_I64 0xAA + +#define IC_ABS_I64 0xAB +#define IC_SIGN_I64 0xAC +#define IC_MIN_I64 0xAD +#define IC_MIN_U64 0xAE +#define IC_MAX_I64 0xAF +#define IC_MAX_U64 0xB0 +#define IC_MOD_U64 0xB1 +#define IC_SQR_I64 0xB2 +#define IC_SQR_U64 0xB3 +#define IC_SQR 0xB4 +#define IC_ABS 0xB5 +#define IC_SQRT 0xB6 +#define IC_SIN 0xB7 +#define IC_COS 0xB8 +#define IC_TAN 0xB9 +#define IC_ATAN 0xBA +#define IC_NUM_ENTRIES 0xBB #define KW_INCLUDE 0 #define KW_DEFINE 1 diff --git a/Compiler/Cmp.HPP b/Compiler/CompilerB.HPP similarity index 96% rename from Compiler/Cmp.HPP rename to Compiler/CompilerB.HPP index ba3a6cf..14db81c 100644 --- a/Compiler/Cmp.HPP +++ b/Compiler/CompilerB.HPP @@ -1,5 +1,5 @@ #help_index "Compiler" -extern U0 CmpInit(Bool first); +extern U0 CInit(Bool first); public extern I64 ExeFile(U8 *name,Bool just_load=FALSE); public extern I64 ExeFile2(U8 *name,Bool just_load=FALSE); public extern I64 ExePrint(U8 *fmt,...); @@ -10,15 +10,15 @@ public extern I64 ExePutS2(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE); public extern CCmpGlbls cmp; #help_index "Compiler/Directive" +#help_file "::/Doc/Directives" public extern Bool CTrace(Bool val); public extern Bool Echo(Bool val); public extern Bool GetOpt(I64 num); -public extern I64 IncludeDepth(); public extern Bool OTrace(Bool val); public extern I64 OTraceMask(I64 i=0b1001111101); -public extern Bool OptEqu(I64 num,Bool val); public extern Bool OptOff(I64 num); public extern Bool OptOn(I64 num); +extern U0 StreamDir(); public extern I64 StreamExePrint(U8 *fmt,...); public extern U0 StreamPrint(U8 *fmt,...); diff --git a/Compiler/ICLCC.CPP b/Compiler/ICLCC.CPP deleted file mode 100644 index 70b6e9b..0000000 --- a/Compiler/ICLCC.CPP +++ /dev/null @@ -1,424 +0,0 @@ -Bool OptEqu(I64 num,Bool val) -{//Set compiler option to value. - return BEqu(&Fs->last_lex->opts,num,val); -} - -Bool OptOn(I64 num) -{//Turn on compiler option. - return OptEqu(num,ON); -} - -Bool OptOff(I64 num) -{//Turn off compiler option. - return OptEqu(num,OFF); -} - -Bool GetOpt(I64 num) -{//Get state of compiler option. - return Bt(&Fs->last_lex->opts,num); -} - -Bool OTrace(Bool val) -{//Displays intermediate code after passes through optimization. - return OptEqu(OPTf_OPT_TRACE,val); -} - -I64 OTraceMask(I64 i=0b1001111101) -{//Ctrls which optimizer passes are displayed. - I64 old=Fs->last_lex->pass_trace_mask; - Fs->last_lex->pass_trace_mask=i; - return old; -} - -Bool CTrace(Bool val) -{//Displays assembly code output from compiler. - return OptEqu(OPTf_COMPILE_TRACE,val); -} - -Bool Echo(Bool val) -{//Displays text as it is being compiled. - return OptEqu(OPTf_ECHO,val); -} - -I64 IncludeDepth() -{//Returns how many #includes we are in. See $LK,"IncludeDepth",A="FF:::/Demo/Graphics/Camp.CPP,IncludeDepth"$. - CLex *lx=Fs->last_lex; - return lx->cur_lfn-&lx->lfns; -} - -U0 ICClassPut(CHashClass *c) -{ - I64 i; - if (!c) return; - if (c->ptr_cnt>4) { - PrintErr("put_class ptrcnt=%d\n",c->ptr_cnt); - while (TRUE) -//TODO: - Yield; - } - for (i=0;iptr_cnt;i++) - '*'; - c-=c->ptr_cnt; - if (c->str) - "%s",c->str; - else { - PrintErr("put_class str=NULL\n"); - while (TRUE) -//TODO: - Yield; - } - '' CH_SPACE; -} - -U0 ICArgPut(CICArg *a) -{ - if (a->type_pointed) - "%Z %Z %Z ", - a->type&RT_MASK,"ST_RAW_TYPES", - a->type_pointed&RT_MASK,"ST_RAW_TYPES", - a->type>>4,"ST_TY_TYPES"; - else - "%Z %Z ", - a->type&RT_MASK,"ST_RAW_TYPES", - a->type>>4,"ST_TY_TYPES"; - switch (a->type>>4) { - case TY_STK>>4: - "STK"; - break; - case TY_IMM>>4: - "#%X",a->disp; - break; - case TY_REG>>4: - "%Z",a->reg,"ST_U64_REGS"; - break; - case TY_DISP>>4: - "%X[%Z]",a->disp,a->reg,"ST_U64_REGS"; - break; - case TY_RIP_DISP32>>4: - "[%X]",a->disp; - break; - case TY_SIB>>4: - if (a->disp) - "%X",a->disp; - if (a->reg==REG_RIP) - '['; - else - "[%Z+",a->reg&15,"ST_U64_REGS"; - "%Z",a->reg>>8&15,"ST_U64_REGS"; - switch (a->reg>>14) { - case 0: "]"; break; - case 1: "*2]"; break; - case 2: "*4]"; break; - case 3: "*8]"; break; - } - break; - } -} - -U0 ICPut(CIntermediateCode *tempi) -{ - I64 opcode=tempi->ic_code,i; - if (opcode>=IC_END_EXP && opcode!=IC_NOP2) { - "%15ts %016X ", - DefineSub(opcode,"ST_INTERMEDIATE_CODE")+5, - tempi->ic_data; - if (tempi->r.type&TY_MASK) { - ICArgPut(&tempi->r); - "<-"; - } - if (tempi->a1.type&TY_MASK) - ICArgPut(&tempi->a1); - ','; - if (tempi->a2.type&TY_MASK) - ICArgPut(&tempi->a2); - '' CH_SPACE; - ICClassPut(tempi->ic_class); - if (tempi->ic_flags & ICF_LOCK) - "$$BROWN$$lock$$FG$$ "; - if (tempi->ic_flags & ICF_A2_TO_F64) - "$$LTBLUE$$a2d$$FG$$ "; - if (tempi->ic_flags & ICF_A2_TO_INT) - "$$GREEN$$a2i$$FG$$ "; - if (tempi->ic_flags & ICF_A1_TO_F64) - "$$LTBLUE$$a1d$$FG$$ "; - if (tempi->ic_flags & ICF_A1_TO_INT) - "$$GREEN$$a1i$$FG$$ "; - if (tempi->ic_flags & ICF_R_TO_F64) - "$$LTBLUE$$rd$$FG$$ "; - if (tempi->ic_flags & ICF_R_TO_INT) - "$$GREEN$$ri$$FG$$ "; - if (tempi->ic_flags & ICF_USE_F64) - "[F64] "; - if (tempi->ic_flags & ICF_USE_UNSIGNED) - "[unsigned] "; - if (tempi->ic_flags & ICF_USE_INT) - "[int] "; - if (tempi->ic_flags & ICF_NO_DEPEND_RESULT) - "-DEP "; - if (tempi->ic_flags & ICF_DEPEND_RESULT) - "+DEP "; - if (tempi->ic_flags & ICF_NOT_ADDR) - "NOT_ADDR "; - if (tempi->ic_flags & ICF_PUSH_RESULT) - "PUSH "; - if (tempi->ic_flags & ICF_PUSH_CMP) - "PUSH_CMP "; - if (tempi->ic_flags & ICF_POP_CMP) - "POP_CMP "; - if (tempi->ic_flags & ICF_DEL_PREVIOUS_INS) - "DELINS "; - for (i=0;i<3;i++) { - if (Bt(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0+i)) - "DONT_PUSH#%d ",i; - if (Bt(&tempi->ic_flags,ICf_DONT_POP_FLOAT0+i)) - "DONT_POP#%d ",i; - } - if (tempi->ic_flags & ICF_ALTERNATE_TEMPLATE) - "ALT_TEMP "; - '\n'; - } -} - -U0 LCCQuePut(CLex *lx) -{ - CIntermediateCode *tempi=lx->lcc.lcc_root.next; - while (tempi->ic_code) { - if (tempi->ic_flags&ICF_TRACE) - ICPut(tempi); - tempi=tempi->next; - } -} - -U0 LCCInit(CLex *lx) -{ - CLexCodeCtrl *tempcbh=&lx->lcc; - QueInit(&tempcbh->lcc_root.next); - QueInit(&tempcbh->lcc_next_misc); - tempcbh->lcc_root.ic_code=IC_END; -} - -CIntermediateCode *LCCAdd(CLex *lx, - I64 opcode_and_precedence,I64 arg, CHashClass *c,I64 flags=0) -{ - CIntermediateCode *tempi=MAlloc(sizeof(CIntermediateCode)); - tempi->ic_code=opcode_and_precedence.u16[0]; - tempi->ic_precedence=opcode_and_precedence.u16[1]; - tempi->ic_data=arg; - tempi->ic_class=c; - if (Bt(&lx->opts,OPTf_OPT_TRACE)) { - Bts(&lx->flags,Lf_OPT_TRACE_PRESENT); - flags|=ICF_TRACE; - } - if (lx->lock_cnt) - flags|=ICF_LOCK; - tempi->ic_flags=flags; - tempi->ic_line=lx->last_line_num; - QueIns(tempi,lx->lcc.lcc_root.last); - return tempi; -} - -U0 LCCPush(CLex *lx) -{ - CLexCodeCtrl *tempcbh=MAlloc(sizeof(CLexCodeCtrl)); - MemCpy(tempcbh,&lx->lcc,sizeof(CLexCodeCtrl)); - lx->lcc.lcc_next=tempcbh; -} - -CLex *LCCPopNoFree(CLex *lx) -{ - CLexCodeCtrl *tempcbh=lx->lcc.lcc_next; - MemCpy(&lx->lcc,tempcbh,sizeof(CLexCodeCtrl)); - return tempcbh; -} - -U0 LCCPop(CLex *lx) -{ - Free(LCCPopNoFree(lx)); -} - -U0 LCCAppend(CLex *lx, CLexCodeCtrl *tempcbh) -{ - if (tempcbh->lcc_root.next!=&lx->lcc.lcc_root.next) { - lx->lcc.lcc_root.last->next=tempcbh->lcc_root.next; - tempcbh->lcc_root.next->last=lx->lcc.lcc_root.last; - lx->lcc.lcc_root.last=tempcbh->lcc_root.last; - tempcbh->lcc_root.last->next=&lx->lcc.lcc_root.next; - } - if (tempcbh->lcc_next_misc!=&lx->lcc.lcc_next_misc) { - lx->lcc.lcc_last_misc->next=tempcbh->lcc_next_misc; - tempcbh->lcc_next_misc->last=lx->lcc.lcc_last_misc; - lx->lcc.lcc_last_misc=tempcbh->lcc_last_misc; - tempcbh->lcc_last_misc->next=&lx->lcc.lcc_next_misc; - } - Free(tempcbh); -} - -CLexCodeMisc *LCCMiscNew(CLex *lx,I64 ty) -{ - CLexCodeMisc *result=CAlloc(sizeof(CLexCodeMisc)); - result->addr=INVALID_PTR; - result->type=ty; - QueIns(result,lx->lcc.lcc_last_misc); - return result; -} - -CLexCodeMisc *LCCGoToLabelFind(CLex *lx,U8 *name) -{ - CLexCodeMisc *mc=lx->lcc.lcc_next_misc; - while (mc!=&lx->lcc.lcc_next_misc) { - if ((mc->type==CMT_GOTO_LABEL||mc->type==CMT_ASM_LABEL) && - !StrCmp(mc->str,name)) - return mc; - mc=mc->next; - } - return NULL; -} - -I64 LCCFloatConstFind(CLex *lx,F64 d) -{ - I64 i; - CLexCodeMisc *mc=lx->lcc.lcc_next_misc; - while (mc!=&lx->lcc.lcc_next_misc) { - if (mc->type==CMT_FLOAT_CONSTS) { - for (i=0;inum_consts;i++) - if (mc->float_consts[i]==d) - return mc->addr+i*sizeof(F64); - if (mc->num_constsfloat_consts[mc->num_consts++]=d; - return mc->addr+i*sizeof(F64); - } - } - mc=mc->next; - } - mc=LCCMiscNew(lx,CMT_FLOAT_CONSTS); - mc->float_consts=MAlloc(CM_MAX_CONSTS*sizeof(F64)); - mc->float_consts[mc->num_consts++]=d; - return mc->addr; -} - -U0 LCCDel(CLex *lx,CLexCodeCtrl *lcc) -{ - CLexCodeMisc *mc,*mc1; - U8 *undef=NULL; - QueDel(&lcc->lcc_root.next); - mc=lcc->lcc_next_misc; - while (mc!=&lcc->lcc_next_misc) { - mc1=mc->next; - switch (mc->type) { - case CMT_GOTO_LABEL: - case CMT_ASM_LABEL: - if (!(mc->flags&CMF_DEFINED)) { - undef=mc->str; - mc->str=NULL; - } else if (!mc->use_cnt) { - PrintWarn("Unused label %s\n",mc->str); - LexWarn(lx,"Unused label at "); - } - break; - case CMT_JMP_TABLE: - Free(mc->jmp_table); - break; - case CMT_FLOAT_CONSTS: - Free(mc->float_consts); - break; - case CMT_ARRAY_DIM: - LinkedLstDel(mc->dim); - break; - case CMT_HASH_ENTRY: - HashDel(mc->h); - break; - } - Free(mc->str); - Free(mc); - mc=mc1; - } - if (undef) { - PrintErr("Undefined goto label %s\n",undef); - Free(undef); - LexExcept(lx,"Undefined goto label at "); - } -} - -U0 LCCHeaderPut(CLex *lx,I64 pass,Bool put) -{ - if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) { - if (put) { - if (Bt(&lx->pass_trace_mask,pass-1)) { - "$$IV,1$$Pass %d:$$IV,0$$\n",pass-1; - LCCQuePut(lx); - } - } else if (Bt(&lx->pass_trace_mask,pass)) - "$$IV,1$$Pass %d:$$IV,0$$\n",pass; - } - lx->pass=pass; -} - -U8 *LCCCompile(CLex *lx,I64 *_code_size,CDbgInfo **_dbg,I64 *_type) -{ - U8 *result; - CLexCodeMisc *lb; - I64 i,code_size,last_code_size; - - COptReg reg_offsets[NUM_REGS]; - if (_dbg) *_dbg=NULL; - LCCHeaderPut(lx,1,TRUE); - OptPass012(lx); - LCCHeaderPut(lx,2,TRUE); - OptPass012(lx); - LCCHeaderPut(lx,3,TRUE); - OptPass3(lx,reg_offsets); - LCCHeaderPut(lx,4,TRUE); - OptPass4(lx,reg_offsets,_type); - LCCHeaderPut(lx,5,TRUE); - OptPass5(lx); - LCCHeaderPut(lx,6,TRUE); - OptPass6(lx); - LCCHeaderPut(lx,7,TRUE); - - lb=lx->lcc.lcc_next_misc; - while (lb!=&lx->lcc.lcc_next_misc) { - if (lb->type==CMT_JMP_TABLE) { - for (i=0;irange;i++) - lb->jmp_table[i]=OptLabelFwd(lb->jmp_table[i]); - lb->dft=OptLabelFwd(lb->dft); - } - lb=lb->next; - } - - LCCHeaderPut(lx,7,FALSE); - OptPass789(lx,reg_offsets,NULL,NULL); - LCCHeaderPut(lx,8,FALSE); - code_size=OptPass789(lx,reg_offsets,NULL,NULL); - do { - last_code_size=code_size; - LCCHeaderPut(lx,8,FALSE); - code_size=OptPass789(lx,reg_offsets,NULL,NULL); - if (code_size>last_code_size) { - "Pass:8 Code Size\n"; - LexExcept(lx,"Compiler Optimization Error at "); - } - } while (code_sizeflags&LF_AOT_COMPILE) - result=MAlloc(code_size); - else - result=MAlloc(code_size,Fs->code_heap); - LCCHeaderPut(lx,9,FALSE); - code_size=OptPass789(lx,reg_offsets,result,_dbg); - - cmp.compiled_bytes+=code_size; - LCCDel(lx,&lx->lcc); - if (Bt(&lx->opts,OPTf_COMPILE_TRACE)) { - if (lx->flags&LF_AOT_COMPILE) { - if (lx->a->seg_size==16) - Un(result,code_size,16); - else if (lx->a->seg_size==64) - Un(result,code_size,64); - else - Un(result,code_size,32); - } else - Un(result,code_size,64); - } - if (_code_size) *_code_size=code_size; - return result; -} diff --git a/Compiler/Lex.CPP b/Compiler/Lex.CPP index f56b988..8a29eb0 100644 --- a/Compiler/Lex.CPP +++ b/Compiler/Lex.CPP @@ -36,14 +36,14 @@ CLex *LexNew(U8 *buf=NULL,I64 flags=0,U8 *filename=NULL) {//MAlloc new lex ctrl node. //Frees buf in $LK,"LexDel",A="MN:LexDel"$ unless $LK,"LF_DONT_FREE_BUF",A="MN:LF_DONT_FREE_BUF"$ flag is set. //FileName is for error reporting. If files are #included, new names are used. -//See $LK,"Psalmody LexNew",A="FF:::/Apps/Psalmody/Psalmody.CPP,LexNew"$. +//See $LK,"Psalmody LexNew",A="FF:::/Apps/Psalmody/PsalmodyFile.CPP,LexNew"$. CLex *lx=MAlloc(sizeof(CLex)); CLexFile *tempf=&lx->lfns[0]; - MemSet(lx,0,offset(CLex.end_of_zeroed_members)+sizeof(CLexFile)); + MemSet(lx,0,offset(CLex.end_zeroed)+sizeof(CLexFile)); QueInit(lx); lx->flags=flags; lx->opts=1<pass_trace_mask=0b1001111101; + lx->otrace_mask=0b10001111101; lx->htc.hash_mask=HTG_TYPE_MASK-HTT_IMPORT_SYS_SYM; lx->htc.define_hash_table=lx->htc.hash_table_lst=lx->htc.glbl_hash_table=lx->htc.local_hash_table=Fs->hash_table; if (flags&LF_KEEP_AT_SIGN) @@ -53,9 +53,9 @@ CLex *LexNew(U8 *buf=NULL,I64 flags=0,U8 *filename=NULL) lx->cur_lfn=tempf; QueInit(&lx->next_stream_blk); if (filename) - tempf->name=FileNameAbs(filename); + tempf->full_name=FileNameAbs(filename); else - tempf->name=StrNew(dsk.temp_filename); + tempf->full_name=StrNew(dsk.temp_filename); if (flags & LF_PMT) buf=CAlloc(4); tempf->buf=tempf->buf_ptr=tempf->line_start=lx->cur_buf_ptr=buf; @@ -71,17 +71,17 @@ U0 LexDel(CLex *lx) if (doc=tempf->doc) DocDel(doc); Free(tempf->buf); - Free(tempf->name); + Free(tempf->full_name); tempf--; } LinkedLstDel(lx->htc.next); - Free(tempf->name); + Free(tempf->full_name); if (!(lx->flags & LF_DONT_FREE_BUF)) Free(tempf->buf); Free(lx->ps); Free(lx->cur_str); Free(lx->cur_help_index); - Free(lx->dollar); + Free(lx->dollar_buf); Free(lx); } @@ -94,10 +94,10 @@ I64 LexSize(CLex *lx) if (doc=tempf->doc) result+=DocSize(doc); result+=MSize2(tempf->buf); - result+=MSize2(tempf->name); + result+=MSize2(tempf->full_name); tempf--; } - result+=MSize2(tempf->name); + result+=MSize2(tempf->full_name); if (!(lx->flags & LF_DONT_FREE_BUF)) result+=MSize2(tempf->buf); result+=MSize2(lx->cur_str); @@ -143,9 +143,9 @@ Bool LexDollar(CLex *lx,CDoc *doc,CDocEntry *doc_e) { U8 *st; if (lx->flags&LF_IN_QUOTES) { - Free(lx->dollar); + Free(lx->dollar_buf); st=Doc2PlainText(doc,doc_e); - lx->dollar=MStrPrint("$$%Q$$",st); + lx->dollar_buf=MStrPrint("$$%Q$$",st); lx->dollar_cnt=2; Free(st); return TRUE; @@ -181,7 +181,7 @@ lgc_start2: if (doc_e->de_flags & ~(DOCEF_TAG|DOCEF_DEFINE|DOCEF_TAG_CB| DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT| DOCEF_SKIP|DOCEF_HARD_SKIP|DOCEF_FILTER_SKIP) && - LexDollar(lx,doc,doc_e) && *(src=lx->dollar)) { + LexDollar(lx,doc,doc_e) && *(src=lx->dollar_buf)) { tempf->line_num=doc_e->y+1; tempf->buf=tempf->buf_ptr=lx->cur_buf_ptr=src; } else if (*(src=doc_e->tag)) @@ -196,8 +196,6 @@ lgc_start2: tempf->line_start=doc_e->next; tempf->line_num=doc_e->y+2; //+1 because NEW_LINE is on previous line, +1 because doc y starts at zero cmp.compiled_lines++; - if (tempf==lx->fun_lfn && tempf->line_num>lx->max_line) - lx->max_line=tempf->line_num; lx->last_U16='\n'; goto lgc_done; case DOCT_TAB: @@ -235,7 +233,7 @@ lgc_start2: lx->last_U16=TK_INS_BINARY_SIZE; goto lgc_done; case DOCT_SHIFTED_Y: - if (LexDollar(lx,doc,doc_e) && *(src=lx->dollar)) { + if (LexDollar(lx,doc,doc_e) && *(src=lx->dollar_buf)) { tempf->line_num=doc_e->y+1; tempf->buf=tempf->buf_ptr=lx->cur_buf_ptr=src; } else { @@ -255,7 +253,7 @@ lgc_start2: goto lgc_start2; case 0xFF: //nobound_switch default: - if (LexDollar(lx,doc,doc_e) && *(src=lx->dollar)) { + if (LexDollar(lx,doc,doc_e) && *(src=lx->dollar_buf)) { tempf->line_num=doc_e->y+1; tempf->buf=tempf->buf_ptr=lx->cur_buf_ptr=src; } else { @@ -269,13 +267,13 @@ lgc_start2: if (tempf!=&lx->lfns[0] || !(lx->flags&LF_DONT_FREE_BUF)) DocDel(doc); tempf->doc=tempf->buf=NULL; - Free(tempf->name); - tempf->name=NULL; + Free(tempf->full_name); + tempf->full_name=NULL; } tempf=lx->cur_lfn; if (tempf!=&lx->lfns[0]) { - Free(tempf->name); - tempf->name=NULL; + Free(tempf->full_name); + tempf->full_name=NULL; Free(tempf->buf); tempf->buf=NULL; tempf1=tempf; @@ -306,8 +304,6 @@ lgc_start2: tempf->line_num++; cmp.compiled_lines++; tempf->line_start=src; - if (tempf==lx->fun_lfn && tempf->line_num>lx->max_line) - lx->max_line=tempf->line_num; } break; case 0xFF: //nobound_switch @@ -363,9 +359,9 @@ U0 LexIncludeStr(CLex *lx,U8 *abs_filename,U8 *src,Bool actual_file) tempf->last_U16=0; tempf->flags=0; if (actual_file) - tempf->name=StrNew(abs_filename); + tempf->full_name=StrNew(abs_filename); else - tempf->name=StrNew(dsk.temp_filename); + tempf->full_name=StrNew(dsk.temp_filename); lx->cur_buf_ptr=src; } @@ -401,7 +397,7 @@ U0 LexAttachDoc(CLex *lx,CLexFile *tempf=NULL, } if (!doc_e) doc_e=doc->root.next; - tempf->name=StrNew(doc->filename.name); + tempf->full_name=StrNew(doc->filename.name); tempf->doc=doc; while (doc_e!=doc) { if (Bt(cmp_type_flags_src_code,doc_e->type_u8)) @@ -460,7 +456,7 @@ U0 LexPop(CLex *lx) } I64 MemberMetaData(U8 *needle_str,CMemberLst *haystack_member_lst) -{//Find meta data name, return meta data val. See $LK,"::/Demo/ClassMeta.CPP.Z"$. +{//Find meta data name, return meta data val. See $LK,"::/Demo/ClassMeta.CPP"$. CMemberLstMeta *meta=haystack_member_lst->meta; while (meta) { if (!StrCmp(meta->str,needle_str)) @@ -471,7 +467,7 @@ I64 MemberMetaData(U8 *needle_str,CMemberLst *haystack_member_lst) } CMemberLstMeta *MemberMetaFind(U8 *needle_str,CMemberLst *haystack_member_lst) -{//Find meta data name, return meta data struct. See $LK,"::/Demo/ClassMeta.CPP.Z"$. +{//Find meta data name, return meta data struct. See $LK,"::/Demo/ClassMeta.CPP"$. CMemberLstMeta *meta=haystack_member_lst->meta; while (meta) { if (!StrCmp(meta->str,needle_str)) @@ -524,7 +520,7 @@ U0 MemberAdd(CLex *lx,CMemberLst *tempm,CHashClass *tempc,I64 mode) if (MemberFind(st,tempc) && StrCmp(st,"pad") && StrCmp(st,"reserved") && StrCmp(st,"_anon_")) LexExcept(lx,"Duplicate member at "); if (mode==PRS1B_LOCAL_VAR) { - tempc2=tempm->member_class-tempm->member_class->ptr_cnt; + tempc2=tempm->member_class-tempm->member_class->ptr_stars_cnt; if (Bt(&lx->opts,OPTf_WARN_DUP_TYPES) && MemberFind2(tempc2,tempc)) LexWarn(lx,"Duplicate type at "); } else @@ -576,7 +572,7 @@ U0 MemberLstDel(CHashClass *tempc) if (tempm->flags & MLF_STR_DFT_AVAILABLE) Free(tempm->dft_val); if (tempm->flags & MLF_FUN) - HashDel(tempm->fun_ptr-tempm->fun_ptr->ptr_cnt); + HashDel(tempm->fun_ptr-tempm->fun_ptr->ptr_stars_cnt); temp_meta=tempm->meta; while (temp_meta) { temp_meta1=temp_meta->next; @@ -610,7 +606,7 @@ I64 MemberLstSize(CHashClass *tempc) if (tempm->flags & MLF_STR_DFT_AVAILABLE) result+=MSize2(tempm->dft_val); if (tempm->flags & MLF_FUN) - result+=HashEntrySize2(tempm->fun_ptr-tempm->fun_ptr->ptr_cnt); + result+=HashEntrySize2(tempm->fun_ptr-tempm->fun_ptr->ptr_stars_cnt); temp_meta=tempm->meta; while (temp_meta) { result+=MSize2(temp_meta->str); @@ -657,6 +653,9 @@ I64 LexInStr(CLex *lx,U8 *buf,I64 size,Bool *done) case 't': buf[i++]='\t'; break; + case '0': + buf[i++]=0; + break; case 'x': case 'X': j=0; @@ -673,36 +672,6 @@ I64 LexInStr(CLex *lx,U8 *buf,I64 size,Bool *done) buf[i++]=j; lx->flags|=LF_USE_LAST_U16; break; - case 'b': - case 'B': - j=0; - while (TRUE) { - ch=LexGetChar(lx); - if ('0'<=ch<='1') - j=j<<1+ch-'0'; - else - break; - } - buf[i++]=j; - lx->flags|=LF_USE_LAST_U16; - break; - case 'o': - case 'O': - j=0; - goto lis_octal; - case '0'...'7': - j=ch-'0'; -lis_octal: - while (TRUE) { - ch=LexGetChar(lx); - if ('0'<=ch<='7') - j=j<<3+ch-'0'; - else - break; - } - buf[i++]=j; - lx->flags|=LF_USE_LAST_U16; - break; default: lx->flags|=LF_USE_LAST_U16; buf[i++]='\\'; @@ -831,18 +800,6 @@ lex_ident: goto lex_end; } } - } else if (ch=='O') { - while (TRUE) { - ch=LexGetChar(lx); - if ('0'<=ch<='7') - i=i<<3+ch-'0'; - else { - lx->cur_i64=i; - lx->flags|=LF_USE_LAST_U16; - lx->token=TK_INTEGER; - goto lex_end; - } - } } while (TRUE) { if (Bt(chars_bitmap_dec_numeric,ch)) @@ -958,6 +915,9 @@ lex_float_start: case 't': k.u8[j]='\t'; break; + case '0': + k.u8[j]=0; + break; case 'x': case 'X': i=0; @@ -974,39 +934,9 @@ lex_float_start: k.u8[j]=i; lx->flags|=LF_USE_LAST_U16; break; - case 'b': - case 'B': - i=0; - while (TRUE) { - ch=LexGetChar(lx); - if ('0'<=ch<='1') - i=i<<1+ch-'0'; - else - break; - } - k.u8[j]=i; - lx->flags|=LF_USE_LAST_U16; - break; - case 'o': - case 'O': - i=0; - goto lex_octal; - case '0'...'7': - i=ch-'0'; -lex_octal: - while (TRUE) { - ch=LexGetChar(lx); - if ('0'<=ch<='7') - i=i<<3+ch-'0'; - else - break; - } - k.u8[j]=i; - lx->flags|=LF_USE_LAST_U16; - break; default: - lx->flags|=LF_USE_LAST_U16; k.u8[j]='\\'; + lx->flags|=LF_USE_LAST_U16; } } else if (ch=='$$') { ch=LexGetChar(lx); @@ -1053,7 +983,7 @@ lex_octal: temph->str=lx->cur_str; lx->cur_str=0; temph->type=HTT_DEFINE_STR; - SetSrcFileInfo(lx,temph); + HashSrcFileSet(lx,temph); do ch=LexGetChar(lx); //skip space between define name and start while (Bt(chars_bitmap_non_eol_white_space,ch)); @@ -1153,6 +1083,7 @@ lex_else: } } while (j); break; + case KW_IF: if (lx->flags & LF_IN_IF) { lx->token=TK_IF; @@ -1367,7 +1298,7 @@ lex_ifjit: temph->str=FileNameAbs(fbuf); Free(fbuf); temph->type=HTT_HELP_FILE|HTF_PUBLIC; - SetSrcFileInfo(lx,temph); + HashSrcFileSet(lx,temph); HashAdd(temph,lx->htc.glbl_hash_table); break; } @@ -1571,12 +1502,12 @@ U8 *LexPutLine(CLex *lx,U8 *start) U0 LexPutPos(CLex *lx) {//Print token, line link and, then, $LK,"LexPutLine",A="MN:LexPutLine"$(). LexPutToken(lx); - SetFix(lx->cur_lfn->name,lx->cur_lfn->line_num); + FixSet(lx->cur_lfn->full_name,lx->cur_lfn->line_num); if (IsRaw) - "%s,%d ",lx->cur_lfn->name,lx->cur_lfn->line_num; + "%s,%d ",lx->cur_lfn->full_name,lx->cur_lfn->line_num; else { - PutFileLink(lx->cur_lfn->name,lx->cur_lfn->line_num); - AdamErr("%s,%d\n",lx->cur_lfn->name,lx->cur_lfn->line_num); + PutFileLink(lx->cur_lfn->full_name,lx->cur_lfn->line_num); + AdamErr("%s,%d\n",lx->cur_lfn->full_name,lx->cur_lfn->line_num); '' CH_SPACE; } LexPutLine(lx,lx->cur_lfn->line_start); diff --git a/Compiler/OpCodes.TXT b/Compiler/OpCodes.TXT index 9df9336..d5571d8 100644 --- a/Compiler/OpCodes.TXT +++ b/Compiler/OpCodes.TXT @@ -8,7 +8,6 @@ '^'= Rex xor-like ':'= floating sti-like for disassembly '$$'= ending zero (ENTER) - $FG,4$Note:$FG$ TempleOS uses nonstandard opcodes. Asm is kind-of a bonus and I made changes to make the assembler simpler. For opcodes @@ -906,7 +905,8 @@ OPCODE CMPXCHG OPCODE CHPXCHG8B 0x0F 0xC7, RM64; OPCODE DAA 0x27; OPCODE DAS 0x2F; -OPCODE ENTER 0xC8, $$IW IMM16; +OPCODE ENTER + 0xC8, $$IW IMM16; OPCODE HLT 0xF4; OPCODE IN 0xE4, IB &AL UIMM8 diff --git a/Compiler/OptLib.CPP b/Compiler/OptLib.CPP index 76801d7..3092ed7 100644 --- a/Compiler/OptLib.CPP +++ b/Compiler/OptLib.CPP @@ -97,6 +97,7 @@ Bool OptFixupBinaryOp1(CIntermediateCode *tempi, CIntermediateCode *tempi1,CIntermediateCode *tempi2, Bool *is_unsigned) { + CIntermediateCode *tempii; CHashClass *tempc=tempi->ic_class,*tempc1,*tempc2; if (tempi1->ic_flags&ICF_R_TO_INT) @@ -121,36 +122,54 @@ Bool OptFixupBinaryOp1(CIntermediateCode *tempi, tempc=tempi->ic_class=tempc2; if (tempc->raw_type==RT_F64) { - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { tempi1->ic_data(F64)=tempi1->ic_data; tempi1->ic_class=cmp.internal_types[RT_F64]; tempi1->ic_code=IC_IMM_F64; tempi1->ic_flags&=~ICF_R_TO_F64; } else if (tempc1->raw_type!=RT_F64) - tempi1->ic_flags|=ICF_R_TO_F64; - if (tempi2->ic_code==IC_IMM_U64) { + tempi1->ic_flags|=ICF_R_TO_F64; + if (tempi2->ic_code==IC_IMM_I64) { tempi2->ic_data(F64)=tempi2->ic_data; tempi2->ic_class=cmp.internal_types[RT_F64]; tempi2->ic_code=IC_IMM_F64; tempi2->ic_flags&=~ICF_R_TO_F64; } else if (tempc2->raw_type!=RT_F64) - tempi2->ic_flags|=ICF_R_TO_F64; - if (tempi1->ic_code==IC_IMM_F64 && - tempi2->ic_code==IC_IMM_F64 && - !(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) { - tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; - OptSetNOP1(tempi1); - OptSetNOP1(tempi2); - return FBO1_F64; - } else - return FBO1_NOT_CONST; + tempi2->ic_flags|=ICF_R_TO_F64; + if (IC_LESS<=tempi->ic_code<=IC_GREATER_EQUAL && (tempii=OptLead1(tempi)) && + tempii->ic_code!=IC_PUSH_CMP && tempii->ic_code!=IC_AND_AND) { + //We are looking for float comparisons to zero to convert to int. + if (tempi1->ic_code==IC_IMM_F64 && !tempi1->ic_data && + tempi2->ic_code==IC_DEREF && tempc2==cmp.internal_types[RT_F64]) { + tempi1->ic_code==IC_IMM_I64; + goto fb_here1; + } else if (tempi2->ic_code==IC_IMM_F64 && !tempi2->ic_data && + tempi1->ic_code==IC_DEREF && tempc1==cmp.internal_types[RT_F64]) { + tempi2->ic_code==IC_IMM_I64; +fb_here1: + tempi1->ic_flags&=~ICF_R_TO_F64; + tempi->ic_class=tempi1->ic_class=tempi2->ic_class=cmp.internal_types[RT_I64]; + *is_unsigned=FALSE; + return FBO1_NOT_CONST; + } + goto fb_here2; + } else { +fb_here2: + if (tempi1->ic_code==IC_IMM_F64 && tempi2->ic_code==IC_IMM_F64 && + !(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) { + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + OptSetNOP1(tempi1); + OptSetNOP1(tempi2); + return FBO1_F64; + } else + return FBO1_NOT_CONST; + } } *is_unsigned=tempc1->raw_type&1 || tempc2->raw_type&1; - if (tempi1->ic_code==IC_IMM_U64 && - tempi2->ic_code==IC_IMM_U64 && - !(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) { + if (tempi1->ic_code==IC_IMM_I64 && tempi2->ic_code==IC_IMM_I64 && + !(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) { tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; OptSetNOP1(tempi1); OptSetNOP1(tempi2); @@ -163,11 +182,9 @@ Bool OptFixupBinaryOp2(CIntermediateCode **tempi1,CIntermediateCode **tempi2) { CIntermediateCode *tempii1=*tempi1, *tempii2=*tempi2; - if (tempii1->ic_code==IC_IMM_U64 && - !(tempii1->ic_flags & ICF_R_TO_F64)) + if (tempii1->ic_code==IC_IMM_I64 && !(tempii1->ic_flags & ICF_R_TO_F64)) return TRUE; - if (tempii2->ic_code==IC_IMM_U64 && - !(tempii2->ic_flags & ICF_R_TO_F64)) { + if (tempii2->ic_code==IC_IMM_I64 && !(tempii2->ic_flags & ICF_R_TO_F64)) { *tempi1=tempii2; *tempi2=tempii1; return TRUE; @@ -184,7 +201,7 @@ Bool OptFixupUnaryOp(CIntermediateCode *tempi, tempi->ic_class=tempc1; tempc=tempi->ic_class; if (tempc->raw_type==RT_F64) { - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { tempi1->ic_data(F64)=tempi1->ic_data; tempi1->ic_class=cmp.internal_types[RT_F64]; tempi1->ic_code=IC_IMM_F64; @@ -200,7 +217,7 @@ Bool OptFixupUnaryOp(CIntermediateCode *tempi, return FBO1_NOT_CONST; } *is_unsigned=tempc1->raw_type&1; - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { tempi->ic_flags|=tempi1->ic_flags; OptSetNOP1(tempi1); return FBO1_INT; @@ -223,23 +240,8 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) tempi->t.a1t=tempii->t.a1t; OptFree(tempii); return OptBrNotZero(lx,tempi); - case IC_EQUAL_EQUAL: - tempi->ic_code=IC_BR_NOT_EQUAL; - break; - case IC_NOT_EQUAL: - tempi->ic_code=IC_BR_EQUAL_EQUAL; - break; - case IC_LESS: - tempi->ic_code=IC_BR_GREATER_EQUAL; - break; - case IC_GREATER: - tempi->ic_code=IC_BR_LESS_EQUAL; - break; - case IC_LESS_EQUAL: - tempi->ic_code=IC_BR_GREATER; - break; - case IC_GREATER_EQUAL: - tempi->ic_code=IC_BR_LESS; + case IC_EQUAL_EQUAL...IC_LESS_EQUAL: + tempi->ic_code=(tempii->ic_code-IC_EQUAL_EQUAL)^1+IC_BR_EQUAL_EQUAL; break; case IC_OR_OR: tempi->ic_code=IC_BR_OR_OR_ZERO; @@ -265,26 +267,20 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) case IC_BT: tempii2->ic_code=IC_BR_NOT_BT; break; - case IC_BTS: - tempii2->ic_code=IC_BR_NOT_BTS; - break; - case IC_BTR: - tempii2->ic_code=IC_BR_NOT_BTR; - break; - case IC_BTC: - tempii2->ic_code=IC_BR_NOT_BTC; - break; case IC_LBTS: - tempii2->ic_code=IC_BR_NOT_LBTS; tempii2->ic_flags|=ICF_LOCK; + case IC_BTS: + tempii2->ic_code=IC_BR_NOT_BTS; break; case IC_LBTR: - tempii2->ic_code=IC_BR_NOT_LBTR; tempii2->ic_flags|=ICF_LOCK; + case IC_BTR: + tempii2->ic_code=IC_BR_NOT_BTR; break; case IC_LBTC: - tempii2->ic_code=IC_BR_NOT_LBTC; tempii2->ic_flags|=ICF_LOCK; + case IC_BTC: + tempii2->ic_code=IC_BR_NOT_BTC; break; sub_switch_end: tempii2->ic_data=tempi->ic_data; @@ -304,11 +300,11 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) OptFree(tempii); if (tempi->ic_flags&ICF_PUSH_CMP && - IC_BR_NOT_EQUAL<=tempi->ic_code<=IC_BR_LESS && + IC_BR_NOT_EQUAL<=tempi->ic_code<=IC_BR_LESS_EQUAL && !(tempi->ic_flags&ICF_USE_F64)) { - tempi->ic_code+=IC_BR_NOT_EQUAL2-IC_BR_NOT_EQUAL; + tempi->ic_code+=IC_BR_EQUAL_EQUAL2-IC_BR_EQUAL_EQUAL; tempi->ic_flags&=~ICF_PUSH_CMP; - tempii =tempi->next; //IC_PUSH_CMP instruction + tempii=tempi->next; //IC_PUSH_CMP instruction while (tempii->ic_code!=IC_PUSH_CMP) tempii=tempii->next; tempii->t.a1t=tempi; @@ -371,23 +367,8 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) tempi->t.a1t=tempii->t.a1t; OptFree(tempii); return OptBrZero(lx,tempi); - case IC_EQUAL_EQUAL: - tempi->ic_code=IC_BR_EQUAL_EQUAL; - break; - case IC_NOT_EQUAL: - tempi->ic_code=IC_BR_NOT_EQUAL; - break; - case IC_LESS: - tempi->ic_code=IC_BR_LESS; - break; - case IC_GREATER: - tempi->ic_code=IC_BR_GREATER; - break; - case IC_LESS_EQUAL: - tempi->ic_code=IC_BR_LESS_EQUAL; - break; - case IC_GREATER_EQUAL: - tempi->ic_code=IC_BR_GREATER_EQUAL; + case IC_EQUAL_EQUAL...IC_LESS_EQUAL: + tempi->ic_code=tempii->ic_code+IC_BR_EQUAL_EQUAL-IC_EQUAL_EQUAL; break; case IC_OR_OR: tempi->ic_code=IC_BR_OR_OR_NOT_ZERO; @@ -413,26 +394,20 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) case IC_BT: tempii2->ic_code=IC_BR_BT; break; - case IC_BTS: - tempii2->ic_code=IC_BR_BTS; - break; - case IC_BTR: - tempii2->ic_code=IC_BR_BTR; - break; - case IC_BTC: - tempii2->ic_code=IC_BR_BTC; - break; case IC_LBTS: - tempii2->ic_code=IC_BR_LBTS; tempii2->ic_flags|=ICF_LOCK; + case IC_BTS: + tempii2->ic_code=IC_BR_BTS; break; case IC_LBTR: - tempii2->ic_code=IC_BR_LBTR; tempii2->ic_flags|=ICF_LOCK; + case IC_BTR: + tempii2->ic_code=IC_BR_BTR; break; case IC_LBTC: - tempii2->ic_code=IC_BR_LBTC; tempii2->ic_flags|=ICF_LOCK; + case IC_BTC: + tempii2->ic_code=IC_BR_BTC; break; sub_switch_end: tempii2->ic_data=tempi->ic_data; @@ -452,11 +427,11 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) OptFree(tempii); if (tempi->ic_flags&ICF_PUSH_CMP && - IC_BR_NOT_EQUAL<=tempi->ic_code<=IC_BR_LESS && + IC_BR_NOT_EQUAL<=tempi->ic_code<=IC_BR_LESS_EQUAL && !(tempi->ic_flags&ICF_USE_F64)) { - tempi->ic_code+=IC_BR_NOT_EQUAL2-IC_BR_NOT_EQUAL; + tempi->ic_code+=IC_BR_EQUAL_EQUAL2-IC_BR_EQUAL_EQUAL; tempi->ic_flags&=~ICF_PUSH_CMP; - tempii =tempi->next; //IC_PUSH_CMP instruction + tempii=tempi->next; //IC_PUSH_CMP instruction while (tempii->ic_code!=IC_PUSH_CMP) tempii=tempii->next; tempii->t.a1t=tempi; @@ -508,12 +483,11 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) U0 OptFixSizeOf(CIntermediateCode *tempi1,CIntermediateCode *tempi_push,CHashClass *tempcc) { - if (tempi1->ic_code==IC_MUL && - tempi1->t.a2t->ic_code==IC_SIZEOF) { - tempi1->t.a2t->ic_code=IC_IMM_U64; + if (tempi1->ic_code==IC_MUL && tempi1->t.a2t->ic_code==IC_SIZEOF) { + tempi1->t.a2t->ic_code=IC_IMM_I64; tempi1->t.a2t->ic_class=tempcc; tempi_push->ic_class=tempcc; - if (tempcc->ptr_cnt) { + if (tempcc->ptr_stars_cnt) { tempcc--; if (tempcc->size==1) goto here; @@ -542,7 +516,7 @@ I64 CmpRawType(CHashClass *tempc) I64 CmpRawTypePointed(CHashClass *tempc) { if (tempc) { - if (tempc->ptr_cnt) + if (tempc->ptr_stars_cnt) tempc--; tempc=OptClassFwd(tempc); return tempc->raw_type; @@ -552,7 +526,7 @@ I64 CmpRawTypePointed(CHashClass *tempc) U0 CmpF1PushPop(CIntermediateCode *tempi,CIntermediateCode *tempi2) { - if (Bt(cmp.ic_bitmap_fpop,tempi2->ic_code)|| tempi2->ic_flags&ICF_R_TO_F64) + if (intermediate_code_table[tempi2->ic_code].fpop|| tempi2->ic_flags&ICF_R_TO_F64) Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0); } @@ -560,9 +534,9 @@ U0 CmpF2PushPop(CIntermediateCode *tempi,CIntermediateCode *tempi1,CIntermediate { if ((tempi2->ic_code==IC_MOV || tempi2->ic_code==IC_IMM_F64) && !(tempi2->ic_flags&ICF_R_TO_F64) && - (Bt(cmp.ic_bitmap_fpop,tempi1->ic_code) || tempi1->ic_flags&ICF_R_TO_F64)) + (intermediate_code_table[tempi1->ic_code].fpop || tempi1->ic_flags&ICF_R_TO_F64)) Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0); - else if ((Bt(cmp.ic_bitmap_fpop,tempi2->ic_code) || tempi2->ic_flags&ICF_R_TO_F64)&& + else if ((intermediate_code_table[tempi2->ic_code].fpop || tempi2->ic_flags&ICF_R_TO_F64)&& !(tempi1->ic_flags&ICF_R_TO_F64)) Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0); } diff --git a/Compiler/OptPass012.CPP b/Compiler/OptPass012.CPP index 82cb387..99f7192 100644 --- a/Compiler/OptPass012.CPP +++ b/Compiler/OptPass012.CPP @@ -3,7 +3,7 @@ Pass#0 When parsing the arg expressions to a function call, there is a call to OptPass012 to determine -the type of the expression. $LK,"OptPass012",A="FF:::/Compiler/ExpParser.CPP,OptPass012"$ +the type of the expression. $LK,"OptPass012",A="FF:::/Compiler/PrsExp.CPP,OptPass012"$ Pass#1&2 Constant expressions are simplified. @@ -44,25 +44,25 @@ args. tempi->ic_class2=tempc; tempi_push=tempi; MemSet(&tempi->a1,0,sizeof(CICArg)*4); - nobound_switch (cmp.arg_cnt[code]) { - case 9: + nobound_switch (intermediate_code_table[code].arg_cnt) { + case IS_V_ARG: ps->ptr-=tempi->ic_data>>2; break; - case 2: + case IS_2_ARG: tempi2=PrsPop(ps); tempc2=tempi2->ic_class; tempi->t.a2t=tempi2; tempi->t.a2c=PrsPop(ps); - case 1: + case IS_1_ARG: tempi1=PrsPop(ps); tempc1=tempi1->ic_class; tempi->t.a1t=tempi1; tempi->t.a1c=PrsPop(ps); break; - case 0: //nobound_switch + case IS_0_ARG: //nobound_switch break; } - if (Bt(cmp.ic_bitmap_not_const,code)) + if (intermediate_code_table[code].not_const) lx->flags|=LF_NOT_CONST; nobound_switch (code) { case IC_IMM_F64: @@ -70,11 +70,11 @@ args. if (lx->pass==2 && tempi->ic_flags&ICF_R_TO_INT) { tempi->ic_data=ToI64(tempi->ic_data(F64)); tempi->ic_flags&=~ICF_R_TO_INT; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; tempi->ic_class=cmp.internal_types[RT_I64]; } break; - case IC_IMM_U64: + case IC_IMM_I64: tempi->ic_flags&=~ICF_R_TO_INT; if (lx->pass==2 && tempi->ic_flags&ICF_R_TO_F64) { tempi->ic_data(F64)=ToF64(tempi->ic_data); @@ -84,18 +84,18 @@ args. } break; case IC_HOLYC_TYPECAST: - if (tempi1->ic_code==IC_IMM_U64 || tempi1->ic_code==IC_IMM_F64) { + if (tempi1->ic_code==IC_IMM_I64 || tempi1->ic_code==IC_IMM_F64) { if (tempi->ic_class->raw_type==RT_F64) tempi1->ic_code=IC_IMM_F64; else - tempi1->ic_code=IC_IMM_U64; + tempi1->ic_code=IC_IMM_I64; tempi1->ic_class=tempi->ic_class; tempi1->ic_flags|=tempi->ic_flags; tempi_push=tempi1; OptSetNOP1(tempi); } else { if (tempi->ic_data) {//was paren - if (!tempi_push->ic_class->ptr_cnt) { + if (!tempi_push->ic_class->ptr_stars_cnt) { if (tempi_push->ic_class->raw_type==RT_F64) tempi_push->ic_class2=cmp.internal_types[RT_F64]; else @@ -115,7 +115,7 @@ args. tempi1=tempi->next->next; //IMM tempi2=tempi1->next; //ADD tempi3=tempi2->next; //DEREF - if (tempi1->ic_code==IC_IMM_U64 && tempi2->ic_code==IC_ADD && + if (tempi1->ic_code==IC_IMM_I64 && tempi2->ic_code==IC_ADD && tempi3->ic_code==IC_DEREF && !(tempi3->ic_flags&~ICG_NO_CVT_MASK)) { tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags|tempi3->ic_flags; if (tempi->ic_code==IC_FS) @@ -149,9 +149,9 @@ args. tempi->ic_flags|=ICF_USE_F64; break; case IC_COM: - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { tempi->ic_data=~tempi1->ic_data; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; tempi->ic_flags|=tempi1->ic_flags; OptSetNOP1(tempi1); } @@ -168,9 +168,9 @@ args. } break; } - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { tempi->ic_data=!tempi1->ic_data; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; tempi->ic_flags|=tempi1->ic_flags; OptSetNOP1(tempi1); } @@ -179,7 +179,7 @@ args. if (i=OptFixupUnaryOp(tempi,tempi1,&is_unsigned)) { if (i==FBO1_INT) { tempi->ic_data=-tempi1->ic_data(I64); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=-tempi1->ic_data(F64); tempi->ic_code=IC_IMM_F64; @@ -195,7 +195,7 @@ args. tempi->ic_data=tempi1->ic_data(U64)<ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)<ic_data(I64); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)<ic_data; tempi->ic_code=IC_IMM_F64; @@ -213,7 +213,7 @@ args. tempi->ic_data=tempi1->ic_data(U64)>>tempi->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)>>tempi->ic_data(I64); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)>>tempi->ic_data; tempi->ic_code=IC_IMM_F64; @@ -231,12 +231,12 @@ args. tempi->ic_data=tempi1->ic_data(U64)<ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)<ic_data(I64); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64) << tempi2->ic_data(F64); tempi->ic_code=IC_IMM_F64; } - } else if (tempi2->ic_code==IC_IMM_U64) { + } else if (tempi2->ic_code==IC_IMM_I64) { tempi->ic_flags|=tempi2->ic_flags; tempi->ic_data=tempi2->ic_data; tempi->ic_code=IC_SHL_CONST; @@ -250,12 +250,12 @@ args. tempi->ic_data=tempi1->ic_data(U64)>>tempi2->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)>>tempi2->ic_data(I64); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64) >> tempi2->ic_data(F64); tempi->ic_code=IC_IMM_F64; } - } else if (tempi2->ic_code==IC_IMM_U64) { + } else if (tempi2->ic_code==IC_IMM_I64) { tempi->ic_flags|=tempi2->ic_flags; tempi->ic_data=tempi2->ic_data; tempi->ic_code=IC_SHR_CONST; @@ -263,7 +263,7 @@ args. } break; sub_switch_end: - if (!tempi_push->ic_class->ptr_cnt) { + if (!tempi_push->ic_class->ptr_stars_cnt) { if (tempi_push->ic_class->raw_type==RT_F64) tempi_push->ic_class2=cmp.internal_types[RT_F64]; else @@ -310,13 +310,13 @@ args. tempi->ic_data=tempi1->ic_data(U64)*tempi2->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)*tempi2->ic_data(I64); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)*tempi2->ic_data(F64); tempi->ic_code=IC_IMM_F64; } } else { - if (tempi1->ic_code==IC_IMM_U64 && lx->pass==2) { + if (tempi1->ic_code==IC_IMM_I64 && lx->pass==2) { switch (i=tempi1->ic_data) { case 0: break; @@ -336,7 +336,7 @@ args. OptSetNOP1(tempi1); } } - } else if (tempi2->ic_code==IC_IMM_U64) { + } else if (tempi2->ic_code==IC_IMM_I64) { switch (i=tempi2->ic_data) { case 0: break; @@ -354,14 +354,14 @@ args. tempi->ic_code=IC_SHL_CONST; OptSetNOP1(tempi2); } else if (tempi1->ic_code==IC_MUL && lx->pass==2) { - if (tempi1->t.a1t->ic_code==IC_IMM_U64) { + if (tempi1->t.a1t->ic_code==IC_IMM_I64) { tempi1->ic_flags|=tempi->ic_flags; tempi1->t.a1t->ic_data*=tempi2->ic_data; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; OptSetNOP1(tempi2); OptSetNOP1(tempi); - } else if (tempi1->t.a2t->ic_code==IC_IMM_U64) { + } else if (tempi1->t.a2t->ic_code==IC_IMM_I64) { tempi1->ic_flags|=tempi->ic_flags; tempi1->t.a2t->ic_data*=tempi2->ic_data; tempi1->ic_class2=tempi->ic_class2; @@ -399,21 +399,21 @@ args. } break; case IC_DIV: - if ((tempi2->ic_data || tempi2->ic_code!=IC_IMM_U64 && tempi2->ic_code!=IC_IMM_F64) && + if ((tempi2->ic_data || tempi2->ic_code!=IC_IMM_I64 && tempi2->ic_code!=IC_IMM_F64) && (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned))) { if (i==FBO1_INT) { if (is_unsigned) tempi->ic_data=tempi1->ic_data(U64)/tempi2->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)/tempi2->ic_data(I64); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)/ tempi2->ic_data(F64); tempi->ic_code=IC_IMM_F64; } } else { - if (tempi2->ic_code==IC_IMM_U64 && (i=tempi2->ic_data)) { + if (tempi2->ic_code==IC_IMM_I64 && (i=tempi2->ic_data)) { if (i==1) { tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; tempi1->ic_class2=tempi->ic_class2; @@ -430,20 +430,20 @@ args. } break; case IC_MOD: - if ((tempi2->ic_data || tempi2->ic_code!=IC_IMM_U64 && tempi2->ic_code!=IC_IMM_F64) && + if ((tempi2->ic_data || tempi2->ic_code!=IC_IMM_I64 && tempi2->ic_code!=IC_IMM_F64) && (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned))) { if (i==FBO1_INT) { if (is_unsigned) tempi->ic_data=tempi1->ic_data(U64)%tempi2->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)%tempi2->ic_data(I64); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)% tempi2->ic_data(F64); tempi->ic_code=IC_IMM_F64; } - } else if (lx->pass==2 && tempi2->ic_code==IC_IMM_U64 && + } else if (lx->pass==2 && tempi2->ic_code==IC_IMM_I64 && (i=tempi2->ic_data) && Bsf(i)==Bsr(i) && tempi_push->ic_class->raw_type!=RT_F64 && tempi_push->ic_class->raw_type&1) {//do only unsigned tempi2->ic_data=i-1; @@ -454,7 +454,7 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data&tempi2->ic_data; if (i==FBO1_INT) - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; else tempi->ic_code=IC_IMM_F64; } @@ -463,7 +463,7 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data|tempi2->ic_data; if (i==FBO1_INT) - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; else tempi->ic_code=IC_IMM_F64; } @@ -472,7 +472,7 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data^tempi2->ic_data; if (i==FBO1_INT) - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; else tempi->ic_code=IC_IMM_F64; } @@ -481,21 +481,21 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { if (i==FBO1_INT) { tempi->ic_data=tempi1->ic_data+tempi2->ic_data; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)+ tempi2->ic_data(F64); tempi->ic_code=IC_IMM_F64; } } else { - if (tempi1->ic_code==IC_ABS_ADDR&&tempi2->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_ABS_ADDR&&tempi2->ic_code==IC_IMM_I64) { tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; tempi->ic_data=tempi1->ic_data+tempi2->ic_data; tempi->ic_code=IC_ABS_ADDR; OptSetNOP1(tempi1); OptSetNOP1(tempi2); } else if (lx->pass==2) { - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { if (!tempi1->ic_data) { tempi2->ic_flags|=tempi1->ic_flags|tempi->ic_flags; tempi2->ic_class2=tempi->ic_class2; @@ -504,14 +504,14 @@ args. OptSetNOP1(tempi); } else if (tempi2->ic_code==IC_ADD|| tempi2->ic_code==IC_SUB) { - if (tempi2->t.a1t->ic_code==IC_IMM_U64) { + if (tempi2->t.a1t->ic_code==IC_IMM_I64) { tempi2->ic_flags|=tempi->ic_flags; tempi2->t.a1t->ic_data+=tempi1->ic_data; tempi2->ic_class2=tempi->ic_class2; tempi_push=tempi2; OptSetNOP1(tempi1); OptSetNOP1(tempi); - } else if (tempi2->t.a2t->ic_code==IC_IMM_U64) { + } else if (tempi2->t.a2t->ic_code==IC_IMM_I64) { tempi2->ic_flags|=tempi->ic_flags; if (tempi2->ic_code==IC_ADD) tempi2->t.a2t->ic_data+=tempi1->ic_data; @@ -523,7 +523,7 @@ args. OptSetNOP1(tempi); } } - } else if (tempi2->ic_code==IC_IMM_U64) { + } else if (tempi2->ic_code==IC_IMM_I64) { if (!tempi2->ic_data) { tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; tempi1->ic_class2=tempi->ic_class2; @@ -532,14 +532,14 @@ args. OptSetNOP1(tempi); } else if (tempi1->ic_code==IC_ADD || tempi1->ic_code==IC_SUB) { - if (tempi1->t.a1t->ic_code==IC_IMM_U64) { + if (tempi1->t.a1t->ic_code==IC_IMM_I64) { tempi1->ic_flags|=tempi->ic_flags; tempi1->t.a1t->ic_data+=tempi2->ic_data; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; OptSetNOP1(tempi2); OptSetNOP1(tempi); - } else if (tempi1->t.a2t->ic_code==IC_IMM_U64) { + } else if (tempi1->t.a2t->ic_code==IC_IMM_I64) { tempi1->ic_flags|=tempi->ic_flags; if (tempi1->ic_code==IC_ADD) tempi1->t.a2t->ic_data+=tempi2->ic_data; @@ -615,7 +615,7 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { if (i==FBO1_INT) { tempi->ic_data=tempi1->ic_data-tempi2->ic_data; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)- tempi2->ic_data(F64); @@ -623,7 +623,7 @@ args. } } else { if (lx->pass==2) { - if (tempi2->ic_code==IC_IMM_U64) { + if (tempi2->ic_code==IC_IMM_I64) { if (!tempi2->ic_data) { tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; tempi1->ic_class2=tempi->ic_class2; @@ -633,14 +633,14 @@ args. } else if (tempi1->ic_code==IC_ADD || tempi1->ic_code==IC_SUB) { - if (tempi1->t.a1t->ic_code==IC_IMM_U64) { + if (tempi1->t.a1t->ic_code==IC_IMM_I64) { tempi1->ic_flags|=tempi->ic_flags; tempi1->t.a1t->ic_data-=tempi2->ic_data; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; OptSetNOP1(tempi2); OptSetNOP1(tempi); - } else if (tempi1->t.a2t->ic_code==IC_IMM_U64) { + } else if (tempi1->t.a2t->ic_code==IC_IMM_I64) { tempi1->ic_flags|=tempi->ic_flags; if (tempi1->ic_code==IC_ADD) tempi1->t.a2t->ic_data-=tempi2->ic_data; @@ -689,26 +689,26 @@ args. case IC_AND_AND: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data&&tempi2->ic_data; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } tempi->ic_class=cmp.internal_types[RT_I64]; break; case IC_OR_OR: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data||tempi2->ic_data; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } tempi->ic_class=cmp.internal_types[RT_I64]; break; case IC_XOR_XOR: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data^^tempi2->ic_data; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } tempi->ic_class=cmp.internal_types[RT_I64]; break; sub_switch_end: - if (!tempi_push->ic_class->ptr_cnt) { + if (!tempi_push->ic_class->ptr_stars_cnt) { if (tempi_push->ic_class->raw_type==RT_F64) tempi_push->ic_class2=cmp.internal_types[RT_F64]; else if (is_unsigned) @@ -721,7 +721,7 @@ args. case IC_EQUAL_EQUAL: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data==tempi2->ic_data; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else if (tempi->ic_class->raw_type==RT_F64) tempi->ic_flags|=ICF_USE_F64; @@ -729,7 +729,7 @@ args. case IC_NOT_EQUAL: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data!=tempi2->ic_data; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } else if (tempi->ic_class->raw_type==RT_F64) tempi->ic_flags|=ICF_USE_F64; @@ -741,11 +741,9 @@ args. tempi->ic_data=tempi1->ic_data(U64)ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)ic_data(I64); - } else { - tempi->ic_data=tempi1->ic_data(F64)< - tempi2->ic_data(F64); - } - tempi->ic_code=IC_IMM_U64; + } else + tempi->ic_data=tempi1->ic_data(F64)ic_data(F64); + tempi->ic_code=IC_IMM_I64; } else { if (is_unsigned) tempi->ic_flags|=ICF_USE_UNSIGNED; @@ -753,18 +751,16 @@ args. tempi->ic_flags|=ICF_USE_F64; } break; - case IC_GREATER: + case IC_GREATER_EQUAL: if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { if (i==FBO1_INT) { if (is_unsigned) - tempi->ic_data=tempi1->ic_data(U64)>tempi2->ic_data(U64); + tempi->ic_data=tempi1->ic_data(U64)>=tempi2->ic_data(U64); else - tempi->ic_data=tempi1->ic_data(I64)>tempi2->ic_data(I64); - } else { - tempi->ic_data=tempi1->ic_data(F64)> - tempi2->ic_data(F64); - } - tempi->ic_code=IC_IMM_U64; + tempi->ic_data=tempi1->ic_data(I64)>=tempi2->ic_data(I64); + } else + tempi->ic_data=tempi1->ic_data(F64)>=tempi2->ic_data(F64); + tempi->ic_code=IC_IMM_I64; } else { if (is_unsigned) tempi->ic_flags|=ICF_USE_UNSIGNED; @@ -772,18 +768,16 @@ args. tempi->ic_flags|=ICF_USE_F64; } break; - case IC_LESS_EQUAL: + case IC_GREATER: if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { if (i==FBO1_INT) { if (is_unsigned) - tempi->ic_data=tempi1->ic_data(U64)<=tempi2->ic_data(U64); + tempi->ic_data=tempi1->ic_data(U64)>tempi2->ic_data(U64); else - tempi->ic_data=tempi1->ic_data(I64)<=tempi2->ic_data(I64); - } else { - tempi->ic_data=tempi1->ic_data(F64)<= - tempi2->ic_data(F64); - } - tempi->ic_code=IC_IMM_U64; + tempi->ic_data=tempi1->ic_data(I64)>tempi2->ic_data(I64); + } else + tempi->ic_data=tempi1->ic_data(F64)>tempi2->ic_data(F64); + tempi->ic_code=IC_IMM_I64; } else { if (is_unsigned) tempi->ic_flags|=ICF_USE_UNSIGNED; @@ -791,18 +785,16 @@ args. tempi->ic_flags|=ICF_USE_F64; } break; - case IC_GREATER_EQUAL: + case IC_LESS_EQUAL: if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { if (i==FBO1_INT) { if (is_unsigned) - tempi->ic_data=tempi1->ic_data(U64)>=tempi2->ic_data(U64); + tempi->ic_data=tempi1->ic_data(U64)<=tempi2->ic_data(U64); else - tempi->ic_data=tempi1->ic_data(I64)>=tempi2->ic_data(I64); - } else { - tempi->ic_data=tempi1->ic_data(F64)>= - tempi2->ic_data(F64); - } - tempi->ic_code=IC_IMM_U64; + tempi->ic_data=tempi1->ic_data(I64)<=tempi2->ic_data(I64); + } else + tempi->ic_data=tempi1->ic_data(F64)<=tempi2->ic_data(F64); + tempi->ic_code=IC_IMM_I64; } else { if (is_unsigned) tempi->ic_flags|=ICF_USE_UNSIGNED; @@ -812,7 +804,7 @@ args. break; sub_switch_end: tempi->ic_flags&=~ICF_R_TO_INT; - if (!tempi_push->ic_class->ptr_cnt) { + if (!tempi_push->ic_class->ptr_stars_cnt) { if (tempi_push->ic_class->raw_type==RT_F64) tempi_push->ic_class2=cmp.internal_types[RT_F64]; else if (is_unsigned) @@ -830,7 +822,7 @@ args. LexWarn(lx,"Assign U0 "); sub_switch_start: case IC_MUL_EQUAL: - if (tempi2->ic_code==IC_IMM_U64 && + if (tempi2->ic_code==IC_IMM_I64 && tempc->raw_type!=RT_F64 && tempc2->raw_type!=RT_F64) { if (i=tempi2->ic_data) { @@ -842,7 +834,7 @@ args. } break; case IC_DIV_EQUAL: - if (tempi2->ic_code==IC_IMM_U64 && + if (tempi2->ic_code==IC_IMM_I64 && tempc->raw_type!=RT_F64 && tempc2->raw_type!=RT_F64 && (i=tempi2->ic_data) && Bsf(i)==Bsr(i)) { @@ -851,7 +843,7 @@ args. } break; case IC_MOD_EQUAL: - if (tempi2->ic_code==IC_IMM_U64 && + if (tempi2->ic_code==IC_IMM_I64 && tempc->raw_type!=RT_F64 && tempc2->raw_type!=RT_F64 && (i=tempi2->ic_data) && Bsf(i)==Bsr(i)) { @@ -917,7 +909,7 @@ args. case IC_ADD_RSP1: break; case IC_BSF: - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { tempi1->ic_data=Bsf(tempi1->ic_data); tempi_push=tempi1; OptSetNOP1(OptLag(tempi1)); //CALL_START @@ -928,7 +920,7 @@ args. } break; case IC_BSR: - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { tempi1->ic_data=Bsr(tempi1->ic_data); tempi_push=tempi1; OptSetNOP1(OptLag(tempi1)); //CALL_START @@ -957,12 +949,12 @@ args. tempi->ic_flags|=tempi1->ic_flags&~ICF_R_TO_INT|tempi2->ic_flags; OptSetNOP1(tempi2); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; tempi->ic_data=ToI64(tempi1->ic_data(F64)); tempi->ic_class=cmp.internal_types[RT_I64]; tempi->ic_class2=cmp.internal_types[RT_I64]; OptSetNOP1(tempi1); - } else if (tempi1->ic_code==IC_IMM_U64) { + } else if (tempi1->ic_code==IC_IMM_I64) { tempi2=tempi1->last; while (tempi2->ic_code!=IC_CALL_START) tempi2=tempi2->last; @@ -975,7 +967,7 @@ args. tempi->ic_flags|=tempi1->ic_flags&~ICF_R_TO_F64|tempi2->ic_flags; OptSetNOP1(tempi2); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; tempi->ic_data=tempi1->ic_data; tempi->ic_class=cmp.internal_types[RT_I64]; tempi->ic_class2=cmp.internal_types[RT_I64]; @@ -1008,7 +1000,7 @@ args. } break; case IC_TO_F64: - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { tempi2=tempi1->last; while (tempi2->ic_code!=IC_CALL_START) tempi2=tempi2->last; @@ -1072,7 +1064,7 @@ args. } break; case IC_TO_BOOL: - if (tempi1->ic_code==IC_IMM_U64 || tempi1->ic_code==IC_IMM_F64) { + if (tempi1->ic_code==IC_IMM_I64 || tempi1->ic_code==IC_IMM_F64) { tempi2=tempi1->last; while (tempi2->ic_code!=IC_CALL_START) tempi2=tempi2->last; @@ -1085,7 +1077,7 @@ args. tempi->ic_flags|=tempi1->ic_flags&~ICF_R_TO_F64|tempi2->ic_flags; OptSetNOP1(tempi2); - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; tempi->ic_data=ToBool(tempi1->ic_data); tempi->ic_class=cmp.internal_types[RT_I64]; tempi->ic_class2=cmp.internal_types[RT_I64]; @@ -1098,14 +1090,6 @@ args. case IC_BR_NOT_ZERO: tempi_push=OptBrNotZero(lx,tempi); break; - case IC_BR_LBTS: - case IC_BR_LBTR: - case IC_BR_LBTC: - case IC_BR_NOT_LBTS: - case IC_BR_NOT_LBTR: - case IC_BR_NOT_LBTC: - tempi->ic_flags|=ICF_LOCK; - break; case IC_NOP1: if (tempi->ic_flags&ICF_PUSH_RESULT) { tempi1=tempi; @@ -1177,18 +1161,8 @@ args. case IC_ATAN: case IC_BR_CARRY: case IC_BR_NOT_CARRY: - case IC_BR_NOT_EQUAL: - case IC_BR_EQUAL_EQUAL: - case IC_BR_GREATER_EQUAL: - case IC_BR_LESS_EQUAL: - case IC_BR_GREATER: - case IC_BR_LESS: - case IC_BR_NOT_EQUAL2: - case IC_BR_EQUAL_EQUAL2: - case IC_BR_GREATER_EQUAL2: - case IC_BR_LESS_EQUAL2: - case IC_BR_GREATER2: - case IC_BR_LESS2: + case IC_BR_EQUAL_EQUAL ...IC_BR_LESS_EQUAL: + case IC_BR_EQUAL_EQUAL2...IC_BR_LESS_EQUAL2: case IC_BR_OR_OR_NOT_ZERO: case IC_BR_OR_OR_ZERO: case IC_BR_AND_AND_NOT_ZERO: @@ -1278,10 +1252,10 @@ args. break; default: "Pass:%d Missing IC handler\n",lx->pass; - ICPut(tempi); + ICPut(lx,tempi); LexExcept(lx,"Compiler Optimization Error at "); } - if (cmp.arg_cnt[code]==2) { + if (intermediate_code_table[code].arg_cnt==IS_2_ARG) { if (tempi_push->ic_precedence.u8[0]&~ASSOC_MASK==PREC_ASSIGN) OptFixSizeOf(tempi2,tempi_push,tempi1->ic_class-1); else { @@ -1289,7 +1263,7 @@ args. OptFixSizeOf(tempi2,tempi_push,tempi1->ic_class); } } - if (cmp.result_cnt[tempi_push->ic_code]) { + if (intermediate_code_table[tempi_push->ic_code].result_cnt) { PrsPush(ps,tempi->ic_class2); PrsPush(ps,tempi_push); } diff --git a/Compiler/OptPass3.CPP b/Compiler/OptPass3.CPP index 56bfa40..5b72ace 100644 --- a/Compiler/OptPass3.CPP +++ b/Compiler/OptPass3.CPP @@ -7,6 +7,8 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) I64 code,i,j,l,member_cnt,used_reg_mask=0; CMemberLst *tempm; COptMemberVar *mv=NULL; + CExe *tempx; + CExeImportExport *tempe; CPrsStk *ps=lx->ps; ps->ptr=0; ps->ptr2=0; @@ -27,7 +29,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) if (0<=tempm->regreg)) PrintWarn("Reg in use\n $$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n", - lx->cur_lfn->name,lx->cur_lfn->line_num,tempm->str,lx->htc.fun->str); + lx->cur_lfn->full_name,lx->cur_lfn->line_num,tempm->str,lx->htc.fun->str); reg_offsets[tempm->reg].offset=tempm->offset; reg_offsets[tempm->reg].m=tempm; } else if (tempc->raw_type!=RT_F64 && tempm->reg!=REG_NONE || @@ -40,7 +42,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) } else { if (tempm->reg==REG_ALLOC) PrintWarn("Can't reg var\n $$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n", - lx->cur_lfn->name,lx->cur_lfn->line_num,tempm->str,lx->htc.fun->str); + lx->cur_lfn->full_name,lx->cur_lfn->line_num,tempm->str,lx->htc.fun->str); } tempm=tempm->next; } @@ -59,11 +61,11 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) } else tempil1=tempil2=&cmp.ic_nop; tempc=tempi->ic_class; - nobound_switch (cmp.arg_cnt[code]) { - case 9: + nobound_switch (intermediate_code_table[code].arg_cnt) { + case IS_V_ARG: ps->ptr-=tempi->ic_data>>3; break; - case 2: + case IS_2_ARG: tempi2=PrsPop(ps); if (tempi2->ic_flags&ICF_R_TO_F64) tempc2=cmp.internal_types[RT_F64]; @@ -74,7 +76,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) tempi->a2.type=TY_STK+CmpRawType(tempc2); tempi->a2.type_pointed=CmpRawTypePointed(tempc2); tempi->ic_flags|=ICF_A2_WAS_STK; - case 1: + case IS_1_ARG: tempi1=PrsPop(ps); if (tempi1->ic_flags&ICF_R_TO_F64) tempc1=cmp.internal_types[RT_F64]; @@ -86,10 +88,10 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) tempi->a1.type_pointed=CmpRawTypePointed(tempc1); tempi->ic_flags|=ICF_A1_WAS_STK; break; - case 0: //nobound_switch + case IS_0_ARG: //nobound_switch break; } - if (cmp.result_cnt[code]) { + if (intermediate_code_table[code].result_cnt) { tempi->r.type=TY_STK+CmpRawType(tempc); tempi->r.type_pointed=CmpRawTypePointed(tempc); tempi->ic_flags|=ICF_R_WAS_STK; @@ -101,10 +103,10 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) if (tempi->ic_flags&ICF_R_TO_INT) { tempi->ic_data=ToI64(tempi->ic_data(F64)); tempi->ic_flags&=~ICF_R_TO_INT; - tempi->ic_code=IC_IMM_U64; + tempi->ic_code=IC_IMM_I64; } break; - case IC_IMM_U64: + case IC_IMM_I64: tempi->ic_flags&=~ICF_R_TO_INT; if (tempi->ic_flags&ICF_R_TO_F64) { tempi->ic_data(F64)=ToF64(tempi->ic_data); @@ -207,7 +209,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) CmpF2PushPop(tempi,tempi1,tempi2); break; } - if (tempi2->ic_code==IC_IMM_U64) { + if (tempi2->ic_code==IC_IMM_I64) { tempi->ic_flags|=tempi2->ic_flags; tempi->ic_data=tempi2->ic_data; tempi->ic_code=IC_SUB_CONST; @@ -216,9 +218,9 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) } break; case IC_LESS: + case IC_GREATER_EQUAL: case IC_GREATER: case IC_LESS_EQUAL: - case IC_GREATER_EQUAL: if (tempi->ic_flags&ICF_USE_F64) CmpF2PushPop(tempi,tempi1,tempi2); break; @@ -273,9 +275,20 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) lb=OptLabelFwd(tempi->ic_data(CLexCodeMisc *)->dft); lb->use_cnt++; break; + case IC_ASM: + tempx=tempi->ic_data; + tempe=tempx->next_ie; + while (tempe!=&tempx->next_ie) { + if (EIT_REL_I0<=tempe->type<=EIT_IMM_I64 && + tempe->str && tempe->flags&EIF_GOTO_LABEL && + (lb=LCCGoToLabelFind(lx,tempe->str))) + lb->use_cnt++; //Prevent deadcode elimination. + tempe=tempe->next; + } + break; case IC_BR_NOT_EQUAL: case IC_BR_EQUAL_EQUAL: - if ((tempi1->ic_code==IC_IMM_U64 || tempi1->ic_code==IC_IMM_F64) && !tempi1->ic_data) { + if ((tempi1->ic_code==IC_IMM_I64 || tempi1->ic_code==IC_IMM_F64) && !tempi1->ic_data) { OptFree(tempi1); MemCpy(&tempi->a1,&tempi->a2,sizeof(CICArg)); tempi->a2.type=TY_NULL; @@ -285,7 +298,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) code=tempi->ic_code=IC_BR_NOT_ZERO; tempi1=tempi2; tempc1=tempc2; - } else if ((tempi2->ic_code==IC_IMM_U64 || tempi2->ic_code==IC_IMM_F64) && !tempi2->ic_data) { + } else if ((tempi2->ic_code==IC_IMM_I64 || tempi2->ic_code==IC_IMM_F64) && !tempi2->ic_data) { OptFree(tempi2); tempi->a2.type=TY_NULL; if (code==IC_BR_EQUAL_EQUAL) @@ -296,7 +309,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) goto here1; case IC_BR_ZERO: case IC_BR_NOT_ZERO: - if (tempi1->ic_code==IC_IMM_U64 || tempi1->ic_code==IC_IMM_F64) { + if (tempi1->ic_code==IC_IMM_I64 || tempi1->ic_code==IC_IMM_F64) { if (code==IC_BR_ZERO ^^ tempi1->ic_data) { OptFree(tempi1); tempi->a1.type=TY_NULL; @@ -309,7 +322,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) } goto here1; case IC_BR_AND_ZERO: - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { i=Bsr(tempi1->ic_data); if (0<=i==Bsf(tempi1->ic_data)) { tempi1->ic_data=i; @@ -318,7 +331,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) goto here1; } } - if (tempi2->ic_code==IC_IMM_U64) { + if (tempi2->ic_code==IC_IMM_I64) { i=Bsr(tempi2->ic_data); if (0<=i==Bsf(tempi2->ic_data)) { tempi2->ic_data=i; @@ -328,7 +341,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) } goto here1; case IC_BR_AND_NOT_ZERO: - if (tempi1->ic_code==IC_IMM_U64) { + if (tempi1->ic_code==IC_IMM_I64) { i=Bsr(tempi1->ic_data); if (0<=i==Bsf(tempi1->ic_data)) { tempi1->ic_data=i; @@ -337,7 +350,7 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) goto here1; } } - if (tempi2->ic_code==IC_IMM_U64) { + if (tempi2->ic_code==IC_IMM_I64) { i=Bsr(tempi2->ic_data); if (0<=i==Bsf(tempi2->ic_data)) { tempi2->ic_data=i; @@ -359,20 +372,15 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) } tempi->a1.type_pointed=CmpRawType(tempc); goto here1; + case IC_BR_LESS: case IC_BR_GREATER_EQUAL: - case IC_BR_LESS_EQUAL: case IC_BR_GREATER: - case IC_BR_LESS: + case IC_BR_LESS_EQUAL: if (tempi->ic_flags&ICF_USE_F64) CmpF2PushPop(tempi,tempi1,tempi2); + case IC_BR_EQUAL_EQUAL2...IC_BR_LESS_EQUAL2: case IC_BR_CARRY: case IC_BR_NOT_CARRY: - case IC_BR_GREATER_EQUAL2: - case IC_BR_LESS_EQUAL2: - case IC_BR_GREATER2: - case IC_BR_LESS2: - case IC_BR_NOT_EQUAL2: - case IC_BR_EQUAL_EQUAL2: case IC_GET_LABEL: case IC_BR_BT: case IC_BR_BTS: @@ -382,12 +390,6 @@ U0 OptPass3(CLex *lx,COptReg *reg_offsets) case IC_BR_NOT_BTS: case IC_BR_NOT_BTR: case IC_BR_NOT_BTC: - case IC_BR_LBTS: - case IC_BR_LBTR: - case IC_BR_LBTC: - case IC_BR_NOT_LBTS: - case IC_BR_NOT_LBTR: - case IC_BR_NOT_LBTC: case IC_JMP: case IC_SUB_CALL: here1: @@ -470,7 +472,6 @@ here1: case IC_OUT_U32: case IC_OUT_U16: case IC_OUT_U8: - case IC_ASM: case IC_STR_CONST: case IC_FS: case IC_GS: @@ -509,7 +510,7 @@ here1: break; default: "Pass:%d Missing IC handler\n",lx->pass; - ICPut(tempi); + ICPut(lx,tempi); LexExcept(lx,"Compiler Optimization Error at "); } } @@ -550,7 +551,7 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k. } else { if (mv[i].m->reg==REG_ALLOC) PrintWarn("Can't reg var\n $$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n", - lx->cur_lfn->name,lx->cur_lfn->line_num,mv[i].m->str,lx->htc.fun->str); + lx->cur_lfn->full_name,lx->cur_lfn->line_num,mv[i].m->str,lx->htc.fun->str); } } if (j>0) { @@ -561,7 +562,7 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k. for (i=0;imember_class); - if (!tempc->ptr_cnt && !tempm->dim.next) { + if (!tempc->ptr_stars_cnt && !tempm->dim.next) { while (lhtc.fun->used_reg_mask,cmp.non_ptr_vars_map[l])) l++; @@ -574,10 +575,10 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k. tempm->str,reg_offsets[tempm->reg].offset; mv[i].offset_start=0; //flag as reg var if (tempm->size<8 && !StrIMatch("Bool",tempm->member_class->str) && - tempm->member_class->type&HTT_INTERNAL_TYPE) + tempm->member_class->type&HTT_INTERNAL_TYPE) PrintWarn("Using 64-bit reg var.\n " "$$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n", - lx->cur_lfn->name,lx->cur_lfn->line_num, + lx->cur_lfn->full_name,lx->cur_lfn->line_num, tempm->str,lx->htc.fun->str); } } @@ -600,11 +601,11 @@ R12 and R13 as non-pointer register variables, such as index variables i,j,k. "Reg %Z Var \"%-15ts\" %016X[RBP]\n",tempm->reg,"ST_U64_REGS", tempm->str,reg_offsets[tempm->reg].offset; if (tempm->size<8 && !StrIMatch("Bool",tempm->member_class->str) && - tempm->member_class->type&HTT_INTERNAL_TYPE) + tempm->member_class->type&HTT_INTERNAL_TYPE) PrintWarn("Using 64-bit reg var.\n " - "$$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n", - lx->cur_lfn->name,lx->cur_lfn->line_num, - tempm->str,lx->htc.fun->str); + "$$LK,\"FL:%s,%d\"$$ '%s' in '%s'\n", + lx->cur_lfn->full_name,lx->cur_lfn->line_num, + tempm->str,lx->htc.fun->str); } } } diff --git a/Compiler/OptPass4.CPP b/Compiler/OptPass4.CPP index 1a51f20..06e4a69 100644 --- a/Compiler/OptPass4.CPP +++ b/Compiler/OptPass4.CPP @@ -3,7 +3,7 @@ Bool OptIC4(CIntermediateCode *tempi) I64 i,ty,pt,ty1,pt1; CIntermediateCode *tempil1,*tempil2; - if (tempi->ic_codeic_codeic_class; - tempi1=tempi2=tempi3=&cmp.ic_nop; + tempi1=tempi2=&cmp.ic_nop; if (tempil1=OptLag2(tempi)) { if (tempil2=OptLag2(tempil1)) { if (!(tempil3=OptLag2(tempil2))) @@ -203,25 +203,22 @@ U0 OptPass4(CLex *lx,COptReg *reg_offsets,I64 *_type) tempil2=tempil3=&cmp.ic_nop; } else tempil1=tempil2=tempil3=&cmp.ic_nop; - nobound_switch (cmp.arg_cnt[code]) { - case 9: + nobound_switch (intermediate_code_table[code].arg_cnt) { + case IS_V_ARG: ps->ptr-=tempi->ic_data>>3; break; - case 3: - tempi3=PrsPop(ps); - tempc3=tempi3->ic_class; - case 2: + case IS_2_ARG: tempi2=PrsPop(ps); tempc2=tempi2->ic_class; - case 1: + case IS_1_ARG: tempi1=PrsPop(ps); tempc1=tempi1->ic_class; break; - case 0: //nobound_switch + case IS_0_ARG: //nobound_switch break; } nobound_switch (code) { - case IC_IMM_U64: + case IC_IMM_I64: case IC_TYPE: tempi->a1.type=TY_IMM+RT_I64; tempi->a1.disp=tempi->ic_data; @@ -391,7 +388,7 @@ p4_sib: case IC_ASSIGN_PP: case IC_ASSIGN_MM: //this val was stashed during pass012 for pointer arithmetic - tempi->ic_class2=tempi->t.class2; + tempi->ic_class2=tempi->t.class2; //See $LK,"ic_class2",A="FF:::/Compiler/BackB.CPP,ic_class2"$ case IC_ASSIGN: case IC_SHL_EQUAL: case IC_SHR_EQUAL: @@ -476,12 +473,6 @@ p4_sib: case IC_BR_NOT_BTS: case IC_BR_NOT_BTR: case IC_BR_NOT_BTC: - case IC_BR_LBTS: - case IC_BR_LBTR: - case IC_BR_LBTC: - case IC_BR_NOT_LBTS: - case IC_BR_NOT_LBTR: - case IC_BR_NOT_LBTC: case IC_BT: case IC_BTS: case IC_BTR: @@ -553,22 +544,12 @@ p4_sib: } } break; - case IC_BR_NOT_EQUAL2: - case IC_BR_EQUAL_EQUAL2: - case IC_BR_GREATER_EQUAL2: - case IC_BR_LESS_EQUAL2: - case IC_BR_GREATER2: - case IC_BR_LESS2: - case IC_BR_ZERO: - case IC_BR_NOT_ZERO: + case IC_BR_EQUAL_EQUAL ...IC_BR_LESS_EQUAL: + case IC_BR_EQUAL_EQUAL2...IC_BR_LESS_EQUAL2: case IC_BR_CARRY: case IC_BR_NOT_CARRY: - case IC_BR_NOT_EQUAL: - case IC_BR_EQUAL_EQUAL: - case IC_BR_GREATER_EQUAL: - case IC_BR_LESS_EQUAL: - case IC_BR_GREATER: - case IC_BR_LESS: + case IC_BR_ZERO: + case IC_BR_NOT_ZERO: lb=tempi->ic_data; if (tempi->ic_flags&ICF_PUSH_CMP) { lb->flags|=CMF_POP_CMP; @@ -589,9 +570,12 @@ p4_sib: break; case IC_CALL_END: case IC_END_EXP: - if (tempi->a1.type&TY_MASK==TY_STK) { - if (tempil1->r.type&TY_MASK==TY_STK && - !(tempil1->ic_flags&ICF_PUSH_RESULT)) { + if (!(tempil1->ic_flags&ICF_PUSH_RESULT)) { + if (tempi->ic_flags&ICF_NO_DEPEND_RESULT) { + tempil1->ic_flags|=ICF_NO_DEPEND_RESULT; + tempil1->r.type=TY_NULL+tempil1->r.type&RT_MASK; + } else if (tempi->a1.type&TY_MASK==TY_STK && + tempil1->r.type&TY_MASK==TY_STK) { tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK; tempi->a1.reg=REG_RAX; tempi->a1.disp=0; @@ -652,12 +636,7 @@ p4_sib: case IC_OR: case IC_XOR: case IC_SUB: - case IC_EQUAL_EQUAL: - case IC_NOT_EQUAL: - case IC_LESS: - case IC_GREATER: - case IC_LESS_EQUAL: - case IC_GREATER_EQUAL: + case IC_EQUAL_EQUAL...IC_LESS_EQUAL: case IC_AND_AND: case IC_OR_OR: case IC_XOR_XOR: @@ -719,13 +698,13 @@ p4_sib: break; default: "Pass:%d Missing IC handler\n",lx->pass; - ICPut(tempi); + ICPut(lx,tempi); LexExcept(lx,"Compiler Optimization Error at "); } if (tempi) { while (OptIC4(tempi)); code=tempi->ic_code; - if (cmp.result_cnt[code]) + if (intermediate_code_table[code].result_cnt) PrsPush(ps,tempi); } } diff --git a/Compiler/OptPass5.CPP b/Compiler/OptPass5.CPP index 8ad7c8f..945b4be 100644 --- a/Compiler/OptPass5.CPP +++ b/Compiler/OptPass5.CPP @@ -10,12 +10,12 @@ U0 OptPass5(CLex *lx) while (code=tempi->ic_code) { if (code>IC_NOP2) { if (tempi->ic_flags&ICF_TRACE) { - if (Bt(&lx->pass_trace_mask,5)) { + if (Bt(&lx->otrace_mask,5)) { "%2d:",ps->ptr; - ICPut(tempi); + ICPut(lx,tempi); } } - if (cmp.arg_cnt[code]==9) + if (intermediate_code_table[code].arg_cnt==IS_V_ARG) ps->ptr-=tempi->ic_data>>3; if (code==IC_PUSH_REGS) { for (i=0;ir.type&TY_MASK==TY_STK) + if (tempi->r.type&TY_MASK==TY_STK && !(tempi->ic_flags&ICF_NO_DEPEND_RESULT)) PrsPush(ps,tempi); } tempi=tempi->next; diff --git a/Compiler/OptPass6.CPP b/Compiler/OptPass6.CPP index cf2c868..0858792 100644 --- a/Compiler/OptPass6.CPP +++ b/Compiler/OptPass6.CPP @@ -1,7 +1,7 @@ Bool OptIC6(CIntermediateCode *tempi) { CIntermediateCode *tempil1; - if (tempi->ic_codeic_codeic_code==IC_ADD_CONST && tempi->ic_code==IC_DEREF && tempi->ic_flags&ICF_A1_WAS_STK && tempi->a1.type&TY_MASK==TY_REG && @@ -25,21 +25,20 @@ Bool OptIC6(CIntermediateCode *tempi) return FALSE; } -U0 OptPass6Lag(CLex *lx, - CPrsStk *ps,CIntermediateCode *tempi,I64 *i_,I64 num_stk, - I64 *_clobbered_reg_mask,I64 fun_num) +U0 OptPass6Lag(CLex *lx,CPrsStk *ps,CIntermediateCode *tempi, + I64 *i_,I64 num_stk,I64 *_clobbered_reg_mask,I64 fun_num) { I64 i=*i_,j,k,l,code,clobbered_reg_mask=*_clobbered_reg_mask; CHashFun *tempf; code=tempi->ic_code; - if (tempi->ic_flags&ICF_TRACE && Bt(&lx->pass_trace_mask,6)) { + if (tempi->ic_flags&ICF_TRACE && Bt(&lx->otrace_mask,6)) { "%2d:",i; - ICPut(tempi); + ICPut(lx,tempi); } if (code==IC_CALL_START) { k=MinI64(i,num_stk); j=0; - //See $LK,"STK TEMP ALLOCATION",A="FF:::/Compiler/CmpInit.CPP.Z,STK TEMP ALLOCATION"$ + //See $LK,"STK TEMP ALLOCATION",A="FF:::/Compiler/CInit.CPP,STK TEMP ALLOCATION"$ if (fun_num&1) for (l=0;lptr--; i=PrsPop(ps); } - if (cmp.arg_cnt[code]==9) + if (intermediate_code_table[code].arg_cnt==IS_V_ARG) i-=tempi->ic_data>>3; if (tempi->a2.type&TY_MASK==TY_STK) { i--; @@ -111,66 +110,41 @@ U0 OptPass6Lag(CLex *lx, U0 OptPass6(CLex *lx) { - CIntermediateCode *tempi,*tempil1,*tempil2,*tempil3,*tempif1,*tempif2,*old_tempil2; - I64 i=0,code,num_stk,clobbered_reg_mask=REG_ALWAYS_CLOBBERED_MASK,fun_num=0; + CIntermediateCode *tempi,*tempi_next,*tempil1,*tempil2,*old_tempil2; + I64 i=0,num_stk,clobbered_reg_mask=REG_ALWAYS_CLOBBERED_MASK,fun_num=0; CPrsStk *ps=lx->ps; ps->ptr=0; ps->ptr2=0; - if (lx->htc.fun) - fun_num=cmp.compiled_funs++; if (Bt(&lx->opts,OPTf_NO_REG_VAR) || lx->flags&LF_NO_REG_OPT) num_stk=0; else num_stk=cmp.num_stk_temps; tempi=lx->lcc.lcc_root.next; old_tempil2=NULL; - tempil1=tempil2=tempil3=&cmp.ic_nop; - while (code=tempi->ic_code) { - if ( code>=IC_END_EXP && code!=IC_NOP2) { - if ( tempil1->ic_code>=IC_END_EXP && tempil1->ic_code!=IC_NOP2) { - if (tempil2->ic_code>=IC_END_EXP && tempil2->ic_code!=IC_NOP2) - tempil3=tempil2; + tempil1=tempil2=&cmp.ic_nop; + while (tempi->ic_code) { + if (tempi->ic_code>IC_NOP2) { + if (tempil1->ic_code>IC_NOP2) tempil2=tempil1; - } tempil1=tempi; - } - if (tempil2->ic_code==IC_END_EXP && code!=IC_RETURN_VAL2 && code!=IC_NOP1 && - !(tempil3->ic_flags&(ICF_R_TO_F64|ICF_R_TO_INT|ICF_PUSH_RESULT|ICF_DEPEND_RESULT))) { - tempil3->ic_flags|=ICF_NO_DEPEND_RESULT; - tempil3->r.type=TY_NULL+tempil3->r.type&RT_MASK; - tempil2->ic_flags|=ICF_NO_DEPEND_RESULT; - tempil2->r.type=TY_NULL+tempil2->r.type&RT_MASK; - } - if (code>IC_NOP2) { if (tempi->a2.type&TY_MASK==TY_STK) { if (tempil2->r.type&TY_MASK==TY_STK && !(tempil2->ic_flags&ICF_PUSH_RESULT)) { - tempif2=NULL; - if (tempi->ic_code==IC_ASSIGN && - tempi->ic_flags&ICF_NOT_ADDR && - tempil2->ic_code!=IC_CALL_END && - tempil2->ic_code!=IC_CALL_END2 && + if (tempi->ic_code==IC_ASSIGN && tempi->ic_flags&ICF_NOT_ADDR && + tempi->ic_flags&ICF_NO_DEPEND_RESULT && + tempil2->ic_code!=IC_CALL_END && tempil2->ic_code!=IC_CALL_END2 && tempil2->ic_code!=IC_SET_RAX && - !(tempi->ic_flags& - (ICF_A2_TO_F64|ICF_A2_TO_INT)) && - !(tempil2->ic_flags& - (ICF_R_TO_F64|ICF_R_TO_INT))) { - if (tempif1=OptLead1(tempi)) //predict NO_DEPEND - if (tempif2=OptLead1(tempif1)) - if (tempif1->ic_code==IC_END_EXP && - tempif2->ic_code!=IC_RETURN_VAL2) { - tempil2->r.type =tempi->a1.type&TY_MASK+tempi->a1.type_pointed; - tempil2->r.type_pointed=tempi->a1.type_pointed; - tempil2->r.reg =tempi->a1.reg; - tempil2->r.disp =tempi->a1.disp; - tempil2->ic_flags=tempil2->ic_flags&~(ICF_NO_DEPEND_RESULT|ICF_R_WAS_STK)| - tempi->ic_flags&~(ICF_NOT_ADDR|ICF_A1_WAS_STK|ICF_A2_WAS_STK)|ICF_DEPEND_RESULT; - old_tempil2=NULL; - OptSetNOP1(tempi); - } else - tempif2=NULL; - } - if (!tempif2) { + !(tempi->ic_flags&(ICF_A2_TO_F64|ICF_A2_TO_INT)) && + !(tempil2->ic_flags&(ICF_R_TO_F64|ICF_R_TO_INT))) { + tempil2->r.type =tempi->a1.type&TY_MASK+tempi->a1.type_pointed; + tempil2->r.type_pointed=tempi->a1.type_pointed; + tempil2->r.reg =tempi->a1.reg; + tempil2->r.disp =tempi->a1.disp; + tempil2->ic_flags=tempil2->ic_flags&~(ICF_NO_DEPEND_RESULT|ICF_R_WAS_STK)| + tempi->ic_flags&~(ICF_NOT_ADDR|ICF_A1_WAS_STK|ICF_A2_WAS_STK)|ICF_DEPEND_RESULT; + old_tempil2=NULL; + OptSetNOP1(tempi); + } else { tempi->a2.type=TY_REG+tempi->a2.type&RT_MASK; tempi->a2.reg=REG_RAX; tempi->a2.disp=0; @@ -180,8 +154,8 @@ U0 OptPass6(CLex *lx) } } } else if (tempi->a1.type&TY_MASK==TY_STK && - tempil2->r.type&TY_MASK==TY_STK && - !(tempil2->ic_flags&ICF_PUSH_RESULT)) { + tempil2->r.type&TY_MASK==TY_STK && + !(tempil2->ic_flags&ICF_PUSH_RESULT)) { tempi->a1.type=TY_REG+tempi->a1.type&RT_MASK; tempi->a1.reg=REG_RAX; tempi->a1.disp=0; @@ -191,13 +165,16 @@ U0 OptPass6(CLex *lx) } if (tempi->ic_flags & ICF_PUSH_RESULT) tempi->r.type==TY_STK+tempi->r.type&RT_MASK; + if (old_tempil2!=tempil2) { + if (tempil2->ic_code>IC_NOP2) + OptPass6Lag(lx,ps,tempil2,&i,num_stk,&clobbered_reg_mask,fun_num); + old_tempil2=tempil2; + } } - if (old_tempil2!=tempil2) { - if (tempil2->ic_code>IC_NOP2) - OptPass6Lag(lx,ps,tempil2,&i,num_stk,&clobbered_reg_mask,fun_num); - old_tempil2=tempil2; - } - tempi=tempi->next; + tempi_next=tempi->next; + if (tempi->ic_code<=IC_NOP2) + OptFree(tempi); + tempi=tempi_next; } if (ps->ptr>2) { "Pass:%d Stk:%08X\n",lx->pass,ps->ptr; @@ -208,7 +185,7 @@ U0 OptPass6(CLex *lx) lx->htc.fun->used_reg_mask|=clobbered_reg_mask; lx->htc.fun->clobbered_reg_mask=clobbered_reg_mask; if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT) && - Bt(&lx->pass_trace_mask,6)) { + Bt(&lx->otrace_mask,6)) { "Used Reg Mask:%04X\n",lx->htc.fun->used_reg_mask; "Clobbered Reg Mask:%04X\n",clobbered_reg_mask; } diff --git a/Compiler/OptPass789.CPP b/Compiler/OptPass789.CPP deleted file mode 100644 index f377df3..0000000 --- a/Compiler/OptPass789.CPP +++ /dev/null @@ -1,1202 +0,0 @@ -I64 OptPass789(CLex *lx,COptReg *reg_offsets,U8 *buf,CDbgInfo **_dbg) -{/* lx->pass==7 is first time - lx->pass==8 is second time - lx->pass==8 is third time and repeated until size stops shrinking - size is now known - lx->pass==9 is final pass, code is placed into buf. -*/ - CIntermediateCode *tempi,*tempi_next; - I64 code,i,cnt,num_lines=lx->max_line+1-lx->min_line,ip=0,ip2; - U8 *ptr; - CLexCodeMisc *lb; - CExe *tempx; - CExeAbsAddr *tempa; - CExeImportExport *tempe; - CExeHeapGlbl *temphg; - CExeHeapGlblRef *temphgr; - CDbgInfo *dbg_info; - CAOTCtrl *a=lx->a; - Bool short_jmp; - CICArg saved_p123[3]; - CHashClass *tempc; - CHashFun *tempf; - CHashGlblVar *tempg; - CExternUsage *tempeu; - - if (_dbg) { - *_dbg=dbg_info=CAlloc(offset(CDbgInfo.body)+sizeof(U32)*(num_lines+1)); - dbg_info->min_line=lx->min_line; - dbg_info->max_line=lx->max_line; - if (lx->flags&LF_AOT_COMPILE) - dbg_info->body[0]=a->ip; - else - dbg_info->body[0]=buf; - } else - dbg_info=NULL; - - if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT) && Bt(&lx->pass_trace_mask,lx->pass)) - "$$BK,1$$$$LTRED$$$$IV,1$$This code gets merged together and patched.\n$$FG$$$$IV,0$$$$BK,0$$"; - - lx->last_float_op_ic=NULL; - tempi=&lx->lcc.lcc_root; - tempi->ic_cnt=0; - tempi->ic_last_cnt=-1; - tempi=tempi->next; - while (code=tempi->ic_code) { - tempi_next=tempi->next; - if (code>IC_END_EXP) { - if (tempi->ic_flags&ICF_TRACE && Bt(&lx->pass_trace_mask,lx->pass)) - ICPut(tempi); - ip2=ip; - if (lx->flags&LF_AOT_COMPILE) - ip2+=a->ip; - else - ip2+=buf; - lx->cur_ic_float_op_num=0; - if (!(tempi->ic_flags &ICF_CODE_FINAL)) { - tempi->ic_flags=tempi->ic_flags&~(ICF_PREVIOUS_DELETED|ICF_DONT_RESTORE)|ICF_CODE_FINAL; - if (lx->pass==7) - lx->dont_push_float=Btr(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0); - MemCpy(saved_p123,&tempi->a1,3*sizeof(CICArg)); - if (cmp.arg_cnt[code]==2 && tempi->a1.type&TY_MASK==TY_REG && - tempi->a1.reg==REG_RAX) - tempi->ic_flags|=ICF_A1_FIRST; - tempi->ic_cnt=0; - tempi->ic_last_cnt=-1; - if (tempi->ic_flags & ICF_A1_FIRST) { - if (tempi->a1.type&TY_MASK) { - if (tempi->ic_flags & ICF_A1_TO_F64) { - ICFCvt(lx,tempi,REG_RDX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_A1,ip2); - tempi->a1.type=TY_REG+RT_I64; - tempi->a1.reg=REG_RDX; - tempi->a1.disp=0; - tempi->ic_flags&=~ICF_A1_FIRST; - } else if (tempi->ic_flags & ICF_A1_TO_INT) { - ICFCvt(lx,tempi,REG_RDX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_A1,ip2); - tempi->a1.type=TY_REG+RT_I64; - tempi->a1.reg=REG_RDX; - tempi->a1.disp=0; - tempi->ic_flags&=~ICF_A1_FIRST; - } - } - if (tempi->a2.type&TY_MASK) { - if (tempi->ic_flags & ICF_A2_TO_F64) { - if (tempi->ic_flags&ICF_A1_FIRST) { - ICMov(tempi,TY_REG+RT_I64,REG_RDX,0, - tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2); - tempi->a1.type=TY_REG+RT_I64; - tempi->a1.reg=REG_RDX; - tempi->a1.disp=0; - tempi->ic_flags&=~ICF_A1_FIRST; - } - ICFCvt(lx,tempi,REG_RAX,tempi->a2.type,tempi->a2.reg,tempi->a2.disp,FALSE,CN_A2,ip2); - tempi->a2.type=TY_REG+RT_I64; - tempi->a2.reg=REG_RAX; - tempi->a2.disp=0; - } else if (tempi->ic_flags & ICF_A2_TO_INT) { - if (tempi->ic_flags&ICF_A1_FIRST) { - ICMov(tempi,TY_REG+RT_I64,REG_RDX,0, - tempi->a1.type,tempi->a1.reg,tempi->a1.disp,ip2); - tempi->a1.type=TY_REG+RT_I64; - tempi->a1.reg=REG_RDX; - tempi->a1.disp=0; - tempi->ic_flags&=~ICF_A1_FIRST; - } - ICFCvt(lx,tempi,REG_RAX,tempi->a2.type,tempi->a2.reg,tempi->a2.disp,TRUE,CN_A2,ip2); - tempi->a2.type=TY_REG+RT_I64; - tempi->a2.reg=REG_RAX; - tempi->a2.disp=0; - } - } - } else { - if (tempi->a2.type&TY_MASK) { - if (tempi->ic_flags & ICF_A2_TO_F64) { - ICFCvt(lx,tempi,REG_RAX,tempi->a2.type,tempi->a2.reg,tempi->a2.disp,FALSE,CN_A2,ip2); - tempi->a2.type=TY_REG+RT_I64; - tempi->a2.reg=REG_RAX; - tempi->a2.disp=0; - } else if (tempi->ic_flags & ICF_A2_TO_INT) { - ICFCvt(lx,tempi,REG_RAX,tempi->a2.type,tempi->a2.reg,tempi->a2.disp,TRUE,CN_A2,ip2); - tempi->a2.type=TY_REG+RT_I64; - tempi->a2.reg=REG_RAX; - tempi->a2.disp=0; - } - } - if (tempi->a1.type&TY_MASK) { - if (tempi->ic_flags & ICF_A1_TO_F64) { - ICFCvt(lx,tempi,REG_RDX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,FALSE,CN_A1,ip2); - tempi->a1.type=TY_REG+RT_I64; - tempi->a1.reg=REG_RDX; - tempi->a1.disp=0; - } else if (tempi->ic_flags & ICF_A1_TO_INT) { - ICFCvt(lx,tempi,REG_RDX,tempi->a1.type,tempi->a1.reg,tempi->a1.disp,TRUE,CN_A1,ip2); - tempi->a1.type=TY_REG+RT_I64; - tempi->a1.reg=REG_RDX; - tempi->a1.disp=0; - } - } - } - nobound_switch (code) { - sub_switch_start: - sub_switch_start: - case IC_ABS_ADDR: - ICU16(tempi,0xB848); - ICU64(tempi,tempi->ic_data); - if (buf && lx->flags&LF_AOT_COMPILE && - !(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) { - tempa=CAlloc(sizeof(CExeAbsAddr)); - tempa->next=a->abss; - tempa->type=EAT_ADD_U64; - a->abss=tempa; - tempa->ip=ip2+tempi->ic_cnt-8; - } - break; - case IC_HEAP_GLBL: - ICU16(tempi,0xB848); - ICU64(tempi,0); - temphg=tempi->ic_data; - if (buf && lx->flags&LF_AOT_COMPILE && - !(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) {//is this necessary--flags? - temphgr=CAlloc(sizeof(CExeHeapGlblRef)); - temphgr->next=temphg->references; - temphg->references=temphgr; - temphgr->ip=ip2+tempi->ic_cnt-8; - } - break; - case IC_ADDR_IMPORT: - ICU8(tempi,0xB8); - ICU32(tempi,0); - if (buf && !(lx->flags&LF_NO_ABSS)) { - tempg=tempi->ic_data; - tempe=CAlloc(sizeof(CExeImportExport)); - tempe->type=EIT_IMM_U32; - tempe->ip=ip2+tempi->ic_cnt-4; - tempe->next=tempg->ie_lst; - tempg->ie_lst=tempe; - } - ICU24(tempi,0xC06348); - break; - case IC_RIP: - ICU16(tempi,0xB848); - ICU64(tempi,ip2+tempi->ic_cnt-2); - if (lx->flags&LF_AOT_COMPILE && buf && !(lx->flags&LF_NO_ABSS)) { - tempa=CAlloc(sizeof(CExeAbsAddr)); - tempa->next=a->abss; - tempa->type=EAT_ADD_U64; - a->abss=tempa; - tempa->ip=ip2+tempi->ic_cnt-8; - } - break; - sub_switch_end: - ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_REG+RT_I64,REG_RAX,0,ip2); - break; - case IC_BR_CARRY: - ICFlagBranch(tempi,ip,0x72820F,buf); - break; - case IC_BR_NOT_CARRY: - ICFlagBranch(tempi,ip,0x73830F,buf); - break; - case IC_BR_ZERO: - ICTestAndBranch(tempi,ip,0x74840F,buf,ip2); - break; - case IC_BR_NOT_ZERO: - ICTestAndBranch(tempi,ip,0x75850F,buf,ip2); - break; - case IC_BR_MM_ZERO: - ICPreIncDec(tempi,SLASH_OP_DEC,ip2); - ICFlagBranch(tempi,ip,0x74840F,buf); - break; - case IC_BR_MM_NOT_ZERO: - ICPreIncDec(tempi,SLASH_OP_DEC,ip2); - ICFlagBranch(tempi,ip,0x75850F,buf); - break; - case IC_BR_EQUAL_EQUAL: - ICCmpAndBranch(tempi,FALSE,ip,0x74840F,0x74840F,0x74840F,0x74840F,buf,ip2); - break; - case IC_BR_EQUAL_EQUAL2: - ICCmpAndBranch(tempi,TRUE,ip,0x74840F,0x74840F,0x74840F,0x74840F,buf,ip2); - break; - case IC_BR_NOT_EQUAL: - ICCmpAndBranch(tempi,FALSE,ip,0x75850F,0x75850F,0x75850F,0x75850F,buf,ip2); - break; - case IC_BR_NOT_EQUAL2: - ICCmpAndBranch(tempi,TRUE,ip,0x75850F,0x75850F,0x75850F,0x75850F,buf,ip2); - break; - case IC_BR_GREATER_EQUAL: - if (tempi->ic_flags&ICF_USE_F64) - ICFCmpAndBranch(lx,tempi, ip,0x73830F,0x76860F,buf,ip2); - else - ICCmpAndBranch(tempi,FALSE,ip,0x73830F,0x7D8D0F,0x76860F,0x7E8E0F,buf,ip2); - break; - case IC_BR_GREATER_EQUAL2: - ICCmpAndBranch(tempi,TRUE,ip,0x73830F,0x7D8D0F,0x76860F,0x7E8E0F,buf,ip2); - break; - case IC_BR_LESS_EQUAL: - if (tempi->ic_flags&ICF_USE_F64) - ICFCmpAndBranch(lx,tempi, ip,0x76860F,0x73830F,buf,ip2); - else - ICCmpAndBranch(tempi,FALSE,ip,0x76860F,0x7E8E0F,0x73830F,0x7D8D0F,buf,ip2); - break; - case IC_BR_LESS_EQUAL2: - ICCmpAndBranch(tempi,TRUE,ip,0x76860F,0x7E8E0F,0x73830F,0x7D8D0F,buf,ip2); - break; - case IC_BR_GREATER: - if (tempi->ic_flags&ICF_USE_F64) - ICFCmpAndBranch(lx,tempi, ip,0x77870F,0x72820F,buf,ip2); - else - ICCmpAndBranch(tempi,FALSE,ip,0x77870F,0x7F8F0F,0x72820F,0x7C8C0F,buf,ip2); - break; - case IC_BR_GREATER2: - ICCmpAndBranch(tempi,TRUE,ip,0x77870F,0x7F8F0F,0x72820F,0x7C8C0F,buf,ip2); - break; - case IC_BR_LESS: - if (tempi->ic_flags&ICF_USE_F64) - ICFCmpAndBranch(lx,tempi, ip,0x72820F,0x77870F,buf,ip2); - else - ICCmpAndBranch(tempi,FALSE,ip,0x72820F,0x7C8C0F,0x77870F,0x7F8F0F,buf,ip2); - break; - case IC_BR_LESS2: - ICCmpAndBranch(tempi,TRUE,ip,0x72820F,0x7C8C0F,0x77870F,0x7F8F0F,buf,ip2); - break; - case IC_BR_BT: - ICBrBitOps(tempi,ip,0xA30F,0x20BA0F,0x72820F,buf,ip2); - break; - case IC_BR_BTS: - case IC_BR_LBTS: - ICBrBitOps(tempi,ip,0xAB0F,0x28BA0F,0x72820F,buf,ip2); - break; - case IC_BR_BTR: - case IC_BR_LBTR: - ICBrBitOps(tempi,ip,0xB30F,0x30BA0F,0x72820F,buf,ip2); - break; - case IC_BR_BTC: - case IC_BR_LBTC: - ICBrBitOps(tempi,ip,0xBB0F,0x38BA0F,0x72820F,buf,ip2); - break; - case IC_BR_NOT_BT: - ICBrBitOps(tempi,ip,0xA30F,0x20BA0F,0x73830F,buf,ip2); - break; - case IC_BR_NOT_BTS: - case IC_BR_NOT_LBTS: - ICBrBitOps(tempi,ip,0xAB0F,0x28BA0F,0x73830F,buf,ip2); - break; - case IC_BR_NOT_BTR: - case IC_BR_NOT_LBTR: - ICBrBitOps(tempi,ip,0xB30F,0x30BA0F,0x73830F,buf,ip2); - break; - case IC_BR_NOT_BTC: - case IC_BR_NOT_LBTC: - ICBrBitOps(tempi,ip,0xBB0F,0x38BA0F,0x73830F,buf,ip2); - break; - case IC_BR_AND_ZERO: - ICAndBranch(tempi,ip,0x74840F,buf,ip2); - break; - case IC_BR_AND_NOT_ZERO: - ICAndBranch(tempi,ip,0x75850F,buf,ip2); - break; - case IC_SUB_CALL: - lb=OptLabelFwd(tempi->ic_data); - ICU8(tempi,0xE8); - ICU32(tempi,lb->addr-(ip+5)); - break; - case IC_JMP: - lb=OptLabelFwd(tempi->ic_data); - short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP); - if (!buf && lb->addr!=INVALID_PTR && - MIN_I8+5addr-ipic_flags|=ICF_SHORT_JMP; - i=lb->addr-(ip+2); - if (buf || i) - ICU16(tempi,i<<8+0xEB); - else - tempi->ic_code=IC_NOP1; - } else { - i=lb->addr-(ip+5); - ICU8(tempi,0xE9); - ICU32(tempi,i); - }