From 13c1c96bc551233175de62b3c38a0382ce6d9705 Mon Sep 17 00:00:00 2001 From: Slapparoo Date: Tue, 20 Dec 2022 15:52:16 +1300 Subject: [PATCH 01/51] Create Sandy beach palette --- src/System/Gr/GrPalette.ZC | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/System/Gr/GrPalette.ZC b/src/System/Gr/GrPalette.ZC index 75ea2c50..287a66ff 100755 --- a/src/System/Gr/GrPalette.ZC +++ b/src/System/Gr/GrPalette.ZC @@ -54,6 +54,20 @@ public U0 PaletteSetDark(Bool persistent=TRUE) //*(drv_text_attr(U8 *) + 1) = BROWN; } //******************************************************************************** +public CBGR24 gr_palette_sandy_beach[COLORS_NUM] = { + 0x000000, 0x000088, 0x008800, 0x006060, 0x002288, 0x4B0082, 0xA52A2A, 0xAAAAAA, + 0x444444, 0x4169E1, 0xADFF2F, 0x00AAAA, 0xFF8888, 0x9932CC, 0xC09020, 0xFFF8DF +}; + +public U0 PaletteSetSandyBeach(Bool persistent=TRUE) +{//Activate Sandy beach Light palette. + GrPaletteSet(gr_palette_sandy_beach); + LFBFlush; + if (persistent) + fp_set_std_palette = &PaletteSetSandyBeach; +} +//******************************************************************************** + public CBGR24 gr_palette_light[COLORS_NUM] = { 0x000000, 0x0148A4, 0x3B7901, 0x057C7E, 0xBB2020, 0x9E42AE, 0xB57901, 0xB2B6AF, 0x555753, 0x678FBB, 0x82BC49, 0x0097A2, 0xE26A6A, 0xC671BC, 0xC7AB00, 0xFEF1F0 From 23cb55718345b137201d0894d386ccd3dcf2a054 Mon Sep 17 00:00:00 2001 From: Slapparoo Date: Tue, 20 Dec 2022 16:01:29 +1300 Subject: [PATCH 02/51] Add Boll to Print, update Print format Doc --- src/Doc/Print.DD | 6 ++++++ src/Kernel/StrPrint.ZC | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/Doc/Print.DD b/src/Doc/Print.DD index d9a6609c..84008e95 100755 --- a/src/Doc/Print.DD +++ b/src/Doc/Print.DD @@ -52,6 +52,12 @@ $FG,2$"%Z"$FG$ $LK,"DefineListLoad",A="MN:DefineListLoad"$() subentry. Pass sub_ $FG,2$"%Q"$FG$ convert "\" to "\\" and quote to backslash quote. (For use in creating strs in strs.) $FG,2$"%q"$FG$ rev a $FG,2$"%Q"$FG$. + +$FG,2$"%x"$FG$ Hex number. + +$FG,2$"%b"$FG$ Binary number$FG$. + +$FG,2$"%o"$FG$ Bool$FG$. $ID,-2$ $FG,5$$TX+CX,"Print Family"$$FG$ diff --git a/src/Kernel/StrPrint.ZC b/src/Kernel/StrPrint.ZC index ba8f61af..5d8d6d99 100755 --- a/src/Kernel/StrPrint.ZC +++ b/src/Kernel/StrPrint.ZC @@ -438,6 +438,11 @@ to avoid this. throw('StrPrint'); ptr = argv[cur_arg++]; break; + case 'o': // Bool + if (cur_arg >= argc) + throw('StrPrint'); + if (argv[cur_arg++]) ptr = "TRUE"; else ptr = "FALSE"; + break; case 'S': if (cur_arg >= argc) From 025cc946d444c7855ee739a0e64cd68186162708 Mon Sep 17 00:00:00 2001 From: tinkeros Date: Thu, 5 Jan 2023 20:42:57 -0600 Subject: [PATCH 03/51] Fix issue preventing network adapter detection with multiple adapters --- src/Home/Net/Drivers/Run.ZC | 37 ++++++++++++++----------------------- src/System/DevInfo.ZC | 4 +++- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/Home/Net/Drivers/Run.ZC b/src/Home/Net/Drivers/Run.ZC index 331f0195..94c0451f 100755 --- a/src/Home/Net/Drivers/Run.ZC +++ b/src/Home/Net/Drivers/Run.ZC @@ -24,32 +24,23 @@ U0 NetDriverInit() CPCIDev *net_driver_pci = PCIDevFind(PCIC_NETWORK); Bool found = FALSE; - switch (net_driver_pci->vendor_id) + if (net_driver_pci) { - case PCIV_PCNET: - switch (net_driver_pci->device_id) - { - case PCID_PCNET: - NetDriverInclude("PCNet"); - found = TRUE; - break; - } - break; - - case PCIV_E1000: - switch (net_driver_pci->device_id) - { - case PCID_82545EM: - NetDriverInclude("E1000"); - found = TRUE; - break; - } - break; - - case PCIV_VIRTIO: + if (net_driver_pci=PCIDevFind(, , PCIV_PCNET, PCID_PCNET)) + { + NetDriverInclude("PCNet"); + found = TRUE; + } + else if (net_driver_pci=PCIDevFind(, , PCIV_E1000, PCID_82545EM)) + { + NetDriverInclude("E1000"); + found = TRUE; + } + else if (net_driver_pci=PCIDevFind(PCIC_NETWORK, , PCIV_VIRTIO, )) + { NetDriverInclude("VirtIONet"); found = TRUE; - break; + } } if (!found) diff --git a/src/System/DevInfo.ZC b/src/System/DevInfo.ZC index b401be15..b3578df3 100755 --- a/src/System/DevInfo.ZC +++ b/src/System/DevInfo.ZC @@ -55,7 +55,7 @@ lud_done: public CPCIDev *PCIDevFind(U16 class_code=NULL, U16 sub_code=NULL, U16 vendor_id=NULL, U16 device_id=NULL, U8 _bus=0xFF, U8 _dev=0xFF, U8 _fun=0xFF) -{//return first device with matching class & subcode, vendor & device id, or a specific device. +{//return first device with matching class & subcode, vendor & device id, class & device id, class & vendor id or a specific device. PCILookUpDevs; CPCIDev *p = dev.pci_head.next; @@ -63,6 +63,8 @@ public CPCIDev *PCIDevFind(U16 class_code=NULL, U16 sub_code=NULL, { if (p->vendor_id == vendor_id && p->device_id == device_id || p->class_code == class_code && p->sub_code == sub_code || + p->class_code == class_code && p->device_id == device_id && vendor_id == NULL || + p->class_code == class_code && p->vendor_id == vendor_id && device_id == NULL || p->bus == _bus && p->dev == _dev && p->fun == _fun) return p; From c59e87318fad65b5a0b77853662b8d54c5d1a366 Mon Sep 17 00:00:00 2001 From: tinkeros Date: Wed, 25 Jan 2023 20:52:17 -0600 Subject: [PATCH 04/51] Add Castle Frankenstein mouse aim support and kernel user mouse function --- src/Demo/Games/CastleFrankenstein.ZC | 49 +- src/Kernel/KernelA.HH | 9113 +++++++++++++------------- src/Kernel/KernelC.HH | 2 + src/Kernel/SerialDev/Mouse.ZC | 60 +- 4 files changed, 4656 insertions(+), 4568 deletions(-) diff --git a/src/Demo/Games/CastleFrankenstein.ZC b/src/Demo/Games/CastleFrankenstein.ZC index c5eed11b..8c88538b 100755 --- a/src/Demo/Games/CastleFrankenstein.ZC +++ b/src/Demo/Games/CastleFrankenstein.ZC @@ -578,6 +578,29 @@ U0 RotateMan(F64 d) } } +CTask *mouse_task = NULL; +CTask *game_task = Fs; +F64 mouse_scale = 32.0; + +U0 MouseHandler() +{ + Bool button; + I64 x; + while (TRUE) + { + button = mouse_hard.raw_bttns[0]; + x = mouse_hard.raw_data.x; + if (button || x!=0) + MouseRawReset; // Mark mouse data as consumed + if (button) + MessagePostWait(game_task,MESSAGE_KEY_DOWN_UP,CH_SPACE,0); + if (x != 0) { + man_é += (x/mouse_scale)/MICRO_STEPS; + } + Sleep(10); + } +} + U0 CastleFrankenstein() { I64 sc; @@ -618,6 +641,26 @@ U0 CastleFrankenstein() Fire; break; + case 'm': + if (!mouse_task) { + MouseRaw(TRUE); + mouse_task=Spawn(&MouseHandler,NULL); + } + else { + Kill(mouse_task); + mouse_task=NULL; + MouseRaw(FALSE); + } + break; + + case '+': + mouse_scale *= 0.9; + break; + + case '-': + mouse_scale *= 1.1; + break; + case '\n': Init; break; @@ -663,7 +706,11 @@ fs_done: RegWrite("ZealOS/CastleFrankenstein", "F64 best_score=%5.4f;\n", best_score); } +MouseRaw(TRUE); +mouse_task=Spawn(&MouseHandler,NULL); CastleFrankenstein; +if (mouse_task) Kill(mouse_task); +MouseRaw(FALSE); &     @@ -837,4 +884,4 @@ D\DdT0T8THL0LLd d      -            \ No newline at end of file +            diff --git a/src/Kernel/KernelA.HH b/src/Kernel/KernelA.HH index 2f22b54f..281a39ac 100755 --- a/src/Kernel/KernelA.HH +++ b/src/Kernel/KernelA.HH @@ -1,4555 +1,4558 @@ -// Main ZealOS header - -#help_index "" -extern class CAOT; -extern class CAOTHeapGlobal; -extern class CAOTImportExport; -extern class CCPU; -extern class CDC; -extern class CDirContext; -extern class CDoc; -extern class CFile; -extern class CHashClass; -extern class CHashFun; -extern class CHeapCtrl; -extern class CIntermediateCode; -extern class CJobCtrl; -extern class CTask; - -#define NULL 0 -#define TRUE 1 -#define FALSE 0 -#define ON 1 -#define OFF 0 -#define NONE 0 //for use in default arguments -#define I8_MIN (-0x80) -#define I8_MAX 0x7F -#define U8_MIN 0 -#define U8_MAX 0xFF -#define I16_MIN (-0x8000) -#define I16_MAX 0x7FFF -#define U16_MIN 0 -#define U16_MAX 0xFFFF -#define I32_MIN (-0x80000000) -#define I32_MAX 0x7FFFFFFF -#define U32_MIN 0 -#define U32_MAX 0xFFFFFFFF -#define I64_MIN (-0x8000000000000000) -#define I64_MAX 0x7FFFFFFFFFFFFFFF -#define U64_MIN 0 -#define U64_MAX 0xFFFFFFFFFFFFFFFF -#define INVALID_PTR I64_MAX -#define STR_LEN 144 - -//(Int to F64 conversion is signed) -//Turn off 80-bit float constants with $LK,"OPTf_NO_BUILTIN_CONST",A="MN:OPTf_NO_BUILTIN_CONST"$. -#define U64_F64_MAX (0x43F0000000000000(F64)) -#define F64_MAX (0x7FEFFFFFFFFFFFFF(F64)) -#define F64_MIN (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)) - -#help_index "Data Types/Simple" -//ZealC union structure is treated as a whole if no member is specified, similar to bit fields. -//See $LK,"::/Demo/SubIntAccess.ZC"$. - -U16i union U16 -{ - I8i i8[2]; - U8i u8[2]; -}; - -I16i union I16 -{ - I8i i8[2]; - U8i u8[2]; -}; - -U32i union U32 -{ - I8i i8[4]; - U8i u8[4]; - I16 i16[2]; - U16 u16[2]; -}; - -I32i union I32 -{ - I8i i8[4]; - U8i u8[4]; - I16 i16[2]; - U16 u16[2]; -}; - -U64i union U64 -{ - I8i i8[8]; - U8i u8[8]; - I16 i16[4]; - U16 u16[4]; - I32 i32[2]; - U32 u32[2]; -}; - -I64i union I64 -{ - I8i i8[8]; - U8i u8[8]; - I16 i16[4]; - U16 u16[4]; - I32 i32[2]; - U32 u32[2]; -}; - -#help_index "Math/Complex;Data Types/Complex" -public class Complex -{ - F64 x, y; -}; - -#help_index "Data Types/Circular Queue" -public class CQueue -{ - CQueue *next, *last; -}; - -#help_index "Graphics/Data Types/D3I32;Math/Data Types/D3I32;Data Types/D3I32" -public class CD3I32 //Three dimensional I32 pt -{ - I32 x, y, z; -}; -public class CQueueD3I32 //Queue of three dimensional I32 pts -{ - CQueueD3I32 *next, *last; - CD3I32 p; -}; -#help_index "Math/Data Types;Data Types" -public class CD2I32 //Two dimensional I32 pt -{ - I32 x, y; -}; -public class CD2I64 //Two dimensional I64 pt -{ - I64 x, y; -}; -public class CD3I64 //Three dimensional I64 pt -{ - I64 x, y, z; -}; -public class CD2 //Two dimensional F64 pt -{ - F64 x, y; -}; - -#help_index "Math/CD3;Data Types/CD3" -public class CD3 //Three dimensional F64 pt -{ - F64 x, y, z; -}; - -#help_index "Data Types/Queue Vector" -#define QUE_VECT_U8_COUNT 512 -public class CQueueVectU8 -{ - CQueueVectU8 *next, - *last; - I64 total_count, - node_count, - min_idx; - U8 body[QUE_VECT_U8_COUNT]; -}; - -#help_index "Data Types/Fifo" -public class CFifoU8 -{ - U8 *buf; - I64 mask, - in_ptr, - out_ptr; -}; -public class CFifoI64 -{ - I64 *buf, - mask, - in_ptr, - out_ptr; -}; -#help_index "Date/CMOS" -#define CMOS_SEL 0x70 //select which register to access using this port -#define CMOS_DATA 0x71 //read from or write to register using this port - -//CMOS registers -#define CMOSR_SEC 0x0 -#define CMOSR_MIN 0x2 -#define CMOSR_HOUR 0x4 -#define CMOSR_DAY_OF_WEEK 0x6 -#define CMOSR_DAY_OF_MONTH 0x7 -#define CMOSR_MONTH 0x8 -#define CMOSR_YEAR 0x9 -#define CMOSR_STATUS_A 0xA -#define CMOSR_STATUS_B 0xB - -//CMOS status flags -#define CMOSF_BINARY (1 << 2) -#define CMOSF_UPDATING (1 << 7) - -#help_index "Date/CDate" -#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; -}; - -#help_index "Date;Date/CDate" -public class CDateStruct -{ - U8 sec10000, - sec100, - sec, - min, - hour, - day_of_week, - day_of_mon, - mon; - I32 year; -}; - -#help_index "Math/ODE" -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, //Point to entries in $LK,"CMathODE",A="MN:CMathODE"$.state[] - *DstateDt; //Point to entries in $LK,"CMathODE",A="MN:CMathODE"$.DstateDt[] - - U0 start; - U32 flags, - num; - F64 mass, - drag_profile_factor; - U0 saved_state; - F64 x, y, z, - DxDt, DyDt, DzDt; - U0 end; -}; - -#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; - U32 flags, num, end1_num, end2_num; - F64 const, rest_len; - U0 end; -}; - -//Ordinary Differential Equations -#define ODEF_HAS_MASSES 1 -#define ODEF_PAUSED 2 -#define ODEF_STARTED 4 -#define ODEF_BUSY 8 - -#define ODEf_HAS_MASSES 0 -#define ODEf_PAUSED 1 -#define ODEf_STARTED 2 -#define ODEf_BUSY 3 - -public class CMathODE -{ - CMathODE *next, *last; - I64 flags, n, n_internal; - CMass *next_mass, *last_mass; - CSpring *next_spring, *last_spring; - F64 drag_v, //drag proportional to velocity - drag_v2, //drag proportional to velocity squared - drag_v3, //drag proportional to velocity cubed - acceleration_limit, //This clips acceleration - base_t, - t, t_scale, - h, h_min, h_max; - - //This is not precise, just a ballpark. - //ZealOS CMathODE's are for video games - //not science. It bails if it takes - //too long. - F64 min_tolerance, max_tolerance; - - F64 tolerance_internal, - *array_base, - *state, - *state_internal, - *DstateDt, - *state_scale, - *initial_state, - *tmp0, *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6, *tmp7; - CTask *mem_task, *win_task; - U0 (*derive)( CMathODE *o, F64 t, F64 *state, F64 *DstateDt); - U0 (*mp_derive)(CMathODE *o, F64 t, I64 cpu_num, F64 *state, F64 *DstateDt); //If break into parallel pieces. - CTask **slave_tasks; - I64 mp_not_done_flags; - F64 mp_t, *mp_state, *mp_DstateDt; - - I64 user_data; -}; - -#help_index "Processor" -//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_DIV_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_DEBUG 0x32 -//See $LK,"ST_INT_NAMES",A="MN:ST_INT_NAMES"$ - -//You might want to start backward from -//0xFF for your own interrupts. -//See $LK+PU,"IntEntryAlloc",A="MN:IntEntryAlloc"$. -#define I_USER 0x40 - -#define MP_PROCESSORS_NUM 128 - -//Control register flag bits -#define CR0f_PE 0 //Protection Enable (Protected mode) -#define CR0f_MP 1 //Monitor coprocessor -#define CR0f_EM 2 //Emulation of coprocessor -#define CR0f_TS 3 //Task switched, some irrelevant x87 task management stuff -#define CR0f_NE 5 //Numeric error -#define CR0f_PG 31//Enable paging - -#define CR0F_PE (1 << CR0f_PE) -#define CR0F_NE (1 << CR0f_NE) - -#define CR4f_PAE 5 //Physical Address Extension, required by long mode -#define CR4f_PGE 7 //Page-Global Enable -#define CR4f_OSFXSR 9 //FXSAVE/FXRSTOR support enabled - -#define CR4F_PAE (1 << CR4f_PAE) -#define CR4F_PGE (1 << CR4f_PGE) -#define CR4F_OSFXSR (1 << CR4f_OSFXSR) - -#define SYS_START_CR0 (CR0F_PE | CR0F_NE) - -#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 RFLAGG_START 0x0000 -#define RFLAGG_NORMAL (1 << RFLAGf_INT) - -//Global Descriptor Table -class CGDTEntry -{ - U64 lo, hi; -}; - -class CGDT -{ - CGDTEntry null, - boot_ds, - boot_cs, - cs32, - cs64, //The $LK,"Charter",A="FI:::/Doc/Charter.DD"$ says just ring-0. - cs64_ring3, //$LK,"Ring3",A="FI:::/Demo/Lectures/Ring3.ZC"$, in case you want to play around. - ds, - ds_ring3, - tr[MP_PROCESSORS_NUM], - tr_ring3[MP_PROCESSORS_NUM]; -}; - -//Interrupt Descriptor Table -class CIDTEntry -{ - U16 offset_low, - seg_select; - U8 ist, - type_attr; - U16 offset_mid; - U32 offset_hi, - zero; -}; -#assert sizeof(CIDTEntry) == 16 - -class CSysLimitBase -{ - U16 limit; //Offset of last byte, not size. - U8 *base; //&GDT or &IDT -}; - -#help_index "Memory/Info" -#define MEM_E820_ENTRIES_NUM 256 -#define MEM_E820t_USABLE 1 -#define MEM_E820t_RESERVED 2 -#define MEM_E820t_ACPI 3 -#define MEM_E820t_ACPI_NVS 4 -#define MEM_E820t_BAD_MEM 5 -#define MEM_E820t_PERM_MEM 7 - -class CMemE820 -{ - U8 *base; - I64 len; - U8 type, pad[3]; -}; - -#help_index "Compiler/Internal" -//Loader flags -#define LDF_NO_ABSS 1 -#define LDF_JUST_LOAD 2 -#define LDF_SILENT 4 - -#define ZXE_SIGNATURE_VAL 'ZXE' // Zeal Executable -class CZXE -{// $LK,"ZXE Header Generation",A="FF:::/Compiler/CMain.ZC,16 ALIGN"$ by compiler. - U16 jmp; - U8 module_align_bits, - reserved; - U32 signature; - I64 org, - patch_table_offset, //$LK,"Patch Table Generation",A="FF:::/Compiler/CMain.ZC,IET_ABS_ADDR"$ - file_size; -}; - -class CPatchTableAbsAddr -{ - U8 eit_abs_addr; //$LK,"IET_ABS_ADDR",A="MN:IET_ABS_ADDR"$ - U32 abs_address_count; - U8 zero; - U32 abs_address[1]; -}; - -//$LK,"CAOTImportExport",A="MN:CAOTImportExport"$ Types. Used in PatchTable. -#define IET_END 0 -//reserved -#define IET_REL_I0 2 //Fictitious -#define IET_IMM_U0 3 //Fictitious -#define IET_REL_I8 4 -#define IET_IMM_U8 5 -#define IET_REL_I16 6 -#define IET_IMM_U16 7 -#define IET_REL_I32 8 -#define IET_IMM_U32 9 -#define IET_REL_I64 10 -#define IET_IMM_I64 11 -#define IEF_IMM_NOT_REL 1 -//reserved -#define IET_REL32_EXPORT 16 -#define IET_IMM32_EXPORT 17 -#define IET_REL64_EXPORT 18 //Not implemented -#define IET_IMM64_EXPORT 19 //Not implemented -#define IET_ABS_ADDR 20 -#define IET_CODE_HEAP 21 //Not really used -#define IET_ZEROED_CODE_HEAP 22 //Not really used -#define IET_DATA_HEAP 23 -#define IET_ZEROED_DATA_HEAP 24 //Not really used -#define IET_MAIN 25 - -#help_index "Graphics/VBE" - -#define BLACK32 0x000000 -#define WHITE32 0xFFFFFF -#define VBE_MODES_NUM 32 - -class CVBEInfo -{ - U8 signature[4]; - U16 version; - U32 oem, - capabilities, - video_modes; - U16 total_memory, - software_revision; - U32 vendor, - product_name, - product_revision; - U8 reserved[222], - oem_data[256]; -}; -#assert sizeof(CVBEInfo) == 512 - -class CVBEMode -{ - U16 attributes, - pad[7], - pitch, - width, - height; - U8 pad[3], - bpp, - pad, - memory_model, - pad[12]; - U32 framebuffer; - U16 pad[9]; - U32 max_pixel_clock; - U8 reserved[190]; -}; -#assert sizeof(CVBEMode) == 256 - -class CVideoInfo -{ - U16 width; - U16 height; -}; - -#define ZEALBOOTER_LIMINE_SIGNATURE_1 0xaa23c08ed10bd4d7; // See $LK+PU,"CORE0_32BIT_INIT",A="FF:::/Kernel/KStart32.ZC,JMP @@"$ -#define ZEALBOOTER_LIMINE_SIGNATURE_2 0xf6ceba7d4b74179a; // - -#help_index "Boot" -class CKernel -{//Must match $LK,"OSStartUp",A="FF:::/Kernel/KStart16.ZC,MEM_BOOT_BASE"$ - CZXE h; - U32 jmp, - boot_src, - boot_blk, - boot_patch_table_base, - sys_run_level; - CDate compile_time; - - U0 start; - U32 boot_base; - U16 mem_E801[2]; - CMemE820 mem_E820[MEM_E820_ENTRIES_NUM]; - U64 mem_physical_space; - CSysLimitBase sys_gdt_ptr; - U16 sys_pci_buses; - ;$$ = ($$ + 15) & -16; - CGDT sys_gdt; - U64 sys_framebuffer_addr; - U64 sys_framebuffer_width; - U64 sys_framebuffer_height; - U64 sys_framebuffer_pitch; - U8 sys_framebuffer_bpp; - U64 sys_smbios_entry; - U64 sys_disk_uuid[2]; - U32 sys_boot_stack; - Bool sys_is_uefi_booted; - CVideoInfo sys_framebuffer_list[VBE_MODES_NUM]; -}; - -//Run-Levels -#define RLf_16BIT 0 -#define RLf_VESA 1 -#define RLf_32BIT 2 -#define RLf_PATCHED 3 -#define RLf_16MEG_SYS_CODE_BP 4 -#define RLf_64BIT 5 -#define RLf_16MEG_SYSTEM_HEAP_CTRL 6 -#define RLf_FULL_HEAPS 7 -#define RLf_RAW 8 -#define RLf_INTERRUPTS 9 -#define RLf_BLKDEV 10 -#define RLf_MP 11 -#define RLf_COMPILER 12 -#define RLf_DOC 13 -#define RLf_WINMGR 14 -#define RLf_REGISTRY 15 -#define RLf_HOME 16 -#define RLf_AUTOCOMPLETE 17 -#define RLf_SYSTEM_SERVER 18 -#define RLf_ONCE_SYSTEM 19 -#define RLf_ONCE_USER 20 - -#define RLF_16BIT (1 << RLf_16BIT) -#define RLF_VESA (1 << RLf_VESA) -#define RLF_32BIT (1 << RLf_32BIT) -#define RLF_PATCHED (1 << RLf_PATCHED) -#define RLF_16MEG_SYS_CODE_BP (1 << RLf_16MEG_SYS_CODE_BP) -#define RLF_64BIT (1 << RLf_64BIT) -#define RLF_16MEG_SYSTEM_HEAP_CTRL (1 << RLf_16MEG_SYSTEM_HEAP_CTRL) -#define RLF_FULL_HEAPS (1 << RLf_FULL_HEAPS) -#define RLF_RAW (1 << RLf_RAW) -#define RLF_INTERRUPTS (1 << RLf_INTERRUPTS) -#define RLF_BLKDEV (1 << RLf_BLKDEV) -#define RLF_MP (1 << RLf_MP) -#define RLF_COMPILER (1 << RLf_COMPILER) -#define RLF_DOC (1 << RLf_DOC) -#define RLF_WINMGR (1 << RLf_WINMGR) -#define RLF_REGISTRY (1 << RLf_REGISTRY) -#define RLF_HOME (1 << RLf_HOME) -#define RLF_AUTOCOMPLETE (1 << RLf_AUTOCOMPLETE) -#define RLF_SYSTEM_SERVER (1 << RLf_SYSTEM_SERVER) -#define RLF_ONCE_SYSTEM (1 << RLf_ONCE_SYSTEM) -#define RLF_ONCE_USER (1 << RLf_ONCE_USER) - -#help_index "Processor" - -//Model specific registers. -#define IA32F_SCE 0x001 -#define IA32F_LME 0x100 -#define IA32_LAPIC_BASE 0x01B -#define IA32_EFER 0xC0000080 -#define IA32_FS_BASE 0xC0000100 -#define IA32_GS_BASE 0xC0000101 - -//Programmable Interrupt Controller -#define PIC_1 0x20 -#define PIC_1_DATA 0x21 -#define PIC_2 0xA0 -#define PIC_2_DATA 0xA1 -#define PIC_INIT 0x11 -#define PIC_EOI 0x20 //End of interrupt - -//Local Advanced Programmable Interrupt Controller -#define LAPIC_BASE 0xFEE00000 -#define LAPIC_APIC_ID (LAPIC_BASE + 0x020) -#define LAPIC_APIC_VERSION (LAPIC_BASE + 0x030) -#define LAPIC_TASK_PRIORITY (LAPIC_BASE + 0x080) -#define LAPIC_ARBITRATION_PRIORITY (LAPIC_BASE + 0x090) -#define LAPIC_PROCESSOR_PRIORITY (LAPIC_BASE + 0x0A0) -#define LAPIC_EOI (LAPIC_BASE + 0x0B0) -#define LAPIC_LOG_DST (LAPIC_BASE + 0x0D0) -#define LAPIC_DFR (LAPIC_BASE + 0x0E0) -#define LAPIC_LDR (LAPIC_BASE + 0x0D0) - -#define LAPICF_APIC_ENABLED 0x100 -#define LAPIC_SVR (LAPIC_BASE + 0x0F0) - -#define LAPIC_ISR (LAPIC_BASE + 0x100) -#define LAPIC_TMR (LAPIC_BASE + 0x180) -#define LAPIC_IRR (LAPIC_BASE + 0x200) -#define LAPIC_ICR_LOW (LAPIC_BASE + 0x300) -#define LAPIC_ICR_HIGH (LAPIC_BASE + 0x310) - -#define LAPIC_LVT_TIMER (LAPIC_BASE + 0x320) -#define LAPIC_LVT_THERMAL (LAPIC_BASE + 0x330) -#define LAPIC_LVT_PERF (LAPIC_BASE + 0x340) -#define LAPIC_LVT_LINT0 (LAPIC_BASE + 0x350) -#define LAPIC_LVT_LINT1 (LAPIC_BASE + 0x360) -#define LAPIC_LVT_ERR (LAPIC_BASE + 0x370) - -#define MPN_VECT 0x97 -#define MP_VECT_ADDR (MPN_VECT * 0x1000) - -//I/O APIC Memory mapped window -#define IOAPIC_REG 0xFEC00000 //U8 -#define IOAPIC_DATA 0xFEC00010 //U32 -//I/O APIC Registers -#define IOAPICID 0x00 -#define IOAPICVER 0x01 -#define IOAPICARB 0x02 -#define IOREDTAB 0x10 - -class CAP16BitInit -{//AP Multicore - U32 jmp; - CSysLimitBase ap_gdt_ptr; -}; - -#help_index "Time/PIT" -#help_file "::/Doc/PIT.DD" -//Programmable Interval Timer -#define PIT_0 0x40 -#define PIT_2 0x42 -#define PIT_CMD 0x43 - -#define PIT_CMDF_OPMODE_RATE_GEN 0x04 -#define PIT_CMDF_OPMODE_SQUARE_WAVE 0x06 -#define PIT_CMDF_ACCESS_WORD 0x30 -#define PIT_CMDF_CHANNEL0 0x00 -#define PIT_CMDF_CHANNEL2 0x80 - -public class CCountsGlobals -{ - I64 jiffies, //$LK,"JIFFY_FREQ",A="MN:JIFFY_FREQ"$ - timer, //$LK,"SYS_TIMER_FREQ",A="MN:SYS_TIMER_FREQ"$. Use $LK,"SysTimerRead",A="MN:SysTimerRead"$(). - time_stamp_freq, - time_stamp_kHz_freq, - time_stamp_freq_initial; //Initial freq, sampled once at boot time. - Bool time_stamp_calibrated; -}; - -#define JIFFY_FREQ 1000 // Hz -#define CDATE_FREQ 49710 // Hz -#define SYS_TIMER_FREQ (18333 * 65536 / 1000) //Hz -#define SYS_TIMER0_PERIOD (65536 * 182 / 10 / JIFFY_FREQ) - -#help_index "Call" -//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 - -class CRAXRBXRCXRDX -{ - I64 rax, rbx, rcx, rdx; -}; - -//Asm callable function pointers. -//They work with $LK,"CallExtNum",A="MN:CallExtNum"$() when calling from ZealC. -#define EXT_WIN_TO_TOP 0 -#define EXT_WIN_FOCUS 1 -#define EXT_HEAPLOG_MALLOC 2 -#define EXT_HEAPLOG_FREE 3 -#define EXT_DEBUG_RESUME 4 -#define EXT_EXTS_NUM 5 - -#help_index "Processor" -#define DEFAULT_CACHE_LINE_WIDTH 128 - -//Semaphores -class CSema -{ - Bool val, pad[DEFAULT_CACHE_LINE_WIDTH - 1]; -}; -#define SEMA_DEBUG 0 -#define SEMA_RECORD_MACRO 1 -#define SEMA_SYS_TIMER 2 -#define SEMA_SYS_DATE 3 -#define SEMA_DEBUG_MODE 4 -#define SEMA_SOUND 5 -#define SEMA_HEAPLOG_ACTIVE 6 -#define SEMA_HEAPLOG_LOCK 7 -#define SEMA_REFRESH_IN_PROGRESS 8 -#define SEMA_FLUSH_VBE_IMAGE 9 -#define SEMA_SINGLE_USER 10 -#define SEMA_DISK_CACHE 11 -#define SEMA_FAR_CALL32 12 -#define SEMA_DEV_MEM 13 -#define SEMA_VGA 14 -#define SEMA_UPDATE_WIN_Z_BUF 15 -#define SEMA_TT 16 -#define SEMA_MUTE 17 -#define SEMA_JUST_PUMP_MESSAGES 18 -#define SEMA_TMBEAT 19 -#define SEMA_FIX 20 -#define SEMA_SEMAS_NUM 21 - -#define CTRL_ALT_DEL 0 -#define CTRL_ALT_C 1 -#define CTRL_ALT_X 2 -#define CTRL_ALT_TAB 3 - -#help_index "Hash" -public class CHash -{//See $LK,"Hash",A="HI:Hash"$ - CHash *next; - U8 *str; - U32 type, - use_count; // inc'ed every time search found, never dec'ed. -}; - -public class CHashTable -{ - CHashTable *next; - I64 mask, locked_flags; - CHash **body; -}; - -#help_index "Hash/System" -//Hash table types: $LK,"ST_HTT_TYPES",A="FF:::/Kernel/KDefine.ZC,ST_HTT_TYPES"$ -#define HTt_EXPORT_SYS_SYM 0 -#define HTt_IMPORT_SYS_SYM 1 -#define HTt_DEFINE_STR 2 -#define HTt_GLOBAL_VAR 3 -#define HTt_CLASS 4 -#define HTt_INTERNAL_TYPE 5 -#define HTt_FUN 6 -#define HTt_WORD 7 -#define HTt_DICT_WORD 8 -#define HTt_KEYWORD 9 -#define HTt_ASM_KEYWORD 10 -#define HTt_OPCODE 11 -#define HTt_REG 12 -#define HTt_FILE 13 -#define HTt_MODULE 14 -#define HTt_HELP_FILE 15 -#define HTt_FRAME_PTR 16 -#define HTt_TYPES_NUM 17 - -#define HTf_PRIVATE 23 -#define HTf_PUBLIC 24 -#define HTf_EXPORT 25 -#define HTf_IMPORT 26 -#define HTf_IMM 27 -#define HTf_GOTO_LABEL 28 -#define HTf_RESOLVED 29 -#define HTf_UNRESOLVED 30 -#define HTf_LOCAL 31 - -#define HTT_INVALID 0 -#define HTT_EXPORT_SYS_SYM 0x00001 //CHashExport -#define HTT_IMPORT_SYS_SYM 0x00002 //CHashImport -#define HTT_DEFINE_STR 0x00004 //CHashDefineStr -#define HTT_GLOBAL_VAR 0x00008 //CHashGlobalVar -#define HTT_CLASS 0x00010 //CHashClass -#define HTT_INTERNAL_TYPE 0x00020 //CHashClass -#define HTT_FUN 0x00040 //CHashFun -#define HTT_WORD 0x00080 //CHashAC only in AutoComplete table -#define HTT_DICT_WORD 0x00100 //CHashGeneric only in AutoComplete tbl -#define HTT_KEYWORD 0x00200 //CHashGeneric $LK,"KEYWORD",A="FF:::/Compiler/OpCodes.DD,KEYWORD"$ -#define HTT_ASM_KEYWORD 0x00400 //CHashGeneric $LK,"ASM_KEYWORD",A="FF:::/Compiler/OpCodes.DD,ASM_KEYWORD"$ -#define HTT_OPCODE 0x00800 //CHashOpcode -#define HTT_REG 0x01000 //CHashReg -#define HTT_FILE 0x02000 //CHashGeneric -#define HTT_MODULE 0x04000 //CHashGeneric -#define HTT_HELP_FILE 0x08000 //CHashSrcSym -#define HTT_FRAME_PTR 0x10000 //CHashGeneric -#define HTG_TYPE_MASK 0x1FFFF - -#define HTF_PRIVATE 0x00800000 -#define HTF_PUBLIC 0x01000000 -#define HTF_EXPORT 0x02000000 -#define HTF_IMPORT 0x04000000 -#define HTF_IMM 0x08000000 -#define HTF_GOTO_LABEL 0x10000000 -#define HTF_RESOLVE 0x20000000 -#define HTF_UNRESOLVED 0x40000000 -#define HTF_LOCAL 0x80000000 -#define HTG_FLAGS_MASK 0xFF000000 - -#define HTG_SRC_SYM (HTT_DEFINE_STR | HTT_GLOBAL_VAR | HTT_FUN | HTT_CLASS | HTT_EXPORT_SYS_SYM | HTT_HELP_FILE) -#define HTG_ALL -1 - -#define KERNEL_MODULE_NAME "/Kernel/Kernel" - -class CDebugInfo -{ - U32 min_line, max_line; - U32 body[1]; //Code heap is 32-bit value -}; - -public class CHashSrcSym:CHash -{ - U8 *src_link, - *idx; - CDebugInfo *debug_info; - U8 *import_name; - CAOTImportExport *ie_list; -}; - -public class CHashGeneric:CHash -{ - I64 user_data0, user_data1, user_data2; -}; - -#define REGT_NONE 0 -#define REGT_R8 1 -#define REGT_R16 2 -#define REGT_R32 3 -#define REGT_R64 4 -#define REGT_SEG 5 -#define REGT_FSTACK 6 -#define REGT_MM 7 -#define REGT_XMM 8 - -public class CHashReg:CHash -{ - U8 reg_num, reg_type; -}; - -public class CHashAC:CHash -{ - I32 num; - U32 hits; -}; - -public class CHashExport:CHashSrcSym -{ - I64 val; -}; - -public class CHashImport:CHashSrcSym -{ - U8 *module_base, - *module_header_entry; -}; - -#help_index "Compiler/Internal" -#define PTR_STARS_NUM 3 - -//Member List Flags -#define MLF_DEFAULT_AVAILABLE 1 -#define MLF_LASTCLASS 2 -#define MLF_STR_DEFAULT_AVAILABLE 4 -#define MLF_FUN 8 -#define MLF_DOT_DOT_DOT 16 -#define MLF_NO_UNUSED_WARN 32 -#define MLF_STATIC 64 - -public class CArrayDim -{ - CArrayDim *next; - I64 count, total_count; -}; - -#define MLMF_IS_STR 1 -public class CMemberListMeta -{ - CMemberListMeta *next; - U8 *str; - I64 flags, - user_data; -}; - -public class CMemberList -{ - CMemberList *next, *left, *right, - *left_class_base, *right_class_base; //For finding duplicate class local variables. - U8 *str; - CHashClass *member_class, *member_class_base; - CMemberListMeta *meta; - U32 use_count; - U16 flags; - I8 reg, pad; - I64 offset, size; - CArrayDim dim; - U8 *static_data; - union - { - I64 static_data_rip; - I64 default_val; - } - CHashFun *fun_ptr; -}; - -class CExternUsage -{ - CExternUsage *next; - I64 rip; -}; - -#help_index "Hash/System;Compiler/Internal" -public class CHashDefineStr:CHashSrcSym -{ - U8 *data, **sub_idx; - I64 count; -}; - -#define Cf_EXTERN 0 -#define Cf_INTERNAL_TYPE 1 - -public class CHashClass:CHashSrcSym -{//See $LK,"ParseClassNew",A="MN:ParseClassNew"$(). base_class of $LK,"CHashFun",A="MN:CHashFun"$ - I64 size, neg_offset; - U32 member_count; - U8 ptr_stars_count, raw_type; - U16 flags; - CMemberList *member_list_and_root, //Head of linked list and head of tree. - *member_class_base_root, //For finding duplicate class local variables. - *last_in_member_list; - CHashClass *base_class, - *fwd_class; -}; - -//Function flags -#define Ff_INTERRUPT 8 -#define Ff_HASERRCODE 9 -#define Ff_ARGPOP 10 -#define Ff_NOARGPOP 11 -#define Ff_INTERNAL 12 -#define Ff__EXTERN 13 -#define Ff_DOT_DOT_DOT 14 -#define Ff_RET1 15 - -public class CHashFun:CHashClass -{//See $LK,"ParseFunNew",A="MN:ParseFunNew"$(). - CHashClass *return_class; - U32 arg_count, pad, - used_reg_mask, clobbered_reg_mask; - U8 *exe_addr; - CExternUsage *ext_list; -}; - -//Global Var Flags -#define GVF_FUN 1 -#define GVF_IMPORT 2 -#define GVF_EXTERN 4 -#define GVF_DATA_HEAP 8 -#define GVF_ALIAS 16 -#define GVF_ARRAY 32 - -public class CHashGlobalVar:CHashSrcSym -{ - I64 size, flags; - CHashClass *var_class; - CHashFun *fun_ptr; - CArrayDim dim; - U8 *data_addr; - union - { - I64 data_addr_rip; - CAOTHeapGlobal *heap_global; - } -}; -#assert offset(CHashClass.size) == offset(CHashGlobalVar.size) - -#help_index "DolDoc" -//See $LK,"TextBase Layer",A="HI:TextBase Layer"$. -#define ATTRF_BLINK 0x10000000 -#define ATTRF_INVERT 0x20000000 -#define ATTRF_SEL 0x40000000 -#define ATTRF_UNDERLINE 0x80000000 - -#define ATTRf_BLINK 28 -#define ATTRf_INVERT 29 -#define ATTRf_SEL 30 -#define ATTRf_UNDERLINE 31 - -//CDocEntry.type codes (Low 8 bits) -#define DOCT_TEXT 0 -#define DOCT_NEW_LINE 1 -#define DOCT_SOFT_NEW_LINE 2 -#define DOCT_TAB 3 -#define DOCT_PAGE_BREAK 4 -#define DOCT_CURSOR 5 -#define DOCT_MARKER 6 -#define DOCT_PROMPT 7 -#define DOCT_CLEAR 8 -#define DOCT_PAGE_LEN 9 -#define DOCT_LEFT_MARGIN 10 -#define DOCT_RIGHT_MARGIN 11 -#define DOCT_HEADER 12 -#define DOCT_FOOTER 13 -#define DOCT_INDENT 14 -#define DOCT_FOREGROUND 15 -#define DOCT_BACKGROUND 16 -#define DOCT_DEFAULT_FOREGROUND 17 -#define DOCT_DEFAULT_BACKGROUND 18 -#define DOCT_WORD_WRAP 19 -#define DOCT_HIGHLIGHT 20 -#define DOCT_BLINK 21 -#define DOCT_INVERT 22 -#define DOCT_UNDERLINE 23 -#define DOCT_SHIFTED_X 24 -#define DOCT_SHIFTED_Y 25 -#define DOCT_CURSOR_MOVEMENT 26 -#define DOCT_ANCHOR 27 -#define DOCT_LINK 28 -#define DOCT_BTTN 29 -#define DOCT_DATA 30 -#define DOCT_CHECK_BOX 31 -#define DOCT_LIST 32 -#define DOCT_MACRO 33 -#define DOCT_MENU_VAL 34 -#define DOCT_HEX_ED 35 -#define DOCT_TREE 36 -#define DOCT_SPRITE 37 -#define DOCT_INS_BIN 38 -#define DOCT_INS_BIN_SIZE 39 -#define DOCT_SONG 40 -#define DOCT_HTML_CODE 41 -#define DOCT_ERROR 42 - -#define DOCT_TYPES_NUM 43 - -//CDocEntry.type flags upper bits -#define DOCET_BLINK ATTRF_BLINK -#define DOCET_INVERT ATTRF_INVERT -#define DOCET_SEL ATTRF_SEL -#define DOCET_UNDERLINE ATTRF_UNDERLINE -#define DOCG_BL_IV_UL 0xB0000000 - -#define DOCEt_BLINK ATTRf_BLINK -#define DOCEt_INVERT ATTRf_INVERT -#define DOCEt_SEL ATTRf_SEL -#define DOCEt_UNDERLINE ATTRf_UNDERLINE - -#define DOCG_DBL_BUF_FLAGS (DOCF_OVERSTRIKE | DOCF_PLAIN_TEXT | DOCF_PLAIN_TEXT_TABS | DOCF_SIZE_MIN | DOCF_NO_CURSOR | \ - DOCF_FORM | DOCF_DBL_DOLLARS | DOCF_DONT_SWAP_OUT | DOCF_DO_FULL_REFRESH | DOCF_BORDER_DOC | \ - DOCF_HIDE_CURSOR | DOCF_DONT_HIGHLIGHT_CURSOR | DOCF_CARRIAGE_RETURN) - -//CDocEntry.de_flags. These first 16 are arg= -#define DOCEF_TAG 1 -#define DOCEF_LEN 2 -#define DOCEF_AUX_STR 4 -#define DOCEF_DEFINE 8 -#define DOCEF_HTML_LINK 0x10 -#define DOCEF_LEFT_EXP 0x20 -#define DOCEF_LEFT_MACRO 0x40 -#define DOCEF_RIGHT_EXP 0x80 -#define DOCEF_RIGHT_MACRO 0x100 -#define DOCEF_HAS_BIN 0x200 -#define DOCEF_BIN_PTR_LINK 0x400 -#define DOCEF_RAW_TYPE 0x800 -#define DOCEF_SHIFTED_X 0x1000 -#define DOCEF_SHIFTED_Y 0x2000 -#define DOCEF_SCROLLING_X 0x4000 -#define DOCEF_USER_DATA 0x8000 - -//CDocEntry.de_flags. These are +/- flags -#define DOCEF_LEFT_CB 0x10000 -#define DOCEF_LEFT_IN_STR 0x20000 -#define DOCEF_RIGHT_CB 0x40000 -#define DOCEF_RIGHT_IN_STR 0x80000 -#define DOCEF_LEFT_X 0x100000 -#define DOCEF_CENTER_X 0x200000 -#define DOCEF_RIGHT_X 0x400000 -#define DOCEF_TOP_Y 0x800000 -#define DOCEF_CENTER_Y 0x1000000 -#define DOCEF_BOTTOM_Y 0x2000000 -//HL...UL -#define DOCEF_TAG_CB 0x100000000 -#define DOCEF_PAGE_REL_Y 0x200000000 -#define DOCEF_MARGIN_REL_X 0x400000000 -#define DOCEF_WIN_REL 0x800000000 -#define DOCEF_LINK 0x1000000000 -#define DOCEF_ESC 0x2000000000 //Send (Exit and Save) -#define DOCEF_QUIT 0x4000000000 //Send (Abort) -#define DOCEF_FROM_START 0x8000000000 -#define DOCEF_HAS_BORDER 0x10000000000 -#define DOCEF_SOLID_BORDER 0x20000000000 -#define DOCEF_BORDER_PLOT 0x40000000000 -#define DOCEF_CHECKED_COLLAPSED 0x80000000000 //Checked or Collapsed -#define DOCEF_CHECK_COLLAPSABLE 0x100000000000 -#define DOCEF_REFRESH_DATA 0x200000000000 -#define DOCEF_UPDATE_DATA 0x400000000000 -//$LK,"DOCEF_DEREF_DATA",A="MN:DOCEF_DEREF_DATA"$ is confusing. $LK,"DocForm",A="MN:DocForm"$() makes doc_e->data point to members -//of class. For ints, it derefs doc_e->data as a ptr. For strings, it doesn't. -#define DOCEF_DEREF_DATA 0x800000000000 -#define DOCEF_REMALLOC_DATA 0x1000000000000 -#define DOCEF_HAS_TERMINATOR 0x2000000000000 -#define DOCEF_ZERO_BASED 0x4000000000000 -#define DOCEF_HOLD 0x8000000000000 -#define DOCEF_TREE 0x10000000000000 -#define DOCEF_LIST 0x20000000000000 -#define DOCEF_SKIP 0x40000000000000 -#define DOCEF_POPUP 0x80000000000000 -#define DOCEF_SKIP_IN_FORM 0x100000000000000 -#define DOCEF_FILTER_SKIP 0x200000000000000 -#define DOCEF_NO_CLICK_ON 0x400000000000000 -#define DOCEF_DONT_DRAW 0x800000000000000 //only works on sprites -#define DOCEF_DEFAULT_LEN 0x1000000000000000 -#define DOCEF_DEFAULT_RAW_TYPE 0x2000000000000000 - -#define DOCEG_HAS_ALLOC (DOCEF_TAG | DOCEF_AUX_STR | DOCEF_DEFINE | DOCEF_HTML_LINK | \ - DOCEF_LEFT_MACRO | DOCEF_RIGHT_MACRO | DOCEF_BIN_PTR_LINK | DOCEF_REMALLOC_DATA) - -#define DOCEG_HAS_ARG ((DOCEG_HAS_ALLOC & ~DOCEF_REMALLOC_DATA) | \ - DOCEF_LEN | DOCEF_LEFT_EXP | DOCEF_RIGHT_EXP | DOCEF_HAS_BIN | DOCEF_RAW_TYPE | \ - DOCEF_SHIFTED_X | DOCEF_SHIFTED_Y | DOCEF_SCROLLING_X | DOCEF_USER_DATA) - -#define DOCEG_DONT_EDIT (DOCEF_DEFINE | DOCEF_HTML_LINK | DOCEF_AUX_STR | DOCEF_BIN_PTR_LINK | \ - DOCEF_SCROLLING_X | DOCEF_TAG_CB) - -//These are ident to Doc flags -#define DOCEF_HIGHLIGHT 0x4000000 -#define DOCEF_WORD_WRAP 0x8000000 -#define DOCEF_BLINK ATTRF_BLINK -#define DOCEF_INVERT ATTRF_INVERT -#define DOCEF_SEL ATTRF_SEL -#define DOCEF_UNDERLINE ATTRF_UNDERLINE -#define DOCEf_HIGHLIGHT 26 -#define DOCEf_WORD_WRAP 27 -#define DOCEf_BLINK ATTRf_BLINK -#define DOCEf_INVERT ATTRf_INVERT -#define DOCEf_SEL ATTRf_SEL -#define DOCEf_UNDERLINE ATTRf_UNDERLINE - -//CDocEntry.de_flags. These first 16 are arg= -#define DOCEf_TAG 0 -#define DOCEf_LEN 1 -#define DOCEf_AUX_STR 2 -#define DOCEf_DEFINE 3 -#define DOCEf_HTML_LINK 4 -#define DOCEf_LEFT_EXP 5 -#define DOCEf_LEFT_MACRO 6 -#define DOCEf_RIGHT_EXP 7 -#define DOCEf_RIGHT_MACRO 8 -#define DOCEf_HAS_BIN 9 -#define DOCEf_BIN_PTR_LINK 10 -#define DOCEf_RAW_TYPE 11 -#define DOCEf_SHIFTED_X 12 -#define DOCEf_SHIFTED_Y 13 -#define DOCEf_SCROLLING_X 14 -#define DOCEf_USER_DATA 15 - -//CDocEntry.de_flags. These are +/- flags -#define DOCEf_LEFT_CB 16 -#define DOCEf_LEFT_IN_STR 17 -#define DOCEf_RIGHT_CB 18 -#define DOCEf_RIGHT_IN_STR 19 -#define DOCEf_LEFT_X 20 -#define DOCEf_CENTER_X 21 -#define DOCEf_RIGHT_X 22 -#define DOCEf_TOP_Y 23 -#define DOCEf_CENTER_Y 24 -#define DOCEf_BOTTOM_Y 25 -//HL...UL -#define DOCEf_TAG_CB 32 -#define DOCEf_PAGE_REL_Y 33 -#define DOCEf_MARGIN_REL_X 34 -#define DOCEf_WIN_REL 35 -#define DOCEf_LINK 36 -#define DOCEf_ESC 37 //Send (Exit and Save) -#define DOCEf_QUIT 38 //Send (Abort) -#define DOCEf_FROM_START 39 -#define DOCEf_HAS_BORDER 40 -#define DOCEf_SOLID_BORDER 41 -#define DOCEf_BORDER_PLOT 42 -#define DOCEf_CHECKED_COLLAPSED 43 //Checked or Collapsed -#define DOCEf_CHECK_COLLAPSABLE 44 -#define DOCEf_REFRESH_DATA 45 -#define DOCEf_UPDATE_DATA 46 -#define DOCEf_DEREF_DATA 47 -#define DOCEf_REMALLOC_DATA 48 -#define DOCEf_HAS_TERMINATOR 49 -#define DOCEf_ZERO_BASED 50 -#define DOCEf_HOLD 51 -#define DOCEf_TREE 52 -#define DOCEf_LIST 53 -#define DOCEf_SKIP 54 -#define DOCEf_POPUP 55 -#define DOCEf_SKIP_IN_FORM 56 -#define DOCEf_FILTER_SKIP 57 -#define DOCEf_NO_CLICK_ON 58 -#define DOCEf_DONT_DRAW 59 //only works on sprites -#define DOCEf_DEFAULT_LEN 60 -#define DOCEf_DEFAULT_RAW_TYPE 61 -#define DOCEf_FLAGS_NUM 62 - -public class CDocBin -{ - CDocBin *next, *last; - I32 tmp_use_count, renum_num; - U8 *tag; - U0 start; - U32 num, flags, size, use_count; - U0 end; - U8 *data; -#assert !($$ & 7) -}; - -#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 DOC_ATTR_DEFAULT_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_PROMPT GREEN -#define DOC_COLOR_COMMENT GREEN -#define DOC_COLOR_BIN LTGREEN -#define DOC_COLOR_STR BROWN -#define DOC_COLOR_CHAR_CONST BROWN -#define DOC_COLOR_EXPORT_SYS_SYM LTPURPLE -#define DOC_COLOR_DEFINE_STR CYAN -#define DOC_COLOR_GLOBAL_VAR LTCYAN -#define DOC_COLOR_CLASS LTBLUE -#define DOC_COLOR_FUN PURPLE -#define DOC_COLOR_KEYWORD BLUE -#define DOC_COLOR_REG LTRED -#define DOC_COLOR_NUMBER YELLOW - -public class CDocSettings -{ - U32 final_u32_attr; - I16 left_margin, right_margin, indent; - U16 page_len, header, footer; - I8 shifted_x, shifted_y; - U8 state, comment_depth, paren_depth, brace_depth, cur_text_attr, default_text_attr; -}; - -#define DOC_DEFAULT I32_MIN - -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 de_flags; - I32 x, y; - U32 min_col, max_col; - CDocSettings settings; - I64 user_data; -#assert !($$&7) -}; - -#define DOCE_LEN_DEFAULT 64 - -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, - *aux_str, - *bin_ptr_link, - *html_link, - *my_format_data; - I64 hex_ed_width; - I32 scroll_len, - len, //$LK,"DOCE_LEN_DEFAULT",A="MN:DOCE_LEN_DEFAULT"$ - bin_num; - U8 raw_type, pad[3]; - CDocBin *bin_data; - U8 *data; -#assert !($$ & 7) -}; - -//$LK,"DocForm",A="MN:DocForm"$() $LK,"DocMenu",A="MN:DocMenu"$() $LK,"DocEd",A="MN:DocEd"$() $LK,"PopUpMenu",A="MN:PopUpMenu"$() -#define DOF_SIZE_MIN 0x01 -#define DOF_INTERCEPT_TASK_END 0x02 -#define DOF_DONT_HOME 0x04 -#define DOF_WIN_MAX 0x08 -#define DOF_DONT_TEXT_ATTR 0x10 -#define DOF_DONT_WINMGR_SYNC 0x20 -#define DOF_DONT_SHOW 0x40 -//Combines with $LK,"Editor Flags",A="MN:EDF_BAIL"$ - -class CEdFindText -{ - U8 find_text[STR_LEN] format "$$DA-P,A=\"Find :%s\"$$\n", - replace_text[STR_LEN] format "$$DA-P,A=\"Replace :%s\"$$\n"; - Bool replace format "$$CB,\"Replace\"$$\n", - scan_fwd format "$$CB,\"Fwd\"$$\n", - scan_sel_text format "$$CB,\"Selection\"$$\n", - match_case format "$$CB,\"Match Case\"$$\n", - whole_labels format "$$CB,\"Whole Labels\"$$\n", - local_var format "$$CB,\"Rename Local Var\"$$\n", - prompt, pad; - I64 filter_lines format "$$DA,A=\"Filter Lines:%d\"$$\n"; -}; - -class CEdFileName -{ - CDirContext *dirc; - U8 name[256] format "$$DA-P,LEN=255,A=\"FileName:%s\"$$"; -}; - -//$LK,"Ed",A="MN:Ed"$() -#define EDF_BAIL 0x100 -#define EDF_COLLAPSE 0x200 -#define EDF_UNCOLLAPSE 0x400 -#define EDF_WAS_WRITE 0x800 //Was exit ESC or SHIFT_ESC? -//Combines with $LK,"Document Flags",A="MN:DOF_SIZE_MIN"$ - -#define EDf_BAIL 8 -#define EDf_COLLAPSE 9 -#define EDf_UNCOLLAPSE 10 -#define EDf_WAS_WRITE 11 - -// DOC header flags -#define DOCF_PLAIN_TEXT 0x1 -#define DOCF_PLAIN_TEXT_TABS 0x2 //has '\t', not DOCT_TAB -#define DOCF_AUTO_SAVE 0x4 -#define DOCF_NO_CURSOR 0x8 -#define DOCF_CARRIAGE_RETURN 0x10 -#define DOCF_DBL_DOLLARS 0x20 -#define DOCF_COLOR_NAMES 0x40 -//Reserved x1 -#define DOCF_BORDER_DOC 0x100 -#define DOCF_FORM 0x200 -#define DOCF_SIZE_MIN 0x400 -#define DOCF_HIDE_CURSOR 0x800 //use $LK,"DocCursor",A="MN:DocCursor"$ -#define DOCF_DONT_HIGHLIGHT_CURSOR 0x1000 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$ -#define DOCF_NO_SCROLL_BARS 0x2000 //use $LK,"DocScroll",A="MN:DocScroll"$ -#define DOCF_ALLOW_UNDO 0x4000 -#define DOCF_DONT_SHOW 0x8000 -#define DOCF_HAS_SONG 0x10000 -#define DOCF_MORE 0x20000 -#define DOCF_BWD_MOVEMENT 0x40000 -#define DOCF_NULL_GRAB_SCROLL 0x80000 -#define DOCF_DONT_SWAP_OUT 0x100000 -#define DOCF_DO_FULL_REFRESH 0x200000 -#define DOCF_BREAK_UNLOCKED 0x400000 -//Reserved x1 -#define DOCF_HIGHLIGHT DOCEF_HIGHLIGHT -#define DOCF_WORD_WRAP DOCEF_WORD_WRAP -#define DOCF_BLINK DOCEF_BLINK -#define DOCF_INVERT DOCEF_INVERT -#define DOCF_SEL DOCEF_SEL -#define DOCF_UNDERLINE DOCEF_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_TABS 1 //has '\t', not DOCT_TAB -#define DOCf_AUTO_SAVE 2 -#define DOCf_NO_CURSOR 3 -#define DOCf_CARRIAGE_RETURN 4 -#define DOCf_DBL_DOLLARS 5 -#define DOCf_COLOR_NAMES 6 -//Reserved x1 -#define DOCf_BORDER_DOC 8 -#define DOCf_FORM 9 -#define DOCf_SIZE_MIN 10 -#define DOCf_HIDE_CURSOR 11 //use $LK,"DocCursor",A="MN:DocCursor"$ -#define DOCf_DONT_HIGHLIGHT_CURSOR 12 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$ -#define DOCf_NO_SCROLL_BARS 13 //use $LK,"DocScroll",A="MN:DocScroll"$ -#define DOCf_ALLOW_UNDO 14 -#define DOCf_DONT_SHOW 15 -#define DOCf_HAS_SONG 16 -#define DOCf_MORE 17 -#define DOCf_BWD_MOVEMENT 18 -#define DOCf_NULL_GRAB_SCROLL 19 -#define DOCf_DONT_SWAP_OUT 20 -#define DOCf_DO_FULL_REFRESH 21 -#define DOCf_BREAK_UNLOCKED 22 -//Reserved x1 - -#define DOCf_HIGHLIGHT DOCEf_HIGHLIGHT -#define DOCf_WORD_WRAP DOCEf_WORD_WRAP -#define DOCf_BLINK DOCEf_BLINK -#define DOCf_INVERT DOCEf_INVERT -#define DOCf_SEL DOCEf_SEL -#define DOCf_UNDERLINE DOCEf_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, doc_flags, time_stamp; - U8 *body; -}; - -//See $LK,"DocMenu",A="MN:DocMenu"$() -#define DOCM_CANCEL (-1) - -#define DOC_SIGNATURE_VAL 'DocS' - -#define RECALCt_NORMAL 0x00 -#define RECALCt_FIND_CURSOR 0x01 -#define RECALCt_TO_SCREEN 0x02 -#define RECALCG_MASK 0xFF - -#define RECALCF_HAS_CURSOR 0x100 -#define RECALCF_ADD_CURSOR 0x200 -#define RECALCF_TO_HTML 0x400 - -public class CDoc //Linked Text File header -{//See $LK,"Doc",A="HI:Doc"$ for documentation. - CDocEntryBase head; - I64 flags, locked_flags; - CDocEntry *cur_entry, *old_cur_entry; - I32 cur_col, old_cur_col, line_start_col, top_line_num, dollar_buf_size, dollar_buf_ptr; - U8 *dollar_buf; //When entering $$ cmds, it buffers them until the end $$. - - CTask *win_task, *mem_task, *owning_task; - I32 page_line_num, undo_count, - x, y, min_x, max_x, min_y, max_y; - I64 line, col, best_d, - old_win_top, old_win_bottom, old_win_left, old_win_right, - cmd_U8; - U32 doc_signature, cur_bin_num; - I64 max_entries, updates_count; - CEdFindText *find_replace; - - CEdFileName filename; - I64 file_attr; - I64 (*left_click_link)(CDoc *doc, CDocEntry *doc_e); - I64 (*right_click_link)(CDoc *doc, CDocEntry *doc_e); - - //See $LK,"::/Apps/Psalmody/JukeBox.ZC"$ - U8 *user_put_data; //Passed to user_put_key() and user_put_s() - 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; //(When browsing deeper, opening deeper docs.) - U64 desc; //8 characters. See $LK,"DocBorderListDraw",A="MN:DocBorderListDraw"$(). - - CDocBin bin_head; - CDocSettings settings_head; - CDocUndo undo_head; - - I64 user_data; -#assert !($$&7) -}; - -#help_index "Windows" -/* -Fs->win_inhibit mask - -Some inhibit actions on the task itself. -Some inhibit actions if the focus task -tries to do something. -*/ -#define WIF_SELF_FOCUS 0x0001 //If active this task cannot have focus -//MENU 0x0002 -#define WIF_SELF_CTRLS 0x0004 -#define WIF_SELF_MS_L 0x0008 -//MS_L_D 0x0010 -#define WIF_SELF_MS_R 0x0020 -//MS_R_D 0x0040 -#define WIF_SELF_MS_WHEEL 0x0080 //Does nothing, yet -#define WIF_SELF_BORDER 0x0100 -#define WIF_SELF_GRAB_SCROLL 0x0200 -#define WIF_SELF_DOC 0x0400 -#define WIF_SELF_ODE 0x0800 -#define WIF_SELF_KEY_DESC 0x1000 -//FOCUS 0x00010000 -#define WIF_FOCUS_TASK_MENU 0x00020000 -#define WIF_FOCUS_TASK_CTRLS 0x00040000 -#define WIF_FOCUS_TASK_MS_L 0x00080000 -#define WIF_FOCUS_TASK_MS_L_D 0x00100000 -#define WIF_FOCUS_TASK_MS_R 0x00200000 -#define WIF_FOCUS_TASK_MS_R_D 0x00400000 -#define WIF_FOCUS_TASK_MS_WHEEL 0x00800000 //Does nothing, yet -#define WIF_FOCUS_TASK_BORDER 0x01000000 -#define WIF_FOCUS_TASK_GRAB_SCROLL 0x02000000 - -#define WIG_DBL_CLICK (WIF_FOCUS_TASK_MS_L_D | WIF_FOCUS_TASK_MS_R_D) -#define WIG_TASK_DEFAULT (WIF_FOCUS_TASK_MENU | WIG_DBL_CLICK | 0xFFFF - WIF_SELF_DOC - WIF_SELF_ODE) -#define WIG_NO_FOCUS_TASK_DEFAULT (WIG_TASK_DEFAULT - WIF_SELF_BORDER - WIF_SELF_MS_L - WIF_SELF_MS_R - WIG_DBL_CLICK) -#define WIG_USER_TASK_DEFAULT WIF_SELF_KEY_DESC - -#define WIf_SELF_FOCUS 0 -#define WIf_SELF_CTRLS 2 -#define WIf_SELF_MS_L 3 -#define WIf_SELF_MS_R 5 -#define WIf_SELF_MS_WHEEL 7 -#define WIf_SELF_BORDER 8 -#define WIf_SELF_GRAB_SCROLL 9 -#define WIf_SELF_DOC 10 -#define WIf_SELF_ODE 11 -#define WIf_SELF_KEY_DESC 12 -#define WIf_FOCUS_TASK_MENU 17 -#define WIf_FOCUS_TASK_CTRLS 18 -#define WIf_FOCUS_TASK_MS_L 19 -#define WIf_FOCUS_TASK_MS_L_D 20 -#define WIf_FOCUS_TASK_MS_R 21 -#define WIf_FOCUS_TASK_MS_R_D 22 -#define WIf_FOCUS_TASK_MS_WHEEL 23 -#define WIf_FOCUS_TASK_BORDER 24 -#define WIf_FOCUS_TASK_GRAB_SCROLL 25 -#define WIf_FLAGS_NUM 26 - -class CWinMgrTimingGlobals -{ - I64 last_total_jiffies, - last_idle_pt_hits[MP_PROCESSORS_NUM], - last_swap_counter[MP_PROCESSORS_NUM]; - F64 last_calc_idle_time, calc_idle_delta_time; - I64 calc_idle_count; -}; - -#define WINMGR_FPS (60000.0 / 1001) -#define WINMGR_PERIOD (1001 / 60000.0) - -public class CWinMgrGlobals -{ - I64 updates; - F64 ode_time, - last_ode_time, - fps, //You can read but not write this. You have no control. - ideal_refresh_tS, - last_refresh_tS; - CWinMgrTimingGlobals *t; - Bool show_menu, grab_scroll, grab_scroll_closed; -}; - -#help_index "AutoComplete" -#define ACf_INIT_IN_PROGRESS 0 -#define ACf_LAST_WAS_KEYMAP 1 - -#define AC_FILLINS_NUM 12 -public class CAutoCompleteGlobals -{ - I64 col, row, old_col, old_row, num_words; - CHashTable *hash_table; - U8 *cur_word; - I64 flags; - CTask *task; - I64 partial_len, num_fillins, - fillin_hits [AC_FILLINS_NUM + 1]; - CHashAC *fillin_matches[AC_FILLINS_NUM + 1]; -}; - -#help_index "AutoComplete/Dictionary" -#define ACD_WORD_FILENAME "/System/AutoComplete/ACWords.DATA" -#define ACD_DEF_FILENAME "/System/AutoComplete/ACDefs.DATA" - -#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_FILLINS_NUM 10 -public class CAutoCompleteDictGlobals -{ - U8 *word_list; - I64 word_list_size, num_words, num_fillins; - U8 *fillins[ACD_FILLINS_NUM]; - Bool has_words, has_defs; -}; - -#help_index "Compiler/Directive" -//Compiler $LK,"Option",A="MN:Option"$()s -//You might need to do #exe {Option();} -//Note: The #exe statement is lexed-ahead, -//so it takes effect earlier than you might expect. -#define OPTf_ECHO 0 -#define OPTf_TRACE 1 -#define OPTf_WARN_UNUSED_VAR 2 //Applied to functions, not statements -#define OPTf_WARN_PAREN 3 //Warn unnecessary parens -#define OPTf_WARN_DUP_TYPES 4 //Warn duplicate local variable type statements -#define OPTf_WARN_HEADER_MISMATCH 5 -#define OPTf_EXTERNS_TO_IMPORTS 6 -#define OPTf_KEEP_PRIVATE 7 -#define OPTf_NO_REG_VAR 8 //Applied to functions, not statements -#define OPTf_GLOBALS_ON_DATA_HEAP 9 -//Disable 10-byte float consts for ã,log2_10,log10_2,loge_2 -#define OPTf_NO_BUILTIN_CONST 10 //Applied to functions, not statements -#define OPTf_USE_IMM64 11 //Not completely implemented -#define OPTf_DECIMAL_ONLY 12 //Only allow decimal numbers (no 0x or 0b prefixed numbers) -#define OPTf_NO_FLOATS 13 //No floating point numbers allowed - -#define OPTF_ECHO (1 << OPTf_ECHO) - -#help_index "Compiler/Intermediate Code" -//See $LK,"ST_RAW_TYPES",A="MN:ST_RAW_TYPES"$ -#define RT_I0 2 -#define RT_U0 3 -#define RT_I8 4 -#define RT_U8 5 -#define RT_I16 6 -#define RT_U16 7 -#define RT_I32 8 -#define RT_U32 9 -#define RT_I64 10 -#define RT_PTR 10 //Signed to allow negative error codes. $LK,"DOCM_CANCEL",A="MN:DOCM_CANCEL"$ -#define RT_U64 11 -#define RT_F32 12 //Not implemented -#define RT_UF32 13 //Not implemented, Fictitious -#define RT_F64 14 -#define RT_UF64 15 //Fictitious -#define RT_RTS_NUM 16 -#define RTF_UNSIGNED 1 -#define RTG_MASK 0xFF - -#define MDf_STACK 8 -#define MDf_IMM 9 -#define MDf_REG 10 -#define MDf_DISP 11 -#define MDf_SIB 12 -#define MDf_RIP_DISP32 13 - -#define MDF_NULL 0x0000 -#define MDF_STACK 0x0100 -#define MDF_IMM 0x0200 -#define MDF_REG 0x0400 -#define MDF_DISP 0x0800 -#define MDF_SIB 0x1000 -#define MDF_RIP_DISP32 0x2000 -#define MDG_MASK 0xFF00 -#define MDG_REG_DISP_SIB (MDF_REG | MDF_DISP | MDF_SIB) -#define MDG_DISP_SIB_RIP (MDF_DISP | MDF_SIB | MDF_RIP_DISP32) -#define MDG_REG_DISP_SIB_RIP (MDF_REG | MDG_DISP_SIB_RIP) - -#define ICF_RES_TO_F64 0x000000001 -#define ICF_RES_TO_INT 0x000000002 -#define ICF_ARG1_TO_F64 0x000000004 -#define ICF_ARG1_TO_INT 0x000000008 -#define ICF_ARG2_TO_F64 0x000000010 -#define ICF_ARG2_TO_INT 0x000000020 -#define ICF_USE_F64 0x000000040 -#define ICF_USE_UNSIGNED 0x000000080 -#define ICF_USE_INT 0x000000100 //highest priority -#define ICF_RES_NOT_USED 0x000000200 -#define ICF_CODE_FINAL 0x000000400 -#define ICF_BY_VAL 0x000000800 //By value, not ref. -#define ICF_SHORT_JMP 0x000001000 -#define ICF_PUSH_RES 0x000002000 -#define ICF_PASS_TRACE 0x000004000 -#define ICF_RES_WAS_STACK 0x000008000 -#define ICF_ARG1_WAS_STACK 0x000010000 -#define ICF_ARG2_WAS_STACK 0x000020000 -#define ICF_PUSH_CMP 0x000040000 //for 50last_cc->lex_include_stack->line_num);} -#define __CMD_LINE__ #exe{StreamPrint("%d", Fs->last_cc->flags & CCF_CMD_LINE && Fs->last_cc->lex_include_stack->depth < 1);} -#define __FILE__ #exe{StreamPrint("\"%s\"", Fs->last_cc->lex_include_stack->full_name);} -#define __DIR__ #exe{StreamDir;} - -#define LFSF_DOC 1 -#define LFSF_DEFINE 2 -class CLexFile -{ - CLexFile *next; - U8 *buf, - *buf_ptr; - I64 line_num, flags; - U8 *full_name, - *line_start; - CDoc *doc; - CDocEntry *cur_entry; - I32 depth; - U8 last_U16, pad[3]; -}; - -class CAOTCtrl -{ - I64 rip; //Instruction pointer - CAsmArg arg1, arg2, arg3; - CAOTBinBlk *bin; - I64 num_bin_U8s, - max_align_bits, org; - CAsmUnresolvedRef *local_unresolved, *global_unresolved; - CAOTAbsAddr *abss; - CAOTHeapGlobal *heap_globals; - I64 list_col, list_last_rip; - U8 *last_label, *list_last_line; - CLexFile *list_last_lfn; - I64 seg_size; - Bool list; -}; - -//Tokens -#define TK_EOF 0 -#define TK_SUPERSCRIPT 0x001 -#define TK_SUBSCRIPT 0x002 -#define TK_NORMALSCRIPT 0x003 -#define TK_IDENT 0x100 -#define TK_STR 0x101 -#define TK_I64 0x102 -#define TK_CHAR_CONST 0x103 -#define TK_F64 0x104 -#define TK_PLUS_PLUS 0x105 -#define TK_MINUS_MINUS 0x106 -#define TK_DEREFERENCE 0x107 -#define TK_DBL_COLON 0x108 -#define TK_SHL 0x109 -#define TK_SHR 0x10A -#define TK_EQU_EQU 0x10B -#define TK_NOT_EQU 0x10C -#define TK_LESS_EQU 0x10D -#define TK_GREATER_EQU 0x10E -#define TK_AND_AND 0x10F -#define TK_OR_OR 0x110 -#define TK_XOR_XOR 0x111 -#define TK_SHL_EQU 0x112 -#define TK_SHR_EQU 0x113 -#define TK_MUL_EQU 0x114 -#define TK_DIV_EQU 0x115 -#define TK_AND_EQU 0x116 -#define TK_OR_EQU 0x117 -#define TK_XOR_EQU 0x118 -#define TK_ADD_EQU 0x119 -#define TK_SUB_EQU 0x11A -#define TK_IF 0x11B -#define TK_IFDEF 0x11C -#define TK_IFNDEF 0x11D -#define TK_IFAOT 0x11E -#define TK_IFJIT 0x11F -#define TK_ENDIF 0x120 -#define TK_ELSE 0x121 -#define TK_MOD_EQU 0x122 -#define TK_DOT_DOT 0x123 -#define TK_ELLIPSIS 0x124 -#define TK_INS_BIN 0x125 -#define TK_INS_BIN_SIZE 0x126 -#define TK_TKS_NUM 0x127 - -class CLexHashTableContext -{ - CLexHashTableContext *next; - I64 old_flags, hash_mask; - CHashFun *local_var_list, - *fun; - CHashTable *hash_table_list, - *define_hash_table, - *local_hash_table, - *global_hash_table; -}; - -//CompCtrl flags -#define CCF_CMD_LINE 0x001 -#define CCF_PROMPT 0x002 -#define CCf_PROMPT 1 -#define CCF_QUESTION_HELP 0x004 -#define CCF_DONT_FREE_BUF 0x008 -#define CCF_NO_DEFINES 0x010 -#define CCF_IN_IF 0x020 -#define CCF_JUST_LOAD 0x040 -#define CCF_KEEP_NEW_LINES 0x080 -#define CCF_KEEP_DOT 0x100 -#define CCF_KEEP_SIGN_NUM 0x200 -#define CCF_KEEP_AT_SIGN 0x400 -#define CCF_NO_CHAR_CONST 0x800 -#define CCf_PASS_TRACE_PRESENT 12 -#define CCF_NOT_CONST 0x0000020000 -#define CCF_NO_REG_OPT 0x0000040000 -#define CCF_IN_QUOTES 0x0000080000 -#define CCF_EXE_BLK 0x0000100000 -#define CCF_HAS_MISC_DATA 0x0000200000 -#define CCF_HAS_RETURN 0x0000400000 -#define CCF_ASM_EXPRESSIONS 0x0000800000 -#define CCF_UNRESOLVED 0x0001000000 -#define CCF_LOCAL 0x0002000000 -#define CCF_FUN_EXP 0x0004000000 -#define CCf_FUN_EXP 26 -#define CCF_POSTINC 0x0008000000 -#define CCF_POSTDEC 0x0010000000 -#define CCF_PREINC 0x0020000000 -#define CCF_PREDEC 0x0040000000 -#define CCF_ARRAY 0x0080000000 -#define CCF_RAX 0x0100000000 -#define CCF_USE_LAST_U16 0x0200000000 -#define CCf_USE_LAST_U16 33 -#define CCF_LAST_WAS_DOT 0x0400000000 -#define CCF_AOT_COMPILE 0x0800000000 -#define CCf_AOT_COMPILE 35 -#define CCF_NO_ABSS 0x1000000000 -#define CCF_PAREN 0x2000000000 -#define CCf_PAREN 37 -#define CCF_CLASS_DOL_OFFSET 0x4000000000 -#define CCF_DONT_MAKE_RES 0x8000000000 - -public class CCompCtrl -{ - CCompCtrl *next, *last; - I64 token, flags, - cur_i64; - F64 cur_f64; - U8 *cur_str; - I64 cur_str_len, - class_dol_offset; - U8 *dollar_buf; - I64 dollar_count; - U8 *cur_help_idx; - I64 last_U16, - min_line, max_line, last_line_num, - lock_count; - U32 *char_bmp_alpha_numeric; - CLexHashTableContext htc; - CHashGeneric *hash_entry; - CAbsCountsI64 abs_counts; - CAsmUndefHash *asm_undef_hash; - CMemberList *local_var_entry; - CCodeMisc *lb_leave; - U8 *cur_buf_ptr; - CLexFile *lex_include_stack, - *lex_parse_stack, - *fun_lex_file; - CStreamBlk *next_stream_blk, *last_stream_blk; - CAOT *aot; - - I64 pass, opts, pass_trace, saved_pass_trace, error_count, warning_count; - - //For intermediate codes with multiple float ops (int<->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]; - - CCodeCtrl coc; - CParseStack *ps; - CAOTCtrl *aotc; - I64 aot_depth, prompt_line; -#assert !($$ & 7) -}; - -#help_index "Compiler" -public class CCompGlobals -{ - CHashTable *asm_hash; - CHashClass *internal_types[RT_RTS_NUM]; - CIntermediateCode ic_nop; - U32 *dual_U16_tokens1, *dual_U16_tokens2, *dual_U16_tokens3, - *binary_ops; - I64 num_reg_vars, num_non_ptr_vars, - stack_tmps_mask, reg_vars_mask, non_ptr_vars_mask; - U8 *to_reg_vars_map, *non_ptr_vars_map; - I64 size_arg_mask[17], - compiled_lines; -}; - -#help_index "Debugging/Unassemble" -class CUAsmGlobals -{ - CInst **table_16_32, - **table_64; - I64 table_16_32_entries, - table_64_entries, - ins64_arg_mask, - signed_arg_mask, - mem_arg_mask; -}; - -#help_index "Devices/SMBIOS" -//SMBIOS parsing based on SMBIOS specification 3.3.0 (document "DSP0134") -#define SMBIOSt_BIOS 0 -#define SMBIOSt_SYSTEM 1 -#define SMBIOSt_BASEBOARD 2 -#define SMBIOSt_ENCLOSURE 3 -#define SMBIOSt_PROCESSOR 4 -#define SMBIOSt_CACHE 7 -#define SMBIOSt_CONNECTOR 8 -#define SMBIOSt_SLOT 9 -#define SMBIOSt_OEM_STRINGS 11 -#define SMBIOSt_SYS_CONFIG_OPTIONS 12 -#define SMBIOSt_PHYMEM 16 -#define SMBIOSt_MEM_DEVICE 17 -#define SMBIOSt_MAPPED_ADDR 19 -#define SMBIOSt_BATTERY 22 -#define SMBIOSt_BOOT_INFO 32 -#define SMBIOSt_ALL 0xFF //Non-existent placeholder type - -class CSMBIOSHeader -{//Section 6.1.2 line 885 - U8 type, //SMBIOSt_* - length; - U16 handle; //identifier for this structure. -}; -class CSMBIOSEntryPoint -{//Section 5.2.1 line 812 - U8 anchor_str[4], // '_SM_' - checksum, - length, - major_version, - minor_version; - U16 max_structure_size; - U8 entry_point_revision, - formatted_area[5], - anchor_str2[5], // '_DMI_' - checksum2; - U16 table_length; - U32 table_address; - U16 structure_count; - U8 bcd_revision; -}; - -class CSMBIOSBIOSInfo -{//Section 7.1 line 922 - CSMBIOSHeader header; - U8 vendor, - version; - U16 start_address_segment; - U8 release_date, - rom_size; - U64 flags; - U8 extended_flags[2]; - U8 major_release, - minor_release, - embedded_controller_firmware_major_release, - embedded_controller_firmware_minor_release; - U16 extended_rom_size; -}; - -class CSMBIOSSystemInfo -{//Section 7.2 line 936 - CSMBIOSHeader header; - U8 manufacturer, - product_name, - version, - serial_number, - uuid[16], - wakeup_type, - sku_number, - family; -}; - -class CSMBIOSBaseboardInfo -{//Section 7.3 line 968 - CSMBIOSHeader header; - U8 manufacturer, - product, - version, - serial_number, - asset_tag, - feature_flags, - chassis_location; - U16 chassis_handle; - U8 board_type, - contained_object_handles_num; - U16 contained_object_handles[1]; //Variable length, member above gives length -}; - -class CSMBIOSEnclosureInfo -{//Section 7.4 line 984 - CSMBIOSHeader header; - U8 manufacturer, - type, - version, - serial_number, - asset_tag, - bootup_state, - power_supply_state, - thermal_state, - security_status; - U32 oem_defined; - U8 height, - power_cord_count, - contained_element_count, - contained_element_record_length, - contained_elements[1]; //array length == count * record_length; -}; - -class CSMBIOSEnclosureContainedElement -{//Section 7.4.4 line 999 - U8 contained_element_type, - contained_element_minimum, - contained_element_maximum; -}; - -class CSMBIOSProcessorInfo -{//Section 7.5 line 1010 - CSMBIOSHeader header; - U8 name, - type, - family, - manufacturer; - U64 id; - U8 version, - voltage; - U16 external_clock, - max_speed, - current_speed; - U8 status, - upgrade; - U16 l1_cache_handle, - l2_cache_handle, - l3_cache_handle; - U8 serial_number, - asset_tag, - part_number, - core_count, - cores_enabled, - thread_count; - U16 characteristics; -}; - -class CSMBIOSCacheInfo -{//Section 7.8 line 1168 - CSMBIOSHeader header; - U8 name; - U16 config, - max_size, - installed_size, - supported_sram_type, - installed_sram_type; - U8 cache_speed, - error_correction_type, - cache_type, - associativity; -}; - -class CSMBIOSConnectorInfo -{//Section 7.9 line 1198 - CSMBIOSHeader header; - U8 internal_name, - internal_type, - external_name, - external_type, - port_type; -}; - -class CSMBIOSSlotInfo -{//Section 7.10 line 1226 - CSMBIOSHeader header; - U8 name, - type, - data_bus_width, - current_usage, - length; - U16 id; - U8 flags1, - flags2; - U16 segment_group_number; - U8 bus_number, - device_function_number; -}; - -class CSMBIOSMemArrayInfo -{//Section 7.17 line 1519 - CSMBIOSHeader header; - U8 location, - use, - memory_error_correction; - U32 max_capacity; - U16 memory_error_info_handle, - mem_device_count; - U64 extended_max_capacity; -}; - -class CSMBIOSMemDeviceInfo -{//Section 7.18 line 1538 - CSMBIOSHeader header; - U16 memory_array_handle, - memory_error_info_handle, - total_width, - data_width, - size; - U8 form_factor, - device_set, - device_locator, - bank_locator, - type; - U16 type_detail, - speed; - U8 manufacturer, - serial_number, - asset_tag, - part_number, - attributes; - U32 extended_size; - U16 configured_speed, - min_voltage, - max_voltage, - configured_voltage; -}; - -class CSMBIOSBatteryInfo -{//Section 7.23 line 1723 - CSMBIOSHeader header; - U8 location, - manufacturer, - manufacture_date, - serial_number, - name, - chemistry, - capacity, - voltage, - sbds_version_number, - max_battery_data_error, - sbds_serial_number, - sbds_manufacture_date, - sbds_chemistry, - capacity_multiplier; - U32 oem; -}; - -#help_index "Devices;PCI" - -//PCI Registers, used with $LK,"PCIRead",A="MN:PCIReadU16"$ functions. -#define PCIR_VENDOR_ID 0x00 -#define PCIR_DEVICE_ID 0x02 -#define PCIR_COMMAND 0x04 -#define PCIR_STATUS 0x06 -#define PCIR_REVISION_ID 0x08 -#define PCIR_PROG_IF 0x09 -#define PCIR_SUB_CODE 0x0A -#define PCIR_CLASS_CODE 0x0B -#define PCIR_CACHE_LINE_SIZE 0x0C -#define PCIR_LATENCY_TIMER 0x0D -#define PCIR_HEADER_TYPE 0x0E -#define PCIR_BIST 0x0F -#define PCIR_BASE0 0x10 -#define PCIR_BASE1 0x14 -#define PCIR_BASE2 0x18 -#define PCIR_BASE3 0x1C -#define PCIR_BASE4 0x20 -#define PCIR_BASE5 0x24 -#define PCIR_SUBSYS_VENDOR_ID 0x2C -#define PCIR_SUBSYS_ID 0x2E -#define PCIR_EXPANSION_ROM 0x30 -#define PCIR_CAPABILITIES 0x34 -#define PCIR_INTERRUPT_LINE 0x3C -#define PCIR_INTERRUPT_PIN 0x3D -#define PCIR_MIN_GRANT 0x3E -#define PCIR_MAX_LATENCY 0x3F - -//PCI class codes -#define PCIC_STORAGE 0x1 -#define PCIC_NETWORK 0x2 - -//PCI subclass codes -#define PCISC_ETHERNET 0x0 -#define PCISC_AHCI 0x6 - -//PCI I/O ports -#define PCI_ADDR 0xCF8 -#define PCI_DATA 0xCFC - -class CPCIDev -{ - CPCIDev *next, *last; - U8 bus, dev, fun, - *vendor_str, - *dev_id_str, - class_code, - sub_code, - prog_if, - revision_id, - bist, - header_type, - latency_timer, - cache_line_size, - capabilities, - interrupt_line, - interrupt_pin, - min_grant, - max_latency; - U16 vendor_id, - device_id, - subsys_id, - subsys_vendor_id; - U32 base[6], - erom; -}; - -#help_index "Devices;Disk/AHCI" -#define AHCI_MAX_PORTS 32 - -//Physical Region Descriptor Table -#define AHCI_PRD_MAX_BYTES (4 * 1024 * 1024) //Max bytes that can go in one PRD entry ($ER$4 MiB). Section 4.2.3.3 Fig. 17 (DBC) -#define AHCI_PRDT_MAX_BLOCKS (U16_MAX + 1) //Max blocks you can transfer in one command. -#define AHCI_PRDT_MAX_LEN 8 //Max PRD entries in one command. This is equal to (MAX_BLOCKS * BLK_SIZE) ö MAX_BYTES. - -//Global Host Control (Controller) flags -#define AHCI_GHCf_HBA_RESET 0 -#define AHCI_GHCf_INTERRUPT_ENABLE 1 -#define AHCI_GHCf_AHCI_ENABLE 31 - -#define AHCI_CAPSf_S64A 31 //Supports 64-bit Addressing - -#define AHCI_CAPSEXTf_BOH 0 //Supports BIOS/OS Handoff -#define AHCI_CAPSEXTf_NVMP 1 //NVMHCI Supported & Present - -//BIOS/OS Handoff Control -#define AHCI_BOHCf_BOS 0 //BIOS-Owned Semaphore (BIOS owns controller) -#define AHCI_BOHCf_OOS 1 //OS-Owned Semaphore (OS owns controller) -#define AHCI_BOHCf_BB 4 //BIOS Busy (polling bit while BIOS cleans up things after ownership transfer) - -//Command Header flags -#define AHCI_CH_DESCf_A 5 //'ATAPI' bit. Set when ATAPI command is being sent. -#define AHCI_CH_DESCF_A (1 << AHCI_CH_DESCf_A) -#define AHCI_CH_DESCf_W 6 //'Write' bit. Set when data is being written. -#define AHCI_CH_DESCF_W (1 << AHCI_CH_DESCf_W) - -//Command FIS flags -#define AHCI_CF_DESCf_C 7 //'Command' bit. Set when FIS is an ATA command. -#define AHCI_CF_DESCF_C (1 << AHCI_CF_DESCf_C) - -//Port register flags -//Command and Status register flags -#define AHCI_PxCMDf_ST 0 //'Start'. Start processing commmand list. FRE must be set before. -#define AHCI_PxCMDf_SUD 1 //'Spin-Up Device'. For devices that support Staggered Spin-up. We attempt to set it for all ports. -#define AHCI_PxCMDf_POD 2 //'Power-On Device'. For devices that support Cold Presence. We attempt to set it for all ports. -#define AHCI_PxCMDf_FRE 4 //'FIS Receive Enable'. Allows the processing of FISes. -#define AHCI_PxCMDf_FR 14 //'FIS receive Running'. Status indicator for FRE. -#define AHCI_PxCMDf_CR 15 //'Command list Running'. Status indicator for ST. -#define AHCI_PxCMDf_ATAPI 24 //'Device is ATAPI'. When set, HBA turns on desktop LED when device is in use. For ATAPI devices. -#define AHCI_PxCMDF_ST (1 << AHCI_PxCMDf_ST) -#define AHCI_PxCMDF_SUD (1 << AHCI_PxCMDf_SUD) -#define AHCI_PxCMDF_POD (1 << AHCI_PxCMDf_POD) -#define AHCI_PxCMDF_FRE (1 << AHCI_PxCMDf_FRE) -#define AHCI_PxCMDF_FR (1 << AHCI_PxCMDf_FR) -#define AHCI_PxCMDF_CR (1 << AHCI_PxCMDf_CR) -#define AHCI_PxCMDF_ATAPI (1 << AHCI_PxCMDf_ATAPI) - -//Task File Data register flags -#define AHCI_PxTFDf_STS_ERR 0 // Error Bit of Status register - -//Signature types -#define AHCI_PxSIG_ATA 0x00000101 -#define AHCI_PxSIG_ATAPI 0xEB140101 -#define AHCI_PxSIG_SEMB 0xC33C0101 //Enclosure Management Bridge... rare to encounter in wild. -#define AHCI_PxSIG_PM 0x96690101 //Port multiplier... not relevant to PC-type systems. - -//Interrupt flags (same in PxIE and PxIS) -#define AHCI_PxIf_OFS 24 //Overflow Status -#define AHCI_PxIf_INFS 26 //SATA Interface Non-Fatal Error -#define AHCI_PxIf_IFS 27 //SATA Interface Fatal Error -#define AHCI_PxIf_HBDS 28 //Host Bus Data Error -#define AHCI_PxIf_HBFS 29 //Host Bus Fatal Error -#define AHCI_PxIf_TFE 30 //Task File Error, see $LK,"ATAS_ERR",A="MN:ATAS_ERR"$. -#define AHCI_PxIf_CPDS 31 //Cold Port Detect Status - -//COMRESET flags -//SATA Control register flags -#define AHCI_PxSCTLf_DET_INIT 1 -#define AHCI_PxSCTLF_DET_INIT (1 << AHCI_PxSCTLf_DET_INIT) -//SATA Status register flags -#define AHCI_PxSSTSF_DET_PRESENT 3 - -//SATA Error register flags -#define AHCI_PxSERR_ERR_I 0 // Recovered Data Integrity Error -#define AHCI_PxSERR_ERR_M 1 // Recovered Communication Error -#define AHCI_PxSERR_ERR_T 8 // Transient Data Integrity Error -#define AHCI_PxSERR_ERR_C 9 // Persistent Communication Error -#define AHCI_PxSERR_ERR_P 10 // SATA Protocol Error -#define AHCI_PxSERR_ERR_E 11 // Internal Error -#define AHCI_PxSERR_DIAG_I 17 // Phy Internal Error -#define AHCI_PxSERR_DIAG_C 21 // Link Layer CRC Error -#define AHCI_PxSERR_DIAG_H 22 // Handshake Error -#define AHCI_PxSERR_DIAG_S 23 // Link Sequence Error -#define AHCI_PxSERR_DIAG_T 24 // Transport State Transition Error - -class CAHCIPort -{//Port register layout - U32 cmd_list_base, - cmd_list_base_upper, - fis_base, - fis_base_upper, - interrupt_status, - interrupt_enable, - command, - reserved, - task_file_data, - signature, - sata_status, - sata_ctrl, - sata_error, - sata_active, - cmd_issue, - sata_notif, - fis_switch_ctrl, - device_sleep; - U8 reserved[40], - vendor[16]; -}; - -class CAHCIHba -{//HBA register layout - U32 caps, - ghc, //Global Host Control - interrupt_status, - ports_implemented, - version, - ccc_ctrl, //Command Completion Coalescing - ccc_ports, - em_location,//Enclosure Management - em_ctrl, - caps_ext, - bohc; - U8 reserved[116], - vendor[96]; - CAHCIPort ports[32]; -}; - -#define FISt_H2D 0x27 - -class CFisH2D -{//Host To Device - U8 type, - desc, //We are concerned with bit #7 ($LK,"AHCI_CF_DESCf_C",A="MN:AHCI_CF_DESCf_C"$) 1=command, 0=control. - command, - feature_low, - lba0, - lba1, - lba2, - device, - lba3, - lba4, - lba5, - feature_high; - U16 count; - U8 icc, - ctrl; - U32 reserved; -}; - -class CFisReceived -{ - U8 dma_fis[28], - reserved[4], - pio_fis[20], - reserved[12], - r_fis[20], - reserved[4], - devbits_fis[8], - unknown_fis[64], - reserved[96]; -}; - -class CPrdtEntry -{ - U32 data_base, - data_base_upper, - reserved, - data_byte_count; //bit 31 is "Interrupt on Completion". bits 21:0 are the actual count. -}; - -/* -Bits of first U32: - 4:0 - Command FIS Length, in U32s - 5 - ATAPI bit (A) for ATAPI command - 6 - Write bit (W) for write commands $LK,"AHCI_CH_DESCf_W",A="MN:AHCI_CH_DESCf_W"$ 1=write 0=read - 7 - Prefetchable (P) - 8 - Reset (R) - 9 - Built-in Self Test (BIST) - 10 - Clear busy upon R_OK - 11 - Reserved - 15:12 - Port Multiplier Port (PMP) - 31:16 - Physical Region Descriptor Table Length (PRDTL) -*/ -class CPortCmdHeader -{//What the CAHCIPort.cmd_list consists of. - U16 desc, - prdt_len; - U32 prd_byte_count, - cmd_table_base, - cmd_table_base_upper, - reserved[4]; -}; - -class CPortCmdTable -{ - U8 cmd_fis[64], - acmd[16], - reserved[48]; - CPrdtEntry prdt[8]; -}; - -class CAtapiReadCmd -{ - U8 command, - reserved; - U32 lba, - count; - U8 reserved, - ctrl, - zero[4]; -}; - -class CAtapiWriteCmd -{ - U8 command, - reserved; - U32 lba; - U8 reserved; - U16 count; -}; - -class CAtapiCloseCmd -{ - U8 command, - reserved, - code, - reserved; - U16 track_num; -}; - -class CAtapiModeHeader -{ - U16 data_length; - U8 reserved[4]; - U16 block_desc_len; -}; - -class CAtapiModeWritePage -{ - U8 code, //0 - length, - type, - mode, - block_type, - link_size, - reserved, - host_app_code, - session_format, - reserved; // 9 - U32 packet_size; // 10-13 - U16 audio_pause_length;// 14-15 - U8 media_catalog_num[16],//16-31 - recording_code[16],//32-47 - sub_0, - sub_1, - sub_2, - sub_3; -}; - -class CAtapiModeWriteList -{ - CAtapiModeHeader header; - CAtapiModeWritePage page; -}; - -//ATA_IDENTIFY command array indexes (array of U16s) -#define ATA_IDENT_SERIAL_NUM 10 -#define ATA_IDENT_MODEL_NUM 27 -#define ATA_IDENT_LBA48_CAPACITY 100 - -//See $LK,"::/Doc/Credits.DD"$. -#define ATA_NOP 0x00 -#define ATA_DEV_RST 0x08 -#define ATA_PACKET 0xA0 -#define ATA_READ_NATIVE_MAX 0xF8 -#define ATA_READ_NATIVE_MAX_EXT 0x27 -#define ATA_SET_MAX 0xF9 -#define ATA_SET_MAX_EXT 0x37 -#define ATA_READ_MULTI 0xC4 -#define ATA_READ_MULTI_EXT 0x29 -#define ATA_READ_DMA_EXT 0x25 -#define ATA_WRITE_MULTI 0xC5 -#define ATA_WRITE_MULTI_EXT 0x39 -#define ATA_WRITE_DMA_EXT 0x35 -#define ATA_IDENTIFY 0xEC -#define ATA_IDENTIFY_PACKET 0xA1 // IDENTIFY PACKET DEVICE, mirror of ATA_IDENTIFY for ATAPI - -#define ATAPI_FORMAT_UNIT 0x0400 -#define ATAPI_START_STOP_UNIT 0x1B00 -#define ATAPI_READ_CAPACITY 0x2500 -#define ATAPI_SEEK 0x2B00 -#define ATAPI_SYNC_CACHE 0x3500 -#define ATAPI_MODE_SELECT 0x5500 -#define ATAPI_CLOSE_TRACK_SESSION 0x5B00 -#define ATAPI_BLANK 0xA100 -#define ATAPI_READ 0xA800 -#define ATAPI_WRITE 0x2A00 -#define ATAPI_SET_CD_SPEED 0xBB00 - -#define ATAS_ERR 0x01 -#define ATAS_DRQ 0x08 -#define ATAS_DF 0x20 -#define ATAS_DRDY 0x40 -#define ATAS_BSY 0x80 - -#define ATAR0_DATA 0 -#define ATAR0_FEAT 1 -#define ATAR0_NSECT 2 -#define ATAR0_SECT 3 -#define ATAR0_LCYL 4 -#define ATAR0_HCYL 5 -#define ATAR0_SEL 6 -#define ATAR0_STAT 7 -#define ATAR0_CMD 7 -#define ATAR1_CTRL 2 - -#help_index "File/FileNames" -#define FILEMASK_JIT "*.ZC*;*.HH*" -#define FILEMASK_AOT "*.ZC*;*.HH*;*.PRJ*" -#define FILEMASK_SRC "*.ZC*;*.HH*;*.IN*;*.PRJ*" -#define FILEMASK_DD FILEMASK_SRC ";*.DD*" -#define FILEMASK_TXT FILEMASK_DD ";*.TXT*;*.CFG*" -#define FILEMASK_GR "*.GR*" - -#help_index "File/Low Level" -#define BLK_SIZE_BITS 9 -#define BLK_SIZE (1 << BLK_SIZE_BITS) -#define DVD_BLK_SIZE (4 * BLK_SIZE) -#define DVD_BOOT_LOADER_SIZE DVD_BLK_SIZE * 1 -#define INVALID_CLUS (-1) - -class CMBRPart -{ - U8 active, //0x80=active 0x00=inactive - start_head; - U16 start_cyl; - U8 type, - end_head; - U16 end_cyl; - U32 offset, //Sectors between MBR and first sector - size; //Sectors in drive -}; - -class CMasterBoot -{ - U8 code[440]; - U32 media_id; - U16 zero; - CMBRPart p[4]; - U16 signature; //AA55 -}; - -class CRedSeaBoot -{ - U8 jump_and_nop[3], - signature, reserved[4]; //MBR_PT_REDSEA=0x88. Distinguish from real FAT32 - I64 drv_offset, //For CD/DVD image copy. - sects, - root_clus, - bitmap_sects, - unique_id; - U8 code[462]; - U16 signature2; //0xAA55 -}; - -class CFAT32Boot -{ - U8 jump_and_nop[3], - oem_name[8]; - U16 bytes_per_sect; - U8 sects_per_clus; - U16 reserved_sects; - U8 copies_of_fat; - U16 max_root_dir_entries, //Not used - old_sects_in_drive; //Not used - U8 media_desc; //F64 for hard disk - U16 old_sects_per_fat, //Not used - sects_per_track, - num_heads; - U32 hidden_sects, - sects, - sects_per_fat; - U16 flags, - version; - U32 root_clus; - U16 file_system_info_sect, - backup_boot_sect; - U8 reserved[12], - log_drive_num, - unused, - ext_signature; //0x29 - U32 serial_num; - U8 vol_name[11], - fat_name[8], - code[420]; - U16 signature; -}; - -class CFAT32FileInfoSect -{ - U32 signature1; - U8 unknown[480]; - U32 signature2, - free_clus, - most_recently_alloced; - U8 reserved[12]; - U32 signature3; -}; - -class CFAT32DirEntry -{ - U8 name[11], - attr, - NTres, - CrtTimeTenth; - U16 CrtTime, - CrtDate, - ListAccDate, - clus_hi, - WrtTime, - WrtDate, - clus_lo; - U32 size; -}; - -class CFAT32DirEntryLong -{ - U8 ord; - U16 name1[5]; - U8 attr, - type, - xsum; - U16 name2[6], - zero, - name3[2]; -}; - -#define FAT32_ENTRIES_PER_BLK (BLK_SIZE / sizeof(CFAT32DirEntry)) -#define FAT32_ENTRIES_BITS Bsf(FAT32_ENTRIES_PER_BLK) - -class CPalindromeU16 -{ - U16 little, big; -}; - -class CPalindromeU32 -{ - U32 little, big; -}; - -class CISODate -{ - U8 year, mon, day, hour, min, sec, sec100; -}; - -class CISODirEntry -{ - U8 len, ext_attr_len; - CPalindromeU32 loc; - CPalindromeU32 size; - CISODate date; - U8 flags, file_unit_size, interleave; - CPalindromeU16 vol_seq_num; - U8 name_len, name; -}; - -class CISOPathEntry -{ - U8 name_len, zero; - U32 blk; - U16 parent_entry_num, - name[1]; //Aligned to U16 boundaries -}; - -//ISO9660 -#define ISOT_BOOT_RECORD 0 -#define ISOT_PRI_VOL_DESC 1 -#define ISOT_SUPPLEMENTARY_DESC 2 -#define ISOT_VOL_DRIVE_DESC 3 -#define ISOT_TERMINATOR 255 - -class CISOPriDesc -{ - U8 type, - id[5], - version, - unused1, - system_id[32], - vol_id[32], - unused2[8]; - CPalindromeU32 vol_space_size; - U8 unused3[32]; - CPalindromeU16 vol_set_size; - CPalindromeU16 vol_seq_num; - CPalindromeU16 log_block_size; - CPalindromeU32 path_table_size; - U32 type_l_path_table, - opt_type_l_path_table, - type_m_path_table, - opt_type_m_path_table; - CISODirEntry root_dir_record; - U8 vol_set_id[128], - publisher_id[128], - preparer_id[128], - pad[307], - file_structure_version, - pad[1166]; -}; - -#define ISO_BASE_YEAR 1900 -#define ISO_ATTR_DIR 2 - -//Red Sea Attributes -//See $LK,"ST_FILE_ATTRS",A="MN:ST_FILE_ATTRS"$ -#define RS_ATTR_READ_ONLY 0x01 //R -#define RS_ATTR_HIDDEN 0x02 //H -#define RS_ATTR_SYSTEM 0x04 //S -#define RS_ATTR_VOL_ID 0x08 //V -#define RS_ATTR_DIR 0x10 //D -#define RS_ATTR_ARCHIVE 0x20 //A -#define RS_ATTR_LONG_NAME (RS_ATTR_READ_ONLY | RS_ATTR_HIDDEN | RS_ATTR_SYSTEM | RS_ATTR_VOL_ID) -#define RS_ATTR_LONG_NAME_MASK (RS_ATTR_LONG_NAME | RS_ATTR_DIR | RS_ATTR_ARCHIVE) -#define RS_ATTR_DELETED 0x100 //X -#define RS_ATTR_RESIDENT 0x200 //T -#define RS_ATTR_CONTIGUOUS 0x400 //C -#define RS_ATTR_FIXED 0x800 //F - -#help_index "File/CD DVD" -//Media types for $LK,"DVDImageWrite",A="MN:DVDImageWrite"$() -#define MT_CD 1 -#define MT_DVD 2 - -#help_index "File/Low Level;File/Program Routines" -//CDirEntry flags (Used by $LK,"FileMgr",A="MN:FileMgr"$()) -#define CDIR_FILENAME_LEN 38 //Must include terminator zero -public class CDirEntry -{ - CDirEntry *next, *parent, *sub; - U8 *full_name; - I64 user_data, user_data2; - - U0 start; - U16 attr; - U8 name[CDIR_FILENAME_LEN]; - I64 clus, size; - CDate datetime; -}; -#define CDIR_SIZE (sizeof(CDirEntry) - offset(CDirEntry.start)) - -#help_index "File/Program Routines" -//File Util Flags -//See $LK,"ST_FILE_UTIL_FLAGS",A="MN:ST_FILE_UTIL_FLAGS"$ -#define FUf_RECURSE 0 // r -#define FUf_DIFF 1 // d -#define FUf_DEL 1 // d -#define FUf_IGNORE 2 // i -#define FUf_ALL 3 // a -#define FUf_CANCEL 4 // c -#define FUf_REPLACE 5 // R -#define FUf_PUBLIC 6 // p -#define FUf_MAP 7 // m -#define FUf_SINGLE 8 // s -#define FUf_JUST_DIRS 9 // D -#define FUf_JUST_FILES 10 // F -#define FUf_JUST_TXT 11 // T -#define FUf_JUST_DD 12 // $$ -#define FUf_JUST_SRC 13 // S -#define FUf_JUST_AOT 14 // A -#define FUf_JUST_JIT 15 // J -#define FUf_JUST_GR 16 // G -#define FUf_CLUS_ORDER 17 // O (Move disk head one direction) -#define FUf_SCAN_PARENTS 18 // P -#define FUf_FLATTEN_TREE 19 // f -#define FUf_WHOLE_LABELS 20 // l -#define FUf_WHOLE_LABELS_BEFORE 21 // lb -#define FUf_WHOLE_LABELS_AFTER 22 // la - -#define FUF_RECURSE (1 << FUf_RECURSE) -#define FUF_DIFF (1 << FUf_DIFF) -#define FUF_DEL (1 << FUf_DEL) -#define FUF_IGNORE (1 << FUf_IGNORE) -#define FUF_ALL (1 << FUf_ALL) -#define FUF_CANCEL (1 << FUf_CANCEL) -#define FUF_REPLACE (1 << FUf_REPLACE) -#define FUF_PUBLIC (1 << FUf_PUBLIC) -#define FUF_MAP (1 << FUf_MAP) -#define FUF_SINGLE (1 << FUf_SINGLE) -#define FUF_JUST_DIRS (1 << FUf_JUST_DIRS) -#define FUF_JUST_FILES (1 << FUf_JUST_FILES) -#define FUF_JUST_TXT (1 << FUf_JUST_TXT) -#define FUF_JUST_DD (1 << FUf_JUST_DD) -#define FUF_JUST_SRC (1 << FUf_JUST_SRC) -#define FUF_JUST_AOT (1 << FUf_JUST_AOT) -#define FUF_JUST_JIT (1 << FUf_JUST_JIT) -#define FUF_JUST_GR (1 << FUf_JUST_GR) -#define FUF_CLUS_ORDER (1 << FUf_CLUS_ORDER) -#define FUF_SCAN_PARENTS (1 << FUf_SCAN_PARENTS) -#define FUF_FLATTEN_TREE (1 << FUf_FLATTEN_TREE) -#define FUF_WHOLE_LABELS (1 << FUf_WHOLE_LABELS) -#define FUF_WHOLE_LABELS_BEFORE (1 << FUf_WHOLE_LABELS_BEFORE) -#define FUF_WHOLE_LABELS_AFTER (1 << FUf_WHOLE_LABELS_AFTER) - -#define FUG_FILES_FIND (FUF_RECURSE | FUF_SINGLE | FUF_CLUS_ORDER | FUF_JUST_DIRS | FUF_JUST_FILES | FUF_JUST_TXT | \ - FUF_JUST_DD | FUF_JUST_SRC | FUF_JUST_AOT | FUF_JUST_JIT | FUF_JUST_GR | FUF_FLATTEN_TREE) -#define FUG_FILE_FIND (FUF_JUST_DIRS | FUF_JUST_FILES | FUF_SCAN_PARENTS) - -#help_index "File/Low Level" -//See $LK,"ST_BLKDEV_TYPES",A="MN:ST_BLKDEV_TYPES"$ -#define BDT_NULL 0 -#define BDT_RAM 1 -#define BDT_ATA 2 -#define BDT_ISO_FILE_READ 3 -#define BDT_ISO_FILE_WRITE 4 -#define BDT_ATAPI 5 -#define BDT_TYPES_NUM 6 - -#define BDf_REMOVABLE 0 -#define BDf_INITIALIZED 1 -#define BDf_READ_ONLY 2 -#define BDf_READ_ONLY_OVERRIDE 3 -#define BDf_LAST_WAS_WRITE 4 -#define BDf_READ_CACHE 5 -#define BDf_FORMAT 6 -#define BDf_INIT_IN_PROGRESS 7 -#define BDf_EXT_SIZE 8 -#define BDf_INTERNAL_BUF 9 - -#define BDF_REMOVABLE (1 << BDf_REMOVABLE) -#define BDF_INITIALIZED (1 << BDf_INITIALIZED) -#define BDF_READ_ONLY (1 << BDf_READ_ONLY) -#define BDF_READ_ONLY_OVERRIDE (1 << BDf_READ_ONLY_OVERRIDE) -#define BDF_LAST_WAS_WRITE (1 << BDf_LAST_WAS_WRITE) -#define BDF_READ_CACHE (1 << BDf_READ_CACHE) -#define BDF_FORMAT (1 << BDf_FORMAT) -#define BDF_INIT_IN_PROGRESS (1 << BDf_INIT_IN_PROGRESS) -#define BDF_EXT_SIZE (1 << BDf_EXT_SIZE) -#define BDF_INTERNAL_BUF (1 << BDf_INTERNAL_BUF) - -//locked flags -#define BDlf_LOCKED 0 - -#define BLKDEVS_NUM 26 -#define BD_SIGNATURE_VAL 'BDSV' - -public class CBlkDev -{ - CBlkDev *lock_fwding; //If two blkdevs on same controller, use just one lock - CTask *owning_task; - CAHCIPort *ahci_port; - U8 *prd_buf, - first_drive_let, - *RAM_disk, - *file_disk_name; - CFile *file_disk; - U32 bd_signature, - type, - flags, - blk_size, - max_reads, - max_writes; - I64 drv_offset, - init_root_dir_blks, - max_blk, - locked_flags, - port_num; - U16 *dev_id_record; - F64 last_time; -}; - -//Drive locked_flags -#define DVlf_LOCKED 0 - -//See $LK,"ST_DRIVE_TYPES",A="MN:ST_DRIVE_TYPES"$ -#define FSt_NULL 0 -#define FSt_REDSEA 1 //Supported -#define FSt_FAT32 2 //Supported except for short names, to some degree -#define FSt_ISO9660 3 //Supported (CD/DVD) -#define FSt_NTFS 4 //Not Supported -#define FSt_LINUX 5 //Not Supported -#define FSt_SWAP 6 //Not Supported -#define FSt_UNKNOWN 7 -#define FSt_TYPES_NUM 8 -#define FSG_TYPE_MASK 0x7FFF -//File system type flags -#define FStf_DISABLE 15 - -#define MBR_PT_FAT32a 0x0B -#define MBR_PT_FAT32b 0x0C -#define MBR_PT_FAT32c 0x1B -#define MBR_PT_FAT32d 0x1C -#define MBR_PT_FAT32e 0x8B -#define MBR_PT_FAT32f 0x8C -#define MBR_PT_NTFS 0x07 -#define MBR_PT_REDSEA 0x88 -#define MBR_PT_LINUX 0x83 -#define MBR_PT_SWAP 0x82 - -class CFreeList -{ - CFreeList *next, *last; - I64 start, size; -}; - -#define DRIVES_NUM 26 - -#define DRIVE_SIGNATURE_VAL 'DVSV' -public class CDrive -{ -//Don't access ->drv_let directly in case a drive has been remapped. - //Use $LK,"Drive2Letter",A="MN:Drive2Letter"$(). - I64 locked_flags; - U32 drive_signature; - U8 drv_let, pad; - U16 fs_type; - I64 drv_offset, - size, - prt_num, - file_system_info_sect, - fat1, fat2, - root_clus, - data_area, - spc; //sectors per cluster - CDate fat32_local_time_offset; - CTask *owning_task; - CBlkDev *bd; - - CFAT32FileInfoSect *fis; - I64 fat_blk_dirty, - cur_fat_blk_num; - U32 *cur_fat_blk; - CFreeList *next_free, *last_free; -}; - -#define DISK_CACHE_HASH_SIZE 0x2000 - -class CCacheBlk -{ - CCacheBlk *next_lru, *last_lru; - CCacheBlk *next_hash, *last_hash; - CDrive *drive; - I64 blk; - U8 body[BLK_SIZE]; -}; - -#help_index "File/System" -#define DEFAULT_ISO_FILENAME "::/Tmp/CDDVD.ISO" -#define DEFAULT_ISO_C_FILENAME "::/Tmp/CDDVD.ISO.C" - -public class CBlkDevGlobals -{ - CBlkDev *blkdevs; - CDrive *drvs, - *let_to_drive[32]; - CAHCIHba *ahci_hba; - U8 *default_iso_filename, //$TX,"\"::/Tmp/CDDVD.ISO\"",D="DEFAULT_ISO_FILENAME"$ - *default_iso_c_filename, //$TX,"\"::/Tmp/CDDVD.ISO.C\"",D="DEFAULT_ISO_C_FILENAME"$ - *tmp_filename, - *home_dir, - boot_drive_let, - first_hd_drive_let, - first_dvd_drive_let; - CCacheBlk *cache_base, - *cache_ctrl, - **cache_hash_table; - I64 cache_size, - read_count, - write_count, - mount_ide_auto_count, - cmd_slot_count, - ins_port;// Installed-from CD/DVD controller. - Bool dvd_boot_is_good, - ahci64; -}; - -#help_index "File/Internal" -public class CDirContext -{ - CDrive *old_dv, *drive; - U8 *old_dir, *mask; -}; - -#help_index "File/CFile" -#define FFB_NEXT_BLK I64_MAX - -#define FF_WRITE 1 -#define FF_NEW_FILE 2 -#define FF_BUF_DIRTY 4 -#define FF_NEEDS_WRITE 8 -#define FF_CONTIGUOUS 16 -#define FF_USE_OLD_DATETIME 32 - -public class CFile //See $LK,"::/Demo/Disk/DataBase.ZC"$. -{ - I64 flags; - CDirEntry de; - CDrive *drive; - I64 fblk_num, clus, file_clus_num, max_blk; - U8 *clus_buf; -}; - -#help_index "Memory/Heap" -#define _CONFIG_HEAP_DEBUG FALSE - -#if _CONFIG_HEAP_DEBUG -class CMemUnused -{ - CHeapCtrl *hc; - U8 *caller1, *caller2; - CMemUnused *next; - I64 size; -}; -class CMemUsed -{ - CHeapCtrl *hc; - U8 *caller1, *caller2; - CMemUsed *next, *last; - I64 size; - U0 start; -}; -#else -class CMemUnused -{ - U0 hc; - U0 caller1, caller2; - CMemUnused *next; - I64 size; -}; -class CMemUsed -{ - CHeapCtrl *hc; - U0 caller1, caller2; - U0 next, last; - I64 size; - U0 start; -}; -#endif - -#help_index "Memory/BlkPool" -#help_file "::/Doc/Pags" - -#define MBS_USED_SIGNATURE_VAL 'MBUs' -#define MBS_UNUSED_SIGNATURE_VAL 'MBUn' -class CMemBlk -{ - CMemBlk *next, *last; - U32 mb_signature, pags; -}; - -#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 MEM_PAG_BITS 9 -#define MEM_PAG_SIZE (1 << MEM_PAG_BITS) -#define MEM_HEAP_HASH_SIZE 1024 -#define MEM_FREE_PAG_HASH_SIZE 0x100 -//It is common to $LK,"MAlloc",A="MN:MAlloc"$() exact powers of two. There is some overhead. -//We add 1 pag, so a request is not rounded-up to next power of two. -#define MEM_EXTRA_HASH2_PAGS 1 - -#define MEM_SYSTEM_STACK (MEM_PAG_SIZE * 512) //Like 16384*MEM_PAG_SIZE -#define MEM_EXECUTIVE_STACK (MEM_PAG_SIZE * 512) -#define MEM_INTERRUPT_STACK (MEM_PAG_SIZE * 512) -#define MEM_DEFAULT_STACK (MEM_PAG_SIZE * 512) - -#define TASK_HASH_TABLE_SIZE (1 << 10) - -//locked flags -#define BPlf_LOCKED 0 -public class CBlkPool -{ - I64 locked_flags, alloced_u8s, used_u8s; - CMemBlk *mem_free_list, - *mem_free_2meg_list, //This is for Sup1CodeScraps/Mem/Mem2Meg.ZC. - *free_pag_hash[MEM_FREE_PAG_HASH_SIZE], - *free_pag_hash2[64 - MEM_PAG_BITS]; -}; - -#help_index "Memory/HeapCtrl" -//locked flags -#define HClf_LOCKED 0 - -#define HEAP_CTRL_SIGNATURE_VAL 'HcSV' -public class CHeapCtrl -{ - CBlkPool *bp; - U32 hc_signature, pad; - I64 locked_flags, alloced_u8s, used_u8s; - CTask *mem_task; - CMemBlk *next_mem_blk, *last_mem_blk; - CMemBlk *last_mergable; - CMemUnused *malloc_free_list; - CMemUsed *next_um, *last_um; - CMemUnused *heap_hash[MEM_HEAP_HASH_SIZE / sizeof(U8 *)]; -}; - -#help_index "Devices;Memory/Page Tables" -public class CDevGlobals -{ - CIDTEntry *idt; - U8 *mem64_ptr; - U8 *uncached_alias; //Alias of lowest 4Gig. - U8 mp_apic_ids[MP_PROCESSORS_NUM]; - CMemRange mem32_head; - CPCIDev pci_head; - U64 user_int_bitmap; -}; - -#help_index "Graphics/Color;Graphics/Device Contexts" -//Raster operations -#define ROPB_EQU 0x00 -#define ROPB_XOR 0x01 -#define ROPB_COLLISION 0x02 -#define ROPB_MONO 0x03 -#define ROPBF_HALF_RANGE_COLOR 0x10 -#define ROPBF_TWO_SIDED 0x20 -#define ROPBF_DITHER 0x40 -#define ROPBF_PROBABILITY_DITHER 0x80 - -#define ROP_EQU (ROPB_EQU << 8) -#define ROP_XOR (ROPB_XOR << 8) -#define ROP_COLLISION (ROPB_COLLISION << 8) -#define ROP_MONO (ROPB_MONO << 8) - -//These are just for $LK,"ROPF_PROBABILITY_DITHER",A="MN:ROPF_PROBABILITY_DITHER"$ -//See $LK,"DCLighting",A="MN:DCLighting"$(). -#define ROPF_HALF_RANGE_COLOR 0x1000 -#define ROPF_TWO_SIDED 0x2000 - -//These always go in the c1.rop of a CColorROPU32 -#define ROPF_DITHER 0x40000000 -#define ROPF_PROBABILITY_DITHER 0x80000000 - -#help_index "Graphics/Color" -#define TRANSPARENT 0xFF -#define BLACK 0 -#define BLUE 1 -#define GREEN 2 -#define CYAN 3 -#define RED 4 -#define PURPLE 5 -#define BROWN 6 -#define LTGRAY 7 -#define DKGRAY 8 -#define LTBLUE 9 -#define LTGREEN 10 -#define LTCYAN 11 -#define LTRED 12 -#define LTPURPLE 13 -#define YELLOW 14 -#define WHITE 15 - -#define COLORS_NUM 16 -#define COLOR_INVALID 16 -#define COLOR_MONO 0xFF - -public U16 class CColorROPU16 //Don't use this, use CColorROPU32 -{ - U8 color, rop; -}; -public U32 class CColorROPU32 -{ - CColorROPU16 c0, c1; -}; -#define COLORROP_COLORS_MASK 0x00FF00FF -#define COLORROP_NO_ROP0_MASK 0xFFFF00FF -#define COLORROP_BITS 16 -public U32 class CBGR24 -{ - U8 b, g, r, pad; -}; -public U32 class CBGR32 -{ - U8 b, g, r, a; -}; -public I64 class CBGR48 -{ - U16 b, g, r, pad; -}; - -#help_index "Keyboard Devices;Char/Input;StdIn" -#define KBD_PORT 0x60 -#define KBD_CTRL 0x64 - -#define KBDC_LED 0xED -#define KBDC_DISABLE_MS 0xA7 -#define KBDC_ENABLE_MS 0xA8 -#define KBDC_ENABLE_KBD 0xAE -#define KBDC_TYPEMATIC 0xF3 -#define KBDC_SCAN_CODES 0xF0 - -public class CKbdStateGlobals -{ - I64 scan_code, //See $LK,"scan codes",A="FI:::/Doc/CharOverview.DD"$ - last_down_scan_code, - count, //Count of keys pressed since boot. - timestamp, //Output: TSCGet when event. - new_key_timestamp; //Output: TSCGet when new key event. - CFifoU8 *fifo, *fifo2; //Private - CFifoI64 *scan_code_fifo; - U32 down_bitmap[8], //BitTest, $LK,"Bt",A="MN:Bt"$(), with a merged scan code. (Left and right shift merged, for example.) - down_bitmap2[8]; //BitTest, $LK,"Bt",A="MN:Bt"$(), with an unmerged scan code. - Bool reset, //Private: Reset KbdMouse - irqs_working; //Private -}; - -#help_index "Mouse" -public class CMouseHardStateGlobals -{ - CD3I64 pos, //Position in pixels - prescale; - CD3 scale; - F64 speed; //Output: How fast the user is moving it. - I64 timestamp, //Output: TSCGet when event. - install_attempts, //Private - pkt_size; //Private - CFifoU8 *fifo, *fifo2; //Private - Bool bttns[5], - has_wheel, - has_ext_bttns, - enabled, - event, //Private - installed, //Private - install_in_progress, //Private - irqs_working; //Private -}; - -public class CMouseStateGlobals -{ - CD3I64 pos, //Position in pixels - pos_text, //Position in text rows,cols - presnap, - offset; - CD3 scale; - F64 speed; //Output: How fast the user is moving it. - I64 timestamp; //Output: TSCGet when event. - F64 dbl_time, //Input: Time threshold for calling it a double click. - left_dbl_time, //Private - right_dbl_time; //Private - Bool lb, //Left Button - rb, //Right Button - show, - has_wheel, - left_dbl, //Private - left_down_sent, //Private - right_dbl, //Private - right_down_sent; //Private -}; - -public class CGridGlobals -{ - Bool snap format "$$CB,\"Snap Grid\"$$\n", - show format "$$CB,\"Show Grid\"$$\n", - coord format "$$CB,\"Show Coordinates\"$$\n"; - U8 pad[5]; - F64 x format "$$DA-TRM,A=\"X Spacing:%6.3f\"$$\n", - y format "$$DA-TRM,A=\"Y Spacing:%6.3f\"$$\n", - z format "$$DA-TRM,A=\"Z Spacing:%6.3f\"$$\n", - x_offset format "$$DA-TRM,A=\"X Offset :%6.3f\"$$\n", - y_offset format "$$DA-TRM,A=\"Y Offset :%6.3f\"$$\n", - z_offset format "$$DA-TRM,A=\"Z Offset :%6.3f\"$$\n", - x_speed format "$$DA-TRM,A=\"X Speed :%6.3f\"$$\n", - y_speed format "$$DA-TRM,A=\"Y Speed :%6.3f\"$$\n", - z_speed format "$$DA-TRM,A=\"Z Speed :%6.3f\"$$\n"; -}; - -#help_index "Ctrls" -#define CTRLT_GENERIC 0 -#define CTRLT_WIN_HSCROLL 1 //unique -#define CTRLT_WIN_VSCROLL 2 //unique -#define CTRLT_VIEWING_ANGLES 3 //unique - -#define CTRLF_SHOW 1 -#define CTRLF_BORDER 2 -#define CTRLF_CAPTURE_LEFT_MS 4 -#define CTRLF_CAPTURE_RIGHT_MS 8 -#define CTRLF_CLICKED 16 - -#define WSSf_SET_TO_POS 0 - -public class CWinScroll -{ - I64 min, pos, max; - U32 flags; - U8 color, pad[3]; -}; - -public class CViewAngles -{ - I64 sx, sy, sz; - F64 ax, ay, az; - CColorROPU32 cx, cy, cz, cbd, cbg, config; -}; - -public class CCtrl -{ - CCtrl *next, *last; - CTask *win_task; - I64 type, flags; - - //win pix coordinates - I64 left, right, top, bottom; - - //screen pix coordinates (derived) - I64 screen_left, screen_right, screen_top, screen_bottom; - - U8 *state; - - //called on resize - U0 (*update_derived_vals)(CCtrl *c); - U0 (*draw_it)(CDC *dc, CCtrl *c); - - Bool (*inside_ctrl)(CCtrl *c, I64 x, I64 y); //For nonbox shapes - U0 (*left_click)( CCtrl *c, I64 x, I64 y, Bool down); - U0 (*right_click)(CCtrl *c, I64 x, I64 y, Bool down); - U0 (*wheel_chg)( CCtrl *c, I64 delta); -}; - -#help_index "Menus" -public class CMenuEntry -{ - CMenuEntry *next; - CMenuEntry *sub; - U8 name[32]; - I64 message_code, arg1, arg2; - Bool checked, dir, pad[6]; -}; - -public class CMenu -{ - CMenu *next; - CMenuEntry *sub; - CTask *task; - I64 flags; - U8 attr, pad[7]; -}; - -#help_index "Task" -class CBpt -{ - CBpt *next; - U8 *addr, - val, pad[7]; -}; - -class CExcept -{ - CExcept *next, *last; - I64 handler_catch, handler_untry, - rsp, rbp, rflags, rsi, rdi, r10, r11, r12, r13, r14, r15; -}; - -class CFPU -{ - U8 body[512]; -}; - -#help_index "Job/Exe;Task/Job/Exe" -#define JOBf_WAKE_MASTER 0 -#define JOBf_FOCUS_MASTER 1 -#define JOBf_EXIT_ON_COMPLETE 2 -#define JOBf_DONT_FILTER 3 -#define JOBf_HIGHEST_PRIORITY 4 -//MP flags -#define JOBf_DONE 5 -#define JOBf_DISPATCHED 6 -#define JOBf_FREE_ON_COMPLETE 7 -#define JOBf_ADD_TO_QUE 8 - -#define JOBT_TEXT_INPUT 0 //$LK,"TaskText",A="MN:TaskText"$() Feed StdIn -#define JOBT_MESSAGE 1 //$LK,"TaskMessage",A="MN:TaskMessage"$() Post message -#define JOBT_EXE_STR 2 //$LK,"TaskExe",A="MN:TaskExe"$() Compile & execute src code text -//MP cmds -#define JOBT_CALL 3 //$LK,"JobQueue",A="MN:JobQueue"$() Tell MP to call function -#define JOBT_SPAWN_TASK 4 //$LK,"Spawn",A="MN:Spawn"$() Tell MP to spawn task - -class CJob -{ - CJob *next, *last; - CJobCtrl *ctrl; - I64 job_code, flags, message_code; - - I64 (*addr)(U8 *fun_arg); - U8 *fun_arg; - - U8 *aux_str; - I64 aux1, aux2, //Sometimes called arg1 and arg2. (Windows message param1 param2) - res; - - CTask *spawned_task, - *master_task; -}; - -#define JOBCf_LOCKED 0 -class CJobCtrl -{ - CJob *next_waiting, *last_waiting; - CJob *next_done, *last_done; - I64 flags; -}; - -#help_index "Messages" -//See $LK,"::/Demo/MessageLoop.ZC"$ -#define MESSAGE_NULL 0 -#define MESSAGE_CMD 1 -#define MESSAGE_KEY_DOWN 2 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press -#define MESSAGE_KEY_UP 3 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press -#define MESSAGE_MS_MOVE 4 //(x,y) -#define MESSAGE_MS_L_DOWN 5 //(x,y) -#define MESSAGE_MS_L_UP 6 //(x,y) -#define MESSAGE_MS_L_D_DOWN 7 //(x,y) -#define MESSAGE_MS_L_D_UP 8 //(x,y) -#define MESSAGE_MS_R_DOWN 9 //(x,y) -#define MESSAGE_MS_R_UP 10 //(x,y) -#define MESSAGE_MS_R_D_DOWN 11 //(x,y) -#define MESSAGE_MS_R_D_UP 12 //(x,y) - -//Fake messages used to send both an up and down. -#define MESSAGE_KEY_DOWN_UP -2 //Down & UP -#define MESSAGE_MS_L_DOWN_UP -5 //Down & Up -#define MESSAGE_MS_L_D_DOWN_UP -7 //Down & Up -#define MESSAGE_MS_R_DOWN_UP -9 //Down & Up -#define MESSAGE_MS_R_D_DOWN_UP -11 //Down & Up - -#help_index "Task/Settings" -#define TSF_SAME_SONG 1 -public class CTaskSettings -{ - CTaskSettings *next; - U8 *cur_dir; - I64 left, right, top, bottom; - U0 (*draw_it)(CTask *task, CDC *dc); - U0 (*task_end_cb)(); - CTask *song_task, *animate_task; - I64 scroll_x, scroll_y, scroll_z; - CBGR24 palette[COLORS_NUM]; - U32 win_inhibit; - U8 text_attr, title_src, - border_attr, border_src, - task_title[STR_LEN]; - Bool border, hide_cursor, highlight_cursor, scroll, autocomplete, pad[3]; -#assert !($$ & 7) -}; - -#help_index "Task" -//CTask.border_src -#define BDS_CONST 0 -#define BDS_CUR_DRIVE 1 -#define BDS_ED_FILENAME_DRIVE 2 - -//CTask.title_src -#define TTS_CONST 0 -#define TTS_LOCKED_CONST 1 //This is not strictly enforced -#define TTS_TASK_NAME 2 -#define TTS_ED_FILENAME 3 -#define TTS_CUR_LEX 4 - -//CTask.task_flags -//See $LK,"ST_TASK_FLAGS",A="MN:ST_TASK_FLAGS"$ -#define TASKf_TASK_LOCK 0 -#define TASKf_KILL_TASK 1 -#define TASKf_SUSPENDED 2 -#define TASKf_IDLE 3 -#define TASKf_CMD_LINE_PROMPT 4 -#define TASKf_INPUT_FILTER_TASK 5 -#define TASKf_FILTER_INPUT 6 -#define TASKf_HAS_SONG 7 -#define TASKf_DISABLE_BPTS 8 -#define TASKf_AWAITING_MESSAGE 9 -#define TASKf_BREAK_LOCKED 10 -#define TASKf_PENDING_BREAK 11 -#define TASKf_BREAK_TO_SHIFT_ESC 12 -#define TASKf_KILL_AFTER_DEBUG 13 -#define TASKf_NONTIMER_RAND 14 -#define TASKf_FLAGS_NUM 15 - -//CTask.display_flags -#define DISPLAYf_SHOW 0 -#define DISPLAYf_NOT_RAW 1 -#define DISPLAYf_SILENT 2 -#define DISPLAYf_NO_BORDER 3 -#define DISPLAYf_WIN_ON_TOP 4 -#define DISPLAYf_CHILDREN_NOT_ON_TOP 5 -#define DISPLAYf_FLAGS_NUM 6 - -#define TASK_SIGNATURE_VAL 'TskS' -#define TASK_NAME_LEN 32 -#define TASK_EXCEPT_CALLERS 8 -class CTaskStack -{ - CTaskStack *next_stack; - I64 stack_size, stack_ptr; - U0 stack_base; -}; - -#define DYING_JIFFIES ToI64(JIFFY_FREQ / 5) -class CTaskDying -{ - CTask *next, *last; - I64 wake_jiffy; -}; - -public class CTask //The Fs segment register points to current CTask. -{ - CTask *addr; //Self-addressed pointer - U32 task_signature, win_inhibit; -#assert $$ == offset(CTaskDying.wake_jiffy) - I64 wake_jiffy; - U32 task_flags, display_flags; - - CHeapCtrl *code_heap, *data_heap; - - CDoc *put_doc, *display_doc, //When double buffering, these two differ. - *border_doc; - I64 win_left, win_right, win_top, win_bottom; - - CDrive *cur_dv; - U8 *cur_dir; - - CTask *parent_task, - *next_task, *last_task, - *next_input_filter_task, *last_input_filter_task, - *next_sibling_task, *last_sibling_task, - *next_child_task, *last_child_task; - - //These are derived from left,top,right,bottom - I64 win_width, win_height, - pix_left, pix_right, pix_width, //These are in pixs, not characters - pix_top, pix_bottom, pix_height, - scroll_x, scroll_y, scroll_z; - - //These must be in this order - //for $LK,"TASK_CONTEXT_SAVE",A="FF:::/Kernel/Sched.ZC,TASK_CONTEXT_SAVE"$ and $LK,"_TASK_CONTEXT_RESTORE",A="FF:::/Kernel/Sched.ZC,_TASK_CONTEXT_RESTORE"$ - I64 rip, rflags, rsp, rsi, rax, rcx, rdx, rbx, rbp, rdi, r8, r9, r10, r11, r12, r13, r14, r15; - CCPU *gs; - CFPU *fpu_mmx; - I64 swap_counter; - - U0 (*draw_it)(CTask *task, CDC *dc); - - U8 task_title[STR_LEN], - task_name[TASK_NAME_LEN], - wallpaper_data[4096], - - title_src, border_src, - text_attr, border_attr; - U16 win_z_num, pad; - - CTaskStack *stack; - - CExcept *next_except, *last_except; - I64 except_rbp, //throw routine's RBP - except_ch; //throw(ch) - U8 *except_callers[TASK_EXCEPT_CALLERS]; - - Bool catch_except; - Bool new_answer; - U8 answer_type, pad[5]; - I64 answer; - F64 answer_time; - CBpt *bpt_list; - CCtrl *next_ctrl, *last_ctrl; - CMenu *cur_menu; - CTaskSettings *next_settings; - CMathODE *next_ode, *last_ode; - F64 last_ode_time; - CHashTable *hash_table; - - CJobCtrl server_ctrl; - CCompCtrl *next_cc, *last_cc; - CHashFun *last_fun; - - U0 (*task_end_cb)(); - CTask *song_task, *animate_task; - I64 rand_seed, - task_num, - fault_num, fault_err_code; - CTask *popup_task, - *debug_task; - CWinScroll horz_scroll, vert_scroll; - - I64 user_data; -#assert !($$ & 7) -}; - -class CTSS -{ - U32 res1; - I64 rsp0, rsp1, rsp2, res2, - ist1, ist2, ist3, ist4, ist5, ist6, ist7, res3; - U16 res4, io_map_offset; - U8 io_map[0x10000/8]; - I64 *st0, *st1, *st2; - U16 tr, tr_ring3; -}; - -#define ans (Fs->answer) -#define ansf (Fs->answer(F64)) - -#define _RAX Fs->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 - -#help_index "MultiCore" -#define CPUf_RAN_A_TASK 0 -#define CPUf_DYING_TASK_QUE 1 - -public class CCPU //The Gs segment register points to current CCPU. -{ - CCPU *addr; //Self-addressed pointer - I64 num, cpu_flags, - startup_rip, - idle_pt_hits; - F64 idle_factor; - I64 total_jiffies; - CTask *executive_task, *idle_task; - I64 tr, //task reg - swap_counter; - U0 (*profiler_timer_irq)(CTask *task); - CTaskDying *next_dying, *last_dying; - I64 kill_jiffy; - CTSS *tss; - I64 start_stack[16]; -#assert !($$ & 7) -}; - -#help_index "Memory/Page Tables" -#define MEM_MIN_MEG 256 //256 Meg minimum. - -#define SYS_FIXED_AREA 0x100000 -#define SYS_16MEG_AREA_LIMIT 0x1000000 -public class CSysFixedArea -{ - CFPU init_fpu_mmx; - CCPU boot_cpu; - CTask system; - CBlkPool sys_code_bp; - CHeapCtrl system_hc; - $$ = ($$ + 0x1000 - 1) & -0x1000; -}; - -#help_index "Char" -#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_ESC 0x1B -#define CH_SHIFT_ESC 0x1C -#define CH_SPACE 0x20 - -#define ST_ERR_ST "$$RED$$$$BK,1$$ERROR:$$FG$$$$BK,0$$ " -#define ST_WARN_ST "$$LTRED$$$$BK,1$$WARNING:$$FG$$$$BK,0$$ " - -//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_MS_L_DOWN 16 -#define SCf_MS_R_DOWN 17 -#define SCf_DELETE 18 -#define SCf_INS 19 -#define SCf_NO_SHIFT 30 -#define SCf_KEY_DESC 31 -#define SCF_E0_PREFIX (1 << SCf_E0_PREFIX) -#define SCF_KEY_UP (1 << SCf_KEY_UP) -#define SCF_SHIFT (1 << SCf_SHIFT) -#define SCF_CTRL (1 << SCf_CTRL) -#define SCF_ALT (1 << SCf_ALT) -#define SCF_CAPS (1 << SCf_CAPS) -#define SCF_NUM (1 << SCf_NUM) -#define SCF_SCROLL (1 << SCf_SCROLL) -#define SCF_NEW_KEY (1 << SCf_NEW_KEY) -#define SCF_MS_L_DOWN (1 << SCf_MS_L_DOWN) -#define SCF_MS_R_DOWN (1 << SCf_MS_R_DOWN) -#define SCF_DELETE (1 << SCf_DELETE) -#define SCF_INS (1 << SCf_INS) -#define SCF_NO_SHIFT (1 << SCf_NO_SHIFT) -#define SCF_KEY_DESC (1 << SCf_KEY_DESC) - -//ZealOS places a 1 in bit 7 for -//keys with an E0 prefix. -//See $LK,"::/Doc/CharOverview.DD"$ and $LK,"KbdHandler",A="MN:KbdHandler"$(). -#define SC_ESC 0x01 -#define SC_BACKSPACE 0x0E -#define SC_TAB 0x0F -#define SC_ENTER 0x1C -#define SC_SHIFT 0x2A -#define SC_CTRL 0x1D -#define SC_ALT 0x38 -#define SC_CAPS 0x3A -#define SC_NUM 0x45 -#define SC_SCROLL 0x46 -#define SC_CURSOR_UP 0x48 -#define SC_CURSOR_DOWN 0x50 -#define SC_CURSOR_LEFT 0x4B -#define SC_CURSOR_RIGHT 0x4D -#define SC_PAGE_UP 0x49 -#define SC_PAGE_DOWN 0x51 -#define SC_HOME 0x47 -#define SC_END 0x4F -#define SC_INS 0x52 -#define SC_DELETE 0x53 -#define SC_F1 0x3B -#define SC_F2 0x3C -#define SC_F3 0x3D -#define SC_F4 0x3E -#define SC_F5 0x3F -#define SC_F6 0x40 -#define SC_F7 0x41 -#define SC_F8 0x42 -#define SC_F9 0x43 -#define SC_F10 0x44 -#define SC_F11 0x57 -#define SC_F12 0x58 -#define SC_PAUSE 0x61 -#define SC_GUI 0xDB -#define SC_PRINTSCREEN1 0xAA -#define SC_PRINTSCREEN2 0xB7 - -#help_index "Char;Debugging/Raw Output;TextBase Layer/Char" -//text.raw_flags -#define RAWF_IN_DOLLAR 1 -#define RAWF_LAST_DOLLAR 2 -#define RAWF_SHOW_DOLLAR 4 -#define RAWF_SCROLL 8 - -public class CTextGlobals -{ - I64 raw_col, raw_flags; - U32 *raw_screen, *fb_alias; - I64 rows, cols; //Use TEXT_ROWS,TEXT_COLS - U64 *font, *aux_font, screen_size, buffer_size; - U8 border_chars[16]; - Bool is_fb_busy; -}; - -#define FONT_WIDTH 8 -#define FONT_HEIGHT 8 - -#help_index "Graphics" -//z-values less than zero are in front of screen and not drawn. -//we want to shift all Z-values into a drawable range. -//GR_Z_ALL is set to half of the Z-range which is an I32. -#define GR_Z_ALL (I32_MAX/2) - -#help_index "Graphics/Device Contexts" -//Low 8 bits reserved for flags that go into saved bitmaps -#define DCF_PALETTE 1 -#define DCF_NO_TRANSPARENTS 2 //Can be used to optimized $LK,"GrBlot",A="MN:GrBlot"$(). - -#define DCF_TRANSFORMATION 0x100 - -//See $LK,"DCSymmetrySet",A="MN:DCSymmetrySet"$() or $LK,"DCSymmetry3Set",A="MN:DCSymmetry3Set"$() -#define DCF_SYMMETRY 0x200 - -//Must be used with DCF_SYMMETRY set also. -//See $LK,"::/Demo/Games/BigGuns.ZC"$ -#define DCF_JUST_MIRROR 0x400 - -#define DCF_LOCATE_NEAREST 0x800 -#define DCF_DONT_DRAW 0x1000 -#define DCF_ALIAS 0x2000 -#define DCF_SCREEN_BITMAP 0x4000 -#define DCF_FILL_NOT_COLOR 0x8000 -#define DCF_RECORD_EXTENTS 0x10000 -#define DCF_ON_TOP 0x20000 - -//$LK,"DCSave",A="MN:DCSave"$() flags. -#define DCSF_PALETTE_GET 1 - -#define DCS_SIGNATURE_VAL 'DvCS' - -class CGrSym -{ - I32 sx, sy, sz, pad; -//Normal of symmetry plane - I64 snx, sny, snz; -}; - -public class CDC -{ - U0 start; - CDate cdt; - I32 x0, y0, - width, width_internal, - height, - flags; - U0 end; - CBGR24 palette[COLORS_NUM]; - - //public (Change directly) - CColorROPU32 color, - bkcolor, //Set for use with $LK,"ROP_COLLISION",A="MN:ROP_COLLISION"$ - color2; //Internally used for $LK,"GrFloodFill",A="MN:GrFloodFill"$() - CD3I32 ls; //Light source (should be normalized to 65536). - - //dither_probability_u16 is basically a U16. - //It is activated by $LK,"ROPF_PROBABILITY_DITHER",A="MN:ROPF_PROBABILITY_DITHER"$. - //0x0000 =100% color.c0 - //0x8000 =50% color.c0 50% color.c1 - //0x10000=100% color.c1 - //See $LK,"::/Demo/Graphics/SunMoon.ZC"$ and $LK,"::/Demo/Graphics/Shading.ZC"$. - U64 dither_probability_u16; - - CDC *brush; - - //Set with $LK,"DCMat4x4Set",A="MN:DCMat4x4Set"$(). $LK,"Free",A="MN:Free"$() before setting. - I64 *r, //rotation matrix of quads decimal in lo - r_norm; //shifted 32 bits. Used for scaling thick - - //public (Change directly) - I32 x, y, z, - thick; - - //Can be changed from the default $LK,"DCTransform",A="MN:DCTransform"$() - U0 (*transform)(CDC *dc, I64 *x, I64 *y, I64 *z); - - //Can be changed from the default $LK,"DCLighting",A="MN:DCLighting"$() - U0 (*lighting)(CDC *dc, CD3I32 *p1, CD3I32 *p2, CD3I32 *p3, CColorROPU32 color); - - //Set by $LK,"DCSymmetrySet",A="MN:DCSymmetrySet"$() or $LK,"DCSymmetry3Set",A="MN:DCSymmetry3Set"$() - CGrSym sym; - - I32 cur_x, cur_y, cur_z, pad; - I64 collision_count; - - I64 nearest_dist, - min_x, max_x, min_y, max_y; //Set by $LK,"DCF_RECORD_EXTENTS",A="MN:DCF_RECORD_EXTENTS"$ (screen coordinates) - - U32 dc_signature, pad; - CTask *mem_task, *win_task; - CDC *alias; - U8 *body; - - //Set by $LK,"DCDepthBufAlloc",A="MN:DCDepthBufAlloc"$() - I32 *depth_buf; - I64 db_z; //private -#assert !($$ & 7) -}; - -#define "Char/Input;StdIn" -//StrGet flags -#define SGF_SHIFT_ESC_EXIT 1 //This kills task on -#define SGF_WITH_NEW_LINE 2 - -#define "Char/Operations" -//Flags for StrUtil and MStrUtil -#define SUF_REM_CTRL_CHARS 0x001 -#define SUF_REM_LEADING 0x002 -#define SUF_REM_TRAILING 0x004 -#define SUF_REM_SPACES 0x008 -#define SUF_SINGLE_SPACE 0x010 -#define SUF_TO_UPPER 0x020 -#define SUF_TO_LOWER 0x040 -#define SUF_S2T 0x080 -#define SUF_T2S 0x100 // Only works with MStrUtil -#define SUF_SCALE_INDENT 0x200 -#define SUF_SAFE_DOLLAR 0x400 - -//Flags for StrFind -#define SFF_IGNORE_CASE 1 -#define SFF_WHOLE_LABELS_BEFORE 2 -#define SFF_WHOLE_LABELS_AFTER 4 -#define SFG_WHOLE_LABELS (SFF_WHOLE_LABELS_BEFORE | SFF_WHOLE_LABELS_AFTER) - -//Flags for ListMatch -#define LMF_IGNORE_CASE 1 -#define LMF_EXACT 2 - -#help_index "Keyboard Devices/System" -#define KDF_HAS_DESCS 1 -class CKeyDevEntry -{ - CKeyDevEntry *next, *last; - I64 priority, flags; - Bool (*put_key)(I64 ch, I64 sc); - Bool (*put_s)(U8 *st); -}; - -class CKeyDevGlobals -{ - CKeyDevEntry put_key_head; - U0 (**fp_ctrl_alt_cbs)(I64 sc); - I64 ctrl_alt_in_irq_flags, - **ctrl_alt_ret_addr; //address of ret address on stack in kbd irq - U8 **ctrl_alt_no_shift_descs, **ctrl_alt_shift_descs, - desc[STR_LEN], - *handler; -}; - -#help_index "Sound" -#define PCSPKR 0x61 -#help_index "ScreenCast;Sound/AU Files" -public class CAUData -{//Format of AU files - CDate cdt; - I8 ona; -}; - -class CSoundData -{//Format recorded in mem - CSoundData *next, *last; - F64 tS; - I8 ona; -}; - -public class CScreenCastGlobals -{ - CSoundData sound_head; - CDate t0_now; - F64 t0_tS; - U8 *print_format; - CDC *dc, *dc2_alias; - Bool record, just_audio; - I8 ona; -}; - -#help_index "Debugging/FunSeg" -#define FUN_SEG_CACHE_SIZE 256 -class CFunSegCache -{ - I64 base, limit; - F64 time_stamp; - U8 str[1]; //FUN_SEG_CACHE_STR_LEN -$$ = 64; -}; -#define FUN_SEG_CACHE_STR_LEN (sizeof(CFunSegCache) - offset(CFunSegCache.str)) - -#help_index "Debugging" -class CMPCrash -{ - I64 cpu_num; - CTask *task; - I64 rip; - U8 *message; - I64 message_num; -}; - -public class CDebugGlobals -{ - CTask *focus_task; - U8 *message; - I64 message_num; - CMPCrash *mp_crash; - U8 *int_fault_code, - *fix_file_line; - CFunSegCache *fun_seg_cache; - I64 fun_seg_cache_index; - Bool panic; -}; - -#help_index "Boot" -//Boot related -#define BOOT_RAM_BASE 0x07C00 -#define BOOT_RAM_LIMIT 0x97000 -#define BOOT_STACK_SIZE BLK_SIZE - -#define BOOT_SRC_NULL 0 -#define BOOT_SRC_ROM 1 -#define BOOT_SRC_RAM 2 -#define BOOT_SRC_HARDDRIVE 3 -#define BOOT_SRC_DVD 4 - -// $LK,"In",A="MN:In"$("") StdIn for call to $LK,"BootHDIns",A="MN:BootHDIns"$(). -#define STD_DISTRO_DVD_CONFIG "TB\nScale2Mem(2048,0x40000)\nT\n\n\n\n" - -#help_index "Registry" -//Registry sys_message_flags. $LK,"RegOneTimePopUp",A="MN:RegOneTimePopUp"$() -#define ARf_FLOODFILL 0 -#define ARf_CSPRITE_INS_CLIP 1 -#define ARf_PLANAR_SYMMETRY 2 -#define ARf_PSALMODY_JUKEBOX 3 -#define ARf_MESH_ED 4 -#define ARf_CSPRITE_PTS_RECTANGLES 5 -#define ARf_MANAGE_SLIDER 6 - -#help_index "Misc/Progress Bars" -#define PROGRESS_BARS_NUM 4 -#define PROGRESS_DESC_LEN (64 - 8 - 8) -class CProgress -{ - I64 val, max; - F64 t0, tf; - U8 desc[PROGRESS_DESC_LEN]; -}; - -#help_index "Char/Operations" -#define PRINTF_PAD_ZERO 0x001 -#define PRINTF_LEFT_JUSTIFY 0x002 -#define PRINTF_TRUNCATE 0x004 -#define PRINTF_COMMA 0x008 -#define PRINTF_DOLLAR 0x010 -#define PRINTF_SLASH 0x020 -#define PRINTF_QUESTION 0x040 -#define PRINTF_AUX_FORMAT_NUM 0x080 -#define PRINTF_DECIMAL 0x100 -#define PRINTF_NEG 0x200 -#define PRINTF_NEG_E 0x400 -#define PRINTF_NEG_AUX_FORMAT_NUM 0x800 - -#help_index "" +// Main ZealOS header + +#help_index "" +extern class CAOT; +extern class CAOTHeapGlobal; +extern class CAOTImportExport; +extern class CCPU; +extern class CDC; +extern class CDirContext; +extern class CDoc; +extern class CFile; +extern class CHashClass; +extern class CHashFun; +extern class CHeapCtrl; +extern class CIntermediateCode; +extern class CJobCtrl; +extern class CTask; + +#define NULL 0 +#define TRUE 1 +#define FALSE 0 +#define ON 1 +#define OFF 0 +#define NONE 0 //for use in default arguments +#define I8_MIN (-0x80) +#define I8_MAX 0x7F +#define U8_MIN 0 +#define U8_MAX 0xFF +#define I16_MIN (-0x8000) +#define I16_MAX 0x7FFF +#define U16_MIN 0 +#define U16_MAX 0xFFFF +#define I32_MIN (-0x80000000) +#define I32_MAX 0x7FFFFFFF +#define U32_MIN 0 +#define U32_MAX 0xFFFFFFFF +#define I64_MIN (-0x8000000000000000) +#define I64_MAX 0x7FFFFFFFFFFFFFFF +#define U64_MIN 0 +#define U64_MAX 0xFFFFFFFFFFFFFFFF +#define INVALID_PTR I64_MAX +#define STR_LEN 144 + +//(Int to F64 conversion is signed) +//Turn off 80-bit float constants with $LK,"OPTf_NO_BUILTIN_CONST",A="MN:OPTf_NO_BUILTIN_CONST"$. +#define U64_F64_MAX (0x43F0000000000000(F64)) +#define F64_MAX (0x7FEFFFFFFFFFFFFF(F64)) +#define F64_MIN (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)) + +#help_index "Data Types/Simple" +//ZealC union structure is treated as a whole if no member is specified, similar to bit fields. +//See $LK,"::/Demo/SubIntAccess.ZC"$. + +U16i union U16 +{ + I8i i8[2]; + U8i u8[2]; +}; + +I16i union I16 +{ + I8i i8[2]; + U8i u8[2]; +}; + +U32i union U32 +{ + I8i i8[4]; + U8i u8[4]; + I16 i16[2]; + U16 u16[2]; +}; + +I32i union I32 +{ + I8i i8[4]; + U8i u8[4]; + I16 i16[2]; + U16 u16[2]; +}; + +U64i union U64 +{ + I8i i8[8]; + U8i u8[8]; + I16 i16[4]; + U16 u16[4]; + I32 i32[2]; + U32 u32[2]; +}; + +I64i union I64 +{ + I8i i8[8]; + U8i u8[8]; + I16 i16[4]; + U16 u16[4]; + I32 i32[2]; + U32 u32[2]; +}; + +#help_index "Math/Complex;Data Types/Complex" +public class Complex +{ + F64 x, y; +}; + +#help_index "Data Types/Circular Queue" +public class CQueue +{ + CQueue *next, *last; +}; + +#help_index "Graphics/Data Types/D3I32;Math/Data Types/D3I32;Data Types/D3I32" +public class CD3I32 //Three dimensional I32 pt +{ + I32 x, y, z; +}; +public class CQueueD3I32 //Queue of three dimensional I32 pts +{ + CQueueD3I32 *next, *last; + CD3I32 p; +}; +#help_index "Math/Data Types;Data Types" +public class CD2I32 //Two dimensional I32 pt +{ + I32 x, y; +}; +public class CD2I64 //Two dimensional I64 pt +{ + I64 x, y; +}; +public class CD3I64 //Three dimensional I64 pt +{ + I64 x, y, z; +}; +public class CD2 //Two dimensional F64 pt +{ + F64 x, y; +}; + +#help_index "Math/CD3;Data Types/CD3" +public class CD3 //Three dimensional F64 pt +{ + F64 x, y, z; +}; + +#help_index "Data Types/Queue Vector" +#define QUE_VECT_U8_COUNT 512 +public class CQueueVectU8 +{ + CQueueVectU8 *next, + *last; + I64 total_count, + node_count, + min_idx; + U8 body[QUE_VECT_U8_COUNT]; +}; + +#help_index "Data Types/Fifo" +public class CFifoU8 +{ + U8 *buf; + I64 mask, + in_ptr, + out_ptr; +}; +public class CFifoI64 +{ + I64 *buf, + mask, + in_ptr, + out_ptr; +}; +#help_index "Date/CMOS" +#define CMOS_SEL 0x70 //select which register to access using this port +#define CMOS_DATA 0x71 //read from or write to register using this port + +//CMOS registers +#define CMOSR_SEC 0x0 +#define CMOSR_MIN 0x2 +#define CMOSR_HOUR 0x4 +#define CMOSR_DAY_OF_WEEK 0x6 +#define CMOSR_DAY_OF_MONTH 0x7 +#define CMOSR_MONTH 0x8 +#define CMOSR_YEAR 0x9 +#define CMOSR_STATUS_A 0xA +#define CMOSR_STATUS_B 0xB + +//CMOS status flags +#define CMOSF_BINARY (1 << 2) +#define CMOSF_UPDATING (1 << 7) + +#help_index "Date/CDate" +#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; +}; + +#help_index "Date;Date/CDate" +public class CDateStruct +{ + U8 sec10000, + sec100, + sec, + min, + hour, + day_of_week, + day_of_mon, + mon; + I32 year; +}; + +#help_index "Math/ODE" +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, //Point to entries in $LK,"CMathODE",A="MN:CMathODE"$.state[] + *DstateDt; //Point to entries in $LK,"CMathODE",A="MN:CMathODE"$.DstateDt[] + + U0 start; + U32 flags, + num; + F64 mass, + drag_profile_factor; + U0 saved_state; + F64 x, y, z, + DxDt, DyDt, DzDt; + U0 end; +}; + +#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; + U32 flags, num, end1_num, end2_num; + F64 const, rest_len; + U0 end; +}; + +//Ordinary Differential Equations +#define ODEF_HAS_MASSES 1 +#define ODEF_PAUSED 2 +#define ODEF_STARTED 4 +#define ODEF_BUSY 8 + +#define ODEf_HAS_MASSES 0 +#define ODEf_PAUSED 1 +#define ODEf_STARTED 2 +#define ODEf_BUSY 3 + +public class CMathODE +{ + CMathODE *next, *last; + I64 flags, n, n_internal; + CMass *next_mass, *last_mass; + CSpring *next_spring, *last_spring; + F64 drag_v, //drag proportional to velocity + drag_v2, //drag proportional to velocity squared + drag_v3, //drag proportional to velocity cubed + acceleration_limit, //This clips acceleration + base_t, + t, t_scale, + h, h_min, h_max; + + //This is not precise, just a ballpark. + //ZealOS CMathODE's are for video games + //not science. It bails if it takes + //too long. + F64 min_tolerance, max_tolerance; + + F64 tolerance_internal, + *array_base, + *state, + *state_internal, + *DstateDt, + *state_scale, + *initial_state, + *tmp0, *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6, *tmp7; + CTask *mem_task, *win_task; + U0 (*derive)( CMathODE *o, F64 t, F64 *state, F64 *DstateDt); + U0 (*mp_derive)(CMathODE *o, F64 t, I64 cpu_num, F64 *state, F64 *DstateDt); //If break into parallel pieces. + CTask **slave_tasks; + I64 mp_not_done_flags; + F64 mp_t, *mp_state, *mp_DstateDt; + + I64 user_data; +}; + +#help_index "Processor" +//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_DIV_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_DEBUG 0x32 +//See $LK,"ST_INT_NAMES",A="MN:ST_INT_NAMES"$ + +//You might want to start backward from +//0xFF for your own interrupts. +//See $LK+PU,"IntEntryAlloc",A="MN:IntEntryAlloc"$. +#define I_USER 0x40 + +#define MP_PROCESSORS_NUM 128 + +//Control register flag bits +#define CR0f_PE 0 //Protection Enable (Protected mode) +#define CR0f_MP 1 //Monitor coprocessor +#define CR0f_EM 2 //Emulation of coprocessor +#define CR0f_TS 3 //Task switched, some irrelevant x87 task management stuff +#define CR0f_NE 5 //Numeric error +#define CR0f_PG 31//Enable paging + +#define CR0F_PE (1 << CR0f_PE) +#define CR0F_NE (1 << CR0f_NE) + +#define CR4f_PAE 5 //Physical Address Extension, required by long mode +#define CR4f_PGE 7 //Page-Global Enable +#define CR4f_OSFXSR 9 //FXSAVE/FXRSTOR support enabled + +#define CR4F_PAE (1 << CR4f_PAE) +#define CR4F_PGE (1 << CR4f_PGE) +#define CR4F_OSFXSR (1 << CR4f_OSFXSR) + +#define SYS_START_CR0 (CR0F_PE | CR0F_NE) + +#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 RFLAGG_START 0x0000 +#define RFLAGG_NORMAL (1 << RFLAGf_INT) + +//Global Descriptor Table +class CGDTEntry +{ + U64 lo, hi; +}; + +class CGDT +{ + CGDTEntry null, + boot_ds, + boot_cs, + cs32, + cs64, //The $LK,"Charter",A="FI:::/Doc/Charter.DD"$ says just ring-0. + cs64_ring3, //$LK,"Ring3",A="FI:::/Demo/Lectures/Ring3.ZC"$, in case you want to play around. + ds, + ds_ring3, + tr[MP_PROCESSORS_NUM], + tr_ring3[MP_PROCESSORS_NUM]; +}; + +//Interrupt Descriptor Table +class CIDTEntry +{ + U16 offset_low, + seg_select; + U8 ist, + type_attr; + U16 offset_mid; + U32 offset_hi, + zero; +}; +#assert sizeof(CIDTEntry) == 16 + +class CSysLimitBase +{ + U16 limit; //Offset of last byte, not size. + U8 *base; //&GDT or &IDT +}; + +#help_index "Memory/Info" +#define MEM_E820_ENTRIES_NUM 256 +#define MEM_E820t_USABLE 1 +#define MEM_E820t_RESERVED 2 +#define MEM_E820t_ACPI 3 +#define MEM_E820t_ACPI_NVS 4 +#define MEM_E820t_BAD_MEM 5 +#define MEM_E820t_PERM_MEM 7 + +class CMemE820 +{ + U8 *base; + I64 len; + U8 type, pad[3]; +}; + +#help_index "Compiler/Internal" +//Loader flags +#define LDF_NO_ABSS 1 +#define LDF_JUST_LOAD 2 +#define LDF_SILENT 4 + +#define ZXE_SIGNATURE_VAL 'ZXE' // Zeal Executable +class CZXE +{// $LK,"ZXE Header Generation",A="FF:::/Compiler/CMain.ZC,16 ALIGN"$ by compiler. + U16 jmp; + U8 module_align_bits, + reserved; + U32 signature; + I64 org, + patch_table_offset, //$LK,"Patch Table Generation",A="FF:::/Compiler/CMain.ZC,IET_ABS_ADDR"$ + file_size; +}; + +class CPatchTableAbsAddr +{ + U8 eit_abs_addr; //$LK,"IET_ABS_ADDR",A="MN:IET_ABS_ADDR"$ + U32 abs_address_count; + U8 zero; + U32 abs_address[1]; +}; + +//$LK,"CAOTImportExport",A="MN:CAOTImportExport"$ Types. Used in PatchTable. +#define IET_END 0 +//reserved +#define IET_REL_I0 2 //Fictitious +#define IET_IMM_U0 3 //Fictitious +#define IET_REL_I8 4 +#define IET_IMM_U8 5 +#define IET_REL_I16 6 +#define IET_IMM_U16 7 +#define IET_REL_I32 8 +#define IET_IMM_U32 9 +#define IET_REL_I64 10 +#define IET_IMM_I64 11 +#define IEF_IMM_NOT_REL 1 +//reserved +#define IET_REL32_EXPORT 16 +#define IET_IMM32_EXPORT 17 +#define IET_REL64_EXPORT 18 //Not implemented +#define IET_IMM64_EXPORT 19 //Not implemented +#define IET_ABS_ADDR 20 +#define IET_CODE_HEAP 21 //Not really used +#define IET_ZEROED_CODE_HEAP 22 //Not really used +#define IET_DATA_HEAP 23 +#define IET_ZEROED_DATA_HEAP 24 //Not really used +#define IET_MAIN 25 + +#help_index "Graphics/VBE" + +#define BLACK32 0x000000 +#define WHITE32 0xFFFFFF +#define VBE_MODES_NUM 32 + +class CVBEInfo +{ + U8 signature[4]; + U16 version; + U32 oem, + capabilities, + video_modes; + U16 total_memory, + software_revision; + U32 vendor, + product_name, + product_revision; + U8 reserved[222], + oem_data[256]; +}; +#assert sizeof(CVBEInfo) == 512 + +class CVBEMode +{ + U16 attributes, + pad[7], + pitch, + width, + height; + U8 pad[3], + bpp, + pad, + memory_model, + pad[12]; + U32 framebuffer; + U16 pad[9]; + U32 max_pixel_clock; + U8 reserved[190]; +}; +#assert sizeof(CVBEMode) == 256 + +class CVideoInfo +{ + U16 width; + U16 height; +}; + +#define ZEALBOOTER_LIMINE_SIGNATURE_1 0xaa23c08ed10bd4d7; // See $LK+PU,"CORE0_32BIT_INIT",A="FF:::/Kernel/KStart32.ZC,JMP @@"$ +#define ZEALBOOTER_LIMINE_SIGNATURE_2 0xf6ceba7d4b74179a; // + +#help_index "Boot" +class CKernel +{//Must match $LK,"OSStartUp",A="FF:::/Kernel/KStart16.ZC,MEM_BOOT_BASE"$ + CZXE h; + U32 jmp, + boot_src, + boot_blk, + boot_patch_table_base, + sys_run_level; + CDate compile_time; + + U0 start; + U32 boot_base; + U16 mem_E801[2]; + CMemE820 mem_E820[MEM_E820_ENTRIES_NUM]; + U64 mem_physical_space; + CSysLimitBase sys_gdt_ptr; + U16 sys_pci_buses; + ;$$ = ($$ + 15) & -16; + CGDT sys_gdt; + U64 sys_framebuffer_addr; + U64 sys_framebuffer_width; + U64 sys_framebuffer_height; + U64 sys_framebuffer_pitch; + U8 sys_framebuffer_bpp; + U64 sys_smbios_entry; + U64 sys_disk_uuid[2]; + U32 sys_boot_stack; + Bool sys_is_uefi_booted; + CVideoInfo sys_framebuffer_list[VBE_MODES_NUM]; +}; + +//Run-Levels +#define RLf_16BIT 0 +#define RLf_VESA 1 +#define RLf_32BIT 2 +#define RLf_PATCHED 3 +#define RLf_16MEG_SYS_CODE_BP 4 +#define RLf_64BIT 5 +#define RLf_16MEG_SYSTEM_HEAP_CTRL 6 +#define RLf_FULL_HEAPS 7 +#define RLf_RAW 8 +#define RLf_INTERRUPTS 9 +#define RLf_BLKDEV 10 +#define RLf_MP 11 +#define RLf_COMPILER 12 +#define RLf_DOC 13 +#define RLf_WINMGR 14 +#define RLf_REGISTRY 15 +#define RLf_HOME 16 +#define RLf_AUTOCOMPLETE 17 +#define RLf_SYSTEM_SERVER 18 +#define RLf_ONCE_SYSTEM 19 +#define RLf_ONCE_USER 20 + +#define RLF_16BIT (1 << RLf_16BIT) +#define RLF_VESA (1 << RLf_VESA) +#define RLF_32BIT (1 << RLf_32BIT) +#define RLF_PATCHED (1 << RLf_PATCHED) +#define RLF_16MEG_SYS_CODE_BP (1 << RLf_16MEG_SYS_CODE_BP) +#define RLF_64BIT (1 << RLf_64BIT) +#define RLF_16MEG_SYSTEM_HEAP_CTRL (1 << RLf_16MEG_SYSTEM_HEAP_CTRL) +#define RLF_FULL_HEAPS (1 << RLf_FULL_HEAPS) +#define RLF_RAW (1 << RLf_RAW) +#define RLF_INTERRUPTS (1 << RLf_INTERRUPTS) +#define RLF_BLKDEV (1 << RLf_BLKDEV) +#define RLF_MP (1 << RLf_MP) +#define RLF_COMPILER (1 << RLf_COMPILER) +#define RLF_DOC (1 << RLf_DOC) +#define RLF_WINMGR (1 << RLf_WINMGR) +#define RLF_REGISTRY (1 << RLf_REGISTRY) +#define RLF_HOME (1 << RLf_HOME) +#define RLF_AUTOCOMPLETE (1 << RLf_AUTOCOMPLETE) +#define RLF_SYSTEM_SERVER (1 << RLf_SYSTEM_SERVER) +#define RLF_ONCE_SYSTEM (1 << RLf_ONCE_SYSTEM) +#define RLF_ONCE_USER (1 << RLf_ONCE_USER) + +#help_index "Processor" + +//Model specific registers. +#define IA32F_SCE 0x001 +#define IA32F_LME 0x100 +#define IA32_LAPIC_BASE 0x01B +#define IA32_EFER 0xC0000080 +#define IA32_FS_BASE 0xC0000100 +#define IA32_GS_BASE 0xC0000101 + +//Programmable Interrupt Controller +#define PIC_1 0x20 +#define PIC_1_DATA 0x21 +#define PIC_2 0xA0 +#define PIC_2_DATA 0xA1 +#define PIC_INIT 0x11 +#define PIC_EOI 0x20 //End of interrupt + +//Local Advanced Programmable Interrupt Controller +#define LAPIC_BASE 0xFEE00000 +#define LAPIC_APIC_ID (LAPIC_BASE + 0x020) +#define LAPIC_APIC_VERSION (LAPIC_BASE + 0x030) +#define LAPIC_TASK_PRIORITY (LAPIC_BASE + 0x080) +#define LAPIC_ARBITRATION_PRIORITY (LAPIC_BASE + 0x090) +#define LAPIC_PROCESSOR_PRIORITY (LAPIC_BASE + 0x0A0) +#define LAPIC_EOI (LAPIC_BASE + 0x0B0) +#define LAPIC_LOG_DST (LAPIC_BASE + 0x0D0) +#define LAPIC_DFR (LAPIC_BASE + 0x0E0) +#define LAPIC_LDR (LAPIC_BASE + 0x0D0) + +#define LAPICF_APIC_ENABLED 0x100 +#define LAPIC_SVR (LAPIC_BASE + 0x0F0) + +#define LAPIC_ISR (LAPIC_BASE + 0x100) +#define LAPIC_TMR (LAPIC_BASE + 0x180) +#define LAPIC_IRR (LAPIC_BASE + 0x200) +#define LAPIC_ICR_LOW (LAPIC_BASE + 0x300) +#define LAPIC_ICR_HIGH (LAPIC_BASE + 0x310) + +#define LAPIC_LVT_TIMER (LAPIC_BASE + 0x320) +#define LAPIC_LVT_THERMAL (LAPIC_BASE + 0x330) +#define LAPIC_LVT_PERF (LAPIC_BASE + 0x340) +#define LAPIC_LVT_LINT0 (LAPIC_BASE + 0x350) +#define LAPIC_LVT_LINT1 (LAPIC_BASE + 0x360) +#define LAPIC_LVT_ERR (LAPIC_BASE + 0x370) + +#define MPN_VECT 0x97 +#define MP_VECT_ADDR (MPN_VECT * 0x1000) + +//I/O APIC Memory mapped window +#define IOAPIC_REG 0xFEC00000 //U8 +#define IOAPIC_DATA 0xFEC00010 //U32 +//I/O APIC Registers +#define IOAPICID 0x00 +#define IOAPICVER 0x01 +#define IOAPICARB 0x02 +#define IOREDTAB 0x10 + +class CAP16BitInit +{//AP Multicore + U32 jmp; + CSysLimitBase ap_gdt_ptr; +}; + +#help_index "Time/PIT" +#help_file "::/Doc/PIT.DD" +//Programmable Interval Timer +#define PIT_0 0x40 +#define PIT_2 0x42 +#define PIT_CMD 0x43 + +#define PIT_CMDF_OPMODE_RATE_GEN 0x04 +#define PIT_CMDF_OPMODE_SQUARE_WAVE 0x06 +#define PIT_CMDF_ACCESS_WORD 0x30 +#define PIT_CMDF_CHANNEL0 0x00 +#define PIT_CMDF_CHANNEL2 0x80 + +public class CCountsGlobals +{ + I64 jiffies, //$LK,"JIFFY_FREQ",A="MN:JIFFY_FREQ"$ + timer, //$LK,"SYS_TIMER_FREQ",A="MN:SYS_TIMER_FREQ"$. Use $LK,"SysTimerRead",A="MN:SysTimerRead"$(). + time_stamp_freq, + time_stamp_kHz_freq, + time_stamp_freq_initial; //Initial freq, sampled once at boot time. + Bool time_stamp_calibrated; +}; + +#define JIFFY_FREQ 1000 // Hz +#define CDATE_FREQ 49710 // Hz +#define SYS_TIMER_FREQ (18333 * 65536 / 1000) //Hz +#define SYS_TIMER0_PERIOD (65536 * 182 / 10 / JIFFY_FREQ) + +#help_index "Call" +//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 + +class CRAXRBXRCXRDX +{ + I64 rax, rbx, rcx, rdx; +}; + +//Asm callable function pointers. +//They work with $LK,"CallExtNum",A="MN:CallExtNum"$() when calling from ZealC. +#define EXT_WIN_TO_TOP 0 +#define EXT_WIN_FOCUS 1 +#define EXT_HEAPLOG_MALLOC 2 +#define EXT_HEAPLOG_FREE 3 +#define EXT_DEBUG_RESUME 4 +#define EXT_EXTS_NUM 5 + +#help_index "Processor" +#define DEFAULT_CACHE_LINE_WIDTH 128 + +//Semaphores +class CSema +{ + Bool val, pad[DEFAULT_CACHE_LINE_WIDTH - 1]; +}; +#define SEMA_DEBUG 0 +#define SEMA_RECORD_MACRO 1 +#define SEMA_SYS_TIMER 2 +#define SEMA_SYS_DATE 3 +#define SEMA_DEBUG_MODE 4 +#define SEMA_SOUND 5 +#define SEMA_HEAPLOG_ACTIVE 6 +#define SEMA_HEAPLOG_LOCK 7 +#define SEMA_REFRESH_IN_PROGRESS 8 +#define SEMA_FLUSH_VBE_IMAGE 9 +#define SEMA_SINGLE_USER 10 +#define SEMA_DISK_CACHE 11 +#define SEMA_FAR_CALL32 12 +#define SEMA_DEV_MEM 13 +#define SEMA_VGA 14 +#define SEMA_UPDATE_WIN_Z_BUF 15 +#define SEMA_TT 16 +#define SEMA_MUTE 17 +#define SEMA_JUST_PUMP_MESSAGES 18 +#define SEMA_TMBEAT 19 +#define SEMA_FIX 20 +#define SEMA_SEMAS_NUM 21 + +#define CTRL_ALT_DEL 0 +#define CTRL_ALT_C 1 +#define CTRL_ALT_X 2 +#define CTRL_ALT_TAB 3 + +#help_index "Hash" +public class CHash +{//See $LK,"Hash",A="HI:Hash"$ + CHash *next; + U8 *str; + U32 type, + use_count; // inc'ed every time search found, never dec'ed. +}; + +public class CHashTable +{ + CHashTable *next; + I64 mask, locked_flags; + CHash **body; +}; + +#help_index "Hash/System" +//Hash table types: $LK,"ST_HTT_TYPES",A="FF:::/Kernel/KDefine.ZC,ST_HTT_TYPES"$ +#define HTt_EXPORT_SYS_SYM 0 +#define HTt_IMPORT_SYS_SYM 1 +#define HTt_DEFINE_STR 2 +#define HTt_GLOBAL_VAR 3 +#define HTt_CLASS 4 +#define HTt_INTERNAL_TYPE 5 +#define HTt_FUN 6 +#define HTt_WORD 7 +#define HTt_DICT_WORD 8 +#define HTt_KEYWORD 9 +#define HTt_ASM_KEYWORD 10 +#define HTt_OPCODE 11 +#define HTt_REG 12 +#define HTt_FILE 13 +#define HTt_MODULE 14 +#define HTt_HELP_FILE 15 +#define HTt_FRAME_PTR 16 +#define HTt_TYPES_NUM 17 + +#define HTf_PRIVATE 23 +#define HTf_PUBLIC 24 +#define HTf_EXPORT 25 +#define HTf_IMPORT 26 +#define HTf_IMM 27 +#define HTf_GOTO_LABEL 28 +#define HTf_RESOLVED 29 +#define HTf_UNRESOLVED 30 +#define HTf_LOCAL 31 + +#define HTT_INVALID 0 +#define HTT_EXPORT_SYS_SYM 0x00001 //CHashExport +#define HTT_IMPORT_SYS_SYM 0x00002 //CHashImport +#define HTT_DEFINE_STR 0x00004 //CHashDefineStr +#define HTT_GLOBAL_VAR 0x00008 //CHashGlobalVar +#define HTT_CLASS 0x00010 //CHashClass +#define HTT_INTERNAL_TYPE 0x00020 //CHashClass +#define HTT_FUN 0x00040 //CHashFun +#define HTT_WORD 0x00080 //CHashAC only in AutoComplete table +#define HTT_DICT_WORD 0x00100 //CHashGeneric only in AutoComplete tbl +#define HTT_KEYWORD 0x00200 //CHashGeneric $LK,"KEYWORD",A="FF:::/Compiler/OpCodes.DD,KEYWORD"$ +#define HTT_ASM_KEYWORD 0x00400 //CHashGeneric $LK,"ASM_KEYWORD",A="FF:::/Compiler/OpCodes.DD,ASM_KEYWORD"$ +#define HTT_OPCODE 0x00800 //CHashOpcode +#define HTT_REG 0x01000 //CHashReg +#define HTT_FILE 0x02000 //CHashGeneric +#define HTT_MODULE 0x04000 //CHashGeneric +#define HTT_HELP_FILE 0x08000 //CHashSrcSym +#define HTT_FRAME_PTR 0x10000 //CHashGeneric +#define HTG_TYPE_MASK 0x1FFFF + +#define HTF_PRIVATE 0x00800000 +#define HTF_PUBLIC 0x01000000 +#define HTF_EXPORT 0x02000000 +#define HTF_IMPORT 0x04000000 +#define HTF_IMM 0x08000000 +#define HTF_GOTO_LABEL 0x10000000 +#define HTF_RESOLVE 0x20000000 +#define HTF_UNRESOLVED 0x40000000 +#define HTF_LOCAL 0x80000000 +#define HTG_FLAGS_MASK 0xFF000000 + +#define HTG_SRC_SYM (HTT_DEFINE_STR | HTT_GLOBAL_VAR | HTT_FUN | HTT_CLASS | HTT_EXPORT_SYS_SYM | HTT_HELP_FILE) +#define HTG_ALL -1 + +#define KERNEL_MODULE_NAME "/Kernel/Kernel" + +class CDebugInfo +{ + U32 min_line, max_line; + U32 body[1]; //Code heap is 32-bit value +}; + +public class CHashSrcSym:CHash +{ + U8 *src_link, + *idx; + CDebugInfo *debug_info; + U8 *import_name; + CAOTImportExport *ie_list; +}; + +public class CHashGeneric:CHash +{ + I64 user_data0, user_data1, user_data2; +}; + +#define REGT_NONE 0 +#define REGT_R8 1 +#define REGT_R16 2 +#define REGT_R32 3 +#define REGT_R64 4 +#define REGT_SEG 5 +#define REGT_FSTACK 6 +#define REGT_MM 7 +#define REGT_XMM 8 + +public class CHashReg:CHash +{ + U8 reg_num, reg_type; +}; + +public class CHashAC:CHash +{ + I32 num; + U32 hits; +}; + +public class CHashExport:CHashSrcSym +{ + I64 val; +}; + +public class CHashImport:CHashSrcSym +{ + U8 *module_base, + *module_header_entry; +}; + +#help_index "Compiler/Internal" +#define PTR_STARS_NUM 3 + +//Member List Flags +#define MLF_DEFAULT_AVAILABLE 1 +#define MLF_LASTCLASS 2 +#define MLF_STR_DEFAULT_AVAILABLE 4 +#define MLF_FUN 8 +#define MLF_DOT_DOT_DOT 16 +#define MLF_NO_UNUSED_WARN 32 +#define MLF_STATIC 64 + +public class CArrayDim +{ + CArrayDim *next; + I64 count, total_count; +}; + +#define MLMF_IS_STR 1 +public class CMemberListMeta +{ + CMemberListMeta *next; + U8 *str; + I64 flags, + user_data; +}; + +public class CMemberList +{ + CMemberList *next, *left, *right, + *left_class_base, *right_class_base; //For finding duplicate class local variables. + U8 *str; + CHashClass *member_class, *member_class_base; + CMemberListMeta *meta; + U32 use_count; + U16 flags; + I8 reg, pad; + I64 offset, size; + CArrayDim dim; + U8 *static_data; + union + { + I64 static_data_rip; + I64 default_val; + } + CHashFun *fun_ptr; +}; + +class CExternUsage +{ + CExternUsage *next; + I64 rip; +}; + +#help_index "Hash/System;Compiler/Internal" +public class CHashDefineStr:CHashSrcSym +{ + U8 *data, **sub_idx; + I64 count; +}; + +#define Cf_EXTERN 0 +#define Cf_INTERNAL_TYPE 1 + +public class CHashClass:CHashSrcSym +{//See $LK,"ParseClassNew",A="MN:ParseClassNew"$(). base_class of $LK,"CHashFun",A="MN:CHashFun"$ + I64 size, neg_offset; + U32 member_count; + U8 ptr_stars_count, raw_type; + U16 flags; + CMemberList *member_list_and_root, //Head of linked list and head of tree. + *member_class_base_root, //For finding duplicate class local variables. + *last_in_member_list; + CHashClass *base_class, + *fwd_class; +}; + +//Function flags +#define Ff_INTERRUPT 8 +#define Ff_HASERRCODE 9 +#define Ff_ARGPOP 10 +#define Ff_NOARGPOP 11 +#define Ff_INTERNAL 12 +#define Ff__EXTERN 13 +#define Ff_DOT_DOT_DOT 14 +#define Ff_RET1 15 + +public class CHashFun:CHashClass +{//See $LK,"ParseFunNew",A="MN:ParseFunNew"$(). + CHashClass *return_class; + U32 arg_count, pad, + used_reg_mask, clobbered_reg_mask; + U8 *exe_addr; + CExternUsage *ext_list; +}; + +//Global Var Flags +#define GVF_FUN 1 +#define GVF_IMPORT 2 +#define GVF_EXTERN 4 +#define GVF_DATA_HEAP 8 +#define GVF_ALIAS 16 +#define GVF_ARRAY 32 + +public class CHashGlobalVar:CHashSrcSym +{ + I64 size, flags; + CHashClass *var_class; + CHashFun *fun_ptr; + CArrayDim dim; + U8 *data_addr; + union + { + I64 data_addr_rip; + CAOTHeapGlobal *heap_global; + } +}; +#assert offset(CHashClass.size) == offset(CHashGlobalVar.size) + +#help_index "DolDoc" +//See $LK,"TextBase Layer",A="HI:TextBase Layer"$. +#define ATTRF_BLINK 0x10000000 +#define ATTRF_INVERT 0x20000000 +#define ATTRF_SEL 0x40000000 +#define ATTRF_UNDERLINE 0x80000000 + +#define ATTRf_BLINK 28 +#define ATTRf_INVERT 29 +#define ATTRf_SEL 30 +#define ATTRf_UNDERLINE 31 + +//CDocEntry.type codes (Low 8 bits) +#define DOCT_TEXT 0 +#define DOCT_NEW_LINE 1 +#define DOCT_SOFT_NEW_LINE 2 +#define DOCT_TAB 3 +#define DOCT_PAGE_BREAK 4 +#define DOCT_CURSOR 5 +#define DOCT_MARKER 6 +#define DOCT_PROMPT 7 +#define DOCT_CLEAR 8 +#define DOCT_PAGE_LEN 9 +#define DOCT_LEFT_MARGIN 10 +#define DOCT_RIGHT_MARGIN 11 +#define DOCT_HEADER 12 +#define DOCT_FOOTER 13 +#define DOCT_INDENT 14 +#define DOCT_FOREGROUND 15 +#define DOCT_BACKGROUND 16 +#define DOCT_DEFAULT_FOREGROUND 17 +#define DOCT_DEFAULT_BACKGROUND 18 +#define DOCT_WORD_WRAP 19 +#define DOCT_HIGHLIGHT 20 +#define DOCT_BLINK 21 +#define DOCT_INVERT 22 +#define DOCT_UNDERLINE 23 +#define DOCT_SHIFTED_X 24 +#define DOCT_SHIFTED_Y 25 +#define DOCT_CURSOR_MOVEMENT 26 +#define DOCT_ANCHOR 27 +#define DOCT_LINK 28 +#define DOCT_BTTN 29 +#define DOCT_DATA 30 +#define DOCT_CHECK_BOX 31 +#define DOCT_LIST 32 +#define DOCT_MACRO 33 +#define DOCT_MENU_VAL 34 +#define DOCT_HEX_ED 35 +#define DOCT_TREE 36 +#define DOCT_SPRITE 37 +#define DOCT_INS_BIN 38 +#define DOCT_INS_BIN_SIZE 39 +#define DOCT_SONG 40 +#define DOCT_HTML_CODE 41 +#define DOCT_ERROR 42 + +#define DOCT_TYPES_NUM 43 + +//CDocEntry.type flags upper bits +#define DOCET_BLINK ATTRF_BLINK +#define DOCET_INVERT ATTRF_INVERT +#define DOCET_SEL ATTRF_SEL +#define DOCET_UNDERLINE ATTRF_UNDERLINE +#define DOCG_BL_IV_UL 0xB0000000 + +#define DOCEt_BLINK ATTRf_BLINK +#define DOCEt_INVERT ATTRf_INVERT +#define DOCEt_SEL ATTRf_SEL +#define DOCEt_UNDERLINE ATTRf_UNDERLINE + +#define DOCG_DBL_BUF_FLAGS (DOCF_OVERSTRIKE | DOCF_PLAIN_TEXT | DOCF_PLAIN_TEXT_TABS | DOCF_SIZE_MIN | DOCF_NO_CURSOR | \ + DOCF_FORM | DOCF_DBL_DOLLARS | DOCF_DONT_SWAP_OUT | DOCF_DO_FULL_REFRESH | DOCF_BORDER_DOC | \ + DOCF_HIDE_CURSOR | DOCF_DONT_HIGHLIGHT_CURSOR | DOCF_CARRIAGE_RETURN) + +//CDocEntry.de_flags. These first 16 are arg= +#define DOCEF_TAG 1 +#define DOCEF_LEN 2 +#define DOCEF_AUX_STR 4 +#define DOCEF_DEFINE 8 +#define DOCEF_HTML_LINK 0x10 +#define DOCEF_LEFT_EXP 0x20 +#define DOCEF_LEFT_MACRO 0x40 +#define DOCEF_RIGHT_EXP 0x80 +#define DOCEF_RIGHT_MACRO 0x100 +#define DOCEF_HAS_BIN 0x200 +#define DOCEF_BIN_PTR_LINK 0x400 +#define DOCEF_RAW_TYPE 0x800 +#define DOCEF_SHIFTED_X 0x1000 +#define DOCEF_SHIFTED_Y 0x2000 +#define DOCEF_SCROLLING_X 0x4000 +#define DOCEF_USER_DATA 0x8000 + +//CDocEntry.de_flags. These are +/- flags +#define DOCEF_LEFT_CB 0x10000 +#define DOCEF_LEFT_IN_STR 0x20000 +#define DOCEF_RIGHT_CB 0x40000 +#define DOCEF_RIGHT_IN_STR 0x80000 +#define DOCEF_LEFT_X 0x100000 +#define DOCEF_CENTER_X 0x200000 +#define DOCEF_RIGHT_X 0x400000 +#define DOCEF_TOP_Y 0x800000 +#define DOCEF_CENTER_Y 0x1000000 +#define DOCEF_BOTTOM_Y 0x2000000 +//HL...UL +#define DOCEF_TAG_CB 0x100000000 +#define DOCEF_PAGE_REL_Y 0x200000000 +#define DOCEF_MARGIN_REL_X 0x400000000 +#define DOCEF_WIN_REL 0x800000000 +#define DOCEF_LINK 0x1000000000 +#define DOCEF_ESC 0x2000000000 //Send (Exit and Save) +#define DOCEF_QUIT 0x4000000000 //Send (Abort) +#define DOCEF_FROM_START 0x8000000000 +#define DOCEF_HAS_BORDER 0x10000000000 +#define DOCEF_SOLID_BORDER 0x20000000000 +#define DOCEF_BORDER_PLOT 0x40000000000 +#define DOCEF_CHECKED_COLLAPSED 0x80000000000 //Checked or Collapsed +#define DOCEF_CHECK_COLLAPSABLE 0x100000000000 +#define DOCEF_REFRESH_DATA 0x200000000000 +#define DOCEF_UPDATE_DATA 0x400000000000 +//$LK,"DOCEF_DEREF_DATA",A="MN:DOCEF_DEREF_DATA"$ is confusing. $LK,"DocForm",A="MN:DocForm"$() makes doc_e->data point to members +//of class. For ints, it derefs doc_e->data as a ptr. For strings, it doesn't. +#define DOCEF_DEREF_DATA 0x800000000000 +#define DOCEF_REMALLOC_DATA 0x1000000000000 +#define DOCEF_HAS_TERMINATOR 0x2000000000000 +#define DOCEF_ZERO_BASED 0x4000000000000 +#define DOCEF_HOLD 0x8000000000000 +#define DOCEF_TREE 0x10000000000000 +#define DOCEF_LIST 0x20000000000000 +#define DOCEF_SKIP 0x40000000000000 +#define DOCEF_POPUP 0x80000000000000 +#define DOCEF_SKIP_IN_FORM 0x100000000000000 +#define DOCEF_FILTER_SKIP 0x200000000000000 +#define DOCEF_NO_CLICK_ON 0x400000000000000 +#define DOCEF_DONT_DRAW 0x800000000000000 //only works on sprites +#define DOCEF_DEFAULT_LEN 0x1000000000000000 +#define DOCEF_DEFAULT_RAW_TYPE 0x2000000000000000 + +#define DOCEG_HAS_ALLOC (DOCEF_TAG | DOCEF_AUX_STR | DOCEF_DEFINE | DOCEF_HTML_LINK | \ + DOCEF_LEFT_MACRO | DOCEF_RIGHT_MACRO | DOCEF_BIN_PTR_LINK | DOCEF_REMALLOC_DATA) + +#define DOCEG_HAS_ARG ((DOCEG_HAS_ALLOC & ~DOCEF_REMALLOC_DATA) | \ + DOCEF_LEN | DOCEF_LEFT_EXP | DOCEF_RIGHT_EXP | DOCEF_HAS_BIN | DOCEF_RAW_TYPE | \ + DOCEF_SHIFTED_X | DOCEF_SHIFTED_Y | DOCEF_SCROLLING_X | DOCEF_USER_DATA) + +#define DOCEG_DONT_EDIT (DOCEF_DEFINE | DOCEF_HTML_LINK | DOCEF_AUX_STR | DOCEF_BIN_PTR_LINK | \ + DOCEF_SCROLLING_X | DOCEF_TAG_CB) + +//These are ident to Doc flags +#define DOCEF_HIGHLIGHT 0x4000000 +#define DOCEF_WORD_WRAP 0x8000000 +#define DOCEF_BLINK ATTRF_BLINK +#define DOCEF_INVERT ATTRF_INVERT +#define DOCEF_SEL ATTRF_SEL +#define DOCEF_UNDERLINE ATTRF_UNDERLINE +#define DOCEf_HIGHLIGHT 26 +#define DOCEf_WORD_WRAP 27 +#define DOCEf_BLINK ATTRf_BLINK +#define DOCEf_INVERT ATTRf_INVERT +#define DOCEf_SEL ATTRf_SEL +#define DOCEf_UNDERLINE ATTRf_UNDERLINE + +//CDocEntry.de_flags. These first 16 are arg= +#define DOCEf_TAG 0 +#define DOCEf_LEN 1 +#define DOCEf_AUX_STR 2 +#define DOCEf_DEFINE 3 +#define DOCEf_HTML_LINK 4 +#define DOCEf_LEFT_EXP 5 +#define DOCEf_LEFT_MACRO 6 +#define DOCEf_RIGHT_EXP 7 +#define DOCEf_RIGHT_MACRO 8 +#define DOCEf_HAS_BIN 9 +#define DOCEf_BIN_PTR_LINK 10 +#define DOCEf_RAW_TYPE 11 +#define DOCEf_SHIFTED_X 12 +#define DOCEf_SHIFTED_Y 13 +#define DOCEf_SCROLLING_X 14 +#define DOCEf_USER_DATA 15 + +//CDocEntry.de_flags. These are +/- flags +#define DOCEf_LEFT_CB 16 +#define DOCEf_LEFT_IN_STR 17 +#define DOCEf_RIGHT_CB 18 +#define DOCEf_RIGHT_IN_STR 19 +#define DOCEf_LEFT_X 20 +#define DOCEf_CENTER_X 21 +#define DOCEf_RIGHT_X 22 +#define DOCEf_TOP_Y 23 +#define DOCEf_CENTER_Y 24 +#define DOCEf_BOTTOM_Y 25 +//HL...UL +#define DOCEf_TAG_CB 32 +#define DOCEf_PAGE_REL_Y 33 +#define DOCEf_MARGIN_REL_X 34 +#define DOCEf_WIN_REL 35 +#define DOCEf_LINK 36 +#define DOCEf_ESC 37 //Send (Exit and Save) +#define DOCEf_QUIT 38 //Send (Abort) +#define DOCEf_FROM_START 39 +#define DOCEf_HAS_BORDER 40 +#define DOCEf_SOLID_BORDER 41 +#define DOCEf_BORDER_PLOT 42 +#define DOCEf_CHECKED_COLLAPSED 43 //Checked or Collapsed +#define DOCEf_CHECK_COLLAPSABLE 44 +#define DOCEf_REFRESH_DATA 45 +#define DOCEf_UPDATE_DATA 46 +#define DOCEf_DEREF_DATA 47 +#define DOCEf_REMALLOC_DATA 48 +#define DOCEf_HAS_TERMINATOR 49 +#define DOCEf_ZERO_BASED 50 +#define DOCEf_HOLD 51 +#define DOCEf_TREE 52 +#define DOCEf_LIST 53 +#define DOCEf_SKIP 54 +#define DOCEf_POPUP 55 +#define DOCEf_SKIP_IN_FORM 56 +#define DOCEf_FILTER_SKIP 57 +#define DOCEf_NO_CLICK_ON 58 +#define DOCEf_DONT_DRAW 59 //only works on sprites +#define DOCEf_DEFAULT_LEN 60 +#define DOCEf_DEFAULT_RAW_TYPE 61 +#define DOCEf_FLAGS_NUM 62 + +public class CDocBin +{ + CDocBin *next, *last; + I32 tmp_use_count, renum_num; + U8 *tag; + U0 start; + U32 num, flags, size, use_count; + U0 end; + U8 *data; +#assert !($$ & 7) +}; + +#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 DOC_ATTR_DEFAULT_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_PROMPT GREEN +#define DOC_COLOR_COMMENT GREEN +#define DOC_COLOR_BIN LTGREEN +#define DOC_COLOR_STR BROWN +#define DOC_COLOR_CHAR_CONST BROWN +#define DOC_COLOR_EXPORT_SYS_SYM LTPURPLE +#define DOC_COLOR_DEFINE_STR CYAN +#define DOC_COLOR_GLOBAL_VAR LTCYAN +#define DOC_COLOR_CLASS LTBLUE +#define DOC_COLOR_FUN PURPLE +#define DOC_COLOR_KEYWORD BLUE +#define DOC_COLOR_REG LTRED +#define DOC_COLOR_NUMBER YELLOW + +public class CDocSettings +{ + U32 final_u32_attr; + I16 left_margin, right_margin, indent; + U16 page_len, header, footer; + I8 shifted_x, shifted_y; + U8 state, comment_depth, paren_depth, brace_depth, cur_text_attr, default_text_attr; +}; + +#define DOC_DEFAULT I32_MIN + +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 de_flags; + I32 x, y; + U32 min_col, max_col; + CDocSettings settings; + I64 user_data; +#assert !($$&7) +}; + +#define DOCE_LEN_DEFAULT 64 + +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, + *aux_str, + *bin_ptr_link, + *html_link, + *my_format_data; + I64 hex_ed_width; + I32 scroll_len, + len, //$LK,"DOCE_LEN_DEFAULT",A="MN:DOCE_LEN_DEFAULT"$ + bin_num; + U8 raw_type, pad[3]; + CDocBin *bin_data; + U8 *data; +#assert !($$ & 7) +}; + +//$LK,"DocForm",A="MN:DocForm"$() $LK,"DocMenu",A="MN:DocMenu"$() $LK,"DocEd",A="MN:DocEd"$() $LK,"PopUpMenu",A="MN:PopUpMenu"$() +#define DOF_SIZE_MIN 0x01 +#define DOF_INTERCEPT_TASK_END 0x02 +#define DOF_DONT_HOME 0x04 +#define DOF_WIN_MAX 0x08 +#define DOF_DONT_TEXT_ATTR 0x10 +#define DOF_DONT_WINMGR_SYNC 0x20 +#define DOF_DONT_SHOW 0x40 +//Combines with $LK,"Editor Flags",A="MN:EDF_BAIL"$ + +class CEdFindText +{ + U8 find_text[STR_LEN] format "$$DA-P,A=\"Find :%s\"$$\n", + replace_text[STR_LEN] format "$$DA-P,A=\"Replace :%s\"$$\n"; + Bool replace format "$$CB,\"Replace\"$$\n", + scan_fwd format "$$CB,\"Fwd\"$$\n", + scan_sel_text format "$$CB,\"Selection\"$$\n", + match_case format "$$CB,\"Match Case\"$$\n", + whole_labels format "$$CB,\"Whole Labels\"$$\n", + local_var format "$$CB,\"Rename Local Var\"$$\n", + prompt, pad; + I64 filter_lines format "$$DA,A=\"Filter Lines:%d\"$$\n"; +}; + +class CEdFileName +{ + CDirContext *dirc; + U8 name[256] format "$$DA-P,LEN=255,A=\"FileName:%s\"$$"; +}; + +//$LK,"Ed",A="MN:Ed"$() +#define EDF_BAIL 0x100 +#define EDF_COLLAPSE 0x200 +#define EDF_UNCOLLAPSE 0x400 +#define EDF_WAS_WRITE 0x800 //Was exit ESC or SHIFT_ESC? +//Combines with $LK,"Document Flags",A="MN:DOF_SIZE_MIN"$ + +#define EDf_BAIL 8 +#define EDf_COLLAPSE 9 +#define EDf_UNCOLLAPSE 10 +#define EDf_WAS_WRITE 11 + +// DOC header flags +#define DOCF_PLAIN_TEXT 0x1 +#define DOCF_PLAIN_TEXT_TABS 0x2 //has '\t', not DOCT_TAB +#define DOCF_AUTO_SAVE 0x4 +#define DOCF_NO_CURSOR 0x8 +#define DOCF_CARRIAGE_RETURN 0x10 +#define DOCF_DBL_DOLLARS 0x20 +#define DOCF_COLOR_NAMES 0x40 +//Reserved x1 +#define DOCF_BORDER_DOC 0x100 +#define DOCF_FORM 0x200 +#define DOCF_SIZE_MIN 0x400 +#define DOCF_HIDE_CURSOR 0x800 //use $LK,"DocCursor",A="MN:DocCursor"$ +#define DOCF_DONT_HIGHLIGHT_CURSOR 0x1000 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$ +#define DOCF_NO_SCROLL_BARS 0x2000 //use $LK,"DocScroll",A="MN:DocScroll"$ +#define DOCF_ALLOW_UNDO 0x4000 +#define DOCF_DONT_SHOW 0x8000 +#define DOCF_HAS_SONG 0x10000 +#define DOCF_MORE 0x20000 +#define DOCF_BWD_MOVEMENT 0x40000 +#define DOCF_NULL_GRAB_SCROLL 0x80000 +#define DOCF_DONT_SWAP_OUT 0x100000 +#define DOCF_DO_FULL_REFRESH 0x200000 +#define DOCF_BREAK_UNLOCKED 0x400000 +//Reserved x1 +#define DOCF_HIGHLIGHT DOCEF_HIGHLIGHT +#define DOCF_WORD_WRAP DOCEF_WORD_WRAP +#define DOCF_BLINK DOCEF_BLINK +#define DOCF_INVERT DOCEF_INVERT +#define DOCF_SEL DOCEF_SEL +#define DOCF_UNDERLINE DOCEF_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_TABS 1 //has '\t', not DOCT_TAB +#define DOCf_AUTO_SAVE 2 +#define DOCf_NO_CURSOR 3 +#define DOCf_CARRIAGE_RETURN 4 +#define DOCf_DBL_DOLLARS 5 +#define DOCf_COLOR_NAMES 6 +//Reserved x1 +#define DOCf_BORDER_DOC 8 +#define DOCf_FORM 9 +#define DOCf_SIZE_MIN 10 +#define DOCf_HIDE_CURSOR 11 //use $LK,"DocCursor",A="MN:DocCursor"$ +#define DOCf_DONT_HIGHLIGHT_CURSOR 12 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$ +#define DOCf_NO_SCROLL_BARS 13 //use $LK,"DocScroll",A="MN:DocScroll"$ +#define DOCf_ALLOW_UNDO 14 +#define DOCf_DONT_SHOW 15 +#define DOCf_HAS_SONG 16 +#define DOCf_MORE 17 +#define DOCf_BWD_MOVEMENT 18 +#define DOCf_NULL_GRAB_SCROLL 19 +#define DOCf_DONT_SWAP_OUT 20 +#define DOCf_DO_FULL_REFRESH 21 +#define DOCf_BREAK_UNLOCKED 22 +//Reserved x1 + +#define DOCf_HIGHLIGHT DOCEf_HIGHLIGHT +#define DOCf_WORD_WRAP DOCEf_WORD_WRAP +#define DOCf_BLINK DOCEf_BLINK +#define DOCf_INVERT DOCEf_INVERT +#define DOCf_SEL DOCEf_SEL +#define DOCf_UNDERLINE DOCEf_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, doc_flags, time_stamp; + U8 *body; +}; + +//See $LK,"DocMenu",A="MN:DocMenu"$() +#define DOCM_CANCEL (-1) + +#define DOC_SIGNATURE_VAL 'DocS' + +#define RECALCt_NORMAL 0x00 +#define RECALCt_FIND_CURSOR 0x01 +#define RECALCt_TO_SCREEN 0x02 +#define RECALCG_MASK 0xFF + +#define RECALCF_HAS_CURSOR 0x100 +#define RECALCF_ADD_CURSOR 0x200 +#define RECALCF_TO_HTML 0x400 + +public class CDoc //Linked Text File header +{//See $LK,"Doc",A="HI:Doc"$ for documentation. + CDocEntryBase head; + I64 flags, locked_flags; + CDocEntry *cur_entry, *old_cur_entry; + I32 cur_col, old_cur_col, line_start_col, top_line_num, dollar_buf_size, dollar_buf_ptr; + U8 *dollar_buf; //When entering $$ cmds, it buffers them until the end $$. + + CTask *win_task, *mem_task, *owning_task; + I32 page_line_num, undo_count, + x, y, min_x, max_x, min_y, max_y; + I64 line, col, best_d, + old_win_top, old_win_bottom, old_win_left, old_win_right, + cmd_U8; + U32 doc_signature, cur_bin_num; + I64 max_entries, updates_count; + CEdFindText *find_replace; + + CEdFileName filename; + I64 file_attr; + I64 (*left_click_link)(CDoc *doc, CDocEntry *doc_e); + I64 (*right_click_link)(CDoc *doc, CDocEntry *doc_e); + + //See $LK,"::/Apps/Psalmody/JukeBox.ZC"$ + U8 *user_put_data; //Passed to user_put_key() and user_put_s() + 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; //(When browsing deeper, opening deeper docs.) + U64 desc; //8 characters. See $LK,"DocBorderListDraw",A="MN:DocBorderListDraw"$(). + + CDocBin bin_head; + CDocSettings settings_head; + CDocUndo undo_head; + + I64 user_data; +#assert !($$&7) +}; + +#help_index "Windows" +/* +Fs->win_inhibit mask + +Some inhibit actions on the task itself. +Some inhibit actions if the focus task +tries to do something. +*/ +#define WIF_SELF_FOCUS 0x0001 //If active this task cannot have focus +//MENU 0x0002 +#define WIF_SELF_CTRLS 0x0004 +#define WIF_SELF_MS_L 0x0008 +//MS_L_D 0x0010 +#define WIF_SELF_MS_R 0x0020 +//MS_R_D 0x0040 +#define WIF_SELF_MS_WHEEL 0x0080 //Does nothing, yet +#define WIF_SELF_BORDER 0x0100 +#define WIF_SELF_GRAB_SCROLL 0x0200 +#define WIF_SELF_DOC 0x0400 +#define WIF_SELF_ODE 0x0800 +#define WIF_SELF_KEY_DESC 0x1000 +//FOCUS 0x00010000 +#define WIF_FOCUS_TASK_MENU 0x00020000 +#define WIF_FOCUS_TASK_CTRLS 0x00040000 +#define WIF_FOCUS_TASK_MS_L 0x00080000 +#define WIF_FOCUS_TASK_MS_L_D 0x00100000 +#define WIF_FOCUS_TASK_MS_R 0x00200000 +#define WIF_FOCUS_TASK_MS_R_D 0x00400000 +#define WIF_FOCUS_TASK_MS_WHEEL 0x00800000 //Does nothing, yet +#define WIF_FOCUS_TASK_BORDER 0x01000000 +#define WIF_FOCUS_TASK_GRAB_SCROLL 0x02000000 + +#define WIG_DBL_CLICK (WIF_FOCUS_TASK_MS_L_D | WIF_FOCUS_TASK_MS_R_D) +#define WIG_TASK_DEFAULT (WIF_FOCUS_TASK_MENU | WIG_DBL_CLICK | 0xFFFF - WIF_SELF_DOC - WIF_SELF_ODE) +#define WIG_NO_FOCUS_TASK_DEFAULT (WIG_TASK_DEFAULT - WIF_SELF_BORDER - WIF_SELF_MS_L - WIF_SELF_MS_R - WIG_DBL_CLICK) +#define WIG_USER_TASK_DEFAULT WIF_SELF_KEY_DESC + +#define WIf_SELF_FOCUS 0 +#define WIf_SELF_CTRLS 2 +#define WIf_SELF_MS_L 3 +#define WIf_SELF_MS_R 5 +#define WIf_SELF_MS_WHEEL 7 +#define WIf_SELF_BORDER 8 +#define WIf_SELF_GRAB_SCROLL 9 +#define WIf_SELF_DOC 10 +#define WIf_SELF_ODE 11 +#define WIf_SELF_KEY_DESC 12 +#define WIf_FOCUS_TASK_MENU 17 +#define WIf_FOCUS_TASK_CTRLS 18 +#define WIf_FOCUS_TASK_MS_L 19 +#define WIf_FOCUS_TASK_MS_L_D 20 +#define WIf_FOCUS_TASK_MS_R 21 +#define WIf_FOCUS_TASK_MS_R_D 22 +#define WIf_FOCUS_TASK_MS_WHEEL 23 +#define WIf_FOCUS_TASK_BORDER 24 +#define WIf_FOCUS_TASK_GRAB_SCROLL 25 +#define WIf_FLAGS_NUM 26 + +class CWinMgrTimingGlobals +{ + I64 last_total_jiffies, + last_idle_pt_hits[MP_PROCESSORS_NUM], + last_swap_counter[MP_PROCESSORS_NUM]; + F64 last_calc_idle_time, calc_idle_delta_time; + I64 calc_idle_count; +}; + +#define WINMGR_FPS (60000.0 / 1001) +#define WINMGR_PERIOD (1001 / 60000.0) + +public class CWinMgrGlobals +{ + I64 updates; + F64 ode_time, + last_ode_time, + fps, //You can read but not write this. You have no control. + ideal_refresh_tS, + last_refresh_tS; + CWinMgrTimingGlobals *t; + Bool show_menu, grab_scroll, grab_scroll_closed; +}; + +#help_index "AutoComplete" +#define ACf_INIT_IN_PROGRESS 0 +#define ACf_LAST_WAS_KEYMAP 1 + +#define AC_FILLINS_NUM 12 +public class CAutoCompleteGlobals +{ + I64 col, row, old_col, old_row, num_words; + CHashTable *hash_table; + U8 *cur_word; + I64 flags; + CTask *task; + I64 partial_len, num_fillins, + fillin_hits [AC_FILLINS_NUM + 1]; + CHashAC *fillin_matches[AC_FILLINS_NUM + 1]; +}; + +#help_index "AutoComplete/Dictionary" +#define ACD_WORD_FILENAME "/System/AutoComplete/ACWords.DATA" +#define ACD_DEF_FILENAME "/System/AutoComplete/ACDefs.DATA" + +#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_FILLINS_NUM 10 +public class CAutoCompleteDictGlobals +{ + U8 *word_list; + I64 word_list_size, num_words, num_fillins; + U8 *fillins[ACD_FILLINS_NUM]; + Bool has_words, has_defs; +}; + +#help_index "Compiler/Directive" +//Compiler $LK,"Option",A="MN:Option"$()s +//You might need to do #exe {Option();} +//Note: The #exe statement is lexed-ahead, +//so it takes effect earlier than you might expect. +#define OPTf_ECHO 0 +#define OPTf_TRACE 1 +#define OPTf_WARN_UNUSED_VAR 2 //Applied to functions, not statements +#define OPTf_WARN_PAREN 3 //Warn unnecessary parens +#define OPTf_WARN_DUP_TYPES 4 //Warn duplicate local variable type statements +#define OPTf_WARN_HEADER_MISMATCH 5 +#define OPTf_EXTERNS_TO_IMPORTS 6 +#define OPTf_KEEP_PRIVATE 7 +#define OPTf_NO_REG_VAR 8 //Applied to functions, not statements +#define OPTf_GLOBALS_ON_DATA_HEAP 9 +//Disable 10-byte float consts for ã,log2_10,log10_2,loge_2 +#define OPTf_NO_BUILTIN_CONST 10 //Applied to functions, not statements +#define OPTf_USE_IMM64 11 //Not completely implemented +#define OPTf_DECIMAL_ONLY 12 //Only allow decimal numbers (no 0x or 0b prefixed numbers) +#define OPTf_NO_FLOATS 13 //No floating point numbers allowed + +#define OPTF_ECHO (1 << OPTf_ECHO) + +#help_index "Compiler/Intermediate Code" +//See $LK,"ST_RAW_TYPES",A="MN:ST_RAW_TYPES"$ +#define RT_I0 2 +#define RT_U0 3 +#define RT_I8 4 +#define RT_U8 5 +#define RT_I16 6 +#define RT_U16 7 +#define RT_I32 8 +#define RT_U32 9 +#define RT_I64 10 +#define RT_PTR 10 //Signed to allow negative error codes. $LK,"DOCM_CANCEL",A="MN:DOCM_CANCEL"$ +#define RT_U64 11 +#define RT_F32 12 //Not implemented +#define RT_UF32 13 //Not implemented, Fictitious +#define RT_F64 14 +#define RT_UF64 15 //Fictitious +#define RT_RTS_NUM 16 +#define RTF_UNSIGNED 1 +#define RTG_MASK 0xFF + +#define MDf_STACK 8 +#define MDf_IMM 9 +#define MDf_REG 10 +#define MDf_DISP 11 +#define MDf_SIB 12 +#define MDf_RIP_DISP32 13 + +#define MDF_NULL 0x0000 +#define MDF_STACK 0x0100 +#define MDF_IMM 0x0200 +#define MDF_REG 0x0400 +#define MDF_DISP 0x0800 +#define MDF_SIB 0x1000 +#define MDF_RIP_DISP32 0x2000 +#define MDG_MASK 0xFF00 +#define MDG_REG_DISP_SIB (MDF_REG | MDF_DISP | MDF_SIB) +#define MDG_DISP_SIB_RIP (MDF_DISP | MDF_SIB | MDF_RIP_DISP32) +#define MDG_REG_DISP_SIB_RIP (MDF_REG | MDG_DISP_SIB_RIP) + +#define ICF_RES_TO_F64 0x000000001 +#define ICF_RES_TO_INT 0x000000002 +#define ICF_ARG1_TO_F64 0x000000004 +#define ICF_ARG1_TO_INT 0x000000008 +#define ICF_ARG2_TO_F64 0x000000010 +#define ICF_ARG2_TO_INT 0x000000020 +#define ICF_USE_F64 0x000000040 +#define ICF_USE_UNSIGNED 0x000000080 +#define ICF_USE_INT 0x000000100 //highest priority +#define ICF_RES_NOT_USED 0x000000200 +#define ICF_CODE_FINAL 0x000000400 +#define ICF_BY_VAL 0x000000800 //By value, not ref. +#define ICF_SHORT_JMP 0x000001000 +#define ICF_PUSH_RES 0x000002000 +#define ICF_PASS_TRACE 0x000004000 +#define ICF_RES_WAS_STACK 0x000008000 +#define ICF_ARG1_WAS_STACK 0x000010000 +#define ICF_ARG2_WAS_STACK 0x000020000 +#define ICF_PUSH_CMP 0x000040000 //for 50last_cc->lex_include_stack->line_num);} +#define __CMD_LINE__ #exe{StreamPrint("%d", Fs->last_cc->flags & CCF_CMD_LINE && Fs->last_cc->lex_include_stack->depth < 1);} +#define __FILE__ #exe{StreamPrint("\"%s\"", Fs->last_cc->lex_include_stack->full_name);} +#define __DIR__ #exe{StreamDir;} + +#define LFSF_DOC 1 +#define LFSF_DEFINE 2 +class CLexFile +{ + CLexFile *next; + U8 *buf, + *buf_ptr; + I64 line_num, flags; + U8 *full_name, + *line_start; + CDoc *doc; + CDocEntry *cur_entry; + I32 depth; + U8 last_U16, pad[3]; +}; + +class CAOTCtrl +{ + I64 rip; //Instruction pointer + CAsmArg arg1, arg2, arg3; + CAOTBinBlk *bin; + I64 num_bin_U8s, + max_align_bits, org; + CAsmUnresolvedRef *local_unresolved, *global_unresolved; + CAOTAbsAddr *abss; + CAOTHeapGlobal *heap_globals; + I64 list_col, list_last_rip; + U8 *last_label, *list_last_line; + CLexFile *list_last_lfn; + I64 seg_size; + Bool list; +}; + +//Tokens +#define TK_EOF 0 +#define TK_SUPERSCRIPT 0x001 +#define TK_SUBSCRIPT 0x002 +#define TK_NORMALSCRIPT 0x003 +#define TK_IDENT 0x100 +#define TK_STR 0x101 +#define TK_I64 0x102 +#define TK_CHAR_CONST 0x103 +#define TK_F64 0x104 +#define TK_PLUS_PLUS 0x105 +#define TK_MINUS_MINUS 0x106 +#define TK_DEREFERENCE 0x107 +#define TK_DBL_COLON 0x108 +#define TK_SHL 0x109 +#define TK_SHR 0x10A +#define TK_EQU_EQU 0x10B +#define TK_NOT_EQU 0x10C +#define TK_LESS_EQU 0x10D +#define TK_GREATER_EQU 0x10E +#define TK_AND_AND 0x10F +#define TK_OR_OR 0x110 +#define TK_XOR_XOR 0x111 +#define TK_SHL_EQU 0x112 +#define TK_SHR_EQU 0x113 +#define TK_MUL_EQU 0x114 +#define TK_DIV_EQU 0x115 +#define TK_AND_EQU 0x116 +#define TK_OR_EQU 0x117 +#define TK_XOR_EQU 0x118 +#define TK_ADD_EQU 0x119 +#define TK_SUB_EQU 0x11A +#define TK_IF 0x11B +#define TK_IFDEF 0x11C +#define TK_IFNDEF 0x11D +#define TK_IFAOT 0x11E +#define TK_IFJIT 0x11F +#define TK_ENDIF 0x120 +#define TK_ELSE 0x121 +#define TK_MOD_EQU 0x122 +#define TK_DOT_DOT 0x123 +#define TK_ELLIPSIS 0x124 +#define TK_INS_BIN 0x125 +#define TK_INS_BIN_SIZE 0x126 +#define TK_TKS_NUM 0x127 + +class CLexHashTableContext +{ + CLexHashTableContext *next; + I64 old_flags, hash_mask; + CHashFun *local_var_list, + *fun; + CHashTable *hash_table_list, + *define_hash_table, + *local_hash_table, + *global_hash_table; +}; + +//CompCtrl flags +#define CCF_CMD_LINE 0x001 +#define CCF_PROMPT 0x002 +#define CCf_PROMPT 1 +#define CCF_QUESTION_HELP 0x004 +#define CCF_DONT_FREE_BUF 0x008 +#define CCF_NO_DEFINES 0x010 +#define CCF_IN_IF 0x020 +#define CCF_JUST_LOAD 0x040 +#define CCF_KEEP_NEW_LINES 0x080 +#define CCF_KEEP_DOT 0x100 +#define CCF_KEEP_SIGN_NUM 0x200 +#define CCF_KEEP_AT_SIGN 0x400 +#define CCF_NO_CHAR_CONST 0x800 +#define CCf_PASS_TRACE_PRESENT 12 +#define CCF_NOT_CONST 0x0000020000 +#define CCF_NO_REG_OPT 0x0000040000 +#define CCF_IN_QUOTES 0x0000080000 +#define CCF_EXE_BLK 0x0000100000 +#define CCF_HAS_MISC_DATA 0x0000200000 +#define CCF_HAS_RETURN 0x0000400000 +#define CCF_ASM_EXPRESSIONS 0x0000800000 +#define CCF_UNRESOLVED 0x0001000000 +#define CCF_LOCAL 0x0002000000 +#define CCF_FUN_EXP 0x0004000000 +#define CCf_FUN_EXP 26 +#define CCF_POSTINC 0x0008000000 +#define CCF_POSTDEC 0x0010000000 +#define CCF_PREINC 0x0020000000 +#define CCF_PREDEC 0x0040000000 +#define CCF_ARRAY 0x0080000000 +#define CCF_RAX 0x0100000000 +#define CCF_USE_LAST_U16 0x0200000000 +#define CCf_USE_LAST_U16 33 +#define CCF_LAST_WAS_DOT 0x0400000000 +#define CCF_AOT_COMPILE 0x0800000000 +#define CCf_AOT_COMPILE 35 +#define CCF_NO_ABSS 0x1000000000 +#define CCF_PAREN 0x2000000000 +#define CCf_PAREN 37 +#define CCF_CLASS_DOL_OFFSET 0x4000000000 +#define CCF_DONT_MAKE_RES 0x8000000000 + +public class CCompCtrl +{ + CCompCtrl *next, *last; + I64 token, flags, + cur_i64; + F64 cur_f64; + U8 *cur_str; + I64 cur_str_len, + class_dol_offset; + U8 *dollar_buf; + I64 dollar_count; + U8 *cur_help_idx; + I64 last_U16, + min_line, max_line, last_line_num, + lock_count; + U32 *char_bmp_alpha_numeric; + CLexHashTableContext htc; + CHashGeneric *hash_entry; + CAbsCountsI64 abs_counts; + CAsmUndefHash *asm_undef_hash; + CMemberList *local_var_entry; + CCodeMisc *lb_leave; + U8 *cur_buf_ptr; + CLexFile *lex_include_stack, + *lex_parse_stack, + *fun_lex_file; + CStreamBlk *next_stream_blk, *last_stream_blk; + CAOT *aot; + + I64 pass, opts, pass_trace, saved_pass_trace, error_count, warning_count; + + //For intermediate codes with multiple float ops (int<->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]; + + CCodeCtrl coc; + CParseStack *ps; + CAOTCtrl *aotc; + I64 aot_depth, prompt_line; +#assert !($$ & 7) +}; + +#help_index "Compiler" +public class CCompGlobals +{ + CHashTable *asm_hash; + CHashClass *internal_types[RT_RTS_NUM]; + CIntermediateCode ic_nop; + U32 *dual_U16_tokens1, *dual_U16_tokens2, *dual_U16_tokens3, + *binary_ops; + I64 num_reg_vars, num_non_ptr_vars, + stack_tmps_mask, reg_vars_mask, non_ptr_vars_mask; + U8 *to_reg_vars_map, *non_ptr_vars_map; + I64 size_arg_mask[17], + compiled_lines; +}; + +#help_index "Debugging/Unassemble" +class CUAsmGlobals +{ + CInst **table_16_32, + **table_64; + I64 table_16_32_entries, + table_64_entries, + ins64_arg_mask, + signed_arg_mask, + mem_arg_mask; +}; + +#help_index "Devices/SMBIOS" +//SMBIOS parsing based on SMBIOS specification 3.3.0 (document "DSP0134") +#define SMBIOSt_BIOS 0 +#define SMBIOSt_SYSTEM 1 +#define SMBIOSt_BASEBOARD 2 +#define SMBIOSt_ENCLOSURE 3 +#define SMBIOSt_PROCESSOR 4 +#define SMBIOSt_CACHE 7 +#define SMBIOSt_CONNECTOR 8 +#define SMBIOSt_SLOT 9 +#define SMBIOSt_OEM_STRINGS 11 +#define SMBIOSt_SYS_CONFIG_OPTIONS 12 +#define SMBIOSt_PHYMEM 16 +#define SMBIOSt_MEM_DEVICE 17 +#define SMBIOSt_MAPPED_ADDR 19 +#define SMBIOSt_BATTERY 22 +#define SMBIOSt_BOOT_INFO 32 +#define SMBIOSt_ALL 0xFF //Non-existent placeholder type + +class CSMBIOSHeader +{//Section 6.1.2 line 885 + U8 type, //SMBIOSt_* + length; + U16 handle; //identifier for this structure. +}; +class CSMBIOSEntryPoint +{//Section 5.2.1 line 812 + U8 anchor_str[4], // '_SM_' + checksum, + length, + major_version, + minor_version; + U16 max_structure_size; + U8 entry_point_revision, + formatted_area[5], + anchor_str2[5], // '_DMI_' + checksum2; + U16 table_length; + U32 table_address; + U16 structure_count; + U8 bcd_revision; +}; + +class CSMBIOSBIOSInfo +{//Section 7.1 line 922 + CSMBIOSHeader header; + U8 vendor, + version; + U16 start_address_segment; + U8 release_date, + rom_size; + U64 flags; + U8 extended_flags[2]; + U8 major_release, + minor_release, + embedded_controller_firmware_major_release, + embedded_controller_firmware_minor_release; + U16 extended_rom_size; +}; + +class CSMBIOSSystemInfo +{//Section 7.2 line 936 + CSMBIOSHeader header; + U8 manufacturer, + product_name, + version, + serial_number, + uuid[16], + wakeup_type, + sku_number, + family; +}; + +class CSMBIOSBaseboardInfo +{//Section 7.3 line 968 + CSMBIOSHeader header; + U8 manufacturer, + product, + version, + serial_number, + asset_tag, + feature_flags, + chassis_location; + U16 chassis_handle; + U8 board_type, + contained_object_handles_num; + U16 contained_object_handles[1]; //Variable length, member above gives length +}; + +class CSMBIOSEnclosureInfo +{//Section 7.4 line 984 + CSMBIOSHeader header; + U8 manufacturer, + type, + version, + serial_number, + asset_tag, + bootup_state, + power_supply_state, + thermal_state, + security_status; + U32 oem_defined; + U8 height, + power_cord_count, + contained_element_count, + contained_element_record_length, + contained_elements[1]; //array length == count * record_length; +}; + +class CSMBIOSEnclosureContainedElement +{//Section 7.4.4 line 999 + U8 contained_element_type, + contained_element_minimum, + contained_element_maximum; +}; + +class CSMBIOSProcessorInfo +{//Section 7.5 line 1010 + CSMBIOSHeader header; + U8 name, + type, + family, + manufacturer; + U64 id; + U8 version, + voltage; + U16 external_clock, + max_speed, + current_speed; + U8 status, + upgrade; + U16 l1_cache_handle, + l2_cache_handle, + l3_cache_handle; + U8 serial_number, + asset_tag, + part_number, + core_count, + cores_enabled, + thread_count; + U16 characteristics; +}; + +class CSMBIOSCacheInfo +{//Section 7.8 line 1168 + CSMBIOSHeader header; + U8 name; + U16 config, + max_size, + installed_size, + supported_sram_type, + installed_sram_type; + U8 cache_speed, + error_correction_type, + cache_type, + associativity; +}; + +class CSMBIOSConnectorInfo +{//Section 7.9 line 1198 + CSMBIOSHeader header; + U8 internal_name, + internal_type, + external_name, + external_type, + port_type; +}; + +class CSMBIOSSlotInfo +{//Section 7.10 line 1226 + CSMBIOSHeader header; + U8 name, + type, + data_bus_width, + current_usage, + length; + U16 id; + U8 flags1, + flags2; + U16 segment_group_number; + U8 bus_number, + device_function_number; +}; + +class CSMBIOSMemArrayInfo +{//Section 7.17 line 1519 + CSMBIOSHeader header; + U8 location, + use, + memory_error_correction; + U32 max_capacity; + U16 memory_error_info_handle, + mem_device_count; + U64 extended_max_capacity; +}; + +class CSMBIOSMemDeviceInfo +{//Section 7.18 line 1538 + CSMBIOSHeader header; + U16 memory_array_handle, + memory_error_info_handle, + total_width, + data_width, + size; + U8 form_factor, + device_set, + device_locator, + bank_locator, + type; + U16 type_detail, + speed; + U8 manufacturer, + serial_number, + asset_tag, + part_number, + attributes; + U32 extended_size; + U16 configured_speed, + min_voltage, + max_voltage, + configured_voltage; +}; + +class CSMBIOSBatteryInfo +{//Section 7.23 line 1723 + CSMBIOSHeader header; + U8 location, + manufacturer, + manufacture_date, + serial_number, + name, + chemistry, + capacity, + voltage, + sbds_version_number, + max_battery_data_error, + sbds_serial_number, + sbds_manufacture_date, + sbds_chemistry, + capacity_multiplier; + U32 oem; +}; + +#help_index "Devices;PCI" + +//PCI Registers, used with $LK,"PCIRead",A="MN:PCIReadU16"$ functions. +#define PCIR_VENDOR_ID 0x00 +#define PCIR_DEVICE_ID 0x02 +#define PCIR_COMMAND 0x04 +#define PCIR_STATUS 0x06 +#define PCIR_REVISION_ID 0x08 +#define PCIR_PROG_IF 0x09 +#define PCIR_SUB_CODE 0x0A +#define PCIR_CLASS_CODE 0x0B +#define PCIR_CACHE_LINE_SIZE 0x0C +#define PCIR_LATENCY_TIMER 0x0D +#define PCIR_HEADER_TYPE 0x0E +#define PCIR_BIST 0x0F +#define PCIR_BASE0 0x10 +#define PCIR_BASE1 0x14 +#define PCIR_BASE2 0x18 +#define PCIR_BASE3 0x1C +#define PCIR_BASE4 0x20 +#define PCIR_BASE5 0x24 +#define PCIR_SUBSYS_VENDOR_ID 0x2C +#define PCIR_SUBSYS_ID 0x2E +#define PCIR_EXPANSION_ROM 0x30 +#define PCIR_CAPABILITIES 0x34 +#define PCIR_INTERRUPT_LINE 0x3C +#define PCIR_INTERRUPT_PIN 0x3D +#define PCIR_MIN_GRANT 0x3E +#define PCIR_MAX_LATENCY 0x3F + +//PCI class codes +#define PCIC_STORAGE 0x1 +#define PCIC_NETWORK 0x2 + +//PCI subclass codes +#define PCISC_ETHERNET 0x0 +#define PCISC_AHCI 0x6 + +//PCI I/O ports +#define PCI_ADDR 0xCF8 +#define PCI_DATA 0xCFC + +class CPCIDev +{ + CPCIDev *next, *last; + U8 bus, dev, fun, + *vendor_str, + *dev_id_str, + class_code, + sub_code, + prog_if, + revision_id, + bist, + header_type, + latency_timer, + cache_line_size, + capabilities, + interrupt_line, + interrupt_pin, + min_grant, + max_latency; + U16 vendor_id, + device_id, + subsys_id, + subsys_vendor_id; + U32 base[6], + erom; +}; + +#help_index "Devices;Disk/AHCI" +#define AHCI_MAX_PORTS 32 + +//Physical Region Descriptor Table +#define AHCI_PRD_MAX_BYTES (4 * 1024 * 1024) //Max bytes that can go in one PRD entry ($ER$4 MiB). Section 4.2.3.3 Fig. 17 (DBC) +#define AHCI_PRDT_MAX_BLOCKS (U16_MAX + 1) //Max blocks you can transfer in one command. +#define AHCI_PRDT_MAX_LEN 8 //Max PRD entries in one command. This is equal to (MAX_BLOCKS * BLK_SIZE) ö MAX_BYTES. + +//Global Host Control (Controller) flags +#define AHCI_GHCf_HBA_RESET 0 +#define AHCI_GHCf_INTERRUPT_ENABLE 1 +#define AHCI_GHCf_AHCI_ENABLE 31 + +#define AHCI_CAPSf_S64A 31 //Supports 64-bit Addressing + +#define AHCI_CAPSEXTf_BOH 0 //Supports BIOS/OS Handoff +#define AHCI_CAPSEXTf_NVMP 1 //NVMHCI Supported & Present + +//BIOS/OS Handoff Control +#define AHCI_BOHCf_BOS 0 //BIOS-Owned Semaphore (BIOS owns controller) +#define AHCI_BOHCf_OOS 1 //OS-Owned Semaphore (OS owns controller) +#define AHCI_BOHCf_BB 4 //BIOS Busy (polling bit while BIOS cleans up things after ownership transfer) + +//Command Header flags +#define AHCI_CH_DESCf_A 5 //'ATAPI' bit. Set when ATAPI command is being sent. +#define AHCI_CH_DESCF_A (1 << AHCI_CH_DESCf_A) +#define AHCI_CH_DESCf_W 6 //'Write' bit. Set when data is being written. +#define AHCI_CH_DESCF_W (1 << AHCI_CH_DESCf_W) + +//Command FIS flags +#define AHCI_CF_DESCf_C 7 //'Command' bit. Set when FIS is an ATA command. +#define AHCI_CF_DESCF_C (1 << AHCI_CF_DESCf_C) + +//Port register flags +//Command and Status register flags +#define AHCI_PxCMDf_ST 0 //'Start'. Start processing commmand list. FRE must be set before. +#define AHCI_PxCMDf_SUD 1 //'Spin-Up Device'. For devices that support Staggered Spin-up. We attempt to set it for all ports. +#define AHCI_PxCMDf_POD 2 //'Power-On Device'. For devices that support Cold Presence. We attempt to set it for all ports. +#define AHCI_PxCMDf_FRE 4 //'FIS Receive Enable'. Allows the processing of FISes. +#define AHCI_PxCMDf_FR 14 //'FIS receive Running'. Status indicator for FRE. +#define AHCI_PxCMDf_CR 15 //'Command list Running'. Status indicator for ST. +#define AHCI_PxCMDf_ATAPI 24 //'Device is ATAPI'. When set, HBA turns on desktop LED when device is in use. For ATAPI devices. +#define AHCI_PxCMDF_ST (1 << AHCI_PxCMDf_ST) +#define AHCI_PxCMDF_SUD (1 << AHCI_PxCMDf_SUD) +#define AHCI_PxCMDF_POD (1 << AHCI_PxCMDf_POD) +#define AHCI_PxCMDF_FRE (1 << AHCI_PxCMDf_FRE) +#define AHCI_PxCMDF_FR (1 << AHCI_PxCMDf_FR) +#define AHCI_PxCMDF_CR (1 << AHCI_PxCMDf_CR) +#define AHCI_PxCMDF_ATAPI (1 << AHCI_PxCMDf_ATAPI) + +//Task File Data register flags +#define AHCI_PxTFDf_STS_ERR 0 // Error Bit of Status register + +//Signature types +#define AHCI_PxSIG_ATA 0x00000101 +#define AHCI_PxSIG_ATAPI 0xEB140101 +#define AHCI_PxSIG_SEMB 0xC33C0101 //Enclosure Management Bridge... rare to encounter in wild. +#define AHCI_PxSIG_PM 0x96690101 //Port multiplier... not relevant to PC-type systems. + +//Interrupt flags (same in PxIE and PxIS) +#define AHCI_PxIf_OFS 24 //Overflow Status +#define AHCI_PxIf_INFS 26 //SATA Interface Non-Fatal Error +#define AHCI_PxIf_IFS 27 //SATA Interface Fatal Error +#define AHCI_PxIf_HBDS 28 //Host Bus Data Error +#define AHCI_PxIf_HBFS 29 //Host Bus Fatal Error +#define AHCI_PxIf_TFE 30 //Task File Error, see $LK,"ATAS_ERR",A="MN:ATAS_ERR"$. +#define AHCI_PxIf_CPDS 31 //Cold Port Detect Status + +//COMRESET flags +//SATA Control register flags +#define AHCI_PxSCTLf_DET_INIT 1 +#define AHCI_PxSCTLF_DET_INIT (1 << AHCI_PxSCTLf_DET_INIT) +//SATA Status register flags +#define AHCI_PxSSTSF_DET_PRESENT 3 + +//SATA Error register flags +#define AHCI_PxSERR_ERR_I 0 // Recovered Data Integrity Error +#define AHCI_PxSERR_ERR_M 1 // Recovered Communication Error +#define AHCI_PxSERR_ERR_T 8 // Transient Data Integrity Error +#define AHCI_PxSERR_ERR_C 9 // Persistent Communication Error +#define AHCI_PxSERR_ERR_P 10 // SATA Protocol Error +#define AHCI_PxSERR_ERR_E 11 // Internal Error +#define AHCI_PxSERR_DIAG_I 17 // Phy Internal Error +#define AHCI_PxSERR_DIAG_C 21 // Link Layer CRC Error +#define AHCI_PxSERR_DIAG_H 22 // Handshake Error +#define AHCI_PxSERR_DIAG_S 23 // Link Sequence Error +#define AHCI_PxSERR_DIAG_T 24 // Transport State Transition Error + +class CAHCIPort +{//Port register layout + U32 cmd_list_base, + cmd_list_base_upper, + fis_base, + fis_base_upper, + interrupt_status, + interrupt_enable, + command, + reserved, + task_file_data, + signature, + sata_status, + sata_ctrl, + sata_error, + sata_active, + cmd_issue, + sata_notif, + fis_switch_ctrl, + device_sleep; + U8 reserved[40], + vendor[16]; +}; + +class CAHCIHba +{//HBA register layout + U32 caps, + ghc, //Global Host Control + interrupt_status, + ports_implemented, + version, + ccc_ctrl, //Command Completion Coalescing + ccc_ports, + em_location,//Enclosure Management + em_ctrl, + caps_ext, + bohc; + U8 reserved[116], + vendor[96]; + CAHCIPort ports[32]; +}; + +#define FISt_H2D 0x27 + +class CFisH2D +{//Host To Device + U8 type, + desc, //We are concerned with bit #7 ($LK,"AHCI_CF_DESCf_C",A="MN:AHCI_CF_DESCf_C"$) 1=command, 0=control. + command, + feature_low, + lba0, + lba1, + lba2, + device, + lba3, + lba4, + lba5, + feature_high; + U16 count; + U8 icc, + ctrl; + U32 reserved; +}; + +class CFisReceived +{ + U8 dma_fis[28], + reserved[4], + pio_fis[20], + reserved[12], + r_fis[20], + reserved[4], + devbits_fis[8], + unknown_fis[64], + reserved[96]; +}; + +class CPrdtEntry +{ + U32 data_base, + data_base_upper, + reserved, + data_byte_count; //bit 31 is "Interrupt on Completion". bits 21:0 are the actual count. +}; + +/* +Bits of first U32: + 4:0 - Command FIS Length, in U32s + 5 - ATAPI bit (A) for ATAPI command + 6 - Write bit (W) for write commands $LK,"AHCI_CH_DESCf_W",A="MN:AHCI_CH_DESCf_W"$ 1=write 0=read + 7 - Prefetchable (P) + 8 - Reset (R) + 9 - Built-in Self Test (BIST) + 10 - Clear busy upon R_OK + 11 - Reserved + 15:12 - Port Multiplier Port (PMP) + 31:16 - Physical Region Descriptor Table Length (PRDTL) +*/ +class CPortCmdHeader +{//What the CAHCIPort.cmd_list consists of. + U16 desc, + prdt_len; + U32 prd_byte_count, + cmd_table_base, + cmd_table_base_upper, + reserved[4]; +}; + +class CPortCmdTable +{ + U8 cmd_fis[64], + acmd[16], + reserved[48]; + CPrdtEntry prdt[8]; +}; + +class CAtapiReadCmd +{ + U8 command, + reserved; + U32 lba, + count; + U8 reserved, + ctrl, + zero[4]; +}; + +class CAtapiWriteCmd +{ + U8 command, + reserved; + U32 lba; + U8 reserved; + U16 count; +}; + +class CAtapiCloseCmd +{ + U8 command, + reserved, + code, + reserved; + U16 track_num; +}; + +class CAtapiModeHeader +{ + U16 data_length; + U8 reserved[4]; + U16 block_desc_len; +}; + +class CAtapiModeWritePage +{ + U8 code, //0 + length, + type, + mode, + block_type, + link_size, + reserved, + host_app_code, + session_format, + reserved; // 9 + U32 packet_size; // 10-13 + U16 audio_pause_length;// 14-15 + U8 media_catalog_num[16],//16-31 + recording_code[16],//32-47 + sub_0, + sub_1, + sub_2, + sub_3; +}; + +class CAtapiModeWriteList +{ + CAtapiModeHeader header; + CAtapiModeWritePage page; +}; + +//ATA_IDENTIFY command array indexes (array of U16s) +#define ATA_IDENT_SERIAL_NUM 10 +#define ATA_IDENT_MODEL_NUM 27 +#define ATA_IDENT_LBA48_CAPACITY 100 + +//See $LK,"::/Doc/Credits.DD"$. +#define ATA_NOP 0x00 +#define ATA_DEV_RST 0x08 +#define ATA_PACKET 0xA0 +#define ATA_READ_NATIVE_MAX 0xF8 +#define ATA_READ_NATIVE_MAX_EXT 0x27 +#define ATA_SET_MAX 0xF9 +#define ATA_SET_MAX_EXT 0x37 +#define ATA_READ_MULTI 0xC4 +#define ATA_READ_MULTI_EXT 0x29 +#define ATA_READ_DMA_EXT 0x25 +#define ATA_WRITE_MULTI 0xC5 +#define ATA_WRITE_MULTI_EXT 0x39 +#define ATA_WRITE_DMA_EXT 0x35 +#define ATA_IDENTIFY 0xEC +#define ATA_IDENTIFY_PACKET 0xA1 // IDENTIFY PACKET DEVICE, mirror of ATA_IDENTIFY for ATAPI + +#define ATAPI_FORMAT_UNIT 0x0400 +#define ATAPI_START_STOP_UNIT 0x1B00 +#define ATAPI_READ_CAPACITY 0x2500 +#define ATAPI_SEEK 0x2B00 +#define ATAPI_SYNC_CACHE 0x3500 +#define ATAPI_MODE_SELECT 0x5500 +#define ATAPI_CLOSE_TRACK_SESSION 0x5B00 +#define ATAPI_BLANK 0xA100 +#define ATAPI_READ 0xA800 +#define ATAPI_WRITE 0x2A00 +#define ATAPI_SET_CD_SPEED 0xBB00 + +#define ATAS_ERR 0x01 +#define ATAS_DRQ 0x08 +#define ATAS_DF 0x20 +#define ATAS_DRDY 0x40 +#define ATAS_BSY 0x80 + +#define ATAR0_DATA 0 +#define ATAR0_FEAT 1 +#define ATAR0_NSECT 2 +#define ATAR0_SECT 3 +#define ATAR0_LCYL 4 +#define ATAR0_HCYL 5 +#define ATAR0_SEL 6 +#define ATAR0_STAT 7 +#define ATAR0_CMD 7 +#define ATAR1_CTRL 2 + +#help_index "File/FileNames" +#define FILEMASK_JIT "*.ZC*;*.HH*" +#define FILEMASK_AOT "*.ZC*;*.HH*;*.PRJ*" +#define FILEMASK_SRC "*.ZC*;*.HH*;*.IN*;*.PRJ*" +#define FILEMASK_DD FILEMASK_SRC ";*.DD*" +#define FILEMASK_TXT FILEMASK_DD ";*.TXT*;*.CFG*" +#define FILEMASK_GR "*.GR*" + +#help_index "File/Low Level" +#define BLK_SIZE_BITS 9 +#define BLK_SIZE (1 << BLK_SIZE_BITS) +#define DVD_BLK_SIZE (4 * BLK_SIZE) +#define DVD_BOOT_LOADER_SIZE DVD_BLK_SIZE * 1 +#define INVALID_CLUS (-1) + +class CMBRPart +{ + U8 active, //0x80=active 0x00=inactive + start_head; + U16 start_cyl; + U8 type, + end_head; + U16 end_cyl; + U32 offset, //Sectors between MBR and first sector + size; //Sectors in drive +}; + +class CMasterBoot +{ + U8 code[440]; + U32 media_id; + U16 zero; + CMBRPart p[4]; + U16 signature; //AA55 +}; + +class CRedSeaBoot +{ + U8 jump_and_nop[3], + signature, reserved[4]; //MBR_PT_REDSEA=0x88. Distinguish from real FAT32 + I64 drv_offset, //For CD/DVD image copy. + sects, + root_clus, + bitmap_sects, + unique_id; + U8 code[462]; + U16 signature2; //0xAA55 +}; + +class CFAT32Boot +{ + U8 jump_and_nop[3], + oem_name[8]; + U16 bytes_per_sect; + U8 sects_per_clus; + U16 reserved_sects; + U8 copies_of_fat; + U16 max_root_dir_entries, //Not used + old_sects_in_drive; //Not used + U8 media_desc; //F64 for hard disk + U16 old_sects_per_fat, //Not used + sects_per_track, + num_heads; + U32 hidden_sects, + sects, + sects_per_fat; + U16 flags, + version; + U32 root_clus; + U16 file_system_info_sect, + backup_boot_sect; + U8 reserved[12], + log_drive_num, + unused, + ext_signature; //0x29 + U32 serial_num; + U8 vol_name[11], + fat_name[8], + code[420]; + U16 signature; +}; + +class CFAT32FileInfoSect +{ + U32 signature1; + U8 unknown[480]; + U32 signature2, + free_clus, + most_recently_alloced; + U8 reserved[12]; + U32 signature3; +}; + +class CFAT32DirEntry +{ + U8 name[11], + attr, + NTres, + CrtTimeTenth; + U16 CrtTime, + CrtDate, + ListAccDate, + clus_hi, + WrtTime, + WrtDate, + clus_lo; + U32 size; +}; + +class CFAT32DirEntryLong +{ + U8 ord; + U16 name1[5]; + U8 attr, + type, + xsum; + U16 name2[6], + zero, + name3[2]; +}; + +#define FAT32_ENTRIES_PER_BLK (BLK_SIZE / sizeof(CFAT32DirEntry)) +#define FAT32_ENTRIES_BITS Bsf(FAT32_ENTRIES_PER_BLK) + +class CPalindromeU16 +{ + U16 little, big; +}; + +class CPalindromeU32 +{ + U32 little, big; +}; + +class CISODate +{ + U8 year, mon, day, hour, min, sec, sec100; +}; + +class CISODirEntry +{ + U8 len, ext_attr_len; + CPalindromeU32 loc; + CPalindromeU32 size; + CISODate date; + U8 flags, file_unit_size, interleave; + CPalindromeU16 vol_seq_num; + U8 name_len, name; +}; + +class CISOPathEntry +{ + U8 name_len, zero; + U32 blk; + U16 parent_entry_num, + name[1]; //Aligned to U16 boundaries +}; + +//ISO9660 +#define ISOT_BOOT_RECORD 0 +#define ISOT_PRI_VOL_DESC 1 +#define ISOT_SUPPLEMENTARY_DESC 2 +#define ISOT_VOL_DRIVE_DESC 3 +#define ISOT_TERMINATOR 255 + +class CISOPriDesc +{ + U8 type, + id[5], + version, + unused1, + system_id[32], + vol_id[32], + unused2[8]; + CPalindromeU32 vol_space_size; + U8 unused3[32]; + CPalindromeU16 vol_set_size; + CPalindromeU16 vol_seq_num; + CPalindromeU16 log_block_size; + CPalindromeU32 path_table_size; + U32 type_l_path_table, + opt_type_l_path_table, + type_m_path_table, + opt_type_m_path_table; + CISODirEntry root_dir_record; + U8 vol_set_id[128], + publisher_id[128], + preparer_id[128], + pad[307], + file_structure_version, + pad[1166]; +}; + +#define ISO_BASE_YEAR 1900 +#define ISO_ATTR_DIR 2 + +//Red Sea Attributes +//See $LK,"ST_FILE_ATTRS",A="MN:ST_FILE_ATTRS"$ +#define RS_ATTR_READ_ONLY 0x01 //R +#define RS_ATTR_HIDDEN 0x02 //H +#define RS_ATTR_SYSTEM 0x04 //S +#define RS_ATTR_VOL_ID 0x08 //V +#define RS_ATTR_DIR 0x10 //D +#define RS_ATTR_ARCHIVE 0x20 //A +#define RS_ATTR_LONG_NAME (RS_ATTR_READ_ONLY | RS_ATTR_HIDDEN | RS_ATTR_SYSTEM | RS_ATTR_VOL_ID) +#define RS_ATTR_LONG_NAME_MASK (RS_ATTR_LONG_NAME | RS_ATTR_DIR | RS_ATTR_ARCHIVE) +#define RS_ATTR_DELETED 0x100 //X +#define RS_ATTR_RESIDENT 0x200 //T +#define RS_ATTR_CONTIGUOUS 0x400 //C +#define RS_ATTR_FIXED 0x800 //F + +#help_index "File/CD DVD" +//Media types for $LK,"DVDImageWrite",A="MN:DVDImageWrite"$() +#define MT_CD 1 +#define MT_DVD 2 + +#help_index "File/Low Level;File/Program Routines" +//CDirEntry flags (Used by $LK,"FileMgr",A="MN:FileMgr"$()) +#define CDIR_FILENAME_LEN 38 //Must include terminator zero +public class CDirEntry +{ + CDirEntry *next, *parent, *sub; + U8 *full_name; + I64 user_data, user_data2; + + U0 start; + U16 attr; + U8 name[CDIR_FILENAME_LEN]; + I64 clus, size; + CDate datetime; +}; +#define CDIR_SIZE (sizeof(CDirEntry) - offset(CDirEntry.start)) + +#help_index "File/Program Routines" +//File Util Flags +//See $LK,"ST_FILE_UTIL_FLAGS",A="MN:ST_FILE_UTIL_FLAGS"$ +#define FUf_RECURSE 0 // r +#define FUf_DIFF 1 // d +#define FUf_DEL 1 // d +#define FUf_IGNORE 2 // i +#define FUf_ALL 3 // a +#define FUf_CANCEL 4 // c +#define FUf_REPLACE 5 // R +#define FUf_PUBLIC 6 // p +#define FUf_MAP 7 // m +#define FUf_SINGLE 8 // s +#define FUf_JUST_DIRS 9 // D +#define FUf_JUST_FILES 10 // F +#define FUf_JUST_TXT 11 // T +#define FUf_JUST_DD 12 // $$ +#define FUf_JUST_SRC 13 // S +#define FUf_JUST_AOT 14 // A +#define FUf_JUST_JIT 15 // J +#define FUf_JUST_GR 16 // G +#define FUf_CLUS_ORDER 17 // O (Move disk head one direction) +#define FUf_SCAN_PARENTS 18 // P +#define FUf_FLATTEN_TREE 19 // f +#define FUf_WHOLE_LABELS 20 // l +#define FUf_WHOLE_LABELS_BEFORE 21 // lb +#define FUf_WHOLE_LABELS_AFTER 22 // la + +#define FUF_RECURSE (1 << FUf_RECURSE) +#define FUF_DIFF (1 << FUf_DIFF) +#define FUF_DEL (1 << FUf_DEL) +#define FUF_IGNORE (1 << FUf_IGNORE) +#define FUF_ALL (1 << FUf_ALL) +#define FUF_CANCEL (1 << FUf_CANCEL) +#define FUF_REPLACE (1 << FUf_REPLACE) +#define FUF_PUBLIC (1 << FUf_PUBLIC) +#define FUF_MAP (1 << FUf_MAP) +#define FUF_SINGLE (1 << FUf_SINGLE) +#define FUF_JUST_DIRS (1 << FUf_JUST_DIRS) +#define FUF_JUST_FILES (1 << FUf_JUST_FILES) +#define FUF_JUST_TXT (1 << FUf_JUST_TXT) +#define FUF_JUST_DD (1 << FUf_JUST_DD) +#define FUF_JUST_SRC (1 << FUf_JUST_SRC) +#define FUF_JUST_AOT (1 << FUf_JUST_AOT) +#define FUF_JUST_JIT (1 << FUf_JUST_JIT) +#define FUF_JUST_GR (1 << FUf_JUST_GR) +#define FUF_CLUS_ORDER (1 << FUf_CLUS_ORDER) +#define FUF_SCAN_PARENTS (1 << FUf_SCAN_PARENTS) +#define FUF_FLATTEN_TREE (1 << FUf_FLATTEN_TREE) +#define FUF_WHOLE_LABELS (1 << FUf_WHOLE_LABELS) +#define FUF_WHOLE_LABELS_BEFORE (1 << FUf_WHOLE_LABELS_BEFORE) +#define FUF_WHOLE_LABELS_AFTER (1 << FUf_WHOLE_LABELS_AFTER) + +#define FUG_FILES_FIND (FUF_RECURSE | FUF_SINGLE | FUF_CLUS_ORDER | FUF_JUST_DIRS | FUF_JUST_FILES | FUF_JUST_TXT | \ + FUF_JUST_DD | FUF_JUST_SRC | FUF_JUST_AOT | FUF_JUST_JIT | FUF_JUST_GR | FUF_FLATTEN_TREE) +#define FUG_FILE_FIND (FUF_JUST_DIRS | FUF_JUST_FILES | FUF_SCAN_PARENTS) + +#help_index "File/Low Level" +//See $LK,"ST_BLKDEV_TYPES",A="MN:ST_BLKDEV_TYPES"$ +#define BDT_NULL 0 +#define BDT_RAM 1 +#define BDT_ATA 2 +#define BDT_ISO_FILE_READ 3 +#define BDT_ISO_FILE_WRITE 4 +#define BDT_ATAPI 5 +#define BDT_TYPES_NUM 6 + +#define BDf_REMOVABLE 0 +#define BDf_INITIALIZED 1 +#define BDf_READ_ONLY 2 +#define BDf_READ_ONLY_OVERRIDE 3 +#define BDf_LAST_WAS_WRITE 4 +#define BDf_READ_CACHE 5 +#define BDf_FORMAT 6 +#define BDf_INIT_IN_PROGRESS 7 +#define BDf_EXT_SIZE 8 +#define BDf_INTERNAL_BUF 9 + +#define BDF_REMOVABLE (1 << BDf_REMOVABLE) +#define BDF_INITIALIZED (1 << BDf_INITIALIZED) +#define BDF_READ_ONLY (1 << BDf_READ_ONLY) +#define BDF_READ_ONLY_OVERRIDE (1 << BDf_READ_ONLY_OVERRIDE) +#define BDF_LAST_WAS_WRITE (1 << BDf_LAST_WAS_WRITE) +#define BDF_READ_CACHE (1 << BDf_READ_CACHE) +#define BDF_FORMAT (1 << BDf_FORMAT) +#define BDF_INIT_IN_PROGRESS (1 << BDf_INIT_IN_PROGRESS) +#define BDF_EXT_SIZE (1 << BDf_EXT_SIZE) +#define BDF_INTERNAL_BUF (1 << BDf_INTERNAL_BUF) + +//locked flags +#define BDlf_LOCKED 0 + +#define BLKDEVS_NUM 26 +#define BD_SIGNATURE_VAL 'BDSV' + +public class CBlkDev +{ + CBlkDev *lock_fwding; //If two blkdevs on same controller, use just one lock + CTask *owning_task; + CAHCIPort *ahci_port; + U8 *prd_buf, + first_drive_let, + *RAM_disk, + *file_disk_name; + CFile *file_disk; + U32 bd_signature, + type, + flags, + blk_size, + max_reads, + max_writes; + I64 drv_offset, + init_root_dir_blks, + max_blk, + locked_flags, + port_num; + U16 *dev_id_record; + F64 last_time; +}; + +//Drive locked_flags +#define DVlf_LOCKED 0 + +//See $LK,"ST_DRIVE_TYPES",A="MN:ST_DRIVE_TYPES"$ +#define FSt_NULL 0 +#define FSt_REDSEA 1 //Supported +#define FSt_FAT32 2 //Supported except for short names, to some degree +#define FSt_ISO9660 3 //Supported (CD/DVD) +#define FSt_NTFS 4 //Not Supported +#define FSt_LINUX 5 //Not Supported +#define FSt_SWAP 6 //Not Supported +#define FSt_UNKNOWN 7 +#define FSt_TYPES_NUM 8 +#define FSG_TYPE_MASK 0x7FFF +//File system type flags +#define FStf_DISABLE 15 + +#define MBR_PT_FAT32a 0x0B +#define MBR_PT_FAT32b 0x0C +#define MBR_PT_FAT32c 0x1B +#define MBR_PT_FAT32d 0x1C +#define MBR_PT_FAT32e 0x8B +#define MBR_PT_FAT32f 0x8C +#define MBR_PT_NTFS 0x07 +#define MBR_PT_REDSEA 0x88 +#define MBR_PT_LINUX 0x83 +#define MBR_PT_SWAP 0x82 + +class CFreeList +{ + CFreeList *next, *last; + I64 start, size; +}; + +#define DRIVES_NUM 26 + +#define DRIVE_SIGNATURE_VAL 'DVSV' +public class CDrive +{ +//Don't access ->drv_let directly in case a drive has been remapped. + //Use $LK,"Drive2Letter",A="MN:Drive2Letter"$(). + I64 locked_flags; + U32 drive_signature; + U8 drv_let, pad; + U16 fs_type; + I64 drv_offset, + size, + prt_num, + file_system_info_sect, + fat1, fat2, + root_clus, + data_area, + spc; //sectors per cluster + CDate fat32_local_time_offset; + CTask *owning_task; + CBlkDev *bd; + + CFAT32FileInfoSect *fis; + I64 fat_blk_dirty, + cur_fat_blk_num; + U32 *cur_fat_blk; + CFreeList *next_free, *last_free; +}; + +#define DISK_CACHE_HASH_SIZE 0x2000 + +class CCacheBlk +{ + CCacheBlk *next_lru, *last_lru; + CCacheBlk *next_hash, *last_hash; + CDrive *drive; + I64 blk; + U8 body[BLK_SIZE]; +}; + +#help_index "File/System" +#define DEFAULT_ISO_FILENAME "::/Tmp/CDDVD.ISO" +#define DEFAULT_ISO_C_FILENAME "::/Tmp/CDDVD.ISO.C" + +public class CBlkDevGlobals +{ + CBlkDev *blkdevs; + CDrive *drvs, + *let_to_drive[32]; + CAHCIHba *ahci_hba; + U8 *default_iso_filename, //$TX,"\"::/Tmp/CDDVD.ISO\"",D="DEFAULT_ISO_FILENAME"$ + *default_iso_c_filename, //$TX,"\"::/Tmp/CDDVD.ISO.C\"",D="DEFAULT_ISO_C_FILENAME"$ + *tmp_filename, + *home_dir, + boot_drive_let, + first_hd_drive_let, + first_dvd_drive_let; + CCacheBlk *cache_base, + *cache_ctrl, + **cache_hash_table; + I64 cache_size, + read_count, + write_count, + mount_ide_auto_count, + cmd_slot_count, + ins_port;// Installed-from CD/DVD controller. + Bool dvd_boot_is_good, + ahci64; +}; + +#help_index "File/Internal" +public class CDirContext +{ + CDrive *old_dv, *drive; + U8 *old_dir, *mask; +}; + +#help_index "File/CFile" +#define FFB_NEXT_BLK I64_MAX + +#define FF_WRITE 1 +#define FF_NEW_FILE 2 +#define FF_BUF_DIRTY 4 +#define FF_NEEDS_WRITE 8 +#define FF_CONTIGUOUS 16 +#define FF_USE_OLD_DATETIME 32 + +public class CFile //See $LK,"::/Demo/Disk/DataBase.ZC"$. +{ + I64 flags; + CDirEntry de; + CDrive *drive; + I64 fblk_num, clus, file_clus_num, max_blk; + U8 *clus_buf; +}; + +#help_index "Memory/Heap" +#define _CONFIG_HEAP_DEBUG FALSE + +#if _CONFIG_HEAP_DEBUG +class CMemUnused +{ + CHeapCtrl *hc; + U8 *caller1, *caller2; + CMemUnused *next; + I64 size; +}; +class CMemUsed +{ + CHeapCtrl *hc; + U8 *caller1, *caller2; + CMemUsed *next, *last; + I64 size; + U0 start; +}; +#else +class CMemUnused +{ + U0 hc; + U0 caller1, caller2; + CMemUnused *next; + I64 size; +}; +class CMemUsed +{ + CHeapCtrl *hc; + U0 caller1, caller2; + U0 next, last; + I64 size; + U0 start; +}; +#endif + +#help_index "Memory/BlkPool" +#help_file "::/Doc/Pags" + +#define MBS_USED_SIGNATURE_VAL 'MBUs' +#define MBS_UNUSED_SIGNATURE_VAL 'MBUn' +class CMemBlk +{ + CMemBlk *next, *last; + U32 mb_signature, pags; +}; + +#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 MEM_PAG_BITS 9 +#define MEM_PAG_SIZE (1 << MEM_PAG_BITS) +#define MEM_HEAP_HASH_SIZE 1024 +#define MEM_FREE_PAG_HASH_SIZE 0x100 +//It is common to $LK,"MAlloc",A="MN:MAlloc"$() exact powers of two. There is some overhead. +//We add 1 pag, so a request is not rounded-up to next power of two. +#define MEM_EXTRA_HASH2_PAGS 1 + +#define MEM_SYSTEM_STACK (MEM_PAG_SIZE * 512) //Like 16384*MEM_PAG_SIZE +#define MEM_EXECUTIVE_STACK (MEM_PAG_SIZE * 512) +#define MEM_INTERRUPT_STACK (MEM_PAG_SIZE * 512) +#define MEM_DEFAULT_STACK (MEM_PAG_SIZE * 512) + +#define TASK_HASH_TABLE_SIZE (1 << 10) + +//locked flags +#define BPlf_LOCKED 0 +public class CBlkPool +{ + I64 locked_flags, alloced_u8s, used_u8s; + CMemBlk *mem_free_list, + *mem_free_2meg_list, //This is for Sup1CodeScraps/Mem/Mem2Meg.ZC. + *free_pag_hash[MEM_FREE_PAG_HASH_SIZE], + *free_pag_hash2[64 - MEM_PAG_BITS]; +}; + +#help_index "Memory/HeapCtrl" +//locked flags +#define HClf_LOCKED 0 + +#define HEAP_CTRL_SIGNATURE_VAL 'HcSV' +public class CHeapCtrl +{ + CBlkPool *bp; + U32 hc_signature, pad; + I64 locked_flags, alloced_u8s, used_u8s; + CTask *mem_task; + CMemBlk *next_mem_blk, *last_mem_blk; + CMemBlk *last_mergable; + CMemUnused *malloc_free_list; + CMemUsed *next_um, *last_um; + CMemUnused *heap_hash[MEM_HEAP_HASH_SIZE / sizeof(U8 *)]; +}; + +#help_index "Devices;Memory/Page Tables" +public class CDevGlobals +{ + CIDTEntry *idt; + U8 *mem64_ptr; + U8 *uncached_alias; //Alias of lowest 4Gig. + U8 mp_apic_ids[MP_PROCESSORS_NUM]; + CMemRange mem32_head; + CPCIDev pci_head; + U64 user_int_bitmap; +}; + +#help_index "Graphics/Color;Graphics/Device Contexts" +//Raster operations +#define ROPB_EQU 0x00 +#define ROPB_XOR 0x01 +#define ROPB_COLLISION 0x02 +#define ROPB_MONO 0x03 +#define ROPBF_HALF_RANGE_COLOR 0x10 +#define ROPBF_TWO_SIDED 0x20 +#define ROPBF_DITHER 0x40 +#define ROPBF_PROBABILITY_DITHER 0x80 + +#define ROP_EQU (ROPB_EQU << 8) +#define ROP_XOR (ROPB_XOR << 8) +#define ROP_COLLISION (ROPB_COLLISION << 8) +#define ROP_MONO (ROPB_MONO << 8) + +//These are just for $LK,"ROPF_PROBABILITY_DITHER",A="MN:ROPF_PROBABILITY_DITHER"$ +//See $LK,"DCLighting",A="MN:DCLighting"$(). +#define ROPF_HALF_RANGE_COLOR 0x1000 +#define ROPF_TWO_SIDED 0x2000 + +//These always go in the c1.rop of a CColorROPU32 +#define ROPF_DITHER 0x40000000 +#define ROPF_PROBABILITY_DITHER 0x80000000 + +#help_index "Graphics/Color" +#define TRANSPARENT 0xFF +#define BLACK 0 +#define BLUE 1 +#define GREEN 2 +#define CYAN 3 +#define RED 4 +#define PURPLE 5 +#define BROWN 6 +#define LTGRAY 7 +#define DKGRAY 8 +#define LTBLUE 9 +#define LTGREEN 10 +#define LTCYAN 11 +#define LTRED 12 +#define LTPURPLE 13 +#define YELLOW 14 +#define WHITE 15 + +#define COLORS_NUM 16 +#define COLOR_INVALID 16 +#define COLOR_MONO 0xFF + +public U16 class CColorROPU16 //Don't use this, use CColorROPU32 +{ + U8 color, rop; +}; +public U32 class CColorROPU32 +{ + CColorROPU16 c0, c1; +}; +#define COLORROP_COLORS_MASK 0x00FF00FF +#define COLORROP_NO_ROP0_MASK 0xFFFF00FF +#define COLORROP_BITS 16 +public U32 class CBGR24 +{ + U8 b, g, r, pad; +}; +public U32 class CBGR32 +{ + U8 b, g, r, a; +}; +public I64 class CBGR48 +{ + U16 b, g, r, pad; +}; + +#help_index "Keyboard Devices;Char/Input;StdIn" +#define KBD_PORT 0x60 +#define KBD_CTRL 0x64 + +#define KBDC_LED 0xED +#define KBDC_DISABLE_MS 0xA7 +#define KBDC_ENABLE_MS 0xA8 +#define KBDC_ENABLE_KBD 0xAE +#define KBDC_TYPEMATIC 0xF3 +#define KBDC_SCAN_CODES 0xF0 + +public class CKbdStateGlobals +{ + I64 scan_code, //See $LK,"scan codes",A="FI:::/Doc/CharOverview.DD"$ + last_down_scan_code, + count, //Count of keys pressed since boot. + timestamp, //Output: TSCGet when event. + new_key_timestamp; //Output: TSCGet when new key event. + CFifoU8 *fifo, *fifo2; //Private + CFifoI64 *scan_code_fifo; + U32 down_bitmap[8], //BitTest, $LK,"Bt",A="MN:Bt"$(), with a merged scan code. (Left and right shift merged, for example.) + down_bitmap2[8]; //BitTest, $LK,"Bt",A="MN:Bt"$(), with an unmerged scan code. + Bool reset, //Private: Reset KbdMouse + irqs_working; //Private +}; + +#help_index "Mouse" +public class CMouseHardStateGlobals +{ + CD3I64 pos, //Position in pixels + prescale, + raw_data; + CD3 scale; + F64 speed; //Output: How fast the user is moving it. + I64 timestamp, //Output: TSCGet when event. + install_attempts, //Private + pkt_size; //Private + CFifoU8 *fifo, *fifo2; //Private + Bool bttns[5], + raw_bttns[5], + raw_mode, + has_wheel, + has_ext_bttns, + enabled, + event, //Private + installed, //Private + install_in_progress, //Private + irqs_working; //Private +}; + +public class CMouseStateGlobals +{ + CD3I64 pos, //Position in pixels + pos_text, //Position in text rows,cols + presnap, + offset; + CD3 scale; + F64 speed; //Output: How fast the user is moving it. + I64 timestamp; //Output: TSCGet when event. + F64 dbl_time, //Input: Time threshold for calling it a double click. + left_dbl_time, //Private + right_dbl_time; //Private + Bool lb, //Left Button + rb, //Right Button + show, + has_wheel, + left_dbl, //Private + left_down_sent, //Private + right_dbl, //Private + right_down_sent; //Private +}; + +public class CGridGlobals +{ + Bool snap format "$$CB,\"Snap Grid\"$$\n", + show format "$$CB,\"Show Grid\"$$\n", + coord format "$$CB,\"Show Coordinates\"$$\n"; + U8 pad[5]; + F64 x format "$$DA-TRM,A=\"X Spacing:%6.3f\"$$\n", + y format "$$DA-TRM,A=\"Y Spacing:%6.3f\"$$\n", + z format "$$DA-TRM,A=\"Z Spacing:%6.3f\"$$\n", + x_offset format "$$DA-TRM,A=\"X Offset :%6.3f\"$$\n", + y_offset format "$$DA-TRM,A=\"Y Offset :%6.3f\"$$\n", + z_offset format "$$DA-TRM,A=\"Z Offset :%6.3f\"$$\n", + x_speed format "$$DA-TRM,A=\"X Speed :%6.3f\"$$\n", + y_speed format "$$DA-TRM,A=\"Y Speed :%6.3f\"$$\n", + z_speed format "$$DA-TRM,A=\"Z Speed :%6.3f\"$$\n"; +}; + +#help_index "Ctrls" +#define CTRLT_GENERIC 0 +#define CTRLT_WIN_HSCROLL 1 //unique +#define CTRLT_WIN_VSCROLL 2 //unique +#define CTRLT_VIEWING_ANGLES 3 //unique + +#define CTRLF_SHOW 1 +#define CTRLF_BORDER 2 +#define CTRLF_CAPTURE_LEFT_MS 4 +#define CTRLF_CAPTURE_RIGHT_MS 8 +#define CTRLF_CLICKED 16 + +#define WSSf_SET_TO_POS 0 + +public class CWinScroll +{ + I64 min, pos, max; + U32 flags; + U8 color, pad[3]; +}; + +public class CViewAngles +{ + I64 sx, sy, sz; + F64 ax, ay, az; + CColorROPU32 cx, cy, cz, cbd, cbg, config; +}; + +public class CCtrl +{ + CCtrl *next, *last; + CTask *win_task; + I64 type, flags; + + //win pix coordinates + I64 left, right, top, bottom; + + //screen pix coordinates (derived) + I64 screen_left, screen_right, screen_top, screen_bottom; + + U8 *state; + + //called on resize + U0 (*update_derived_vals)(CCtrl *c); + U0 (*draw_it)(CDC *dc, CCtrl *c); + + Bool (*inside_ctrl)(CCtrl *c, I64 x, I64 y); //For nonbox shapes + U0 (*left_click)( CCtrl *c, I64 x, I64 y, Bool down); + U0 (*right_click)(CCtrl *c, I64 x, I64 y, Bool down); + U0 (*wheel_chg)( CCtrl *c, I64 delta); +}; + +#help_index "Menus" +public class CMenuEntry +{ + CMenuEntry *next; + CMenuEntry *sub; + U8 name[32]; + I64 message_code, arg1, arg2; + Bool checked, dir, pad[6]; +}; + +public class CMenu +{ + CMenu *next; + CMenuEntry *sub; + CTask *task; + I64 flags; + U8 attr, pad[7]; +}; + +#help_index "Task" +class CBpt +{ + CBpt *next; + U8 *addr, + val, pad[7]; +}; + +class CExcept +{ + CExcept *next, *last; + I64 handler_catch, handler_untry, + rsp, rbp, rflags, rsi, rdi, r10, r11, r12, r13, r14, r15; +}; + +class CFPU +{ + U8 body[512]; +}; + +#help_index "Job/Exe;Task/Job/Exe" +#define JOBf_WAKE_MASTER 0 +#define JOBf_FOCUS_MASTER 1 +#define JOBf_EXIT_ON_COMPLETE 2 +#define JOBf_DONT_FILTER 3 +#define JOBf_HIGHEST_PRIORITY 4 +//MP flags +#define JOBf_DONE 5 +#define JOBf_DISPATCHED 6 +#define JOBf_FREE_ON_COMPLETE 7 +#define JOBf_ADD_TO_QUE 8 + +#define JOBT_TEXT_INPUT 0 //$LK,"TaskText",A="MN:TaskText"$() Feed StdIn +#define JOBT_MESSAGE 1 //$LK,"TaskMessage",A="MN:TaskMessage"$() Post message +#define JOBT_EXE_STR 2 //$LK,"TaskExe",A="MN:TaskExe"$() Compile & execute src code text +//MP cmds +#define JOBT_CALL 3 //$LK,"JobQueue",A="MN:JobQueue"$() Tell MP to call function +#define JOBT_SPAWN_TASK 4 //$LK,"Spawn",A="MN:Spawn"$() Tell MP to spawn task + +class CJob +{ + CJob *next, *last; + CJobCtrl *ctrl; + I64 job_code, flags, message_code; + + I64 (*addr)(U8 *fun_arg); + U8 *fun_arg; + + U8 *aux_str; + I64 aux1, aux2, //Sometimes called arg1 and arg2. (Windows message param1 param2) + res; + + CTask *spawned_task, + *master_task; +}; + +#define JOBCf_LOCKED 0 +class CJobCtrl +{ + CJob *next_waiting, *last_waiting; + CJob *next_done, *last_done; + I64 flags; +}; + +#help_index "Messages" +//See $LK,"::/Demo/MessageLoop.ZC"$ +#define MESSAGE_NULL 0 +#define MESSAGE_CMD 1 +#define MESSAGE_KEY_DOWN 2 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press +#define MESSAGE_KEY_UP 3 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press +#define MESSAGE_MS_MOVE 4 //(x,y) +#define MESSAGE_MS_L_DOWN 5 //(x,y) +#define MESSAGE_MS_L_UP 6 //(x,y) +#define MESSAGE_MS_L_D_DOWN 7 //(x,y) +#define MESSAGE_MS_L_D_UP 8 //(x,y) +#define MESSAGE_MS_R_DOWN 9 //(x,y) +#define MESSAGE_MS_R_UP 10 //(x,y) +#define MESSAGE_MS_R_D_DOWN 11 //(x,y) +#define MESSAGE_MS_R_D_UP 12 //(x,y) + +//Fake messages used to send both an up and down. +#define MESSAGE_KEY_DOWN_UP -2 //Down & UP +#define MESSAGE_MS_L_DOWN_UP -5 //Down & Up +#define MESSAGE_MS_L_D_DOWN_UP -7 //Down & Up +#define MESSAGE_MS_R_DOWN_UP -9 //Down & Up +#define MESSAGE_MS_R_D_DOWN_UP -11 //Down & Up + +#help_index "Task/Settings" +#define TSF_SAME_SONG 1 +public class CTaskSettings +{ + CTaskSettings *next; + U8 *cur_dir; + I64 left, right, top, bottom; + U0 (*draw_it)(CTask *task, CDC *dc); + U0 (*task_end_cb)(); + CTask *song_task, *animate_task; + I64 scroll_x, scroll_y, scroll_z; + CBGR24 palette[COLORS_NUM]; + U32 win_inhibit; + U8 text_attr, title_src, + border_attr, border_src, + task_title[STR_LEN]; + Bool border, hide_cursor, highlight_cursor, scroll, autocomplete, pad[3]; +#assert !($$ & 7) +}; + +#help_index "Task" +//CTask.border_src +#define BDS_CONST 0 +#define BDS_CUR_DRIVE 1 +#define BDS_ED_FILENAME_DRIVE 2 + +//CTask.title_src +#define TTS_CONST 0 +#define TTS_LOCKED_CONST 1 //This is not strictly enforced +#define TTS_TASK_NAME 2 +#define TTS_ED_FILENAME 3 +#define TTS_CUR_LEX 4 + +//CTask.task_flags +//See $LK,"ST_TASK_FLAGS",A="MN:ST_TASK_FLAGS"$ +#define TASKf_TASK_LOCK 0 +#define TASKf_KILL_TASK 1 +#define TASKf_SUSPENDED 2 +#define TASKf_IDLE 3 +#define TASKf_CMD_LINE_PROMPT 4 +#define TASKf_INPUT_FILTER_TASK 5 +#define TASKf_FILTER_INPUT 6 +#define TASKf_HAS_SONG 7 +#define TASKf_DISABLE_BPTS 8 +#define TASKf_AWAITING_MESSAGE 9 +#define TASKf_BREAK_LOCKED 10 +#define TASKf_PENDING_BREAK 11 +#define TASKf_BREAK_TO_SHIFT_ESC 12 +#define TASKf_KILL_AFTER_DEBUG 13 +#define TASKf_NONTIMER_RAND 14 +#define TASKf_FLAGS_NUM 15 + +//CTask.display_flags +#define DISPLAYf_SHOW 0 +#define DISPLAYf_NOT_RAW 1 +#define DISPLAYf_SILENT 2 +#define DISPLAYf_NO_BORDER 3 +#define DISPLAYf_WIN_ON_TOP 4 +#define DISPLAYf_CHILDREN_NOT_ON_TOP 5 +#define DISPLAYf_FLAGS_NUM 6 + +#define TASK_SIGNATURE_VAL 'TskS' +#define TASK_NAME_LEN 32 +#define TASK_EXCEPT_CALLERS 8 +class CTaskStack +{ + CTaskStack *next_stack; + I64 stack_size, stack_ptr; + U0 stack_base; +}; + +#define DYING_JIFFIES ToI64(JIFFY_FREQ / 5) +class CTaskDying +{ + CTask *next, *last; + I64 wake_jiffy; +}; + +public class CTask //The Fs segment register points to current CTask. +{ + CTask *addr; //Self-addressed pointer + U32 task_signature, win_inhibit; +#assert $$ == offset(CTaskDying.wake_jiffy) + I64 wake_jiffy; + U32 task_flags, display_flags; + + CHeapCtrl *code_heap, *data_heap; + + CDoc *put_doc, *display_doc, //When double buffering, these two differ. + *border_doc; + I64 win_left, win_right, win_top, win_bottom; + + CDrive *cur_dv; + U8 *cur_dir; + + CTask *parent_task, + *next_task, *last_task, + *next_input_filter_task, *last_input_filter_task, + *next_sibling_task, *last_sibling_task, + *next_child_task, *last_child_task; + + //These are derived from left,top,right,bottom + I64 win_width, win_height, + pix_left, pix_right, pix_width, //These are in pixs, not characters + pix_top, pix_bottom, pix_height, + scroll_x, scroll_y, scroll_z; + + //These must be in this order + //for $LK,"TASK_CONTEXT_SAVE",A="FF:::/Kernel/Sched.ZC,TASK_CONTEXT_SAVE"$ and $LK,"_TASK_CONTEXT_RESTORE",A="FF:::/Kernel/Sched.ZC,_TASK_CONTEXT_RESTORE"$ + I64 rip, rflags, rsp, rsi, rax, rcx, rdx, rbx, rbp, rdi, r8, r9, r10, r11, r12, r13, r14, r15; + CCPU *gs; + CFPU *fpu_mmx; + I64 swap_counter; + + U0 (*draw_it)(CTask *task, CDC *dc); + + U8 task_title[STR_LEN], + task_name[TASK_NAME_LEN], + wallpaper_data[4096], + + title_src, border_src, + text_attr, border_attr; + U16 win_z_num, pad; + + CTaskStack *stack; + + CExcept *next_except, *last_except; + I64 except_rbp, //throw routine's RBP + except_ch; //throw(ch) + U8 *except_callers[TASK_EXCEPT_CALLERS]; + + Bool catch_except; + Bool new_answer; + U8 answer_type, pad[5]; + I64 answer; + F64 answer_time; + CBpt *bpt_list; + CCtrl *next_ctrl, *last_ctrl; + CMenu *cur_menu; + CTaskSettings *next_settings; + CMathODE *next_ode, *last_ode; + F64 last_ode_time; + CHashTable *hash_table; + + CJobCtrl server_ctrl; + CCompCtrl *next_cc, *last_cc; + CHashFun *last_fun; + + U0 (*task_end_cb)(); + CTask *song_task, *animate_task; + I64 rand_seed, + task_num, + fault_num, fault_err_code; + CTask *popup_task, + *debug_task; + CWinScroll horz_scroll, vert_scroll; + + I64 user_data; +#assert !($$ & 7) +}; + +class CTSS +{ + U32 res1; + I64 rsp0, rsp1, rsp2, res2, + ist1, ist2, ist3, ist4, ist5, ist6, ist7, res3; + U16 res4, io_map_offset; + U8 io_map[0x10000/8]; + I64 *st0, *st1, *st2; + U16 tr, tr_ring3; +}; + +#define ans (Fs->answer) +#define ansf (Fs->answer(F64)) + +#define _RAX Fs->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 + +#help_index "MultiCore" +#define CPUf_RAN_A_TASK 0 +#define CPUf_DYING_TASK_QUE 1 + +public class CCPU //The Gs segment register points to current CCPU. +{ + CCPU *addr; //Self-addressed pointer + I64 num, cpu_flags, + startup_rip, + idle_pt_hits; + F64 idle_factor; + I64 total_jiffies; + CTask *executive_task, *idle_task; + I64 tr, //task reg + swap_counter; + U0 (*profiler_timer_irq)(CTask *task); + CTaskDying *next_dying, *last_dying; + I64 kill_jiffy; + CTSS *tss; + I64 start_stack[16]; +#assert !($$ & 7) +}; + +#help_index "Memory/Page Tables" +#define MEM_MIN_MEG 256 //256 Meg minimum. + +#define SYS_FIXED_AREA 0x100000 +#define SYS_16MEG_AREA_LIMIT 0x1000000 +public class CSysFixedArea +{ + CFPU init_fpu_mmx; + CCPU boot_cpu; + CTask system; + CBlkPool sys_code_bp; + CHeapCtrl system_hc; + $$ = ($$ + 0x1000 - 1) & -0x1000; +}; + +#help_index "Char" +#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_ESC 0x1B +#define CH_SHIFT_ESC 0x1C +#define CH_SPACE 0x20 + +#define ST_ERR_ST "$$RED$$$$BK,1$$ERROR:$$FG$$$$BK,0$$ " +#define ST_WARN_ST "$$LTRED$$$$BK,1$$WARNING:$$FG$$$$BK,0$$ " + +//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_MS_L_DOWN 16 +#define SCf_MS_R_DOWN 17 +#define SCf_DELETE 18 +#define SCf_INS 19 +#define SCf_NO_SHIFT 30 +#define SCf_KEY_DESC 31 +#define SCF_E0_PREFIX (1 << SCf_E0_PREFIX) +#define SCF_KEY_UP (1 << SCf_KEY_UP) +#define SCF_SHIFT (1 << SCf_SHIFT) +#define SCF_CTRL (1 << SCf_CTRL) +#define SCF_ALT (1 << SCf_ALT) +#define SCF_CAPS (1 << SCf_CAPS) +#define SCF_NUM (1 << SCf_NUM) +#define SCF_SCROLL (1 << SCf_SCROLL) +#define SCF_NEW_KEY (1 << SCf_NEW_KEY) +#define SCF_MS_L_DOWN (1 << SCf_MS_L_DOWN) +#define SCF_MS_R_DOWN (1 << SCf_MS_R_DOWN) +#define SCF_DELETE (1 << SCf_DELETE) +#define SCF_INS (1 << SCf_INS) +#define SCF_NO_SHIFT (1 << SCf_NO_SHIFT) +#define SCF_KEY_DESC (1 << SCf_KEY_DESC) + +//ZealOS places a 1 in bit 7 for +//keys with an E0 prefix. +//See $LK,"::/Doc/CharOverview.DD"$ and $LK,"KbdHandler",A="MN:KbdHandler"$(). +#define SC_ESC 0x01 +#define SC_BACKSPACE 0x0E +#define SC_TAB 0x0F +#define SC_ENTER 0x1C +#define SC_SHIFT 0x2A +#define SC_CTRL 0x1D +#define SC_ALT 0x38 +#define SC_CAPS 0x3A +#define SC_NUM 0x45 +#define SC_SCROLL 0x46 +#define SC_CURSOR_UP 0x48 +#define SC_CURSOR_DOWN 0x50 +#define SC_CURSOR_LEFT 0x4B +#define SC_CURSOR_RIGHT 0x4D +#define SC_PAGE_UP 0x49 +#define SC_PAGE_DOWN 0x51 +#define SC_HOME 0x47 +#define SC_END 0x4F +#define SC_INS 0x52 +#define SC_DELETE 0x53 +#define SC_F1 0x3B +#define SC_F2 0x3C +#define SC_F3 0x3D +#define SC_F4 0x3E +#define SC_F5 0x3F +#define SC_F6 0x40 +#define SC_F7 0x41 +#define SC_F8 0x42 +#define SC_F9 0x43 +#define SC_F10 0x44 +#define SC_F11 0x57 +#define SC_F12 0x58 +#define SC_PAUSE 0x61 +#define SC_GUI 0xDB +#define SC_PRINTSCREEN1 0xAA +#define SC_PRINTSCREEN2 0xB7 + +#help_index "Char;Debugging/Raw Output;TextBase Layer/Char" +//text.raw_flags +#define RAWF_IN_DOLLAR 1 +#define RAWF_LAST_DOLLAR 2 +#define RAWF_SHOW_DOLLAR 4 +#define RAWF_SCROLL 8 + +public class CTextGlobals +{ + I64 raw_col, raw_flags; + U32 *raw_screen, *fb_alias; + I64 rows, cols; //Use TEXT_ROWS,TEXT_COLS + U64 *font, *aux_font, screen_size, buffer_size; + U8 border_chars[16]; + Bool is_fb_busy; +}; + +#define FONT_WIDTH 8 +#define FONT_HEIGHT 8 + +#help_index "Graphics" +//z-values less than zero are in front of screen and not drawn. +//we want to shift all Z-values into a drawable range. +//GR_Z_ALL is set to half of the Z-range which is an I32. +#define GR_Z_ALL (I32_MAX/2) + +#help_index "Graphics/Device Contexts" +//Low 8 bits reserved for flags that go into saved bitmaps +#define DCF_PALETTE 1 +#define DCF_NO_TRANSPARENTS 2 //Can be used to optimized $LK,"GrBlot",A="MN:GrBlot"$(). + +#define DCF_TRANSFORMATION 0x100 + +//See $LK,"DCSymmetrySet",A="MN:DCSymmetrySet"$() or $LK,"DCSymmetry3Set",A="MN:DCSymmetry3Set"$() +#define DCF_SYMMETRY 0x200 + +//Must be used with DCF_SYMMETRY set also. +//See $LK,"::/Demo/Games/BigGuns.ZC"$ +#define DCF_JUST_MIRROR 0x400 + +#define DCF_LOCATE_NEAREST 0x800 +#define DCF_DONT_DRAW 0x1000 +#define DCF_ALIAS 0x2000 +#define DCF_SCREEN_BITMAP 0x4000 +#define DCF_FILL_NOT_COLOR 0x8000 +#define DCF_RECORD_EXTENTS 0x10000 +#define DCF_ON_TOP 0x20000 + +//$LK,"DCSave",A="MN:DCSave"$() flags. +#define DCSF_PALETTE_GET 1 + +#define DCS_SIGNATURE_VAL 'DvCS' + +class CGrSym +{ + I32 sx, sy, sz, pad; +//Normal of symmetry plane + I64 snx, sny, snz; +}; + +public class CDC +{ + U0 start; + CDate cdt; + I32 x0, y0, + width, width_internal, + height, + flags; + U0 end; + CBGR24 palette[COLORS_NUM]; + + //public (Change directly) + CColorROPU32 color, + bkcolor, //Set for use with $LK,"ROP_COLLISION",A="MN:ROP_COLLISION"$ + color2; //Internally used for $LK,"GrFloodFill",A="MN:GrFloodFill"$() + CD3I32 ls; //Light source (should be normalized to 65536). + + //dither_probability_u16 is basically a U16. + //It is activated by $LK,"ROPF_PROBABILITY_DITHER",A="MN:ROPF_PROBABILITY_DITHER"$. + //0x0000 =100% color.c0 + //0x8000 =50% color.c0 50% color.c1 + //0x10000=100% color.c1 + //See $LK,"::/Demo/Graphics/SunMoon.ZC"$ and $LK,"::/Demo/Graphics/Shading.ZC"$. + U64 dither_probability_u16; + + CDC *brush; + + //Set with $LK,"DCMat4x4Set",A="MN:DCMat4x4Set"$(). $LK,"Free",A="MN:Free"$() before setting. + I64 *r, //rotation matrix of quads decimal in lo + r_norm; //shifted 32 bits. Used for scaling thick + + //public (Change directly) + I32 x, y, z, + thick; + + //Can be changed from the default $LK,"DCTransform",A="MN:DCTransform"$() + U0 (*transform)(CDC *dc, I64 *x, I64 *y, I64 *z); + + //Can be changed from the default $LK,"DCLighting",A="MN:DCLighting"$() + U0 (*lighting)(CDC *dc, CD3I32 *p1, CD3I32 *p2, CD3I32 *p3, CColorROPU32 color); + + //Set by $LK,"DCSymmetrySet",A="MN:DCSymmetrySet"$() or $LK,"DCSymmetry3Set",A="MN:DCSymmetry3Set"$() + CGrSym sym; + + I32 cur_x, cur_y, cur_z, pad; + I64 collision_count; + + I64 nearest_dist, + min_x, max_x, min_y, max_y; //Set by $LK,"DCF_RECORD_EXTENTS",A="MN:DCF_RECORD_EXTENTS"$ (screen coordinates) + + U32 dc_signature, pad; + CTask *mem_task, *win_task; + CDC *alias; + U8 *body; + + //Set by $LK,"DCDepthBufAlloc",A="MN:DCDepthBufAlloc"$() + I32 *depth_buf; + I64 db_z; //private +#assert !($$ & 7) +}; + +#define "Char/Input;StdIn" +//StrGet flags +#define SGF_SHIFT_ESC_EXIT 1 //This kills task on +#define SGF_WITH_NEW_LINE 2 + +#define "Char/Operations" +//Flags for StrUtil and MStrUtil +#define SUF_REM_CTRL_CHARS 0x001 +#define SUF_REM_LEADING 0x002 +#define SUF_REM_TRAILING 0x004 +#define SUF_REM_SPACES 0x008 +#define SUF_SINGLE_SPACE 0x010 +#define SUF_TO_UPPER 0x020 +#define SUF_TO_LOWER 0x040 +#define SUF_S2T 0x080 +#define SUF_T2S 0x100 // Only works with MStrUtil +#define SUF_SCALE_INDENT 0x200 +#define SUF_SAFE_DOLLAR 0x400 + +//Flags for StrFind +#define SFF_IGNORE_CASE 1 +#define SFF_WHOLE_LABELS_BEFORE 2 +#define SFF_WHOLE_LABELS_AFTER 4 +#define SFG_WHOLE_LABELS (SFF_WHOLE_LABELS_BEFORE | SFF_WHOLE_LABELS_AFTER) + +//Flags for ListMatch +#define LMF_IGNORE_CASE 1 +#define LMF_EXACT 2 + +#help_index "Keyboard Devices/System" +#define KDF_HAS_DESCS 1 +class CKeyDevEntry +{ + CKeyDevEntry *next, *last; + I64 priority, flags; + Bool (*put_key)(I64 ch, I64 sc); + Bool (*put_s)(U8 *st); +}; + +class CKeyDevGlobals +{ + CKeyDevEntry put_key_head; + U0 (**fp_ctrl_alt_cbs)(I64 sc); + I64 ctrl_alt_in_irq_flags, + **ctrl_alt_ret_addr; //address of ret address on stack in kbd irq + U8 **ctrl_alt_no_shift_descs, **ctrl_alt_shift_descs, + desc[STR_LEN], + *handler; +}; + +#help_index "Sound" +#define PCSPKR 0x61 +#help_index "ScreenCast;Sound/AU Files" +public class CAUData +{//Format of AU files + CDate cdt; + I8 ona; +}; + +class CSoundData +{//Format recorded in mem + CSoundData *next, *last; + F64 tS; + I8 ona; +}; + +public class CScreenCastGlobals +{ + CSoundData sound_head; + CDate t0_now; + F64 t0_tS; + U8 *print_format; + CDC *dc, *dc2_alias; + Bool record, just_audio; + I8 ona; +}; + +#help_index "Debugging/FunSeg" +#define FUN_SEG_CACHE_SIZE 256 +class CFunSegCache +{ + I64 base, limit; + F64 time_stamp; + U8 str[1]; //FUN_SEG_CACHE_STR_LEN +$$ = 64; +}; +#define FUN_SEG_CACHE_STR_LEN (sizeof(CFunSegCache) - offset(CFunSegCache.str)) + +#help_index "Debugging" +class CMPCrash +{ + I64 cpu_num; + CTask *task; + I64 rip; + U8 *message; + I64 message_num; +}; + +public class CDebugGlobals +{ + CTask *focus_task; + U8 *message; + I64 message_num; + CMPCrash *mp_crash; + U8 *int_fault_code, + *fix_file_line; + CFunSegCache *fun_seg_cache; + I64 fun_seg_cache_index; + Bool panic; +}; + +#help_index "Boot" +//Boot related +#define BOOT_RAM_BASE 0x07C00 +#define BOOT_RAM_LIMIT 0x97000 +#define BOOT_STACK_SIZE BLK_SIZE + +#define BOOT_SRC_NULL 0 +#define BOOT_SRC_ROM 1 +#define BOOT_SRC_RAM 2 +#define BOOT_SRC_HARDDRIVE 3 +#define BOOT_SRC_DVD 4 + +// $LK,"In",A="MN:In"$("") StdIn for call to $LK,"BootHDIns",A="MN:BootHDIns"$(). +#define STD_DISTRO_DVD_CONFIG "TB\nScale2Mem(2048,0x40000)\nT\n\n\n\n" + +#help_index "Registry" +//Registry sys_message_flags. $LK,"RegOneTimePopUp",A="MN:RegOneTimePopUp"$() +#define ARf_FLOODFILL 0 +#define ARf_CSPRITE_INS_CLIP 1 +#define ARf_PLANAR_SYMMETRY 2 +#define ARf_PSALMODY_JUKEBOX 3 +#define ARf_MESH_ED 4 +#define ARf_CSPRITE_PTS_RECTANGLES 5 +#define ARf_MANAGE_SLIDER 6 + +#help_index "Misc/Progress Bars" +#define PROGRESS_BARS_NUM 4 +#define PROGRESS_DESC_LEN (64 - 8 - 8) +class CProgress +{ + I64 val, max; + F64 t0, tf; + U8 desc[PROGRESS_DESC_LEN]; +}; + +#help_index "Char/Operations" +#define PRINTF_PAD_ZERO 0x001 +#define PRINTF_LEFT_JUSTIFY 0x002 +#define PRINTF_TRUNCATE 0x004 +#define PRINTF_COMMA 0x008 +#define PRINTF_DOLLAR 0x010 +#define PRINTF_SLASH 0x020 +#define PRINTF_QUESTION 0x040 +#define PRINTF_AUX_FORMAT_NUM 0x080 +#define PRINTF_DECIMAL 0x100 +#define PRINTF_NEG 0x200 +#define PRINTF_NEG_E 0x400 +#define PRINTF_NEG_AUX_FORMAT_NUM 0x800 + +#help_index "" diff --git a/src/Kernel/KernelC.HH b/src/Kernel/KernelC.HH index f050d7ee..72a04628 100755 --- a/src/Kernel/KernelC.HH +++ b/src/Kernel/KernelC.HH @@ -503,6 +503,8 @@ extern I64 KbdMessagesQueue(); public extern U0 KbdTypeMatic(U8 delay); extern Bool MouseHardDriverInstall(); public extern Bool MouseHardEnable(Bool val=TRUE); +public extern Bool MouseRaw(Bool val); +public extern U0 MouseRawReset(Bool val=TRUE); public extern I64 PressAKey(); public extern I64 CharScan(); public extern Bool KeyScan(I64 *_ch=NULL, I64 *_scan_code=NULL, Bool echo=FALSE); diff --git a/src/Kernel/SerialDev/Mouse.ZC b/src/Kernel/SerialDev/Mouse.ZC index 756aaedf..daebb04b 100755 --- a/src/Kernel/SerialDev/Mouse.ZC +++ b/src/Kernel/SerialDev/Mouse.ZC @@ -44,6 +44,26 @@ U0 MouseUpdate(I64 x, I64 y, I64 z, Bool l, Bool r) LBEqual(&kbd.scan_code, SCf_MS_R_DOWN, mouse.rb); } +public U0 MouseRawReset() +{ + mouse_hard.raw_data.x=0; + mouse_hard.raw_data.y=0; + mouse_hard.raw_data.z=0; + mouse_hard.raw_bttns[0]=FALSE; + mouse_hard.raw_bttns[1]=FALSE; + mouse_hard.raw_bttns[2]=FALSE; + mouse_hard.raw_bttns[3]=FALSE; + mouse_hard.raw_bttns[4]=FALSE; +} + +public Bool MouseRaw(Bool val) +{ // Places mouse in "raw" mode, button presses will not go to windows manager when true + Bool old_val=mouse_hard.raw_mode; + mouse_hard.raw_mode=val; + mouse.show=!val; + return old_val; +} + U0 MouseSet(I64 x=I64_MAX, I64 y=I64_MAX, I64 z=I64_MAX, I64 l=I64_MAX, I64 r=I64_MAX) {//Note: Generates a message. See $LK,"MouseSet",A="FF:::/Demo/Games/Zing.ZC,MouseSet"$(). if (!(0 <= x < sys_framebuffer_width)) @@ -78,6 +98,7 @@ U0 MouseInit() mouse.timestamp = TSCGet; mouse.dbl_time = 0.175; GridInit; + MouseRawReset; } U0 MouseHardPacketRead() @@ -194,6 +215,7 @@ Bool MouseHardReset() catch Fs->catch_except = TRUE; + MouseRawReset; return res; } @@ -255,19 +277,14 @@ U0 MouseHardHandler() { I64 i, dx, dy, dz; U8 mouse_buf[4]; - - MouseHardSetPre; + if (!mouse_hard.raw_mode) + MouseHardSetPre; for (i = 0; i < 4; i++) mouse_buf[i] = 0; for (i = 0; i < mouse_hard.pkt_size; i++) if (!FifoU8Remove(mouse_hard.fifo2, &mouse_buf[i])) mouse_buf[i] = 0; - mouse_hard.bttns[0] = mouse_buf[0] & 1; - mouse_hard.bttns[1] = (mouse_buf[0] & 2) >> 1; - mouse_hard.bttns[2] = (mouse_buf[0] & 4) >> 2; - mouse_hard.bttns[3] = (mouse_buf[3] & 0x10) >> 4; - mouse_hard.bttns[4] = (mouse_buf[3] & 0x20) >> 5; if (mouse_buf[0] & 0x10) dx = mouse_buf[1]-256; else @@ -281,11 +298,30 @@ U0 MouseHardHandler() else dz = mouse_buf[3] & 7; - mouse_hard.prescale.x += dx; - mouse_hard.prescale.y += dy; - mouse_hard.prescale.z += dz; - - MouseHardSetPost; + if (mouse_hard.raw_mode) { + // buttons / position data need to by consumed by app + // buttons stay down, positions keep accumulating until + // consumed by app and reset with MouseRawReset + mouse_hard.raw_bttns[0] |= mouse_buf[0] & 1; + mouse_hard.raw_bttns[1] |= (mouse_buf[0] & 2) >> 1; + mouse_hard.raw_bttns[2] |= (mouse_buf[0] & 4) >> 2; + mouse_hard.raw_bttns[3] |= (mouse_buf[3] & 0x10) >> 4; + mouse_hard.raw_bttns[4] |= (mouse_buf[3] & 0x20) >> 5; + mouse_hard.raw_data.x += dx; + mouse_hard.raw_data.y += dy; + mouse_hard.raw_data.z += dz; + } + else { + mouse_hard.bttns[0] = mouse_buf[0] & 1; + mouse_hard.bttns[1] = (mouse_buf[0] & 2) >> 1; + mouse_hard.bttns[2] = (mouse_buf[0] & 4) >> 2; + mouse_hard.bttns[3] = (mouse_buf[3] & 0x10) >> 4; + mouse_hard.bttns[4] = (mouse_buf[3] & 0x20) >> 5; + mouse_hard.prescale.x += dx; + mouse_hard.prescale.y += dy; + mouse_hard.prescale.z += dz; + MouseHardSetPost; + } } U0 MouseHardSet(I64 x, I64 y, I64 z, I64 l, I64 r) From 5f24bd97bb96886c7078f15e50a6e13e6fa023c0 Mon Sep 17 00:00:00 2001 From: Sharoy Veduchi <61427449+doodayev@users.noreply.github.com> Date: Sat, 25 Feb 2023 17:07:28 -0800 Subject: [PATCH 05/51] Change CC to ZC (#95) Co-authored-by: Midnoclose <24860483+Midnoclose@users.noreply.github.com> --- src/System/Utils/ConversionScript.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System/Utils/ConversionScript.ZC b/src/System/Utils/ConversionScript.ZC index e3436b86..8289fea9 100755 --- a/src/System/Utils/ConversionScript.ZC +++ b/src/System/Utils/ConversionScript.ZC @@ -41,7 +41,7 @@ U0 Cvt(U8 *ff_mask="*", U8 *fu_flags="+r+l-i+S") Find("ExtDft", ff_mask, fu_flags, "ExtDefault"); Find("ExtChg", ff_mask, fu_flags, "ExtChange"); Find("RegDft", ff_mask, fu_flags, "RegDefault"); - Find("\"HC\"", ff_mask, fu_flags, "\"CC\""); + Find("\"HC\"", ff_mask, fu_flags, "\"ZC\""); Find("CDrv", ff_mask, fu_flags, "CDrive"); Find("CDbgInfo", ff_mask, fu_flags, "CDebugInfo"); Find("dbg_info", ff_mask, fu_flags, "debug_info"); From 4b3c344825402e5384e8b3b734c6cd349282e737 Mon Sep 17 00:00:00 2001 From: tinkeros <76139882+tinkeros@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:41:54 -0600 Subject: [PATCH 06/51] Skip partial updates when updating entire screen (#90) --- src/System/Gr/GrScreen.ZC | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/System/Gr/GrScreen.ZC b/src/System/Gr/GrScreen.ZC index dcfd93a9..d3166177 100755 --- a/src/System/Gr/GrScreen.ZC +++ b/src/System/Gr/GrScreen.ZC @@ -395,10 +395,16 @@ U0 GrUpdateScreen32() while (src < size) //draw 2 pixels at a time *dst++ = gr_palette[*src++ & 0xFF] | gr_palette[*src++ & 0xFF] << 32; - GrCalcScreenUpdates; - if (LBtr(&sys_semas[SEMA_FLUSH_VBE_IMAGE], 0)) + { MemCopy(text.fb_alias, text.raw_screen, text.buffer_size); + src -= GR_WIDTH * GR_HEIGHT; // Reset src ptr + MemCopy(gr.screen_cache, src, GR_WIDTH * GR_HEIGHT); + } + else + { + GrCalcScreenUpdates; + } } U0 GrUpdateScreen() From 225905eba49ad0b300c7de264bec87bf2470e34b Mon Sep 17 00:00:00 2001 From: Arrogant Genius <127725014+GutPuncher@users.noreply.github.com> Date: Mon, 13 Mar 2023 04:17:17 -0400 Subject: [PATCH 07/51] Update README.md --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e19308f5..96326874 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,13 @@ [![Discord](https://img.shields.io/discord/934200098144022609?color=7289DA&label=Discord&logo=discord&logoColor=white)](https://discord.gg/rK6U3xdr7D) [![](https://img.shields.io/badge/wiki-documentation-forestgreen)](https://github.com/Zeal-Operating-System/ZealOS/wiki) -The Zeal Operating System is a modernized, professional fork of the 64-bit Temple Operating System. Guiding principles of development include transparency, full user control, and adherence to public-domain/open-source implementations. +The Zeal Operating System is a modernized fork of the 64-bit Temple Operating System. Guiding principles of development include transparency, full user control, and adherence to public-domain/open-source implementations. ![](/screenshots/screenshot2.png) ZealOS strives to be simple, documented, and require as little of a knowledge gap as possible. One person should be able to comprehend the entire system in at least a semi-detailed way within a few days of study. -Simplify, don't complicate; make accessible, don't obfuscate. -> The CIA encourages code obfuscation. They make it more complicated than necessary.\ -—Terry A. Davis +**Simplify, don't complicate; make accessible, don't obfuscate.** Features in development include: - [32-bit color VBE graphics](https://github.com/TempleProgramming/HolyGL) From 438a904b91e7d6b6fe27644035f86c5c2f701f6b Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 13 Mar 2023 17:49:32 -0400 Subject: [PATCH 08/51] Update --- src/Demo/Games/CastleFrankenstein.ZC | 2 +- src/Home/Net/Drivers/PCNet.ZC | 0 src/Kernel/KernelA.HH | 9116 +++++++++++++------------- src/System/Define.ZC | 2 +- src/System/Gr/GrScreen.ZC | 11 +- 5 files changed, 4563 insertions(+), 4568 deletions(-) mode change 100644 => 100755 src/Home/Net/Drivers/PCNet.ZC diff --git a/src/Demo/Games/CastleFrankenstein.ZC b/src/Demo/Games/CastleFrankenstein.ZC index 8c88538b..306a912c 100755 --- a/src/Demo/Games/CastleFrankenstein.ZC +++ b/src/Demo/Games/CastleFrankenstein.ZC @@ -884,4 +884,4 @@ D\DdT0T8THL0LLd d      -            +            \ No newline at end of file diff --git a/src/Home/Net/Drivers/PCNet.ZC b/src/Home/Net/Drivers/PCNet.ZC old mode 100644 new mode 100755 diff --git a/src/Kernel/KernelA.HH b/src/Kernel/KernelA.HH index 281a39ac..15bc09fb 100755 --- a/src/Kernel/KernelA.HH +++ b/src/Kernel/KernelA.HH @@ -1,4558 +1,4558 @@ -// Main ZealOS header - -#help_index "" -extern class CAOT; -extern class CAOTHeapGlobal; -extern class CAOTImportExport; -extern class CCPU; -extern class CDC; -extern class CDirContext; -extern class CDoc; -extern class CFile; -extern class CHashClass; -extern class CHashFun; -extern class CHeapCtrl; -extern class CIntermediateCode; -extern class CJobCtrl; -extern class CTask; - -#define NULL 0 -#define TRUE 1 -#define FALSE 0 -#define ON 1 -#define OFF 0 -#define NONE 0 //for use in default arguments -#define I8_MIN (-0x80) -#define I8_MAX 0x7F -#define U8_MIN 0 -#define U8_MAX 0xFF -#define I16_MIN (-0x8000) -#define I16_MAX 0x7FFF -#define U16_MIN 0 -#define U16_MAX 0xFFFF -#define I32_MIN (-0x80000000) -#define I32_MAX 0x7FFFFFFF -#define U32_MIN 0 -#define U32_MAX 0xFFFFFFFF -#define I64_MIN (-0x8000000000000000) -#define I64_MAX 0x7FFFFFFFFFFFFFFF -#define U64_MIN 0 -#define U64_MAX 0xFFFFFFFFFFFFFFFF -#define INVALID_PTR I64_MAX -#define STR_LEN 144 - -//(Int to F64 conversion is signed) -//Turn off 80-bit float constants with $LK,"OPTf_NO_BUILTIN_CONST",A="MN:OPTf_NO_BUILTIN_CONST"$. -#define U64_F64_MAX (0x43F0000000000000(F64)) -#define F64_MAX (0x7FEFFFFFFFFFFFFF(F64)) -#define F64_MIN (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)) - -#help_index "Data Types/Simple" -//ZealC union structure is treated as a whole if no member is specified, similar to bit fields. -//See $LK,"::/Demo/SubIntAccess.ZC"$. - -U16i union U16 -{ - I8i i8[2]; - U8i u8[2]; -}; - -I16i union I16 -{ - I8i i8[2]; - U8i u8[2]; -}; - -U32i union U32 -{ - I8i i8[4]; - U8i u8[4]; - I16 i16[2]; - U16 u16[2]; -}; - -I32i union I32 -{ - I8i i8[4]; - U8i u8[4]; - I16 i16[2]; - U16 u16[2]; -}; - -U64i union U64 -{ - I8i i8[8]; - U8i u8[8]; - I16 i16[4]; - U16 u16[4]; - I32 i32[2]; - U32 u32[2]; -}; - -I64i union I64 -{ - I8i i8[8]; - U8i u8[8]; - I16 i16[4]; - U16 u16[4]; - I32 i32[2]; - U32 u32[2]; -}; - -#help_index "Math/Complex;Data Types/Complex" -public class Complex -{ - F64 x, y; -}; - -#help_index "Data Types/Circular Queue" -public class CQueue -{ - CQueue *next, *last; -}; - -#help_index "Graphics/Data Types/D3I32;Math/Data Types/D3I32;Data Types/D3I32" -public class CD3I32 //Three dimensional I32 pt -{ - I32 x, y, z; -}; -public class CQueueD3I32 //Queue of three dimensional I32 pts -{ - CQueueD3I32 *next, *last; - CD3I32 p; -}; -#help_index "Math/Data Types;Data Types" -public class CD2I32 //Two dimensional I32 pt -{ - I32 x, y; -}; -public class CD2I64 //Two dimensional I64 pt -{ - I64 x, y; -}; -public class CD3I64 //Three dimensional I64 pt -{ - I64 x, y, z; -}; -public class CD2 //Two dimensional F64 pt -{ - F64 x, y; -}; - -#help_index "Math/CD3;Data Types/CD3" -public class CD3 //Three dimensional F64 pt -{ - F64 x, y, z; -}; - -#help_index "Data Types/Queue Vector" -#define QUE_VECT_U8_COUNT 512 -public class CQueueVectU8 -{ - CQueueVectU8 *next, - *last; - I64 total_count, - node_count, - min_idx; - U8 body[QUE_VECT_U8_COUNT]; -}; - -#help_index "Data Types/Fifo" -public class CFifoU8 -{ - U8 *buf; - I64 mask, - in_ptr, - out_ptr; -}; -public class CFifoI64 -{ - I64 *buf, - mask, - in_ptr, - out_ptr; -}; -#help_index "Date/CMOS" -#define CMOS_SEL 0x70 //select which register to access using this port -#define CMOS_DATA 0x71 //read from or write to register using this port - -//CMOS registers -#define CMOSR_SEC 0x0 -#define CMOSR_MIN 0x2 -#define CMOSR_HOUR 0x4 -#define CMOSR_DAY_OF_WEEK 0x6 -#define CMOSR_DAY_OF_MONTH 0x7 -#define CMOSR_MONTH 0x8 -#define CMOSR_YEAR 0x9 -#define CMOSR_STATUS_A 0xA -#define CMOSR_STATUS_B 0xB - -//CMOS status flags -#define CMOSF_BINARY (1 << 2) -#define CMOSF_UPDATING (1 << 7) - -#help_index "Date/CDate" -#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; -}; - -#help_index "Date;Date/CDate" -public class CDateStruct -{ - U8 sec10000, - sec100, - sec, - min, - hour, - day_of_week, - day_of_mon, - mon; - I32 year; -}; - -#help_index "Math/ODE" -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, //Point to entries in $LK,"CMathODE",A="MN:CMathODE"$.state[] - *DstateDt; //Point to entries in $LK,"CMathODE",A="MN:CMathODE"$.DstateDt[] - - U0 start; - U32 flags, - num; - F64 mass, - drag_profile_factor; - U0 saved_state; - F64 x, y, z, - DxDt, DyDt, DzDt; - U0 end; -}; - -#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; - U32 flags, num, end1_num, end2_num; - F64 const, rest_len; - U0 end; -}; - -//Ordinary Differential Equations -#define ODEF_HAS_MASSES 1 -#define ODEF_PAUSED 2 -#define ODEF_STARTED 4 -#define ODEF_BUSY 8 - -#define ODEf_HAS_MASSES 0 -#define ODEf_PAUSED 1 -#define ODEf_STARTED 2 -#define ODEf_BUSY 3 - -public class CMathODE -{ - CMathODE *next, *last; - I64 flags, n, n_internal; - CMass *next_mass, *last_mass; - CSpring *next_spring, *last_spring; - F64 drag_v, //drag proportional to velocity - drag_v2, //drag proportional to velocity squared - drag_v3, //drag proportional to velocity cubed - acceleration_limit, //This clips acceleration - base_t, - t, t_scale, - h, h_min, h_max; - - //This is not precise, just a ballpark. - //ZealOS CMathODE's are for video games - //not science. It bails if it takes - //too long. - F64 min_tolerance, max_tolerance; - - F64 tolerance_internal, - *array_base, - *state, - *state_internal, - *DstateDt, - *state_scale, - *initial_state, - *tmp0, *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6, *tmp7; - CTask *mem_task, *win_task; - U0 (*derive)( CMathODE *o, F64 t, F64 *state, F64 *DstateDt); - U0 (*mp_derive)(CMathODE *o, F64 t, I64 cpu_num, F64 *state, F64 *DstateDt); //If break into parallel pieces. - CTask **slave_tasks; - I64 mp_not_done_flags; - F64 mp_t, *mp_state, *mp_DstateDt; - - I64 user_data; -}; - -#help_index "Processor" -//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_DIV_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_DEBUG 0x32 -//See $LK,"ST_INT_NAMES",A="MN:ST_INT_NAMES"$ - -//You might want to start backward from -//0xFF for your own interrupts. -//See $LK+PU,"IntEntryAlloc",A="MN:IntEntryAlloc"$. -#define I_USER 0x40 - -#define MP_PROCESSORS_NUM 128 - -//Control register flag bits -#define CR0f_PE 0 //Protection Enable (Protected mode) -#define CR0f_MP 1 //Monitor coprocessor -#define CR0f_EM 2 //Emulation of coprocessor -#define CR0f_TS 3 //Task switched, some irrelevant x87 task management stuff -#define CR0f_NE 5 //Numeric error -#define CR0f_PG 31//Enable paging - -#define CR0F_PE (1 << CR0f_PE) -#define CR0F_NE (1 << CR0f_NE) - -#define CR4f_PAE 5 //Physical Address Extension, required by long mode -#define CR4f_PGE 7 //Page-Global Enable -#define CR4f_OSFXSR 9 //FXSAVE/FXRSTOR support enabled - -#define CR4F_PAE (1 << CR4f_PAE) -#define CR4F_PGE (1 << CR4f_PGE) -#define CR4F_OSFXSR (1 << CR4f_OSFXSR) - -#define SYS_START_CR0 (CR0F_PE | CR0F_NE) - -#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 RFLAGG_START 0x0000 -#define RFLAGG_NORMAL (1 << RFLAGf_INT) - -//Global Descriptor Table -class CGDTEntry -{ - U64 lo, hi; -}; - -class CGDT -{ - CGDTEntry null, - boot_ds, - boot_cs, - cs32, - cs64, //The $LK,"Charter",A="FI:::/Doc/Charter.DD"$ says just ring-0. - cs64_ring3, //$LK,"Ring3",A="FI:::/Demo/Lectures/Ring3.ZC"$, in case you want to play around. - ds, - ds_ring3, - tr[MP_PROCESSORS_NUM], - tr_ring3[MP_PROCESSORS_NUM]; -}; - -//Interrupt Descriptor Table -class CIDTEntry -{ - U16 offset_low, - seg_select; - U8 ist, - type_attr; - U16 offset_mid; - U32 offset_hi, - zero; -}; -#assert sizeof(CIDTEntry) == 16 - -class CSysLimitBase -{ - U16 limit; //Offset of last byte, not size. - U8 *base; //&GDT or &IDT -}; - -#help_index "Memory/Info" -#define MEM_E820_ENTRIES_NUM 256 -#define MEM_E820t_USABLE 1 -#define MEM_E820t_RESERVED 2 -#define MEM_E820t_ACPI 3 -#define MEM_E820t_ACPI_NVS 4 -#define MEM_E820t_BAD_MEM 5 -#define MEM_E820t_PERM_MEM 7 - -class CMemE820 -{ - U8 *base; - I64 len; - U8 type, pad[3]; -}; - -#help_index "Compiler/Internal" -//Loader flags -#define LDF_NO_ABSS 1 -#define LDF_JUST_LOAD 2 -#define LDF_SILENT 4 - -#define ZXE_SIGNATURE_VAL 'ZXE' // Zeal Executable -class CZXE -{// $LK,"ZXE Header Generation",A="FF:::/Compiler/CMain.ZC,16 ALIGN"$ by compiler. - U16 jmp; - U8 module_align_bits, - reserved; - U32 signature; - I64 org, - patch_table_offset, //$LK,"Patch Table Generation",A="FF:::/Compiler/CMain.ZC,IET_ABS_ADDR"$ - file_size; -}; - -class CPatchTableAbsAddr -{ - U8 eit_abs_addr; //$LK,"IET_ABS_ADDR",A="MN:IET_ABS_ADDR"$ - U32 abs_address_count; - U8 zero; - U32 abs_address[1]; -}; - -//$LK,"CAOTImportExport",A="MN:CAOTImportExport"$ Types. Used in PatchTable. -#define IET_END 0 -//reserved -#define IET_REL_I0 2 //Fictitious -#define IET_IMM_U0 3 //Fictitious -#define IET_REL_I8 4 -#define IET_IMM_U8 5 -#define IET_REL_I16 6 -#define IET_IMM_U16 7 -#define IET_REL_I32 8 -#define IET_IMM_U32 9 -#define IET_REL_I64 10 -#define IET_IMM_I64 11 -#define IEF_IMM_NOT_REL 1 -//reserved -#define IET_REL32_EXPORT 16 -#define IET_IMM32_EXPORT 17 -#define IET_REL64_EXPORT 18 //Not implemented -#define IET_IMM64_EXPORT 19 //Not implemented -#define IET_ABS_ADDR 20 -#define IET_CODE_HEAP 21 //Not really used -#define IET_ZEROED_CODE_HEAP 22 //Not really used -#define IET_DATA_HEAP 23 -#define IET_ZEROED_DATA_HEAP 24 //Not really used -#define IET_MAIN 25 - -#help_index "Graphics/VBE" - -#define BLACK32 0x000000 -#define WHITE32 0xFFFFFF -#define VBE_MODES_NUM 32 - -class CVBEInfo -{ - U8 signature[4]; - U16 version; - U32 oem, - capabilities, - video_modes; - U16 total_memory, - software_revision; - U32 vendor, - product_name, - product_revision; - U8 reserved[222], - oem_data[256]; -}; -#assert sizeof(CVBEInfo) == 512 - -class CVBEMode -{ - U16 attributes, - pad[7], - pitch, - width, - height; - U8 pad[3], - bpp, - pad, - memory_model, - pad[12]; - U32 framebuffer; - U16 pad[9]; - U32 max_pixel_clock; - U8 reserved[190]; -}; -#assert sizeof(CVBEMode) == 256 - -class CVideoInfo -{ - U16 width; - U16 height; -}; - -#define ZEALBOOTER_LIMINE_SIGNATURE_1 0xaa23c08ed10bd4d7; // See $LK+PU,"CORE0_32BIT_INIT",A="FF:::/Kernel/KStart32.ZC,JMP @@"$ -#define ZEALBOOTER_LIMINE_SIGNATURE_2 0xf6ceba7d4b74179a; // - -#help_index "Boot" -class CKernel -{//Must match $LK,"OSStartUp",A="FF:::/Kernel/KStart16.ZC,MEM_BOOT_BASE"$ - CZXE h; - U32 jmp, - boot_src, - boot_blk, - boot_patch_table_base, - sys_run_level; - CDate compile_time; - - U0 start; - U32 boot_base; - U16 mem_E801[2]; - CMemE820 mem_E820[MEM_E820_ENTRIES_NUM]; - U64 mem_physical_space; - CSysLimitBase sys_gdt_ptr; - U16 sys_pci_buses; - ;$$ = ($$ + 15) & -16; - CGDT sys_gdt; - U64 sys_framebuffer_addr; - U64 sys_framebuffer_width; - U64 sys_framebuffer_height; - U64 sys_framebuffer_pitch; - U8 sys_framebuffer_bpp; - U64 sys_smbios_entry; - U64 sys_disk_uuid[2]; - U32 sys_boot_stack; - Bool sys_is_uefi_booted; - CVideoInfo sys_framebuffer_list[VBE_MODES_NUM]; -}; - -//Run-Levels -#define RLf_16BIT 0 -#define RLf_VESA 1 -#define RLf_32BIT 2 -#define RLf_PATCHED 3 -#define RLf_16MEG_SYS_CODE_BP 4 -#define RLf_64BIT 5 -#define RLf_16MEG_SYSTEM_HEAP_CTRL 6 -#define RLf_FULL_HEAPS 7 -#define RLf_RAW 8 -#define RLf_INTERRUPTS 9 -#define RLf_BLKDEV 10 -#define RLf_MP 11 -#define RLf_COMPILER 12 -#define RLf_DOC 13 -#define RLf_WINMGR 14 -#define RLf_REGISTRY 15 -#define RLf_HOME 16 -#define RLf_AUTOCOMPLETE 17 -#define RLf_SYSTEM_SERVER 18 -#define RLf_ONCE_SYSTEM 19 -#define RLf_ONCE_USER 20 - -#define RLF_16BIT (1 << RLf_16BIT) -#define RLF_VESA (1 << RLf_VESA) -#define RLF_32BIT (1 << RLf_32BIT) -#define RLF_PATCHED (1 << RLf_PATCHED) -#define RLF_16MEG_SYS_CODE_BP (1 << RLf_16MEG_SYS_CODE_BP) -#define RLF_64BIT (1 << RLf_64BIT) -#define RLF_16MEG_SYSTEM_HEAP_CTRL (1 << RLf_16MEG_SYSTEM_HEAP_CTRL) -#define RLF_FULL_HEAPS (1 << RLf_FULL_HEAPS) -#define RLF_RAW (1 << RLf_RAW) -#define RLF_INTERRUPTS (1 << RLf_INTERRUPTS) -#define RLF_BLKDEV (1 << RLf_BLKDEV) -#define RLF_MP (1 << RLf_MP) -#define RLF_COMPILER (1 << RLf_COMPILER) -#define RLF_DOC (1 << RLf_DOC) -#define RLF_WINMGR (1 << RLf_WINMGR) -#define RLF_REGISTRY (1 << RLf_REGISTRY) -#define RLF_HOME (1 << RLf_HOME) -#define RLF_AUTOCOMPLETE (1 << RLf_AUTOCOMPLETE) -#define RLF_SYSTEM_SERVER (1 << RLf_SYSTEM_SERVER) -#define RLF_ONCE_SYSTEM (1 << RLf_ONCE_SYSTEM) -#define RLF_ONCE_USER (1 << RLf_ONCE_USER) - -#help_index "Processor" - -//Model specific registers. -#define IA32F_SCE 0x001 -#define IA32F_LME 0x100 -#define IA32_LAPIC_BASE 0x01B -#define IA32_EFER 0xC0000080 -#define IA32_FS_BASE 0xC0000100 -#define IA32_GS_BASE 0xC0000101 - -//Programmable Interrupt Controller -#define PIC_1 0x20 -#define PIC_1_DATA 0x21 -#define PIC_2 0xA0 -#define PIC_2_DATA 0xA1 -#define PIC_INIT 0x11 -#define PIC_EOI 0x20 //End of interrupt - -//Local Advanced Programmable Interrupt Controller -#define LAPIC_BASE 0xFEE00000 -#define LAPIC_APIC_ID (LAPIC_BASE + 0x020) -#define LAPIC_APIC_VERSION (LAPIC_BASE + 0x030) -#define LAPIC_TASK_PRIORITY (LAPIC_BASE + 0x080) -#define LAPIC_ARBITRATION_PRIORITY (LAPIC_BASE + 0x090) -#define LAPIC_PROCESSOR_PRIORITY (LAPIC_BASE + 0x0A0) -#define LAPIC_EOI (LAPIC_BASE + 0x0B0) -#define LAPIC_LOG_DST (LAPIC_BASE + 0x0D0) -#define LAPIC_DFR (LAPIC_BASE + 0x0E0) -#define LAPIC_LDR (LAPIC_BASE + 0x0D0) - -#define LAPICF_APIC_ENABLED 0x100 -#define LAPIC_SVR (LAPIC_BASE + 0x0F0) - -#define LAPIC_ISR (LAPIC_BASE + 0x100) -#define LAPIC_TMR (LAPIC_BASE + 0x180) -#define LAPIC_IRR (LAPIC_BASE + 0x200) -#define LAPIC_ICR_LOW (LAPIC_BASE + 0x300) -#define LAPIC_ICR_HIGH (LAPIC_BASE + 0x310) - -#define LAPIC_LVT_TIMER (LAPIC_BASE + 0x320) -#define LAPIC_LVT_THERMAL (LAPIC_BASE + 0x330) -#define LAPIC_LVT_PERF (LAPIC_BASE + 0x340) -#define LAPIC_LVT_LINT0 (LAPIC_BASE + 0x350) -#define LAPIC_LVT_LINT1 (LAPIC_BASE + 0x360) -#define LAPIC_LVT_ERR (LAPIC_BASE + 0x370) - -#define MPN_VECT 0x97 -#define MP_VECT_ADDR (MPN_VECT * 0x1000) - -//I/O APIC Memory mapped window -#define IOAPIC_REG 0xFEC00000 //U8 -#define IOAPIC_DATA 0xFEC00010 //U32 -//I/O APIC Registers -#define IOAPICID 0x00 -#define IOAPICVER 0x01 -#define IOAPICARB 0x02 -#define IOREDTAB 0x10 - -class CAP16BitInit -{//AP Multicore - U32 jmp; - CSysLimitBase ap_gdt_ptr; -}; - -#help_index "Time/PIT" -#help_file "::/Doc/PIT.DD" -//Programmable Interval Timer -#define PIT_0 0x40 -#define PIT_2 0x42 -#define PIT_CMD 0x43 - -#define PIT_CMDF_OPMODE_RATE_GEN 0x04 -#define PIT_CMDF_OPMODE_SQUARE_WAVE 0x06 -#define PIT_CMDF_ACCESS_WORD 0x30 -#define PIT_CMDF_CHANNEL0 0x00 -#define PIT_CMDF_CHANNEL2 0x80 - -public class CCountsGlobals -{ - I64 jiffies, //$LK,"JIFFY_FREQ",A="MN:JIFFY_FREQ"$ - timer, //$LK,"SYS_TIMER_FREQ",A="MN:SYS_TIMER_FREQ"$. Use $LK,"SysTimerRead",A="MN:SysTimerRead"$(). - time_stamp_freq, - time_stamp_kHz_freq, - time_stamp_freq_initial; //Initial freq, sampled once at boot time. - Bool time_stamp_calibrated; -}; - -#define JIFFY_FREQ 1000 // Hz -#define CDATE_FREQ 49710 // Hz -#define SYS_TIMER_FREQ (18333 * 65536 / 1000) //Hz -#define SYS_TIMER0_PERIOD (65536 * 182 / 10 / JIFFY_FREQ) - -#help_index "Call" -//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 - -class CRAXRBXRCXRDX -{ - I64 rax, rbx, rcx, rdx; -}; - -//Asm callable function pointers. -//They work with $LK,"CallExtNum",A="MN:CallExtNum"$() when calling from ZealC. -#define EXT_WIN_TO_TOP 0 -#define EXT_WIN_FOCUS 1 -#define EXT_HEAPLOG_MALLOC 2 -#define EXT_HEAPLOG_FREE 3 -#define EXT_DEBUG_RESUME 4 -#define EXT_EXTS_NUM 5 - -#help_index "Processor" -#define DEFAULT_CACHE_LINE_WIDTH 128 - -//Semaphores -class CSema -{ - Bool val, pad[DEFAULT_CACHE_LINE_WIDTH - 1]; -}; -#define SEMA_DEBUG 0 -#define SEMA_RECORD_MACRO 1 -#define SEMA_SYS_TIMER 2 -#define SEMA_SYS_DATE 3 -#define SEMA_DEBUG_MODE 4 -#define SEMA_SOUND 5 -#define SEMA_HEAPLOG_ACTIVE 6 -#define SEMA_HEAPLOG_LOCK 7 -#define SEMA_REFRESH_IN_PROGRESS 8 -#define SEMA_FLUSH_VBE_IMAGE 9 -#define SEMA_SINGLE_USER 10 -#define SEMA_DISK_CACHE 11 -#define SEMA_FAR_CALL32 12 -#define SEMA_DEV_MEM 13 -#define SEMA_VGA 14 -#define SEMA_UPDATE_WIN_Z_BUF 15 -#define SEMA_TT 16 -#define SEMA_MUTE 17 -#define SEMA_JUST_PUMP_MESSAGES 18 -#define SEMA_TMBEAT 19 -#define SEMA_FIX 20 -#define SEMA_SEMAS_NUM 21 - -#define CTRL_ALT_DEL 0 -#define CTRL_ALT_C 1 -#define CTRL_ALT_X 2 -#define CTRL_ALT_TAB 3 - -#help_index "Hash" -public class CHash -{//See $LK,"Hash",A="HI:Hash"$ - CHash *next; - U8 *str; - U32 type, - use_count; // inc'ed every time search found, never dec'ed. -}; - -public class CHashTable -{ - CHashTable *next; - I64 mask, locked_flags; - CHash **body; -}; - -#help_index "Hash/System" -//Hash table types: $LK,"ST_HTT_TYPES",A="FF:::/Kernel/KDefine.ZC,ST_HTT_TYPES"$ -#define HTt_EXPORT_SYS_SYM 0 -#define HTt_IMPORT_SYS_SYM 1 -#define HTt_DEFINE_STR 2 -#define HTt_GLOBAL_VAR 3 -#define HTt_CLASS 4 -#define HTt_INTERNAL_TYPE 5 -#define HTt_FUN 6 -#define HTt_WORD 7 -#define HTt_DICT_WORD 8 -#define HTt_KEYWORD 9 -#define HTt_ASM_KEYWORD 10 -#define HTt_OPCODE 11 -#define HTt_REG 12 -#define HTt_FILE 13 -#define HTt_MODULE 14 -#define HTt_HELP_FILE 15 -#define HTt_FRAME_PTR 16 -#define HTt_TYPES_NUM 17 - -#define HTf_PRIVATE 23 -#define HTf_PUBLIC 24 -#define HTf_EXPORT 25 -#define HTf_IMPORT 26 -#define HTf_IMM 27 -#define HTf_GOTO_LABEL 28 -#define HTf_RESOLVED 29 -#define HTf_UNRESOLVED 30 -#define HTf_LOCAL 31 - -#define HTT_INVALID 0 -#define HTT_EXPORT_SYS_SYM 0x00001 //CHashExport -#define HTT_IMPORT_SYS_SYM 0x00002 //CHashImport -#define HTT_DEFINE_STR 0x00004 //CHashDefineStr -#define HTT_GLOBAL_VAR 0x00008 //CHashGlobalVar -#define HTT_CLASS 0x00010 //CHashClass -#define HTT_INTERNAL_TYPE 0x00020 //CHashClass -#define HTT_FUN 0x00040 //CHashFun -#define HTT_WORD 0x00080 //CHashAC only in AutoComplete table -#define HTT_DICT_WORD 0x00100 //CHashGeneric only in AutoComplete tbl -#define HTT_KEYWORD 0x00200 //CHashGeneric $LK,"KEYWORD",A="FF:::/Compiler/OpCodes.DD,KEYWORD"$ -#define HTT_ASM_KEYWORD 0x00400 //CHashGeneric $LK,"ASM_KEYWORD",A="FF:::/Compiler/OpCodes.DD,ASM_KEYWORD"$ -#define HTT_OPCODE 0x00800 //CHashOpcode -#define HTT_REG 0x01000 //CHashReg -#define HTT_FILE 0x02000 //CHashGeneric -#define HTT_MODULE 0x04000 //CHashGeneric -#define HTT_HELP_FILE 0x08000 //CHashSrcSym -#define HTT_FRAME_PTR 0x10000 //CHashGeneric -#define HTG_TYPE_MASK 0x1FFFF - -#define HTF_PRIVATE 0x00800000 -#define HTF_PUBLIC 0x01000000 -#define HTF_EXPORT 0x02000000 -#define HTF_IMPORT 0x04000000 -#define HTF_IMM 0x08000000 -#define HTF_GOTO_LABEL 0x10000000 -#define HTF_RESOLVE 0x20000000 -#define HTF_UNRESOLVED 0x40000000 -#define HTF_LOCAL 0x80000000 -#define HTG_FLAGS_MASK 0xFF000000 - -#define HTG_SRC_SYM (HTT_DEFINE_STR | HTT_GLOBAL_VAR | HTT_FUN | HTT_CLASS | HTT_EXPORT_SYS_SYM | HTT_HELP_FILE) -#define HTG_ALL -1 - -#define KERNEL_MODULE_NAME "/Kernel/Kernel" - -class CDebugInfo -{ - U32 min_line, max_line; - U32 body[1]; //Code heap is 32-bit value -}; - -public class CHashSrcSym:CHash -{ - U8 *src_link, - *idx; - CDebugInfo *debug_info; - U8 *import_name; - CAOTImportExport *ie_list; -}; - -public class CHashGeneric:CHash -{ - I64 user_data0, user_data1, user_data2; -}; - -#define REGT_NONE 0 -#define REGT_R8 1 -#define REGT_R16 2 -#define REGT_R32 3 -#define REGT_R64 4 -#define REGT_SEG 5 -#define REGT_FSTACK 6 -#define REGT_MM 7 -#define REGT_XMM 8 - -public class CHashReg:CHash -{ - U8 reg_num, reg_type; -}; - -public class CHashAC:CHash -{ - I32 num; - U32 hits; -}; - -public class CHashExport:CHashSrcSym -{ - I64 val; -}; - -public class CHashImport:CHashSrcSym -{ - U8 *module_base, - *module_header_entry; -}; - -#help_index "Compiler/Internal" -#define PTR_STARS_NUM 3 - -//Member List Flags -#define MLF_DEFAULT_AVAILABLE 1 -#define MLF_LASTCLASS 2 -#define MLF_STR_DEFAULT_AVAILABLE 4 -#define MLF_FUN 8 -#define MLF_DOT_DOT_DOT 16 -#define MLF_NO_UNUSED_WARN 32 -#define MLF_STATIC 64 - -public class CArrayDim -{ - CArrayDim *next; - I64 count, total_count; -}; - -#define MLMF_IS_STR 1 -public class CMemberListMeta -{ - CMemberListMeta *next; - U8 *str; - I64 flags, - user_data; -}; - -public class CMemberList -{ - CMemberList *next, *left, *right, - *left_class_base, *right_class_base; //For finding duplicate class local variables. - U8 *str; - CHashClass *member_class, *member_class_base; - CMemberListMeta *meta; - U32 use_count; - U16 flags; - I8 reg, pad; - I64 offset, size; - CArrayDim dim; - U8 *static_data; - union - { - I64 static_data_rip; - I64 default_val; - } - CHashFun *fun_ptr; -}; - -class CExternUsage -{ - CExternUsage *next; - I64 rip; -}; - -#help_index "Hash/System;Compiler/Internal" -public class CHashDefineStr:CHashSrcSym -{ - U8 *data, **sub_idx; - I64 count; -}; - -#define Cf_EXTERN 0 -#define Cf_INTERNAL_TYPE 1 - -public class CHashClass:CHashSrcSym -{//See $LK,"ParseClassNew",A="MN:ParseClassNew"$(). base_class of $LK,"CHashFun",A="MN:CHashFun"$ - I64 size, neg_offset; - U32 member_count; - U8 ptr_stars_count, raw_type; - U16 flags; - CMemberList *member_list_and_root, //Head of linked list and head of tree. - *member_class_base_root, //For finding duplicate class local variables. - *last_in_member_list; - CHashClass *base_class, - *fwd_class; -}; - -//Function flags -#define Ff_INTERRUPT 8 -#define Ff_HASERRCODE 9 -#define Ff_ARGPOP 10 -#define Ff_NOARGPOP 11 -#define Ff_INTERNAL 12 -#define Ff__EXTERN 13 -#define Ff_DOT_DOT_DOT 14 -#define Ff_RET1 15 - -public class CHashFun:CHashClass -{//See $LK,"ParseFunNew",A="MN:ParseFunNew"$(). - CHashClass *return_class; - U32 arg_count, pad, - used_reg_mask, clobbered_reg_mask; - U8 *exe_addr; - CExternUsage *ext_list; -}; - -//Global Var Flags -#define GVF_FUN 1 -#define GVF_IMPORT 2 -#define GVF_EXTERN 4 -#define GVF_DATA_HEAP 8 -#define GVF_ALIAS 16 -#define GVF_ARRAY 32 - -public class CHashGlobalVar:CHashSrcSym -{ - I64 size, flags; - CHashClass *var_class; - CHashFun *fun_ptr; - CArrayDim dim; - U8 *data_addr; - union - { - I64 data_addr_rip; - CAOTHeapGlobal *heap_global; - } -}; -#assert offset(CHashClass.size) == offset(CHashGlobalVar.size) - -#help_index "DolDoc" -//See $LK,"TextBase Layer",A="HI:TextBase Layer"$. -#define ATTRF_BLINK 0x10000000 -#define ATTRF_INVERT 0x20000000 -#define ATTRF_SEL 0x40000000 -#define ATTRF_UNDERLINE 0x80000000 - -#define ATTRf_BLINK 28 -#define ATTRf_INVERT 29 -#define ATTRf_SEL 30 -#define ATTRf_UNDERLINE 31 - -//CDocEntry.type codes (Low 8 bits) -#define DOCT_TEXT 0 -#define DOCT_NEW_LINE 1 -#define DOCT_SOFT_NEW_LINE 2 -#define DOCT_TAB 3 -#define DOCT_PAGE_BREAK 4 -#define DOCT_CURSOR 5 -#define DOCT_MARKER 6 -#define DOCT_PROMPT 7 -#define DOCT_CLEAR 8 -#define DOCT_PAGE_LEN 9 -#define DOCT_LEFT_MARGIN 10 -#define DOCT_RIGHT_MARGIN 11 -#define DOCT_HEADER 12 -#define DOCT_FOOTER 13 -#define DOCT_INDENT 14 -#define DOCT_FOREGROUND 15 -#define DOCT_BACKGROUND 16 -#define DOCT_DEFAULT_FOREGROUND 17 -#define DOCT_DEFAULT_BACKGROUND 18 -#define DOCT_WORD_WRAP 19 -#define DOCT_HIGHLIGHT 20 -#define DOCT_BLINK 21 -#define DOCT_INVERT 22 -#define DOCT_UNDERLINE 23 -#define DOCT_SHIFTED_X 24 -#define DOCT_SHIFTED_Y 25 -#define DOCT_CURSOR_MOVEMENT 26 -#define DOCT_ANCHOR 27 -#define DOCT_LINK 28 -#define DOCT_BTTN 29 -#define DOCT_DATA 30 -#define DOCT_CHECK_BOX 31 -#define DOCT_LIST 32 -#define DOCT_MACRO 33 -#define DOCT_MENU_VAL 34 -#define DOCT_HEX_ED 35 -#define DOCT_TREE 36 -#define DOCT_SPRITE 37 -#define DOCT_INS_BIN 38 -#define DOCT_INS_BIN_SIZE 39 -#define DOCT_SONG 40 -#define DOCT_HTML_CODE 41 -#define DOCT_ERROR 42 - -#define DOCT_TYPES_NUM 43 - -//CDocEntry.type flags upper bits -#define DOCET_BLINK ATTRF_BLINK -#define DOCET_INVERT ATTRF_INVERT -#define DOCET_SEL ATTRF_SEL -#define DOCET_UNDERLINE ATTRF_UNDERLINE -#define DOCG_BL_IV_UL 0xB0000000 - -#define DOCEt_BLINK ATTRf_BLINK -#define DOCEt_INVERT ATTRf_INVERT -#define DOCEt_SEL ATTRf_SEL -#define DOCEt_UNDERLINE ATTRf_UNDERLINE - -#define DOCG_DBL_BUF_FLAGS (DOCF_OVERSTRIKE | DOCF_PLAIN_TEXT | DOCF_PLAIN_TEXT_TABS | DOCF_SIZE_MIN | DOCF_NO_CURSOR | \ - DOCF_FORM | DOCF_DBL_DOLLARS | DOCF_DONT_SWAP_OUT | DOCF_DO_FULL_REFRESH | DOCF_BORDER_DOC | \ - DOCF_HIDE_CURSOR | DOCF_DONT_HIGHLIGHT_CURSOR | DOCF_CARRIAGE_RETURN) - -//CDocEntry.de_flags. These first 16 are arg= -#define DOCEF_TAG 1 -#define DOCEF_LEN 2 -#define DOCEF_AUX_STR 4 -#define DOCEF_DEFINE 8 -#define DOCEF_HTML_LINK 0x10 -#define DOCEF_LEFT_EXP 0x20 -#define DOCEF_LEFT_MACRO 0x40 -#define DOCEF_RIGHT_EXP 0x80 -#define DOCEF_RIGHT_MACRO 0x100 -#define DOCEF_HAS_BIN 0x200 -#define DOCEF_BIN_PTR_LINK 0x400 -#define DOCEF_RAW_TYPE 0x800 -#define DOCEF_SHIFTED_X 0x1000 -#define DOCEF_SHIFTED_Y 0x2000 -#define DOCEF_SCROLLING_X 0x4000 -#define DOCEF_USER_DATA 0x8000 - -//CDocEntry.de_flags. These are +/- flags -#define DOCEF_LEFT_CB 0x10000 -#define DOCEF_LEFT_IN_STR 0x20000 -#define DOCEF_RIGHT_CB 0x40000 -#define DOCEF_RIGHT_IN_STR 0x80000 -#define DOCEF_LEFT_X 0x100000 -#define DOCEF_CENTER_X 0x200000 -#define DOCEF_RIGHT_X 0x400000 -#define DOCEF_TOP_Y 0x800000 -#define DOCEF_CENTER_Y 0x1000000 -#define DOCEF_BOTTOM_Y 0x2000000 -//HL...UL -#define DOCEF_TAG_CB 0x100000000 -#define DOCEF_PAGE_REL_Y 0x200000000 -#define DOCEF_MARGIN_REL_X 0x400000000 -#define DOCEF_WIN_REL 0x800000000 -#define DOCEF_LINK 0x1000000000 -#define DOCEF_ESC 0x2000000000 //Send (Exit and Save) -#define DOCEF_QUIT 0x4000000000 //Send (Abort) -#define DOCEF_FROM_START 0x8000000000 -#define DOCEF_HAS_BORDER 0x10000000000 -#define DOCEF_SOLID_BORDER 0x20000000000 -#define DOCEF_BORDER_PLOT 0x40000000000 -#define DOCEF_CHECKED_COLLAPSED 0x80000000000 //Checked or Collapsed -#define DOCEF_CHECK_COLLAPSABLE 0x100000000000 -#define DOCEF_REFRESH_DATA 0x200000000000 -#define DOCEF_UPDATE_DATA 0x400000000000 -//$LK,"DOCEF_DEREF_DATA",A="MN:DOCEF_DEREF_DATA"$ is confusing. $LK,"DocForm",A="MN:DocForm"$() makes doc_e->data point to members -//of class. For ints, it derefs doc_e->data as a ptr. For strings, it doesn't. -#define DOCEF_DEREF_DATA 0x800000000000 -#define DOCEF_REMALLOC_DATA 0x1000000000000 -#define DOCEF_HAS_TERMINATOR 0x2000000000000 -#define DOCEF_ZERO_BASED 0x4000000000000 -#define DOCEF_HOLD 0x8000000000000 -#define DOCEF_TREE 0x10000000000000 -#define DOCEF_LIST 0x20000000000000 -#define DOCEF_SKIP 0x40000000000000 -#define DOCEF_POPUP 0x80000000000000 -#define DOCEF_SKIP_IN_FORM 0x100000000000000 -#define DOCEF_FILTER_SKIP 0x200000000000000 -#define DOCEF_NO_CLICK_ON 0x400000000000000 -#define DOCEF_DONT_DRAW 0x800000000000000 //only works on sprites -#define DOCEF_DEFAULT_LEN 0x1000000000000000 -#define DOCEF_DEFAULT_RAW_TYPE 0x2000000000000000 - -#define DOCEG_HAS_ALLOC (DOCEF_TAG | DOCEF_AUX_STR | DOCEF_DEFINE | DOCEF_HTML_LINK | \ - DOCEF_LEFT_MACRO | DOCEF_RIGHT_MACRO | DOCEF_BIN_PTR_LINK | DOCEF_REMALLOC_DATA) - -#define DOCEG_HAS_ARG ((DOCEG_HAS_ALLOC & ~DOCEF_REMALLOC_DATA) | \ - DOCEF_LEN | DOCEF_LEFT_EXP | DOCEF_RIGHT_EXP | DOCEF_HAS_BIN | DOCEF_RAW_TYPE | \ - DOCEF_SHIFTED_X | DOCEF_SHIFTED_Y | DOCEF_SCROLLING_X | DOCEF_USER_DATA) - -#define DOCEG_DONT_EDIT (DOCEF_DEFINE | DOCEF_HTML_LINK | DOCEF_AUX_STR | DOCEF_BIN_PTR_LINK | \ - DOCEF_SCROLLING_X | DOCEF_TAG_CB) - -//These are ident to Doc flags -#define DOCEF_HIGHLIGHT 0x4000000 -#define DOCEF_WORD_WRAP 0x8000000 -#define DOCEF_BLINK ATTRF_BLINK -#define DOCEF_INVERT ATTRF_INVERT -#define DOCEF_SEL ATTRF_SEL -#define DOCEF_UNDERLINE ATTRF_UNDERLINE -#define DOCEf_HIGHLIGHT 26 -#define DOCEf_WORD_WRAP 27 -#define DOCEf_BLINK ATTRf_BLINK -#define DOCEf_INVERT ATTRf_INVERT -#define DOCEf_SEL ATTRf_SEL -#define DOCEf_UNDERLINE ATTRf_UNDERLINE - -//CDocEntry.de_flags. These first 16 are arg= -#define DOCEf_TAG 0 -#define DOCEf_LEN 1 -#define DOCEf_AUX_STR 2 -#define DOCEf_DEFINE 3 -#define DOCEf_HTML_LINK 4 -#define DOCEf_LEFT_EXP 5 -#define DOCEf_LEFT_MACRO 6 -#define DOCEf_RIGHT_EXP 7 -#define DOCEf_RIGHT_MACRO 8 -#define DOCEf_HAS_BIN 9 -#define DOCEf_BIN_PTR_LINK 10 -#define DOCEf_RAW_TYPE 11 -#define DOCEf_SHIFTED_X 12 -#define DOCEf_SHIFTED_Y 13 -#define DOCEf_SCROLLING_X 14 -#define DOCEf_USER_DATA 15 - -//CDocEntry.de_flags. These are +/- flags -#define DOCEf_LEFT_CB 16 -#define DOCEf_LEFT_IN_STR 17 -#define DOCEf_RIGHT_CB 18 -#define DOCEf_RIGHT_IN_STR 19 -#define DOCEf_LEFT_X 20 -#define DOCEf_CENTER_X 21 -#define DOCEf_RIGHT_X 22 -#define DOCEf_TOP_Y 23 -#define DOCEf_CENTER_Y 24 -#define DOCEf_BOTTOM_Y 25 -//HL...UL -#define DOCEf_TAG_CB 32 -#define DOCEf_PAGE_REL_Y 33 -#define DOCEf_MARGIN_REL_X 34 -#define DOCEf_WIN_REL 35 -#define DOCEf_LINK 36 -#define DOCEf_ESC 37 //Send (Exit and Save) -#define DOCEf_QUIT 38 //Send (Abort) -#define DOCEf_FROM_START 39 -#define DOCEf_HAS_BORDER 40 -#define DOCEf_SOLID_BORDER 41 -#define DOCEf_BORDER_PLOT 42 -#define DOCEf_CHECKED_COLLAPSED 43 //Checked or Collapsed -#define DOCEf_CHECK_COLLAPSABLE 44 -#define DOCEf_REFRESH_DATA 45 -#define DOCEf_UPDATE_DATA 46 -#define DOCEf_DEREF_DATA 47 -#define DOCEf_REMALLOC_DATA 48 -#define DOCEf_HAS_TERMINATOR 49 -#define DOCEf_ZERO_BASED 50 -#define DOCEf_HOLD 51 -#define DOCEf_TREE 52 -#define DOCEf_LIST 53 -#define DOCEf_SKIP 54 -#define DOCEf_POPUP 55 -#define DOCEf_SKIP_IN_FORM 56 -#define DOCEf_FILTER_SKIP 57 -#define DOCEf_NO_CLICK_ON 58 -#define DOCEf_DONT_DRAW 59 //only works on sprites -#define DOCEf_DEFAULT_LEN 60 -#define DOCEf_DEFAULT_RAW_TYPE 61 -#define DOCEf_FLAGS_NUM 62 - -public class CDocBin -{ - CDocBin *next, *last; - I32 tmp_use_count, renum_num; - U8 *tag; - U0 start; - U32 num, flags, size, use_count; - U0 end; - U8 *data; -#assert !($$ & 7) -}; - -#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 DOC_ATTR_DEFAULT_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_PROMPT GREEN -#define DOC_COLOR_COMMENT GREEN -#define DOC_COLOR_BIN LTGREEN -#define DOC_COLOR_STR BROWN -#define DOC_COLOR_CHAR_CONST BROWN -#define DOC_COLOR_EXPORT_SYS_SYM LTPURPLE -#define DOC_COLOR_DEFINE_STR CYAN -#define DOC_COLOR_GLOBAL_VAR LTCYAN -#define DOC_COLOR_CLASS LTBLUE -#define DOC_COLOR_FUN PURPLE -#define DOC_COLOR_KEYWORD BLUE -#define DOC_COLOR_REG LTRED -#define DOC_COLOR_NUMBER YELLOW - -public class CDocSettings -{ - U32 final_u32_attr; - I16 left_margin, right_margin, indent; - U16 page_len, header, footer; - I8 shifted_x, shifted_y; - U8 state, comment_depth, paren_depth, brace_depth, cur_text_attr, default_text_attr; -}; - -#define DOC_DEFAULT I32_MIN - -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 de_flags; - I32 x, y; - U32 min_col, max_col; - CDocSettings settings; - I64 user_data; -#assert !($$&7) -}; - -#define DOCE_LEN_DEFAULT 64 - -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, - *aux_str, - *bin_ptr_link, - *html_link, - *my_format_data; - I64 hex_ed_width; - I32 scroll_len, - len, //$LK,"DOCE_LEN_DEFAULT",A="MN:DOCE_LEN_DEFAULT"$ - bin_num; - U8 raw_type, pad[3]; - CDocBin *bin_data; - U8 *data; -#assert !($$ & 7) -}; - -//$LK,"DocForm",A="MN:DocForm"$() $LK,"DocMenu",A="MN:DocMenu"$() $LK,"DocEd",A="MN:DocEd"$() $LK,"PopUpMenu",A="MN:PopUpMenu"$() -#define DOF_SIZE_MIN 0x01 -#define DOF_INTERCEPT_TASK_END 0x02 -#define DOF_DONT_HOME 0x04 -#define DOF_WIN_MAX 0x08 -#define DOF_DONT_TEXT_ATTR 0x10 -#define DOF_DONT_WINMGR_SYNC 0x20 -#define DOF_DONT_SHOW 0x40 -//Combines with $LK,"Editor Flags",A="MN:EDF_BAIL"$ - -class CEdFindText -{ - U8 find_text[STR_LEN] format "$$DA-P,A=\"Find :%s\"$$\n", - replace_text[STR_LEN] format "$$DA-P,A=\"Replace :%s\"$$\n"; - Bool replace format "$$CB,\"Replace\"$$\n", - scan_fwd format "$$CB,\"Fwd\"$$\n", - scan_sel_text format "$$CB,\"Selection\"$$\n", - match_case format "$$CB,\"Match Case\"$$\n", - whole_labels format "$$CB,\"Whole Labels\"$$\n", - local_var format "$$CB,\"Rename Local Var\"$$\n", - prompt, pad; - I64 filter_lines format "$$DA,A=\"Filter Lines:%d\"$$\n"; -}; - -class CEdFileName -{ - CDirContext *dirc; - U8 name[256] format "$$DA-P,LEN=255,A=\"FileName:%s\"$$"; -}; - -//$LK,"Ed",A="MN:Ed"$() -#define EDF_BAIL 0x100 -#define EDF_COLLAPSE 0x200 -#define EDF_UNCOLLAPSE 0x400 -#define EDF_WAS_WRITE 0x800 //Was exit ESC or SHIFT_ESC? -//Combines with $LK,"Document Flags",A="MN:DOF_SIZE_MIN"$ - -#define EDf_BAIL 8 -#define EDf_COLLAPSE 9 -#define EDf_UNCOLLAPSE 10 -#define EDf_WAS_WRITE 11 - -// DOC header flags -#define DOCF_PLAIN_TEXT 0x1 -#define DOCF_PLAIN_TEXT_TABS 0x2 //has '\t', not DOCT_TAB -#define DOCF_AUTO_SAVE 0x4 -#define DOCF_NO_CURSOR 0x8 -#define DOCF_CARRIAGE_RETURN 0x10 -#define DOCF_DBL_DOLLARS 0x20 -#define DOCF_COLOR_NAMES 0x40 -//Reserved x1 -#define DOCF_BORDER_DOC 0x100 -#define DOCF_FORM 0x200 -#define DOCF_SIZE_MIN 0x400 -#define DOCF_HIDE_CURSOR 0x800 //use $LK,"DocCursor",A="MN:DocCursor"$ -#define DOCF_DONT_HIGHLIGHT_CURSOR 0x1000 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$ -#define DOCF_NO_SCROLL_BARS 0x2000 //use $LK,"DocScroll",A="MN:DocScroll"$ -#define DOCF_ALLOW_UNDO 0x4000 -#define DOCF_DONT_SHOW 0x8000 -#define DOCF_HAS_SONG 0x10000 -#define DOCF_MORE 0x20000 -#define DOCF_BWD_MOVEMENT 0x40000 -#define DOCF_NULL_GRAB_SCROLL 0x80000 -#define DOCF_DONT_SWAP_OUT 0x100000 -#define DOCF_DO_FULL_REFRESH 0x200000 -#define DOCF_BREAK_UNLOCKED 0x400000 -//Reserved x1 -#define DOCF_HIGHLIGHT DOCEF_HIGHLIGHT -#define DOCF_WORD_WRAP DOCEF_WORD_WRAP -#define DOCF_BLINK DOCEF_BLINK -#define DOCF_INVERT DOCEF_INVERT -#define DOCF_SEL DOCEF_SEL -#define DOCF_UNDERLINE DOCEF_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_TABS 1 //has '\t', not DOCT_TAB -#define DOCf_AUTO_SAVE 2 -#define DOCf_NO_CURSOR 3 -#define DOCf_CARRIAGE_RETURN 4 -#define DOCf_DBL_DOLLARS 5 -#define DOCf_COLOR_NAMES 6 -//Reserved x1 -#define DOCf_BORDER_DOC 8 -#define DOCf_FORM 9 -#define DOCf_SIZE_MIN 10 -#define DOCf_HIDE_CURSOR 11 //use $LK,"DocCursor",A="MN:DocCursor"$ -#define DOCf_DONT_HIGHLIGHT_CURSOR 12 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$ -#define DOCf_NO_SCROLL_BARS 13 //use $LK,"DocScroll",A="MN:DocScroll"$ -#define DOCf_ALLOW_UNDO 14 -#define DOCf_DONT_SHOW 15 -#define DOCf_HAS_SONG 16 -#define DOCf_MORE 17 -#define DOCf_BWD_MOVEMENT 18 -#define DOCf_NULL_GRAB_SCROLL 19 -#define DOCf_DONT_SWAP_OUT 20 -#define DOCf_DO_FULL_REFRESH 21 -#define DOCf_BREAK_UNLOCKED 22 -//Reserved x1 - -#define DOCf_HIGHLIGHT DOCEf_HIGHLIGHT -#define DOCf_WORD_WRAP DOCEf_WORD_WRAP -#define DOCf_BLINK DOCEf_BLINK -#define DOCf_INVERT DOCEf_INVERT -#define DOCf_SEL DOCEf_SEL -#define DOCf_UNDERLINE DOCEf_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, doc_flags, time_stamp; - U8 *body; -}; - -//See $LK,"DocMenu",A="MN:DocMenu"$() -#define DOCM_CANCEL (-1) - -#define DOC_SIGNATURE_VAL 'DocS' - -#define RECALCt_NORMAL 0x00 -#define RECALCt_FIND_CURSOR 0x01 -#define RECALCt_TO_SCREEN 0x02 -#define RECALCG_MASK 0xFF - -#define RECALCF_HAS_CURSOR 0x100 -#define RECALCF_ADD_CURSOR 0x200 -#define RECALCF_TO_HTML 0x400 - -public class CDoc //Linked Text File header -{//See $LK,"Doc",A="HI:Doc"$ for documentation. - CDocEntryBase head; - I64 flags, locked_flags; - CDocEntry *cur_entry, *old_cur_entry; - I32 cur_col, old_cur_col, line_start_col, top_line_num, dollar_buf_size, dollar_buf_ptr; - U8 *dollar_buf; //When entering $$ cmds, it buffers them until the end $$. - - CTask *win_task, *mem_task, *owning_task; - I32 page_line_num, undo_count, - x, y, min_x, max_x, min_y, max_y; - I64 line, col, best_d, - old_win_top, old_win_bottom, old_win_left, old_win_right, - cmd_U8; - U32 doc_signature, cur_bin_num; - I64 max_entries, updates_count; - CEdFindText *find_replace; - - CEdFileName filename; - I64 file_attr; - I64 (*left_click_link)(CDoc *doc, CDocEntry *doc_e); - I64 (*right_click_link)(CDoc *doc, CDocEntry *doc_e); - - //See $LK,"::/Apps/Psalmody/JukeBox.ZC"$ - U8 *user_put_data; //Passed to user_put_key() and user_put_s() - 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; //(When browsing deeper, opening deeper docs.) - U64 desc; //8 characters. See $LK,"DocBorderListDraw",A="MN:DocBorderListDraw"$(). - - CDocBin bin_head; - CDocSettings settings_head; - CDocUndo undo_head; - - I64 user_data; -#assert !($$&7) -}; - -#help_index "Windows" -/* -Fs->win_inhibit mask - -Some inhibit actions on the task itself. -Some inhibit actions if the focus task -tries to do something. -*/ -#define WIF_SELF_FOCUS 0x0001 //If active this task cannot have focus -//MENU 0x0002 -#define WIF_SELF_CTRLS 0x0004 -#define WIF_SELF_MS_L 0x0008 -//MS_L_D 0x0010 -#define WIF_SELF_MS_R 0x0020 -//MS_R_D 0x0040 -#define WIF_SELF_MS_WHEEL 0x0080 //Does nothing, yet -#define WIF_SELF_BORDER 0x0100 -#define WIF_SELF_GRAB_SCROLL 0x0200 -#define WIF_SELF_DOC 0x0400 -#define WIF_SELF_ODE 0x0800 -#define WIF_SELF_KEY_DESC 0x1000 -//FOCUS 0x00010000 -#define WIF_FOCUS_TASK_MENU 0x00020000 -#define WIF_FOCUS_TASK_CTRLS 0x00040000 -#define WIF_FOCUS_TASK_MS_L 0x00080000 -#define WIF_FOCUS_TASK_MS_L_D 0x00100000 -#define WIF_FOCUS_TASK_MS_R 0x00200000 -#define WIF_FOCUS_TASK_MS_R_D 0x00400000 -#define WIF_FOCUS_TASK_MS_WHEEL 0x00800000 //Does nothing, yet -#define WIF_FOCUS_TASK_BORDER 0x01000000 -#define WIF_FOCUS_TASK_GRAB_SCROLL 0x02000000 - -#define WIG_DBL_CLICK (WIF_FOCUS_TASK_MS_L_D | WIF_FOCUS_TASK_MS_R_D) -#define WIG_TASK_DEFAULT (WIF_FOCUS_TASK_MENU | WIG_DBL_CLICK | 0xFFFF - WIF_SELF_DOC - WIF_SELF_ODE) -#define WIG_NO_FOCUS_TASK_DEFAULT (WIG_TASK_DEFAULT - WIF_SELF_BORDER - WIF_SELF_MS_L - WIF_SELF_MS_R - WIG_DBL_CLICK) -#define WIG_USER_TASK_DEFAULT WIF_SELF_KEY_DESC - -#define WIf_SELF_FOCUS 0 -#define WIf_SELF_CTRLS 2 -#define WIf_SELF_MS_L 3 -#define WIf_SELF_MS_R 5 -#define WIf_SELF_MS_WHEEL 7 -#define WIf_SELF_BORDER 8 -#define WIf_SELF_GRAB_SCROLL 9 -#define WIf_SELF_DOC 10 -#define WIf_SELF_ODE 11 -#define WIf_SELF_KEY_DESC 12 -#define WIf_FOCUS_TASK_MENU 17 -#define WIf_FOCUS_TASK_CTRLS 18 -#define WIf_FOCUS_TASK_MS_L 19 -#define WIf_FOCUS_TASK_MS_L_D 20 -#define WIf_FOCUS_TASK_MS_R 21 -#define WIf_FOCUS_TASK_MS_R_D 22 -#define WIf_FOCUS_TASK_MS_WHEEL 23 -#define WIf_FOCUS_TASK_BORDER 24 -#define WIf_FOCUS_TASK_GRAB_SCROLL 25 -#define WIf_FLAGS_NUM 26 - -class CWinMgrTimingGlobals -{ - I64 last_total_jiffies, - last_idle_pt_hits[MP_PROCESSORS_NUM], - last_swap_counter[MP_PROCESSORS_NUM]; - F64 last_calc_idle_time, calc_idle_delta_time; - I64 calc_idle_count; -}; - -#define WINMGR_FPS (60000.0 / 1001) -#define WINMGR_PERIOD (1001 / 60000.0) - -public class CWinMgrGlobals -{ - I64 updates; - F64 ode_time, - last_ode_time, - fps, //You can read but not write this. You have no control. - ideal_refresh_tS, - last_refresh_tS; - CWinMgrTimingGlobals *t; - Bool show_menu, grab_scroll, grab_scroll_closed; -}; - -#help_index "AutoComplete" -#define ACf_INIT_IN_PROGRESS 0 -#define ACf_LAST_WAS_KEYMAP 1 - -#define AC_FILLINS_NUM 12 -public class CAutoCompleteGlobals -{ - I64 col, row, old_col, old_row, num_words; - CHashTable *hash_table; - U8 *cur_word; - I64 flags; - CTask *task; - I64 partial_len, num_fillins, - fillin_hits [AC_FILLINS_NUM + 1]; - CHashAC *fillin_matches[AC_FILLINS_NUM + 1]; -}; - -#help_index "AutoComplete/Dictionary" -#define ACD_WORD_FILENAME "/System/AutoComplete/ACWords.DATA" -#define ACD_DEF_FILENAME "/System/AutoComplete/ACDefs.DATA" - -#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_FILLINS_NUM 10 -public class CAutoCompleteDictGlobals -{ - U8 *word_list; - I64 word_list_size, num_words, num_fillins; - U8 *fillins[ACD_FILLINS_NUM]; - Bool has_words, has_defs; -}; - -#help_index "Compiler/Directive" -//Compiler $LK,"Option",A="MN:Option"$()s -//You might need to do #exe {Option();} -//Note: The #exe statement is lexed-ahead, -//so it takes effect earlier than you might expect. -#define OPTf_ECHO 0 -#define OPTf_TRACE 1 -#define OPTf_WARN_UNUSED_VAR 2 //Applied to functions, not statements -#define OPTf_WARN_PAREN 3 //Warn unnecessary parens -#define OPTf_WARN_DUP_TYPES 4 //Warn duplicate local variable type statements -#define OPTf_WARN_HEADER_MISMATCH 5 -#define OPTf_EXTERNS_TO_IMPORTS 6 -#define OPTf_KEEP_PRIVATE 7 -#define OPTf_NO_REG_VAR 8 //Applied to functions, not statements -#define OPTf_GLOBALS_ON_DATA_HEAP 9 -//Disable 10-byte float consts for ã,log2_10,log10_2,loge_2 -#define OPTf_NO_BUILTIN_CONST 10 //Applied to functions, not statements -#define OPTf_USE_IMM64 11 //Not completely implemented -#define OPTf_DECIMAL_ONLY 12 //Only allow decimal numbers (no 0x or 0b prefixed numbers) -#define OPTf_NO_FLOATS 13 //No floating point numbers allowed - -#define OPTF_ECHO (1 << OPTf_ECHO) - -#help_index "Compiler/Intermediate Code" -//See $LK,"ST_RAW_TYPES",A="MN:ST_RAW_TYPES"$ -#define RT_I0 2 -#define RT_U0 3 -#define RT_I8 4 -#define RT_U8 5 -#define RT_I16 6 -#define RT_U16 7 -#define RT_I32 8 -#define RT_U32 9 -#define RT_I64 10 -#define RT_PTR 10 //Signed to allow negative error codes. $LK,"DOCM_CANCEL",A="MN:DOCM_CANCEL"$ -#define RT_U64 11 -#define RT_F32 12 //Not implemented -#define RT_UF32 13 //Not implemented, Fictitious -#define RT_F64 14 -#define RT_UF64 15 //Fictitious -#define RT_RTS_NUM 16 -#define RTF_UNSIGNED 1 -#define RTG_MASK 0xFF - -#define MDf_STACK 8 -#define MDf_IMM 9 -#define MDf_REG 10 -#define MDf_DISP 11 -#define MDf_SIB 12 -#define MDf_RIP_DISP32 13 - -#define MDF_NULL 0x0000 -#define MDF_STACK 0x0100 -#define MDF_IMM 0x0200 -#define MDF_REG 0x0400 -#define MDF_DISP 0x0800 -#define MDF_SIB 0x1000 -#define MDF_RIP_DISP32 0x2000 -#define MDG_MASK 0xFF00 -#define MDG_REG_DISP_SIB (MDF_REG | MDF_DISP | MDF_SIB) -#define MDG_DISP_SIB_RIP (MDF_DISP | MDF_SIB | MDF_RIP_DISP32) -#define MDG_REG_DISP_SIB_RIP (MDF_REG | MDG_DISP_SIB_RIP) - -#define ICF_RES_TO_F64 0x000000001 -#define ICF_RES_TO_INT 0x000000002 -#define ICF_ARG1_TO_F64 0x000000004 -#define ICF_ARG1_TO_INT 0x000000008 -#define ICF_ARG2_TO_F64 0x000000010 -#define ICF_ARG2_TO_INT 0x000000020 -#define ICF_USE_F64 0x000000040 -#define ICF_USE_UNSIGNED 0x000000080 -#define ICF_USE_INT 0x000000100 //highest priority -#define ICF_RES_NOT_USED 0x000000200 -#define ICF_CODE_FINAL 0x000000400 -#define ICF_BY_VAL 0x000000800 //By value, not ref. -#define ICF_SHORT_JMP 0x000001000 -#define ICF_PUSH_RES 0x000002000 -#define ICF_PASS_TRACE 0x000004000 -#define ICF_RES_WAS_STACK 0x000008000 -#define ICF_ARG1_WAS_STACK 0x000010000 -#define ICF_ARG2_WAS_STACK 0x000020000 -#define ICF_PUSH_CMP 0x000040000 //for 50last_cc->lex_include_stack->line_num);} -#define __CMD_LINE__ #exe{StreamPrint("%d", Fs->last_cc->flags & CCF_CMD_LINE && Fs->last_cc->lex_include_stack->depth < 1);} -#define __FILE__ #exe{StreamPrint("\"%s\"", Fs->last_cc->lex_include_stack->full_name);} -#define __DIR__ #exe{StreamDir;} - -#define LFSF_DOC 1 -#define LFSF_DEFINE 2 -class CLexFile -{ - CLexFile *next; - U8 *buf, - *buf_ptr; - I64 line_num, flags; - U8 *full_name, - *line_start; - CDoc *doc; - CDocEntry *cur_entry; - I32 depth; - U8 last_U16, pad[3]; -}; - -class CAOTCtrl -{ - I64 rip; //Instruction pointer - CAsmArg arg1, arg2, arg3; - CAOTBinBlk *bin; - I64 num_bin_U8s, - max_align_bits, org; - CAsmUnresolvedRef *local_unresolved, *global_unresolved; - CAOTAbsAddr *abss; - CAOTHeapGlobal *heap_globals; - I64 list_col, list_last_rip; - U8 *last_label, *list_last_line; - CLexFile *list_last_lfn; - I64 seg_size; - Bool list; -}; - -//Tokens -#define TK_EOF 0 -#define TK_SUPERSCRIPT 0x001 -#define TK_SUBSCRIPT 0x002 -#define TK_NORMALSCRIPT 0x003 -#define TK_IDENT 0x100 -#define TK_STR 0x101 -#define TK_I64 0x102 -#define TK_CHAR_CONST 0x103 -#define TK_F64 0x104 -#define TK_PLUS_PLUS 0x105 -#define TK_MINUS_MINUS 0x106 -#define TK_DEREFERENCE 0x107 -#define TK_DBL_COLON 0x108 -#define TK_SHL 0x109 -#define TK_SHR 0x10A -#define TK_EQU_EQU 0x10B -#define TK_NOT_EQU 0x10C -#define TK_LESS_EQU 0x10D -#define TK_GREATER_EQU 0x10E -#define TK_AND_AND 0x10F -#define TK_OR_OR 0x110 -#define TK_XOR_XOR 0x111 -#define TK_SHL_EQU 0x112 -#define TK_SHR_EQU 0x113 -#define TK_MUL_EQU 0x114 -#define TK_DIV_EQU 0x115 -#define TK_AND_EQU 0x116 -#define TK_OR_EQU 0x117 -#define TK_XOR_EQU 0x118 -#define TK_ADD_EQU 0x119 -#define TK_SUB_EQU 0x11A -#define TK_IF 0x11B -#define TK_IFDEF 0x11C -#define TK_IFNDEF 0x11D -#define TK_IFAOT 0x11E -#define TK_IFJIT 0x11F -#define TK_ENDIF 0x120 -#define TK_ELSE 0x121 -#define TK_MOD_EQU 0x122 -#define TK_DOT_DOT 0x123 -#define TK_ELLIPSIS 0x124 -#define TK_INS_BIN 0x125 -#define TK_INS_BIN_SIZE 0x126 -#define TK_TKS_NUM 0x127 - -class CLexHashTableContext -{ - CLexHashTableContext *next; - I64 old_flags, hash_mask; - CHashFun *local_var_list, - *fun; - CHashTable *hash_table_list, - *define_hash_table, - *local_hash_table, - *global_hash_table; -}; - -//CompCtrl flags -#define CCF_CMD_LINE 0x001 -#define CCF_PROMPT 0x002 -#define CCf_PROMPT 1 -#define CCF_QUESTION_HELP 0x004 -#define CCF_DONT_FREE_BUF 0x008 -#define CCF_NO_DEFINES 0x010 -#define CCF_IN_IF 0x020 -#define CCF_JUST_LOAD 0x040 -#define CCF_KEEP_NEW_LINES 0x080 -#define CCF_KEEP_DOT 0x100 -#define CCF_KEEP_SIGN_NUM 0x200 -#define CCF_KEEP_AT_SIGN 0x400 -#define CCF_NO_CHAR_CONST 0x800 -#define CCf_PASS_TRACE_PRESENT 12 -#define CCF_NOT_CONST 0x0000020000 -#define CCF_NO_REG_OPT 0x0000040000 -#define CCF_IN_QUOTES 0x0000080000 -#define CCF_EXE_BLK 0x0000100000 -#define CCF_HAS_MISC_DATA 0x0000200000 -#define CCF_HAS_RETURN 0x0000400000 -#define CCF_ASM_EXPRESSIONS 0x0000800000 -#define CCF_UNRESOLVED 0x0001000000 -#define CCF_LOCAL 0x0002000000 -#define CCF_FUN_EXP 0x0004000000 -#define CCf_FUN_EXP 26 -#define CCF_POSTINC 0x0008000000 -#define CCF_POSTDEC 0x0010000000 -#define CCF_PREINC 0x0020000000 -#define CCF_PREDEC 0x0040000000 -#define CCF_ARRAY 0x0080000000 -#define CCF_RAX 0x0100000000 -#define CCF_USE_LAST_U16 0x0200000000 -#define CCf_USE_LAST_U16 33 -#define CCF_LAST_WAS_DOT 0x0400000000 -#define CCF_AOT_COMPILE 0x0800000000 -#define CCf_AOT_COMPILE 35 -#define CCF_NO_ABSS 0x1000000000 -#define CCF_PAREN 0x2000000000 -#define CCf_PAREN 37 -#define CCF_CLASS_DOL_OFFSET 0x4000000000 -#define CCF_DONT_MAKE_RES 0x8000000000 - -public class CCompCtrl -{ - CCompCtrl *next, *last; - I64 token, flags, - cur_i64; - F64 cur_f64; - U8 *cur_str; - I64 cur_str_len, - class_dol_offset; - U8 *dollar_buf; - I64 dollar_count; - U8 *cur_help_idx; - I64 last_U16, - min_line, max_line, last_line_num, - lock_count; - U32 *char_bmp_alpha_numeric; - CLexHashTableContext htc; - CHashGeneric *hash_entry; - CAbsCountsI64 abs_counts; - CAsmUndefHash *asm_undef_hash; - CMemberList *local_var_entry; - CCodeMisc *lb_leave; - U8 *cur_buf_ptr; - CLexFile *lex_include_stack, - *lex_parse_stack, - *fun_lex_file; - CStreamBlk *next_stream_blk, *last_stream_blk; - CAOT *aot; - - I64 pass, opts, pass_trace, saved_pass_trace, error_count, warning_count; - - //For intermediate codes with multiple float ops (int<->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]; - - CCodeCtrl coc; - CParseStack *ps; - CAOTCtrl *aotc; - I64 aot_depth, prompt_line; -#assert !($$ & 7) -}; - -#help_index "Compiler" -public class CCompGlobals -{ - CHashTable *asm_hash; - CHashClass *internal_types[RT_RTS_NUM]; - CIntermediateCode ic_nop; - U32 *dual_U16_tokens1, *dual_U16_tokens2, *dual_U16_tokens3, - *binary_ops; - I64 num_reg_vars, num_non_ptr_vars, - stack_tmps_mask, reg_vars_mask, non_ptr_vars_mask; - U8 *to_reg_vars_map, *non_ptr_vars_map; - I64 size_arg_mask[17], - compiled_lines; -}; - -#help_index "Debugging/Unassemble" -class CUAsmGlobals -{ - CInst **table_16_32, - **table_64; - I64 table_16_32_entries, - table_64_entries, - ins64_arg_mask, - signed_arg_mask, - mem_arg_mask; -}; - -#help_index "Devices/SMBIOS" -//SMBIOS parsing based on SMBIOS specification 3.3.0 (document "DSP0134") -#define SMBIOSt_BIOS 0 -#define SMBIOSt_SYSTEM 1 -#define SMBIOSt_BASEBOARD 2 -#define SMBIOSt_ENCLOSURE 3 -#define SMBIOSt_PROCESSOR 4 -#define SMBIOSt_CACHE 7 -#define SMBIOSt_CONNECTOR 8 -#define SMBIOSt_SLOT 9 -#define SMBIOSt_OEM_STRINGS 11 -#define SMBIOSt_SYS_CONFIG_OPTIONS 12 -#define SMBIOSt_PHYMEM 16 -#define SMBIOSt_MEM_DEVICE 17 -#define SMBIOSt_MAPPED_ADDR 19 -#define SMBIOSt_BATTERY 22 -#define SMBIOSt_BOOT_INFO 32 -#define SMBIOSt_ALL 0xFF //Non-existent placeholder type - -class CSMBIOSHeader -{//Section 6.1.2 line 885 - U8 type, //SMBIOSt_* - length; - U16 handle; //identifier for this structure. -}; -class CSMBIOSEntryPoint -{//Section 5.2.1 line 812 - U8 anchor_str[4], // '_SM_' - checksum, - length, - major_version, - minor_version; - U16 max_structure_size; - U8 entry_point_revision, - formatted_area[5], - anchor_str2[5], // '_DMI_' - checksum2; - U16 table_length; - U32 table_address; - U16 structure_count; - U8 bcd_revision; -}; - -class CSMBIOSBIOSInfo -{//Section 7.1 line 922 - CSMBIOSHeader header; - U8 vendor, - version; - U16 start_address_segment; - U8 release_date, - rom_size; - U64 flags; - U8 extended_flags[2]; - U8 major_release, - minor_release, - embedded_controller_firmware_major_release, - embedded_controller_firmware_minor_release; - U16 extended_rom_size; -}; - -class CSMBIOSSystemInfo -{//Section 7.2 line 936 - CSMBIOSHeader header; - U8 manufacturer, - product_name, - version, - serial_number, - uuid[16], - wakeup_type, - sku_number, - family; -}; - -class CSMBIOSBaseboardInfo -{//Section 7.3 line 968 - CSMBIOSHeader header; - U8 manufacturer, - product, - version, - serial_number, - asset_tag, - feature_flags, - chassis_location; - U16 chassis_handle; - U8 board_type, - contained_object_handles_num; - U16 contained_object_handles[1]; //Variable length, member above gives length -}; - -class CSMBIOSEnclosureInfo -{//Section 7.4 line 984 - CSMBIOSHeader header; - U8 manufacturer, - type, - version, - serial_number, - asset_tag, - bootup_state, - power_supply_state, - thermal_state, - security_status; - U32 oem_defined; - U8 height, - power_cord_count, - contained_element_count, - contained_element_record_length, - contained_elements[1]; //array length == count * record_length; -}; - -class CSMBIOSEnclosureContainedElement -{//Section 7.4.4 line 999 - U8 contained_element_type, - contained_element_minimum, - contained_element_maximum; -}; - -class CSMBIOSProcessorInfo -{//Section 7.5 line 1010 - CSMBIOSHeader header; - U8 name, - type, - family, - manufacturer; - U64 id; - U8 version, - voltage; - U16 external_clock, - max_speed, - current_speed; - U8 status, - upgrade; - U16 l1_cache_handle, - l2_cache_handle, - l3_cache_handle; - U8 serial_number, - asset_tag, - part_number, - core_count, - cores_enabled, - thread_count; - U16 characteristics; -}; - -class CSMBIOSCacheInfo -{//Section 7.8 line 1168 - CSMBIOSHeader header; - U8 name; - U16 config, - max_size, - installed_size, - supported_sram_type, - installed_sram_type; - U8 cache_speed, - error_correction_type, - cache_type, - associativity; -}; - -class CSMBIOSConnectorInfo -{//Section 7.9 line 1198 - CSMBIOSHeader header; - U8 internal_name, - internal_type, - external_name, - external_type, - port_type; -}; - -class CSMBIOSSlotInfo -{//Section 7.10 line 1226 - CSMBIOSHeader header; - U8 name, - type, - data_bus_width, - current_usage, - length; - U16 id; - U8 flags1, - flags2; - U16 segment_group_number; - U8 bus_number, - device_function_number; -}; - -class CSMBIOSMemArrayInfo -{//Section 7.17 line 1519 - CSMBIOSHeader header; - U8 location, - use, - memory_error_correction; - U32 max_capacity; - U16 memory_error_info_handle, - mem_device_count; - U64 extended_max_capacity; -}; - -class CSMBIOSMemDeviceInfo -{//Section 7.18 line 1538 - CSMBIOSHeader header; - U16 memory_array_handle, - memory_error_info_handle, - total_width, - data_width, - size; - U8 form_factor, - device_set, - device_locator, - bank_locator, - type; - U16 type_detail, - speed; - U8 manufacturer, - serial_number, - asset_tag, - part_number, - attributes; - U32 extended_size; - U16 configured_speed, - min_voltage, - max_voltage, - configured_voltage; -}; - -class CSMBIOSBatteryInfo -{//Section 7.23 line 1723 - CSMBIOSHeader header; - U8 location, - manufacturer, - manufacture_date, - serial_number, - name, - chemistry, - capacity, - voltage, - sbds_version_number, - max_battery_data_error, - sbds_serial_number, - sbds_manufacture_date, - sbds_chemistry, - capacity_multiplier; - U32 oem; -}; - -#help_index "Devices;PCI" - -//PCI Registers, used with $LK,"PCIRead",A="MN:PCIReadU16"$ functions. -#define PCIR_VENDOR_ID 0x00 -#define PCIR_DEVICE_ID 0x02 -#define PCIR_COMMAND 0x04 -#define PCIR_STATUS 0x06 -#define PCIR_REVISION_ID 0x08 -#define PCIR_PROG_IF 0x09 -#define PCIR_SUB_CODE 0x0A -#define PCIR_CLASS_CODE 0x0B -#define PCIR_CACHE_LINE_SIZE 0x0C -#define PCIR_LATENCY_TIMER 0x0D -#define PCIR_HEADER_TYPE 0x0E -#define PCIR_BIST 0x0F -#define PCIR_BASE0 0x10 -#define PCIR_BASE1 0x14 -#define PCIR_BASE2 0x18 -#define PCIR_BASE3 0x1C -#define PCIR_BASE4 0x20 -#define PCIR_BASE5 0x24 -#define PCIR_SUBSYS_VENDOR_ID 0x2C -#define PCIR_SUBSYS_ID 0x2E -#define PCIR_EXPANSION_ROM 0x30 -#define PCIR_CAPABILITIES 0x34 -#define PCIR_INTERRUPT_LINE 0x3C -#define PCIR_INTERRUPT_PIN 0x3D -#define PCIR_MIN_GRANT 0x3E -#define PCIR_MAX_LATENCY 0x3F - -//PCI class codes -#define PCIC_STORAGE 0x1 -#define PCIC_NETWORK 0x2 - -//PCI subclass codes -#define PCISC_ETHERNET 0x0 -#define PCISC_AHCI 0x6 - -//PCI I/O ports -#define PCI_ADDR 0xCF8 -#define PCI_DATA 0xCFC - -class CPCIDev -{ - CPCIDev *next, *last; - U8 bus, dev, fun, - *vendor_str, - *dev_id_str, - class_code, - sub_code, - prog_if, - revision_id, - bist, - header_type, - latency_timer, - cache_line_size, - capabilities, - interrupt_line, - interrupt_pin, - min_grant, - max_latency; - U16 vendor_id, - device_id, - subsys_id, - subsys_vendor_id; - U32 base[6], - erom; -}; - -#help_index "Devices;Disk/AHCI" -#define AHCI_MAX_PORTS 32 - -//Physical Region Descriptor Table -#define AHCI_PRD_MAX_BYTES (4 * 1024 * 1024) //Max bytes that can go in one PRD entry ($ER$4 MiB). Section 4.2.3.3 Fig. 17 (DBC) -#define AHCI_PRDT_MAX_BLOCKS (U16_MAX + 1) //Max blocks you can transfer in one command. -#define AHCI_PRDT_MAX_LEN 8 //Max PRD entries in one command. This is equal to (MAX_BLOCKS * BLK_SIZE) ö MAX_BYTES. - -//Global Host Control (Controller) flags -#define AHCI_GHCf_HBA_RESET 0 -#define AHCI_GHCf_INTERRUPT_ENABLE 1 -#define AHCI_GHCf_AHCI_ENABLE 31 - -#define AHCI_CAPSf_S64A 31 //Supports 64-bit Addressing - -#define AHCI_CAPSEXTf_BOH 0 //Supports BIOS/OS Handoff -#define AHCI_CAPSEXTf_NVMP 1 //NVMHCI Supported & Present - -//BIOS/OS Handoff Control -#define AHCI_BOHCf_BOS 0 //BIOS-Owned Semaphore (BIOS owns controller) -#define AHCI_BOHCf_OOS 1 //OS-Owned Semaphore (OS owns controller) -#define AHCI_BOHCf_BB 4 //BIOS Busy (polling bit while BIOS cleans up things after ownership transfer) - -//Command Header flags -#define AHCI_CH_DESCf_A 5 //'ATAPI' bit. Set when ATAPI command is being sent. -#define AHCI_CH_DESCF_A (1 << AHCI_CH_DESCf_A) -#define AHCI_CH_DESCf_W 6 //'Write' bit. Set when data is being written. -#define AHCI_CH_DESCF_W (1 << AHCI_CH_DESCf_W) - -//Command FIS flags -#define AHCI_CF_DESCf_C 7 //'Command' bit. Set when FIS is an ATA command. -#define AHCI_CF_DESCF_C (1 << AHCI_CF_DESCf_C) - -//Port register flags -//Command and Status register flags -#define AHCI_PxCMDf_ST 0 //'Start'. Start processing commmand list. FRE must be set before. -#define AHCI_PxCMDf_SUD 1 //'Spin-Up Device'. For devices that support Staggered Spin-up. We attempt to set it for all ports. -#define AHCI_PxCMDf_POD 2 //'Power-On Device'. For devices that support Cold Presence. We attempt to set it for all ports. -#define AHCI_PxCMDf_FRE 4 //'FIS Receive Enable'. Allows the processing of FISes. -#define AHCI_PxCMDf_FR 14 //'FIS receive Running'. Status indicator for FRE. -#define AHCI_PxCMDf_CR 15 //'Command list Running'. Status indicator for ST. -#define AHCI_PxCMDf_ATAPI 24 //'Device is ATAPI'. When set, HBA turns on desktop LED when device is in use. For ATAPI devices. -#define AHCI_PxCMDF_ST (1 << AHCI_PxCMDf_ST) -#define AHCI_PxCMDF_SUD (1 << AHCI_PxCMDf_SUD) -#define AHCI_PxCMDF_POD (1 << AHCI_PxCMDf_POD) -#define AHCI_PxCMDF_FRE (1 << AHCI_PxCMDf_FRE) -#define AHCI_PxCMDF_FR (1 << AHCI_PxCMDf_FR) -#define AHCI_PxCMDF_CR (1 << AHCI_PxCMDf_CR) -#define AHCI_PxCMDF_ATAPI (1 << AHCI_PxCMDf_ATAPI) - -//Task File Data register flags -#define AHCI_PxTFDf_STS_ERR 0 // Error Bit of Status register - -//Signature types -#define AHCI_PxSIG_ATA 0x00000101 -#define AHCI_PxSIG_ATAPI 0xEB140101 -#define AHCI_PxSIG_SEMB 0xC33C0101 //Enclosure Management Bridge... rare to encounter in wild. -#define AHCI_PxSIG_PM 0x96690101 //Port multiplier... not relevant to PC-type systems. - -//Interrupt flags (same in PxIE and PxIS) -#define AHCI_PxIf_OFS 24 //Overflow Status -#define AHCI_PxIf_INFS 26 //SATA Interface Non-Fatal Error -#define AHCI_PxIf_IFS 27 //SATA Interface Fatal Error -#define AHCI_PxIf_HBDS 28 //Host Bus Data Error -#define AHCI_PxIf_HBFS 29 //Host Bus Fatal Error -#define AHCI_PxIf_TFE 30 //Task File Error, see $LK,"ATAS_ERR",A="MN:ATAS_ERR"$. -#define AHCI_PxIf_CPDS 31 //Cold Port Detect Status - -//COMRESET flags -//SATA Control register flags -#define AHCI_PxSCTLf_DET_INIT 1 -#define AHCI_PxSCTLF_DET_INIT (1 << AHCI_PxSCTLf_DET_INIT) -//SATA Status register flags -#define AHCI_PxSSTSF_DET_PRESENT 3 - -//SATA Error register flags -#define AHCI_PxSERR_ERR_I 0 // Recovered Data Integrity Error -#define AHCI_PxSERR_ERR_M 1 // Recovered Communication Error -#define AHCI_PxSERR_ERR_T 8 // Transient Data Integrity Error -#define AHCI_PxSERR_ERR_C 9 // Persistent Communication Error -#define AHCI_PxSERR_ERR_P 10 // SATA Protocol Error -#define AHCI_PxSERR_ERR_E 11 // Internal Error -#define AHCI_PxSERR_DIAG_I 17 // Phy Internal Error -#define AHCI_PxSERR_DIAG_C 21 // Link Layer CRC Error -#define AHCI_PxSERR_DIAG_H 22 // Handshake Error -#define AHCI_PxSERR_DIAG_S 23 // Link Sequence Error -#define AHCI_PxSERR_DIAG_T 24 // Transport State Transition Error - -class CAHCIPort -{//Port register layout - U32 cmd_list_base, - cmd_list_base_upper, - fis_base, - fis_base_upper, - interrupt_status, - interrupt_enable, - command, - reserved, - task_file_data, - signature, - sata_status, - sata_ctrl, - sata_error, - sata_active, - cmd_issue, - sata_notif, - fis_switch_ctrl, - device_sleep; - U8 reserved[40], - vendor[16]; -}; - -class CAHCIHba -{//HBA register layout - U32 caps, - ghc, //Global Host Control - interrupt_status, - ports_implemented, - version, - ccc_ctrl, //Command Completion Coalescing - ccc_ports, - em_location,//Enclosure Management - em_ctrl, - caps_ext, - bohc; - U8 reserved[116], - vendor[96]; - CAHCIPort ports[32]; -}; - -#define FISt_H2D 0x27 - -class CFisH2D -{//Host To Device - U8 type, - desc, //We are concerned with bit #7 ($LK,"AHCI_CF_DESCf_C",A="MN:AHCI_CF_DESCf_C"$) 1=command, 0=control. - command, - feature_low, - lba0, - lba1, - lba2, - device, - lba3, - lba4, - lba5, - feature_high; - U16 count; - U8 icc, - ctrl; - U32 reserved; -}; - -class CFisReceived -{ - U8 dma_fis[28], - reserved[4], - pio_fis[20], - reserved[12], - r_fis[20], - reserved[4], - devbits_fis[8], - unknown_fis[64], - reserved[96]; -}; - -class CPrdtEntry -{ - U32 data_base, - data_base_upper, - reserved, - data_byte_count; //bit 31 is "Interrupt on Completion". bits 21:0 are the actual count. -}; - -/* -Bits of first U32: - 4:0 - Command FIS Length, in U32s - 5 - ATAPI bit (A) for ATAPI command - 6 - Write bit (W) for write commands $LK,"AHCI_CH_DESCf_W",A="MN:AHCI_CH_DESCf_W"$ 1=write 0=read - 7 - Prefetchable (P) - 8 - Reset (R) - 9 - Built-in Self Test (BIST) - 10 - Clear busy upon R_OK - 11 - Reserved - 15:12 - Port Multiplier Port (PMP) - 31:16 - Physical Region Descriptor Table Length (PRDTL) -*/ -class CPortCmdHeader -{//What the CAHCIPort.cmd_list consists of. - U16 desc, - prdt_len; - U32 prd_byte_count, - cmd_table_base, - cmd_table_base_upper, - reserved[4]; -}; - -class CPortCmdTable -{ - U8 cmd_fis[64], - acmd[16], - reserved[48]; - CPrdtEntry prdt[8]; -}; - -class CAtapiReadCmd -{ - U8 command, - reserved; - U32 lba, - count; - U8 reserved, - ctrl, - zero[4]; -}; - -class CAtapiWriteCmd -{ - U8 command, - reserved; - U32 lba; - U8 reserved; - U16 count; -}; - -class CAtapiCloseCmd -{ - U8 command, - reserved, - code, - reserved; - U16 track_num; -}; - -class CAtapiModeHeader -{ - U16 data_length; - U8 reserved[4]; - U16 block_desc_len; -}; - -class CAtapiModeWritePage -{ - U8 code, //0 - length, - type, - mode, - block_type, - link_size, - reserved, - host_app_code, - session_format, - reserved; // 9 - U32 packet_size; // 10-13 - U16 audio_pause_length;// 14-15 - U8 media_catalog_num[16],//16-31 - recording_code[16],//32-47 - sub_0, - sub_1, - sub_2, - sub_3; -}; - -class CAtapiModeWriteList -{ - CAtapiModeHeader header; - CAtapiModeWritePage page; -}; - -//ATA_IDENTIFY command array indexes (array of U16s) -#define ATA_IDENT_SERIAL_NUM 10 -#define ATA_IDENT_MODEL_NUM 27 -#define ATA_IDENT_LBA48_CAPACITY 100 - -//See $LK,"::/Doc/Credits.DD"$. -#define ATA_NOP 0x00 -#define ATA_DEV_RST 0x08 -#define ATA_PACKET 0xA0 -#define ATA_READ_NATIVE_MAX 0xF8 -#define ATA_READ_NATIVE_MAX_EXT 0x27 -#define ATA_SET_MAX 0xF9 -#define ATA_SET_MAX_EXT 0x37 -#define ATA_READ_MULTI 0xC4 -#define ATA_READ_MULTI_EXT 0x29 -#define ATA_READ_DMA_EXT 0x25 -#define ATA_WRITE_MULTI 0xC5 -#define ATA_WRITE_MULTI_EXT 0x39 -#define ATA_WRITE_DMA_EXT 0x35 -#define ATA_IDENTIFY 0xEC -#define ATA_IDENTIFY_PACKET 0xA1 // IDENTIFY PACKET DEVICE, mirror of ATA_IDENTIFY for ATAPI - -#define ATAPI_FORMAT_UNIT 0x0400 -#define ATAPI_START_STOP_UNIT 0x1B00 -#define ATAPI_READ_CAPACITY 0x2500 -#define ATAPI_SEEK 0x2B00 -#define ATAPI_SYNC_CACHE 0x3500 -#define ATAPI_MODE_SELECT 0x5500 -#define ATAPI_CLOSE_TRACK_SESSION 0x5B00 -#define ATAPI_BLANK 0xA100 -#define ATAPI_READ 0xA800 -#define ATAPI_WRITE 0x2A00 -#define ATAPI_SET_CD_SPEED 0xBB00 - -#define ATAS_ERR 0x01 -#define ATAS_DRQ 0x08 -#define ATAS_DF 0x20 -#define ATAS_DRDY 0x40 -#define ATAS_BSY 0x80 - -#define ATAR0_DATA 0 -#define ATAR0_FEAT 1 -#define ATAR0_NSECT 2 -#define ATAR0_SECT 3 -#define ATAR0_LCYL 4 -#define ATAR0_HCYL 5 -#define ATAR0_SEL 6 -#define ATAR0_STAT 7 -#define ATAR0_CMD 7 -#define ATAR1_CTRL 2 - -#help_index "File/FileNames" -#define FILEMASK_JIT "*.ZC*;*.HH*" -#define FILEMASK_AOT "*.ZC*;*.HH*;*.PRJ*" -#define FILEMASK_SRC "*.ZC*;*.HH*;*.IN*;*.PRJ*" -#define FILEMASK_DD FILEMASK_SRC ";*.DD*" -#define FILEMASK_TXT FILEMASK_DD ";*.TXT*;*.CFG*" -#define FILEMASK_GR "*.GR*" - -#help_index "File/Low Level" -#define BLK_SIZE_BITS 9 -#define BLK_SIZE (1 << BLK_SIZE_BITS) -#define DVD_BLK_SIZE (4 * BLK_SIZE) -#define DVD_BOOT_LOADER_SIZE DVD_BLK_SIZE * 1 -#define INVALID_CLUS (-1) - -class CMBRPart -{ - U8 active, //0x80=active 0x00=inactive - start_head; - U16 start_cyl; - U8 type, - end_head; - U16 end_cyl; - U32 offset, //Sectors between MBR and first sector - size; //Sectors in drive -}; - -class CMasterBoot -{ - U8 code[440]; - U32 media_id; - U16 zero; - CMBRPart p[4]; - U16 signature; //AA55 -}; - -class CRedSeaBoot -{ - U8 jump_and_nop[3], - signature, reserved[4]; //MBR_PT_REDSEA=0x88. Distinguish from real FAT32 - I64 drv_offset, //For CD/DVD image copy. - sects, - root_clus, - bitmap_sects, - unique_id; - U8 code[462]; - U16 signature2; //0xAA55 -}; - -class CFAT32Boot -{ - U8 jump_and_nop[3], - oem_name[8]; - U16 bytes_per_sect; - U8 sects_per_clus; - U16 reserved_sects; - U8 copies_of_fat; - U16 max_root_dir_entries, //Not used - old_sects_in_drive; //Not used - U8 media_desc; //F64 for hard disk - U16 old_sects_per_fat, //Not used - sects_per_track, - num_heads; - U32 hidden_sects, - sects, - sects_per_fat; - U16 flags, - version; - U32 root_clus; - U16 file_system_info_sect, - backup_boot_sect; - U8 reserved[12], - log_drive_num, - unused, - ext_signature; //0x29 - U32 serial_num; - U8 vol_name[11], - fat_name[8], - code[420]; - U16 signature; -}; - -class CFAT32FileInfoSect -{ - U32 signature1; - U8 unknown[480]; - U32 signature2, - free_clus, - most_recently_alloced; - U8 reserved[12]; - U32 signature3; -}; - -class CFAT32DirEntry -{ - U8 name[11], - attr, - NTres, - CrtTimeTenth; - U16 CrtTime, - CrtDate, - ListAccDate, - clus_hi, - WrtTime, - WrtDate, - clus_lo; - U32 size; -}; - -class CFAT32DirEntryLong -{ - U8 ord; - U16 name1[5]; - U8 attr, - type, - xsum; - U16 name2[6], - zero, - name3[2]; -}; - -#define FAT32_ENTRIES_PER_BLK (BLK_SIZE / sizeof(CFAT32DirEntry)) -#define FAT32_ENTRIES_BITS Bsf(FAT32_ENTRIES_PER_BLK) - -class CPalindromeU16 -{ - U16 little, big; -}; - -class CPalindromeU32 -{ - U32 little, big; -}; - -class CISODate -{ - U8 year, mon, day, hour, min, sec, sec100; -}; - -class CISODirEntry -{ - U8 len, ext_attr_len; - CPalindromeU32 loc; - CPalindromeU32 size; - CISODate date; - U8 flags, file_unit_size, interleave; - CPalindromeU16 vol_seq_num; - U8 name_len, name; -}; - -class CISOPathEntry -{ - U8 name_len, zero; - U32 blk; - U16 parent_entry_num, - name[1]; //Aligned to U16 boundaries -}; - -//ISO9660 -#define ISOT_BOOT_RECORD 0 -#define ISOT_PRI_VOL_DESC 1 -#define ISOT_SUPPLEMENTARY_DESC 2 -#define ISOT_VOL_DRIVE_DESC 3 -#define ISOT_TERMINATOR 255 - -class CISOPriDesc -{ - U8 type, - id[5], - version, - unused1, - system_id[32], - vol_id[32], - unused2[8]; - CPalindromeU32 vol_space_size; - U8 unused3[32]; - CPalindromeU16 vol_set_size; - CPalindromeU16 vol_seq_num; - CPalindromeU16 log_block_size; - CPalindromeU32 path_table_size; - U32 type_l_path_table, - opt_type_l_path_table, - type_m_path_table, - opt_type_m_path_table; - CISODirEntry root_dir_record; - U8 vol_set_id[128], - publisher_id[128], - preparer_id[128], - pad[307], - file_structure_version, - pad[1166]; -}; - -#define ISO_BASE_YEAR 1900 -#define ISO_ATTR_DIR 2 - -//Red Sea Attributes -//See $LK,"ST_FILE_ATTRS",A="MN:ST_FILE_ATTRS"$ -#define RS_ATTR_READ_ONLY 0x01 //R -#define RS_ATTR_HIDDEN 0x02 //H -#define RS_ATTR_SYSTEM 0x04 //S -#define RS_ATTR_VOL_ID 0x08 //V -#define RS_ATTR_DIR 0x10 //D -#define RS_ATTR_ARCHIVE 0x20 //A -#define RS_ATTR_LONG_NAME (RS_ATTR_READ_ONLY | RS_ATTR_HIDDEN | RS_ATTR_SYSTEM | RS_ATTR_VOL_ID) -#define RS_ATTR_LONG_NAME_MASK (RS_ATTR_LONG_NAME | RS_ATTR_DIR | RS_ATTR_ARCHIVE) -#define RS_ATTR_DELETED 0x100 //X -#define RS_ATTR_RESIDENT 0x200 //T -#define RS_ATTR_CONTIGUOUS 0x400 //C -#define RS_ATTR_FIXED 0x800 //F - -#help_index "File/CD DVD" -//Media types for $LK,"DVDImageWrite",A="MN:DVDImageWrite"$() -#define MT_CD 1 -#define MT_DVD 2 - -#help_index "File/Low Level;File/Program Routines" -//CDirEntry flags (Used by $LK,"FileMgr",A="MN:FileMgr"$()) -#define CDIR_FILENAME_LEN 38 //Must include terminator zero -public class CDirEntry -{ - CDirEntry *next, *parent, *sub; - U8 *full_name; - I64 user_data, user_data2; - - U0 start; - U16 attr; - U8 name[CDIR_FILENAME_LEN]; - I64 clus, size; - CDate datetime; -}; -#define CDIR_SIZE (sizeof(CDirEntry) - offset(CDirEntry.start)) - -#help_index "File/Program Routines" -//File Util Flags -//See $LK,"ST_FILE_UTIL_FLAGS",A="MN:ST_FILE_UTIL_FLAGS"$ -#define FUf_RECURSE 0 // r -#define FUf_DIFF 1 // d -#define FUf_DEL 1 // d -#define FUf_IGNORE 2 // i -#define FUf_ALL 3 // a -#define FUf_CANCEL 4 // c -#define FUf_REPLACE 5 // R -#define FUf_PUBLIC 6 // p -#define FUf_MAP 7 // m -#define FUf_SINGLE 8 // s -#define FUf_JUST_DIRS 9 // D -#define FUf_JUST_FILES 10 // F -#define FUf_JUST_TXT 11 // T -#define FUf_JUST_DD 12 // $$ -#define FUf_JUST_SRC 13 // S -#define FUf_JUST_AOT 14 // A -#define FUf_JUST_JIT 15 // J -#define FUf_JUST_GR 16 // G -#define FUf_CLUS_ORDER 17 // O (Move disk head one direction) -#define FUf_SCAN_PARENTS 18 // P -#define FUf_FLATTEN_TREE 19 // f -#define FUf_WHOLE_LABELS 20 // l -#define FUf_WHOLE_LABELS_BEFORE 21 // lb -#define FUf_WHOLE_LABELS_AFTER 22 // la - -#define FUF_RECURSE (1 << FUf_RECURSE) -#define FUF_DIFF (1 << FUf_DIFF) -#define FUF_DEL (1 << FUf_DEL) -#define FUF_IGNORE (1 << FUf_IGNORE) -#define FUF_ALL (1 << FUf_ALL) -#define FUF_CANCEL (1 << FUf_CANCEL) -#define FUF_REPLACE (1 << FUf_REPLACE) -#define FUF_PUBLIC (1 << FUf_PUBLIC) -#define FUF_MAP (1 << FUf_MAP) -#define FUF_SINGLE (1 << FUf_SINGLE) -#define FUF_JUST_DIRS (1 << FUf_JUST_DIRS) -#define FUF_JUST_FILES (1 << FUf_JUST_FILES) -#define FUF_JUST_TXT (1 << FUf_JUST_TXT) -#define FUF_JUST_DD (1 << FUf_JUST_DD) -#define FUF_JUST_SRC (1 << FUf_JUST_SRC) -#define FUF_JUST_AOT (1 << FUf_JUST_AOT) -#define FUF_JUST_JIT (1 << FUf_JUST_JIT) -#define FUF_JUST_GR (1 << FUf_JUST_GR) -#define FUF_CLUS_ORDER (1 << FUf_CLUS_ORDER) -#define FUF_SCAN_PARENTS (1 << FUf_SCAN_PARENTS) -#define FUF_FLATTEN_TREE (1 << FUf_FLATTEN_TREE) -#define FUF_WHOLE_LABELS (1 << FUf_WHOLE_LABELS) -#define FUF_WHOLE_LABELS_BEFORE (1 << FUf_WHOLE_LABELS_BEFORE) -#define FUF_WHOLE_LABELS_AFTER (1 << FUf_WHOLE_LABELS_AFTER) - -#define FUG_FILES_FIND (FUF_RECURSE | FUF_SINGLE | FUF_CLUS_ORDER | FUF_JUST_DIRS | FUF_JUST_FILES | FUF_JUST_TXT | \ - FUF_JUST_DD | FUF_JUST_SRC | FUF_JUST_AOT | FUF_JUST_JIT | FUF_JUST_GR | FUF_FLATTEN_TREE) -#define FUG_FILE_FIND (FUF_JUST_DIRS | FUF_JUST_FILES | FUF_SCAN_PARENTS) - -#help_index "File/Low Level" -//See $LK,"ST_BLKDEV_TYPES",A="MN:ST_BLKDEV_TYPES"$ -#define BDT_NULL 0 -#define BDT_RAM 1 -#define BDT_ATA 2 -#define BDT_ISO_FILE_READ 3 -#define BDT_ISO_FILE_WRITE 4 -#define BDT_ATAPI 5 -#define BDT_TYPES_NUM 6 - -#define BDf_REMOVABLE 0 -#define BDf_INITIALIZED 1 -#define BDf_READ_ONLY 2 -#define BDf_READ_ONLY_OVERRIDE 3 -#define BDf_LAST_WAS_WRITE 4 -#define BDf_READ_CACHE 5 -#define BDf_FORMAT 6 -#define BDf_INIT_IN_PROGRESS 7 -#define BDf_EXT_SIZE 8 -#define BDf_INTERNAL_BUF 9 - -#define BDF_REMOVABLE (1 << BDf_REMOVABLE) -#define BDF_INITIALIZED (1 << BDf_INITIALIZED) -#define BDF_READ_ONLY (1 << BDf_READ_ONLY) -#define BDF_READ_ONLY_OVERRIDE (1 << BDf_READ_ONLY_OVERRIDE) -#define BDF_LAST_WAS_WRITE (1 << BDf_LAST_WAS_WRITE) -#define BDF_READ_CACHE (1 << BDf_READ_CACHE) -#define BDF_FORMAT (1 << BDf_FORMAT) -#define BDF_INIT_IN_PROGRESS (1 << BDf_INIT_IN_PROGRESS) -#define BDF_EXT_SIZE (1 << BDf_EXT_SIZE) -#define BDF_INTERNAL_BUF (1 << BDf_INTERNAL_BUF) - -//locked flags -#define BDlf_LOCKED 0 - -#define BLKDEVS_NUM 26 -#define BD_SIGNATURE_VAL 'BDSV' - -public class CBlkDev -{ - CBlkDev *lock_fwding; //If two blkdevs on same controller, use just one lock - CTask *owning_task; - CAHCIPort *ahci_port; - U8 *prd_buf, - first_drive_let, - *RAM_disk, - *file_disk_name; - CFile *file_disk; - U32 bd_signature, - type, - flags, - blk_size, - max_reads, - max_writes; - I64 drv_offset, - init_root_dir_blks, - max_blk, - locked_flags, - port_num; - U16 *dev_id_record; - F64 last_time; -}; - -//Drive locked_flags -#define DVlf_LOCKED 0 - -//See $LK,"ST_DRIVE_TYPES",A="MN:ST_DRIVE_TYPES"$ -#define FSt_NULL 0 -#define FSt_REDSEA 1 //Supported -#define FSt_FAT32 2 //Supported except for short names, to some degree -#define FSt_ISO9660 3 //Supported (CD/DVD) -#define FSt_NTFS 4 //Not Supported -#define FSt_LINUX 5 //Not Supported -#define FSt_SWAP 6 //Not Supported -#define FSt_UNKNOWN 7 -#define FSt_TYPES_NUM 8 -#define FSG_TYPE_MASK 0x7FFF -//File system type flags -#define FStf_DISABLE 15 - -#define MBR_PT_FAT32a 0x0B -#define MBR_PT_FAT32b 0x0C -#define MBR_PT_FAT32c 0x1B -#define MBR_PT_FAT32d 0x1C -#define MBR_PT_FAT32e 0x8B -#define MBR_PT_FAT32f 0x8C -#define MBR_PT_NTFS 0x07 -#define MBR_PT_REDSEA 0x88 -#define MBR_PT_LINUX 0x83 -#define MBR_PT_SWAP 0x82 - -class CFreeList -{ - CFreeList *next, *last; - I64 start, size; -}; - -#define DRIVES_NUM 26 - -#define DRIVE_SIGNATURE_VAL 'DVSV' -public class CDrive -{ -//Don't access ->drv_let directly in case a drive has been remapped. - //Use $LK,"Drive2Letter",A="MN:Drive2Letter"$(). - I64 locked_flags; - U32 drive_signature; - U8 drv_let, pad; - U16 fs_type; - I64 drv_offset, - size, - prt_num, - file_system_info_sect, - fat1, fat2, - root_clus, - data_area, - spc; //sectors per cluster - CDate fat32_local_time_offset; - CTask *owning_task; - CBlkDev *bd; - - CFAT32FileInfoSect *fis; - I64 fat_blk_dirty, - cur_fat_blk_num; - U32 *cur_fat_blk; - CFreeList *next_free, *last_free; -}; - -#define DISK_CACHE_HASH_SIZE 0x2000 - -class CCacheBlk -{ - CCacheBlk *next_lru, *last_lru; - CCacheBlk *next_hash, *last_hash; - CDrive *drive; - I64 blk; - U8 body[BLK_SIZE]; -}; - -#help_index "File/System" -#define DEFAULT_ISO_FILENAME "::/Tmp/CDDVD.ISO" -#define DEFAULT_ISO_C_FILENAME "::/Tmp/CDDVD.ISO.C" - -public class CBlkDevGlobals -{ - CBlkDev *blkdevs; - CDrive *drvs, - *let_to_drive[32]; - CAHCIHba *ahci_hba; - U8 *default_iso_filename, //$TX,"\"::/Tmp/CDDVD.ISO\"",D="DEFAULT_ISO_FILENAME"$ - *default_iso_c_filename, //$TX,"\"::/Tmp/CDDVD.ISO.C\"",D="DEFAULT_ISO_C_FILENAME"$ - *tmp_filename, - *home_dir, - boot_drive_let, - first_hd_drive_let, - first_dvd_drive_let; - CCacheBlk *cache_base, - *cache_ctrl, - **cache_hash_table; - I64 cache_size, - read_count, - write_count, - mount_ide_auto_count, - cmd_slot_count, - ins_port;// Installed-from CD/DVD controller. - Bool dvd_boot_is_good, - ahci64; -}; - -#help_index "File/Internal" -public class CDirContext -{ - CDrive *old_dv, *drive; - U8 *old_dir, *mask; -}; - -#help_index "File/CFile" -#define FFB_NEXT_BLK I64_MAX - -#define FF_WRITE 1 -#define FF_NEW_FILE 2 -#define FF_BUF_DIRTY 4 -#define FF_NEEDS_WRITE 8 -#define FF_CONTIGUOUS 16 -#define FF_USE_OLD_DATETIME 32 - -public class CFile //See $LK,"::/Demo/Disk/DataBase.ZC"$. -{ - I64 flags; - CDirEntry de; - CDrive *drive; - I64 fblk_num, clus, file_clus_num, max_blk; - U8 *clus_buf; -}; - -#help_index "Memory/Heap" -#define _CONFIG_HEAP_DEBUG FALSE - -#if _CONFIG_HEAP_DEBUG -class CMemUnused -{ - CHeapCtrl *hc; - U8 *caller1, *caller2; - CMemUnused *next; - I64 size; -}; -class CMemUsed -{ - CHeapCtrl *hc; - U8 *caller1, *caller2; - CMemUsed *next, *last; - I64 size; - U0 start; -}; -#else -class CMemUnused -{ - U0 hc; - U0 caller1, caller2; - CMemUnused *next; - I64 size; -}; -class CMemUsed -{ - CHeapCtrl *hc; - U0 caller1, caller2; - U0 next, last; - I64 size; - U0 start; -}; -#endif - -#help_index "Memory/BlkPool" -#help_file "::/Doc/Pags" - -#define MBS_USED_SIGNATURE_VAL 'MBUs' -#define MBS_UNUSED_SIGNATURE_VAL 'MBUn' -class CMemBlk -{ - CMemBlk *next, *last; - U32 mb_signature, pags; -}; - -#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 MEM_PAG_BITS 9 -#define MEM_PAG_SIZE (1 << MEM_PAG_BITS) -#define MEM_HEAP_HASH_SIZE 1024 -#define MEM_FREE_PAG_HASH_SIZE 0x100 -//It is common to $LK,"MAlloc",A="MN:MAlloc"$() exact powers of two. There is some overhead. -//We add 1 pag, so a request is not rounded-up to next power of two. -#define MEM_EXTRA_HASH2_PAGS 1 - -#define MEM_SYSTEM_STACK (MEM_PAG_SIZE * 512) //Like 16384*MEM_PAG_SIZE -#define MEM_EXECUTIVE_STACK (MEM_PAG_SIZE * 512) -#define MEM_INTERRUPT_STACK (MEM_PAG_SIZE * 512) -#define MEM_DEFAULT_STACK (MEM_PAG_SIZE * 512) - -#define TASK_HASH_TABLE_SIZE (1 << 10) - -//locked flags -#define BPlf_LOCKED 0 -public class CBlkPool -{ - I64 locked_flags, alloced_u8s, used_u8s; - CMemBlk *mem_free_list, - *mem_free_2meg_list, //This is for Sup1CodeScraps/Mem/Mem2Meg.ZC. - *free_pag_hash[MEM_FREE_PAG_HASH_SIZE], - *free_pag_hash2[64 - MEM_PAG_BITS]; -}; - -#help_index "Memory/HeapCtrl" -//locked flags -#define HClf_LOCKED 0 - -#define HEAP_CTRL_SIGNATURE_VAL 'HcSV' -public class CHeapCtrl -{ - CBlkPool *bp; - U32 hc_signature, pad; - I64 locked_flags, alloced_u8s, used_u8s; - CTask *mem_task; - CMemBlk *next_mem_blk, *last_mem_blk; - CMemBlk *last_mergable; - CMemUnused *malloc_free_list; - CMemUsed *next_um, *last_um; - CMemUnused *heap_hash[MEM_HEAP_HASH_SIZE / sizeof(U8 *)]; -}; - -#help_index "Devices;Memory/Page Tables" -public class CDevGlobals -{ - CIDTEntry *idt; - U8 *mem64_ptr; - U8 *uncached_alias; //Alias of lowest 4Gig. - U8 mp_apic_ids[MP_PROCESSORS_NUM]; - CMemRange mem32_head; - CPCIDev pci_head; - U64 user_int_bitmap; -}; - -#help_index "Graphics/Color;Graphics/Device Contexts" -//Raster operations -#define ROPB_EQU 0x00 -#define ROPB_XOR 0x01 -#define ROPB_COLLISION 0x02 -#define ROPB_MONO 0x03 -#define ROPBF_HALF_RANGE_COLOR 0x10 -#define ROPBF_TWO_SIDED 0x20 -#define ROPBF_DITHER 0x40 -#define ROPBF_PROBABILITY_DITHER 0x80 - -#define ROP_EQU (ROPB_EQU << 8) -#define ROP_XOR (ROPB_XOR << 8) -#define ROP_COLLISION (ROPB_COLLISION << 8) -#define ROP_MONO (ROPB_MONO << 8) - -//These are just for $LK,"ROPF_PROBABILITY_DITHER",A="MN:ROPF_PROBABILITY_DITHER"$ -//See $LK,"DCLighting",A="MN:DCLighting"$(). -#define ROPF_HALF_RANGE_COLOR 0x1000 -#define ROPF_TWO_SIDED 0x2000 - -//These always go in the c1.rop of a CColorROPU32 -#define ROPF_DITHER 0x40000000 -#define ROPF_PROBABILITY_DITHER 0x80000000 - -#help_index "Graphics/Color" -#define TRANSPARENT 0xFF -#define BLACK 0 -#define BLUE 1 -#define GREEN 2 -#define CYAN 3 -#define RED 4 -#define PURPLE 5 -#define BROWN 6 -#define LTGRAY 7 -#define DKGRAY 8 -#define LTBLUE 9 -#define LTGREEN 10 -#define LTCYAN 11 -#define LTRED 12 -#define LTPURPLE 13 -#define YELLOW 14 -#define WHITE 15 - -#define COLORS_NUM 16 -#define COLOR_INVALID 16 -#define COLOR_MONO 0xFF - -public U16 class CColorROPU16 //Don't use this, use CColorROPU32 -{ - U8 color, rop; -}; -public U32 class CColorROPU32 -{ - CColorROPU16 c0, c1; -}; -#define COLORROP_COLORS_MASK 0x00FF00FF -#define COLORROP_NO_ROP0_MASK 0xFFFF00FF -#define COLORROP_BITS 16 -public U32 class CBGR24 -{ - U8 b, g, r, pad; -}; -public U32 class CBGR32 -{ - U8 b, g, r, a; -}; -public I64 class CBGR48 -{ - U16 b, g, r, pad; -}; - -#help_index "Keyboard Devices;Char/Input;StdIn" -#define KBD_PORT 0x60 -#define KBD_CTRL 0x64 - -#define KBDC_LED 0xED -#define KBDC_DISABLE_MS 0xA7 -#define KBDC_ENABLE_MS 0xA8 -#define KBDC_ENABLE_KBD 0xAE -#define KBDC_TYPEMATIC 0xF3 -#define KBDC_SCAN_CODES 0xF0 - -public class CKbdStateGlobals -{ - I64 scan_code, //See $LK,"scan codes",A="FI:::/Doc/CharOverview.DD"$ - last_down_scan_code, - count, //Count of keys pressed since boot. - timestamp, //Output: TSCGet when event. - new_key_timestamp; //Output: TSCGet when new key event. - CFifoU8 *fifo, *fifo2; //Private - CFifoI64 *scan_code_fifo; - U32 down_bitmap[8], //BitTest, $LK,"Bt",A="MN:Bt"$(), with a merged scan code. (Left and right shift merged, for example.) - down_bitmap2[8]; //BitTest, $LK,"Bt",A="MN:Bt"$(), with an unmerged scan code. - Bool reset, //Private: Reset KbdMouse - irqs_working; //Private -}; - -#help_index "Mouse" -public class CMouseHardStateGlobals -{ - CD3I64 pos, //Position in pixels - prescale, - raw_data; - CD3 scale; - F64 speed; //Output: How fast the user is moving it. - I64 timestamp, //Output: TSCGet when event. - install_attempts, //Private - pkt_size; //Private - CFifoU8 *fifo, *fifo2; //Private - Bool bttns[5], - raw_bttns[5], - raw_mode, - has_wheel, - has_ext_bttns, - enabled, - event, //Private - installed, //Private - install_in_progress, //Private - irqs_working; //Private -}; - -public class CMouseStateGlobals -{ - CD3I64 pos, //Position in pixels - pos_text, //Position in text rows,cols - presnap, - offset; - CD3 scale; - F64 speed; //Output: How fast the user is moving it. - I64 timestamp; //Output: TSCGet when event. - F64 dbl_time, //Input: Time threshold for calling it a double click. - left_dbl_time, //Private - right_dbl_time; //Private - Bool lb, //Left Button - rb, //Right Button - show, - has_wheel, - left_dbl, //Private - left_down_sent, //Private - right_dbl, //Private - right_down_sent; //Private -}; - -public class CGridGlobals -{ - Bool snap format "$$CB,\"Snap Grid\"$$\n", - show format "$$CB,\"Show Grid\"$$\n", - coord format "$$CB,\"Show Coordinates\"$$\n"; - U8 pad[5]; - F64 x format "$$DA-TRM,A=\"X Spacing:%6.3f\"$$\n", - y format "$$DA-TRM,A=\"Y Spacing:%6.3f\"$$\n", - z format "$$DA-TRM,A=\"Z Spacing:%6.3f\"$$\n", - x_offset format "$$DA-TRM,A=\"X Offset :%6.3f\"$$\n", - y_offset format "$$DA-TRM,A=\"Y Offset :%6.3f\"$$\n", - z_offset format "$$DA-TRM,A=\"Z Offset :%6.3f\"$$\n", - x_speed format "$$DA-TRM,A=\"X Speed :%6.3f\"$$\n", - y_speed format "$$DA-TRM,A=\"Y Speed :%6.3f\"$$\n", - z_speed format "$$DA-TRM,A=\"Z Speed :%6.3f\"$$\n"; -}; - -#help_index "Ctrls" -#define CTRLT_GENERIC 0 -#define CTRLT_WIN_HSCROLL 1 //unique -#define CTRLT_WIN_VSCROLL 2 //unique -#define CTRLT_VIEWING_ANGLES 3 //unique - -#define CTRLF_SHOW 1 -#define CTRLF_BORDER 2 -#define CTRLF_CAPTURE_LEFT_MS 4 -#define CTRLF_CAPTURE_RIGHT_MS 8 -#define CTRLF_CLICKED 16 - -#define WSSf_SET_TO_POS 0 - -public class CWinScroll -{ - I64 min, pos, max; - U32 flags; - U8 color, pad[3]; -}; - -public class CViewAngles -{ - I64 sx, sy, sz; - F64 ax, ay, az; - CColorROPU32 cx, cy, cz, cbd, cbg, config; -}; - -public class CCtrl -{ - CCtrl *next, *last; - CTask *win_task; - I64 type, flags; - - //win pix coordinates - I64 left, right, top, bottom; - - //screen pix coordinates (derived) - I64 screen_left, screen_right, screen_top, screen_bottom; - - U8 *state; - - //called on resize - U0 (*update_derived_vals)(CCtrl *c); - U0 (*draw_it)(CDC *dc, CCtrl *c); - - Bool (*inside_ctrl)(CCtrl *c, I64 x, I64 y); //For nonbox shapes - U0 (*left_click)( CCtrl *c, I64 x, I64 y, Bool down); - U0 (*right_click)(CCtrl *c, I64 x, I64 y, Bool down); - U0 (*wheel_chg)( CCtrl *c, I64 delta); -}; - -#help_index "Menus" -public class CMenuEntry -{ - CMenuEntry *next; - CMenuEntry *sub; - U8 name[32]; - I64 message_code, arg1, arg2; - Bool checked, dir, pad[6]; -}; - -public class CMenu -{ - CMenu *next; - CMenuEntry *sub; - CTask *task; - I64 flags; - U8 attr, pad[7]; -}; - -#help_index "Task" -class CBpt -{ - CBpt *next; - U8 *addr, - val, pad[7]; -}; - -class CExcept -{ - CExcept *next, *last; - I64 handler_catch, handler_untry, - rsp, rbp, rflags, rsi, rdi, r10, r11, r12, r13, r14, r15; -}; - -class CFPU -{ - U8 body[512]; -}; - -#help_index "Job/Exe;Task/Job/Exe" -#define JOBf_WAKE_MASTER 0 -#define JOBf_FOCUS_MASTER 1 -#define JOBf_EXIT_ON_COMPLETE 2 -#define JOBf_DONT_FILTER 3 -#define JOBf_HIGHEST_PRIORITY 4 -//MP flags -#define JOBf_DONE 5 -#define JOBf_DISPATCHED 6 -#define JOBf_FREE_ON_COMPLETE 7 -#define JOBf_ADD_TO_QUE 8 - -#define JOBT_TEXT_INPUT 0 //$LK,"TaskText",A="MN:TaskText"$() Feed StdIn -#define JOBT_MESSAGE 1 //$LK,"TaskMessage",A="MN:TaskMessage"$() Post message -#define JOBT_EXE_STR 2 //$LK,"TaskExe",A="MN:TaskExe"$() Compile & execute src code text -//MP cmds -#define JOBT_CALL 3 //$LK,"JobQueue",A="MN:JobQueue"$() Tell MP to call function -#define JOBT_SPAWN_TASK 4 //$LK,"Spawn",A="MN:Spawn"$() Tell MP to spawn task - -class CJob -{ - CJob *next, *last; - CJobCtrl *ctrl; - I64 job_code, flags, message_code; - - I64 (*addr)(U8 *fun_arg); - U8 *fun_arg; - - U8 *aux_str; - I64 aux1, aux2, //Sometimes called arg1 and arg2. (Windows message param1 param2) - res; - - CTask *spawned_task, - *master_task; -}; - -#define JOBCf_LOCKED 0 -class CJobCtrl -{ - CJob *next_waiting, *last_waiting; - CJob *next_done, *last_done; - I64 flags; -}; - -#help_index "Messages" -//See $LK,"::/Demo/MessageLoop.ZC"$ -#define MESSAGE_NULL 0 -#define MESSAGE_CMD 1 -#define MESSAGE_KEY_DOWN 2 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press -#define MESSAGE_KEY_UP 3 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press -#define MESSAGE_MS_MOVE 4 //(x,y) -#define MESSAGE_MS_L_DOWN 5 //(x,y) -#define MESSAGE_MS_L_UP 6 //(x,y) -#define MESSAGE_MS_L_D_DOWN 7 //(x,y) -#define MESSAGE_MS_L_D_UP 8 //(x,y) -#define MESSAGE_MS_R_DOWN 9 //(x,y) -#define MESSAGE_MS_R_UP 10 //(x,y) -#define MESSAGE_MS_R_D_DOWN 11 //(x,y) -#define MESSAGE_MS_R_D_UP 12 //(x,y) - -//Fake messages used to send both an up and down. -#define MESSAGE_KEY_DOWN_UP -2 //Down & UP -#define MESSAGE_MS_L_DOWN_UP -5 //Down & Up -#define MESSAGE_MS_L_D_DOWN_UP -7 //Down & Up -#define MESSAGE_MS_R_DOWN_UP -9 //Down & Up -#define MESSAGE_MS_R_D_DOWN_UP -11 //Down & Up - -#help_index "Task/Settings" -#define TSF_SAME_SONG 1 -public class CTaskSettings -{ - CTaskSettings *next; - U8 *cur_dir; - I64 left, right, top, bottom; - U0 (*draw_it)(CTask *task, CDC *dc); - U0 (*task_end_cb)(); - CTask *song_task, *animate_task; - I64 scroll_x, scroll_y, scroll_z; - CBGR24 palette[COLORS_NUM]; - U32 win_inhibit; - U8 text_attr, title_src, - border_attr, border_src, - task_title[STR_LEN]; - Bool border, hide_cursor, highlight_cursor, scroll, autocomplete, pad[3]; -#assert !($$ & 7) -}; - -#help_index "Task" -//CTask.border_src -#define BDS_CONST 0 -#define BDS_CUR_DRIVE 1 -#define BDS_ED_FILENAME_DRIVE 2 - -//CTask.title_src -#define TTS_CONST 0 -#define TTS_LOCKED_CONST 1 //This is not strictly enforced -#define TTS_TASK_NAME 2 -#define TTS_ED_FILENAME 3 -#define TTS_CUR_LEX 4 - -//CTask.task_flags -//See $LK,"ST_TASK_FLAGS",A="MN:ST_TASK_FLAGS"$ -#define TASKf_TASK_LOCK 0 -#define TASKf_KILL_TASK 1 -#define TASKf_SUSPENDED 2 -#define TASKf_IDLE 3 -#define TASKf_CMD_LINE_PROMPT 4 -#define TASKf_INPUT_FILTER_TASK 5 -#define TASKf_FILTER_INPUT 6 -#define TASKf_HAS_SONG 7 -#define TASKf_DISABLE_BPTS 8 -#define TASKf_AWAITING_MESSAGE 9 -#define TASKf_BREAK_LOCKED 10 -#define TASKf_PENDING_BREAK 11 -#define TASKf_BREAK_TO_SHIFT_ESC 12 -#define TASKf_KILL_AFTER_DEBUG 13 -#define TASKf_NONTIMER_RAND 14 -#define TASKf_FLAGS_NUM 15 - -//CTask.display_flags -#define DISPLAYf_SHOW 0 -#define DISPLAYf_NOT_RAW 1 -#define DISPLAYf_SILENT 2 -#define DISPLAYf_NO_BORDER 3 -#define DISPLAYf_WIN_ON_TOP 4 -#define DISPLAYf_CHILDREN_NOT_ON_TOP 5 -#define DISPLAYf_FLAGS_NUM 6 - -#define TASK_SIGNATURE_VAL 'TskS' -#define TASK_NAME_LEN 32 -#define TASK_EXCEPT_CALLERS 8 -class CTaskStack -{ - CTaskStack *next_stack; - I64 stack_size, stack_ptr; - U0 stack_base; -}; - -#define DYING_JIFFIES ToI64(JIFFY_FREQ / 5) -class CTaskDying -{ - CTask *next, *last; - I64 wake_jiffy; -}; - -public class CTask //The Fs segment register points to current CTask. -{ - CTask *addr; //Self-addressed pointer - U32 task_signature, win_inhibit; -#assert $$ == offset(CTaskDying.wake_jiffy) - I64 wake_jiffy; - U32 task_flags, display_flags; - - CHeapCtrl *code_heap, *data_heap; - - CDoc *put_doc, *display_doc, //When double buffering, these two differ. - *border_doc; - I64 win_left, win_right, win_top, win_bottom; - - CDrive *cur_dv; - U8 *cur_dir; - - CTask *parent_task, - *next_task, *last_task, - *next_input_filter_task, *last_input_filter_task, - *next_sibling_task, *last_sibling_task, - *next_child_task, *last_child_task; - - //These are derived from left,top,right,bottom - I64 win_width, win_height, - pix_left, pix_right, pix_width, //These are in pixs, not characters - pix_top, pix_bottom, pix_height, - scroll_x, scroll_y, scroll_z; - - //These must be in this order - //for $LK,"TASK_CONTEXT_SAVE",A="FF:::/Kernel/Sched.ZC,TASK_CONTEXT_SAVE"$ and $LK,"_TASK_CONTEXT_RESTORE",A="FF:::/Kernel/Sched.ZC,_TASK_CONTEXT_RESTORE"$ - I64 rip, rflags, rsp, rsi, rax, rcx, rdx, rbx, rbp, rdi, r8, r9, r10, r11, r12, r13, r14, r15; - CCPU *gs; - CFPU *fpu_mmx; - I64 swap_counter; - - U0 (*draw_it)(CTask *task, CDC *dc); - - U8 task_title[STR_LEN], - task_name[TASK_NAME_LEN], - wallpaper_data[4096], - - title_src, border_src, - text_attr, border_attr; - U16 win_z_num, pad; - - CTaskStack *stack; - - CExcept *next_except, *last_except; - I64 except_rbp, //throw routine's RBP - except_ch; //throw(ch) - U8 *except_callers[TASK_EXCEPT_CALLERS]; - - Bool catch_except; - Bool new_answer; - U8 answer_type, pad[5]; - I64 answer; - F64 answer_time; - CBpt *bpt_list; - CCtrl *next_ctrl, *last_ctrl; - CMenu *cur_menu; - CTaskSettings *next_settings; - CMathODE *next_ode, *last_ode; - F64 last_ode_time; - CHashTable *hash_table; - - CJobCtrl server_ctrl; - CCompCtrl *next_cc, *last_cc; - CHashFun *last_fun; - - U0 (*task_end_cb)(); - CTask *song_task, *animate_task; - I64 rand_seed, - task_num, - fault_num, fault_err_code; - CTask *popup_task, - *debug_task; - CWinScroll horz_scroll, vert_scroll; - - I64 user_data; -#assert !($$ & 7) -}; - -class CTSS -{ - U32 res1; - I64 rsp0, rsp1, rsp2, res2, - ist1, ist2, ist3, ist4, ist5, ist6, ist7, res3; - U16 res4, io_map_offset; - U8 io_map[0x10000/8]; - I64 *st0, *st1, *st2; - U16 tr, tr_ring3; -}; - -#define ans (Fs->answer) -#define ansf (Fs->answer(F64)) - -#define _RAX Fs->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 - -#help_index "MultiCore" -#define CPUf_RAN_A_TASK 0 -#define CPUf_DYING_TASK_QUE 1 - -public class CCPU //The Gs segment register points to current CCPU. -{ - CCPU *addr; //Self-addressed pointer - I64 num, cpu_flags, - startup_rip, - idle_pt_hits; - F64 idle_factor; - I64 total_jiffies; - CTask *executive_task, *idle_task; - I64 tr, //task reg - swap_counter; - U0 (*profiler_timer_irq)(CTask *task); - CTaskDying *next_dying, *last_dying; - I64 kill_jiffy; - CTSS *tss; - I64 start_stack[16]; -#assert !($$ & 7) -}; - -#help_index "Memory/Page Tables" -#define MEM_MIN_MEG 256 //256 Meg minimum. - -#define SYS_FIXED_AREA 0x100000 -#define SYS_16MEG_AREA_LIMIT 0x1000000 -public class CSysFixedArea -{ - CFPU init_fpu_mmx; - CCPU boot_cpu; - CTask system; - CBlkPool sys_code_bp; - CHeapCtrl system_hc; - $$ = ($$ + 0x1000 - 1) & -0x1000; -}; - -#help_index "Char" -#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_ESC 0x1B -#define CH_SHIFT_ESC 0x1C -#define CH_SPACE 0x20 - -#define ST_ERR_ST "$$RED$$$$BK,1$$ERROR:$$FG$$$$BK,0$$ " -#define ST_WARN_ST "$$LTRED$$$$BK,1$$WARNING:$$FG$$$$BK,0$$ " - -//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_MS_L_DOWN 16 -#define SCf_MS_R_DOWN 17 -#define SCf_DELETE 18 -#define SCf_INS 19 -#define SCf_NO_SHIFT 30 -#define SCf_KEY_DESC 31 -#define SCF_E0_PREFIX (1 << SCf_E0_PREFIX) -#define SCF_KEY_UP (1 << SCf_KEY_UP) -#define SCF_SHIFT (1 << SCf_SHIFT) -#define SCF_CTRL (1 << SCf_CTRL) -#define SCF_ALT (1 << SCf_ALT) -#define SCF_CAPS (1 << SCf_CAPS) -#define SCF_NUM (1 << SCf_NUM) -#define SCF_SCROLL (1 << SCf_SCROLL) -#define SCF_NEW_KEY (1 << SCf_NEW_KEY) -#define SCF_MS_L_DOWN (1 << SCf_MS_L_DOWN) -#define SCF_MS_R_DOWN (1 << SCf_MS_R_DOWN) -#define SCF_DELETE (1 << SCf_DELETE) -#define SCF_INS (1 << SCf_INS) -#define SCF_NO_SHIFT (1 << SCf_NO_SHIFT) -#define SCF_KEY_DESC (1 << SCf_KEY_DESC) - -//ZealOS places a 1 in bit 7 for -//keys with an E0 prefix. -//See $LK,"::/Doc/CharOverview.DD"$ and $LK,"KbdHandler",A="MN:KbdHandler"$(). -#define SC_ESC 0x01 -#define SC_BACKSPACE 0x0E -#define SC_TAB 0x0F -#define SC_ENTER 0x1C -#define SC_SHIFT 0x2A -#define SC_CTRL 0x1D -#define SC_ALT 0x38 -#define SC_CAPS 0x3A -#define SC_NUM 0x45 -#define SC_SCROLL 0x46 -#define SC_CURSOR_UP 0x48 -#define SC_CURSOR_DOWN 0x50 -#define SC_CURSOR_LEFT 0x4B -#define SC_CURSOR_RIGHT 0x4D -#define SC_PAGE_UP 0x49 -#define SC_PAGE_DOWN 0x51 -#define SC_HOME 0x47 -#define SC_END 0x4F -#define SC_INS 0x52 -#define SC_DELETE 0x53 -#define SC_F1 0x3B -#define SC_F2 0x3C -#define SC_F3 0x3D -#define SC_F4 0x3E -#define SC_F5 0x3F -#define SC_F6 0x40 -#define SC_F7 0x41 -#define SC_F8 0x42 -#define SC_F9 0x43 -#define SC_F10 0x44 -#define SC_F11 0x57 -#define SC_F12 0x58 -#define SC_PAUSE 0x61 -#define SC_GUI 0xDB -#define SC_PRINTSCREEN1 0xAA -#define SC_PRINTSCREEN2 0xB7 - -#help_index "Char;Debugging/Raw Output;TextBase Layer/Char" -//text.raw_flags -#define RAWF_IN_DOLLAR 1 -#define RAWF_LAST_DOLLAR 2 -#define RAWF_SHOW_DOLLAR 4 -#define RAWF_SCROLL 8 - -public class CTextGlobals -{ - I64 raw_col, raw_flags; - U32 *raw_screen, *fb_alias; - I64 rows, cols; //Use TEXT_ROWS,TEXT_COLS - U64 *font, *aux_font, screen_size, buffer_size; - U8 border_chars[16]; - Bool is_fb_busy; -}; - -#define FONT_WIDTH 8 -#define FONT_HEIGHT 8 - -#help_index "Graphics" -//z-values less than zero are in front of screen and not drawn. -//we want to shift all Z-values into a drawable range. -//GR_Z_ALL is set to half of the Z-range which is an I32. -#define GR_Z_ALL (I32_MAX/2) - -#help_index "Graphics/Device Contexts" -//Low 8 bits reserved for flags that go into saved bitmaps -#define DCF_PALETTE 1 -#define DCF_NO_TRANSPARENTS 2 //Can be used to optimized $LK,"GrBlot",A="MN:GrBlot"$(). - -#define DCF_TRANSFORMATION 0x100 - -//See $LK,"DCSymmetrySet",A="MN:DCSymmetrySet"$() or $LK,"DCSymmetry3Set",A="MN:DCSymmetry3Set"$() -#define DCF_SYMMETRY 0x200 - -//Must be used with DCF_SYMMETRY set also. -//See $LK,"::/Demo/Games/BigGuns.ZC"$ -#define DCF_JUST_MIRROR 0x400 - -#define DCF_LOCATE_NEAREST 0x800 -#define DCF_DONT_DRAW 0x1000 -#define DCF_ALIAS 0x2000 -#define DCF_SCREEN_BITMAP 0x4000 -#define DCF_FILL_NOT_COLOR 0x8000 -#define DCF_RECORD_EXTENTS 0x10000 -#define DCF_ON_TOP 0x20000 - -//$LK,"DCSave",A="MN:DCSave"$() flags. -#define DCSF_PALETTE_GET 1 - -#define DCS_SIGNATURE_VAL 'DvCS' - -class CGrSym -{ - I32 sx, sy, sz, pad; -//Normal of symmetry plane - I64 snx, sny, snz; -}; - -public class CDC -{ - U0 start; - CDate cdt; - I32 x0, y0, - width, width_internal, - height, - flags; - U0 end; - CBGR24 palette[COLORS_NUM]; - - //public (Change directly) - CColorROPU32 color, - bkcolor, //Set for use with $LK,"ROP_COLLISION",A="MN:ROP_COLLISION"$ - color2; //Internally used for $LK,"GrFloodFill",A="MN:GrFloodFill"$() - CD3I32 ls; //Light source (should be normalized to 65536). - - //dither_probability_u16 is basically a U16. - //It is activated by $LK,"ROPF_PROBABILITY_DITHER",A="MN:ROPF_PROBABILITY_DITHER"$. - //0x0000 =100% color.c0 - //0x8000 =50% color.c0 50% color.c1 - //0x10000=100% color.c1 - //See $LK,"::/Demo/Graphics/SunMoon.ZC"$ and $LK,"::/Demo/Graphics/Shading.ZC"$. - U64 dither_probability_u16; - - CDC *brush; - - //Set with $LK,"DCMat4x4Set",A="MN:DCMat4x4Set"$(). $LK,"Free",A="MN:Free"$() before setting. - I64 *r, //rotation matrix of quads decimal in lo - r_norm; //shifted 32 bits. Used for scaling thick - - //public (Change directly) - I32 x, y, z, - thick; - - //Can be changed from the default $LK,"DCTransform",A="MN:DCTransform"$() - U0 (*transform)(CDC *dc, I64 *x, I64 *y, I64 *z); - - //Can be changed from the default $LK,"DCLighting",A="MN:DCLighting"$() - U0 (*lighting)(CDC *dc, CD3I32 *p1, CD3I32 *p2, CD3I32 *p3, CColorROPU32 color); - - //Set by $LK,"DCSymmetrySet",A="MN:DCSymmetrySet"$() or $LK,"DCSymmetry3Set",A="MN:DCSymmetry3Set"$() - CGrSym sym; - - I32 cur_x, cur_y, cur_z, pad; - I64 collision_count; - - I64 nearest_dist, - min_x, max_x, min_y, max_y; //Set by $LK,"DCF_RECORD_EXTENTS",A="MN:DCF_RECORD_EXTENTS"$ (screen coordinates) - - U32 dc_signature, pad; - CTask *mem_task, *win_task; - CDC *alias; - U8 *body; - - //Set by $LK,"DCDepthBufAlloc",A="MN:DCDepthBufAlloc"$() - I32 *depth_buf; - I64 db_z; //private -#assert !($$ & 7) -}; - -#define "Char/Input;StdIn" -//StrGet flags -#define SGF_SHIFT_ESC_EXIT 1 //This kills task on -#define SGF_WITH_NEW_LINE 2 - -#define "Char/Operations" -//Flags for StrUtil and MStrUtil -#define SUF_REM_CTRL_CHARS 0x001 -#define SUF_REM_LEADING 0x002 -#define SUF_REM_TRAILING 0x004 -#define SUF_REM_SPACES 0x008 -#define SUF_SINGLE_SPACE 0x010 -#define SUF_TO_UPPER 0x020 -#define SUF_TO_LOWER 0x040 -#define SUF_S2T 0x080 -#define SUF_T2S 0x100 // Only works with MStrUtil -#define SUF_SCALE_INDENT 0x200 -#define SUF_SAFE_DOLLAR 0x400 - -//Flags for StrFind -#define SFF_IGNORE_CASE 1 -#define SFF_WHOLE_LABELS_BEFORE 2 -#define SFF_WHOLE_LABELS_AFTER 4 -#define SFG_WHOLE_LABELS (SFF_WHOLE_LABELS_BEFORE | SFF_WHOLE_LABELS_AFTER) - -//Flags for ListMatch -#define LMF_IGNORE_CASE 1 -#define LMF_EXACT 2 - -#help_index "Keyboard Devices/System" -#define KDF_HAS_DESCS 1 -class CKeyDevEntry -{ - CKeyDevEntry *next, *last; - I64 priority, flags; - Bool (*put_key)(I64 ch, I64 sc); - Bool (*put_s)(U8 *st); -}; - -class CKeyDevGlobals -{ - CKeyDevEntry put_key_head; - U0 (**fp_ctrl_alt_cbs)(I64 sc); - I64 ctrl_alt_in_irq_flags, - **ctrl_alt_ret_addr; //address of ret address on stack in kbd irq - U8 **ctrl_alt_no_shift_descs, **ctrl_alt_shift_descs, - desc[STR_LEN], - *handler; -}; - -#help_index "Sound" -#define PCSPKR 0x61 -#help_index "ScreenCast;Sound/AU Files" -public class CAUData -{//Format of AU files - CDate cdt; - I8 ona; -}; - -class CSoundData -{//Format recorded in mem - CSoundData *next, *last; - F64 tS; - I8 ona; -}; - -public class CScreenCastGlobals -{ - CSoundData sound_head; - CDate t0_now; - F64 t0_tS; - U8 *print_format; - CDC *dc, *dc2_alias; - Bool record, just_audio; - I8 ona; -}; - -#help_index "Debugging/FunSeg" -#define FUN_SEG_CACHE_SIZE 256 -class CFunSegCache -{ - I64 base, limit; - F64 time_stamp; - U8 str[1]; //FUN_SEG_CACHE_STR_LEN -$$ = 64; -}; -#define FUN_SEG_CACHE_STR_LEN (sizeof(CFunSegCache) - offset(CFunSegCache.str)) - -#help_index "Debugging" -class CMPCrash -{ - I64 cpu_num; - CTask *task; - I64 rip; - U8 *message; - I64 message_num; -}; - -public class CDebugGlobals -{ - CTask *focus_task; - U8 *message; - I64 message_num; - CMPCrash *mp_crash; - U8 *int_fault_code, - *fix_file_line; - CFunSegCache *fun_seg_cache; - I64 fun_seg_cache_index; - Bool panic; -}; - -#help_index "Boot" -//Boot related -#define BOOT_RAM_BASE 0x07C00 -#define BOOT_RAM_LIMIT 0x97000 -#define BOOT_STACK_SIZE BLK_SIZE - -#define BOOT_SRC_NULL 0 -#define BOOT_SRC_ROM 1 -#define BOOT_SRC_RAM 2 -#define BOOT_SRC_HARDDRIVE 3 -#define BOOT_SRC_DVD 4 - -// $LK,"In",A="MN:In"$("") StdIn for call to $LK,"BootHDIns",A="MN:BootHDIns"$(). -#define STD_DISTRO_DVD_CONFIG "TB\nScale2Mem(2048,0x40000)\nT\n\n\n\n" - -#help_index "Registry" -//Registry sys_message_flags. $LK,"RegOneTimePopUp",A="MN:RegOneTimePopUp"$() -#define ARf_FLOODFILL 0 -#define ARf_CSPRITE_INS_CLIP 1 -#define ARf_PLANAR_SYMMETRY 2 -#define ARf_PSALMODY_JUKEBOX 3 -#define ARf_MESH_ED 4 -#define ARf_CSPRITE_PTS_RECTANGLES 5 -#define ARf_MANAGE_SLIDER 6 - -#help_index "Misc/Progress Bars" -#define PROGRESS_BARS_NUM 4 -#define PROGRESS_DESC_LEN (64 - 8 - 8) -class CProgress -{ - I64 val, max; - F64 t0, tf; - U8 desc[PROGRESS_DESC_LEN]; -}; - -#help_index "Char/Operations" -#define PRINTF_PAD_ZERO 0x001 -#define PRINTF_LEFT_JUSTIFY 0x002 -#define PRINTF_TRUNCATE 0x004 -#define PRINTF_COMMA 0x008 -#define PRINTF_DOLLAR 0x010 -#define PRINTF_SLASH 0x020 -#define PRINTF_QUESTION 0x040 -#define PRINTF_AUX_FORMAT_NUM 0x080 -#define PRINTF_DECIMAL 0x100 -#define PRINTF_NEG 0x200 -#define PRINTF_NEG_E 0x400 -#define PRINTF_NEG_AUX_FORMAT_NUM 0x800 - -#help_index "" +// Main ZealOS header + +#help_index "" +extern class CAOT; +extern class CAOTHeapGlobal; +extern class CAOTImportExport; +extern class CCPU; +extern class CDC; +extern class CDirContext; +extern class CDoc; +extern class CFile; +extern class CHashClass; +extern class CHashFun; +extern class CHeapCtrl; +extern class CIntermediateCode; +extern class CJobCtrl; +extern class CTask; + +#define NULL 0 +#define TRUE 1 +#define FALSE 0 +#define ON 1 +#define OFF 0 +#define NONE 0 //for use in default arguments +#define I8_MIN (-0x80) +#define I8_MAX 0x7F +#define U8_MIN 0 +#define U8_MAX 0xFF +#define I16_MIN (-0x8000) +#define I16_MAX 0x7FFF +#define U16_MIN 0 +#define U16_MAX 0xFFFF +#define I32_MIN (-0x80000000) +#define I32_MAX 0x7FFFFFFF +#define U32_MIN 0 +#define U32_MAX 0xFFFFFFFF +#define I64_MIN (-0x8000000000000000) +#define I64_MAX 0x7FFFFFFFFFFFFFFF +#define U64_MIN 0 +#define U64_MAX 0xFFFFFFFFFFFFFFFF +#define INVALID_PTR I64_MAX +#define STR_LEN 144 + +//(Int to F64 conversion is signed) +//Turn off 80-bit float constants with $LK,"OPTf_NO_BUILTIN_CONST",A="MN:OPTf_NO_BUILTIN_CONST"$. +#define U64_F64_MAX (0x43F0000000000000(F64)) +#define F64_MAX (0x7FEFFFFFFFFFFFFF(F64)) +#define F64_MIN (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)) + +#help_index "Data Types/Simple" +//ZealC union structure is treated as a whole if no member is specified, similar to bit fields. +//See $LK,"::/Demo/SubIntAccess.ZC"$. + +U16i union U16 +{ + I8i i8[2]; + U8i u8[2]; +}; + +I16i union I16 +{ + I8i i8[2]; + U8i u8[2]; +}; + +U32i union U32 +{ + I8i i8[4]; + U8i u8[4]; + I16 i16[2]; + U16 u16[2]; +}; + +I32i union I32 +{ + I8i i8[4]; + U8i u8[4]; + I16 i16[2]; + U16 u16[2]; +}; + +U64i union U64 +{ + I8i i8[8]; + U8i u8[8]; + I16 i16[4]; + U16 u16[4]; + I32 i32[2]; + U32 u32[2]; +}; + +I64i union I64 +{ + I8i i8[8]; + U8i u8[8]; + I16 i16[4]; + U16 u16[4]; + I32 i32[2]; + U32 u32[2]; +}; + +#help_index "Math/Complex;Data Types/Complex" +public class Complex +{ + F64 x, y; +}; + +#help_index "Data Types/Circular Queue" +public class CQueue +{ + CQueue *next, *last; +}; + +#help_index "Graphics/Data Types/D3I32;Math/Data Types/D3I32;Data Types/D3I32" +public class CD3I32 //Three dimensional I32 pt +{ + I32 x, y, z; +}; +public class CQueueD3I32 //Queue of three dimensional I32 pts +{ + CQueueD3I32 *next, *last; + CD3I32 p; +}; +#help_index "Math/Data Types;Data Types" +public class CD2I32 //Two dimensional I32 pt +{ + I32 x, y; +}; +public class CD2I64 //Two dimensional I64 pt +{ + I64 x, y; +}; +public class CD3I64 //Three dimensional I64 pt +{ + I64 x, y, z; +}; +public class CD2 //Two dimensional F64 pt +{ + F64 x, y; +}; + +#help_index "Math/CD3;Data Types/CD3" +public class CD3 //Three dimensional F64 pt +{ + F64 x, y, z; +}; + +#help_index "Data Types/Queue Vector" +#define QUE_VECT_U8_COUNT 512 +public class CQueueVectU8 +{ + CQueueVectU8 *next, + *last; + I64 total_count, + node_count, + min_idx; + U8 body[QUE_VECT_U8_COUNT]; +}; + +#help_index "Data Types/Fifo" +public class CFifoU8 +{ + U8 *buf; + I64 mask, + in_ptr, + out_ptr; +}; +public class CFifoI64 +{ + I64 *buf, + mask, + in_ptr, + out_ptr; +}; +#help_index "Date/CMOS" +#define CMOS_SEL 0x70 //select which register to access using this port +#define CMOS_DATA 0x71 //read from or write to register using this port + +//CMOS registers +#define CMOSR_SEC 0x0 +#define CMOSR_MIN 0x2 +#define CMOSR_HOUR 0x4 +#define CMOSR_DAY_OF_WEEK 0x6 +#define CMOSR_DAY_OF_MONTH 0x7 +#define CMOSR_MONTH 0x8 +#define CMOSR_YEAR 0x9 +#define CMOSR_STATUS_A 0xA +#define CMOSR_STATUS_B 0xB + +//CMOS status flags +#define CMOSF_BINARY (1 << 2) +#define CMOSF_UPDATING (1 << 7) + +#help_index "Date/CDate" +#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; +}; + +#help_index "Date;Date/CDate" +public class CDateStruct +{ + U8 sec10000, + sec100, + sec, + min, + hour, + day_of_week, + day_of_mon, + mon; + I32 year; +}; + +#help_index "Math/ODE" +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, //Point to entries in $LK,"CMathODE",A="MN:CMathODE"$.state[] + *DstateDt; //Point to entries in $LK,"CMathODE",A="MN:CMathODE"$.DstateDt[] + + U0 start; + U32 flags, + num; + F64 mass, + drag_profile_factor; + U0 saved_state; + F64 x, y, z, + DxDt, DyDt, DzDt; + U0 end; +}; + +#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; + U32 flags, num, end1_num, end2_num; + F64 const, rest_len; + U0 end; +}; + +//Ordinary Differential Equations +#define ODEF_HAS_MASSES 1 +#define ODEF_PAUSED 2 +#define ODEF_STARTED 4 +#define ODEF_BUSY 8 + +#define ODEf_HAS_MASSES 0 +#define ODEf_PAUSED 1 +#define ODEf_STARTED 2 +#define ODEf_BUSY 3 + +public class CMathODE +{ + CMathODE *next, *last; + I64 flags, n, n_internal; + CMass *next_mass, *last_mass; + CSpring *next_spring, *last_spring; + F64 drag_v, //drag proportional to velocity + drag_v2, //drag proportional to velocity squared + drag_v3, //drag proportional to velocity cubed + acceleration_limit, //This clips acceleration + base_t, + t, t_scale, + h, h_min, h_max; + + //This is not precise, just a ballpark. + //ZealOS CMathODE's are for video games + //not science. It bails if it takes + //too long. + F64 min_tolerance, max_tolerance; + + F64 tolerance_internal, + *array_base, + *state, + *state_internal, + *DstateDt, + *state_scale, + *initial_state, + *tmp0, *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6, *tmp7; + CTask *mem_task, *win_task; + U0 (*derive)( CMathODE *o, F64 t, F64 *state, F64 *DstateDt); + U0 (*mp_derive)(CMathODE *o, F64 t, I64 cpu_num, F64 *state, F64 *DstateDt); //If break into parallel pieces. + CTask **slave_tasks; + I64 mp_not_done_flags; + F64 mp_t, *mp_state, *mp_DstateDt; + + I64 user_data; +}; + +#help_index "Processor" +//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_DIV_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_DEBUG 0x32 +//See $LK,"ST_INT_NAMES",A="MN:ST_INT_NAMES"$ + +//You might want to start backward from +//0xFF for your own interrupts. +//See $LK+PU,"IntEntryAlloc",A="MN:IntEntryAlloc"$. +#define I_USER 0x40 + +#define MP_PROCESSORS_NUM 128 + +//Control register flag bits +#define CR0f_PE 0 //Protection Enable (Protected mode) +#define CR0f_MP 1 //Monitor coprocessor +#define CR0f_EM 2 //Emulation of coprocessor +#define CR0f_TS 3 //Task switched, some irrelevant x87 task management stuff +#define CR0f_NE 5 //Numeric error +#define CR0f_PG 31//Enable paging + +#define CR0F_PE (1 << CR0f_PE) +#define CR0F_NE (1 << CR0f_NE) + +#define CR4f_PAE 5 //Physical Address Extension, required by long mode +#define CR4f_PGE 7 //Page-Global Enable +#define CR4f_OSFXSR 9 //FXSAVE/FXRSTOR support enabled + +#define CR4F_PAE (1 << CR4f_PAE) +#define CR4F_PGE (1 << CR4f_PGE) +#define CR4F_OSFXSR (1 << CR4f_OSFXSR) + +#define SYS_START_CR0 (CR0F_PE | CR0F_NE) + +#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 RFLAGG_START 0x0000 +#define RFLAGG_NORMAL (1 << RFLAGf_INT) + +//Global Descriptor Table +class CGDTEntry +{ + U64 lo, hi; +}; + +class CGDT +{ + CGDTEntry null, + boot_ds, + boot_cs, + cs32, + cs64, //The $LK,"Charter",A="FI:::/Doc/Charter.DD"$ says just ring-0. + cs64_ring3, //$LK,"Ring3",A="FI:::/Demo/Lectures/Ring3.ZC"$, in case you want to play around. + ds, + ds_ring3, + tr[MP_PROCESSORS_NUM], + tr_ring3[MP_PROCESSORS_NUM]; +}; + +//Interrupt Descriptor Table +class CIDTEntry +{ + U16 offset_low, + seg_select; + U8 ist, + type_attr; + U16 offset_mid; + U32 offset_hi, + zero; +}; +#assert sizeof(CIDTEntry) == 16 + +class CSysLimitBase +{ + U16 limit; //Offset of last byte, not size. + U8 *base; //&GDT or &IDT +}; + +#help_index "Memory/Info" +#define MEM_E820_ENTRIES_NUM 256 +#define MEM_E820t_USABLE 1 +#define MEM_E820t_RESERVED 2 +#define MEM_E820t_ACPI 3 +#define MEM_E820t_ACPI_NVS 4 +#define MEM_E820t_BAD_MEM 5 +#define MEM_E820t_PERM_MEM 7 + +class CMemE820 +{ + U8 *base; + I64 len; + U8 type, pad[3]; +}; + +#help_index "Compiler/Internal" +//Loader flags +#define LDF_NO_ABSS 1 +#define LDF_JUST_LOAD 2 +#define LDF_SILENT 4 + +#define ZXE_SIGNATURE_VAL 'ZXE' // Zeal Executable +class CZXE +{// $LK,"ZXE Header Generation",A="FF:::/Compiler/CMain.ZC,16 ALIGN"$ by compiler. + U16 jmp; + U8 module_align_bits, + reserved; + U32 signature; + I64 org, + patch_table_offset, //$LK,"Patch Table Generation",A="FF:::/Compiler/CMain.ZC,IET_ABS_ADDR"$ + file_size; +}; + +class CPatchTableAbsAddr +{ + U8 eit_abs_addr; //$LK,"IET_ABS_ADDR",A="MN:IET_ABS_ADDR"$ + U32 abs_address_count; + U8 zero; + U32 abs_address[1]; +}; + +//$LK,"CAOTImportExport",A="MN:CAOTImportExport"$ Types. Used in PatchTable. +#define IET_END 0 +//reserved +#define IET_REL_I0 2 //Fictitious +#define IET_IMM_U0 3 //Fictitious +#define IET_REL_I8 4 +#define IET_IMM_U8 5 +#define IET_REL_I16 6 +#define IET_IMM_U16 7 +#define IET_REL_I32 8 +#define IET_IMM_U32 9 +#define IET_REL_I64 10 +#define IET_IMM_I64 11 +#define IEF_IMM_NOT_REL 1 +//reserved +#define IET_REL32_EXPORT 16 +#define IET_IMM32_EXPORT 17 +#define IET_REL64_EXPORT 18 //Not implemented +#define IET_IMM64_EXPORT 19 //Not implemented +#define IET_ABS_ADDR 20 +#define IET_CODE_HEAP 21 //Not really used +#define IET_ZEROED_CODE_HEAP 22 //Not really used +#define IET_DATA_HEAP 23 +#define IET_ZEROED_DATA_HEAP 24 //Not really used +#define IET_MAIN 25 + +#help_index "Graphics/VBE" + +#define BLACK32 0x000000 +#define WHITE32 0xFFFFFF +#define VBE_MODES_NUM 32 + +class CVBEInfo +{ + U8 signature[4]; + U16 version; + U32 oem, + capabilities, + video_modes; + U16 total_memory, + software_revision; + U32 vendor, + product_name, + product_revision; + U8 reserved[222], + oem_data[256]; +}; +#assert sizeof(CVBEInfo) == 512 + +class CVBEMode +{ + U16 attributes, + pad[7], + pitch, + width, + height; + U8 pad[3], + bpp, + pad, + memory_model, + pad[12]; + U32 framebuffer; + U16 pad[9]; + U32 max_pixel_clock; + U8 reserved[190]; +}; +#assert sizeof(CVBEMode) == 256 + +class CVideoInfo +{ + U16 width; + U16 height; +}; + +#define ZEALBOOTER_LIMINE_SIGNATURE_1 0xaa23c08ed10bd4d7; // See $LK+PU,"CORE0_32BIT_INIT",A="FF:::/Kernel/KStart32.ZC,JMP @@"$ +#define ZEALBOOTER_LIMINE_SIGNATURE_2 0xf6ceba7d4b74179a; // + +#help_index "Boot" +class CKernel +{//Must match $LK,"OSStartUp",A="FF:::/Kernel/KStart16.ZC,MEM_BOOT_BASE"$ + CZXE h; + U32 jmp, + boot_src, + boot_blk, + boot_patch_table_base, + sys_run_level; + CDate compile_time; + + U0 start; + U32 boot_base; + U16 mem_E801[2]; + CMemE820 mem_E820[MEM_E820_ENTRIES_NUM]; + U64 mem_physical_space; + CSysLimitBase sys_gdt_ptr; + U16 sys_pci_buses; + ;$$ = ($$ + 15) & -16; + CGDT sys_gdt; + U64 sys_framebuffer_addr; + U64 sys_framebuffer_width; + U64 sys_framebuffer_height; + U64 sys_framebuffer_pitch; + U8 sys_framebuffer_bpp; + U64 sys_smbios_entry; + U64 sys_disk_uuid[2]; + U32 sys_boot_stack; + Bool sys_is_uefi_booted; + CVideoInfo sys_framebuffer_list[VBE_MODES_NUM]; +}; + +//Run-Levels +#define RLf_16BIT 0 +#define RLf_VESA 1 +#define RLf_32BIT 2 +#define RLf_PATCHED 3 +#define RLf_16MEG_SYS_CODE_BP 4 +#define RLf_64BIT 5 +#define RLf_16MEG_SYSTEM_HEAP_CTRL 6 +#define RLf_FULL_HEAPS 7 +#define RLf_RAW 8 +#define RLf_INTERRUPTS 9 +#define RLf_BLKDEV 10 +#define RLf_MP 11 +#define RLf_COMPILER 12 +#define RLf_DOC 13 +#define RLf_WINMGR 14 +#define RLf_REGISTRY 15 +#define RLf_HOME 16 +#define RLf_AUTOCOMPLETE 17 +#define RLf_SYSTEM_SERVER 18 +#define RLf_ONCE_SYSTEM 19 +#define RLf_ONCE_USER 20 + +#define RLF_16BIT (1 << RLf_16BIT) +#define RLF_VESA (1 << RLf_VESA) +#define RLF_32BIT (1 << RLf_32BIT) +#define RLF_PATCHED (1 << RLf_PATCHED) +#define RLF_16MEG_SYS_CODE_BP (1 << RLf_16MEG_SYS_CODE_BP) +#define RLF_64BIT (1 << RLf_64BIT) +#define RLF_16MEG_SYSTEM_HEAP_CTRL (1 << RLf_16MEG_SYSTEM_HEAP_CTRL) +#define RLF_FULL_HEAPS (1 << RLf_FULL_HEAPS) +#define RLF_RAW (1 << RLf_RAW) +#define RLF_INTERRUPTS (1 << RLf_INTERRUPTS) +#define RLF_BLKDEV (1 << RLf_BLKDEV) +#define RLF_MP (1 << RLf_MP) +#define RLF_COMPILER (1 << RLf_COMPILER) +#define RLF_DOC (1 << RLf_DOC) +#define RLF_WINMGR (1 << RLf_WINMGR) +#define RLF_REGISTRY (1 << RLf_REGISTRY) +#define RLF_HOME (1 << RLf_HOME) +#define RLF_AUTOCOMPLETE (1 << RLf_AUTOCOMPLETE) +#define RLF_SYSTEM_SERVER (1 << RLf_SYSTEM_SERVER) +#define RLF_ONCE_SYSTEM (1 << RLf_ONCE_SYSTEM) +#define RLF_ONCE_USER (1 << RLf_ONCE_USER) + +#help_index "Processor" + +//Model specific registers. +#define IA32F_SCE 0x001 +#define IA32F_LME 0x100 +#define IA32_LAPIC_BASE 0x01B +#define IA32_EFER 0xC0000080 +#define IA32_FS_BASE 0xC0000100 +#define IA32_GS_BASE 0xC0000101 + +//Programmable Interrupt Controller +#define PIC_1 0x20 +#define PIC_1_DATA 0x21 +#define PIC_2 0xA0 +#define PIC_2_DATA 0xA1 +#define PIC_INIT 0x11 +#define PIC_EOI 0x20 //End of interrupt + +//Local Advanced Programmable Interrupt Controller +#define LAPIC_BASE 0xFEE00000 +#define LAPIC_APIC_ID (LAPIC_BASE + 0x020) +#define LAPIC_APIC_VERSION (LAPIC_BASE + 0x030) +#define LAPIC_TASK_PRIORITY (LAPIC_BASE + 0x080) +#define LAPIC_ARBITRATION_PRIORITY (LAPIC_BASE + 0x090) +#define LAPIC_PROCESSOR_PRIORITY (LAPIC_BASE + 0x0A0) +#define LAPIC_EOI (LAPIC_BASE + 0x0B0) +#define LAPIC_LOG_DST (LAPIC_BASE + 0x0D0) +#define LAPIC_DFR (LAPIC_BASE + 0x0E0) +#define LAPIC_LDR (LAPIC_BASE + 0x0D0) + +#define LAPICF_APIC_ENABLED 0x100 +#define LAPIC_SVR (LAPIC_BASE + 0x0F0) + +#define LAPIC_ISR (LAPIC_BASE + 0x100) +#define LAPIC_TMR (LAPIC_BASE + 0x180) +#define LAPIC_IRR (LAPIC_BASE + 0x200) +#define LAPIC_ICR_LOW (LAPIC_BASE + 0x300) +#define LAPIC_ICR_HIGH (LAPIC_BASE + 0x310) + +#define LAPIC_LVT_TIMER (LAPIC_BASE + 0x320) +#define LAPIC_LVT_THERMAL (LAPIC_BASE + 0x330) +#define LAPIC_LVT_PERF (LAPIC_BASE + 0x340) +#define LAPIC_LVT_LINT0 (LAPIC_BASE + 0x350) +#define LAPIC_LVT_LINT1 (LAPIC_BASE + 0x360) +#define LAPIC_LVT_ERR (LAPIC_BASE + 0x370) + +#define MPN_VECT 0x97 +#define MP_VECT_ADDR (MPN_VECT * 0x1000) + +//I/O APIC Memory mapped window +#define IOAPIC_REG 0xFEC00000 //U8 +#define IOAPIC_DATA 0xFEC00010 //U32 +//I/O APIC Registers +#define IOAPICID 0x00 +#define IOAPICVER 0x01 +#define IOAPICARB 0x02 +#define IOREDTAB 0x10 + +class CAP16BitInit +{//AP Multicore + U32 jmp; + CSysLimitBase ap_gdt_ptr; +}; + +#help_index "Time/PIT" +#help_file "::/Doc/PIT.DD" +//Programmable Interval Timer +#define PIT_0 0x40 +#define PIT_2 0x42 +#define PIT_CMD 0x43 + +#define PIT_CMDF_OPMODE_RATE_GEN 0x04 +#define PIT_CMDF_OPMODE_SQUARE_WAVE 0x06 +#define PIT_CMDF_ACCESS_WORD 0x30 +#define PIT_CMDF_CHANNEL0 0x00 +#define PIT_CMDF_CHANNEL2 0x80 + +public class CCountsGlobals +{ + I64 jiffies, //$LK,"JIFFY_FREQ",A="MN:JIFFY_FREQ"$ + timer, //$LK,"SYS_TIMER_FREQ",A="MN:SYS_TIMER_FREQ"$. Use $LK,"SysTimerRead",A="MN:SysTimerRead"$(). + time_stamp_freq, + time_stamp_kHz_freq, + time_stamp_freq_initial; //Initial freq, sampled once at boot time. + Bool time_stamp_calibrated; +}; + +#define JIFFY_FREQ 1000 // Hz +#define CDATE_FREQ 49710 // Hz +#define SYS_TIMER_FREQ (18333 * 65536 / 1000) //Hz +#define SYS_TIMER0_PERIOD (65536 * 182 / 10 / JIFFY_FREQ) + +#help_index "Call" +//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 + +class CRAXRBXRCXRDX +{ + I64 rax, rbx, rcx, rdx; +}; + +//Asm callable function pointers. +//They work with $LK,"CallExtNum",A="MN:CallExtNum"$() when calling from ZealC. +#define EXT_WIN_TO_TOP 0 +#define EXT_WIN_FOCUS 1 +#define EXT_HEAPLOG_MALLOC 2 +#define EXT_HEAPLOG_FREE 3 +#define EXT_DEBUG_RESUME 4 +#define EXT_EXTS_NUM 5 + +#help_index "Processor" +#define DEFAULT_CACHE_LINE_WIDTH 128 + +//Semaphores +class CSema +{ + Bool val, pad[DEFAULT_CACHE_LINE_WIDTH - 1]; +}; +#define SEMA_DEBUG 0 +#define SEMA_RECORD_MACRO 1 +#define SEMA_SYS_TIMER 2 +#define SEMA_SYS_DATE 3 +#define SEMA_DEBUG_MODE 4 +#define SEMA_SOUND 5 +#define SEMA_HEAPLOG_ACTIVE 6 +#define SEMA_HEAPLOG_LOCK 7 +#define SEMA_REFRESH_IN_PROGRESS 8 +#define SEMA_FLUSH_VBE_IMAGE 9 +#define SEMA_SINGLE_USER 10 +#define SEMA_DISK_CACHE 11 +#define SEMA_FAR_CALL32 12 +#define SEMA_DEV_MEM 13 +#define SEMA_VGA 14 +#define SEMA_UPDATE_WIN_Z_BUF 15 +#define SEMA_TT 16 +#define SEMA_MUTE 17 +#define SEMA_JUST_PUMP_MESSAGES 18 +#define SEMA_TMBEAT 19 +#define SEMA_FIX 20 +#define SEMA_SEMAS_NUM 21 + +#define CTRL_ALT_DEL 0 +#define CTRL_ALT_C 1 +#define CTRL_ALT_X 2 +#define CTRL_ALT_TAB 3 + +#help_index "Hash" +public class CHash +{//See $LK,"Hash",A="HI:Hash"$ + CHash *next; + U8 *str; + U32 type, + use_count; // inc'ed every time search found, never dec'ed. +}; + +public class CHashTable +{ + CHashTable *next; + I64 mask, locked_flags; + CHash **body; +}; + +#help_index "Hash/System" +//Hash table types: $LK,"ST_HTT_TYPES",A="FF:::/Kernel/KDefine.ZC,ST_HTT_TYPES"$ +#define HTt_EXPORT_SYS_SYM 0 +#define HTt_IMPORT_SYS_SYM 1 +#define HTt_DEFINE_STR 2 +#define HTt_GLOBAL_VAR 3 +#define HTt_CLASS 4 +#define HTt_INTERNAL_TYPE 5 +#define HTt_FUN 6 +#define HTt_WORD 7 +#define HTt_DICT_WORD 8 +#define HTt_KEYWORD 9 +#define HTt_ASM_KEYWORD 10 +#define HTt_OPCODE 11 +#define HTt_REG 12 +#define HTt_FILE 13 +#define HTt_MODULE 14 +#define HTt_HELP_FILE 15 +#define HTt_FRAME_PTR 16 +#define HTt_TYPES_NUM 17 + +#define HTf_PRIVATE 23 +#define HTf_PUBLIC 24 +#define HTf_EXPORT 25 +#define HTf_IMPORT 26 +#define HTf_IMM 27 +#define HTf_GOTO_LABEL 28 +#define HTf_RESOLVED 29 +#define HTf_UNRESOLVED 30 +#define HTf_LOCAL 31 + +#define HTT_INVALID 0 +#define HTT_EXPORT_SYS_SYM 0x00001 //CHashExport +#define HTT_IMPORT_SYS_SYM 0x00002 //CHashImport +#define HTT_DEFINE_STR 0x00004 //CHashDefineStr +#define HTT_GLOBAL_VAR 0x00008 //CHashGlobalVar +#define HTT_CLASS 0x00010 //CHashClass +#define HTT_INTERNAL_TYPE 0x00020 //CHashClass +#define HTT_FUN 0x00040 //CHashFun +#define HTT_WORD 0x00080 //CHashAC only in AutoComplete table +#define HTT_DICT_WORD 0x00100 //CHashGeneric only in AutoComplete tbl +#define HTT_KEYWORD 0x00200 //CHashGeneric $LK,"KEYWORD",A="FF:::/Compiler/OpCodes.DD,KEYWORD"$ +#define HTT_ASM_KEYWORD 0x00400 //CHashGeneric $LK,"ASM_KEYWORD",A="FF:::/Compiler/OpCodes.DD,ASM_KEYWORD"$ +#define HTT_OPCODE 0x00800 //CHashOpcode +#define HTT_REG 0x01000 //CHashReg +#define HTT_FILE 0x02000 //CHashGeneric +#define HTT_MODULE 0x04000 //CHashGeneric +#define HTT_HELP_FILE 0x08000 //CHashSrcSym +#define HTT_FRAME_PTR 0x10000 //CHashGeneric +#define HTG_TYPE_MASK 0x1FFFF + +#define HTF_PRIVATE 0x00800000 +#define HTF_PUBLIC 0x01000000 +#define HTF_EXPORT 0x02000000 +#define HTF_IMPORT 0x04000000 +#define HTF_IMM 0x08000000 +#define HTF_GOTO_LABEL 0x10000000 +#define HTF_RESOLVE 0x20000000 +#define HTF_UNRESOLVED 0x40000000 +#define HTF_LOCAL 0x80000000 +#define HTG_FLAGS_MASK 0xFF000000 + +#define HTG_SRC_SYM (HTT_DEFINE_STR | HTT_GLOBAL_VAR | HTT_FUN | HTT_CLASS | HTT_EXPORT_SYS_SYM | HTT_HELP_FILE) +#define HTG_ALL -1 + +#define KERNEL_MODULE_NAME "/Kernel/Kernel" + +class CDebugInfo +{ + U32 min_line, max_line; + U32 body[1]; //Code heap is 32-bit value +}; + +public class CHashSrcSym:CHash +{ + U8 *src_link, + *idx; + CDebugInfo *debug_info; + U8 *import_name; + CAOTImportExport *ie_list; +}; + +public class CHashGeneric:CHash +{ + I64 user_data0, user_data1, user_data2; +}; + +#define REGT_NONE 0 +#define REGT_R8 1 +#define REGT_R16 2 +#define REGT_R32 3 +#define REGT_R64 4 +#define REGT_SEG 5 +#define REGT_FSTACK 6 +#define REGT_MM 7 +#define REGT_XMM 8 + +public class CHashReg:CHash +{ + U8 reg_num, reg_type; +}; + +public class CHashAC:CHash +{ + I32 num; + U32 hits; +}; + +public class CHashExport:CHashSrcSym +{ + I64 val; +}; + +public class CHashImport:CHashSrcSym +{ + U8 *module_base, + *module_header_entry; +}; + +#help_index "Compiler/Internal" +#define PTR_STARS_NUM 3 + +//Member List Flags +#define MLF_DEFAULT_AVAILABLE 1 +#define MLF_LASTCLASS 2 +#define MLF_STR_DEFAULT_AVAILABLE 4 +#define MLF_FUN 8 +#define MLF_DOT_DOT_DOT 16 +#define MLF_NO_UNUSED_WARN 32 +#define MLF_STATIC 64 + +public class CArrayDim +{ + CArrayDim *next; + I64 count, total_count; +}; + +#define MLMF_IS_STR 1 +public class CMemberListMeta +{ + CMemberListMeta *next; + U8 *str; + I64 flags, + user_data; +}; + +public class CMemberList +{ + CMemberList *next, *left, *right, + *left_class_base, *right_class_base; //For finding duplicate class local variables. + U8 *str; + CHashClass *member_class, *member_class_base; + CMemberListMeta *meta; + U32 use_count; + U16 flags; + I8 reg, pad; + I64 offset, size; + CArrayDim dim; + U8 *static_data; + union + { + I64 static_data_rip; + I64 default_val; + } + CHashFun *fun_ptr; +}; + +class CExternUsage +{ + CExternUsage *next; + I64 rip; +}; + +#help_index "Hash/System;Compiler/Internal" +public class CHashDefineStr:CHashSrcSym +{ + U8 *data, **sub_idx; + I64 count; +}; + +#define Cf_EXTERN 0 +#define Cf_INTERNAL_TYPE 1 + +public class CHashClass:CHashSrcSym +{//See $LK,"ParseClassNew",A="MN:ParseClassNew"$(). base_class of $LK,"CHashFun",A="MN:CHashFun"$ + I64 size, neg_offset; + U32 member_count; + U8 ptr_stars_count, raw_type; + U16 flags; + CMemberList *member_list_and_root, //Head of linked list and head of tree. + *member_class_base_root, //For finding duplicate class local variables. + *last_in_member_list; + CHashClass *base_class, + *fwd_class; +}; + +//Function flags +#define Ff_INTERRUPT 8 +#define Ff_HASERRCODE 9 +#define Ff_ARGPOP 10 +#define Ff_NOARGPOP 11 +#define Ff_INTERNAL 12 +#define Ff__EXTERN 13 +#define Ff_DOT_DOT_DOT 14 +#define Ff_RET1 15 + +public class CHashFun:CHashClass +{//See $LK,"ParseFunNew",A="MN:ParseFunNew"$(). + CHashClass *return_class; + U32 arg_count, pad, + used_reg_mask, clobbered_reg_mask; + U8 *exe_addr; + CExternUsage *ext_list; +}; + +//Global Var Flags +#define GVF_FUN 1 +#define GVF_IMPORT 2 +#define GVF_EXTERN 4 +#define GVF_DATA_HEAP 8 +#define GVF_ALIAS 16 +#define GVF_ARRAY 32 + +public class CHashGlobalVar:CHashSrcSym +{ + I64 size, flags; + CHashClass *var_class; + CHashFun *fun_ptr; + CArrayDim dim; + U8 *data_addr; + union + { + I64 data_addr_rip; + CAOTHeapGlobal *heap_global; + } +}; +#assert offset(CHashClass.size) == offset(CHashGlobalVar.size) + +#help_index "DolDoc" +//See $LK,"TextBase Layer",A="HI:TextBase Layer"$. +#define ATTRF_BLINK 0x10000000 +#define ATTRF_INVERT 0x20000000 +#define ATTRF_SEL 0x40000000 +#define ATTRF_UNDERLINE 0x80000000 + +#define ATTRf_BLINK 28 +#define ATTRf_INVERT 29 +#define ATTRf_SEL 30 +#define ATTRf_UNDERLINE 31 + +//CDocEntry.type codes (Low 8 bits) +#define DOCT_TEXT 0 +#define DOCT_NEW_LINE 1 +#define DOCT_SOFT_NEW_LINE 2 +#define DOCT_TAB 3 +#define DOCT_PAGE_BREAK 4 +#define DOCT_CURSOR 5 +#define DOCT_MARKER 6 +#define DOCT_PROMPT 7 +#define DOCT_CLEAR 8 +#define DOCT_PAGE_LEN 9 +#define DOCT_LEFT_MARGIN 10 +#define DOCT_RIGHT_MARGIN 11 +#define DOCT_HEADER 12 +#define DOCT_FOOTER 13 +#define DOCT_INDENT 14 +#define DOCT_FOREGROUND 15 +#define DOCT_BACKGROUND 16 +#define DOCT_DEFAULT_FOREGROUND 17 +#define DOCT_DEFAULT_BACKGROUND 18 +#define DOCT_WORD_WRAP 19 +#define DOCT_HIGHLIGHT 20 +#define DOCT_BLINK 21 +#define DOCT_INVERT 22 +#define DOCT_UNDERLINE 23 +#define DOCT_SHIFTED_X 24 +#define DOCT_SHIFTED_Y 25 +#define DOCT_CURSOR_MOVEMENT 26 +#define DOCT_ANCHOR 27 +#define DOCT_LINK 28 +#define DOCT_BTTN 29 +#define DOCT_DATA 30 +#define DOCT_CHECK_BOX 31 +#define DOCT_LIST 32 +#define DOCT_MACRO 33 +#define DOCT_MENU_VAL 34 +#define DOCT_HEX_ED 35 +#define DOCT_TREE 36 +#define DOCT_SPRITE 37 +#define DOCT_INS_BIN 38 +#define DOCT_INS_BIN_SIZE 39 +#define DOCT_SONG 40 +#define DOCT_HTML_CODE 41 +#define DOCT_ERROR 42 + +#define DOCT_TYPES_NUM 43 + +//CDocEntry.type flags upper bits +#define DOCET_BLINK ATTRF_BLINK +#define DOCET_INVERT ATTRF_INVERT +#define DOCET_SEL ATTRF_SEL +#define DOCET_UNDERLINE ATTRF_UNDERLINE +#define DOCG_BL_IV_UL 0xB0000000 + +#define DOCEt_BLINK ATTRf_BLINK +#define DOCEt_INVERT ATTRf_INVERT +#define DOCEt_SEL ATTRf_SEL +#define DOCEt_UNDERLINE ATTRf_UNDERLINE + +#define DOCG_DBL_BUF_FLAGS (DOCF_OVERSTRIKE | DOCF_PLAIN_TEXT | DOCF_PLAIN_TEXT_TABS | DOCF_SIZE_MIN | DOCF_NO_CURSOR | \ + DOCF_FORM | DOCF_DBL_DOLLARS | DOCF_DONT_SWAP_OUT | DOCF_DO_FULL_REFRESH | DOCF_BORDER_DOC | \ + DOCF_HIDE_CURSOR | DOCF_DONT_HIGHLIGHT_CURSOR | DOCF_CARRIAGE_RETURN) + +//CDocEntry.de_flags. These first 16 are arg= +#define DOCEF_TAG 1 +#define DOCEF_LEN 2 +#define DOCEF_AUX_STR 4 +#define DOCEF_DEFINE 8 +#define DOCEF_HTML_LINK 0x10 +#define DOCEF_LEFT_EXP 0x20 +#define DOCEF_LEFT_MACRO 0x40 +#define DOCEF_RIGHT_EXP 0x80 +#define DOCEF_RIGHT_MACRO 0x100 +#define DOCEF_HAS_BIN 0x200 +#define DOCEF_BIN_PTR_LINK 0x400 +#define DOCEF_RAW_TYPE 0x800 +#define DOCEF_SHIFTED_X 0x1000 +#define DOCEF_SHIFTED_Y 0x2000 +#define DOCEF_SCROLLING_X 0x4000 +#define DOCEF_USER_DATA 0x8000 + +//CDocEntry.de_flags. These are +/- flags +#define DOCEF_LEFT_CB 0x10000 +#define DOCEF_LEFT_IN_STR 0x20000 +#define DOCEF_RIGHT_CB 0x40000 +#define DOCEF_RIGHT_IN_STR 0x80000 +#define DOCEF_LEFT_X 0x100000 +#define DOCEF_CENTER_X 0x200000 +#define DOCEF_RIGHT_X 0x400000 +#define DOCEF_TOP_Y 0x800000 +#define DOCEF_CENTER_Y 0x1000000 +#define DOCEF_BOTTOM_Y 0x2000000 +//HL...UL +#define DOCEF_TAG_CB 0x100000000 +#define DOCEF_PAGE_REL_Y 0x200000000 +#define DOCEF_MARGIN_REL_X 0x400000000 +#define DOCEF_WIN_REL 0x800000000 +#define DOCEF_LINK 0x1000000000 +#define DOCEF_ESC 0x2000000000 //Send (Exit and Save) +#define DOCEF_QUIT 0x4000000000 //Send (Abort) +#define DOCEF_FROM_START 0x8000000000 +#define DOCEF_HAS_BORDER 0x10000000000 +#define DOCEF_SOLID_BORDER 0x20000000000 +#define DOCEF_BORDER_PLOT 0x40000000000 +#define DOCEF_CHECKED_COLLAPSED 0x80000000000 //Checked or Collapsed +#define DOCEF_CHECK_COLLAPSABLE 0x100000000000 +#define DOCEF_REFRESH_DATA 0x200000000000 +#define DOCEF_UPDATE_DATA 0x400000000000 +//$LK,"DOCEF_DEREF_DATA",A="MN:DOCEF_DEREF_DATA"$ is confusing. $LK,"DocForm",A="MN:DocForm"$() makes doc_e->data point to members +//of class. For ints, it derefs doc_e->data as a ptr. For strings, it doesn't. +#define DOCEF_DEREF_DATA 0x800000000000 +#define DOCEF_REMALLOC_DATA 0x1000000000000 +#define DOCEF_HAS_TERMINATOR 0x2000000000000 +#define DOCEF_ZERO_BASED 0x4000000000000 +#define DOCEF_HOLD 0x8000000000000 +#define DOCEF_TREE 0x10000000000000 +#define DOCEF_LIST 0x20000000000000 +#define DOCEF_SKIP 0x40000000000000 +#define DOCEF_POPUP 0x80000000000000 +#define DOCEF_SKIP_IN_FORM 0x100000000000000 +#define DOCEF_FILTER_SKIP 0x200000000000000 +#define DOCEF_NO_CLICK_ON 0x400000000000000 +#define DOCEF_DONT_DRAW 0x800000000000000 //only works on sprites +#define DOCEF_DEFAULT_LEN 0x1000000000000000 +#define DOCEF_DEFAULT_RAW_TYPE 0x2000000000000000 + +#define DOCEG_HAS_ALLOC (DOCEF_TAG | DOCEF_AUX_STR | DOCEF_DEFINE | DOCEF_HTML_LINK | \ + DOCEF_LEFT_MACRO | DOCEF_RIGHT_MACRO | DOCEF_BIN_PTR_LINK | DOCEF_REMALLOC_DATA) + +#define DOCEG_HAS_ARG ((DOCEG_HAS_ALLOC & ~DOCEF_REMALLOC_DATA) | \ + DOCEF_LEN | DOCEF_LEFT_EXP | DOCEF_RIGHT_EXP | DOCEF_HAS_BIN | DOCEF_RAW_TYPE | \ + DOCEF_SHIFTED_X | DOCEF_SHIFTED_Y | DOCEF_SCROLLING_X | DOCEF_USER_DATA) + +#define DOCEG_DONT_EDIT (DOCEF_DEFINE | DOCEF_HTML_LINK | DOCEF_AUX_STR | DOCEF_BIN_PTR_LINK | \ + DOCEF_SCROLLING_X | DOCEF_TAG_CB) + +//These are ident to Doc flags +#define DOCEF_HIGHLIGHT 0x4000000 +#define DOCEF_WORD_WRAP 0x8000000 +#define DOCEF_BLINK ATTRF_BLINK +#define DOCEF_INVERT ATTRF_INVERT +#define DOCEF_SEL ATTRF_SEL +#define DOCEF_UNDERLINE ATTRF_UNDERLINE +#define DOCEf_HIGHLIGHT 26 +#define DOCEf_WORD_WRAP 27 +#define DOCEf_BLINK ATTRf_BLINK +#define DOCEf_INVERT ATTRf_INVERT +#define DOCEf_SEL ATTRf_SEL +#define DOCEf_UNDERLINE ATTRf_UNDERLINE + +//CDocEntry.de_flags. These first 16 are arg= +#define DOCEf_TAG 0 +#define DOCEf_LEN 1 +#define DOCEf_AUX_STR 2 +#define DOCEf_DEFINE 3 +#define DOCEf_HTML_LINK 4 +#define DOCEf_LEFT_EXP 5 +#define DOCEf_LEFT_MACRO 6 +#define DOCEf_RIGHT_EXP 7 +#define DOCEf_RIGHT_MACRO 8 +#define DOCEf_HAS_BIN 9 +#define DOCEf_BIN_PTR_LINK 10 +#define DOCEf_RAW_TYPE 11 +#define DOCEf_SHIFTED_X 12 +#define DOCEf_SHIFTED_Y 13 +#define DOCEf_SCROLLING_X 14 +#define DOCEf_USER_DATA 15 + +//CDocEntry.de_flags. These are +/- flags +#define DOCEf_LEFT_CB 16 +#define DOCEf_LEFT_IN_STR 17 +#define DOCEf_RIGHT_CB 18 +#define DOCEf_RIGHT_IN_STR 19 +#define DOCEf_LEFT_X 20 +#define DOCEf_CENTER_X 21 +#define DOCEf_RIGHT_X 22 +#define DOCEf_TOP_Y 23 +#define DOCEf_CENTER_Y 24 +#define DOCEf_BOTTOM_Y 25 +//HL...UL +#define DOCEf_TAG_CB 32 +#define DOCEf_PAGE_REL_Y 33 +#define DOCEf_MARGIN_REL_X 34 +#define DOCEf_WIN_REL 35 +#define DOCEf_LINK 36 +#define DOCEf_ESC 37 //Send (Exit and Save) +#define DOCEf_QUIT 38 //Send (Abort) +#define DOCEf_FROM_START 39 +#define DOCEf_HAS_BORDER 40 +#define DOCEf_SOLID_BORDER 41 +#define DOCEf_BORDER_PLOT 42 +#define DOCEf_CHECKED_COLLAPSED 43 //Checked or Collapsed +#define DOCEf_CHECK_COLLAPSABLE 44 +#define DOCEf_REFRESH_DATA 45 +#define DOCEf_UPDATE_DATA 46 +#define DOCEf_DEREF_DATA 47 +#define DOCEf_REMALLOC_DATA 48 +#define DOCEf_HAS_TERMINATOR 49 +#define DOCEf_ZERO_BASED 50 +#define DOCEf_HOLD 51 +#define DOCEf_TREE 52 +#define DOCEf_LIST 53 +#define DOCEf_SKIP 54 +#define DOCEf_POPUP 55 +#define DOCEf_SKIP_IN_FORM 56 +#define DOCEf_FILTER_SKIP 57 +#define DOCEf_NO_CLICK_ON 58 +#define DOCEf_DONT_DRAW 59 //only works on sprites +#define DOCEf_DEFAULT_LEN 60 +#define DOCEf_DEFAULT_RAW_TYPE 61 +#define DOCEf_FLAGS_NUM 62 + +public class CDocBin +{ + CDocBin *next, *last; + I32 tmp_use_count, renum_num; + U8 *tag; + U0 start; + U32 num, flags, size, use_count; + U0 end; + U8 *data; +#assert !($$ & 7) +}; + +#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 DOC_ATTR_DEFAULT_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_PROMPT GREEN +#define DOC_COLOR_COMMENT GREEN +#define DOC_COLOR_BIN LTGREEN +#define DOC_COLOR_STR BROWN +#define DOC_COLOR_CHAR_CONST BROWN +#define DOC_COLOR_EXPORT_SYS_SYM LTPURPLE +#define DOC_COLOR_DEFINE_STR CYAN +#define DOC_COLOR_GLOBAL_VAR LTCYAN +#define DOC_COLOR_CLASS LTBLUE +#define DOC_COLOR_FUN PURPLE +#define DOC_COLOR_KEYWORD BLUE +#define DOC_COLOR_REG LTRED +#define DOC_COLOR_NUMBER YELLOW + +public class CDocSettings +{ + U32 final_u32_attr; + I16 left_margin, right_margin, indent; + U16 page_len, header, footer; + I8 shifted_x, shifted_y; + U8 state, comment_depth, paren_depth, brace_depth, cur_text_attr, default_text_attr; +}; + +#define DOC_DEFAULT I32_MIN + +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 de_flags; + I32 x, y; + U32 min_col, max_col; + CDocSettings settings; + I64 user_data; +#assert !($$&7) +}; + +#define DOCE_LEN_DEFAULT 64 + +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, + *aux_str, + *bin_ptr_link, + *html_link, + *my_format_data; + I64 hex_ed_width; + I32 scroll_len, + len, //$LK,"DOCE_LEN_DEFAULT",A="MN:DOCE_LEN_DEFAULT"$ + bin_num; + U8 raw_type, pad[3]; + CDocBin *bin_data; + U8 *data; +#assert !($$ & 7) +}; + +//$LK,"DocForm",A="MN:DocForm"$() $LK,"DocMenu",A="MN:DocMenu"$() $LK,"DocEd",A="MN:DocEd"$() $LK,"PopUpMenu",A="MN:PopUpMenu"$() +#define DOF_SIZE_MIN 0x01 +#define DOF_INTERCEPT_TASK_END 0x02 +#define DOF_DONT_HOME 0x04 +#define DOF_WIN_MAX 0x08 +#define DOF_DONT_TEXT_ATTR 0x10 +#define DOF_DONT_WINMGR_SYNC 0x20 +#define DOF_DONT_SHOW 0x40 +//Combines with $LK,"Editor Flags",A="MN:EDF_BAIL"$ + +class CEdFindText +{ + U8 find_text[STR_LEN] format "$$DA-P,A=\"Find :%s\"$$\n", + replace_text[STR_LEN] format "$$DA-P,A=\"Replace :%s\"$$\n"; + Bool replace format "$$CB,\"Replace\"$$\n", + scan_fwd format "$$CB,\"Fwd\"$$\n", + scan_sel_text format "$$CB,\"Selection\"$$\n", + match_case format "$$CB,\"Match Case\"$$\n", + whole_labels format "$$CB,\"Whole Labels\"$$\n", + local_var format "$$CB,\"Rename Local Var\"$$\n", + prompt, pad; + I64 filter_lines format "$$DA,A=\"Filter Lines:%d\"$$\n"; +}; + +class CEdFileName +{ + CDirContext *dirc; + U8 name[256] format "$$DA-P,LEN=255,A=\"FileName:%s\"$$"; +}; + +//$LK,"Ed",A="MN:Ed"$() +#define EDF_BAIL 0x100 +#define EDF_COLLAPSE 0x200 +#define EDF_UNCOLLAPSE 0x400 +#define EDF_WAS_WRITE 0x800 //Was exit ESC or SHIFT_ESC? +//Combines with $LK,"Document Flags",A="MN:DOF_SIZE_MIN"$ + +#define EDf_BAIL 8 +#define EDf_COLLAPSE 9 +#define EDf_UNCOLLAPSE 10 +#define EDf_WAS_WRITE 11 + +// DOC header flags +#define DOCF_PLAIN_TEXT 0x1 +#define DOCF_PLAIN_TEXT_TABS 0x2 //has '\t', not DOCT_TAB +#define DOCF_AUTO_SAVE 0x4 +#define DOCF_NO_CURSOR 0x8 +#define DOCF_CARRIAGE_RETURN 0x10 +#define DOCF_DBL_DOLLARS 0x20 +#define DOCF_COLOR_NAMES 0x40 +//Reserved x1 +#define DOCF_BORDER_DOC 0x100 +#define DOCF_FORM 0x200 +#define DOCF_SIZE_MIN 0x400 +#define DOCF_HIDE_CURSOR 0x800 //use $LK,"DocCursor",A="MN:DocCursor"$ +#define DOCF_DONT_HIGHLIGHT_CURSOR 0x1000 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$ +#define DOCF_NO_SCROLL_BARS 0x2000 //use $LK,"DocScroll",A="MN:DocScroll"$ +#define DOCF_ALLOW_UNDO 0x4000 +#define DOCF_DONT_SHOW 0x8000 +#define DOCF_HAS_SONG 0x10000 +#define DOCF_MORE 0x20000 +#define DOCF_BWD_MOVEMENT 0x40000 +#define DOCF_NULL_GRAB_SCROLL 0x80000 +#define DOCF_DONT_SWAP_OUT 0x100000 +#define DOCF_DO_FULL_REFRESH 0x200000 +#define DOCF_BREAK_UNLOCKED 0x400000 +//Reserved x1 +#define DOCF_HIGHLIGHT DOCEF_HIGHLIGHT +#define DOCF_WORD_WRAP DOCEF_WORD_WRAP +#define DOCF_BLINK DOCEF_BLINK +#define DOCF_INVERT DOCEF_INVERT +#define DOCF_SEL DOCEF_SEL +#define DOCF_UNDERLINE DOCEF_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_TABS 1 //has '\t', not DOCT_TAB +#define DOCf_AUTO_SAVE 2 +#define DOCf_NO_CURSOR 3 +#define DOCf_CARRIAGE_RETURN 4 +#define DOCf_DBL_DOLLARS 5 +#define DOCf_COLOR_NAMES 6 +//Reserved x1 +#define DOCf_BORDER_DOC 8 +#define DOCf_FORM 9 +#define DOCf_SIZE_MIN 10 +#define DOCf_HIDE_CURSOR 11 //use $LK,"DocCursor",A="MN:DocCursor"$ +#define DOCf_DONT_HIGHLIGHT_CURSOR 12 //use $LK,"DocHighlightCursor",A="MN:DocHighlightCursor"$ +#define DOCf_NO_SCROLL_BARS 13 //use $LK,"DocScroll",A="MN:DocScroll"$ +#define DOCf_ALLOW_UNDO 14 +#define DOCf_DONT_SHOW 15 +#define DOCf_HAS_SONG 16 +#define DOCf_MORE 17 +#define DOCf_BWD_MOVEMENT 18 +#define DOCf_NULL_GRAB_SCROLL 19 +#define DOCf_DONT_SWAP_OUT 20 +#define DOCf_DO_FULL_REFRESH 21 +#define DOCf_BREAK_UNLOCKED 22 +//Reserved x1 + +#define DOCf_HIGHLIGHT DOCEf_HIGHLIGHT +#define DOCf_WORD_WRAP DOCEf_WORD_WRAP +#define DOCf_BLINK DOCEf_BLINK +#define DOCf_INVERT DOCEf_INVERT +#define DOCf_SEL DOCEf_SEL +#define DOCf_UNDERLINE DOCEf_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, doc_flags, time_stamp; + U8 *body; +}; + +//See $LK,"DocMenu",A="MN:DocMenu"$() +#define DOCM_CANCEL (-1) + +#define DOC_SIGNATURE_VAL 'DocS' + +#define RECALCt_NORMAL 0x00 +#define RECALCt_FIND_CURSOR 0x01 +#define RECALCt_TO_SCREEN 0x02 +#define RECALCG_MASK 0xFF + +#define RECALCF_HAS_CURSOR 0x100 +#define RECALCF_ADD_CURSOR 0x200 +#define RECALCF_TO_HTML 0x400 + +public class CDoc //Linked Text File header +{//See $LK,"Doc",A="HI:Doc"$ for documentation. + CDocEntryBase head; + I64 flags, locked_flags; + CDocEntry *cur_entry, *old_cur_entry; + I32 cur_col, old_cur_col, line_start_col, top_line_num, dollar_buf_size, dollar_buf_ptr; + U8 *dollar_buf; //When entering $$ cmds, it buffers them until the end $$. + + CTask *win_task, *mem_task, *owning_task; + I32 page_line_num, undo_count, + x, y, min_x, max_x, min_y, max_y; + I64 line, col, best_d, + old_win_top, old_win_bottom, old_win_left, old_win_right, + cmd_U8; + U32 doc_signature, cur_bin_num; + I64 max_entries, updates_count; + CEdFindText *find_replace; + + CEdFileName filename; + I64 file_attr; + I64 (*left_click_link)(CDoc *doc, CDocEntry *doc_e); + I64 (*right_click_link)(CDoc *doc, CDocEntry *doc_e); + + //See $LK,"::/Apps/Psalmody/JukeBox.ZC"$ + U8 *user_put_data; //Passed to user_put_key() and user_put_s() + 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; //(When browsing deeper, opening deeper docs.) + U64 desc; //8 characters. See $LK,"DocBorderListDraw",A="MN:DocBorderListDraw"$(). + + CDocBin bin_head; + CDocSettings settings_head; + CDocUndo undo_head; + + I64 user_data; +#assert !($$&7) +}; + +#help_index "Windows" +/* +Fs->win_inhibit mask + +Some inhibit actions on the task itself. +Some inhibit actions if the focus task +tries to do something. +*/ +#define WIF_SELF_FOCUS 0x0001 //If active this task cannot have focus +//MENU 0x0002 +#define WIF_SELF_CTRLS 0x0004 +#define WIF_SELF_MS_L 0x0008 +//MS_L_D 0x0010 +#define WIF_SELF_MS_R 0x0020 +//MS_R_D 0x0040 +#define WIF_SELF_MS_WHEEL 0x0080 //Does nothing, yet +#define WIF_SELF_BORDER 0x0100 +#define WIF_SELF_GRAB_SCROLL 0x0200 +#define WIF_SELF_DOC 0x0400 +#define WIF_SELF_ODE 0x0800 +#define WIF_SELF_KEY_DESC 0x1000 +//FOCUS 0x00010000 +#define WIF_FOCUS_TASK_MENU 0x00020000 +#define WIF_FOCUS_TASK_CTRLS 0x00040000 +#define WIF_FOCUS_TASK_MS_L 0x00080000 +#define WIF_FOCUS_TASK_MS_L_D 0x00100000 +#define WIF_FOCUS_TASK_MS_R 0x00200000 +#define WIF_FOCUS_TASK_MS_R_D 0x00400000 +#define WIF_FOCUS_TASK_MS_WHEEL 0x00800000 //Does nothing, yet +#define WIF_FOCUS_TASK_BORDER 0x01000000 +#define WIF_FOCUS_TASK_GRAB_SCROLL 0x02000000 + +#define WIG_DBL_CLICK (WIF_FOCUS_TASK_MS_L_D | WIF_FOCUS_TASK_MS_R_D) +#define WIG_TASK_DEFAULT (WIF_FOCUS_TASK_MENU | WIG_DBL_CLICK | 0xFFFF - WIF_SELF_DOC - WIF_SELF_ODE) +#define WIG_NO_FOCUS_TASK_DEFAULT (WIG_TASK_DEFAULT - WIF_SELF_BORDER - WIF_SELF_MS_L - WIF_SELF_MS_R - WIG_DBL_CLICK) +#define WIG_USER_TASK_DEFAULT WIF_SELF_KEY_DESC + +#define WIf_SELF_FOCUS 0 +#define WIf_SELF_CTRLS 2 +#define WIf_SELF_MS_L 3 +#define WIf_SELF_MS_R 5 +#define WIf_SELF_MS_WHEEL 7 +#define WIf_SELF_BORDER 8 +#define WIf_SELF_GRAB_SCROLL 9 +#define WIf_SELF_DOC 10 +#define WIf_SELF_ODE 11 +#define WIf_SELF_KEY_DESC 12 +#define WIf_FOCUS_TASK_MENU 17 +#define WIf_FOCUS_TASK_CTRLS 18 +#define WIf_FOCUS_TASK_MS_L 19 +#define WIf_FOCUS_TASK_MS_L_D 20 +#define WIf_FOCUS_TASK_MS_R 21 +#define WIf_FOCUS_TASK_MS_R_D 22 +#define WIf_FOCUS_TASK_MS_WHEEL 23 +#define WIf_FOCUS_TASK_BORDER 24 +#define WIf_FOCUS_TASK_GRAB_SCROLL 25 +#define WIf_FLAGS_NUM 26 + +class CWinMgrTimingGlobals +{ + I64 last_total_jiffies, + last_idle_pt_hits[MP_PROCESSORS_NUM], + last_swap_counter[MP_PROCESSORS_NUM]; + F64 last_calc_idle_time, calc_idle_delta_time; + I64 calc_idle_count; +}; + +#define WINMGR_FPS (60000.0 / 1001) +#define WINMGR_PERIOD (1001 / 60000.0) + +public class CWinMgrGlobals +{ + I64 updates; + F64 ode_time, + last_ode_time, + fps, //You can read but not write this. You have no control. + ideal_refresh_tS, + last_refresh_tS; + CWinMgrTimingGlobals *t; + Bool show_menu, grab_scroll, grab_scroll_closed; +}; + +#help_index "AutoComplete" +#define ACf_INIT_IN_PROGRESS 0 +#define ACf_LAST_WAS_KEYMAP 1 + +#define AC_FILLINS_NUM 12 +public class CAutoCompleteGlobals +{ + I64 col, row, old_col, old_row, num_words; + CHashTable *hash_table; + U8 *cur_word; + I64 flags; + CTask *task; + I64 partial_len, num_fillins, + fillin_hits [AC_FILLINS_NUM + 1]; + CHashAC *fillin_matches[AC_FILLINS_NUM + 1]; +}; + +#help_index "AutoComplete/Dictionary" +#define ACD_WORD_FILENAME "/System/AutoComplete/ACWords.DATA" +#define ACD_DEF_FILENAME "/System/AutoComplete/ACDefs.DATA" + +#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_FILLINS_NUM 10 +public class CAutoCompleteDictGlobals +{ + U8 *word_list; + I64 word_list_size, num_words, num_fillins; + U8 *fillins[ACD_FILLINS_NUM]; + Bool has_words, has_defs; +}; + +#help_index "Compiler/Directive" +//Compiler $LK,"Option",A="MN:Option"$()s +//You might need to do #exe {Option();} +//Note: The #exe statement is lexed-ahead, +//so it takes effect earlier than you might expect. +#define OPTf_ECHO 0 +#define OPTf_TRACE 1 +#define OPTf_WARN_UNUSED_VAR 2 //Applied to functions, not statements +#define OPTf_WARN_PAREN 3 //Warn unnecessary parens +#define OPTf_WARN_DUP_TYPES 4 //Warn duplicate local variable type statements +#define OPTf_WARN_HEADER_MISMATCH 5 +#define OPTf_EXTERNS_TO_IMPORTS 6 +#define OPTf_KEEP_PRIVATE 7 +#define OPTf_NO_REG_VAR 8 //Applied to functions, not statements +#define OPTf_GLOBALS_ON_DATA_HEAP 9 +//Disable 10-byte float consts for ã,log2_10,log10_2,loge_2 +#define OPTf_NO_BUILTIN_CONST 10 //Applied to functions, not statements +#define OPTf_USE_IMM64 11 //Not completely implemented +#define OPTf_DECIMAL_ONLY 12 //Only allow decimal numbers (no 0x or 0b prefixed numbers) +#define OPTf_NO_FLOATS 13 //No floating point numbers allowed + +#define OPTF_ECHO (1 << OPTf_ECHO) + +#help_index "Compiler/Intermediate Code" +//See $LK,"ST_RAW_TYPES",A="MN:ST_RAW_TYPES"$ +#define RT_I0 2 +#define RT_U0 3 +#define RT_I8 4 +#define RT_U8 5 +#define RT_I16 6 +#define RT_U16 7 +#define RT_I32 8 +#define RT_U32 9 +#define RT_I64 10 +#define RT_PTR 10 //Signed to allow negative error codes. $LK,"DOCM_CANCEL",A="MN:DOCM_CANCEL"$ +#define RT_U64 11 +#define RT_F32 12 //Not implemented +#define RT_UF32 13 //Not implemented, Fictitious +#define RT_F64 14 +#define RT_UF64 15 //Fictitious +#define RT_RTS_NUM 16 +#define RTF_UNSIGNED 1 +#define RTG_MASK 0xFF + +#define MDf_STACK 8 +#define MDf_IMM 9 +#define MDf_REG 10 +#define MDf_DISP 11 +#define MDf_SIB 12 +#define MDf_RIP_DISP32 13 + +#define MDF_NULL 0x0000 +#define MDF_STACK 0x0100 +#define MDF_IMM 0x0200 +#define MDF_REG 0x0400 +#define MDF_DISP 0x0800 +#define MDF_SIB 0x1000 +#define MDF_RIP_DISP32 0x2000 +#define MDG_MASK 0xFF00 +#define MDG_REG_DISP_SIB (MDF_REG | MDF_DISP | MDF_SIB) +#define MDG_DISP_SIB_RIP (MDF_DISP | MDF_SIB | MDF_RIP_DISP32) +#define MDG_REG_DISP_SIB_RIP (MDF_REG | MDG_DISP_SIB_RIP) + +#define ICF_RES_TO_F64 0x000000001 +#define ICF_RES_TO_INT 0x000000002 +#define ICF_ARG1_TO_F64 0x000000004 +#define ICF_ARG1_TO_INT 0x000000008 +#define ICF_ARG2_TO_F64 0x000000010 +#define ICF_ARG2_TO_INT 0x000000020 +#define ICF_USE_F64 0x000000040 +#define ICF_USE_UNSIGNED 0x000000080 +#define ICF_USE_INT 0x000000100 //highest priority +#define ICF_RES_NOT_USED 0x000000200 +#define ICF_CODE_FINAL 0x000000400 +#define ICF_BY_VAL 0x000000800 //By value, not ref. +#define ICF_SHORT_JMP 0x000001000 +#define ICF_PUSH_RES 0x000002000 +#define ICF_PASS_TRACE 0x000004000 +#define ICF_RES_WAS_STACK 0x000008000 +#define ICF_ARG1_WAS_STACK 0x000010000 +#define ICF_ARG2_WAS_STACK 0x000020000 +#define ICF_PUSH_CMP 0x000040000 //for 50last_cc->lex_include_stack->line_num);} +#define __CMD_LINE__ #exe{StreamPrint("%d", Fs->last_cc->flags & CCF_CMD_LINE && Fs->last_cc->lex_include_stack->depth < 1);} +#define __FILE__ #exe{StreamPrint("\"%s\"", Fs->last_cc->lex_include_stack->full_name);} +#define __DIR__ #exe{StreamDir;} + +#define LFSF_DOC 1 +#define LFSF_DEFINE 2 +class CLexFile +{ + CLexFile *next; + U8 *buf, + *buf_ptr; + I64 line_num, flags; + U8 *full_name, + *line_start; + CDoc *doc; + CDocEntry *cur_entry; + I32 depth; + U8 last_U16, pad[3]; +}; + +class CAOTCtrl +{ + I64 rip; //Instruction pointer + CAsmArg arg1, arg2, arg3; + CAOTBinBlk *bin; + I64 num_bin_U8s, + max_align_bits, org; + CAsmUnresolvedRef *local_unresolved, *global_unresolved; + CAOTAbsAddr *abss; + CAOTHeapGlobal *heap_globals; + I64 list_col, list_last_rip; + U8 *last_label, *list_last_line; + CLexFile *list_last_lfn; + I64 seg_size; + Bool list; +}; + +//Tokens +#define TK_EOF 0 +#define TK_SUPERSCRIPT 0x001 +#define TK_SUBSCRIPT 0x002 +#define TK_NORMALSCRIPT 0x003 +#define TK_IDENT 0x100 +#define TK_STR 0x101 +#define TK_I64 0x102 +#define TK_CHAR_CONST 0x103 +#define TK_F64 0x104 +#define TK_PLUS_PLUS 0x105 +#define TK_MINUS_MINUS 0x106 +#define TK_DEREFERENCE 0x107 +#define TK_DBL_COLON 0x108 +#define TK_SHL 0x109 +#define TK_SHR 0x10A +#define TK_EQU_EQU 0x10B +#define TK_NOT_EQU 0x10C +#define TK_LESS_EQU 0x10D +#define TK_GREATER_EQU 0x10E +#define TK_AND_AND 0x10F +#define TK_OR_OR 0x110 +#define TK_XOR_XOR 0x111 +#define TK_SHL_EQU 0x112 +#define TK_SHR_EQU 0x113 +#define TK_MUL_EQU 0x114 +#define TK_DIV_EQU 0x115 +#define TK_AND_EQU 0x116 +#define TK_OR_EQU 0x117 +#define TK_XOR_EQU 0x118 +#define TK_ADD_EQU 0x119 +#define TK_SUB_EQU 0x11A +#define TK_IF 0x11B +#define TK_IFDEF 0x11C +#define TK_IFNDEF 0x11D +#define TK_IFAOT 0x11E +#define TK_IFJIT 0x11F +#define TK_ENDIF 0x120 +#define TK_ELSE 0x121 +#define TK_MOD_EQU 0x122 +#define TK_DOT_DOT 0x123 +#define TK_ELLIPSIS 0x124 +#define TK_INS_BIN 0x125 +#define TK_INS_BIN_SIZE 0x126 +#define TK_TKS_NUM 0x127 + +class CLexHashTableContext +{ + CLexHashTableContext *next; + I64 old_flags, hash_mask; + CHashFun *local_var_list, + *fun; + CHashTable *hash_table_list, + *define_hash_table, + *local_hash_table, + *global_hash_table; +}; + +//CompCtrl flags +#define CCF_CMD_LINE 0x001 +#define CCF_PROMPT 0x002 +#define CCf_PROMPT 1 +#define CCF_QUESTION_HELP 0x004 +#define CCF_DONT_FREE_BUF 0x008 +#define CCF_NO_DEFINES 0x010 +#define CCF_IN_IF 0x020 +#define CCF_JUST_LOAD 0x040 +#define CCF_KEEP_NEW_LINES 0x080 +#define CCF_KEEP_DOT 0x100 +#define CCF_KEEP_SIGN_NUM 0x200 +#define CCF_KEEP_AT_SIGN 0x400 +#define CCF_NO_CHAR_CONST 0x800 +#define CCf_PASS_TRACE_PRESENT 12 +#define CCF_NOT_CONST 0x0000020000 +#define CCF_NO_REG_OPT 0x0000040000 +#define CCF_IN_QUOTES 0x0000080000 +#define CCF_EXE_BLK 0x0000100000 +#define CCF_HAS_MISC_DATA 0x0000200000 +#define CCF_HAS_RETURN 0x0000400000 +#define CCF_ASM_EXPRESSIONS 0x0000800000 +#define CCF_UNRESOLVED 0x0001000000 +#define CCF_LOCAL 0x0002000000 +#define CCF_FUN_EXP 0x0004000000 +#define CCf_FUN_EXP 26 +#define CCF_POSTINC 0x0008000000 +#define CCF_POSTDEC 0x0010000000 +#define CCF_PREINC 0x0020000000 +#define CCF_PREDEC 0x0040000000 +#define CCF_ARRAY 0x0080000000 +#define CCF_RAX 0x0100000000 +#define CCF_USE_LAST_U16 0x0200000000 +#define CCf_USE_LAST_U16 33 +#define CCF_LAST_WAS_DOT 0x0400000000 +#define CCF_AOT_COMPILE 0x0800000000 +#define CCf_AOT_COMPILE 35 +#define CCF_NO_ABSS 0x1000000000 +#define CCF_PAREN 0x2000000000 +#define CCf_PAREN 37 +#define CCF_CLASS_DOL_OFFSET 0x4000000000 +#define CCF_DONT_MAKE_RES 0x8000000000 + +public class CCompCtrl +{ + CCompCtrl *next, *last; + I64 token, flags, + cur_i64; + F64 cur_f64; + U8 *cur_str; + I64 cur_str_len, + class_dol_offset; + U8 *dollar_buf; + I64 dollar_count; + U8 *cur_help_idx; + I64 last_U16, + min_line, max_line, last_line_num, + lock_count; + U32 *char_bmp_alpha_numeric; + CLexHashTableContext htc; + CHashGeneric *hash_entry; + CAbsCountsI64 abs_counts; + CAsmUndefHash *asm_undef_hash; + CMemberList *local_var_entry; + CCodeMisc *lb_leave; + U8 *cur_buf_ptr; + CLexFile *lex_include_stack, + *lex_parse_stack, + *fun_lex_file; + CStreamBlk *next_stream_blk, *last_stream_blk; + CAOT *aot; + + I64 pass, opts, pass_trace, saved_pass_trace, error_count, warning_count; + + //For intermediate codes with multiple float ops (int<->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]; + + CCodeCtrl coc; + CParseStack *ps; + CAOTCtrl *aotc; + I64 aot_depth, prompt_line; +#assert !($$ & 7) +}; + +#help_index "Compiler" +public class CCompGlobals +{ + CHashTable *asm_hash; + CHashClass *internal_types[RT_RTS_NUM]; + CIntermediateCode ic_nop; + U32 *dual_U16_tokens1, *dual_U16_tokens2, *dual_U16_tokens3, + *binary_ops; + I64 num_reg_vars, num_non_ptr_vars, + stack_tmps_mask, reg_vars_mask, non_ptr_vars_mask; + U8 *to_reg_vars_map, *non_ptr_vars_map; + I64 size_arg_mask[17], + compiled_lines; +}; + +#help_index "Debugging/Unassemble" +class CUAsmGlobals +{ + CInst **table_16_32, + **table_64; + I64 table_16_32_entries, + table_64_entries, + ins64_arg_mask, + signed_arg_mask, + mem_arg_mask; +}; + +#help_index "Devices/SMBIOS" +//SMBIOS parsing based on SMBIOS specification 3.3.0 (document "DSP0134") +#define SMBIOSt_BIOS 0 +#define SMBIOSt_SYSTEM 1 +#define SMBIOSt_BASEBOARD 2 +#define SMBIOSt_ENCLOSURE 3 +#define SMBIOSt_PROCESSOR 4 +#define SMBIOSt_CACHE 7 +#define SMBIOSt_CONNECTOR 8 +#define SMBIOSt_SLOT 9 +#define SMBIOSt_OEM_STRINGS 11 +#define SMBIOSt_SYS_CONFIG_OPTIONS 12 +#define SMBIOSt_PHYMEM 16 +#define SMBIOSt_MEM_DEVICE 17 +#define SMBIOSt_MAPPED_ADDR 19 +#define SMBIOSt_BATTERY 22 +#define SMBIOSt_BOOT_INFO 32 +#define SMBIOSt_ALL 0xFF //Non-existent placeholder type + +class CSMBIOSHeader +{//Section 6.1.2 line 885 + U8 type, //SMBIOSt_* + length; + U16 handle; //identifier for this structure. +}; +class CSMBIOSEntryPoint +{//Section 5.2.1 line 812 + U8 anchor_str[4], // '_SM_' + checksum, + length, + major_version, + minor_version; + U16 max_structure_size; + U8 entry_point_revision, + formatted_area[5], + anchor_str2[5], // '_DMI_' + checksum2; + U16 table_length; + U32 table_address; + U16 structure_count; + U8 bcd_revision; +}; + +class CSMBIOSBIOSInfo +{//Section 7.1 line 922 + CSMBIOSHeader header; + U8 vendor, + version; + U16 start_address_segment; + U8 release_date, + rom_size; + U64 flags; + U8 extended_flags[2]; + U8 major_release, + minor_release, + embedded_controller_firmware_major_release, + embedded_controller_firmware_minor_release; + U16 extended_rom_size; +}; + +class CSMBIOSSystemInfo +{//Section 7.2 line 936 + CSMBIOSHeader header; + U8 manufacturer, + product_name, + version, + serial_number, + uuid[16], + wakeup_type, + sku_number, + family; +}; + +class CSMBIOSBaseboardInfo +{//Section 7.3 line 968 + CSMBIOSHeader header; + U8 manufacturer, + product, + version, + serial_number, + asset_tag, + feature_flags, + chassis_location; + U16 chassis_handle; + U8 board_type, + contained_object_handles_num; + U16 contained_object_handles[1]; //Variable length, member above gives length +}; + +class CSMBIOSEnclosureInfo +{//Section 7.4 line 984 + CSMBIOSHeader header; + U8 manufacturer, + type, + version, + serial_number, + asset_tag, + bootup_state, + power_supply_state, + thermal_state, + security_status; + U32 oem_defined; + U8 height, + power_cord_count, + contained_element_count, + contained_element_record_length, + contained_elements[1]; //array length == count * record_length; +}; + +class CSMBIOSEnclosureContainedElement +{//Section 7.4.4 line 999 + U8 contained_element_type, + contained_element_minimum, + contained_element_maximum; +}; + +class CSMBIOSProcessorInfo +{//Section 7.5 line 1010 + CSMBIOSHeader header; + U8 name, + type, + family, + manufacturer; + U64 id; + U8 version, + voltage; + U16 external_clock, + max_speed, + current_speed; + U8 status, + upgrade; + U16 l1_cache_handle, + l2_cache_handle, + l3_cache_handle; + U8 serial_number, + asset_tag, + part_number, + core_count, + cores_enabled, + thread_count; + U16 characteristics; +}; + +class CSMBIOSCacheInfo +{//Section 7.8 line 1168 + CSMBIOSHeader header; + U8 name; + U16 config, + max_size, + installed_size, + supported_sram_type, + installed_sram_type; + U8 cache_speed, + error_correction_type, + cache_type, + associativity; +}; + +class CSMBIOSConnectorInfo +{//Section 7.9 line 1198 + CSMBIOSHeader header; + U8 internal_name, + internal_type, + external_name, + external_type, + port_type; +}; + +class CSMBIOSSlotInfo +{//Section 7.10 line 1226 + CSMBIOSHeader header; + U8 name, + type, + data_bus_width, + current_usage, + length; + U16 id; + U8 flags1, + flags2; + U16 segment_group_number; + U8 bus_number, + device_function_number; +}; + +class CSMBIOSMemArrayInfo +{//Section 7.17 line 1519 + CSMBIOSHeader header; + U8 location, + use, + memory_error_correction; + U32 max_capacity; + U16 memory_error_info_handle, + mem_device_count; + U64 extended_max_capacity; +}; + +class CSMBIOSMemDeviceInfo +{//Section 7.18 line 1538 + CSMBIOSHeader header; + U16 memory_array_handle, + memory_error_info_handle, + total_width, + data_width, + size; + U8 form_factor, + device_set, + device_locator, + bank_locator, + type; + U16 type_detail, + speed; + U8 manufacturer, + serial_number, + asset_tag, + part_number, + attributes; + U32 extended_size; + U16 configured_speed, + min_voltage, + max_voltage, + configured_voltage; +}; + +class CSMBIOSBatteryInfo +{//Section 7.23 line 1723 + CSMBIOSHeader header; + U8 location, + manufacturer, + manufacture_date, + serial_number, + name, + chemistry, + capacity, + voltage, + sbds_version_number, + max_battery_data_error, + sbds_serial_number, + sbds_manufacture_date, + sbds_chemistry, + capacity_multiplier; + U32 oem; +}; + +#help_index "Devices;PCI" + +//PCI Registers, used with $LK,"PCIRead",A="MN:PCIReadU16"$ functions. +#define PCIR_VENDOR_ID 0x00 +#define PCIR_DEVICE_ID 0x02 +#define PCIR_COMMAND 0x04 +#define PCIR_STATUS 0x06 +#define PCIR_REVISION_ID 0x08 +#define PCIR_PROG_IF 0x09 +#define PCIR_SUB_CODE 0x0A +#define PCIR_CLASS_CODE 0x0B +#define PCIR_CACHE_LINE_SIZE 0x0C +#define PCIR_LATENCY_TIMER 0x0D +#define PCIR_HEADER_TYPE 0x0E +#define PCIR_BIST 0x0F +#define PCIR_BASE0 0x10 +#define PCIR_BASE1 0x14 +#define PCIR_BASE2 0x18 +#define PCIR_BASE3 0x1C +#define PCIR_BASE4 0x20 +#define PCIR_BASE5 0x24 +#define PCIR_SUBSYS_VENDOR_ID 0x2C +#define PCIR_SUBSYS_ID 0x2E +#define PCIR_EXPANSION_ROM 0x30 +#define PCIR_CAPABILITIES 0x34 +#define PCIR_INTERRUPT_LINE 0x3C +#define PCIR_INTERRUPT_PIN 0x3D +#define PCIR_MIN_GRANT 0x3E +#define PCIR_MAX_LATENCY 0x3F + +//PCI class codes +#define PCIC_STORAGE 0x1 +#define PCIC_NETWORK 0x2 + +//PCI subclass codes +#define PCISC_ETHERNET 0x0 +#define PCISC_AHCI 0x6 + +//PCI I/O ports +#define PCI_ADDR 0xCF8 +#define PCI_DATA 0xCFC + +class CPCIDev +{ + CPCIDev *next, *last; + U8 bus, dev, fun, + *vendor_str, + *dev_id_str, + class_code, + sub_code, + prog_if, + revision_id, + bist, + header_type, + latency_timer, + cache_line_size, + capabilities, + interrupt_line, + interrupt_pin, + min_grant, + max_latency; + U16 vendor_id, + device_id, + subsys_id, + subsys_vendor_id; + U32 base[6], + erom; +}; + +#help_index "Devices;Disk/AHCI" +#define AHCI_MAX_PORTS 32 + +//Physical Region Descriptor Table +#define AHCI_PRD_MAX_BYTES (4 * 1024 * 1024) //Max bytes that can go in one PRD entry ($ER$4 MiB). Section 4.2.3.3 Fig. 17 (DBC) +#define AHCI_PRDT_MAX_BLOCKS (U16_MAX + 1) //Max blocks you can transfer in one command. +#define AHCI_PRDT_MAX_LEN 8 //Max PRD entries in one command. This is equal to (MAX_BLOCKS * BLK_SIZE) ö MAX_BYTES. + +//Global Host Control (Controller) flags +#define AHCI_GHCf_HBA_RESET 0 +#define AHCI_GHCf_INTERRUPT_ENABLE 1 +#define AHCI_GHCf_AHCI_ENABLE 31 + +#define AHCI_CAPSf_S64A 31 //Supports 64-bit Addressing + +#define AHCI_CAPSEXTf_BOH 0 //Supports BIOS/OS Handoff +#define AHCI_CAPSEXTf_NVMP 1 //NVMHCI Supported & Present + +//BIOS/OS Handoff Control +#define AHCI_BOHCf_BOS 0 //BIOS-Owned Semaphore (BIOS owns controller) +#define AHCI_BOHCf_OOS 1 //OS-Owned Semaphore (OS owns controller) +#define AHCI_BOHCf_BB 4 //BIOS Busy (polling bit while BIOS cleans up things after ownership transfer) + +//Command Header flags +#define AHCI_CH_DESCf_A 5 //'ATAPI' bit. Set when ATAPI command is being sent. +#define AHCI_CH_DESCF_A (1 << AHCI_CH_DESCf_A) +#define AHCI_CH_DESCf_W 6 //'Write' bit. Set when data is being written. +#define AHCI_CH_DESCF_W (1 << AHCI_CH_DESCf_W) + +//Command FIS flags +#define AHCI_CF_DESCf_C 7 //'Command' bit. Set when FIS is an ATA command. +#define AHCI_CF_DESCF_C (1 << AHCI_CF_DESCf_C) + +//Port register flags +//Command and Status register flags +#define AHCI_PxCMDf_ST 0 //'Start'. Start processing commmand list. FRE must be set before. +#define AHCI_PxCMDf_SUD 1 //'Spin-Up Device'. For devices that support Staggered Spin-up. We attempt to set it for all ports. +#define AHCI_PxCMDf_POD 2 //'Power-On Device'. For devices that support Cold Presence. We attempt to set it for all ports. +#define AHCI_PxCMDf_FRE 4 //'FIS Receive Enable'. Allows the processing of FISes. +#define AHCI_PxCMDf_FR 14 //'FIS receive Running'. Status indicator for FRE. +#define AHCI_PxCMDf_CR 15 //'Command list Running'. Status indicator for ST. +#define AHCI_PxCMDf_ATAPI 24 //'Device is ATAPI'. When set, HBA turns on desktop LED when device is in use. For ATAPI devices. +#define AHCI_PxCMDF_ST (1 << AHCI_PxCMDf_ST) +#define AHCI_PxCMDF_SUD (1 << AHCI_PxCMDf_SUD) +#define AHCI_PxCMDF_POD (1 << AHCI_PxCMDf_POD) +#define AHCI_PxCMDF_FRE (1 << AHCI_PxCMDf_FRE) +#define AHCI_PxCMDF_FR (1 << AHCI_PxCMDf_FR) +#define AHCI_PxCMDF_CR (1 << AHCI_PxCMDf_CR) +#define AHCI_PxCMDF_ATAPI (1 << AHCI_PxCMDf_ATAPI) + +//Task File Data register flags +#define AHCI_PxTFDf_STS_ERR 0 // Error Bit of Status register + +//Signature types +#define AHCI_PxSIG_ATA 0x00000101 +#define AHCI_PxSIG_ATAPI 0xEB140101 +#define AHCI_PxSIG_SEMB 0xC33C0101 //Enclosure Management Bridge... rare to encounter in wild. +#define AHCI_PxSIG_PM 0x96690101 //Port multiplier... not relevant to PC-type systems. + +//Interrupt flags (same in PxIE and PxIS) +#define AHCI_PxIf_OFS 24 //Overflow Status +#define AHCI_PxIf_INFS 26 //SATA Interface Non-Fatal Error +#define AHCI_PxIf_IFS 27 //SATA Interface Fatal Error +#define AHCI_PxIf_HBDS 28 //Host Bus Data Error +#define AHCI_PxIf_HBFS 29 //Host Bus Fatal Error +#define AHCI_PxIf_TFE 30 //Task File Error, see $LK,"ATAS_ERR",A="MN:ATAS_ERR"$. +#define AHCI_PxIf_CPDS 31 //Cold Port Detect Status + +//COMRESET flags +//SATA Control register flags +#define AHCI_PxSCTLf_DET_INIT 1 +#define AHCI_PxSCTLF_DET_INIT (1 << AHCI_PxSCTLf_DET_INIT) +//SATA Status register flags +#define AHCI_PxSSTSF_DET_PRESENT 3 + +//SATA Error register flags +#define AHCI_PxSERR_ERR_I 0 // Recovered Data Integrity Error +#define AHCI_PxSERR_ERR_M 1 // Recovered Communication Error +#define AHCI_PxSERR_ERR_T 8 // Transient Data Integrity Error +#define AHCI_PxSERR_ERR_C 9 // Persistent Communication Error +#define AHCI_PxSERR_ERR_P 10 // SATA Protocol Error +#define AHCI_PxSERR_ERR_E 11 // Internal Error +#define AHCI_PxSERR_DIAG_I 17 // Phy Internal Error +#define AHCI_PxSERR_DIAG_C 21 // Link Layer CRC Error +#define AHCI_PxSERR_DIAG_H 22 // Handshake Error +#define AHCI_PxSERR_DIAG_S 23 // Link Sequence Error +#define AHCI_PxSERR_DIAG_T 24 // Transport State Transition Error + +class CAHCIPort +{//Port register layout + U32 cmd_list_base, + cmd_list_base_upper, + fis_base, + fis_base_upper, + interrupt_status, + interrupt_enable, + command, + reserved, + task_file_data, + signature, + sata_status, + sata_ctrl, + sata_error, + sata_active, + cmd_issue, + sata_notif, + fis_switch_ctrl, + device_sleep; + U8 reserved[40], + vendor[16]; +}; + +class CAHCIHba +{//HBA register layout + U32 caps, + ghc, //Global Host Control + interrupt_status, + ports_implemented, + version, + ccc_ctrl, //Command Completion Coalescing + ccc_ports, + em_location,//Enclosure Management + em_ctrl, + caps_ext, + bohc; + U8 reserved[116], + vendor[96]; + CAHCIPort ports[32]; +}; + +#define FISt_H2D 0x27 + +class CFisH2D +{//Host To Device + U8 type, + desc, //We are concerned with bit #7 ($LK,"AHCI_CF_DESCf_C",A="MN:AHCI_CF_DESCf_C"$) 1=command, 0=control. + command, + feature_low, + lba0, + lba1, + lba2, + device, + lba3, + lba4, + lba5, + feature_high; + U16 count; + U8 icc, + ctrl; + U32 reserved; +}; + +class CFisReceived +{ + U8 dma_fis[28], + reserved[4], + pio_fis[20], + reserved[12], + r_fis[20], + reserved[4], + devbits_fis[8], + unknown_fis[64], + reserved[96]; +}; + +class CPrdtEntry +{ + U32 data_base, + data_base_upper, + reserved, + data_byte_count; //bit 31 is "Interrupt on Completion". bits 21:0 are the actual count. +}; + +/* +Bits of first U32: + 4:0 - Command FIS Length, in U32s + 5 - ATAPI bit (A) for ATAPI command + 6 - Write bit (W) for write commands $LK,"AHCI_CH_DESCf_W",A="MN:AHCI_CH_DESCf_W"$ 1=write 0=read + 7 - Prefetchable (P) + 8 - Reset (R) + 9 - Built-in Self Test (BIST) + 10 - Clear busy upon R_OK + 11 - Reserved + 15:12 - Port Multiplier Port (PMP) + 31:16 - Physical Region Descriptor Table Length (PRDTL) +*/ +class CPortCmdHeader +{//What the CAHCIPort.cmd_list consists of. + U16 desc, + prdt_len; + U32 prd_byte_count, + cmd_table_base, + cmd_table_base_upper, + reserved[4]; +}; + +class CPortCmdTable +{ + U8 cmd_fis[64], + acmd[16], + reserved[48]; + CPrdtEntry prdt[8]; +}; + +class CAtapiReadCmd +{ + U8 command, + reserved; + U32 lba, + count; + U8 reserved, + ctrl, + zero[4]; +}; + +class CAtapiWriteCmd +{ + U8 command, + reserved; + U32 lba; + U8 reserved; + U16 count; +}; + +class CAtapiCloseCmd +{ + U8 command, + reserved, + code, + reserved; + U16 track_num; +}; + +class CAtapiModeHeader +{ + U16 data_length; + U8 reserved[4]; + U16 block_desc_len; +}; + +class CAtapiModeWritePage +{ + U8 code, //0 + length, + type, + mode, + block_type, + link_size, + reserved, + host_app_code, + session_format, + reserved; // 9 + U32 packet_size; // 10-13 + U16 audio_pause_length;// 14-15 + U8 media_catalog_num[16],//16-31 + recording_code[16],//32-47 + sub_0, + sub_1, + sub_2, + sub_3; +}; + +class CAtapiModeWriteList +{ + CAtapiModeHeader header; + CAtapiModeWritePage page; +}; + +//ATA_IDENTIFY command array indexes (array of U16s) +#define ATA_IDENT_SERIAL_NUM 10 +#define ATA_IDENT_MODEL_NUM 27 +#define ATA_IDENT_LBA48_CAPACITY 100 + +//See $LK,"::/Doc/Credits.DD"$. +#define ATA_NOP 0x00 +#define ATA_DEV_RST 0x08 +#define ATA_PACKET 0xA0 +#define ATA_READ_NATIVE_MAX 0xF8 +#define ATA_READ_NATIVE_MAX_EXT 0x27 +#define ATA_SET_MAX 0xF9 +#define ATA_SET_MAX_EXT 0x37 +#define ATA_READ_MULTI 0xC4 +#define ATA_READ_MULTI_EXT 0x29 +#define ATA_READ_DMA_EXT 0x25 +#define ATA_WRITE_MULTI 0xC5 +#define ATA_WRITE_MULTI_EXT 0x39 +#define ATA_WRITE_DMA_EXT 0x35 +#define ATA_IDENTIFY 0xEC +#define ATA_IDENTIFY_PACKET 0xA1 // IDENTIFY PACKET DEVICE, mirror of ATA_IDENTIFY for ATAPI + +#define ATAPI_FORMAT_UNIT 0x0400 +#define ATAPI_START_STOP_UNIT 0x1B00 +#define ATAPI_READ_CAPACITY 0x2500 +#define ATAPI_SEEK 0x2B00 +#define ATAPI_SYNC_CACHE 0x3500 +#define ATAPI_MODE_SELECT 0x5500 +#define ATAPI_CLOSE_TRACK_SESSION 0x5B00 +#define ATAPI_BLANK 0xA100 +#define ATAPI_READ 0xA800 +#define ATAPI_WRITE 0x2A00 +#define ATAPI_SET_CD_SPEED 0xBB00 + +#define ATAS_ERR 0x01 +#define ATAS_DRQ 0x08 +#define ATAS_DF 0x20 +#define ATAS_DRDY 0x40 +#define ATAS_BSY 0x80 + +#define ATAR0_DATA 0 +#define ATAR0_FEAT 1 +#define ATAR0_NSECT 2 +#define ATAR0_SECT 3 +#define ATAR0_LCYL 4 +#define ATAR0_HCYL 5 +#define ATAR0_SEL 6 +#define ATAR0_STAT 7 +#define ATAR0_CMD 7 +#define ATAR1_CTRL 2 + +#help_index "File/FileNames" +#define FILEMASK_JIT "*.ZC*;*.HH*" +#define FILEMASK_AOT "*.ZC*;*.HH*;*.PRJ*" +#define FILEMASK_SRC "*.ZC*;*.HH*;*.IN*;*.PRJ*" +#define FILEMASK_DD FILEMASK_SRC ";*.DD*" +#define FILEMASK_TXT FILEMASK_DD ";*.TXT*;*.CFG*" +#define FILEMASK_GR "*.GR*" + +#help_index "File/Low Level" +#define BLK_SIZE_BITS 9 +#define BLK_SIZE (1 << BLK_SIZE_BITS) +#define DVD_BLK_SIZE (4 * BLK_SIZE) +#define DVD_BOOT_LOADER_SIZE DVD_BLK_SIZE * 1 +#define INVALID_CLUS (-1) + +class CMBRPart +{ + U8 active, //0x80=active 0x00=inactive + start_head; + U16 start_cyl; + U8 type, + end_head; + U16 end_cyl; + U32 offset, //Sectors between MBR and first sector + size; //Sectors in drive +}; + +class CMasterBoot +{ + U8 code[440]; + U32 media_id; + U16 zero; + CMBRPart p[4]; + U16 signature; //AA55 +}; + +class CRedSeaBoot +{ + U8 jump_and_nop[3], + signature, reserved[4]; //MBR_PT_REDSEA=0x88. Distinguish from real FAT32 + I64 drv_offset, //For CD/DVD image copy. + sects, + root_clus, + bitmap_sects, + unique_id; + U8 code[462]; + U16 signature2; //0xAA55 +}; + +class CFAT32Boot +{ + U8 jump_and_nop[3], + oem_name[8]; + U16 bytes_per_sect; + U8 sects_per_clus; + U16 reserved_sects; + U8 copies_of_fat; + U16 max_root_dir_entries, //Not used + old_sects_in_drive; //Not used + U8 media_desc; //F64 for hard disk + U16 old_sects_per_fat, //Not used + sects_per_track, + num_heads; + U32 hidden_sects, + sects, + sects_per_fat; + U16 flags, + version; + U32 root_clus; + U16 file_system_info_sect, + backup_boot_sect; + U8 reserved[12], + log_drive_num, + unused, + ext_signature; //0x29 + U32 serial_num; + U8 vol_name[11], + fat_name[8], + code[420]; + U16 signature; +}; + +class CFAT32FileInfoSect +{ + U32 signature1; + U8 unknown[480]; + U32 signature2, + free_clus, + most_recently_alloced; + U8 reserved[12]; + U32 signature3; +}; + +class CFAT32DirEntry +{ + U8 name[11], + attr, + NTres, + CrtTimeTenth; + U16 CrtTime, + CrtDate, + ListAccDate, + clus_hi, + WrtTime, + WrtDate, + clus_lo; + U32 size; +}; + +class CFAT32DirEntryLong +{ + U8 ord; + U16 name1[5]; + U8 attr, + type, + xsum; + U16 name2[6], + zero, + name3[2]; +}; + +#define FAT32_ENTRIES_PER_BLK (BLK_SIZE / sizeof(CFAT32DirEntry)) +#define FAT32_ENTRIES_BITS Bsf(FAT32_ENTRIES_PER_BLK) + +class CPalindromeU16 +{ + U16 little, big; +}; + +class CPalindromeU32 +{ + U32 little, big; +}; + +class CISODate +{ + U8 year, mon, day, hour, min, sec, sec100; +}; + +class CISODirEntry +{ + U8 len, ext_attr_len; + CPalindromeU32 loc; + CPalindromeU32 size; + CISODate date; + U8 flags, file_unit_size, interleave; + CPalindromeU16 vol_seq_num; + U8 name_len, name; +}; + +class CISOPathEntry +{ + U8 name_len, zero; + U32 blk; + U16 parent_entry_num, + name[1]; //Aligned to U16 boundaries +}; + +//ISO9660 +#define ISOT_BOOT_RECORD 0 +#define ISOT_PRI_VOL_DESC 1 +#define ISOT_SUPPLEMENTARY_DESC 2 +#define ISOT_VOL_DRIVE_DESC 3 +#define ISOT_TERMINATOR 255 + +class CISOPriDesc +{ + U8 type, + id[5], + version, + unused1, + system_id[32], + vol_id[32], + unused2[8]; + CPalindromeU32 vol_space_size; + U8 unused3[32]; + CPalindromeU16 vol_set_size; + CPalindromeU16 vol_seq_num; + CPalindromeU16 log_block_size; + CPalindromeU32 path_table_size; + U32 type_l_path_table, + opt_type_l_path_table, + type_m_path_table, + opt_type_m_path_table; + CISODirEntry root_dir_record; + U8 vol_set_id[128], + publisher_id[128], + preparer_id[128], + pad[307], + file_structure_version, + pad[1166]; +}; + +#define ISO_BASE_YEAR 1900 +#define ISO_ATTR_DIR 2 + +//Red Sea Attributes +//See $LK,"ST_FILE_ATTRS",A="MN:ST_FILE_ATTRS"$ +#define RS_ATTR_READ_ONLY 0x01 //R +#define RS_ATTR_HIDDEN 0x02 //H +#define RS_ATTR_SYSTEM 0x04 //S +#define RS_ATTR_VOL_ID 0x08 //V +#define RS_ATTR_DIR 0x10 //D +#define RS_ATTR_ARCHIVE 0x20 //A +#define RS_ATTR_LONG_NAME (RS_ATTR_READ_ONLY | RS_ATTR_HIDDEN | RS_ATTR_SYSTEM | RS_ATTR_VOL_ID) +#define RS_ATTR_LONG_NAME_MASK (RS_ATTR_LONG_NAME | RS_ATTR_DIR | RS_ATTR_ARCHIVE) +#define RS_ATTR_DELETED 0x100 //X +#define RS_ATTR_RESIDENT 0x200 //T +#define RS_ATTR_CONTIGUOUS 0x400 //C +#define RS_ATTR_FIXED 0x800 //F + +#help_index "File/CD DVD" +//Media types for $LK,"DVDImageWrite",A="MN:DVDImageWrite"$() +#define MT_CD 1 +#define MT_DVD 2 + +#help_index "File/Low Level;File/Program Routines" +//CDirEntry flags (Used by $LK,"FileMgr",A="MN:FileMgr"$()) +#define CDIR_FILENAME_LEN 38 //Must include terminator zero +public class CDirEntry +{ + CDirEntry *next, *parent, *sub; + U8 *full_name; + I64 user_data, user_data2; + + U0 start; + U16 attr; + U8 name[CDIR_FILENAME_LEN]; + I64 clus, size; + CDate datetime; +}; +#define CDIR_SIZE (sizeof(CDirEntry) - offset(CDirEntry.start)) + +#help_index "File/Program Routines" +//File Util Flags +//See $LK,"ST_FILE_UTIL_FLAGS",A="MN:ST_FILE_UTIL_FLAGS"$ +#define FUf_RECURSE 0 // r +#define FUf_DIFF 1 // d +#define FUf_DEL 1 // d +#define FUf_IGNORE 2 // i +#define FUf_ALL 3 // a +#define FUf_CANCEL 4 // c +#define FUf_REPLACE 5 // R +#define FUf_PUBLIC 6 // p +#define FUf_MAP 7 // m +#define FUf_SINGLE 8 // s +#define FUf_JUST_DIRS 9 // D +#define FUf_JUST_FILES 10 // F +#define FUf_JUST_TXT 11 // T +#define FUf_JUST_DD 12 // $$ +#define FUf_JUST_SRC 13 // S +#define FUf_JUST_AOT 14 // A +#define FUf_JUST_JIT 15 // J +#define FUf_JUST_GR 16 // G +#define FUf_CLUS_ORDER 17 // O (Move disk head one direction) +#define FUf_SCAN_PARENTS 18 // P +#define FUf_FLATTEN_TREE 19 // f +#define FUf_WHOLE_LABELS 20 // l +#define FUf_WHOLE_LABELS_BEFORE 21 // lb +#define FUf_WHOLE_LABELS_AFTER 22 // la + +#define FUF_RECURSE (1 << FUf_RECURSE) +#define FUF_DIFF (1 << FUf_DIFF) +#define FUF_DEL (1 << FUf_DEL) +#define FUF_IGNORE (1 << FUf_IGNORE) +#define FUF_ALL (1 << FUf_ALL) +#define FUF_CANCEL (1 << FUf_CANCEL) +#define FUF_REPLACE (1 << FUf_REPLACE) +#define FUF_PUBLIC (1 << FUf_PUBLIC) +#define FUF_MAP (1 << FUf_MAP) +#define FUF_SINGLE (1 << FUf_SINGLE) +#define FUF_JUST_DIRS (1 << FUf_JUST_DIRS) +#define FUF_JUST_FILES (1 << FUf_JUST_FILES) +#define FUF_JUST_TXT (1 << FUf_JUST_TXT) +#define FUF_JUST_DD (1 << FUf_JUST_DD) +#define FUF_JUST_SRC (1 << FUf_JUST_SRC) +#define FUF_JUST_AOT (1 << FUf_JUST_AOT) +#define FUF_JUST_JIT (1 << FUf_JUST_JIT) +#define FUF_JUST_GR (1 << FUf_JUST_GR) +#define FUF_CLUS_ORDER (1 << FUf_CLUS_ORDER) +#define FUF_SCAN_PARENTS (1 << FUf_SCAN_PARENTS) +#define FUF_FLATTEN_TREE (1 << FUf_FLATTEN_TREE) +#define FUF_WHOLE_LABELS (1 << FUf_WHOLE_LABELS) +#define FUF_WHOLE_LABELS_BEFORE (1 << FUf_WHOLE_LABELS_BEFORE) +#define FUF_WHOLE_LABELS_AFTER (1 << FUf_WHOLE_LABELS_AFTER) + +#define FUG_FILES_FIND (FUF_RECURSE | FUF_SINGLE | FUF_CLUS_ORDER | FUF_JUST_DIRS | FUF_JUST_FILES | FUF_JUST_TXT | \ + FUF_JUST_DD | FUF_JUST_SRC | FUF_JUST_AOT | FUF_JUST_JIT | FUF_JUST_GR | FUF_FLATTEN_TREE) +#define FUG_FILE_FIND (FUF_JUST_DIRS | FUF_JUST_FILES | FUF_SCAN_PARENTS) + +#help_index "File/Low Level" +//See $LK,"ST_BLKDEV_TYPES",A="MN:ST_BLKDEV_TYPES"$ +#define BDT_NULL 0 +#define BDT_RAM 1 +#define BDT_ATA 2 +#define BDT_ISO_FILE_READ 3 +#define BDT_ISO_FILE_WRITE 4 +#define BDT_ATAPI 5 +#define BDT_TYPES_NUM 6 + +#define BDf_REMOVABLE 0 +#define BDf_INITIALIZED 1 +#define BDf_READ_ONLY 2 +#define BDf_READ_ONLY_OVERRIDE 3 +#define BDf_LAST_WAS_WRITE 4 +#define BDf_READ_CACHE 5 +#define BDf_FORMAT 6 +#define BDf_INIT_IN_PROGRESS 7 +#define BDf_EXT_SIZE 8 +#define BDf_INTERNAL_BUF 9 + +#define BDF_REMOVABLE (1 << BDf_REMOVABLE) +#define BDF_INITIALIZED (1 << BDf_INITIALIZED) +#define BDF_READ_ONLY (1 << BDf_READ_ONLY) +#define BDF_READ_ONLY_OVERRIDE (1 << BDf_READ_ONLY_OVERRIDE) +#define BDF_LAST_WAS_WRITE (1 << BDf_LAST_WAS_WRITE) +#define BDF_READ_CACHE (1 << BDf_READ_CACHE) +#define BDF_FORMAT (1 << BDf_FORMAT) +#define BDF_INIT_IN_PROGRESS (1 << BDf_INIT_IN_PROGRESS) +#define BDF_EXT_SIZE (1 << BDf_EXT_SIZE) +#define BDF_INTERNAL_BUF (1 << BDf_INTERNAL_BUF) + +//locked flags +#define BDlf_LOCKED 0 + +#define BLKDEVS_NUM 26 +#define BD_SIGNATURE_VAL 'BDSV' + +public class CBlkDev +{ + CBlkDev *lock_fwding; //If two blkdevs on same controller, use just one lock + CTask *owning_task; + CAHCIPort *ahci_port; + U8 *prd_buf, + first_drive_let, + *RAM_disk, + *file_disk_name; + CFile *file_disk; + U32 bd_signature, + type, + flags, + blk_size, + max_reads, + max_writes; + I64 drv_offset, + init_root_dir_blks, + max_blk, + locked_flags, + port_num; + U16 *dev_id_record; + F64 last_time; +}; + +//Drive locked_flags +#define DVlf_LOCKED 0 + +//See $LK,"ST_DRIVE_TYPES",A="MN:ST_DRIVE_TYPES"$ +#define FSt_NULL 0 +#define FSt_REDSEA 1 //Supported +#define FSt_FAT32 2 //Supported except for short names, to some degree +#define FSt_ISO9660 3 //Supported (CD/DVD) +#define FSt_NTFS 4 //Not Supported +#define FSt_LINUX 5 //Not Supported +#define FSt_SWAP 6 //Not Supported +#define FSt_UNKNOWN 7 +#define FSt_TYPES_NUM 8 +#define FSG_TYPE_MASK 0x7FFF +//File system type flags +#define FStf_DISABLE 15 + +#define MBR_PT_FAT32a 0x0B +#define MBR_PT_FAT32b 0x0C +#define MBR_PT_FAT32c 0x1B +#define MBR_PT_FAT32d 0x1C +#define MBR_PT_FAT32e 0x8B +#define MBR_PT_FAT32f 0x8C +#define MBR_PT_NTFS 0x07 +#define MBR_PT_REDSEA 0x88 +#define MBR_PT_LINUX 0x83 +#define MBR_PT_SWAP 0x82 + +class CFreeList +{ + CFreeList *next, *last; + I64 start, size; +}; + +#define DRIVES_NUM 26 + +#define DRIVE_SIGNATURE_VAL 'DVSV' +public class CDrive +{ +//Don't access ->drv_let directly in case a drive has been remapped. + //Use $LK,"Drive2Letter",A="MN:Drive2Letter"$(). + I64 locked_flags; + U32 drive_signature; + U8 drv_let, pad; + U16 fs_type; + I64 drv_offset, + size, + prt_num, + file_system_info_sect, + fat1, fat2, + root_clus, + data_area, + spc; //sectors per cluster + CDate fat32_local_time_offset; + CTask *owning_task; + CBlkDev *bd; + + CFAT32FileInfoSect *fis; + I64 fat_blk_dirty, + cur_fat_blk_num; + U32 *cur_fat_blk; + CFreeList *next_free, *last_free; +}; + +#define DISK_CACHE_HASH_SIZE 0x2000 + +class CCacheBlk +{ + CCacheBlk *next_lru, *last_lru; + CCacheBlk *next_hash, *last_hash; + CDrive *drive; + I64 blk; + U8 body[BLK_SIZE]; +}; + +#help_index "File/System" +#define DEFAULT_ISO_FILENAME "::/Tmp/CDDVD.ISO" +#define DEFAULT_ISO_C_FILENAME "::/Tmp/CDDVD.ISO.C" + +public class CBlkDevGlobals +{ + CBlkDev *blkdevs; + CDrive *drvs, + *let_to_drive[32]; + CAHCIHba *ahci_hba; + U8 *default_iso_filename, //$TX,"\"::/Tmp/CDDVD.ISO\"",D="DEFAULT_ISO_FILENAME"$ + *default_iso_c_filename, //$TX,"\"::/Tmp/CDDVD.ISO.C\"",D="DEFAULT_ISO_C_FILENAME"$ + *tmp_filename, + *home_dir, + boot_drive_let, + first_hd_drive_let, + first_dvd_drive_let; + CCacheBlk *cache_base, + *cache_ctrl, + **cache_hash_table; + I64 cache_size, + read_count, + write_count, + mount_ide_auto_count, + cmd_slot_count, + ins_port;// Installed-from CD/DVD controller. + Bool dvd_boot_is_good, + ahci64; +}; + +#help_index "File/Internal" +public class CDirContext +{ + CDrive *old_dv, *drive; + U8 *old_dir, *mask; +}; + +#help_index "File/CFile" +#define FFB_NEXT_BLK I64_MAX + +#define FF_WRITE 1 +#define FF_NEW_FILE 2 +#define FF_BUF_DIRTY 4 +#define FF_NEEDS_WRITE 8 +#define FF_CONTIGUOUS 16 +#define FF_USE_OLD_DATETIME 32 + +public class CFile //See $LK,"::/Demo/Disk/DataBase.ZC"$. +{ + I64 flags; + CDirEntry de; + CDrive *drive; + I64 fblk_num, clus, file_clus_num, max_blk; + U8 *clus_buf; +}; + +#help_index "Memory/Heap" +#define _CONFIG_HEAP_DEBUG FALSE + +#if _CONFIG_HEAP_DEBUG +class CMemUnused +{ + CHeapCtrl *hc; + U8 *caller1, *caller2; + CMemUnused *next; + I64 size; +}; +class CMemUsed +{ + CHeapCtrl *hc; + U8 *caller1, *caller2; + CMemUsed *next, *last; + I64 size; + U0 start; +}; +#else +class CMemUnused +{ + U0 hc; + U0 caller1, caller2; + CMemUnused *next; + I64 size; +}; +class CMemUsed +{ + CHeapCtrl *hc; + U0 caller1, caller2; + U0 next, last; + I64 size; + U0 start; +}; +#endif + +#help_index "Memory/BlkPool" +#help_file "::/Doc/Pags" + +#define MBS_USED_SIGNATURE_VAL 'MBUs' +#define MBS_UNUSED_SIGNATURE_VAL 'MBUn' +class CMemBlk +{ + CMemBlk *next, *last; + U32 mb_signature, pags; +}; + +#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 MEM_PAG_BITS 9 +#define MEM_PAG_SIZE (1 << MEM_PAG_BITS) +#define MEM_HEAP_HASH_SIZE 1024 +#define MEM_FREE_PAG_HASH_SIZE 0x100 +//It is common to $LK,"MAlloc",A="MN:MAlloc"$() exact powers of two. There is some overhead. +//We add 1 pag, so a request is not rounded-up to next power of two. +#define MEM_EXTRA_HASH2_PAGS 1 + +#define MEM_SYSTEM_STACK (MEM_PAG_SIZE * 512) //Like 16384*MEM_PAG_SIZE +#define MEM_EXECUTIVE_STACK (MEM_PAG_SIZE * 512) +#define MEM_INTERRUPT_STACK (MEM_PAG_SIZE * 512) +#define MEM_DEFAULT_STACK (MEM_PAG_SIZE * 512) + +#define TASK_HASH_TABLE_SIZE (1 << 10) + +//locked flags +#define BPlf_LOCKED 0 +public class CBlkPool +{ + I64 locked_flags, alloced_u8s, used_u8s; + CMemBlk *mem_free_list, + *mem_free_2meg_list, //This is for Sup1CodeScraps/Mem/Mem2Meg.ZC. + *free_pag_hash[MEM_FREE_PAG_HASH_SIZE], + *free_pag_hash2[64 - MEM_PAG_BITS]; +}; + +#help_index "Memory/HeapCtrl" +//locked flags +#define HClf_LOCKED 0 + +#define HEAP_CTRL_SIGNATURE_VAL 'HcSV' +public class CHeapCtrl +{ + CBlkPool *bp; + U32 hc_signature, pad; + I64 locked_flags, alloced_u8s, used_u8s; + CTask *mem_task; + CMemBlk *next_mem_blk, *last_mem_blk; + CMemBlk *last_mergable; + CMemUnused *malloc_free_list; + CMemUsed *next_um, *last_um; + CMemUnused *heap_hash[MEM_HEAP_HASH_SIZE / sizeof(U8 *)]; +}; + +#help_index "Devices;Memory/Page Tables" +public class CDevGlobals +{ + CIDTEntry *idt; + U8 *mem64_ptr; + U8 *uncached_alias; //Alias of lowest 4Gig. + U8 mp_apic_ids[MP_PROCESSORS_NUM]; + CMemRange mem32_head; + CPCIDev pci_head; + U64 user_int_bitmap; +}; + +#help_index "Graphics/Color;Graphics/Device Contexts" +//Raster operations +#define ROPB_EQU 0x00 +#define ROPB_XOR 0x01 +#define ROPB_COLLISION 0x02 +#define ROPB_MONO 0x03 +#define ROPBF_HALF_RANGE_COLOR 0x10 +#define ROPBF_TWO_SIDED 0x20 +#define ROPBF_DITHER 0x40 +#define ROPBF_PROBABILITY_DITHER 0x80 + +#define ROP_EQU (ROPB_EQU << 8) +#define ROP_XOR (ROPB_XOR << 8) +#define ROP_COLLISION (ROPB_COLLISION << 8) +#define ROP_MONO (ROPB_MONO << 8) + +//These are just for $LK,"ROPF_PROBABILITY_DITHER",A="MN:ROPF_PROBABILITY_DITHER"$ +//See $LK,"DCLighting",A="MN:DCLighting"$(). +#define ROPF_HALF_RANGE_COLOR 0x1000 +#define ROPF_TWO_SIDED 0x2000 + +//These always go in the c1.rop of a CColorROPU32 +#define ROPF_DITHER 0x40000000 +#define ROPF_PROBABILITY_DITHER 0x80000000 + +#help_index "Graphics/Color" +#define TRANSPARENT 0xFF +#define BLACK 0 +#define BLUE 1 +#define GREEN 2 +#define CYAN 3 +#define RED 4 +#define PURPLE 5 +#define BROWN 6 +#define LTGRAY 7 +#define DKGRAY 8 +#define LTBLUE 9 +#define LTGREEN 10 +#define LTCYAN 11 +#define LTRED 12 +#define LTPURPLE 13 +#define YELLOW 14 +#define WHITE 15 + +#define COLORS_NUM 16 +#define COLOR_INVALID 16 +#define COLOR_MONO 0xFF + +public U16 class CColorROPU16 //Don't use this, use CColorROPU32 +{ + U8 color, rop; +}; +public U32 class CColorROPU32 +{ + CColorROPU16 c0, c1; +}; +#define COLORROP_COLORS_MASK 0x00FF00FF +#define COLORROP_NO_ROP0_MASK 0xFFFF00FF +#define COLORROP_BITS 16 +public U32 class CBGR24 +{ + U8 b, g, r, pad; +}; +public U32 class CBGR32 +{ + U8 b, g, r, a; +}; +public I64 class CBGR48 +{ + U16 b, g, r, pad; +}; + +#help_index "Keyboard Devices;Char/Input;StdIn" +#define KBD_PORT 0x60 +#define KBD_CTRL 0x64 + +#define KBDC_LED 0xED +#define KBDC_DISABLE_MS 0xA7 +#define KBDC_ENABLE_MS 0xA8 +#define KBDC_ENABLE_KBD 0xAE +#define KBDC_TYPEMATIC 0xF3 +#define KBDC_SCAN_CODES 0xF0 + +public class CKbdStateGlobals +{ + I64 scan_code, //See $LK,"scan codes",A="FI:::/Doc/CharOverview.DD"$ + last_down_scan_code, + count, //Count of keys pressed since boot. + timestamp, //Output: TSCGet when event. + new_key_timestamp; //Output: TSCGet when new key event. + CFifoU8 *fifo, *fifo2; //Private + CFifoI64 *scan_code_fifo; + U32 down_bitmap[8], //BitTest, $LK,"Bt",A="MN:Bt"$(), with a merged scan code. (Left and right shift merged, for example.) + down_bitmap2[8]; //BitTest, $LK,"Bt",A="MN:Bt"$(), with an unmerged scan code. + Bool reset, //Private: Reset KbdMouse + irqs_working; //Private +}; + +#help_index "Mouse" +public class CMouseHardStateGlobals +{ + CD3I64 pos, //Position in pixels + prescale, + raw_data; + CD3 scale; + F64 speed; //Output: How fast the user is moving it. + I64 timestamp, //Output: TSCGet when event. + install_attempts, //Private + pkt_size; //Private + CFifoU8 *fifo, *fifo2; //Private + Bool bttns[5], + raw_bttns[5], + raw_mode, + has_wheel, + has_ext_bttns, + enabled, + event, //Private + installed, //Private + install_in_progress, //Private + irqs_working; //Private +}; + +public class CMouseStateGlobals +{ + CD3I64 pos, //Position in pixels + pos_text, //Position in text rows,cols + presnap, + offset; + CD3 scale; + F64 speed; //Output: How fast the user is moving it. + I64 timestamp; //Output: TSCGet when event. + F64 dbl_time, //Input: Time threshold for calling it a double click. + left_dbl_time, //Private + right_dbl_time; //Private + Bool lb, //Left Button + rb, //Right Button + show, + has_wheel, + left_dbl, //Private + left_down_sent, //Private + right_dbl, //Private + right_down_sent; //Private +}; + +public class CGridGlobals +{ + Bool snap format "$$CB,\"Snap Grid\"$$\n", + show format "$$CB,\"Show Grid\"$$\n", + coord format "$$CB,\"Show Coordinates\"$$\n"; + U8 pad[5]; + F64 x format "$$DA-TRM,A=\"X Spacing:%6.3f\"$$\n", + y format "$$DA-TRM,A=\"Y Spacing:%6.3f\"$$\n", + z format "$$DA-TRM,A=\"Z Spacing:%6.3f\"$$\n", + x_offset format "$$DA-TRM,A=\"X Offset :%6.3f\"$$\n", + y_offset format "$$DA-TRM,A=\"Y Offset :%6.3f\"$$\n", + z_offset format "$$DA-TRM,A=\"Z Offset :%6.3f\"$$\n", + x_speed format "$$DA-TRM,A=\"X Speed :%6.3f\"$$\n", + y_speed format "$$DA-TRM,A=\"Y Speed :%6.3f\"$$\n", + z_speed format "$$DA-TRM,A=\"Z Speed :%6.3f\"$$\n"; +}; + +#help_index "Ctrls" +#define CTRLT_GENERIC 0 +#define CTRLT_WIN_HSCROLL 1 //unique +#define CTRLT_WIN_VSCROLL 2 //unique +#define CTRLT_VIEWING_ANGLES 3 //unique + +#define CTRLF_SHOW 1 +#define CTRLF_BORDER 2 +#define CTRLF_CAPTURE_LEFT_MS 4 +#define CTRLF_CAPTURE_RIGHT_MS 8 +#define CTRLF_CLICKED 16 + +#define WSSf_SET_TO_POS 0 + +public class CWinScroll +{ + I64 min, pos, max; + U32 flags; + U8 color, pad[3]; +}; + +public class CViewAngles +{ + I64 sx, sy, sz; + F64 ax, ay, az; + CColorROPU32 cx, cy, cz, cbd, cbg, config; +}; + +public class CCtrl +{ + CCtrl *next, *last; + CTask *win_task; + I64 type, flags; + + //win pix coordinates + I64 left, right, top, bottom; + + //screen pix coordinates (derived) + I64 screen_left, screen_right, screen_top, screen_bottom; + + U8 *state; + + //called on resize + U0 (*update_derived_vals)(CCtrl *c); + U0 (*draw_it)(CDC *dc, CCtrl *c); + + Bool (*inside_ctrl)(CCtrl *c, I64 x, I64 y); //For nonbox shapes + U0 (*left_click)( CCtrl *c, I64 x, I64 y, Bool down); + U0 (*right_click)(CCtrl *c, I64 x, I64 y, Bool down); + U0 (*wheel_chg)( CCtrl *c, I64 delta); +}; + +#help_index "Menus" +public class CMenuEntry +{ + CMenuEntry *next; + CMenuEntry *sub; + U8 name[32]; + I64 message_code, arg1, arg2; + Bool checked, dir, pad[6]; +}; + +public class CMenu +{ + CMenu *next; + CMenuEntry *sub; + CTask *task; + I64 flags; + U8 attr, pad[7]; +}; + +#help_index "Task" +class CBpt +{ + CBpt *next; + U8 *addr, + val, pad[7]; +}; + +class CExcept +{ + CExcept *next, *last; + I64 handler_catch, handler_untry, + rsp, rbp, rflags, rsi, rdi, r10, r11, r12, r13, r14, r15; +}; + +class CFPU +{ + U8 body[512]; +}; + +#help_index "Job/Exe;Task/Job/Exe" +#define JOBf_WAKE_MASTER 0 +#define JOBf_FOCUS_MASTER 1 +#define JOBf_EXIT_ON_COMPLETE 2 +#define JOBf_DONT_FILTER 3 +#define JOBf_HIGHEST_PRIORITY 4 +//MP flags +#define JOBf_DONE 5 +#define JOBf_DISPATCHED 6 +#define JOBf_FREE_ON_COMPLETE 7 +#define JOBf_ADD_TO_QUE 8 + +#define JOBT_TEXT_INPUT 0 //$LK,"TaskText",A="MN:TaskText"$() Feed StdIn +#define JOBT_MESSAGE 1 //$LK,"TaskMessage",A="MN:TaskMessage"$() Post message +#define JOBT_EXE_STR 2 //$LK,"TaskExe",A="MN:TaskExe"$() Compile & execute src code text +//MP cmds +#define JOBT_CALL 3 //$LK,"JobQueue",A="MN:JobQueue"$() Tell MP to call function +#define JOBT_SPAWN_TASK 4 //$LK,"Spawn",A="MN:Spawn"$() Tell MP to spawn task + +class CJob +{ + CJob *next, *last; + CJobCtrl *ctrl; + I64 job_code, flags, message_code; + + I64 (*addr)(U8 *fun_arg); + U8 *fun_arg; + + U8 *aux_str; + I64 aux1, aux2, //Sometimes called arg1 and arg2. (Windows message param1 param2) + res; + + CTask *spawned_task, + *master_task; +}; + +#define JOBCf_LOCKED 0 +class CJobCtrl +{ + CJob *next_waiting, *last_waiting; + CJob *next_done, *last_done; + I64 flags; +}; + +#help_index "Messages" +//See $LK,"::/Demo/MessageLoop.ZC"$ +#define MESSAGE_NULL 0 +#define MESSAGE_CMD 1 +#define MESSAGE_KEY_DOWN 2 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press +#define MESSAGE_KEY_UP 3 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press +#define MESSAGE_MS_MOVE 4 //(x,y) +#define MESSAGE_MS_L_DOWN 5 //(x,y) +#define MESSAGE_MS_L_UP 6 //(x,y) +#define MESSAGE_MS_L_D_DOWN 7 //(x,y) +#define MESSAGE_MS_L_D_UP 8 //(x,y) +#define MESSAGE_MS_R_DOWN 9 //(x,y) +#define MESSAGE_MS_R_UP 10 //(x,y) +#define MESSAGE_MS_R_D_DOWN 11 //(x,y) +#define MESSAGE_MS_R_D_UP 12 //(x,y) + +//Fake messages used to send both an up and down. +#define MESSAGE_KEY_DOWN_UP -2 //Down & UP +#define MESSAGE_MS_L_DOWN_UP -5 //Down & Up +#define MESSAGE_MS_L_D_DOWN_UP -7 //Down & Up +#define MESSAGE_MS_R_DOWN_UP -9 //Down & Up +#define MESSAGE_MS_R_D_DOWN_UP -11 //Down & Up + +#help_index "Task/Settings" +#define TSF_SAME_SONG 1 +public class CTaskSettings +{ + CTaskSettings *next; + U8 *cur_dir; + I64 left, right, top, bottom; + U0 (*draw_it)(CTask *task, CDC *dc); + U0 (*task_end_cb)(); + CTask *song_task, *animate_task; + I64 scroll_x, scroll_y, scroll_z; + CBGR24 palette[COLORS_NUM]; + U32 win_inhibit; + U8 text_attr, title_src, + border_attr, border_src, + task_title[STR_LEN]; + Bool border, hide_cursor, highlight_cursor, scroll, autocomplete, pad[3]; +#assert !($$ & 7) +}; + +#help_index "Task" +//CTask.border_src +#define BDS_CONST 0 +#define BDS_CUR_DRIVE 1 +#define BDS_ED_FILENAME_DRIVE 2 + +//CTask.title_src +#define TTS_CONST 0 +#define TTS_LOCKED_CONST 1 //This is not strictly enforced +#define TTS_TASK_NAME 2 +#define TTS_ED_FILENAME 3 +#define TTS_CUR_LEX 4 + +//CTask.task_flags +//See $LK,"ST_TASK_FLAGS",A="MN:ST_TASK_FLAGS"$ +#define TASKf_TASK_LOCK 0 +#define TASKf_KILL_TASK 1 +#define TASKf_SUSPENDED 2 +#define TASKf_IDLE 3 +#define TASKf_CMD_LINE_PROMPT 4 +#define TASKf_INPUT_FILTER_TASK 5 +#define TASKf_FILTER_INPUT 6 +#define TASKf_HAS_SONG 7 +#define TASKf_DISABLE_BPTS 8 +#define TASKf_AWAITING_MESSAGE 9 +#define TASKf_BREAK_LOCKED 10 +#define TASKf_PENDING_BREAK 11 +#define TASKf_BREAK_TO_SHIFT_ESC 12 +#define TASKf_KILL_AFTER_DEBUG 13 +#define TASKf_NONTIMER_RAND 14 +#define TASKf_FLAGS_NUM 15 + +//CTask.display_flags +#define DISPLAYf_SHOW 0 +#define DISPLAYf_NOT_RAW 1 +#define DISPLAYf_SILENT 2 +#define DISPLAYf_NO_BORDER 3 +#define DISPLAYf_WIN_ON_TOP 4 +#define DISPLAYf_CHILDREN_NOT_ON_TOP 5 +#define DISPLAYf_FLAGS_NUM 6 + +#define TASK_SIGNATURE_VAL 'TskS' +#define TASK_NAME_LEN 32 +#define TASK_EXCEPT_CALLERS 8 +class CTaskStack +{ + CTaskStack *next_stack; + I64 stack_size, stack_ptr; + U0 stack_base; +}; + +#define DYING_JIFFIES ToI64(JIFFY_FREQ / 5) +class CTaskDying +{ + CTask *next, *last; + I64 wake_jiffy; +}; + +public class CTask //The Fs segment register points to current CTask. +{ + CTask *addr; //Self-addressed pointer + U32 task_signature, win_inhibit; +#assert $$ == offset(CTaskDying.wake_jiffy) + I64 wake_jiffy; + U32 task_flags, display_flags; + + CHeapCtrl *code_heap, *data_heap; + + CDoc *put_doc, *display_doc, //When double buffering, these two differ. + *border_doc; + I64 win_left, win_right, win_top, win_bottom; + + CDrive *cur_dv; + U8 *cur_dir; + + CTask *parent_task, + *next_task, *last_task, + *next_input_filter_task, *last_input_filter_task, + *next_sibling_task, *last_sibling_task, + *next_child_task, *last_child_task; + + //These are derived from left,top,right,bottom + I64 win_width, win_height, + pix_left, pix_right, pix_width, //These are in pixs, not characters + pix_top, pix_bottom, pix_height, + scroll_x, scroll_y, scroll_z; + + //These must be in this order + //for $LK,"TASK_CONTEXT_SAVE",A="FF:::/Kernel/Sched.ZC,TASK_CONTEXT_SAVE"$ and $LK,"_TASK_CONTEXT_RESTORE",A="FF:::/Kernel/Sched.ZC,_TASK_CONTEXT_RESTORE"$ + I64 rip, rflags, rsp, rsi, rax, rcx, rdx, rbx, rbp, rdi, r8, r9, r10, r11, r12, r13, r14, r15; + CCPU *gs; + CFPU *fpu_mmx; + I64 swap_counter; + + U0 (*draw_it)(CTask *task, CDC *dc); + + U8 task_title[STR_LEN], + task_name[TASK_NAME_LEN], + wallpaper_data[4096], + + title_src, border_src, + text_attr, border_attr; + U16 win_z_num, pad; + + CTaskStack *stack; + + CExcept *next_except, *last_except; + I64 except_rbp, //throw routine's RBP + except_ch; //throw(ch) + U8 *except_callers[TASK_EXCEPT_CALLERS]; + + Bool catch_except; + Bool new_answer; + U8 answer_type, pad[5]; + I64 answer; + F64 answer_time; + CBpt *bpt_list; + CCtrl *next_ctrl, *last_ctrl; + CMenu *cur_menu; + CTaskSettings *next_settings; + CMathODE *next_ode, *last_ode; + F64 last_ode_time; + CHashTable *hash_table; + + CJobCtrl server_ctrl; + CCompCtrl *next_cc, *last_cc; + CHashFun *last_fun; + + U0 (*task_end_cb)(); + CTask *song_task, *animate_task; + I64 rand_seed, + task_num, + fault_num, fault_err_code; + CTask *popup_task, + *debug_task; + CWinScroll horz_scroll, vert_scroll; + + I64 user_data; +#assert !($$ & 7) +}; + +class CTSS +{ + U32 res1; + I64 rsp0, rsp1, rsp2, res2, + ist1, ist2, ist3, ist4, ist5, ist6, ist7, res3; + U16 res4, io_map_offset; + U8 io_map[0x10000/8]; + I64 *st0, *st1, *st2; + U16 tr, tr_ring3; +}; + +#define ans (Fs->answer) +#define ansf (Fs->answer(F64)) + +#define _RAX Fs->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 + +#help_index "MultiCore" +#define CPUf_RAN_A_TASK 0 +#define CPUf_DYING_TASK_QUE 1 + +public class CCPU //The Gs segment register points to current CCPU. +{ + CCPU *addr; //Self-addressed pointer + I64 num, cpu_flags, + startup_rip, + idle_pt_hits; + F64 idle_factor; + I64 total_jiffies; + CTask *executive_task, *idle_task; + I64 tr, //task reg + swap_counter; + U0 (*profiler_timer_irq)(CTask *task); + CTaskDying *next_dying, *last_dying; + I64 kill_jiffy; + CTSS *tss; + I64 start_stack[16]; +#assert !($$ & 7) +}; + +#help_index "Memory/Page Tables" +#define MEM_MIN_MEG 256 //256 Meg minimum. + +#define SYS_FIXED_AREA 0x100000 +#define SYS_16MEG_AREA_LIMIT 0x1000000 +public class CSysFixedArea +{ + CFPU init_fpu_mmx; + CCPU boot_cpu; + CTask system; + CBlkPool sys_code_bp; + CHeapCtrl system_hc; + $$ = ($$ + 0x1000 - 1) & -0x1000; +}; + +#help_index "Char" +#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_ESC 0x1B +#define CH_SHIFT_ESC 0x1C +#define CH_SPACE 0x20 + +#define ST_ERR_ST "$$RED$$$$BK,1$$ERROR:$$FG$$$$BK,0$$ " +#define ST_WARN_ST "$$LTRED$$$$BK,1$$WARNING:$$FG$$$$BK,0$$ " + +//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_MS_L_DOWN 16 +#define SCf_MS_R_DOWN 17 +#define SCf_DELETE 18 +#define SCf_INS 19 +#define SCf_NO_SHIFT 30 +#define SCf_KEY_DESC 31 +#define SCF_E0_PREFIX (1 << SCf_E0_PREFIX) +#define SCF_KEY_UP (1 << SCf_KEY_UP) +#define SCF_SHIFT (1 << SCf_SHIFT) +#define SCF_CTRL (1 << SCf_CTRL) +#define SCF_ALT (1 << SCf_ALT) +#define SCF_CAPS (1 << SCf_CAPS) +#define SCF_NUM (1 << SCf_NUM) +#define SCF_SCROLL (1 << SCf_SCROLL) +#define SCF_NEW_KEY (1 << SCf_NEW_KEY) +#define SCF_MS_L_DOWN (1 << SCf_MS_L_DOWN) +#define SCF_MS_R_DOWN (1 << SCf_MS_R_DOWN) +#define SCF_DELETE (1 << SCf_DELETE) +#define SCF_INS (1 << SCf_INS) +#define SCF_NO_SHIFT (1 << SCf_NO_SHIFT) +#define SCF_KEY_DESC (1 << SCf_KEY_DESC) + +//ZealOS places a 1 in bit 7 for +//keys with an E0 prefix. +//See $LK,"::/Doc/CharOverview.DD"$ and $LK,"KbdHandler",A="MN:KbdHandler"$(). +#define SC_ESC 0x01 +#define SC_BACKSPACE 0x0E +#define SC_TAB 0x0F +#define SC_ENTER 0x1C +#define SC_SHIFT 0x2A +#define SC_CTRL 0x1D +#define SC_ALT 0x38 +#define SC_CAPS 0x3A +#define SC_NUM 0x45 +#define SC_SCROLL 0x46 +#define SC_CURSOR_UP 0x48 +#define SC_CURSOR_DOWN 0x50 +#define SC_CURSOR_LEFT 0x4B +#define SC_CURSOR_RIGHT 0x4D +#define SC_PAGE_UP 0x49 +#define SC_PAGE_DOWN 0x51 +#define SC_HOME 0x47 +#define SC_END 0x4F +#define SC_INS 0x52 +#define SC_DELETE 0x53 +#define SC_F1 0x3B +#define SC_F2 0x3C +#define SC_F3 0x3D +#define SC_F4 0x3E +#define SC_F5 0x3F +#define SC_F6 0x40 +#define SC_F7 0x41 +#define SC_F8 0x42 +#define SC_F9 0x43 +#define SC_F10 0x44 +#define SC_F11 0x57 +#define SC_F12 0x58 +#define SC_PAUSE 0x61 +#define SC_GUI 0xDB +#define SC_PRINTSCREEN1 0xAA +#define SC_PRINTSCREEN2 0xB7 + +#help_index "Char;Debugging/Raw Output;TextBase Layer/Char" +//text.raw_flags +#define RAWF_IN_DOLLAR 1 +#define RAWF_LAST_DOLLAR 2 +#define RAWF_SHOW_DOLLAR 4 +#define RAWF_SCROLL 8 + +public class CTextGlobals +{ + I64 raw_col, raw_flags; + U32 *raw_screen, *fb_alias; + I64 rows, cols; //Use TEXT_ROWS,TEXT_COLS + U64 *font, *aux_font, screen_size, buffer_size; + U8 border_chars[16]; + Bool is_fb_busy; +}; + +#define FONT_WIDTH 8 +#define FONT_HEIGHT 8 + +#help_index "Graphics" +//z-values less than zero are in front of screen and not drawn. +//we want to shift all Z-values into a drawable range. +//GR_Z_ALL is set to half of the Z-range which is an I32. +#define GR_Z_ALL (I32_MAX/2) + +#help_index "Graphics/Device Contexts" +//Low 8 bits reserved for flags that go into saved bitmaps +#define DCF_PALETTE 1 +#define DCF_NO_TRANSPARENTS 2 //Can be used to optimized $LK,"GrBlot",A="MN:GrBlot"$(). + +#define DCF_TRANSFORMATION 0x100 + +//See $LK,"DCSymmetrySet",A="MN:DCSymmetrySet"$() or $LK,"DCSymmetry3Set",A="MN:DCSymmetry3Set"$() +#define DCF_SYMMETRY 0x200 + +//Must be used with DCF_SYMMETRY set also. +//See $LK,"::/Demo/Games/BigGuns.ZC"$ +#define DCF_JUST_MIRROR 0x400 + +#define DCF_LOCATE_NEAREST 0x800 +#define DCF_DONT_DRAW 0x1000 +#define DCF_ALIAS 0x2000 +#define DCF_SCREEN_BITMAP 0x4000 +#define DCF_FILL_NOT_COLOR 0x8000 +#define DCF_RECORD_EXTENTS 0x10000 +#define DCF_ON_TOP 0x20000 + +//$LK,"DCSave",A="MN:DCSave"$() flags. +#define DCSF_PALETTE_GET 1 + +#define DCS_SIGNATURE_VAL 'DvCS' + +class CGrSym +{ + I32 sx, sy, sz, pad; +//Normal of symmetry plane + I64 snx, sny, snz; +}; + +public class CDC +{ + U0 start; + CDate cdt; + I32 x0, y0, + width, width_internal, + height, + flags; + U0 end; + CBGR24 palette[COLORS_NUM]; + + //public (Change directly) + CColorROPU32 color, + bkcolor, //Set for use with $LK,"ROP_COLLISION",A="MN:ROP_COLLISION"$ + color2; //Internally used for $LK,"GrFloodFill",A="MN:GrFloodFill"$() + CD3I32 ls; //Light source (should be normalized to 65536). + + //dither_probability_u16 is basically a U16. + //It is activated by $LK,"ROPF_PROBABILITY_DITHER",A="MN:ROPF_PROBABILITY_DITHER"$. + //0x0000 =100% color.c0 + //0x8000 =50% color.c0 50% color.c1 + //0x10000=100% color.c1 + //See $LK,"::/Demo/Graphics/SunMoon.ZC"$ and $LK,"::/Demo/Graphics/Shading.ZC"$. + U64 dither_probability_u16; + + CDC *brush; + + //Set with $LK,"DCMat4x4Set",A="MN:DCMat4x4Set"$(). $LK,"Free",A="MN:Free"$() before setting. + I64 *r, //rotation matrix of quads decimal in lo + r_norm; //shifted 32 bits. Used for scaling thick + + //public (Change directly) + I32 x, y, z, + thick; + + //Can be changed from the default $LK,"DCTransform",A="MN:DCTransform"$() + U0 (*transform)(CDC *dc, I64 *x, I64 *y, I64 *z); + + //Can be changed from the default $LK,"DCLighting",A="MN:DCLighting"$() + U0 (*lighting)(CDC *dc, CD3I32 *p1, CD3I32 *p2, CD3I32 *p3, CColorROPU32 color); + + //Set by $LK,"DCSymmetrySet",A="MN:DCSymmetrySet"$() or $LK,"DCSymmetry3Set",A="MN:DCSymmetry3Set"$() + CGrSym sym; + + I32 cur_x, cur_y, cur_z, pad; + I64 collision_count; + + I64 nearest_dist, + min_x, max_x, min_y, max_y; //Set by $LK,"DCF_RECORD_EXTENTS",A="MN:DCF_RECORD_EXTENTS"$ (screen coordinates) + + U32 dc_signature, pad; + CTask *mem_task, *win_task; + CDC *alias; + U8 *body; + + //Set by $LK,"DCDepthBufAlloc",A="MN:DCDepthBufAlloc"$() + I32 *depth_buf; + I64 db_z; //private +#assert !($$ & 7) +}; + +#define "Char/Input;StdIn" +//StrGet flags +#define SGF_SHIFT_ESC_EXIT 1 //This kills task on +#define SGF_WITH_NEW_LINE 2 + +#define "Char/Operations" +//Flags for StrUtil and MStrUtil +#define SUF_REM_CTRL_CHARS 0x001 +#define SUF_REM_LEADING 0x002 +#define SUF_REM_TRAILING 0x004 +#define SUF_REM_SPACES 0x008 +#define SUF_SINGLE_SPACE 0x010 +#define SUF_TO_UPPER 0x020 +#define SUF_TO_LOWER 0x040 +#define SUF_S2T 0x080 +#define SUF_T2S 0x100 // Only works with MStrUtil +#define SUF_SCALE_INDENT 0x200 +#define SUF_SAFE_DOLLAR 0x400 + +//Flags for StrFind +#define SFF_IGNORE_CASE 1 +#define SFF_WHOLE_LABELS_BEFORE 2 +#define SFF_WHOLE_LABELS_AFTER 4 +#define SFG_WHOLE_LABELS (SFF_WHOLE_LABELS_BEFORE | SFF_WHOLE_LABELS_AFTER) + +//Flags for ListMatch +#define LMF_IGNORE_CASE 1 +#define LMF_EXACT 2 + +#help_index "Keyboard Devices/System" +#define KDF_HAS_DESCS 1 +class CKeyDevEntry +{ + CKeyDevEntry *next, *last; + I64 priority, flags; + Bool (*put_key)(I64 ch, I64 sc); + Bool (*put_s)(U8 *st); +}; + +class CKeyDevGlobals +{ + CKeyDevEntry put_key_head; + U0 (**fp_ctrl_alt_cbs)(I64 sc); + I64 ctrl_alt_in_irq_flags, + **ctrl_alt_ret_addr; //address of ret address on stack in kbd irq + U8 **ctrl_alt_no_shift_descs, **ctrl_alt_shift_descs, + desc[STR_LEN], + *handler; +}; + +#help_index "Sound" +#define PCSPKR 0x61 +#help_index "ScreenCast;Sound/AU Files" +public class CAUData +{//Format of AU files + CDate cdt; + I8 ona; +}; + +class CSoundData +{//Format recorded in mem + CSoundData *next, *last; + F64 tS; + I8 ona; +}; + +public class CScreenCastGlobals +{ + CSoundData sound_head; + CDate t0_now; + F64 t0_tS; + U8 *print_format; + CDC *dc, *dc2_alias; + Bool record, just_audio; + I8 ona; +}; + +#help_index "Debugging/FunSeg" +#define FUN_SEG_CACHE_SIZE 256 +class CFunSegCache +{ + I64 base, limit; + F64 time_stamp; + U8 str[1]; //FUN_SEG_CACHE_STR_LEN +$$ = 64; +}; +#define FUN_SEG_CACHE_STR_LEN (sizeof(CFunSegCache) - offset(CFunSegCache.str)) + +#help_index "Debugging" +class CMPCrash +{ + I64 cpu_num; + CTask *task; + I64 rip; + U8 *message; + I64 message_num; +}; + +public class CDebugGlobals +{ + CTask *focus_task; + U8 *message; + I64 message_num; + CMPCrash *mp_crash; + U8 *int_fault_code, + *fix_file_line; + CFunSegCache *fun_seg_cache; + I64 fun_seg_cache_index; + Bool panic; +}; + +#help_index "Boot" +//Boot related +#define BOOT_RAM_BASE 0x07C00 +#define BOOT_RAM_LIMIT 0x97000 +#define BOOT_STACK_SIZE BLK_SIZE + +#define BOOT_SRC_NULL 0 +#define BOOT_SRC_ROM 1 +#define BOOT_SRC_RAM 2 +#define BOOT_SRC_HARDDRIVE 3 +#define BOOT_SRC_DVD 4 + +// $LK,"In",A="MN:In"$("") StdIn for call to $LK,"BootHDIns",A="MN:BootHDIns"$(). +#define STD_DISTRO_DVD_CONFIG "TB\nScale2Mem(2048,0x40000)\nT\n\n\n\n" + +#help_index "Registry" +//Registry sys_message_flags. $LK,"RegOneTimePopUp",A="MN:RegOneTimePopUp"$() +#define ARf_FLOODFILL 0 +#define ARf_CSPRITE_INS_CLIP 1 +#define ARf_PLANAR_SYMMETRY 2 +#define ARf_PSALMODY_JUKEBOX 3 +#define ARf_MESH_ED 4 +#define ARf_CSPRITE_PTS_RECTANGLES 5 +#define ARf_MANAGE_SLIDER 6 + +#help_index "Misc/Progress Bars" +#define PROGRESS_BARS_NUM 4 +#define PROGRESS_DESC_LEN (64 - 8 - 8) +class CProgress +{ + I64 val, max; + F64 t0, tf; + U8 desc[PROGRESS_DESC_LEN]; +}; + +#help_index "Char/Operations" +#define PRINTF_PAD_ZERO 0x001 +#define PRINTF_LEFT_JUSTIFY 0x002 +#define PRINTF_TRUNCATE 0x004 +#define PRINTF_COMMA 0x008 +#define PRINTF_DOLLAR 0x010 +#define PRINTF_SLASH 0x020 +#define PRINTF_QUESTION 0x040 +#define PRINTF_AUX_FORMAT_NUM 0x080 +#define PRINTF_DECIMAL 0x100 +#define PRINTF_NEG 0x200 +#define PRINTF_NEG_E 0x400 +#define PRINTF_NEG_AUX_FORMAT_NUM 0x800 + +#help_index "" diff --git a/src/System/Define.ZC b/src/System/Define.ZC index bf8e7bcd..707e21d0 100755 --- a/src/System/Define.ZC +++ b/src/System/Define.ZC @@ -15,7 +15,7 @@ U0 LoadDocDefines() //$LK,"DD_BOOT_HIGH_LOC_DVD",A="FF:::/System/Boot/BootDVD.ZC,DD_BOOT_HIGH_LOC_DVD"$ $TR,"LineRep"$ -$ID,2$DefinePrint("DD_ZEALOS_LOC","98,709"); +$ID,2$DefinePrint("DD_ZEALOS_LOC","98,756"); $ID,-2$ DefinePrint("DD_MP_VECT", "%08X", MP_VECT_ADDR); DefinePrint("DD_MP_VECT_END", "%08X", MP_VECT_ADDR + COREAP_16BIT_INIT_END - COREAP_16BIT_INIT - 1); diff --git a/src/System/Gr/GrScreen.ZC b/src/System/Gr/GrScreen.ZC index d3166177..1c8e64e6 100755 --- a/src/System/Gr/GrScreen.ZC +++ b/src/System/Gr/GrScreen.ZC @@ -395,16 +395,11 @@ U0 GrUpdateScreen32() while (src < size) //draw 2 pixels at a time *dst++ = gr_palette[*src++ & 0xFF] | gr_palette[*src++ & 0xFF] << 32; + + GrCalcScreenUpdates; + if (LBtr(&sys_semas[SEMA_FLUSH_VBE_IMAGE], 0)) - { MemCopy(text.fb_alias, text.raw_screen, text.buffer_size); - src -= GR_WIDTH * GR_HEIGHT; // Reset src ptr - MemCopy(gr.screen_cache, src, GR_WIDTH * GR_HEIGHT); - } - else - { - GrCalcScreenUpdates; - } } U0 GrUpdateScreen() From f423c7470ce1dd921cdf8a0365782d46ccc49363 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 13 Mar 2023 18:20:49 -0400 Subject: [PATCH 09/51] Update ChangeLog.DD, sys_os_version. --- src/Doc/ChangeLog.DD | 7 +++++++ src/Kernel/KGlobals.ZC | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Doc/ChangeLog.DD b/src/Doc/ChangeLog.DD index 2cb3cad5..b13bad06 100755 --- a/src/Doc/ChangeLog.DD +++ b/src/Doc/ChangeLog.DD @@ -1,4 +1,11 @@ $WW,1$$FG,5$$TX+CX,"ChangeLog"$$FG$ +$IV,1$----03/13/23 18:06:09----$IV,0$ +* Raised version number to 2.02. + +$IV,1$----02/25/23 16:35:04----$IV,0$ +* Created $LK+PU,"MouseRaw",A="MN:MouseRaw"$ and $LK+PU,"MouseRawReset",A="MN:MouseRawReset"$, externs added to $LK+PU,"KernelC.HH",A="FF:::/Kernel/KernelC.HH,MouseRaw("$. +* $MA-X+PU,"Update CastleFrankenstein to use new MouseRaw functionality.",LM="Find(\"mouse_task\", \"::/Demo/Games/CastleFrankenstein.ZC\");Find(\"MouseHandler\", \"::/Demo/Games/CastleFrankenstein.ZC\");Find(\"MouseRaw\", \"::/Demo/Games/CastleFrankenstein.ZC\");View;"$ + $IV,1$----12/21/22 03:38:35----$IV,0$ * Raised version number to 2.01. * Created $LK+PU,"FreeAll",A="MN:FreeAll"$ method to /Kernel/Memory/MAllocFree.ZC and extern to $LK+PU,"/Kernel/KernelC.HH",A="FF:::/Kernel/KernelC.HH,FreeAll"$. diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index 3ccd954e..d240802b 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -13,7 +13,7 @@ CTask *sys_winmgr_task, U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, - sys_os_version = 2.01; + sys_os_version = 2.02; CAutoCompleteDictGlobals acd; CAutoCompleteGlobals ac; From bf22195fe0293e6ec6a521c6a19b19b9080f45ca Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 13 Mar 2023 22:01:29 -0400 Subject: [PATCH 10/51] Update ChangeLog.DD --- src/Doc/ChangeLog.DD | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Doc/ChangeLog.DD b/src/Doc/ChangeLog.DD index b13bad06..e23653fa 100755 --- a/src/Doc/ChangeLog.DD +++ b/src/Doc/ChangeLog.DD @@ -4,6 +4,10 @@ $IV,1$----03/13/23 18:06:09----$IV,0$ $IV,1$----02/25/23 16:35:04----$IV,0$ * Created $LK+PU,"MouseRaw",A="MN:MouseRaw"$ and $LK+PU,"MouseRawReset",A="MN:MouseRawReset"$, externs added to $LK+PU,"KernelC.HH",A="FF:::/Kernel/KernelC.HH,MouseRaw("$. +* Added members to $LK+PU,"CMouseHardStateGlobals",A="MN:CMouseHardStateGlobals"$ and used in $MA-X+PU,"Mouse.ZC",LM="Find(\"raw_data\", \"::/Kernel/SerialDev/Mouse.ZC\");Find(\"raw_mode\", \"::/Kernel/SerialDev/Mouse.ZC\");Find(\"raw_bttns\", \"::/Kernel/SerialDev/Mouse.ZC\");View;"$: + - CD3I64 raw_data + - Bool raw_bttns[5] + - Bool raw_mode * $MA-X+PU,"Update CastleFrankenstein to use new MouseRaw functionality.",LM="Find(\"mouse_task\", \"::/Demo/Games/CastleFrankenstein.ZC\");Find(\"MouseHandler\", \"::/Demo/Games/CastleFrankenstein.ZC\");Find(\"MouseRaw\", \"::/Demo/Games/CastleFrankenstein.ZC\");View;"$ $IV,1$----12/21/22 03:38:35----$IV,0$ From f297f2c26516888d8717f8bd1a7b8bd42925b81d Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 13 Mar 2023 22:05:58 -0400 Subject: [PATCH 11/51] Update ChangeLog.DD --- src/Doc/ChangeLog.DD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Doc/ChangeLog.DD b/src/Doc/ChangeLog.DD index e23653fa..d8b899d3 100755 --- a/src/Doc/ChangeLog.DD +++ b/src/Doc/ChangeLog.DD @@ -3,7 +3,7 @@ $IV,1$----03/13/23 18:06:09----$IV,0$ * Raised version number to 2.02. $IV,1$----02/25/23 16:35:04----$IV,0$ -* Created $LK+PU,"MouseRaw",A="MN:MouseRaw"$ and $LK+PU,"MouseRawReset",A="MN:MouseRawReset"$, externs added to $LK+PU,"KernelC.HH",A="FF:::/Kernel/KernelC.HH,MouseRaw("$. +* Created $LK+PU,"MouseRaw",A="MN:MouseRaw"$ and $LK+PU,"MouseRawReset",A="MN:MouseRawReset"$, externs added to $LK+PU,"KernelC.HH",A="FF:::/Kernel/KernelC.HH,MouseRaw("$, functions used in $MA-X+PU,"Mouse.ZC",LM="Find(\"MouseRawReset;\", \"::/Kernel/SerialDev/Mouse.ZC\");View;"$. * Added members to $LK+PU,"CMouseHardStateGlobals",A="MN:CMouseHardStateGlobals"$ and used in $MA-X+PU,"Mouse.ZC",LM="Find(\"raw_data\", \"::/Kernel/SerialDev/Mouse.ZC\");Find(\"raw_mode\", \"::/Kernel/SerialDev/Mouse.ZC\");Find(\"raw_bttns\", \"::/Kernel/SerialDev/Mouse.ZC\");View;"$: - CD3I64 raw_data - Bool raw_bttns[5] From 4109962d844995e3935fa5f9b7ac25a8889d6c0d Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 13 Mar 2023 22:13:43 -0400 Subject: [PATCH 12/51] Reformat raw-mouse code to ZealC code style. --- src/Kernel/SerialDev/Mouse.ZC | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/Kernel/SerialDev/Mouse.ZC b/src/Kernel/SerialDev/Mouse.ZC index daebb04b..be578c4c 100755 --- a/src/Kernel/SerialDev/Mouse.ZC +++ b/src/Kernel/SerialDev/Mouse.ZC @@ -46,21 +46,23 @@ U0 MouseUpdate(I64 x, I64 y, I64 z, Bool l, Bool r) public U0 MouseRawReset() { - mouse_hard.raw_data.x=0; - mouse_hard.raw_data.y=0; - mouse_hard.raw_data.z=0; - mouse_hard.raw_bttns[0]=FALSE; - mouse_hard.raw_bttns[1]=FALSE; - mouse_hard.raw_bttns[2]=FALSE; - mouse_hard.raw_bttns[3]=FALSE; - mouse_hard.raw_bttns[4]=FALSE; + mouse_hard.raw_data.x = 0; + mouse_hard.raw_data.y = 0; + mouse_hard.raw_data.z = 0; + mouse_hard.raw_bttns[0] = FALSE; + mouse_hard.raw_bttns[1] = FALSE; + mouse_hard.raw_bttns[2] = FALSE; + mouse_hard.raw_bttns[3] = FALSE; + mouse_hard.raw_bttns[4] = FALSE; } public Bool MouseRaw(Bool val) { // Places mouse in "raw" mode, button presses will not go to windows manager when true - Bool old_val=mouse_hard.raw_mode; - mouse_hard.raw_mode=val; - mouse.show=!val; + Bool old_val = mouse_hard.raw_mode; + + mouse_hard.raw_mode = val; + mouse.show = !val; + return old_val; } @@ -277,8 +279,10 @@ U0 MouseHardHandler() { I64 i, dx, dy, dz; U8 mouse_buf[4]; + if (!mouse_hard.raw_mode) MouseHardSetPre; + for (i = 0; i < 4; i++) mouse_buf[i] = 0; for (i = 0; i < mouse_hard.pkt_size; i++) @@ -298,7 +302,8 @@ U0 MouseHardHandler() else dz = mouse_buf[3] & 7; - if (mouse_hard.raw_mode) { + if (mouse_hard.raw_mode) + { // buttons / position data need to by consumed by app // buttons stay down, positions keep accumulating until // consumed by app and reset with MouseRawReset @@ -311,7 +316,8 @@ U0 MouseHardHandler() mouse_hard.raw_data.y += dy; mouse_hard.raw_data.z += dz; } - else { + else + { mouse_hard.bttns[0] = mouse_buf[0] & 1; mouse_hard.bttns[1] = (mouse_buf[0] & 2) >> 1; mouse_hard.bttns[2] = (mouse_buf[0] & 4) >> 2; From 5265509715718a2b53e903e71c3f95a2dfaa3fd5 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Tue, 14 Mar 2023 00:48:57 -0400 Subject: [PATCH 13/51] Move SandyBeach palette into Palettes folder in ::/Home/PaletteEditor/. --- src/Home/PaletteEditor/Palettes/SandyBeach.ZC | 10 ++++++++++ src/System/Gr/GrPalette.ZC | 13 ------------- 2 files changed, 10 insertions(+), 13 deletions(-) create mode 100755 src/Home/PaletteEditor/Palettes/SandyBeach.ZC diff --git a/src/Home/PaletteEditor/Palettes/SandyBeach.ZC b/src/Home/PaletteEditor/Palettes/SandyBeach.ZC new file mode 100755 index 00000000..029b81a1 --- /dev/null +++ b/src/Home/PaletteEditor/Palettes/SandyBeach.ZC @@ -0,0 +1,10 @@ +public CBGR24 gr_palette_sandy_beach[COLORS_NUM] = { +0x000000, 0x000088, 0x008800, 0x006060, 0x002288, 0x4B0082, 0xA52A2A, 0xAAAAAA, 0x444444, 0x4169E1, 0xADFF2F, 0x00AAAA, 0xFF8888, 0x9932CC, 0xC09020, 0xFFF8DF +}; +public U0 PaletteSetSandyBeach(Bool persistent=TRUE) +{ + GrPaletteSet(gr_palette_sandy_beach); + LFBFlush; + if (persistent) + fp_set_std_palette = &PaletteSetSandyBeach; +} diff --git a/src/System/Gr/GrPalette.ZC b/src/System/Gr/GrPalette.ZC index 287a66ff..a9d0ee93 100755 --- a/src/System/Gr/GrPalette.ZC +++ b/src/System/Gr/GrPalette.ZC @@ -54,19 +54,6 @@ public U0 PaletteSetDark(Bool persistent=TRUE) //*(drv_text_attr(U8 *) + 1) = BROWN; } //******************************************************************************** -public CBGR24 gr_palette_sandy_beach[COLORS_NUM] = { - 0x000000, 0x000088, 0x008800, 0x006060, 0x002288, 0x4B0082, 0xA52A2A, 0xAAAAAA, - 0x444444, 0x4169E1, 0xADFF2F, 0x00AAAA, 0xFF8888, 0x9932CC, 0xC09020, 0xFFF8DF -}; - -public U0 PaletteSetSandyBeach(Bool persistent=TRUE) -{//Activate Sandy beach Light palette. - GrPaletteSet(gr_palette_sandy_beach); - LFBFlush; - if (persistent) - fp_set_std_palette = &PaletteSetSandyBeach; -} -//******************************************************************************** public CBGR24 gr_palette_light[COLORS_NUM] = { 0x000000, 0x0148A4, 0x3B7901, 0x057C7E, 0xBB2020, 0x9E42AE, 0xB57901, 0xB2B6AF, From e14d9300072493d1f6a4376d709b8723749fb28b Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Tue, 14 Mar 2023 03:20:15 -0400 Subject: [PATCH 14/51] Document undocumented Print format codes. --- src/Doc/Print.DD | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Doc/Print.DD b/src/Doc/Print.DD index 84008e95..76d75ae4 100755 --- a/src/Doc/Print.DD +++ b/src/Doc/Print.DD @@ -21,6 +21,16 @@ For $FG,2$"%c"$FG$ or $FG,2$"%C"$FG$, the repeats the char that $ID,2$$FG,2$"%n"$FG$ floating point in engineering notation, exponents being multiples of three. If it has a code, it will display scientific units letters. +$FG,2$"%e"$FG$ floating point in engineering notation, exponents not restricted to multiples of three. + +$FG,2$"%d"$FG$ Whole number. + +$FG,2$"%u"$FG$ Unsigned whole number. + +$FG,2$"%f"$FG$ Floating point number. + +$FG,2$"%g"$FG$ Right-aligned rounded-up integer of floating point number. + $FG,2$"%S"$FG$ $LK,"Define",A="MN:Define"$() entry. $FG,2$"%C"$FG$ $LK,"ToUpper",A="MN:ToUpper"$() character. From 23819ab21ff0d5aba0a2633443ab714491ce8230 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Tue, 14 Mar 2023 03:21:29 -0400 Subject: [PATCH 15/51] Refine StrPrint %o bool implementation. --- src/Kernel/StrPrint.ZC | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Kernel/StrPrint.ZC b/src/Kernel/StrPrint.ZC index 5d8d6d99..7be89766 100755 --- a/src/Kernel/StrPrint.ZC +++ b/src/Kernel/StrPrint.ZC @@ -438,10 +438,11 @@ to avoid this. throw('StrPrint'); ptr = argv[cur_arg++]; break; + case 'o': // Bool if (cur_arg >= argc) throw('StrPrint'); - if (argv[cur_arg++]) ptr = "TRUE"; else ptr = "FALSE"; + ptr = DefineSub(ToBool(argv[cur_arg++]), "ST_FALSE_TRUE"); break; case 'S': @@ -661,7 +662,7 @@ sp_out_inf: break; } - sp_out_f: +sp_out_f: if (dec_len < 0) dec_len = 0; n = Log10(d); From 8d810968797c259e45c993223d1bb79b6a21087d Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Tue, 14 Mar 2023 03:29:50 -0400 Subject: [PATCH 16/51] Update ChangeLog.DD. --- src/Doc/ChangeLog.DD | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Doc/ChangeLog.DD b/src/Doc/ChangeLog.DD index d8b899d3..20ba825f 100755 --- a/src/Doc/ChangeLog.DD +++ b/src/Doc/ChangeLog.DD @@ -1,4 +1,7 @@ $WW,1$$FG,5$$TX+CX,"ChangeLog"$$FG$ +$IV,1$----03/14/23 03:23:46----$IV,0$ +* Created %o Bool $LK+PU,"StrPrint",A="FF:::/Kernel/StrPrint.ZC,'o':"$ format code, updated $LK+PU,"Print.DD",A="FI:::/Doc/Print.DD"$ with new %o code and previously undocumented format codes. + $IV,1$----03/13/23 18:06:09----$IV,0$ * Raised version number to 2.02. From 87c6e5917949a488da4bded5b5912fa3c69347c3 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 15 Mar 2023 02:30:04 -0400 Subject: [PATCH 17/51] Make network driver registration dynamic. --- src/Home/Net/Drivers/Run.ZC | 65 +++++++++++++++++++++++++++---------- src/System/DevInfo.ZC | 4 +-- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/Home/Net/Drivers/Run.ZC b/src/Home/Net/Drivers/Run.ZC index 94c0451f..f994e784 100755 --- a/src/Home/Net/Drivers/Run.ZC +++ b/src/Home/Net/Drivers/Run.ZC @@ -7,9 +7,8 @@ #define PCIV_E1000 0x8086 #define PCID_82545EM 0x100F - #define PCIV_VIRTIO 0x1AF4 -//#define PCID_VIRTIO_NET 0x1000 +#define PCID_VIRTIO_NET 0x1000 U0 NetDriverInclude(U8 *driver) { @@ -19,33 +18,63 @@ U0 NetDriverInclude(U8 *driver) Free(filename); } +class CNetDriver:CQueue +{ + U16 vendor_id; + U16 device_id; + U8 *filename; // relative to Drivers/ folder, not absolute +}; + +CQueue *net_drivers = CAlloc(sizeof(CQueue)); +QueueInit(net_drivers); + +U0 NetDriverRegister(U16 vendor_id=NULL, U16 device_id=NULL, U8 *filename) +{ + + CNetDriver *driver; + + if (!vendor_id && !device_id) + return; + + driver = CAlloc(sizeof(CNetDriver)); + + driver->vendor_id = vendor_id; + driver->device_id = device_id; + driver->filename = StrNew(filename); + + QueueInsertRev(driver, net_drivers); +} + + U0 NetDriverInit() { - CPCIDev *net_driver_pci = PCIDevFind(PCIC_NETWORK); - Bool found = FALSE; + Bool found = FALSE; + CNetDriver *net_driver; + CPCIDev *net_pci; - if (net_driver_pci) + // register NIC PCI details with driver (file)name + NetDriverRegister(PCIV_VIRTIO, PCID_VIRTIO_NET, "VirtIONet"); + NetDriverRegister(PCIV_E1000, PCID_82545EM, "E1000"); + NetDriverRegister(PCIV_PCNET, PCID_PCNET, "PCNet"); + + // iterate registered drivers until match is found, if any found + net_driver = net_drivers->next; + + while (net_driver != net_drivers) { - if (net_driver_pci=PCIDevFind(, , PCIV_PCNET, PCID_PCNET)) + net_pci = PCIDevFind(,, net_driver->vendor_id, net_driver->device_id); + if (net_pci) { - NetDriverInclude("PCNet"); - found = TRUE; - } - else if (net_driver_pci=PCIDevFind(, , PCIV_E1000, PCID_82545EM)) - { - NetDriverInclude("E1000"); - found = TRUE; - } - else if (net_driver_pci=PCIDevFind(PCIC_NETWORK, , PCIV_VIRTIO, )) - { - NetDriverInclude("VirtIONet"); found = TRUE; + NetDriverInclude(net_driver->filename); + break; } + net_driver = net_driver->next; } if (!found) { - ClassRep(net_driver_pci); + ClassRep(net_pci); throw('NODRIVER'); } } diff --git a/src/System/DevInfo.ZC b/src/System/DevInfo.ZC index b3578df3..b401be15 100755 --- a/src/System/DevInfo.ZC +++ b/src/System/DevInfo.ZC @@ -55,7 +55,7 @@ lud_done: public CPCIDev *PCIDevFind(U16 class_code=NULL, U16 sub_code=NULL, U16 vendor_id=NULL, U16 device_id=NULL, U8 _bus=0xFF, U8 _dev=0xFF, U8 _fun=0xFF) -{//return first device with matching class & subcode, vendor & device id, class & device id, class & vendor id or a specific device. +{//return first device with matching class & subcode, vendor & device id, or a specific device. PCILookUpDevs; CPCIDev *p = dev.pci_head.next; @@ -63,8 +63,6 @@ public CPCIDev *PCIDevFind(U16 class_code=NULL, U16 sub_code=NULL, { if (p->vendor_id == vendor_id && p->device_id == device_id || p->class_code == class_code && p->sub_code == sub_code || - p->class_code == class_code && p->device_id == device_id && vendor_id == NULL || - p->class_code == class_code && p->vendor_id == vendor_id && device_id == NULL || p->bus == _bus && p->dev == _dev && p->fun == _fun) return p; From 86a390d9c6c01dd3c1c4b0c1d3f68ab08b8b1d8f Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Fri, 17 Mar 2023 17:49:19 -0400 Subject: [PATCH 18/51] Rewrote MiniGrLib, fixes #40. --- src/Demo/Lectures/MiniGrLib.ZC | 189 ++++++++++++++++++++------------- src/Doc/ChangeLog.DD | 3 + 2 files changed, 120 insertions(+), 72 deletions(-) diff --git a/src/Demo/Lectures/MiniGrLib.ZC b/src/Demo/Lectures/MiniGrLib.ZC index af3c992f..a5ce5296 100755 --- a/src/Demo/Lectures/MiniGrLib.ZC +++ b/src/Demo/Lectures/MiniGrLib.ZC @@ -1,94 +1,136 @@ -#define VGAP_IDX 0x3C4 -#define VGAP_DATA 0x3C5 -#define VGAR_MAP_MASK 0x02 -U8 rev[256], //The VGA bits are backward - image[640 * 480 / 8]; //We need read-modify write. - //0xA0000 alias memory can't be read. - +U32 image[GR_HEIGHT * GR_WIDTH]; + U0 MGInit() { - I64 i, j; + MemSet(image, BLACK32, sizeof(image)); +} - MemSet(image, 0, sizeof(image)); - MemSet(rev, 0, sizeof(rev)); - for (i = 0; i < 256; i++) - for (j = 0; j < 8; j++) - if (Bt(&i, j)) - Bts(&rev[i], 7 - j); -} - U0 MGUpdate() -{//Copy image to VGA memory +{//Copy image to framebuffer memory //For better performance we could only write what's changed. - //0xA0000 alias is slower than normal RAM. - OutU8(VGAP_IDX, VGAR_MAP_MASK); - OutU8(VGAP_DATA, 0xF);//All color planes at once -- Black and White - MemCopy(text.vga_alias, image,sizeof(image)); //Alias of 0xA0000 + MemCopy(text.fb_alias, image, sizeof(image)); } - + U0 MGPlot(I64 x,I64 y) { - if (0 <= x < 640 && 0 <= y < 480) - Bts(image,y * 640 + x ^ 7); + if (0 <= x < GR_WIDTH && 0 <= y < GR_HEIGHT) + image[x + y * GR_WIDTH] = WHITE32; } - -U0 MGHLine(I64 x1, I64 x2, I64 y) -{//Warning! No clipping -//For performance, we do as many whole-bytes as possible. - U8 *ptr; - I64 i, w, leading, trailing, whole_bytes; +U0 MGHLine(I64 x1, I64 x2, I64 y) +{//No clipping + I64 x; + + if (y >= GR_HEIGHT) + return; if (x2 < x1) SwapI64(&x1, &x2); - ptr = image + y * 640 / 8 + x1 >> 3; - w = x2 - x1 + 1; - leading = 8 - x1 & 7; - trailing = (x2 + 1) & 7; - if (leading + trailing > w) - *ptr |= rev[(0xFF00 >> leading & (0x00FF << trailing) >> 8)]; - else + if (x1 < 0) + x1 = 0; + if (x2 < x1) + SwapI64(&x1, &x2); + x = x1; + + while (x <= x2 && x < GR_WIDTH) { - whole_bytes = (w - leading - trailing) >> 3; - if (leading) - *ptr++ |= rev[(0xFF00 >> leading) & 0xFF]; - for (i = 0; i < whole_bytes; i++) - *ptr++ = 0xFF; - if (trailing) - *ptr++ |= rev[(0x00FF << trailing) >> 8]; + image[x + y * GR_WIDTH] = WHITE32; + x++; } } U0 MGLine(I64 x1,I64 y1,I64 x2,I64 y2) -{//Warning! No clipping - I64 dx=x2-x1,dy=y2-y1; +{//No clipping + I64 x_start, x_end, y_start, y_end, x, y, dx, dy, c; - x1 <<= 32; x2 <<= 32; - y1 <<= 32; y2 <<= 32; - if (AbsI64(dx) > AbsI64(dy)) + c = 0; + x_start = MinI64(x1, x2); + + if (x_start == x1) { - dy = dy << 32 / AbsI64(dx); - dx = SignI64(dx) << 32; - while (x1 != x2) + y_start = y1; + x_end = x2; + y_end = y2; + } + else // x2 + { + y_start = y2; + x_end = x1; + y_end = y1; + } + + x = x_start; + y = y_start; + dx = x_end - x_start; + + if (y_end < y_start) + { + dy = y_start - y_end; + + if (dx >= dy) { - MGPlot(x1.i32[1], y1.i32[1]); - x1 += dx; y1 += dy; + while (x <= x_end) + { + MGPlot(x, y); + c += dy; + if (c >= dx) + { + c -= dx; + y--; + } + x++; + } + } + else + { + while (y > y_end) + { + MGPlot(x, y); + c += dx; + if (c >= dy) + { + c -= dy; + x++; + } + y--; + } } } else { - dx = dx << 32 / AbsI64(dy); - dy = SignI64(dy) << 32; - while (y1 != y2) + dy = y_end - y_start; + + if (dx >= dy) { - MGPlot(x1.i32[1], y1.i32[1]); - x1 += dx; - y1 += dy; + while (x <= x_end) + { + MGPlot(x, y); + c += dy; + if (c >= dx) + { + c -= dx; + y++; + } + x++; + } + } + else + { + while (y <= y_end) + { + MGPlot(x, y); + c += dx; + if (c >= dy) + { + c -= dy; + x++; + } + y++; + } } } - MGPlot(x1.i32[1], y1.i32[1]); } - + U0 MGCircle(I64 x, I64 y, F64 r) { F64 s, c, x1, y1, x2, y2; @@ -118,31 +160,34 @@ U0 MGCircle(I64 x, I64 y, F64 r) MGPlot(x+x1,y+y1); } } - - + U0 MiniGrLibDemo() { I64 i; + MGInit; for (i = 0; i < 100; i++) - MGHLine(200 + i, 400 + i, 300 + i); + MGHLine(200 + i, 400 + i, 400 + i); - for (i = 0; i < 500; i += 10) - MGLine(i, 0, 0, 480 - i); + for (i = 0; i < GR_HEIGHT + 20; i += 10) + MGLine(i, 0, 0, GR_HEIGHT - i); for (i = 0; i < 300; i += 4) - MGCircle(200, 100 + i, i); + MGCircle(400, 200 + i, i); + MGUpdate; Busy(1500000); + + /* We are returning graphics to normal operations under ZealOS. It is not normal to by-pass the ZealOS graphcis routines. -The ZealOS graphics don't know VGA has changed. -This bit tells ZealOS to update whole screen. +The ZealOS graphics don't know the framebuffer has changed. +This function tells ZealOS to update whole screen. */ - // will flush screen VGA cache. + // will flush screen VGA cache and un-set framebuffer-busy bit. LFBFlush; } -MiniGrLibDemo; \ No newline at end of file +MiniGrLibDemo; diff --git a/src/Doc/ChangeLog.DD b/src/Doc/ChangeLog.DD index 20ba825f..dbcef2bd 100755 --- a/src/Doc/ChangeLog.DD +++ b/src/Doc/ChangeLog.DD @@ -1,4 +1,7 @@ $WW,1$$FG,5$$TX+CX,"ChangeLog"$$FG$ +$IV,1$----03/17/23 17:44:24----$IV,0$ +* Rewrote $LK+PU,"MiniGrLib",A="FI:::/Demo/Lectures/MiniGrLib.ZC"$, replaced old VGA-specific code to work with 32-bit framebuffer. + $IV,1$----03/14/23 03:23:46----$IV,0$ * Created %o Bool $LK+PU,"StrPrint",A="FF:::/Kernel/StrPrint.ZC,'o':"$ format code, updated $LK+PU,"Print.DD",A="FI:::/Doc/Print.DD"$ with new %o code and previously undocumented format codes. From 5ac73893d2b5e026a218e64e8b52d2320209ca57 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 22 Mar 2023 22:35:11 -0400 Subject: [PATCH 19/51] Update ZSplash.ZC --- src/System/ZSplash.ZC | Bin 3941 -> 3935 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/System/ZSplash.ZC b/src/System/ZSplash.ZC index 8d13f3e727da898feff6ee5352cd99436e0ce240..e0da5f0d01959fd57451cdac2a274c8f36280574 100755 GIT binary patch delta 25 gcmaDVcVBLU4kM3meoAUlo`PpyUVhnTJ4SUr0DC$Jpa1{> delta 31 mcmcaF_f&3!4x>;&QGQx#adBpTUSf_yP-=2f>ShZ@bv^*VdJ7i- From c97456cfb20f8369cd552ca88596fbc3802e74d5 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 22 Mar 2023 22:38:17 -0400 Subject: [PATCH 20/51] Make raw-mouse mode task-based instead of global. --- src/Demo/Games/CastleFrankenstein.ZC | 45 +++++++---- src/Doc/ChangeLog.DD | 12 ++- src/Kernel/KGlobals.ZC | 2 +- src/Kernel/KMain.ZC | 2 + src/Kernel/KernelA.HH | 7 +- src/Kernel/KernelC.HH | 3 +- src/Kernel/SerialDev/Mouse.ZC | 113 +++++++++++++++++++++++++-- 7 files changed, 156 insertions(+), 28 deletions(-) diff --git a/src/Demo/Games/CastleFrankenstein.ZC b/src/Demo/Games/CastleFrankenstein.ZC index 306a912c..0ce47472 100755 --- a/src/Demo/Games/CastleFrankenstein.ZC +++ b/src/Demo/Games/CastleFrankenstein.ZC @@ -586,24 +586,31 @@ U0 MouseHandler() { Bool button; I64 x; - while (TRUE) + + while (MouseRawQueueFind(game_task)) { button = mouse_hard.raw_bttns[0]; x = mouse_hard.raw_data.x; - if (button || x!=0) + + if (button || x != 0) MouseRawReset; // Mark mouse data as consumed if (button) - MessagePostWait(game_task,MESSAGE_KEY_DOWN_UP,CH_SPACE,0); - if (x != 0) { - man_é += (x/mouse_scale)/MICRO_STEPS; - } + MessagePostWait(game_task, MESSAGE_KEY_DOWN_UP, CH_SPACE, 0); + if (x != 0) + man_é += (x / mouse_scale) / MICRO_STEPS; + Sleep(10); - } + } + mouse_task = NULL; } U0 CastleFrankenstein() { I64 sc; + Bool is_raw = TRUE; + + MouseRaw(is_raw); + mouse_task = Spawn(&MouseHandler, NULL, "MouseHandler"); MenuPush( "File {" @@ -617,6 +624,9 @@ U0 CastleFrankenstein() " Left(,,SC_CURSOR_LEFT);" " Right(,,SC_CURSOR_RIGHT);" " Fire(,CH_SPACE);" + " MouseMode(,'m');" + " MouseScaleUp(,'+');" + " MouseScaleDown(,'-');" "}" ); @@ -642,18 +652,22 @@ U0 CastleFrankenstein() break; case 'm': - if (!mouse_task) { - MouseRaw(TRUE); - mouse_task=Spawn(&MouseHandler,NULL); - } - else { + if (is_raw) + { + is_raw = FALSE; + MouseRaw(is_raw); Kill(mouse_task); - mouse_task=NULL; - MouseRaw(FALSE); + } + else + { + is_raw = TRUE; + MouseRaw(is_raw); + mouse_task = Spawn(&MouseHandler, NULL, "MouseHandler"); } break; case '+': + case '=': mouse_scale *= 0.9; break; @@ -706,10 +720,7 @@ fs_done: RegWrite("ZealOS/CastleFrankenstein", "F64 best_score=%5.4f;\n", best_score); } -MouseRaw(TRUE); -mouse_task=Spawn(&MouseHandler,NULL); CastleFrankenstein; -if (mouse_task) Kill(mouse_task); MouseRaw(FALSE); &   diff --git a/src/Doc/ChangeLog.DD b/src/Doc/ChangeLog.DD index dbcef2bd..f8afb550 100755 --- a/src/Doc/ChangeLog.DD +++ b/src/Doc/ChangeLog.DD @@ -1,9 +1,19 @@ $WW,1$$FG,5$$TX+CX,"ChangeLog"$$FG$ +$IV,1$----03/22/23 22:27:05----$IV,0$ +* Raised version number to 2.03. +* Created $LK+PU,"CMouseRawQueue",A="MN:CMouseRawQueue"$ to track tasks in raw-mouse mode, placed in $LK+PU,"CMouseHardStateGlobals mouse_hard.raw_queue",A="FF:::/Kernel/KernelA.HH,*raw_queue"$. +* Created $LK+PU,"MouseRawQueueFind",A="MN:MouseRawQueueFind"$ to check whether a given task is in raw-mouse mode, externed in $LK+PU,"KernelC.HH",A="FF:::/Kernel/KernelC.HH,MouseRawQueueFind("$. +* Created $LK+PU,"MouseRawWatcher",A="MN:MouseRawWatcher"$ and $LK+PU,"MouseRawWatcherInner",A="MN:MouseRawWatcherInner"$ to watch for killed tasks and remove them from raw_queue, spawned in $LK+PU,"KMain",A="FF:::/Kernel/KMain.ZC,&MouseRawWatcher:2"$. +* Added task parameter to $LK+PU,"MouseRaw",A="MN:MouseRaw"$, changed behaviour from a global toggle to a task-based queue of $LK+PU,"CMouseRawQueue",A="MN:CMouseRawQueue"$ entries. +* Changed $LK+PU,"MouseHardHandler",A="MN:MouseHardHandler"$ to use $LK+PU,"MouseRawQueueFind",A="MN:MouseRawQueueFind"$ with $LK+PU,"sys_focus_task",A="MN:sys_focus_task"$ to determine if currently in raw-mode or not, added $LK+PU,"clearing mouse.show, mouse.lb, mouse.rb",A="FF:::/Kernel/SerialDev/Mouse.ZC,mouse.lb = FALSE"$ to fix bug where clicking to refocus a mouse-raw application would register a repeated click on unfocus. +* Added raw_queue init to $LK+PU,"KbdMouseInit",A="FF:::/Kernel/SerialDev/Mouse.ZC,QueueInit(mouse_hard.raw_queue);"$. +* Changed $LK+PU,"CastleFrankenstein MouseHandler",A="FF:::/Demo/Games/CastleFrankenstein.ZC,MouseHandler"$ while loop condition to use $LK+PU,"MouseRawQueueFind",A="MN:MouseRawQueueFind"$ with game_task as parameter, added raw-mouse keybind descriptions to game's $LK+PU,"MenuPush",A="FF:::/Demo/Games/CastleFrankenstein.ZC,MouseMode"$. + $IV,1$----03/17/23 17:44:24----$IV,0$ * Rewrote $LK+PU,"MiniGrLib",A="FI:::/Demo/Lectures/MiniGrLib.ZC"$, replaced old VGA-specific code to work with 32-bit framebuffer. $IV,1$----03/14/23 03:23:46----$IV,0$ -* Created %o Bool $LK+PU,"StrPrint",A="FF:::/Kernel/StrPrint.ZC,'o':"$ format code, updated $LK+PU,"Print.DD",A="FI:::/Doc/Print.DD"$ with new %o code and previously undocumented format codes. +* Created %o Bool $LK+PU,"StrPrint",A="FF:::/Kernel/StrPrint.ZC,'o'"$ format code, updated $LK+PU,"Print.DD",A="FI:::/Doc/Print.DD"$ with new %o code and previously undocumented format codes. $IV,1$----03/13/23 18:06:09----$IV,0$ * Raised version number to 2.02. diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index d240802b..34cacbe8 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -13,7 +13,7 @@ CTask *sys_winmgr_task, U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, - sys_os_version = 2.02; + sys_os_version = 2.03; CAutoCompleteDictGlobals acd; CAutoCompleteGlobals ac; diff --git a/src/Kernel/KMain.ZC b/src/Kernel/KMain.ZC index 771ae09c..b1757765 100755 --- a/src/Kernel/KMain.ZC +++ b/src/Kernel/KMain.ZC @@ -211,6 +211,8 @@ U0 KMain() KbdInit; "Spawn(&MouseHardDriverInstall);\n\n"; Spawn(&MouseHardDriverInstall); + "Spawn(&MouseRawWatcher,, \"MouseRawWatcher\");\n"; + Spawn(&MouseRawWatcher,, "MouseRawWatcher"); "Load(\"Compiler\");\n"; Cd("/Compiler"); diff --git a/src/Kernel/KernelA.HH b/src/Kernel/KernelA.HH index 15bc09fb..3bf2f6aa 100755 --- a/src/Kernel/KernelA.HH +++ b/src/Kernel/KernelA.HH @@ -3715,6 +3715,11 @@ public class CKbdStateGlobals }; #help_index "Mouse" +class CMouseRawQueue:CQueue +{ + CTask *task; +}; + public class CMouseHardStateGlobals { CD3I64 pos, //Position in pixels @@ -3726,9 +3731,9 @@ public class CMouseHardStateGlobals install_attempts, //Private pkt_size; //Private CFifoU8 *fifo, *fifo2; //Private + CQueue *raw_queue; Bool bttns[5], raw_bttns[5], - raw_mode, has_wheel, has_ext_bttns, enabled, diff --git a/src/Kernel/KernelC.HH b/src/Kernel/KernelC.HH index 72a04628..7b0ddfb1 100755 --- a/src/Kernel/KernelC.HH +++ b/src/Kernel/KernelC.HH @@ -503,8 +503,9 @@ extern I64 KbdMessagesQueue(); public extern U0 KbdTypeMatic(U8 delay); extern Bool MouseHardDriverInstall(); public extern Bool MouseHardEnable(Bool val=TRUE); -public extern Bool MouseRaw(Bool val); +public extern Bool MouseRaw(Bool val, CTask *task=NULL); public extern U0 MouseRawReset(Bool val=TRUE); +extern CMouseRawQueue *MouseRawQueueFind(CTask *task); public extern I64 PressAKey(); public extern I64 CharScan(); public extern Bool KeyScan(I64 *_ch=NULL, I64 *_scan_code=NULL, Bool echo=FALSE); diff --git a/src/Kernel/SerialDev/Mouse.ZC b/src/Kernel/SerialDev/Mouse.ZC index be578c4c..244af422 100755 --- a/src/Kernel/SerialDev/Mouse.ZC +++ b/src/Kernel/SerialDev/Mouse.ZC @@ -56,12 +56,99 @@ public U0 MouseRawReset() mouse_hard.raw_bttns[4] = FALSE; } -public Bool MouseRaw(Bool val) -{ // Places mouse in "raw" mode, button presses will not go to windows manager when true - Bool old_val = mouse_hard.raw_mode; +CMouseRawQueue *MouseRawQueueFind(CTask *task) +{ + CMouseRawQueue *entry = mouse_hard.raw_queue->next; - mouse_hard.raw_mode = val; - mouse.show = !val; + while (entry != mouse_hard.raw_queue) + { + if (entry->task == task) + return entry; + entry = entry->next; + } + + return NULL; +} + +U0 MouseRawWatcherInner(CTask *task, CMouseRawQueue *entry, Bool *_found) +{ + CTask *task2; + + if (task == entry->task) + *_found = TRUE; + + task2 = task->next_child_task; + while (!*_found && task2 != (&task->next_child_task)(U8 *) - offset(CTask.next_sibling_task)) + { + MouseRawWatcherInner(task2, entry, _found); + task2 = task2->next_sibling_task; + } +} + +U0 MouseRawWatcher() +{ + CMouseRawQueue *entry, *next_entry; + I64 i; + CCPU *c; + Bool found; + + while (TRUE) + { + entry = mouse_hard.raw_queue->next; + while (entry != mouse_hard.raw_queue) + { + found = FALSE; + next_entry = entry->next; + PUSHFD + CLI + for (i = 0; i < mp_count; i++) + { + c = &cpu_structs[i]; + MouseRawWatcherInner(c->executive_task, entry, &found); + } + POPFD + + if (!found) + { + QueueRemove(entry); + Free(entry); + } + + entry = next_entry; + } + Sleep(1000); + } +} + +public Bool MouseRaw(Bool val, CTask *task=NULL) +{ // Places mouse in "raw" mode, button presses will not go to windows manager when true + CMouseRawQueue *entry; + Bool old_val; + + if (!task) + task = Fs; + + if (val) + { + old_val = TRUE; + if (!MouseRawQueueFind(task)) + { + entry = CAlloc(sizeof(CMouseRawQueue)); + entry->task = task; + QueueInsertRev(entry, mouse_hard.raw_queue); + old_val = FALSE; + } + } + else + { + old_val = FALSE; + if (entry = MouseRawQueueFind(task)) + { + QueueRemove(entry); + Free(entry); + old_val = TRUE; + } + } return old_val; } @@ -279,8 +366,14 @@ U0 MouseHardHandler() { I64 i, dx, dy, dz; U8 mouse_buf[4]; + Bool is_raw_mode; - if (!mouse_hard.raw_mode) + if (mouse_hard.raw_queue->next == mouse_hard.raw_queue) + is_raw_mode = FALSE; // queue check branch skips func call stack push/pop, small speedup + else + is_raw_mode = MouseRawQueueFind(sys_focus_task); + + if (!is_raw_mode) MouseHardSetPre; for (i = 0; i < 4; i++) @@ -302,7 +395,7 @@ U0 MouseHardHandler() else dz = mouse_buf[3] & 7; - if (mouse_hard.raw_mode) + if (is_raw_mode) { // buttons / position data need to by consumed by app // buttons stay down, positions keep accumulating until @@ -315,6 +408,9 @@ U0 MouseHardHandler() mouse_hard.raw_data.x += dx; mouse_hard.raw_data.y += dy; mouse_hard.raw_data.z += dz; + mouse.show = FALSE; + mouse.lb = FALSE; + mouse.rb = FALSE; } else { @@ -326,6 +422,7 @@ U0 MouseHardHandler() mouse_hard.prescale.x += dx; mouse_hard.prescale.y += dy; mouse_hard.prescale.z += dz; + mouse.show = TRUE; MouseHardSetPost; } } @@ -447,5 +544,7 @@ U0 KbdMouseInit() mouse_hard.prescale.z = 0 / mouse_hard.scale.z; mouse_hard.pos.x = sys_framebuffer_width >> 1; mouse_hard.pos.y = sys_framebuffer_height >> 1; + mouse_hard.raw_queue = CAlloc(sizeof(CQueue)); // head of CMouseRawQueue queue + QueueInit(mouse_hard.raw_queue); MemCopy(&mouse_hard_last, &mouse_hard, sizeof(CMouseHardStateGlobals)); } From 9477ad40fc30ccb185debc4ca0bb1dffba7ea6ca Mon Sep 17 00:00:00 2001 From: mintsuki Date: Wed, 29 Mar 2023 00:04:07 +0200 Subject: [PATCH 21/51] zealbooter: Rebase on latest limine-barebones code --- .gitignore | 10 ++--- zealbooter/GNUmakefile | 85 +++++++++++++++++++++++------------------- zealbooter/linker.ld | 4 ++ 3 files changed, 56 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index de756d76..127eb5d8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,17 +2,17 @@ *.bin *.ZXE *.MAP -src/Boot/ +/src/Boot *.ELF *.elf *.sys *.SYS -src/EFI/ -build/limine -build/ovmf +/src/EFI +/build/limine +/build/ovmf *.iso *.raw *.hdd *.o *.d -zealbooter/limine.h +/zealbooter/limine.h diff --git a/zealbooter/GNUmakefile b/zealbooter/GNUmakefile index ff39eaf3..d8f30e28 100644 --- a/zealbooter/GNUmakefile +++ b/zealbooter/GNUmakefile @@ -1,8 +1,11 @@ +# Nuke built-in rules and variables. +override MAKEFLAGS += -rR + # This is the name that our final kernel executable will have. # Change as needed. override KERNEL := zealbooter.elf -# Convenience macro to reliably declare overridable command variables. +# Convenience macro to reliably declare user overridable variables. define DEFAULT_VAR = ifeq ($(origin $1),default) override $(1) := $(2) @@ -20,49 +23,54 @@ $(eval $(call DEFAULT_VAR,CC,cc)) # Same thing for "ld" (the linker). $(eval $(call DEFAULT_VAR,LD,ld)) -# User controllable CFLAGS. -CFLAGS ?= -g -O2 -pipe -Wall -Wextra +# User controllable C flags. +$(eval $(call DEFAULT_VAR,CFLAGS,-g -O2 -pipe -Wall -Wextra)) -# User controllable preprocessor flags. We set none by default. -CPPFLAGS ?= +# User controllable C preprocessor flags. We set none by default. +$(eval $(call DEFAULT_VAR,CPPFLAGS,)) # User controllable nasm flags. -NASMFLAGS ?= -F dwarf -g +$(eval $(call DEFAULT_VAR,NASMFLAGS,-F dwarf -g)) # User controllable linker flags. We set none by default. -LDFLAGS ?= +$(eval $(call DEFAULT_VAR,LDFLAGS,)) # Internal C flags that should not be changed by the user. -override CFLAGS += \ - -std=gnu11 \ - -ffreestanding \ +override CFLAGS += \ + -std=gnu11 \ + -ffreestanding \ -fno-stack-protector \ - -fno-stack-check \ - -fno-lto \ - -fno-pie \ - -fno-pic \ - -m64 \ - -march=x86-64 \ - -mabi=sysv \ - -mno-80387 \ - -mno-mmx \ - -mno-sse \ - -mno-sse2 \ - -mno-red-zone \ - -mcmodel=kernel \ - -MMD \ - -I. \ - -I./lib + -fno-stack-check \ + -fno-lto \ + -fno-pie \ + -fno-pic \ + -m64 \ + -march=x86-64 \ + -mabi=sysv \ + -mno-80387 \ + -mno-mmx \ + -mno-sse \ + -mno-sse2 \ + -mno-red-zone \ + -mcmodel=kernel + +# Internal C preprocessor flags that should not be changed by the user. +override CPPFLAGS := \ + -I. \ + -I./lib \ + $(CPPFLAGS) \ + -MMD \ + -MP # Internal linker flags that should not be changed by the user. -override LDFLAGS += \ - -nostdlib \ - -static \ - -m elf_x86_64 \ +override LDFLAGS += \ + -nostdlib \ + -static \ + -m elf_x86_64 \ -z max-page-size=0x1000 \ -T linker.ld -# Check if the linker supports -no-pie and enable it if it does +# Check if the linker supports -no-pie and enable it if it does. ifeq ($(shell $(LD) --help 2>&1 | grep 'no-pie' >/dev/null 2>&1; echo $$?),0) override LDFLAGS += -no-pie endif @@ -71,10 +79,11 @@ endif override NASMFLAGS += \ -f elf64 -# Use find to glob all *.c, *.S, and *.asm files in the directory and extract the object names. -override CFILES := $(shell find . -type f -name '*.c') -override ASFILES := $(shell find . -type f -name '*.S') -override NASMFILES := $(shell find . -type f -name '*.asm') +# Use "find" to glob all *.c, *.S, and *.asm files in the tree and obtain the +# object and header dependency file names. +override CFILES := $(shell find -L . -type f -name '*.c') +override ASFILES := $(shell find -L . -type f -name '*.S') +override NASMFILES := $(shell find -L . -type f -name '*.asm') override OBJ := $(CFILES:.c=.o) $(ASFILES:.S=.o) $(NASMFILES:.asm=.o) override HEADER_DEPS := $(CFILES:.c=.d) $(ASFILES:.S=.d) @@ -83,7 +92,7 @@ override HEADER_DEPS := $(CFILES:.c=.d) $(ASFILES:.S=.d) all: $(KERNEL) limine.h: - curl https://raw.githubusercontent.com/limine-bootloader/limine/trunk/limine.h -o $@ || cp ../build/limine/limine.h limine.h || echo "ERROR" + curl -Lo $@ https://github.com/limine-bootloader/limine/raw/trunk/limine.h || cp ../build/limine/limine.h limine.h || echo "ERROR" # Link rules for the final kernel executable. $(KERNEL): $(OBJ) @@ -94,11 +103,11 @@ $(KERNEL): $(OBJ) # Compilation rules for *.c files. %.o: %.c limine.h - $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ # Compilation rules for *.S files. %.o: %.S limine.h - $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ # Compilation rules for *.asm (nasm) files. %.o: %.asm diff --git a/zealbooter/linker.ld b/zealbooter/linker.ld index 36452585..529a4dd1 100644 --- a/zealbooter/linker.ld +++ b/zealbooter/linker.ld @@ -40,6 +40,10 @@ SECTIONS *(.data .data.*) } :data + /* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */ + /* unnecessary zeros will be written to the binary. */ + /* If you need, for example, .init_array and .fini_array, those should be placed */ + /* above this. */ .bss : { *(COMMON) *(.bss .bss.*) From f397f0fa1d7a95032cf68d7b3964604ecb4c22bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9F=E3=83=B3=E3=83=84=E3=82=AD?= <36459316+mintsuki@users.noreply.github.com> Date: Mon, 17 Apr 2023 02:20:19 +0200 Subject: [PATCH 22/51] zealbooter: Rebase on latest limine-barebones code (#101) --- zealbooter/GNUmakefile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/zealbooter/GNUmakefile b/zealbooter/GNUmakefile index d8f30e28..a0d9a1fd 100644 --- a/zealbooter/GNUmakefile +++ b/zealbooter/GNUmakefile @@ -24,7 +24,7 @@ $(eval $(call DEFAULT_VAR,CC,cc)) $(eval $(call DEFAULT_VAR,LD,ld)) # User controllable C flags. -$(eval $(call DEFAULT_VAR,CFLAGS,-g -O2 -pipe -Wall -Wextra)) +$(eval $(call DEFAULT_VAR,CFLAGS,-g -O2 -pipe)) # User controllable C preprocessor flags. We set none by default. $(eval $(call DEFAULT_VAR,CPPFLAGS,)) @@ -37,13 +37,15 @@ $(eval $(call DEFAULT_VAR,LDFLAGS,)) # Internal C flags that should not be changed by the user. override CFLAGS += \ + -Wall \ + -Wextra \ -std=gnu11 \ -ffreestanding \ -fno-stack-protector \ -fno-stack-check \ -fno-lto \ - -fno-pie \ - -fno-pic \ + -fno-PIE \ + -fno-PIC \ -m64 \ -march=x86-64 \ -mabi=sysv \ @@ -77,6 +79,7 @@ endif # Internal nasm flags that should not be changed by the user. override NASMFLAGS += \ + -Wall \ -f elf64 # Use "find" to glob all *.c, *.S, and *.asm files in the tree and obtain the From 5454ca44e614eb62597ec370f4108582ee8317cf Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Tue, 25 Apr 2023 21:56:41 +0900 Subject: [PATCH 23/51] hotfix --- src/System/Utils/ConversionScript.ZC | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/System/Utils/ConversionScript.ZC b/src/System/Utils/ConversionScript.ZC index 8289fea9..c2c08474 100755 --- a/src/System/Utils/ConversionScript.ZC +++ b/src/System/Utils/ConversionScript.ZC @@ -74,7 +74,7 @@ U0 Cvt(U8 *ff_mask="*", U8 *fu_flags="+r+l-i+S") Find("DrvTextAttrGet", ff_mask,fu_flags,"DriveTextAttrGet"); Find("DrvIsWritable", ff_mask,fu_flags,"DriveIsWritable"); Find("gr_palette_std", ff_mask,fu_flags,"gr32_palette_std"); - Find("GetKey",ff_mask, fu_flags,"KeyGet"); + Find("GetKey", ff_mask,fu_flags,"KeyGet"); Find("STD_DISTRO_DVD_CFG", ff_mask,fu_flags,"STD_DISTRO_DVD_CONFIG"); Find("CBGR48", ff_mask,fu_flags,"CBGR24"); Find("CFreeLst", ff_mask,fu_flags,"CFreeList"); @@ -92,6 +92,16 @@ U0 Cvt(U8 *ff_mask="*", U8 *fu_flags="+r+l-i+S") Find("ScanChar",ff_mask,fu_flags,"CharScan"); Find("fp_final_scrn_update",ff_mask,fu_flags,"fp_final_screen_update"); + //Added by y4my4m April 25 2023 + Find("FifoI64Cnt", ff_mask,fu_flags,"FifoI64Count"); + Find("FifoI64Rem", ff_mask,fu_flags,"FifoI64Remove"); + Find("FifoU8Cnt", ff_mask,fu_flags,"FifoU8Count"); + Find("FifoU8Rem", ff_mask,fu_flags,"FifoU8Remove"); + Find("AdamErr", ff_mask,fu_flags,"SysErr"); + Find("AdamLog", ff_mask,fu_flags,"SysLog"); + Find("CHashGlblVar", ff_mask,fu_flags,"CHashGlobalVar"); + Find("HTT_GLBL_VAR", ff_mask,fu_flags,"HTT_GLOBAL_VAR"); + "\n$$BK,1$$$$LTRED$$Might want to go over these$$FG$$$$BK,0$$\n"; Find("MemSet", ff_mask, fu_flags); } From 7dd0d0e327d8081ea9a52ec011857c01e58315f6 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 26 Apr 2023 01:57:21 +0900 Subject: [PATCH 24/51] fp_draw --- src/System/Utils/ConversionScript.ZC | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/System/Utils/ConversionScript.ZC b/src/System/Utils/ConversionScript.ZC index c2c08474..1fc9fa35 100755 --- a/src/System/Utils/ConversionScript.ZC +++ b/src/System/Utils/ConversionScript.ZC @@ -101,6 +101,9 @@ U0 Cvt(U8 *ff_mask="*", U8 *fu_flags="+r+l-i+S") Find("AdamLog", ff_mask,fu_flags,"SysLog"); Find("CHashGlblVar", ff_mask,fu_flags,"CHashGlobalVar"); Find("HTT_GLBL_VAR", ff_mask,fu_flags,"HTT_GLOBAL_VAR"); + Find("fp_draw_ms", ff_mask,fu_flags,"fp_draw_mouse"); + Find("fp_draw_grab_ms", ff_mask,fu_flags,"fp_draw_grab_mouse"); + Find("fp_final_scrn_update",ff_mask,fu_flags,"fp_final_screen_update"); "\n$$BK,1$$$$LTRED$$Might want to go over these$$FG$$$$BK,0$$\n"; Find("MemSet", ff_mask, fu_flags); From 2f56a6649656f9b6087f678ff16adf97c1150b94 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 26 Apr 2023 02:13:02 +0900 Subject: [PATCH 25/51] sys --- src/System/Utils/ConversionScript.ZC | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/System/Utils/ConversionScript.ZC b/src/System/Utils/ConversionScript.ZC index 1fc9fa35..6d1eb03e 100755 --- a/src/System/Utils/ConversionScript.ZC +++ b/src/System/Utils/ConversionScript.ZC @@ -104,6 +104,8 @@ U0 Cvt(U8 *ff_mask="*", U8 *fu_flags="+r+l-i+S") Find("fp_draw_ms", ff_mask,fu_flags,"fp_draw_mouse"); Find("fp_draw_grab_ms", ff_mask,fu_flags,"fp_draw_grab_mouse"); Find("fp_final_scrn_update",ff_mask,fu_flags,"fp_final_screen_update"); + Find("DCColorChg", ff_mask,fu_flags,"DCColorChange"); + Find("Adam(", ff_mask,fu_flags,"Sys("); // using Adam( not to rename lists that contain the name Adam "\n$$BK,1$$$$LTRED$$Might want to go over these$$FG$$$$BK,0$$\n"; Find("MemSet", ff_mask, fu_flags); From 16efdf32145b3ef8514ce3018a0177a9410bdc92 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 26 Apr 2023 02:24:52 +0900 Subject: [PATCH 26/51] KbdMsHndlr --- src/System/Utils/ConversionScript.ZC | 1 + 1 file changed, 1 insertion(+) diff --git a/src/System/Utils/ConversionScript.ZC b/src/System/Utils/ConversionScript.ZC index 6d1eb03e..f6360dbb 100755 --- a/src/System/Utils/ConversionScript.ZC +++ b/src/System/Utils/ConversionScript.ZC @@ -106,6 +106,7 @@ U0 Cvt(U8 *ff_mask="*", U8 *fu_flags="+r+l-i+S") Find("fp_final_scrn_update",ff_mask,fu_flags,"fp_final_screen_update"); Find("DCColorChg", ff_mask,fu_flags,"DCColorChange"); Find("Adam(", ff_mask,fu_flags,"Sys("); // using Adam( not to rename lists that contain the name Adam + Find("KbdMsHndlr", ff_mask,fu_flags,"KbdMouseHandler"); "\n$$BK,1$$$$LTRED$$Might want to go over these$$FG$$$$BK,0$$\n"; Find("MemSet", ff_mask, fu_flags); From 1840f7f78257adbb9708ef81234e6ca625b18a29 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 26 Apr 2023 02:32:40 +0900 Subject: [PATCH 27/51] fix --- src/System/Utils/ConversionScript.ZC | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/System/Utils/ConversionScript.ZC b/src/System/Utils/ConversionScript.ZC index f6360dbb..efb434e1 100755 --- a/src/System/Utils/ConversionScript.ZC +++ b/src/System/Utils/ConversionScript.ZC @@ -107,6 +107,9 @@ U0 Cvt(U8 *ff_mask="*", U8 *fu_flags="+r+l-i+S") Find("DCColorChg", ff_mask,fu_flags,"DCColorChange"); Find("Adam(", ff_mask,fu_flags,"Sys("); // using Adam( not to rename lists that contain the name Adam Find("KbdMsHndlr", ff_mask,fu_flags,"KbdMouseHandler"); + Find("WinMsUpdate", ff_mask,fu_flags,"WinMouseUpdate"); + Find("RWF_SHOW_DOLLAR", ff_mask,fu_flags,"RAWF_SHOW_DOLLAR"); + Find("RWF_SCROLL", ff_mask,fu_flags,"RAWF_SCROLL"); "\n$$BK,1$$$$LTRED$$Might want to go over these$$FG$$$$BK,0$$\n"; Find("MemSet", ff_mask, fu_flags); From 22e03fbbb67c4cc0084a096a6aad321fbe44b936 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 26 Apr 2023 02:42:45 +0900 Subject: [PATCH 28/51] fix --- src/System/Utils/ConversionScript.ZC | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/System/Utils/ConversionScript.ZC b/src/System/Utils/ConversionScript.ZC index efb434e1..91373bf9 100755 --- a/src/System/Utils/ConversionScript.ZC +++ b/src/System/Utils/ConversionScript.ZC @@ -109,7 +109,10 @@ U0 Cvt(U8 *ff_mask="*", U8 *fu_flags="+r+l-i+S") Find("KbdMsHndlr", ff_mask,fu_flags,"KbdMouseHandler"); Find("WinMsUpdate", ff_mask,fu_flags,"WinMouseUpdate"); Find("RWF_SHOW_DOLLAR", ff_mask,fu_flags,"RAWF_SHOW_DOLLAR"); + Find("RWF_LAST_DOLLAR", ff_mask,fu_flags,"RAWF_LAST_DOLLAR"); + Find("RWF_IN_DOLLAR", ff_mask,fu_flags,"RAWF_IN_DOLLAR"); Find("RWF_SCROLL", ff_mask,fu_flags,"RAWF_SCROLL"); + Find("RawDr", ff_mask,fu_flags,"RawDumpRegs"); "\n$$BK,1$$$$LTRED$$Might want to go over these$$FG$$$$BK,0$$\n"; Find("MemSet", ff_mask, fu_flags); From bd5b85389ec938450ad863e32137fd67dbc3c13f Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sun, 7 May 2023 23:58:47 -0400 Subject: [PATCH 29/51] Create CPU + RAM visualization demo. --- src/Demo/Graphics/Usage.ZC | 59 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 src/Demo/Graphics/Usage.ZC diff --git a/src/Demo/Graphics/Usage.ZC b/src/Demo/Graphics/Usage.ZC new file mode 100755 index 00000000..729d7b2a --- /dev/null +++ b/src/Demo/Graphics/Usage.ZC @@ -0,0 +1,59 @@ + +U0 UsageDrawIt(CTask *, CDC *dc) +{ + I64 i, b; + CCPU *c; + F64 f; + + dc->thick = 1; + + dc->color = GREEN; + GrPrint(dc, 8, 8, "CPU"); + + dc->color = DKGRAY; + GrRect(dc, 8, 16, 100, 8 + 16 * (mp_count - 1)); + + dc->color = GREEN; + for (i = 0; i < mp_count; i++) + { + c = &cpu_structs[i]; + + f = 100.0 * (1.0 - c->idle_factor); + if (f < 1.0) + f = 1.0; + + GrRect(dc, 8, 16 + (16*i), ToI64(f), 8); + } + + b = sys_code_bp->alloced_u8s - sys_code_bp->used_u8s; + if (sys_data_bp) + b += sys_data_bp->alloced_u8s - sys_data_bp->used_u8s; + + f = 1.0 * b / MemBIOSTotal; + + + dc->color = RED; + GrPrint(dc, 116, 8, "RAM"); + + dc->color = DKGRAY; + GrRect(dc, 116, 16, 100, 8); + dc->color = RED; + GrRect(dc, 116, 16, ToI64(100.0 * (1.0 - f)), 8); + + Sleep(1); +} + +U0 Usage() +{ + SettingsPush; + DocClear; + DocCursor; + Fs->draw_it = &UsageDrawIt; + StrCopy(Fs->task_title, "Usage"); + + while (CharGet(,FALSE) != CH_SHIFT_ESC) {}; + + SettingsPop; +}; + +Usage; \ No newline at end of file From 561f056c71f8d13a1001d75d3970fc0c2e415492 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 17 May 2023 01:44:50 -0400 Subject: [PATCH 30/51] Remove 0x5 cursor byte from files --- src/Demo/Graphics/Usage.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Demo/Graphics/Usage.ZC b/src/Demo/Graphics/Usage.ZC index 729d7b2a..668b6f07 100755 --- a/src/Demo/Graphics/Usage.ZC +++ b/src/Demo/Graphics/Usage.ZC @@ -56,4 +56,4 @@ U0 Usage() SettingsPop; }; -Usage; \ No newline at end of file +Usage; \ No newline at end of file From 6288c403e61fa635c8153caa1efc99350d4b7d60 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 17 May 2023 01:47:37 -0400 Subject: [PATCH 31/51] Increase PCNet RX/TX buf count to 64. --- src/Home/Net/Drivers/PCNet.ZC | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Home/Net/Drivers/PCNet.ZC b/src/Home/Net/Drivers/PCNet.ZC index 26b09f1d..f338ef43 100755 --- a/src/Home/Net/Drivers/PCNet.ZC +++ b/src/Home/Net/Drivers/PCNet.ZC @@ -73,8 +73,8 @@ #define PCNET_CTRL_IDON 8 #define PCNET_CTRL_RINT 10 -#define PCNET_RX_BUFF_COUNT 32 // Linux & Shrine Driver use 32 and 8 for -#define PCNET_TX_BUFF_COUNT 8 // these, we could allow more if wanted. +#define PCNET_RX_BUFF_COUNT 64 +#define PCNET_TX_BUFF_COUNT 64 #define PCNET_DESCRIPTORf_ENP 24 #define PCNET_DESCRIPTORf_STP 25 @@ -417,8 +417,9 @@ U8 *PCNetInitBlockSetup() U32 p_setup; u_setup->mode = 0; - u_setup->rlen = 5 << 4; - u_setup->tlen = 3 << 4; + u_setup->rlen = ToI64(Log2(PCNET_RX_BUFF_COUNT)) << 4; + u_setup->tlen = ToI64(Log2(PCNET_TX_BUFF_COUNT)) << 4; + MemCopy(u_setup->mac, pcnet.mac_address, 6); u_setup->reserved = 0; MemSet(u_setup->ladr, 0, 8); From 3311b483e891b9fc84eca374fb91cd84c7357074 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 17 May 2023 01:56:45 -0400 Subject: [PATCH 32/51] Remove unused NetLogTask method. --- src/Home/Net/Utilities/NetLog.ZC | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Home/Net/Utilities/NetLog.ZC b/src/Home/Net/Utilities/NetLog.ZC index dfc0d3d4..caecce87 100755 --- a/src/Home/Net/Utilities/NetLog.ZC +++ b/src/Home/Net/Utilities/NetLog.ZC @@ -1,14 +1,5 @@ CTask *net_log_task = NULL; -U0 NetLogTask(I64) -{ - - while (TRUE) - { - Refresh; - } -} - U0 NetLogSave() { StrCopy(net_log_task->put_doc->filename.name, "::/Home/Net/Log.DD"); From a551afdd909946ac2c2e4e4be7692dbd1b823808 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 17 May 2023 01:57:31 -0400 Subject: [PATCH 33/51] Optimize and debug NetLog DocBottom implementation. --- src/Home/Net/Utilities/NetLog.ZC | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Home/Net/Utilities/NetLog.ZC b/src/Home/Net/Utilities/NetLog.ZC index caecce87..845f4dac 100755 --- a/src/Home/Net/Utilities/NetLog.ZC +++ b/src/Home/Net/Utilities/NetLog.ZC @@ -22,14 +22,29 @@ U0 NetLogInit() DocPrint(net_log_task->put_doc, "$$WW+H,1$$"); +// net_log_task->put_doc->max_entries = I64_MAX; + Bts(&net_log_task->win_inhibit, WIf_SELF_FOCUS); } +U0 NetLogBottom() +{//Move cursor, cur_entry, to bottom. + Bool unlock; + CDoc *doc = net_log_task->put_doc; + + unlock = DocLock(doc); + doc->cur_entry = doc; + doc->cur_col = 0; + if (unlock) + DocUnlock(doc); +} + U0 NetLog(U8 *format, ...) { // Output text to NetLogTask as Log. U8 *buf = StrPrintJoin(NULL, format, argc, argv); - DocBottom(net_log_task->put_doc); + NetLogBottom; + DocPrint(net_log_task->put_doc, "%s\n", buf); Free(buf); @@ -39,7 +54,8 @@ U0 NetWarn(U8 *format, ...) { // Output text to NetLogTask as Warning. U8 *buf = StrPrintJoin(NULL, format, argc, argv); - DocBottom(net_log_task->put_doc); + NetLogBottom; + DocPrint(net_log_task->put_doc, "$$BG,BROWN$$$$WHITE$$%s$$BG$$$$FG$$\n", buf); Free(buf); @@ -49,7 +65,8 @@ U0 NetErr(U8 *format, ...) { // Output text to NetLogTask as Error. U8 *buf = StrPrintJoin(NULL, format, argc, argv); - DocBottom(net_log_task->put_doc); + NetLogBottom; + DocPrint(net_log_task->put_doc, "$$BG,RED$$$$WHITE$$%s$$BG$$$$FG$$\n", buf); Free(buf); @@ -59,7 +76,8 @@ U0 NetDebug(U8 *format, ...) { // Output text to NetLogTask as Debug. U8 *buf = StrPrintJoin(NULL, format, argc, argv); - DocBottom(net_log_task->put_doc); + NetLogBottom; + DocPrint(net_log_task->put_doc, "$$BG,YELLOW$$$$DKGRAY$$%s$$BG$$$$FG$$\n", buf); Free(buf); From 899c733ec140153f6d005d9997b81ef8109b29e4 Mon Sep 17 00:00:00 2001 From: Sharoy Veduchi <61427449+doodayev@users.noreply.github.com> Date: Mon, 29 May 2023 03:01:03 -0700 Subject: [PATCH 34/51] New version of PaletteGodGenerate (#106) This version makes seeding with GodPick optional and even if you want to seed it will only require one press of "Ok". The rest is taken care of by RandI32. --- src/Home/PaletteEditor/PaletteGod.ZC | 31 +++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index 1de348d1..02fe7a8e 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -12,4 +12,33 @@ public U0 PaletteGodGenerate() } } -PaletteGodGenerate; \ No newline at end of file +public U0 PaletteGodGenerate2(Bool NeedForSneed=0) +{ + //This one will involve a lot less tapping + //and be a lot more random + + I64 i; + CBGR24 palette; + I64 SNEED; + I32 FEED; + + if(!NeedForSneed) //By default if no args are passed, it assumes the user + { //doesn't want or care for a seed. + goto Generate; + } + else //If a 1 is passed of course, we seed the RNG + { + + SNEED = GodPick; + Seed(SNEED); + } +Generate: + + for (i=0; i < 16; i++) + { + FEED = RandI32; + palette = FEED & 0xFFFFFF; + gr_palette[i] = palette; + LFBFlush; + } +} From 7da26fdde99d42cf132832b1468b133c06564c4c Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Tue, 30 May 2023 01:10:27 +0900 Subject: [PATCH 35/51] palette generation cleanup --- src/Home/PaletteEditor/PaletteGod.ZC | 47 ++++++++-------------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index 02fe7a8e..928846f8 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -1,43 +1,22 @@ - -public U0 PaletteGodGenerate() +public U0 PaletteGod(Bool seedUse=TRUE, Bool instant=TRUE) { + // Instantly generate a random palette, seed-based or not I64 i; CBGR24 palette; + I32 color; - for (i = 0; i < 16; i++) - { - palette = GodPick & 0xFFFFFF; - gr_palette[i] = palette; - LFBFlush; - } -} - -public U0 PaletteGodGenerate2(Bool NeedForSneed=0) -{ - //This one will involve a lot less tapping - //and be a lot more random - - I64 i; - CBGR24 palette; - I64 SNEED; - I32 FEED; - - if(!NeedForSneed) //By default if no args are passed, it assumes the user - { //doesn't want or care for a seed. - goto Generate; - } - else //If a 1 is passed of course, we seed the RNG - { - - SNEED = GodPick; - Seed(SNEED); - } -Generate: - + if (seedUse) + Seed(GodPick); for (i=0; i < 16; i++) { - FEED = RandI32; - palette = FEED & 0xFFFFFF; + if (instant || seedUse) + { + color = RandI32; + palette = color & 0xFFFFFF; + } + else { + palette = GodPick & 0xFFFFFF; + } gr_palette[i] = palette; LFBFlush; } From 17578a1f78053e3eb581491eeacd4274eeda9eab Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Tue, 30 May 2023 01:11:28 +0900 Subject: [PATCH 36/51] Run PaletteGod on include --- src/Home/PaletteEditor/PaletteGod.ZC | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index 928846f8..be6c49c7 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -21,3 +21,5 @@ public U0 PaletteGod(Bool seedUse=TRUE, Bool instant=TRUE) LFBFlush; } } + +PaletteGod; \ No newline at end of file From 782bba268c23accc4e3245488c7c16378ea20a85 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Tue, 30 May 2023 01:30:41 +0900 Subject: [PATCH 37/51] 16colors PaletteEdit --- src/Home/PaletteEditor/PaletteEdit.ZC | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index 30e2e785..48e084e0 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -61,9 +61,12 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) tempColor = gr_palette[selected_color]; if (i < border || i > 12 - border || j < border || j > 12 - border) tempColor = 0x000000; - DrawPixel(c->win_task->pix_left + 78 + i, t + 7 + j, tempColor); + // draw color preview + dc->color = tempColor; + GrPlot(dc, c->win_task->pix_left + 78 + i, t + 7 + j); + // DrawPixel(c->win_task->pix_left + 78 + i, t + 7 + j, tempColor); } - GrPrint(dc, 10, 26, "Current Color: #%d", selected_color + 1); + GrPrint(dc, 10, 26, "Current Color: #%d", selected_color); if (selected_color == 15) dc->color = LTGRAY; else if (gr_palette[selected_color] > 0xCCCCCC) @@ -165,8 +168,10 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) else tempColor = 0x000000; } - // color preview - DrawPixel(c->win_task->pix_left + j + (size * i), c->win_task->pix_bottom - size * 1.5 + k, tempColor); + // draw color preview + dc->color = tempColor; + GrPlot(dc, c->win_task->pix_left + j + (size * i), c->win_task->pix_bottom - size * 1.5 + k); + // DrawPixel(c->win_task->pix_left + j + (size * i), c->win_task->pix_bottom - size * 1.5 + k, tempColor); } } // color label and text preview @@ -198,8 +203,8 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) bias = (size / 2) - 4; if (i >= 9) bias = (size / 2) - 8; - GrPrint(dc, bias + (i * size), c->win_task->pix_height - (size * .6) + (size / 4), "%d", i + 1); - GrPrint(dc, 10, (size2 * 2) + 70 + 16 * i, "#%d: Test", i + 1); + GrPrint(dc, bias + (i * size), c->win_task->pix_height - (size * .6) + (size / 4), "%d", i); + GrPrint(dc, 10, (size2 * 2) + 70 + 16 * i, "#%d: Test", i); } From 9cf9e07805ef92cccaf150056aa9d9a9760e5e81 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 01:14:03 +0900 Subject: [PATCH 38/51] 16colors --- src/Home/PaletteEditor/PaletteEdit.ZC | 47 ++++++++------------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index 48e084e0..84713f59 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -44,6 +44,7 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) i, k, j,// l, pos, col, bias; + I64 rectSize = size / 16; // Size of each color rectangle CBGR24 tempColor; /////////////////////// @@ -53,20 +54,8 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) // current color box preview dc->color = BLACK; GrPrint(dc, 10, 10, "Preview:"); + GrPrint(dc, 10, 26, "Current Color: #%d", selected_color); - // pixel loop for current color preview - for (i = 0; i <= 12; i++) - for (j = 0; j <= 12; j++) - { - tempColor = gr_palette[selected_color]; - if (i < border || i > 12 - border || j < border || j > 12 - border) - tempColor = 0x000000; - // draw color preview - dc->color = tempColor; - GrPlot(dc, c->win_task->pix_left + 78 + i, t + 7 + j); - // DrawPixel(c->win_task->pix_left + 78 + i, t + 7 + j, tempColor); - } - GrPrint(dc, 10, 26, "Current Color: #%d", selected_color); if (selected_color == 15) dc->color = LTGRAY; else if (gr_palette[selected_color] > 0xCCCCCC) @@ -76,6 +65,9 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) GrRect(dc, 94, 8, 58, 12); dc->color = selected_color; + // Color preview next to #hex + GrRect(dc, 78, 8, 12, 12); + // #Hex value GrPrint(dc, 95, 10, "#%x%x%x", gr_palette[selected_color].r, gr_palette[selected_color].g, gr_palette[selected_color].b); @@ -155,25 +147,6 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) for (i = 0; i < COLORS_NUM; i++) { - for (j = 0; j <= size; j++) - { - for (k = 0; k <= size; k++) - { - tempColor = gr_palette[i]; - // black borders - if (k < border || k > size - border || j < border || j > size - border - 1) - { - if (selected_color == i) - tempColor = 0xFFFFFF; - else - tempColor = 0x000000; - } - // draw color preview - dc->color = tempColor; - GrPlot(dc, c->win_task->pix_left + j + (size * i), c->win_task->pix_bottom - size * 1.5 + k); - // DrawPixel(c->win_task->pix_left + j + (size * i), c->win_task->pix_bottom - size * 1.5 + k, tempColor); - } - } // color label and text preview // TODO: THIS LOGIC DOESNT WORK ON LIGHT THEMES // if color too light or too dark add bg @@ -188,6 +161,11 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) dc->color = LTRED;*/ else dc->color = 15; + + // Border for preview box + GrRect(dc, (size * i)-1, c->win_task->pix_height - (size*1.5)-1, size+2, size+2); + + if (i == selected_color) dc->color = 0; GrRect(dc, 6, (size2 * 2) + 65 + 16 * i, 80, 18); @@ -195,7 +173,7 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) GrRect(dc, 6, (size2 * 2) + 65 + 16 * i, 80, 18); - + if (i == selected_color) dc->color = 15; else @@ -205,6 +183,9 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) bias = (size / 2) - 8; GrPrint(dc, bias + (i * size), c->win_task->pix_height - (size * .6) + (size / 4), "%d", i); GrPrint(dc, 10, (size2 * 2) + 70 + 16 * i, "#%d: Test", i); + + // preview box + GrRect(dc, (size * i), c->win_task->pix_height - (size*1.5), size, size); } From 5700e961c8f6261235b4a608b2c86e06f5623f99 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 01:40:05 +0900 Subject: [PATCH 39/51] Random Colors hotkey in palette editor --- src/Home/PaletteEditor/Load.ZC | 1 + src/Home/PaletteEditor/PaletteEdit.ZC | 16 +++++--- src/Home/PaletteEditor/PaletteGod.ZC | 53 +++++++++++++++++---------- 3 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/Home/PaletteEditor/Load.ZC b/src/Home/PaletteEditor/Load.ZC index 812b6cab..7678cba0 100755 --- a/src/Home/PaletteEditor/Load.ZC +++ b/src/Home/PaletteEditor/Load.ZC @@ -1,4 +1,5 @@ Cd(__DIR__);; #define PALETTES_PATH "~/PaletteEditor/Palettes/" #include "PaletteSelect" +#include "PaletteGod" #include "PaletteEdit" \ No newline at end of file diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index 84713f59..5fda5cc7 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -38,14 +38,12 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) CSliderState *s = c->state; I64 size = (c->win_task->pix_width / 16), - border = size / 16, +// border = size / 16, size2 = (c->win_task->pix_height / 32), // slider_amount = 3, - i, k, j,// l, + i, pos, col, bias; - I64 rectSize = size / 16; // Size of each color rectangle - CBGR24 tempColor; /////////////////////// // CURRENT SELECTION // @@ -54,7 +52,7 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) // current color box preview dc->color = BLACK; GrPrint(dc, 10, 10, "Preview:"); - GrPrint(dc, 10, 26, "Current Color: #%d", selected_color); + GrPrint(dc, 10, 26, "Current Color: #%d", selected_color); if (selected_color == 15) dc->color = LTGRAY; @@ -428,6 +426,14 @@ public U0 PaletteEditor() current_palette = ""; current_palette = PaletteSelect; break; + case 'r': + gr_palette[selected_color] = ColorGod(FALSE, TRUE); + LFBFlush; + break; + case 'R': + gr_palette[selected_color] = PaletteGod(FALSE, TRUE); + LFBFlush; + break; case CH_CTRLI: PopUpOk("\n\n Use the arrows to select color\n\n # to manually input hex value","\n\n\n\t\tMade by y4my4m\n\n"); break; diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index be6c49c7..35cb3091 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -1,25 +1,40 @@ public U0 PaletteGod(Bool seedUse=TRUE, Bool instant=TRUE) { - // Instantly generate a random palette, seed-based or not + // Instantly generate a random palette, seed-based or not I64 i; - CBGR24 palette; - I32 color; + CBGR24 color; - if (seedUse) - Seed(GodPick); - for (i=0; i < 16; i++) - { - if (instant || seedUse) - { - color = RandI32; - palette = color & 0xFFFFFF; - } - else { - palette = GodPick & 0xFFFFFF; - } - gr_palette[i] = palette; - LFBFlush; - } + if (seedUse) + Seed(GodPick); + for (i=0; i < 16; i++) + { + if (instant || seedUse) + { + color = RandI32 & 0xFFFFFF; + } + else { + color = GodPick & 0xFFFFFF; + } + gr_palette[i] = color; + LFBFlush; + } } -PaletteGod; \ No newline at end of file +CBGR24 ColorGod(Bool seedUse=TRUE, Bool instant=TRUE) +{ + // Instantly generate a random color, seed-based or not + + if (seedUse) + Seed(GodPick); + if (instant || seedUse) + { + return RandI32 & 0xFFFFFF; + } + else { + return GodPick & 0xFFFFFF; + } + +} + + +// PaletteGod; From b8fb29fa2d2857c8eb6c98af35a4abf0704fdbcb Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 01:52:47 +0900 Subject: [PATCH 40/51] Fix --- src/Home/PaletteEditor/Load.ZC | 2 +- src/Home/PaletteEditor/PaletteEdit.ZC | 4 +++- src/Home/PaletteEditor/Palettes/Tradition.ZC | 10 ++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100755 src/Home/PaletteEditor/Palettes/Tradition.ZC diff --git a/src/Home/PaletteEditor/Load.ZC b/src/Home/PaletteEditor/Load.ZC index 7678cba0..ebe27070 100755 --- a/src/Home/PaletteEditor/Load.ZC +++ b/src/Home/PaletteEditor/Load.ZC @@ -1,5 +1,5 @@ Cd(__DIR__);; #define PALETTES_PATH "~/PaletteEditor/Palettes/" #include "PaletteSelect" -#include "PaletteGod" +#include "PaletteGod" #include "PaletteEdit" \ No newline at end of file diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index 5fda5cc7..b6b5c21c 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -357,6 +357,8 @@ public U0 PaletteEditor() " PreviousColor(,,SC_CURSOR_UP);" " NextColor(,,SC_CURSOR_RIGHT);" " NextColor(,,SC_CURSOR_DOWN);" + " RandomColor(,,'r');" + " RandomPalette(,,'R');" "}" "About {" " Info(,CH_CTRLI);" @@ -431,7 +433,7 @@ public U0 PaletteEditor() LFBFlush; break; case 'R': - gr_palette[selected_color] = PaletteGod(FALSE, TRUE); + gr_palette[selected_color] = PaletteGod(FALSE, TRUE); LFBFlush; break; case CH_CTRLI: diff --git a/src/Home/PaletteEditor/Palettes/Tradition.ZC b/src/Home/PaletteEditor/Palettes/Tradition.ZC new file mode 100755 index 00000000..e0ef467b --- /dev/null +++ b/src/Home/PaletteEditor/Palettes/Tradition.ZC @@ -0,0 +1,10 @@ +public CBGR24 gr_palette_tradition[COLORS_NUM] = { +0xE8E8E9, 0x374B88, 0x4FBC2C, 0x29CACE, 0xDD0000, 0x8C33FF, 0x875721, 0x7F7A7C, 0x15171C, 0x2EA1FF, 0x4FFF00, 0xFFBB, 0x690000, 0x6E3FFC, 0xFFCC00, 0xC0F14 +}; +public U0 PaletteSetTradition(Bool persistent=TRUE) +{ + GrPaletteSet(gr_palette_tradition); + LFBFlush; + if (persistent) + fp_set_std_palette = &PaletteSetTradition; +} \ No newline at end of file From 3f64a301e7e7eadffb6122c6252866b70d05446d Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 02:02:00 +0900 Subject: [PATCH 41/51] Cleaner --- src/Home/PaletteEditor/PaletteGod.ZC | 35 ++++++++++------------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index 35cb3091..fea5f2ec 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -1,28 +1,6 @@ -public U0 PaletteGod(Bool seedUse=TRUE, Bool instant=TRUE) -{ - // Instantly generate a random palette, seed-based or not - I64 i; - CBGR24 color; - - if (seedUse) - Seed(GodPick); - for (i=0; i < 16; i++) - { - if (instant || seedUse) - { - color = RandI32 & 0xFFFFFF; - } - else { - color = GodPick & 0xFFFFFF; - } - gr_palette[i] = color; - LFBFlush; - } -} - CBGR24 ColorGod(Bool seedUse=TRUE, Bool instant=TRUE) { - // Instantly generate a random color, seed-based or not + // Generate a random color, seed-based or not if (seedUse) Seed(GodPick); @@ -36,5 +14,16 @@ CBGR24 ColorGod(Bool seedUse=TRUE, Bool instant=TRUE) } +public U0 PaletteGod(Bool seedUse=TRUE, Bool instant=TRUE) +{ + // Generate a random palette, seed-based or not + I64 i; + + for (i=0; i < 16; i++) + { + gr_palette[i] = ColorGod(seedUse, instant); + LFBFlush; + } +} // PaletteGod; From 18e545dfe88e9639b107e016df706de4eb22e933 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 02:05:08 +0900 Subject: [PATCH 42/51] Cleanerer --- src/Home/PaletteEditor/PaletteEdit.ZC | 3 +-- src/Home/PaletteEditor/PaletteGod.ZC | 12 ++---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index b6b5c21c..f9045e9c 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -433,8 +433,7 @@ public U0 PaletteEditor() LFBFlush; break; case 'R': - gr_palette[selected_color] = PaletteGod(FALSE, TRUE); - LFBFlush; + PaletteGod(FALSE, TRUE); break; case CH_CTRLI: PopUpOk("\n\n Use the arrows to select color\n\n # to manually input hex value","\n\n\n\t\tMade by y4my4m\n\n"); diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index fea5f2ec..329250f4 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -1,29 +1,21 @@ CBGR24 ColorGod(Bool seedUse=TRUE, Bool instant=TRUE) { // Generate a random color, seed-based or not - if (seedUse) Seed(GodPick); if (instant || seedUse) - { return RandI32 & 0xFFFFFF; - } - else { + else return GodPick & 0xFFFFFF; - } - } public U0 PaletteGod(Bool seedUse=TRUE, Bool instant=TRUE) { // Generate a random palette, seed-based or not I64 i; - for (i=0; i < 16; i++) - { gr_palette[i] = ColorGod(seedUse, instant); - LFBFlush; - } + LFBFlush; } // PaletteGod; From 2f7381847a7f956552a42d0b319ff714b98ed269 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 02:21:09 +0900 Subject: [PATCH 43/51] Fix --- src/Home/PaletteEditor/PaletteEdit.ZC | 5 ++--- src/Home/PaletteEditor/PaletteGod.ZC | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index f9045e9c..2772e7b2 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -171,7 +171,6 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) GrRect(dc, 6, (size2 * 2) + 65 + 16 * i, 80, 18); - if (i == selected_color) dc->color = 15; else @@ -421,7 +420,7 @@ public U0 PaletteEditor() if (selected_color == 15) selected_color = -1; SelectColor(selected_color + 1, c); - break; + break; } break; case CH_CTRLO: @@ -429,7 +428,7 @@ public U0 PaletteEditor() current_palette = PaletteSelect; break; case 'r': - gr_palette[selected_color] = ColorGod(FALSE, TRUE); + gr_palette[selected_color] = ColorGod(TRUE); LFBFlush; break; case 'R': diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index 329250f4..d8ad16d9 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -1,9 +1,7 @@ -CBGR24 ColorGod(Bool seedUse=TRUE, Bool instant=TRUE) +CBGR24 ColorGod(Bool instant=TRUE) { // Generate a random color, seed-based or not - if (seedUse) - Seed(GodPick); - if (instant || seedUse) + if (instant) return RandI32 & 0xFFFFFF; else return GodPick & 0xFFFFFF; @@ -13,8 +11,10 @@ public U0 PaletteGod(Bool seedUse=TRUE, Bool instant=TRUE) { // Generate a random palette, seed-based or not I64 i; + if (seedUse) + Seed(GodPick); for (i=0; i < 16; i++) - gr_palette[i] = ColorGod(seedUse, instant); + gr_palette[i] = ColorGod(instant); LFBFlush; } From 3c2ab12e309bc39dc596fb861cd6bcfd44bd99b4 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 02:23:31 +0900 Subject: [PATCH 44/51] Removed cursor --- src/Home/PaletteEditor/PaletteGod.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index d8ad16d9..4a2fd688 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -14,7 +14,7 @@ public U0 PaletteGod(Bool seedUse=TRUE, Bool instant=TRUE) if (seedUse) Seed(GodPick); for (i=0; i < 16; i++) - gr_palette[i] = ColorGod(instant); + gr_palette[i] = ColorGod(instant); LFBFlush; } From 9b75e8dd0f33da6b3969d65912392e7327876106 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 02:24:43 +0900 Subject: [PATCH 45/51] Hide doc cursor --- src/Home/PaletteEditor/PaletteEdit.ZC | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index 2772e7b2..61462e9a 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -364,6 +364,7 @@ public U0 PaletteEditor() "}" ); DocClear; + DocCursor(OFF); WinBorder(ON); CCtrl *c = SliderNew; From c947d9d451fce0e4c374f0e7a892ceb59b2c385c Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 02:26:02 +0900 Subject: [PATCH 46/51] Menu fix --- src/Home/PaletteEditor/PaletteEdit.ZC | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index 61462e9a..11877874 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -356,8 +356,8 @@ public U0 PaletteEditor() " PreviousColor(,,SC_CURSOR_UP);" " NextColor(,,SC_CURSOR_RIGHT);" " NextColor(,,SC_CURSOR_DOWN);" - " RandomColor(,,'r');" - " RandomPalette(,,'R');" + " RandomColor(,'r');" + " RandomPalette(,'R');" "}" "About {" " Info(,CH_CTRLI);" From 2b9a3b0bbb54d87b37ba86eed63129952eac16cc Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 02:51:04 +0900 Subject: [PATCH 47/51] Fix --- src/Home/PaletteEditor/PaletteEdit.ZC | 20 ++++++++++++-------- src/Home/PaletteEditor/PaletteGod.ZC | 6 ++++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index 11877874..6465e7c6 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -148,7 +148,7 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) // color label and text preview // TODO: THIS LOGIC DOESNT WORK ON LIGHT THEMES // if color too light or too dark add bg - + if (i == 15) dc->color = LTGRAY; else if (gr_palette[i] < gr_palette[15]) @@ -159,10 +159,6 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) dc->color = LTRED;*/ else dc->color = 15; - - // Border for preview box - GrRect(dc, (size * i)-1, c->win_task->pix_height - (size*1.5)-1, size+2, size+2); - if (i == selected_color) dc->color = 0; @@ -170,19 +166,27 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) GrRect(dc, (size * i), c->win_task->pix_height - (size - size / 2), size, size * 1.5); GrRect(dc, 6, (size2 * 2) + 65 + 16 * i, 80, 18); + if (i == selected_color) dc->color = 15; else dc->color = i; + bias = (size / 2) - 4; if (i >= 9) bias = (size / 2) - 8; + GrPrint(dc, bias + (i * size), c->win_task->pix_height - (size * .6) + (size / 4), "%d", i); GrPrint(dc, 10, (size2 * 2) + 70 + 16 * i, "#%d: Test", i); - + // Border for preview box + GrRect(dc, (size * i)-2, c->win_task->pix_height - (size*1.5)-1, size+2, size+1); // preview box + dc->color = i; GrRect(dc, (size * i), c->win_task->pix_height - (size*1.5), size, size); + + + } @@ -429,11 +433,11 @@ public U0 PaletteEditor() current_palette = PaletteSelect; break; case 'r': - gr_palette[selected_color] = ColorGod(TRUE); + gr_palette[selected_color] = ColorGod; LFBFlush; break; case 'R': - PaletteGod(FALSE, TRUE); + PaletteGod; break; case CH_CTRLI: PopUpOk("\n\n Use the arrows to select color\n\n # to manually input hex value","\n\n\n\t\tMade by y4my4m\n\n"); diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index 4a2fd688..99e92031 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -7,12 +7,14 @@ CBGR24 ColorGod(Bool instant=TRUE) return GodPick & 0xFFFFFF; } -public U0 PaletteGod(Bool seedUse=TRUE, Bool instant=TRUE) +public U0 PaletteGod(Bool seedUse=FALSE, Bool instant=TRUE) { // Generate a random palette, seed-based or not I64 i; - if (seedUse) + + if (seedUse) { Seed(GodPick); + } for (i=0; i < 16; i++) gr_palette[i] = ColorGod(instant); LFBFlush; From 0afbbd6ce236e7fb4c230a2f7a138b6f7076e791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=81=E3=83=A3=E3=83=BC=E3=83=AB=E3=82=BA?= <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 31 May 2023 02:59:33 +0900 Subject: [PATCH 48/51] Update PaletteGod.ZC --- src/Home/PaletteEditor/PaletteGod.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index 99e92031..c2e02d2c 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -1,6 +1,6 @@ CBGR24 ColorGod(Bool instant=TRUE) { - // Generate a random color, seed-based or not + // Generate a random color if (instant) return RandI32 & 0xFFFFFF; else From 8a60eb60a390e6b6bb31fe7b8e7d8403fced8e38 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Wed, 7 Jun 2023 14:14:52 +0900 Subject: [PATCH 49/51] update --- src/Home/PaletteEditor/PaletteEdit.ZC | 10 ++-------- src/Home/PaletteEditor/PaletteGod.ZC | 13 ++++--------- src/Home/PaletteEditor/Palettes/Tradition.ZC | 2 +- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteEdit.ZC b/src/Home/PaletteEditor/PaletteEdit.ZC index 6465e7c6..bf0029d5 100755 --- a/src/Home/PaletteEditor/PaletteEdit.ZC +++ b/src/Home/PaletteEditor/PaletteEdit.ZC @@ -38,9 +38,7 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) CSliderState *s = c->state; I64 size = (c->win_task->pix_width / 16), -// border = size / 16, size2 = (c->win_task->pix_height / 32), -// slider_amount = 3, i, pos, col, bias; @@ -62,10 +60,9 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) dc->color = 15; GrRect(dc, 94, 8, 58, 12); - dc->color = selected_color; - // Color preview next to #hex - GrRect(dc, 78, 8, 12, 12); // #Hex value + dc->color = selected_color; + GrRect(dc, 78, 8, 12, 12); GrPrint(dc, 95, 10, "#%x%x%x", gr_palette[selected_color].r, gr_palette[selected_color].g, gr_palette[selected_color].b); @@ -184,9 +181,6 @@ U0 DrawCtrlSlider(CDC *dc, CCtrl *c) // preview box dc->color = i; GrRect(dc, (size * i), c->win_task->pix_height - (size*1.5), size, size); - - - } diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index c2e02d2c..79eb8745 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -1,6 +1,5 @@ CBGR24 ColorGod(Bool instant=TRUE) -{ - // Generate a random color +{ // Generate a random color, seed-based or not if (instant) return RandI32 & 0xFFFFFF; else @@ -8,16 +7,12 @@ CBGR24 ColorGod(Bool instant=TRUE) } public U0 PaletteGod(Bool seedUse=FALSE, Bool instant=TRUE) -{ - // Generate a random palette, seed-based or not +{ // Generate a random palette, seed-based or not I64 i; - if (seedUse) { - Seed(GodPick); - } + if (seedUse) Seed(GodPick); + for (i=0; i < 16; i++) gr_palette[i] = ColorGod(instant); LFBFlush; } - -// PaletteGod; diff --git a/src/Home/PaletteEditor/Palettes/Tradition.ZC b/src/Home/PaletteEditor/Palettes/Tradition.ZC index e0ef467b..2aa2f68d 100755 --- a/src/Home/PaletteEditor/Palettes/Tradition.ZC +++ b/src/Home/PaletteEditor/Palettes/Tradition.ZC @@ -7,4 +7,4 @@ public U0 PaletteSetTradition(Bool persistent=TRUE) LFBFlush; if (persistent) fp_set_std_palette = &PaletteSetTradition; -} \ No newline at end of file +} \ No newline at end of file From 7a6dda2a1c2ad34835ae1134fb7e962dee7200eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=81=E3=83=A3=E3=83=BC=E3=83=AB=E3=82=BA?= <8145020+y4my4my4m@users.noreply.github.com> Date: Tue, 13 Jun 2023 11:58:38 +0900 Subject: [PATCH 50/51] Update PaletteGod.ZC --- src/Home/PaletteEditor/PaletteGod.ZC | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Home/PaletteEditor/PaletteGod.ZC b/src/Home/PaletteEditor/PaletteGod.ZC index 79eb8745..383ea315 100755 --- a/src/Home/PaletteEditor/PaletteGod.ZC +++ b/src/Home/PaletteEditor/PaletteGod.ZC @@ -1,5 +1,5 @@ CBGR24 ColorGod(Bool instant=TRUE) -{ // Generate a random color, seed-based or not +{// Generate a random color, seed-based or not if (instant) return RandI32 & 0xFFFFFF; else @@ -7,7 +7,7 @@ CBGR24 ColorGod(Bool instant=TRUE) } public U0 PaletteGod(Bool seedUse=FALSE, Bool instant=TRUE) -{ // Generate a random palette, seed-based or not +{// Generate a random palette, seed-based or not I64 i; if (seedUse) Seed(GodPick); From 3f61ca6932b164817a0ab616e6a5db6112a81dab Mon Sep 17 00:00:00 2001 From: mintsuki Date: Sat, 15 Jul 2023 08:12:16 +0200 Subject: [PATCH 51/51] Misc updates for Limine 5.x and Zealbooter --- build/build-iso.sh | 33 ++++++++++++++++----------------- src/Misc/OSInstall.ZC | 10 +++++----- src/System/Boot/LimineMHDIns.ZC | 2 +- zealbooter/GNUmakefile | 30 ++++++++++++++++++------------ zealbooter/lib/print.c | 14 +++++++------- zealbooter/linker.ld | 2 +- zealbooter/zealbooter.c | 2 +- 7 files changed, 49 insertions(+), 44 deletions(-) diff --git a/build/build-iso.sh b/build/build-iso.sh index e97d8874..2c62dc60 100755 --- a/build/build-iso.sh +++ b/build/build-iso.sh @@ -64,7 +64,7 @@ umount_tempdisk echo "Rebuilding kernel headers, kernel, OS, and building Distro ISO ..." $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35,accel=kvm -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -device isa-debug-exit -LIMINE_BINARY_BRANCH="v4.x-branch-binary" +LIMINE_BINARY_BRANCH="v5.x-branch-binary" if [ -d "limine" ] then @@ -74,8 +74,7 @@ then git remote set-head origin $LIMINE_BINARY_BRANCH git switch $LIMINE_BINARY_BRANCH git pull - rm limine-deploy - rm limine-version + rm limine cd .. fi @@ -84,13 +83,13 @@ if [ ! -d "limine" ]; then fi make -C limine -touch limine/Limine-HDD.HH -echo "/*\$WW,1\$" > limine/Limine-HDD.HH -cat limine/LICENSE.md >> limine/Limine-HDD.HH -echo "*/\$WW,0\$" >> limine/Limine-HDD.HH -cat limine/limine-hdd.h >> limine/Limine-HDD.HH -sed -i 's/const uint8_t/U8/g' limine/Limine-HDD.HH -sed -i "s/\[\]/\[$(grep -o "0x" ./limine/limine-hdd.h | wc -l)\]/g" limine/Limine-HDD.HH +touch limine/Limine-BIOS-HDD.HH +echo "/*\$WW,1\$" > limine/Limine-BIOS-HDD.HH +cat limine/LICENSE >> limine/Limine-BIOS-HDD.HH +echo "*/\$WW,0\$" >> limine/Limine-BIOS-HDD.HH +cat limine/limine-bios-hdd.h >> limine/Limine-BIOS-HDD.HH +sed -i 's/const uint8_t/U8/g' limine/Limine-BIOS-HDD.HH +sed -i "s/\[\]/\[$(grep -o "0x" ./limine/limine-bios-hdd.h | wc -l)\]/g" limine/Limine-BIOS-HDD.HH mount_tempdisk echo "Extracting MyDistro ISO from vdisk ..." @@ -101,11 +100,11 @@ sudo cp -rf $TMPMOUNT/* $TMPISODIR sudo rm $TMPISODIR/Boot/OldMBR.BIN 2> /dev/null sudo rm $TMPISODIR/Boot/BootMHD2.BIN 2> /dev/null sudo mkdir -p $TMPISODIR/EFI/BOOT -sudo cp limine/Limine-HDD.HH $TMPISODIR/Boot/Limine-HDD.HH +sudo cp limine/Limine-BIOS-HDD.HH $TMPISODIR/Boot/Limine-BIOS-HDD.HH sudo cp limine/BOOTX64.EFI $TMPISODIR/EFI/BOOT/BOOTX64.EFI -sudo cp limine/limine-cd-efi.bin $TMPISODIR/Boot/Limine-CD-EFI.BIN -sudo cp limine/limine-cd.bin $TMPISODIR/Boot/Limine-CD.BIN -sudo cp limine/limine.sys $TMPISODIR/Boot/Limine.SYS +sudo cp limine/limine-uefi-cd.bin $TMPISODIR/Boot/Limine-UEFI-CD.BIN +sudo cp limine/limine-bios-cd.bin $TMPISODIR/Boot/Limine-BIOS-CD.BIN +sudo cp limine/limine-bios.sys $TMPISODIR/Boot/Limine-BIOS.SYS sudo cp ../zealbooter/zealbooter.elf $TMPISODIR/Boot/ZealBooter.ELF sudo cp ../zealbooter/Limine.CFG $TMPISODIR/Boot/Limine.CFG echo "Copying DVDKernel.ZXE over ISO Boot/Kernel.ZXE ..." @@ -113,13 +112,13 @@ sudo mv $TMPMOUNT/Tmp/DVDKernel.ZXE $TMPISODIR/Boot/Kernel.ZXE sudo rm $TMPISODIR/Tmp/DVDKernel.ZXE 2> /dev/null umount_tempdisk -xorriso -joliet "on" -rockridge "on" -as mkisofs -b Boot/Limine-CD.BIN \ +xorriso -joliet "on" -rockridge "on" -as mkisofs -b Boot/Limine-BIOS-CD.BIN \ -no-emul-boot -boot-load-size 4 -boot-info-table \ - --efi-boot Boot/Limine-CD-EFI.BIN \ + --efi-boot Boot/Limine-UEFI-CD.BIN \ -efi-boot-part --efi-boot-image --protective-msdos-label \ $TMPISODIR -o ZealOS-limine.iso -./limine/limine-deploy ZealOS-limine.iso +./limine/limine bios-install ZealOS-limine.iso if [ "$TESTING" = true ]; then if [ ! -d "ovmf" ]; then diff --git a/src/Misc/OSInstall.ZC b/src/Misc/OSInstall.ZC index ad876287..a51671c4 100755 --- a/src/Misc/OSInstall.ZC +++ b/src/Misc/OSInstall.ZC @@ -1,5 +1,5 @@ -#define LIMINE_HDD_FILE "/Boot/Limine-HDD.HH" +#define LIMINE_HDD_FILE "/Boot/Limine-BIOS-HDD.HH" #define LIMINE_HDD_INSTALLER "/System/Boot/LimineMHDIns.ZC" #include LIMINE_HDD_FILE #include LIMINE_HDD_INSTALLER @@ -127,8 +127,8 @@ U0 OSMerge(U8 dst_drv, U8 src_drv=':') CopyTree("B:/", dst); - ExePrint("Del(\"%C:/Boot/Limine-CD.BIN\");", dst_drv); - ExePrint("Del(\"%C:/Boot/Limine-CD-EFI.BIN\");", dst_drv); + ExePrint("Del(\"%C:/Boot/Limine-BIOS-CD.BIN\");", dst_drv); + ExePrint("Del(\"%C:/Boot/Limine-UEFI-CD.BIN\");", dst_drv); ExePrint("Del(\"%C:/Boot/Limine.CFG\");", dst_drv); ExePrint("Del(\"%C:/boot.catalog\");", dst_drv); @@ -245,8 +245,8 @@ U0 InstallDrive(U8 drv_let) ExePrint("CopyTree(\"::/\",\"%C:/\");", drv_let); - ExePrint("Del(\"%C:/Boot/Limine-CD.BIN\");", drv_let); - ExePrint("Del(\"%C:/Boot/Limine-CD-EFI.BIN\");", drv_let); + ExePrint("Del(\"%C:/Boot/Limine-BIOS-CD.BIN\");", drv_let); + ExePrint("Del(\"%C:/Boot/Limine-UEFI-CD.BIN\");", drv_let); ExePrint("Del(\"%C:/Boot/Limine.CFG\");", drv_let); ExePrint("Del(\"%C:/boot.catalog\");", drv_let); diff --git a/src/System/Boot/LimineMHDIns.ZC b/src/System/Boot/LimineMHDIns.ZC index 714cafe4..c87fbd7e 100755 --- a/src/System/Boot/LimineMHDIns.ZC +++ b/src/System/Boot/LimineMHDIns.ZC @@ -34,7 +34,7 @@ Bool LimineCFGMake(U8 drv_let) bd = drive->bd; drv_let = Drive2Letter(drive); - filename_sys = MStrPrint("%C:/Boot/Limine.SYS", drv_let); + filename_sys = MStrPrint("%C:/Boot/Limine-BIOS.SYS", drv_let); filename_elf = MStrPrint("%C:/Boot/ZealBooter.ELF", drv_let); filename_zxe = MStrPrint("%C:/Boot/Kernel.ZXE", drv_let); if (FileFind(filename_sys) && FileFind(filename_elf) && FileFind(filename_zxe)) diff --git a/zealbooter/GNUmakefile b/zealbooter/GNUmakefile index a0d9a1fd..54eca6ed 100644 --- a/zealbooter/GNUmakefile +++ b/zealbooter/GNUmakefile @@ -18,22 +18,28 @@ endef # It is highly recommended to use a custom built cross toolchain to build a kernel. # We are only using "cc" as a placeholder here. It may work by using # the host system's toolchain, but this is not guaranteed. -$(eval $(call DEFAULT_VAR,CC,cc)) +override DEFAULT_CC := cc +$(eval $(call DEFAULT_VAR,CC,$(DEFAULT_CC))) # Same thing for "ld" (the linker). -$(eval $(call DEFAULT_VAR,LD,ld)) +override DEFAULT_LD := ld +$(eval $(call DEFAULT_VAR,LD,$(DEFAULT_LD))) # User controllable C flags. -$(eval $(call DEFAULT_VAR,CFLAGS,-g -O2 -pipe)) +override DEFAULT_CFLAGS := -g -O2 -pipe +$(eval $(call DEFAULT_VAR,CFLAGS,$(DEFAULT_CFLAGS))) # User controllable C preprocessor flags. We set none by default. -$(eval $(call DEFAULT_VAR,CPPFLAGS,)) +override DEFAULT_CPPFLAGS := +$(eval $(call DEFAULT_VAR,CPPFLAGS,$(DEFAULT_CPPFLAGS))) # User controllable nasm flags. -$(eval $(call DEFAULT_VAR,NASMFLAGS,-F dwarf -g)) +override DEFAULT_NASMFLAGS := -F dwarf -g +$(eval $(call DEFAULT_VAR,NASMFLAGS,$(DEFAULT_NASMFLAGS))) # User controllable linker flags. We set none by default. -$(eval $(call DEFAULT_VAR,LDFLAGS,)) +override DEFAULT_LDFLAGS := +$(eval $(call DEFAULT_VAR,LDFLAGS,$(DEFAULT_LDFLAGS))) # Internal C flags that should not be changed by the user. override CFLAGS += \ @@ -66,9 +72,9 @@ override CPPFLAGS := \ # Internal linker flags that should not be changed by the user. override LDFLAGS += \ + -m elf_x86_64 \ -nostdlib \ -static \ - -m elf_x86_64 \ -z max-page-size=0x1000 \ -T linker.ld @@ -87,8 +93,8 @@ override NASMFLAGS += \ override CFILES := $(shell find -L . -type f -name '*.c') override ASFILES := $(shell find -L . -type f -name '*.S') override NASMFILES := $(shell find -L . -type f -name '*.asm') -override OBJ := $(CFILES:.c=.o) $(ASFILES:.S=.o) $(NASMFILES:.asm=.o) -override HEADER_DEPS := $(CFILES:.c=.d) $(ASFILES:.S=.d) +override OBJ := $(CFILES:.c=.c.o) $(ASFILES:.S=.S.o) $(NASMFILES:.asm=.asm.o) +override HEADER_DEPS := $(CFILES:.c=.c.d) $(ASFILES:.S=.S.d) # Default target. .PHONY: all @@ -105,15 +111,15 @@ $(KERNEL): $(OBJ) -include $(HEADER_DEPS) # Compilation rules for *.c files. -%.o: %.c limine.h +%.c.o: %.c limine.h $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ # Compilation rules for *.S files. -%.o: %.S limine.h +%.S.o: %.S limine.h $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ # Compilation rules for *.asm (nasm) files. -%.o: %.asm +%.asm.o: %.asm nasm $(NASMFLAGS) $< -o $@ # Remove object files and the final executable. diff --git a/zealbooter/lib/print.c b/zealbooter/lib/print.c index 2fbc98d6..d419836f 100644 --- a/zealbooter/lib/print.c +++ b/zealbooter/lib/print.c @@ -4,10 +4,10 @@ #include #include -static volatile struct limine_terminal_request terminal_request = { - .id = LIMINE_TERMINAL_REQUEST, - .revision = 0 -}; +//static volatile struct limine_terminal_request terminal_request = { +// .id = LIMINE_TERMINAL_REQUEST, +// .revision = 0 +//}; #define PRINT_BUFFER_SIZE 8192 @@ -15,14 +15,14 @@ int printf(const char *format, ...) { va_list args; char buffer[PRINT_BUFFER_SIZE]; - struct limine_terminal *terminal; + //struct limine_terminal *terminal; size_t length; va_start(args, format); length = vsnprintf(buffer, PRINT_BUFFER_SIZE, format, args); - terminal = terminal_request.response->terminals[0]; - terminal_request.response->write(terminal, buffer, length); + //terminal = terminal_request.response->terminals[0]; + //terminal_request.response->write(terminal, buffer, length); va_end(args); diff --git a/zealbooter/linker.ld b/zealbooter/linker.ld index 529a4dd1..52f96f0d 100644 --- a/zealbooter/linker.ld +++ b/zealbooter/linker.ld @@ -45,8 +45,8 @@ SECTIONS /* If you need, for example, .init_array and .fini_array, those should be placed */ /* above this. */ .bss : { - *(COMMON) *(.bss .bss.*) + *(COMMON) } :data /* Discard .note.* and .eh_frame since they may cause issues on some hosts. */ diff --git a/zealbooter/zealbooter.c b/zealbooter/zealbooter.c index 195ec3fc..a8a081da 100644 --- a/zealbooter/zealbooter.c +++ b/zealbooter/zealbooter.c @@ -21,7 +21,7 @@ static volatile struct limine_memmap_request memmap_request = { static volatile struct limine_framebuffer_request framebuffer_request = { .id = LIMINE_FRAMEBUFFER_REQUEST, - .revision = 1 + .revision = 0 }; static volatile struct limine_smbios_request smbios_request = {