TempleOSCDV3.11.ISO
This commit is contained in:
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
Binary file not shown.
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
File diff suppressed because it is too large.
Load diff
+14
-19
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user