diff options
author | nrootconauto <nrootconauto@gmail.com> | 2022-11-22 17:18:32 -0500 |
---|---|---|
committer | nrootconauto <nrootconauto@gmail.com> | 2022-11-22 17:18:32 -0500 |
commit | 8b364dc9bd4e0892fe468554a4c43b271499dd3d (patch) | |
tree | 7124a53339393a52cfe5d631ee24edd7f1e006f5 | |
parent | d308b002d641414a839617e5ad07a7fc21dfa17f (diff) |
I made changed the orthodox behavour from TempleOS to something more feasible.secret
In my code I used `BreakLock` instead of CLI as it's not allowed in userspace code.
TempleOS will ALWAYS reset the TASKf_BREAK_LOCK thing if you send it a Ctrl+Alt+C. So I disabled this.
I also did some sane windows stuff.
Bungis has a lot to document/unpack when hw gets home from vacation.
Signed-off-by: nrootconauto <nrootconauto@gmail.com>
-rw-r--r-- | HCRT.BIN | bin | 1113440 -> 1118032 bytes | |||
-rw-r--r-- | T/Community-Heiresis/CPM/ANSI.HC | 203 | ||||
-rw-r--r-- | T/HCRT.DBG.Z | bin | 270872 -> 270795 bytes | |||
-rw-r--r-- | T/KERNELA.HH | 10 | ||||
-rw-r--r-- | T/KERNELB.HH | 4 | ||||
-rw-r--r-- | T/Sched.HC | 13 | ||||
-rw-r--r-- | multic.c | 24 |
7 files changed, 154 insertions, 100 deletions
Binary files differ diff --git a/T/Community-Heiresis/CPM/ANSI.HC b/T/Community-Heiresis/CPM/ANSI.HC index c84b065..257d282 100644 --- a/T/Community-Heiresis/CPM/ANSI.HC +++ b/T/Community-Heiresis/CPM/ANSI.HC @@ -49,8 +49,8 @@ U0 DrawTerm(CTask *,CDC *dc) { } } U0 TermPrint(U8 *str) { - I64 dist,dist2; - loop2:; + I64 dist,dist2,ln; +loop2:; if(Term.awaiting&&*str) { while(*str&&!Bt(char_bmp_alpha,*str)) Term.escape_buf[Term.escape_buf_idx++]=*str++; @@ -63,84 +63,111 @@ U0 TermPrint(U8 *str) { switch(*str) { case 0:break; start: - case 'A': - dist=Str2I64(Term.escape_buf+1); - dist=MaxI64(dist,1); - Term.cy=MaxI64(Term.cy-dist,0); - break; - case 'B': - dist=Str2I64(Term.escape_buf+1); - dist=MaxI64(dist,1); - Term.cy=MinI64(Term.cy+dist,TEXT_ROWS-1-1); - break; - case 'C': - dist=Str2I64(Term.escape_buf+1); - dist=MaxI64(dist,1); - Term.cx=MinI64(Term.cx+dist,TEXT_COLS-1); - break; - case 'D': - dist=Str2I64(Term.escape_buf+1); - dist=MaxI64(dist,1); - Term.cx=MaxI64(Term.cx-dist,0); - break; - case 'E': - dist=Str2I64(Term.escape_buf+1); - dist=MaxI64(dist,1); - Term.cy=MinI64(Term.cy+(dist-1),TEXT_ROWS-1-1); - Term.cx=0; - break; - case 'F': - dist=Str2I64(Term.escape_buf+1); - dist=MaxI64(dist,1); - Term.cy=MaxI64(Term.cy-(dist-1),0); - Term.cx=0; - break; - case 'K': - MemSetU8(&Term.text[Term.cy][Term.cx],' ',TEXT_COLS-Term.cx); - MemSetU8(&Term.text_attrs[Term.cy][Term.cx],Term.default_cp,TEXT_COLS-Term.cx); - break; - case 'J': - dist=Str2I64(Term.escape_buf+1); - switch(dist) { - case 3: - MemSetU8(&Term.text,' ',TEXT_COLS*(TEXT_ROWS-1)); - MemSetU8(&Term.text_attrs,Term.default_cp,TEXT_COLS*(TEXT_ROWS-1)); - Term.cy=Term.cx=0; - break; - } - Term.awaiting=FALSE; - Term.escape_buf_idx=0; - break; - case 'H': - StrScan(Term.escape_buf+1,"%d;%dH",&dist,&dist2); - Term.cy=MinI64(dist-1,TEXT_ROWS-1),Term.cx=MinI64(dist2-1,TEXT_COLS); - break; - case 'm': - dist=Str2I64(Term.escape_buf+1); - switch(dist) { - case 0: - Term.cur_cp=Term.default_cp; - break; - case 30...37: - Term.cur_cp&=0xf; - Term.cur_cp|=(dist-30)<<4; - break; - case 40...47: - Term.cur_cp&=0xf0; - Term.cur_cp|=dist-40; - break; - } + case 'A': + dist=Str2I64(Term.escape_buf+1); + dist=MaxI64(dist,1); + Term.cy=MaxI64(Term.cy-dist,0); + break; + case 'B': + dist=Str2I64(Term.escape_buf+1); + dist=MaxI64(dist,1); + Term.cy=MinI64(Term.cy+dist,TEXT_ROWS-1-1); + break; + case 'C': + dist=Str2I64(Term.escape_buf+1); + dist=MaxI64(dist,1); + Term.cx=MinI64(Term.cx+dist,TEXT_COLS-1); + break; + case 'D': + dist=Str2I64(Term.escape_buf+1); + dist=MaxI64(dist,1); + Term.cx=MaxI64(Term.cx-dist,0); + break; + case 'E': + dist=Str2I64(Term.escape_buf+1); + dist=MaxI64(dist,1); + Term.cy=MinI64(Term.cy+(dist-1),TEXT_ROWS-1-1); + Term.cx=0; + break; + case 'F': + dist=Str2I64(Term.escape_buf+1); + dist=MaxI64(dist,1); + Term.cy=MaxI64(Term.cy-(dist-1),0); + Term.cx=0; + break; + case 'G': + dist=Str2I64(Term.escape_buf+1); + Term.cx=ClampI64(dist,0,TEXT_COLS); + break; + case 'K': + dist=Str2I64(Term.escape_buf+1); + switch(dist) { + case 0: + MemSetU8(&Term.text[Term.cy][Term.cx],' ',TEXT_COLS-Term.cx); + MemSetU8(&Term.text_attrs[Term.cy][Term.cx],Term.default_cp,TEXT_COLS-Term.cx); + break; + case 1: + MemSetU8(&Term.text[Term.cy][0],' ',Term.cx); + MemSetU8(&Term.text_attrs[Term.cy][0],Term.default_cp,Term.cx); + break; + case 2: + MemSetU8(&Term.text[Term.cy][0],' ',TEXT_COLS); + MemSetU8(&Term.text_attrs[Term.cy][0],Term.default_cp,TEXT_COLS); + break; + } + break; + case 'J': + dist=Str2I64(Term.escape_buf+1); + switch(dist) { + case 0: + MemSetU8(&Term.text[Term.cy][Term.cx],' ',TEXT_COLS-Term.cx); + for(ln=Term.cy+1;ln<TEXT_ROWS-1;ln++) + MemSetU8(&Term.text[ln][0],' ',TEXT_COLS); + break; + case 1: + for(ln=0;ln<Term.cy;ln++) + MemSetU8(&Term.text[ln][0],' ',TEXT_COLS); + MemSetU8(&Term.text[Term.cy][0],' ',Term.cx); + case 2: + case 3: + MemSetU8(&Term.text,' ',TEXT_COLS*(TEXT_ROWS-1)); + MemSetU8(&Term.text_attrs,Term.default_cp,TEXT_COLS*(TEXT_ROWS-1)); + Term.cy=Term.cx=0; + break; + } + Term.awaiting=FALSE; + Term.escape_buf_idx=0; + break; + case 'H': + StrScan(Term.escape_buf+1,"%d;%dH",&dist,&dist2); + Term.cy=MinI64(dist-1,TEXT_ROWS-1),Term.cx=MinI64(dist2-1,TEXT_COLS); + break; + case 'm': + dist=Str2I64(Term.escape_buf+1); + switch(dist) { + case 0: + Term.cur_cp=Term.default_cp; + break; + case 30...37: + Term.cur_cp&=0xf; + Term.cur_cp|=(dist-30)<<4; + break; + case 40...47: + Term.cur_cp&=0xf0; + Term.cur_cp|=dist-40; + break; + } end: - Term.awaiting=FALSE; - Term.escape_buf_idx=0; - break; + Term.awaiting=FALSE; + Term.escape_buf_idx=0; + break; default: - //TOSPrint("UNIMP:%c\n",*str); - Term.awaiting=FALSE; - Term.escape_buf_idx=0; +TOSPrint("UNIMP:%c\n",*str); + Term.awaiting=FALSE; + Term.escape_buf_idx=0; } if(*str) str++; - goto loop2; + goto loop2; } else { while(*str) { if(*str==0x1b) { @@ -153,7 +180,7 @@ U0 TermPrint(U8 *str) { str++; goto loop2; } - //Backsapce +//Backsapce if(*str==127||*str==8) { Term.text[Term.cy][Term.cx]=' '; Term.cx=MaxI64(Term.cx-1,0); @@ -169,19 +196,19 @@ U0 TermPrint(U8 *str) { Term.cy++; } if(Term.cy>=TEXT_ROWS-1) { - scroll_down: +scroll_down: Term.cy=1; for(;Term.cy<TEXT_ROWS-1;Term.cy++) { - MemCpy( - &Term.text[Term.cy-1], - &Term.text[Term.cy], - TEXT_COLS - ); - MemCpy( - &Term.text_attrs[Term.cy-1], - &Term.text_attrs[Term.cy], - TEXT_COLS - ); + MemCpy( + &Term.text[Term.cy-1], + &Term.text[Term.cy], + TEXT_COLS + ); + MemCpy( + &Term.text_attrs[Term.cy-1], + &Term.text_attrs[Term.cy], + TEXT_COLS + ); } MemSetU8(&Term.text[Term.cy-1],' ',TEXT_COLS); MemSetU8(&Term.text_attrs[Term.cy-1],Term.default_cp,TEXT_COLS); diff --git a/T/HCRT.DBG.Z b/T/HCRT.DBG.Z Binary files differindex f2b818a..194c2de 100644 --- a/T/HCRT.DBG.Z +++ b/T/HCRT.DBG.Z diff --git a/T/KERNELA.HH b/T/KERNELA.HH index cbf2d73..af4dce8 100644 --- a/T/KERNELA.HH +++ b/T/KERNELA.HH @@ -144,7 +144,7 @@ extern class CFile; extern class CCPU; extern class CDyadStream; #ifdef IMPORT_BUILTINS -import U0 __3DaysEnableScaling(U8i); +import U0 __3DaysEnableScaling(U8i); import U0 __3DaysSwapRGB(); import U0 VFsFTrunc(U8i*,I64i); import U0 __AwakeCore(I64i); @@ -3598,6 +3598,12 @@ public class CTask //The Fs segment reg points to current CTask. CWinScroll horz_scroll,vert_scroll; I64 user_data; + // Windows doesn't have a pthread_kill mechanism(usefull for creating "INTERUPTS"). + //Listen up,when Interupting,we cant push stuff to the stack in some cases + // As RSP may be used for something important,so I have devised a shadow stack + // for use from __InteruptCoreRoutineWIN. This will pass the shennanigns + // from multi.c to the shadow stack and will IRET from this poo poo area. + U8 shadow_stk[0x1000]; }; class CTSS { @@ -6533,4 +6539,4 @@ extern U0 SetVolume(F64); extern F64 GetVolume(); extern CTextGlbls text; extern CTask *sys_task_being_scrn_updated; -public extern U0 TaskRep();
\ No newline at end of file +public extern U0 TaskRep(); diff --git a/T/KERNELB.HH b/T/KERNELB.HH index 96caa53..dc7096e 100644 --- a/T/KERNELB.HH +++ b/T/KERNELB.HH @@ -75,7 +75,7 @@ public _extern _XCHG_U8 U8 XchgU8(U8 *dst,U8 d); //eXchange U8s. public _extern _ARG F64 Arg(F64 x,F64 y); //Polar coordinate angle. public _extern _CEIL F64 Ceil(F64 d); //Ceiling of F64. public _extern _CLAMP_I64 I64 ClampI64( - I64 num,I64 lo,I64 hi); //Clamp to I64 [] range. + I64 num,I64 lo,I64 hi); //Clamp to I64 [] range. public _extern _CLAMP_U64 U64 ClampU64( U64 num,U64 lo,U64 hi); //Clamp to U64 [] range. public _extern _EXP F64 Exp(F64 d); //Exponential function. @@ -181,5 +181,5 @@ public _extern _TEXT_LEN_ATTR_STR Bool TextLenAttrStr(CTask *task,I64 x,I64 y, I64 len,U32 *_attr); //Plot attr str with len. 30fps in Fs->draw_it() callback. public _extern _TEXT_LEN_ATTR Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len, I64 attr); //Plot attrs with len. 30fps in Fs->draw_it() callback. -_extern _MALLOC U8 *MAlloc(I64 size,CTask *mem_task=NULL); //Alloc memory chunk. +_extern _MALLOC U8 *MAlloc(I64 size,CTask *mem_task=NULL); //Alloc memory chunk. #endif @@ -257,8 +257,7 @@ BREAK_FOCUS_USER: JZ RESTORE_SETH_TASK_IF_READY BT U64 CTask.win_inhibit[RSI],WIf_SELF_FOCUS JC I32 RESTORE_RSI_TASK - LOCK - BTR U64 CTask.task_flags[RSI],TASKf_BREAK_LOCKED + BT U64 CTask.task_flags[RSI],TASKf_BREAK_LOCKED JNC @@10 LOCK BTS U64 CTask.task_flags[RSI],TASKf_PENDING_BREAK @@ -299,7 +298,7 @@ U0 Yield() { POP RSI } U0 ub2() { - UnblockSignals; + UnblockSignals; } asm { __InteruptCoreRoutine:: @@ -310,4 +309,12 @@ __InteruptCoreRoutine:: POP_REGS; POPFD RET +//SS,RSP,FLAGS,CS,RIP +__InteruptCoreRoutineWIN:: + PUSHFD + PUSH_REGS + CALL &Yield + POP_REGS; + POPFD + IRET } @@ -46,9 +46,6 @@ void *GetFs() { if(!__fs) __fs=TD_MALLOC(2048); return __fs; } -void SetFs(void *f) { - __fs=f; -} int CoreNum() { return __core_num; } @@ -66,11 +63,18 @@ typedef struct { HANDLE thread; CRITICAL_SECTION sleep_CS; CONDITION_VARIABLE sleep_cond; + void *cur_fs; #endif int core_num; void (*fp)(); } CCore; static CCore cores[64]; +void SetFs(void *f) { + #ifdef TARGET_WIN32 + cores[__core_num].cur_fs=f; + #endif + __fs=f; +} static void ExitCore(int sig) { #ifndef TARGET_WIN32 pthread_exit(0); @@ -97,12 +101,22 @@ void InteruptCore(int core) { #else vec_CHash_t *hash; CONTEXT ctx; - hash=map_get(&TOSLoader,"__InteruptCoreRoutine"); - if(hash) { + hash=map_get(&TOSLoader,"__InteruptCoreRoutineWIN"); + if(hash&&cores[core].cur_fs) { memset(&ctx,0 ,sizeof ctx); ctx.ContextFlags=CONTEXT_FULL; SuspendThread(cores[core].thread); GetThreadContext(cores[core].thread,&ctx); + int64_t old_rsp=ctx.Rsp; + //offset(CTask.shadow_stk)+0x1000-8. See KERNELA.HH for notes + ctx.Rsp=(char*)cores[core].cur_fs+0x4a8+0x1000-8; + ((int64_t*)ctx.Rsp)[0]=ctx.SegSs; + ctx.Rsp-=8; + ((int64_t*)ctx.Rsp)[0]=old_rsp; + ctx.Rsp-=8; + ((int64_t*)ctx.Rsp)[0]=ctx.EFlags; + ctx.Rsp-=8; + ((int64_t*)ctx.Rsp)[0]=ctx.SegCs; ctx.Rsp-=8; ((int64_t*)ctx.Rsp)[0]=ctx.Rip; ctx.Rip=hash->data[0].val; |