TempleOSCDV3.11.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:46:29 +02:00
1 parent f8c05f98f4
commit ed64d7e3b8
549 files changed
+10643 -12855

No files matched your search

@@ -366,7 +366,7 @@ U0 ATAReadBlks(CBlkDev *bd,U8 *buf, I64 blk, I64 cnt)
throw('BlkDev');
}
dsk.read_cnt+=(cnt*bd->blk_size)>>BLK_SIZE_BITS;
blkdev.read_cnt+=(cnt*bd->blk_size)>>BLK_SIZE_BITS;
if (unlock) BlkDevUnlock(bd);
}
@@ -378,7 +378,7 @@ I64 ATAProbe(I64 base0,I64 base1,I64 unit)
bd.base0=base0;
bd.base1=base1;
bd.unit=unit;
bd.blk_size=CD_BLK_SIZE;
bd.blk_size=DVD_BLK_SIZE;
return ATAGetDevId(&bd,tS+0.1,NULL);
}
@@ -401,7 +401,7 @@ Bool ATAPIReadBlks2(CBlkDev *bd,F64 timeout,U8 *buf,
if (ATAPIWritePktWord(bd,timeout,0xA800,
native_blk.u16[1],native_blk,cnt.u16[1],cnt,0) &&
ATAGetResult(bd,timeout,buf,cnt*bd->blk_size,0,FALSE)) {
dsk.read_cnt+=(cnt*bd->blk_size)>>BLK_SIZE_BITS;
blkdev.read_cnt+=(cnt*bd->blk_size)>>BLK_SIZE_BITS;
result=TRUE;
}
}
@@ -415,7 +415,7 @@ U0 ATAPIReadBlks(CBlkDev *bd,U8 *buf, I64 blk, I64 cnt)
CDrv *dv=Let2Drv(bd->first_drv_let);
I64 retry,spc=bd->blk_size>>BLK_SIZE_BITS,n,blk2,
l2=bd->max_reads<<1+spc<<1;
U8 *cd_buf=MAlloc(l2<<BLK_SIZE_BITS);
U8 *dvd_buf=MAlloc(l2<<BLK_SIZE_BITS);
if (cnt>0) {
if (blk<=bd->max_reads)
blk2=0;
@@ -427,16 +427,16 @@ U0 ATAPIReadBlks(CBlkDev *bd,U8 *buf, I64 blk, I64 cnt)
retry=4;
while (--retry)
if (ATAPIReadBlks2(bd,tS+7.0+0.004*n,cd_buf,blk2/spc,n,TRUE))
if (ATAPIReadBlks2(bd,tS+7.0+0.004*n,dvd_buf,blk2/spc,n,TRUE))
//n is 0x800 if max_reads. Up to 8 additional seconds
break;
if (!retry)
ATAPIReadBlks2(bd,0,cd_buf,blk2/spc,n,TRUE);
ATAPIReadBlks2(bd,0,dvd_buf,blk2/spc,n,TRUE);
if (bd->flags & BDF_READ_CACHE)
DskCacheAdd(dv,cd_buf,blk2,n*spc);
MemCpy(buf,cd_buf+(blk-blk2)<<BLK_SIZE_BITS,cnt<<BLK_SIZE_BITS);
DskCacheAdd(dv,dvd_buf,blk2,n*spc);
MemCpy(buf,dvd_buf+(blk-blk2)<<BLK_SIZE_BITS,cnt<<BLK_SIZE_BITS);
}
Free(cd_buf);
Free(dvd_buf);
}
Bool ATARBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt)
@@ -570,7 +570,7 @@ U0 ATAPIWriteBlks(CBlkDev *bd,U8 *buf, I64 native_blk, I64 cnt)
if (U32s_avail) {
RepOutU32(buf,U32s_avail,bd->base0+ATAR0_DATA);
buf+=U32s_avail<<2;
dsk.write_cnt+=U32s_avail>>(BLK_SIZE_BITS-2);
blkdev.write_cnt+=U32s_avail>>(BLK_SIZE_BITS-2);
}
}
ATAWaitNotBUSY(bd,0);
@@ -597,7 +597,7 @@ Bool ATAWBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt)
buf+=n<<BLK_SIZE_BITS;
blk+=n;
cnt-=n;
dsk.write_cnt+=n;
blkdev.write_cnt+=n;
}
if (bd->type==BDT_ATAPI) {
ATAPISync(bd);
@@ -1,6 +1,6 @@
Bool BootCdProbe(CBlkDev *bd)
Bool BootDVDProve(CBlkDev *bd)
{
CKernel *img=CAlloc(CD_BLK_SIZE);
CKernel *img=CAlloc(DVD_BLK_SIZE);
I64 i;
Bool result=FALSE;
"Port: %04X,%04X Unit: %02X ",bd->base0,bd->base1,bd->unit;
@@ -25,7 +25,7 @@ Bool BootCdProbe(CBlkDev *bd)
return result;
}
Bool BootCdProbeAll(CBlkDev *bd)
Bool BootDVDProbeAll(CBlkDev *bd)
{
I64 d1,d2,i,j,k;
@@ -42,10 +42,10 @@ Bool BootCdProbeAll(CBlkDev *bd)
if (d1&1 && d2&1) {
if (bd->base0=d1&~7) {
bd->unit=0;
if (BootCdProbe(bd))
if (BootDVDProve(bd))
return TRUE;
bd->unit=1;
if (BootCdProbe(bd))
if (BootDVDProve(bd))
return TRUE;
}
}
@@ -54,10 +54,10 @@ Bool BootCdProbeAll(CBlkDev *bd)
if (d1&1 && d2&1) {
if (bd->base0=d1&~7) {
bd->unit=0;
if (BootCdProbe(bd))
if (BootDVDProve(bd))
return TRUE;
bd->unit=1;
if (BootCdProbe(bd))
if (BootDVDProve(bd))
return TRUE;
}
}
@@ -68,10 +68,10 @@ Bool BootCdProbeAll(CBlkDev *bd)
d2=0x3F6;
if (bd->base0=d1&~7) {
bd->unit=0;
if (BootCdProbe(bd))
if (BootDVDProve(bd))
return TRUE;
bd->unit=1;
if (BootCdProbe(bd))
if (BootDVDProve(bd))
return TRUE;
}
@@ -79,10 +79,10 @@ Bool BootCdProbeAll(CBlkDev *bd)
d2=0x376;
if (bd->base0=d1&~7) {
bd->unit=0;
if (BootCdProbe(bd))
if (BootDVDProve(bd))
return TRUE;
bd->unit=1;
if (BootCdProbe(bd))
if (BootDVDProve(bd))
return TRUE;
}
}
@@ -131,18 +131,15 @@ public I64 ATARep(Bool pmt=TRUE,Bool just_ide=FALSE,CATARep **_root=NULL)
{//Report possible ATA devices by probing. Hard disks and CD/DVDs.
I64 d1,d2,d3,i,j,k,cnt=0,unlock_flags=0,num_hints=0;
#assert NUM_BLKDEVS<=64
Bool old_preempt;
if (_root) *_root=NULL;
if (pmt && ATARepExitAllApplications)
return 0;
old_preempt=Preempt;
for (i=0;i<NUM_BLKDEVS;i++)
if (dsk.blkdevs[i].bd_signature==BD_SIGNATURE_VAL)
if (blkdev.blkdevs[i].bd_signature==BD_SIGNATURE_VAL)
BEqu(&unlock_flags,i,
BlkDevLock(&dsk.blkdevs[i]));
BlkDevLock(&blkdev.blkdevs[i]));
if (!just_ide)
for (k=0;k<256;k++) {
@@ -190,14 +187,13 @@ public I64 ATARep(Bool pmt=TRUE,Bool just_ide=FALSE,CATARep **_root=NULL)
'\n\n';
for (i=0;i<NUM_BLKDEVS;i++)
if (Bt(&unlock_flags,i))
BlkDevUnlock(&dsk.blkdevs[i]);
Preempt(old_preempt);
BlkDevUnlock(&blkdev.blkdevs[i]);
return num_hints;
}
CATARep *ATAIDDrvs(CATARep *root,I64 _sys_boot_drv,
CATARep **_ata_drv,CATARep **_atapi_drv)
{//This is for when trying to sort-out main hard drives and CD-ROM drives.
{//This is for when trying to sort-out main hard drives and CD/DVD drives.
CATARep *result=NULL,*tempha=root,*ata_drv=NULL,*atapi_drv=NULL;
CBlkDev *bd;
Bool was_silent=Silent;
@@ -257,27 +253,27 @@ I64 AutoMountIDE()
I64 result=0;
CATARep *root=NULL,*ata_drv=NULL,*atapi_drv=NULL,*tempha;
ATARep(FALSE,TRUE,&root);
ATAIDDrvs(root,dsk.boot_drv_let,&ata_drv,&atapi_drv);
if (ata_drv && ATAMount(dsk.first_hd_drv_let,BDT_ATA,
ATAIDDrvs(root,blkdev.boot_drv_let,&ata_drv,&atapi_drv);
if (ata_drv && ATAMount(blkdev.first_hd_drv_let,BDT_ATA,
ata_drv->base0,ata_drv->base1,ata_drv->unit))
result++;
if (atapi_drv && ATAMount(dsk.first_cd_drv_let,BDT_ATAPI,
if (atapi_drv && ATAMount(blkdev.first_dvd_drv_let,BDT_ATAPI,
atapi_drv->base0,atapi_drv->base1,atapi_drv->unit))
result++;
tempha=root;
while (tempha) {
if (tempha!=ata_drv && tempha!=atapi_drv) {
if (tempha->type==BDT_ATA && ATAMount(dsk.first_hd_drv_let,BDT_ATA,
if (tempha->type==BDT_ATA && ATAMount(blkdev.first_hd_drv_let,BDT_ATA,
tempha->base0,tempha->base1,tempha->unit))
result++;
else if (tempha->type==BDT_ATAPI &&
ATAMount(dsk.first_cd_drv_let,BDT_ATAPI,
ATAMount(blkdev.first_dvd_drv_let,BDT_ATAPI,
tempha->base0,tempha->base1,tempha->unit))
result++;
}
tempha=tempha->next;
}
LinkedLstDel(root);
dsk.auto_mount_ide_cnt=result;
blkdev.auto_mount_ide_cnt=result;
return result;
}
@@ -8,7 +8,7 @@ U0 BlkDevLockFwdingSet(CBlkDev *bd)
case BDT_ATA:
case BDT_ATAPI:
for (i=0;i<NUM_BLKDEVS;i++) {
bd1=&dsk.blkdevs[i];
bd1=&blkdev.blkdevs[i];
if (bd1->bd_signature==BD_SIGNATURE_VAL && bd!=bd1 &&
(bd1->type==BDT_ATAPI || bd1->type==BDT_ATA) &&
bd1->base0==bd->base0) {
@@ -191,7 +191,7 @@ U0 Mount(Bool repartition=FALSE)
'\n';
if (0<=first_drv_num<NUM_DRVS) {
"\t$$PURPLE$$1$$FG$$=RAM\n\t$$PURPLE$$2$$FG$$=ATA(Harddisk)\n"
"\t$$PURPLE$$3$$FG$$=ATAPI(CD-ROM)\nType:";
"\t$$PURPLE$$3$$FG$$=ATAPI(CD/DVD)\nType:";
type=GetChar-'0';
'\n';
@@ -284,16 +284,16 @@ Bool GetBaseUnit(CBlkDev *bd)
else
StreamPrint("probe=TRUE;");
};
if (!probe || !BootCdProbeAll(bd)) {
if (!probe || !BootDVDProbeAll(bd)) {
"\nDon't worry. This is not a product\n"
"registration. TempleOS just needs the\n"
"I/O port numbers for the CD-ROM.\n"
"I/O port numbers for the CD/DVD.\n"
"\nRetry the ports above or check Windows\n"
"system information under I/O ports for\n"
"'IDE', 'ATA' or 'SATA'.\n"
"In Linux, use 'lspci -v' for ports.\n"
"\n\nEnter 4-digit hex I/O Port number.\n"
"CD-ROM I/O Port Base0: 0x";
"CD/DVD I/O Port Base0: 0x";
bd->base0=SysGetI64;
bd->base1=0;
bd->unit =0;
@@ -303,10 +303,10 @@ Bool GetBaseUnit(CBlkDev *bd)
while (!('0'<=ch<='1'));
'' ch;
bd->unit=ch-'0';
dsk.cdrom_boot_is_good=BootCdProbe(bd);
blkdev.dvd_boot_is_good=BootDVDProve(bd);
return TRUE;
} else {
dsk.cdrom_boot_is_good=FALSE;
blkdev.dvd_boot_is_good=FALSE;
return FALSE;
}
}
@@ -317,17 +317,17 @@ U0 BlkDevsInitAll()
{
CBlkDev *bd;
I64 i;
dsk.blkdevs=CAlloc(sizeof(CBlkDev)*NUM_BLKDEVS);
dsk.drvs=CAlloc(sizeof(CDrv)*NUM_DRVS);
blkdev.blkdevs=CAlloc(sizeof(CBlkDev)*NUM_BLKDEVS);
blkdev.drvs=CAlloc(sizeof(CDrv)*NUM_DRVS);
for (i=0;i<NUM_DRVS;i++)
dsk.let_to_drv[i]=&dsk.drvs[i];
blkdev.let_to_drv[i]=&blkdev.drvs[i];
text.raw_col=0;
#exe {
if (kernel_cfg->opts[CFG_AUTO_MOUNT_IDE])
StreamPrint("AutoMountIDE;");
StreamPrint("#exe {OptOff(OPTf_WARN_PAREN);}");
StreamPrint("#exe {Option(OPTf_WARN_PAREN,OFF);}");
StreamDoc(kernel_cfg->add_dev);
StreamPrint("#exe {OptOn(OPTf_WARN_PAREN);}");
StreamPrint("#exe {Option(OPTf_WARN_PAREN,ON);}");
};
DrvRep;
}
File renamed without changes.
@@ -31,8 +31,7 @@ Bool BlkDevUnlock(CBlkDev *bd,Bool rst=FALSE)
Bool BlkDevInit(CBlkDev *bd)
{
CDrv *dv=Let2Drv(bd->first_drv_let);
Bool old_preempt=Preempt,result=FALSE;
Bool result=FALSE;
if (!LBts(&bd->flags,BDf_INITIALIZED)) {
bd->flags|=BDF_INIT_IN_PROGRESS;
switch(bd->type) {
@@ -58,8 +57,8 @@ Bool BlkDevInit(CBlkDev *bd)
//0xFFFF*4 is too big for my taste
bd->max_reads=0x800*4;
//max of maybe a quarter of disk cache
if (bd->max_reads>dsk.cache_size/BLK_SIZE/4)
bd->max_reads=dsk.cache_size/BLK_SIZE/4 & ~3;
if (bd->max_reads>blkdev.cache_size/BLK_SIZE/4)
bd->max_reads=blkdev.cache_size/BLK_SIZE/4 & ~3;
if (bd->max_reads<128)
bd->max_reads=128;
bd->max_writes=0xFFFF*4;
@@ -72,7 +71,6 @@ Bool BlkDevInit(CBlkDev *bd)
bd->flags&=~BDF_INIT_IN_PROGRESS;
} else
result=TRUE;
Preempt(old_preempt);
return result;
}
@@ -81,7 +79,7 @@ U0 BlkDevsRelease()
I64 i;
CBlkDev *bd;
for (i=0;i<NUM_BLKDEVS;i++) {
bd=&dsk.blkdevs[i];
bd=&blkdev.blkdevs[i];
if (bd->owning_task==Fs && bd->bd_signature==BD_SIGNATURE_VAL)
BlkDevUnlock(bd,TRUE);
}
@@ -92,7 +90,7 @@ CBlkDev *BlkDevNextFree(U8 first_drv_let,I64 type)
I64 i=0;
CBlkDev *result;
do {
result=&dsk.blkdevs[i];
result=&blkdev.blkdevs[i];
if (result->bd_signature!=BD_SIGNATURE_VAL) {
MemSet(result,0,sizeof(CBlkDev));
result->first_drv_let=first_drv_let;
@@ -105,7 +103,7 @@ CBlkDev *BlkDevNextFree(U8 first_drv_let,I64 type)
result->flags|=BDF_READ_CACHE;
if (type==BDT_ATAPI) {
result->blk_size=CD_BLK_SIZE;
result->blk_size=DVD_BLK_SIZE;
result->flags|=BDF_READ_ONLY;
} else
result->blk_size=BLK_SIZE;
@@ -1,7 +1,7 @@
U0 CDImageRead(U8 cd_drv_let,U8 *out_name)
U0 DVDImageRead(U8 dvd_drv_let,U8 *out_name)
{//Read entire CD/DVD image into ISO file.
CBlkDev *bd=Let2BlkDev(cd_drv_let);
CDrv *dv=Let2Drv(cd_drv_let);
CBlkDev *bd=Let2BlkDev(dvd_drv_let);
CDrv *dv=Let2Drv(dvd_drv_let);
U8 *buf=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS),
*out_name2=DftExt(out_name,"ISO");
CFile *f=FOpen(out_name2,"w");
@@ -10,7 +10,7 @@ U0 CDImageRead(U8 cd_drv_let,U8 *out_name)
if (bd->type!=BDT_ATAPI)
throw('BlkDev');
if (!out_name)
out_name=dsk.dft_iso_filename;
out_name=blkdev.dft_iso_filename;
cnt=CeilU64(dv->size,spc);
while (cnt>0) {
if (cnt>COPY_BUF_BLKS)
@@ -43,15 +43,14 @@ class CDualBuf
U8 *buf0,*buf1;
I64 in_buf,out_buf,cnt;
U8 *filename;
CBlkDev *cd_bd;
CBlkDev *dvd_bd;
};
U0 CDImageWriteTask(CDualBuf *d)
U0 DVDImageWriteTask(CDualBuf *d)
{
U8 *buf;
I64 n,blk=0,cnt=d->cnt;
CFile *f;
Preempt(ON);
if (FileAttr(d->filename)&RS_ATTR_CONTIGUOUS)
f=FOpen(d->filename,"rc");
else
@@ -61,8 +60,8 @@ U0 CDImageWriteTask(CDualBuf *d)
n=COPY_BUF_BLKS;
else
n=cnt;
if (n>d->cd_bd->max_writes)
n=d->cd_bd->max_writes;
if (n>d->dvd_bd->max_writes)
n=d->dvd_bd->max_writes;
if (d->in_buf&1)
buf=d->buf1;
else
@@ -77,19 +76,18 @@ U0 CDImageWriteTask(CDualBuf *d)
FClose(f);
}
U0 CDImageWrite(U8 cd_drv_let,U8 *in_name=NULL,I64 media_type=MT_CD)
U0 DVDImageWrite(U8 dvd_drv_let,U8 *in_name=NULL,I64 media_type=MT_DVD)
{//Write CD/DVD ISO file to disk.
CDualBuf *d=CAlloc(sizeof(CDualBuf));
U8 *buf,*in_name2,*in_name3;
I64 i,n,spc,blk=0,cnt;
CDrv *dv=Let2Drv(cd_drv_let);
CDrv *dv=Let2Drv(dvd_drv_let);
CBlkDev *bd=dv->bd,*bd2;
CTask *task;
Bool old_preempt;
CFile *f;
if (!in_name)
in_name=dsk.dft_iso_filename;
in_name=blkdev.dft_iso_filename;
in_name3=DftExt(in_name,"ISO");
in_name2=FileNameAbs(in_name3);
f=FOpen(in_name2,"r");
@@ -106,7 +104,7 @@ U0 CDImageWrite(U8 cd_drv_let,U8 *in_name=NULL,I64 media_type=MT_CD)
bd2=bd2->lock_fwding; //If two blkdevs on same controller, use one lock
if ((bd2->type==BDT_ATA || bd2->type==BDT_ATAPI) &&
bd2->base0==bd->base0) {
"Can't Burn CD on same ATA ctrller as File.\n\n";
PrintErr("Can't burn CD/DVD on same ATA controller as file.\n\n");
throw('BlkDev');
}
@@ -117,14 +115,12 @@ U0 CDImageWrite(U8 cd_drv_let,U8 *in_name=NULL,I64 media_type=MT_CD)
dv->size=cnt;
d->filename=in_name2;
d->cd_bd=bd;
d->dvd_bd=bd;
d->buf0=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS);
d->buf1=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS);
d->cnt=cnt;
old_preempt=Preempt;
task=Spawn(&CDImageWriteTask,d,"Write CD");
task=Spawn(&DVDImageWriteTask,d,"Write CD/DVD");
while (d->in_buf<=d->out_buf)
Yield;
@@ -179,6 +175,5 @@ U0 CDImageWrite(U8 cd_drv_let,U8 *in_name=NULL,I64 media_type=MT_CD)
Free(d->buf1);
Free(in_name2);
Free(in_name3);
Preempt(old_preempt);
Free(d);
}
File renamed without changes.
@@ -5,31 +5,31 @@ U0 DskCacheInit(I64 size_in_U8s)
while (LBts(&sys_semas[SYS_SEMA_DSK_CACHE],0))
Yield;
Free(dsk.cache_ctrl);
Free(dsk.cache_base);
Free(dsk.cache_hash_table);
Free(blkdev.cache_ctrl);
Free(blkdev.cache_base);
Free(blkdev.cache_hash_table);
if (size_in_U8s<0x2000) {
dsk.cache_ctrl=NULL;
dsk.cache_base=NULL;
dsk.cache_hash_table=NULL;
blkdev.cache_ctrl=NULL;
blkdev.cache_base=NULL;
blkdev.cache_hash_table=NULL;
} else {
dsk.cache_ctrl=ACAlloc(offset(CCacheBlk.body));
dsk.cache_base=AMAlloc(size_in_U8s);
QueInit(dsk.cache_ctrl);
blkdev.cache_ctrl=ACAlloc(offset(CCacheBlk.body));
blkdev.cache_base=AMAlloc(size_in_U8s);
QueInit(blkdev.cache_ctrl);
cnt=MSize(dsk.cache_base)/sizeof(CCacheBlk);
dsk.cache_size=cnt*BLK_SIZE;
cnt=MSize(blkdev.cache_base)/sizeof(CCacheBlk);
blkdev.cache_size=cnt*BLK_SIZE;
for (i=0;i<cnt;i++) {
tempc=dsk.cache_base+i;
QueIns(tempc,dsk.cache_ctrl->last_lru);
tempc=blkdev.cache_base+i;
QueIns(tempc,blkdev.cache_ctrl->last_lru);
tempc->next_hash=tempc->last_hash=tempc;
tempc->dv=NULL;
tempc->blk=0;
}
dsk.cache_hash_table=AMAlloc(DSK_CACHE_HASH_SIZE*sizeof(U8 *)*2);
blkdev.cache_hash_table=AMAlloc(DSK_CACHE_HASH_SIZE*sizeof(U8 *)*2);
for (i=0;i<DSK_CACHE_HASH_SIZE;i++) {
tempc=dsk.cache_hash_table(U8 *)+i*sizeof(U8 *)*2
tempc=blkdev.cache_hash_table(U8 *)+i*sizeof(U8 *)*2
-offset(CCacheBlk.next_hash);
tempc->next_hash=tempc->last_hash=tempc;
}
@@ -40,7 +40,7 @@ U0 DskCacheInit(I64 size_in_U8s)
I64 DskCacheHash(I64 blk)
{
I64 i=blk & (DSK_CACHE_HASH_SIZE-1);
return dsk.cache_hash_table(U8 *)+i<<4-offset(CCacheBlk.next_hash);
return blkdev.cache_hash_table(U8 *)+i<<4-offset(CCacheBlk.next_hash);
}
U0 DskCacheQueRem(CCacheBlk *tempc)
@@ -53,7 +53,7 @@ U0 DskCacheQueRem(CCacheBlk *tempc)
U0 DskCacheQueIns(CCacheBlk *tempc)
{
CCacheBlk *temp_n,*temp_l;
QueIns(tempc,dsk.cache_ctrl->last_lru);
QueIns(tempc,blkdev.cache_ctrl->last_lru);
temp_l=DskCacheHash(tempc->blk);
temp_n=temp_l->next_hash;
tempc->last_hash=temp_l;
@@ -76,12 +76,12 @@ CCacheBlk *DskCacheFind(CDrv *dv,I64 blk)
U0 DskCacheAdd(CDrv *dv,U8 *buf, I64 blk, I64 cnt)
{
CCacheBlk *tempc;
if (dsk.cache_base) {
if (blkdev.cache_base) {
while (LBts(&sys_semas[SYS_SEMA_DSK_CACHE],0))
Yield;
while (cnt-->0) {
if (!(tempc=DskCacheFind(dv,blk)))
tempc=dsk.cache_ctrl->next_lru;
tempc=blkdev.cache_ctrl->next_lru;
DskCacheQueRem(tempc);
MemCpy(&tempc->body,buf,BLK_SIZE);
tempc->dv=dv;
@@ -97,18 +97,18 @@ U0 DskCacheAdd(CDrv *dv,U8 *buf, I64 blk, I64 cnt)
U0 DskCacheInvalidate2(CDrv *dv)
{
CCacheBlk *tempc,*tempc1;
if (dsk.cache_base) {
if (blkdev.cache_base) {
while (LBts(&sys_semas[SYS_SEMA_DSK_CACHE],0))
Yield;
tempc=dsk.cache_ctrl->last_lru;
while (tempc!=dsk.cache_ctrl) {
tempc=blkdev.cache_ctrl->last_lru;
while (tempc!=blkdev.cache_ctrl) {
tempc1=tempc->last_lru;
if (tempc->dv==dv) {
DskCacheQueRem(tempc);
tempc->dv=NULL;
tempc->blk=0;
tempc->next_hash=tempc->last_hash=tempc;
QueIns(tempc,dsk.cache_ctrl->last_lru);
QueIns(tempc,blkdev.cache_ctrl->last_lru);
}
tempc=tempc1;
}
@@ -119,7 +119,7 @@ U0 DskCacheInvalidate2(CDrv *dv)
U0 RCache(CDrv *dv,U8 **_buf, I64 *_blk, I64 *_cnt)
{
CCacheBlk *tempc;
if (dsk.cache_base) {
if (blkdev.cache_base) {
while (LBts(&sys_semas[SYS_SEMA_DSK_CACHE],0))
Yield;
//fetch leading blks from cache
@@ -12,8 +12,8 @@ I64 ClusterNumNext(CDrv *dv,I64 c,I64 cnt=1)
break;
case DVT_FAT32:
while (cnt-->0 && 0<c<0x0FFFFFF8) {
DrvMapBlkSet(dv,c);
c=dv->cur_map_blk[c & (BLK_SIZE/4-1)];
DrvFATBlkSet(dv,c);
c=dv->cur_fat_blk[c & (BLK_SIZE/4-1)];
}
if (!(0<c<0x0FFFFFF8))
c=INVALID_CLUSTER;
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -29,7 +29,7 @@ U0 DrvsRelease()
I64 i;
CDrv *dv;
for (i=0;i<NUM_DRVS;i++) {
dv=&dsk.drvs[i];
dv=&blkdev.drvs[i];
if (dv->owning_task==Fs && dv->dv_signature==DRV_SIGNATURE_VAL)
DrvUnlock(dv,TRUE);
}
@@ -42,7 +42,7 @@ CDrv *DrvMakeFree(U8 drv_let)
CDrv *result;
if (!(0<=i<NUM_DRVS))
throw('Drv');
result=&dsk.drvs[i];
result=&blkdev.drvs[i];
MemSet(result,0,sizeof(CDrv));
result->drv_let='A'+i;
return result;
@@ -55,62 +55,62 @@ CDrv *DrvNextFree(U8 first_drv_let='C')
if (!(0<=i<NUM_DRVS))
throw('Drv');
do
if (dsk.drvs[i].dv_signature!=DRV_SIGNATURE_VAL)
if (blkdev.drvs[i].dv_signature!=DRV_SIGNATURE_VAL)
return DrvMakeFree(i+'A');
while (++i<NUM_DRVS);
throw('Drv');
return NULL; //never gets here
}
U0 DrvMapBlkAlloc(CDrv *dv)
U0 DrvFATBlkAlloc(CDrv *dv)
{
DrvChk(dv);
Free(dv->cur_map_blk);
dv->cur_map_blk=AMAlloc(BLK_SIZE);
dv->cur_map_blk_num=0;
dv->map_blk_dirty=0;
RBlks(dv,dv->cur_map_blk,dv->map1,1);
Free(dv->cur_fat_blk);
dv->cur_fat_blk=AMAlloc(BLK_SIZE);
dv->cur_fat_blk_num=0;
dv->fat_blk_dirty=0;
RBlks(dv,dv->cur_fat_blk,dv->fat1,1);
}
U0 DrvMapBlkClean(CDrv *dv,I64 map_select=3)
U0 DrvFATBlkClean(CDrv *dv,I64 fat_select=3)
{
if ((dv->type==DVT_FAT32 || dv->type==DVT_REDSEA)&&Bt(&dv->map_blk_dirty,0)) {
if (dv->map1==dv->map2) {
WBlks(dv,dv->cur_map_blk,dv->map1+dv->cur_map_blk_num,1);
LBtr(&dv->map_blk_dirty,0);
if ((dv->type==DVT_FAT32 || dv->type==DVT_REDSEA)&&Bt(&dv->fat_blk_dirty,0)) {
if (dv->fat1==dv->fat2) {
WBlks(dv,dv->cur_fat_blk,dv->fat1+dv->cur_fat_blk_num,1);
LBtr(&dv->fat_blk_dirty,0);
} else {
if (map_select==3 || !map_select)
WBlks(dv,dv->cur_map_blk,dv->map1+dv->cur_map_blk_num,1);
if (map_select==3 || map_select==1) {
WBlks(dv,dv->cur_map_blk,dv->map2+dv->cur_map_blk_num,1);
LBtr(&dv->map_blk_dirty,0);
if (fat_select==3 || !fat_select)
WBlks(dv,dv->cur_fat_blk,dv->fat1+dv->cur_fat_blk_num,1);
if (fat_select==3 || fat_select==1) {
WBlks(dv,dv->cur_fat_blk,dv->fat2+dv->cur_fat_blk_num,1);
LBtr(&dv->fat_blk_dirty,0);
}
}
}
}
U0 DrvMapBlkSet(CDrv *dv,I64 c,I64 map_select=3)
U0 DrvFATBlkSet(CDrv *dv,I64 c,I64 fat_select=3)
{
I64 map_blk_num;
I64 fat_blk_num;
if (c==INVALID_CLUSTER)
throw('Drv');
switch (dv->type) {
case DVT_FAT32:
map_blk_num=c>>(BLK_SIZE_BITS-2);
fat_blk_num=c>>(BLK_SIZE_BITS-2);
break;
case DVT_REDSEA:
map_blk_num=(c-dv->data_area)>>(BLK_SIZE_BITS+3);
fat_blk_num=(c-dv->data_area)>>(BLK_SIZE_BITS+3);
break;
default:
throw('Drv');
}
if (map_blk_num!=dv->cur_map_blk_num) {
DrvMapBlkClean(dv,map_select);
dv->cur_map_blk_num=map_blk_num;
if (map_select==3 || !map_select)
RBlks(dv,dv->cur_map_blk,dv->map1+dv->cur_map_blk_num,1);
if (fat_blk_num!=dv->cur_fat_blk_num) {
DrvFATBlkClean(dv,fat_select);
dv->cur_fat_blk_num=fat_blk_num;
if (fat_select==3 || !fat_select)
RBlks(dv,dv->cur_fat_blk,dv->fat1+dv->cur_fat_blk_num,1);
else
RBlks(dv,dv->cur_map_blk,dv->map2+dv->cur_map_blk_num,1);
RBlks(dv,dv->cur_fat_blk,dv->fat2+dv->cur_fat_blk_num,1);
}
}
@@ -135,11 +135,11 @@ CDrv *Let2Drv(U8 drv_let=0)
dv=Fs->cur_dv;
else {
if (drv_let==':')
drv_let=dsk.boot_drv_let;
drv_let=blkdev.boot_drv_let;
drv_let=ToUpper(drv_let);
if (!('A'<=drv_let<='Z'))
throw('Drv');
dv=dsk.let_to_drv[drv_let-'A'];
dv=blkdev.let_to_drv[drv_let-'A'];
}
DrvChk(dv);
return dv;
@@ -177,21 +177,19 @@ U0 ChgDsk(U8 drv_let=0)
{//Change disk. (Needed for removable media.)
CDrv *dv=Let2Drv(drv_let);
CBlkDev *bd=dv->bd;
Bool old_preempt=Preempt;
if (!(bd->flags&BDF_INITIALIZED))
BlkDevInit(bd);
else if (bd->flags&BDF_REMOVABLE)
DskCacheInvalidate(dv);
Drv(drv_let);
RedSeaFreeFreeLst(dv);
Preempt(old_preempt);
}
Bool MapDrv(U8 drv_let,CDrv *dv)
{//Make drive letter map to another.
drv_let=ToUpper(drv_let);
if ('A'<=drv_let<='Z') {
dsk.let_to_drv[drv_let-'A']=dv;
blkdev.let_to_drv[drv_let-'A']=dv;
dv->drv_let=drv_let;
return TRUE;
} else
@@ -260,13 +258,13 @@ U0 DrvRep()
I64 i,drv_let;
U8 *st;
"\nDefined Drives:\n\n";
for (i=0,dv=dsk.drvs;i<NUM_DRVS;i++,dv++) {
for (i=0,dv=blkdev.drvs;i<NUM_DRVS;i++,dv++) {
if (dv->dv_signature==DRV_SIGNATURE_VAL) {
bd=dv->bd;
drv_let=Drv2Let(dv);
if (Bt(&dv->type,DVTf_DISABLE))
"$$RED$$X";
else if (drv_let==dsk.boot_drv_let)
else if (drv_let==blkdev.boot_drv_let)
"$$GREEN$$:";
else
'' CH_SPACE;
@@ -91,8 +91,7 @@ U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL)
return result;
}
I64 FileWrite(U8 *filename,U8 *fbuf,
I64 size,CDate cdt=0,I64 attr=0)
I64 FileWrite(U8 *filename,U8 *fbuf,I64 size,CDate cdt=0,I64 attr=0)
{//Write whole file to disk.
I64 c=0;
CHashGeneric *temph;
File renamed without changes.
@@ -55,7 +55,7 @@ U0 Fmt(I64 drv_let,Bool quick=TRUE,Bool confirm=TRUE,I64 type=DVT_FAT32)
//$BK,1$Warning:$BK,0$ Destroys all previous info.
//quick=FALSE means fill entire drive with zeros.
//Choose $LK,"DVT_FAT32",A="MN:DVT_FAT32"$ or $LK,"DVT_REDSEA",A="MN:DVT_REDSEA"$.
//You don't format a CD-ROM with this.
//You don't format a CD/DVD with this.
CDrv *dv=Let2Drv(drv_let);
Bool old_silent=IsSilent;
if (confirm && !AreYouSure)
@@ -97,7 +97,7 @@ U8 *DirNameAbs(U8 *_dirname)
drv[2]=0;
if (*dirname && dirname[1]==':') {
if (*dirname==':')
*drv=dsk.boot_drv_let;
*drv=blkdev.boot_drv_let;
else
*drv=*dirname;
dirname=dirname+2;
@@ -270,7 +270,7 @@ returns default.
("/Kernel/KHashA.CPP.Z",NULL,NULL) returns "D:/Kernel"
("/Kernel",NULL,"PRJ.Z") returns "D:/Kernel/Kernel.PRJ.Z"
("/Kernel/Dsk",NULL,"PRJ.Z") returns "D:/Kernel/Kernel.PRJ.Z"
("/Kernel/BlkDev",NULL,"PRJ.Z") returns "D:/Kernel/Kernel.PRJ.Z"
("/Apps/Psalmody","Load","CPP.Z") returns "D:/Apps/Psalmody/Load.CPP.Z"
*/
U8 *st=DirNameAbs(dirname),*st2,*st3,*result,*dft=NULL,*ext;
File renamed without changes.
@@ -28,13 +28,13 @@ U0 FAT32DrvInit(CDrv *dv)
dv->type=DVT_FAT32;
RBlks(dv,&br32,dv->base_offset,1);
dv->file_system_info_sect=dv->base_offset+br32.file_system_info_sect;
dv->map1=dv->base_offset+br32.reserved_sects;
dv->map2=dv->map1+br32.sects_per_fat;
dv->data_area=dv->map2+br32.sects_per_fat
dv->fat1=dv->base_offset+br32.reserved_sects;
dv->fat2=dv->fat1+br32.sects_per_fat;
dv->data_area=dv->fat2+br32.sects_per_fat
-2*br32.sects_per_cluster; //Starts at Cluster 2
dv->spc=br32.sects_per_cluster;
dv->root_cluster=br32.root_cluster;
DrvMapBlkAlloc(dv);
DrvFATBlkAlloc(dv);
Free(dv->fis);
dv->fis=AMAlloc(BLK_SIZE);
RBlks(dv,dv->fis,dv->file_system_info_sect,1);
@@ -427,25 +427,25 @@ U0 FAT32FreeClusters(CDrv *dv,I64 c)
try {
unlock_break=BreakLock;
unlock=DrvLock(dv);
DrvMapBlkClean(dv);
DrvFATBlkClean(dv);
do {
DrvMapBlkSet(dv,c,0);
next=dv->cur_map_blk[c&(BLK_SIZE/4-1)];
dv->cur_map_blk[c&(BLK_SIZE/4-1)]=0;
LBts(&dv->map_blk_dirty,0);
DrvFATBlkSet(dv,c,0);
next=dv->cur_fat_blk[c&(BLK_SIZE/4-1)];
dv->cur_fat_blk[c&(BLK_SIZE/4-1)]=0;
LBts(&dv->fat_blk_dirty,0);
c=next;
} while (0<c<0x0FFFFFF8);
DrvMapBlkClean(dv,0);
DrvFATBlkClean(dv,0);
c=saved_c;
do {
DrvMapBlkSet(dv,c,1);
next=dv->cur_map_blk[c&(BLK_SIZE/4-1)];
dv->cur_map_blk[c&(BLK_SIZE/4-1)]=0;
LBts(&dv->map_blk_dirty,0);
DrvFATBlkSet(dv,c,1);
next=dv->cur_fat_blk[c&(BLK_SIZE/4-1)];
dv->cur_fat_blk[c&(BLK_SIZE/4-1)]=0;
LBts(&dv->fat_blk_dirty,0);
c=next;
} while (0<c<0x0FFFFFF8);
DrvMapBlkClean(dv,1);
DrvFATBlkClean(dv,1);
if (unlock)
DrvUnlock(dv);
if (unlock_break)
@@ -479,26 +479,26 @@ I64 FAT32AllocClusters(CDrv *dv,I64 c,I64 cnt)
j=1;
wrap_around=TRUE;
}
DrvMapBlkSet(dv,j);
if (!dv->cur_map_blk[j&(BLK_SIZE/4-1)])
DrvFATBlkSet(dv,j);
if (!dv->cur_fat_blk[j&(BLK_SIZE/4-1)])
break;
}
if (!(0<first<0x0FFFFFF8))
first=j;
if (0<c<l) {
DrvMapBlkSet(dv,c);
dv->cur_map_blk[c&(BLK_SIZE/4-1)]=j;
LBts(&dv->map_blk_dirty,0);
DrvFATBlkSet(dv,c);
dv->cur_fat_blk[c&(BLK_SIZE/4-1)]=j;
LBts(&dv->fat_blk_dirty,0);
}
c=j;
}
if (0<c<l) {
DrvMapBlkSet(dv,c);
dv->cur_map_blk[c&(BLK_SIZE/4-1)]=0x0FFFFFFF;
LBts(&dv->map_blk_dirty,0);
DrvFATBlkSet(dv,c);
dv->cur_fat_blk[c&(BLK_SIZE/4-1)]=0x0FFFFFFF;
LBts(&dv->fat_blk_dirty,0);
}
DrvMapBlkClean(dv);
DrvFATBlkClean(dv);
dv->fis->most_recently_alloced=j;
dv->fis->free_clusters=-1;
@@ -532,8 +532,8 @@ I64 FAT32AllocContiguousClusters(CDrv *dv,I64 cnt)
while (cont && i<cnt) {
if ((first+i+1)*dv->spc+dv->data_area>dv->size+dv->base_offset)
throw('Drv');
DrvMapBlkSet(dv,first+i);
if (dv->cur_map_blk[(first+i)&(BLK_SIZE/4-1)])
DrvFATBlkSet(dv,first+i);
if (dv->cur_fat_blk[(first+i)&(BLK_SIZE/4-1)])
cont=FALSE;
else
i++;
@@ -541,27 +541,27 @@ I64 FAT32AllocContiguousClusters(CDrv *dv,I64 cnt)
if (!cont)
first=first+i;
else {
DrvMapBlkClean(dv);
DrvFATBlkClean(dv);
for (i=0;i<cnt;i++) {
DrvMapBlkSet(dv,first+i,0);
DrvFATBlkSet(dv,first+i,0);
if (i+1==cnt)
dv->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF;
dv->cur_fat_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF;
else
dv->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=first+i+1;
LBts(&dv->map_blk_dirty,0);
dv->cur_fat_blk[(first+i)&(BLK_SIZE/4-1)]=first+i+1;
LBts(&dv->fat_blk_dirty,0);
}
DrvMapBlkClean(dv,0);
DrvFATBlkClean(dv,0);
for (i=0;i<cnt;i++) {
DrvMapBlkSet(dv,first+i,1);
DrvFATBlkSet(dv,first+i,1);
if (i+1==cnt)
dv->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF;
dv->cur_fat_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF;
else
dv->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=first+i+1;
LBts(&dv->map_blk_dirty,0);
dv->cur_fat_blk[(first+i)&(BLK_SIZE/4-1)]=first+i+1;
LBts(&dv->fat_blk_dirty,0);
}
DrvMapBlkClean(dv,1);
DrvFATBlkClean(dv,1);
break;
}
}
File renamed without changes.
@@ -34,8 +34,8 @@ U0 RedSeaFreeLstBuild(CDrv *dv)
while (first<max_blk) {
i=0; //count free clusters
while (first+i<max_blk) {
DrvMapBlkSet(dv,first+i);
if (Bt(dv->cur_map_blk,(first+i-dv->data_area)&(BLK_SIZE<<3-1)))
DrvFATBlkSet(dv,first+i);
if (Bt(dv->cur_fat_blk,(first+i-dv->data_area)&(BLK_SIZE<<3-1)))
break;
else
i++;
@@ -70,8 +70,8 @@ U0 RedSeaDrvInit(CDrv *dv)
dv->size=br.sects;
dv->data_area=dv->base_offset+br.bitmap_sects;
dv->root_cluster=br.root_cluster;
dv->map1=dv->map2=dv->base_offset+1;
DrvMapBlkAlloc(dv);
dv->fat1=dv->fat2=dv->base_offset+1;
DrvFATBlkAlloc(dv);
if (unlock)
DrvUnlock(dv);
} catch
@@ -282,12 +282,12 @@ U0 RedSeaFreeClusters(CDrv *dv,I64 c,I64 cnt)
QueIns(tempf,dv->last_free);
}
while (cnt-->0) {
DrvMapBlkSet(dv,c);
LBtr(dv->cur_map_blk,(c-dv->data_area)&(BLK_SIZE<<3-1));
LBts(&dv->map_blk_dirty,0);
DrvFATBlkSet(dv,c);
LBtr(dv->cur_fat_blk,(c-dv->data_area)&(BLK_SIZE<<3-1));
LBts(&dv->fat_blk_dirty,0);
c++;
}
DrvMapBlkClean(dv);
DrvFATBlkClean(dv);
if (unlock)
DrvUnlock(dv);
@@ -327,11 +327,11 @@ I64 RedSeaAllocClusters(CDrv *dv,I64 cnt)
throw('Drv');
first=best_free->start;
for (i=0;i<cnt;i++) {
DrvMapBlkSet(dv,first+i);
LBts(dv->cur_map_blk,(first+i-dv->data_area)&(BLK_SIZE<<3-1));
LBts(&dv->map_blk_dirty,0);
DrvFATBlkSet(dv,first+i);
LBts(dv->cur_fat_blk,(first+i-dv->data_area)&(BLK_SIZE<<3-1));
LBts(&dv->fat_blk_dirty,0);
}
DrvMapBlkClean(dv);
DrvFATBlkClean(dv);
if (best_free->size-=cnt)
best_free->start+=cnt;
else {
@@ -1,3 +1,4 @@
#exe {Cd(__DIR__);};
#include "DskStrA"
#include "DskCache"
#include "DskATA"
@@ -20,3 +21,4 @@
#include "DskCopy"
#include "DskCDDVD"
#include "DskFmt"
#exe {Cd("..");};
+1 -1
View File
@@ -223,7 +223,7 @@ CArcCtrl *ArcCtrlNew(Bool expand,I64 compression_type=CT_8_BIT)
CArcCtrl *c;
c=CAlloc(sizeof(CArcCtrl));
if (expand) {
c->stk_base=MAlloc(ARC_MAX_ENTRY+1);
c->stk_base=MAlloc(1<<ARC_MAX_BITS);
c->stk_ptr=c->stk_base;
}
if (compression_type==CT_7_BIT)
+16 -7
View File
@@ -6,7 +6,6 @@ the normal screen text output routine.
See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$().
*/
Bool old_preempt=Preempt;
I64 i,row,col;
U8 *ptr,*ptr1,*ptr2;
@@ -16,20 +15,16 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$().
text.raw_flags&=~RWF_IN_DOLLAR;
if (!(text.raw_flags & RWF_LAST_DOLLAR)) {
text.raw_flags&=~RWF_LAST_DOLLAR;
Preempt(old_preempt);
return;
}
} else {
text.raw_flags|=RWF_IN_DOLLAR|RWF_LAST_DOLLAR;
Preempt(old_preempt);
return;
}
}
text.raw_flags&=~RWF_LAST_DOLLAR;
if (text.raw_flags&RWF_IN_DOLLAR) {
Preempt(old_preempt);
if (text.raw_flags&RWF_IN_DOLLAR)
return;
}
}
if (ch=='\t') {
RawPutChar(CH_SPACE);
@@ -88,7 +83,6 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$().
}
text.raw_col++;
}
Preempt(old_preempt);
}
U0 VGAFlush()
@@ -128,3 +122,18 @@ U0 WinDerivedValsUpdate(CTask *task=NULL)
}
POPFD
}
Bool WinInside(I64 x,I64 y,CTask *task=NULL,Bool border=FALSE)
{//Is pixel (x,y) inside task's win?
if (!task) task=Fs;
if (TaskValidate(task) && Bt(&task->display_flags,DISPLAYf_SHOW)) {
if (border) {
if (task->border_pix_left<=x<=task->border_pix_right &&
task->border_pix_top<=y<=task->border_pix_bottom)
return TRUE;
} else if (task->pix_left<=x<=task->pix_right &&
task->pix_top<=y<=task->pix_bottom)
return TRUE;
}
return FALSE;
}
+1 -1
View File
@@ -66,7 +66,7 @@ Bool EdLite(U8 *filename,I64 num=1,I64 edf_dof_flags=0)
old_debug=InDbg(ON),
old_single=SingleUser(ON);
if (!filename) filename=dsk.temp_filename;
if (!filename) filename=blkdev.temp_filename;
buf=FileRead(filename,&size);
PUSHFD
+6 -6
View File
@@ -23,7 +23,7 @@ class CKernelCfg
Bool opts[CFG_NUM_OPTIONS];
U8 mem_init_val,heap_init_val,var_init_val,
boot_drv_let,auto_mount_ide_hd_let,auto_mount_ide_cd_let;
Bool cdrom_ports_pmt;
Bool dvd_ports_pmt;
};
CDoc *KernelCfgAddDev(CKernelCfg *c)
@@ -58,7 +58,7 @@ CDoc *KernelCfgAddDev(CKernelCfg *c)
'\n';
if (0<=first_drv_num<NUM_DRVS) {
"\t$$PURPLE$$1$$FG$$=RAM\n\t$$PURPLE$$2$$FG$$=ATA(Harddisk)\n"
"\t$$PURPLE$$3$$FG$$=ATAPI(CD-ROM)\nType:";
"\t$$PURPLE$$3$$FG$$=ATAPI(CD/DVD)\nType:";
type=GetChar-'0';
'\n';
@@ -72,7 +72,7 @@ CDoc *KernelCfgAddDev(CKernelCfg *c)
type==BDT_ATAPI) {
num_hints=ATARep(,,&root);
if (type==BDT_ATAPI) {
"<ENTER> to use booted CD-ROM\n";
"<ENTER> to use booted CD/DVD\n";
if (num_hints)
"Enter dev number or\nport with $$PURPLE$$0x$$FG$$ prefix.\n"
"I/O Port Base0:\n";
@@ -120,8 +120,8 @@ CDoc *KernelCfgAddDev(CKernelCfg *c)
make_free=FALSE;
if (type==BDT_ATA || type==BDT_ATAPI) {
if (type==BDT_ATAPI && !*base0_buf) {
c->cdrom_ports_pmt=TRUE;
DocPrint(doc,"dsk.boot_rescue_drv_pmt=GetBaseUnit(bd);");
c->dvd_ports_pmt=TRUE;
DocPrint(doc,"blkdev.boot_rescue_drv_pmt=GetBaseUnit(bd);");
if (first_drv_num+'A'==c->boot_drv_let)
make_free=TRUE;
} else
@@ -157,7 +157,7 @@ U0 KernelCfgOptions(CKernelCfg *c)
"$$PURPLE$$VarInit$$FG$$ Initializes glbl var memory to a val.\n"
"$$PURPLE$$NoMP$$FG$$ No multicore.\n"
"$$PURPLE$$TextMode$$FG$$ Text Mode (requires hard reboot).\n"
"$$PURPLE$$DontProbe$$FG$$ Just prompt CD-ROM ports, don't probe.\n"
"$$PURPLE$$DontProbe$$FG$$ Just prompt CD/DVD ports, don't probe.\n"
"$$PURPLE$$AutoMountIDE$$FG$$ AutoMount IDE drives to 'C' and 'T'.\n"
"$$PURPLE$$BootRescueDrv$$FG$$ Include RAM Drv in Kernel.BIN.\n"
"\n";
File renamed without changes.
+25 -24
View File
@@ -574,6 +574,7 @@ U0 Fault3(I64 fault_num,I64 fault_err_code)
mp_cnt=1;
dbg.mp_crash->cpu_num=Gs->num;
dbg.mp_crash->task=Fs;
dbg.mp_crash->rip=Fs->rip;
dbg.mp_crash->msg=dbg.msg;
dbg.mp_crash->msg_num=dbg.msg_num;
MPInt(I_MP_CRASH,0);
@@ -597,41 +598,41 @@ U0 Fault3(I64 fault_num,I64 fault_err_code)
}
U0 Fault2(I64 fault_num,I64 fault_err_code)
{//Called from $LK,"Fault2",A="FF:::/Kernel/Ints.CPP,Fault2"$.
{//Called from $LK,"Fault2",A="FF:::/Kernel/KInts.CPP,Fault2"$.
//$BK,1$Be careful not to swap-out and ruin the saved context$BK,0$
Bool was_raw,was_single_user,was_silent;
I64 i,old_raw_flags=text.raw_flags;
if (fault_num==I_DIVIDE_BY_ZERO) {
"RIP:%P\n",Fs->rip;
throw('DivZero');
}
was_single_user=SingleUser(ON);
if (!IsDbg)
dbg.focus_task=sys_focus_task;
sys_focus_task=NULL;
if (fault_num==I_BPT)
Fs->rip--;
was_raw=Raw(ON);
was_silent=Silent(OFF);
text.raw_flags|=RWF_SHOW_DOLLAR|RWF_SCROLL;
if (Fs->dbg_task)
CallExtNum(EXT_DBG_RESUME,fault_num,fault_err_code);
else {
was_raw=Raw(ON);
was_silent=Silent(OFF);
text.raw_flags|=RWF_SHOW_DOLLAR|RWF_SCROLL;
"Task \"";
"%s",Fs->task_title;
"\"\n";
"Fault:0x%02X %Z\t\tErr Code:%08X\n",
fault_num,fault_num,"ST_INT_NAMES",fault_err_code;
"RIP:%08X",Fs->rip; //Sometimes crashes on %p, so do this first
":%p RSP:%08X\n",Fs->rip,Fs->rsp;
if (fault_num==I_PAGE_FAULT) {
MOV_RAX_CR2
i=GetRAX;
"Fault Addr:%08X:%p\n",i,i;
"Task \"";
"%s",Fs->task_title;
"\"\n";
"Fault:0x%02X %Z\t\tErr Code:%08X\n",
fault_num,fault_num,"ST_INT_NAMES",fault_err_code;
"RIP:%08X",Fs->rip; //Sometimes crashes on %p, so do this first
":%p RSP:%08X\n",Fs->rip,Fs->rsp;
if (fault_num==I_PAGE_FAULT) {
MOV_RAX_CR2
i=GetRAX;
"Fault Addr:%08X:%p\n",i,i;
}
Fault3(fault_num,fault_err_code);
Silent(was_silent);
Raw(was_raw);
text.raw_flags=old_raw_flags;
}
Fault3(fault_num,fault_err_code);
Silent(was_silent);
Raw(was_raw);
text.raw_flags=old_raw_flags;
SingleUser(was_single_user);
if (LBtr(&Fs->task_flags,TASKf_KILL_AFTER_DBG))
Exit;
+27 -25
View File
@@ -10,16 +10,18 @@ U0 SysGlblsInit()
sys_focus_task=Fs;
QueInit(&sys_macro_root);
dsk.dft_iso_filename="::/Temp/CDDVD.ISO";
StrCpy(dsk.temp_filename,"::/Home/Temp.TXT.Z");
dsk.cdrom_boot_is_good=TRUE;
blkdev.dft_iso_filename="::/Temp/CDDVD.ISO";
blkdev.temp_filename="::/Home/Temp.TXT.Z";
blkdev.dvd_boot_is_good=TRUE;
#exe {
if (!kernel_cfg->auto_mount_ide_hd_let)
kernel_cfg->auto_mount_ide_hd_let='C';
if (!kernel_cfg->auto_mount_ide_cd_let)
kernel_cfg->auto_mount_ide_cd_let='T';
StreamPrint("dsk.first_hd_drv_let=%d;",kernel_cfg->auto_mount_ide_hd_let);
StreamPrint("dsk.first_cd_drv_let=%d;",kernel_cfg->auto_mount_ide_cd_let);
StreamPrint("blkdev.first_hd_drv_let=%d;",
kernel_cfg->auto_mount_ide_hd_let);
StreamPrint("blkdev.first_dvd_drv_let=%d;",
kernel_cfg->auto_mount_ide_cd_let);
}
InDbg(ON);
@@ -36,10 +38,10 @@ U0 SysGlblsInit()
KeyDevInit;
#exe {
StreamPrint("dsk.boot_drv_let='%C';",kernel_cfg->boot_drv_let);
StreamPrint("#exe{OptOff(OPTf_WARN_PAREN);}");
StreamPrint("blkdev.boot_drv_let='%C';",kernel_cfg->boot_drv_let);
StreamPrint("#exe{Option(OPTf_WARN_PAREN,OFF);}");
StreamPrint("DskCacheInit(%s);",kernel_cfg->dsk_cache_size_exp);
StreamPrint("#exe{OptOn(OPTf_WARN_PAREN);}");
StreamPrint("#exe{Option(OPTf_WARN_PAREN,ON);}");
};
pow10_I64=CAlloc(sizeof(F64)*(308+308+1));
@@ -59,7 +61,7 @@ U0 SysGlblsInit()
dev.mem64_ptr=MEM_MAPPED_SPACE;
dbg.psect_cache=CAlloc(PSECT_CACHE_SIZE*sizeof(CPSectCache));
dbg.fault_handlers_code=IntFaultHandlersNew;
dbg.int_fault_code=IntFaultHandlersNew;
}
U0 SysGrInit()
@@ -129,6 +131,7 @@ U0 Reboot()
U0 KernelMain()
{//Continued from $LK,"Kernel",A="FF:::/Kernel/KStart.CPP,I32 &Kernel"$
OutU8(0x61,InU8(0x61)&~3); //Snd(0);
adam_task=Fs;
HeapsInit;
LBts(&sys_run_level,RLf_FULL_HEAP);
@@ -163,7 +166,20 @@ U0 KernelMain()
LBts(&sys_run_level,RLf_INTERRUPTS);
TimeStampFreqCal;
Preempt(ON);
"Before BlkDevsInitAll\n";
BlkDevsInitAll;
"After BlkDevsInitAll\n";
#exe {
if (kernel_cfg->dvd_ports_pmt)
StreamPrint(
"if (blkdev.boot_rescue_drv_pmt) \"%%S\",\"ST_DVD_PORTS_PMT2\";");
};
ChgDsk(':');
Gs->idle_task->cur_dv=blkdev.let_to_drv[ToUpper(blkdev.boot_drv_let)-'A'];
LBts(&sys_run_level,RLf_BLKDEV);
#exe {
if (!kernel_cfg->opts[CFG_NO_MP])
@@ -180,19 +196,6 @@ U0 KernelMain()
else
Spawn(&MouseDriverInstall,,,1);
"BlkDevsInitAll\n";
BlkDevsInitAll;
"BlkDevsInitAll Done\n";
#exe {
if (kernel_cfg->cdrom_ports_pmt)
StreamPrint(
"if (dsk.boot_rescue_drv_pmt) \"%%S\",\"ST_CDROM_PORTS_PMT2\";");
};
ChgDsk(':');
LBts(&sys_run_level,RLf_DSK);
"Loading Compiler\n";
Cd("/Compiler");
Load("Compiler",LDF_SILENT);
@@ -201,8 +204,7 @@ U0 KernelMain()
InDbg(OFF);
cnts.time_stamp_freq_initial=TimeStampFreqCal;
Cd("/");
try
ExeFile("Adam"); //Continues $LK,"/Adam.CPP",A="FL:/Adam.CPP,1"$
try ExeFile("StartOS"); //Continues $LK,"/StartOS.CPP",A="FL:/StartOS.CPP,1"$
catch {
Raw(ON);
PutExcept;
+2 -2
View File
@@ -48,7 +48,7 @@ U0 PutExcept(Bool catch_it=TRUE)
Fs->catch_except=catch_it;
}
#exe {OptOn(OPTf_NO_REG_VAR);};
#exe {Option(OPTf_NO_REG_VAR,ON);};
class CTryStk
{
@@ -105,7 +105,7 @@ U0 throw(I64 ch=0,Bool no_log=FALSE)
Raw(was_raw);
}
#exe {OptOff(OPTf_NO_REG_VAR);};
#exe {Option(OPTf_NO_REG_VAR,OFF);};
U0 SysThrowBreak()
{
+1 -1
View File
@@ -79,7 +79,7 @@ extern CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
I64 stk_size=0,I64 flags=1<<SVCf_ADD_TO_QUE);
extern U0 SrvCmdDel(CSrvCmd *tempc);
extern U0 SrvCmdQueDel(CSrvCmd *root);
extern I64 SrvCmdsHandler(CTask *task=NULL);
extern I64 SrvCmdsHandler(I64 run_flags,CTask *task=NULL);
extern U0 SrvCtrlInit(CSrvCtrl *ctrl);
extern U8 *StrPrint(U8 *dst,U8 *fmt,...);
extern U0 StrPrintPSect(U8 *buf,I64 addr,I64 field_len);
+9 -6
View File
@@ -1,4 +1,5 @@
//Compiler initializes glbls in AOT bin modules to zero.
//$LK,"Globals Set to Zero Here",A="FF:::/Compiler/PrsStmt.CPP.Z,sys_var_init_flag"$.
CSrvCmd sys_macro_root;
CTask *sys_macro_util_task;
@@ -13,17 +14,19 @@ U8 *reverse_bits_table, //Table with U8 bits reversed
CDate local_time_offset;
F64 *pow10_I64;
CSndGlbls snd;
CAutoCompleteDictGlbls acd;
CAutoCompleteGlbls ac;
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.CPP"$.
CIPStateGlbls ip,ip_last;
CGridGlbls ip_grid; //See $LK,"::/Demo/Graphics/Grid.CPP.Z"$.
CMouseStateGlbls mouse,mouse_last;
CKbdStateGlbls kbd;
CKeyDevGlbls keydev;
CDevGlbls dev;
CMouseStateGlbls mouse,mouse_last;
CSndGlbls snd;
CTextGlbls text;
CDbgGlbls dbg;
CDskGlbls dsk;
U8 *(*fp_getstr2)(I64 flags=0);
U0 (*fp_update_ctrls)(CTask *task);
BIN
View File
Binary file not shown.
+33 -20
View File
@@ -1,16 +1,16 @@
asm {
SYS_MP_CRASH_HANDLER_ADDR:: //Forward reference to work around compiler
DU32 &MPCrash;
INT_MP_CRASH_ADDR:: //Forward reference to work around compiler
DU32 &IntMPCrash;
SYS_WAKE_HANDLER::
INT_WAKE::
PUSH RAX
MOV EAX,U32 LAPIC_EOI
MOV U32 [RAX],0
POP RAX
IRET
SYS_TIMER_HANDLER:: //I_TIMER
CALL TASK_CONTEXT_SAVE //PREEMPTIVE
IRQ_TIMER:: //I_TIMER
CALL TASK_CONTEXT_SAVE
CLD
MOV RAX,U64 [RSP]
@@ -48,13 +48,9 @@ SYS_TIMER_HANDLER:: //I_TIMER
@@20: CALL &IntCore0TimerHandler //Only Core 0 calls this.
@@25: TEST U8 [SYS_SEMAS+SYS_SEMA_SINGLE_USER*SEMA_STRUCT_SIZE],1
JNZ @@30
BT U64 CTask.task_flags[RSI],TASKf_PREEMPT
JC I32 RESTORE_NEXT_RSI_TASK
@@30: JMP I32 RESTORE_RSI_NO_PREEMPT_TASK
@@25: JMP I32 RESTORE_RSI_TASK
//************************************
SYS_IRQ_FAULT::
INT_FAULT::
PUSH RBX
PUSH RAX
MOV BL,U8 16[RSP] //We pushed fault_num $LK,"IntFaultHandlersNew",A="MN:IntFaultHandlersNew"$().
@@ -69,7 +65,7 @@ SYS_IRQ_FAULT::
XOR RDX,RDX
MOV U64 CTask.fault_err_code[RSI],RDX
MOV EDX,U32 CTask.fault_num[RSI]
BT U64 [SYS_FAULT_ERR_CODE_BITMAP],RDX
BT U64 [INT_FAULT_ERR_CODE_BITMAP],RDX
JNC @@1
POP U64 CTask.fault_err_code[RSI]
@@ -86,7 +82,7 @@ SYS_IRQ_FAULT::
CALL &Fault2 //See $LK,"Fault2",A="FF:::/Kernel/KDbg.CPP,Fault2"$
JMP I32 RESTORE_FS_TASK_WITH_KEY_CHECK
SYS_FAULT_ERR_CODE_BITMAP::
INT_FAULT_ERR_CODE_BITMAP::
DU32 0x00027D00,0,0,0,0,0,0,0;
}
@@ -143,6 +139,22 @@ interrupt U0 IntNop()
*LAPIC_EOI(U32 *)=0;
}
interrupt U0 IntDivZero()
{
if (Gs->num) {
mp_cnt=1;
dbg.mp_crash->cpu_num=Gs->num;
dbg.mp_crash->task=Fs;
MOV RAX,U64 8[RBP] //Get RIP off of stk.
dbg.mp_crash->rip=GetRAX;
dbg.mp_crash->msg="Div Zero";
dbg.mp_crash->msg_num=0;
MPInt(I_MP_CRASH,0);
SysHlt;
}
throw('DivZero');
}
U8 *IntFaultHandlersNew()
{
I64 i;
@@ -151,7 +163,7 @@ U8 *IntFaultHandlersNew()
*dst++=0x6A; //PUSH I8 xx
*dst(I8 *)++=i;
*dst++=0xE9; //JMP I32 xxxxxxxx
*dst(I32 *)=SYS_IRQ_FAULT-dst-4;
*dst(I32 *)=INT_FAULT-dst-4;
dst+=4;
}
return result;
@@ -177,8 +189,9 @@ U0 IntInit2()
I64 i;
PUSHFD
CLI
for (i=0;i<0x20;i++)
IntEntrySet(i,&dbg.fault_handlers_code[7*i]);
IntEntrySet(I_DIV_ZERO,&IntDivZero);
for (i=1;i<0x20;i++)
IntEntrySet(i,&dbg.int_fault_code[7*i]);
/*In theory, we use the PIC mask reg to insure we don't get
anything but keyboard, mouse and timer IRQs. In practice, I've
gotten IRQ 0x27, perhaps because I didn't initialize the APIC.
@@ -186,9 +199,9 @@ I go ahead and ACK PIC in $LK,"IntNop",A="MN:IntNop"$().
I have no idea why I got a IRQ 0x27.
*/
IntEntrySet(I_NMI,_SYS_HLT);
IntEntrySet(I_TIMER,SYS_TIMER_HANDLER);
IntEntrySet(I_MP_CRASH,*SYS_MP_CRASH_HANDLER_ADDR(U32 *));
IntEntrySet(I_WAKE,SYS_WAKE_HANDLER);
IntEntrySet(I_DBG,&dbg.fault_handlers_code[7*I_DBG]);
IntEntrySet(I_TIMER,IRQ_TIMER);
IntEntrySet(I_MP_CRASH,*INT_MP_CRASH_ADDR(U32 *));
IntEntrySet(I_WAKE,INT_WAKE);
IntEntrySet(I_DBG,&dbg.int_fault_code[7*I_DBG]);
POPFD
}
+1 -6
View File
@@ -45,7 +45,7 @@ I64 BCnt(I64 d)
}
U0 IntCore0TimerHandler(CTask *)
{//Called from $LK,"IntCore0TimerHandler",A="FF:::/Kernel/Ints.CPP,IntCore0TimerHandler"$
{//Called from $LK,"IntCore0TimerHandler",A="FF:::/Kernel/KInts.CPP,IntCore0TimerHandler"$
I64 i;
if (mp_cnt>1)
while (LBts(&sys_semas[SYS_SEMA_SYS_TIMER],0))
@@ -230,11 +230,6 @@ Bool IsSilent()
return Bt(&Fs->display_flags,DISPLAYf_SILENT);
}
Bool IsPreempt()
{
return Bt(&Fs->task_flags,TASKf_PREEMPT);
}
Bool SysDbg(Bool val)
{//Sets or resets sysdbg bit you can use while debugging.
return LBEqu(&sys_semas[SYS_SEMA_DEBUG],0,val);
+6 -6
View File
@@ -25,8 +25,8 @@ SYS_BOOT_SRC:: DU32 BOOT_SRC_NULL;
SYS_BOOT_PATCH_TABLE_BASE:: DU32 0;
SYS_RUN_LEVEL:: DU32 0;
#exe {StreamPrint("SYS_COMPILE_TIME:: DU64 0x%X;",Now);}
//See $LK,"BootCdProbe",A="MN:BootCdProbe"$
#assert SYS_COMPILE_TIME+sizeof(CDate)+sizeof(CBinFile)<CD_BLK_SIZE
//See $LK,"BootDVDProve",A="MN:BootDVDProve"$
#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;
@@ -53,11 +53,11 @@ SYS_PCI_BUSSES:: DU16 0;
//************************************
BSP_16BIT_INIT::
//EBX is $LK,"SYS_BOOT_SRC",A="FF:::/Kernel/KStart.CPP,[SYS_BOOT_SRC]"$. (Val passed from boot blk, $LK,"BootHD",A="FF:::/Adam/Boot/BootHD.CPP,BOOT_SRC_HARDDRV"$, $LK,"BootCD",A="FF:::/Adam/Boot/BootCD.CPP,BOOT_SRC_CDROM"$, & $LK,"BootRAM",A="FF:::/Adam/Boot/Boot.CPP,BOOT_SRC_RAM"$.)
//EBX is $LK,"SYS_BOOT_SRC",A="FF:::/Kernel/KStart.CPP,[SYS_BOOT_SRC]"$. (Val passed from boot blk, $LK,"BootHD",A="FF:::/Adam/Opt/Boot/BootHD.CPP,BOOT_SRC_HARDDRV"$, $LK,"BootDVD",A="FF:::/Adam/Opt/Boot/BootDVD.CPP,BOOT_SRC_DVD"$, & $LK,"BootRAM",A="FF:::/Adam/Opt/Boot/Reboot.CPP,BOOT_SRC_RAM"$.)
MOV AX,(BOOT_RAM_LIMIT-BOOT_STK_SIZE)/16
MOV SS,AX
MOV SP,BOOT_STK_SIZE
PUSH EBX //Will be $LK,"SYS_BOOT_SRC",A="FF:::/Kernel/KStart.CPP,[SYS_BOOT_SRC]"$. See $LK,"BootHD",A="FF:::/Adam/Boot/BootHD.CPP,BOOT_SRC_HARDDRV"$, $LK,"BootCD",A="FF:::/Adam/Boot/BootCD.CPP,BOOT_SRC_CDROM"$ & $LK,"BootRAM",A="FF:::/Adam/Boot/Boot.CPP,BOOT_SRC_RAM"$.
PUSH EBX //Will be $LK,"SYS_BOOT_SRC",A="FF:::/Kernel/KStart.CPP,[SYS_BOOT_SRC]"$. See $LK,"BootHD",A="FF:::/Adam/Opt/Boot/BootHD.CPP,BOOT_SRC_HARDDRV"$, $LK,"BootDVD",A="FF:::/Adam/Opt/Boot/BootDVD.CPP,BOOT_SRC_DVD"$ & $LK,"BootRAM",A="FF:::/Adam/Opt/Boot/Reboot.CPP,BOOT_SRC_RAM"$.
MOV AX,VGAM_TEXT/16
MOV ES,AX
MOV U32 ES:[0],'O'+BLUE<<12+('S'+GREEN<<12)<<16
@@ -134,7 +134,7 @@ GET_IP: POP BX
OR AL,2
OUT 0x92,AL
POP U32 [SYS_BOOT_SRC] //See $LK,"BootHD",A="FF:::/Adam/Boot/BootHD.CPP,BOOT_SRC_HARDDRV"$, $LK,"BootCD",A="FF:::/Adam/Boot/BootCD.CPP,BOOT_SRC_CDROM"$, & $LK,"BootRAM",A="FF:::/Adam/Boot/Boot.CPP,BOOT_SRC_RAM"$.
POP U32 [SYS_BOOT_SRC] //See $LK,"BootHD",A="FF:::/Adam/Opt/Boot/BootHD.CPP,BOOT_SRC_HARDDRV"$, $LK,"BootDVD",A="FF:::/Adam/Opt/Boot/BootDVD.CPP,BOOT_SRC_DVD"$, & $LK,"BootRAM",A="FF:::/Adam/Opt/Boot/Reboot.CPP,BOOT_SRC_RAM"$.
CLD
XOR EAX,EAX
@@ -345,7 +345,7 @@ USE64
RET
//************************************
SYS_RAM_REBOOT:: //This gets copied high. $LK,"SYS_RAM_REBOOT",A="FF:::/Adam/Boot/Boot.CPP,SYS_RAM_REBOOT:2"$
SYS_RAM_REBOOT:: //This gets copied high. $LK,"SYS_RAM_REBOOT",A="FF:::/Adam/Opt/Boot/Reboot.CPP,SYS_RAM_REBOOT:2"$
PUSH U32 CGDT.ds //stk seg
PUSH U32 BOOT_RAM_LIMIT //stk
PUSH U32 0 //flags
+9 -10
View File
@@ -28,21 +28,17 @@ Bool TaskValidate(CTask *task)
Bool Kill(CTask *task,Bool wait=TRUE)
{//Terminate other task.
I64 i;
Bool old_preempt=Preempt;
if (TaskValidate(task) && task!=sys_winmgr_task) {
for (i=0;i<mp_cnt;i++)
if (task==cpu_structs[i].seth_task)
goto kl_fail;
return FALSE;
LBts(&task->task_flags,TASKf_KILL_TASK);
if (wait) {
do Yield;
while (TaskValidate(task) && Bt(&task->task_flags,TASKf_KILL_TASK));
}
Preempt(old_preempt);
return TRUE;
}
kl_fail:
Preempt(old_preempt);
return FALSE;
}
@@ -78,7 +74,7 @@ CTaskStk *TaskStkNew(I64 stk_size,CTask *task)
return temps;
}
#exe {OptOn(OPTf_NO_REG_VAR);};
#exe {Option(OPTf_NO_REG_VAR,ON);};
argpop I64 CallStkGrow(I64 stk_size_threshold,I64 stk_size,
/*argpop*/I64 (*fp_addr)(...),...)
{//Grow stk in call with any fixed num of args.
@@ -149,7 +145,7 @@ argpop I64 CallStkGrow(I64 stk_size_threshold,I64 stk_size,
return 0; //dummy to get rid of warning
}
;
#exe {OptOff(OPTf_NO_REG_VAR);};
#exe {Option(OPTf_NO_REG_VAR,OFF);};
I64 TaskInit(CTask *task,I64 stk_size)
{//Returns Fs of task
@@ -197,8 +193,8 @@ I64 TaskInit(CTask *task,I64 stk_size)
task->win_top =13;
task->win_bottom =text.rows-2;
if (dsk.boot_drv_let) //Beware Adam $LK,"TaskInit",A="FF:::/Kernel/KStart.CPP,TaskInit"$. I guess ok until $LK,"ChgDsk",A="FF:::/Kernel/KEnd.CPP,ChgDsk"$().
task->cur_dv=dsk.let_to_drv[ToUpper(dsk.boot_drv_let)-'A'];
if (blkdev.boot_drv_let) //Beware Adam $LK,"TaskInit",A="FF:::/Kernel/KStart.CPP,TaskInit"$. I guess ok until $LK,"ChgDsk",A="FF:::/Kernel/KEnd.CPP,ChgDsk"$().
task->cur_dv=blkdev.let_to_drv[ToUpper(blkdev.boot_drv_let)-'A'];
task->cur_dir=StrNew("/Home",task);
Seed(,task);
@@ -379,14 +375,17 @@ CTask *User(U8 *fmt=NULL,...)
U0 SrvTaskCont()
{//Act as server task in a loop handling commands.
I64 old_flags=GetRFlags;
FlushMsgs;
while (TRUE) {
if (SrvCmdsHandler && Fs->title_src==TTS_TASK_NAME)
CLI
if (SrvCmdsHandler(old_flags) && Fs->title_src==TTS_TASK_NAME)
MemCpy(Fs->task_title,Fs->task_name,TASK_NAME_LEN+1);
FlushMsgs;
LBts(&Fs->task_flags,TASKf_IDLE);
LBts(&Fs->task_flags,TASKf_AWAITING_MSG);
Yield;
SetRFlags(old_flags);
}
}
+2156 -2115
View File
File diff suppressed because it is too large. Load diff
+14 -19
View File
@@ -1,10 +1,10 @@
//Compile this by calling $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$().
//Don't do it directly. See $LK,"Cmp(\"/Kernel/Kernel\")",A="FF:::/Adam/Boot/BootIns.CPP,Cmp(\"/Kernel/Kernel\""$.
//Don't do it directly. See $LK,"Cmp(\"/Kernel/Kernel\")",A="FF:::/Adam/Opt/Boot/BootIns.CPP,Cmp(\"/Kernel/Kernel\""$.
#exe {
Cd(__DIR__);;
OptOn(OPTf_WARN_PAREN);
OptOn(OPTf_WARN_DUP_TYPES);
Option(OPTf_WARN_PAREN,ON);
Option(OPTf_WARN_DUP_TYPES,ON);
#include "KCfg"
CKernelCfg *kernel_cfg;
kernel_cfg=KernelCfgNew;
@@ -12,14 +12,14 @@
#include "KernelA.HPP"
#include "KStart"
#include "KUtils"
#include "KMathA"
#exe {OptOn(OPTf_KEEP_PRIVATE);};
#include "KUtils"
#exe {Option(OPTf_KEEP_PRIVATE,ON);};
#include "/Compiler/CompilerA.HPP"
#exe {OptOn(OPTf_EXTERNS_TO_IMPORTS);};
#exe {Option(OPTf_EXTERNS_TO_IMPORTS,ON);};
#include "/Compiler/CompilerB.HPP"
#exe {OptOff(OPTf_EXTERNS_TO_IMPORTS);};
#exe {OptOff(OPTf_KEEP_PRIVATE);};
#exe {Option(OPTf_EXTERNS_TO_IMPORTS,OFF);};
#exe {Option(OPTf_KEEP_PRIVATE,OFF);};
#include "KernelB.HPP"
#include "KExts"
#include "StrA"
@@ -30,14 +30,14 @@
#include "Sched"
#include "MemC"
#include "Font8x8"
#include "KHashA"
#include "StrB"
#include "Ints"
#include "KHashA"
#include "KInts"
#include "KDataTypes"
#include "Compress"
#include "KHashB"
#include "KLoad"
#include "Date"
#include "KDate"
#include "StrPrint"
#include "StrScan"
#include "KDefine"
@@ -46,19 +46,14 @@
#include "KDbg"
#include "KeyDev"
#include "KExcept"
#include "KbdMouse/InputPointer"
#include "KbdMouse/Keyboard"
#include "KbdMouse/Mouse"
#include "KbdMouse/Message"
#include "SerialDev/MakeSerialDev"
#include "QSort"
#include "Task"
#include "KTask"
#include "SrvCmd"
#include "PCIBIOS"
#exe {Cd("Dsk");};
#include "Dsk"
#exe {Cd("..");};
#include "MultiProc"
#include "EdLite"
#include "BlkDev/MakeBlkDev"
#include "PSect"
#include "KEnd"
+128 -77
View File
@@ -281,7 +281,7 @@ public class CMathODE
//Interrupts
//0x00-0x1F are reserved by Intel
#define I_DIVIDE_BY_ZERO 0x00
#define I_DIV_ZERO 0x00
#define I_SINGLE_STEP 0x01
#define I_NMI 0x02
#define I_BPT 0x03
@@ -440,8 +440,8 @@ class CKernel
#define RLf_FULL_HEAP 6
#define RLf_RAW 7
#define RLf_INTERRUPTS 8
#define RLf_MP 9
#define RLf_DSK 10
#define RLf_BLKDEV 9
#define RLf_MP 10
#define RLf_COMPILER 11
#define RLf_DOC 12
#define RLf_WINMGR 13
@@ -458,8 +458,8 @@ class CKernel
#define RLF_FULL_HEAP 0x00040
#define RLF_RAW 0x00080
#define RLF_INTERRUPTS 0x00100
#define RLF_MP 0x00200
#define RLF_DSK 0x00400
#define RLF_BLKDEV 0x00200
#define RLF_MP 0x00400
#define RLF_COMPILER 0x00800
#define RLF_DOC 0x01000
#define RLF_WINMGR 0x02000
@@ -570,7 +570,8 @@ class CRAXRBCRCXRDX
#define EXT_WIN_FOCUS 1
#define EXT_HEAPLOG_MALLOC 2
#define EXT_HEAPLOG_FREE 3
#define EXT_NUM_ENTRIES 4
#define EXT_DBG_RESUME 4
#define EXT_NUM_ENTRIES 5
#help_index "Processor"
#define DFT_CACHE_LINE_WIDTH 64
@@ -602,9 +603,10 @@ class CSema
#define SYS_SEMA_TT 16
#define SYS_SEMA_MUTE 17
#define SYS_SEMA_FORCE_WINMGR 18
#define SYS_SEMA_TMBEAT 19
#define SYS_SEMA_FIX 20
#define NUM_SYS_SEMAS 21
#define SYS_SEMA_JUST_PUMP_MSGS 19
#define SYS_SEMA_TMBEAT 20
#define SYS_SEMA_FIX 21
#define NUM_SYS_SEMAS 22
#define SYSf_CTRL_ALT_DEL 0
#define SYSf_CTRL_ALT_C 1
@@ -788,9 +790,9 @@ public class CMemberLstMeta
public class CMemberLst
{
CMemberLst *next,*left,*right,
*left2,*right2; //For finding dup class local vars, not names.
*left_class_base,*right_class_base; //For finding dup class local vars.
U8 *str;
CHashClass *member_class,*member_class2;
CHashClass *member_class,*member_class_base;
CMemberLstMeta *meta;
U32 use_cnt;
U16 flags;
@@ -827,7 +829,8 @@ public class CHashClass:CHashSrcSym
U32 member_cnt;
U8 ptr_stars_cnt,raw_type;
U16 flags;
CMemberLst *member_lst,*member_lst2,
CMemberLst *member_lst_and_root, //Head of linked list and root of tree.
*member_class_base_root, //For finding dup class local vars.
*last_in_member_lst;
CHashClass *base_class,
*fwd_class;
@@ -1014,7 +1017,7 @@ public class CHashGlblVar:CHashSrcSym
#define DOCEF_DONT_DRAW 0x400000000000000 //only works on sprites
#define DOCEG1_DONT_EDIT (DOCEF_DEFINE|DOCEF_HTML_LINK|\
DOCEF_BIN_PTR_LINK|DOCEF_SCROLLING_X|DOCEF_TAG_CB)
DOCEF_AUX_STR|DOCEF_BIN_PTR_LINK|DOCEF_SCROLLING_X|DOCEF_TAG_CB)
//These are identical to Doc flags
#define DOCEF_HIGHLIGHT 0x4000000
@@ -1329,7 +1332,6 @@ public class CDoc //Linked Text File header
CDocEntry *cur_entry,*old_cur_entry;
I32 cur_col,old_cur_col,
line_start_col,top_line_num,
ext_ascii_val,ext_ascii_cnt, //Like <CTRL-ALT-a>, <ALT-#><ALT-#><ALT-#>
dollar_buf_size,dollar_buf_ptr;
U8 *dollar_buf; //When entering $$ cmds, it buffers them until the end $$.
@@ -1346,7 +1348,7 @@ public class CDoc //Linked Text File header
CEdFindText *find_replace;
U8 *cur_sprite;//Set cur_sprite use (ip.pos.x,ip.pos.y) as input.
//Output is nearest. See $LK,"*_cur_elem_num=",A="FF:::/Adam/Gr/SpriteEd.CPP.Z,*_cur_elem_num=doc->"$ and $LK,"::/Demo/Graphics/Pick.CPP.Z"$.
//Output is nearest. See $LK,"*_cur_elem_num=",A="FF:::/Adam/Gr/SpriteEd.CPP,*_cur_elem_num=doc->"$ and $LK,"::/Demo/Graphics/Pick.CPP"$.
I64 nearest_sprite_elem_num;
CEdFileName filename;
@@ -1390,6 +1392,7 @@ tries to do something.
#define WIF_SELF_GRAB_SCROLL 0x0200
#define WIF_SELF_DOC 0x0400
#define WIF_SELF_ODE 0x0800
#define WIF_SELF_KEY_DESC 0x1000
//FOCUS 0x00010000
#define WIF_FOCUS_TASK_MENU 0x00020000
#define WIF_FOCUS_TASK_CTRLS 0x00040000
@@ -1404,7 +1407,7 @@ tries to do something.
#define WIG_DBL_CLICK (WIF_FOCUS_TASK_IP_L_D|WIF_FOCUS_TASK_IP_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 0
#define WIG_USER_TASK_DFT WIF_SELF_KEY_DESC
#define WIf_SELF_FOCUS 0
#define WIf_SELF_CTRLS 2
@@ -1415,6 +1418,7 @@ tries to do something.
#define WIf_SELF_GRAB_SCROLL 9
#define WIf_SELF_DOC 10
#define WIf_SELF_ODE 11
#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
@@ -1450,16 +1454,61 @@ public class CWinMgrGlbls
grab_scroll_closed;
};
#help_index "Compiler/Directive"
//Compiler Options
// Use $LK,"OptOn",A="MN:OptOn"$() $LK,"OptOff",A="MN:OptOff"$()
#help_index "AutoComplete"
#define ACf_INIT_IN_PROGRESS 0
#define AC_MAX_FILLINS 10
public class CAutoCompleteGlbls
{
I64 num_words;
CHashTable *hash_table;
U8 *cur_word;
I64 flags;
CTask *task;
I64 partial_len,num_fillins,
fillin_hits [AC_MAX_FILLINS+1];
CHashAC *fillin_matches[AC_MAX_FILLINS+1];
};
//You might need to do #exe {OptOn();}
#help_index "AutoComplete/Dictionary"
#define ACD_WORD_FILENAME "/Adam/AutoComplete/ACWords.DAT.Z"
#define ACD_DEF_FILENAME "/Adam/AutoComplete/ACDefs.DAT"
#define ACD_DEF_FILENAME_Z "/Adam/AutoComplete/ACDefs.DAT.Z"
#define ACD_H1 0
#define ACD_H1_END 1
#define ACD_DEF 2
#define ACD_DEF_END 3
#define ACD_PRONUNCIATION 4
#define ACD_PRONUNCIATION_END 5
#define ACD_POS 6
#define ACD_POS_END 7
#define ACD_EXTRA 8
#define ACD_EXTRA_END 9
#define ACD_BLK_SIZE 0x4000
#define ACD_END_CHAR 0x00
#define ACD_WORD_CHAR 0x01
#define ACD_DEF_CHAR 0x02
#define ACD_PRONUNCIATION_CHAR 0x03
#define ACD_POS_CHAR 0x04
#define ACD_EXTRA_CHAR 0x05
#define ACD_MAX_FILLINS 10
public class CAutoCompleteDictGlbls
{
U8 *word_lst;
I64 word_lst_size,num_words,num_fillins;
U8 *fillins[ACD_MAX_FILLINS];
Bool has_words,has_defs;
};
#help_index "Compiler/Directive"
//Compiler $LK,"Option",A="MN:Option"$()s
//You might need to do #exe {Option();}
//Note: The #exe statement is lexed-ahead,
//so it takes effect earlier than you might expect.
#define OPTf_ECHO 0x00
#define OPTf_OPT_TRACE 0x01
#define OPTf_COMPILE_TRACE 0x02
#define OPTf_TRACE 0x01
#define OPTf_WARN_UNUSED_VAR 0x10 //Applied to funs, not statements
#define OPTf_WARN_PAREN 0x11 //Warn unnecessary parens
#define OPTf_WARN_DUP_TYPES 0x12 //Warn dup local var type statements
@@ -1519,7 +1568,7 @@ public class CWinMgrGlbls
#define ICF_SHORT_JMP 0x000001000
#define ICF_A1_FIRST 0x000002000
#define ICF_PUSH_RESULT 0x000004000
#define ICF_TRACE 0x000008000
#define ICF_PASS_TRACE 0x000008000
#define ICF_R_WAS_STK 0x000010000
#define ICF_A1_WAS_STK 0x000020000
#define ICF_A2_WAS_STK 0x000040000
@@ -1647,23 +1696,24 @@ class CCodeMisc
#define IEF_48_REX 0x040
#define IEF_REX_ONLY_R8_R15 0x080
#define IEF_REX_XOR_LIKE 0x100
#define IEF_STI 0x200
#define IEF_STI_LIKE 0x200
#define IEF_ENDING_ZERO 0x400
//Slash value
#define SV_R_REG 8
#define SV_I_REG 9
#define SV_NONE 10
#define SV_STI_LIKE 10 //$LK,"uasm_slash_val",A="FF:::/Compiler/AsmInit.CPP,uasm_slash_val"$ only.
#define SV_NONE 11
class CInstruction
{
U8 ins_entry_num, //This entry num in opcode hash entry
opcode_cnt,
opcode[4];
U16 flags;
U8 slash_val,opcode_modifier,
U8 slash_val,uasm_slash_val,opcode_modifier,
arg1,arg2,
size1,size2,//Size in bits
pad[2];
pad;
};
//x86 opcodes
@@ -1723,7 +1773,7 @@ I64 class CAbsCntsI64
};
class CAsmUndefHash
{//Only place created is $LK,"Exp Parser",A="FF:::/Compiler/PrsExp.CPP.Z,sizeof(CAsmUndefHash)"$ when an undef is found in an ASM exp.
{//Only place created is $LK,"Exp Parser",A="FF:::/Compiler/PrsExp.CPP,sizeof(CAsmUndefHash)"$ when an undef is found in an ASM exp.
CAsmUndefHash *next;
CHashExport *hash;
};
@@ -2046,7 +2096,7 @@ class CLexHashTableContext
#define CCF_KEEP_DOT 64
#define CCF_KEEP_NUM_SIGN 128
#define CCF_KEEP_AT_SIGN 256
#define CCf_OPT_TRACE_PRESENT 9
#define CCf_PASS_TRACE_PRESENT 9
#define CCF_NOT_CONST 0x0000010000
#define CCF_NO_REG_OPT 0x0000020000
#define CCF_IN_QUOTES 0x0000040000
@@ -2105,7 +2155,7 @@ public class CCmpCtrl
CStreamBlk *next_stream_blk,*last_stream_blk;
CAOT *aot;
I64 pass,opts,otrace_mask,
I64 pass,opts,pass_trace,saved_pass_trace,
error_cnt,warning_cnt;
//For intermediate codes with multiple float ops (int<->float conversions)
@@ -2206,8 +2256,8 @@ public class CATARep
#help_index "File/Low Level"
#define BLK_SIZE_BITS 9
#define BLK_SIZE (1<<BLK_SIZE_BITS)
#define CD_BLK_SIZE (4*BLK_SIZE)
#define CD_FILE_OFFSET 80
#define DVD_BLK_SIZE (4*BLK_SIZE)
#define DVD_FILE_OFFSET 80
#define INVALID_CLUSTER (-1)
class CMBRPrt
@@ -2450,7 +2500,7 @@ class CISO1PriDesc
#define RS_ATTR_FIXED 0x1000 //F
#help_index "File/CD DVD"
//Media types for $LK,"CDImageWrite",A="MN:CDImageWrite"$()
//Media types for $LK,"DVDImageWrite",A="MN:DVDImageWrite"$()
#define MT_CD 1
#define MT_DVD 2
@@ -2591,9 +2641,9 @@ public class CBlkDev
#define DVT_NULL 0
#define DVT_REDSEA 1 //Supported
#define DVT_FAT32 2 //Supported except for short names, to some degree
#define DVT_ISO9660 3 //Supported (CD-ROM)
#define DVT_ISO13490 4 //Not Supported (CD-ROM)
#define DVT_ISO13346 5 //Not Supported (CD-ROM)
#define DVT_ISO9660 3 //Supported (CD/DVD)
#define DVT_ISO13490 4 //Not Supported (CD/DVD)
#define DVT_ISO13346 5 //Not Supported (CD/DVD)
#define DVT_NTFS 6 //Not Supported
#define DVT_UNKNOWN 7
#define DVT_NUM_TYPES 8
@@ -2630,7 +2680,7 @@ public class CDrv
I64 base_offset,
size,
file_system_info_sect,
map1,map2,
fat1,fat2,
root_cluster,
data_area,
spc; //sectors per cluster
@@ -2639,9 +2689,9 @@ public class CDrv
CBlkDev *bd;
CFAT32FileInfoSect *fis;
I64 map_blk_dirty,
cur_map_blk_num;
U32 *cur_map_blk;
I64 fat_blk_dirty,
cur_fat_blk_num;
U32 *cur_fat_blk;
CFreeLst *next_free,*last_free;
};
@@ -2657,17 +2707,17 @@ class CCacheBlk
};
#help_index "File/System"
public class CDskGlbls
public class CBlkDevGlbls
{
U8 *dft_iso_filename; //See $LK,"dsk.dft_iso_filename",A="FF:::/Kernel/KEnd.CPP,dsk.dft_iso_filename"$
CBlkDev *blkdevs;
U8 *dft_iso_filename; //See $LK,"blkdev.dft_iso_filename",A="FF:::/Kernel/KEnd.CPP,blkdev.dft_iso_filename"$
U8 *temp_filename;
CCacheBlk *cache_base,*cache_ctrl,**cache_hash_table;
I64 cache_size,read_cnt,write_cnt;
CBlkDev *blkdevs;
CDrv *drvs,*let_to_drv[32];
I64 auto_mount_ide_cnt;
U8 temp_filename[STR_LEN],boot_drv_let,
first_hd_drv_let,first_cd_drv_let;
Bool boot_rescue_drv_pmt,cdrom_boot_is_good;
U8 boot_drv_let,first_hd_drv_let,first_dvd_drv_let;
Bool boot_rescue_drv_pmt,dvd_boot_is_good,pad[3];
};
#help_index "File/Internal"
@@ -2687,7 +2737,7 @@ public class CDirContext
#define FF_CONTIGUOUS 16
#define FF_USE_OLD_DATETIME 32
public class CFile //See $LK,"::/Demo/Dsk/DataBase.CPP.Z"$.
public class CFile //See $LK,"::/Demo/Dsk/DataBase.CPP"$.
{
I64 flags;
CDirEntry de;
@@ -2904,7 +2954,8 @@ public class CKbdStateGlbls
I64 scan_code, //See $LK,"scan codes",A="FI:::/Doc/CharOverview.TXT"$
last_down_scan_code,
cnt, //Count of keys pressed since boot.
timestamp; //Output: GetTSC when event.
timestamp, //Output: GetTSC when event.
new_key_timestamp; //Output: GetTSC when new key event.
CFifoU8 *fifo,*fifo2; //Private
CFifoI64 *scan_code_fifo;
@@ -3144,8 +3195,6 @@ class CSrvCtrl
#define MSG_IP_R_DOWN_UP -9 //Down & Up
#define MSG_IP_R_D_DOWN_UP -11 //Down & Up
#define MSGF_ALLOW_KEY_DESC 63
#help_index "Task"
#define TASK_TITLE_LEN 127
@@ -3165,7 +3214,7 @@ public class CTaskSettings
U8 text_attr,title_src,
border_attr,border_src,
task_title[TASK_TITLE_LEN+1];
Bool border,preempt,cursor,scroll,autocomplete,pad[3];
Bool border,cursor,scroll,autocomplete,pad[4];
U0 pad;#assert !($$&7) //(compiler lags one token)
};
@@ -3185,19 +3234,18 @@ public class CTaskSettings
// TASK task flags
#define TASKf_KILL_TASK 0
#define TASKf_SUSPENDED 1
#define TASKf_PREEMPT 2
#define TASKf_IDLE 3
#define TASKf_INPUT_FILTER_TASK 4
#define TASKf_FILTER_INPUT 5
#define TASKf_HAS_SONG 6
#define TASKf_NOT_RAW 7
#define TASKf_DISABLE_BPTS 8
#define TASKf_AWAITING_MSG 9
#define TASKf_BREAK_LOCKED 10
#define TASKf_PENDING_BREAK 11
#define TASKf_BREAK_TO_SHIFT_ESC 12
#define TASKf_KILL_AFTER_DBG 13
#define TASKf_NONTIMER_RAND 14
#define TASKf_IDLE 2
#define TASKf_INPUT_FILTER_TASK 3
#define TASKf_FILTER_INPUT 4
#define TASKf_HAS_SONG 5
#define TASKf_NOT_RAW 6
#define TASKf_DISABLE_BPTS 7
#define TASKf_AWAITING_MSG 8
#define TASKf_BREAK_LOCKED 9
#define TASKf_PENDING_BREAK 10
#define TASKf_BREAK_TO_SHIFT_ESC 11
#define TASKf_KILL_AFTER_DBG 12
#define TASKf_NONTIMER_RAND 13
//locked flags
#define TASKLf_TASK_LOCK 0
@@ -3299,7 +3347,8 @@ public class CTask //The Fs segment reg points to current CTask.
I64 rand_seed,
task_num,
fault_num,fault_err_code;
CTask *popup_task;
CTask *popup_task,
*dbg_task;
CWinScroll horz_scroll,vert_scroll;
I64 user_data;
@@ -3435,6 +3484,7 @@ public class CSysFixedArea
#define SCf_IP_R_DOWN 17
#define SCf_DELETE 18
#define SCf_INS 19
#define SCf_NO_SHIFT 30
#define SCf_KEY_DESC 31
#define SCF_E0_PREFIX (1<<SCf_E0_PREFIX)
#define SCF_KEY_UP (1<<SCf_KEY_UP)
@@ -3449,6 +3499,7 @@ public class CSysFixedArea
#define SCF_IP_R_DOWN (1<<SCf_IP_R_DOWN)
#define SCF_DELETE (1<<SCf_DELETE)
#define SCF_INS (1<<SCf_INS)
#define SCF_NO_SHIFT (1<<SCf_NO_SHIFT)
#define SCF_KEY_DESC (1<<SCf_KEY_DESC)
//TempleOS places a 1 in bit 7 for
@@ -3491,7 +3542,7 @@ public class CSysFixedArea
#define SC_PRTSCRN1 0xAA
#define SC_PRTSCRN2 0xB7
#help_index "Char;Debugging/Raw Output"
#help_index "Char;Debugging/Raw Output;TextBase Layer/Char"
//text.raw_flags
#define RWF_IN_DOLLAR 1
#define RWF_LAST_DOLLAR 2
@@ -3641,7 +3692,6 @@ public class CDC
#help_index "Compression/Piece by Piece"
#define ARC_MAX_BITS 12
#define ARC_MAX_ENTRY (1<<ARC_MAX_BITS-1)
#define CT_NONE 1
#define CT_7_BIT 2
@@ -3667,8 +3717,8 @@ public class CArcCtrl
saved_basecode,
entry_used,
last_ch;
CArcEntry compress[ARC_MAX_ENTRY+1],
*hash[ARC_MAX_ENTRY+1];
CArcEntry compress[1<<ARC_MAX_BITS],
*hash[1<<ARC_MAX_BITS];
};
#help_index "Compression"
@@ -3721,10 +3771,10 @@ class CKeyDevEntry
class CKeyDevGlbls
{
CKeyDevEntry put_key_root;
U0 (**fp_ctrl_alt_let_cbs)(I64 sc);
I64 ctrl_alt_let_in_irq_flags,
**ctrl_alt_let_ret_addr; //addr of ret addr on stack in kbd irq
U8 **ctrl_alt_let_descs,
U0 (**fp_ctrl_alt_cbs)(I64 sc);
I64 ctrl_alt_in_irq_flags,
**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;
};
@@ -3758,8 +3808,9 @@ $$=64;
#help_index "Debugging"
class CMPCrash
{
CTask *task;
I64 cpu_num;
CTask *task;
I64 rip;
U8 *msg;
I64 msg_num;
};
@@ -3770,7 +3821,7 @@ public class CDbgGlbls
U8 *msg;
I64 msg_num;
CMPCrash *mp_crash;
U8 *fault_handlers_code,
U8 *int_fault_code,
*fix_file_line;
CPSectCache *psect_cache;
I64 psect_cache_index;
@@ -3785,10 +3836,10 @@ public class CDbgGlbls
#define BOOT_SRC_NULL 0
#define BOOT_SRC_RAM 1
#define BOOT_SRC_HARDDRV 2
#define BOOT_SRC_CDROM 3
#define BOOT_SRC_DVD 3
// $LK,"Auto",A="MN:Auto"$("") StdIn for call to $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$().
#define STD_DISTRO_CDROM_CFG "Tb1\nScale2Mem(2048,0x40000)\nt3 \n\n\n\n"
#define STD_DISTRO_DVD_CFG "Tb1\nScale2Mem(2048,0x40000)\nt3 \n\n\n\n"
#help_index "Misc/Registry"
//Registry sys_msg_flags. $LK,"RegOneTimePopUp",A="MN:RegOneTimePopUp"$()
+10 -14
View File
@@ -1,7 +1,7 @@
/* Kernel ASM symbols.
$LK,"KernelB",A="FF:::/Kernel/Kernel.PRJ,KernelB"$ Kernel.PRJ
$LK,"KernelB",A="FF:::/Compiler/Compiler.PRJ,KernelB"$ Compiler.PRJ
$LK,"KernelB",A="FF:::/Adam.CPP,KernelB"$ Adam.CPP
$LK,"KernelB",A="FF:::/StartOS.CPP,KernelB"$ StartOS.CPP
*/
#help_index "Bit"
@@ -71,9 +71,9 @@ public _intern IC_QUE_INS_REV U0 QueInsRev(
public _intern IC_QUE_REM U0 QueRem(CQue *entry); //Remove item from queue.
#help_index "I/O;Processor/IO Port"
public _intern IC_IN_U16 I64 InU16(I64 port); //Read U16 from I/O port.
public _intern IC_IN_U32 I64 InU32(I64 port); //Read U32 from I/O port.
public _intern IC_IN_U8 I64 InU8(I64 port); //Read U8 from I/O port.
public _intern IC_IN_U16 U16 InU16(I64 port); //Read U16 from I/O port.
public _intern IC_IN_U32 U32 InU32(I64 port); //Read U32 from I/O port.
public _intern IC_IN_U8 U8 InU8(I64 port); //Read U8 from I/O port.
public _intern IC_OUT_U16 U0 OutU16(I64 port, I64 val); //Write U16 to I/O port.
public _intern IC_OUT_U32 U0 OutU32(I64 port, I64 val); //Write U32 to I/O port.
public _intern IC_OUT_U8 U0 OutU8(I64 port, I64 val); //Write U8 to I/O port.
@@ -257,16 +257,16 @@ public _intern IC_SET_RSP U0 SetRSP(U8 *d); //Set RSP register value.
public _extern _CPUID U0 CPUId(
U32 rax,CRAXRBCRCXRDX *result); //Do CPUID instruction.
public _extern _LXCHG_I64 I64 LXchgI64(I64 *dst,I64 d); //Locked eXchange I64s.
public _extern _LXCHG_U16 U64 LXchgU16(U16 *dst,U16 d); //Locked eXchange U16s.
public _extern _LXCHG_U32 U64 LXchgU32(U32 *dst,U32 d); //Locked eXchange U32s.
public _extern _LXCHG_U8 U64 LXchgU8(U8 *dst,U8 d); //Locked eXchange U8s.
public _extern _LXCHG_U16 U16 LXchgU16(U16 *dst,U16 d); //Locked eXchange U16s.
public _extern _LXCHG_U32 U32 LXchgU32(U32 *dst,U32 d); //Locked eXchange U32s.
public _extern _LXCHG_U8 U8 LXchgU8(U8 *dst,U8 d); //Locked eXchange U8s.
public _extern _SET_MSR U0 SetMSR(
I64 model_specific_reg,I64 val); //Model Specific Reg See $LK,"MSRs",A="MN:IA32_EFER"$.
public _extern _SYS_HLT U0 SysHlt(); //Loops doing HLT instruction.
public _extern _XCHG_I64 I64 XchgI64(I64 *dst,I64 d); //eXchange I64s.
public _extern _XCHG_U16 U64 XchgU16(U16 *dst,U16 d); //eXchange U16s.
public _extern _XCHG_U32 U64 XchgU32(U32 *dst,U32 d); //eXchange U32s.
public _extern _XCHG_U8 U64 XchgU8(U8 *dst,U8 d); //eXchange U8s.
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;
@@ -278,10 +278,6 @@ public _intern IC_CLFLUSH U0 CLFlush(U8 *a); //Flush cache line instruction.
public _intern IC_INVLPG
U0 InvlPg(U8 *a); //Invalidate page at addr instruction.
#help_index "Task"
public _intern IC_PREEMPT
Bool Preempt(Bool val=OFF); //Turn mutli-tasking preemption OFF/ON.
#help_index "Task;Processor"
public _intern IC_FS CTask *Fs(); //FS seg reg points to the current $LK,"CTask",A="MN:CTask"$.
+19 -9
View File
@@ -1,3 +1,10 @@
#help_index "AutoComplete"
#help_file "::/Doc/AutoComplete"
public extern CAutoCompleteGlbls ac;
#help_index "AutoComplete/Dictionary"
public extern CAutoCompleteDictGlbls acd;
#help_index "AutoFile;StdIn/AutoFile"
#help_file "::/Doc/AutoFile"
@@ -99,7 +106,7 @@ extern U0 PutS(U8 *st); //Use $LK,"Print",A="MN:Print"$()
public extern Bool Silent(Bool val=ON);
extern U8 *StrPrintHex(U8 *dst,I64 num;I64 width);
#help_index "Char;Debugging/Raw Output"
#help_index "Char;Debugging/Raw Output;TextBase Layer/Char"
public extern CTextGlbls text;
#help_index "Compiler/Lex"
@@ -258,9 +265,9 @@ public extern U0 ThrowBreak(CTask *task=NULL);
public extern U0 throw(I64 ch=0,Bool no_log=FALSE);
#help_index "File/CD DVD"
public extern U0 CDImageRead(U8 cd_drv_let,U8 *out_name);
public extern U0 CDImageWrite(U8 cd_drv_let,
U8 *in_name=NULL,I64 media_type=MT_CD);
public extern U0 DVDImageRead(U8 dvd_drv_let,U8 *out_name);
public extern U0 DVDImageWrite(U8 dvd_drv_let,
U8 *in_name=NULL,I64 media_type=MT_DVD);
#help_index "File/CFile"
public extern U0 FClose(CFile *f);
@@ -315,6 +322,7 @@ public extern Bool DirNew(CDrv *dv,U8 *cur_dir,
extern I64 FileAttr(U8 *name,I64 old_attr=0);
#help_index "File/Low Level"
#help_file "::/Doc/FileLowLevel"
public extern U0 BlkDevChk(CBlkDev *bd);
public extern Bool BlkDevLock(CBlkDev *bd);
public extern CBlkDev *BlkDevNextFree(U8 first_drv_let,I64 type);
@@ -374,7 +382,7 @@ public extern I64 AutoMountIDE();
extern I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free);
extern U0 DskCacheInit(I64 size_in_U8s);
public extern U0 DskCacheInvalidate(CDrv *dv);
public extern CDskGlbls dsk;
public extern CBlkDevGlbls blkdev;
#help_index "Graphics/Color"
extern U0 (*fp_set_std_palette)();
@@ -460,8 +468,8 @@ public extern I64 Scale2Mem(I64 min,I64 max,I64 limit=2*1024*1024*1024);
#help_index "Keyboard Devices/System;Char/System"
#help_file "::/Doc/KeyDev"
public extern U0 CtrlAltLetCBSet(U8 ch,U0 (*fp_handler)(I64 sc),U8 *desc,
Bool in_irq=FALSE);
public extern U0 CtrlAltCBSet(U8 ch,U0 (*fp_handler)(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);
@@ -629,7 +637,6 @@ public extern CSndGlbls snd;
#help_index "Task"
public extern U0 Exit();
public extern Bool IsPreempt();
public extern Bool IsSuspended(CTask *task=NULL);
public extern Bool Kill(CTask *task,Bool wait=TRUE);
public extern Bool Suspend(CTask *task=NULL,Bool state=TRUE);
@@ -675,7 +682,7 @@ public extern I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL);
public extern I64 PopUpPrint(U8 *fmt,...);
public extern U0 SrvCmdDel(CSrvCmd *tempc);
extern U0 SrvCmdLine();
public extern I64 SrvCmdsHandler(CTask *task=NULL);
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);
@@ -750,4 +757,7 @@ public extern I64 SysTimerRead();//18.33333*65536Hz (SYS_TIMER_FREQ)
public extern Bool Blink(F64 Hz=2.5);
public extern F64 tS(); //From SysTimerFreq.
#help_index "Windows"
public extern Bool WinInside(I64 x,I64 y,CTask *task=NULL,Bool border=FALSE);
#help_index ""
+32 -32
View File
@@ -8,7 +8,7 @@ U0 PutKey(I64 ch=0,I64 sc=0)
while (kbd.scan_code & SCF_SCROLL)
Yield; //Wait on SCROLL LOCK Key
while (tempp!=&keydev.put_key_root) {
if ((!(sc & SCF_KEY_DESC) || tempp->flags & KDF_HAS_DESCS) &&
if ((!(sc&SCF_KEY_DESC) || tempp->flags & KDF_HAS_DESCS) &&
(*tempp->put_key)(ch,sc))
break;
tempp=tempp->next;
@@ -19,7 +19,7 @@ U0 PutKey(I64 ch=0,I64 sc=0)
U0 PutChars(U64 ch)
{//Output chars. Up to 8 chars in a single U64.
//Don't use this. $LK,"See Print() shortcut.",A="FF:::/Doc/HolyC.TXT.Z,DemoHolyC"$
//Don't use this. $LK,"See Print() shortcut.",A="FF:::/Doc/HolyC.TXT,DemoHolyC"$
while (ch) {
PutKey(ch&255,0);
ch>>=8;
@@ -28,7 +28,7 @@ U0 PutChars(U64 ch)
U0 PutS(U8 *st)
{//Use $LK,"Print",A="MN:Print"$(). See $LK,"Keyboard Devices",A="HI:Keyboard Devices/System"$.
//Don't use this. $LK,"See Print() shortcut.",A="FF:::/Doc/HolyC.TXT.Z,DemoHolyC"$
//Don't use this. $LK,"See Print() shortcut.",A="FF:::/Doc/HolyC.TXT,DemoHolyC"$
I64 ch;
U8 *ptr;
Bool cont=TRUE;
@@ -55,19 +55,15 @@ U0 PutS(U8 *st)
U0 KeyDescSet(U8 *fmt,...)
{//Call this from key handler to report desc in $LK,"KeyMap",A="MN:KeyMap"$().
I64 i;
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
StrCpy(keydev.desc,buf);
keydev.handler=Caller;
Free(buf);
for (i=0;i<5;i++)
Yield; //Makes KeyMap work better.
}
CKeyDevEntry *KeyDevAdd(Bool (*fp_put_key)(I64 ch,I64 sc),
Bool (*fp_puts)(U8 *st),I64 priority,Bool key_descs=FALSE)
{//Places hook in StdOut chain. See $LK,"Keyboard Devices",A="HI:Keyboard Devices/System"$.
Bool old_preempt=Preempt;
CKeyDevEntry *tempp,*tempp1=keydev.put_key_root.last;
tempp=ACAlloc(sizeof(CKeyDevEntry));
tempp->put_key=fp_put_key;
@@ -78,15 +74,12 @@ CKeyDevEntry *KeyDevAdd(Bool (*fp_put_key)(I64 ch,I64 sc),
while (tempp1->priority>priority)
tempp1=tempp1->last;
QueIns(tempp,tempp1);
Preempt(old_preempt);
return tempp;
}
U0 KeyDevRem(CKeyDevEntry *tempp)
{//Remove StdOut hook and free.
Bool old_preempt=Preempt;
QueRem(tempp);
Preempt(old_preempt);
Free(tempp);
}
@@ -112,11 +105,8 @@ Bool KDRawPutS(U8 *st)
Bool KDInputFilterPutKey(I64 ch,I64 scan_code)
{
Bool old_preempt;
if (Bt(&Fs->task_flags,TASKf_INPUT_FILTER_TASK)) {
old_preempt=Preempt;
Msg(MSG_KEY_DOWN,ch,scan_code);
Preempt(old_preempt);
return TRUE;
} else
return FALSE;
@@ -125,12 +115,9 @@ Bool KDInputFilterPutKey(I64 ch,I64 scan_code)
Bool KDInputFilterPutS(U8 *st)
{
I64 ch;
Bool old_preempt;
if (Bt(&Fs->task_flags,TASKf_INPUT_FILTER_TASK)) {
old_preempt=Preempt;
while (ch=*st++)
Msg(MSG_KEY_DOWN,ch,0);
Preempt(old_preempt);
return TRUE;
} else
return FALSE;
@@ -152,7 +139,7 @@ U0 CtrlAltD(I64)
if (Fs==Gs->idle_task)
BptS(sys_winmgr_task->rip,sys_winmgr_task);
else
BptS(*keydev.ctrl_alt_let_ret_addr);
BptS(*keydev.ctrl_alt_ret_addr);
}
}
@@ -181,31 +168,44 @@ U0 CtrlAltX(I64)
LBts(sys_ctrl_alt_flags,SYSf_CTRL_ALT_X);
}
U0 CtrlAltLetCBSet(U8 ch,U0 (*fp_handler)(I64 sc),U8 *desc,Bool in_irq=FALSE)
U0 CtrlAltCBSet(U8 ch,U0 (*fp_handler)(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_let_cbs[ch]=fp_handler;
Free(keydev.ctrl_alt_let_descs[ch]);
keydev.ctrl_alt_let_descs[ch]=AStrNew(desc);
BEqu(&keydev.ctrl_alt_let_in_irq_flags,ch,in_irq);
keydev.fp_ctrl_alt_cbs[ch]=fp_handler;
Free(keydev.ctrl_alt_no_shift_descs[ch]);
if (no_shift_desc)
keydev.ctrl_alt_no_shift_descs[ch]=AStrNew(no_shift_desc);
else
keydev.ctrl_alt_no_shift_descs[ch]=NULL;
Free(keydev.ctrl_alt_shift_descs[ch]);
if (shift_desc)
keydev.ctrl_alt_shift_descs[ch]=AStrNew(shift_desc);
else
keydev.ctrl_alt_shift_descs[ch]=NULL;
BEqu(&keydev.ctrl_alt_in_irq_flags,ch,in_irq);
}
}
U0 KeyDevInit()
{
keydev.fp_ctrl_alt_let_cbs =CAlloc(26*sizeof(U8 *));
keydev.ctrl_alt_let_descs =CAlloc(26*sizeof(U8 *));
keydev.ctrl_alt_let_in_irq_flags=0;
keydev.fp_ctrl_alt_cbs =CAlloc(26*sizeof(U8 *));
keydev.ctrl_alt_no_shift_descs=CAlloc(26*sizeof(U8 *));
keydev.ctrl_alt_shift_descs =CAlloc(26*sizeof(U8 *));
keydev.ctrl_alt_in_irq_flags =0;
MemSet(&keydev.put_key_root,0,sizeof(CKeyDevEntry));
QueInit(&keydev.put_key_root);
KeyDevAdd(&KDInputFilterPutKey,&KDInputFilterPutS,0x40000000,FALSE);
KeyDevAdd(&KDRawPutKey,&KDRawPutS,0x60000000,FALSE);
CtrlAltLetCBSet('C',&CtrlAltC,"Sys/Break Execution",TRUE);
CtrlAltLetCBSet('D',&CtrlAltD,"Sys/Enter Debugger",TRUE);
CtrlAltLetCBSet('E',&CtrlAltE,"Sys/Spawn New User Task");
CtrlAltLetCBSet('F',&CtrlAltF,"Sys/VGA Flush",TRUE);
CtrlAltLetCBSet('M',&CtrlAltM,"Sys/Toggle Mute");
CtrlAltLetCBSet('T',&CtrlAltT,"Sys/Switch Focus to Next Task",TRUE);
CtrlAltLetCBSet('X',&CtrlAltX,"Sys/Kill Focused Task",TRUE);
CtrlAltCBSet('C',&CtrlAltC,"Cmd /Break Execution",,TRUE);
CtrlAltCBSet('D',&CtrlAltD,"Cmd /Enter Debugger",,TRUE);
CtrlAltCBSet('E',&CtrlAltE,"Cmd /Spawn New User Task");
CtrlAltCBSet('F',&CtrlAltF,"Cmd /VGA Flush",,TRUE);
CtrlAltCBSet('M',&CtrlAltM,"Cmd /Toggle Mute");
CtrlAltCBSet('T',&CtrlAltT,"Cmd /Switch Focus to Next Task",,TRUE);
CtrlAltCBSet('X',&CtrlAltX,"Cmd /Kill Focused Task",,TRUE);
}
+6 -5
View File
@@ -177,10 +177,10 @@ U0 MPWake(I64 target_cpu)
if (!target_cpu)
LBtr(&adam_task->task_flags,TASKf_AWAITING_MSG);
MPInt(I_WAKE,target_cpu);
if (!target_cpu)
LBtr(&adam_task->task_flags,TASKf_AWAITING_MSG);
if (Bt(&cpu_structs[target_cpu].cpu_flags,CPUf_SETH_SLEEP))//back to sleep?
cpu_structs[target_cpu].seth_task->wake_jiffy=0;
if (!target_cpu)
LBtr(&adam_task->task_flags,TASKf_AWAITING_MSG);
POPFD
}
}
@@ -217,7 +217,7 @@ U0 APSethTask()
TaskFinishOffDying;
if (!LBts(&my_ctrl->flags,SVCRf_LOCKED)) {
tempc=tempc1->next;
if (tempc==tempc1 || !SrvCmdRun(tempc,GetRFlags)) {
if (tempc==tempc1 || !SrvCmdRun(GetRFlags,tempc)) {
LBtr(&my_ctrl->flags,SVCRf_LOCKED) ;
if (my_ctrl->next_waiting==my_ctrl) {
Bts(&Gs->cpu_flags,CPUf_SETH_SLEEP);
@@ -396,13 +396,14 @@ U0 BSPInit()
}
}
U0 MPCrash()
interrupt U0 IntMPCrash()
{//Entering the debugger from another core causes an interrupt on core#0
//Which calls this routine.
*LAPIC_EOI(U32 *)=0;
mp_cnt=1;
Raw(ON);
text.raw_flags|=RWF_SHOW_DOLLAR;
"MP Crash CPU#%02X Task:%08X\n",dbg.mp_crash->cpu_num,dbg.mp_crash->task;
"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);
}
+14 -17
View File
@@ -8,7 +8,7 @@ I64 HasLower(U8 *src)
}
CHash *PSectFind(U8 *addr,I64 *_offset)
{//See $LK,"::/Kernel/KHashA.CPP",A="FL:::/Kernel/KHashA.CPP,1"$.
{//See $LK,"Hash",A="HI:Hash"$.
CHash *result=NULL;
CHashExport *tempex;
Bool has_lower=FALSE;
@@ -61,25 +61,22 @@ U0 PSectCacheAdd(CHash *temps,U8 *addr)
{
I64 i;
CDbgInfo *dbg_info;
Bool old_preempt;
CPSectCache *temppc;
if (temps && temps->type&HTT_FUN &&
(dbg_info=temps(CHashFun *)->dbg_info)) {
old_preempt=Preempt;
lock {i=dbg.psect_cache_index++;}
temppc=&dbg.psect_cache[i&(PSECT_CACHE_SIZE-1)];
temppc->base=dbg_info->body[0];
if (addr<temppc->base)
temppc->base=addr;
temppc->limit=dbg_info->body[dbg_info->max_line+1-dbg_info->min_line];
if (addr>=temppc->limit)
temppc->limit=addr+1;
i=MinI64(StrLen(temps->str),PSECT_CACHE_STR_LEN-1);
MemCpy(temppc->str,temps->str,i);
temppc->str[i]=0;
temppc->time_stamp=tS;
Preempt(old_preempt);
}
lock i=dbg.psect_cache_index++;
temppc=&dbg.psect_cache[i&(PSECT_CACHE_SIZE-1)];
temppc->base=dbg_info->body[0];
if (addr<temppc->base)
temppc->base=addr;
temppc->limit=dbg_info->body[dbg_info->max_line+1-dbg_info->min_line];
if (addr>=temppc->limit)
temppc->limit=addr+1;
i=MinI64(StrLen(temps->str),PSECT_CACHE_STR_LEN-1);
MemCpy(temppc->str,temps->str,i);
temppc->str[i]=0;
temppc->time_stamp=tS;
}
}
U8 *PSectCacheFind(U8 *addr,I64 *_offset)
+4 -4
View File
@@ -2,8 +2,8 @@ U0 QSortI64(I64 *base,I64 num, I64 (*fp_compare)(I64 e1,I64 e2))
{/*Quick Sort for width==8.
fp_compare() passes by value instead of ref.
For assending strings: return StrCmp(e1,e2);
For assending ints : return e1-e2;
For ascending strings: return StrCmp(e1,e2);
For ascending ints : return e1-e2;
Maybe, look at $LK,"::/Demo/MultiCore/RadixSort.CPP"$.
*/
@@ -85,8 +85,8 @@ U0 QSort2b(U8 *base,I64 num, I64 width,
U0 QSort(U8 *base,I64 num, I64 width, I64 (*fp_compare)(U8 *e1,U8 *e2))
{/*Quick Sort: fp_compare() passes by ref.
For assending strings: return StrCmp(*e1,*e2);
For assending ints : return *e1-*e2;
For ascending strings: return StrCmp(*e1,*e2);
For ascending ints : return *e1-*e2;
Don't return e1-e2 if numbers can overflow, return -1,0 or 1.
Maybe, look at $LK,"::/Demo/MultiCore/RadixSort.CPP"$.
+5 -13
View File
@@ -1,6 +1,4 @@
/*See $LK,"TempleOS MultiTasking",A="FI:::/Doc/MultiTasking.TXT"$.
On each core, tasks are linked in a
/*On each core, tasks are linked in a
circular doubly-linked list queue with
the Seth task as the head. On core#0,
the queue order represents the front-to-back
@@ -18,12 +16,8 @@ Tasks can be switched in half a microsecond.
The scheduler checks if a task is
waiting for a certain time or waiting
on a message and skips if not ready.
A task runs until it voluntarily yields
ctrl with a call to $LK,"Yield",A="MN:Yield"$() or gets
preempted by the fixed 1kHz $LK,"JIFFY_FREQ",A="MN:JIFFY_FREQ"$
timer interrupt. See $LK,"SYS_TIMER_HANDLER",A="MN:SYS_TIMER_HANDLER"$.
Tasks can ask not to be preempted with
$LK,"Preempt",A="MN:Preempt"$(ON/OFF). Tasks waiting on I/O
A task runs until it voluntarily yields ctrl
with a call to $LK,"Yield",A="MN:Yield"$(). Tasks waiting on I/O
often loop, checking for a status and
$LK,"Yield",A="MN:Yield"$ing. This does not really degrade
performance, but pegs the CPU Load.
@@ -155,11 +149,11 @@ _TASK_END_NOW::
CALL SET_FS_BASE
JMP I8 RESTORE_RSI_TASK_WITH_KEY_CHECK
RESTORE_RSI_NO_PREEMPT_TASK:
RESTORE_RSI_TASK:
BT U32 [SYS_CTRL_ALT_FLAGS],SYSf_CTRL_ALT_DEL
JC I32 HANDLE_SWAP_KEY_EVENT
XOR RAX,RAX
CMP U64 GS:CCPU.idle_task[RAX],RSI //IDLE TASK HAS PREEMPT-OFF
CMP U64 GS:CCPU.idle_task[RAX],RSI
JNE RESTORE_RSI_TASK_NO_KEY_CHECK
JMP I32 SWAP_IN_SETH_TASK_IF_READY
@@ -193,8 +187,6 @@ _YIELD::
MOV U64 CTask.rip[RSI],RBX
POP U64 CTask.rflags[RSI]
MOV U64 CTask.rsp[RSI],RSP
RESTORE_NEXT_RSI_TASK:
MOV RSI,U64 CTask.next_task[RSI]
RESTORE_RSI_TASK_WITH_KEY_CHECK:
@@ -1,5 +1,5 @@
U0 GridInit()
{//Init input pointer grid struct. See $LK,"::/Demo/Graphics/Grid.CPP.Z"$.
{//Init input pointer grid struct. See $LK,"::/Demo/Graphics/Grid.CPP"$.
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;
@@ -41,8 +41,7 @@ U0 IPVarsUpdate(I64 x,I64 y,I64 z,Bool l,Bool r)
}
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.CPP.Z,IPSet"$().
Bool old_preempt=Preempt;
{//Note: Generates a message. See $LK,"IPSet",A="FF:::/Demo/Games/Zing.CPP,IPSet"$().
if (!(0<=x<GR_WIDTH))
x=ip.pos.x;
if (!(0<=y<GR_HEIGHT))
@@ -64,7 +63,6 @@ U0 IPSet(I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,I64 l=MAX_I64,I64 r=MAX_I64)
MouseIPSet(x,y,z,l,r);
break;
}
Preempt(old_preempt);
}
U0 IPVarsInit()
@@ -51,7 +51,6 @@ U0 KbdCmdFlush()
U0 KbdSetLEDs(I64 sc)
{
Bool old_preempt=Preempt;
U8 v=0;
BEqu(&v,0,Bt(&sc,SCf_SCROLL));
BEqu(&v,1,Bt(&sc,SCf_NUM));
@@ -61,7 +60,6 @@ U0 KbdSetLEDs(I64 sc)
KbdCmdSend(KBD_PORT,v);
} catch
Fs->catch_except=TRUE;
Preempt(old_preempt);
}
U0 KbdMouseCmdAck(U8 val)
@@ -135,15 +133,15 @@ I64 Char2ScanCode(I64 ch,I64 sc_flags=0)
U8 ScanCode2Char(I64 sc)
{//Scan code to ASCII val.
U8 *table=NORMAL_KEY_SCAN_DECODE_TABLE;
if (sc & SCF_E0_PREFIX)
if (sc&SCF_E0_PREFIX)
return 0;
if (sc & SCF_CTRL)
if (sc&SCF_CTRL)
table=CTRL_KEY_SCAN_DECODE_TABLE;
else if (sc & SCF_SHIFT) {
if (!(sc & SCF_CAPS))
else if (sc&SCF_SHIFT) {
if (!(sc&SCF_CAPS))
table=SHIFT_KEY_SCAN_DECODE_TABLE;
} else {
if (sc & SCF_CAPS)
if (sc&SCF_CAPS)
table=SHIFT_KEY_SCAN_DECODE_TABLE;
}
sc&=0x7F;
@@ -255,6 +253,8 @@ U8 *ScanCode2KeyName(I64 sc)
CatPrint(buf,"ALT ");
if (sc&SCF_SHIFT)
CatPrint(buf,"SHIFT ");
if (sc&SCF_NO_SHIFT)
CatPrint(buf," ");
if (ch=ScanCode2Char(sc&255)) {
st=Char2KeyName(ch,FALSE);
StrCpy(buf+StrLen(buf),st);
@@ -297,7 +297,7 @@ U8 *ScanCode2KeyName(I64 sc)
U0 KbdBuildSC(U8 raw_byte,Bool in_irq,U8 *_last_raw_byte,I64 *_last_sc)
{
I64 ch,sc_flags,sc,sc2,sc_raw;
I64 ch,sc_flags,sc,sc2,sc_raw,new_key_f;
Bool set_LEDs=FALSE;
if (raw_byte==0xE0) {
*_last_raw_byte=raw_byte;
@@ -319,6 +319,7 @@ U0 KbdBuildSC(U8 raw_byte,Bool in_irq,U8 *_last_raw_byte,I64 *_last_sc)
sc.u8[0]=sc2;
}
new_key_f=SCF_NEW_KEY;
if (sc&SCF_KEY_UP)
switch (sc&~SCF_KEY_UP) {
case SC_SHIFT: sc_flags&=~SCF_SHIFT; break;
@@ -332,18 +333,28 @@ U0 KbdBuildSC(U8 raw_byte,Bool in_irq,U8 *_last_raw_byte,I64 *_last_sc)
}
else
switch (sc) {
case SC_SHIFT: sc_flags|=SCF_SHIFT; break;
case SC_CTRL: sc_flags|=SCF_CTRL; break;
case SC_ALT: sc_flags|=SCF_ALT; break;
case SC_DELETE: sc_flags|=SCF_DELETE; break;
case SC_INS: sc_flags|=SCF_INS; break;
case SC_SHIFT:
if (Bts(&sc_flags,SCf_SHIFT)) new_key_f=0;
break;
case SC_CTRL:
if (Bts(&sc_flags,SCf_CTRL)) new_key_f=0;
break;
case SC_ALT:
if (Bts(&sc_flags,SCf_ALT)) new_key_f=0;
break;
case SC_DELETE:
sc_flags|=SCF_DELETE;
break;
case SC_INS:
sc_flags|=SCF_INS;
break;
}
sc_flags|=SCF_NEW_KEY;
sc_flags|=new_key_f;
sc=sc_flags|sc|(sc_flags|sc_raw)<<32;
if (sc_flags & SCF_CTRL && sc_flags & SCF_ALT) {
if (!(sc & SCF_KEY_UP)) {
if (sc&255==SC_DELETE)
if (!(sc&SCF_KEY_UP)) {
if (sc&255==SC_DELETE && !(sc_flags & SCF_SHIFT))
CtrlAltDel(sc);
else {
if (sc&255==SC_ESC)
@@ -354,11 +365,13 @@ U0 KbdBuildSC(U8 raw_byte,Bool in_irq,U8 *_last_raw_byte,I64 *_last_sc)
ch=ScanCode2Char(sc&255);
if ('a'<=ch<='z') {
sc&=~(SCF_NEW_KEY|SCF_NEW_KEY<<32);
ch-='a';
kbd.last_down_scan_code=sc;
if (keydev.fp_ctrl_alt_let_cbs[ch-'a'] &&
Bt(&keydev.ctrl_alt_let_in_irq_flags,ch-'a')==in_irq) {
(*keydev.fp_ctrl_alt_let_cbs[ch-'a'])(sc);
}
if (keydev.fp_ctrl_alt_cbs[ch] &&
Bt(&keydev.ctrl_alt_in_irq_flags,ch)==in_irq &&
(!(sc_flags & SCF_SHIFT)&&keydev.ctrl_alt_no_shift_descs[ch]) ||
sc_flags & SCF_SHIFT && keydev.ctrl_alt_shift_descs[ch])
(*keydev.fp_ctrl_alt_cbs[ch])(sc);
}
}
}
@@ -391,7 +404,7 @@ U0 KbdPktRead()
}
}
interrupt U0 KbdIntHandler()
interrupt U0 IRQKbd()
{
CLD
OutU8(0x20,0x20);
@@ -400,7 +413,7 @@ interrupt U0 KbdIntHandler()
kbd.rst=TRUE;
return;
}
keydev.ctrl_alt_let_ret_addr=GetRBP()(I64)+8;
keydev.ctrl_alt_ret_addr=GetRBP()(I64)+8;
KbdPktRead;
}
@@ -417,7 +430,7 @@ U0 KbdInit()
KbdCmdFlush;
Fs->catch_except=TRUE;
}
IntEntrySet(0x21,&KbdIntHandler);
IntEntrySet(0x21,&IRQKbd);
OutU8(0x21,InU8(0x21)&~2);
}
@@ -432,6 +445,7 @@ U0 KbdHandler()
KbdBuildSC(raw_byte,FALSE,&last_raw_byte,&kbd.scan_code);
}
if (Btr(&kbd.scan_code,SCf_NEW_KEY)) {
kbd.new_key_timestamp=kbd.timestamp;
Btr(&kbd.scan_code,32+SCf_NEW_KEY);
FifoI64Ins(kbd.scan_code_fifo,kbd.scan_code);
kbd.cnt++;
@@ -470,5 +484,5 @@ I64 KbdMouseEvtTime()
if (mouse.timestamp>kbd.timestamp)
return mouse.timestamp;
else
return kbd.timestamp;
return kbd.new_key_timestamp;
}
+6
View File
@@ -0,0 +1,6 @@
#exe {Cd(__DIR__);};
#include "InputPointer"
#include "Keyboard"
#include "Mouse"
#include "Message"
#exe {Cd("..");};
@@ -8,8 +8,8 @@ U0 InputFilterTask()
old_filter=LBts(&Fs->last_input_filter_task->task_flags,TASKf_FILTER_INPUT);
LBEqu(&Fs->task_flags,TASKf_FILTER_INPUT,old_filter);
while (TRUE) {
SrvCmdsHandler;
CLI
SrvCmdsHandler(old_flags);
tempc1=&Fs->srv_ctrl.next_waiting;
tempc=tempc1->next;
if (tempc==tempc1)
@@ -18,12 +18,10 @@ U0 InputFilterTask()
if (tempc->cmd_code==SVCT_TEXT_INPUT) {
QueRem(tempc);
SetRFlags(old_flags);
Preempt(ON);
try
ExePrint("%s",tempc->aux_str);
catch
Fs->catch_except=TRUE;
Preempt;
SrvCmdDel(tempc);
} else
break;
@@ -49,9 +47,9 @@ Note: This delivers messages from parent down to pop-up.
old_flags=GetRFlags;
tempc1=&task->srv_ctrl.next_waiting;
while (TRUE) {
if (task==Fs)
SrvCmdsHandler;
CLI
if (task==Fs)
SrvCmdsHandler(old_flags);
tempc=tempc1->next;
if (tempc==tempc1)
break;
@@ -66,7 +64,7 @@ Note: This delivers messages from parent down to pop-up.
*_a2=tempc->aux2;
SrvCmdDel(tempc);
if ((result!=MSG_KEY_DOWN || !(tempc->aux2&SCF_KEY_DESC) ||
Bt(&mask,MSGF_ALLOW_KEY_DESC)) && Bt(&mask,result))
!Bt(&task->win_inhibit,WIf_SELF_KEY_DESC)) && Bt(&mask,result))
goto sm_done;
}
}
@@ -99,7 +97,6 @@ I64 GetMsg(I64 *_a1=NULL,I64 *_a2=NULL,I64 mask=~1,CTask *task=NULL)
//Throw-out all messages not in mask.
//Returns $LK,"msg_code",A="MN:MSG_CMD"$. See $LK,"::/Demo/MsgLoop.CPP"$.
I64 result;
Bool old_preempt=Preempt;
if (!task) task=Fs;
LBtr(&task->task_flags,TASKf_IDLE);
while (!(result=ScanMsg(_a1,_a2,mask,task))) {
@@ -107,7 +104,6 @@ I64 GetMsg(I64 *_a1=NULL,I64 *_a2=NULL,I64 mask=~1,CTask *task=NULL)
Yield;
}
LBtr(&task->task_flags,TASKf_IDLE);
Preempt(old_preempt);
return result;
}
@@ -148,7 +144,7 @@ I64 GetKey(I64 *_scan_code=NULL,Bool echo=FALSE,Bool raw_cursor=FALSE)
//Sets $LK,"scan_code",A="FI:::/Doc/CharOverview.TXT"$.
//$LK,"ScanKey",A="MN:ScanKey"$() throws away other message types.
I64 ch,sc;
Bool old_preempt=Preempt,cursor_on=FALSE;
Bool cursor_on=FALSE;
while (!ScanKey(&ch,&sc,FALSE)) {
if (IsRaw && raw_cursor) {
if (!cursor_on && ToI64(GetTSC*5/cnts.time_stamp_freq)&1) {
@@ -169,8 +165,6 @@ I64 GetKey(I64 *_scan_code=NULL,Bool echo=FALSE,Bool raw_cursor=FALSE)
KbdMouseHandler(TRUE,FALSE);
KbdMsgsQue;
POPFD
if (old_preempt && GetRFlags&1<<RFLAGf_INT)
Yield;
} else {
LBts(&Fs->task_flags,TASKf_AWAITING_MSG);
Yield;
@@ -179,7 +173,6 @@ I64 GetKey(I64 *_scan_code=NULL,Bool echo=FALSE,Bool raw_cursor=FALSE)
}
if (IsRaw && raw_cursor && cursor_on)
'' CH_BACKSPACE;
Preempt(old_preempt);
if (echo)
PutKey(ch,sc);
if (_scan_code) *_scan_code=sc;
@@ -10,7 +10,7 @@ U0 MousePktRead()
FifoU8Ins(mouse.fifo2,j);
}
interrupt U0 MouseIntHandler()
interrupt U0 IRQMouse()
{
CLD
OutU8(0xA0,0x20);
@@ -239,12 +239,10 @@ Bool MouseDriverInstall(I64 dummy=0) //can be spawned
{
nounusedwarn dummy;
I64 i;
Bool old_preempt=IsPreempt;
Preempt(ON);
mouse.install_in_progress=TRUE;
OutU8(0xA1,InU8(0xA1)|0x10);
mouse.installed=mouse.irqs_working=FALSE;
IntEntrySet(0x2C,&MouseIntHandler);
IntEntrySet(0x2C,&IRQMouse);
for(i=0;i<5;i++)
mouse.buttons[i]=0;
if (i=MouseRst)
@@ -253,7 +251,6 @@ Bool MouseDriverInstall(I64 dummy=0) //can be spawned
mouse.install_attempts++;
mouse.installed=mouse.evt=i;
mouse.install_in_progress=FALSE;
Preempt(old_preempt);
return mouse.installed;
}
+8 -19
View File
@@ -74,13 +74,10 @@ CSrvCmd *TaskExe(CTask *srv,CTask *master,U8 *data,I64 flags)
CSrvCmd *TaskText(CTask *srv,CTask *master,U8 *data,I64 flags)
{//Post StdIn text to servant task. Tell who the master task is.
CSrvCmd *result;
Bool old_preempt=Preempt;
CTask *task;
if (!data || !TaskValidate(srv) || master && !TaskValidate(master) ||
srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT)) {
Preempt(old_preempt);
srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT))
return NULL;
}
result=ACAlloc(sizeof(CSrvCmd));
result->master_task=master; //in case somebody cares
result->cmd_code=SVCT_TEXT_INPUT;
@@ -115,7 +112,6 @@ CSrvCmd *TaskText(CTask *srv,CTask *master,U8 *data,I64 flags)
LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED);
}
POPFD
Preempt(old_preempt);
return result;
}
@@ -267,12 +263,11 @@ U0 Msg(I64 msg_code,I64 a1,I64 a2,I64 flags=0)
#define SCR_CONT 1
#define SCR_EXIT 2
I64 SrvCmdRun(CSrvCmd *tempc,I64 old_flags)
I64 SrvCmdRun(I64 run_flags,CSrvCmd *tempc)
{
CSrvCtrl *ctrl=tempc->ctrl;
CTask *master;
Bool old_preempt=IsPreempt;
I64 result,flags=tempc->flags;
I64 result,flags=tempc->flags,old_flags=GetRFlags;
if (Bt(&flags,SVCf_EXIT_ON_COMPLETE))
result=SCR_EXIT;
else
@@ -295,7 +290,7 @@ I64 SrvCmdRun(CSrvCmd *tempc,I64 old_flags)
LBts(&tempc->flags,SVCf_DISPATCHED);
tempc->servant_cpu_num=Gs->num;
LBtr(&ctrl->flags,SVCRf_LOCKED);
SetRFlags(old_flags);
SetRFlags(run_flags);
LBtr(&Fs->task_flags,TASKf_IDLE);
try
tempc->result=(*tempc->addr)(tempc->fun_arg);
@@ -308,7 +303,7 @@ I64 SrvCmdRun(CSrvCmd *tempc,I64 old_flags)
LBts(&tempc->flags,SVCf_DISPATCHED);
tempc->servant_cpu_num=Gs->num;
LBtr(&ctrl->flags,SVCRf_LOCKED);
SetRFlags(old_flags);
SetRFlags(run_flags);
LBtr(&Fs->task_flags,TASKf_IDLE);
try
tempc->result=ExePrint("%s",tempc->aux_str);
@@ -348,11 +343,10 @@ I64 SrvCmdRun(CSrvCmd *tempc,I64 old_flags)
SetRFlags(old_flags);
}
}
Preempt(old_preempt);
return result;
}
I64 SrvCmdsHandler(CTask *task=NULL)
I64 SrvCmdsHandler(I64 run_flags,CTask *task=NULL)
{//Handle all waiting cmds and return.
I64 cnt=0,old_flags=GetRFlags;
CSrvCmd *tempc,*tempc1;
@@ -366,7 +360,7 @@ I64 SrvCmdsHandler(CTask *task=NULL)
if (tempc==tempc1)
goto sch_done;
else
switch (SrvCmdRun(tempc,old_flags)) {
switch (SrvCmdRun(run_flags,tempc)) {
case SCR_CONT:
cnt++;
break;
@@ -386,12 +380,10 @@ I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL)
{//Execute code text in PopUp win task.
I64 result;
CSrvCmd *tempc;
Bool old_preempt=Preempt;
CTask *task=Spawn(&SrvCmdLine,NULL,"Servant",,parent);
if (!parent) {
TaskExe(task,parent,buf,1<<SVCf_EXIT_ON_COMPLETE|1<<SVCf_FREE_ON_COMPLETE);
if (_pu_task) *_pu_task=task;
Preempt(old_preempt);
return 0;
} else {
Fs->popup_task=task;
@@ -401,7 +393,6 @@ I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL)
Fs->popup_task=NULL;
Kill(task);
if (_pu_task) *_pu_task=NULL;
Preempt(old_preempt);
return result;
}
}
@@ -419,16 +410,14 @@ I64 Adam(U8 *fmt,...)
{//Sends text to the adam task which gets compiled and run.
I64 result;
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
Bool old_preempt=Preempt;
CSrvCmd *tempc;
if (Fs==adam_task) {
tempc=TaskExe(adam_task,Fs,buf,0);
SrvCmdsHandler;
SrvCmdsHandler(GetRFlags);
} else {
TaskWait(adam_task);
tempc=TaskExe(adam_task,Fs,buf,1<<SVCf_WAKE_MASTER);
}
Preempt(old_preempt);
JobResultScan(tempc,&result);
Free(buf);
return result;
+1 -1
View File
@@ -124,7 +124,7 @@ U0 ScanFlags(U8 *_dst_flags,U8 *lst,U8 *src)
{/*More than 64 flags. Flags passed by ref.
Examples:
$LK,"ScanFlags",A="FF:::/Adam/Utils/Diff.CPP,ScanFlags:2"$(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);
$LK,"ScanFlags",A="FF:::/Adam/Opt/Utils/Diff.CPP,ScanFlags:2"$(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);
I64 flags=0;
ScanFlags(&flags,"R\0L\0Dump\0Scan\0","+Dump-R"); //Sets Bit#2, Clears Bit#0.
+2 -2
View File
@@ -897,9 +897,9 @@ U8 *CatPrint(U8 *_dst,U8 *fmt,...)
U0 Print(U8 *fmt,...)
{//$LK,"Print(\"\") Fmt Strings",A="FI:::/Doc/Print.TXT"$. See $LK,"StrPrintJoin",A="MN:StrPrintJoin"$().
//Don't use this. $LK,"See Print() shortcut.",A="FF:::/Doc/HolyC.TXT.Z,DemoHolyC"$
//Don't use this. $LK,"See Print() shortcut.",A="FF:::/Doc/HolyC.TXT,DemoHolyC"$
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
PutS(buf);//Don't use PutS(). $LK,"See Print() shortcut.",A="FF:::/Doc/HolyC.TXT.Z,DemoHolyC"$
PutS(buf);//Don't use PutS(). $LK,"See Print() shortcut.",A="FF:::/Doc/HolyC.TXT,DemoHolyC"$
Free(buf);
}