LTCD_060719.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:45:17 +02:00
commit f86e69648b
156 files changed
+49537

No files matched your search

+877
View File
@@ -0,0 +1,877 @@
BoolU4 AssignBit(U1 *field,U8 bit,U8 val)
{
if (val)
return Bts(field,bit);
else
return Btr(field,bit);
}
void PortNop()
{
InP(0x379); //This is an innoculous ISA (parallel port)
//access which should take
//fixed time on all machines.
//It takes 1.66uS
}
void Exit()
{
Bts(&Fs->task_flags,TSSf_KILL_TASK);
while (TRUE)
SwapInNext;
}
void Kill(TssStruct *tss)
{
Bts(&tss->task_flags,TSSf_KILL_TASK);
}
void SimpleTimerIrq()
{
U8 old_flags=GetFlags;
Cli;
jiffies++;
sys_timer+=SYS_TIMER0_PERIOD+1;
SetFlags(old_flags);
}
U8 ReadSysTimer()
{
U8 i,old_flags=GetFlags;
U8 result;
Cli;
OutP(0x43,0); //Latch Timer0
i=InP(0x40);
i+=(InP(0x40)<<8);
result=sys_timer+SYS_TIMER0_PERIOD-i;
SetFlags(old_flags);
return result;
}
U8 ExceptDepth(TssStruct *tss=NULL)
{
U8 result=0;
ExceptStruct *tempt;
if (!tss) tss=Fs;
tempt=tss->next_except;
while (tempt!=&tss->next_except) {
result++;
tempt=tempt->next;
}
return result;
}
asm {
CP_TEST_EXCEPT::
MOV EAX,U4 FS:[TSS_LAST_EXCEPT]
MOV EBP,U4 EXCEPT_EBP[EAX]
MOV ESI,U4 EXCEPT_ESI[EAX]
MOV EDI,U4 EXCEPT_EDI[EAX]
CALL U4 EXCEPT_HANDLER_START[EAX]
RET
CP_CATCH_EXCEPT::
MOV EAX,U4 FS:[TSS_LAST_EXCEPT]
MOV EDX,U4 EXCEPT_HANDLER_SKIP[EAX]
MOV ESP,U4 EXCEPT_ESP[EAX]
JMP EDX
CP_SAVE_EXCEPT_ESI_EDI::
PUSH EBP
MOV EBP,ESP
MOV EAX,SF_PARAM1[EBP]
MOV U4 EXCEPT_ESI[EAX],ESI
MOV U4 EXCEPT_EDI[EAX],EDI
POP EBP
RET
};
LTextern CP_TEST_EXCEPT void TestExcept();
LTextern CP_CATCH_EXCEPT void TakeExcept();
LTextern CP_SAVE_EXCEPT_ESI_EDI void SaveExceptRegs(ExceptStruct *t);
exe {NoRegVar(ON);}
void SysTry(U1 *start_label,U1 *skip_label,U8 my_ebp,U8 my_esp)
{
U4 *ptr=GetBasePtr;
ExceptStruct *tempt=MAlloc(sizeof(ExceptStruct));
tempt->handler_start=start_label;
tempt->handler_skip=skip_label;
tempt->esp=my_esp+8;
tempt->ebp=my_ebp;
SaveExceptRegs(tempt);
InsQue(tempt,Fs->last_except);
}
void SysCatch()
{
ExceptStruct *tempt=Fs->last_except;
RemQue(tempt);
Free(tempt);
}
void throw(...)
{
ExceptStruct *tempt=Fs->last_except;
U8 i;
AdamLog("Depth:%02X Tsk:%08X throw(",
ExceptDepth(Fs),Fs); //TODO: fix compiler--"(FS)"
for (i=0;i<argc;i++)
AdamLog("%X,",argv[i]);
AdamLog(");\r\n");
Fs->except_argc=argc;
Fs->except_argv=argv;
Fs->except_ebp=GetBasePtr;
Fs->catch_except=FALSE;
while (tempt!=&Fs->next_except) {
TestExcept;
if (Fs->catch_except)
TakeExcept;
SetBasePtr(Fs->except_ebp);
RemQue(tempt);
Free(tempt);
tempt=Fs->last_except;
}
PutSysText("ST_UNHANDLED_EXCEPTION");
while (TRUE)
SwapInNext;
}
exe {NoRegVar(OFF);}
void KbdCmdSend(U8 port, U1 val)
{
U8 timeout;
for (timeout=50000;
(InP(KEYB_CTRL)&2) && timeout;timeout--)
PortNop;
if (timeout)
OutP(port, val);
else
throw(EXCEPT_LOCAL);
}
I8 KbdCmdRead()
{
U8 timeout;
for (timeout=50000; timeout; timeout--) {
if (InP(KEYB_CTRL) & 1)
return InP(KEYB_PORT);
else
PortNop;
}
return -1;
}
void KbdCmdFlush()
{
I8 i;
for (i=0;i<1000;i++) {
if (InP(KEYB_CTRL) & 1) {
InP(KEYB_PORT);
i=0;
} else
PortNop;
}
}
void KbdSetLEDs(U8 sc)
{
U8 old_flags=GetFlags;
U1 v=0;
AssignBit(&v,0,Bt(&sc,SCf_SCROLL));
AssignBit(&v,1,Bt(&sc,SCf_NUM));
AssignBit(&v,2,Bt(&sc,SCf_CAPS));
Cli;
KbdCmdSend(KEYB_PORT,0xED);
KbdCmdSend(KEYB_PORT,v);
SetFlags(old_flags);
}
void KbdMouseCmdAck(U1 val)
{
U1 b;
U8 timeout=32;
BoolU4 cont=TRUE;
while (cont && timeout) {
try {
KbdCmdSend(KEYB_CTRL,0xD4);
KbdCmdSend(KEYB_PORT,val);
b=KbdCmdRead;
if (b==0xFA)
cont=FALSE;
} catch
Fs->catch_except=TRUE;
timeout--;
}
if (cont)
throw(EXCEPT_LOCAL);
}
void InitKeyboard()
{
KbdCmdSend(KEYB_PORT,0xF0);
KbdCmdSend(KEYB_PORT,0x02);
KbdSetLEDs(sys_cur_scan_code);
}
U1 scan_code_map[0x100]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,SC_SHIFT,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,SC_CR,SC_CTRL,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0x35,0,0,0,SC_ALT,0,0,0,0,0,0,
0,0,0,0,0,0,0,SC_HOME,SC_CURSOR_UP,SC_PAGE_UP,0,SC_CURSOR_LEFT,0,SC_CURSOR_RIGHT,0,SC_END,
SC_CURSOR_DOWN,SC_PAGE_DOWN,SC_INSERT,SC_DELETE,0,0,0,0,0,0,0,0,SC_GUI,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
U1 num_lock_map[0x100]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,8,9,10,0,5,6,7,0,2,
3,4,11,0x34,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,SC_CR,SC_CTRL,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0x35,0,0,0,SC_ALT,0,0,0,0,0,0,
0,0,0,0,0,0,0,SC_HOME,SC_CURSOR_UP,SC_PAGE_UP,0,SC_CURSOR_LEFT,0,SC_CURSOR_RIGHT,0,SC_END,
SC_CURSOR_DOWN,SC_PAGE_DOWN,SC_INSERT,SC_DELETE,0,0,0,0,0,0,0,0,SC_GUI,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
asm {CP_KBD_HANDLER::}
void KbdHandler()
{
void kbd_hand2();
U8 sc=sys_cur_scan_code&~0x1FF,
sc2=InP(KEYB_PORT),sc3,sc_raw;
Bts(&sys_irq_flags,1);
if (sc2==0xE0) {
sys_cur_scan_code|=SCF_PRIOR_E0;
return;
}
AssignBit(&sc2,SCf_KEY_UP,sc2 & 0x80);
AssignBit(&sc2,SCf_E0_PREFIX,Btr(&sc,SCf_PRIOR_E0));
sc_raw=sc2;
if (sc & SCF_NUM) {
if (sc3=num_lock_map[sc2.u1[0]])
sc2.u1[0]=sc3;
} else {
if (sc3=scan_code_map[sc2.u1[0]])
sc2.u1[0]=sc3;
}
if (sc2==SC_SHIFT) {
sc|=SCF_SHIFT;
goto new_key_done;
}
if (sc2==SC_SHIFT+SCF_KEY_UP) {
sc&=~SCF_SHIFT;
goto new_key_done;
}
if (sc2==SC_CTRL) {
sc|=SCF_CTRL;
goto new_key_done;
}
if (sc2==SC_CTRL+SCF_KEY_UP) {
sc&=~SCF_CTRL;
goto new_key_done;
}
if (sc2==SC_ALT) {
sc|=SCF_ALT;
goto new_key_done;
}
if (sc2==SC_ALT+SCF_KEY_UP) {
sc&=~SCF_ALT;
goto new_key_done;
}
if (sc2==SC_CAPS)
goto new_key_done;
if (sc2==SC_CAPS+SCF_KEY_UP) {
sc^=SCF_CAPS;
KbdSetLEDs(sc);
goto new_key_done;
}
if (sc2==SC_NUM)
goto new_key_done;
if (sc2==SC_NUM+SCF_KEY_UP) {
sc^=SCF_NUM;
KbdSetLEDs(sc);
goto new_key_done;
}
if (sc2==SC_SCROLL)
goto new_key_done;
if (sc2==SC_SCROLL+SCF_KEY_UP) {
sc^=SCF_SCROLL;
KbdSetLEDs(sc);
goto new_key_done;
}
if (sc & SCF_CTRL && sc & SCF_ALT) {
if (sc2==SC_DELETE) {
Bts(&sys_flags,SYSf_CTRL_ALT_DEL);
goto mostly_done;
}
if (sc2==1) {
Bts(&sys_flags,SYSf_CTRL_ALT_ESC);
goto mostly_done;
}
if (sc2==15) {
Bts(&sys_flags,SYSf_CTRL_ALT_TAB);
goto mostly_done;
}
if (sc2==0x2D) {
Bts(&sys_flags,SYSf_CTRL_ALT_X);
goto mostly_done;
}
if (sc2==0x2E) {
Bts(&sys_flags,SYSf_CTRL_ALT_C);
goto mostly_done;
}
}
new_key_done:
sc|=SCF_NEW_KEY;
mostly_done:
sys_cur_scan_code=sc|sc2;
sys_cur_raw_scan_code=sc|sc_raw;
if (kbd_hand2=ext[EXT_IRQ01])
kbd_hand2();
Btr(&sys_irq_flags,1);
}
U8 DivU8(U8 n1,U8 n2)
{
U8 r_lo=n1,r_hi=0;
U8 i;
for (i=0;i<64;i++) {
if (r_lo & 0x8000000000000000) {
r_hi<<=1;
r_hi++;
} else
r_hi<<=1;
r_lo<<=1;
if (r_hi>=n2) {
r_hi-=n2;
r_lo++;
}
}
return r_lo;
}
I8 DivI8(I8 n1,I8 n2)
{
U8 r_lo,r_hi=0;
U8 i;
BoolU4 signed;
if (n1<0) {
signed=TRUE;
n1=-n1;
} else
signed=FALSE;
if (n2<0) {
signed=!signed;
n2=-n2;
}
r_lo=n1;
for (i=0;i<64;i++) {
if (r_lo & 0x8000000000000000) {
r_hi<<=1;
r_hi++;
} else
r_hi<<=1;
r_lo<<=1;
if (r_hi>=n2) {
r_hi-=n2;
r_lo++;
}
}
return (signed) ? -r_lo:r_lo;
}
U8 ModU8(U8 n1,U8 n2)
{
U8 r_lo=n1,r_hi=0;
U8 i;
for (i=0;i<64;i++) {
if (r_lo & 0x8000000000000000) {
r_hi<<=1;
r_hi++;
} else
r_hi<<=1;
r_lo<<=1;
if (r_hi>=n2) {
r_hi-=n2;
r_lo++;
}
}
return r_hi;
}
I8 ModI8(I8 n1,I8 n2)
{
U8 r_lo,r_hi=0;
U8 i;
BoolU4 signed;
if (n1<0) {
signed=TRUE;
n1=-n1;
} else
signed=FALSE;
if (n2<0) {
signed=!signed;
n2=-n2;
}
r_lo=n1;
for (i=0;i<64;i++) {
if (r_lo & 0x8000000000000000) {
r_hi<<=1;
r_hi++;
} else
r_hi<<=1;
r_lo<<=1;
if (r_hi>=n2) {
r_hi-=n2;
r_lo++;
}
}
return (signed) ? -r_hi:r_hi;
}
LTDate BootTime()
//Roughly 49,710ths of a second since boot
{
return DivU8(ReadSysTimer<<14,1833333*3*3*3/125);
}
U2 RandU2() //TODO: fix this
{
LTDate i=BootTime;
rnd_SEED^=MulU8(rnd_SEED,0x56234)+i.date^i.time^jiffies+ModU8(rnd_SEED,0x7635);
return rnd_SEED.u2[0];
}
U8 RandU4()
{
U8 result=0;
result.u2[0]=RandU2;
result.u2[1]=RandU2;
return result;
}
I8 ToUpper(I8 ch)
{
if (ch>='a' && ch<='z')
return ch+'A'-'a';
else
return ch;
}
I8 AtoI(I1 *st,I8 radix=10,I1 **end_ptr=NULL)
{
BoolU4 neg=FALSE;
I1 ch;
I8 result=0,k=0;
if (radix<2||radix>36) return 0;
while (*st==CH_SPACE || *st==CH_SHIFT_SPACE || *st==CH_TAB)
st++;
if (*st=='-') {
st++;
neg=TRUE;
}
if (*st=='+') st++;
while (ch=ToUpper(*st++)) {
k++;
if (radix==10) {
if (ch>='0' && ch<='9')
result=MulI8(result,10)+ch-'0';
else if (k==2 && !result) {
if (ch=='X')
radix=16;
else if (ch=='B')
radix=2;
else if (ch=='o')
radix=8;
else
break;
} else
break;
} else if (radix>10) {
if (ch>='0' && ch<='9')
result=MulI8(result,radix)+ch-'0';
else if (ch>='A' && ch<='A'+radix-11)
result=MulI8(result,radix)+ch-'A'+10;
else
break;
} else {
if (ch>='0' && ch<='0'+radix-1)
result=MulI8(result,radix)+ch-'0';
else
break;
}
}
if (end_ptr) *end_ptr=st-1;
return (neg)? -result:result;
}
void BusyWait(U8 uS) //Loosely timed
{
U8 i;
for (i=0;i<uS;i++)
PortNop;
}
void Sleep(U8 mS)
{
U8 old_flags=GetFlags;
U8 target_jiffies=jiffies+(mS*JIFFY_FREQ/1000);
Sti;
do SwapInNext;
while (jiffies<target_jiffies);
SetFlags(old_flags);
}
void Sound(U8 freq)
{
U8 p,old_flags=GetFlags;
if (Bt(&sys_flags,SYSf_NO_SOUND))
return;
if (freq) {
p=SYS_TIMER_FREQ/freq;
Cli;
OutP(0x43,0xB6);
OutP(0x42,p);
OutP(0x42,p.u1[1]);
OutP(0x61,3);
SetFlags(old_flags);
} else
OutP(0x61,0);
}
void Beep(U8 freq=500,BoolU4 busy=FALSE)
{
Sound(freq);
if (busy) BusyWait(500000);
else Sleep(500);
Sound(0);
if (busy) BusyWait(200000);
else Sleep(200);
}
BoolU4 Externs2Imports(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_EXTERNS_TO_IMPORTS,val);
}
BoolU4 KeepPrivate(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_KEEP_PRIVATE,val);
}
BoolU4 PTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_PARSE_TRACE,val);
}
BoolU4 OTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_OPT_TRACE,val);
}
BoolU4 CTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_COMPILE_TRACE,val);
}
BoolU4 LTrace(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_LEX_TRACE,val);
}
BoolU4 NoRegVar(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_NO_REG_VAR,val);
}
BoolU4 Echo(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_ECHO,val);
}
BoolU4 SysEcho(BoolU4 val) {
return AssignBit(&Fs->last_lex->flags,LFf_ECHO,val);
}
BoolU4 Silent(BoolU4 val) {
return AssignBit(&Fs->crt_flags,CRTf_SILENT,val);
}
BoolU4 Preempt(BoolU4 val) {
return AssignBit(&sys_flags,SYSf_PREEMPTIVE,val);
}
BoolU4 SysDbg(BoolU4 val) {
return AssignBit(&sys_flags,SYSf_DEBUG,val);
}
BoolU4 IsSysDbg() {
return Bt(&sys_flags,SYSf_DEBUG);
}
BoolU4 Raw(BoolU4 val) {
if (val) {
OutP(VGA_SC_INDEX,VGA_MAP_MASK);
OutP(VGA_SC_DATA,0x0F);
}
return AssignBit(&sys_flags,SYSf_RAW_CRT_OUT,val);
}
BoolU4 IsRaw() {
return Bt(&sys_flags,SYSf_RAW_CRT_OUT);
}
U1 *Caller()
{
U4 *bp=GetBasePtr;
bp=*bp+4;
return *bp;
}
U1 *CallerCaller()
{
U4 *bp=GetBasePtr;
bp=*bp;
bp=*bp+4;
return *bp;
}
void DbgStr(I1 *st,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
cout "DbgStr(",st,")";
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgNum(U8 num,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
cout "DbgNum(",num,")";
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgF(double d,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
cout "DbgF(",d,")";
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgAdd(U4 *add,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
PrintF("DbgAdd(%P)",add);
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgD(U4 *add,U8 cnt=0x80,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
D(add,cnt);
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
void DbgDm(U4 *add,U8 cnt=0x80,U8 mS=100)
{
BoolU4 old_flags=GetFlags;
BoolU4 old_raw;
Cli;
old_raw=Raw(ON);
Dm(add,cnt);
BusyWait(mS<<10);
SetFlags(old_flags);
Raw(old_raw);
}
SysHashEntry *FindLocalHash(I1 *st,U8 mask)
{
return FindHashEntry(st,Fs->hash_table,mask);
}
void Beeps(U8 j,BoolU4 busy)
{
U8 i,f;
for (i=0;i<8;i++) {
if (Bt(&j,i+24)) {
f=200;
if (Bt(&j,i+8))
f+=400;
if (Bt(&j,i+16))
f+=800;
Sound(f);
if (busy) {
if (Bt(&j,i))
BusyWait(300000);
else
BusyWait(100000);
} else {
if (Bt(&j,i))
Sleep(400);
else
Sleep(150);
}
Sound(0);
}
if (busy)
BusyWait(150000);
else
Sleep(300);
}
}
void UnrecoverableSysError(U8 j)
{
Cli;
while (TRUE) {
Beeps(j,TRUE);
Raw(ON);
coutln "Unrecoverable SysError:",j;
BusyWait(500000);
}
}
asm {CP_BREAK::}
void Break()
{
ReleaseTaskPartitions;
IntFlushMsgs;
throw(EXCEPT_BREAK);
}
void ThrowDivide(U1 *eip)
{
throw(EXCEPT_ARITHMETIC,eip);
}
void ThrowFloating(U1 *eip)
{
throw(EXCEPT_FLOATING,eip);
}
SysHashEntry *FindPSect(U8 add,I8 *offset)
{
SysHashEntry *result=NULL,*temph;
SysHashTable *h=Fs->hash_table;
ClassStruct *tempc;
U8 i,best=0x8000,j;
while (h) {
for (i=0;i<=h->mask;i++) {
temph=h->body[i];
while (temph) {
if (temph->type&HTT_FUNCTION) {
tempc=temph;
j=tempc->executable_address;
} else
j=temph->user0;
j=add-j;
if (temph->type&(HTT_SYS_SYMBOL|HTT_FUNCTION)) {
if (j<best) {
best=j;
result=temph;
}
}
temph=temph->next;
}
}
h=h->next;
}
*offset=best;
return result;
}
U8 GetS(I1 *buf,U8 size)
{
I8 ch;
I1 *buf2;
U8 i=0;
void my_SysGetS();
if (!size || !buf) return 0;
i=FindExtern("SysGetS");
if (i) {
my_SysGetS=i;
buf2=my_SysGetS();
if (StrLen(buf2)>size-1) {
MemCpy(buf,buf2,size-1);
buf[size-1]=0;
} else
StrCpy(buf,buf2);
i=StrLen(buf);
Free(buf2);
} else {
while (TRUE) {
ch=GetKey;
if (ch==CH_CR) {
PutChar(ch);
break;
} if (ch==CH_BACKSPACE) {
if (i>0) {
i--;
PutChar(ch);
}
} else {
if (i<size-1) {
buf[i++]=ch;
PutChar(ch);
}
}
}
buf[i]=0;
}
return i;
}