summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornrootconauto <nrootconauto@gmail.com>2022-11-22 17:18:32 -0500
committernrootconauto <nrootconauto@gmail.com>2022-11-22 17:18:32 -0500
commit8b364dc9bd4e0892fe468554a4c43b271499dd3d (patch)
tree7124a53339393a52cfe5d631ee24edd7f1e006f5
parentd308b002d641414a839617e5ad07a7fc21dfa17f (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.BINbin1113440 -> 1118032 bytes
-rw-r--r--T/Community-Heiresis/CPM/ANSI.HC203
-rw-r--r--T/HCRT.DBG.Zbin270872 -> 270795 bytes
-rw-r--r--T/KERNELA.HH10
-rw-r--r--T/KERNELB.HH4
-rw-r--r--T/Sched.HC13
-rw-r--r--multic.c24
7 files changed, 154 insertions, 100 deletions
diff --git a/HCRT.BIN b/HCRT.BIN
index cb07390..f28362c 100644
--- a/HCRT.BIN
+++ b/HCRT.BIN
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
index f2b818a..194c2de 100644
--- a/T/HCRT.DBG.Z
+++ b/T/HCRT.DBG.Z
Binary files differ
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
diff --git a/T/Sched.HC b/T/Sched.HC
index 4138be7..754661a 100644
--- a/T/Sched.HC
+++ b/T/Sched.HC
@@ -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
}
diff --git a/multic.c b/multic.c
index ca5f0f7..0959681 100644
--- a/multic.c
+++ b/multic.c
@@ -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;