//This is the main TempleOS header file //for data structures and classes. //There is no code in this file. //The internal types are U16i,I32i, etc. //They are defined $LK,"internal_types_table",A="MN:internal_types_table"$. //HolyC has a feature where a //union structure is treated as a //whole if no member is specified. //See $LK,"::/Demo/SubIntAccess.CPP"$. public U16i union U16 { I8i i8[2]; U8i u8[2]; }; public I16i union I16 { I8i i8[2]; U8i u8[2]; }; public U32i union U32 { I8i i8[4]; U8i u8[4]; I16 i16[2]; U16 u16[2]; }; public I32i union I32 { I8i i8[4]; U8i u8[4]; I16 i16[2]; U16 u16[2]; }; public U64i union U64 { I8i i8[8]; U8i u8[8]; I16 i16[4]; U16 u16[4]; I32 i32[2]; U32 u32[2]; }; public I64i union I64 { I8i i8[8]; U8i u8[8]; I16 i16[4]; U16 u16[4]; I32 i32[2]; U32 u32[2]; }; public class Complex { F64 x,y; }; public class CD2I32 //two dimensional pt { I32 x,y; }; public class CD3I32 //three dimensional pt { I32 x,y,z; }; public class CD2I64 //two dimensional pt { I64 x,y; }; public class CD3I64 //three dimensional pt { I64 x,y,z; }; public class CD2 //two dimensional pt { F64 x,y; }; public class CD3 //three dimensional pt { F64 x,y,z; }; public class CQue { CQue *next,*last; }; #define NULL 0 #define TRUE 1 #define FALSE 0 #define ON 1 #define OFF 0 #define MAX_U8 0xFF #define MIN_U8 0 #define MAX_I8 0x7F #define MIN_I8 (-0x80) #define MAX_U16 0xFFFF #define MIN_U16 0 #define MAX_I16 0x7FFF #define MIN_I16 (-0x8000) #define MAX_U32 0xFFFFFFFF #define MIN_U32 0 #define MAX_I32 0x7FFFFFFF #define MIN_I32 (-0x80000000) #define MAX_U64 0xFFFFFFFFFFFFFFFF //(Int to F64 conversion is signed) #define MAX_U64_F64 (0x43F0000000000000(F64)) #define MIN_U64 0 #define MAX_I64 0x7FFFFFFFFFFFFFFF #define MIN_I64 (-0x8000000000000000) #define MAX_F64 (0x7FEFFFFFFFFFFFFF(F64)) #define MIN_F64 (0xFFEFFFFFFFFFFFFF(F64)) #define inf (0x7FF0000000000000(F64)) #define ì (0x7FF0000000000000(F64)) #define pi (0x400921FB54442D18(F64)) #define ã (0x400921FB54442D18(F64)) #define exp_1 (0x4005BF0A8B145769(F64)) //The number "e" #define log2_10 (0x400A934F0979A371(F64)) #define log2_e (0x3FF71547652B82FE(F64)) #define log10_2 (0x3FD34413509F79FF(F64)) #define loge_2 (0x3FE62E42FEFA39EF(F64)) #define sqrt2 (0x3FF6A09E667F3BCD(F64)) #define eps (0x3CB0000000000000(F64)) #define INVALID_PTR MAX_I64 #define INVALID_CLUSTER (-1) //x86 opcodes #define OC_OP_SIZE_PREFIX 0x66 #define OC_ADDR_SIZE_PREFIX 0x67 #define OC_LOCK_PREFIX 0xF0 #define OC_NOP 0x90 #define OC_BPT 0xCC #define OC_CALL 0xE8 #define OC_JMP_REL8 0xEB #define OC_NOP2 (OC_NOP<<8+OC_OP_SIZE_PREFIX) //Function Stack Frame #define SF_RBP 0x00 #define SF_RIP 0x08 #define SF_ARG1 0x10 #define SF_ARG2 0x18 #define SF_ARG3 0x20 #define SF_ARG4 0x28 #define SF_ARG5 0x30 #define SF_ARG6 0x38 #define SF_ARG7 0x40 #define SF_ARG8 0x48 extern class CTask; extern class CDoc; extern class CCPU; extern class CHashClass; extern class CHashFun; extern class CExeImportExport; extern class CHeapCtrl; extern class CExeHeapGlbl; extern class CExe; extern class CDC; extern class CSrvCtrl; extern class CIntermediateCode; #define QUE_VECT_U8_CNT 512 class CQueVectU8 { CQueVectU8 *next,*last; I64 total_cnt,node_cnt,min_index; U8 body[QUE_VECT_U8_CNT]; }; public class CFifoU8 { U8 *buf; I64 mask,in_ptr,out_ptr; }; public class CFifoI64 { I64 *buf; I64 mask,in_ptr,out_ptr; }; #define CDATE_YEAR_DAYS 365.24225 #define CDATE_YEAR_DAYS_INT 36524225 #define CDATE_BASE_DAY_OF_WEEK 0 public I64 class CDate { U32 time; I32 date; }; public class COrder2D3 { F64 x,y,z,DxDt,DyDt,DzDt; }; #define MSF_INACTIVE 1 #define MSF_FIXED 2 public class CMass { CMass *next,*last; COrder2D3 *state,*DstateDt; U0 start_saved_area; U32 flags,num; F64 mass,drag_profile_factor; U0 saved_state; F64 x,y,z,DxDt,DyDt,DzDt; U0 end_saved_area; }; #define SSF_INACTIVE 1 #define SSF_NO_COMPRESSION 2 #define SSF_NO_TENSION 4 public class CSpring { CSpring *next,*last; CMass *end1,*end2; F64 f,displacement; //set for you to check U0 start_saved_area; U32 flags,num, end1_num,end2_num; F64 const,rest_len; U0 end_saved_area; }; //Ordinary Differential Equations #define ODEF_HAS_MASSES 1 #define ODEF_PAUSED 2 #define ODEF_STARTED 4 #define ODE_SIGNATURE_VAL 'ODES' public class CMathODE { CMathODE *next,*last; U32 ode_signature,pad; I64 flags,n,n_internal; CMass *next_mass,*last_mass; CSpring *next_spring,*last_spring; F64 drag_v; //drag proportional to velocity F64 drag_v2; //drag proportional to velocity squared F64 drag_v3; //drag proportional to velocity cubed F64 acceleration_limit; //This clips acceleration F64 base_t; F64 t,t_scale; F64 h,h_min,h_max; //This is not precise, just a ballpark. //TempleOS CMathODE's are for video games //not science. It bails if it takes //too long. F64 min_tolerance,max_tolerance; F64 tolerance_internal; F64 *array_base; F64 *state; F64 *state_internal; F64 *DstateDt; F64 *state_scale; F64 *initial_state; F64 *temp0,*temp1,*temp2,*temp3, *temp4,*temp5,*temp6,*temp7; CTask *mem_task,*win_task; U0 (*derivative)(CMathODE *o,F64 t,F64 *state,F64 *DstateDt); I64 user_data; }; class CBinFile { /* See $LK,"Bin File Header Generation",A="FF:::/Compiler/CmpMain.CPP,16 ALIGN"$ by compiler. Bin files have this 16-byte header, followed by code, followed by loader patch table. See $LK,"Loader Patch Table Generation",A="FF:::/Compiler/CmpMain.CPP,EIT_MODULE_ALIGNMENT"$ and $LK,"BinRep",A="MN:BinRep"$(). */ U16 jmp; U16 type; U32 loader_patch_table_offset; U64 file_size; }; class CBinFilePatchTableWithoutOrg { U8 eit_module_alignment; U32 module_alignment; U8 zero1; U8 eit_abs_addr; U32 abs_addres_cnt; U8 zero2; U32 abs_addres[1]; }; class CBinFilePatchTableWithOrg { U8 eit_module_alignment; U32 module_alignment; U8 zero1; U8 eit_module_org; U32 module_org; U8 zero2; U8 eit_abs_addr; U32 abs_addres_cnt; U8 zero3; U32 abs_addres[1]; }; //IDT entry types #define IDTET_TASK 0x05 #define IDTET_IRQ 0x0E #define IDTET_TRAP 0x0F //Same as IRQ but doesnt do CLI. //Interrupts //0x00-0x1F are reserved by Intel #define I_DIVIDE_BY_ZERO 0x00 #define I_SINGLE_STEP 0x01 #define I_NMI 0x02 #define I_BPT 0x03 #define I_PAGE_FAULT 0x0E //0x20-0x2F are used for hardware #define I_TIMER 0x20 //Software Interrupts #define I_MP_CRASH 0x30 #define I_WAKE 0x31 #define I_DBG 0x32 //See $LK,"ST_INT_NAMES",A="MN:ST_INT_NAMES"$ //You might want to start backward from //0xFF for your own interrupts. #define I_USER 0x40 #define MP_MAX_PROCESSORS 128 #define SYS_START_CR0 0x0031 #define RFLAGf_CARRY 0 #define RFLAGf_PARITY 2 #define RFLAGf_AUX_CARRY 4 #define RFLAGf_ZERO 6 #define RFLAGf_SIGN 7 #define RFLAGf_TRAP 8 //Single Step #define RFLAGf_INT 9 #define RFLAGf_DIR 10 #define RFLAGf_OVERFLOW 11 #define RFLAGf_IOPL0 12 // I/O Privilege Level #define RFLAGf_IOPL1 13 #define RFLAGf_NESTED_TASK 14 #define RFLAGf_RESUME 16 #define RFLAGf_V8086 17 #define RFLAGf_ALIGN_CHECK 18 #define RFLAGf_VINT 19 //Virtual Interrupt #define RFLAGf_VINT_PENDING 20 #define RFLAGf_ID 21 #define SYS_START_RFLAGS 0x0000 #define SYS_NORMAL_RFLAGS (1< (Exit and Save) #define DOCEF1_QUIT 0x4000 //Send (Abort) #define DOCEF1_LEFT_X 0x8000 #define DOCEF1_CENTER_X 0x10000 #define DOCEF1_RIGHT_X 0x20000 #define DOCEF1_TOP_Y 0x40000 #define DOCEF1_CENTER_Y 0x80000 #define DOCEF1_BOTTOM_Y 0x100000 #define DOCEF1_SHIFTED_X 0x200000 #define DOCEF1_SHIFTED_Y 0x400000 #define DOCEF1_SCROLLING_X 0x800000 //HL...UL #define DOCEF1_FROM_START 0x100000000 #define DOCEF1_HAS_BORDER 0x200000000 #define DOCEF1_SOLID_BORDER 0x400000000 #define DOCEF1_BORDER_PLOT 0x800000000 #define DOCEF1_CHECKED_COLLAPSED 0x1000000000 //Checked or Collapsed #define DOCEF1_CHECK_COLLAPSABLE 0x2000000000 #define DOCEF1_REFRESH_DATA 0x4000000000 #define DOCEF1_DATA_IS_PTR 0x8000000000 #define DOCEF1_HAS_TERMINATOR 0x10000000000 #define DOCEF1_ZERO_BASED 0x20000000000 #define DOCEF1_HOLD 0x40000000000 #define DOCEF1_TREE 0x80000000000 #define DOCEF1_SKIP 0x100000000000 #define DOCEF1_POPUP 0x200000000000 #define DOCEF1_PAGE_REL_Y 0x400000000000 #define DOCEF1_MARGIN_REL_X 0x800000000000 #define DOCEF1_SKIP_IN_FORM 0x1000000000000 #define DOCEF1_WIDTH 0x2000000000000 #define DOCEF1_HEIGHT 0x4000000000000 #define DOCEF1_HARD_SKIP 0x8000000000000 #define DOCEF1_FILTER_SKIP 0x10000000000000 #define DOCEF1_NO_CLICK_ON 0x20000000000000 #define DOCEF1_DONT_DRAW 0x40000000000000 //only works on sprites #define DOCEF1_UPDATE_DATA 0x80000000000000 #define DOCEF1_U8 0x100000000000000 #define DOCEF1_U16 0x200000000000000 #define DOCEF1_U32 0x400000000000000 #define DOCEF1_U64 0x800000000000000 #define DOCEF1_DEFINE 0x1000000000000000 #define DOCEF1_WIN_REL 0x2000000000000000 #define DOCEF1_HTML_LINK 0x4000000000000000 #define DOCEF1_BIN_PTR_LINK 0x8000000000000000 #define DOCEG1_DONT_EDIT (DOCEF1_TAG_CB|DOCEF1_DEFINE|DOCEF1_HTML_LINK|\ DOCEF1_SCROLLING_X|DOCEF1_BIN_PTR_LINK) #define DOCEG1_HAS_ARG (DOCEF1_TAG|DOCEF1_SCROLLING_X|DOCEF1_SHIFTED_X|\ DOCEF1_SHIFTED_Y|DOCEF1_AUX_STR|DOCEF1_LEFT_EXP|DOCEF1_LEFT_MACRO|\ DOCEF1_HAS_BIN|DOCEF1_RIGHT_EXP|DOCEF1_RIGHT_MACRO|DOCEF1_WIDTH|\ DOCEF1_HEIGHT|DOCEF1_DEFINE|DOCEF1_HTML_LINK|DOCEF1_BIN_PTR_LINK) //These are identical to Doc flags #define DOCEF1_HIGHLIGHT 0x1000000 #define DOCEF1_LOCK_TO_PAGE 0x2000000 #define DOCEF1_LOCK_TO_CENTER 0x4000000 #define DOCEF1_WORD_WRAP 0x8000000 #define DOCEF1_BLINK ATTRF_BLINK #define DOCEF1_INVERT ATTRF_INVERT #define DOCEF1_SELECTED ATTRF_SELECTED #define DOCEF1_UNDERLINE ATTRF_UNDERLINE #define DOCEf1_HIGHLIGHT 24 #define DOCEf1_LOCK_TO_PAGE 25 #define DOCEf1_LOCK_TO_CENTER 26 #define DOCEf1_WORD_WRAP 27 #define DOCEf1_BLINK ATTRf_BLINK #define DOCEf1_INVERT ATTRf_INVERT #define DOCEf1_SELECTED ATTRf_SELECTED #define DOCEf1_UNDERLINE ATTRf_UNDERLINE #define DOCEf1_TAG 0 #define DOCEf1_AUX_STR 1 #define DOCEf1_LINK 2 #define DOCEf1_LEFT_CB 3 #define DOCEf1_LEFT_EXP 4 #define DOCEf1_LEFT_MACRO 5 #define DOCEf1_LEFT_AUTO 6 #define DOCEf1_RIGHT_CB 7 #define DOCEf1_RIGHT_EXP 8 #define DOCEf1_RIGHT_MACRO 9 #define DOCEf1_RIGHT_AUTO 10 #define DOCEf1_TAG_CB 11 #define DOCEf1_HAS_BIN 12 #define DOCEf1_ESC 13 //Send (Exit and Save) #define DOCEf1_QUIT 14 //Send (Abort) #define DOCEf1_LEFT_X 15 #define DOCEf1_CENTER_X 16 #define DOCEf1_RIGHT_X 17 #define DOCEf1_TOP_Y 18 #define DOCEf1_CENTER_Y 19 #define DOCEf1_BOTTOM_Y 20 #define DOCEf1_SHIFTED_X 21 #define DOCEf1_SHIFTED_Y 22 #define DOCEf1_SCROLLING_X 23 //HL...UL #define DOCEf1_FROM_START 32 #define DOCEf1_HAS_BORDER 33 #define DOCEf1_SOLID_BORDER 34 #define DOCEf1_BORDER_PLOT 35 #define DOCEf1_CHECKED_COLLAPSED 36 //Checked or Collapsed #define DOCEf1_CHECK_COLLAPSABLE 37 #define DOCEf1_REFRESH_DATA 38 #define DOCEf1_DATA_IS_PTR 39 #define DOCEf1_HAS_TERMINATOR 40 #define DOCEf1_ZERO_BASED 41 #define DOCEf1_HOLD 42 #define DOCEf1_TREE 43 #define DOCEf1_SKIP 44 #define DOCEf1_POPUP 45 #define DOCEf1_PAGE_REL_Y 46 #define DOCEf1_MARGIN_REL_X 47 #define DOCEf1_SKIP_IN_FORM 48 #define DOCEf1_WIDTH 49 #define DOCEf1_HEIGHT 50 #define DOCEf1_HARD_SKIP 51 #define DOCEf1_FILTER_SKIP 52 #define DOCEf1_NO_CLICK_ON 53 #define DOCEf1_DONT_DRAW 54 //only works on sprites #define DOCEf1_UPDATE_DATA 55 #define DOCEf1_U8 56 #define DOCEf1_U16 57 #define DOCEf1_U32 58 #define DOCEf1_U64 59 #define DOCEf1_DEFINE 60 #define DOCEf1_WIN_REL 61 #define DOCEf1_HTML_LINK 62 #define DOCEf1_BIN_PTR_LINK 63 #define DOCEf1_NUM_FLAGS 64 public class CDocBin { CDocBin *next,*last; I32 temp_use_cnt,renum_num; U8 *tag; U0 start; U32 num,flags,size,use_cnt; U0 end; U8 *data; }; #define DOC_SCROLL_SPEED 8 #define DOCSS_NORMAL 0 #define DOCSS_SINGLE_QUOTE 1 #define DOCSS_DBL_QUOTE 2 #define DOCSS_COMMENT 3 #define DOCSS_CPP_Z_COMMENT 4 #define TERM_ATTR_TEXT WHITE<<4+BLUE #define TERM_ATTR_BORDER WHITE<<4+LTBLUE #define DOC_ATTR_DFT_TEXT WHITE<<4+BLACK #define DOC_COLOR_ALT_TEXT LTGRAY #define DOC_COLOR_LINK RED #define DOC_COLOR_MACRO LTBLUE #define DOC_COLOR_ANCHOR DKGRAY #define DOC_COLOR_TREE PURPLE #define DOC_COLOR_PMT GREEN #define DOC_COLOR_BIN CYAN #define DOC_COLOR_KEYWORD BLUE #define DOC_COLOR_KEYWORD2 LTRED #define DOC_COLOR_COMMENT GREEN #define DOC_COLOR_QUOTE BROWN public class CDocSettings { I16 left_margin,right_margin,indent; U16 page_len,header,footer; I8 shifted_x,shifted_y; U8 state,comment_depth,paren_depth,brace_depth; U8 cur_text_attr,dft_text_attr,pad[4]; }; #define DOC_DFT MIN_I32 public class CDocEntryBase { //This is a shortened structure for //cmds like the text cmd which //don't require the full CDocEntry structure. CDocEntryBase *next,*last; U8 *tag; union { U8 type_u8; //this stores the code U32 type; //these store attr flags }; I32 page_line_num; I64 flags1; I32 x,y; U32 min_col,max_col; CDocSettings settings; I64 user_data; }; public class CDocEntry:CDocEntryBase { union { I64 attr; I64 cursor_x_offset; I64 (*left_cb)(CDoc *doc,CDocEntry *doc_e); I64 left_exp; }; U8 *left_macro; union { I64 cursor_y_offset; I64 (*right_cb)(CDoc *doc,CDocEntry *doc_e); I64 right_exp; }; U8 *right_macro; U8 *(*tag_cb)(CDoc *doc,CDocEntry *doc_e, CTask *mem_task); U8 *define_str; U8 *aux_str; U8 *bin_ptr_link; U8 *html_link; U8 *my_fmt_data; I64 hex_ed_width; union { I32 scroll_len; I32 width; } union { I32 len; I32 height; } I32 bin_num; I32 pad; CDocBin *bin_data; U8 *data; }; //$LK,"DocFormDo",A="MN:DocFormDo"$() $LK,"DocMenuDo",A="MN:DocMenuDo"$() $LK,"DocDo",A="MN:DocDo"$() $LK,"PopUpMenu",A="MN:PopUpMenu"$() #define DOF_MIN_SIZE 0x01 #define DOF_INTERCEPT_TASK_END 0x02 #define DOF_DONT_HOME 0x04 #define DOF_WIN_MAX 0x08 #define DOF_DONT_TEXT_ATTR 0x10 class CEdFindText { U8 find_text[136] fmtstr "$$DA-P,135,A=\"Find :%s\"$$\n"; U8 replace_text[136] fmtstr "$$DA-P,135,A=\"Replace :%s\"$$\n"; Bool replace fmtstr "$$CB,\"Replace\"$$\n"; Bool scan_fwd fmtstr "$$CB,\"Fwd\"$$\n"; Bool scan_selected_text fmtstr "$$CB,\"Selection\"$$\n"; Bool match_case fmtstr "$$CB,\"Match Case\"$$\n"; Bool whole_labels fmtstr "$$CB,\"Whole Labels\"$$\n"; Bool local_var fmtstr "$$CB,\"Rename Local Var\"$$\n"; Bool pmt; U8 pad; I64 filter_lines fmtstr "$$DA,131,A=\"Filter Lines:%d\"$$\n"; }; class CEdFileName { U8 name[256] fmtstr "$$DA-P,255,A=\"FileName:%s\"$$"; }; //$LK,"Ed",A="MN:Ed"$() #define EDF_BAIL 1 #define EDF_COLLAPSE 2 #define EDF_UNCOLLAPSE 4 #define EDf_BAIL 0 #define EDf_COLLAPSE 1 #define EDf_UNCOLLAPSE 2 // DOC header flags #define DOCF_PLAIN_TEXT 0x1 #define DOCF_PLAIN_TEXT_WITH_TABS 0x2 //has '\t', not DOCT_TAB #define DOCF_NO_CURSOR 0x4 #define DOCF_CARRIAGE_RETURN 0x8 #define DOCF_DBL_DOLLARS 0x10 #define DOCF_COLOR_NAMES 0x20 //Reserved x2 #define DOCF_BORDER_DOC 0x100 #define DOCF_FORM 0x200 #define DOCF_MIN_SIZE 0x400 #define DOCF_HIDE_CURSOR 0x800 //use $LK,"DocCursor",A="MN:DocCursor"$ #define DOCF_NO_SCROLL_BARS 0x1000 //use $LK,"DocScroll",A="MN:DocScroll"$ #define DOCF_ALLOW_UNDO 0x2000 #define DOCF_DONT_SHOW 0x4000 #define DOCF_HAS_SONG 0x8000 #define DOCF_MORE 0x10000 #define DOCF_BACKWARD_MOVEMENT 0x20000 #define DOCF_NULL_GRAB_SCROLL 0x40000 #define DOCF_DONT_SWAP_OUT 0x80000 #define DOCF_DO_FULL_REFRESH 0x100000 #define DOCF_BREAK_UNLOCKED 0x200000 //Reserved x2 #define DOCF_HIGHLIGHT DOCEF1_HIGHLIGHT #define DOCF_LOCK_TO_PAGE DOCEF1_LOCK_TO_PAGE #define DOCF_LOCK_TO_CENTER DOCEF1_LOCK_TO_CENTER #define DOCF_WORD_WRAP DOCEF1_WORD_WRAP #define DOCF_BLINK DOCEF1_BLINK #define DOCF_INVERT DOCEF1_INVERT #define DOCF_SELECTED DOCEF1_SELECTED #define DOCF_UNDERLINE DOCEF1_UNDERLINE #define DOCF_OVERSTRIKE 0x100000000 #define DOCF_IN_DOLLAR 0x200000000 #define DOCF_SUPERSCRIPT_MODE 0x400000000 #define DOCF_SUBSCRIPT_MODE 0x800000000 #define DOCF_UNDO_DIRTY 0x1000000000 #define DOCf_PLAIN_TEXT 0 #define DOCf_PLAIN_TEXT_WITH_TABS 1 //has '\t', not DOCT_TAB #define DOCf_NO_CURSOR 2 #define DOCf_CARRIAGE_RETURN 3 #define DOCf_DBL_DOLLARS 4 #define DOCf_COLOR_NAMES 5 //Reserved x2 #define DOCf_BORDER_DOC 8 #define DOCf_FORM 9 #define DOCf_MIN_SIZE 10 #define DOCf_HIDE_CURSOR 11 //use $LK,"DocCursor",A="MN:DocCursor"$ #define DOCf_NO_SCROLL_BARS 12 //use $LK,"DocScroll",A="MN:DocScroll"$ #define DOCf_ALLOW_UNDO 13 #define DOCf_DONT_SHOW 14 #define DOCf_HAS_SONG 15 #define DOCf_MORE 16 #define DOCf_BACKWARD_MOVEMENT 17 #define DOCf_NULL_GRAB_SCROLL 18 #define DOCf_DONT_SWAP_OUT 19 #define DOCf_DO_FULL_REFRESH 20 #define DOCf_BREAK_UNLOCKED 21 //Reserved x2 #define DOCf_HIGHLIGHT DOCEf1_HIGHLIGHT #define DOCf_LOCK_TO_PAGE DOCEf1_LOCK_TO_PAGE #define DOCf_LOCK_TO_CENTER DOCEf1_LOCK_TO_CENTER #define DOCf_WORD_WRAP DOCEf1_WORD_WRAP #define DOCf_BLINK DOCEf1_BLINK #define DOCf_INVERT DOCEf1_INVERT #define DOCf_SELECTED DOCEf1_SELECTED #define DOCf_UNDERLINE DOCEf1_UNDERLINE #define DOCf_OVERSTRIKE 32 #define DOCf_IN_DOLLAR 33 #define DOCf_SUPERSCRIPT_MODE 34 #define DOCf_SUBSCRIPT_MODE 35 #define DOCf_UNDO_DIRTY 36 //locked flags #define DOClf_LOCKED 0 class CDocUndo { CDocUndo *next,*last; I64 size; I64 doc_flags; I64 time_stamp; U8 *body; }; //See $LK,"DocMenuDo",A="MN:DocMenuDo"$() #define DOCM_CANCEL (-1) #define DOC_SIGNATURE_VAL 'DocS' #define DOC_RECALC_ALL 0 #define DOC_RECALC_PARTIAL 1 #define DOC_RECALC_FIND_CURSOR 2 #define DOC_RECALC_TO_SCREEN 3 public class CDoc //Linked Text File header { //See $LK,"Doc",A="HI:Doc"$ for documentation. CDocEntryBase root; U8 *dummy_display; I64 flags,locked_flags; CDocEntry *cur_entry,*old_cur_entry; I32 cur_data_col,old_cur_data_col, line_start_col,cur_top_line_num; I64 swap_out_time; I32 ext_ascii_val,ext_ascii_cnt; I32 dollar_buf_size,dollar_buf_ptr; U8 *dollar_buf; CTask *win_task,*mem_task; CDocEntry *recalc_start; I32 page_line_num,undo_cnt; I32 x,y,min_x,max_x,min_y,max_y; I64 line,col,best_d; I64 old_win_top,old_win_bottom, old_win_left,old_win_right; I64 cmd_U8; U32 doc_signature; I32 max_entries,ww_lines_back,cur_bin_num; I64 refresh_cnt; CTask *owning_task; CEdFindText *find_replace; I32 start_x,start_y; U8 *cur_sprite; //not document num, but num in a CSprite collection I64 cur_sprite_elem_num; CEdFileName filename; I64 file_attr; I64 (*left_click_link)(CDoc *doc,CDocEntry *doc_e); I64 (*right_click_link)(CDoc *doc,CDocEntry *doc_e); U8 *user_put_data; Bool (*user_put_key)(CDoc *doc,U8 *data,I64 ch,I64 sc); Bool (*user_put_s)(CDoc *doc,U8 *data,U8 *st); CDoc *parent_doc; U8 desc[8]; //Be careful -- only 7 characters and terminator CDocBin bin_root; CDocSettings settings_root; CDocUndo undo_root; I64 user_data; U0 pad;#assert !($$&7) //(compiler lags one token) }; //MGetS flags #define GETSF_SHIFT_ESC_EXIT 1 //This kills task on #define GETSF_WITH_NEW_LINE 2 //Compiler Options // Use $LK,"OptOn",A="MN:OptOn"$() $LK,"OptOff",A="MN:OptOff"$() //You might need to do #exe {OptOn();} //Note: The #exe statement is lexed-ahead, so it takes effect earlier than you might expect. #define OPTf_ECHO 0x00 #define OPTf_OPT_TRACE 0x01 #define OPTf_COMPILE_TRACE 0x02 #define OPTf_WARN_UNUSED_VAR 0x10 //Applied to funs, not statements #define OPTf_WARN_PAREN 0x11 //Warn unnecessary parens #define OPTf_WARN_DUP_TYPES 0x12 //Warn dup local var type statements #define OPTf_EXTERNS_TO_IMPORTS 0x20 #define OPTf_KEEP_PRIVATE 0x21 #define OPTf_NO_REG_VAR 0x22 //Applied to funs, not statements #define OPTf_GLBLS_ON_DATA_HEAP 0x23 //Disable 10-byte float consts for ã,log2_10,log10_2,loge_2 #define OPTf_NO_BUILTIN_CONST 0x24 //Applied to funs, not statements #define OPTf_USE_IMM64 0x25 //Not completely implemented #define OPTF_ECHO (1<float conversions) I64 cur_ic_float_op_num,last_ic_float_op_num; CIntermediateCode *last_float_op_ic; Bool last_dont_pushable,last_dont_popable,last_float_op_pos, dont_push_float,pad[4]; CLexCodeCtrl lcc; CPrsStk *ps; CAsmCtrl *a; I64 a_depth; U0 end_of_zeroed_members; CLexFile lfns[LFN_CNT]; CLexFile stk[LFN_STK_CNT]; U0 pad;#assert !($$&7) //(compiler lags one token) }; class CPCIDev { CPCIDev *next,*last; U16 vendor,dev_id; U8 bus,dev,fun,pad; U8 sub_code,base_code,pad[6]; U8 *vendor_str,*dev_id_str; }; #define FILEMASK_JIT "*.CPP*;*.HPP*" #define FILEMASK_AOT "*.CPP*;*.HPP*;*.PRJ*" #define FILEMASK_SRC "*.CPP*;*.HPP*;*.AUT*;*.PRJ*" #define FILEMASK_TXT FILEMASK_SRC ";*.TXT*;*.LOG*" #define FILEMASK_GRA "*.GRA*;*.BMP*" #define BLK_SIZE_BITS 9 #define BLK_SIZE (1<drv_let directly in case a drive has been remapped. //Use $LK,"Prt2Drv",A="MN:Prt2Drv"$(). I64 locked_flags; U32 type, //Bit31 is used as a disable, since it will be unknown flags; //Flags not used at the moment U32 pt_signature; U8 drv_let,text_attr,pad[2]; I64 offset; I64 size; I64 file_system_info_sect; I64 map1,map2; I64 root_cluster; I64 data; I64 spc; //sectors per cluster CTask *owning_task; CBlkDev *bdev; CFAT32FileInfoSect *fis; I64 num_buffered_map_blks; I64 cur_map_blk_num; U32 *cur_map_blk; U8 *buffered_map_dirty_bits; CFreeLst *next_free,*last_free; }; #define DSK_CACHE_HASH_SIZE 0x2000 public class CCacheBlk { CCacheBlk *next_lru,*last_lru; CCacheBlk *next_hash,*last_hash; CPrt *p; I64 blk; U8 body[BLK_SIZE]; }; class CExcept { CExcept *next,*last; I64 handler_catch,handler_untry; I64 rsp,rbp,rflags; I64 rsi,rdi,r10,r11, r12,r13,r14,r15; }; #define MBS_USED_SIGNATURE_VAL 'MBUs' #define MBS_UNUSED_SIGNATURE_VAL 'MBUn' class CMemBlk { CMemBlk *next,*last; U32 mb_signature; U32 pages; }; #define MRT_UNUSED 0 #define MRT_RAM 1 #define MRT_DEV 2 class CMemRange { CMemRange *next,*last; U32 type,flags; U8 *base; I64 size; }; #define _CFG_HEAP_DBG FALSE #if _CFG_HEAP_DBG class CMemUnusedAllocated { CHeapCtrl *hc; U8 *caller1,*caller2; CMemUnusedAllocated *next; I64 size; }; class CMemUsedAllocated { CHeapCtrl *hc; U8 *caller1,*caller2; CMemUsedAllocated *next,*last; I64 size; U0 start; }; #else class CMemUnusedAllocated { U0 hc; U0 caller1,caller2; CMemUnusedAllocated *next; I64 size; }; class CMemUsedAllocated { CHeapCtrl *hc; U0 caller1,caller2; U0 next,last; I64 size; U0 start; }; #endif //TempleOS does not mess with page tables after it //identity-maps them during boot -- $LK,"SYS_INIT_MEM",A="MN:SYS_INIT_MEM"$. //$LK,"PAGE_SIZE",A="MN:PAGE_SIZE"$ is arbitrary, and is not related to CPU hardware. //I need some unit for memory allocation so I invented "$LK,"PAGE_SIZE",A="MN:PAGE_SIZE"$". // //All virtual addresses are identical to physical, always. //There is no high kernel memory because RAM's physical //addresses are low. (All motherboards that I know of //put RAM in low addresses of 64-bit address space.) //It's ring-0-only so all (or none) is kernel, remember. // //2 Meg hardware pages are use except the first 2 Meg. //0xA0000-0xBFFFF must be write thru. Hardware pages //don't matter except the caching bit. Remember, it is ring-0-only //and identity-mapped! Do I need to repeat? //Ring-0-only and 100% identity-mapped, all the time. // //All code is placed in just the lowest 2 Gig, so the CALL REL32 //instruction always works. It never changes out of ring-0, remember, //so I don't need to waste cycles on use SYSCALL or software interrupts. //Everything just uses CALL REL32. #define PAGE_BITS 9 #define PAGE_SIZE (1<answers[0]) #define ans0 (Fs->answers[0]) #define ans1 (Fs->answers[1]) #define ans2 (Fs->answers[2]) #define ans3 (Fs->answers[3]) #define ansf (Fs->answers[0](F64)) #define ansf0 (Fs->answers[0](F64)) #define ansf1 (Fs->answers[1](F64)) #define ansf2 (Fs->answers[2](F64)) #define ansf3 (Fs->answers[3](F64)) #define KBD_PORT 0x60 #define KBD_CTRL 0x64 #define CH_CTRLA 0x01 #define CH_CTRLB 0x02 #define CH_CTRLC 0x03 #define CH_CTRLD 0x04 #define CH_CTRLE 0x05 #define CH_CTRLF 0x06 #define CH_CTRLG 0x07 #define CH_CTRLH 0x08 #define CH_CTRLI 0x09 #define CH_CTRLJ 0x0A #define CH_CTRLK 0x0B #define CH_CTRLL 0x0C #define CH_CTRLM 0x0D #define CH_CTRLN 0x0E #define CH_CTRLO 0x0F #define CH_CTRLP 0x10 #define CH_CTRLQ 0x11 #define CH_CTRLR 0x12 #define CH_CTRLS 0x13 #define CH_CTRLT 0x14 #define CH_CTRLU 0x15 #define CH_CTRLV 0x16 #define CH_CTRLW 0x17 #define CH_CTRLX 0x18 #define CH_CTRLY 0x19 #define CH_CTRLZ 0x1A #define CH_CURSOR 0x05 #define CH_BACKSPACE 0x08 #define CH_FORM_FEED 0x0C #define CH_ESC 0x1B #define CH_SHIFT_ESC 0x1C #define CH_SHIFT_SPACE 0x1F #define CH_SPACE 0x20 //Scan code flags #define SCf_E0_PREFIX 7 #define SCf_KEY_UP 8 #define SCf_SHIFT 9 #define SCf_CTRL 10 #define SCf_ALT 11 #define SCf_CAPS 12 #define SCf_NUM 13 #define SCf_SCROLL 14 #define SCf_NEW_KEY 15 #define SCf_IP_L_DOWN 16 #define SCf_IP_R_DOWN 17 #define SCf_DELETE 18 #define SCf_INS 19 #define SCf_KEY_DESC 31 #define SCF_E0_PREFIX (1<rax #define _RBX Fs->rbx #define _RCX Fs->rcx #define _RDX Fs->rdx #define _RSI Fs->rsi #define _RDI Fs->rdi #define _RBP Fs->rbp #define _RSP Fs->rsp #define _RIP Fs->rip #define _R8 Fs->r8 #define _R9 Fs->r9 #define _R10 Fs->r10 #define _R11 Fs->r11 #define _R12 Fs->r12 #define _R13 Fs->r13 #define _R14 Fs->r14 #define _R15 Fs->r15 #define REG_RAX 0 #define REG_RCX 1 #define REG_RDX 2 #define REG_RBX 3 #define REG_RSP 4 #define REG_RBP 5 #define REG_RSI 6 #define REG_RDI 7 #define REG_RIP 16 //Used by compiler, not really it's num //Be careful: RBPu8, RSPu8, RSIu8, RDIu8 are 20-24 #define REG_NONE 32 //noreg flag sets it to this #define REG_ALLOC 33 //reg flag sets it to this #define REG_UNDEF MIN_I8 #define REG_ALWAYS_CLOBBERED_MASK 0x003F //RAX,RCX,RDX,RBX,RBP,RSP #define REG_STK_TEMPS_MASK 0x0300 //R8,R9 #define REG_VARS_MASK 0xCCC0 //RSI,RDI,R10,R11,R14,R15 #define REG_NON_PTR_MASK 0x3000 //R12,R13 #define PUSH_C_REGS PUSH RAX PUSH RCX PUSH RDX PUSH RBX PUSH R8 PUSH R9 #define POP_C_REGS POP R9 POP R8 POP RBX POP RDX POP RCX POP RAX #define PUSH_REGS PUSH RAX PUSH RCX PUSH RDX PUSH RBX PUSH RBP PUSH RSI \ PUSH RDI PUSH R8 PUSH R9 PUSH R10 PUSH R11 PUSH R12 PUSH R13 PUSH R14 PUSH R15 #define POP_REGS POP R15 POP R14 POP R13 POP R12 POP R11 POP R10 POP R9 \ POP R8 POP RDI POP RSI POP RBP POP RBX POP RDX POP RCX POP RAX #define MEM_MAPPED_SPACE 0x2000000000 //Arbitrarily set to 128 Gig #define MEM_NUM_PML1 1 //First 2 Meg are 4K resolution #define MEM_NUM_PML2 (MEM_MAPPED_SPACE>>(9+21)) #define MEM_NUM_PML3 1 #define MEM_NUM_PML4 1 #define MEM_PROTECTED_LOW_LIMIT 0x6FFF #define SYS_FIXED_AREA 0x100000 class CSysFixedArea { U8 pml1[MEM_NUM_PML1*0x1000]; U8 pml2[MEM_NUM_PML2*0x1000]; U8 pml3[MEM_NUM_PML3*0x1000]; U8 pml4[MEM_NUM_PML4*0x1000]; $$=($$+15)&-16; CFPU init_fpu_mmx; CCPU boot_cpu; CTask adam; CBlkPool adam_bp; CHeapCtrl adam_hc; $$=($$+PAGE_SIZE-1)&-PAGE_SIZE; }; #define ST_ERR_ST "$$LTRED$$$$BK,1$$ERROR:$$FG$$$$BK,0$$ " #define ST_WARN_ST "$$RED$$$$BK,1$$WARNING:$$FG$$$$BK,0$$ " class CSndData { CSndData *next,*last; F64 freq; //Hz F64 time_stamp; }; //sys_raw_flags #define RWF_IN_DOLLAR 1 #define RWF_LAST_DOLLAR 2 #define RWF_SHOW_DOLLAR 4 #define RWF_SCROLL 8 //Input ptr types #define IP_NULL 0 #define IP_MOUSE 1 #define PSECT_CACHE_SIZE 256 class CPSectCache { I64 base,limit; F64 time_stamp; U8 str[1]; //PSECT_CACHE_STR_LEN $$=64; }; #define PSECT_CACHE_STR_LEN (sizeof(CPSectCache)-offset(CPSectCache.str)) //Boot related #define BOOT_RAM_BASE 0x07C00 #define BOOT_RAM_LIMIT 0x97000 #define BOOT_STK_SIZE BLK_SIZE #define BOOT_CODE_RAM 1 #define BOOT_CODE_HARDDRV 2 #define BOOT_CODE_CDROM 3 #define STD_DISTRO_CDROM_CFG "Tb1\nScale2Mem(2048,0x40000)\nt3 \n\n\n\n\n"