TempleOSCDV5.00.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:48:09 +02:00
1 parent 122df6338e
commit f6eacf7744
374 files changed
+11078 -11204

No files matched your search

+22 -19
View File
@@ -160,10 +160,10 @@ Bool ATAPIStartStop(CBlkDev *bd,F64 timeout,Bool start)
return FALSE;
}
I64 ATAGetDevId(CBlkDev *bd,F64 timeout,U16 **_id_record)
I64 ATAGetDevId(CBlkDev *bd,F64 timeout,Bool keep_id_record)
{
U16 *id_record;
if (_id_record) *_id_record=NULL;
I64 res=BDT_NULL;
U16 *id_record=NULL;
if (bd->type!=BDT_ATAPI && bd->base1)
OutU8(bd->base1+ATAR1_CTRL,0x8);
if (bd->flags & BDF_EXT_SIZE)
@@ -171,24 +171,30 @@ I64 ATAGetDevId(CBlkDev *bd,F64 timeout,U16 **_id_record)
else
OutU8(bd->base0+ATAR0_SEL,0xE0|bd->unit<<4);
ATACmd(bd,ATA_ID_DEV);
if (!ATAWaitNotBUSY(bd,timeout))
return BDT_NULL;
if (InU8(bd->base0+ATAR0_STAT)&ATAS_ERR)
return BDT_ATAPI;
id_record=ACAlloc(512);
if (!ATAGetRes(bd,timeout,id_record,512,512,FALSE)) {
Free(id_record);
return BDT_NULL;
if (ATAWaitNotBUSY(bd,timeout)) {
if (InU8(bd->base0+ATAR0_STAT)&ATAS_ERR)
res=BDT_ATAPI;
else {
id_record=ACAlloc(512);
if (ATAGetRes(bd,timeout,id_record,512,512,FALSE))
res=BDT_ATA;
else {
Free(id_record);
id_record=NULL;
}
}
}
if (_id_record) *_id_record=id_record;
return BDT_ATA;
if (keep_id_record) {
Free(bd->dev_id_record);
bd->dev_id_record=id_record;
}
return res;
}
I64 ATAReadNativeMax(CBlkDev *bd,F64 timeout)
{//Returns zero on err
I64 res=0;
Bool okay=TRUE;
if (bd->type==BDT_ATAPI) {
if (bd->flags & BDF_EXT_SIZE)
OutU8(bd->base0+ATAR0_SEL,0xEF|bd->unit<<4);
@@ -207,9 +213,7 @@ I64 ATAReadNativeMax(CBlkDev *bd,F64 timeout)
if (0<timeout<tS)
return FALSE;
}
Free(bd->dev_id_record);
if (ATAGetDevId(bd,timeout,&bd->dev_id_record)==BDT_NULL)
if (ATAGetDevId(bd,timeout,TRUE)==BDT_NULL)
okay=FALSE;
else
BEqu(&bd->flags,BDf_EXT_SIZE,Bt(&bd->dev_id_record[86],10));
@@ -310,7 +314,6 @@ Bool ATAInit(CBlkDev *bd)
bd->flags|=BDF_EXT_SIZE;
if (ATAReadNativeMax(bd,tS+0.1)) {
ATABlkSel(bd,bd->max_blk,0);
if (bd->flags&BDF_EXT_SIZE)
ATACmd(bd,ATA_SET_MAX_EXT);
@@ -379,7 +382,7 @@ I64 ATAProbe(I64 base0,I64 base1,I64 unit)
bd.base1=base1;
bd.unit=unit;
bd.blk_size=DVD_BLK_SIZE;
return ATAGetDevId(&bd,tS+0.1,NULL);
return ATAGetDevId(&bd,tS+0.1,FALSE);
}
Bool ATAPIReadBlks2(CBlkDev *bd,F64 timeout,U8 *buf,
+1 -1
View File
@@ -244,7 +244,7 @@ CBlkDev *ATAMount(U8 first_drv_let,I64 type,I64 base0,I64 base1,I64 unit)
res->unit=unit;
res->base0=base0;
res->base1=base1;
if (BlkDevAdd(res,FALSE,FALSE))
if (BlkDevAdd(res,,FALSE,FALSE))
return res;
}
return NULL;
+21 -11
View File
@@ -24,18 +24,20 @@ U0 BlkDevLockFwdingSet(CBlkDev *bd)
}
}
I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free)
{
I64 i,j,ext_base,offset,res=0;
I64 BlkDevAdd(CBlkDev *bd,I64 prt_num=MIN_I64,
Bool whole_drv,Bool make_free)
{//It will mount just one partition of prt_num>=0.
//When repartitioing whole drive, whole_drv=TRUE.
I64 i,j,ext_base,offset,res=0,num=0;
CDrv *dv;
CRedSeaBoot br;
CMasterBoot mbr;
bd->bd_signature=BD_SIGNATURE_VAL;
if (make_free)
dv=DrvMakeFreeSlot(bd->first_drv_let+res);
dv=DrvMakeFreeSlot(bd->first_drv_let);
else
dv=DrvMakeFreeSlot(DrvNextFreeLet(bd->first_drv_let+res));
dv=DrvMakeFreeSlot(DrvNextFreeLet(bd->first_drv_let));
dv->bd=bd;
dv->drv_offset=bd->drv_offset;
dv->size=bd->max_blk+1-bd->drv_offset;
@@ -44,6 +46,7 @@ I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free)
case BDT_ISO_FILE_READ:
case BDT_ISO_FILE_WRITE:
dv->dv_signature=DRV_SIGNATURE_VAL;
dv->prt_num=num;
dv->fs_type=FSt_REDSEA;
//This is to force creation of a RAM
//drive during boot, so it is probably
@@ -63,8 +66,9 @@ I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free)
dv->dv_signature=0; //Revoke validation
else {
dv->dv_signature=0; //Revoke validation
if (one_drv) {
if (whole_drv) {
dv->dv_signature=DRV_SIGNATURE_VAL;
dv->prt_num=num;
res++;
dv->fs_type=FSt_REDSEA;
dv->size=bd->max_blk+1-bd->drv_offset;
@@ -75,12 +79,12 @@ I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free)
}
offset=0;
ext_base=INVALID_CLUSTER;
while (TRUE) {
while (prt_num<0 || num<=prt_num) {
ATAReadBlks(bd,&mbr,offset,1);
if (mbr.signature!=0xAA55)
break;
j=-1;
for (i=0;i<4;i++) {
for (i=0;i<4 && (prt_num<0 || num<=prt_num);i++) {
if (mbr.p[i].type) {
if (make_free)
dv=DrvMakeFreeSlot(bd->first_drv_let+res);
@@ -92,9 +96,10 @@ I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free)
switch (mbr.p[i].type) {
case MBR_PT_REDSEA:
dv->dv_signature=DRV_SIGNATURE_VAL;
dv->prt_num=num;
res++;
dv->fs_type=FSt_REDSEA;
RedSeaDrvInit(dv);
RedSeaInit(dv);
break;
case MBR_PT_FAT32a:
case MBR_PT_FAT32b:
@@ -104,17 +109,19 @@ I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free)
case MBR_PT_FAT32f:
ATAReadBlks(bd,&br,dv->drv_offset,1);
dv->dv_signature=DRV_SIGNATURE_VAL;
dv->prt_num=num;
res++;
if (br.signature==MBR_PT_REDSEA) {
dv->fs_type=FSt_REDSEA;
RedSeaDrvInit(dv);
RedSeaInit(dv);
} else {
dv->fs_type=FSt_FAT32;
FAT32DrvInit(dv);
FAT32Init(dv);
}
break;
case MBR_PT_NTFS:
dv->dv_signature=DRV_SIGNATURE_VAL;
dv->prt_num=num;
res++;
dv->fs_type=FSt_NTFS;
break;
@@ -124,9 +131,11 @@ I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free)
break;
default:
dv->dv_signature=DRV_SIGNATURE_VAL;
dv->prt_num=num;
res++;
dv->fs_type=FSt_UNKNOWN;
}
num++;
}
}
if (Let2BlkDevType(bd->first_drv_let+res)!=bd->type)
@@ -145,6 +154,7 @@ I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free)
break;
case BDT_ATAPI:
dv->dv_signature=DRV_SIGNATURE_VAL;
dv->prt_num=num;
res++;
dv->fs_type=FSt_ISO9660; //Start with this
dv->size=0;
+12 -7
View File
@@ -44,8 +44,8 @@ Bool BlkDevInit(CBlkDev *bd)
}
dv->fs_type=FSt_REDSEA;
dv->size=bd->max_blk+1-bd->drv_offset;
if (RedSeaDrvValidate(bd->first_drv_let))
RedSeaDrvInit(dv);
if (RedSeaValidate(bd->first_drv_let))
RedSeaInit(dv);
else
RedSeaFmt(bd->first_drv_let);
res=TRUE;
@@ -54,21 +54,25 @@ Bool BlkDevInit(CBlkDev *bd)
if (FileFind(bd->file_dsk_name,&de,FUF_JUST_FILES)) {
bd->max_blk=de.size>>BLK_SIZE_BITS-1;
try bd->file_dsk=FOpen(bd->file_dsk_name,"rc",bd->max_blk+1);
catch
catch {
if (Fs->except_ch=='File')
PrintErr("Not Contiguous. Move file to filename.ISO.C.\n");
Fs->catch_except=TRUE;
}
if (bd->file_dsk) {
dv->fs_type=FSt_REDSEA;
dv->size=bd->max_blk+1-bd->drv_offset;
if (RedSeaDrvValidate(bd->first_drv_let)) {
RedSeaDrvInit(dv);
if (RedSeaValidate(bd->first_drv_let)) {
RedSeaInit(dv);
res=TRUE;
}
} else
PrintErr("Not RedSea\n");
}
}
break;
case BDT_ISO_FILE_WRITE:
if (!bd->file_dsk_name) {
StrPrint(buf,"%C:/Drv%C.DRV.C",
StrPrint(buf,"%C:/Drv%C.ISO.C",
blkdev.boot_drv_let,bd->first_drv_let);
bd->file_dsk_name=AStrNew(buf);
}
@@ -78,6 +82,7 @@ Bool BlkDevInit(CBlkDev *bd)
dv->fs_type=FSt_REDSEA;
dv->size=bd->max_blk+1-bd->drv_offset;
RedSeaFmt(bd->first_drv_let);
CallExtStr("RedSeaISO9660",bd->file_dsk_name,bd->first_drv_let);
res=TRUE;
break;
case BDT_ATA:
+8 -8
View File
@@ -2,7 +2,7 @@
//ISO2 is ISO13490
//ISO3 is ISO13346
Bool ISODrvInit(CDrv *dv,I64 blk)
Bool ISOInit(CDrv *dv,I64 blk)
{
CBlkDev *bd=dv->bd;
I64 spc=bd->blk_size>>BLK_SIZE_BITS,i=blk/spc,drv_offset=0;
@@ -13,9 +13,9 @@ Bool ISODrvInit(CDrv *dv,I64 blk)
try {
unlock=DrvLock(dv);
dv->fs_type=FSt_ISO9660; //default
dv->fs_type=FSt_ISO9660;
dv->spc=spc;
dv->drv_offset=bd->drv_offset=dv->data_area=dv->root_cluster=dv->size=0;
dv->data_area=dv->root_cluster=dv->drv_offset=bd->drv_offset=dv->size=0;
while (TRUE) {
dv->size=MaxI64(dv->size,(i+1)*spc);
RBlks(dv,iso,i*spc,spc);
@@ -30,17 +30,17 @@ Bool ISODrvInit(CDrv *dv,I64 blk)
break;
case ISO1T_SUPPLEMENTARY_DESC:
de=&iso->root_dir_record;
dv->root_cluster=de->loc.little;
dv->size=iso->vol_space_size.little*bd->blk_size>>BLK_SIZE_BITS;
if (!StrCmp(iso->publisher_id,"TempleOS RedSea")) {
dv->fs_type=FSt_REDSEA;
bd->drv_offset=dv->drv_offset=19<<2+drv_offset;
bd->max_blk=dv->size-1;
dv->size-=bd->drv_offset;
RedSeaDrvInit(dv);
}
RedSeaInit(dv);
} else
dv->root_cluster=de->loc.little;
res=TRUE;
goto ipi_done;
goto di_done;
case ISO1T_TERMINATOR:
throw('Drv');
}
@@ -51,7 +51,7 @@ Bool ISODrvInit(CDrv *dv,I64 blk)
}
i++;
}
ipi_done:
di_done:
Free(iso);
if (unlock)
DrvUnlock(dv);
+8 -8
View File
@@ -3,7 +3,7 @@ U0 DskCacheInit(I64 size_in_U8s)
CCacheBlk *tmpc;
I64 i,cnt;
while (LBts(&sys_semas[SYS_SEMA_DSK_CACHE],0))
while (LBts(&sys_semas[SEMA_DSK_CACHE],0))
Yield;
Free(blkdev.cache_ctrl);
Free(blkdev.cache_base);
@@ -34,7 +34,7 @@ U0 DskCacheInit(I64 size_in_U8s)
tmpc->next_hash=tmpc->last_hash=tmpc;
}
}
LBtr(&sys_semas[SYS_SEMA_DSK_CACHE],0);
LBtr(&sys_semas[SEMA_DSK_CACHE],0);
}
I64 DskCacheHash(I64 blk)
@@ -77,7 +77,7 @@ U0 DskCacheAdd(CDrv *dv,U8 *buf, I64 blk, I64 cnt)
{
CCacheBlk *tmpc;
if (blkdev.cache_base) {
while (LBts(&sys_semas[SYS_SEMA_DSK_CACHE],0))
while (LBts(&sys_semas[SEMA_DSK_CACHE],0))
Yield;
while (cnt-->0) {
if (!(tmpc=DskCacheFind(dv,blk)))
@@ -90,7 +90,7 @@ U0 DskCacheAdd(CDrv *dv,U8 *buf, I64 blk, I64 cnt)
blk++;
buf+=BLK_SIZE;
}
LBtr(&sys_semas[SYS_SEMA_DSK_CACHE],0);
LBtr(&sys_semas[SEMA_DSK_CACHE],0);
}
}
@@ -98,7 +98,7 @@ U0 DskCacheInvalidate2(CDrv *dv)
{
CCacheBlk *tmpc,*tmpc1;
if (blkdev.cache_base) {
while (LBts(&sys_semas[SYS_SEMA_DSK_CACHE],0))
while (LBts(&sys_semas[SEMA_DSK_CACHE],0))
Yield;
tmpc=blkdev.cache_ctrl->last_lru;
while (tmpc!=blkdev.cache_ctrl) {
@@ -112,7 +112,7 @@ U0 DskCacheInvalidate2(CDrv *dv)
}
tmpc=tmpc1;
}
LBtr(&sys_semas[SYS_SEMA_DSK_CACHE],0);
LBtr(&sys_semas[SEMA_DSK_CACHE],0);
}
}
@@ -120,7 +120,7 @@ U0 RCache(CDrv *dv,U8 **_buf, I64 *_blk, I64 *_cnt)
{
CCacheBlk *tmpc;
if (blkdev.cache_base) {
while (LBts(&sys_semas[SYS_SEMA_DSK_CACHE],0))
while (LBts(&sys_semas[SEMA_DSK_CACHE],0))
Yield;
//fetch leading blks from cache
while (*_cnt>0) {
@@ -140,6 +140,6 @@ U0 RCache(CDrv *dv,U8 **_buf, I64 *_blk, I64 *_cnt)
} else
break;
}
LBtr(&sys_semas[SYS_SEMA_DSK_CACHE],0);
LBtr(&sys_semas[SEMA_DSK_CACHE],0);
}
}
+22 -18
View File
@@ -38,7 +38,7 @@ U0 DrvsRelease()
CDrv *DrvMakeFreeSlot(U8 drv_let)
{//Make a slot free for a new drv, like during $LK,"Mount",A="MN:Mount"$().
//!!! drv_let is not a $LK,"remapped",A="MN:DrvMap"$ drv.
I64 i=ToUpper(drv_let)-'A';
I64 i=Let2Let(drv_let)-'A';
CDrv *res;
if (!(0<=i<NUM_DRVS))
throw('Drv');
@@ -51,7 +51,7 @@ CDrv *DrvMakeFreeSlot(U8 drv_let)
U8 DrvNextFreeLet(U8 first_drv_let='C')
{//Locate free slot for new drv, like during $LK,"Mount",A="MN:Mount"$().
//!!! first_drv_let is not a $LK,"remapped",A="MN:DrvMap"$ drv.
I64 i=ToUpper(first_drv_let)-'A',type=Let2BlkDevType(first_drv_let);
I64 i=Let2Let(first_drv_let)-'A',type=Let2BlkDevType(first_drv_let);
if (!(0<=i<NUM_DRVS))
throw('Drv');
do
@@ -158,9 +158,20 @@ U8 Drv2Let(CDrv *dv=NULL)
return dv->drv_let;
}
U8 Let2Let(U8 drv_let=0)
{//Drv letter to Drv letter.
if (!drv_let)
drv_let=Drv2Let(Fs->cur_dv);
else if (drv_let==':')
drv_let=blkdev.boot_drv_let;
else if (drv_let=='~')
drv_let=*blkdev.home_dir;
return ToUpper(drv_let);
}
I64 Let2BlkDevType(U8 drv_let)
{//Drv letter to BlkDev Type. drv_let=0 not allowed. See $LK,"BDT_NULL",A="MN:BDT_NULL"$.
drv_let=ToUpper(drv_let);
drv_let=Let2Let(drv_let);
if ('A'<=drv_let<='B')
return BDT_RAM;
if ('C'<=drv_let<='L')
@@ -180,11 +191,7 @@ CDrv *Let2Drv(U8 drv_let=0,Bool except=TRUE)
if (!drv_let)
dv=Fs->cur_dv;
else {
if (drv_let==':')
drv_let=blkdev.boot_drv_let;
else if (drv_let=='~')
drv_let=*blkdev.home_dir;
drv_let=ToUpper(drv_let);
drv_let=Let2Let(drv_let);
if (!('A'<=drv_let<='Z')) {
if (except)
throw('Drv');
@@ -219,7 +226,7 @@ U0 DskCacheInvalidate(CDrv *dv)
if (bd->flags & BDF_READ_CACHE)
DskCacheInvalidate2(dv);
if (bd->type==BDT_ATAPI && !(bd->flags & BDF_READ_ONLY_OVERRIDE))
ISODrvInit(dv,(32767/bd->blk_size+1)*bd->blk_size>>BLK_SIZE_BITS);
ISOInit(dv,(32767/bd->blk_size+1)*bd->blk_size>>BLK_SIZE_BITS);
if (unlock)
DrvUnlock(dv);
} catch
@@ -233,15 +240,18 @@ U0 ChgDsk(U8 drv_let=0)
CBlkDev *bd=dv->bd;
if (!(bd->flags&BDF_INITIALIZED))
BlkDevInit(bd);
else if (bd->flags&BDF_REMOVABLE)
else if (bd->flags&BDF_REMOVABLE) {
if (bd->type==BDT_ATAPI)
ATAInit(bd); //TODO: This is a kludge for QEMU?
DskCacheInvalidate(dv);
}
Drv(drv_let);
RedSeaFreeFreeLst(dv);
}
Bool DrvMap(U8 drv_let,CDrv *dv)
{//Make drive letter map to another.
drv_let=ToUpper(drv_let);
drv_let=Let2Let(drv_let);
if ('A'<=drv_let<='Z') {
blkdev.let_to_drv[drv_let-'A']=dv;
dv->drv_let=drv_let;
@@ -311,13 +321,7 @@ U8 drv_text_attr[3]={BLACK,BLUE,RED};
U8 DrvTextAttrGet(U8 drv_let=0)
{//Get color of drive.
if (!drv_let)
drv_let=Drv2Let(Fs->cur_dv);
else if (drv_let==':')
drv_let=blkdev.boot_drv_let;
else if (drv_let=='~')
drv_let=*blkdev.home_dir;
drv_let=ToUpper(drv_let);
drv_let=Let2Let(drv_let);
if ('A'<=drv_let<='Z')
return blkdev_text_attr[Let2BlkDevType(drv_let)]<<4|
drv_text_attr[drv_let%sizeof(drv_text_attr)];
+4 -2
View File
@@ -2,7 +2,9 @@ Bool DrvTypeSet(U8 drv_let,I64 type=FSt_REDSEA)
{//Very dangerous
I64 i,j,ext_base,drv_num,offset,cur_type;
CMasterBoot mbr;
CBlkDev *bd=Let2BlkDev(drv_let);
CBlkDev *bd;
drv_let=Let2Let(drv_let);
bd=Let2BlkDev(drv_let);
drv_num=bd->first_drv_let-'A';
switch (bd->type) {
case BDT_ATA:
@@ -17,7 +19,7 @@ Bool DrvTypeSet(U8 drv_let,I64 type=FSt_REDSEA)
if (cur_type==5 || cur_type==15)
j=i;
else {
if (drv_num+'A'==ToUpper(drv_let)) {
if (drv_num+'A'==drv_let) {
switch (type) {
case FSt_REDSEA:
mbr.p[i].type=MBR_PT_REDSEA;
+1 -1
View File
@@ -257,7 +257,7 @@ Bool FileNameChk(U8 *filename)
}
if (StrLen(filename)>=CDIR_FILENAME_LEN) return FALSE;
while (*ptr)
if (!Bt(chars_bmp_filename,*ptr++))
if (!Bt(char_bmp_filename,*ptr++))
return FALSE;
return TRUE;
}
+3 -15
View File
@@ -19,7 +19,7 @@ CDate Dos2CDate(U16 t,U16 d)
return Struct2Date(&ds);
}
U0 FAT32DrvInit(CDrv *dv)
U0 FAT32Init(CDrv *dv)
{
CFAT32Boot br32;
Bool unlock;
@@ -45,18 +45,6 @@ U0 FAT32DrvInit(CDrv *dv)
DrvUnlock(dv);
}
Bool FAT32DrvValidate(U8 drv_let)
{
CDrv *dv;
CFAT32Boot br;
if ((dv=Let2Drv(drv_let,FALSE)) && dv->fs_type==FSt_FAT32 &&
RBlks(dv,&br,dv->drv_offset,1) && br.signature==0xAA55 &&
br.sects==dv->size)
return TRUE;
else
return FALSE;
}
U0 FAT32Fmt(U8 drv_let,Bool quick=TRUE)
{
CFAT32Boot *br=CAlloc(BLK_SIZE);
@@ -115,11 +103,11 @@ U0 FAT32Fmt(U8 drv_let,Bool quick=TRUE)
WBlks(dv,fis,dv->drv_offset+br->file_system_info_sect,1);
WBlks(dv,br,dv->drv_offset,1);
FAT32DrvInit(dv);
FAT32Init(dv);
ClustersAlloc(dv,0,1,FALSE); //Alloc #1
br->root_cluster=ClustersAlloc(dv,0,1,FALSE);
WBlks(dv,br,dv->drv_offset,1);
FAT32DrvInit(dv);
FAT32Init(dv);
DrvUnlock(dv);
} catch
DrvUnlock(dv);
+1 -1
View File
@@ -42,7 +42,7 @@ Bool ISO1FromName(U8 *dst,U8 *src)
src++;
if (*src==';')
break;
if (Bt(chars_bmp_filename,*src)) {
if (Bt(char_bmp_filename,*src)) {
if (j>=CDIR_FILENAME_LEN-1)
return FALSE;
dst[j++]=*src++;
+4 -4
View File
@@ -55,7 +55,7 @@ U0 RedSeaFreeLstBuild(CDrv *dv)
DrvUnlock(dv);
}
U0 RedSeaDrvInit(CDrv *dv)
U0 RedSeaInit(CDrv *dv)
{
CRedSeaBoot br;
Bool unlock;
@@ -79,7 +79,7 @@ U0 RedSeaDrvInit(CDrv *dv)
DrvUnlock(dv);
}
Bool RedSeaDrvValidate(U8 drv_let)
Bool RedSeaValidate(U8 drv_let)
{
CDrv *dv;
CRedSeaBoot br;
@@ -119,7 +119,7 @@ U0 RedSeaFmt(U8 drv_let,Bool quick=TRUE)
WZeroBlks(dv,dv->drv_offset,i);
WBlks(dv,br,dv->drv_offset,1);
RedSeaDrvInit(dv);
RedSeaInit(dv);
ClustersAlloc(dv,0,1,FALSE); //Alloc #1
root_dir_blks=MaxI64(1,dv->bd->init_root_dir_blks);
@@ -144,7 +144,7 @@ U0 RedSeaFmt(U8 drv_let,Bool quick=TRUE)
d_native->datetime=Now;
WBlks(dv,root_dir,br->root_cluster,root_dir_blks);
RedSeaDrvInit(dv);
RedSeaInit(dv);
DrvUnlock(dv);
} catch
DrvUnlock(dv);
+1 -1
View File
@@ -253,7 +253,7 @@ U8 *ExpandBuf(CArcCompress *arc,CTask *mem_task=NULL)
U8 *res;
if (!(CT_NONE<=arc->compression_type<=CT_8_BIT) ||
arc->expanded_size>MEM_MAPPED_SPACE)
arc->expanded_size>mem_mapped_space)
throw('Compress');
res=MAlloc(arc->expanded_size+1,mem_task);
+2 -2
View File
@@ -39,7 +39,7 @@ See also $LK,"GrUpdateScrn",A="MN:GrUpdateScrn"$().
while (text.raw_col % text.cols)
RawPutChar(CH_SPACE);
} else if (Bt(chars_bmp_displayable,ch)) {
} else if (Bt(char_bmp_displayable,ch)) {
row=text.raw_col/text.cols%text.rows;
col=text.raw_col%text.cols;
if (!Bt(&sys_run_level,RLf_VGA)) { //if text mode
@@ -87,7 +87,7 @@ See also $LK,"GrUpdateScrn",A="MN:GrUpdateScrn"$().
U0 VGAFlush()
{//Flush winmgr vga cache, so updates whole scrn.
LBts(&sys_semas[SYS_SEMA_FLUSH_VGA_IMAGE],0);
LBts(&sys_semas[SEMA_FLUSH_VGA_IMAGE],0);
}
U0 WinDerivedValsUpdate(CTask *task)
+5 -5
View File
@@ -232,7 +232,7 @@ Bool EdLite(U8 *filename,I64 num=1,I64 edf_dof_flags=0)
}
break;
default:
if (Bt(chars_bmp_getkey,ch)) {
if (Bt(char_bmp_printable,ch)) {
if (cur_line==&head) {
cur_line=MAlloc(sizeof(CLine));
cur_line->line=StrNew("");
@@ -327,11 +327,11 @@ Bool EdLiteFileLine(U8 *fl_file_line,I64 edf_dof_flags=0)
U0 FixSet(U8 *filename,I64 line)
{//Compiler calls this to set file line for Fix
U8 *st=MStrPrint("FL:%s,%d",filename,line);
while (LBts(&sys_semas[SYS_SEMA_FIX],0))
while (LBts(&sys_semas[SEMA_FIX],0))
Yield;
Free(dbg.fix_file_line);
dbg.fix_file_line=AStrNew(st);
LBtr(&sys_semas[SYS_SEMA_FIX],0);
LBtr(&sys_semas[SEMA_FIX],0);
}
Bool Fix(I64 edf_dof_flags=0)
@@ -339,10 +339,10 @@ Bool Fix(I64 edf_dof_flags=0)
U8 *st;
Bool res=FALSE;
while (LBts(&sys_semas[SYS_SEMA_FIX],0))
while (LBts(&sys_semas[SEMA_FIX],0))
Yield;
st=StrNew(dbg.fix_file_line);
LBtr(&sys_semas[SYS_SEMA_FIX],0);
LBtr(&sys_semas[SEMA_FIX],0);
if (st) {
if (IsRaw)
+104 -106
View File
@@ -1,21 +1,21 @@
U0 SrvCmdDel(CSrvCmd *tmpc)
U0 JobDel(CJob *tmpc)
{//Free one cmd node.
Free(tmpc->aux_str);
Free(tmpc);
}
U0 SrvCmdQueDel(CSrvCmd *head)
U0 JobQueDel(CJob *head)
{
CSrvCmd *tmpc=head->next,*tmpc1;
CJob *tmpc=head->next,*tmpc1;
while (tmpc!=head) {
tmpc1=tmpc->next;
QueRem(tmpc);
SrvCmdDel(tmpc);
JobDel(tmpc);
tmpc=tmpc1;
}
}
U0 SrvCtrlInit(CSrvCtrl *ctrl)
U0 JobCtrlInit(CJobCtrl *ctrl)
{
QueInit(&ctrl->next_waiting);
QueInit(&ctrl->next_done);
@@ -36,34 +36,34 @@ U0 TaskRstAwaitingMsg(CTask *task=NULL)
POPFD
}
CSrvCmd *TaskExe(CTask *srv,CTask *master,U8 *data,I64 flags)
CJob *TaskExe(CTask *srv,CTask *master,U8 *data,I64 flags)
{//Queues a request to compile and execute src code text.
CSrvCmd *res;
CJob *res;
if (!data || !TaskValidate(srv) || master && !TaskValidate(master) ||
srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT))
return NULL;
res=ACAlloc(sizeof(CSrvCmd));
res=ACAlloc(sizeof(CJob));
res->master_task=master;
res->cmd_code=SVCT_EXE_STR;
res->job_code=JOBT_EXE_STR;
res->flags=flags;
res->aux_str=AStrNew(data);
res->ctrl=&srv->srv_ctrl;
PUSHFD
CLI
while (LBts(&srv->srv_ctrl.flags,SVCRf_LOCKED))
while (LBts(&srv->srv_ctrl.flags,JOBCf_LOCKED))
PAUSE
if (!TaskValidate(srv)) {
LBtr(&srv->srv_ctrl.flags,SVCRf_LOCKED);
LBtr(&srv->srv_ctrl.flags,JOBCf_LOCKED);
POPFD
SrvCmdDel(res);
JobDel(res);
return NULL;
} else {
LBtr(&srv->task_flags,TASKf_IDLE);
TaskRstAwaitingMsg(srv);
QueIns(res,srv->srv_ctrl.last_waiting);
LBtr(&srv->srv_ctrl.flags,SVCRf_LOCKED);
if (Bt(&flags,SVCf_WAKE_MASTER)) {
LBtr(&srv->srv_ctrl.flags,JOBCf_LOCKED);
if (Bt(&flags,JOBf_WAKE_MASTER)) {
Suspend(master);
Yield;
}
@@ -72,22 +72,22 @@ CSrvCmd *TaskExe(CTask *srv,CTask *master,U8 *data,I64 flags)
return res;
}
CSrvCmd *TaskText(CTask *srv,CTask *master,U8 *data,I64 flags)
CJob *TaskText(CTask *srv,CTask *master,U8 *data,I64 flags)
{//Post StdIn text to servant task. Tell who the master task is.
CSrvCmd *res;
CJob *res;
CTask *task;
if (!data || !TaskValidate(srv) || master && !TaskValidate(master) ||
srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT))
return NULL;
res=ACAlloc(sizeof(CSrvCmd));
res=ACAlloc(sizeof(CJob));
res->master_task=master; //in case somebody cares
res->cmd_code=SVCT_TEXT_INPUT;
res->job_code=JOBT_TEXT_INPUT;
res->flags=flags;
res->aux_str=AStrNew(data);
PUSHFD
task=srv->last_input_filter_task;
if (Bt(&flags,SVCf_HIGHEST_PRIORITY) || task==srv) {
if (Bt(&flags,JOBf_HIGHEST_PRIORITY) || task==srv) {
if (task!=srv)
TaskWait(srv);
task=Spawn(&InputFilterTask,NULL,"Input Filter",,srv);
@@ -101,38 +101,39 @@ CSrvCmd *TaskText(CTask *srv,CTask *master,U8 *data,I64 flags)
task=srv->next_input_filter_task;
}
res->ctrl=&task->srv_ctrl;
while (LBts(&task->srv_ctrl.flags,SVCRf_LOCKED))
while (LBts(&task->srv_ctrl.flags,JOBCf_LOCKED))
PAUSE
if (!TaskValidate(task)) {
SrvCmdDel(res);
JobDel(res);
res=NULL;
} else {
LBtr(&task->task_flags,TASKf_IDLE);
TaskRstAwaitingMsg(task);
QueIns(res,task->srv_ctrl.last_waiting);
LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED);
LBtr(&task->srv_ctrl.flags,JOBCf_LOCKED);
}
POPFD
return res;
}
CSrvCmd *TaskMsg(CTask *_srv,CTask *master,I64 msg_code,I64 a1,I64 a2,I64 flags)
CJob *TaskMsg(CTask *_srv,CTask *master,
I64 msg_code,I64 arg1,I64 arg2,I64 flags)
{//Post message to servant task. Tell who the master task is.
//See $LK,"flags",A="MN:SVCf_WAKE_MASTER"$ and $LK,"msg_code",A="MN:MSG_CMD"$.
CSrvCmd *tmpc1,*tmpc;
//See $LK,"flags",A="MN:JOBf_WAKE_MASTER"$ and $LK,"msg_code",A="MN:MSG_CMD"$.
CJob *tmpc1,*tmpc;
CTask *srv=_srv;
if (!TaskValidate(srv) || master && !TaskValidate(master)||
srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT))
return NULL;
tmpc=ACAlloc(sizeof(CSrvCmd));
tmpc=ACAlloc(sizeof(CJob));
tmpc->master_task=master;
tmpc->cmd_code=SVCT_MSG;
tmpc->job_code=JOBT_MSG;
tmpc->msg_code=AbsI64(msg_code); //negative means do a down and up
tmpc->aux1=a1;
tmpc->aux2=a2;
tmpc->aux1=arg1;
tmpc->aux2=arg2;
tmpc->flags=flags;
PUSHFD
if (Bt(&sys_semas[SYS_SEMA_RECORD_MACRO],0) &&
if (Bt(&sys_semas[SEMA_RECORD_MACRO],0) &&
srv!=sys_macro_task && msg_code==MSG_KEY_DOWN) {
tmpc1=AMAllocIdent(tmpc);
CLI
@@ -140,54 +141,54 @@ CSrvCmd *TaskMsg(CTask *_srv,CTask *master,I64 msg_code,I64 a1,I64 a2,I64 flags)
}
CLI
while (Bt(&srv->task_flags,TASKf_FILTER_INPUT) &&
!Bt(&flags,SVCf_DONT_FILTER))
!Bt(&flags,JOBf_DONT_FILTER))
srv=srv->next_input_filter_task;
tmpc->ctrl=&srv->srv_ctrl;
while (LBts(&srv->srv_ctrl.flags,SVCRf_LOCKED))
while (LBts(&srv->srv_ctrl.flags,JOBCf_LOCKED))
PAUSE
if (!TaskValidate(srv)) {
SrvCmdDel(tmpc);
JobDel(tmpc);
tmpc=NULL;
} else {
LBtr(&srv->task_flags,TASKf_IDLE);
TaskRstAwaitingMsg(srv);
QueIns(tmpc,srv->srv_ctrl.last_waiting);
LBtr(&srv->srv_ctrl.flags,SVCRf_LOCKED);
LBtr(&srv->srv_ctrl.flags,JOBCf_LOCKED);
}
POPFD
if (msg_code<0) //Down-Up
TaskMsg(_srv,master,-msg_code+1,a1,a2,flags);
TaskMsg(_srv,master,-msg_code+1,arg1,arg2,flags);
return tmpc;
}
Bool JobResScan(CSrvCmd *rqst=NULL,I64 *_res=NULL)
Bool JobResScan(CJob *rqst=NULL,I64 *_res=NULL)
{//Check rqst complete, return with or without.
CSrvCtrl *ctrl;
CSrvCmd *tmpc,*tmpc1;
if (!rqst || Bt(&rqst->flags,SVCf_DONE)) {
CJobCtrl *ctrl;
CJob *tmpc,*tmpc1;
if (!rqst || Bt(&rqst->flags,JOBf_DONE)) {
if (!rqst || rqst->master_task)
ctrl=&Fs->srv_ctrl;
else
ctrl=rqst->ctrl;
PUSHFD
CLI
while (LBts(&ctrl->flags,SVCRf_LOCKED))
while (LBts(&ctrl->flags,JOBCf_LOCKED))
PAUSE
tmpc1=&ctrl->next_done;
tmpc=tmpc1->next;
while (tmpc!=tmpc1) {
if (!rqst || rqst==tmpc) {
QueRem(tmpc);
LBtr(&ctrl->flags,SVCRf_LOCKED);
LBtr(&ctrl->flags,JOBCf_LOCKED);
POPFD
if (_res)
*_res=tmpc->res;
SrvCmdDel(tmpc);
JobDel(tmpc);
return TRUE;
}
tmpc=tmpc->next;
}
LBtr(&ctrl->flags,SVCRf_LOCKED);
LBtr(&ctrl->flags,JOBCf_LOCKED);
POPFD
}
if (_res)
@@ -195,10 +196,10 @@ Bool JobResScan(CSrvCmd *rqst=NULL,I64 *_res=NULL)
return FALSE;
}
I64 JobResGet(CSrvCmd *rqst=NULL)
I64 JobResGet(CJob *rqst=NULL)
{//See $LK,"::/Demo/MultiCore/Lock.HC"$
I64 res;
CSrvCmd *tmpc1;
CJob *tmpc1;
if (!rqst) {
tmpc1=&Fs->srv_ctrl.next_done;
while (tmpc1==tmpc1->next) {
@@ -206,7 +207,7 @@ I64 JobResGet(CSrvCmd *rqst=NULL)
Yield;
}
} else {
while (!Bt(&rqst->flags,SVCf_DONE)) {
while (!Bt(&rqst->flags,JOBf_DONE)) {
LBts(&Fs->task_flags,TASKf_IDLE);
Yield;
}
@@ -220,7 +221,7 @@ I64 JobResGet(CSrvCmd *rqst=NULL)
U0 TaskWait(CTask *task=NULL,Bool cmd_line_pmt=FALSE)
{//Wait for idle.
CTask *task1;
CSrvCmd *tmpc1;
CJob *tmpc1;
if (!task) task=Fs;
if (TaskValidate(task)) {
PUSHFD
@@ -238,48 +239,47 @@ U0 TaskWait(CTask *task=NULL,Bool cmd_line_pmt=FALSE)
}
}
U0 PostMsg(CTask *task,I64 msg_code,I64 a1,I64 a2,I64 flags=0)
U0 PostMsg(CTask *task,I64 msg_code,I64 arg1,I64 arg2,I64 flags=0)
{//Post message to a task and return immediately. See $LK,"msg_code",A="MN:MSG_CMD"$.
if (TaskValidate(task)) {
if (Bt(&task->task_flags,TASKf_INPUT_FILTER_TASK))
TaskMsg(task->last_input_filter_task,NULL,msg_code,a1,a2,
flags|1<<SVCf_DONT_FILTER);
TaskMsg(task->last_input_filter_task,NULL,msg_code,arg1,arg2,
flags|1<<JOBf_DONT_FILTER);
else
TaskMsg(task,NULL,msg_code,a1,a2,flags);
TaskMsg(task,NULL,msg_code,arg1,arg2,flags);
}
}
U0 PostMsgWait(CTask *task,I64 msg_code,I64 a1,I64 a2,I64 flags=0)
U0 PostMsgWait(CTask *task,I64 msg_code,I64 arg1,I64 arg2,I64 flags=0)
{//Post message to a task and wait until task is idle.See $LK,"msg_code",A="MN:MSG_CMD"$.
PostMsg(task,msg_code,a1,a2,flags);
PostMsg(task,msg_code,arg1,arg2,flags);
TaskWait(task);
}
U0 Msg(I64 msg_code,I64 a1,I64 a2,I64 flags=0)
U0 Msg(I64 msg_code,I64 arg1,I64 arg2,I64 flags=0)
{//Post message to current task and return immediately.
//See $LK,"msg_code",A="MN:MSG_CMD"$.
PostMsg(Fs,msg_code,a1,a2,flags);
PostMsg(Fs,msg_code,arg1,arg2,flags);
}
#define SCR_DONE 0
#define SCR_CONT 1
#define SCR_EXIT 2
#define JOB_DONE 0
#define JOB_CONT 1
#define JOB_EXIT 2
I64 SrvCmdRunOne(I64 run_flags,CSrvCtrl *ctrl)
{//Called with ctrl->flags,SVCRf_LOCKED.
CSrvCmd *tmpc=ctrl->next_waiting;
I64 JobRunOne(I64 run_flags,CJobCtrl *ctrl)
{//Called with ctrl->flags,JOBCf_LOCKED.
CJob *tmpc=ctrl->next_waiting;
CTask *master;
I64 res,flags=tmpc->flags,old_flags=GetRFlags;
if (Bt(&flags,SVCf_EXIT_ON_COMPLETE))
res=SCR_EXIT;
if (Bt(&flags,JOBf_EXIT_ON_COMPLETE))
res=JOB_EXIT;
else
res=SCR_CONT;
switch (tmpc->cmd_code) {
case SVCT_SPAWN_TASK:
res=JOB_CONT;
switch (tmpc->job_code) {
case JOBT_SPAWN_TASK:
QueRem(tmpc);
LBts(&tmpc->flags,SVCf_DISPATCHED);
tmpc->servant_cpu_num=Gs->num;
LBtr(&ctrl->flags,SVCRf_LOCKED);
LBts(&tmpc->flags,JOBf_DISPATCHED);
LBtr(&ctrl->flags,JOBCf_LOCKED);
if (tmpc->aux_str)
tmpc->spawned_task=Spawn(tmpc->addr,tmpc->fun_arg,
tmpc->aux_str,,tmpc->aux1,tmpc->aux2,tmpc->flags);
@@ -287,11 +287,10 @@ I64 SrvCmdRunOne(I64 run_flags,CSrvCtrl *ctrl)
tmpc->spawned_task=Spawn(tmpc->addr,tmpc->fun_arg,
"Unnamed",,tmpc->aux1,tmpc->aux2,tmpc->flags);
break;
case SVCT_CALL:
case JOBT_CALL:
QueRem(tmpc);
LBts(&tmpc->flags,SVCf_DISPATCHED);
tmpc->servant_cpu_num=Gs->num;
LBtr(&ctrl->flags,SVCRf_LOCKED);
LBts(&tmpc->flags,JOBf_DISPATCHED);
LBtr(&ctrl->flags,JOBCf_LOCKED);
SetRFlags(run_flags);
LBtr(&Fs->task_flags,TASKf_IDLE);
try
@@ -300,11 +299,10 @@ I64 SrvCmdRunOne(I64 run_flags,CSrvCtrl *ctrl)
Fs->catch_except=TRUE;
SetRFlags(old_flags);
break;
case SVCT_EXE_STR:
case JOBT_EXE_STR:
QueRem(tmpc);
LBts(&tmpc->flags,SVCf_DISPATCHED);
tmpc->servant_cpu_num=Gs->num;
LBtr(&ctrl->flags,SVCRf_LOCKED);
LBts(&tmpc->flags,JOBf_DISPATCHED);
LBtr(&ctrl->flags,JOBCf_LOCKED);
SetRFlags(run_flags);
LBtr(&Fs->task_flags,TASKf_IDLE);
try
@@ -314,63 +312,63 @@ I64 SrvCmdRunOne(I64 run_flags,CSrvCtrl *ctrl)
SetRFlags(old_flags);
break;
default:
res=SCR_DONE;
res=JOB_DONE;
}
if (res) {
if (master=tmpc->master_task) {
if (!Bt(&flags,SVCf_FREE_ON_COMPLETE)) {
if (!Bt(&flags,JOBf_FREE_ON_COMPLETE)) {
CLI
while (LBts(&master->srv_ctrl.flags,SVCRf_LOCKED))
while (LBts(&master->srv_ctrl.flags,JOBCf_LOCKED))
PAUSE
QueIns(tmpc,master->srv_ctrl.last_done);
LBts(&tmpc->flags,SVCf_DONE);
LBtr(&master->srv_ctrl.flags,SVCRf_LOCKED);
LBts(&tmpc->flags,JOBf_DONE);
LBtr(&master->srv_ctrl.flags,JOBCf_LOCKED);
SetRFlags(old_flags);
}
if (Bt(&flags,SVCf_FOCUS_MASTER) &&
if (Bt(&flags,JOBf_FOCUS_MASTER) &&
!Bt(&master->win_inhibit,WIf_SELF_FOCUS))
sys_focus_task=master;
if (Bt(&flags,SVCf_WAKE_MASTER))
if (Bt(&flags,JOBf_WAKE_MASTER))
Suspend(master,FALSE);
}
if (Bt(&flags,SVCf_FREE_ON_COMPLETE))
SrvCmdDel(tmpc);
if (Bt(&flags,JOBf_FREE_ON_COMPLETE))
JobDel(tmpc);
else if (!master) {
CLI
while (LBts(&ctrl->flags,SVCRf_LOCKED))
while (LBts(&ctrl->flags,JOBCf_LOCKED))
Yield;
QueIns(tmpc,ctrl->last_done);
LBts(&tmpc->flags,SVCf_DONE);
LBtr(&ctrl->flags,SVCRf_LOCKED);
LBts(&tmpc->flags,JOBf_DONE);
LBtr(&ctrl->flags,JOBCf_LOCKED);
SetRFlags(old_flags);
}
}
return res;
}
I64 SrvCmdsHandler(I64 run_flags,CTask *task=NULL)
I64 JobsHndlr(I64 run_flags,CTask *task=NULL)
{//Handle all waiting cmds and return.
I64 cnt=0,old_flags=GetRFlags;
if (!task) task=Fs;
while (TRUE) {
CLI
while (LBts(&task->srv_ctrl.flags,SVCRf_LOCKED))
while (LBts(&task->srv_ctrl.flags,JOBCf_LOCKED))
PAUSE
if (task->srv_ctrl.next_waiting!=&task->srv_ctrl)
switch (SrvCmdRunOne(run_flags,&task->srv_ctrl)) {
case SCR_CONT:
switch (JobRunOne(run_flags,&task->srv_ctrl)) {
case JOB_CONT:
cnt++;
break;
case SCR_EXIT:
case JOB_EXIT:
Exit;
case SCR_DONE:
goto sch_done;
case JOB_DONE:
goto jh_done;
}
else
goto sch_done;
goto jh_done;
}
sch_done:
LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED);
jh_done:
LBtr(&task->srv_ctrl.flags,JOBCf_LOCKED);
SetRFlags(old_flags);
return cnt;
}
@@ -378,15 +376,15 @@ sch_done:
I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL)
{//Execute code in $LK,"PopUp",A="MN:PopUp"$ task.
I64 res;
CSrvCmd *tmpc;
CJob *tmpc;
CTask *task=Spawn(&SrvCmdLine,NULL,"Servant",,parent);
if (!parent) {
TaskExe(task,parent,buf,1<<SVCf_EXIT_ON_COMPLETE|1<<SVCf_FREE_ON_COMPLETE);
TaskExe(task,parent,buf,1<<JOBf_EXIT_ON_COMPLETE|1<<JOBf_FREE_ON_COMPLETE);
if (_pu_task) *_pu_task=task;
return 0;
} else {
Fs->popup_task=task;
tmpc=TaskExe(task,parent,buf,1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
tmpc=TaskExe(task,parent,buf,1<<JOBf_WAKE_MASTER|1<<JOBf_FOCUS_MASTER);
if (_pu_task) *_pu_task=task;
JobResScan(tmpc,&res);
Fs->popup_task=NULL;
@@ -409,13 +407,13 @@ I64 Adam(U8 *fmt,...)
{//Make adam_task execute code.
I64 res;
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
CSrvCmd *tmpc;
CJob *tmpc;
if (Fs==adam_task) {
tmpc=TaskExe(adam_task,Fs,buf,0);
SrvCmdsHandler(GetRFlags);
JobsHndlr(GetRFlags);
} else {
TaskWait(adam_task);
tmpc=TaskExe(adam_task,Fs,buf,1<<SVCf_WAKE_MASTER);
tmpc=TaskExe(adam_task,Fs,buf,1<<JOBf_WAKE_MASTER);
}
JobResScan(tmpc,&res);
Free(buf);
@@ -469,7 +467,7 @@ U0 InStr(U8 *fmt,...)
if (Bt(&Fs->task_flags,TASKf_INPUT_FILTER_TASK))
ExePrint("%s",buf);
else
TaskText(Fs,NULL,buf,1<<SVCf_HIGHEST_PRIORITY);
TaskText(Fs,NULL,buf,1<<JOBf_HIGHEST_PRIORITY);
Free(buf);
}
+13 -12
View File
@@ -1,20 +1,21 @@
//This is run in a $LK,"#exe",A="FF:::/Kernel/Kernel.PRJ,KCfg"${}.
U8 *kernel_cfg_options="MemInit\0HeapInit\0VarInit\0"
U8 *kernel_cfg_options="MemInit\0HeapInit\0VarInit\0StaffMode\0"
"HomeDir\0NoMP\0TextMode\0DontProbe\0AutoMountIDE\0BootRescueDrv\0Help\0";
#define CFG_MEM_INIT 0
#define CFG_HEAP_INIT 1
#define CFG_VAR_INIT 2
#define CFG_HOME_DIR 3
#define CFG_NO_MP 4
#define CFG_TEXT_MODE 5
#define CFG_DONT_PROBE 6
#define CFG_AUTO_MOUNT_IDE 7
#define CFG_BOOT_RESCUE_DRV 8
#define CFG_NUM_OPTIONS 9
#define CFG_STAFF_MODE 3
#define CFG_HOME_DIR 4
#define CFG_NO_MP 5
#define CFG_TEXT_MODE 6
#define CFG_DONT_PROBE 7
#define CFG_AUTO_MOUNT_IDE 8
#define CFG_BOOT_RESCUE_DRV 9
#define CFG_NUM_OPTIONS 10
#define CFG_HELP 9
#define CFG_HELP 10
class CKernelCfg
{
@@ -35,7 +36,7 @@ CDoc *KernelCfgAddDev(CKernelCfg *c)
"define shortly, enter the drive letter\n"
"of the drive with the account directory.\n"
"\n($$PURPLE$$<ENTER>$$FG$$ for cur drv) Boot Drv:";
ch=ToUpper(GetChar);
ch=Let2Let(GetChar);
if ('A'<=ch<='Z')
c->boot_drv_let=ch;
else
@@ -109,7 +110,7 @@ U0 KernelCfgOptions(CKernelCfg *c)
case CFG_AUTO_MOUNT_IDE:
if (state) {
"First HD Drive Let:";
c->auto_mount_ide_hd_let=ToUpper(GetChar);
c->auto_mount_ide_hd_let=Let2Let(GetChar);
if (!('A'<=c->auto_mount_ide_hd_let<='Z'))
c->auto_mount_ide_hd_let=0;
'\n';
@@ -119,7 +120,7 @@ U0 KernelCfgOptions(CKernelCfg *c)
"First HD Drive:%C\n",'C';
"First CD Drive Let:";
c->auto_mount_ide_cd_let=ToUpper(GetChar);
c->auto_mount_ide_cd_let=Let2Let(GetChar);
if (!('A'<=c->auto_mount_ide_cd_let<='Z'))
c->auto_mount_ide_cd_let=0;
'\n';
+2 -2
View File
@@ -139,7 +139,7 @@ U0 NowDateTimeStruct(CDateStruct *_ds)
MemSet(_ds,0,sizeof(CDateStruct));
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_SYS_DATE],0))
while (LBts(&sys_semas[SEMA_SYS_DATE],0))
PAUSE
OutU8(0x70,0x0A);
@@ -172,7 +172,7 @@ U0 NowDateTimeStruct(CDateStruct *_ds)
else
is_bcd=TRUE;
LBtr(&sys_semas[SYS_SEMA_SYS_DATE],0);
LBtr(&sys_semas[SEMA_SYS_DATE],0);
POPFD
if (is_bcd)
for (i=2;i<9;i++)
+32 -22
View File
@@ -1,11 +1,11 @@
Bool ChkPtr(U8 *ptr)
{//Check if addr is valid ptr.
if (sys_heap_base<=ptr<=MEM_MAPPED_SPACE) {
if (mem_heap_base<=ptr<=mem_mapped_space) {
if (*MemPageTable(ptr)&1)
return TRUE;
else
return FALSE;
} else if (ptr<sys_boot_base)
} else if (ptr<mem_boot_base)
return FALSE;
else if (ptr<VGAM_GRAPHICS)
return TRUE;
@@ -15,12 +15,12 @@ Bool ChkPtr(U8 *ptr)
Bool ChkCodePtr(U8 *ptr)
{//Check if addr is valid code addr.
if (sys_heap_base<=ptr<=sys_heap_limit) {
if (mem_heap_base<=ptr<=mem_heap_limit) {
if (*MemPageTable(ptr)&1)
return TRUE;
else
return FALSE;
} else if (ptr<sys_boot_base)
} else if (ptr<mem_boot_base)
return FALSE;
else if (ptr<VGAM_GRAPHICS)
return TRUE;
@@ -37,7 +37,7 @@ Bool ChkOnStk(U8 *ptr,CTask *task=NULL)
if (&task->stk->stk_base<=ptr<=
(&task->stk->stk_base)(U8 *)+task->stk->stk_size)
res=TRUE;
} else if (sys_heap_base<=ptr<=sys_heap_limit)
} else if (mem_heap_base<=ptr<=mem_heap_limit)
res=TRUE;
POPFD
return res;
@@ -214,7 +214,7 @@ U0 Da(U8 **addr,I64 cnt=0x10)
}
}
U0 RawPrint(I64 ms=100,U8 *fmt,...)
U0 RawPrint(I64 mS=100,U8 *fmt,...)
{//Print using $LK,"Raw",A="MN:Raw"$ scrn output for a length of time.
//$BK,1$Your heap must be good.$BK,0$
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
@@ -224,14 +224,14 @@ U0 RawPrint(I64 ms=100,U8 *fmt,...)
old_raw=Raw(ON);
old_input_filter=LBtr(&Fs->task_flags,TASKf_INPUT_FILTER_TASK);
"%s",buf;
BusyWait(ms<<10);
Busy(mS<<10);
POPFD
LBEqu(&Fs->task_flags,TASKf_INPUT_FILTER_TASK,old_input_filter);
Raw(old_raw);
Free(buf);
}
U0 RawD(I64 ms=100,U8 *addr,I64 cnt=0x80)
U0 RawD(I64 mS=100,U8 *addr,I64 cnt=0x80)
{//Dumps a block of mem using $LK,"Raw",A="MN:Raw"$
//scrn output for a fixed length
//of time.
@@ -241,13 +241,13 @@ U0 RawD(I64 ms=100,U8 *addr,I64 cnt=0x80)
old_raw=Raw(ON);
old_input_filter=LBtr(&Fs->task_flags,TASKf_INPUT_FILTER_TASK);
D(addr,cnt);
BusyWait(ms<<10);
Busy(mS<<10);
POPFD
LBEqu(&Fs->task_flags,TASKf_INPUT_FILTER_TASK,old_input_filter);
Raw(old_raw);
}
U0 RawDm(I64 ms=100,U8 *addr,I64 cnt=0x80)
U0 RawDm(I64 mS=100,U8 *addr,I64 cnt=0x80)
{//Dumps a block of mem using $LK,"Raw",A="MN:Raw"$
//scrn output for a fixed length
//of time.
@@ -257,7 +257,7 @@ U0 RawDm(I64 ms=100,U8 *addr,I64 cnt=0x80)
old_raw=Raw(ON);
old_input_filter=LBtr(&Fs->task_flags,TASKf_INPUT_FILTER_TASK);
Dm(addr,cnt);
BusyWait(ms<<10);
Busy(mS<<10);
POPFD
LBEqu(&Fs->task_flags,TASKf_INPUT_FILTER_TASK,old_input_filter);
Raw(old_raw);
@@ -512,7 +512,7 @@ U0 DbgHelp()
">1+2*3+&Print;\t\t\t//Show calculation res.\n"
">*(0x70000)(I64 *)=0x123456789;\t//Assign value to 0x70000-0x70007.\n"
">_RAX=0x1234;\t\t\t//Set RAX to 0x1234.\n"
">_RIP=&SysThrowBreak;\t\t//Set RIP.\n"
">_RIP=&Break;\t\t//Set RIP.\n"
">I64 i;\t\t\t\t//Declare variable.\n"
">i=_RCX+_RDX;\t\t\t//Assign to variable.\n"
">U(&Print+0x8);\t\t\t//Unassemble Print.\n"
@@ -535,12 +535,15 @@ U0 Dbg2()
Bool old_win_inhibit,old_waiting_msg,old_single;
I64 i,old_getstr2;
U8 buf[200];
if (IsRaw) {
i=Fs->rip;
Ui(buf,&i);
"%s",buf;
if (dbg.panic) {
if (IsRaw) {
i=Fs->rip;
Ui(buf,&i);
"%s",buf;
} else
U(Fs->rip,1);
} else
U(Fs->rip,1);
dbg.panic=TRUE;
old_waiting_msg=LBtr(&Fs->task_flags,TASKf_AWAITING_MSG);
old_win_inhibit=Fs->win_inhibit;
Fs->win_inhibit=WIG_USER_TASK_DFT;
@@ -549,7 +552,7 @@ U0 Dbg2()
old_getstr2=fp_getstr2;
fp_getstr2=&SysGetStr2;
old_single=SingleUser(OFF);
while (!mouse.install_attempts)
while (!ms_hard.install_attempts)
Yield;
SingleUser(old_single);
UserTaskCont;
@@ -575,7 +578,7 @@ U0 Fault3(I64 fault_num,I64 fault_err_code)
}
"\n\tTempleOS Debugger\n\n"
">Help;\t//For help.\n\n";
Beep(500,TRUE);
Beep(62,TRUE);
if (fault_num==I_DBG) {
if (dbg.msg) {
"\n!!! %s",dbg.msg;
@@ -584,7 +587,8 @@ U0 Fault3(I64 fault_num,I64 fault_err_code)
" !!!\n\n";
}
}
CallerRep;
if (dbg.panic)
CallerRep;
Dbg2;
POPFD
}
@@ -631,12 +635,18 @@ U0 Fault2(I64 fault_num,I64 fault_err_code)
Exit;
}
U0 Dbg(U8 *msg=NULL,I64 msg_num=0)
{//Enters the debugger.Can be used as a panic.
U0 Panic(U8 *msg=NULL,I64 msg_num=0,Bool panic=TRUE)
{//Enter the debugger with panic?
PUSHFD
CLI
dbg.msg=msg;
dbg.msg_num=msg_num;
dbg.panic=panic;
INT I_DBG
POPFD
}
U0 Dbg(U8 *msg=NULL,I64 msg_num=0)
{//Enter debugger, no panic.
Panic(msg,msg_num,FALSE);
}
+3 -3
View File
@@ -164,9 +164,9 @@ CColorROPU16 Str2ColorU16(U8 *st)
while (TRUE) {
if (!*st||StrOcc(str2color_lst,*st))
return res;
if (Bt(chars_bmp_alpha,*st)) {
if (Bt(char_bmp_alpha,*st)) {
ptr=st;
while (Bt(chars_bmp_alpha_numeric,*ptr))
while (Bt(char_bmp_alpha_numeric,*ptr))
ptr++;
st2=ptr2=MAlloc(ptr-st+1);
while (st<ptr)
@@ -185,7 +185,7 @@ CColorROPU16 Str2ColorU16(U8 *st)
return COLOR_INVALID;
}
Free(st2);
} else if (*st=='+'||*st=='|'||Bt(chars_bmp_white_space,*st))
} else if (*st=='+'||*st=='|'||Bt(char_bmp_white_space,*st))
st++;
else if ('0'<=*st<='9') {
i=Str2I64(st,10,&ptr);
+12 -13
View File
@@ -24,8 +24,8 @@ U0 SysGlblsInit()
}
DbgMode(ON);
rev_bits_table =CAlloc(256);
set_bits_table =CAlloc(256);
rev_bits_table=CAlloc(256);
set_bits_table=CAlloc(256);
for (i=0;i<256;i++)
for (j=0;j<8;j++) {
if (Bt(&i,7-j)) LBts(rev_bits_table+i,j);
@@ -47,16 +47,17 @@ U0 SysGlblsInit()
for (i=-308;i<309;i++)
pow10_I64[i+309]=Pow10(i);
snd.ona=ONA_REST;
QueInit(&snd.record_head);
snd.record_head.time=tS;
ProgressBarsRst;
QueInit(&dev.pci_head);
dev.mem64_ptr=MEM_MAPPED_SPACE;
dev.mem64_ptr=mem_mapped_space;
dbg.fun_seg_cache=CAlloc(FUN_SEG_CACHE_SIZE*sizeof(CFunSegCache));
dbg.int_fault_code=IntFaultHandlersNew;
dbg.int_fault_code=IntFaultHndlrsNew;
}
U0 SysGrInit()
@@ -131,17 +132,15 @@ U0 Reboot()
U0 KernelMain()
{//Continued from $LK,"Kernel",A="FF:::/Kernel/KStart64.HC,I32 &Kernel"$
OutU8(0x61,InU8(0x61)&~3); //Snd(0);
OutU8(0x61,InU8(0x61)&~3); //Snd;
adam_task=Fs;
BlkPoolsInit;
LBts(&sys_run_level,RLf_FULL_HEAP);
SysGlblsInit;
Mem32DevInit;
MemPagesNotPresentMark;
UncachedAliasAlloc;
LoadKernel;
SysGrInit;
StrCpy(Fs->task_name,"Adam Task CPU#0");
StrCpy(Fs->task_name,"Adam Task CPU00");
StrCpy(Fs->task_title,Fs->task_name);
Fs->title_src=TTS_TASK_NAME;
Fs->win_right=text.cols-2;
@@ -152,7 +151,7 @@ U0 KernelMain()
Core0Init;
IntInit1;
//Before this point use $LK,"Snd",A="MN:Snd"$() and $LK,"BusyWait",A="MN:BusyWait"$()
//Before this point use $LK,"Snd",A="MN:Snd"$() and $LK,"Busy",A="MN:Busy"$()
//to debug. After this point, use $LK,"RawPrint",A="MN:RawPrint"$()
LBts(&sys_run_level,RLf_RAW);
"TempleOS V%5.3f\t%D %T\n\n",
@@ -165,7 +164,7 @@ U0 KernelMain()
IntsInit;
"Enable IRQ's\n";
SetRFlags(RFLAGG_NORMAL);
BusyWait(2000);
Busy(2000);
IntInit2;
LBts(&sys_run_level,RLf_INTERRUPTS);
@@ -185,10 +184,10 @@ U0 KernelMain()
"LBts(&sys_run_level,RLf_MP);");
};
KbdMouseVarsInit;
IPVarsInit;
KbdMsInit;
MsInit;
KbdInit;
Spawn(&MouseDriverInstall);
Spawn(&MsHardDrvrInstall);
"Loading Compiler\n";
Cd("/Compiler");
+20 -36
View File
@@ -14,13 +14,13 @@ _TEST_EXCEPT::
MOV R15,U64 CExcept.r15[RAX]
PUSH U64 CExcept.rflags[RAX]
POPFD
JMP U64 CExcept.handler_catch[RAX]
JMP U64 CExcept.hndlr_catch[RAX]
_TAKE_EXCEPT::
XOR RAX,RAX
MOV RAX,FS:U64 CTask.last_except[RAX]
MOV RSP,U64 CExcept.rsp[RAX]
JMP U64 CExcept.handler_untry[RAX]
JMP U64 CExcept.hndlr_untry[RAX]
_SAVE_EXCEPT_REGS::
PUSH RBP
@@ -45,9 +45,9 @@ _extern _SAVE_EXCEPT_REGS U0 SaveExceptRegs(CExcept *t);
U0 PutExcept(Bool catch_it=TRUE)
{//Print exception msg and catch exception.
"Except:%c:",Fs->except_ch;
"%P:%P:%P:%P:%P:%P\n",Fs->except_caller1,Fs->except_caller2,
Fs->except_caller3,Fs->except_caller4,Fs->except_caller5,
Fs->except_caller6,Fs->except_caller7,Fs->except_caller8;
"%P:%P:%P:%P:%P:%P\n",Fs->except_callers[0],Fs->except_callers[1],
Fs->except_callers[2],Fs->except_callers[3],Fs->except_callers[4],
Fs->except_callers[5],Fs->except_callers[6],Fs->except_callers[7];
Fs->catch_except=catch_it;
}
@@ -65,8 +65,8 @@ U0 SysTry(U8 *catch_start,U8 *untry_start)
{
I64 *rbp=GetRBP;
CExcept *tmpt=MAlloc(sizeof(CExcept));
tmpt->handler_catch=catch_start;
tmpt->handler_untry=untry_start;
tmpt->hndlr_catch=catch_start;
tmpt->hndlr_untry=untry_start;
tmpt->rsp=rbp(U8 *)+sizeof(CTryStk);
tmpt->rbp=*rbp;
tmpt->rflags=GetRFlags;
@@ -86,22 +86,17 @@ U0 throw(I64 ch=0,Bool no_log=FALSE)
//In the catcher, fetch ch from Fs->except_ch.
CExcept *tmpt=Fs->last_except;
Bool was_raw;
I64 i;
Fs->except_ch=ch;
Fs->except_caller1=Caller(1);
Fs->except_caller2=Caller(2);
Fs->except_caller3=Caller(3);
Fs->except_caller4=Caller(4);
Fs->except_caller5=Caller(5);
Fs->except_caller6=Caller(6);
Fs->except_caller7=Caller(7);
Fs->except_caller8=Caller(8);
for (i=0;i<TASK_EXCEPT_CALLERS;i++)
Fs->except_callers[i]=Caller(i+1);
Fs->except_rbp=GetRBP;
Fs->catch_except=FALSE;
if (!no_log)
AdamLog("Except:%c:%p:%p:%p:%p:%p:%p\n",ch,Fs->except_caller1,
Fs->except_caller2,Fs->except_caller3,Fs->except_caller4,
Fs->except_caller5,Fs->except_caller6,Fs->except_caller7,
Fs->except_caller8);
AdamLog("Except:%c:%p:%p:%p:%p:%p:%p\n",ch,Fs->except_callers[0],
Fs->except_callers[1],Fs->except_callers[2],Fs->except_callers[3],
Fs->except_callers[4],Fs->except_callers[5],Fs->except_callers[6],
Fs->except_callers[7]);
while (Fs->next_except!=&Fs->next_except) {
TestExcept;
if (Fs->catch_except)
@@ -113,17 +108,17 @@ U0 throw(I64 ch=0,Bool no_log=FALSE)
}
was_raw=Raw(ON);
PutExcept(FALSE);
Dbg("Unhandled Exception");
Panic("Unhandled Exception");
Raw(was_raw);
}
#exe {Option(OPTf_NO_REG_VAR,OFF);};
U0 SysThrowBreak()
{
U0 Break()
{//Send <CTRL-ALT-c>.
if (Bt(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC))
Msg(MSG_KEY_DOWN,CH_SHIFT_ESC,0x20100000201);
else {//TODO: Might want lock
else {
Fs->wake_jiffy=0;
TaskRstAwaitingMsg;
DrvsRelease();
@@ -133,17 +128,6 @@ U0 SysThrowBreak()
}
}
U0 ThrowBreak(CTask *task=NULL)
{//Can be used to exit an app, but not a task.
if (task && task!=Fs) {
if (!TaskValidate(task)) return;
//TODO: Might want lock
sys_focus_task=task;
LBts(sys_ctrl_alt_flags,SYSf_CTRL_ALT_C);
} else
SysThrowBreak;
}
Bool BreakLock(CTask *task=NULL)
{//Disables <CTRL-ALT-c>.
if (!task) task=Fs;
@@ -157,9 +141,9 @@ Bool BreakUnlock(CTask *task=NULL)
res=LBtr(&task->task_flags,TASKf_BREAK_LOCKED);
if (LBtr(&task->task_flags,TASKf_PENDING_BREAK)) {
if (task==Fs)
ThrowBreak;
Break;
else
task->rip=&ThrowBreak;
task->rip=&Break;
}
return res;
}
+17 -15
View File
@@ -10,7 +10,8 @@ import Bool Ed(U8 *link_st,I64 edf_dof_flags=0);
extern U0 AdamErr(U8 *fmt,...);
extern U0 AdamLog(U8 *fmt,...);
extern I64 BIOSTotalMem();
extern I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free);
extern I64 BlkDevAdd(CBlkDev *bd,I64 prt_num=MIN_I64,
Bool whole_drv,Bool make_free);
extern CBlkDev *BlkDevChk(CBlkDev *bd,Bool except=TRUE);
extern Bool BlkDevLock(CBlkDev *bd);
extern CBlkDev *BlkDevNextFreeSlot(U8 first_drv_let,I64 type);
@@ -19,7 +20,6 @@ extern U0 BlkDevsRelease();
extern U8 *Caller(I64 num=1);
extern U8 *CatPrint(U8 *_dst,U8 *fmt,...);
extern Bool Cd(U8 *dirname=NULL,Bool make_dirs=FALSE);
extern U0 Dbg(U8 *msg=NULL,I64 msg_num=0);
extern U0 DbgHelp();
extern U8 *Define(U8 *dname);
extern I64 DefineMatch(U8 *needle,U8 *haystack_lst_dname,I64 flags=0);
@@ -40,9 +40,9 @@ extern I64 FAT32AllocClusters(CDrv *dv,I64 c,I64 cnt);
extern I64 FAT32AllocContiguousClusters(CDrv *dv,I64 cnt);
extern Bool FAT32DirNew(CDrv *dv,U8 *cur_dir,CDirEntry *tmpde,
Bool free_old_chain);
extern U0 FAT32DrvInit(CDrv *dv);
extern Bool FAT32FileFind(CDrv *dv,I64 cur_dir_cluster,U8 *name,
CDirEntry *_res,I64 fuf_flags=0);
extern U0 FAT32Init(CDrv *dv);
extern U0 FClose(CFile *f);
extern CFile *FOpen(U8 *filename,U8 *flags,I64 cnt=0);
extern Bool FRBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1);
@@ -59,18 +59,24 @@ extern CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL,
CTask *task=NULL,CBlkPool *bp);
extern Bool ISO1FileFind(CDrv *dv,I64 cur_dir_cluster,U8 *name,
CDirEntry *_res,I64 fuf_flags=0);
extern Bool ISODrvInit(CDrv *dv,I64 blk);
extern Bool ISOInit(CDrv *dv,I64 blk);
extern Bool IsDbgMode();
extern Bool IsDir(U8 *dir_name);
extern Bool IsRaw();
extern U0 JobCtrlInit(CJobCtrl *ctrl);
extern U0 JobDel(CJob *tmpc);
extern U0 JobQueDel(CJob *head);
extern I64 JobsHndlr(I64 run_flags,CTask *task=NULL);
extern CBlkDev *Let2BlkDev(U8 drv_let=0,Bool except=TRUE);
extern I64 Let2BlkDevType(U8 drv_let);
extern CDrv *Let2Drv(U8 drv_let=0,Bool except=TRUE);
extern U8 Let2Let(U8 drv_let=0);
extern U0 MPInt(U8 num,I64 cpu_num=1);
extern U8 *MStrPrint(U8 *fmt,...);
extern Bool MkDir(U8 *filename,I64 entry_cnt=0);
extern U0 MouseIPSet(I64 x,I64 y,I64 z,I64 l,I64 r);
extern U0 Msg(I64 msg_code,I64 a1,I64 a2,I64 flags=0);
extern U0 MsHardSet(I64 x,I64 y,I64 z,I64 l,I64 r);
extern U0 Msg(I64 msg_code,I64 arg1,I64 arg2,I64 flags=0);
extern U0 Panic(U8 *msg=NULL,I64 msg_num=0,Bool panic=TRUE);
extern I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL);
extern U0 Print(U8 *fmt,...);
extern U0 PutChars(U64 ch);
@@ -79,24 +85,20 @@ extern Bool RBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt);
extern I64 RedSeaAllocClusters(CDrv *dv,I64 cnt);
extern Bool RedSeaDirNew(CDrv *dv,U8 *cur_dir,CDirEntry *tmpde,
Bool free_old_chain);
extern U0 RedSeaDrvInit(CDrv *dv);
extern Bool RedSeaDrvValidate(U8 drv_let);
extern Bool RedSeaFileFind(CDrv *dv,I64 cur_dir_cluster,U8 *name,
CDirEntry *_res,I64 fuf_flags=0);
extern U0 RedSeaFmt(U8 drv_let,Bool quick=TRUE);
extern U0 RedSeaFreeFreeLst(CDrv *dv);
extern U0 RedSeaInit(CDrv *dv);
extern Bool RedSeaValidate(U8 drv_let);
extern CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
U8 *task_name=NULL,I64 target_cpu,CTask *parent=NULL, //NULL means adam
I64 stk_size=0,I64 flags=1<<SVCf_ADD_TO_QUE);
extern U0 SrvCmdDel(CSrvCmd *tmpc);
extern U0 SrvCmdQueDel(CSrvCmd *head);
extern I64 SrvCmdsHandler(I64 run_flags,CTask *task=NULL);
extern U0 SrvCtrlInit(CSrvCtrl *ctrl);
I64 stk_size=0,I64 flags=1<<JOBf_ADD_TO_QUE);
extern U8 *StrPrint(U8 *dst,U8 *fmt,...);
extern U0 StrPrintFunSeg(U8 *buf,I64 addr,I64 field_len,I64 flags);
extern Bool Suspend(CTask *task=NULL,Bool state=TRUE);
extern CSrvCmd *TaskMsg(CTask *_srv,CTask *master,
I64 msg_code,I64 a1,I64 a2,I64 flags);
extern CJob *TaskMsg(CTask *_srv,CTask *master,
I64 msg_code,I64 arg1,I64 arg2,I64 flags);
extern U0 TaskRstAwaitingMsg(CTask *task=NULL);
extern Bool TaskValidate(CTask *task);
extern U0 TaskWait(CTask *task=NULL,Bool cmd_line_pmt=FALSE);
+6 -6
View File
@@ -1,7 +1,7 @@
//Compiler initializes glbls in AOT bin modules to zero.
//$LK,"Globals Set to Zero Here",A="FF:::/Compiler/PrsStmt.HC,sys_var_init_flag"$.
//$LK,"Globals Set to Zero Here",A="FF:::/Compiler/PrsStmt.HC,Init AOT glbl to zero"$.
CSrvCmd sys_macro_head;
CJob sys_macro_head;
CTask *sys_macro_task;
CDoc *sys_clipboard_doc;
@@ -13,7 +13,7 @@ U8 *rev_bits_table, //Table with U8 bits revd
*set_bits_table; //Table with count of set bits in a U8
CDate local_time_offset;
F64 *pow10_I64,
sys_os_version=4.130;
sys_os_version=5.000;
CAutoCompleteDictGlbls acd;
CAutoCompleteGlbls ac;
@@ -21,11 +21,11 @@ CBlkDevGlbls blkdev;
CCntsGlbls cnts={1,0,2676302000,2676302,2676302000,0,0,0,FALSE};
CDbgGlbls dbg;
CDevGlbls dev;
CGridGlbls ip_grid; //See $LK,"::/Demo/Graphics/Grid.HC"$.
CIPStateGlbls ip,ip_last;
CGridGlbls ms_grid; //See $LK,"::/Demo/Graphics/Grid.HC"$.
CMsStateGlbls ms,ms_last;
CKbdStateGlbls kbd;
CKeyDevGlbls keydev;
CMouseStateGlbls mouse,mouse_last;
CMsHardStateGlbls ms_hard,ms_hard_last;
CSndGlbls snd;
CTextGlbls text;
+5 -5
View File
@@ -52,7 +52,7 @@ IRQ_TIMER:: //I_TIMER
MOV U32 [RAX+RDX],0
JMP @@25
@@20: CALL &IntCore0TimerHandler //Only Core 0 calls this.
@@20: CALL &IntCore0TimerHndlr //Only Core 0 calls this.
@@25: XOR RAX,RAX
CMP RSI,U64 GS:CCPU.idle_task[RAX]
JE I32 RESTORE_SETH_TASK_IF_READY
@@ -61,7 +61,7 @@ IRQ_TIMER:: //I_TIMER
INT_FAULT::
PUSH RBX
PUSH RAX
MOV BL,U8 16[RSP] //We pushed fault_num $LK,"IntFaultHandlersNew",A="MN:IntFaultHandlersNew"$().
MOV BL,U8 16[RSP] //We pushed fault_num $LK,"IntFaultHndlrsNew",A="MN:IntFaultHndlrsNew"$().
XOR RAX,RAX
MOV FS:U8 CTask.fault_num[RAX],BL
POP RAX
@@ -106,11 +106,11 @@ U8 *IntEntryGet(I64 irq)
return res;
}
U8 *IntEntrySet(I64 irq,U0 (*fp_new_handler)(),I64 type=IDTET_IRQ,I64 dpl=0)
U8 *IntEntrySet(I64 irq,U0 (*fp_new_hndlr)(),I64 type=IDTET_IRQ,I64 dpl=0)
{//Set interrupt vector. See $LK,"IDTET_IRQ",A="MN:IDTET_IRQ"$.
//See $LK,"::/Demo/Lectures/InterruptDemo.HC"$.
//See $LK,"::/Demo/MultiCore/Interrupts.HC"$.
I64 fp=fp_new_handler;
I64 fp=fp_new_hndlr;
U8 *res,*dst;
PUSHFD
CLI
@@ -163,7 +163,7 @@ interrupt U0 IntDivZero()
throw('DivZero');
}
U8 *IntFaultHandlersNew()
U8 *IntFaultHndlrsNew()
{
I64 i;
U8 *res=MAlloc(256*7,Fs->code_heap),*dst=res;
+3 -3
View File
@@ -240,11 +240,11 @@ CBinFile *Load(U8 *filename,I64 ld_flags=0,CBinFile *bfh_addr=INVALID_PTR)
U0 LoadKernel()
{
HashGenericAdd(KERNEL_MODULE_NAME,HTT_MODULE|HTF_PUBLIC,
sys_boot_base-sizeof(CBinFile));
mem_boot_base-sizeof(CBinFile));
//Abs patches done here $LK,"CPatchTableAbsAddr",A="FF:D:/Kernel/KStart32.HC,CPatchTableAbsAddr"$.
LoadPass1(sys_boot_patch_table_base,sys_boot_base,LDF_NO_ABSS|LDF_SILENT);
LoadPass1(sys_boot_patch_table_base,mem_boot_base,LDF_NO_ABSS|LDF_SILENT);
//No main routines
// LoadPass2(sys_boot_patch_table_base,sys_boot_base,0);
// LoadPass2(sys_boot_patch_table_base,mem_boot_base,0);
}
+63 -46
View File
@@ -44,15 +44,15 @@ I64 BCnt(I64 d)
return res;
}
U0 IntCore0TimerHandler(CTask *)
{//Called from $LK,"IntCore0TimerHandler",A="FF:::/Kernel/KInts.HC,IntCore0TimerHandler"$
U0 IntCore0TimerHndlr(CTask *)
{//Called from $LK,"IntCore0TimerHndlr",A="FF:::/Kernel/KInts.HC,IntCore0TimerHndlr"$
I64 i;
if (mp_cnt>1)
while (LBts(&sys_semas[SYS_SEMA_SYS_TIMER],0))
while (LBts(&sys_semas[SEMA_SYS_TIMER],0))
PAUSE
lock cnts.jiffies++;
cnts.timer+=SYS_TIMER0_PERIOD+1;
LBtr(&sys_semas[SYS_SEMA_SYS_TIMER],0);
LBtr(&sys_semas[SEMA_SYS_TIMER],0);
for (i=1;i<mp_cnt;i++)
MPInt(I_TIMER,i);
OutU8(0x20,0x20); //Acknowledge PIC Interrupt
@@ -64,7 +64,7 @@ I64 SysTimerRead()
PUSHFD
CLI
if (mp_cnt>1)
while (LBts(&sys_semas[SYS_SEMA_SYS_TIMER],0))
while (LBts(&sys_semas[SEMA_SYS_TIMER],0))
PAUSE
OutU8(0x43,0); //Latch Timer0
if ((i=InU8(0x40)+InU8(0x40)<<8)==SYS_TIMER0_PERIOD) {
@@ -72,7 +72,7 @@ I64 SysTimerRead()
i=-1;
}
res=cnts.timer+SYS_TIMER0_PERIOD-i;
LBtr(&sys_semas[SYS_SEMA_SYS_TIMER],0);
LBtr(&sys_semas[SEMA_SYS_TIMER],0);
POPFD
return res;
}
@@ -133,7 +133,7 @@ Bool Blink(F64 Hz=2.5)
return ToI64(cnts.jiffies*2*Hz/JIFFY_FREQ)&1;
}
U0 BusyWait(I64 æS)
U0 Busy(I64 æS)
{//Loosely timed.
I64 i;
if (cnts.HPET_freq) {
@@ -152,63 +152,79 @@ U0 SleepUntil(I64 wake_jiffy)
LBEqu(&Fs->task_flags,TASKf_IDLE,old_idle);
}
U0 Sleep(I64 ms)
U0 Sleep(I64 mS)
{//Not for power-saving. It is to make a program pause without hogging the CPU.
if (!ms)
if (!mS)
Yield;
else
SleepUntil(cnts.jiffies+ms*JIFFY_FREQ/1000);
SleepUntil(cnts.jiffies+mS*JIFFY_FREQ/1000);
}
U0 Snd(F64 freq)
F64 Ona2Freq(I8 ona)
{//Ona to freq. Ona=60 is 440.0Hz.
if (ona==ONA_REST)
return 0;
else
return 440.0/32*2.0`(ona/12.0);
}
I8 Freq2Ona(F64 freq)
{//Freq to Ona. 440.0Hz is Ona=60.
if (freq>0)
return ClampI64(12*Log2(32.0/440.0*freq),ONA_REST+1,MAX_I8);
else
return ONA_REST;
}
U0 Snd(I8 ona=ONA_REST)
{//Play freq. Zero means off.
I64 period;
CSndData *d;
if (!Bt(&sys_semas[SYS_SEMA_MUTE],0) &&
!LBts(&sys_semas[SYS_SEMA_SND],0)) { //Mutex. Just throw-out if in use
if (freq!=snd.freq) {
snd.freq=freq;
if (0<freq<=20000) {
period=SYS_TIMER_FREQ/freq;
OutU8(0x43,0xB6);
OutU8(0x42,period);
OutU8(0x42,period.u8[1]);
OutU8(0x61,3|InU8(0x61));
} else
OutU8(0x61,InU8(0x61)&~3);
if (!Bt(&sys_semas[SEMA_MUTE],0) &&
!LBts(&sys_semas[SEMA_SND],0)) { //Mutex. Just throw-out if in use
if (ona<=ONA_REST) {
snd.ona=ona;
OutU8(0x61,InU8(0x61)&~3);
} else if (ona!=snd.ona) {
snd.ona=ona;
period=ClampI64(SYS_TIMER_FREQ/Ona2Freq(ona),1,MAX_U16);
OutU8(0x43,0xB6);
OutU8(0x42,period);
OutU8(0x42,period.u8[1]);
OutU8(0x61,3|InU8(0x61));
}
if (!IsDbgMode && snd.record) {
d=ACAlloc(sizeof(CSndData));
d->freq=freq;
d->ona=ona;
d->time=tS;
QueIns(d,snd.record_head.last);
}
LBtr(&sys_semas[SYS_SEMA_SND],0);
LBtr(&sys_semas[SEMA_SND],0);
}
}
U0 SndRst()
{//Fix stuck sound.
if (Bt(&sys_semas[SYS_SEMA_SND],0)) {
if (Bt(&sys_semas[SEMA_SND],0)) {
Sleep(1);
if (Bt(&sys_semas[SYS_SEMA_SND],0)) {
if (Bt(&sys_semas[SEMA_SND],0)) {
Sleep(1);
LBtr(&sys_semas[SYS_SEMA_SND],0);
LBtr(&sys_semas[SEMA_SND],0);
}
}
Snd(0);
Snd;
}
U0 Beep(I64 freq=500,Bool busy=FALSE)
{//Make beep at given freq.
Snd(freq);
U0 Beep(I8 ona=62,Bool busy=FALSE)
{//Make beep at given ona freq.
Snd(ona);
if (busy)
BusyWait(500000);
Busy(500000);
else
Sleep(500);
Snd(0);
Snd;
if (busy)
BusyWait(200000);
Busy(200000);
else
Sleep(200);
}
@@ -219,17 +235,17 @@ Bool Mute(Bool val)
if (val) {
PUSHFD
CLI
Snd(0);
res=LBts(&sys_semas[SYS_SEMA_MUTE],0);
Snd;
res=LBts(&sys_semas[SEMA_MUTE],0);
POPFD
} else
res=LBtr(&sys_semas[SYS_SEMA_MUTE],0);
res=LBtr(&sys_semas[SEMA_MUTE],0);
return res;
}
Bool IsMute()
{//Return is-mute flag.
return Bt(&sys_semas[SYS_SEMA_MUTE],0);
return Bt(&sys_semas[SEMA_MUTE],0);
}
Bool Silent(Bool val=ON)
@@ -244,12 +260,12 @@ Bool IsSilent()
Bool SysDbg(Bool val)
{//Set SysDbg bit you can use while debugging.
return LBEqu(&sys_semas[SYS_SEMA_DEBUG],0,val);
return LBEqu(&sys_semas[SEMA_DEBUG],0,val);
}
Bool IsSysDbg()
{//Return SysDbg bit.
return Bt(&sys_semas[SYS_SEMA_DEBUG],0);
return Bt(&sys_semas[SEMA_DEBUG],0);
}
Bool Raw(Bool val)
@@ -266,25 +282,26 @@ Bool IsRaw()
Bool SingleUser(Bool val)
{//Set single-user mode.
return LBEqu(&sys_semas[SYS_SEMA_SINGLE_USER],0,val);
return LBEqu(&sys_semas[SEMA_SINGLE_USER],0,val);
}
Bool IsSingleUser()
{//Return single-user mode.
return Bt(&sys_semas[SYS_SEMA_SINGLE_USER],0);
return Bt(&sys_semas[SEMA_SINGLE_USER],0);
}
Bool DbgMode(Bool val)
{//Set dbg-mode.
return LBEqu(&sys_semas[SYS_SEMA_DBG_MODE],0,val);
return LBEqu(&sys_semas[SEMA_DBG_MODE],0,val);
}
Bool IsDbgMode()
{//Return dbg-mode.
return Bt(&sys_semas[SYS_SEMA_DBG_MODE],0);
return Bt(&sys_semas[SEMA_DBG_MODE],0);
}
U0 ProgressBarsRst()
U0 ProgressBarsRst(U8 *path=NULL)
{
CallExtStr("ProgressBarsRegTf",path);
MemSet(sys_progresses,0,sizeof(sys_progresses));
}
+51 -22
View File
@@ -15,7 +15,7 @@ because it is #included first. $LK,"Kernel.PRJ",A="FF:::/Kernel/Kernel.PRJ,KSta
*/
USE16
SYS_KERNEL:: //This must match $LK,"CKernel",A="MN:CKernel"$.
JMP U16 CORE0_16BIT_INIT
JMP I16 CORE0_16BIT_INIT
//************************************
// ASM Global vars required for 16-bit start-up
@@ -27,13 +27,13 @@ SYS_RUN_LEVEL:: DU32 0;
#exe {StreamPrint("SYS_COMPILE_TIME:: DU64 0x%X;",Now);} //See $LK,"BootDVDProbe",A="MN:BootDVDProbe"$
#assert SYS_COMPILE_TIME+sizeof(CDate)+sizeof(CBinFile)<DVD_BLK_SIZE
SYS_BOOT_BASE:: DU32 0; //Offset from start used by reboot
SYS_MEM_E801:: DU16 0,0;
SYS_MEM_E820:: DU8 MEM_NUM_E820_ENTRIES*MEM_E820_ENTRY_SIZE DUP (0);
SYS_GDT_PTR:: DU16 sizeof(CGDT)-1;
DU64 0;
SYS_PCI_BUSES:: DU16 0;
MEM_BOOT_BASE:: DU32 0; //Offset from start used by reboot
MEM_E801:: DU16 0,0;
MEM_E820:: DU8 MEM_NUM_E820_ENTRIES*sizeof(CMemE820) DUP (0);
MEM_PHYSICAL_SPACE:: DU64 0;
SYS_GDT_PTR:: DU16 sizeof(CGDT)-1;
DU64 0;
SYS_PCI_BUSES:: DU16 0;
ALIGN 16,OC_NOP
SYS_GDT:: //See $LK,"CGDT",A="MN:CGDT"$
@@ -61,9 +61,9 @@ CORE0_16BIT_INIT::
PUSH ECX //Will be $LK,"SYS_BOOT_SRC",A="FF:::/Kernel/KStart16.HC,[SYS_BOOT_SRC]"$. See $LK,"BootHD",A="FF:::/Adam/Opt/Boot/BootHD.HC,BOOT_SRC_HARDDRV"$, $LK,"BootDVD",A="FF:::/Adam/Opt/Boot/BootDVD.HC,BOOT_SRC_DVD"$ & $LK,"BootRAM",A="FF:::/Adam/Opt/Boot/BootRAM.HC,BOOT_SRC_RAM"$.
PUSH EBX
CALL U16 GET_IP
GET_IP: POP BX
SUB BX,GET_IP
CALL U16 GET_RIP
GET_RIP: POP BX
SUB BX,GET_RIP
SHR BX,4
MOV AX,CS
ADD AX,BX
@@ -88,20 +88,20 @@ GET_IP: POP BX
BTS U32 [SYS_RUN_LEVEL],RLf_VGA
@@10:
//Get mem maps
//Get mem maps.
MOV AX,0xE801
INT 0x15
MOV U16 [SYS_MEM_E801],CX
MOV U16 [SYS_MEM_E801+2],DX
MOV U16 [MEM_E801],CX
MOV U16 [MEM_E801+2],DX
MOV CX,MEM_NUM_E820_ENTRIES-1 //Leave one to terminate
XOR EBX,EBX
MOV AX,DS
MOV ES,AX
MOV DI,SYS_MEM_E820
MOV DI,MEM_E820
@@15: PUSH CX
MOV EAX,0xE820
MOV ECX,MEM_E820_ENTRY_SIZE
MOV ECX,sizeof(CMemE820)
MOV EDX,'PAMS'
INT 0x15
JC @@20
@@ -109,23 +109,52 @@ GET_IP: POP BX
JNE @@20
TEST EBX,EBX
JZ @@20
ADD DI,MEM_E820_ENTRY_SIZE
ADD DI,sizeof(CMemE820)
POP CX
LOOP @@15
JMP @@25
SUB SP,2
@@20: ADD SP,2
//Find how much space to map, start with E801 limit.
XOR EAX,EAX
MOV AX,[MEM_E801+2]
SHL EAX,16
ADD EAX,SYS_16MEG_AREA_LIMIT
XOR EDX,EDX
//Find max of E820 to set mapped space.
MOV SI,MEM_E820
@@25: MOV CL,CMemE820.type[SI]
TEST CL,CL
JZ @@35
MOV EBX,CMemE820.base[SI]
MOV ECX,CMemE820.base+4[SI]
ADD EBX,CMemE820.len[SI]
ADC ECX,CMemE820.len+4[SI]
SUB EBX,EAX
SBB ECX,EDX
JC @@30
MOV EAX,CMemE820.base[SI]
MOV EDX,CMemE820.base+4[SI]
ADD EAX,CMemE820.len[SI]
ADC EDX,CMemE820.len+4[SI]
@@30: ADD SI,sizeof(CMemE820)
JMP @@25
@@35: MOV [MEM_PHYSICAL_SPACE],EAX
MOV [MEM_PHYSICAL_SPACE+4],EDX
//Get PCI Bus Info
@@25: MOV U16 [SYS_PCI_BUSES],256
MOV U16 [SYS_PCI_BUSES],256
XOR DX,DX
MOV AX,0xB101
INT 0x1A
CMP DX,'PC'
JNE @@30
JNE @@40
MOV CH,0
INC CX
MOV U16 [SYS_PCI_BUSES],CX
@@30:
@@40:
CLI
//Enable A20
IN AL,0x92
@@ -142,7 +171,7 @@ GET_IP: POP BX
MOV ES,AX
SHL EAX,4
MOV U32 [SYS_BOOT_BASE],EAX
MOV U32 [MEM_BOOT_BASE],EAX
MOV DX,CS
SUB DX,sizeof(CBinFile)/16
+24 -10
View File
@@ -3,8 +3,16 @@ USE32
//************************************
// ASM Global vars not required for 16-bit start-up
ALIGN 8,OC_NOP
SYS_HEAP_BASE:: DU64 SYS_FIXED_AREA+sizeof(CSysFixedArea);
SYS_HEAP_LIMIT:: DU64 0;
MEM_HEAP_BASE:: DU64 0;
MEM_HEAP_LIMIT:: DU64 0;
MEM_PAGE_SIZE:: DU64 0;
MEM_MAPPED_SPACE:: DU64 0;
MEM_NUM_2MEG:: DU64 0;
MEM_NUM_1GIG:: DU64 0;
MEM_NUM_512GIG:: DU64 0;
MEM_PML2:: DU64 0;
MEM_PML3:: DU64 0;
MEM_PML4:: DU64 0;
#exe {
StreamPrint(
@@ -13,13 +21,15 @@ SYS_HEAP_LIMIT:: DU64 0;
"SYS_HEAP_INIT_FLAG:: DU8 %d;"
"SYS_HEAP_INIT_VAL:: DU8 %d;"
"SYS_VAR_INIT_FLAG:: DU8 %d;"
"SYS_VAR_INIT_VAL:: DU8 %d;",
"SYS_VAR_INIT_VAL:: DU8 %d;"
"SYS_STAFF_MODE_FLAG:: DU8 %d;",
kernel_cfg->opts[CFG_MEM_INIT], kernel_cfg->mem_init_val,
kernel_cfg->opts[CFG_HEAP_INIT],kernel_cfg->heap_init_val,
kernel_cfg->opts[CFG_VAR_INIT], kernel_cfg->var_init_val);
kernel_cfg->opts[CFG_VAR_INIT], kernel_cfg->var_init_val,
kernel_cfg->opts[CFG_STAFF_MODE]);
};
SYS_HEAP_DBG_FLAG:: DU8 _CFG_HEAP_DBG;
SYS_GIG_PAGES:: DU8 0;
ALIGN 8,0
SYS_CTRL_ALT_FLAGS:: DU64 0;
SYS_EXTERN_TABLE:: DU64 0;
@@ -31,18 +41,22 @@ SYS_PROGRESSES::
SYS_PROGRESS1:: DU64 0;
SYS_PROGRESS1_MAX:: DU64 0;
SYS_PROGRESS1_T0:: DU64 0;
SYS_PROGRESS1_TF:: DU64 0;
SYS_PROGRESS1_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
SYS_PROGRESS2:: DU64 0;
SYS_PROGRESS2_MAX:: DU64 0;
SYS_PROGRESS2_T0:: DU64 0;
SYS_PROGRESS2_TF:: DU64 0;
SYS_PROGRESS2_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
SYS_PROGRESS3:: DU64 0;
SYS_PROGRESS3_MAX:: DU64 0;
SYS_PROGRESS3_T0:: DU64 0;
SYS_PROGRESS3_TF:: DU64 0;
SYS_PROGRESS3_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
SYS_PROGRESS4:: DU64 0;
SYS_PROGRESS4_MAX:: DU64 0;
SYS_PROGRESS4_T0:: DU64 0;
SYS_PROGRESS4_TF:: DU64 0;
SYS_PROGRESS4_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
#assert $$-SYS_PROGRESSES==sizeof(CProgress)*4
@@ -55,7 +69,7 @@ SYS_MP_CNT_LOCK:: DU64 1;
ALIGN DFT_CACHE_LINE_WIDTH,OC_NOP
SYS_CACHE_LINE_WIDTH:: DU64 DFT_CACHE_LINE_WIDTH;
DU8 DFT_CACHE_LINE_WIDTH-sizeof(CBinFile)-8 DUP(0);
SYS_SEMAS:: DU8 NUM_SYS_SEMAS*SEMA_STRUCT_SIZE DUP(0);
SYS_SEMAS:: DU8 SEMA_NUM_SEMAS*DFT_CACHE_LINE_WIDTH DUP(0);
//************************************
ALIGN 16,OC_NOP
CORE0_32BIT_INIT:: //Entry point for $LK,"BootRAM",A="MN:BootRAM"$.
@@ -68,7 +82,7 @@ CORE0_32BIT_INIT:: //Entry point for $LK,"BootRAM",A="MN:BootRAM"$.
MOV DS,AX
BTS U32 [SYS_RUN_LEVEL],RLf_32BIT
MOV ESI,U32 [SYS_BOOT_PATCH_TABLE_BASE]
MOV EDI,U32 [SYS_BOOT_BASE]
MOV EDI,U32 [MEM_BOOT_BASE]
MOV AX,CGDT.ds
MOV DS,AX
@@ -94,10 +108,10 @@ CORE0_32BIT_INIT:: //Entry point for $LK,"BootRAM",A="MN:BootRAM"$.
CALL SYS_FIND_PCIBIOS_SERVICE_DIR
CALL SYS_FIND_PCI_SERVICES
MOV U32 [SYS_HEAP_BASE],SYS_FIXED_AREA+sizeof(CSysFixedArea)
CALL SYS_INIT_PAGE_TABLES
CALL SYS_INIT_16MEG_SYS_CODE_BP
PUSH U32 0 //Return from next call will be 64-bit
CALL SYS_ENTER_LONG_MODE
//We fall-thou to $LK,"KStart64",A="FL:::/Kernel/KStart64.HC,1"$, next.
}
+3 -3
View File
@@ -15,7 +15,7 @@ USE64
//Init Adam HeapCtrl
MOV EDI,U32 SYS_FIXED_AREA+CSysFixedArea.adam_hc
MOV EAX,U32 SYS_FIXED_AREA+CSysFixedArea.adam_bp
MOV EAX,U32 SYS_FIXED_AREA+CSysFixedArea.sys_code_bp
MOV U64 CHeapCtrl.bp[RDI],RAX
MOV U32 CHeapCtrl.hc_signature[RDI],HEAP_CTRL_SIGNATURE_VAL
@@ -29,7 +29,7 @@ USE64
MOV U64 CTask.data_heap[RAX],RDI
MOV U32 CTask.task_signature[RAX],TASK_SIGNATURE_VAL
BTS U32 [SYS_RUN_LEVEL],RLf_BOOT_HEAP
BTS U32 [SYS_RUN_LEVEL],RLf_16MEG_ADAM_HEAP_CTRL
PUSH MEM_ADAM_STK
PUSH U32 SYS_FIXED_AREA+CSysFixedArea.adam
@@ -46,7 +46,7 @@ SYS_ENTER_LONG_MODE:: //Switch to long 64-bit mode
OR EAX,0xB0
MOV_CR4_EAX
MOV EAX,SYS_FIXED_AREA+CSysFixedArea.pml4
MOV EAX,[MEM_PML4]
MOV_CR3_EAX
MOV ECX,IA32_EFER
+37 -24
View File
@@ -4,6 +4,9 @@ U0 Exit()
LBts(&Fs->task_flags,TASKf_KILL_AFTER_DBG);
G;
} else {
if (sys_staff_mode_flag)
AdamLog("%p:%p:%p:%p:%p:%p\n",Caller(0),Caller(1),Caller(2),Caller(3),
Caller(4),Caller(5),Caller(6),Caller(7));
if (!Gs->num && !IsDbgMode)
SingleUser(OFF);
Fs->rflags=GetRFlags;
@@ -42,19 +45,31 @@ U0 DeathWait(CTask **_task,Bool send_exit=FALSE)
Yield;
}
Bool Kill(CTask *task,Bool wait=TRUE)
Bool Kill(CTask *task,Bool wait=TRUE,Bool just_break=FALSE)
{//Terminate other task.
I64 i;
if (TaskValidate(task) && task!=sys_winmgr_task) {
for (i=0;i<mp_cnt;i++)
if (task==cpu_structs[i].seth_task)
return FALSE;
LBts(&task->task_flags,TASKf_KILL_TASK);
if (wait) {
do Yield;
while (TaskValidate(task) && Bt(&task->task_flags,TASKf_KILL_TASK));
if (TaskValidate(task)) {
if (just_break) {
if (task!=Fs)
Break;
else {//TODO wait
sys_focus_task=task;
LBts(sys_ctrl_alt_flags,CTRL_ALT_C);
return TRUE;
}
} else {
if (task!=sys_winmgr_task) {
for (i=0;i<mp_cnt;i++)
if (task==cpu_structs[i].seth_task)
return FALSE;
LBts(&task->task_flags,TASKf_KILL_TASK);
if (wait) {
do Yield;
while (TaskValidate(task) && Bt(&task->task_flags,TASKf_KILL_TASK));
}
return TRUE;
}
}
return TRUE;
}
return FALSE;
}
@@ -187,7 +202,7 @@ I64 TaskInit(CTask *task,I64 stk_size)
task->next_child_task=task->last_child_task=
(&task->next_child_task)(U8 *)-offset(CTask.next_sibling_task);
SrvCtrlInit(&task->srv_ctrl);
JobCtrlInit(&task->srv_ctrl);
QueInit(&task->next_cc);
QueInit(&task->next_except);
QueInit(&task->next_ctrl);
@@ -228,7 +243,7 @@ CTask *Spawn(U0 (*fp_start_addr)(U8 *data),U8 *data=NULL,U8 *task_name=NULL,
I64 target_cpu=-1, //-1 for current CPU. See $LK,"multi-core",A="FI:::/Demo/MultiCore/LoadTest.HC"$.
CTask *parent=NULL, //NULL means adam
I64 stk_size=0, //0=default
I64 flags=1<<SVCf_ADD_TO_QUE)
I64 flags=1<<JOBf_ADD_TO_QUE)
{//Create task on core running at address.
//Alloc $LK,"CTask",A="MN:CTask"$ structure from code heap so addr will be short.
//Could be alloced off of data heap.
@@ -260,7 +275,7 @@ CTask *Spawn(U0 (*fp_start_addr)(U8 *data),U8 *data=NULL,U8 *task_name=NULL,
task->title_src=TTS_TASK_NAME;
PUSHFD
CLI
if (Bt(&flags,SVCf_ADD_TO_QUE)) {
if (Bt(&flags,JOBf_ADD_TO_QUE)) {
TaskQueInsChild(task);
TaskQueIns(task);
}
@@ -279,7 +294,7 @@ U0 TaskDerivedValsUpdate(CTask *task=NULL,Bool update_z_buf=TRUE)
if (fp_update_ctrls)
(*fp_update_ctrls)(task);
if (update_z_buf && Bt(&task->display_flags,DISPLAYf_SHOW))
LBts(&sys_semas[SYS_SEMA_UPDATE_WIN_Z_BUF],0);
LBts(&sys_semas[SEMA_UPDATE_WIN_Z_BUF],0);
LBtr(&task->task_flags,TASKf_TASK_LOCK);
POPFD
}
@@ -356,7 +371,7 @@ U0 SrvTaskCont()
FlushMsgs;
while (TRUE) {
CLI
if (SrvCmdsHandler(old_flags) && Fs->title_src==TTS_TASK_NAME)
if (JobsHndlr(old_flags) && Fs->title_src==TTS_TASK_NAME)
MemCpy(Fs->task_title,Fs->task_name,TASK_NAME_LEN);
FlushMsgs;
LBts(&Fs->task_flags,TASKf_IDLE);
@@ -392,8 +407,7 @@ U0 SrvCmdLine(I64 dummy=0)
{
no_warn dummy;
Fs->win_inhibit=WIG_USER_TASK_DFT;
if (HashFind("SrvStartUp",adam_task->hash_table,HTT_FUN))
CallExtStr("SrvStartUp");
CallExtStr("SrvStartUp");
SrvTaskCont;
}
@@ -401,8 +415,7 @@ U0 UserCmdLine(I64 dummy=0)
{//A user task ends-up calling this.
no_warn dummy;
Fs->win_inhibit=WIG_USER_TASK_DFT;
if (HashFind("UserStartUp",adam_task->hash_table,HTT_FUN))
CallExtStr("UserStartUp");
CallExtStr("UserStartUp");
if (!LBts(&Fs->display_flags,DISPLAYf_SHOW))
Dbg;
UserTaskCont;
@@ -463,15 +476,15 @@ I64 TaskEnd()
return task->next_task;
}
if (LBtr(&task->display_flags,DISPLAYf_SHOW))
LBts(&sys_semas[SYS_SEMA_UPDATE_WIN_Z_BUF],0);
LBts(&sys_semas[SEMA_UPDATE_WIN_Z_BUF],0);
while (LBts(&task->task_flags,TASKf_TASK_LOCK))
PAUSE
while (LBts(&task->srv_ctrl.flags,SVCRf_LOCKED))
while (LBts(&task->srv_ctrl.flags,JOBCf_LOCKED))
PAUSE
SrvCmdQueDel(&task->srv_ctrl.next_waiting);
SrvCmdQueDel(&task->srv_ctrl.next_done);
JobQueDel(&task->srv_ctrl.next_waiting);
JobQueDel(&task->srv_ctrl.next_done);
if (IsRaw)
VGAFlush;
@@ -500,7 +513,7 @@ I64 TaskEnd()
tmpt =task->next_task; //save to return
TaskQueRem(task);
LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED);
LBtr(&task->srv_ctrl.flags,JOBCf_LOCKED);
LBtr(&task->task_flags,TASKf_TASK_LOCK);
task->wake_jiffy=cnts.jiffies+DYING_JIFFIES;
+2399 -2381
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -50,7 +50,7 @@
#include "SerialDev/MakeSerialDev"
#include "QSort"
#include "KTask"
#include "SrvCmd"
#include "Job"
#include "PCIBIOS"
#include "MultiProc"
#include "EdLite"
+239 -259
View File
@@ -13,7 +13,7 @@ extern class CHashClass;
extern class CHashFun;
extern class CHeapCtrl;
extern class CIntermediateCode;
extern class CSrvCtrl;
extern class CJobCtrl;
extern class CTask;
#define NULL 0
@@ -355,7 +355,6 @@ class CSysLimitBase
#help_index "Memory/Info"
#define MEM_NUM_E820_ENTRIES 48
#define MEM_E820_ENTRY_SIZE 20
class CMemE820
{
U8 *base;
@@ -402,7 +401,7 @@ class CPatchTableAbsAddr
#define IET_IMM_U32 9
#define IET_REL_I64 10
#define IET_IMM_I64 11
#define IEF_IMM_NOT_REL 1
#define IEF_IMM_NOT_REL 1
//reserved
#define IET_REL32_EXPORT 16
#define IET_IMM32_EXPORT 17
@@ -417,7 +416,7 @@ class CPatchTableAbsAddr
#help_index "Boot"
class CKernel
{//Must match $LK,"OSStartUp",A="FF:::/Kernel/KStart16.HC,SYS_BOOT_BASE"$
{//Must match $LK,"OSStartUp",A="FF:::/Kernel/KStart16.HC,MEM_BOOT_BASE"$
CBinFile h;
U32 jmp,
boot_src,
@@ -428,10 +427,12 @@ class CKernel
U0 start;
U32 boot_base;
U16 sys_mem_E801[2];
CMemE820 sys_mem_E820[MEM_NUM_E820_ENTRIES];
U16 mem_E801[2];
CMemE820 mem_E820[MEM_NUM_E820_ENTRIES];
U64 mem_physical_space;
CSysLimitBase sys_gdt_ptr;
U16 sys_pci_busses;
;$$=($$+15)&-16;
CGDT sys_gdt;
};
@@ -440,39 +441,41 @@ class CKernel
#define RLf_VGA 1
#define RLf_32BIT 2
#define RLf_PATCHED 3
#define RLf_64BIT 4
#define RLf_BOOT_HEAP 5
#define RLf_FULL_HEAP 6
#define RLf_RAW 7
#define RLf_INTERRUPTS 8
#define RLf_BLKDEV 9
#define RLf_MP 10
#define RLf_COMPILER 11
#define RLf_DOC 12
#define RLf_WINMGR 13
#define RLf_REGISTRY 14
#define RLf_HOME 15
#define RLf_AUTO_COMPLETE 16
#define RLf_ADAM_SERVER 17
#define RLf_16MEG_SYS_CODE_BP 4
#define RLf_64BIT 5
#define RLf_16MEG_ADAM_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_AUTO_COMPLETE 17
#define RLf_ADAM_SERVER 18
#define RLF_16BIT 0x00001
#define RLF_VGA 0x00002
#define RLF_32BIT 0x00004
#define RLF_PATCHED 0x00008
#define RLF_64BIT 0x00010
#define RLF_BOOT_HEAP 0x00020
#define RLF_FULL_HEAP 0x00040
#define RLF_RAW 0x00080
#define RLF_INTERRUPTS 0x00100
#define RLF_BLKDEV 0x00200
#define RLF_MP 0x00400
#define RLF_COMPILER 0x00800
#define RLF_DOC 0x01000
#define RLF_WINMGR 0x02000
#define RLF_REGISTRY 0x04000
#define RLF_HOME 0x08000
#define RLF_AUTO_COMPLETE 0x10000
#define RLF_ADAM_SERVER 0x20000
#define RLF_16MEG_SYS_CODE_BP 0x00010
#define RLF_64BIT 0x00020
#define RLF_16MEG_ADAM_HEAP_CTRL 0x00040
#define RLF_FULL_HEAPS 0x00050
#define RLF_RAW 0x00100
#define RLF_INTERRUPTS 0x00200
#define RLF_BLKDEV 0x00400
#define RLF_MP 0x00800
#define RLF_COMPILER 0x01000
#define RLF_DOC 0x02000
#define RLF_WINMGR 0x04000
#define RLF_REGISTRY 0x08000
#define RLF_HOME 0x10000
#define RLF_AUTO_COMPLETE 0x20000
#define RLF_ADAM_SERVER 0x40000
#help_index "Processor"
#define LAPIC_BASE 0xFEE00000
@@ -582,62 +585,48 @@ class CRAXRBCRCXRDX
#help_index "Processor"
#define DFT_CACHE_LINE_WIDTH 128
#define SEMA_STRUCT_SIZE DFT_CACHE_LINE_WIDTH
//Semaphores
class CSema
{//I read you're supposed to use one cache line.
//I don't know why. Might be silly.
Bool val;
U8 pad[SEMA_STRUCT_SIZE-sizeof(Bool)];
{
Bool val,pad[DFT_CACHE_LINE_WIDTH-1];
};
#define SYS_SEMA_DEBUG 0
#define SYS_SEMA_RECORD_MACRO 1
#define SYS_SEMA_SYS_TIMER 2
#define SYS_SEMA_SYS_DATE 3
#define SYS_SEMA_DBG_MODE 4
#define SYS_SEMA_SND 5
#define SYS_SEMA_HEAPLOG_ACTIVE 6
#define SYS_SEMA_HEAPLOG_LOCK 7
#define SYS_SEMA_REFRESH_IN_PROGRESS 8
#define SYS_SEMA_FLUSH_VGA_IMAGE 9
#define SYS_SEMA_SINGLE_USER 10
#define SYS_SEMA_DSK_CACHE 11
#define SYS_SEMA_FAR_CALL32 12
#define SYS_SEMA_DEV_MEM 13
#define SYS_SEMA_VGA 14
#define SYS_SEMA_UPDATE_WIN_Z_BUF 15
#define SYS_SEMA_TT 16
#define SYS_SEMA_MUTE 17
#define SYS_SEMA_FORCE_WINMGR 18
#define SYS_SEMA_JUST_PUMP_MSGS 19
#define SYS_SEMA_TMBEAT 20
#define SYS_SEMA_FIX 21
#define NUM_SYS_SEMAS 22
#define SEMA_DEBUG 0
#define SEMA_RECORD_MACRO 1
#define SEMA_SYS_TIMER 2
#define SEMA_SYS_DATE 3
#define SEMA_DBG_MODE 4
#define SEMA_SND 5
#define SEMA_HEAPLOG_ACTIVE 6
#define SEMA_HEAPLOG_LOCK 7
#define SEMA_REFRESH_IN_PROGRESS 8
#define SEMA_FLUSH_VGA_IMAGE 9
#define SEMA_SINGLE_USER 10
#define SEMA_DSK_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_FORCE_WINMGR 18
#define SEMA_JUST_PUMP_MSGS 19
#define SEMA_TMBEAT 20
#define SEMA_FIX 21
#define SEMA_NUM_SEMAS 22
#define SYSf_CTRL_ALT_DEL 0
#define SYSf_CTRL_ALT_C 1
#define SYSf_CTRL_ALT_X 2
#define SYSf_CTRL_ALT_TAB 3
#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
{
//Hash entries are not removed. New entries eclipse old by being
//in front for searches. Old function code is not freed
//because a reference might use it.
{//See $LK,"Hash",A="HI:Hash"$
CHash *next;
U8 *str;
U32 type,use_cnt;
//use_cnt is never decremented. It is incremented
//each time a node is found in a hash search.
//One place it is used is to tell if a externed function was unused
//before being defined. It is also used for popularity measures
//in autocomplete. You can do a $LK,"Who",A="MN:Who"$() to see
//roughly how many times a symbol has been
//referenced. Beware of instances where
//a hash entry is continuously searched for and
//racks-up huge use_cnt numbers.
U32 type,
use_cnt; // inc'ed every time search found, never dec'ed.
};
public class CHashTable
@@ -648,8 +637,7 @@ public class CHashTable
};
#help_index "Hash/System"
//Hash table types
//$LK,"ST_HTT_TYPES",A="FF:::/Kernel/KDefine.HC,ST_HTT_TYPES"$
//Hash table types: $LK,"ST_HTT_TYPES",A="FF:::/Kernel/KDefine.HC,ST_HTT_TYPES"$
#define HTt_EXPORT_SYS_SYM 0
#define HTt_IMPORT_SYS_SYM 1
#define HTt_DEFINE_STR 2
@@ -809,7 +797,7 @@ public class CMemberLst
CArrayDim dim;
U8 *static_data;
union {
I64 static_data_ip;
I64 static_data_rip;
I64 dft_val;
}
CHashFun *fun_ptr;
@@ -818,7 +806,7 @@ public class CMemberLst
class CExternUsage
{
CExternUsage *next;
I64 ip;
I64 rip;
};
#help_index "Hash/System;Compiler/Internal"
@@ -832,7 +820,7 @@ public class CHashDefineStr:CHashSrcSym
#define Cf_INTERNAL_TYPE 1
public class CHashClass:CHashSrcSym
{//See $LK,"PrsClassNew",A="MN:PrsClassNew"$(). base_class of $LK,"CHashFun",A="MN:CHashFun"$
{//See $LK,"PrsClassNew",A="MN:PrsClassNew"$(). base_class of $LK,"CHashFun",A="MN:CHashFun"$
I64 size,neg_offset;
U32 member_cnt;
U8 ptr_stars_cnt,raw_type;
@@ -879,7 +867,7 @@ public class CHashGlblVar:CHashSrcSym
CArrayDim dim;
U8 *data_addr;
union {
I64 data_addr_ip;
I64 data_addr_rip;
CAOTHeapGlbl *heap_glbl;
}
};
@@ -927,7 +915,7 @@ public class CHashGlblVar:CHashSrcSym
#define DOCT_CURSOR_MOVEMENT 26
#define DOCT_ANCHOR 27
#define DOCT_LINK 28
#define DOCT_BUTTON 29
#define DOCT_BTTN 29
#define DOCT_DATA 30
#define DOCT_CHECK_BOX 31
#define DOCT_LST 32
@@ -1121,7 +1109,7 @@ public class CDocBin
U32 num,flags,size,use_cnt;
U0 end;
U8 *data;
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
#define DOC_SCROLL_SPEED 8
@@ -1174,7 +1162,7 @@ public class CDocEntryBase
U32 min_col,max_col;
CDocSettings settings;
I64 user_data;
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
#define DOCE_LEN_DFT 64
@@ -1209,7 +1197,7 @@ public class CDocEntry:CDocEntryBase
U8 raw_type,pad[3];
CDocBin *bin_data;
U8 *data;
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
//$LK,"DocForm",A="MN:DocForm"$() $LK,"DocMenu",A="MN:DocMenu"$() $LK,"DocEd",A="MN:DocEd"$() $LK,"PopUpMenu",A="MN:PopUpMenu"$()
@@ -1393,7 +1381,7 @@ public class CDoc //Linked Text File header
CDocUndo undo_head;
I64 user_data;
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
#help_index "Windows"
@@ -1407,11 +1395,11 @@ 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_IP_L 0x0008
//IP_L_D 0x0010
#define WIF_SELF_IP_R 0x0020
//IP_R_D 0x0040
#define WIF_SELF_IP_WHEEL 0x0080 //Does nothing, yet
#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
@@ -1420,24 +1408,24 @@ tries to do something.
//FOCUS 0x00010000
#define WIF_FOCUS_TASK_MENU 0x00020000
#define WIF_FOCUS_TASK_CTRLS 0x00040000
#define WIF_FOCUS_TASK_IP_L 0x00080000
#define WIF_FOCUS_TASK_IP_L_D 0x00100000
#define WIF_FOCUS_TASK_IP_R 0x00200000
#define WIF_FOCUS_TASK_IP_R_D 0x00400000
#define WIF_FOCUS_TASK_IP_WHEEL 0x00800000 //Does nothing, yet
#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_IP_L_D|WIF_FOCUS_TASK_IP_R_D)
#define WIG_DBL_CLICK (WIF_FOCUS_TASK_MS_L_D|WIF_FOCUS_TASK_MS_R_D)
#define WIG_TASK_DFT (WIF_FOCUS_TASK_MENU|WIG_DBL_CLICK|\
0xFFFF-WIF_SELF_DOC-WIF_SELF_ODE)
#define WIG_USER_TASK_DFT WIF_SELF_KEY_DESC
#define WIf_SELF_FOCUS 0
#define WIf_SELF_CTRLS 2
#define WIf_SELF_IP_L 3
#define WIf_SELF_IP_R 5
#define WIf_SELF_IP_WHEEL 7
#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
@@ -1445,11 +1433,11 @@ tries to do something.
#define WIf_SELF_KEY_DESC 12
#define WIf_FOCUS_TASK_MENU 17
#define WIf_FOCUS_TASK_CTRLS 18
#define WIf_FOCUS_TASK_IP_L 19
#define WIf_FOCUS_TASK_IP_L_D 20
#define WIf_FOCUS_TASK_IP_R 21
#define WIf_FOCUS_TASK_IP_R_D 22
#define WIf_FOCUS_TASK_IP_WHEEL 23
#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
@@ -1586,12 +1574,12 @@ public class CAutoCompleteDictGlbls
#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_R_TO_F64 0x000000001
#define ICF_R_TO_INT 0x000000002
#define ICF_A1_TO_F64 0x000000004
#define ICF_A1_TO_INT 0x000000008
#define ICF_A2_TO_F64 0x000000010
#define ICF_A2_TO_INT 0x000000020
#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
@@ -1601,9 +1589,9 @@ public class CAutoCompleteDictGlbls
#define ICF_SHORT_JMP 0x000001000
#define ICF_PUSH_RES 0x000002000
#define ICF_PASS_TRACE 0x000004000
#define ICF_R_WAS_STK 0x000008000
#define ICF_A1_WAS_STK 0x000010000
#define ICF_A2_WAS_STK 0x000020000
#define ICF_RES_WAS_STK 0x000008000
#define ICF_ARG1_WAS_STK 0x000010000
#define ICF_ARG2_WAS_STK 0x000020000
#define ICF_PUSH_CMP 0x000040000 //for 50<i<j<=100 exps
#define ICF_POP_CMP 0x000080000 //for 50<i<j<=100 exps
#define ICF_SWAP 0x000100000
@@ -1636,8 +1624,8 @@ class CICArg
class CICTreeLinks
{
CHashClass *a1c,*a2c;
CIntermediateCode *a1t,*a2t;
CHashClass *arg1_class,*arg2_class;
CIntermediateCode *arg1_tree,*arg2_tree;
CHashClass *class2;
};
@@ -1656,22 +1644,21 @@ class CIntermediateCode:CIntermediateCodeBase
ic_data,
ic_line;
CHashClass *ic_class,*ic_class2;
CICArg a1,a2,r;
U8 a1_type_pointed_to; //Used for $LK,"IST_ASSIGN",A="MN:IST_ASSIGN"$ and $LK,"IST_DEREF",A="MN:IST_DEREF"$ $LK,"ic_codes",A="MN:intermediate_code_table"$.
CICArg arg1,arg2,res;
U8 arg1_type_pointed_to; //Used for $LK,"IST_ASSIGN",A="MN:IST_ASSIGN"$ and $LK,"IST_DEREF",A="MN:IST_DEREF"$ $LK,"ic_codes",A="MN:intermediate_code_table"$.
union {
U8 ic_body[IC_BODY_SIZE];
//Tree Links are created in OptPass012. An ADD opcode, for example,
//points back to its two earlier addend insts, not MAlloced,
//just pointers to prev CIntermediate codes in the array.
//points back to its two earlier arg CIntermediateCode's.
//Tree links get destroyed during Pass789A when they get overwrites
//by machine code. (Saves room to union the output machine code buffer
//with these links, since they are not needed after pass4.
//Tree links are mostly used during 012 and 3 for determining types.
//Tree links are used during passes 012 and 3 for determining types.
CICTreeLinks t;
};
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
class CPrsStk
@@ -1711,7 +1698,7 @@ class CCodeMisc
I64 st_len; //STR_CONST
I64 num_consts; //FLOAT_CONSTS
I64 range;
I64 ip; //ASM_LABEL
I64 rip; //ASM_LABEL
}
union {
CCodeMisc **jmp_table;
@@ -1856,7 +1843,7 @@ class CAsmUnresolvedRef
CAsmUnresolvedRef *next;
I64 type,line_num;
U8 *machine_code;
I64 ip,rel_ip;
I64 rip,rel_rip;
CAOT *aot;
U8 *str; //Only for import glbls
CAsmUndefHash *asm_undef_hash;
@@ -1957,7 +1944,7 @@ public class CHashOpcode:CHash
class CAOTImportExport
{
CAOTImportExport *next,*last;
I64 ip,flags;
I64 rip,flags;
CAOT *aot;
U8 *str,
*src_link,
@@ -1975,14 +1962,14 @@ class CAOTImportExport
class CAOTAbsAddr
{
CAOTAbsAddr *next;
I64 ip;
I64 rip;
U8 type,pad[7];
};
class CAOTHeapGlblRef
{
CAOTHeapGlblRef *next;
I64 ip;
I64 rip;
};
class CAOTHeapGlbl
@@ -1997,7 +1984,7 @@ class CAOT
{
CAOT *next,*last;
U8 *buf;
I64 ip,ip2,
I64 rip,rip2,
aot_U8s,
max_align_bits,module_org;
CAOT *parent_aot;
@@ -2025,7 +2012,7 @@ class CCodeCtrl
#define __LINE__ #exe{StreamPrint("%d",\
Fs->last_cc->lex_include_stk->line_num);}
#define __CMD_LINE__ #exe{StreamPrint("%d",Fs->last_cc->flags&CCF_CMD_LINE &&\
Fs->last_cc->lex_include_stk->depth<2);}
Fs->last_cc->lex_include_stk->depth<1);}
#define __FILE__ #exe{StreamPrint("\"%s\"",\
Fs->last_cc->lex_include_stk->full_name);}
#define __DIR__ #exe{StreamDir;}
@@ -2048,7 +2035,7 @@ class CLexFile
class CAOTCtrl
{
I64 ip; //Inst ptr
I64 rip; //Inst ptr
CAsmArg arg1,arg2;
CAOTBinBlk *bin;
I64 num_bin_U8s,
@@ -2056,7 +2043,7 @@ class CAOTCtrl
CAsmUnresolvedRef *local_unresolved,*glbl_unresolved;
CAOTAbsAddr *abss;
CAOTHeapGlbl *heap_glbls;
I64 lst_col,lst_last_ip;
I64 lst_col,lst_last_rip;
U8 *last_label,*lst_last_line;
CLexFile *lst_last_lfn;
I64 seg_size;
@@ -2161,7 +2148,7 @@ class CLexHashTableContext
#define CCF_NO_ABSS 0x1000000000
#define CCF_PAREN 0x2000000000
#define CCf_PAREN 37
#define CCF_CLASS_IP 0x4000000000
#define CCF_CLASS_DOL_OFFSET 0x4000000000
#define CCF_DONT_MAKE_RES 0x8000000000
public class CCmpCtrl
@@ -2173,14 +2160,14 @@ public class CCmpCtrl
F64 cur_f64;
U8 *cur_str;
I64 cur_str_len,
class_ip;
class_dol_offset;
U8 *dollar_buf;
I64 dollar_cnt;
U8 *cur_help_idx;
I64 last_U16,
min_line,max_line,last_line_num,
lock_cnt;
U32 *chars_bmp_alpha_numeric;
U32 *char_bmp_alpha_numeric;
CLexHashTableContext htc;
CHashGeneric *hash_entry;
CAbsCntsI64 abs_cnts;
@@ -2207,7 +2194,7 @@ public class CCmpCtrl
CPrsStk *ps;
CAOTCtrl *aotc;
I64 aot_depth,pmt_line;
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
#help_index "Compiler"
@@ -2727,6 +2714,7 @@ public class CDrv
U16 fs_type;
I64 drv_offset,
size,
prt_num,
file_system_info_sect,
fat1,fat2,
root_cluster,
@@ -2833,34 +2821,14 @@ class CMemUsed
#endif
#help_index "Memory/BlkPool"
/*TempleOS does not mess with page tables after setting them up
during boot -- $LK,"SYS_INIT_PAGE_TABLES",A="MN:SYS_INIT_PAGE_TABLES"$.
$LK,"MEM_PAGE_SIZE",A="MN:MEM_PAGE_SIZE"$, the unit size for alloications, is arbitrary,
and is not related to CPU hardware.
All virtual addresses are ident to physical at all times.
text.vga_alias is not identity-mapped, however.
There is no high kernel memory because RAM's physical
addresses are low. (All motherboards that I know of
put RAM in low addresses of 64-bit address space.)
It's ring-0-only so all (or none) is kernel, remember.
2Meg hardware pages are used. Only the caching bits matter.
Remember, it is ring-0-only and identity-mapped!
All code is placed in just the lowest 2Gig, so the CALL REL32
inst always works. It never changes out of ring-0, remember,
so I don't need to waste cycles on use SYSCALL or software interrupts.
Everything just uses CALL REL32.
*/
#help_file "::/Doc/Pags"
#define MBS_USED_SIGNATURE_VAL 'MBUs'
#define MBS_UNUSED_SIGNATURE_VAL 'MBUn'
class CMemBlk
{
CMemBlk *next,*last;
U32 mb_signature,pages;
U32 mb_signature,pags;
};
#define MRT_UNUSED 0
@@ -2875,18 +2843,18 @@ class CMemRange
I64 size;
};
#define MEM_PAGE_BITS 9
#define MEM_PAGE_SIZE (1<<MEM_PAGE_BITS)
#define MEM_PAG_BITS 9
#define MEM_PAG_SIZE (1<<MEM_PAG_BITS)
#define MEM_HEAP_HASH_SIZE 1024
#define MEM_FREE_PAGE_HASH_SIZE 0x100
#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 2 pages, so a request is not rounded-up to next power of two.
#define MEM_EXTRA_HASH2_PAGES 2
//We add 2 pags, so a request is not rounded-up to next power of two.
#define MEM_EXTRA_HASH2_PAGS 2
#define MEM_ADAM_STK (MEM_PAGE_SIZE*512) //Like 16384*MEM_PAGE_SIZE
#define MEM_SETH_STK (MEM_PAGE_SIZE*512)
#define MEM_INTERRUPT_STK (MEM_PAGE_SIZE*512)
#define MEM_DFT_STK (MEM_PAGE_SIZE*512)
#define MEM_ADAM_STK (MEM_PAG_SIZE*512) //Like 16384*MEM_PAG_SIZE
#define MEM_SETH_STK (MEM_PAG_SIZE*512)
#define MEM_INTERRUPT_STK (MEM_PAG_SIZE*512)
#define MEM_DFT_STK (MEM_PAG_SIZE*512)
#define TASK_HASH_TABLE_SIZE (1<<10)
@@ -2897,8 +2865,8 @@ public class CBlkPool
I64 locked_flags,alloced_u8s,used_u8s;
CMemBlk *mem_free_lst,
*mem_free_2meg_lst, //This is for Sup1CodeScraps/Mem/Mem2Meg.HC.
*free_page_hash[MEM_FREE_PAGE_HASH_SIZE],
*free_page_hash2[64-MEM_PAGE_BITS];
*free_pag_hash[MEM_FREE_PAG_HASH_SIZE],
*free_pag_hash2[64-MEM_PAG_BITS];
};
#help_index "Memory/HeapCtrl"
@@ -3017,12 +2985,12 @@ public class CKbdStateGlbls
//BitTest, $LK,"Bt",A="MN:Bt"$(), with an unmerged scan code.
down_bitmap2[8];
Bool rst, //Private: Reset KbdMouse
Bool rst, //Private: Reset KbdMs
irqs_working; //Private
};
#help_index "Input Pointer/Mouse"
public class CMouseStateGlbls
#help_index "Mouse"
public class CMsHardStateGlbls
{
CD3I64 pos, //Position in pixels
prescale;
@@ -3032,35 +3000,29 @@ public class CMouseStateGlbls
install_attempts, //Private
pkt_size; //Private
CFifoU8 *fifo,*fifo2; //Private
Bool buttons[5],
Bool bttns[5],
has_wheel,
has_ext_buttons,
has_ext_bttns,
evt, //Private
installed, //Private
install_in_progress, //Private
irqs_working; //Private
};
#help_index "Input Pointer"
#define IP_NULL 0
#define IP_MOUSE 1
public class CIPStateGlbls
public class CMsStateGlbls
{
I64 dev; //$LK,"IP_NULL",A="MN:IP_NULL"$ or $LK,"IP_MOUSE",A="MN:IP_MOUSE"$
CD3I64 pos, //Position in pixels
pos_text, //Position in text rows,cols
presnap,
offset;
CD3 scale;
I64 throttle, //Throttle is [MIN_I32,MAX_I32]
throttle_step;
F64 speed; //Output: How fast the user is moving it.
I64 timestamp; //Output: GetTSC 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
Bool lb, //Left Bttn
rb, //Right Bttn
show,
has_wheel,
left_dbl, //Private
@@ -3093,8 +3055,8 @@ public class CGridGlbls
#define CTRLF_SHOW 1
#define CTRLF_BORDER 2
#define CTRLF_CAPTURE_LEFT_IP 4
#define CTRLF_CAPTURE_RIGHT_IP 8
#define CTRLF_CAPTURE_LEFT_MS 4
#define CTRLF_CAPTURE_RIGHT_MS 8
#define CTRLF_CLICKED 16
#define WSSf_SET_TO_POS 0
@@ -3143,7 +3105,7 @@ public class CMenuEntry
CMenuEntry *next;
CMenuEntry *sub;
U8 name[32];
I64 msg_code,a1,a2;
I64 msg_code,arg1,arg2;
Bool checked,dir,pad[6];
};
@@ -3167,7 +3129,7 @@ class CBpt
class CExcept
{
CExcept *next,*last;
I64 handler_catch,handler_untry,
I64 hndlr_catch,hndlr_untry,
rsp,rbp,rflags,rsi,rdi,r10,r11,r12,r13,r14,r15;
};
@@ -3176,32 +3138,30 @@ class CFPU
U8 body[512];
};
#help_index "Task/Srv/Exe"
#define SVCf_WAKE_MASTER 0
#define SVCf_FOCUS_MASTER 1
#define SVCf_EXIT_ON_COMPLETE 2
#define SVCf_DONT_FILTER 3
#define SVCf_HIGHEST_PRIORITY 4
#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 SVCf_DONE 5
#define SVCf_DISPATCHED 6
#define SVCf_FREE_ON_COMPLETE 7
#define SVCf_ADD_TO_QUE 8
#define JOBf_DONE 5
#define JOBf_DISPATCHED 6
#define JOBf_FREE_ON_COMPLETE 7
#define JOBf_ADD_TO_QUE 8
#define SVCT_TEXT_INPUT 0 //$LK,"TaskText",A="MN:TaskText"$() Feed StdIn
#define SVCT_MSG 1 //$LK,"TaskMsg",A="MN:TaskMsg"$() Post msg
#define SVCT_EXE_STR 2 //$LK,"TaskExe",A="MN:TaskExe"$() Compile & execute src code text
#define JOBT_TEXT_INPUT 0 //$LK,"TaskText",A="MN:TaskText"$() Feed StdIn
#define JOBT_MSG 1 //$LK,"TaskMsg",A="MN:TaskMsg"$() Post msg
#define JOBT_EXE_STR 2 //$LK,"TaskExe",A="MN:TaskExe"$() Compile & execute src code text
//MP cmds
#define SVCT_CALL 3 //$LK,"JobQue",A="MN:JobQue"$() Tell MP to call function
#define SVCT_SPAWN_TASK 4 //$LK,"Spawn",A="MN:Spawn"$() Tell MP to spawn task
#define JOBT_CALL 3 //$LK,"JobQue",A="MN:JobQue"$() Tell MP to call function
#define JOBT_SPAWN_TASK 4 //$LK,"Spawn",A="MN:Spawn"$() Tell MP to spawn task
class CSrvCmd
class CJob
{
CSrvCmd *next,*last;
CSrvCtrl *ctrl;
I64 cmd_code,flags,
target_cpu,servant_cpu_num,
msg_code;
CJob *next,*last;
CJobCtrl *ctrl;
I64 job_code,flags,msg_code;
I64 (*addr)(U8 *fun_arg);
U8 *fun_arg;
@@ -3214,11 +3174,11 @@ class CSrvCmd
*master_task;
};
#define SVCRf_LOCKED 0
class CSrvCtrl
#define JOBCf_LOCKED 0
class CJobCtrl
{
CSrvCmd *next_waiting,*last_waiting;
CSrvCmd *next_done,*last_done;
CJob *next_waiting,*last_waiting;
CJob *next_done,*last_done;
I64 flags;
};
@@ -3228,21 +3188,21 @@ class CSrvCtrl
#define MSG_CMD 1
#define MSG_KEY_DOWN 2 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press <CTRL-SHIFT-L>
#define MSG_KEY_UP 3 //($LK,"ASCII",A="MN:CH_CTRLA"$,$LK,"scan code",A="FI:::/Doc/CharOverview.DD"$) Press <CTRL-SHIFT-L>
#define MSG_IP_MOVE 4 //(x,y)
#define MSG_IP_L_DOWN 5 //(x,y)
#define MSG_IP_L_UP 6 //(x,y)
#define MSG_IP_L_D_DOWN 7 //(x,y)
#define MSG_IP_L_D_UP 8 //(x,y)
#define MSG_IP_R_DOWN 9 //(x,y)
#define MSG_IP_R_UP 10 //(x,y)
#define MSG_IP_R_D_DOWN 11 //(x,y)
#define MSG_IP_R_D_UP 12 //(x,y)
#define MSG_MS_MOVE 4 //(x,y)
#define MSG_MS_L_DOWN 5 //(x,y)
#define MSG_MS_L_UP 6 //(x,y)
#define MSG_MS_L_D_DOWN 7 //(x,y)
#define MSG_MS_L_D_UP 8 //(x,y)
#define MSG_MS_R_DOWN 9 //(x,y)
#define MSG_MS_R_UP 10 //(x,y)
#define MSG_MS_R_D_DOWN 11 //(x,y)
#define MSG_MS_R_D_UP 12 //(x,y)
#define MSG_KEY_DOWN_UP -2 //Down & UP
#define MSG_IP_L_DOWN_UP -5 //Down & Up
#define MSG_IP_L_D_DOWN_UP -7 //Down & Up
#define MSG_IP_R_DOWN_UP -9 //Down & Up
#define MSG_IP_R_D_DOWN_UP -11 //Down & Up
#define MSG_MS_L_DOWN_UP -5 //Down & Up
#define MSG_MS_L_D_DOWN_UP -7 //Down & Up
#define MSG_MS_R_DOWN_UP -9 //Down & Up
#define MSG_MS_R_D_DOWN_UP -11 //Down & Up
#help_index "Task/Settings"
#define TSF_SAME_SONG 1
@@ -3261,7 +3221,7 @@ public class CTaskSettings
border_attr,border_src,
task_title[STR_LEN];
Bool border,hide_cursor,highlight_cursor,scroll,autocomplete,pad[3];
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
#help_index "Task"
@@ -3305,6 +3265,7 @@ public class CTaskSettings
#define TASK_SIGNATURE_VAL 'TskS'
#define TASK_NAME_LEN 32
#define TASK_EXCEPT_CALLERS 8
class CTaskStk
{
CTaskStk *next_stk;
@@ -3323,7 +3284,7 @@ public class CTask //The Fs segment reg points to current CTask.
{
CTask *addr; //Self-addressed ptr
U32 task_signature,win_inhibit;
U0 pad;#assert $$==offset(CTaskDying.wake_jiffy)
;#assert $$==offset(CTaskDying.wake_jiffy)
I64 wake_jiffy;
U32 task_flags,display_flags;
@@ -3371,8 +3332,7 @@ U0 pad;#assert $$==offset(CTaskDying.wake_jiffy)
CExcept *next_except,*last_except;
I64 except_rbp, //throw routine's RBP
except_ch; //throw(ch)
U8 *except_caller1,*except_caller2,*except_caller3,*except_caller4,
*except_caller5,*except_caller6,*except_caller7,*except_caller8;
U8 *except_callers[TASK_EXCEPT_CALLERS];
Bool catch_except;
Bool new_answer;
@@ -3387,7 +3347,7 @@ U0 pad;#assert $$==offset(CTaskDying.wake_jiffy)
F64 last_ode_time;
CHashTable *hash_table;
CSrvCtrl srv_ctrl;
CJobCtrl srv_ctrl;
CCmpCtrl *next_cc,*last_cc;
CHashFun *last_fun;
@@ -3401,7 +3361,7 @@ U0 pad;#assert $$==offset(CTaskDying.wake_jiffy)
CWinScroll horz_scroll,vert_scroll;
I64 user_data;
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
class CTSS
@@ -3456,28 +3416,22 @@ public class CCPU //The Gs segment reg points to current CCPU.
I64 kill_jiffy;
CTSS *tss;
I64 start_stk[16];
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
#help_index "Memory/Page Tables"
#define MEM_MIN_MEG 512 //512 Meg minimum.
#define MEM_MAPPED_SPACE 0x4000000000 //Arbitrarily set to 256 Gig.
#define MEM_NUM_2MEG (MEM_MAPPED_SPACE>>21)
#define MEM_NUM_USED_1GIG (MEM_MAPPED_SPACE>>(21+9))
#define MEM_NUM_1GIG (0x1000/8)
#define MEM_NUM_512GIG (0x1000/8)
#define SYS_FIXED_AREA 0x100000
#define SYS_FIXED_AREA 0x100000
#define SYS_16MEG_AREA_LIMIT 0x1000000
public class CSysFixedArea
{
U8 pml2[MEM_NUM_2MEG*8],pml3[MEM_NUM_1GIG*8],pml4[MEM_NUM_512GIG*8];
$$=($$+15)&-16;
CFPU init_fpu_mmx;
CCPU boot_cpu;
CTask adam;
CBlkPool adam_bp;
CBlkPool sys_code_bp;
CHeapCtrl adam_hc;
$$=($$+MEM_PAGE_SIZE-1)&-MEM_PAGE_SIZE;
$$=($$+0x1000-1)&-0x1000;
};
#help_index "Char"
@@ -3509,7 +3463,6 @@ public class CSysFixedArea
#define CH_CTRLZ 0x1A
#define CH_CURSOR 0x05
#define CH_BACKSPACE 0x08
#define CH_FORM_FEED 0x0C
#define CH_ESC 0x1B
#define CH_SHIFT_ESC 0x1C
#define CH_SHIFT_SPACE 0x1F
@@ -3528,8 +3481,8 @@ public class CSysFixedArea
#define SCf_NUM 13
#define SCf_SCROLL 14
#define SCf_NEW_KEY 15
#define SCf_IP_L_DOWN 16
#define SCf_IP_R_DOWN 17
#define SCf_MS_L_DOWN 16
#define SCf_MS_R_DOWN 17
#define SCf_DELETE 18
#define SCf_INS 19
#define SCf_NO_SHIFT 30
@@ -3543,8 +3496,8 @@ public class CSysFixedArea
#define SCF_NUM (1<<SCf_NUM)
#define SCF_SCROLL (1<<SCf_SCROLL)
#define SCF_NEW_KEY (1<<SCf_NEW_KEY)
#define SCF_IP_L_DOWN (1<<SCf_IP_L_DOWN)
#define SCF_IP_R_DOWN (1<<SCf_IP_R_DOWN)
#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)
@@ -3552,7 +3505,7 @@ public class CSysFixedArea
//TempleOS places a 1 in bit 7 for
//keys with an E0 prefix.
//See $LK,"::/Doc/CharOverview.DD"$ and $LK,"KbdHandler",A="MN:KbdHandler"$().
//See $LK,"::/Doc/CharOverview.DD"$ and $LK,"KbdHndlr",A="MN:KbdHndlr"$().
#define SC_ESC 0x01
#define SC_BACKSPACE 0x0E
#define SC_TAB 0x0F
@@ -3712,7 +3665,7 @@ public class CDC
//Set by $LK,"DCDepthBufAlloc",A="MN:DCDepthBufAlloc"$()
I32 *depth_buf;
I64 db_z; //private
U0 pad;#assert !($$&7) //(compiler lags one token)
;#assert !($$&7) //(compiler lags one token)
};
#help_index "Devices"
@@ -3824,21 +3777,22 @@ class CKeyDevGlbls
**ctrl_alt_ret_addr; //addr of ret addr on stack in kbd irq
U8 **ctrl_alt_no_shift_descs,**ctrl_alt_shift_descs,
desc[STR_LEN],
*handler;
*hndlr;
};
#help_index "Snd"
#define ONA_REST MIN_I8
class CSndData
{
CSndData *next,*last;
F64 freq, //Hz
time;
F64 time;
I8 ona;
};
public class CSndGlbls
{
F64 freq;
CSndData record_head;
I8 ona;
Bool record;
};
@@ -3873,6 +3827,7 @@ public class CDbgGlbls
*fix_file_line;
CFunSegCache *fun_seg_cache;
I64 fun_seg_cache_index;
Bool panic;
};
#help_index "Boot"
@@ -3888,7 +3843,7 @@ public class CDbgGlbls
#define BOOT_SRC_DVD 4
// $LK,"In",A="MN:In"$("") StdIn for call to $LK,"BootHDIns",A="MN:BootHDIns"$().
#define STD_DISTRO_DVD_CFG "Tb\nScale2Mem(2048,0x40000)\nt \n\n\n\n"
#define STD_DISTRO_DVD_CFG "TB\nScale2Mem(2048,0x40000)\nT \n\n\n\n"
#help_index "Misc/Registry"
//Registry sys_msg_flags. $LK,"RegOneTimePopUp",A="MN:RegOneTimePopUp"$()
@@ -3906,7 +3861,7 @@ public class CDbgGlbls
class CProgress
{
I64 val,max;
F64 t0;
F64 t0,tf;
U8 desc[PROGRESS_DESC_LEN];
};
@@ -3924,4 +3879,29 @@ class CProgress
#define PRTF_NEG_E 0x400
#define PRTF_NEG_AUX_FMT_NUM 0x800
#help_index "Misc/Host"
//Host Operating System
#define OS_OTHER 0
#define OS_NATIVE 1
#define OS_LINUX 2
#define OS_WINDOWS 3
//Virtual Machine
#define VM_OTHER 0
#define VM_NATIVE 1
#define VM_VMWARE 2
#define VM_QEMU 3
#define VM_VIRTUALBOX 4
#help_index "Misc/Install Registration"
public class CInsReg
{
Bool registered;
I64 host_os fmtstr "$$PURPLE$$Install Registration$$FG$$\n\n"
"Host OS:$$LS,D=\"ST_HOST_OSES\"$$\n";
I64 host_vm fmtstr "Host VM:$$LS,D=\"ST_HOST_VMS\"$$\n";
U8 initials[8] fmtstr "$$DA-P,A=\"Your Initials:%s\"$$\n";
I64 machine_num fmtstr
"$$DA-TRM,A=\"This Machine Num (Choose Any):%d\"$$\n";
};
#help_index ""
+14 -7
View File
@@ -34,7 +34,7 @@ public _extern _LBEQU Bool LBEqu(
U8 *bit_field,I64 bit,Bool val); //Locked Set bit equ to val.
#help_index "Boot"
_extern SYS_BOOT_BASE U32 sys_boot_base;
_extern MEM_BOOT_BASE U32 mem_boot_base;
_extern SYS_BOOT_BLK U32 sys_boot_blk;
_extern SYS_BOOT_PATCH_TABLE_BASE U32 sys_boot_patch_table_base;
_extern SYS_BOOT_SRC U32 sys_boot_src;
@@ -176,12 +176,12 @@ public _extern _MEMSET_U32 U32 *MemSetU32(
U32 *dst,I64 val,I64 U32cnt); //Set chunk of U32s to value.
public _extern _MEMSET U8 *MemSetU8(
U8 *dst,I64 val,I64 U8cnt); //Set chunk of U8s to value.
_extern SYS_GIG_PAGES U8 sys_gig_pages;
_extern SYS_HEAP_DBG_FLAG U8 sys_heap_dbg;
_extern SYS_HEAP_INIT_FLAG U8 sys_heap_init_flag;
_extern SYS_HEAP_INIT_VAL U8 sys_heap_init_val;
_extern SYS_MEM_INIT_FLAG U8 sys_mem_init_flag;
_extern SYS_MEM_INIT_VAL U8 sys_mem_init_val;
_extern SYS_STAFF_MODE_FLAG U8 sys_staff_mode_flag;
_extern SYS_VAR_INIT_FLAG U8 sys_var_init_flag;
_extern SYS_VAR_INIT_VAL U8 sys_var_init_val;
@@ -190,8 +190,10 @@ public _extern SYS_CODE_BP CBlkPool *sys_code_bp; //System's BlkPool for code.
public _extern SYS_DATA_BP CBlkPool *sys_data_bp; //System's BlkPool for data.
#help_index "Memory/Info"
_extern SYS_HEAP_BASE U8 *sys_heap_base;
_extern SYS_HEAP_LIMIT U8 *sys_heap_limit;
_extern MEM_HEAP_BASE U8 *mem_heap_base;
_extern MEM_HEAP_LIMIT U8 *mem_heap_limit;
_extern MEM_MAPPED_SPACE U8 *mem_mapped_space;
_extern MEM_PHYSICAL_SPACE U8 *mem_physical_space;
#help_index "Messages;Windows"
public _extern SYS_FOCUS_TASK CTask *sys_focus_task; //Current focus task.
@@ -208,21 +210,25 @@ public _extern SYS_PROGRESS1_DESC
U8 progress1_desc[PROGRESS_DESC_LEN]; //Progress 1 desc.
public _extern SYS_PROGRESS1_MAX I64 progress1_max; //Progress 1 max.
public _extern SYS_PROGRESS1_T0 F64 progress1_t0; //Progress 1 start time.
public _extern SYS_PROGRESS1_TF F64 progress1_tf; //Progress 1 end time.
public _extern SYS_PROGRESS2 I64 progress2; //Current progress 2.
public _extern SYS_PROGRESS2_DESC
U8 progress2_desc[PROGRESS_DESC_LEN]; //Progress 2 desc.
public _extern SYS_PROGRESS2_MAX I64 progress2_max; //Progress 2 max.
public _extern SYS_PROGRESS2_T0 F64 progress2_t0; //Progress 2 start time.
public _extern SYS_PROGRESS2_TF F64 progress2_tf; //Progress 2 end time.
public _extern SYS_PROGRESS3 I64 progress3; //Current progress 3.
public _extern SYS_PROGRESS3_DESC
U8 progress3_desc[PROGRESS_DESC_LEN]; //Progress 3 desc.
public _extern SYS_PROGRESS3_MAX I64 progress3_max; //Progress 3 max.
public _extern SYS_PROGRESS3_T0 F64 progress3_t0; //Progress 3 start time.
public _extern SYS_PROGRESS3_TF F64 progress3_tf; //Progress 3 end time.
public _extern SYS_PROGRESS4 I64 progress4; //Current progress 4.
public _extern SYS_PROGRESS4_DESC
U8 progress4_desc[PROGRESS_DESC_LEN]; //Progress 4 desc.
public _extern SYS_PROGRESS4_MAX I64 progress4_max; //Progress 4 max.
public _extern SYS_PROGRESS4_T0 F64 progress4_t0; //Progress 4 start time.
public _extern SYS_PROGRESS4_TF F64 progress4_tf; //Progress 4 end time.
public _extern SYS_PROGRESSES
CProgress sys_progresses[NUM_PROGRESS_BARS]; //All progress bars.
@@ -232,7 +238,7 @@ public _extern SYS_CPU_STRUCTS CCPU *cpu_structs; //$LK,"Gs",A="MN:Gs"$ points t
public _extern SYS_MP_CNT I64 mp_cnt; //Count of cores
_extern SYS_MP_CNT_INITIAL I64 mp_cnt_initial; //only used during $LK,"Core0StartMP",A="MN:Core0StartMP"$
_extern SYS_MP_CNT_LOCK I64 mp_cnt_lock;
_extern SYS_SEMAS CSema sys_semas[NUM_SYS_SEMAS];
_extern SYS_SEMAS CSema sys_semas[SEMA_NUM_SEMAS];
#help_index "MultiCore;Processor"
public _intern IC_GS CCPU *Gs(); //GS points to current $LK,"CCPU",A="MN:CCPU"$.
@@ -265,16 +271,17 @@ public _extern _XCHG_I64 I64 XchgI64(I64 *dst,I64 d); //eXchange I64s.
public _extern _XCHG_U16 U16 XchgU16(U16 *dst,U16 d); //eXchange U16s.
public _extern _XCHG_U32 U32 XchgU32(U32 *dst,U32 d); //eXchange U32s.
public _extern _XCHG_U8 U8 XchgU8(U8 *dst,U8 d); //eXchange U8s.
public _extern SYS_CACHE_LINE_WIDTH
I64 sys_cache_line_width; //CPU's Cache line width.
_extern SYS_GDT CGDT sys_gdt;
#help_index "Processor/Cache;Memory/Cache"
public _intern IC_CLFLUSH U0 CLFlush(U8 *a); //Flush cache line inst.
public _extern SYS_CACHE_LINE_WIDTH
I64 sys_cache_line_width; //CPU's Cache line width.
#help_index "Processor/Page Tables;Memory/Page Tables"
public _intern IC_INVLPG
U0 InvlPg(U8 *a); //Invalidate page at addr inst.
public _extern MEM_PAGE_SIZE U64 mem_page_size;
#help_index "Task;Processor"
public _intern IC_FS CTask *Fs(); //FS seg reg points to the current $LK,"CTask",A="MN:CTask"$.
+109 -107
View File
@@ -29,16 +29,15 @@ public _extern C32_EFLAGS U32 c32_eflags;
public _extern C32_ESI U32 c32_esi;
#help_index "Char/BitMaps"
public extern U32 chars_bmp_alpha[16],chars_bmp_alpha_numeric[16],
chars_bmp_alpha_numeric_no_at[16], chars_bmp_word[16],
chars_bmp_dec_numeric[16], chars_bmp_hex_numeric[16],
chars_bmp_white_space[16], chars_bmp_non_eol_white_space[16],
chars_bmp_zero_cr_nl_cursor[16], chars_bmp_zero_tab_ff_cr_nl_cursor[16],
chars_bmp_zero_tab_ff_cr_nl_cursor_dollar[16],chars_bmp_getkey[16],
chars_bmp_macro[16], chars_bmp_printable[16],
chars_bmp_displayable[16], chars_bmp_safe_dollar[16],
chars_bmp_filename[16], chars_bmp_non_eol[16];
public extern U32 char_bmp_alpha[16],char_bmp_alpha_numeric[16],
char_bmp_alpha_numeric_no_at[16], char_bmp_word[16],
char_bmp_dec_numeric[16], char_bmp_hex_numeric[16],
char_bmp_white_space[16], char_bmp_non_eol_white_space[16],
char_bmp_zero_cr_nl_cursor[16], char_bmp_zero_tab_cr_nl_cursor[16],
char_bmp_zero_tab_cr_nl_cursor_dollar[16],
char_bmp_macro[16], char_bmp_printable[16],
char_bmp_displayable[16], char_bmp_safe_dollar[16],
char_bmp_filename[16], char_bmp_non_eol[16];
#help_index "Char/Conversion"
public extern U8 *Char2KeyName(I64 ch,Bool include_ctrl=TRUE);
public extern I64 Char2ScanCode(I64 ch,I64 sc_flags=0);
@@ -187,10 +186,10 @@ public extern Bool EdLite(U8 *filename,I64 num=1,I64 edf_dof_flags=0);
extern Bool EdLiteFileLine(U8 *fl_file_line,I64 edf_dof_flags=0);
public extern Bool Fix(I64 edf_dof_flags=0);
public extern U0 FixSet(U8 *filename,I64 line);
public extern U0 G(U8 *ip=INVALID_PTR,CTask *task=NULL);
public extern U0 G2(U8 *ip=INVALID_PTR,CTask *task=NULL);
public extern U0 G(U8 *ms=INVALID_PTR,CTask *task=NULL);
public extern U0 G2(U8 *ms=INVALID_PTR,CTask *task=NULL);
public extern Bool IsDbgMode();
public extern U0 S(U8 *ip=INVALID_PTR,CTask *task=NULL);
public extern U0 S(U8 *ms=INVALID_PTR,CTask *task=NULL);
#help_index "Debugging/Debugger;DolDoc/Cmd Line (Typically);"\
"Cmd Line (Typically);Help System"
@@ -218,15 +217,16 @@ public extern CHash *FunSegFind(U8 *addr,I64 *_offset);
#help_index "Debugging/Raw Output"
public extern Bool IsRaw();
public extern Bool Raw(Bool val);
public extern U0 RawD(I64 ms=100,U8 *addr,I64 cnt=0x80);
public extern U0 RawDm(I64 ms=100,U8 *addr,I64 cnt=0x80);
public extern U0 RawD(I64 mS=100,U8 *addr,I64 cnt=0x80);
public extern U0 RawDm(I64 mS=100,U8 *addr,I64 cnt=0x80);
extern U0 RawDr(CTask *task=NULL);
public extern U0 RawPrint(I64 ms=100,U8 *fmt,...);
public extern U0 RawPrint(I64 mS=100,U8 *fmt,...);
public extern U0 RawPutChar(I64 ch);
public extern U0 VGAFlush();
#help_index "Debugging;Debugging/Debugger"
public extern U0 Dbg(U8 *msg=NULL,I64 msg_num=0);
public extern U0 Panic(U8 *msg=NULL,I64 msg_num=0,Bool panic=TRUE);
#help_index "Define;Char/Define"
#help_file "::/Doc/Define"
@@ -255,12 +255,12 @@ public extern CDoc *sys_clipboard_doc;
extern CDoc *(*fp_doc_put)(CTask *task=NULL);
#help_index "Exceptions"
public extern U0 Break();
public extern Bool BreakLock(CTask *task=NULL);
public extern Bool BreakUnlock(CTask *task=NULL);
public extern U0 PutExcept(Bool catch_it=TRUE);
extern U0 SysTry(U8 *start_label,U8 *skip_label);
extern U0 SysUntry();
public extern U0 ThrowBreak(CTask *task=NULL);
public extern U0 throw(I64 ch=0,Bool no_log=FALSE);
#help_index "File/CD DVD"
@@ -350,6 +350,7 @@ extern U0 FAT32FreeClusters(CDrv *dv,I64 c);
public extern CBlkDev *Let2BlkDev(U8 drv_let=0,Bool except=TRUE);
public extern I64 Let2BlkDevType(U8 drv_let);
public extern CDrv *Let2Drv(U8 drv_let=0,Bool except=TRUE);
public extern U8 Let2Let(U8 drv_let=0);
extern I64 Name2DirCluster(CDrv *dv,U8 *dirname);
extern I64 Name2ParentDirCluster(CDrv *dv,U8 *dirname);
public extern Bool RBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt);
@@ -384,7 +385,8 @@ extern I64 ATAProbe(I64 base0,I64 base1,I64 unit);
extern U0 ATAReadBlks(CBlkDev *bd,U8 *buf, I64 blk, I64 cnt);
extern U0 ATAWriteBlks(CBlkDev *bd,U8 *buf, I64 blk, I64 cnt);
public extern I64 AutoMountIDE();
extern I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free);
extern I64 BlkDevAdd(CBlkDev *bd,I64 prt_num=MIN_I64,
Bool whole_drv,Bool make_free);
extern U0 DskCacheInit(I64 size_in_U8s);
public extern U0 DskCacheInvalidate(CDrv *dv);
public extern CBlkDevGlbls blkdev;
@@ -441,23 +443,6 @@ public extern U0 Help();
#help_index "Info;File/Cmd Line (Typically);Cmd Line (Typically);Install"
public extern U0 DrvRep();
#help_index "Input Pointer"
#help_file "::/Doc/InputPointer"
public extern U0 GridInit();
public extern U0 IPSet(I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,
I64 l=MAX_I64,I64 r=MAX_I64);
public extern CIPStateGlbls ip;
public extern CGridGlbls ip_grid;
extern CIPStateGlbls ip_last;
#help_index "Input Pointer/Displayed Image"
extern U0 IPVarsInit();
extern U0 IPVarsUpdate(I64 x,I64 y,I64 z,Bool l,Bool r);
#help_index "Input Pointer/Mouse"
public extern CMouseStateGlbls mouse;
extern CMouseStateGlbls mouse_last;
#help_index "Install"
#help_file "::/Doc/Install"
extern CATARep *ATARepFind(CATARep *haystack_head,I64 needle_num);
@@ -470,16 +455,61 @@ public extern U0 Fmt(U8 drv_let,Bool quick=TRUE,
#help_index "Install;Memory/BlkPool"
public extern I64 Scale2Mem(I64 min,I64 max,I64 limit=2*1024*1024*1024);
#help_index "Job/Exe;Task/Job/Exe"
public extern U0 AdamErr(U8 *fmt,...);
public extern U0 AdamLog(U8 *fmt,...);
public extern I64 ExeCmdLine(CCmpCtrl *cc);
public extern U0 JobDel(CJob *tmpc);
public extern I64 JobsHndlr(I64 run_flags,CTask *task=NULL);
extern U0 SrvCmdLine();
public extern U0 SrvTaskCont();
public extern CJob *TaskExe(CTask *srv,CTask *master,U8 *data,I64 flags);
public extern U0 TaskRstAwaitingMsg(CTask *task=NULL);
public extern U0 UserTaskCont();
#help_index "Job/Exe;Task/Job/Exe;Compiler"
public extern I64 Adam(U8 *fmt,...);
public extern I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL);
public extern I64 PopUpPrint(U8 *fmt,...);
#help_index "Job/Exe;Task/Job/Exe;MultiCore"
public extern I64 JobResGet(CJob *rqst=NULL);
public extern Bool JobResScan(CJob *rqst=NULL,I64 *_res=NULL);
#help_index "Job/Text & Msgs;Task/Job/Text & Msgs"
public extern CJob *TaskText(CTask *srv,CTask *master,U8 *data,I64 flags);
#help_index "Job/Text & Msgs;Task/Job/Text & Msgs;InFile;StdIn/InFile"
public extern U0 In(U8 *fmt,...);
public extern U0 InFile(U8 *filename);
public extern U0 InStr(U8 *fmt,...);
public extern U0 XTalk(CTask *task,U8 *fmt,...);
public extern U0 XTalkStr(CTask *task,U8 *fmt,...);
public extern U0 XTalkStrWait(CTask *task,U8 *fmt,...);
public extern U0 XTalkWait(CTask *task,U8 *fmt,...);
#help_index "Job/Text & Msgs;Task/Job/Text & Msgs;Messages"
public extern U0 Msg(I64 msg_code,I64 arg1,I64 arg2,I64 flags=0);
public extern U0 PostMsg(CTask *task,
I64 msg_code,I64 arg1,I64 arg2,I64 flags=0);
public extern U0 PostMsgWait(CTask *task,I64 msg_code,
I64 arg1,I64 arg2,I64 flags=0);
public extern CJob *TaskMsg(CTask *srv,CTask *master,
I64 msg_code,I64 arg1,I64 arg2,I64 flags);
#help_index "Job;Task/Job"
#help_file "::/Doc/Job"
#help_index "Keyboard Devices/System;Char/System"
#help_file "::/Doc/KeyDev"
public extern U0 CtrlAltCBSet(U8 ch,U0 (*fp_handler)(I64 sc),
public extern U0 CtrlAltCBSet(U8 ch,U0 (*fp_hndlr)(I64 sc),
U8 *no_shift_desc=NULL,U8 *shift_desc=NULL,Bool in_irq=FALSE);
public extern U0 KeyDescSet(U8 *fmt,...);
public extern CKeyDevEntry *KeyDevAdd(Bool (*fp_put_key)(I64 ch,I64 sc),
Bool (*fp_puts)(U8 *st),I64 priority,Bool key_descs=FALSE);
public extern U0 KeyDevRem(CKeyDevEntry *tmpk);
extern CKeyDevGlbls keydev;
extern CSrvCmd sys_macro_head;
extern CJob sys_macro_head;
extern CTask *sys_macro_task;
#help_index "Keyboard Devices;Char/Input;StdIn"
@@ -492,12 +522,12 @@ public extern I64 GetKey(I64 *_scan_code=NULL,Bool echo=FALSE,
public extern I64 GetS(U8 *buf,I64 size,Bool allow_ext=TRUE);
public extern U8 *GetStr(U8 *msg=NULL,U8 *dft=NULL,I64 flags=0);
extern U0 KbdInit();
public extern I64 KbdMouseEvtTime();
extern U0 KbdMouseHandler(Bool poll_kbd,Bool poll_mouse);
extern U0 KbdMouseVarsInit();
public extern I64 KbdMsEvtTime();
extern U0 KbdMsHndlr(Bool poll_kbd,Bool poll_ms);
extern U0 KbdMsInit();
extern I64 KbdMsgsQue();
public extern U0 KbdTypeMatic(U8 delay);
extern Bool MouseDriverInstall();
extern Bool MsHardDrvrInstall();
public extern I64 PressAKey();
public extern I64 ScanChar();
public extern Bool ScanKey(I64 *_ch=NULL,I64 *_scan_code=NULL,Bool echo=FALSE);
@@ -529,10 +559,10 @@ public extern U8 *AMAlloc(I64 size);
public extern U8 *AMAllocIdent(U8 *src);
#help_index "Memory/BlkPool"
public extern U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pages512);
public extern U0 BlkPoolInit(CBlkPool *bp,I64 pages512);
public extern U8 *Mem512Alloc(I64 pages512,CBlkPool *bp=NULL);
public extern U0 Mem512Free(CMemBlk *m,CBlkPool *bp=NULL);
public extern U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pags);
public extern U0 BlkPoolInit(CBlkPool *bp,I64 pags);
public extern U8 *MemPagAlloc(I64 pags,CBlkPool *bp=NULL);
public extern U0 MemPagFree(CMemBlk *m,CBlkPool *bp=NULL);
#help_index "Memory/Heap"
public extern U8 *CAlloc(I64 size,CTask *mem_task=NULL);
@@ -553,17 +583,15 @@ public extern CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL,
CTask *task=NULL,CBlkPool *bp);
#help_index "Memory/Page Tables"
public extern Bool MemPagePresentMark(U8 *a,Bool val);
public extern I64 MemPageSize(U8 *a);
public extern I64 *MemPageTable(U8 *a);
#help_index "Messages"
#help_file "::/Doc/Msgs"
public extern I64 FlushMsgs(CTask *task=NULL);
public extern I64 GetMsg(I64 *_a1=NULL,I64 *_a2=NULL,
public extern I64 GetMsg(I64 *_arg1=NULL,I64 *_arg2=NULL,
I64 mask=~1,CTask *task=NULL);
extern U0 InputFilterTask();
public extern I64 ScanMsg(I64 *_a1=NULL,I64 *_a2=NULL,
public extern I64 ScanMsg(I64 *_arg1=NULL,I64 *_arg2=NULL,
I64 mask=~1,CTask *task=NULL);
#help_index "Misc"
@@ -577,7 +605,22 @@ public extern U0 QSortI64(I64 *base,I64 num,
public extern F64 sys_os_version;
#help_index "Misc/Progress Bars"
public extern U0 ProgressBarsRst();
public extern U0 ProgressBarsRst(U8 *path=NULL);
#help_index "Mouse"
#help_file "::/Doc/Mouse"
public extern U0 GridInit();
public extern U0 MsSet(I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,
I64 l=MAX_I64,I64 r=MAX_I64);
public extern CMsStateGlbls ms;
public extern CGridGlbls ms_grid;
public extern CMsHardStateGlbls ms_hard;
extern CMsHardStateGlbls ms_hard_last;
extern CMsStateGlbls ms_last;
#help_index "Mouse/Ptr"
extern U0 MsInit();
extern U0 MsUpdate(I64 x,I64 y,I64 z,Bool l,Bool r);
#help_index "MultiCore"
extern U0 Core0StartMP();
@@ -588,15 +631,15 @@ public extern U0 MPNMInt();
extern CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
U8 *task_name=NULL,I64 target_cpu,
CTask *parent=NULL, //NULL means adam
I64 stk_size=0,I64 flags=1<<SVCf_ADD_TO_QUE);
I64 stk_size=0,I64 flags=1<<JOBf_ADD_TO_QUE);
#help_index "MultiCore;Boot"
public extern U0 MPHalt();
#help_index "MultiCore;Task/Srv/Exe"
public extern CSrvCmd *JobQue(I64 (*fp_addr)(U8 *data),U8 *data=NULL,
I64 target_cpu=1,I64 flags=1<<SVCf_FREE_ON_COMPLETE,
I64 cmd_code=SVCT_CALL,U8 *aux_str=NULL,I64 aux1=0,I64 aux2=0);
#help_index "MultiCore;Job/Exe;Task/Job/Exe"
public extern CJob *JobQue(I64 (*fp_addr)(U8 *data),U8 *data=NULL,
I64 target_cpu=1,I64 flags=1<<JOBf_FREE_ON_COMPLETE,
I64 job_code=JOBT_CALL,U8 *aux_str=NULL,I64 aux1=0,I64 aux2=0);
#help_index "PCI"
public extern I64 PCIClassFind(I64 class_code,I64 n);
@@ -618,13 +661,16 @@ public extern I64 ATARep(Bool pmt=TRUE,
#help_index "Processor"
public extern U8 *IntEntryGet(I64 irq);
public extern U8 *IntEntrySet(I64 irq,
U0 (*fp_new_handler)(),I64 type=IDTET_IRQ,I64 dpl=0);
U0 (*fp_new_hndlr)(),I64 type=IDTET_IRQ,I64 dpl=0);
#help_index "Snd"
public extern U0 Beep(I64 freq=500,Bool busy=FALSE);
#help_file "::/Doc/Snd"
public extern U0 Beep(I8 ona=62,Bool busy=FALSE);
public extern I8 Freq2Ona(F64 freq);
public extern Bool IsMute();
public extern Bool Mute(Bool val);
public extern U0 Snd(F64 freq);
public extern F64 Ona2Freq(I64 ona);
public extern U0 Snd(I8 ona=ONA_REST);
public extern U0 SndRst();
public extern CSndGlbls snd;
@@ -639,7 +685,7 @@ public extern I64 BirthWait(CTask **_task,I64 task_num=-1);
public extern U0 DeathWait(CTask **_task,Bool send_exit=FALSE);
public extern U0 Exit();
public extern Bool IsSuspended(CTask *task=NULL);
public extern Bool Kill(CTask *task,Bool wait=TRUE);
public extern Bool Kill(CTask *task,Bool wait=TRUE,Bool just_break=FALSE);
public extern Bool Suspend(CTask *task=NULL,Bool state=TRUE);
_extern _TASK_CONTEXT_RESTORE U0 TaskContextRestore();
_extern _TASK_END_NOW U0 TaskEndNow();
@@ -656,12 +702,12 @@ public extern I64 sys_num_spawned_tasks;
extern CTask *sys_winmgr_task,*sys_task_being_scrn_updated;
#help_index "Task/Delay;Time/CPU Cycles"
public extern U0 BusyWait(I64 æS); //Loosely timed
public extern U0 Busy(I64 æS); //Loosely timed
public extern U0 PortNop(); //On the order of 1uS
extern I64 TimeStampFreqCal();
#help_index "Task/Delay;Time/Jiffies"
public extern U0 Sleep(I64 ms);
public extern U0 Sleep(I64 mS);
public extern U0 SleepUntil(I64 wake_jiffy);
#help_index "Task/Misc"
@@ -670,55 +716,11 @@ public extern U0 TSSBusy(I64 tr,Bool val=OFF);
public extern U0 TaskDerivedValsUpdate(CTask *task=NULL,Bool update_z_buf=TRUE);
public extern U0 WinDerivedValsUpdate(CTask *task);
#help_index "Task/Srv"
#help_file "::/Doc/TaskSrv"
#help_index "Task/Srv/Exe"
public extern U0 AdamErr(U8 *fmt,...);
public extern U0 AdamLog(U8 *fmt,...);
public extern I64 ExeCmdLine(CCmpCtrl *cc);
public extern U0 SrvCmdDel(CSrvCmd *tmpc);
extern U0 SrvCmdLine();
public extern I64 SrvCmdsHandler(I64 run_flags,CTask *task=NULL);
public extern U0 SrvTaskCont();
public extern CSrvCmd *TaskExe(CTask *srv,CTask *master,U8 *data,I64 flags);
public extern U0 TaskRstAwaitingMsg(CTask *task=NULL);
public extern U0 UserTaskCont();
#help_index "Task/Srv/Exe;Compiler"
public extern I64 Adam(U8 *fmt,...);
public extern I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL);
public extern I64 PopUpPrint(U8 *fmt,...);
#help_index "Task/Srv/Exe;MultiCore"
public extern I64 JobResGet(CSrvCmd *rqst=NULL);
public extern Bool JobResScan(CSrvCmd *rqst=NULL,I64 *_res=NULL);
#help_index "Task/Srv/Text & Msgs"
public extern CSrvCmd *TaskText(CTask *srv,CTask *master,U8 *data,I64 flags);
#help_index "Task/Srv/Text & Msgs;InFile;StdIn/InFile"
public extern U0 In(U8 *fmt,...);
public extern U0 InFile(U8 *filename);
public extern U0 InStr(U8 *fmt,...);
public extern U0 XTalk(CTask *task,U8 *fmt,...);
public extern U0 XTalkStr(CTask *task,U8 *fmt,...);
public extern U0 XTalkStrWait(CTask *task,U8 *fmt,...);
public extern U0 XTalkWait(CTask *task,U8 *fmt,...);
#help_index "Task/Srv/Text & Msgs;Messages"
public extern U0 Msg(I64 msg_code,I64 a1,I64 a2,I64 flags=0);
public extern U0 PostMsg(CTask *task,I64 msg_code,I64 a1,I64 a2,I64 flags=0);
public extern U0 PostMsgWait(CTask *task,I64 msg_code,
I64 a1,I64 a2,I64 flags=0);
public extern CSrvCmd *TaskMsg(CTask *srv,CTask *master,
I64 msg_code,I64 a1,I64 a2,I64 flags);
#help_index "Task;Task/Srv/Exe;MultiCore"
#help_index "Task;Job/Exe;Task/Job/Exe;MultiCore"
public extern CTask *Spawn(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
U8 *task_name=NULL,I64 target_cpu=-1, //-1 means current CPU
CTask *parent=NULL, //NULL means adam
I64 stk_size=0,I64 flags=1<<SVCf_ADD_TO_QUE);
I64 stk_size=0,I64 flags=1<<JOBf_ADD_TO_QUE);
#help_index "Time/CPU Cycles;Time/HPET;Time/Jiffies"
public extern CCntsGlbls cnts;
+8 -8
View File
@@ -54,10 +54,10 @@ U0 PutS(U8 *st)
}
U0 KeyDescSet(U8 *fmt,...)
{//Call this from key handler to report desc in $LK,"KeyMap",A="MN:KeyMap"$().
{//Call this from key hndlr to report desc in $LK,"KeyMap",A="MN:KeyMap"$().
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
StrCpy(keydev.desc,buf);
keydev.handler=Caller;
keydev.hndlr=Caller;
Free(buf);
}
@@ -127,12 +127,12 @@ Bool KDInputFilterPutS(U8 *st)
U0 CtrlAltDel(I64)
{
LBts(sys_ctrl_alt_flags,SYSf_CTRL_ALT_DEL);
LBts(sys_ctrl_alt_flags,CTRL_ALT_DEL);
}
U0 CtrlAltC(I64)
{
LBts(sys_ctrl_alt_flags,SYSf_CTRL_ALT_C);
LBts(sys_ctrl_alt_flags,CTRL_ALT_C);
}
U0 CtrlAltD(I64)
@@ -157,7 +157,7 @@ U0 CtrlAltM(I64)
U0 CtrlAltN(I64)
{
LBts(sys_ctrl_alt_flags,SYSf_CTRL_ALT_TAB);
LBts(sys_ctrl_alt_flags,CTRL_ALT_TAB);
}
U0 CtrlAltT(I64)
@@ -172,15 +172,15 @@ U0 CtrlAltV(I64)
U0 CtrlAltX(I64)
{
LBts(sys_ctrl_alt_flags,SYSf_CTRL_ALT_X);
LBts(sys_ctrl_alt_flags,CTRL_ALT_X);
}
U0 CtrlAltCBSet(U8 ch,U0 (*fp_handler)(I64 sc),
U0 CtrlAltCBSet(U8 ch,U0 (*fp_hndlr)(I64 sc),
U8 *no_shift_desc=NULL,U8 *shift_desc=NULL,Bool in_irq=FALSE)
{//Set callback for <CTRL-ALT-letter>.
ch=ToUpper(ch)-'A';
if (ch<26) {
keydev.fp_ctrl_alt_cbs[ch]=fp_handler;
keydev.fp_ctrl_alt_cbs[ch]=fp_hndlr;
Free(keydev.ctrl_alt_no_shift_descs[ch]);
if (no_shift_desc)
+15 -14
View File
@@ -1,35 +1,35 @@
U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pages512)
U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pags)
{//Add mem to BlkPool.
if (sys_mem_init_flag)
MemSet(m,sys_mem_init_val,pages512*512);
MemSet(m,sys_mem_init_val,pags*MEM_PAG_SIZE);
PUSHFD
CLI
while (LBts(&bp->locked_flags,BPlf_LOCKED))
PAUSE
m->next=bp->mem_free_lst;
m->pages=pages512;
m->pags=pags;
m->mb_signature=MBS_UNUSED_SIGNATURE_VAL;
bp->alloced_u8s+=pages512<<MEM_PAGE_BITS;
bp->alloced_u8s+=pags<<MEM_PAG_BITS;
bp->mem_free_lst=m;
LBtr(&bp->locked_flags,BPlf_LOCKED);
POPFD
}
U0 BlkPoolInit(CBlkPool *bp,I64 pages512)
U0 BlkPoolInit(CBlkPool *bp,I64 pags)
{//Make mem chunk into a BlkPool.
I64 num;
CMemBlk *m;
MemSet(bp,0,sizeof(CBlkPool));
m=(bp(U8 *)+sizeof(CBlkPool)+MEM_PAGE_SIZE-1)&~(MEM_PAGE_SIZE-1);
num=(bp(U8 *)+pages512<<MEM_PAGE_BITS-m(U8 *))>>MEM_PAGE_BITS;
bp->alloced_u8s=(pages512-num)<<MEM_PAGE_BITS; //Compensate before num added.
m=(bp(U8 *)+sizeof(CBlkPool)+MEM_PAG_SIZE-1)&~(MEM_PAG_SIZE-1);
num=(bp(U8 *)+pags<<MEM_PAG_BITS-m(U8 *))>>MEM_PAG_BITS;
bp->alloced_u8s=(pags-num)<<MEM_PAG_BITS; //Compensate before num added.
BlkPoolAdd(bp,m,num);
}
U0 BlkPoolsInit()
{
I64 i,total,lo,hi,code_heap_limit;
CMemE820 *m20=SYS_MEM_E820;
CMemE820 *m20=MEM_E820;
Bool first=TRUE;
total=BIOSTotalMem;
@@ -41,9 +41,9 @@ U0 BlkPoolsInit()
else
code_heap_limit=0x80000000;
i=code_heap_limit-0x1000000;
BlkPoolAdd(sys_code_bp,0x1000000,i>>MEM_PAGE_BITS);
sys_heap_limit=i+0x1000000-1;
i=code_heap_limit-SYS_16MEG_AREA_LIMIT; //See $LK,"RLf_16MEG_SYS_CODE_BP",A="FF:::/Kernel/Mem/PageTables.HC,RLf_16MEG_SYS_CODE_BP"$
BlkPoolAdd(sys_code_bp,SYS_16MEG_AREA_LIMIT,i>>MEM_PAG_BITS);
mem_heap_limit=i+SYS_16MEG_AREA_LIMIT-1;
if (code_heap_limit<total) {
while (m20->type) {
@@ -58,15 +58,16 @@ U0 BlkPoolsInit()
}
if (code_heap_limit<=lo<hi) {
if (first) {
BlkPoolInit(lo,(hi-lo)>>MEM_PAGE_BITS);
BlkPoolInit(lo,(hi-lo)>>MEM_PAG_BITS);
sys_data_bp=lo;
Fs->data_heap=HeapCtrlInit(,Fs,sys_data_bp);
first=FALSE;
} else
BlkPoolAdd(sys_data_bp,lo,(hi-lo)>>MEM_PAGE_BITS);
BlkPoolAdd(sys_data_bp,lo,(hi-lo)>>MEM_PAG_BITS);
}
}
m20++;
}
}
LBts(&sys_run_level,RLf_FULL_HEAPS);
}
+1 -1
View File
@@ -23,7 +23,7 @@ U0 HeapCtrlDel(CHeapCtrl *hc)
m=hc->next_mem_blk;
while (m!=&hc->next_mem_blk) {
m1=m->next;
Mem512TaskFree(m,hc);
MemPagTaskFree(m,hc);
m=m1;
}
LBtr(&hc->locked_flags,HClf_LOCKED);
+18 -18
View File
@@ -51,20 +51,20 @@ _MALLOC::
JMP I32 MALLOC_ALMOST_DONE
//Big allocation
@@30: ADD RAX,sizeof(CMemBlk)+MEM_PAGE_SIZE-1
SHR RAX,MEM_PAGE_BITS
@@30: ADD RAX,sizeof(CMemBlk)+MEM_PAG_SIZE-1
SHR RAX,MEM_PAG_BITS
PUSH RDX //preserve HeapCtrl
PUSH RDX
PUSH RAX
CALL &Mem512TaskAlloc
CALL &MemPagTaskAlloc
POP RDX
TEST RAX,RAX
JZ @@45 //Out of memory
MOV RSI,RAX
MOV EAX,U32 CMemBlk.pages[RSI]
MOV EAX,U32 CMemBlk.pags[RSI]
SHL RAX,MEM_PAGE_BITS
SHL RAX,MEM_PAG_BITS
SUB RAX,sizeof(CMemBlk)
ADD RSI,sizeof(CMemBlk)
JMP I32 MALLOC_ALMOST_DONE
@@ -77,13 +77,13 @@ _MALLOC::
TEST RSI,RSI
JNZ I32 @@60
PUSH RAX //-**** save byte size
ADD RAX,16*MEM_PAGE_SIZE-1
SHR RAX,MEM_PAGE_BITS
ADD RAX,16*MEM_PAG_SIZE-1
SHR RAX,MEM_PAG_BITS
PUSH RDX //preserve HeapCtrl
PUSH RDX
PUSH RAX
CALL &Mem512TaskAlloc
CALL &MemPagTaskAlloc
POP RDX
TEST RAX,RAX
JNZ @@50
@@ -99,8 +99,8 @@ _MALLOC::
JMP I32 MALLOC_FINAL_EXIT //Never gets here, hopefully.
@@50: MOV RSI,RAX
MOV EAX,U32 CMemBlk.pages[RSI]
SHL RAX,MEM_PAGE_BITS
MOV EAX,U32 CMemBlk.pags[RSI]
SHL RAX,MEM_PAG_BITS
//Can it be combined with last chunk? (Never Free these chunks.)
MOV RDI,U64 CHeapCtrl.last_mergable[RDX]
@@ -109,8 +109,8 @@ _MALLOC::
JNE @@55
PUSH RAX
MOV EAX,U32 CMemBlk.pages[RDI]
ADD U32 CMemBlk.pages[RSI],EAX
MOV EAX,U32 CMemBlk.pags[RDI]
ADD U32 CMemBlk.pags[RSI],EAX
//QueRem
MOV RAX,U64 CMemBlk.next[RDI]
MOV RBX,U64 CMemBlk.last[RDI]
@@ -161,7 +161,7 @@ MALLOC_ALMOST_DONE:
//Caller1/Caller2
PUSH RDX
MOV RDX,U64 [SYS_HEAP_LIMIT]
MOV RDX,U64 [MEM_HEAP_LIMIT]
MOV RDI,U64 SF_RIP[RBP]
CMP RDI,RDX
JB @@80
@@ -190,7 +190,7 @@ MALLOC_ALMOST_DONE:
MOV U64 CMemUsed.hc[RSI],RDX
LEA RAX,U64 CMemUsed.start[RSI]
TEST U8 [SYS_SEMAS+SYS_SEMA_HEAPLOG_ACTIVE*SEMA_STRUCT_SIZE],1
TEST U8 [SYS_SEMAS+SEMA_HEAPLOG_ACTIVE*DFT_CACHE_LINE_WIDTH],1
JZ @@105
PUSH RAX
PUSH RAX
@@ -221,13 +221,13 @@ MALLOC_FINAL_EXIT:
RET1 16
//************************************
_FREE::
//Be aware of $LK,"heap_hash",A="FF:::/Kernel/Mem/MAllocFree.HC,heap_hash"$ in $LK,"Mem512TaskAlloc",A="MN:Mem512TaskAlloc"$().
//Be aware of $LK,"heap_hash",A="FF:::/Kernel/Mem/MAllocFree.HC,heap_hash"$ in $LK,"MemPagTaskAlloc",A="MN:MemPagTaskAlloc"$().
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
TEST U8 [SYS_SEMAS+SYS_SEMA_HEAPLOG_ACTIVE*SEMA_STRUCT_SIZE],1
TEST U8 [SYS_SEMAS+SEMA_HEAPLOG_ACTIVE*DFT_CACHE_LINE_WIDTH],1
JZ @@15
MOV RBX,U64 SF_ARG1[RBP]
TEST RBX,RBX
@@ -285,7 +285,7 @@ _FREE::
MOV U64 CMemUsed.next[RDI],RDX
//Caller1/Caller2
MOV RDX,U64 [SYS_HEAP_LIMIT]
MOV RDX,U64 [MEM_HEAP_LIMIT]
MOV RDI,U64 SF_RIP[RBP]
CMP RDI,RDX
JB @@35
@@ -321,7 +321,7 @@ _FREE::
PUSH RDX
PUSH RDX
PUSH RSI
CALL &Mem512TaskFree
CALL &MemPagTaskFree
POP RDX
@@55: LOCK
+1 -1
View File
@@ -1,6 +1,6 @@
#exe {Cd(__DIR__);};
#include "PageTables"
#include "Mem512"
#include "MemPag"
#include "BlkPool"
#include "MAllocFree"
#include "HeapCtrl"
+45 -46
View File
@@ -1,18 +1,17 @@
U0 SysBadFree(I64 *ptr)
{
Dbg("Bad Free:",ptr);
Panic("Bad Free:",ptr);
}
U0 SysBadMAlloc(I64 *ptr)
{
Dbg("Bad MAlloc:",ptr);
Panic("Bad MAlloc:",ptr);
}
U8 *Mem512Alloc(I64 pages512,CBlkPool *bp=NULL)
{/*Alloc 512Byte pages from BlkPool. Don't link to task.
U8 *MemPagAlloc(I64 pags,CBlkPool *bp=NULL)
{/*Alloc pags from BlkPool. Don't link to task.
(Linking to a task means they will be freed when the task dies.)
It might give you more than you asked for
so a ptr to a page count is passed.
It might give you more than you asked for.
Return: NULL if out of memory.
*/
@@ -23,23 +22,23 @@ Return: NULL if out of memory.
CLI
while (LBts(&bp->locked_flags,BPlf_LOCKED))
PAUSE
if (pages512<MEM_FREE_PAGE_HASH_SIZE) {
if (res=bp->free_page_hash[pages512]) {
bp->free_page_hash[pages512]=res->next;
if (pags<MEM_FREE_PAG_HASH_SIZE) {
if (res=bp->free_pag_hash[pags]) {
bp->free_pag_hash[pags]=res->next;
goto at_done;
}
i=Bsr(MEM_FREE_PAGE_HASH_SIZE)+1;
i=Bsr(MEM_FREE_PAG_HASH_SIZE)+1;
} else {
//We'll now round-up to a power of two.
//There is some overhead on allocations and
//we wouldn't want to round to the next
//power of two if a power of two was requested.
//So we use a little more than a power of two.
pages512-=MEM_EXTRA_HASH2_PAGES;
i=Bsr(pages512)+1;
pages512=1<<i+MEM_EXTRA_HASH2_PAGES;
if (res=bp->free_page_hash2[i]) {
bp->free_page_hash2[i]=res->next;
pags-=MEM_EXTRA_HASH2_PAGS;
i=Bsr(pags)+1;
pags=1<<i+MEM_EXTRA_HASH2_PAGS;
if (res=bp->free_pag_hash2[i]) {
bp->free_pag_hash2[i]=res->next;
goto at_done;
}
}
@@ -49,84 +48,84 @@ Return: NULL if out of memory.
//We're probably out of luck, but lets search for a
//freed larger size block... and, screw-it, return the whole thing.
do {
if (res=bp->free_page_hash2[++i]) {
pages512=1<<i+MEM_EXTRA_HASH2_PAGES;
bp->free_page_hash2[i]=res->next;
if (res=bp->free_pag_hash2[++i]) {
pags=1<<i+MEM_EXTRA_HASH2_PAGS;
bp->free_pag_hash2[i]=res->next;
goto at_done;
}
} while (i<64-MEM_PAGE_BITS-1);
pages512=0;
} while (i<64-MEM_PAG_BITS-1);
pags=0;
res=NULL; //Out of memory
goto at_done2;
}
if (res->pages<pages512)
if (res->pags<pags)
m=res;
else {
if (res->pages==pages512) {
if (res->pags==pags) {
m->next=res->next;
goto at_done;
} else {
res->pages-=pages512;
res(U8 *)+=res->pages<<MEM_PAGE_BITS;
res->pages=pages512;
res->pags-=pags;
res(U8 *)+=res->pags<<MEM_PAG_BITS;
res->pags=pags;
goto at_done;
}
}
}
at_done:
bp->used_u8s+=res->pages<<MEM_PAGE_BITS;
bp->used_u8s+=res->pags<<MEM_PAG_BITS;
at_done2:
LBtr(&bp->locked_flags,BPlf_LOCKED);
POPFD
return res;
}
U0 Mem512Free(CMemBlk *m,CBlkPool *bp=NULL)
{//Return non-task 512Byte pages to BlkPool.
I64 i,pages512;
U0 MemPagFree(CMemBlk *m,CBlkPool *bp=NULL)
{//Return non-task pags to BlkPool.
I64 i,pags;
if (m) {
if (!bp) bp=sys_code_bp;
PUSHFD
CLI
while (LBts(&bp->locked_flags,BPlf_LOCKED))
PAUSE
pages512=m->pages;
pags=m->pags;
m->mb_signature=MBS_UNUSED_SIGNATURE_VAL;
bp->used_u8s-=pages512<<MEM_PAGE_BITS;
if (pages512<MEM_FREE_PAGE_HASH_SIZE) {
m->next=bp->free_page_hash[pages512];
bp->free_page_hash[pages512]=m;
bp->used_u8s-=pags<<MEM_PAG_BITS;
if (pags<MEM_FREE_PAG_HASH_SIZE) {
m->next=bp->free_pag_hash[pags];
bp->free_pag_hash[pags]=m;
} else {
//We'll now round-up to a power of two.
//There is some overhead on allocations and
//we wouldn't want to round to the next
//power of two if a power of two was requested.
//So we use a little more than a power of two.
pages512-=MEM_EXTRA_HASH2_PAGES;
i=Bsr(pages512);
m->next=bp->free_page_hash2[i];
bp->free_page_hash2[i]=m;
pags-=MEM_EXTRA_HASH2_PAGS;
i=Bsr(pags);
m->next=bp->free_pag_hash2[i];
bp->free_pag_hash2[i]=m;
}
LBtr(&bp->locked_flags,BPlf_LOCKED);
POPFD
}
}
CMemBlk *Mem512TaskAlloc(I64 pages512,CHeapCtrl *hc)
{/*hc must be locked. Interrupts should probably be off
CMemBlk *MemPagTaskAlloc(I64 pags,CHeapCtrl *hc)
{/*hc must be locked. Don't preempt this routine.
Currently, this is only called from $LK,"MAlloc",A="MN:MAlloc"$().
Return: NULL if out of memory.
*/
CMemBlk *res;
I64 threshold,cnt,size;
CMemUnused *uum,**_uum,**_ptr;
if (res=Mem512Alloc(pages512,hc->bp)) {
if (res=MemPagAlloc(pags,hc->bp)) {
QueIns(res,hc->last_mem_blk);
res->mb_signature=MBS_USED_SIGNATURE_VAL;
hc->alloced_u8s+=res->pages<<MEM_PAGE_BITS;
hc->alloced_u8s+=res->pags<<MEM_PAG_BITS;
//Tidy-up free lst (Move into heap hash)
//because if free lst gets long, delay causes crash
//because if free lst gets long, delay causes crash.
threshold=MEM_HEAP_HASH_SIZE>>4;
#assert MEM_HEAP_HASH_SIZE>>4>=sizeof(U8 *)
do {
@@ -151,7 +150,7 @@ Return: NULL if out of memory.
return res;
}
U0 Mem512TaskFree(CMemBlk *m,CHeapCtrl *hc)
U0 MemPagTaskFree(CMemBlk *m,CHeapCtrl *hc)
{//hc must be locked
if (m) {
PUSHFD
@@ -160,8 +159,8 @@ U0 Mem512TaskFree(CMemBlk *m,CHeapCtrl *hc)
SysBadFree(m);
else {
QueRem(m);
hc->alloced_u8s-=m->pages<<MEM_PAGE_BITS;
Mem512Free(m,hc->bp);
hc->alloced_u8s-=m->pags<<MEM_PAG_BITS;
MemPagFree(m,hc->bp);
}
POPFD
}
+16 -39
View File
@@ -30,7 +30,7 @@ Bool Mem32DevIns(CMemRange *tmpmr)
U0 Mem32DevInit()
{
CMemRange *tmpmr;
CMemE820 *m20=SYS_MEM_E820;
CMemE820 *m20=MEM_E820;
QueInit(&dev.mem32_head);
tmpmr=AMAlloc(sizeof(CMemRange));
@@ -55,36 +55,13 @@ U0 Mem32DevInit()
}
}
U0 MemPagesNotPresentMark()
{
U8 *a,*max_physical=NULL;
U16 *m01=SYS_MEM_E801;
CMemE820 *m20=SYS_MEM_E820;
while (m20->type) {
a=m20->base+m20->len;
if (a>max_physical)
max_physical=a;
m20++;
}
if (max_physical>=0x1000000+m01[1]<<16) {
if (sys_gig_pages)
a=(max_physical+0x3FFFFFFF)&~0x3FFFFFFF;
else
a=(max_physical+0x1FFFFF)&~0x1FFFFF;
while (a<MEM_MAPPED_SPACE) {
MemPagePresentMark(a,FALSE);
a+=MemPageSize(a);
}
}
}
U8 *Mem32DevAlloc(I64 size,I64 alignment)
{//Alloc 32-bit addr space for device. (Doesn't work.) Not used.
//For this to work the BIOS E820 map must be searched for gaps in
//the 32-bit range and the pool initialized to the gaps.
U8 *base,*limit;
CMemRange *tmpmr,*tmpmr1;
while (LBts(&sys_semas[SYS_SEMA_DEV_MEM],0))
while (LBts(&sys_semas[SEMA_DEV_MEM],0))
Yield;
tmpmr1=dev.mem32_head.next;
while (tmpmr1!=&dev.mem32_head) {
@@ -99,15 +76,15 @@ U8 *Mem32DevAlloc(I64 size,I64 alignment)
tmpmr->size=size;
if (!Mem32DevIns(tmpmr)) {
Free(tmpmr);
LBtr(&sys_semas[SYS_SEMA_DEV_MEM],0);
LBtr(&sys_semas[SEMA_DEV_MEM],0);
return NULL;
}
LBtr(&sys_semas[SYS_SEMA_DEV_MEM],0);
LBtr(&sys_semas[SEMA_DEV_MEM],0);
return tmpmr->base;
}
tmpmr1=tmpmr1->next;
}
LBtr(&sys_semas[SYS_SEMA_DEV_MEM],0);
LBtr(&sys_semas[SEMA_DEV_MEM],0);
return NULL;
}
@@ -115,7 +92,7 @@ U0 Mem32DevFree(U8 *base)
{//Free 32-bit device address space.
CMemRange *tmpmr;
if (!base) return;
while (LBts(&sys_semas[SYS_SEMA_DEV_MEM],0))
while (LBts(&sys_semas[SEMA_DEV_MEM],0))
Yield;
tmpmr=dev.mem32_head.next;
while (tmpmr!=&dev.mem32_head) {
@@ -125,14 +102,14 @@ U0 Mem32DevFree(U8 *base)
}
tmpmr=tmpmr->next;
}
LBtr(&sys_semas[SYS_SEMA_DEV_MEM],0);
LBtr(&sys_semas[SEMA_DEV_MEM],0);
}
U8 *Mem64DevAlloc(I64 *_pages1Gig)
{//Alloc 64-bit addr space for device.
U8 *a;
I64 i=*_pages1Gig,*pte;
while (LBts(&sys_semas[SYS_SEMA_DEV_MEM],0))
while (LBts(&sys_semas[SEMA_DEV_MEM],0))
Yield;
while (i--) {
a=dev.mem64_ptr-=1<<30;
@@ -140,22 +117,22 @@ U8 *Mem64DevAlloc(I64 *_pages1Gig)
pte=MemPageTable(a);
*pte=*pte&~0x18 |0x11; //Uncached and present
InvlPg(dev.mem64_ptr);
a+=MemPageSize(a);
a+=mem_page_size;
} while (a-dev.mem64_ptr<1<<30);
}
LBtr(&sys_semas[SYS_SEMA_DEV_MEM],0);
LBtr(&sys_semas[SEMA_DEV_MEM],0);
return dev.mem64_ptr;
}
U0 Mem64DevFree(U8 *base,I64 pages1Gig)
{//Free 64-bit device address space.
if (!base) return;
while (LBts(&sys_semas[SYS_SEMA_DEV_MEM],0))
while (LBts(&sys_semas[SEMA_DEV_MEM],0))
Yield;
if (base==dev.mem64_ptr)
dev.mem64_ptr+=pages1Gig*1<<30;
//else not freed
LBtr(&sys_semas[SYS_SEMA_DEV_MEM],0);
LBtr(&sys_semas[SEMA_DEV_MEM],0);
}
U0 UncachedAliasAlloc() //Make uncached alias for 4 lowest Gig.
@@ -167,15 +144,15 @@ U0 UncachedAliasAlloc() //Make uncached alias for 4 lowest Gig.
pte=MemPageTable(a);
*pte=0x197+a-dev.uncached_alias;
InvlPg(a);
a+=MemPageSize(a);
a+=mem_page_size;
} while (a-dev.uncached_alias<1<<32);
}
I64 BIOSTotalMem()
{
I64 r01,r20;
U16 *m01=SYS_MEM_E801;
CMemE820 *m20=SYS_MEM_E820;
U16 *m01=MEM_E801;
CMemE820 *m20=MEM_E820;
r01=0x100000+m01[0]<<10+m01[1]<<16;
r20=0;
@@ -201,4 +178,4 @@ I64 Scale2Mem(I64 min,I64 max,I64 limit=2*1024*1024*1024)
return max;
else
return min+(max-min)*i/limit;
}
}
+138 -87
View File
@@ -3,152 +3,203 @@ asm {
USE32
SYS_INIT_PAGE_TABLES::
//Set page tables to identity map everything.
//Check 1Gig page capability and set page size.
MOV EAX,0x80000001
CPUID
MOV EAX,1<<21
BT EDX,26
JNC @@05
MOV EAX,1<<30
@@05: MOV U32 [MEM_PAGE_SIZE],EAX
//Set mapped space limit
MOV EAX,[MEM_PHYSICAL_SPACE]
MOV EDX,[MEM_PHYSICAL_SPACE+4]
BT U32 [MEM_PAGE_SIZE],30 //Round-up to 1Gig boundary?
JNC @@10
ADD EAX,0x3FFFFFFF
ADC EDX,0
AND EAX,~0x3FFFFFFF
@@10: INC EDX //Need 4Gig extra for uncached alias up at top of space.
MOV [MEM_MAPPED_SPACE],EAX
MOV [MEM_MAPPED_SPACE+4],EDX
//How many 2Meg pages?
MOV CL,21
ADD EAX,0x1FFFFF
ADC EDX,0
SHRD EAX,EDX
SHR EDX,CL
MOV [MEM_NUM_2MEG],EAX
MOV [MEM_NUM_2MEG+4],EDX
//How many 1Gig pages?
MOV CL,9
ADD EAX,0x1FF
ADC EDX,0
SHRD EAX,EDX
SHR EDX,CL
MOV [MEM_NUM_1GIG],EAX
MOV [MEM_NUM_1GIG+4],EDX
//How many 512Gig pages?
MOV CL,9
ADD EAX,0x1FF
ADC EDX,0
SHRD EAX,EDX
SHR EDX,CL
MOV [MEM_NUM_512GIG],EAX
MOV [MEM_NUM_512GIG+4],EDX
//Set $LK,"CSysFixedArea",A="MN:CSysFixedArea"$ to zero
MOV EDI,SYS_FIXED_AREA
XOR EAX,EAX
MOV ECX,sizeof(CSysFixedArea)/4
REP_STOSD //Init entire SYS_FIXED_AREA to zero
REP_STOSD
MOV EAX,0x80000001
CPUID
BT EDX,26
MOV U32 [MEM_PML2],EDI
//Check for 1Gig page capability.
BT U32 [MEM_PAGE_SIZE],30
JC @@15
//Find PML2 Size
MOV EAX,U32 [MEM_NUM_2MEG]
ADD EAX,0x1FF
AND EAX,~0x1FF
SHL EAX,3
ADD EDI,EAX
MOV U8 [SYS_GIG_PAGES],FALSE
//PML2: Use 2Meg PAges
//Find PML3 Size
@@15: MOV U32 [MEM_PML3],EDI
MOV EAX,U32 [MEM_NUM_1GIG]
ADD EAX,0x1FF
AND EAX,~0x1FF
SHL EAX,3
ADD EDI,EAX
//Find PML4 Size
MOV U32 [MEM_PML4],EDI
MOV EAX,U32 [MEM_NUM_512GIG]
ADD EAX,0x1FF
AND EAX,~0x1FF
SHL EAX,3
ADD EAX,EDI
MOV U32 [MEM_HEAP_BASE],EAX
//Set page tables to zero
MOV EDI,U32 [MEM_PML2]
SUB EAX,EDI
MOV ECX,EAX
SHR ECX,2
XOR EAX,EAX
REP_STOSD
//Check for 1Gig page capability.
BT U32 [MEM_PAGE_SIZE],30
JC @@30
//PML2: Use 2Meg Pages
MOV EAX,0x87 //bit 7 is page size (2Meg)
XOR EDX,EDX
MOV EDI,SYS_FIXED_AREA+CSysFixedArea.pml2
MOV ECX,MEM_NUM_2MEG
@@05: MOV U32 [EDI],EAX
MOV EDI,[MEM_PML2]
MOV ECX,[MEM_NUM_2MEG]
@@20: MOV U32 [EDI],EAX
ADD EDI,4
MOV U32 [EDI],EDX
ADD EDI,4
ADD EAX,0x200000
ADC EDX,0
LOOP @@05
LOOP @@20
//PML3: Use 2Meg Pages
MOV EAX,SYS_FIXED_AREA+CSysFixedArea.pml2+7
MOV EAX,[MEM_PML2]
OR EAX,7
XOR EDX,EDX
MOV EDI,SYS_FIXED_AREA+CSysFixedArea.pml3
MOV ECX,MEM_NUM_USED_1GIG
@@10: MOV U32 [EDI],EAX
MOV EDI,[MEM_PML3]
MOV ECX,[MEM_NUM_1GIG]
@@25: MOV U32 [EDI],EAX
ADD EDI,4
MOV U32 [EDI],EDX
ADD EDI,4
ADD EAX,0x1000
ADC EDX,0
LOOP @@10
JMP @@25
LOOP @@25
JMP @@40
@@15: MOV U8 [SYS_GIG_PAGES],TRUE
//PML3: Use 1Gig Pages
MOV EAX,0x87 //bit 7 is page size (1Gig)
@@30: MOV EAX,0x87 //bit 7 is page size (1Gig)
XOR EDX,EDX
MOV EDI,SYS_FIXED_AREA+CSysFixedArea.pml3
MOV ECX,MEM_NUM_USED_1GIG
@@20: MOV U32 [EDI],EAX
MOV EDI,[MEM_PML3]
MOV ECX,[MEM_NUM_1GIG]
@@35: MOV U32 [EDI],EAX
ADD EDI,4
MOV U32 [EDI],EDX
ADD EDI,4
ADD EAX,0x40000000
ADC EDX,0
LOOP @@20
LOOP @@35
//PML4
@@25: MOV EAX,SYS_FIXED_AREA+CSysFixedArea.pml3+7
@@40: MOV EAX,[MEM_PML3]
OR EAX,7
XOR EDX,EDX
MOV EDI,SYS_FIXED_AREA+CSysFixedArea.pml4
MOV ECX,MEM_NUM_1GIG/(0x1000/8)
@@30: MOV U32 [EDI],EAX
MOV EDI,[MEM_PML4]
MOV ECX,[MEM_NUM_512GIG]
@@45: MOV U32 [EDI],EAX
ADD EDI,4
MOV U32 [EDI],EDX
ADD EDI,4
ADD EAX,0x1000
ADC EDX,0
LOOP @@30
LOOP @@45
RET
MOV U32 [SYS_CODE_BP],SYS_FIXED_AREA+CSysFixedArea.adam_bp
SYS_INIT_16MEG_SYS_CODE_BP::
// Init sys_code_bp to BIOS E801 lowest 16Meg val.
// $LK,"BlkPoolsInit",A="MN:BlkPoolsInit"$() adds the rest.
MOV U32 [SYS_CODE_BP],SYS_FIXED_AREA+CSysFixedArea.sys_code_bp
MOV U32 [SYS_CODE_BP+4],0
MOV U32 [SYS_DATA_BP],0
MOV U32 [SYS_DATA_BP+4],0
XOR EAX,EAX
MOV AX,U16 [SYS_MEM_E801] //1 Kb blks between 1M and 16M
MOV AX,U16 [MEM_E801] //1 Kb blks between 1M and 16M
SHL EAX,10
ADD EAX,0x100000
MOV EBX,U32 [SYS_HEAP_BASE] //SYS_FIXED_AREA+sizeof(CSysFixedArea)
SUB EAX,EBX
MOV EDI,U32 [MEM_HEAP_BASE]
SUB EAX,EDI
/*$AN,"ExpandHeap",A="ExpandHeap"$
TempleOS initializes the heap to the val
of the BIOS E801 lowest 16Meg val. It
later adds the rest to the heap. There
are a few allocations which occur while
it is set to this small val.
At some point, it might be nice to
initialize to the full val but it is a
pain without MAlloc up-and-running.
*/
#define CONSERVATIVE_16MEG_SIZE 0xF00000
#define ESTIMATED_MISC_ALLOCS 0x100000
#assert CONSERVATIVE_16MEG_SIZE-
(SYS_FIXED_AREA+sizeof(CSysFixedArea))>MEM_ADAM_STK+
ESTIMATED_MISC_ALLOCS
//EBX=BASE EAX=SIZE
//EDI=BASE EAX=SIZE
TEST U8 [SYS_MEM_INIT_FLAG],1
JZ @@35
JZ @@05
PUSH EAX
MOV EDI,EBX
PUSH EDI
MOV ECX,EAX
MOV AL,U8 [SYS_MEM_INIT_VAL]
REP_STOSB
POP EDI
POP EAX
@@35: SHR EAX,MEM_PAGE_BITS
MOV ESI,SYS_FIXED_AREA+CSysFixedArea.adam_bp
MOV EDI,U32 CBlkPool.mem_free_lst[ESI]
MOV U32 CMemBlk.next[EBX],EDI
MOV U32 CMemBlk.next+4[EBX],0
MOV U32 CBlkPool.mem_free_lst[ESI],EBX
@@05: SHR EAX,MEM_PAG_BITS
MOV ESI,SYS_FIXED_AREA+CSysFixedArea.sys_code_bp
MOV EBX,U32 CBlkPool.mem_free_lst[ESI]
MOV U32 CMemBlk.next[EDI],EBX
MOV U32 CMemBlk.next+4[EDI],0
MOV U32 CBlkPool.mem_free_lst[ESI],EDI
MOV U32 CBlkPool.mem_free_lst+4[ESI],0
MOV U32 CMemBlk.mb_signature[EBX],MBS_UNUSED_SIGNATURE_VAL
MOV U32 CMemBlk.pages[EBX],EAX
SHL EAX,MEM_PAGE_BITS
MOV U32 CMemBlk.mb_signature[EDI],MBS_UNUSED_SIGNATURE_VAL
MOV U32 CMemBlk.pags[EDI],EAX
SHL EAX,MEM_PAG_BITS
ADD U32 CBlkPool.alloced_u8s[ESI],EAX
BTS U32 [SYS_RUN_LEVEL],RLf_16MEG_SYS_CODE_BP
RET
}
I64 *MemPageTable(U8 *a)
{//Point to page table entry for addr.
if (sys_gig_pages)
return SYS_FIXED_AREA+offset(CSysFixedArea.pml3)+a>>30*8;
if (Bt(&mem_page_size,30))
return *MEM_PML3(U64 *)+a>>30*8;
else
return SYS_FIXED_AREA+offset(CSysFixedArea.pml2)+a>>21*8;
return *MEM_PML2(U64 *)+a>>21*8;
}
I64 MemPageSize(U8 *)
{//Page table entry size for addr.
if (sys_gig_pages)
return 1<<30; //1Gig
else
return 1<<21; //2Meg
}
Bool MemPagePresentMark(U8 *a,Bool val)
{//Mark an addr's page present or not-present.
I64 *pte=MemPageTable(a);
Bool res=*pte&1;
if (val)
*pte=*pte|1; //Mark present
else
*pte=*pte&~1; //Mark not present
InvlPg(a);
return res;
}
+32 -33
View File
@@ -120,7 +120,7 @@ CCPU *CPUStructInit(I64 num,CCPU *c,CTask *seth_task)
c->num=num;
c->idle_factor=0.01;
QueInit(&c->next_dying);
if (Bt(&sys_run_level,RLf_BOOT_HEAP)) {
if (Bt(&sys_run_level,RLf_16MEG_ADAM_HEAP_CTRL)) {
c->idle_task=Spawn(0,NULL,"Idle Task",,Fs,,0);
LBts(&c->idle_task->task_flags,TASKf_IDLE);
c->tss=TSSNew(num);
@@ -165,7 +165,7 @@ U0 MPHalt()
{//Halt all other cores.
mp_cnt=1;
MPNMInt;
BusyWait(10000);
Busy(10000);
}
U0 MPAPICInit()
@@ -189,45 +189,44 @@ U0 MPAPICInit()
}
}
#assert !offset(CSrvCtrl.next_waiting)
#assert !offset(CJobCtrl.next_waiting)
U0 CoreAPSethTask()
{
CSrvCtrl *ctrl=&Fs->srv_ctrl;
CJobCtrl *ctrl=&Fs->srv_ctrl;
while (TRUE) {
STI
do {
TaskKillDying;
do PAUSE
while (LBts(&ctrl->flags,SVCRf_LOCKED));
} while (ctrl->next_waiting!=ctrl && SrvCmdRunOne(GetRFlags,ctrl));
while (LBts(&ctrl->flags,JOBCf_LOCKED));
} while (ctrl->next_waiting!=ctrl && JobRunOne(GetRFlags,ctrl));
CLI
LBts(&Fs->task_flags,TASKf_AWAITING_MSG);
LBtr(&ctrl->flags,SVCRf_LOCKED);
LBtr(&ctrl->flags,JOBCf_LOCKED);
LBts(&Fs->task_flags,TASKf_IDLE);
Yield;
LBtr(&Fs->task_flags,TASKf_IDLE);
}
}
CSrvCmd *JobQue(I64 (*fp_addr)(U8 *data),U8 *data=NULL,
I64 target_cpu=1,I64 flags=1<<SVCf_FREE_ON_COMPLETE,
I64 cmd_code=SVCT_CALL,U8 *aux_str=NULL,I64 aux1=0,I64 aux2=0)
CJob *JobQue(I64 (*fp_addr)(U8 *data),U8 *data=NULL,
I64 target_cpu=1,I64 flags=1<<JOBf_FREE_ON_COMPLETE,
I64 job_code=JOBT_CALL,U8 *aux_str=NULL,I64 aux1=0,I64 aux2=0)
{//Queue multicore jobs, handled by Seth tasks.
//Set flags to zero if you wish to get the res.
//See $LK,"::/Demo/MultiCore/Lock.HC"$
CSrvCtrl *ctrl;
CSrvCmd *tmpc;
CJobCtrl *ctrl;
CJob *tmpc;
CTask *seth;
if (!(0<=target_cpu<mp_cnt))
throw('MultCore');
tmpc=ACAlloc(sizeof(CSrvCmd));
tmpc=ACAlloc(sizeof(CJob));
if (aux_str)
tmpc->aux_str=AStrNew(aux_str);
tmpc->cmd_code=cmd_code;
tmpc->job_code=job_code;
tmpc->addr=fp_addr;
tmpc->fun_arg=data;
tmpc->target_cpu=target_cpu;
tmpc->flags=flags;
tmpc->aux1=aux1;
tmpc->aux2=aux2;
@@ -235,26 +234,26 @@ CSrvCmd *JobQue(I64 (*fp_addr)(U8 *data),U8 *data=NULL,
tmpc->ctrl=ctrl=&seth->srv_ctrl;
PUSHFD
CLI
while (LBts(&ctrl->flags,SVCRf_LOCKED))
while (LBts(&ctrl->flags,JOBCf_LOCKED))
Yield;
if (ctrl->next_waiting==ctrl && LBtr(&seth->task_flags,TASKf_AWAITING_MSG))
MPInt(I_WAKE,target_cpu);
QueIns(tmpc,ctrl->last_waiting);
LBtr(&ctrl->flags,SVCRf_LOCKED);
LBtr(&ctrl->flags,JOBCf_LOCKED);
POPFD
return tmpc;
}
CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,U8 *task_name=NULL,
I64 target_cpu, CTask *parent=NULL, //NULL means adam
I64 stk_size=0,I64 flags=1<<SVCf_ADD_TO_QUE)
I64 stk_size=0,I64 flags=1<<JOBf_ADD_TO_QUE)
{
CTask *res;
CSrvCmd *tmpc=JobQue(fp_addr,data,target_cpu,
flags,SVCT_SPAWN_TASK,task_name,parent,stk_size);
CSrvCtrl *ctrl;
CJob *tmpc=JobQue(fp_addr,data,target_cpu,
flags,JOBT_SPAWN_TASK,task_name,parent,stk_size);
CJobCtrl *ctrl;
while (!Bt(&tmpc->flags,SVCf_DONE)) {
while (!Bt(&tmpc->flags,JOBf_DONE)) {
LBts(&Fs->task_flags,TASKf_IDLE);
Yield;
}
@@ -264,12 +263,12 @@ CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,U8 *task_name=NULL,
ctrl=tmpc->ctrl;
PUSHFD
CLI
while (LBts(&ctrl->flags,SVCRf_LOCKED))
while (LBts(&ctrl->flags,JOBCf_LOCKED))
Yield;
QueRem(tmpc);
LBtr(&ctrl->flags,SVCRf_LOCKED);
LBtr(&ctrl->flags,JOBCf_LOCKED);
POPFD
SrvCmdDel(tmpc);
JobDel(tmpc);
return res;
}
@@ -301,8 +300,8 @@ U0 Core0StartMP()
MPHalt; //sets mp_cnt to 1
for (i=1;i<my_mp_cnt;i++) {
c=&cpu_structs[i];
SrvCmdQueDel(&c->seth_task->srv_ctrl.next_waiting);
SrvCmdQueDel(&c->seth_task->srv_ctrl.next_done);
JobQueDel(&c->seth_task->srv_ctrl.next_waiting);
JobQueDel(&c->seth_task->srv_ctrl.next_done);
}
}
MemSet(&cpu_structs[1],0,sizeof(CCPU)*(MP_MAX_PROCESSORS-1));
@@ -320,13 +319,13 @@ U0 Core0StartMP()
WBINVD //Not sure why this is needed. Might just need delay. $LK,"MemCpy",A="MN:MemCpy"$ above?
*(dev.uncached_alias+LAPIC_ICR_LOW)(U32 *)=0xC4500; //assert init IPI
BusyWait(10000);
Busy(10000);
*(dev.uncached_alias+LAPIC_ICR_LOW)(U32 *)=0xC4600+MPN_VECT; //start-up
BusyWait(200);
Busy(200);
*(dev.uncached_alias+LAPIC_ICR_LOW)(U32 *)=0xC4600+MPN_VECT;
BusyWait(100000);
Busy(100000);
for (i=0;i<10000;i++)
LBts(&mp_cnt_lock,0); //Don't let more through
my_mp_cnt=mp_cnt_initial;
@@ -335,7 +334,7 @@ U0 Core0StartMP()
my_mp_cnt=MP_MAX_PROCESSORS;
for (i=1;i<my_mp_cnt;i++) {
StrPrint(buf,"Seth Task CPU#%d",i);
StrPrint(buf,"Seth Task CPU%02X",i);
task=Spawn(&CoreAPSethInit,NULL,buf,,,MEM_SETH_STK,0);
task->rflags=RFLAGG_START;
//$LK,"CTask",A="MN:CTask"$ alloced off this core's seth_task's heap (Which is Adam)
@@ -384,7 +383,7 @@ interrupt U0 IntMPCrash()
mp_cnt=1;
Raw(ON);
text.raw_flags|=RWF_SHOW_DOLLAR;
"MP Crash CPU#%02X Task:%08X\n"
"MP Crash CPU%02X Task:%08X\n"
"RIP:%P\n",dbg.mp_crash->cpu_num,dbg.mp_crash->task,dbg.mp_crash->rip;
Dbg(dbg.mp_crash->msg,dbg.mp_crash->msg_num);
Panic(dbg.mp_crash->msg,dbg.mp_crash->msg_num);
}
+14 -14
View File
@@ -165,7 +165,7 @@ U8 PCIReadU8(I64 bus,I64 dev,I64 fun,I64 rg)
I64 res;
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_FAR_CALL32],0))
while (LBts(&sys_semas[SEMA_FAR_CALL32],0))
Yield;
c32_eax=0xB108;
c32_ebx=bus<<8+dev<<3+fun;
@@ -174,7 +174,7 @@ U8 PCIReadU8(I64 bus,I64 dev,I64 fun,I64 rg)
res=c32_ecx.u8[0];
else
res=0xFF;
LBtr(&sys_semas[SYS_SEMA_FAR_CALL32],0);
LBtr(&sys_semas[SEMA_FAR_CALL32],0);
POPFD
return res;
}
@@ -184,7 +184,7 @@ U16 PCIReadU16(I64 bus,I64 dev,I64 fun,I64 rg)
I64 res;
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_FAR_CALL32],0))
while (LBts(&sys_semas[SEMA_FAR_CALL32],0))
Yield;
c32_eax=0xB109;
c32_ebx=bus<<8+dev<<3+fun;
@@ -193,7 +193,7 @@ U16 PCIReadU16(I64 bus,I64 dev,I64 fun,I64 rg)
res=c32_ecx.u16[0];
else
res=0xFFFF;
LBtr(&sys_semas[SYS_SEMA_FAR_CALL32],0);
LBtr(&sys_semas[SEMA_FAR_CALL32],0);
POPFD
return res;
}
@@ -203,7 +203,7 @@ U32 PCIReadU32(I64 bus,I64 dev,I64 fun,I64 rg)
I64 res;
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_FAR_CALL32],0))
while (LBts(&sys_semas[SEMA_FAR_CALL32],0))
Yield;
c32_eax=0xB10A;
c32_ebx=bus<<8+dev<<3+fun;
@@ -212,7 +212,7 @@ U32 PCIReadU32(I64 bus,I64 dev,I64 fun,I64 rg)
res=c32_ecx;
else
res=0xFFFFFFFF;
LBtr(&sys_semas[SYS_SEMA_FAR_CALL32],0);
LBtr(&sys_semas[SEMA_FAR_CALL32],0);
POPFD
return res;
}
@@ -221,14 +221,14 @@ U0 PCIWriteU8(I64 bus,I64 dev,I64 fun,I64 rg,I64 val)
{//Write U8 in PCI configspace at bus,dev,fun,reg.
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_FAR_CALL32],0))
while (LBts(&sys_semas[SEMA_FAR_CALL32],0))
Yield;
c32_eax=0xB10B;
c32_ebx=bus<<8+dev<<3+fun;
c32_edi=rg;
c32_ecx=val;
FarCall32(sys_pci_services);
LBtr(&sys_semas[SYS_SEMA_FAR_CALL32],0);
LBtr(&sys_semas[SEMA_FAR_CALL32],0);
POPFD
}
@@ -236,14 +236,14 @@ U0 PCIWriteU16(I64 bus,I64 dev,I64 fun,I64 rg,I64 val)
{//Write U16 in PCI configspace at bus,dev,fun,reg.
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_FAR_CALL32],0))
while (LBts(&sys_semas[SEMA_FAR_CALL32],0))
Yield;
c32_eax=0xB10C;
c32_ebx=bus<<8+dev<<3+fun;
c32_edi=rg;
c32_ecx=val;
FarCall32(sys_pci_services);
LBtr(&sys_semas[SYS_SEMA_FAR_CALL32],0);
LBtr(&sys_semas[SEMA_FAR_CALL32],0);
POPFD
}
@@ -251,14 +251,14 @@ U0 PCIWriteU32(I64 bus,I64 dev,I64 fun,I64 rg,I64 val)
{//Write U32 in PCI configspace at bus,dev,fun,reg.
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_FAR_CALL32],0))
while (LBts(&sys_semas[SEMA_FAR_CALL32],0))
Yield;
c32_eax=0xB10D;
c32_ebx=bus<<8+dev<<3+fun;
c32_edi=rg;
c32_ecx=val;
FarCall32(sys_pci_services);
LBtr(&sys_semas[SYS_SEMA_FAR_CALL32],0);
LBtr(&sys_semas[SEMA_FAR_CALL32],0);
POPFD
}
@@ -273,7 +273,7 @@ else bus,dev,fun.
I64 res;
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_FAR_CALL32],0))
while (LBts(&sys_semas[SEMA_FAR_CALL32],0))
Yield;
c32_eax=0xB103;
c32_esi=n;
@@ -282,7 +282,7 @@ else bus,dev,fun.
res=c32_ebx.u8[1]<<16+(c32_ebx&0xF8)<<5+c32_ebx&7;
else
res=-1;
LBtr(&sys_semas[SYS_SEMA_FAR_CALL32],0);
LBtr(&sys_semas[SEMA_FAR_CALL32],0);
POPFD
return res;
}
+8 -8
View File
@@ -155,7 +155,7 @@ _TASK_END_NOW::
_YIELD::
PUSHFD
TEST U8 [SYS_SEMAS+SYS_SEMA_SINGLE_USER*SEMA_STRUCT_SIZE],1
TEST U8 [SYS_SEMAS+SEMA_SINGLE_USER*DFT_CACHE_LINE_WIDTH],1
JZ @@05
POPFD //If single user, don't change task.
RET
@@ -169,8 +169,8 @@ _YIELD::
MOV RSI,U64 CTask.next_task[RSI]
RESTORE_RSI_TASK:
TEST U64 [SYS_CTRL_ALT_FLAGS],1<<SYSf_CTRL_ALT_DEL|
1<<SYSf_CTRL_ALT_TAB|1<<SYSf_CTRL_ALT_X|1<<SYSf_CTRL_ALT_C
TEST U64 [SYS_CTRL_ALT_FLAGS],1<<CTRL_ALT_DEL|
1<<CTRL_ALT_TAB|1<<CTRL_ALT_X|1<<CTRL_ALT_C
JNZ HANDLE_SYSF_KEY_EVENT
RESTORE_RSI_TASK2:
@@ -218,23 +218,23 @@ HANDLE_SYSF_KEY_EVENT:
MOV EAX,U32 SYS_CTRL_ALT_FLAGS
LOCK
BTR U32 [RAX],SYSf_CTRL_ALT_DEL
BTR U32 [RAX],CTRL_ALT_DEL
JC I32 &Reboot
CMP U64 GS:CCPU.idle_task[RBX],RSI
JE RESTORE_SETH_TASK_IF_READY
LOCK
BTR U32 [RAX],SYSf_CTRL_ALT_TAB
BTR U32 [RAX],CTRL_ALT_TAB
JNC @@05
CALL &TaskFocusNext
JMP I32 RESTORE_FS_TASK
@@05: LOCK
BTR U32 [RAX],SYSf_CTRL_ALT_X
BTR U32 [RAX],CTRL_ALT_X
JC END_FOCUS_USER
LOCK
BTR U32 [RAX],SYSf_CTRL_ALT_C
BTR U32 [RAX],CTRL_ALT_C
JNC I32 RESTORE_RSI_TASK
BREAK_FOCUS_USER:
@@ -250,7 +250,7 @@ BREAK_FOCUS_USER:
BTS U64 CTask.task_flags[RSI],TASKf_PENDING_BREAK
JMP I32 RESTORE_RSI_TASK
@@10: MOV RAX,&SysThrowBreak
@@10: MOV RAX,&Break
MOV U64 CTask.rip[RSI],RAX
BT U64 CTask.task_flags[RSI],TASKf_BREAK_TO_SHIFT_ESC
JC I32 RESTORE_RSI_TASK
-84
View File
@@ -1,84 +0,0 @@
U0 GridInit()
{//Init input pointer grid struct. See $LK,"::/Demo/Graphics/Grid.HC"$.
ip_grid.x=ip_grid.y=ip_grid.z=8;
ip_grid.x_offset=ip_grid.y_offset=ip_grid.z_offset=0;
ip_grid.x_speed =ip_grid.y_speed =ip_grid.z_speed =1;
ip_grid.show=ip_grid.snap=FALSE;
}
U0 IPVarsUpdate(I64 x,I64 y,I64 z,Bool l,Bool r)
{
ip.presnap.x=ToI64(ip.scale.x*x)+ip.offset.x;
ip.presnap.y=ToI64(ip.scale.y*y)+ip.offset.y;
ip.presnap.z=ToI64(ip.scale.z*z)+ip.offset.z;
if (ip_grid.snap) {
ip.pos.x=Trunc(ip.presnap.x/ip_grid.x)*ip_grid.x+ip_grid.x_offset;
ip.pos.y=Trunc(ip.presnap.y/ip_grid.y)*ip_grid.y+ip_grid.y_offset;
ip.pos.z=Trunc(ip.presnap.z/ip_grid.z)*ip_grid.z+ip_grid.z_offset;
} else {
ip.pos.x=ip.presnap.x;
ip.pos.y=ip.presnap.y;
ip.pos.z=ip.presnap.z;
}
ip.pos.x=ClampI64(ip.pos.x,0,GR_WIDTH-1);
ip.pos.y=ClampI64(ip.pos.y,0,GR_HEIGHT-1);
ip.throttle=ClampI64(ip.throttle,MIN_I32,MAX_I32);
ip.pos_text.x=ip.pos.x/FONT_WIDTH;
if (ip.pos_text.x>=text.cols) {
ip.pos_text.x=text.cols-1;
ip.pos.x=text.cols*FONT_WIDTH-1;
}
ip.pos_text.y=ip.pos.y/FONT_HEIGHT;
if (ip.pos_text.y>=text.rows) {
ip.pos_text.y=text.rows-1;
ip.pos.y=text.rows*FONT_HEIGHT-1;
}
ip.lb=l;
ip.rb=r;
LBEqu(&kbd.scan_code,SCf_IP_L_DOWN,ip.lb);
LBEqu(&kbd.scan_code,SCf_IP_R_DOWN,ip.rb);
}
U0 IPSet(I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,I64 l=MAX_I64,I64 r=MAX_I64)
{//Note: Generates a message. See $LK,"IPSet",A="FF:::/Demo/Games/Zing.HC,IPSet"$().
if (!(0<=x<GR_WIDTH))
x=ip.pos.x;
if (!(0<=y<GR_HEIGHT))
y=ip.pos.y;
if (z==MAX_I64)
z=ip.pos.z;
if (!(FALSE<=l<=TRUE))
l=ip.lb;
if (!(FALSE<=r<=TRUE))
r=ip.rb;
x=(x-ip.offset.x)/ip.scale.x;
y=(y-ip.offset.y)/ip.scale.y;
z=(z-ip.offset.z)/ip.scale.z;
IPVarsUpdate(x,y,z,l,r);
switch (ip.dev) {
case IP_MOUSE:
MouseIPSet(x,y,z,l,r);
break;
}
}
U0 IPVarsInit()
{
MemSet(&ip,0,sizeof(CIPStateGlbls));
MemSet(&ip_last,0,sizeof(CIPStateGlbls));
ip.throttle=0;
ip.throttle_step=(MAX_I32+1)>>3;
ip.offset.x=ip.offset.y=ip.offset.z=0;
ip.scale.x=ip.scale.y=ip.scale.z=1.0;
ip.dev=IP_NULL;
ip.pos_text.x=ip.pos_text.y=ip.pos_text.z=0;
ip.has_wheel=FALSE;
ip.show=TRUE;
ip.speed=0;
ip.timestamp=GetTSC;
ip.dbl_time=0.350;
GridInit;
}
+13 -13
View File
@@ -62,7 +62,7 @@ U0 KbdLEDsSet(I64 sc)
Fs->catch_except=TRUE;
}
U0 KbdMouseCmdAck(...)
U0 KbdMsCmdAck(...)
{
I64 i,ack,timeout;
for (i=0;i<argc;i++) {
@@ -237,7 +237,7 @@ U8 *Char2KeyName(I64 ch,Bool include_ctrl=TRUE)
buf[i+1]=0;
break;
}
} else if (Bt(chars_bmp_printable,ch)) {
} else if (Bt(char_bmp_printable,ch)) {
*buf=ch;
buf[1]=0;
} else
@@ -413,7 +413,7 @@ interrupt U0 IRQKbd()
CLD
OutU8(0x20,0x20);
kbd.irqs_working=TRUE;
if (mouse.install_in_progress) {
if (ms_hard.install_in_progress) {
kbd.rst=TRUE;
return;
}
@@ -438,7 +438,7 @@ U0 KbdInit()
OutU8(0x21,InU8(0x21)&~2);
}
U0 KbdHandler()
U0 KbdHndlr()
{
static U8 last_raw_byte=0;
U8 raw_byte;
@@ -466,16 +466,16 @@ U0 KbdHandler()
I64 KbdMsgsQue()
{
I64 a1,a2,msg_code=MSG_NULL;
I64 arg1,arg2,msg_code=MSG_NULL;
CTask *task_focus;
if (task_focus=sys_focus_task) {
while (FifoI64Rem(kbd.scan_code_fifo,&a2)) {
a1=ScanCode2Char(a2);
if (a2 & SCF_KEY_UP) {
TaskMsg(task_focus,0,MSG_KEY_UP,a1,a2,0);
while (FifoI64Rem(kbd.scan_code_fifo,&arg2)) {
arg1=ScanCode2Char(arg2);
if (arg2 & SCF_KEY_UP) {
TaskMsg(task_focus,0,MSG_KEY_UP,arg1,arg2,0);
msg_code=MSG_KEY_UP;
} else {
TaskMsg(task_focus,0,MSG_KEY_DOWN,a1,a2,0);
TaskMsg(task_focus,0,MSG_KEY_DOWN,arg1,arg2,0);
msg_code=MSG_KEY_DOWN;
}
}
@@ -483,10 +483,10 @@ I64 KbdMsgsQue()
return msg_code;
}
I64 KbdMouseEvtTime()
I64 KbdMsEvtTime()
{//Timestamp of last key or mouse event.
if (mouse.timestamp>kbd.timestamp)
return mouse.timestamp;
if (ms_hard.timestamp>kbd.timestamp)
return ms_hard.timestamp;
else
return kbd.new_key_timestamp;
}
-1
View File
@@ -1,5 +1,4 @@
#exe {Cd(__DIR__);};
#include "InputPointer"
#include "Keyboard"
#include "Mouse"
#include "Message"
+28 -28
View File
@@ -1,6 +1,6 @@
U0 InputFilterTask()
{
CSrvCmd *tmpc,*tmpc1;
CJob *tmpc,*tmpc1;
Bool old_filter;
I64 old_flags=GetRFlags;
Fs->win_inhibit=WIG_USER_TASK_DFT;
@@ -9,20 +9,20 @@ U0 InputFilterTask()
LBEqu(&Fs->task_flags,TASKf_FILTER_INPUT,old_filter);
while (TRUE) {
CLI
SrvCmdsHandler(old_flags);
JobsHndlr(old_flags);
tmpc1=&Fs->srv_ctrl.next_waiting;
tmpc=tmpc1->next;
if (tmpc==tmpc1)
break;
else {
if (tmpc->cmd_code==SVCT_TEXT_INPUT) {
if (tmpc->job_code==JOBT_TEXT_INPUT) {
QueRem(tmpc);
SetRFlags(old_flags);
try
ExePrint("%s",tmpc->aux_str);
catch
Fs->catch_except=TRUE;
SrvCmdDel(tmpc);
JobDel(tmpc);
} else
break;
}
@@ -34,7 +34,7 @@ U0 InputFilterTask()
SetRFlags(old_flags);
}
I64 ScanMsg(I64 *_a1=NULL,I64 *_a2=NULL,I64 mask=~1,CTask *task=NULL)
I64 ScanMsg(I64 *_arg1=NULL,I64 *_arg2=NULL,I64 mask=~1,CTask *task=NULL)
{/*Check for a message of type specified by a one in the mask.
Throw-out messages not in mask.
If no message fit mask, return NULL immediately.
@@ -42,27 +42,27 @@ Remove desired message, return $LK,"msg_code",A="MN:MSG_CMD"$.
Note: This delivers messages from parent down to pop-up.
*/
I64 res,old_flags;
CSrvCmd *tmpc,*tmpc1;
CJob *tmpc,*tmpc1;
if (!task) task=Fs;
old_flags=GetRFlags;
tmpc1=&task->srv_ctrl.next_waiting;
while (TRUE) {
CLI
if (task==Fs)
SrvCmdsHandler(old_flags);
JobsHndlr(old_flags);
tmpc=tmpc1->next;
if (tmpc==tmpc1)
break;
else {
if (tmpc->cmd_code==SVCT_MSG) {
if (tmpc->job_code==JOBT_MSG) {
QueRem(tmpc);
SetRFlags(old_flags);
res=tmpc->msg_code;
if (_a1)
*_a1=tmpc->aux1;
if (_a2)
*_a2=tmpc->aux2;
SrvCmdDel(tmpc);
if (_arg1)
*_arg1=tmpc->aux1;
if (_arg2)
*_arg2=tmpc->aux2;
JobDel(tmpc);
if ((res!=MSG_KEY_DOWN || !(tmpc->aux2&SCF_KEY_DESC) ||
!Bt(&task->win_inhibit,WIf_SELF_KEY_DESC)) && Bt(&mask,res))
goto sm_done;
@@ -71,13 +71,13 @@ Note: This delivers messages from parent down to pop-up.
SetRFlags(old_flags);
}
res=MSG_NULL;
if (_a1)
*_a1=0;
if (_a2)
*_a2=0;
if (_arg1)
*_arg1=0;
if (_arg2)
*_arg2=0;
if (task->parent_task&&task->parent_task->popup_task==task) {
SetRFlags(old_flags);
return ScanMsg(_a1,_a2,mask,task->parent_task);
return ScanMsg(_arg1,_arg2,mask,task->parent_task);
}
sm_done:
SetRFlags(old_flags);
@@ -86,20 +86,20 @@ sm_done:
I64 FlushMsgs(CTask *task=NULL)
{//Throw away all messages. Return count.
I64 res=0,a1,a2;
while (ScanMsg(&a1,&a2,~1,task))
I64 res=0,arg1,arg2;
while (ScanMsg(&arg1,&arg2,~1,task))
res++;
return res;
}
I64 GetMsg(I64 *_a1=NULL,I64 *_a2=NULL,I64 mask=~1,CTask *task=NULL)
I64 GetMsg(I64 *_arg1=NULL,I64 *_arg2=NULL,I64 mask=~1,CTask *task=NULL)
{//Wait for a message of type specified by a one in the mask.
//Throw-out all messages not in mask.
//Returns $LK,"msg_code",A="MN:MSG_CMD"$. See $LK,"::/Demo/MsgLoop.HC"$.
I64 res;
if (!task) task=Fs;
LBtr(&task->task_flags,TASKf_IDLE);
while (!(res=ScanMsg(_a1,_a2,mask,task))) {
while (!(res=ScanMsg(_arg1,_arg2,mask,task))) {
LBts(&task->task_flags,TASKf_IDLE);
Yield;
}
@@ -111,13 +111,13 @@ I64 ScanChar()
{//Checks for $LK,"MSG_KEY_DOWN",A="MN:MSG_KEY_DOWN"$ and returns 0 immediately if no key.
//Waits for $LK,"MSG_KEY_UP",A="MN:MSG_KEY_UP"$ of non-zero $LK,"ASCII",A="MN:CH_CTRLA"$ key and returns $LK,"ASCII",A="MN:CH_CTRLA"$ if key.
//$LK,"ScanMsg",A="MN:ScanMsg"$() throws away other message types.
I64 a1a,a2a,a1b,a2b;
if (!ScanMsg(&a1a,&a2a,1<<MSG_KEY_DOWN)||!a1a)
I64 arg1a,arg2a,arg1b,arg2b;
if (!ScanMsg(&arg1a,&arg2a,1<<MSG_KEY_DOWN)||!arg1a)
return 0;
else
do GetMsg(&a1b,&a2b,1<<MSG_KEY_UP);
while (!a1b); //Be careful of $LK,"SC_SHIFT",A="MN:SC_SHIFT"$ and $LK,"SC_CTRL",A="MN:SC_CTRL"$, etc.
return a1a;
do GetMsg(&arg1b,&arg2b,1<<MSG_KEY_UP);
while (!arg1b); //Be careful of $LK,"SC_SHIFT",A="MN:SC_SHIFT"$ and $LK,"SC_CTRL",A="MN:SC_CTRL"$, etc.
return arg1a;
}
Bool ScanKey(I64 *_ch=NULL,I64 *_scan_code=NULL,Bool echo=FALSE)
@@ -162,7 +162,7 @@ I64 GetKey(I64 *_scan_code=NULL,Bool echo=FALSE,Bool raw_cursor=FALSE)
//keyboard when in debugger with interrupts off.
PUSHFD
CLI
KbdMouseHandler(TRUE,FALSE);
KbdMsHndlr(TRUE,FALSE);
KbdMsgsQue;
POPFD
} else {
+205 -128
View File
@@ -1,47 +1,124 @@
U0 MousePktRead()
{
U8 j;
if (GetTSC>mouse.timestamp+cnts.time_stamp_freq>>3)
FifoU8Flush(mouse.fifo);
mouse.timestamp=GetTSC;
FifoU8Ins(mouse.fifo,InU8(KBD_PORT));
if (FifoU8Cnt(mouse.fifo)==mouse.pkt_size)
while (FifoU8Rem(mouse.fifo,&j))
FifoU8Ins(mouse.fifo2,j);
U0 GridInit()
{//Init mouse grid struct. See $LK,"::/Demo/Graphics/Grid.HC"$.
ms_grid.x=ms_grid.y=ms_grid.z=8;
ms_grid.x_offset=ms_grid.y_offset=ms_grid.z_offset=0;
ms_grid.x_speed =ms_grid.y_speed =ms_grid.z_speed =1;
ms_grid.show=ms_grid.snap=FALSE;
}
interrupt U0 IRQMouse()
U0 MsUpdate(I64 x,I64 y,I64 z,Bool l,Bool r)
{
ms.presnap.x=ToI64(ms.scale.x*x)+ms.offset.x;
ms.presnap.y=ToI64(ms.scale.y*y)+ms.offset.y;
ms.presnap.z=ToI64(ms.scale.z*z)+ms.offset.z;
if (ms_grid.snap) {
ms.pos.x=Trunc(ms.presnap.x/ms_grid.x)*ms_grid.x+ms_grid.x_offset;
ms.pos.y=Trunc(ms.presnap.y/ms_grid.y)*ms_grid.y+ms_grid.y_offset;
ms.pos.z=Trunc(ms.presnap.z/ms_grid.z)*ms_grid.z+ms_grid.z_offset;
} else {
ms.pos.x=ms.presnap.x;
ms.pos.y=ms.presnap.y;
ms.pos.z=ms.presnap.z;
}
ms.pos.x=ClampI64(ms.pos.x,0,GR_WIDTH-1);
ms.pos.y=ClampI64(ms.pos.y,0,GR_HEIGHT-1);
ms.pos_text.x=ms.pos.x/FONT_WIDTH;
if (ms.pos_text.x>=text.cols) {
ms.pos_text.x=text.cols-1;
ms.pos.x=text.cols*FONT_WIDTH-1;
}
ms.pos_text.y=ms.pos.y/FONT_HEIGHT;
if (ms.pos_text.y>=text.rows) {
ms.pos_text.y=text.rows-1;
ms.pos.y=text.rows*FONT_HEIGHT-1;
}
ms.lb=l;
ms.rb=r;
LBEqu(&kbd.scan_code,SCf_MS_L_DOWN,ms.lb);
LBEqu(&kbd.scan_code,SCf_MS_R_DOWN,ms.rb);
}
U0 MsSet(I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,I64 l=MAX_I64,I64 r=MAX_I64)
{//Note: Generates a message. See $LK,"MsSet",A="FF:::/Demo/Games/Zing.HC,MsSet"$().
if (!(0<=x<GR_WIDTH))
x=ms.pos.x;
if (!(0<=y<GR_HEIGHT))
y=ms.pos.y;
if (z==MAX_I64)
z=ms.pos.z;
if (!(FALSE<=l<=TRUE))
l=ms.lb;
if (!(FALSE<=r<=TRUE))
r=ms.rb;
x=(x-ms.offset.x)/ms.scale.x;
y=(y-ms.offset.y)/ms.scale.y;
z=(z-ms.offset.z)/ms.scale.z;
MsUpdate(x,y,z,l,r);
MsHardSet(x,y,z,l,r);
}
U0 MsInit()
{
MemSet(&ms,0,sizeof(CMsStateGlbls));
MemSet(&ms_last,0,sizeof(CMsStateGlbls));
ms.offset.x=ms.offset.y=ms.offset.z=0;
ms.scale.x=ms.scale.y=ms.scale.z=1.0;
ms.pos_text.x=ms.pos_text.y=ms.pos_text.z=0;
ms.has_wheel=FALSE;
ms.show=TRUE;
ms.speed=0;
ms.timestamp=GetTSC;
ms.dbl_time=0.350;
GridInit;
}
U0 MsHardPktRead()
{
U8 j;
if (GetTSC>ms_hard.timestamp+cnts.time_stamp_freq>>3)
FifoU8Flush(ms_hard.fifo);
ms_hard.timestamp=GetTSC;
FifoU8Ins(ms_hard.fifo,InU8(KBD_PORT));
if (FifoU8Cnt(ms_hard.fifo)==ms_hard.pkt_size)
while (FifoU8Rem(ms_hard.fifo,&j))
FifoU8Ins(ms_hard.fifo2,j);
}
interrupt U0 IRQMsHard()
{
CLD
OutU8(0xA0,0x20);
OutU8(0x20,0x20);
mouse.irqs_working=TRUE;
if (mouse.install_in_progress || !mouse.installed) {
ms_hard.irqs_working=TRUE;
if (ms_hard.install_in_progress || !ms_hard.installed) {
kbd.rst=TRUE;
return;
}
MousePktRead;
MsHardPktRead;
}
U0 MouseGetDevType()
U0 MsHardGetType()
{
I64 b;
KbdMouseCmdAck(0xF2);
KbdMsCmdAck(0xF2);
b=KbdCmdRead;
if (b==3)
mouse.has_wheel=TRUE;
ms_hard.has_wheel=TRUE;
else if (b==4)
mouse.has_ext_buttons=TRUE;
ms_hard.has_ext_bttns=TRUE;
}
Bool MouseRst()
Bool MsHardRst()
{
U8 b,*_b;
F64 timeout;
Bool res=FALSE;
mouse.has_wheel=FALSE;
mouse.has_ext_buttons=FALSE;
ms_hard.has_wheel=FALSE;
ms_hard.has_ext_bttns=FALSE;
if (*0x40E(U16 *)==0x9FC0) {
_b=0x9FC00+0x30;
@@ -54,7 +131,7 @@ Bool MouseRst()
KbdCmdSend(KBD_CTRL,0xAD); //Disable Kbd
KbdCmdSend(KBD_CTRL,0xA8); //Enable Mouse
KbdMouseCmdAck(0xFF); //Rst
KbdMsCmdAck(0xFF); //Rst
timeout=tS+10.0;
do
@@ -70,11 +147,11 @@ Bool MouseRst()
catch
Fs->catch_except=TRUE;
KbdMouseCmdAck(0xF3,200,0xF3,100,0xF3,80);
MouseGetDevType;
KbdMouseCmdAck(0xF3,10);
MouseGetDevType;
KbdMouseCmdAck(0xE8,0x03,0xE6,0xF3,100,0xF4);
KbdMsCmdAck(0xF3,200,0xF3,100,0xF3,80);
MsHardGetType;
KbdMsCmdAck(0xF3,10);
MsHardGetType;
KbdMsCmdAck(0xE8,0x03,0xE6,0xF3,100,0xF4);
res=TRUE;
//Enable IRQ 12
@@ -94,10 +171,10 @@ Bool MouseRst()
KbdCmdSend(KBD_CTRL,0xAE); //Enable Keyboard
catch
Fs->catch_except=TRUE;
if (mouse.has_wheel || mouse.has_ext_buttons)
mouse.pkt_size=4;
if (ms_hard.has_wheel || ms_hard.has_ext_bttns)
ms_hard.pkt_size=4;
else
mouse.pkt_size=3;
ms_hard.pkt_size=3;
if (!res)
try
KbdCmdSend(KBD_CTRL,0xA7); //Disable Mouse
@@ -106,147 +183,147 @@ Bool MouseRst()
return res;
}
U0 MouseSpeedSet()
U0 MsHardSpeedSet()
{
I64 dd,tmp;
if ((dd=SqrI64(mouse_last.pos.x-mouse.pos.x)
+SqrI64(mouse_last.pos.y-mouse.pos.y)) &&
(tmp=mouse.timestamp-mouse_last.timestamp))
mouse.speed=Sqrt(dd)*cnts.time_stamp_freq/tmp;
mouse_last.timestamp=mouse.timestamp;
if ((dd=SqrI64(ms_hard_last.pos.x-ms_hard.pos.x)
+SqrI64(ms_hard_last.pos.y-ms_hard.pos.y)) &&
(tmp=ms_hard.timestamp-ms_hard_last.timestamp))
ms_hard.speed=Sqrt(dd)*cnts.time_stamp_freq/tmp;
ms_hard_last.timestamp=ms_hard.timestamp;
}
U0 MouseUpdatePre()
U0 MsHardSetPre()
{
I64 old_timestamp=mouse_last.timestamp;
MemCpy(&mouse_last,&mouse,sizeof(CMouseStateGlbls));
mouse_last.timestamp=old_timestamp;
I64 old_timestamp=ms_hard_last.timestamp;
MemCpy(&ms_hard_last,&ms_hard,sizeof(CMsHardStateGlbls));
ms_hard_last.timestamp=old_timestamp;
}
U0 MouseUpdatePost()
U0 MsHardSetPost()
{
I64 i;
mouse.pos.x=mouse.prescale.x*mouse.scale.x*ip_grid.x_speed;
mouse.pos.y=mouse.prescale.y*mouse.scale.y*ip_grid.y_speed;
mouse.pos.z=mouse.prescale.z*mouse.scale.z*ip_grid.z_speed;
ms_hard.pos.x=ms_hard.prescale.x*ms_hard.scale.x*ms_grid.x_speed;
ms_hard.pos.y=ms_hard.prescale.y*ms_hard.scale.y*ms_grid.y_speed;
ms_hard.pos.z=ms_hard.prescale.z*ms_hard.scale.z*ms_grid.z_speed;
i=Trunc(ip.scale.x*mouse.pos.x/ip_grid.x)*ip_grid.x+ip.offset.x;
//TODO ip_grid.x_offset?
i=Trunc(ms.scale.x*ms_hard.pos.x/ms_grid.x)*ms_grid.x+ms.offset.x;
//TODO ms_grid.x_offset?
if (i<0)
ip.offset.x-=i;
ms.offset.x-=i;
else if (i>=GR_WIDTH)
ip.offset.x+=GR_WIDTH-1-i;
ms.offset.x+=GR_WIDTH-1-i;
i=Trunc(ip.scale.y*mouse.pos.y/ip_grid.y)*ip_grid.y+ip.offset.y;
i=Trunc(ms.scale.y*ms_hard.pos.y/ms_grid.y)*ms_grid.y+ms.offset.y;
if (i<0)
ip.offset.y-=i;
ms.offset.y-=i;
else if (i>=GR_HEIGHT)
ip.offset.y+=GR_HEIGHT-1-i;
ms.offset.y+=GR_HEIGHT-1-i;
if (mouse.pos.x!=mouse_last.pos.x || mouse.pos.y!=mouse_last.pos.y ||
mouse.pos.z!=mouse_last.pos.z) {
mouse.evt=TRUE;
MouseSpeedSet;
if (ms_hard.pos.x!=ms_hard_last.pos.x || ms_hard.pos.y!=ms_hard_last.pos.y ||
ms_hard.pos.z!=ms_hard_last.pos.z) {
ms_hard.evt=TRUE;
MsHardSpeedSet;
} else
for (i=0;i<5;i++)
if (mouse.buttons[i]!=mouse_last.buttons[i]) {
mouse.evt=TRUE;
if (ms_hard.bttns[i]!=ms_hard_last.bttns[i]) {
ms_hard.evt=TRUE;
break;
}
}
U0 MouseHandler()
U0 MsHardHndlr()
{
I64 i,dx,dy,dz;
U8 mouse_buf[4];
U8 ms_buf[4];
MouseUpdatePre;
MsHardSetPre;
for (i=0;i<4;i++)
mouse_buf[i]=0;
for (i=0;i<mouse.pkt_size;i++)
if (!FifoU8Rem(mouse.fifo2,&mouse_buf[i]))
mouse_buf[i]=0;
ms_buf[i]=0;
for (i=0;i<ms_hard.pkt_size;i++)
if (!FifoU8Rem(ms_hard.fifo2,&ms_buf[i]))
ms_buf[i]=0;
mouse.buttons[0] = mouse_buf[0] & 1;
mouse.buttons[1] = (mouse_buf[0] & 2) >> 1;
mouse.buttons[2] = (mouse_buf[0] & 4) >> 2;
mouse.buttons[3] = (mouse_buf[3] & 0x10) >> 4;
mouse.buttons[4] = (mouse_buf[3] & 0x20) >> 5;
if (mouse_buf[0] & 0x10)
dx=mouse_buf[1]-256;
ms_hard.bttns[0] = ms_buf[0] & 1;
ms_hard.bttns[1] = (ms_buf[0] & 2) >> 1;
ms_hard.bttns[2] = (ms_buf[0] & 4) >> 2;
ms_hard.bttns[3] = (ms_buf[3] & 0x10) >> 4;
ms_hard.bttns[4] = (ms_buf[3] & 0x20) >> 5;
if (ms_buf[0] & 0x10)
dx=ms_buf[1]-256;
else
dx=mouse_buf[1];
if (mouse_buf[0] & 0x20)
dy=256-mouse_buf[2];
dx=ms_buf[1];
if (ms_buf[0] & 0x20)
dy=256-ms_buf[2];
else
dy=-mouse_buf[2];
if (mouse_buf[3] & 0x08)
dz=mouse_buf[3]&7-8;
dy=-ms_buf[2];
if (ms_buf[3] & 0x08)
dz=ms_buf[3]&7-8;
else
dz=mouse_buf[3]&7;
dz=ms_buf[3]&7;
mouse.prescale.x+=dx;
mouse.prescale.y+=dy;
mouse.prescale.z+=dz;
ms_hard.prescale.x+=dx;
ms_hard.prescale.y+=dy;
ms_hard.prescale.z+=dz;
MouseUpdatePost;
MsHardSetPost;
}
U0 MouseIPSet(I64 x,I64 y,I64 z,I64 l,I64 r)
U0 MsHardSet(I64 x,I64 y,I64 z,I64 l,I64 r)
{
mouse.timestamp=GetTSC;
MouseUpdatePre;
mouse.prescale.x=x/mouse.scale.x/ip_grid.x_speed;
mouse.prescale.y=y/mouse.scale.y/ip_grid.y_speed;
mouse.prescale.z=z/mouse.scale.z/ip_grid.z_speed;
mouse.buttons[0]=l;
mouse.buttons[1]=r;
MouseUpdatePost;
ms_hard.timestamp=GetTSC;
MsHardSetPre;
ms_hard.prescale.x=x/ms_hard.scale.x/ms_grid.x_speed;
ms_hard.prescale.y=y/ms_hard.scale.y/ms_grid.y_speed;
ms_hard.prescale.z=z/ms_hard.scale.z/ms_grid.z_speed;
ms_hard.bttns[0]=l;
ms_hard.bttns[1]=r;
MsHardSetPost;
}
U0 KbdMouseRst()
U0 KbdMsRst()
{
KbdCmdFlush;
FifoU8Flush(kbd.fifo2);
FifoU8Flush(mouse.fifo2);
FifoU8Flush(ms_hard.fifo2);
FifoI64Flush(kbd.scan_code_fifo);
kbd.scan_code=0;
kbd.rst=FALSE;
}
Bool MouseDriverInstall(I64 dummy=0) //can be spawned
Bool MsHardDrvrInstall(I64 dummy=0) //can be spawned
{
no_warn dummy;
I64 i;
mouse.install_in_progress=TRUE;
ms_hard.install_in_progress=TRUE;
OutU8(0xA1,InU8(0xA1)|0x10);
mouse.installed=mouse.irqs_working=FALSE;
IntEntrySet(0x2C,&IRQMouse);
ms_hard.installed=ms_hard.irqs_working=FALSE;
IntEntrySet(0x2C,&IRQMsHard);
for(i=0;i<5;i++)
mouse.buttons[i]=0;
if (i=MouseRst)
ms_hard.bttns[i]=0;
if (i=MsHardRst)
OutU8(0xA1,InU8(0xA1)&~0x10);
KbdMouseRst;
mouse.install_attempts++;
mouse.installed=mouse.evt=i;
mouse.install_in_progress=FALSE;
return mouse.installed;
KbdMsRst;
ms_hard.install_attempts++;
ms_hard.installed=ms_hard.evt=i;
ms_hard.install_in_progress=FALSE;
return ms_hard.installed;
}
U0 KbdMouseHandler(Bool poll_kbd,Bool poll_mouse)
U0 KbdMsHndlr(Bool poll_kbd,Bool poll_ms)
{
if (mouse.install_in_progress) {
if (ms_hard.install_in_progress) {
Yield;
return;
}
if (kbd.rst)
KbdMouseRst;
KbdMsRst;
else {
if (poll_mouse && mouse.installed && !mouse.irqs_working) {
if (poll_ms && ms_hard.installed && !ms_hard.irqs_working) {
PUSHFD
CLI
while (InU8(KBD_CTRL)&1)
MousePktRead;
MsHardPktRead;
POPFD
}
@@ -255,36 +332,36 @@ U0 KbdMouseHandler(Bool poll_kbd,Bool poll_mouse)
KbdPktRead;
if (kbd.rst)
KbdMouseRst;
KbdMsRst;
else {
while (FifoU8Cnt(kbd.fifo2))
KbdHandler;
while (FifoU8Cnt(mouse.fifo2))
if (mouse.installed)
MouseHandler;
KbdHndlr;
while (FifoU8Cnt(ms_hard.fifo2))
if (ms_hard.installed)
MsHardHndlr;
else
KbdMouseRst;
KbdMsRst;
}
}
}
U0 KbdMouseVarsInit()
U0 KbdMsInit()
{
MemSet(&kbd,0,sizeof(CKbdStateGlbls));
kbd.fifo=FifoU8New(8);
kbd.fifo2=FifoU8New(64);
kbd.scan_code_fifo=FifoI64New(128);
kbd.irqs_working=FALSE;
MemSet(&mouse,0,sizeof(CMouseStateGlbls));
mouse.fifo=FifoU8New(8);
mouse.fifo2=FifoU8New(64);
mouse.scale.x=0.5;
mouse.scale.y=0.5;
mouse.scale.z=1.0;
mouse.prescale.x=GR_WIDTH/mouse.scale.x/2.0;
mouse.prescale.y=GR_HEIGHT/mouse.scale.y/2.0;
mouse.prescale.z=0/mouse.scale.z;
mouse.pos.x=GR_WIDTH>>1;
mouse.pos.y=GR_HEIGHT>>1;
MemCpy(&mouse_last,&mouse,sizeof(CMouseStateGlbls));
MemSet(&ms_hard,0,sizeof(CMsHardStateGlbls));
ms_hard.fifo=FifoU8New(8);
ms_hard.fifo2=FifoU8New(64);
ms_hard.scale.x=0.5;
ms_hard.scale.y=0.5;
ms_hard.scale.z=1.0;
ms_hard.prescale.x=GR_WIDTH/ms_hard.scale.x/2.0;
ms_hard.prescale.y=GR_HEIGHT/ms_hard.scale.y/2.0;
ms_hard.prescale.z=0/ms_hard.scale.z;
ms_hard.pos.x=GR_WIDTH>>1;
ms_hard.pos.y=GR_HEIGHT>>1;
MemCpy(&ms_hard_last,&ms_hard,sizeof(CMsHardStateGlbls));
}
+29 -34
View File
@@ -322,78 +322,73 @@ _extern _STRCPY U0 StrCpy(
//These bitmaps go to 0-511 so that $LK,"Lex",A="MN:Lex"$() can use them with $LK,"Token Codes",A="MN:TK_EOF"$.
U32
chars_bmp_alpha[16]=
char_bmp_alpha[16]=
{0x0000000,0x00000000,0x87FFFFFF,0x07FFFFFE,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},
chars_bmp_alpha_numeric[16]=
char_bmp_alpha_numeric[16]=
{0x0000000,0x03FF0000,0x87FFFFFF,0x07FFFFFE,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},
chars_bmp_alpha_numeric_no_at[16]=
char_bmp_alpha_numeric_no_at[16]=
{0x0000000,0x03FF0000,0x87FFFFFE,0x07FFFFFE,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},
chars_bmp_word[16]=
char_bmp_word[16]=
{0x0000000,0x03FF0080,0x87FFFFFE,0x07FFFFFE,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},
chars_bmp_filename[16]=
char_bmp_filename[16]=
{0x0000000,0x03FF73FB,0xEFFFFFFF,0x6FFFFFFF,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},
chars_bmp_dec_numeric[16]=
char_bmp_dec_numeric[16]=
{0x0000000,0x03FF0000,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
chars_bmp_hex_numeric[16]=
char_bmp_hex_numeric[16]=
{0x0000000,0x03FF0000,0x7E,0x7E,0,0,0,0,0,0,0,0,0,0,0,0},
chars_bmp_white_space[16]=
{0x80003600,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
char_bmp_white_space[16]=
{0x80002600,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
chars_bmp_non_eol_white_space[16]=
{0x80001200,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
char_bmp_non_eol_white_space[16]=
{0x80000200,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
chars_bmp_zero_cr_nl_cursor[16]=
char_bmp_zero_cr_nl_cursor[16]=
{0x00002421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
chars_bmp_zero_tab_ff_cr_nl_cursor[16]=
{0x00003621,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
char_bmp_zero_tab_cr_nl_cursor[16]=
{0x00002621,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
chars_bmp_zero_tab_ff_cr_nl_cursor_dollar[16]=
{0x00003621,0x10,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
char_bmp_zero_tab_cr_nl_cursor_dollar[16]=
{0x00002621,0x10,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
chars_bmp_getkey[16]=
{0x80002600,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},
chars_bmp_macro[16]=
char_bmp_macro[16]=
{0x80002600,0xFFFFFFDF,0xFFFFFFFF,0x7FFFFFFF,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},
chars_bmp_printable[16]=
{0x80003600,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF,
char_bmp_printable[16]=
{0x80002600,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},
chars_bmp_displayable[16]=
char_bmp_displayable[16]=
{0x80000000,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},
chars_bmp_safe_dollar[16]=
char_bmp_safe_dollar[16]=
{0x80000000,0xFFFFFFEF,0xFFFFFFFF,0x7FFFFFFF,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0,0,0,0,0,0,0,0},//same but no dollar sign
chars_bmp_non_eol[16]=
char_bmp_non_eol[16]=
{0xFFFFDBFE,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
@@ -527,14 +522,14 @@ U8 *StrUtil(U8 *_src,I64 flags)
I64 ch;
if (flags & SUF_REM_LEADING)
while (Bt(chars_bmp_white_space,*src))
while (Bt(char_bmp_white_space,*src))
src++;
while (ch=*src++)
if (Bt(chars_bmp_white_space,ch)) {
if (Bt(char_bmp_white_space,ch)) {
if (!(flags & SUF_REM_SPACES)) {
if (flags & SUF_SINGLE_SPACE) {
*dst++ = CH_SPACE;
while ((ch=*src++) && Bt(chars_bmp_white_space,ch));
while ((ch=*src++) && Bt(char_bmp_white_space,ch));
src--;
} else
*dst++ = ch;
@@ -544,7 +539,7 @@ U8 *StrUtil(U8 *_src,I64 flags)
*dst=0;
if (flags & SUF_REM_TRAILING)
while (dst!=_src && (!*dst || Bt(chars_bmp_white_space,*dst)))
while (dst!=_src && (!*dst || Bt(char_bmp_white_space,*dst)))
*dst-- =0;
if (flags & SUF_TO_UPPER)
for (dst=_src;*dst;dst++) {
@@ -561,7 +556,7 @@ U8 *StrUtil(U8 *_src,I64 flags)
if (flags & SUF_SAFE_DOLLAR)
for (dst=_src;*dst;dst++) {
ch=*dst;
if (!Bt(chars_bmp_safe_dollar,*dst))
if (!Bt(char_bmp_safe_dollar,*dst))
*dst='.';
}
if (flags & SUF_S2T)
@@ -634,7 +629,7 @@ U8 *StrFind(U8 *needle,U8 *haystack_str,I64 flags=0)
haystack_str=StrMatch(needle,haystack_str);
if (haystack_str && flags & SFF_WHOLE_LABELS_BEFORE &&
haystack_str!=saved_haystack_str &&
Bt(chars_bmp_alpha_numeric,*(haystack_str-1))) {
Bt(char_bmp_alpha_numeric,*(haystack_str-1))) {
haystack_str++;
if (*haystack_str)
cont=TRUE;
@@ -642,7 +637,7 @@ U8 *StrFind(U8 *needle,U8 *haystack_str,I64 flags=0)
haystack_str=NULL;
}
if (haystack_str && flags & SFF_WHOLE_LABELS_AFTER &&
Bt(chars_bmp_alpha_numeric,*(haystack_str+plen))) {
Bt(char_bmp_alpha_numeric,*(haystack_str+plen))) {
haystack_str++;
if (*haystack_str)
cont=TRUE;
+1 -1
View File
@@ -162,7 +162,7 @@ U8 *MPrintq(U8 *ptr,I64 flags)
ptr++;
for (j=0;j<2;j++) {
ch1=ToUpper(*ptr++);
if (Bt(chars_bmp_hex_numeric,ch1)) {
if (Bt(char_bmp_hex_numeric,ch1)) {
if (ch1<='9')
i=i<<4+ch1-'0';
else
+5 -5
View File
@@ -8,7 +8,7 @@ I64 Str2I64(U8 *st,I64 radix=10,U8 **_end_ptr=NULL)
if (_end_ptr) *_end_ptr=st;
return 0;
}
while (Bt(chars_bmp_white_space,*st))
while (Bt(char_bmp_white_space,*st))
st++;
while (TRUE)
switch (*st) {
@@ -66,7 +66,7 @@ to avoid this.
Bool neg=FALSE,neg_e=FALSE;
ch=*src++;
while (Bt(chars_bmp_white_space,ch))
while (Bt(char_bmp_white_space,ch))
ch=*src++;
if (ch=='-') {
neg=TRUE;
@@ -84,7 +84,7 @@ to avoid this.
}
i=0;
while (TRUE) {
if (Bt(chars_bmp_dec_numeric,ch))
if (Bt(char_bmp_dec_numeric,ch))
i=i*10+ch-'0';
else {
if (ch=='.' || ch=='e' || ch=='E')
@@ -98,7 +98,7 @@ to avoid this.
ch=*src++;
k=0;
while (TRUE) {
if (Bt(chars_bmp_dec_numeric,ch)) {
if (Bt(char_bmp_dec_numeric,ch)) {
i=i*10+ch-'0';
k++;
} else {
@@ -116,7 +116,7 @@ to avoid this.
}
j=0;
while (TRUE) {
if (Bt(chars_bmp_dec_numeric,ch))
if (Bt(char_bmp_dec_numeric,ch))
j=j*10+ch-'0';
else {
if (neg_e)