TempleOSCDV5.00.ISO
This commit is contained in:
1 parent
122df6338e
commit
f6eacf7744
374 files changed
+11078
-11204
No files matched your search
+22
-19
@@ -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,
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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)];
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -50,7 +50,7 @@
|
||||
#include "SerialDev/MakeSerialDev"
|
||||
#include "QSort"
|
||||
#include "KTask"
|
||||
#include "SrvCmd"
|
||||
#include "Job"
|
||||
#include "PCIBIOS"
|
||||
#include "MultiProc"
|
||||
#include "EdLite"
|
||||
|
||||
+239
-259
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
@@ -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
@@ -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,6 +1,6 @@
|
||||
#exe {Cd(__DIR__);};
|
||||
#include "PageTables"
|
||||
#include "Mem512"
|
||||
#include "MemPag"
|
||||
#include "BlkPool"
|
||||
#include "MAllocFree"
|
||||
#include "HeapCtrl"
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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,5 +1,4 @@
|
||||
#exe {Cd(__DIR__);};
|
||||
#include "InputPointer"
|
||||
#include "Keyboard"
|
||||
#include "Mouse"
|
||||
#include "Message"
|
||||
|
||||
+28
-28
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user