TempleOSCD_150216.ISO
This commit is contained in:
1 parent
64f679eeb9
commit
401601816c
531 files changed
+23341
-22071
No files matched your search
@@ -1,11 +0,0 @@
|
||||
//This is executed by Adam at boot.
|
||||
//See $LK,"Adam1 Start-up",A="FF:::/Kernel/KEnd.CPP,Adam1:2"$
|
||||
extern I8i OptEqu(I64i num,I8i val);
|
||||
OptEqu(0,0); //(0,0)=EchoOff (0,1)=EchoOn
|
||||
#include "/Kernel/Adam1a.HPP"
|
||||
#include "/Compiler/CmpDefs.HPP"
|
||||
#include "/Kernel/Adam1b.HPP"
|
||||
#include "/Kernel/Adam1c.HPP"
|
||||
#include "/Compiler/Cmp.HPP"
|
||||
Cd("/Adam");;
|
||||
#include "Adam2"
|
||||
+6
-11
@@ -85,9 +85,9 @@ _FAR_CALL32::
|
||||
PUSH U64 FS:CTask.addr[RAX]
|
||||
PUSH U64 GS:CCPU.addr[RAX]
|
||||
MOV U64 [C32_RSP],RSP
|
||||
PUSH U32 CGDT.ds //STKSEG
|
||||
PUSH U32 0x9C000 //STK
|
||||
PUSH U32 0 //FLAGS--interrupts off
|
||||
PUSH U32 CGDT.ds //STKSEG
|
||||
PUSH U32 BOOT_RAM_LIMIT //STK
|
||||
PUSH U32 0 //FLAGS--interrupts off
|
||||
PUSH U32 CGDT.cs32
|
||||
LEA RAX,[@@15]
|
||||
PUSH RAX
|
||||
@@ -132,15 +132,10 @@ C32_ADD:: DU32 0;
|
||||
MOV U32 [C32_ESI],ESI
|
||||
MOV U32 [C32_EDI],EDI
|
||||
|
||||
CALL INIT_EM64T
|
||||
USE64
|
||||
MOV AX,CGDT.ds
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV SS,AX
|
||||
|
||||
MOV RSP,U64 [C32_RSP]
|
||||
PUSH U32 0 //Return from next call will be 64-bit
|
||||
CALL SYS_EM64T
|
||||
|
||||
USE64 MOV RSP,U64 [C32_RSP]
|
||||
POP RAX
|
||||
CALL SET_GS_BASE
|
||||
POP RAX
|
||||
|
||||
+39
-40
@@ -1,4 +1,4 @@
|
||||
//See $LK,"::/Doc/Acknowledgements.TXT"$.
|
||||
//See $LK,"::/Doc/Credits.TXT"$.
|
||||
//See $LK,"CArcCompress",A="MN:CArcCompress"$, $LK,"CArcEntry",A="MN:CArcEntry"$, and $LK,"CArcCtrl",A="MN:CArcCtrl"$
|
||||
|
||||
asm {
|
||||
@@ -153,12 +153,14 @@ ac_done:
|
||||
c->src_pos=src_ptr-c->src_buf;
|
||||
}
|
||||
|
||||
U0 ArcFinishCompression(CArcCtrl *c)
|
||||
Bool ArcFinishCompression(CArcCtrl *c)
|
||||
{//Do closing touch on archivew ctrl struct.
|
||||
if (c->dst_pos+c->cur_bits_in_use<=c->dst_size) {
|
||||
BFieldOrU32(c->dst_buf,c->dst_pos,c->saved_basecode);
|
||||
c->dst_pos+=c->next_bits_in_use;
|
||||
}
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
U0 ArcExpandBuf(CArcCtrl *c)
|
||||
@@ -217,7 +219,7 @@ U0 ArcExpandBuf(CArcCtrl *c)
|
||||
c->dst_pos=dst_ptr-c->dst_buf;
|
||||
}
|
||||
|
||||
CArcCtrl *ArcCtrlNew(Bool expand,Bool seven_bit)
|
||||
CArcCtrl *ArcCtrlNew(Bool expand,I64 compression_type=CT_8_BIT)
|
||||
{//MAlloc archive ctrl struct.
|
||||
CArcCtrl *c;
|
||||
c=CAlloc(sizeof(CArcCtrl));
|
||||
@@ -225,7 +227,7 @@ CArcCtrl *ArcCtrlNew(Bool expand,Bool seven_bit)
|
||||
c->stk_base=MAlloc(ARC_MAX_ENTRY+1);
|
||||
c->stk_ptr=c->stk_base;
|
||||
}
|
||||
if (seven_bit)
|
||||
if (compression_type==CT_7_BIT)
|
||||
c->min_bits=7;
|
||||
else
|
||||
c->min_bits=8;
|
||||
@@ -246,27 +248,49 @@ U0 ArcCtrlDel(CArcCtrl *c)
|
||||
Free(c);
|
||||
}
|
||||
|
||||
CArcCompress *CompressBuf(U8 *src,I64 size,I64 flags=0,CTask *mem_task=NULL)
|
||||
U8 *ExpandBuf(CArcCompress *r,CTask *mem_task=NULL)
|
||||
{//See $LK,"::/Demo/Dsk/SerializeTree.CPP"$.
|
||||
CArcCtrl *c;
|
||||
U8 *result=MAlloc(r->expanded_size+1,mem_task);
|
||||
result[r->expanded_size]=0; //terminate
|
||||
switch (r->compression_type) {
|
||||
case CT_NONE:
|
||||
MemCpy(result,&r->body,r->expanded_size);
|
||||
break;
|
||||
case CT_7_BIT:
|
||||
case CT_8_BIT:
|
||||
c=ArcCtrlNew(TRUE,r->compression_type);
|
||||
c->src_size=r->compressed_size<<3;
|
||||
c->src_pos=sizeof(CArcCompress)<<3;
|
||||
c->src_buf=r;
|
||||
c->dst_size=r->expanded_size;
|
||||
c->dst_buf=result;
|
||||
c->dst_pos=0;
|
||||
ArcExpandBuf(c);
|
||||
ArcCtrlDel(c);
|
||||
break;
|
||||
default:
|
||||
throw('Compress');
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
CArcCompress *CompressBuf(U8 *src,I64 size,CTask *mem_task=NULL)
|
||||
{//See $LK,"::/Demo/Dsk/SerializeTree.CPP"$.
|
||||
CArcCompress *result;
|
||||
I64 size_out;
|
||||
Bool seven_bit=ArcDetermineCompressionType(src,size)==CT_7_BIT;
|
||||
CArcCtrl *c=ArcCtrlNew(FALSE,seven_bit);
|
||||
I64 size_out,compression_type=ArcDetermineCompressionType(src,size);
|
||||
CArcCtrl *c=ArcCtrlNew(FALSE,compression_type);
|
||||
c->src_size=size;
|
||||
c->src_buf=src;
|
||||
c->dst_size=(size+sizeof(CArcCompress))<<3;
|
||||
c->dst_buf=CAlloc(c->dst_size>>3);
|
||||
c->dst_pos=sizeof(CArcCompress)<<3;
|
||||
ArcCompressBuf(c);
|
||||
ArcFinishCompression(c);
|
||||
if (c->src_pos==c->src_size) {
|
||||
if (ArcFinishCompression(c) && c->src_pos==c->src_size) {
|
||||
size_out=(c->dst_pos+7)>>3;
|
||||
result=MAlloc(size_out,mem_task);
|
||||
MemCpy(result,c->dst_buf,size_out);
|
||||
if (seven_bit)
|
||||
result->compression_type=CT_7_BIT;
|
||||
else
|
||||
result->compression_type=CT_8_BIT;
|
||||
result->compression_type=compression_type;
|
||||
result->compressed_size=size_out;
|
||||
} else {
|
||||
result=MAlloc(size+sizeof(CArcCompress),mem_task);
|
||||
@@ -275,32 +299,7 @@ CArcCompress *CompressBuf(U8 *src,I64 size,I64 flags=0,CTask *mem_task=NULL)
|
||||
result->compressed_size=size+sizeof(CArcCompress);
|
||||
}
|
||||
result->expanded_size=size;
|
||||
result->flags=flags;
|
||||
Free(c->dst_buf);
|
||||
ArcCtrlDel(c);
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *ExpandBuf(CArcCompress *r,CTask *mem_task=NULL)
|
||||
{//See $LK,"::/Demo/Dsk/SerializeTree.CPP"$.
|
||||
CArcCtrl *c;
|
||||
Bool seven_bit;
|
||||
U8 *result=MAlloc(r->expanded_size+1,mem_task);
|
||||
result[r->expanded_size]=0; //terminate
|
||||
seven_bit= r->compression_type==CT_7_BIT;
|
||||
if (r->compression_type==CT_NONE)
|
||||
MemCpy(result,&r->body,r->expanded_size);
|
||||
else {
|
||||
c=ArcCtrlNew(TRUE,seven_bit);
|
||||
c->src_size=r->compressed_size<<3;
|
||||
c->src_pos=sizeof(CArcCompress)<<3;
|
||||
c->src_buf=r;
|
||||
c->dst_size=r->expanded_size;
|
||||
c->dst_buf=result;
|
||||
c->dst_pos=0;
|
||||
ArcExpandBuf(c);
|
||||
ArcCtrlDel(c);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
+9
-9
@@ -47,36 +47,36 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$().
|
||||
} else if (Bt(chars_bitmap_displayable,ch)) {
|
||||
row=text.raw_col/text.cols%text.rows;
|
||||
col=text.raw_col%text.cols;
|
||||
if (!sys_bios_gr_mode) { //if text mode
|
||||
if (!Bt(&sys_run_level,RLf_VGA)) { //if text mode
|
||||
if (text.raw_flags&RWF_SCROLL && text.raw_col && !row && !col) {
|
||||
MemCpy(VGA_TEXT_MEM_BASE,VGA_TEXT_MEM_BASE+text.cols,
|
||||
MemCpy(VGAM_TEXT,VGAM_TEXT+text.cols,
|
||||
text.cols*(text.rows-1)*2);
|
||||
MemSet(VGA_TEXT_MEM_BASE+text.cols*(text.rows-1)*2,0,text.cols*2);
|
||||
MemSet(VGAM_TEXT+text.cols*(text.rows-1)*2,0,text.cols*2);
|
||||
text.raw_col-=text.cols;
|
||||
row=text.rows-1;
|
||||
}
|
||||
ptr=VGA_TEXT_MEM_BASE+(row*text.cols+col)*2;
|
||||
ptr=VGAM_TEXT+(row*text.cols+col)*2;
|
||||
ptr[0]=ch;
|
||||
ptr[1]=BLACK<<4+WHITE;
|
||||
} else {
|
||||
OutU8(VGA_SC_INDEX,VGA_MAP_MASK);
|
||||
OutU8(VGA_SC_DATA,0x0F); //All planes -- WHITE
|
||||
OutU8(VGAP_INDEX,VGAR_MAP_MASK);
|
||||
OutU8(VGAP_DATA,0x0F); //All planes -- WHITE
|
||||
if (text.raw_flags&RWF_SCROLL && text.raw_col && !row && !col) {
|
||||
//Scroll cached image
|
||||
MemCpy(text.raw_screen_image,text.raw_screen_image+GR_WIDTH*FONT_HEIGHT>>3,
|
||||
GR_WIDTH*(GR_HEIGHT-FONT_HEIGHT)>>3);
|
||||
MemSet(text.raw_screen_image+GR_WIDTH*(GR_HEIGHT-FONT_HEIGHT)>>3,0,GR_WIDTH*FONT_HEIGHT>>3);
|
||||
|
||||
MemCpy(VGA_GRAPHIC_MEM_BASE,text.raw_screen_image,GR_WIDTH*GR_HEIGHT>>3);
|
||||
MemCpy(VGAM_GRAPHICS,text.raw_screen_image,GR_WIDTH*GR_HEIGHT>>3);
|
||||
text.raw_col-=text.cols;
|
||||
row=text.rows-1;
|
||||
}
|
||||
PUSHFD
|
||||
CLI
|
||||
ptr=ptr1=col+row*GR_WIDTH*FONT_HEIGHT>>3;
|
||||
ptr+=VGA_GRAPHIC_MEM_BASE;
|
||||
ptr+=VGAM_GRAPHICS;
|
||||
ptr1+=text.raw_screen_image; //Write to cached image as well
|
||||
ptr2=&text.font[(ch&255)*FONT_HEIGHT];
|
||||
ptr2=&text.font[ch&255];
|
||||
for (i=0;i<FONT_HEIGHT;i++) {
|
||||
*ptr=*ptr1=reverse_bits_table[*ptr2++];
|
||||
ptr+=GR_WIDTH>>3;
|
||||
|
||||
@@ -1,721 +0,0 @@
|
||||
Bool BlkDevLock(CBlkDev *bdev)
|
||||
{//Make this task have exclusive access to BlkDev.
|
||||
BlkDevChk(bdev);
|
||||
while (bdev->lock_fwding)
|
||||
bdev=bdev->lock_fwding;
|
||||
if (!Bt(&bdev->locked_flags,BDlf_LOCKED) || bdev->owning_task!=Fs) {
|
||||
while (LBts(&bdev->locked_flags,BDlf_LOCKED))
|
||||
Yield;
|
||||
bdev->owning_task=Fs;
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool PrtLock(CPrt *p)
|
||||
{//Make this task have exclusive access to Prt & BlkDev.
|
||||
PrtChk(p);
|
||||
BlkDevLock(p->bdev);
|
||||
if (!Bt(&p->locked_flags,Plf_LOCKED) || p->owning_task!=Fs) {
|
||||
while (LBts(&p->locked_flags,Plf_LOCKED))
|
||||
Yield;
|
||||
p->owning_task=Fs;
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool BlkDevUnlock(CBlkDev *bdev,Bool rst=FALSE)
|
||||
{//Release exclusive lock on access to BlkDev.
|
||||
BlkDevChk(bdev);
|
||||
while (bdev->lock_fwding)
|
||||
bdev=bdev->lock_fwding;
|
||||
if (Bt(&bdev->locked_flags,BDlf_LOCKED) && bdev->owning_task==Fs) {
|
||||
if (rst)
|
||||
bdev->flags&=~(BDF_INITIALIZED|BDF_INIT_IN_PROGRESS);
|
||||
bdev->owning_task=NULL;
|
||||
LBtr(&bdev->locked_flags,BDlf_LOCKED);
|
||||
Yield; //Prevent deadlock
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool PrtUnlock(CPrt *p,Bool rst=FALSE)
|
||||
{//Release exclusive lock on access to Prt & BlkDev.
|
||||
PrtChk(p);
|
||||
if (Bt(&p->locked_flags,Plf_LOCKED) && p->owning_task==Fs) {
|
||||
BlkDevUnlock(p->bdev,rst);
|
||||
p->owning_task=NULL;
|
||||
LBtr(&p->locked_flags,Plf_LOCKED);
|
||||
Yield; //Prevent deadlock
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool BlkDevInit(CBlkDev *bdev)
|
||||
{
|
||||
CPrt *p=Drv2Prt(bdev->first_drv_let);
|
||||
Bool old_preempt=Preempt(OFF),result=FALSE;
|
||||
|
||||
if (!LBts(&bdev->flags,BDf_INITIALIZED)) {
|
||||
bdev->flags|=BDF_INIT_IN_PROGRESS;
|
||||
switch(bdev->type) {
|
||||
case BDT_RAM:
|
||||
if (!bdev->RAM_dsk) {
|
||||
bdev->RAM_dsk=AMAlloc((bdev->max_blk+1)<<BLK_SIZE_BITS);
|
||||
bdev->max_blk=MSize(bdev->RAM_dsk)>>BLK_SIZE_BITS-1;
|
||||
}
|
||||
p->type=PT_REDSEA;
|
||||
p->size=bdev->max_blk+1;
|
||||
if (RedSeaFSDrvValidate(bdev->first_drv_let))
|
||||
RedSeaFSPrtInit(p);
|
||||
else
|
||||
RedSeaFSFmt(bdev->first_drv_let);
|
||||
result=TRUE;
|
||||
break;
|
||||
case BDT_ATA:
|
||||
bdev->max_reads=128;
|
||||
bdev->max_writes=1;
|
||||
result=ATAInit(bdev);
|
||||
break;
|
||||
case BDT_ATAPI:
|
||||
//0xFFFF*4 is too big for my taste
|
||||
bdev->max_reads=0x800*4;
|
||||
//max of maybe a quarter of disk cache
|
||||
if (bdev->max_reads>dsk.cache_size/BLK_SIZE/4)
|
||||
bdev->max_reads=dsk.cache_size/BLK_SIZE/4 & ~3;
|
||||
if (bdev->max_reads<128)
|
||||
bdev->max_reads=128;
|
||||
bdev->max_writes=0xFFFF*4;
|
||||
if (result=ATAInit(bdev))
|
||||
p->size=bdev->max_blk+1;
|
||||
break;
|
||||
}
|
||||
if (result && bdev->flags & BDF_READ_CACHE)
|
||||
DskCacheInvalidate(p);
|
||||
bdev->flags&=~BDF_INIT_IN_PROGRESS;
|
||||
} else
|
||||
result=TRUE;
|
||||
Preempt(old_preempt);
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 BlkDevsRelease()
|
||||
{//When task dies, release all owned BlkDevs.
|
||||
I64 i;
|
||||
CBlkDev *bdev;
|
||||
for (i=0;i<NUM_BLKDEVS;i++) {
|
||||
bdev=&dsk.blkdevs[i];
|
||||
if (bdev->owning_task==Fs && bdev->bd_signature==BD_SIGNATURE_VAL)
|
||||
BlkDevUnlock(bdev,TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
U0 PrtsRelease()
|
||||
{//When task dies, release all owned Prts.
|
||||
I64 i;
|
||||
CPrt *p;
|
||||
for (i=0;i<NUM_PRTS;i++) {
|
||||
p=&dsk.prts[i];
|
||||
if (p->owning_task==Fs && p->pt_signature==PRT_SIGNATURE_VAL)
|
||||
PrtUnlock(p,TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
CPrt *PrtMakeFree(U8 drv_let)
|
||||
{//Make a slot free for a new partition, like during $LK,"Mount",A="MN:Mount"$().
|
||||
//!!! drv_let is not a $LK,"remapped",A="MN:MapDrv"$ prt.
|
||||
I64 i=ToUpper(drv_let)-'A';
|
||||
CPrt *result;
|
||||
if (!(0<=i<NUM_PRTS))
|
||||
throw('Prt');
|
||||
result=&dsk.prts[i];
|
||||
MemSet(result,0,sizeof(CPrt));
|
||||
result->drv_let='A'+i;
|
||||
return result;
|
||||
}
|
||||
|
||||
CPrt *PrtNextFree(U8 first_drv_let='C')
|
||||
{//Locate free slot for new partition, like during $LK,"Mount",A="MN:Mount"$().
|
||||
//!!! first_drv_let is not a $LK,"remapped",A="MN:MapDrv"$ prt.
|
||||
I64 i=ToUpper(first_drv_let)-'A';
|
||||
if (!(0<=i<NUM_PRTS))
|
||||
throw('Prt');
|
||||
do
|
||||
if (dsk.prts[i].pt_signature!=PRT_SIGNATURE_VAL)
|
||||
return PrtMakeFree(i+'A');
|
||||
while (++i<NUM_PRTS);
|
||||
throw('Prt');
|
||||
return NULL; //never gets here
|
||||
}
|
||||
|
||||
CBlkDev *BlkDevNextFree(U8 first_drv_let,I64 type)
|
||||
{//Locate free slot for new BlkDev, like during $LK,"Mount",A="MN:Mount"$().
|
||||
I64 i=0;
|
||||
CBlkDev *result;
|
||||
do {
|
||||
result=&dsk.blkdevs[i];
|
||||
if (result->bd_signature!=BD_SIGNATURE_VAL) {
|
||||
MemSet(result,0,sizeof(CBlkDev));
|
||||
result->first_drv_let=first_drv_let;
|
||||
result->type=type;
|
||||
if (type==BDT_ATAPI)
|
||||
result->flags=BDF_REMOVABLE;
|
||||
else
|
||||
result->flags=0;
|
||||
if (type!=BDT_RAM)
|
||||
result->flags|=BDF_READ_CACHE;
|
||||
|
||||
if (type==BDT_ATAPI) {
|
||||
result->blk_size=CD_BLK_SIZE;
|
||||
result->flags|=BDF_READ_ONLY;
|
||||
} else
|
||||
result->blk_size=BLK_SIZE;
|
||||
|
||||
result->max_blk=0xEFFFFFFF;
|
||||
return result;
|
||||
}
|
||||
} while (++i<NUM_BLKDEVS);
|
||||
throw('BlkDev');
|
||||
return NULL; //never gets here
|
||||
}
|
||||
|
||||
U0 MapBufAlloc(CPrt *p,I64 num_blks)
|
||||
{
|
||||
PrtChk(p);
|
||||
Free(p->cur_map_blk);
|
||||
Free(p->buffered_map_dirty_bits);
|
||||
p->num_buffered_map_blks=num_blks;
|
||||
p->cur_map_blk=AMAlloc(num_blks<<BLK_SIZE_BITS);
|
||||
p->buffered_map_dirty_bits=ACAlloc((num_blks+7)>>3);
|
||||
p->cur_map_blk_num=0;
|
||||
RBlks(p,p->cur_map_blk,p->map1,p->num_buffered_map_blks);
|
||||
}
|
||||
|
||||
U0 CleanMAPBuf(CPrt *p,I64 MAP_select=-1)
|
||||
{
|
||||
I64 i;
|
||||
if ((MAP_select==-1 || !MAP_select) && p->map1!=p->map2)
|
||||
for (i=0;i<p->num_buffered_map_blks;i++)
|
||||
if (Bt(p->buffered_map_dirty_bits,i))
|
||||
WBlks(p,p->cur_map_blk(I64)+i<<BLK_SIZE_BITS,p->map1+i+p->cur_map_blk_num,1);
|
||||
if (MAP_select==-1 || MAP_select==1 || p->map1==p->map2)
|
||||
for (i=0;i<p->num_buffered_map_blks;i++)
|
||||
if (LBtr(p->buffered_map_dirty_bits,i))
|
||||
WBlks(p,p->cur_map_blk(I64)+i<<BLK_SIZE_BITS,p->map2+i+p->cur_map_blk_num,1);
|
||||
}
|
||||
|
||||
U0 SetFSBuf(CPrt *p,I64 c,I64 map_select=-1)
|
||||
{
|
||||
I64 MAP_blk_num;
|
||||
if (c==INVALID_CLUSTER)
|
||||
throw('Prt');
|
||||
if (p->type==PT_FAT32)
|
||||
MAP_blk_num=c>>(BLK_SIZE_BITS-2);
|
||||
else
|
||||
MAP_blk_num=c>>(BLK_SIZE_BITS+3);
|
||||
if (MAP_blk_num!=p->cur_map_blk_num) {
|
||||
CleanMAPBuf(p,map_select);
|
||||
p->cur_map_blk_num=MAP_blk_num;
|
||||
if (map_select==-1 || !map_select)
|
||||
RBlks(p,p->cur_map_blk,p->map1+p->cur_map_blk_num,1);
|
||||
else
|
||||
RBlks(p,p->cur_map_blk,p->map2+p->cur_map_blk_num,1);
|
||||
}
|
||||
}
|
||||
|
||||
#define ZERO_BUF_SIZE 2048
|
||||
U0 WZeroBlks(CPrt *p,I64 blk,I64 cnt)
|
||||
{//Fill blk cnt with zeros in Prt.
|
||||
I64 n;
|
||||
U8 *z=CAlloc(ZERO_BUF_SIZE<<BLK_SIZE_BITS);
|
||||
Bool show_progress;
|
||||
if (cnt>ZERO_BUF_SIZE && p->bdev->type!=BDT_RAM) {
|
||||
progress1=0; progress1_max=cnt;
|
||||
StrCpy(progress1_desc,"Zeroing");
|
||||
show_progress=TRUE;
|
||||
} else
|
||||
show_progress=FALSE;
|
||||
while (cnt>0) {
|
||||
n=cnt;
|
||||
if (n>ZERO_BUF_SIZE)
|
||||
n=ZERO_BUF_SIZE;
|
||||
WBlks(p,z,blk,n);
|
||||
blk+=n;
|
||||
cnt-=n;
|
||||
if (show_progress)
|
||||
progress1+=n;
|
||||
Yield; //Prevent locking
|
||||
}
|
||||
Free(z);
|
||||
if (show_progress) {
|
||||
*progress1_desc=0;
|
||||
progress1=progress1_max=0;
|
||||
}
|
||||
}
|
||||
|
||||
Bool SetDrvType(U8 drv_let,I64 type=PT_REDSEA)
|
||||
{//Very dangerous
|
||||
I64 i,j,ext_base,prt_num,offset,cur_type;
|
||||
CMasterBoot mbr;
|
||||
CBlkDev *bdev=Drv2BlkDev(drv_let);
|
||||
prt_num=bdev->first_drv_let-'A';
|
||||
switch (bdev->type) {
|
||||
case BDT_ATA:
|
||||
offset=0;
|
||||
ext_base=INVALID_CLUSTER;
|
||||
while (TRUE) {
|
||||
ATAReadBlks(bdev,&mbr,offset,1);
|
||||
j=-1;
|
||||
for (i=0;i<4;i++) {
|
||||
cur_type=mbr.p[i].type;
|
||||
if (cur_type) {
|
||||
if (cur_type==5 || cur_type==15)
|
||||
j=i;
|
||||
else {
|
||||
if (prt_num+'A'==ToUpper(drv_let)) {
|
||||
switch (type) {
|
||||
case PT_REDSEA:
|
||||
mbr.p[i].type=MBR_PT_REDSEA;
|
||||
break;
|
||||
case PT_FAT32:
|
||||
mbr.p[i].type=MBR_PT_FAT32a;
|
||||
break;
|
||||
default:
|
||||
Dbg;
|
||||
}
|
||||
mbr.p[i].active=0x80;
|
||||
ATAWriteBlks(bdev,&mbr,offset,1);
|
||||
return TRUE;
|
||||
}
|
||||
prt_num++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (j<0)
|
||||
break;
|
||||
if (!mbr.p[j].offset)
|
||||
break;
|
||||
if (ext_base==INVALID_CLUSTER) {
|
||||
offset=mbr.p[j].offset;
|
||||
ext_base=offset;
|
||||
} else
|
||||
offset=mbr.p[j].offset+ext_base;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Bool RBlks(CPrt *p,U8 *buf, I64 blk, I64 cnt)
|
||||
{//Read blk cnt from Prt to buf.
|
||||
Bool result=TRUE,unlock;
|
||||
CBlkDev *bdev=p->bdev;
|
||||
if (cnt<=0) return TRUE;
|
||||
PrtChk(p);
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
BlkDevInit(bdev);
|
||||
if (p->offset && blk<p->offset || blk+cnt>p->offset+p->size)
|
||||
throw('Prt');
|
||||
|
||||
if (bdev->flags & BDF_READ_CACHE)
|
||||
RCache(p,&buf,&blk,&cnt);
|
||||
if (cnt>0) {
|
||||
switch (bdev->type) {
|
||||
case BDT_RAM:
|
||||
MemCpy(buf,bdev->RAM_dsk+blk<<BLK_SIZE_BITS,cnt<<BLK_SIZE_BITS);
|
||||
break;
|
||||
case BDT_ATA:
|
||||
case BDT_ATAPI:
|
||||
result=ATARBlks(p,buf,blk,cnt);
|
||||
break;
|
||||
}
|
||||
bdev->last_time=tS;
|
||||
if (bdev->flags & BDF_READ_CACHE)
|
||||
DskCacheAdd(p,buf,blk,cnt);
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
return result;
|
||||
}
|
||||
|
||||
Bool WBlks(CPrt *p,U8 *buf, I64 blk, I64 cnt)
|
||||
{//Write blk cnt from buf to Prt.
|
||||
Bool result=TRUE,unlock;
|
||||
CBlkDev *bdev=p->bdev;
|
||||
if (cnt<=0) return TRUE;
|
||||
PrtChk(p);
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
BlkDevInit(bdev);
|
||||
if (bdev->flags&BDF_READ_ONLY &&
|
||||
!(bdev->flags & BDF_READ_ONLY_OVERRIDE))
|
||||
throw('BlkDev');
|
||||
if (p->offset && blk<p->offset || blk+cnt>p->offset+p->size)
|
||||
throw('Prt');
|
||||
if (cnt>0) {
|
||||
switch (bdev->type) {
|
||||
case BDT_RAM:
|
||||
MemCpy(bdev->RAM_dsk+blk<<BLK_SIZE_BITS,buf,cnt<<BLK_SIZE_BITS);
|
||||
break;
|
||||
case BDT_ATA:
|
||||
case BDT_ATAPI:
|
||||
result=ATAWBlks(p,buf,blk,cnt);
|
||||
break;
|
||||
}
|
||||
bdev->last_time=tS;
|
||||
if (bdev->flags & BDF_READ_CACHE)
|
||||
DskCacheAdd(p,buf,blk,cnt);
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 DskCacheInvalidate(CPrt *p)
|
||||
{//Needed for removable media. Called by $LK,"ChgDsk",A="MN:ChgDsk"$().
|
||||
Bool unlock;
|
||||
CBlkDev *bdev=p->bdev;
|
||||
PrtChk(p);
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
BlkDevInit(bdev);
|
||||
if (bdev->flags & BDF_READ_CACHE)
|
||||
DskCacheInvalidate2(p);
|
||||
if (p->type==PT_ISO9660) {
|
||||
if (!(bdev->flags & BDF_READ_ONLY_OVERRIDE))
|
||||
ISOPrtInit(p,(32767/bdev->blk_size+1)*
|
||||
bdev->blk_size>>BLK_SIZE_BITS);
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
}
|
||||
|
||||
U0 ChgDsk(U8 drv_let=0)
|
||||
{//Change disk. (Needed for removable media.)
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
CBlkDev *bdev=p->bdev;
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
if (!(bdev->flags&BDF_INITIALIZED))
|
||||
BlkDevInit(bdev);
|
||||
else if (bdev->flags&BDF_REMOVABLE)
|
||||
DskCacheInvalidate(p);
|
||||
Drv(drv_let);
|
||||
RedSeaFSFreeFreeLst(p);
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
|
||||
U8 *DrvSerialNum(U8 drv_let=0)
|
||||
{//20 bytes max.
|
||||
CBlkDev *bdev=Drv2BlkDev(drv_let);
|
||||
U16 *st,*result=NULL;
|
||||
I64 i;
|
||||
if (bdev->dev_id_record) {
|
||||
st=CAlloc(20+1);
|
||||
for (i=0;i<10;i++)
|
||||
st[i]=EndianU16(bdev->dev_id_record[10+i]);
|
||||
result=MStrUtil(st,SUF_REM_LEADING|SUF_REM_TRAILING);
|
||||
Free(st);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *DrvModelNum(U8 drv_let=0)
|
||||
{//40 bytes max.
|
||||
CBlkDev *bdev=Drv2BlkDev(drv_let);
|
||||
U16 *st,*result=NULL;
|
||||
I64 i;
|
||||
if (bdev->dev_id_record) {
|
||||
st=CAlloc(40+1);
|
||||
for (i=0;i<20;i++)
|
||||
st[i]=EndianU16(bdev->dev_id_record[27+i]);
|
||||
result=MStrUtil(st,SUF_REM_LEADING|SUF_REM_TRAILING);
|
||||
Free(st);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 PrtRep()
|
||||
{//Partition report.
|
||||
CPrt *p;
|
||||
CBlkDev *bdev;
|
||||
I64 i,drv_let;
|
||||
U8 *st;
|
||||
"\nDefined Partitions:\n\n";
|
||||
for (i=0,p=dsk.prts;i<NUM_PRTS;i++,p++) {
|
||||
if (p->pt_signature==PRT_SIGNATURE_VAL) {
|
||||
bdev=p->bdev;
|
||||
drv_let=Prt2Drv(p);
|
||||
if (Bt(&p->type,PTf_DISABLE))
|
||||
"$$RED$$X";
|
||||
else if (drv_let==*sys_acct)
|
||||
"$$GREEN$$:";
|
||||
else
|
||||
'' CH_SPACE;
|
||||
"$$PURPLE$$%C %-8Z %-9Z %04X %04X %02X$$FG$$\n",
|
||||
drv_let,p->type.u16[0],"ST_PRT_TYPES",
|
||||
bdev->type,"ST_BLKDEV_TYPES",bdev->base0,bdev->base1,bdev->unit;
|
||||
if (st=DrvModelNum(drv_let)) {
|
||||
" $$CYAN$$Model# :%s$$FG$$\n",st;
|
||||
Free(st);
|
||||
}
|
||||
if (st=DrvSerialNum(drv_let)) {
|
||||
" $$CYAN$$Serial#:%s$$FG$$\n",st;
|
||||
Free(st);
|
||||
}
|
||||
" %016X-%016X\n",
|
||||
p->offset,p->offset+p->size-1;
|
||||
p->offset,p->offset+p->size-1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
I64 ClusterNumNext(CPrt *p,I64 c,I64 cnt=1)
|
||||
{//Return next cnt'th cluster in chain.
|
||||
Bool unlock;
|
||||
PrtChk(p);
|
||||
if (cnt<=0) return c;
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
switch (p->type) {
|
||||
case PT_ISO9660:
|
||||
case PT_REDSEA:
|
||||
c+=cnt;
|
||||
break;
|
||||
case PT_FAT32:
|
||||
while (cnt-->0 && 0<c<0x0FFFFFF8) {
|
||||
SetFSBuf(p,c);
|
||||
c=p->cur_map_blk[c & (BLK_SIZE/4-1)];
|
||||
}
|
||||
if (!(0<c<0x0FFFFFF8))
|
||||
c=INVALID_CLUSTER;
|
||||
break;
|
||||
default:
|
||||
Dbg;
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
return c;
|
||||
}
|
||||
|
||||
I64 Cluster2Blk(CPrt *p,I64 c)
|
||||
{//Prt cluster num to blk num.
|
||||
PrtChk(p);
|
||||
return p->data+c*p->spc;
|
||||
}
|
||||
|
||||
I64 RClustersBlks(CPrt *p,U8 *buf,I64 c,I64 blks)
|
||||
{//Accepts blk count, so padding on last cluster is not read.
|
||||
I64 i;
|
||||
Bool unlock;
|
||||
PrtChk(p);
|
||||
if (blks<=0) return c;
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
switch (p->type) {
|
||||
case PT_ISO9660:
|
||||
case PT_REDSEA:
|
||||
RBlks(p,buf,p->data+c*p->spc,blks);
|
||||
c+=(blks+p->spc-1)/p->spc;
|
||||
break;
|
||||
case PT_FAT32:
|
||||
while (blks && 0<c<0x0FFFFFF8) {
|
||||
i=blks;
|
||||
if (i>p->spc)
|
||||
i=p->spc;
|
||||
RBlks(p,buf,p->data+c*p->spc,i);
|
||||
buf+=i<<BLK_SIZE_BITS;
|
||||
c=ClusterNumNext(p,c,1);
|
||||
blks-=i;
|
||||
}
|
||||
if (blks)
|
||||
Dbg;
|
||||
break;
|
||||
default:
|
||||
Dbg;
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
return c;
|
||||
}
|
||||
|
||||
I64 RClusters(CPrt *p,U8 *buf,I64 c,I64 cnt)
|
||||
{//Read cluster cnt from Prt to buf.
|
||||
return RClustersBlks(p,buf,c,cnt*p->spc);
|
||||
}
|
||||
|
||||
Bool CFileNameTo(U8 *dst,U8 *src)
|
||||
{
|
||||
MemSet(dst,0,CDIR_FILENAME_LEN);
|
||||
if (!FileNameChk(src))
|
||||
return FALSE;
|
||||
StrCpy(dst,src);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
I64 Name2DirCluster(CPrt *p,U8 *dirname)
|
||||
{
|
||||
Bool cont=TRUE,unlock;
|
||||
I64 cur_dir_cluster;
|
||||
CDirEntry de;
|
||||
U8 *buf=StrNew(dirname),*buf2=StrNew(dirname);
|
||||
PrtChk(p);
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
cur_dir_cluster=p->root_cluster;
|
||||
while (*buf && cont) {
|
||||
StrFirstRem(buf,"/",buf2);
|
||||
if (*buf2) {
|
||||
switch (p->type) {
|
||||
case PT_REDSEA:
|
||||
cont=RedSeaFSFileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
cont=FAT32FileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
cont=ISO1FileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
default:
|
||||
Dbg;
|
||||
}
|
||||
cur_dir_cluster=de.cluster;
|
||||
}
|
||||
}
|
||||
if (!cont) {
|
||||
"%s ",dirname;
|
||||
PrintErr("File not found.\n");
|
||||
cur_dir_cluster=0;
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
Free(buf);
|
||||
Free(buf2);
|
||||
return cur_dir_cluster;
|
||||
}
|
||||
|
||||
I64 Name2ParentDirCluster(CPrt *p,U8 *dirname)
|
||||
{
|
||||
Bool cont=TRUE,unlock;
|
||||
I64 cur_dir_cluster,cur_dir_cluster2;
|
||||
CDirEntry de;
|
||||
U8 *buf=StrNew(dirname),*buf2=StrNew(dirname);
|
||||
PrtChk(p);
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
cur_dir_cluster=cur_dir_cluster2=p->root_cluster;
|
||||
while (*buf && cont) {
|
||||
cur_dir_cluster2=cur_dir_cluster;
|
||||
StrFirstRem(buf,"/",buf2);
|
||||
if (*buf2) {
|
||||
switch (p->type) {
|
||||
case PT_REDSEA:
|
||||
cont=RedSeaFSFileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
cont=FAT32FileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
cont=ISO1FileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
default:
|
||||
Dbg;
|
||||
}
|
||||
cur_dir_cluster=de.cluster;
|
||||
}
|
||||
}
|
||||
if (!cont) {
|
||||
"%s ",dirname;
|
||||
PrintErr("File not found.\n");
|
||||
cur_dir_cluster2=0;
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
Free(buf);
|
||||
Free(buf2);
|
||||
return cur_dir_cluster2;
|
||||
}
|
||||
|
||||
I64 WClustersBlks(CPrt *p,U8 *buf,I64 c,I64 blks)
|
||||
{//Accepts blk count, so padding on last cluster is not written.
|
||||
I64 i;
|
||||
Bool unlock;
|
||||
PrtChk(p);
|
||||
if (blks<=0) return c;
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
switch (p->type) {
|
||||
case PT_REDSEA:
|
||||
WBlks(p,buf,p->data+c*p->spc,blks);
|
||||
c=0;
|
||||
break;
|
||||
case PT_FAT32:
|
||||
while (blks) {
|
||||
if (!(0<c<0x0FFFFFF8))
|
||||
Dbg;
|
||||
i=blks;
|
||||
if (i>p->spc)
|
||||
i=p->spc;
|
||||
WBlks(p,buf,p->data+c*p->spc,i);
|
||||
buf+=i<<BLK_SIZE_BITS;
|
||||
c=ClusterNumNext(p,c);
|
||||
blks-=i;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Dbg;
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
return c;
|
||||
}
|
||||
|
||||
I64 WClusters(CPrt *p,U8 *buf,I64 c,I64 cnt)
|
||||
{//Write cluster cnt from buf to Prt.
|
||||
return WClustersBlks(p,buf,c,cnt*p->spc);
|
||||
}
|
||||
|
||||
I64 ClustersAlloc(CPrt *p,I64 c=0,I64 cnt=1,Bool contiguous=FALSE)
|
||||
{//Alloc cluster cnt into chain.
|
||||
//c=0 means first cluster in chain
|
||||
PrtChk(p);
|
||||
if (cnt<=0) return c;
|
||||
switch (p->type) {
|
||||
case PT_REDSEA:
|
||||
return RedSeaFSAllocClusters(p,cnt);
|
||||
case PT_FAT32:
|
||||
if (contiguous) {
|
||||
if (c) throw('File');
|
||||
return FAT32AllocContiguousClusters(p,cnt);
|
||||
} else
|
||||
return FAT32AllocClusters(p,c,cnt);
|
||||
default:
|
||||
Dbg;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,731 @@
|
||||
Bool BlkDevLock(CBlkDev *bd)
|
||||
{//Make this task have exclusive access to BlkDev.
|
||||
BlkDevChk(bd);
|
||||
while (bd->lock_fwding)
|
||||
bd=bd->lock_fwding; //If two blkdevs on same controller, use just one lock
|
||||
if (!Bt(&bd->locked_flags,BDlf_LOCKED) || bd->owning_task!=Fs) {
|
||||
while (LBts(&bd->locked_flags,BDlf_LOCKED))
|
||||
Yield;
|
||||
bd->owning_task=Fs;
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool DrvLock(CDrv *dv)
|
||||
{//Make this task have exclusive access to drv & BlkDev.
|
||||
DrvChk(dv);
|
||||
BlkDevLock(dv->bd);
|
||||
if (!Bt(&dv->locked_flags,DVlf_LOCKED) || dv->owning_task!=Fs) {
|
||||
while (LBts(&dv->locked_flags,DVlf_LOCKED))
|
||||
Yield;
|
||||
dv->owning_task=Fs;
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool BlkDevUnlock(CBlkDev *bd,Bool rst=FALSE)
|
||||
{//Release exclusive lock on access to BlkDev.
|
||||
BlkDevChk(bd);
|
||||
while (bd->lock_fwding)
|
||||
bd=bd->lock_fwding; //If two blkdevs on same controller, use just one lock
|
||||
if (Bt(&bd->locked_flags,BDlf_LOCKED) && bd->owning_task==Fs) {
|
||||
if (rst)
|
||||
bd->flags&=~(BDF_INITIALIZED|BDF_INIT_IN_PROGRESS);
|
||||
bd->owning_task=NULL;
|
||||
LBtr(&bd->locked_flags,BDlf_LOCKED);
|
||||
Yield; //Prevent deadlock
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool DrvUnlock(CDrv *dv,Bool rst=FALSE)
|
||||
{//Release exclusive lock on access to drv & BlkDev.
|
||||
DrvChk(dv);
|
||||
if (Bt(&dv->locked_flags,DVlf_LOCKED) && dv->owning_task==Fs) {
|
||||
BlkDevUnlock(dv->bd,rst);
|
||||
dv->owning_task=NULL;
|
||||
LBtr(&dv->locked_flags,DVlf_LOCKED);
|
||||
Yield; //Prevent deadlock
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool BlkDevInit(CBlkDev *bd)
|
||||
{
|
||||
CDrv *dv=Let2Drv(bd->first_drv_let);
|
||||
Bool old_preempt=Preempt(OFF),result=FALSE;
|
||||
|
||||
if (!LBts(&bd->flags,BDf_INITIALIZED)) {
|
||||
bd->flags|=BDF_INIT_IN_PROGRESS;
|
||||
switch(bd->type) {
|
||||
case BDT_RAM:
|
||||
if (!bd->RAM_dsk) {
|
||||
bd->RAM_dsk=AMAlloc((bd->max_blk+1)<<BLK_SIZE_BITS);
|
||||
bd->max_blk=MSize(bd->RAM_dsk)>>BLK_SIZE_BITS-1;
|
||||
}
|
||||
dv->type=DVT_REDSEA;
|
||||
dv->size=bd->max_blk+1;
|
||||
if (RedSeaDrvValidate(bd->first_drv_let))
|
||||
RedSeaDrvInit(dv);
|
||||
else
|
||||
RedSeaFmt(bd->first_drv_let);
|
||||
result=TRUE;
|
||||
break;
|
||||
case BDT_ATA:
|
||||
bd->max_reads=128;
|
||||
bd->max_writes=1;
|
||||
result=ATAInit(bd);
|
||||
break;
|
||||
case BDT_ATAPI:
|
||||
//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<128)
|
||||
bd->max_reads=128;
|
||||
bd->max_writes=0xFFFF*4;
|
||||
if (result=ATAInit(bd))
|
||||
dv->size=bd->max_blk+1;
|
||||
break;
|
||||
}
|
||||
if (result && bd->flags & BDF_READ_CACHE)
|
||||
DskCacheInvalidate(dv);
|
||||
bd->flags&=~BDF_INIT_IN_PROGRESS;
|
||||
} else
|
||||
result=TRUE;
|
||||
Preempt(old_preempt);
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 BlkDevsRelease()
|
||||
{//When task dies, release all owned BlkDevs.
|
||||
I64 i;
|
||||
CBlkDev *bd;
|
||||
for (i=0;i<NUM_BLKDEVS;i++) {
|
||||
bd=&dsk.blkdevs[i];
|
||||
if (bd->owning_task==Fs && bd->bd_signature==BD_SIGNATURE_VAL)
|
||||
BlkDevUnlock(bd,TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
U0 DrvsRelease()
|
||||
{//When task dies, release all owned drvs.
|
||||
I64 i;
|
||||
CDrv *dv;
|
||||
for (i=0;i<NUM_DRVS;i++) {
|
||||
dv=&dsk.drvs[i];
|
||||
if (dv->owning_task==Fs && dv->dv_signature==DRV_SIGNATURE_VAL)
|
||||
DrvUnlock(dv,TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
CDrv *DrvMakeFree(U8 drv_let)
|
||||
{//Make a slot free for a new drv, like during $LK,"Mount",A="MN:Mount"$().
|
||||
//!!! drv_let is not a $LK,"remapped",A="MN:MapDrv"$ drv.
|
||||
I64 i=ToUpper(drv_let)-'A';
|
||||
CDrv *result;
|
||||
if (!(0<=i<NUM_DRVS))
|
||||
throw('Drv');
|
||||
result=&dsk.drvs[i];
|
||||
MemSet(result,0,sizeof(CDrv));
|
||||
result->drv_let='A'+i;
|
||||
return result;
|
||||
}
|
||||
|
||||
CDrv *DrvNextFree(U8 first_drv_let='C')
|
||||
{//Locate free slot for new drv, like during $LK,"Mount",A="MN:Mount"$().
|
||||
//!!! first_drv_let is not a $LK,"remapped",A="MN:MapDrv"$ drv.
|
||||
I64 i=ToUpper(first_drv_let)-'A';
|
||||
if (!(0<=i<NUM_DRVS))
|
||||
throw('Drv');
|
||||
do
|
||||
if (dsk.drvs[i].dv_signature!=DRV_SIGNATURE_VAL)
|
||||
return DrvMakeFree(i+'A');
|
||||
while (++i<NUM_DRVS);
|
||||
throw('Drv');
|
||||
return NULL; //never gets here
|
||||
}
|
||||
|
||||
CBlkDev *BlkDevNextFree(U8 first_drv_let,I64 type)
|
||||
{//Locate free slot for new BlkDev, like during $LK,"Mount",A="MN:Mount"$().
|
||||
I64 i=0;
|
||||
CBlkDev *result;
|
||||
do {
|
||||
result=&dsk.blkdevs[i];
|
||||
if (result->bd_signature!=BD_SIGNATURE_VAL) {
|
||||
MemSet(result,0,sizeof(CBlkDev));
|
||||
result->first_drv_let=first_drv_let;
|
||||
result->type=type;
|
||||
if (type==BDT_ATAPI)
|
||||
result->flags=BDF_REMOVABLE;
|
||||
else
|
||||
result->flags=0;
|
||||
if (type!=BDT_RAM)
|
||||
result->flags|=BDF_READ_CACHE;
|
||||
|
||||
if (type==BDT_ATAPI) {
|
||||
result->blk_size=CD_BLK_SIZE;
|
||||
result->flags|=BDF_READ_ONLY;
|
||||
} else
|
||||
result->blk_size=BLK_SIZE;
|
||||
|
||||
result->max_blk=0xEFFFFFFF;
|
||||
return result;
|
||||
}
|
||||
} while (++i<NUM_BLKDEVS);
|
||||
throw('BlkDev');
|
||||
return NULL; //never gets here
|
||||
}
|
||||
|
||||
U0 DrvMapBlkAlloc(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);
|
||||
}
|
||||
|
||||
U0 DrvMapBlkClean(CDrv *dv,I64 map_select=3)
|
||||
{
|
||||
if (dv->type==DVT_FAT32 || dv->type==DVT_REDSEA) {
|
||||
if ((map_select==3 || !map_select) && dv->map1!=dv->map2 &&
|
||||
Bt(&dv->map_blk_dirty,0))
|
||||
WBlks(dv,dv->cur_map_blk(I64),dv->map1+dv->cur_map_blk_num,1);
|
||||
if (map_select==3 || map_select==1 || dv->map1==dv->map2 &&
|
||||
LBtr(&dv->map_blk_dirty,0))
|
||||
WBlks(dv,dv->cur_map_blk(I64),dv->map2+dv->cur_map_blk_num,1);
|
||||
}
|
||||
}
|
||||
|
||||
U0 DrvMapBlkSet(CDrv *dv,I64 c,I64 map_select=3)
|
||||
{
|
||||
I64 map_blk_num;
|
||||
if (c==INVALID_CLUSTER)
|
||||
throw('Drv');
|
||||
switch (dv->type) {
|
||||
case DVT_FAT32:
|
||||
map_blk_num=c>>(BLK_SIZE_BITS-2);
|
||||
break;
|
||||
case DVT_REDSEA:
|
||||
map_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);
|
||||
else
|
||||
RBlks(dv,dv->cur_map_blk,dv->map2+dv->cur_map_blk_num,1);
|
||||
}
|
||||
}
|
||||
|
||||
#define ZERO_BUF_SIZE 2048
|
||||
U0 WZeroBlks(CDrv *dv,I64 blk,I64 cnt)
|
||||
{//Fill blk cnt with zeros in Drv.
|
||||
I64 n;
|
||||
U8 *z=CAlloc(ZERO_BUF_SIZE<<BLK_SIZE_BITS);
|
||||
Bool show_progress;
|
||||
if (cnt>ZERO_BUF_SIZE && dv->bd->type!=BDT_RAM) {
|
||||
progress1=0; progress1_max=cnt;
|
||||
StrCpy(progress1_desc,"Zeroing");
|
||||
show_progress=TRUE;
|
||||
} else
|
||||
show_progress=FALSE;
|
||||
while (cnt>0) {
|
||||
n=cnt;
|
||||
if (n>ZERO_BUF_SIZE)
|
||||
n=ZERO_BUF_SIZE;
|
||||
WBlks(dv,z,blk,n);
|
||||
blk+=n;
|
||||
cnt-=n;
|
||||
if (show_progress)
|
||||
progress1+=n;
|
||||
Yield; //Prevent locking
|
||||
}
|
||||
Free(z);
|
||||
if (show_progress) {
|
||||
*progress1_desc=0;
|
||||
progress1=progress1_max=0;
|
||||
}
|
||||
}
|
||||
|
||||
Bool DrvTypeSet(U8 drv_let,I64 type=DVT_REDSEA)
|
||||
{//Very dangerous
|
||||
I64 i,j,ext_base,drv_num,offset,cur_type;
|
||||
CMasterBoot mbr;
|
||||
CBlkDev *bd=Let2BlkDev(drv_let);
|
||||
drv_num=bd->first_drv_let-'A';
|
||||
switch (bd->type) {
|
||||
case BDT_ATA:
|
||||
offset=0;
|
||||
ext_base=INVALID_CLUSTER;
|
||||
while (TRUE) {
|
||||
ATAReadBlks(bd,&mbr,offset,1);
|
||||
j=-1;
|
||||
for (i=0;i<4;i++) {
|
||||
cur_type=mbr.p[i].type;
|
||||
if (cur_type) {
|
||||
if (cur_type==5 || cur_type==15)
|
||||
j=i;
|
||||
else {
|
||||
if (drv_num+'A'==ToUpper(drv_let)) {
|
||||
switch (type) {
|
||||
case DVT_REDSEA:
|
||||
mbr.p[i].type=MBR_PT_REDSEA;
|
||||
break;
|
||||
case DVT_FAT32:
|
||||
mbr.p[i].type=MBR_PT_FAT32a;
|
||||
break;
|
||||
default:
|
||||
throw('Drv');
|
||||
}
|
||||
mbr.p[i].active=0x80;
|
||||
ATAWriteBlks(bd,&mbr,offset,1);
|
||||
return TRUE;
|
||||
}
|
||||
drv_num++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (j<0)
|
||||
break;
|
||||
if (!mbr.p[j].offset)
|
||||
break;
|
||||
if (ext_base==INVALID_CLUSTER) {
|
||||
offset=mbr.p[j].offset;
|
||||
ext_base=offset;
|
||||
} else
|
||||
offset=mbr.p[j].offset+ext_base;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Bool RBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt)
|
||||
{//Read blk cnt from Drv to buf.
|
||||
Bool result=TRUE,unlock;
|
||||
CBlkDev *bd=dv->bd;
|
||||
if (cnt<=0) return TRUE;
|
||||
DrvChk(dv);
|
||||
try {
|
||||
unlock=DrvLock(dv);
|
||||
BlkDevInit(bd);
|
||||
if (dv->base_offset && blk<dv->base_offset || blk+cnt>dv->base_offset+dv->size)
|
||||
throw('Drv');
|
||||
|
||||
if (bd->flags & BDF_READ_CACHE)
|
||||
RCache(dv,&buf,&blk,&cnt);
|
||||
if (cnt>0) {
|
||||
switch (bd->type) {
|
||||
case BDT_RAM:
|
||||
MemCpy(buf,bd->RAM_dsk+blk<<BLK_SIZE_BITS,cnt<<BLK_SIZE_BITS);
|
||||
break;
|
||||
case BDT_ATA:
|
||||
case BDT_ATAPI:
|
||||
result=ATARBlks(dv,buf,blk,cnt);
|
||||
break;
|
||||
}
|
||||
bd->last_time=tS;
|
||||
if (bd->flags & BDF_READ_CACHE)
|
||||
DskCacheAdd(dv,buf,blk,cnt);
|
||||
}
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
return result;
|
||||
}
|
||||
|
||||
Bool WBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt)
|
||||
{//Write blk cnt from buf to Drv.
|
||||
Bool result=TRUE,unlock;
|
||||
CBlkDev *bd=dv->bd;
|
||||
if (cnt<=0) return TRUE;
|
||||
DrvChk(dv);
|
||||
try {
|
||||
unlock=DrvLock(dv);
|
||||
BlkDevInit(bd);
|
||||
if (bd->flags&BDF_READ_ONLY && !(bd->flags & BDF_READ_ONLY_OVERRIDE))
|
||||
throw('BlkDev');
|
||||
if (dv->base_offset && blk<dv->base_offset || blk+cnt>dv->base_offset+dv->size)
|
||||
throw('Drv');
|
||||
if (cnt>0) {
|
||||
switch (bd->type) {
|
||||
case BDT_RAM:
|
||||
MemCpy(bd->RAM_dsk+blk<<BLK_SIZE_BITS,buf,cnt<<BLK_SIZE_BITS);
|
||||
break;
|
||||
case BDT_ATA:
|
||||
case BDT_ATAPI:
|
||||
result=ATAWBlks(dv,buf,blk,cnt);
|
||||
break;
|
||||
}
|
||||
bd->last_time=tS;
|
||||
if (bd->flags & BDF_READ_CACHE)
|
||||
DskCacheAdd(dv,buf,blk,cnt);
|
||||
}
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 DskCacheInvalidate(CDrv *dv)
|
||||
{//Needed for removable media. Called by $LK,"ChgDsk",A="MN:ChgDsk"$().
|
||||
Bool unlock;
|
||||
CBlkDev *bd=dv->bd;
|
||||
DrvChk(dv);
|
||||
try {
|
||||
unlock=DrvLock(dv);
|
||||
BlkDevInit(bd);
|
||||
if (bd->flags & BDF_READ_CACHE)
|
||||
DskCacheInvalidate2(dv);
|
||||
if (dv->type==DVT_ISO9660 && !(bd->flags & BDF_READ_ONLY_OVERRIDE))
|
||||
ISODrvInit(dv,(32767/bd->blk_size+1)*bd->blk_size>>BLK_SIZE_BITS);
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
}
|
||||
|
||||
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(OFF);
|
||||
if (!(bd->flags&BDF_INITIALIZED))
|
||||
BlkDevInit(bd);
|
||||
else if (bd->flags&BDF_REMOVABLE)
|
||||
DskCacheInvalidate(dv);
|
||||
Drv(drv_let);
|
||||
RedSeaFreeFreeLst(dv);
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
|
||||
U8 *DrvSerialNum(U8 drv_let=0)
|
||||
{//20 bytes max.
|
||||
CBlkDev *bd=Let2BlkDev(drv_let);
|
||||
U16 *st,*result=NULL;
|
||||
I64 i;
|
||||
if (bd->dev_id_record) {
|
||||
st=CAlloc(20+1);
|
||||
for (i=0;i<10;i++)
|
||||
st[i]=EndianU16(bd->dev_id_record[10+i]);
|
||||
result=MStrUtil(st,SUF_REM_LEADING|SUF_REM_TRAILING);
|
||||
Free(st);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *DrvModelNum(U8 drv_let=0)
|
||||
{//40 bytes max.
|
||||
CBlkDev *bd=Let2BlkDev(drv_let);
|
||||
U16 *st,*result=NULL;
|
||||
I64 i;
|
||||
if (bd->dev_id_record) {
|
||||
st=CAlloc(40+1);
|
||||
for (i=0;i<20;i++)
|
||||
st[i]=EndianU16(bd->dev_id_record[27+i]);
|
||||
result=MStrUtil(st,SUF_REM_LEADING|SUF_REM_TRAILING);
|
||||
Free(st);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 DrvRep()
|
||||
{//Drive report.
|
||||
CDrv *dv;
|
||||
CBlkDev *bd;
|
||||
I64 i,drv_let;
|
||||
U8 *st;
|
||||
"\nDefined Drives:\n\n";
|
||||
for (i=0,dv=dsk.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)
|
||||
"$$GREEN$$:";
|
||||
else
|
||||
'' CH_SPACE;
|
||||
"$$PURPLE$$%C %-8Z %-9Z %04X %04X %02X$$FG$$\n",
|
||||
drv_let,dv->type.u16[0],"ST_DRV_TYPES",
|
||||
bd->type,"ST_BLKDEV_TYPES",bd->base0,bd->base1,bd->unit;
|
||||
if (st=DrvModelNum(drv_let)) {
|
||||
" $$CYAN$$Model# :%s$$FG$$\n",st;
|
||||
Free(st);
|
||||
}
|
||||
if (st=DrvSerialNum(drv_let)) {
|
||||
" $$CYAN$$Serial#:%s$$FG$$\n",st;
|
||||
Free(st);
|
||||
}
|
||||
" %016X-%016X\n",
|
||||
dv->base_offset,dv->base_offset+dv->size-1;
|
||||
dv->base_offset,dv->base_offset+dv->size-1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
I64 ClusterNumNext(CDrv *dv,I64 c,I64 cnt=1)
|
||||
{//Return next cnt'th cluster in chain.
|
||||
Bool unlock;
|
||||
DrvChk(dv);
|
||||
if (cnt<=0) return c;
|
||||
try {
|
||||
unlock=DrvLock(dv);
|
||||
switch (dv->type) {
|
||||
case DVT_ISO9660:
|
||||
case DVT_REDSEA:
|
||||
c+=cnt;
|
||||
break;
|
||||
case DVT_FAT32:
|
||||
while (cnt-->0 && 0<c<0x0FFFFFF8) {
|
||||
DrvMapBlkSet(dv,c);
|
||||
c=dv->cur_map_blk[c & (BLK_SIZE/4-1)];
|
||||
}
|
||||
if (!(0<c<0x0FFFFFF8))
|
||||
c=INVALID_CLUSTER;
|
||||
break;
|
||||
default:
|
||||
throw('Drv');
|
||||
}
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
return c;
|
||||
}
|
||||
|
||||
I64 Cluster2Blk(CDrv *dv,I64 c)
|
||||
{//Drv cluster num to blk num.
|
||||
DrvChk(dv);
|
||||
switch (dv->type) {
|
||||
case DVT_REDSEA:
|
||||
return c;
|
||||
case DVT_ISO9660:
|
||||
case DVT_FAT32:
|
||||
return dv->data_area+c*dv->spc;
|
||||
default:
|
||||
throw('Drv');
|
||||
}
|
||||
}
|
||||
|
||||
I64 RClustersBlks(CDrv *dv,U8 *buf,I64 c,I64 blks)
|
||||
{//Accepts blk count, so padding on last cluster is not read.
|
||||
I64 i;
|
||||
Bool unlock;
|
||||
DrvChk(dv);
|
||||
if (blks<=0) return c;
|
||||
try {
|
||||
unlock=DrvLock(dv);
|
||||
switch (dv->type) {
|
||||
case DVT_ISO9660:
|
||||
RBlks(dv,buf,dv->data_area+c*dv->spc,blks);
|
||||
c+=(blks+dv->spc-1)/dv->spc;
|
||||
break;
|
||||
case DVT_REDSEA:
|
||||
RBlks(dv,buf,c,blks);
|
||||
c+=blks;
|
||||
break;
|
||||
case DVT_FAT32:
|
||||
while (blks && 0<c<0x0FFFFFF8) {
|
||||
i=blks;
|
||||
if (i>dv->spc)
|
||||
i=dv->spc;
|
||||
RBlks(dv,buf,dv->data_area+c*dv->spc,i);
|
||||
buf+=i<<BLK_SIZE_BITS;
|
||||
c=ClusterNumNext(dv,c,1);
|
||||
blks-=i;
|
||||
}
|
||||
if (blks)
|
||||
throw('Drv');
|
||||
break;
|
||||
default:
|
||||
throw('Drv');
|
||||
}
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
return c;
|
||||
}
|
||||
|
||||
I64 RClusters(CDrv *dv,U8 *buf,I64 c,I64 cnt)
|
||||
{//Read cluster cnt from drv to buf.
|
||||
return RClustersBlks(dv,buf,c,cnt*dv->spc);
|
||||
}
|
||||
|
||||
Bool CFileNameTo(U8 *dst,U8 *src)
|
||||
{
|
||||
MemSet(dst,0,CDIR_FILENAME_LEN);
|
||||
if (!FileNameChk(src))
|
||||
return FALSE;
|
||||
StrCpy(dst,src);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
I64 Name2DirCluster(CDrv *dv,U8 *dirname)
|
||||
{
|
||||
Bool cont=TRUE,unlock;
|
||||
I64 cur_dir_cluster;
|
||||
CDirEntry de;
|
||||
U8 *buf=StrNew(dirname),*buf2=StrNew(dirname);
|
||||
DrvChk(dv);
|
||||
try {
|
||||
unlock=DrvLock(dv);
|
||||
cur_dir_cluster=dv->root_cluster;
|
||||
while (*buf && cont) {
|
||||
StrFirstRem(buf,"/",buf2);
|
||||
if (*buf2) {
|
||||
switch (dv->type) {
|
||||
case DVT_REDSEA:
|
||||
cont=RedSeaFileFind(dv,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
case DVT_FAT32:
|
||||
cont=FAT32FileFind(dv,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
case DVT_ISO9660:
|
||||
cont=ISO1FileFind(dv,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
default:
|
||||
throw('Drv');
|
||||
}
|
||||
cur_dir_cluster=de.cluster;
|
||||
}
|
||||
}
|
||||
if (!cont) {
|
||||
"%s ",dirname;
|
||||
PrintErr("File not found.\n");
|
||||
cur_dir_cluster=0;
|
||||
}
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
Free(buf);
|
||||
Free(buf2);
|
||||
return cur_dir_cluster;
|
||||
}
|
||||
|
||||
I64 Name2ParentDirCluster(CDrv *dv,U8 *dirname)
|
||||
{
|
||||
Bool cont=TRUE,unlock;
|
||||
I64 cur_dir_cluster,cur_dir_cluster2;
|
||||
CDirEntry de;
|
||||
U8 *buf=StrNew(dirname),*buf2=StrNew(dirname);
|
||||
DrvChk(dv);
|
||||
try {
|
||||
unlock=DrvLock(dv);
|
||||
cur_dir_cluster=cur_dir_cluster2=dv->root_cluster;
|
||||
while (*buf && cont) {
|
||||
cur_dir_cluster2=cur_dir_cluster;
|
||||
StrFirstRem(buf,"/",buf2);
|
||||
if (*buf2) {
|
||||
switch (dv->type) {
|
||||
case DVT_REDSEA:
|
||||
cont=RedSeaFileFind(dv,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
case DVT_FAT32:
|
||||
cont=FAT32FileFind(dv,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
case DVT_ISO9660:
|
||||
cont=ISO1FileFind(dv,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS);
|
||||
break;
|
||||
default:
|
||||
throw('Drv');
|
||||
}
|
||||
cur_dir_cluster=de.cluster;
|
||||
}
|
||||
}
|
||||
if (!cont) {
|
||||
"%s ",dirname;
|
||||
PrintErr("File not found.\n");
|
||||
cur_dir_cluster2=0;
|
||||
}
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
Free(buf);
|
||||
Free(buf2);
|
||||
return cur_dir_cluster2;
|
||||
}
|
||||
|
||||
I64 WClustersBlks(CDrv *dv,U8 *buf,I64 c,I64 blks)
|
||||
{//Accepts blk count, so padding on last cluster is not written.
|
||||
I64 i;
|
||||
Bool unlock;
|
||||
DrvChk(dv);
|
||||
if (blks<=0) return c;
|
||||
try {
|
||||
unlock=DrvLock(dv);
|
||||
switch (dv->type) {
|
||||
case DVT_REDSEA:
|
||||
WBlks(dv,buf,c,blks);
|
||||
c=0;
|
||||
break;
|
||||
case DVT_FAT32:
|
||||
while (blks) {
|
||||
if (!(0<c<0x0FFFFFF8))
|
||||
throw('Drv');
|
||||
i=blks;
|
||||
if (i>dv->spc)
|
||||
i=dv->spc;
|
||||
WBlks(dv,buf,dv->data_area+c*dv->spc,i);
|
||||
buf+=i<<BLK_SIZE_BITS;
|
||||
c=ClusterNumNext(dv,c);
|
||||
blks-=i;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw('Drv');
|
||||
}
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
DrvUnlock(dv);
|
||||
return c;
|
||||
}
|
||||
|
||||
I64 WClusters(CDrv *dv,U8 *buf,I64 c,I64 cnt)
|
||||
{//Write cluster cnt from buf to drv.
|
||||
return WClustersBlks(dv,buf,c,cnt*dv->spc);
|
||||
}
|
||||
|
||||
I64 ClustersAlloc(CDrv *dv,I64 c=0,I64 cnt=1,Bool contiguous=FALSE)
|
||||
{//Alloc cluster cnt into chain.
|
||||
//c=0 means first cluster in chain
|
||||
DrvChk(dv);
|
||||
if (cnt<=0) return c;
|
||||
switch (dv->type) {
|
||||
case DVT_REDSEA:
|
||||
return RedSeaAllocClusters(dv,cnt);
|
||||
case DVT_FAT32:
|
||||
if (contiguous) {
|
||||
if (c) throw('File');
|
||||
return FAT32AllocContiguousClusters(dv,cnt);
|
||||
} else
|
||||
return FAT32AllocClusters(dv,c,cnt);
|
||||
default:
|
||||
throw('Drv');
|
||||
}
|
||||
}
|
||||
+287
-568
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,279 @@
|
||||
Bool BootCdProbe(CBlkDev *bd)
|
||||
{
|
||||
CKernel *img=CAlloc(CD_BLK_SIZE);
|
||||
I64 i;
|
||||
Bool result=FALSE;
|
||||
"Port: %04X,%04X Unit: %02X ",bd->base0,bd->base1,bd->unit;
|
||||
if (ATAProbe(bd->base0,bd->base1,bd->unit)==BDT_ATAPI) {
|
||||
" ATAPI";
|
||||
if (ATAPIStartStop(bd,tS+5.0,TRUE)) {
|
||||
" Started";
|
||||
for (i=0;i<2;i++) {//Retry
|
||||
if (ATAPIReadBlks2(bd,tS+7.0,img,sys_boot_src.u16[1],1,FALSE)) {
|
||||
if (img->compile_time==sys_compile_time) {
|
||||
" Found";
|
||||
return TRUE;
|
||||
} else
|
||||
" Read";
|
||||
} else
|
||||
" NoRead";
|
||||
}
|
||||
}
|
||||
}
|
||||
" Nope\n";
|
||||
Free(img);
|
||||
return result;
|
||||
}
|
||||
|
||||
Bool BootCdProbeAll(CBlkDev *bd)
|
||||
{
|
||||
I64 d1,d2,i,j,k;
|
||||
|
||||
bd->base1=0;
|
||||
for (k=0;k<256;k++) {
|
||||
i=-1;
|
||||
while (TRUE) {
|
||||
j=PCIClassFind(0x010100+k,++i);
|
||||
if (j<0)
|
||||
break;
|
||||
"Subcode:0x%X Bus:0x%X Dev:0x%X Fun:0x%X\n",k,j.u8[2],j.u8[1],j.u8[0];
|
||||
d1=PCIReadU32(j.u8[2],j.u8[1],j.u8[0],0x10);
|
||||
d2=PCIReadU32(j.u8[2],j.u8[1],j.u8[0],0x14);
|
||||
if (d1&1 && d2&1) {
|
||||
if (bd->base0=d1&~7) {
|
||||
bd->unit=0;
|
||||
if (BootCdProbe(bd))
|
||||
return TRUE;
|
||||
bd->unit=1;
|
||||
if (BootCdProbe(bd))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
d1=PCIReadU32(j.u8[2],j.u8[1],j.u8[0],0x18);
|
||||
d2=PCIReadU32(j.u8[2],j.u8[1],j.u8[0],0x1C);
|
||||
if (d1&1 && d2&1) {
|
||||
if (bd->base0=d1&~7) {
|
||||
bd->unit=0;
|
||||
if (BootCdProbe(bd))
|
||||
return TRUE;
|
||||
bd->unit=1;
|
||||
if (BootCdProbe(bd))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
d1=0x1F0;
|
||||
d2=0x3F6;
|
||||
if (bd->base0=d1&~7) {
|
||||
bd->unit=0;
|
||||
if (BootCdProbe(bd))
|
||||
return TRUE;
|
||||
bd->unit=1;
|
||||
if (BootCdProbe(bd))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
d1=0x170;
|
||||
d2=0x376;
|
||||
if (bd->base0=d1&~7) {
|
||||
bd->unit=0;
|
||||
if (BootCdProbe(bd))
|
||||
return TRUE;
|
||||
bd->unit=1;
|
||||
if (BootCdProbe(bd))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
U0 ATARepEntry(I64 base0,I64 base1,I64 unit,I64 irq,U8 *msg,CATARep **_root,I64 *num_hints)
|
||||
{
|
||||
I64 type;
|
||||
base0&=-8;
|
||||
base1&=-4;
|
||||
CATARep *tempha;
|
||||
if (type=ATAProbe(base0,base1,unit)) {
|
||||
*num_hints+=1;
|
||||
"\n\n$$PURPLE$$ $$BT+X,\"%d\",LM=\"%d\\n\"$$$$FG$$$$LM,4$$",*num_hints,*num_hints;
|
||||
if (type==BDT_ATA)
|
||||
"$$RED$$ATA ";
|
||||
else
|
||||
"$$RED$$ATAPI ";
|
||||
"$$LTBLUE$$%s$$FG$$\nBase0:0x%04X Base1:0x%04X\nIrq:0x%02X Unit:%d$$LM,0$$\n",msg,base0,base1,irq,unit;
|
||||
if (_root) {
|
||||
tempha=CAlloc(sizeof(CATARep));
|
||||
tempha->next=*_root;
|
||||
*_root=tempha;
|
||||
tempha->num=*num_hints;
|
||||
tempha->type=type;
|
||||
tempha->base0=base0;
|
||||
tempha->base1=base1;
|
||||
tempha->unit=unit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Bool ATARepExitAllApplications()
|
||||
{
|
||||
"\nWe're going to probe hardware.\n"
|
||||
"$$RED$$Exit all other applications.$$FG$$\n"
|
||||
"Press '$$PURPLE$$p$$FG$$' to probe or '$$PURPLE$$s$$FG$$' to skip.\n";
|
||||
if (ToUpper(GetChar(,FALSE))=='S')
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
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(OFF);
|
||||
for (i=0;i<NUM_BLKDEVS;i++)
|
||||
if (dsk.blkdevs[i].bd_signature==BD_SIGNATURE_VAL)
|
||||
BEqu(&unlock_flags,i,
|
||||
BlkDevLock(&dsk.blkdevs[i]));
|
||||
|
||||
if (!just_ide)
|
||||
for (k=0;k<256;k++) {
|
||||
i=-1;
|
||||
while (TRUE) {
|
||||
j=PCIClassFind(0x010100+k,++i);
|
||||
if (j<0)
|
||||
break;
|
||||
|
||||
"\nSubcode:0x%X Bus:0x%X Dev:0x%X Fun:0x%X\n",k,j.u8[2],j.u8[1],j.u8[0];
|
||||
cnt++;
|
||||
|
||||
d1=PCIReadU32(j.u8[2],j.u8[1],j.u8[0],0x10);
|
||||
d2=PCIReadU32(j.u8[2],j.u8[1],j.u8[0],0x14);
|
||||
d3=PCIReadU8(j.u8[2],j.u8[1],j.u8[0],0x3C);
|
||||
if (d1&1 && d2&1) {
|
||||
ATARepEntry(d1,d2,0,d3,"Primary IDE",_root,&num_hints);
|
||||
ATARepEntry(d1,d2,1,d3,"Primary IDE",_root,&num_hints);
|
||||
} else {
|
||||
d1=0x1F0; d2=0x3F6; d3=14;
|
||||
ATARepEntry(d1,d2,0,d3,"Primary IDE",_root,&num_hints);
|
||||
ATARepEntry(d1,d2,1,d3,"Primary IDE",_root,&num_hints);
|
||||
}
|
||||
d1=PCIReadU32(j.u8[2],j.u8[1],j.u8[0],0x18);
|
||||
d2=PCIReadU32(j.u8[2],j.u8[1],j.u8[0],0x1C);
|
||||
if (d1&1 && d2&1) {
|
||||
ATARepEntry(d1,d2,0,d3,"Secondary IDE",_root,&num_hints);
|
||||
ATARepEntry(d1,d2,1,d3,"Secondary IDE",_root,&num_hints);
|
||||
} else {
|
||||
d1=0x170; d2=0x376; d3=15;
|
||||
ATARepEntry(d1,d2,0,d3,"Secondary IDE",_root,&num_hints);
|
||||
ATARepEntry(d1,d2,1,d3,"Secondary IDE",_root,&num_hints);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!cnt) {
|
||||
d1=0x1F0; d2=0x3F6; d3=14;
|
||||
ATARepEntry(d1,d2,0,d3,"Primary IDE",_root,&num_hints);
|
||||
ATARepEntry(d1,d2,1,d3,"Primary IDE",_root,&num_hints);
|
||||
|
||||
d1=0x170; d2=0x376; d3=15;
|
||||
ATARepEntry(d1,d2,0,d3,"Secondary IDE",_root,&num_hints);
|
||||
ATARepEntry(d1,d2,1,d3,"Secondary IDE",_root,&num_hints);
|
||||
}
|
||||
'\n\n';
|
||||
for (i=0;i<NUM_BLKDEVS;i++)
|
||||
if (Bt(&unlock_flags,i))
|
||||
BlkDevUnlock(&dsk.blkdevs[i]);
|
||||
Preempt(old_preempt);
|
||||
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.
|
||||
CATARep *result=NULL,*tempha=root,*ata_drv=NULL,*atapi_drv=NULL;
|
||||
CBlkDev *bd;
|
||||
Bool was_silent=Silent;
|
||||
try
|
||||
bd=Let2BlkDev(_sys_boot_drv);
|
||||
catch {
|
||||
Fs->catch_except=TRUE;
|
||||
bd=NULL;
|
||||
}
|
||||
Silent(was_silent);
|
||||
while (tempha) {
|
||||
if (!result && bd && bd->type==tempha->type) {
|
||||
if (bd->type==BDT_ATAPI &&
|
||||
bd->base0==tempha->base0 && bd->unit==tempha->unit)
|
||||
result=atapi_drv=tempha;
|
||||
else if (bd->type==BDT_ATA && bd->base0==tempha->base0 &&
|
||||
bd->base1==tempha->base1 && bd->unit==tempha->unit)
|
||||
result=ata_drv=tempha;
|
||||
}
|
||||
if (!result || result->type!=tempha->type) {
|
||||
if (tempha->type==BDT_ATA) {
|
||||
if (!ata_drv || tempha->unit<ata_drv->unit ||
|
||||
tempha->unit==ata_drv->unit && tempha->num<ata_drv->num)
|
||||
ata_drv=tempha;
|
||||
} else if (tempha->type==BDT_ATAPI) {
|
||||
if (!atapi_drv || tempha->unit<atapi_drv->unit ||
|
||||
tempha->unit==atapi_drv->unit && tempha->num<atapi_drv->num)
|
||||
atapi_drv=tempha;
|
||||
}
|
||||
}
|
||||
tempha=tempha->next;
|
||||
}
|
||||
if (_ata_drv) *_ata_drv =ata_drv;
|
||||
if (_atapi_drv) *_atapi_drv=atapi_drv;
|
||||
return result;
|
||||
}
|
||||
|
||||
CBlkDev *ATAMount(U8 first_drv_let,I64 type,I64 base0,I64 base1,I64 unit)
|
||||
{
|
||||
CBlkDev *result;
|
||||
if (0<=first_drv_let-'A'<NUM_DRVS && (type==BDT_ATA || type==BDT_ATAPI) &&
|
||||
0<=unit<=1) {
|
||||
result=BlkDevNextFree(first_drv_let,type);
|
||||
result->unit=unit;
|
||||
result->base0=base0;
|
||||
result->base1=base1;
|
||||
if (BlkDevAdd(result,FALSE,FALSE))
|
||||
return result;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
I64 AutoMountIDE()
|
||||
{//Try to mount hard drive and CD/DVD, automatically. (Kernel.Cfg option).
|
||||
//It uses 'C' and 'T' as first drive letters or whatever you set
|
||||
//in config when compiling Kernel.BIN.
|
||||
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,
|
||||
ata_drv->base0,ata_drv->base1,ata_drv->unit))
|
||||
result++;
|
||||
if (atapi_drv && ATAMount(dsk.first_cd_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,
|
||||
tempha->base0,tempha->base1,tempha->unit))
|
||||
result++;
|
||||
else if (tempha->type==BDT_ATAPI && ATAMount(dsk.first_cd_drv_let,BDT_ATAPI,
|
||||
tempha->base0,tempha->base1,tempha->unit))
|
||||
result++;
|
||||
}
|
||||
tempha=tempha->next;
|
||||
}
|
||||
LinkedLstDel(root);
|
||||
dsk.auto_mount_ide_cnt=result;
|
||||
return result;
|
||||
}
|
||||
+88
-87
@@ -1,18 +1,18 @@
|
||||
U0 SetBlkDevLockFwding(CBlkDev *bdev)
|
||||
{
|
||||
CBlkDev *bdev1;
|
||||
U0 BlkDevLockFwdingSet(CBlkDev *bd)
|
||||
{ //If two blkdevs on same controller, use just one lock
|
||||
CBlkDev *bd1;
|
||||
I64 i;
|
||||
switch (bdev->type) {
|
||||
switch (bd->type) {
|
||||
case BDT_RAM:
|
||||
break;
|
||||
case BDT_ATA:
|
||||
case BDT_ATAPI:
|
||||
for (i=0;i<NUM_BLKDEVS;i++) {
|
||||
bdev1=&dsk.blkdevs[i];
|
||||
if (bdev1->bd_signature==BD_SIGNATURE_VAL && bdev!=bdev1 &&
|
||||
(bdev1->type==BDT_ATAPI || bdev1->type==BDT_ATA) &&
|
||||
bdev1->base0==bdev->base0) {
|
||||
bdev->lock_fwding=bdev1;
|
||||
bd1=&dsk.blkdevs[i];
|
||||
if (bd1->bd_signature==BD_SIGNATURE_VAL && bd!=bd1 &&
|
||||
(bd1->type==BDT_ATAPI || bd1->type==BDT_ATA) &&
|
||||
bd1->base0==bd->base0) {
|
||||
bd->lock_fwding=bd1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -20,74 +20,74 @@ U0 SetBlkDevLockFwding(CBlkDev *bdev)
|
||||
}
|
||||
}
|
||||
|
||||
I64 BlkDevAdd(CBlkDev *bdev,Bool one_prt,Bool make_free)
|
||||
I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free)
|
||||
{
|
||||
I64 i,j,ext_base,offset,result=0;
|
||||
CPrt *p;
|
||||
CBootStruct br;
|
||||
CDrv *dv;
|
||||
CRedSeaBoot br;
|
||||
CMasterBoot mbr;
|
||||
|
||||
bdev->bd_signature=BD_SIGNATURE_VAL;
|
||||
bd->bd_signature=BD_SIGNATURE_VAL;
|
||||
if (make_free)
|
||||
p=PrtMakeFree(bdev->first_drv_let+result);
|
||||
dv=DrvMakeFree(bd->first_drv_let+result);
|
||||
else
|
||||
p=PrtNextFree(bdev->first_drv_let+result);
|
||||
p->bdev=bdev;
|
||||
p->size=bdev->max_blk+1;
|
||||
switch (bdev->type) {
|
||||
dv=DrvNextFree(bd->first_drv_let+result);
|
||||
dv->bd=bd;
|
||||
dv->size=bd->max_blk+1;
|
||||
switch (bd->type) {
|
||||
case BDT_RAM:
|
||||
p->pt_signature=PRT_SIGNATURE_VAL;
|
||||
p->type=PT_REDSEA;
|
||||
dv->dv_signature=DRV_SIGNATURE_VAL;
|
||||
dv->type=DVT_REDSEA;
|
||||
//This is to force creation of a RAM
|
||||
//drive during boot, so it is probably
|
||||
//MAlloced to the same addr and can
|
||||
//be assumed to be already formatted.
|
||||
//If this line is removed, RAM Drives
|
||||
//will be allocated on a just-in-time
|
||||
//will be alloced on a just-in-time
|
||||
//basis.
|
||||
if (BlkDevInit(bdev))
|
||||
if (BlkDevInit(bd))
|
||||
result++;
|
||||
else
|
||||
p->pt_signature=0;
|
||||
dv->dv_signature=0;
|
||||
break;
|
||||
case BDT_ATA:
|
||||
p->pt_signature=PRT_SIGNATURE_VAL; //Temporarily validate
|
||||
if (!BlkDevInit(bdev))
|
||||
p->pt_signature=0; //Revoke validation
|
||||
dv->dv_signature=DRV_SIGNATURE_VAL; //Temporarily validate
|
||||
if (!BlkDevInit(bd))
|
||||
dv->dv_signature=0; //Revoke validation
|
||||
else {
|
||||
p->pt_signature=0; //Revoke validation
|
||||
if (one_prt) {
|
||||
p->pt_signature=PRT_SIGNATURE_VAL;
|
||||
dv->dv_signature=0; //Revoke validation
|
||||
if (one_drv) {
|
||||
dv->dv_signature=DRV_SIGNATURE_VAL;
|
||||
result++;
|
||||
p->type=PT_REDSEA;
|
||||
p->size=bdev->max_blk+1;
|
||||
dv->type=DVT_REDSEA;
|
||||
dv->size=bd->max_blk+1;
|
||||
//The following read is a test read.
|
||||
//if it hangs, the drive is not supported.
|
||||
ATAReadBlks(bdev,&mbr,0,1);
|
||||
ATAReadBlks(bd,&mbr,0,1);
|
||||
break;
|
||||
}
|
||||
offset=0;
|
||||
ext_base=INVALID_CLUSTER;
|
||||
while (TRUE) {
|
||||
ATAReadBlks(bdev,&mbr,offset,1);
|
||||
ATAReadBlks(bd,&mbr,offset,1);
|
||||
if (mbr.signature!=0xAA55)
|
||||
break;
|
||||
j=-1;
|
||||
for (i=0;i<4;i++) {
|
||||
if (mbr.p[i].type) {
|
||||
if (make_free)
|
||||
p=PrtMakeFree(bdev->first_drv_let+result);
|
||||
dv=DrvMakeFree(bd->first_drv_let+result);
|
||||
else
|
||||
p=PrtNextFree(bdev->first_drv_let+result);
|
||||
p->bdev=bdev;
|
||||
p->offset=mbr.p[i].offset+offset;
|
||||
p->size =mbr.p[i].size;
|
||||
dv=DrvNextFree(bd->first_drv_let+result);
|
||||
dv->bd=bd;
|
||||
dv->base_offset=mbr.p[i].offset+offset;
|
||||
dv->size =mbr.p[i].size;
|
||||
switch (mbr.p[i].type) {
|
||||
case MBR_PT_REDSEA:
|
||||
p->pt_signature=PRT_SIGNATURE_VAL;
|
||||
dv->dv_signature=DRV_SIGNATURE_VAL;
|
||||
result++;
|
||||
p->type=PT_REDSEA;
|
||||
RedSeaFSPrtInit(p);
|
||||
dv->type=DVT_REDSEA;
|
||||
RedSeaDrvInit(dv);
|
||||
break;
|
||||
case MBR_PT_FAT32a:
|
||||
case MBR_PT_FAT32b:
|
||||
@@ -95,30 +95,30 @@ I64 BlkDevAdd(CBlkDev *bdev,Bool one_prt,Bool make_free)
|
||||
case MBR_PT_FAT32d:
|
||||
case MBR_PT_FAT32e:
|
||||
case MBR_PT_FAT32f:
|
||||
ATAReadBlks(bdev,&br,p->offset,1);
|
||||
p->pt_signature=PRT_SIGNATURE_VAL;
|
||||
ATAReadBlks(bd,&br,dv->base_offset,1);
|
||||
dv->dv_signature=DRV_SIGNATURE_VAL;
|
||||
result++;
|
||||
if (br.signature==MBR_PT_REDSEA) {
|
||||
p->type=PT_REDSEA;
|
||||
RedSeaFSPrtInit(p);
|
||||
dv->type=DVT_REDSEA;
|
||||
RedSeaDrvInit(dv);
|
||||
} else {
|
||||
p->type=PT_FAT32;
|
||||
FAT32PrtInit(p);
|
||||
dv->type=DVT_FAT32;
|
||||
FAT32DrvInit(dv);
|
||||
}
|
||||
break;
|
||||
case MBR_PT_NTFS:
|
||||
p->pt_signature=PRT_SIGNATURE_VAL;
|
||||
dv->dv_signature=DRV_SIGNATURE_VAL;
|
||||
result++;
|
||||
p->type=PT_NTFS;
|
||||
dv->type=DVT_NTFS;
|
||||
break;
|
||||
case 5:
|
||||
case 15:
|
||||
j=i;
|
||||
break;
|
||||
default:
|
||||
p->pt_signature=PRT_SIGNATURE_VAL;
|
||||
dv->dv_signature=DRV_SIGNATURE_VAL;
|
||||
result++;
|
||||
p->type=PT_UNKNOWN;
|
||||
dv->type=DVT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -135,26 +135,26 @@ I64 BlkDevAdd(CBlkDev *bdev,Bool one_prt,Bool make_free)
|
||||
}
|
||||
break;
|
||||
case BDT_ATAPI:
|
||||
p->pt_signature=PRT_SIGNATURE_VAL;
|
||||
dv->dv_signature=DRV_SIGNATURE_VAL;
|
||||
result++;
|
||||
p->type=PT_ISO9660; //Start with this
|
||||
p->size =0;
|
||||
dv->type=DVT_ISO9660; //Start with this
|
||||
dv->size =0;
|
||||
break;
|
||||
}
|
||||
if (result)
|
||||
SetBlkDevLockFwding(bdev);
|
||||
BlkDevLockFwdingSet(bd);
|
||||
else
|
||||
MemSet(bdev,0,sizeof(CBlkDev));
|
||||
MemSet(bd,0,sizeof(CBlkDev));
|
||||
return result;
|
||||
}
|
||||
|
||||
Bool DrvEnable(U8 drv_let,Bool val)
|
||||
{//Can unmount or remount, but not mount the first time.
|
||||
CPrt *p;
|
||||
CDrv *dv;
|
||||
Bool result=FALSE;
|
||||
try {
|
||||
p=Drv2Prt(drv_let);
|
||||
result=!LBEqu(&p->type,PTf_DISABLE,!val);
|
||||
dv=Let2Drv(drv_let);
|
||||
result=!LBEqu(&dv->type,DVTf_DISABLE,!val);
|
||||
} catch
|
||||
Fs->catch_except=TRUE;
|
||||
return result;
|
||||
@@ -172,14 +172,14 @@ CATARep *ATARepFind(CATARep *haystack_root,I64 needle_num)
|
||||
|
||||
U0 Mount(Bool repartition=FALSE)
|
||||
{//Mount a drive.
|
||||
CBlkDev *bdev;
|
||||
I64 first_prt_num,type,unit,num_hints;
|
||||
CBlkDev *bd;
|
||||
I64 first_drv_num,type,unit,num_hints;
|
||||
U8 blks_buf[128],addr_buf[128],base0_buf[128],base1_buf[128];
|
||||
Bool add;
|
||||
CATARep *root,*tempha;
|
||||
|
||||
do {
|
||||
PrtRep;
|
||||
DrvRep;
|
||||
"\n****** Mount Drives ******\n"
|
||||
"The first drive letter is the letter\n"
|
||||
"of the first partition. If adding\n"
|
||||
@@ -187,9 +187,9 @@ U0 Mount(Bool repartition=FALSE)
|
||||
"If more than one partition is present\n"
|
||||
"they will be lettered in sequence.\n"
|
||||
"\nFirst Drive Letter ($$PURPLE$$<ENTER>$$FG$$ to exit):";
|
||||
first_prt_num=ToUpper(GetChar)-'A';
|
||||
first_drv_num=ToUpper(GetChar)-'A';
|
||||
'\n';
|
||||
if (0<=first_prt_num<NUM_PRTS) {
|
||||
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:";
|
||||
type=GetChar-'0';
|
||||
@@ -235,35 +235,35 @@ U0 Mount(Bool repartition=FALSE)
|
||||
}
|
||||
|
||||
if (BDT_NULL<type<BDT_NUM_TYPES && 0<=unit<=1) {
|
||||
bdev=BlkDevNextFree(first_prt_num+'A',type);
|
||||
bdev->unit=unit;
|
||||
bd=BlkDevNextFree(first_drv_num+'A',type);
|
||||
bd->unit=unit;
|
||||
if (type==BDT_RAM) {
|
||||
if (!*addr_buf) StrCpy(addr_buf,"0");
|
||||
bdev->RAM_dsk=Str2I64(addr_buf);
|
||||
bdev->max_blk=Str2I64(blks_buf)-1;
|
||||
bd->RAM_dsk=Str2I64(addr_buf);
|
||||
bd->max_blk=Str2I64(blks_buf)-1;
|
||||
}
|
||||
if (type==BDT_ATA ||
|
||||
type==BDT_ATAPI) {
|
||||
bdev->base0=Str2I64(base0_buf);
|
||||
bdev->base1=Str2I64(base1_buf);
|
||||
bd->base0=Str2I64(base0_buf);
|
||||
bd->base1=Str2I64(base1_buf);
|
||||
}
|
||||
add=TRUE;
|
||||
if (type==BDT_ATA && repartition) {
|
||||
"\nReformat WHOLE drive!";
|
||||
if (YorN) {
|
||||
if (!BlkDevAdd(bdev,TRUE,TRUE))
|
||||
if (!BlkDevAdd(bd,TRUE,TRUE))
|
||||
"\n\n$$BK,1$$$$RED$$Operation Failed$$BK,0$$$$FG$$\n\n";
|
||||
else
|
||||
CallExtStr("PrtDsk",bdev->first_drv_let);
|
||||
CallExtStr("PrtDsk",bd->first_drv_let);
|
||||
add=FALSE;
|
||||
}
|
||||
}
|
||||
if (add && !BlkDevAdd(bdev,FALSE,TRUE))
|
||||
if (add && !BlkDevAdd(bd,FALSE,TRUE))
|
||||
"\n\n$$BK,1$$$$RED$$Operation Failed$$BK,0$$$$FG$$\n\n";
|
||||
} else
|
||||
"\n\n$$BK,1$$$$RED$$Operation Failed$$BK,0$$$$FG$$\n\n";
|
||||
}
|
||||
} while (0<=first_prt_num<NUM_PRTS);
|
||||
} while (0<=first_drv_num<NUM_DRVS);
|
||||
}
|
||||
|
||||
I64 SysGetI64()
|
||||
@@ -273,7 +273,7 @@ I64 SysGetI64()
|
||||
return Str2I64(st,16);
|
||||
}
|
||||
|
||||
Bool GetBaseUnit(CBlkDev *bdev)
|
||||
Bool GetBaseUnit(CBlkDev *bd)
|
||||
{
|
||||
I64 ch;
|
||||
Bool probe;
|
||||
@@ -284,25 +284,26 @@ Bool GetBaseUnit(CBlkDev *bdev)
|
||||
else
|
||||
StreamPrint("probe=TRUE;");
|
||||
};
|
||||
if (!probe || !BootCdProbeAll(bdev)) {
|
||||
if (!probe || !BootCdProbeAll(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"
|
||||
"\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";
|
||||
bdev->base0=SysGetI64;
|
||||
bdev->base1=0;
|
||||
bdev->unit =0;
|
||||
if (bdev->base0) {
|
||||
bd->base0=SysGetI64;
|
||||
bd->base1=0;
|
||||
bd->unit =0;
|
||||
if (bd->base0) {
|
||||
"\nUnit (0 or 1): ";
|
||||
do ch=GetChar(,FALSE);
|
||||
while (!('0'<=ch<='1'));
|
||||
'' ch;
|
||||
bdev->unit=ch-'0';
|
||||
dsk.cdrom_boot_is_good=BootCdProbe(bdev);
|
||||
bd->unit=ch-'0';
|
||||
dsk.cdrom_boot_is_good=BootCdProbe(bd);
|
||||
return TRUE;
|
||||
} else {
|
||||
dsk.cdrom_boot_is_good=FALSE;
|
||||
@@ -314,12 +315,12 @@ Bool GetBaseUnit(CBlkDev *bdev)
|
||||
|
||||
U0 BlkDevsInitAll()
|
||||
{
|
||||
CBlkDev *bdev;
|
||||
CBlkDev *bd;
|
||||
I64 i;
|
||||
dsk.blkdevs=CAlloc(sizeof(CBlkDev)*NUM_BLKDEVS);
|
||||
dsk.prts=CAlloc(sizeof(CPrt)*NUM_PRTS);
|
||||
for (i=0;i<NUM_PRTS;i++)
|
||||
dsk.drv_to_prt[i]=&dsk.prts[i];
|
||||
dsk.drvs=CAlloc(sizeof(CDrv)*NUM_DRVS);
|
||||
for (i=0;i<NUM_DRVS;i++)
|
||||
dsk.let_to_drv[i]=&dsk.drvs[i];
|
||||
text.raw_col=0;
|
||||
#exe {
|
||||
if (kernel_cfg->opts[CFG_AUTO_MOUNT_IDE])
|
||||
@@ -328,5 +329,5 @@ U0 BlkDevsInitAll()
|
||||
StreamDoc(kernel_cfg->add_dev);
|
||||
StreamPrint("#exe {OptOn(OPTf_WARN_PAREN);}");
|
||||
};
|
||||
PrtRep;
|
||||
DrvRep;
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
Bool MapDrv(U8 drv_let,CPrt *p)
|
||||
Bool MapDrv(U8 drv_let,CDrv *dv)
|
||||
{//Make drive letter map to another.
|
||||
drv_let=ToUpper(drv_let);
|
||||
if ('A'<=drv_let<='Z') {
|
||||
dsk.drv_to_prt[drv_let-'A']=p;
|
||||
p->drv_let=drv_let;
|
||||
dsk.let_to_drv[drv_let-'A']=dv;
|
||||
dv->drv_let=drv_let;
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
@@ -11,22 +11,22 @@ Bool MapDrv(U8 drv_let,CPrt *p)
|
||||
|
||||
Bool Drv(U8 drv_let)
|
||||
{//Set drive. You can set drive with $LK,"Cd",A="MN:Cd"$() as well.
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
CBlkDev *bdev=p->bdev;
|
||||
BlkDevChk(bdev);
|
||||
if (p!=Fs->cur_prt) {
|
||||
if (bdev->flags & BDF_REMOVABLE && !(bdev->flags & BDF_INITIALIZED))
|
||||
ChgDsk(Prt2Drv(p));
|
||||
if (bdev->type==BDT_RAM)
|
||||
BlkDevInit(bdev);
|
||||
CDrv *dv=Let2Drv(drv_let);
|
||||
CBlkDev *bd=dv->bd;
|
||||
BlkDevChk(bd);
|
||||
if (dv!=Fs->cur_dv) {
|
||||
if (bd->flags & BDF_REMOVABLE && !(bd->flags & BDF_INITIALIZED))
|
||||
ChgDsk(Drv2Let(dv));
|
||||
if (bd->type==BDT_RAM)
|
||||
BlkDevInit(bd);
|
||||
}
|
||||
Fs->cur_prt=p;
|
||||
Fs->cur_dv=dv;
|
||||
Free(Fs->cur_dir);
|
||||
Fs->cur_dir=StrNew("/");
|
||||
switch (p->type) {
|
||||
case PT_REDSEA:
|
||||
case PT_FAT32:
|
||||
case PT_ISO9660:
|
||||
switch (dv->type) {
|
||||
case DVT_REDSEA:
|
||||
case DVT_FAT32:
|
||||
case DVT_ISO9660:
|
||||
return TRUE;
|
||||
default:
|
||||
PrintErr("File System Not Supported\n");
|
||||
@@ -34,19 +34,21 @@ Bool Drv(U8 drv_let)
|
||||
}
|
||||
}
|
||||
|
||||
Bool Cd(U8 *dirname,Bool make_dirs=FALSE)
|
||||
Bool Cd(U8 *dirname=NULL,Bool make_dirs=FALSE)
|
||||
{//Change directory. Optionally, make directories, too.
|
||||
I64 maxlen,cur_dir_cluster=0;
|
||||
U8 *chg_to_buf,*new_cur_dir,*buf;
|
||||
CPrt *p;
|
||||
CDrv *dv;
|
||||
Bool result=TRUE;
|
||||
if (!*dirname)
|
||||
if (!dirname)
|
||||
dirname="::/Home";
|
||||
else if (!*dirname)
|
||||
return TRUE;
|
||||
if (dirname[1]==':') {
|
||||
if (*dirname==':') {
|
||||
if (Fs->cur_prt->drv_let!=*sys_acct && !Drv(*dirname))
|
||||
if (Fs->cur_dv!=Let2Drv(':') && !Drv(*dirname))
|
||||
return FALSE;
|
||||
} else if (Fs->cur_prt!=Drv2Prt(*dirname) && !Drv(*dirname))
|
||||
} else if (Fs->cur_dv!=Let2Drv(*dirname) && !Drv(*dirname))
|
||||
return FALSE;
|
||||
dirname+=2;
|
||||
}
|
||||
@@ -70,38 +72,31 @@ Bool Cd(U8 *dirname,Bool make_dirs=FALSE)
|
||||
if (!*new_cur_dir)
|
||||
StrCpy(new_cur_dir,"/");
|
||||
} else if (StrCmp(buf,".") && *buf) {
|
||||
if (!StrCmp(buf,"HOME")) {
|
||||
result=Cd(sys_acct);
|
||||
Free(new_cur_dir);
|
||||
new_cur_dir=MAlloc(maxlen+StrLen(sys_acct));
|
||||
StrCpy(new_cur_dir,sys_acct+2);
|
||||
} else {
|
||||
p=Fs->cur_prt;
|
||||
cur_dir_cluster=Name2DirCluster(p,new_cur_dir);
|
||||
switch (p->type) {
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSCd(buf,cur_dir_cluster);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
result=FAT32Cd(buf,cur_dir_cluster);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
result=ISO1Cd(buf,cur_dir_cluster);
|
||||
break;
|
||||
default:
|
||||
PrintErr("File System Not Supported\n");
|
||||
result=FALSE;
|
||||
}
|
||||
if (!result && make_dirs) {
|
||||
Free(Fs->cur_dir);
|
||||
Fs->cur_dir=StrNew(new_cur_dir);
|
||||
result=MkDir(buf);
|
||||
}
|
||||
if (result) {
|
||||
if (StrCmp(new_cur_dir,"/"))
|
||||
CatPrint(new_cur_dir,"/");
|
||||
CatPrint(new_cur_dir,buf);
|
||||
}
|
||||
dv=Fs->cur_dv;
|
||||
cur_dir_cluster=Name2DirCluster(dv,new_cur_dir);
|
||||
switch (dv->type) {
|
||||
case DVT_REDSEA:
|
||||
result=RedSeaCd(buf,cur_dir_cluster);
|
||||
break;
|
||||
case DVT_FAT32:
|
||||
result=FAT32Cd(buf,cur_dir_cluster);
|
||||
break;
|
||||
case DVT_ISO9660:
|
||||
result=ISO1Cd(buf,cur_dir_cluster);
|
||||
break;
|
||||
default:
|
||||
PrintErr("File System Not Supported\n");
|
||||
result=FALSE;
|
||||
}
|
||||
if (!result && make_dirs) {
|
||||
Free(Fs->cur_dir);
|
||||
Fs->cur_dir=StrNew(new_cur_dir);
|
||||
result=MkDir(buf);
|
||||
}
|
||||
if (result) {
|
||||
if (StrCmp(new_cur_dir,"/"))
|
||||
CatPrint(new_cur_dir,"/");
|
||||
CatPrint(new_cur_dir,buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -114,17 +109,17 @@ Bool Cd(U8 *dirname,Bool make_dirs=FALSE)
|
||||
}
|
||||
|
||||
U0 FileAccessDel(CFileAccess *fa)
|
||||
{//Change back to old cur_dir and prt.
|
||||
CBlkDev *bdev;
|
||||
{//Change back to old cur_dir and drv.
|
||||
CBlkDev *bd;
|
||||
if (!fa) return;
|
||||
bdev=fa->old_prt->bdev;
|
||||
if (!(bdev->flags & BDF_INIT_IN_PROGRESS)) {
|
||||
bd=fa->old_dv->bd;
|
||||
if (!(bd->flags & BDF_INIT_IN_PROGRESS)) {
|
||||
if (fa->old_dir) {
|
||||
Drv(Prt2Drv(fa->old_prt));
|
||||
Drv(Drv2Let(fa->old_dv));
|
||||
Cd(fa->old_dir);
|
||||
}
|
||||
} else {
|
||||
Fs->cur_prt=fa->old_prt;
|
||||
Fs->cur_dv=fa->old_dv;
|
||||
Free(Fs->cur_dir);
|
||||
Fs->cur_dir=StrNew("/");
|
||||
}
|
||||
@@ -134,23 +129,21 @@ U0 FileAccessDel(CFileAccess *fa)
|
||||
}
|
||||
|
||||
CFileAccess *FileAccessNew(U8 *_mask,Bool make_mask=FALSE,Bool make_dirs=FALSE,Bool no_mask=FALSE)
|
||||
{//Save cur_dir and prt. Change to new dir.
|
||||
{//Save cur_dir and drv. Change to new dir.
|
||||
Bool valid=TRUE,old_silent;
|
||||
U8 *buf,*mask,*temp_mask;
|
||||
CFileAccess *fa=CAlloc(sizeof(CFileAccess));
|
||||
mask=MStrUtil(_mask,SUF_REM_LEADING|SUF_REM_TRAILING|SUF_REM_CTRL_CHARS);
|
||||
temp_mask=mask;
|
||||
fa->old_dir=StrNew(Fs->cur_dir);
|
||||
fa->old_prt=Fs->cur_prt;
|
||||
fa->old_dv=Fs->cur_dv;
|
||||
if (*mask && mask[1]==':') {
|
||||
if (Fs->cur_prt!=Drv2Prt(*mask) && !Drv(*mask))
|
||||
if (Fs->cur_dv!=Let2Drv(*mask) && !Drv(*mask))
|
||||
valid=FALSE;
|
||||
mask+=2;
|
||||
}
|
||||
if (StrMatch("HOME",mask) && Fs->cur_prt!=Drv2Prt(*sys_acct))
|
||||
Drv(*sys_acct);
|
||||
fa->p=Fs->cur_prt;
|
||||
PrtChk(fa->p);
|
||||
fa->dv=Fs->cur_dv;
|
||||
DrvChk(fa->dv);
|
||||
buf=MAlloc(StrLen(mask)+2);
|
||||
StrCpy(buf,mask);
|
||||
fa->mask=MAlloc(StrLen(mask)+2);
|
||||
@@ -169,7 +162,7 @@ CFileAccess *FileAccessNew(U8 *_mask,Bool make_mask=FALSE,Bool make_dirs=FALSE,B
|
||||
fa->mask=StrNew("*");
|
||||
} else {
|
||||
if (!make_dirs || FileNameChk(fa->mask)) {
|
||||
old_silent=Silent(ON);
|
||||
old_silent=Silent;
|
||||
//Try mask to see if Dir. If Dir, change to dir and set to "*".
|
||||
if (Cd(fa->mask,make_dirs)) {
|
||||
Free(fa->mask);
|
||||
@@ -184,7 +177,6 @@ CFileAccess *FileAccessNew(U8 *_mask,Bool make_mask=FALSE,Bool make_dirs=FALSE,B
|
||||
if (!valid) {
|
||||
FileAccessDel(fa);
|
||||
fa=NULL;
|
||||
// throw('File');
|
||||
}
|
||||
return fa;
|
||||
}
|
||||
@@ -219,7 +211,7 @@ $LK,"DirTreeDel",A="MN:DirTreeDel"$() or $LK,"DirTreeDel2",A="MN:DirTreeDel2"$()
|
||||
Bool IsDir(U8 *dir_name)
|
||||
{//Is a str a valid, existing Dir?
|
||||
U8 *mask=MStrPrint("%s/*",dir_name);
|
||||
Bool result,old_silent=Silent(ON);
|
||||
Bool result,old_silent=Silent;
|
||||
CFileAccess *fa;
|
||||
if (fa=FileAccessNew(mask)) {
|
||||
FileAccessDel(fa);
|
||||
@@ -248,14 +240,14 @@ I64 Del(U8 *files_find_mask,Bool print_msg=TRUE)
|
||||
I64 result=0;
|
||||
CFileAccess *fa;
|
||||
if (fa=FileAccessNew(files_find_mask)) {
|
||||
switch (fa->p->type) {
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSFilesDel(fa->p,Fs->cur_dir,fa->mask,0,FALSE,print_msg);
|
||||
switch (fa->dv->type) {
|
||||
case DVT_REDSEA:
|
||||
result=RedSeaFilesDel(fa->dv,Fs->cur_dir,fa->mask,0,FALSE,print_msg);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
result=FAT32FilesDel(fa->p,Fs->cur_dir,fa->mask,0,FALSE,print_msg);
|
||||
case DVT_FAT32:
|
||||
result=FAT32FilesDel(fa->dv,Fs->cur_dir,fa->mask,0,FALSE,print_msg);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
case DVT_ISO9660:
|
||||
PrintErr("Not Writable\n");
|
||||
break;
|
||||
default:
|
||||
@@ -266,7 +258,7 @@ I64 Del(U8 *files_find_mask,Bool print_msg=TRUE)
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE)
|
||||
U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL)
|
||||
{//Read whole file from disk.
|
||||
CHashGeneric *temph;
|
||||
U8 *absname,*altname,*curname,*result=NULL;
|
||||
@@ -275,8 +267,8 @@ U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE)
|
||||
CArcCompress *ac;
|
||||
absname=FileNameAbs(filename);
|
||||
altname=ToggleZorNotZ(absname);
|
||||
if (!raw && ((temph=HashFind(absname,adam_task->hash_table,HTT_FILE))||
|
||||
(temph=HashFind(altname,adam_task->hash_table,HTT_FILE)))) {
|
||||
if ((temph=HashFind(absname,adam_task->hash_table,HTT_FILE))||
|
||||
(temph=HashFind(altname,adam_task->hash_table,HTT_FILE))) {
|
||||
size=temph->user_data1;
|
||||
result=MAlloc(size+1);
|
||||
MemCpy(result,temph->user_data0,size);
|
||||
@@ -289,15 +281,15 @@ U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE)
|
||||
else
|
||||
curname=altname;
|
||||
if (fa=FileAccessNew(curname)) {
|
||||
switch (fa->p->type) {
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSFileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
switch (fa->dv->type) {
|
||||
case DVT_REDSEA:
|
||||
result=RedSeaFileRead(fa->dv,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
result=FAT32FileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
case DVT_FAT32:
|
||||
result=FAT32FileRead(fa->dv,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
result=ISO1FileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
case DVT_ISO9660:
|
||||
result=ISO1FileRead(fa->dv,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
break;
|
||||
default:
|
||||
PrintErr("File System Not Supported\n");
|
||||
@@ -315,15 +307,15 @@ U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE)
|
||||
if (fa=FileAccessNew(curname)) {
|
||||
while (!result && StrCmp(Fs->cur_dir,"/")) {
|
||||
Cd("..");
|
||||
switch (Fs->cur_prt->type) {
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSFileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
switch (Fs->cur_dv->type) {
|
||||
case DVT_REDSEA:
|
||||
result=RedSeaFileRead(fa->dv,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
result=FAT32FileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
case DVT_FAT32:
|
||||
result=FAT32FileRead(fa->dv,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
result=ISO1FileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
case DVT_ISO9660:
|
||||
result=ISO1FileRead(fa->dv,Fs->cur_dir,fa->mask,&size,&attr);
|
||||
break;
|
||||
default:
|
||||
PrintErr("File System Not Supported\n");
|
||||
@@ -336,10 +328,10 @@ U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE)
|
||||
"%s ",filename;
|
||||
PrintErr("File not found.\n");
|
||||
}
|
||||
if (result && !raw && attr & RS_ATTR_RESIDENT)
|
||||
if (result && attr & RS_ATTR_RESIDENT)
|
||||
HashGenericAdd(curname,HTT_FILE,AMAllocIdentical(result),size,0,adam_task);
|
||||
}
|
||||
if (result && !raw && attr & RS_ATTR_COMPRESSED) {
|
||||
if (result && attr & RS_ATTR_COMPRESSED) {
|
||||
ac=result;
|
||||
size=ac->expanded_size;
|
||||
result=ExpandBuf(ac);
|
||||
@@ -359,7 +351,7 @@ Bool FileFind(U8 *filename,CDirEntry *_de=NULL,I64 fuf_flags=0)
|
||||
U8 *altname,*curname,*full_name=NULL;
|
||||
CDirEntry de;
|
||||
CFileAccess *fa;
|
||||
Bool result=FALSE;
|
||||
Bool result=FALSE,old_silent;
|
||||
if (fuf_flags&~FUG_FILE_FIND)
|
||||
throw('FUF');
|
||||
if (!filename) return FALSE;
|
||||
@@ -373,23 +365,31 @@ Bool FileFind(U8 *filename,CDirEntry *_de=NULL,I64 fuf_flags=0)
|
||||
curname=filename;
|
||||
else
|
||||
curname=altname;
|
||||
if (fa=FileAccessNew(curname)) {
|
||||
cur_dir_cluster=Name2DirCluster(fa->p,Fs->cur_dir);
|
||||
switch (fa->p->type) {
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSFileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
old_silent=Silent;
|
||||
if (!(fa=FileAccessNew(curname)))
|
||||
Silent(old_silent);
|
||||
else {
|
||||
Silent(old_silent);
|
||||
cur_dir_cluster=Name2DirCluster(fa->dv,Fs->cur_dir);
|
||||
switch (fa->dv->type) {
|
||||
case DVT_REDSEA:
|
||||
result=RedSeaFileFind(fa->dv,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
result=FAT32FileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
case DVT_FAT32:
|
||||
result=FAT32FileFind(fa->dv,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
result=ISO1FileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
case DVT_ISO9660:
|
||||
result=ISO1FileFind(fa->dv,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
break;
|
||||
default:
|
||||
PrintErr("File System Not Supported\n");
|
||||
}
|
||||
if (result && _de)
|
||||
full_name=MStrPrint("%C:%s/%s",Fs->cur_prt->drv_let,Fs->cur_dir,de.name);
|
||||
if (result && _de) {
|
||||
if (StrCmp(Fs->cur_dir,"/"))
|
||||
full_name=MStrPrint("%C:%s/%s",Drv2Let(Fs->cur_dv),Fs->cur_dir,de.name);
|
||||
else
|
||||
full_name=MStrPrint("%C:/%s",Drv2Let(Fs->cur_dv),de.name);
|
||||
}
|
||||
FileAccessDel(fa);
|
||||
}
|
||||
}
|
||||
@@ -398,27 +398,35 @@ Bool FileFind(U8 *filename,CDirEntry *_de=NULL,I64 fuf_flags=0)
|
||||
curname=filename;
|
||||
else
|
||||
curname=altname;
|
||||
if (fa=FileAccessNew(curname)) {
|
||||
cur_dir_cluster=Name2DirCluster(fa->p,Fs->cur_dir);
|
||||
old_silent=Silent;
|
||||
if (!(fa=FileAccessNew(curname)))
|
||||
Silent(old_silent);
|
||||
else {
|
||||
Silent(old_silent);
|
||||
cur_dir_cluster=Name2DirCluster(fa->dv,Fs->cur_dir);
|
||||
while (!result && StrCmp(Fs->cur_dir,"/")) {
|
||||
Cd("..");
|
||||
cur_dir_cluster=Name2DirCluster(fa->p,Fs->cur_dir);
|
||||
switch (fa->p->type) {
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSFileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
cur_dir_cluster=Name2DirCluster(fa->dv,Fs->cur_dir);
|
||||
switch (fa->dv->type) {
|
||||
case DVT_REDSEA:
|
||||
result=RedSeaFileFind(fa->dv,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
result=FAT32FileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
case DVT_FAT32:
|
||||
result=FAT32FileFind(fa->dv,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
result=ISO1FileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
case DVT_ISO9660:
|
||||
result=ISO1FileFind(fa->dv,cur_dir_cluster,fa->mask,&de,fuf_flags);
|
||||
break;
|
||||
default:
|
||||
PrintErr("File System Not Supported\n");
|
||||
}
|
||||
}
|
||||
if (result && _de)
|
||||
full_name=MStrPrint("%C:%s/%s",Fs->cur_prt->drv_let,Fs->cur_dir,de.name);
|
||||
if (result && _de) {
|
||||
if (StrCmp(Fs->cur_dir,"/"))
|
||||
full_name=MStrPrint("%C:%s/%s",Drv2Let(Fs->cur_dv),Fs->cur_dir,de.name);
|
||||
else
|
||||
full_name=MStrPrint("%C:/%s",Drv2Let(Fs->cur_dv),de.name);
|
||||
}
|
||||
FileAccessDel(fa);
|
||||
}
|
||||
}
|
||||
@@ -434,7 +442,7 @@ Bool FileFind(U8 *filename,CDirEntry *_de=NULL,I64 fuf_flags=0)
|
||||
}
|
||||
|
||||
I64 FileWrite(U8 *filename,U8 *fbuf,
|
||||
I64 size,CDate cdt=0,I64 attr=0,Bool raw=FALSE)
|
||||
I64 size,CDate cdt=0,I64 attr=0)
|
||||
{//Write whole file to disk.
|
||||
I64 c=0;
|
||||
CHashGeneric *temph;
|
||||
@@ -442,34 +450,34 @@ I64 FileWrite(U8 *filename,U8 *fbuf,
|
||||
U8 *fbuf2,*absname=FileNameAbs(filename);
|
||||
if (fa=FileAccessNew(filename,FALSE,TRUE)) {
|
||||
attr=FileAttr(fa->mask,attr);
|
||||
if (attr&RS_ATTR_COMPRESSED && !raw) {
|
||||
if (attr&RS_ATTR_COMPRESSED) {
|
||||
fbuf=CompressBuf(fbuf,size);
|
||||
size=fbuf(CArcCompress *)->compressed_size;
|
||||
fbuf2=fbuf;
|
||||
} else
|
||||
fbuf2=NULL;
|
||||
if (!cdt) cdt=Now;
|
||||
switch (fa->p->type) {
|
||||
case PT_REDSEA:
|
||||
c=RedSeaFSFileWrite(fa->p,Fs->cur_dir,fa->mask,fbuf,size,cdt,attr);
|
||||
switch (fa->dv->type) {
|
||||
case DVT_REDSEA:
|
||||
c=RedSeaFileWrite(fa->dv,Fs->cur_dir,fa->mask,fbuf,size,cdt,attr);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
c=FAT32FileWrite(fa->p,Fs->cur_dir,fa->mask,fbuf,size,cdt,attr);
|
||||
case DVT_FAT32:
|
||||
c=FAT32FileWrite(fa->dv,Fs->cur_dir,fa->mask,fbuf,size,cdt,attr);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
case DVT_ISO9660:
|
||||
PrintErr("Not Writable\n");
|
||||
break;
|
||||
default:
|
||||
PrintErr("File System Not Supported\n");
|
||||
}
|
||||
if (temph=HashFind(absname,adam_task->hash_table,HTT_FILE)) {
|
||||
if (!raw && attr & RS_ATTR_RESIDENT) {
|
||||
if (attr & RS_ATTR_RESIDENT) {
|
||||
Free(temph->user_data0);
|
||||
temph->user_data0=AMAllocIdentical(fbuf);
|
||||
temph->user_data1=size;
|
||||
} else
|
||||
HashRemDel(temph,adam_task->hash_table);
|
||||
} else if (!raw && attr & RS_ATTR_RESIDENT)
|
||||
} else if (attr & RS_ATTR_RESIDENT)
|
||||
HashGenericAdd(absname,HTT_FILE,AMAllocIdentical(fbuf),size,0,adam_task);
|
||||
Free(fbuf2);
|
||||
FileAccessDel(fa);
|
||||
@@ -93,14 +93,14 @@ Bool MkDir(U8 *filename)
|
||||
else {
|
||||
"Make Directory:%s\n",filename;
|
||||
name=MStrUtil(fa->mask,SUF_REM_LEADING|SUF_REM_TRAILING|SUF_REM_CTRL_CHARS);
|
||||
switch (fa->p->type) {
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSMkDir(fa->p,Fs->cur_dir,name);
|
||||
switch (fa->dv->type) {
|
||||
case DVT_REDSEA:
|
||||
result=RedSeaMkDir(fa->dv,Fs->cur_dir,name);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
result=FAT32MkDir(fa->p,Fs->cur_dir,name);
|
||||
case DVT_FAT32:
|
||||
result=FAT32MkDir(fa->dv,Fs->cur_dir,name);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
case DVT_ISO9660:
|
||||
PrintErr("Not Writable\n");
|
||||
break;
|
||||
default:
|
||||
@@ -119,14 +119,14 @@ I64 SysDel(U8 *wild,Bool make_mask) //this is dangerous
|
||||
I64 result=0;
|
||||
CFileAccess *fa;
|
||||
if (fa=FileAccessNew(wild,make_mask)) {
|
||||
switch (fa->p->type) {
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSFilesDel(fa->p,Fs->cur_dir,fa->mask,0,TRUE,TRUE);
|
||||
switch (fa->dv->type) {
|
||||
case DVT_REDSEA:
|
||||
result=RedSeaFilesDel(fa->dv,Fs->cur_dir,fa->mask,0,TRUE,TRUE);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
result=FAT32FilesDel(fa->p,Fs->cur_dir,fa->mask,0,TRUE,TRUE);
|
||||
case DVT_FAT32:
|
||||
result=FAT32FilesDel(fa->dv,Fs->cur_dir,fa->mask,0,TRUE,TRUE);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
case DVT_ISO9660:
|
||||
PrintErr("Not Writable\n");
|
||||
break;
|
||||
default:
|
||||
@@ -137,39 +137,39 @@ I64 SysDel(U8 *wild,Bool make_mask) //this is dangerous
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 Fmt(I64 drv_let,Bool quick=TRUE,Bool confirm=TRUE,I64 type=PT_FAT32)
|
||||
U0 Fmt(I64 drv_let,Bool quick=TRUE,Bool confirm=TRUE,I64 type=DVT_FAT32)
|
||||
{//Format hard drive or RAM drive.
|
||||
//$BK,1$Warning:$BK,0$ Destroys all previous info.
|
||||
//quick=FALSE means fill entire drive
|
||||
//with zeros.
|
||||
//Choose $LK,"PT_FAT32",A="MN:PT_FAT32"$ or $LK,"PT_REDSEA",A="MN:PT_REDSEA"$.
|
||||
//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.
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
CDrv *dv=Let2Drv(drv_let);
|
||||
Bool old_silent=IsSilent;
|
||||
if (confirm && !AreYouSure)
|
||||
return;
|
||||
if (!p) {
|
||||
if (!dv) {
|
||||
PrintErr("Invalid Drive\n");
|
||||
return;
|
||||
}
|
||||
switch (type) {
|
||||
case PT_REDSEA:
|
||||
Silent(ON);
|
||||
case DVT_REDSEA:
|
||||
Silent;
|
||||
Drv(drv_let);
|
||||
Silent(old_silent);
|
||||
RedSeaFSFmt(drv_let,quick);
|
||||
DskCacheInvalidate(Drv2Prt(drv_let));
|
||||
RedSeaFmt(drv_let,quick);
|
||||
DskCacheInvalidate(Let2Drv(drv_let));
|
||||
Drv(drv_let);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
Silent(ON);
|
||||
case DVT_FAT32:
|
||||
Silent;
|
||||
Drv(drv_let);
|
||||
Silent(old_silent);
|
||||
FAT32Fmt(drv_let,quick);
|
||||
DskCacheInvalidate(Drv2Prt(drv_let));
|
||||
DskCacheInvalidate(Let2Drv(drv_let));
|
||||
Drv(drv_let);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
case DVT_ISO9660:
|
||||
PrintErr("Not Writable\n");
|
||||
break;
|
||||
default:
|
||||
@@ -179,34 +179,34 @@ U0 Fmt(I64 drv_let,Bool quick=TRUE,Bool confirm=TRUE,I64 type=PT_FAT32)
|
||||
|
||||
U0 CDImageRead(U8 cd_drv_let,U8 *out_name)
|
||||
{//Read entire CD/DVD image into ISO file.
|
||||
CBlkDev *bdev=Drv2BlkDev(cd_drv_let);
|
||||
CPrt *p=Drv2Prt(cd_drv_let);
|
||||
CBlkDev *bd=Let2BlkDev(cd_drv_let);
|
||||
CDrv *dv=Let2Drv(cd_drv_let);
|
||||
U8 *buf=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS),
|
||||
*out_name2=DftExt(out_name,"ISO");
|
||||
CFile *f=FOpen(out_name2,"w");
|
||||
I64 n,spc=bdev->blk_size>>BLK_SIZE_BITS,blk=0,cnt,retry;
|
||||
BlkDevInit(bdev);
|
||||
if (bdev->type!=BDT_ATAPI)
|
||||
I64 n,spc=bd->blk_size>>BLK_SIZE_BITS,blk=0,cnt,retry;
|
||||
BlkDevInit(bd);
|
||||
if (bd->type!=BDT_ATAPI)
|
||||
throw('BlkDev');
|
||||
if (!out_name)
|
||||
out_name=dsk.dft_iso_filename;
|
||||
cnt=CeilU64(p->size,spc);
|
||||
cnt=CeilU64(dv->size,spc);
|
||||
while (cnt>0) {
|
||||
if (cnt>COPY_BUF_BLKS)
|
||||
n=COPY_BUF_BLKS;
|
||||
else
|
||||
n=cnt;
|
||||
if (n>bdev->max_reads)
|
||||
n=bdev->max_reads;
|
||||
if (n>bd->max_reads)
|
||||
n=bd->max_reads;
|
||||
|
||||
retry=4;
|
||||
while (--retry)
|
||||
if (ATAPIReadBlks2(bdev,tS+7.0+0.004*n/spc,buf,blk/spc,n/spc,TRUE))
|
||||
if (ATAPIReadBlks2(bd,tS+7.0+0.004*n/spc,buf,blk/spc,n/spc,TRUE))
|
||||
//n is 0x800 if max_reads. Up to 8 additional seconds
|
||||
break;
|
||||
|
||||
if (!retry)
|
||||
ATAPIReadBlks2(bdev,0,buf,blk/spc,n/spc,TRUE);
|
||||
ATAPIReadBlks2(bd,0,buf,blk/spc,n/spc,TRUE);
|
||||
|
||||
FWBlks(f,buf,blk,n);
|
||||
cnt-=n;
|
||||
@@ -222,7 +222,7 @@ class CDualBuf
|
||||
U8 *buf0,*buf1;
|
||||
I64 in_buf,out_buf,cnt;
|
||||
U8 *filename;
|
||||
CBlkDev *CD_bdev;
|
||||
CBlkDev *cd_bd;
|
||||
};
|
||||
|
||||
U0 CDImageWriteTask(CDualBuf *d)
|
||||
@@ -240,8 +240,8 @@ U0 CDImageWriteTask(CDualBuf *d)
|
||||
n=COPY_BUF_BLKS;
|
||||
else
|
||||
n=cnt;
|
||||
if (n>d->CD_bdev->max_writes)
|
||||
n=d->CD_bdev->max_writes;
|
||||
if (n>d->cd_bd->max_writes)
|
||||
n=d->cd_bd->max_writes;
|
||||
if (d->in_buf&1)
|
||||
buf=d->buf1;
|
||||
else
|
||||
@@ -261,8 +261,8 @@ U0 CDImageWrite(U8 cd_drv_let,U8 *in_name=NULL,I64 media_type=MT_CD)
|
||||
CDualBuf *d=CAlloc(sizeof(CDualBuf));
|
||||
U8 *buf,*in_name2,*in_name3;
|
||||
I64 i,n,spc,blk=0,cnt;
|
||||
CPrt *p=Drv2Prt(cd_drv_let);
|
||||
CBlkDev *bdev=p->bdev,*bdev2;
|
||||
CDrv *dv=Let2Drv(cd_drv_let);
|
||||
CBlkDev *bd=dv->bd,*bd2;
|
||||
CTask *task;
|
||||
Bool old_preempt;
|
||||
CFile *f;
|
||||
@@ -278,25 +278,25 @@ U0 CDImageWrite(U8 cd_drv_let,U8 *in_name=NULL,I64 media_type=MT_CD)
|
||||
}
|
||||
cnt=(FSize(f)+BLK_SIZE-1)>>BLK_SIZE_BITS;
|
||||
FClose(f);
|
||||
if (bdev->type!=BDT_ATAPI)
|
||||
if (bd->type!=BDT_ATAPI)
|
||||
throw('BlkDev');
|
||||
bdev2=Drv2BlkDev(*in_name2);
|
||||
while (bdev2->lock_fwding)
|
||||
bdev2=bdev2->lock_fwding;
|
||||
if ((bdev2->type==BDT_ATA || bdev2->type==BDT_ATAPI) &&
|
||||
bdev2->base0==bdev->base0) {
|
||||
bd2=Let2BlkDev(*in_name2);
|
||||
while (bd2->lock_fwding)
|
||||
bd2=bd2->lock_fwding; //If two blkdevs on same controller, use just 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";
|
||||
throw('BlkDev');
|
||||
}
|
||||
|
||||
bdev->flags|=BDF_READ_ONLY_OVERRIDE;
|
||||
BlkDevInit(bdev);
|
||||
spc=bdev->blk_size>>BLK_SIZE_BITS;
|
||||
if (p->size<cnt)
|
||||
p->size=cnt;
|
||||
bd->flags|=BDF_READ_ONLY_OVERRIDE;
|
||||
BlkDevInit(bd);
|
||||
spc=bd->blk_size>>BLK_SIZE_BITS;
|
||||
if (dv->size<cnt)
|
||||
dv->size=cnt;
|
||||
|
||||
d->filename=in_name2;
|
||||
d->CD_bdev=bdev;
|
||||
d->cd_bd=bd;
|
||||
d->buf0=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS);
|
||||
d->buf1=MAlloc(COPY_BUF_BLKS<<BLK_SIZE_BITS);
|
||||
d->cnt=cnt;
|
||||
@@ -307,8 +307,8 @@ U0 CDImageWrite(U8 cd_drv_let,U8 *in_name=NULL,I64 media_type=MT_CD)
|
||||
while (d->in_buf<=d->out_buf)
|
||||
Yield;
|
||||
|
||||
BlkDevLock(bdev);
|
||||
ATAPIWaitReady(bdev,0);
|
||||
BlkDevLock(bd);
|
||||
ATAPIWaitReady(bd,0);
|
||||
|
||||
progress1=0; progress1_max=cnt;
|
||||
StrCpy(progress1_desc,"Writing");
|
||||
@@ -317,43 +317,43 @@ U0 CDImageWrite(U8 cd_drv_let,U8 *in_name=NULL,I64 media_type=MT_CD)
|
||||
n=COPY_BUF_BLKS;
|
||||
else
|
||||
n=cnt;
|
||||
if (n>bdev->max_writes)
|
||||
n=bdev->max_writes;
|
||||
if (n>bd->max_writes)
|
||||
n=bd->max_writes;
|
||||
if (d->out_buf&1)
|
||||
buf=d->buf1;
|
||||
else
|
||||
buf=d->buf0;
|
||||
while (d->in_buf<=d->out_buf)
|
||||
Yield;
|
||||
ATAPIWriteBlks(bdev,buf,blk/spc,(n+spc-1)/spc);
|
||||
ATAPIWriteBlks(bd,buf,blk/spc,(n+spc-1)/spc);
|
||||
d->out_buf++;
|
||||
cnt-=n;
|
||||
blk+=n;
|
||||
progress1+=n;
|
||||
}
|
||||
ATAPISync(bdev);
|
||||
ATAPISync(bd);
|
||||
|
||||
progress1=0; progress1_max=2;
|
||||
StrCpy(progress1_desc,"Closing");
|
||||
for (i=0;i<2;i++) {
|
||||
ATAPIClose(bdev,0x100,i); //Close tracks
|
||||
ATAPIClose(bd,0x100,i); //Close tracks
|
||||
progress1++;
|
||||
}
|
||||
|
||||
ATAPISync(bdev);
|
||||
ATAPISync(bd);
|
||||
|
||||
ATAPIClose(bdev,0x200); //close disk
|
||||
ATAPISync(bdev);
|
||||
ATAPIClose(bd,0x200); //close disk
|
||||
ATAPISync(bd);
|
||||
if (media_type==MT_DVD) {
|
||||
ATAPIClose(bdev,0x300);
|
||||
ATAPISync(bdev);
|
||||
ATAPIClose(bd,0x300);
|
||||
ATAPISync(bd);
|
||||
}
|
||||
|
||||
*progress1_desc=0;
|
||||
progress1=progress1_max=0;
|
||||
|
||||
bdev->flags&=~BDF_READ_ONLY_OVERRIDE;
|
||||
BlkDevUnlock(bdev);
|
||||
bd->flags&=~BDF_READ_ONLY_OVERRIDE;
|
||||
BlkDevUnlock(bd);
|
||||
Free(d->buf0);
|
||||
Free(d->buf1);
|
||||
Free(in_name2);
|
||||
+39
-39
@@ -22,15 +22,15 @@ CFile *FOpen(U8 *filename,U8 *flags,I64 cnt=0)
|
||||
f->max_blk=MAX_I64;
|
||||
f->file_cluster_num=INVALID_CLUSTER;
|
||||
full_name=FileNameAbs(filename);
|
||||
f->p=Drv2Prt(*full_name);
|
||||
if (f->p->type==PT_REDSEA)
|
||||
f->dv=Let2Drv(*full_name);
|
||||
if (f->dv->type==DVT_REDSEA)
|
||||
contiguous=TRUE;
|
||||
if (contiguous) {
|
||||
f->flags|=FF_CONTIGUOUS;
|
||||
if (f->p->type!=PT_REDSEA && !(FileAttr(filename) & RS_ATTR_CONTIGUOUS))
|
||||
if (f->dv->type!=DVT_REDSEA && !(FileAttr(filename) & RS_ATTR_CONTIGUOUS))
|
||||
throw('File');
|
||||
}
|
||||
f->cluster_buf=CAlloc(f->p->spc<<BLK_SIZE_BITS);
|
||||
f->cluster_buf=CAlloc(f->dv->spc<<BLK_SIZE_BITS);
|
||||
if (StrOcc(flags,'w')) {
|
||||
f->flags=f->flags|FF_WRITE|FF_NEEDS_WRITE;
|
||||
if (StrOcc(flags,'+')) {
|
||||
@@ -47,10 +47,10 @@ CFile *FOpen(U8 *filename,U8 *flags,I64 cnt=0)
|
||||
if (fa=FileAccessNew(full_name)) {
|
||||
StrCpy(f->de.name,fa->mask);
|
||||
if (cnt>0) {//We pre-alloc the whole thing.
|
||||
f->de.cluster=ClustersAlloc(f->p,0,
|
||||
(cnt+f->p->spc-1)/f->p->spc,contiguous);
|
||||
f->de.cluster=ClustersAlloc(f->dv,0,
|
||||
(cnt+f->dv->spc-1)/f->dv->spc,contiguous);
|
||||
f->de.size=cnt<<BLK_SIZE_BITS;
|
||||
DirNew(fa->p,Fs->cur_dir,&f->de,TRUE);
|
||||
DirNew(fa->dv,Fs->cur_dir,&f->de,TRUE);
|
||||
f->flags&=~FF_NEW_FILE;
|
||||
}
|
||||
FileAccessDel(fa);
|
||||
@@ -75,7 +75,7 @@ U0 FClose(CFile *f)
|
||||
CFileAccess *fa;
|
||||
if (f) {
|
||||
if (f->flags & FF_BUF_DIRTY) {
|
||||
WClusters(f->p,f->cluster_buf,f->cluster,1);
|
||||
WClusters(f->dv,f->cluster_buf,f->cluster,1);
|
||||
f->flags&=~FF_BUF_DIRTY;
|
||||
}
|
||||
if (f->flags & FF_NEEDS_WRITE) {
|
||||
@@ -83,9 +83,9 @@ U0 FClose(CFile *f)
|
||||
if (!(f->flags & FF_USE_OLD_DATETIME))
|
||||
f->de.datetime=Now;
|
||||
if (f->flags & FF_NEW_FILE)
|
||||
DirNew(fa->p,Fs->cur_dir,&f->de,TRUE);
|
||||
DirNew(fa->dv,Fs->cur_dir,&f->de,TRUE);
|
||||
else
|
||||
DirNew(fa->p,Fs->cur_dir,&f->de,FALSE);
|
||||
DirNew(fa->dv,Fs->cur_dir,&f->de,FALSE);
|
||||
FileAccessDel(fa);
|
||||
} else
|
||||
throw('File');
|
||||
@@ -98,29 +98,29 @@ U0 FClose(CFile *f)
|
||||
|
||||
I64 FSetCluster(CFile *f,I64 c,I64 blk,Bool read)
|
||||
{
|
||||
CPrt *p=f->p;
|
||||
CDrv *dv=f->dv;
|
||||
I64 i;
|
||||
if (f->cluster!=c) {
|
||||
if (f->flags & FF_BUF_DIRTY) {
|
||||
i=p->spc;
|
||||
i=dv->spc;
|
||||
if (f->max_blk!=MAX_I64) {
|
||||
i=f->max_blk+1-f->file_cluster_num*p->spc;
|
||||
if (i>p->spc)
|
||||
i=p->spc;
|
||||
i=f->max_blk+1-f->file_cluster_num*dv->spc;
|
||||
if (i>dv->spc)
|
||||
i=dv->spc;
|
||||
}
|
||||
WClustersBlks(p,f->cluster_buf,f->cluster,i);
|
||||
WClustersBlks(dv,f->cluster_buf,f->cluster,i);
|
||||
f->flags=f->flags & ~FF_BUF_DIRTY;
|
||||
}
|
||||
f->cluster=c;
|
||||
f->file_cluster_num=blk/p->spc;
|
||||
f->file_cluster_num=blk/dv->spc;
|
||||
if (read) {
|
||||
i=p->spc;
|
||||
i=dv->spc;
|
||||
if (f->max_blk!=MAX_I64) {
|
||||
i=f->max_blk+1-f->file_cluster_num*p->spc;
|
||||
if (i>p->spc)
|
||||
i=p->spc;
|
||||
i=f->max_blk+1-f->file_cluster_num*dv->spc;
|
||||
if (i>dv->spc)
|
||||
i=dv->spc;
|
||||
}
|
||||
c=RClustersBlks(p,f->cluster_buf,c,i);
|
||||
c=RClustersBlks(dv,f->cluster_buf,c,i);
|
||||
}
|
||||
}
|
||||
return c;
|
||||
@@ -128,9 +128,9 @@ I64 FSetCluster(CFile *f,I64 c,I64 blk,Bool read)
|
||||
|
||||
Bool FRBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1)
|
||||
{//Read [nth,n+cnt) blks of file.
|
||||
CPrt *p=f->p;
|
||||
I64 spc=p->spc,i,j,c=f->de.cluster;
|
||||
if (!f || !p) return FALSE;
|
||||
CDrv *dv=f->dv;
|
||||
I64 spc=dv->spc,i,j,c=f->de.cluster;
|
||||
if (!f || !dv) return FALSE;
|
||||
if (blk==FFB_NEXT_BLK)
|
||||
blk=f->fblk_num;
|
||||
if (blk+cnt-1>f->max_blk)
|
||||
@@ -138,7 +138,7 @@ Bool FRBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1)
|
||||
if (cnt<=0) return TRUE;
|
||||
|
||||
if (f->flags & FF_CONTIGUOUS) {
|
||||
RBlks(p,buf,Cluster2Blk(p,c)+blk,cnt);
|
||||
RBlks(dv,buf,Cluster2Blk(dv,c)+blk,cnt);
|
||||
blk+=cnt;
|
||||
} else {
|
||||
i=blk/spc;
|
||||
@@ -147,7 +147,7 @@ Bool FRBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1)
|
||||
i-=f->file_cluster_num;
|
||||
}
|
||||
if (i>0)
|
||||
c=ClusterNumNext(p,c,i);
|
||||
c=ClusterNumNext(dv,c,i);
|
||||
|
||||
if (i=blk%spc) {
|
||||
c=FSetCluster(f,c,blk,TRUE);
|
||||
@@ -180,9 +180,9 @@ Bool FRBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1)
|
||||
|
||||
Bool FWBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1)
|
||||
{//Write [nth,n+cnt) blks of file.
|
||||
CPrt *p=f->p;
|
||||
I64 spc=p->spc,i,j,c=f->de.cluster,c1;
|
||||
if (!f || !p) return FALSE;
|
||||
CDrv *dv=f->dv;
|
||||
I64 spc=dv->spc,i,j,c=f->de.cluster,c1;
|
||||
if (!f || !dv) return FALSE;
|
||||
if (blk==FFB_NEXT_BLK)
|
||||
blk=f->fblk_num;
|
||||
if (blk+cnt-1>f->max_blk)
|
||||
@@ -191,11 +191,11 @@ Bool FWBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1)
|
||||
return FALSE;
|
||||
if (cnt<=0) return TRUE;
|
||||
if (f->flags & FF_CONTIGUOUS) {
|
||||
WBlks(p,buf,Cluster2Blk(p,c)+blk,cnt);
|
||||
WBlks(dv,buf,Cluster2Blk(dv,c)+blk,cnt);
|
||||
blk+=cnt;
|
||||
} else {
|
||||
if (!c) {
|
||||
c=ClustersAlloc(p,0,1,FALSE);
|
||||
c=ClustersAlloc(dv,0,1,FALSE);
|
||||
f->file_cluster_num=0;
|
||||
f->cluster=c;
|
||||
f->de.cluster=c;
|
||||
@@ -208,11 +208,11 @@ Bool FWBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1)
|
||||
}
|
||||
while (i>0) {
|
||||
c1=c;
|
||||
c=ClusterNumNext(p,c1,1);
|
||||
c=ClusterNumNext(dv,c1,1);
|
||||
if (c==INVALID_CLUSTER) {
|
||||
c=ClustersAlloc(p,c1,i,FALSE);
|
||||
c=ClustersAlloc(dv,c1,i,FALSE);
|
||||
if (i>1)
|
||||
c=ClusterNumNext(p,c,i-1);
|
||||
c=ClusterNumNext(dv,c,i-1);
|
||||
break;
|
||||
} else
|
||||
i--;
|
||||
@@ -231,9 +231,9 @@ Bool FWBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1)
|
||||
blk+=j;
|
||||
if (cnt>0) {
|
||||
c1=c;
|
||||
c=ClusterNumNext(p,c1,1);
|
||||
c=ClusterNumNext(dv,c1,1);
|
||||
if (c==INVALID_CLUSTER)
|
||||
c=ClustersAlloc(p,c1,1,FALSE);
|
||||
c=ClustersAlloc(dv,c1,1,FALSE);
|
||||
}
|
||||
}
|
||||
while (cnt>=spc) {
|
||||
@@ -245,9 +245,9 @@ Bool FWBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1)
|
||||
blk+=spc;
|
||||
if (cnt>0) {
|
||||
c1=c;
|
||||
c=ClusterNumNext(p,c1,1);
|
||||
c=ClusterNumNext(dv,c1,1);
|
||||
if (c==INVALID_CLUSTER)
|
||||
c=ClustersAlloc(p,c1,1,FALSE);
|
||||
c=ClustersAlloc(dv,c1,1,FALSE);
|
||||
}
|
||||
}
|
||||
if (cnt>0) {
|
||||
|
||||
+12
-12
@@ -23,7 +23,7 @@ U0 DskCacheInit(I64 size_in_U8s)
|
||||
tempc=dsk.cache_base+i;
|
||||
QueIns(tempc,dsk.cache_ctrl->last_lru);
|
||||
tempc->next_hash=tempc->last_hash=tempc;
|
||||
tempc->p=NULL;
|
||||
tempc->dv=NULL;
|
||||
tempc->blk=0;
|
||||
}
|
||||
|
||||
@@ -60,30 +60,30 @@ U0 DskCacheQueIns(CCacheBlk *tempc)
|
||||
temp_l->next_hash=temp_n->last_hash=tempc;
|
||||
}
|
||||
|
||||
CCacheBlk *DskCacheFind(CPrt *p,I64 blk)
|
||||
CCacheBlk *DskCacheFind(CDrv *dv,I64 blk)
|
||||
{
|
||||
CCacheBlk *tempc,*tempc1=DskCacheHash(blk);
|
||||
tempc=tempc1->next_hash;
|
||||
while (tempc!=tempc1) {
|
||||
if (tempc->p==p && tempc->blk==blk)
|
||||
if (tempc->dv==dv && tempc->blk==blk)
|
||||
return tempc;
|
||||
tempc=tempc->next_hash;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
U0 DskCacheAdd(CPrt *p,U8 *buf, I64 blk, I64 cnt)
|
||||
U0 DskCacheAdd(CDrv *dv,U8 *buf, I64 blk, I64 cnt)
|
||||
{
|
||||
CCacheBlk *tempc;
|
||||
if (dsk.cache_base) {
|
||||
while (LBts(&sys_semas[SYS_SEMA_DSK_CACHE],0))
|
||||
Yield;
|
||||
while (cnt-->0) {
|
||||
if (!(tempc=DskCacheFind(p,blk)))
|
||||
if (!(tempc=DskCacheFind(dv,blk)))
|
||||
tempc=dsk.cache_ctrl->next_lru;
|
||||
DskCacheQueRem(tempc);
|
||||
MemCpy(&tempc->body,buf,BLK_SIZE);
|
||||
tempc->p=p;
|
||||
tempc->dv=dv;
|
||||
tempc->blk=blk;
|
||||
DskCacheQueIns(tempc);
|
||||
blk++;
|
||||
@@ -93,7 +93,7 @@ U0 DskCacheAdd(CPrt *p,U8 *buf, I64 blk, I64 cnt)
|
||||
}
|
||||
}
|
||||
|
||||
U0 DskCacheInvalidate2(CPrt *p)
|
||||
U0 DskCacheInvalidate2(CDrv *dv)
|
||||
{
|
||||
CCacheBlk *tempc,*tempc1;
|
||||
if (dsk.cache_base) {
|
||||
@@ -102,9 +102,9 @@ U0 DskCacheInvalidate2(CPrt *p)
|
||||
tempc=dsk.cache_ctrl->last_lru;
|
||||
while (tempc!=dsk.cache_ctrl) {
|
||||
tempc1=tempc->last_lru;
|
||||
if (tempc->p==p) {
|
||||
if (tempc->dv==dv) {
|
||||
DskCacheQueRem(tempc);
|
||||
tempc->p=NULL;
|
||||
tempc->dv=NULL;
|
||||
tempc->blk=0;
|
||||
tempc->next_hash=tempc->last_hash=tempc;
|
||||
QueIns(tempc,dsk.cache_ctrl->last_lru);
|
||||
@@ -115,7 +115,7 @@ U0 DskCacheInvalidate2(CPrt *p)
|
||||
}
|
||||
}
|
||||
|
||||
U0 RCache(CPrt *p,U8 **_buf, I64 *_blk, I64 *_cnt)
|
||||
U0 RCache(CDrv *dv,U8 **_buf, I64 *_blk, I64 *_cnt)
|
||||
{
|
||||
CCacheBlk *tempc;
|
||||
if (dsk.cache_base) {
|
||||
@@ -123,7 +123,7 @@ U0 RCache(CPrt *p,U8 **_buf, I64 *_blk, I64 *_cnt)
|
||||
Yield;
|
||||
//fetch leading blks from cache
|
||||
while (*_cnt>0) {
|
||||
if (tempc=DskCacheFind(p,*_blk)) {
|
||||
if (tempc=DskCacheFind(dv,*_blk)) {
|
||||
MemCpy(*_buf,&tempc->body,BLK_SIZE);
|
||||
*_cnt-=1;
|
||||
*_buf+=BLK_SIZE;
|
||||
@@ -133,7 +133,7 @@ U0 RCache(CPrt *p,U8 **_buf, I64 *_blk, I64 *_cnt)
|
||||
}
|
||||
//fetch trailing blks from cache
|
||||
while (*_cnt>0) {
|
||||
if (tempc=DskCacheFind(p,*_blk+*_cnt-1)) {
|
||||
if (tempc=DskCacheFind(dv,*_blk+*_cnt-1)) {
|
||||
MemCpy(*_buf+(*_cnt-1)<<BLK_SIZE_BITS,&tempc->body,BLK_SIZE);
|
||||
*_cnt-=1;
|
||||
} else
|
||||
|
||||
+16
-17
@@ -1,11 +1,11 @@
|
||||
Bool DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain=TRUE)
|
||||
Bool DirNew(CDrv *dv,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain=TRUE)
|
||||
{//Makes a directory entry in the directory from a $LK,"CDirEntry",A="MN:CDirEntry"$ node.
|
||||
switch (p->type) {
|
||||
case PT_REDSEA:
|
||||
return RedSeaFSDirNew(p,cur_dir,tempde,free_old_chain);
|
||||
case PT_FAT32:
|
||||
return FAT32DirNew(p,cur_dir,tempde,free_old_chain);
|
||||
case PT_ISO9660:
|
||||
switch (dv->type) {
|
||||
case DVT_REDSEA:
|
||||
return RedSeaDirNew(dv,cur_dir,tempde,free_old_chain);
|
||||
case DVT_FAT32:
|
||||
return FAT32DirNew(dv,cur_dir,tempde,free_old_chain);
|
||||
case DVT_ISO9660:
|
||||
PrintErr("Not Writable\n");
|
||||
return FALSE;
|
||||
default:
|
||||
@@ -166,17 +166,17 @@ CDirEntry *DirFilesFlatten(CDirEntry *tempde,CDirEntry **_result,I64 fuf_flags)
|
||||
|
||||
CDirEntry *SysFilesFind(U8 *files_find_mask,I64 fuf_flags)
|
||||
{
|
||||
CPrt *p=Fs->cur_prt;
|
||||
CDrv *dv=Fs->cur_dv;
|
||||
CDirEntry *result=NULL;
|
||||
PrtChk(p);
|
||||
switch (p->type) {
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSFilesFind(files_find_mask,fuf_flags);
|
||||
DrvChk(dv);
|
||||
switch (dv->type) {
|
||||
case DVT_REDSEA:
|
||||
result=RedSeaFilesFind(files_find_mask,fuf_flags);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
case DVT_FAT32:
|
||||
result=FAT32FilesFind(files_find_mask,fuf_flags);
|
||||
break;
|
||||
case PT_ISO9660:
|
||||
case DVT_ISO9660:
|
||||
result=ISO1FilesFind(files_find_mask,fuf_flags);
|
||||
break;
|
||||
default:
|
||||
@@ -194,7 +194,7 @@ CDirEntry *SysFilesFind(U8 *files_find_mask,I64 fuf_flags)
|
||||
}
|
||||
|
||||
U0 PutFileLink(U8 *filename,I64 line=0,Bool plain_text=FALSE)
|
||||
{//Put $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT.Z"$ file,line link to StdOut, $LK,"DocPut",A="MN:DocPut"$.
|
||||
{//Put $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT"$ file,line link to StdOut, $LK,"DocPut",A="MN:DocPut"$.
|
||||
U8 *buf;
|
||||
if (!filename) return;
|
||||
if (IsRaw) {
|
||||
@@ -228,7 +228,7 @@ U0 PutFileLink(U8 *filename,I64 line=0,Bool plain_text=FALSE)
|
||||
}
|
||||
|
||||
U0 PutDirLink(U8 *dirname)
|
||||
{//Put $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT.Z"$ dir macro to StdOut, $LK,"DocPut",A="MN:DocPut"$.
|
||||
{//Put $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT"$ dir macro to StdOut, $LK,"DocPut",A="MN:DocPut"$.
|
||||
U8 *buf;
|
||||
if (!dirname) return;
|
||||
if (IsRaw)
|
||||
@@ -284,7 +284,6 @@ I64 Dir2(U8 *files_find_mask,I64 fuf_flags,Bool full)
|
||||
PutDirLink(tempde1->name);
|
||||
else
|
||||
PutFileLink(tempde1->name);
|
||||
|
||||
'\n';
|
||||
DirEntryDel(tempde1);
|
||||
tempde1=tempde2;
|
||||
|
||||
+80
-89
@@ -79,170 +79,161 @@ Bool FilesFindMatch(U8 *test_filename,U8 *files_find_mask,I64 fuf_flags=0)
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 PrtChk(CPrt *p)
|
||||
{//Check for valid partition. Throw exception.
|
||||
if (!p || p->pt_signature!=PRT_SIGNATURE_VAL)
|
||||
throw('Prt');
|
||||
U0 DrvChk(CDrv *dv)
|
||||
{//Check for valid drv. Throw exception.
|
||||
if (!dv || dv->dv_signature!=DRV_SIGNATURE_VAL)
|
||||
throw('Drv');
|
||||
}
|
||||
|
||||
U8 Prt2Drv(CPrt *p=NULL)
|
||||
{//Prt ptr to Drv letter.
|
||||
if (!p)
|
||||
p=Fs->cur_prt;
|
||||
PrtChk(p);
|
||||
return p->drv_let;
|
||||
U8 Drv2Let(CDrv *dv=NULL)
|
||||
{//Drv ptr to Drv letter.
|
||||
if (!dv)
|
||||
dv=Fs->cur_dv;
|
||||
DrvChk(dv);
|
||||
return dv->drv_let;
|
||||
}
|
||||
|
||||
CPrt *Drv2Prt(U8 drv_let=0)
|
||||
{//Drv letter to Prt ptr.
|
||||
CPrt *p;
|
||||
CDrv *Let2Drv(U8 drv_let=0)
|
||||
{//Drv letter to Drv ptr.
|
||||
CDrv *dv;
|
||||
if (!drv_let)
|
||||
p=Fs->cur_prt;
|
||||
dv=Fs->cur_dv;
|
||||
else {
|
||||
if (drv_let==':')
|
||||
drv_let=*sys_acct;
|
||||
drv_let=dsk.boot_drv_let;
|
||||
drv_let=ToUpper(drv_let);
|
||||
if (!('A'<=drv_let<='Z'))
|
||||
throw('Prt');
|
||||
p=dsk.drv_to_prt[drv_let-'A'];
|
||||
throw('Drv');
|
||||
dv=dsk.let_to_drv[drv_let-'A'];
|
||||
}
|
||||
PrtChk(p);
|
||||
return p;
|
||||
DrvChk(dv);
|
||||
return dv;
|
||||
}
|
||||
|
||||
U0 BlkDevChk(CBlkDev *bdev)
|
||||
U0 BlkDevChk(CBlkDev *bd)
|
||||
{//Check for valid BlkDev. Throw exception.
|
||||
if (!bdev || bdev->bd_signature!=BD_SIGNATURE_VAL ||
|
||||
!(BDT_NULL<bdev->type<BDT_NUM_TYPES))
|
||||
if (!bd || bd->bd_signature!=BD_SIGNATURE_VAL ||
|
||||
!(BDT_NULL<bd->type<BDT_NUM_TYPES))
|
||||
throw('BlkDev');
|
||||
}
|
||||
|
||||
CBlkDev *Drv2BlkDev(U8 drv_let=0)
|
||||
CBlkDev *Let2BlkDev(U8 drv_let=0)
|
||||
{//Drv letter to BlkDev ptr.
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
CBlkDev *bdev=p->bdev;
|
||||
BlkDevChk(bdev);
|
||||
return bdev;
|
||||
CDrv *dv=Let2Drv(drv_let);
|
||||
CBlkDev *bd=dv->bd;
|
||||
BlkDevChk(bd);
|
||||
return bd;
|
||||
}
|
||||
|
||||
Bool IsDrvWritable(U8 drv_let=0)
|
||||
{//Is drive writable?
|
||||
CBlkDev *bdev=Drv2BlkDev(drv_let);
|
||||
if (bdev->flags & BDF_READ_ONLY)
|
||||
CBlkDev *bd=Let2BlkDev(drv_let);
|
||||
if (bd->flags & BDF_READ_ONLY)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
U8 *CurDir(CTask *task=NULL,CTask *mem_task=NULL)
|
||||
{//MAlloc copy of cur dir with partition letter.
|
||||
{//MAlloc copy of cur dir with drv letter.
|
||||
U8 *st;
|
||||
if (!task) task=Fs;
|
||||
if (!task->cur_dir)
|
||||
return NULL;
|
||||
st=MAlloc(StrLen(task->cur_dir)+3,mem_task);
|
||||
*st=Prt2Drv;
|
||||
*st=Drv2Let(task->cur_dv);
|
||||
st[1]=':';
|
||||
StrCpy(st+2,task->cur_dir);
|
||||
return st;
|
||||
}
|
||||
|
||||
U8 *DirNameAbs(U8 *_dirname)
|
||||
{//MAlloc absolute dir string with partition letter.
|
||||
{//MAlloc absolute dir string with drv letter.
|
||||
I64 maxlen;
|
||||
U8 drv[3],*cur_dir,*buf2,*buf3,*buf,*dirname,*temp_name;
|
||||
U8 drv[3],*result,*buf,*buf2,*buf3,*buf4,*dirname,*free_dirname;
|
||||
if (!Fs->cur_dir || !*Fs->cur_dir)
|
||||
return StrNew(_dirname);
|
||||
dirname=MStrUtil(_dirname,SUF_REM_LEADING|SUF_REM_TRAILING|SUF_REM_CTRL_CHARS);
|
||||
temp_name=dirname;
|
||||
*drv=Prt2Drv;
|
||||
free_dirname=dirname=MStrUtil(_dirname,
|
||||
SUF_REM_LEADING|SUF_REM_TRAILING|SUF_REM_CTRL_CHARS);
|
||||
*drv=Drv2Let;
|
||||
drv[1]=':';
|
||||
drv[2]=0;
|
||||
if (*dirname && dirname[1]==':') {
|
||||
if (*dirname==':')
|
||||
*drv=*sys_acct;
|
||||
*drv=dsk.boot_drv_let;
|
||||
else
|
||||
*drv=*dirname;
|
||||
dirname=dirname+2;
|
||||
cur_dir=StrNew("/");
|
||||
buf=StrNew("/");
|
||||
} else
|
||||
cur_dir=StrNew(Fs->cur_dir);
|
||||
buf=StrNew(Fs->cur_dir);
|
||||
if (*dirname=='/') {
|
||||
Free(cur_dir);
|
||||
cur_dir=StrNew("/");
|
||||
Free(buf);
|
||||
buf=StrNew("/");
|
||||
dirname++;
|
||||
}
|
||||
|
||||
buf2=StrNew(dirname);
|
||||
maxlen=StrLen(cur_dir)+1+StrLen(buf2)+1;
|
||||
maxlen=StrLen(buf)+1+StrLen(buf2)+1;
|
||||
buf3=MAlloc(maxlen);
|
||||
buf =MAlloc(maxlen);
|
||||
StrCpy(buf3,cur_dir);
|
||||
buf4=MAlloc(maxlen);
|
||||
StrCpy(buf3,buf);
|
||||
while (*buf2) {
|
||||
StrFirstRem(buf2,"/",buf);
|
||||
if (!*buf)
|
||||
StrFirstRem(buf2,"/",buf4);
|
||||
if (!*buf4)
|
||||
StrCpy(buf3,"/");
|
||||
else if (!StrCmp(buf,"..")) {
|
||||
else if (!StrCmp(buf4,"..")) {
|
||||
StrLastRem(buf3,"/");
|
||||
if (!*buf3)
|
||||
StrCpy(buf3,"/");
|
||||
} else if (!StrCmp(buf,".")) {
|
||||
} else if (!StrCmp(buf4,".")) {
|
||||
;
|
||||
} else if (*buf) {
|
||||
if (!StrCmp(buf,"HOME")) {
|
||||
Free(buf3);
|
||||
buf3=MAlloc(maxlen+StrLen(sys_acct));
|
||||
StrCpy(buf3,sys_acct+2);
|
||||
*drv=*sys_acct;
|
||||
} else {
|
||||
if (StrCmp(buf3,"/"))
|
||||
CatPrint(buf3,"/");
|
||||
CatPrint(buf3,buf);
|
||||
}
|
||||
} else if (*buf4) {
|
||||
if (StrCmp(buf3,"/"))
|
||||
CatPrint(buf3,"/");
|
||||
CatPrint(buf3,buf4);
|
||||
}
|
||||
}
|
||||
Free(cur_dir);
|
||||
cur_dir=MAlloc(StrLen(buf3)+3);
|
||||
StrCpy(cur_dir,drv);
|
||||
StrCpy(cur_dir+2,buf3);
|
||||
Free(buf);
|
||||
result=MAlloc(StrLen(buf3)+3);
|
||||
StrCpy(result,drv);
|
||||
StrCpy(result+2,buf3);
|
||||
Free(buf2);
|
||||
Free(buf3);
|
||||
Free(temp_name);
|
||||
return cur_dir;
|
||||
Free(buf4);
|
||||
Free(free_dirname);
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *FileNameAbs(U8 *_filename,I64 fuf_flags=0)
|
||||
{//Absolute filename. Accepts $LK,"FUF_Z_OR_NOT_Z",A="MN:FUF_Z_OR_NOT_Z"$, $LK,"FUF_SCAN_PARENTS",A="MN:FUF_SCAN_PARENTS"$.
|
||||
U8 *buf,*buf2,*buf3,*filename,*temp_name,*temp_buf;
|
||||
U8 *result,*filename,*buf,*buf_file,*buf_dir,*free_filename,*free_buf;
|
||||
CDirEntry de;
|
||||
filename=MStrUtil(_filename,SUF_REM_LEADING|SUF_REM_TRAILING|SUF_REM_CTRL_CHARS);
|
||||
temp_name=filename;
|
||||
buf=StrNew(filename);
|
||||
temp_buf=buf;
|
||||
free_filename=filename=MStrUtil(_filename,
|
||||
SUF_REM_LEADING|SUF_REM_TRAILING|SUF_REM_CTRL_CHARS);
|
||||
free_buf=buf=StrNew(filename);
|
||||
if (*buf && buf[1]==':') {
|
||||
buf+=2;
|
||||
filename+=2;
|
||||
}
|
||||
buf2=MAlloc(StrLen(temp_name)+1);
|
||||
StrLastRem(buf,"/",buf2);
|
||||
buf_file=MAlloc(StrLen(free_filename)+1);
|
||||
StrLastRem(buf,"/",buf_file);
|
||||
if (*filename=='/' && !*buf)
|
||||
StrCpy(buf,"/");
|
||||
buf3=DirNameAbs(temp_buf);
|
||||
Free(temp_buf);
|
||||
buf=MAlloc(StrLen(buf3)+1+StrLen(buf2)+1);
|
||||
StrCpy(buf,buf3);
|
||||
if (buf[StrLen(buf)-1]!='/')
|
||||
CatPrint(buf,"/");
|
||||
CatPrint(buf,buf2);
|
||||
Free(buf2);
|
||||
Free(buf3);
|
||||
Free(temp_name);
|
||||
if (fuf_flags&&FileFind(buf,&de,fuf_flags|FUF_JUST_FILES)) {
|
||||
Free(buf);
|
||||
buf=de.full_name;
|
||||
buf_dir=DirNameAbs(free_buf);
|
||||
Free(free_buf);
|
||||
result=MAlloc(StrLen(buf_dir)+1+StrLen(buf_file)+1);
|
||||
StrCpy(result,buf_dir);
|
||||
if (result[StrLen(result)-1]!='/')
|
||||
CatPrint(result,"/");
|
||||
CatPrint(result,buf_file);
|
||||
Free(buf_file);
|
||||
Free(buf_dir);
|
||||
Free(free_filename);
|
||||
if (fuf_flags&&FileFind(result,&de,fuf_flags|FUF_JUST_FILES)) {
|
||||
Free(result);
|
||||
result=de.full_name;
|
||||
}
|
||||
return buf;
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *ChgExt(U8 *filename,U8 *extension)
|
||||
@@ -311,7 +302,7 @@ U8 *DirFile(U8 *dirname,U8 *name=NULL,U8 *_extension=NULL)
|
||||
{/*Strips file from dirname, scans for file upward until found or
|
||||
returns default.
|
||||
|
||||
("/Kernel/Hash1a.CPP.Z",NULL,NULL) returns "D:/Kernel"
|
||||
("/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"
|
||||
("/Apps/Psalmody","Load","CPP.Z") returns "D:/Apps/Psalmody/Load.CPP.Z"
|
||||
@@ -371,5 +362,5 @@ U8 *ToggleZorNotZ(U8 *name)
|
||||
|
||||
U8 *FileNameTempTxt()
|
||||
{//Make pretty-safe temp filename in home dir.
|
||||
return MStrPrint("HOME/SysTemp%X.TXT.Z",GetTSC>>8&0xFFFFFFFF);
|
||||
return MStrPrint("::/Home/SysTemp%X.TXT.Z",GetTSC>>8&0xFFFFFFFF);
|
||||
}
|
||||
+212
-212
@@ -19,42 +19,42 @@ CDate Dos2CDate(U16 t,U16 d)
|
||||
return Struct2Date(&ds)-local_time_offset;
|
||||
}
|
||||
|
||||
U0 FAT32PrtInit(CPrt *p)
|
||||
U0 FAT32DrvInit(CDrv *dv)
|
||||
{
|
||||
CFAT32Boot br32;
|
||||
Bool unlock;
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
p->type=PT_FAT32;
|
||||
RBlks(p,&br32,p->offset,1);
|
||||
p->file_system_info_sect=p->offset+br32.file_system_info_sect;
|
||||
p->map1=p->offset+br32.reserved_sects;
|
||||
p->map2=p->map1+br32.sects_per_fat;
|
||||
p->data=p->map2+br32.sects_per_fat-2*br32.sects_per_cluster; //Starts at Cluster 2
|
||||
p->spc=br32.sects_per_cluster;
|
||||
p->root_cluster=br32.root_cluster;
|
||||
MapBufAlloc(p,1);
|
||||
Free(p->fis);
|
||||
p->fis=AMAlloc(BLK_SIZE);
|
||||
RBlks(p,p->fis,p->file_system_info_sect,1);
|
||||
unlock=DrvLock(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-2*br32.sects_per_cluster; //Starts at Cluster 2
|
||||
dv->spc=br32.sects_per_cluster;
|
||||
dv->root_cluster=br32.root_cluster;
|
||||
DrvMapBlkAlloc(dv);
|
||||
Free(dv->fis);
|
||||
dv->fis=AMAlloc(BLK_SIZE);
|
||||
RBlks(dv,dv->fis,dv->file_system_info_sect,1);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
}
|
||||
|
||||
Bool FAT32DrvValidate(U8 drv_let)
|
||||
{
|
||||
CPrt *p;
|
||||
CDrv *dv;
|
||||
CFAT32Boot br;
|
||||
Bool result=FALSE;
|
||||
try {
|
||||
p=Drv2Prt(drv_let);
|
||||
if (p->type==PT_FAT32 &&
|
||||
RBlks(p,&br,p->offset,1) &&
|
||||
dv=Let2Drv(drv_let);
|
||||
if (dv->type==DVT_FAT32 &&
|
||||
RBlks(dv,&br,dv->base_offset,1) &&
|
||||
br.signature==0xAA55 &&
|
||||
br.sects==p->size)
|
||||
br.sects==dv->size)
|
||||
result=TRUE;
|
||||
} catch
|
||||
Fs->catch_except=TRUE;
|
||||
@@ -65,28 +65,28 @@ U0 FAT32Fmt(U8 drv_let,Bool quick=TRUE)
|
||||
{
|
||||
CFAT32Boot *br=CAlloc(BLK_SIZE);
|
||||
CFAT32FileInfoSect *fis=CAlloc(BLK_SIZE);
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
CDrv *dv=Let2Drv(drv_let);
|
||||
I64 i,l;
|
||||
try {
|
||||
PrtLock(p);
|
||||
SetDrvType(drv_let,PT_FAT32);
|
||||
p->type=PT_FAT32;
|
||||
DrvLock(dv);
|
||||
DrvTypeSet(drv_let,DVT_FAT32);
|
||||
dv->type=DVT_FAT32;
|
||||
br->jump_and_nop[0]=OC_JMP_REL8;
|
||||
br->jump_and_nop[1]=offset(CFAT32Boot.code)-2;
|
||||
br->jump_and_nop[2]=OC_NOP;
|
||||
MemCpy(br->oem_name,"MSWIN4.1",8);
|
||||
br->oem_name[0](I64)='MSWIN4.1';
|
||||
br->bytes_per_sect=BLK_SIZE;
|
||||
if (p->size<= 500000)
|
||||
if (dv->size<= 500000)
|
||||
br->sects_per_cluster=1;
|
||||
else if (p->size<=2000000)
|
||||
else if (dv->size<=2000000)
|
||||
br->sects_per_cluster=2;
|
||||
else if (p->size<=6000000)
|
||||
else if (dv->size<=6000000)
|
||||
br->sects_per_cluster=4;
|
||||
else if (p->size<=12000000)
|
||||
else if (dv->size<=12000000)
|
||||
br->sects_per_cluster=8;
|
||||
else if (p->size<=33000000)
|
||||
else if (dv->size<=33000000)
|
||||
br->sects_per_cluster=16;
|
||||
else if (p->size<=67000000)
|
||||
else if (dv->size<=67000000)
|
||||
br->sects_per_cluster=32;
|
||||
else
|
||||
br->sects_per_cluster=64;
|
||||
@@ -94,7 +94,7 @@ U0 FAT32Fmt(U8 drv_let,Bool quick=TRUE)
|
||||
br->reserved_sects=32;
|
||||
br->copies_of_fat=2;
|
||||
br->media_desc=0xF8;
|
||||
br->sects=p->size;
|
||||
br->sects=dv->size;
|
||||
l=(br->sects/br->sects_per_cluster)>>(BLK_SIZE_BITS-2)+1;
|
||||
br->sects_per_fat=l;
|
||||
br->root_cluster=2;
|
||||
@@ -103,30 +103,30 @@ U0 FAT32Fmt(U8 drv_let,Bool quick=TRUE)
|
||||
br->ext_signature=0x29;
|
||||
br->serial_num=RandU32;
|
||||
MemCpy(br->vol_name,"NO NAME ",11);
|
||||
MemCpy(br->fat_name,"FAT32 ",8);
|
||||
br->fat_name[0](I64)='FAT32 ';
|
||||
br->signature=0xAA55;
|
||||
fis->signature1=0x41615252;
|
||||
fis->signature2=0x61417272;
|
||||
fis->signature1='RRaA';
|
||||
fis->signature2='rrAa';
|
||||
fis->free_clusters=-1;
|
||||
fis->most_recently_allocated=0;
|
||||
fis->most_recently_alloced=0;
|
||||
fis->signature3=0xAA550000;
|
||||
|
||||
if (quick)
|
||||
i=br->reserved_sects+2*l+4*br->sects_per_cluster;
|
||||
else
|
||||
i=p->size;
|
||||
WZeroBlks(p,p->offset,i);
|
||||
i=dv->size;
|
||||
WZeroBlks(dv,dv->base_offset,i);
|
||||
|
||||
WBlks(p,fis,p->offset+br->file_system_info_sect,1);
|
||||
WBlks(p,br,p->offset,1);
|
||||
FAT32PrtInit(p);
|
||||
ClustersAlloc(p,0,1,FALSE); //Allocate #1
|
||||
br->root_cluster=ClustersAlloc(p,0,1,FALSE);
|
||||
WBlks(p,br,p->offset,1);
|
||||
FAT32PrtInit(p);
|
||||
PrtUnlock(p);
|
||||
WBlks(dv,fis,dv->base_offset+br->file_system_info_sect,1);
|
||||
WBlks(dv,br,dv->base_offset,1);
|
||||
FAT32DrvInit(dv);
|
||||
ClustersAlloc(dv,0,1,FALSE); //Alloc #1
|
||||
br->root_cluster=ClustersAlloc(dv,0,1,FALSE);
|
||||
WBlks(dv,br,dv->base_offset,1);
|
||||
FAT32DrvInit(dv);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
Free(br);
|
||||
Free(fis);
|
||||
}
|
||||
@@ -296,7 +296,7 @@ Bool FAT32DirFill(CFAT32DirEntry *de,CDirEntry *tempde,I64 *_de_cnt=NULL)
|
||||
return result;
|
||||
}
|
||||
|
||||
Bool FAT32FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0)
|
||||
Bool FAT32FileFind(CDrv *dv,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0)
|
||||
{//$LK,"FUF_JUST_DIRS",A="MN:FUF_JUST_DIRS"$, $LK,"FUF_JUST_FILES",A="MN:FUF_JUST_FILES"$
|
||||
Bool result=FALSE,unlock;
|
||||
CFAT32DirEntry *buf;
|
||||
@@ -307,17 +307,17 @@ Bool FAT32FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 f
|
||||
throw('FUF');
|
||||
MemSet(_result,0,sizeof(CDirEntry));
|
||||
MemSet(&long_name,0,sizeof(CDirEntry));
|
||||
PrtChk(p);
|
||||
if (p->type!=PT_FAT32)
|
||||
PrintErr("Not FAT32 Partition\n");
|
||||
DrvChk(dv);
|
||||
if (dv->type!=DVT_FAT32)
|
||||
PrintErr("Not FAT32 Drv\n");
|
||||
else if (!CFileNameTo(dname,name))
|
||||
PrintErr("Invalid FileName.\n");
|
||||
else
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
buf=MAlloc(BLK_SIZE*p->spc);
|
||||
entries_per_cluster=p->spc<<FAT32_ENTRIES_BITS;
|
||||
RClusters(p,buf,cur_dir_cluster,1);
|
||||
unlock=DrvLock(dv);
|
||||
buf=MAlloc(BLK_SIZE*dv->spc);
|
||||
entries_per_cluster=dv->spc<<FAT32_ENTRIES_BITS;
|
||||
RClusters(dv,buf,cur_dir_cluster,1);
|
||||
cur_dir_entry=0;
|
||||
while (ch=*buf[cur_dir_entry].name) {
|
||||
attr=buf[cur_dir_entry].attr;
|
||||
@@ -331,11 +331,11 @@ Bool FAT32FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 f
|
||||
else
|
||||
MemSet(_result,0,sizeof(CDirEntry));
|
||||
if (!(fuf_flags&FUF_JUST_DIRS && !(attr & RS_ATTR_DIR)) &&
|
||||
!(fuf_flags&FUF_JUST_FILES && attr & RS_ATTR_DIR) &&
|
||||
FAT32CDirFill(_result,&buf[cur_dir_entry]) &&
|
||||
!StrCmp(dname,_result->name)) {
|
||||
result=TRUE;
|
||||
goto exit_this;
|
||||
!(fuf_flags&FUF_JUST_FILES && attr & RS_ATTR_DIR) &&
|
||||
FAT32CDirFill(_result,&buf[cur_dir_entry]) &&
|
||||
!StrCmp(dname,_result->name)) {
|
||||
result=TRUE;
|
||||
goto fff_done;
|
||||
}
|
||||
}
|
||||
MemSet(&long_name,0,sizeof(CDirEntry));
|
||||
@@ -343,64 +343,64 @@ Bool FAT32FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 f
|
||||
} else
|
||||
MemSet(&long_name,0,sizeof(CDirEntry));
|
||||
if (++cur_dir_entry==entries_per_cluster) {
|
||||
cur_dir_cluster=ClusterNumNext(p,cur_dir_cluster);
|
||||
cur_dir_cluster=ClusterNumNext(dv,cur_dir_cluster);
|
||||
if (!(0<cur_dir_cluster<0x0FFFFFF8))
|
||||
break;
|
||||
else {
|
||||
RClusters(p,buf,cur_dir_cluster,1);
|
||||
RClusters(dv,buf,cur_dir_cluster,1);
|
||||
cur_dir_entry=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
MemSet(_result,0,sizeof(CDirEntry));
|
||||
exit_this:
|
||||
fff_done:
|
||||
Free(buf);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *FAT32FileRead(CPrt *p,U8 *cur_dir,U8 *filename,I64 *_size,I64 *_attr)
|
||||
U8 *FAT32FileRead(CDrv *dv,U8 *cur_dir,U8 *filename,I64 *_size,I64 *_attr)
|
||||
{
|
||||
U8 *buf=NULL;
|
||||
CDirEntry de;
|
||||
I64 c,blk_cnt,cur_dir_cluster;
|
||||
PrtChk(p);
|
||||
DrvChk(dv);
|
||||
*_size=0;
|
||||
*_attr=0;
|
||||
if (p->type!=PT_FAT32)
|
||||
PrintErr("Not FAT32 Partition\n");
|
||||
if (dv->type!=DVT_FAT32)
|
||||
PrintErr("Not FAT32 Drv\n");
|
||||
else
|
||||
try {
|
||||
PrtLock(p);
|
||||
cur_dir_cluster=Name2DirCluster(p,cur_dir);
|
||||
if (FAT32FileFind(p,cur_dir_cluster,filename,&de,FUF_JUST_FILES)) {
|
||||
DrvLock(dv);
|
||||
cur_dir_cluster=Name2DirCluster(dv,cur_dir);
|
||||
if (FAT32FileFind(dv,cur_dir_cluster,filename,&de,FUF_JUST_FILES)) {
|
||||
blk_cnt=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS;
|
||||
buf=MAlloc(blk_cnt<<BLK_SIZE_BITS+1);
|
||||
c=de.cluster;
|
||||
if (!(0<c<0x0FFFFFF8))
|
||||
c=0x0FFFFFFF;
|
||||
else
|
||||
c=RClustersBlks(p,buf,c,blk_cnt);
|
||||
c=RClustersBlks(dv,buf,c,blk_cnt);
|
||||
buf[de.size]=0; //Terminate
|
||||
*_size=de.size;
|
||||
*_attr=FileAttr(de.name,de.attr);
|
||||
}
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
return buf;
|
||||
}
|
||||
|
||||
Bool FAT32Cd(U8 *name,I64 cur_dir_cluster)
|
||||
{
|
||||
CDirEntry de;
|
||||
if (Fs->cur_prt->type!=PT_FAT32)
|
||||
PrintErr("Not FAT32 Partition\n");
|
||||
else if (FAT32FileFind(Fs->cur_prt,cur_dir_cluster,name,&de,FUF_JUST_DIRS))
|
||||
if (Fs->cur_dv->type!=DVT_FAT32)
|
||||
PrintErr("Not FAT32 Drv\n");
|
||||
else if (FAT32FileFind(Fs->cur_dv,cur_dir_cluster,name,&de,FUF_JUST_DIRS))
|
||||
return TRUE;
|
||||
else {
|
||||
"%s ",name;
|
||||
@@ -409,50 +409,50 @@ Bool FAT32Cd(U8 *name,I64 cur_dir_cluster)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
U0 FAT32FreeClusters(CPrt *p,I64 c)
|
||||
U0 FAT32FreeClusters(CDrv *dv,I64 c)
|
||||
{
|
||||
I64 next,saved_c=c;
|
||||
Bool unlock,unlock_break;
|
||||
PrtChk(p);
|
||||
DrvChk(dv);
|
||||
if (!(0<c<0x0FFFFFF8)) return;
|
||||
if (p->type!=PT_FAT32)
|
||||
PrintErr("Not FAT32 Partition\n");
|
||||
if (dv->type!=DVT_FAT32)
|
||||
PrintErr("Not FAT32 Drv\n");
|
||||
else
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
unlock=PrtLock(p);
|
||||
CleanMAPBuf(p);
|
||||
unlock=DrvLock(dv);
|
||||
DrvMapBlkClean(dv);
|
||||
do {
|
||||
SetFSBuf(p,c,0);
|
||||
next=p->cur_map_blk[c&(BLK_SIZE/4-1)];
|
||||
p->cur_map_blk[c&(BLK_SIZE/4-1)]=0;
|
||||
LBts(p->buffered_map_dirty_bits,0);
|
||||
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);
|
||||
c=next;
|
||||
} while (0<c<0x0FFFFFF8);
|
||||
CleanMAPBuf(p,0);
|
||||
DrvMapBlkClean(dv,0);
|
||||
|
||||
c=saved_c;
|
||||
do {
|
||||
SetFSBuf(p,c,1);
|
||||
next=p->cur_map_blk[c&(BLK_SIZE/4-1)];
|
||||
p->cur_map_blk[c&(BLK_SIZE/4-1)]=0;
|
||||
LBts(p->buffered_map_dirty_bits,0);
|
||||
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);
|
||||
c=next;
|
||||
} while (0<c<0x0FFFFFF8);
|
||||
CleanMAPBuf(p,1);
|
||||
DrvMapBlkClean(dv,1);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
} catch {
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
}
|
||||
}
|
||||
|
||||
I64 FAT32AllocClusters(CPrt *p,I64 c,I64 cnt)
|
||||
I64 FAT32AllocClusters(CDrv *dv,I64 c,I64 cnt)
|
||||
{
|
||||
Bool wrap_around=FALSE,unlock,unlock_break;
|
||||
I64 first=INVALID_CLUSTER,j,l;
|
||||
@@ -460,57 +460,57 @@ I64 FAT32AllocClusters(CPrt *p,I64 c,I64 cnt)
|
||||
if (cnt<=0) return 0x0FFFFFFF;
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
unlock=PrtLock(p);
|
||||
l=(p->size+p->offset-p->data)/p->spc-1;
|
||||
j=p->fis->most_recently_allocated;
|
||||
unlock=DrvLock(dv);
|
||||
l=(dv->size+dv->base_offset-dv->data_area)/dv->spc-1;
|
||||
j=dv->fis->most_recently_alloced;
|
||||
while (cnt-->0) {
|
||||
while (TRUE) {
|
||||
j++;
|
||||
if (j<1) j=1;
|
||||
if (j>=l) {
|
||||
if (wrap_around)
|
||||
Dbg;
|
||||
throw('Drv');
|
||||
j=1;
|
||||
wrap_around=TRUE;
|
||||
}
|
||||
SetFSBuf(p,j);
|
||||
if (!p->cur_map_blk[j&(BLK_SIZE/4-1)])
|
||||
DrvMapBlkSet(dv,j);
|
||||
if (!dv->cur_map_blk[j&(BLK_SIZE/4-1)])
|
||||
break;
|
||||
}
|
||||
if (!(0<first<0x0FFFFFF8))
|
||||
first=j;
|
||||
if (0<c<l) {
|
||||
SetFSBuf(p,c);
|
||||
p->cur_map_blk[c&(BLK_SIZE/4-1)]=j;
|
||||
LBts(p->buffered_map_dirty_bits,0);
|
||||
DrvMapBlkSet(dv,c);
|
||||
dv->cur_map_blk[c&(BLK_SIZE/4-1)]=j;
|
||||
LBts(&dv->map_blk_dirty,0);
|
||||
}
|
||||
c=j;
|
||||
}
|
||||
|
||||
if (0<c<l) {
|
||||
SetFSBuf(p,c);
|
||||
p->cur_map_blk[c&(BLK_SIZE/4-1)]=0x0FFFFFFF;
|
||||
LBts(p->buffered_map_dirty_bits,0);
|
||||
DrvMapBlkSet(dv,c);
|
||||
dv->cur_map_blk[c&(BLK_SIZE/4-1)]=0x0FFFFFFF;
|
||||
LBts(&dv->map_blk_dirty,0);
|
||||
}
|
||||
CleanMAPBuf(p);
|
||||
DrvMapBlkClean(dv);
|
||||
|
||||
p->fis->most_recently_allocated=j;
|
||||
p->fis->free_clusters=-1;
|
||||
WBlks(p,p->fis,p->file_system_info_sect,1);
|
||||
dv->fis->most_recently_alloced=j;
|
||||
dv->fis->free_clusters=-1;
|
||||
WBlks(dv,dv->fis,dv->file_system_info_sect,1);
|
||||
} catch {
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
return first;
|
||||
}
|
||||
|
||||
I64 FAT32AllocContiguousClusters(CPrt *p,I64 cnt)
|
||||
I64 FAT32AllocContiguousClusters(CDrv *dv,I64 cnt)
|
||||
{
|
||||
I64 i,first=1;
|
||||
Bool cont,unlock,unlock_break;
|
||||
@@ -518,16 +518,16 @@ I64 FAT32AllocContiguousClusters(CPrt *p,I64 cnt)
|
||||
if (cnt<=0) return 0x0FFFFFFF;
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
unlock=PrtLock(p);
|
||||
unlock=DrvLock(dv);
|
||||
while (TRUE) {
|
||||
first++;
|
||||
i=0;
|
||||
cont=TRUE;
|
||||
while (cont && i<cnt) {
|
||||
if ((first+i+1)*p->spc+p->data>p->size+p->offset)
|
||||
Dbg;
|
||||
SetFSBuf(p,first+i);
|
||||
if (p->cur_map_blk[(first+i)&(BLK_SIZE/4-1)])
|
||||
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)])
|
||||
cont=FALSE;
|
||||
else
|
||||
i++;
|
||||
@@ -535,44 +535,44 @@ I64 FAT32AllocContiguousClusters(CPrt *p,I64 cnt)
|
||||
if (!cont)
|
||||
first=first+i;
|
||||
else {
|
||||
CleanMAPBuf(p);
|
||||
DrvMapBlkClean(dv);
|
||||
|
||||
for (i=0;i<cnt;i++) {
|
||||
SetFSBuf(p,first+i,0);
|
||||
DrvMapBlkSet(dv,first+i,0);
|
||||
if (i+1==cnt)
|
||||
p->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF;
|
||||
dv->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF;
|
||||
else
|
||||
p->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=first+i+1;
|
||||
LBts(p->buffered_map_dirty_bits,0);
|
||||
dv->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=first+i+1;
|
||||
LBts(&dv->map_blk_dirty,0);
|
||||
}
|
||||
CleanMAPBuf(p,0);
|
||||
DrvMapBlkClean(dv,0);
|
||||
|
||||
for (i=0;i<cnt;i++) {
|
||||
SetFSBuf(p,first+i,1);
|
||||
DrvMapBlkSet(dv,first+i,1);
|
||||
if (i+1==cnt)
|
||||
p->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF;
|
||||
dv->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF;
|
||||
else
|
||||
p->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=first+i+1;
|
||||
LBts(p->buffered_map_dirty_bits,0);
|
||||
dv->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]=first+i+1;
|
||||
LBts(&dv->map_blk_dirty,0);
|
||||
}
|
||||
CleanMAPBuf(p,1);
|
||||
DrvMapBlkClean(dv,1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
return first;
|
||||
}
|
||||
|
||||
Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain)
|
||||
Bool FAT32DirNew(CDrv *dv,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain)
|
||||
{
|
||||
//See $LK,"::/Doc/CutCorners.TXT"$.
|
||||
CFAT32DirEntry *buf,*last_buf,*temp_buf,de[3];
|
||||
@@ -586,12 +586,12 @@ Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain)
|
||||
MemSet(&long_name,0,sizeof(CDirEntry));
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
unlock=PrtLock(p);
|
||||
cur_dir_cluster=Name2DirCluster(p,cur_dir);
|
||||
buf =MAlloc(BLK_SIZE*p->spc);
|
||||
last_buf=CAlloc(BLK_SIZE*p->spc);
|
||||
entries_per_cluster=p->spc<<FAT32_ENTRIES_BITS;
|
||||
RClusters(p,buf,cur_dir_cluster,1);
|
||||
unlock=DrvLock(dv);
|
||||
cur_dir_cluster=Name2DirCluster(dv,cur_dir);
|
||||
buf =MAlloc(BLK_SIZE*dv->spc);
|
||||
last_buf=CAlloc(BLK_SIZE*dv->spc);
|
||||
entries_per_cluster=dv->spc<<FAT32_ENTRIES_BITS;
|
||||
RClusters(dv,buf,cur_dir_cluster,1);
|
||||
cur_dir_entry=0;
|
||||
while (ch=*buf[cur_dir_entry].name) {
|
||||
attr=buf[cur_dir_entry].attr;
|
||||
@@ -607,8 +607,8 @@ Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain)
|
||||
}
|
||||
if (ch==0xE5 && !written && avail_cnt>=de_cnt) {
|
||||
MemCpy(&buf[cur_dir_entry],&de,de_cnt*sizeof(CFAT32DirEntry));
|
||||
WBlks(p,&buf[cur_dir_entry & -FAT32_ENTRIES_PER_BLK],
|
||||
p->data+cur_dir_cluster*p->spc
|
||||
WBlks(dv,&buf[cur_dir_entry & -FAT32_ENTRIES_PER_BLK],
|
||||
dv->data_area+cur_dir_cluster*dv->spc
|
||||
+cur_dir_entry>>FAT32_ENTRIES_BITS,1);
|
||||
cur_dir_entry+=de_cnt-1; //gets inc'ed
|
||||
written=TRUE;
|
||||
@@ -620,12 +620,12 @@ Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain)
|
||||
//Del old entry with same name
|
||||
if (!StrCmp(long_name.name,tempde->name)) {
|
||||
if (free_old_chain)
|
||||
FAT32FreeClusters(p,buf[cur_dir_entry].cluster_lo+
|
||||
FAT32FreeClusters(dv,buf[cur_dir_entry].cluster_lo+
|
||||
buf[cur_dir_entry].cluster_hi<<16);
|
||||
if (!written) {
|
||||
MemCpy(&buf[cur_dir_entry],&de[de_cnt-1],sizeof(CFAT32DirEntry));
|
||||
WBlks(p,&buf[cur_dir_entry & -FAT32_ENTRIES_PER_BLK],
|
||||
p->data+cur_dir_cluster*p->spc
|
||||
WBlks(dv,&buf[cur_dir_entry & -FAT32_ENTRIES_PER_BLK],
|
||||
dv->data_area+cur_dir_cluster*dv->spc
|
||||
+cur_dir_entry>>FAT32_ENTRIES_BITS,1);
|
||||
written=TRUE;
|
||||
} else {
|
||||
@@ -635,8 +635,8 @@ Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain)
|
||||
buf[cur_dir_entry-i].attr&RS_ATTR_LONG_NAME_MASK==RS_ATTR_LONG_NAME)
|
||||
*buf[cur_dir_entry-i++].name=0xE5;
|
||||
i--;
|
||||
WBlks(p,&buf[(cur_dir_entry-i)&-FAT32_ENTRIES_PER_BLK],
|
||||
p->data+cur_dir_cluster*p->spc
|
||||
WBlks(dv,&buf[(cur_dir_entry-i)&-FAT32_ENTRIES_PER_BLK],
|
||||
dv->data_area+cur_dir_cluster*dv->spc
|
||||
+(cur_dir_entry-i)>>FAT32_ENTRIES_BITS,
|
||||
(i+FAT32_ENTRIES_PER_BLK)>>FAT32_ENTRIES_BITS);
|
||||
if (i==cur_dir_entry && 0<last_dir_cluster<0x0FFFFFF8) {
|
||||
@@ -645,8 +645,8 @@ Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain)
|
||||
last_buf[entries_per_cluster-i].attr&RS_ATTR_LONG_NAME_MASK==RS_ATTR_LONG_NAME)
|
||||
*last_buf[entries_per_cluster-i++].name=0xE5;
|
||||
if (--i>0)
|
||||
WBlks(p,&buf[(entries_per_cluster-i)&-FAT32_ENTRIES_PER_BLK],
|
||||
p->data+last_dir_cluster*p->spc
|
||||
WBlks(dv,&buf[(entries_per_cluster-i)&-FAT32_ENTRIES_PER_BLK],
|
||||
dv->data_area+last_dir_cluster*dv->spc
|
||||
+(entries_per_cluster-i)>>FAT32_ENTRIES_BITS,
|
||||
(i+FAT32_ENTRIES_PER_BLK-1)>>FAT32_ENTRIES_BITS);
|
||||
}
|
||||
@@ -659,13 +659,13 @@ Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain)
|
||||
if (++cur_dir_entry==entries_per_cluster) {
|
||||
last_dir_cluster=cur_dir_cluster;
|
||||
temp_buf=buf; buf=last_buf; last_buf=temp_buf;
|
||||
c=ClusterNumNext(p,cur_dir_cluster);
|
||||
c=ClusterNumNext(dv,cur_dir_cluster);
|
||||
if (!(0<c<0x0FFFFFF8)) {
|
||||
c=ClustersAlloc(p,cur_dir_cluster,1,FALSE);
|
||||
MemSet(buf,0,BLK_SIZE*p->spc);
|
||||
WClusters(p,buf,c,1);
|
||||
c=ClustersAlloc(dv,cur_dir_cluster,1,FALSE);
|
||||
MemSet(buf,0,BLK_SIZE*dv->spc);
|
||||
WClusters(dv,buf,c,1);
|
||||
} else
|
||||
RClusters(p,buf,c,1);
|
||||
RClusters(dv,buf,c,1);
|
||||
cur_dir_cluster=c;
|
||||
cur_dir_entry=0;
|
||||
}
|
||||
@@ -675,51 +675,51 @@ Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain)
|
||||
if (avail_cnt<de_cnt) {
|
||||
for (i=0;i<avail_cnt;i++)
|
||||
*buf[cur_dir_entry+i].name=0xE5;
|
||||
WBlks(p,&buf[cur_dir_entry &-FAT32_ENTRIES_PER_BLK],
|
||||
p->data+cur_dir_cluster*p->spc
|
||||
WBlks(dv,&buf[cur_dir_entry &-FAT32_ENTRIES_PER_BLK],
|
||||
dv->data_area+cur_dir_cluster*dv->spc
|
||||
+cur_dir_entry>>FAT32_ENTRIES_BITS,1);
|
||||
cur_dir_entry+=avail_cnt;
|
||||
if (cur_dir_entry==entries_per_cluster) {
|
||||
last_dir_cluster=cur_dir_cluster;
|
||||
temp_buf=buf; buf=last_buf; last_buf=temp_buf;
|
||||
cur_dir_cluster=ClustersAlloc(p,cur_dir_cluster,1);
|
||||
cur_dir_cluster=ClustersAlloc(dv,cur_dir_cluster,1);
|
||||
cur_dir_entry=0;
|
||||
MemSet(buf,0,BLK_SIZE*p->spc);
|
||||
WClusters(p,buf,cur_dir_cluster,1);
|
||||
MemSet(buf,0,BLK_SIZE*dv->spc);
|
||||
WClusters(dv,buf,cur_dir_cluster,1);
|
||||
}
|
||||
}
|
||||
MemCpy(&buf[cur_dir_entry],&de,de_cnt*sizeof(CFAT32DirEntry));
|
||||
WBlks(p,&buf[cur_dir_entry &-FAT32_ENTRIES_PER_BLK],
|
||||
p->data+cur_dir_cluster*p->spc+
|
||||
WBlks(dv,&buf[cur_dir_entry &-FAT32_ENTRIES_PER_BLK],
|
||||
dv->data_area+cur_dir_cluster*dv->spc+
|
||||
cur_dir_entry>>FAT32_ENTRIES_BITS,1);
|
||||
cur_dir_entry+=de_cnt;
|
||||
if (cur_dir_entry==entries_per_cluster) {
|
||||
cur_dir_cluster=ClustersAlloc(p,cur_dir_cluster,1);
|
||||
MemSet(buf,0,BLK_SIZE*p->spc);
|
||||
WClusters(p,buf,cur_dir_cluster,1);
|
||||
cur_dir_cluster=ClustersAlloc(dv,cur_dir_cluster,1);
|
||||
MemSet(buf,0,BLK_SIZE*dv->spc);
|
||||
WClusters(dv,buf,cur_dir_cluster,1);
|
||||
} else {
|
||||
MemSet(&buf[cur_dir_entry],0,sizeof(CFAT32DirEntry));
|
||||
WBlks(p,&buf[cur_dir_entry &-FAT32_ENTRIES_PER_BLK],
|
||||
p->data+cur_dir_cluster*p->spc
|
||||
WBlks(dv,&buf[cur_dir_entry &-FAT32_ENTRIES_PER_BLK],
|
||||
dv->data_area+cur_dir_cluster*dv->spc
|
||||
+cur_dir_entry>>FAT32_ENTRIES_BITS,1);
|
||||
}
|
||||
}
|
||||
Free(last_buf);
|
||||
Free(buf);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
} catch {
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
I64 FAT32FilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
I64 FAT32FilesDel(CDrv *dv,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
Bool del_dir,Bool print_msg)
|
||||
{
|
||||
CFAT32DirEntry *buf,*last_buf,*temp_buf;
|
||||
@@ -731,12 +731,12 @@ I64 FAT32FilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
MemSet(&long_name,0,sizeof(CDirEntry));
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
PrtLock(p);
|
||||
cur_dir_cluster=Name2DirCluster(p,cur_dir);
|
||||
buf =MAlloc(BLK_SIZE*p->spc);
|
||||
last_buf=CAlloc(BLK_SIZE*p->spc);
|
||||
entries_per_cluster=p->spc<<FAT32_ENTRIES_BITS;
|
||||
RClusters(p,buf,cur_dir_cluster,1);
|
||||
DrvLock(dv);
|
||||
cur_dir_cluster=Name2DirCluster(dv,cur_dir);
|
||||
buf =MAlloc(BLK_SIZE*dv->spc);
|
||||
last_buf=CAlloc(BLK_SIZE*dv->spc);
|
||||
entries_per_cluster=dv->spc<<FAT32_ENTRIES_BITS;
|
||||
RClusters(dv,buf,cur_dir_cluster,1);
|
||||
cur_dir_entry=0;
|
||||
while (ch=*buf[cur_dir_entry].name) {
|
||||
attr=buf[cur_dir_entry].attr;
|
||||
@@ -760,8 +760,8 @@ I64 FAT32FilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
buf[cur_dir_entry-i].attr&RS_ATTR_LONG_NAME_MASK==RS_ATTR_LONG_NAME)
|
||||
*buf[cur_dir_entry-i++].name=0xE5;
|
||||
i--;
|
||||
WBlks(p,&buf[(cur_dir_entry-i)&-FAT32_ENTRIES_PER_BLK],
|
||||
p->data+cur_dir_cluster*p->spc
|
||||
WBlks(dv,&buf[(cur_dir_entry-i)&-FAT32_ENTRIES_PER_BLK],
|
||||
dv->data_area+cur_dir_cluster*dv->spc
|
||||
+(cur_dir_entry-i)>>FAT32_ENTRIES_BITS,
|
||||
(i+FAT32_ENTRIES_PER_BLK)>>FAT32_ENTRIES_BITS);
|
||||
if (i==cur_dir_entry && last_dir_cluster!=INVALID_CLUSTER) {
|
||||
@@ -770,12 +770,12 @@ I64 FAT32FilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
last_buf[entries_per_cluster-i].attr&RS_ATTR_LONG_NAME_MASK==RS_ATTR_LONG_NAME)
|
||||
*last_buf[entries_per_cluster-i++].name=0xE5;
|
||||
if (--i>0)
|
||||
WBlks(p,&buf[(entries_per_cluster-i)&-FAT32_ENTRIES_PER_BLK],
|
||||
p->data+last_dir_cluster*p->spc
|
||||
WBlks(dv,&buf[(entries_per_cluster-i)&-FAT32_ENTRIES_PER_BLK],
|
||||
dv->data_area+last_dir_cluster*dv->spc
|
||||
+(entries_per_cluster-i)>>FAT32_ENTRIES_BITS,
|
||||
(i+FAT32_ENTRIES_PER_BLK-1)>>FAT32_ENTRIES_BITS);
|
||||
}
|
||||
FAT32FreeClusters(p,buf[cur_dir_entry].cluster_lo+
|
||||
FAT32FreeClusters(dv,buf[cur_dir_entry].cluster_lo+
|
||||
buf[cur_dir_entry].cluster_hi<<16);
|
||||
}
|
||||
}
|
||||
@@ -785,26 +785,26 @@ I64 FAT32FilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
MemSet(&long_name,0,sizeof(CDirEntry));
|
||||
if (++cur_dir_entry==entries_per_cluster) {
|
||||
last_dir_cluster=cur_dir_cluster;
|
||||
cur_dir_cluster=ClusterNumNext(p,cur_dir_cluster,1);
|
||||
cur_dir_cluster=ClusterNumNext(dv,cur_dir_cluster,1);
|
||||
temp_buf=buf; buf=last_buf; last_buf=temp_buf;
|
||||
RClusters(p,buf,cur_dir_cluster,1);
|
||||
RClusters(dv,buf,cur_dir_cluster,1);
|
||||
cur_dir_entry=0;
|
||||
}
|
||||
}
|
||||
Free(buf);
|
||||
Free(last_buf);
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
} catch {
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
I64 FAT32FileWrite(CPrt *p,U8 *cur_dir,U8 *name,U8 *buf,I64 size,
|
||||
I64 FAT32FileWrite(CDrv *dv,U8 *cur_dir,U8 *name,U8 *buf,I64 size,
|
||||
CDate cdt,I64 attr)
|
||||
{
|
||||
CDirEntry de;
|
||||
@@ -812,34 +812,34 @@ I64 FAT32FileWrite(CPrt *p,U8 *cur_dir,U8 *name,U8 *buf,I64 size,
|
||||
Bool contiguous;
|
||||
MemSet(&de,0,sizeof(CDirEntry));
|
||||
if (size<0) size=0;
|
||||
if (p->type!=PT_FAT32)
|
||||
PrintErr("Not FAT32 Partition\n");
|
||||
if (dv->type!=DVT_FAT32)
|
||||
PrintErr("Not FAT32 Drv\n");
|
||||
else if (!CFileNameTo(de.name,name))
|
||||
PrintErr("Invalid FileName.\n");
|
||||
else {
|
||||
FAT32FilesDel(p,cur_dir,de.name,0,FALSE,FALSE);
|
||||
FAT32FilesDel(dv,cur_dir,de.name,0,FALSE,FALSE);
|
||||
if (attr & RS_ATTR_CONTIGUOUS)
|
||||
contiguous=TRUE;
|
||||
else
|
||||
contiguous=FALSE;
|
||||
de.size=size;
|
||||
if (blk_cnt=(size+BLK_SIZE-1)>>BLK_SIZE_BITS)
|
||||
c=ClustersAlloc(p,0,(blk_cnt+p->spc-1)/p->spc,contiguous);
|
||||
c=ClustersAlloc(dv,0,(blk_cnt+dv->spc-1)/dv->spc,contiguous);
|
||||
else
|
||||
c=0x0FFFFFFF;
|
||||
de.cluster=c;
|
||||
de.attr=attr;
|
||||
de.datetime=cdt;
|
||||
if (blk_cnt)
|
||||
WClustersBlks(p,buf,c,blk_cnt);
|
||||
FAT32DirNew(p,cur_dir,&de,TRUE);
|
||||
WClustersBlks(dv,buf,c,blk_cnt);
|
||||
FAT32DirNew(dv,cur_dir,&de,TRUE);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
CDirEntry *FAT32FilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL,I64 *_dir_size=NULL)
|
||||
{
|
||||
CPrt *p=Fs->cur_prt;
|
||||
CDrv *dv=Fs->cur_dv;
|
||||
CFAT32DirEntry *buf;
|
||||
I64 attr,xsum=0,dir_size=0,sub_dir_size,
|
||||
cur_dir_cluster,cur_dir_entry,entries_per_cluster;
|
||||
@@ -849,12 +849,12 @@ CDirEntry *FAT32FilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NU
|
||||
throw('FUF');
|
||||
try {
|
||||
MemSet(&long_name,0,sizeof(CDirEntry));
|
||||
PrtLock(p);
|
||||
cur_dir_cluster=Name2DirCluster(p,Fs->cur_dir);
|
||||
buf=MAlloc(BLK_SIZE*p->spc);
|
||||
entries_per_cluster=p->spc<<FAT32_ENTRIES_BITS;
|
||||
RClusters(Fs->cur_prt,buf,cur_dir_cluster,1);
|
||||
dir_size+=Fs->cur_prt->spc*BLK_SIZE;
|
||||
DrvLock(dv);
|
||||
cur_dir_cluster=Name2DirCluster(dv,Fs->cur_dir);
|
||||
buf=MAlloc(BLK_SIZE*dv->spc);
|
||||
entries_per_cluster=dv->spc<<FAT32_ENTRIES_BITS;
|
||||
RClusters(Fs->cur_dv,buf,cur_dir_cluster,1);
|
||||
dir_size+=Fs->cur_dv->spc*BLK_SIZE;
|
||||
cur_dir_entry=0;
|
||||
while (ch=*buf[cur_dir_entry].name) {
|
||||
attr=buf[cur_dir_entry].attr;
|
||||
@@ -874,13 +874,13 @@ CDirEntry *FAT32FilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NU
|
||||
tempde->next=result;
|
||||
result=tempde;
|
||||
tempde->full_name=DirNameAbs(tempde->name);
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (Cd(tempde->name)) {
|
||||
tempde->sub=FAT32FilesFind(files_find_mask,fuf_flags,tempde,&sub_dir_size);
|
||||
tempde->size=sub_dir_size;
|
||||
Cd("..");
|
||||
}
|
||||
PrtLock(p);
|
||||
DrvLock(dv);
|
||||
} else if ((attr&RS_ATTR_DIR || !Bt(&fuf_flags,FUf_JUST_DIRS)) &&
|
||||
!(Bt(&fuf_flags,FUf_RECURSE) && *tempde->name=='.' && attr&RS_ATTR_DIR) &&
|
||||
FilesFindMatch(tempde->name,files_find_mask,fuf_flags)) {
|
||||
@@ -897,29 +897,29 @@ CDirEntry *FAT32FilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NU
|
||||
} else
|
||||
MemSet(&long_name,0,sizeof(CDirEntry));
|
||||
if (++cur_dir_entry==entries_per_cluster) {
|
||||
cur_dir_cluster=ClusterNumNext(p,cur_dir_cluster);
|
||||
cur_dir_cluster=ClusterNumNext(dv,cur_dir_cluster);
|
||||
if (cur_dir_cluster==INVALID_CLUSTER)
|
||||
break;
|
||||
else {
|
||||
RClusters(p,buf,cur_dir_cluster,1);
|
||||
dir_size+=Fs->cur_prt->spc*BLK_SIZE;
|
||||
RClusters(dv,buf,cur_dir_cluster,1);
|
||||
dir_size+=Fs->cur_dv->spc*BLK_SIZE;
|
||||
cur_dir_entry=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
Free(buf);
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (_dir_size)
|
||||
*_dir_size=dir_size;
|
||||
return result;
|
||||
}
|
||||
|
||||
Bool FAT32MkDir(CPrt *p,U8 *cur_dir,U8 *name)
|
||||
Bool FAT32MkDir(CDrv *dv,U8 *cur_dir,U8 *name)
|
||||
{
|
||||
I64 size=p->spc<<BLK_SIZE_BITS,c,
|
||||
cur_dir_cluster=Name2DirCluster(p,cur_dir);
|
||||
I64 size=dv->spc<<BLK_SIZE_BITS,c,
|
||||
cur_dir_cluster=Name2DirCluster(dv,cur_dir);
|
||||
U8 *buf=CAlloc(size);
|
||||
CDirEntry d_native;
|
||||
CFAT32DirEntry *dFAT=buf;
|
||||
@@ -927,7 +927,7 @@ Bool FAT32MkDir(CPrt *p,U8 *cur_dir,U8 *name)
|
||||
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
c=FileWrite(name,buf,size,0,RS_ATTR_DIR,FALSE);
|
||||
c=FileWrite(name,buf,size,0,RS_ATTR_DIR);
|
||||
MemSet(&d_native,0,sizeof(CDirEntry));
|
||||
d_native.attr=RS_ATTR_DIR;
|
||||
*d_native.name='.';
|
||||
@@ -947,7 +947,7 @@ Bool FAT32MkDir(CPrt *p,U8 *cur_dir,U8 *name)
|
||||
d_native.size=0;
|
||||
d_native.datetime=Now;
|
||||
FAT32DirFill(dFAT,&d_native);
|
||||
WClusters(p,buf,c,1);
|
||||
WClusters(dv,buf,c,1);
|
||||
Free(buf);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
|
||||
@@ -2,57 +2,57 @@
|
||||
//ISO2 is ISO13490
|
||||
//ISO3 is ISO13346
|
||||
|
||||
Bool ISOPrtInit(CPrt *p,I64 blk)
|
||||
Bool ISODrvInit(CDrv *dv,I64 blk)
|
||||
{
|
||||
CBlkDev *bdev=p->bdev;
|
||||
I64 spc=bdev->blk_size>>BLK_SIZE_BITS,i=blk/spc;
|
||||
CISO1PriDesc *iso=MAlloc(bdev->blk_size);
|
||||
CBlkDev *bd=dv->bd;
|
||||
I64 spc=bd->blk_size>>BLK_SIZE_BITS,i=blk/spc;
|
||||
CISO1PriDesc *iso=MAlloc(bd->blk_size);
|
||||
CISO1DirEntry *de;
|
||||
Bool unlock,result=FALSE;
|
||||
U8 buf[8];
|
||||
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
p->type=PT_ISO9660; //default
|
||||
p->spc=spc;
|
||||
p->offset=p->data=p->root_cluster=p->size=0;
|
||||
unlock=DrvLock(dv);
|
||||
dv->type=DVT_ISO9660; //default
|
||||
dv->spc=spc;
|
||||
dv->base_offset=dv->data_area=dv->root_cluster=dv->size=0;
|
||||
while (TRUE) {
|
||||
p->size=MaxI64(p->size,(i+1)*spc);
|
||||
RBlks(p,iso,i*spc,spc);
|
||||
dv->size=MaxI64(dv->size,(i+1)*spc);
|
||||
RBlks(dv,iso,i*spc,spc);
|
||||
buf[0](U32)=iso->id[0](U32);
|
||||
buf[4](U16)=iso->id[4](U8);
|
||||
switch (LstMatch(buf,"CD001\0CDW02\0BEA01\0BOOT2\0NSR02\0NSR03\0TEA01\0",LMF_EXACT)) {
|
||||
case 0:
|
||||
p->type=PT_ISO9660;
|
||||
dv->type=DVT_ISO9660;
|
||||
switch (iso->type) {
|
||||
case ISO1T_SUPPLEMENTARY_DESC:
|
||||
p->data=0;
|
||||
dv->data_area=0;
|
||||
de=&iso->root_dir_record;
|
||||
p->root_cluster=de->loc.little;
|
||||
p->size=iso->vol_space_size.little*bdev->blk_size>>BLK_SIZE_BITS;
|
||||
dv->root_cluster=de->loc.little;
|
||||
dv->size=iso->vol_space_size.little*bd->blk_size>>BLK_SIZE_BITS;
|
||||
result=TRUE;
|
||||
goto ipi_done;
|
||||
case ISO1T_TERMINATOR:
|
||||
throw('Prt');
|
||||
throw('Drv');
|
||||
}
|
||||
break;
|
||||
default: //Its normal for ISO13346 to read NULL blk as terminator
|
||||
PrintErr("File System Not Supported\n");
|
||||
throw('Prt');
|
||||
throw('Drv');
|
||||
}
|
||||
i++;
|
||||
}
|
||||
ipi_done:
|
||||
Free(iso);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch {
|
||||
p->type=PT_ISO9660;
|
||||
p->spc=spc;
|
||||
p->offset=p->data=p->root_cluster=0;
|
||||
dv->type=DVT_ISO9660;
|
||||
dv->spc=spc;
|
||||
dv->base_offset=dv->data_area=dv->root_cluster=0;
|
||||
Free(iso);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -126,7 +126,7 @@ Bool ISO1CDirFill(CDirEntry *tempde,CISO1DirEntry *de)
|
||||
return result;
|
||||
}
|
||||
|
||||
Bool ISO1FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0)
|
||||
Bool ISO1FileFind(CDrv *dv,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0)
|
||||
{//$LK,"FUF_JUST_DIRS",A="MN:FUF_JUST_DIRS"$, $LK,"FUF_JUST_FILES",A="MN:FUF_JUST_FILES"$
|
||||
CISO1DirEntry *isoptr,*buf;
|
||||
U8 dname[CDIR_FILENAME_LEN];
|
||||
@@ -134,24 +134,24 @@ Bool ISO1FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fu
|
||||
I64 i;
|
||||
if (fuf_flags&~FUG_FILE_FIND)
|
||||
throw('FUF');
|
||||
PrtChk(p);
|
||||
if (p->type!=PT_ISO9660)
|
||||
PrintErr("Not ISO9660 Partition\n");
|
||||
DrvChk(dv);
|
||||
if (dv->type!=DVT_ISO9660)
|
||||
PrintErr("Not ISO9660 Drv\n");
|
||||
else
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
isoptr=MAlloc(p->spc<<BLK_SIZE_BITS);
|
||||
RClusters(Fs->cur_prt,isoptr,cur_dir_cluster,1);
|
||||
unlock=DrvLock(dv);
|
||||
isoptr=MAlloc(dv->spc<<BLK_SIZE_BITS);
|
||||
RClusters(Fs->cur_dv,isoptr,cur_dir_cluster,1);
|
||||
if (isoptr->name_len==1 && !isoptr->name) {//curdir
|
||||
i=(isoptr->size.little+p->spc<<BLK_SIZE_BITS-1)/p->spc<<BLK_SIZE_BITS;
|
||||
buf=MAlloc(p->spc<<BLK_SIZE_BITS*i);
|
||||
RClusters(Fs->cur_prt,buf,cur_dir_cluster,i);
|
||||
i=(isoptr->size.little+dv->spc<<BLK_SIZE_BITS-1)/dv->spc<<BLK_SIZE_BITS;
|
||||
buf=MAlloc(dv->spc<<BLK_SIZE_BITS*i);
|
||||
RClusters(Fs->cur_dv,buf,cur_dir_cluster,i);
|
||||
Free(isoptr);
|
||||
} else {
|
||||
buf=isoptr;
|
||||
i=1;
|
||||
}
|
||||
i*=p->spc<<BLK_SIZE_BITS;
|
||||
i*=dv->spc<<BLK_SIZE_BITS;
|
||||
isoptr=buf;
|
||||
while (i>0) {
|
||||
if (!isoptr->len) {
|
||||
@@ -163,9 +163,9 @@ Bool ISO1FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fu
|
||||
if (!StrCmp(name,dname)) {
|
||||
result=ISO1CDirFill(_result,isoptr);
|
||||
if (result &&
|
||||
!(fuf_flags&FUF_JUST_DIRS && !(_result->attr & RS_ATTR_DIR)) &&
|
||||
!(fuf_flags&FUF_JUST_FILES && _result->attr & RS_ATTR_DIR) )
|
||||
goto exit_this;
|
||||
!(fuf_flags&FUF_JUST_DIRS && !(_result->attr & RS_ATTR_DIR)) &&
|
||||
!(fuf_flags&FUF_JUST_FILES && _result->attr & RS_ATTR_DIR) )
|
||||
goto iff_done;
|
||||
else
|
||||
result=FALSE;
|
||||
}
|
||||
@@ -174,51 +174,51 @@ Bool ISO1FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fu
|
||||
isoptr(U8 *)+=isoptr->len;
|
||||
}
|
||||
}
|
||||
exit_this:
|
||||
iff_done:
|
||||
Free(buf);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *ISO1FileRead(CPrt *p,U8 *cur_dir,U8 *filename,I64 *_size,I64 *_attr)
|
||||
U8 *ISO1FileRead(CDrv *dv,U8 *cur_dir,U8 *filename,I64 *_size,I64 *_attr)
|
||||
{
|
||||
U8 *buf=NULL;
|
||||
CDirEntry de;
|
||||
I64 c,blk_cnt,cur_dir_cluster;
|
||||
PrtChk(p);
|
||||
DrvChk(dv);
|
||||
*_size=0;
|
||||
*_attr=0;
|
||||
if (p->type!=PT_ISO9660)
|
||||
PrintErr("Not ISO9660 Partition\n");
|
||||
if (dv->type!=DVT_ISO9660)
|
||||
PrintErr("Not ISO9660 Drv\n");
|
||||
else
|
||||
try {
|
||||
PrtLock(p);
|
||||
cur_dir_cluster=Name2DirCluster(p,cur_dir);
|
||||
if (ISO1FileFind(p,cur_dir_cluster,filename,&de,FUF_JUST_FILES)) {
|
||||
DrvLock(dv);
|
||||
cur_dir_cluster=Name2DirCluster(dv,cur_dir);
|
||||
if (ISO1FileFind(dv,cur_dir_cluster,filename,&de,FUF_JUST_FILES)) {
|
||||
blk_cnt=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS;
|
||||
buf=MAlloc(blk_cnt<<BLK_SIZE_BITS+1);
|
||||
c=de.cluster;
|
||||
c=RClustersBlks(p,buf,c,blk_cnt);
|
||||
c=RClustersBlks(dv,buf,c,blk_cnt);
|
||||
buf[de.size]=0; //Terminate
|
||||
*_size=de.size;
|
||||
*_attr=FileAttr(de.name,de.attr);
|
||||
}
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
return buf;
|
||||
}
|
||||
|
||||
Bool ISO1Cd(U8 *name,I64 cur_dir_cluster)
|
||||
{
|
||||
CDirEntry de;
|
||||
if (Fs->cur_prt->type!=PT_ISO9660)
|
||||
PrintErr("Not ISO9660 Partition\n");
|
||||
else if (ISO1FileFind(Fs->cur_prt,cur_dir_cluster,name,&de,FUF_JUST_DIRS))
|
||||
if (Fs->cur_dv->type!=DVT_ISO9660)
|
||||
PrintErr("Not ISO9660 Drv\n");
|
||||
else if (ISO1FileFind(Fs->cur_dv,cur_dir_cluster,name,&de,FUF_JUST_DIRS))
|
||||
return TRUE;
|
||||
else {
|
||||
"%s ",name;
|
||||
@@ -229,25 +229,25 @@ Bool ISO1Cd(U8 *name,I64 cur_dir_cluster)
|
||||
|
||||
CDirEntry *ISO1FilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL)
|
||||
{
|
||||
CPrt *p=Fs->cur_prt;
|
||||
CDrv *dv=Fs->cur_dv;
|
||||
CISO1DirEntry *buf,*buf2,*isoptr;
|
||||
I64 i,cur_dir_cluster=Name2DirCluster(p,Fs->cur_dir);
|
||||
I64 i,cur_dir_cluster=Name2DirCluster(dv,Fs->cur_dir);
|
||||
CDirEntry *result=NULL,*tempde;
|
||||
if (fuf_flags&~FUG_FILES_FIND)
|
||||
throw('FUF');
|
||||
isoptr=MAlloc(p->spc<<BLK_SIZE_BITS);
|
||||
RClusters(Fs->cur_prt,isoptr,cur_dir_cluster,1);
|
||||
isoptr=MAlloc(dv->spc<<BLK_SIZE_BITS);
|
||||
RClusters(Fs->cur_dv,isoptr,cur_dir_cluster,1);
|
||||
if (isoptr->name_len==1 && !isoptr->name) {//curdir
|
||||
i=(isoptr->size.little+p->spc<<BLK_SIZE_BITS-1)/p->spc<<BLK_SIZE_BITS;
|
||||
buf=MAlloc(p->spc<<BLK_SIZE_BITS*i);
|
||||
RClusters(Fs->cur_prt,buf,cur_dir_cluster,i);
|
||||
i=(isoptr->size.little+dv->spc<<BLK_SIZE_BITS-1)/dv->spc<<BLK_SIZE_BITS;
|
||||
buf=MAlloc(dv->spc<<BLK_SIZE_BITS*i);
|
||||
RClusters(Fs->cur_dv,buf,cur_dir_cluster,i);
|
||||
Free(isoptr);
|
||||
} else {
|
||||
buf=isoptr;
|
||||
i=1;
|
||||
}
|
||||
buf2=buf;
|
||||
i*=p->spc<<BLK_SIZE_BITS;
|
||||
i*=dv->spc<<BLK_SIZE_BITS;
|
||||
while (i>0) {
|
||||
if (!buf->len) {
|
||||
buf(U8 *)++;
|
||||
+175
-174
@@ -1,41 +1,41 @@
|
||||
// See $LK,"RedSea File System",A="FI:::/Doc/RedSea.TXT"$
|
||||
|
||||
U0 RedSeaFSFreeFreeLst(CPrt *p)
|
||||
U0 RedSeaFreeFreeLst(CDrv *dv)
|
||||
{
|
||||
CFreeLst *tempf,*tempf1;
|
||||
Bool unlock;
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
if (tempf=p->next_free) {
|
||||
while (tempf!=&p->next_free) {
|
||||
unlock=DrvLock(dv);
|
||||
if (tempf=dv->next_free) {
|
||||
while (tempf!=&dv->next_free) {
|
||||
tempf1=tempf->next;
|
||||
Free(tempf);
|
||||
tempf=tempf1;
|
||||
}
|
||||
}
|
||||
p->next_free=NULL;
|
||||
dv->next_free=NULL;
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
}
|
||||
|
||||
U0 RedSeaFSFreeLstBuild(CPrt *p)
|
||||
U0 RedSeaFreeLstBuild(CDrv *dv)
|
||||
{
|
||||
Bool unlock;
|
||||
CFreeLst *tempf;
|
||||
I64 i,first=0,max_cluster=p->size+p->offset-p->data;
|
||||
I64 i,first=dv->data_area,max_blk=dv->size+dv->base_offset;
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
if (p->next_free)
|
||||
RedSeaFSFreeFreeLst(p);
|
||||
QueInit(&p->next_free);
|
||||
while (first<max_cluster) {
|
||||
unlock=DrvLock(dv);
|
||||
if (dv->next_free)
|
||||
RedSeaFreeFreeLst(dv);
|
||||
QueInit(&dv->next_free);
|
||||
while (first<max_blk) {
|
||||
i=0; //count free clusters
|
||||
while (first+i<max_cluster) {
|
||||
SetFSBuf(p,first+i);
|
||||
if (Bt(p->cur_map_blk,(first+i)&(BLK_SIZE<<3-1)))
|
||||
while (first+i<max_blk) {
|
||||
DrvMapBlkSet(dv,first+i);
|
||||
if (Bt(dv->cur_map_blk,(first+i-dv->data_area)&(BLK_SIZE<<3-1)))
|
||||
break;
|
||||
else
|
||||
i++;
|
||||
@@ -44,72 +44,73 @@ U0 RedSeaFSFreeLstBuild(CPrt *p)
|
||||
tempf=AMAlloc(sizeof(CFreeLst));
|
||||
tempf->size=i;
|
||||
tempf->start=first;
|
||||
QueIns(tempf,p->last_free);
|
||||
QueIns(tempf,dv->last_free);
|
||||
}
|
||||
first+=i+1;
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
}
|
||||
|
||||
U0 RedSeaFSPrtInit(CPrt *p)
|
||||
U0 RedSeaDrvInit(CDrv *dv)
|
||||
{
|
||||
CBootStruct br;
|
||||
CRedSeaBoot br;
|
||||
Bool unlock;
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
RBlks(p,&br,p->offset,1);
|
||||
unlock=DrvLock(dv);
|
||||
RBlks(dv,&br,dv->base_offset,1);
|
||||
if (br.signature!=MBR_PT_REDSEA || br.signature2!=0xAA55)
|
||||
throw('Prt');
|
||||
p->type=PT_REDSEA;
|
||||
RedSeaFSFreeFreeLst(p);
|
||||
p->spc=1;
|
||||
p->size=br.sects;
|
||||
p->data=p->offset+br.bitmap_sects;
|
||||
p->root_cluster=br.root_cluster;
|
||||
p->map1=p->map2=p->offset+1;
|
||||
MapBufAlloc(p,1);
|
||||
throw('Drv');
|
||||
dv->type=DVT_REDSEA;
|
||||
RedSeaFreeFreeLst(dv);
|
||||
dv->spc=1;
|
||||
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);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
}
|
||||
|
||||
Bool RedSeaFSDrvValidate(U8 drv_let)
|
||||
Bool RedSeaDrvValidate(U8 drv_let)
|
||||
{
|
||||
CPrt *p;
|
||||
CBootStruct br;
|
||||
CDrv *dv;
|
||||
CRedSeaBoot br;
|
||||
Bool result=FALSE;
|
||||
try {
|
||||
p=Drv2Prt(drv_let);
|
||||
if (p->type==PT_REDSEA && RBlks(p,&br,p->offset,1) &&
|
||||
dv=Let2Drv(drv_let);
|
||||
if (dv->type==DVT_REDSEA && RBlks(dv,&br,dv->base_offset,1) &&
|
||||
br.signature==MBR_PT_REDSEA && br.signature2==0xAA55 &&
|
||||
br.sects==p->size)
|
||||
br.sects==dv->size)
|
||||
result=TRUE;
|
||||
} catch
|
||||
Fs->catch_except=TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 RedSeaFSFmt(U8 drv_let,Bool quick=TRUE)
|
||||
U0 RedSeaFmt(U8 drv_let,Bool quick=TRUE)
|
||||
{
|
||||
U8 *root_dir;
|
||||
CDirEntry *d_native;
|
||||
CBootStruct *br=CAlloc(BLK_SIZE);
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
CRedSeaBoot *br=CAlloc(BLK_SIZE);
|
||||
CDrv *dv=Let2Drv(drv_let);
|
||||
I64 i,n;
|
||||
try {
|
||||
PrtLock(p);
|
||||
// SetDrvType(drv_let,PT_REDSEA);
|
||||
SetDrvType(drv_let,PT_FAT32);
|
||||
p->type=PT_REDSEA;
|
||||
DrvLock(dv);
|
||||
// DrvTypeSet(drv_let,DVT_REDSEA);
|
||||
DrvTypeSet(drv_let,DVT_FAT32);
|
||||
dv->type=DVT_REDSEA;
|
||||
br->signature=MBR_PT_REDSEA;
|
||||
br->signature2=0xAA55;
|
||||
br->sects=p->size;
|
||||
br->base_offset=dv->base_offset; //For CD/DVD image copy.
|
||||
br->sects=dv->size;
|
||||
n=(br->sects+BLK_SIZE<<3-1)/BLK_SIZE<<3;
|
||||
br->bitmap_sects=n;
|
||||
br->unique_id=GetTSC^Now()(U64);
|
||||
@@ -118,14 +119,14 @@ U0 RedSeaFSFmt(U8 drv_let,Bool quick=TRUE)
|
||||
if (quick)
|
||||
i=n+1;
|
||||
else
|
||||
i=p->size;
|
||||
WZeroBlks(p,p->offset,i);
|
||||
i=dv->size;
|
||||
WZeroBlks(dv,dv->base_offset,i);
|
||||
|
||||
WBlks(p,br,p->offset,1);
|
||||
RedSeaFSPrtInit(p);
|
||||
ClustersAlloc(p,0,1,FALSE); //Alloc #1
|
||||
br->root_cluster=ClustersAlloc(p,0,1,FALSE);
|
||||
WBlks(p,br,p->offset,1);
|
||||
WBlks(dv,br,dv->base_offset,1);
|
||||
RedSeaDrvInit(dv);
|
||||
ClustersAlloc(dv,0,1,FALSE); //Alloc #1
|
||||
br->root_cluster=ClustersAlloc(dv,0,1,FALSE);
|
||||
WBlks(dv,br,dv->base_offset,1);
|
||||
root_dir=CAlloc(BLK_SIZE);
|
||||
|
||||
d_native=root_dir-offset(CDirEntry.start);
|
||||
@@ -144,16 +145,16 @@ U0 RedSeaFSFmt(U8 drv_let,Bool quick=TRUE)
|
||||
d_native->cluster=br->root_cluster;
|
||||
d_native->datetime=Now;
|
||||
|
||||
WBlks(p,root_dir,p->data+br->root_cluster,1);
|
||||
RedSeaFSPrtInit(p);
|
||||
PrtUnlock(p);
|
||||
WBlks(dv,root_dir,br->root_cluster,1);
|
||||
RedSeaDrvInit(dv);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
Free(br);
|
||||
Free(root_dir);
|
||||
}
|
||||
|
||||
Bool RedSeaFSFileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0)
|
||||
Bool RedSeaFileFind(CDrv *dv,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0)
|
||||
{//$LK,"FUF_JUST_DIRS",A="MN:FUF_JUST_DIRS"$, $LK,"FUF_JUST_FILES",A="MN:FUF_JUST_FILES"$
|
||||
CDirEntry *buf,*buf2,*ptr;
|
||||
U8 dname[CDIR_FILENAME_LEN];
|
||||
@@ -162,22 +163,22 @@ Bool RedSeaFSFileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I6
|
||||
if (fuf_flags&~FUG_FILE_FIND)
|
||||
throw('FUF');
|
||||
MemSet(_result,0,sizeof(CDirEntry));
|
||||
PrtChk(p);
|
||||
if (p->type!=PT_REDSEA)
|
||||
PrintErr("Not RedSea Partition\n");
|
||||
DrvChk(dv);
|
||||
if (dv->type!=DVT_REDSEA)
|
||||
PrintErr("Not RedSea Drv\n");
|
||||
else if (!CFileNameTo(dname,name))
|
||||
PrintErr("Invalid FileName.\n");
|
||||
else
|
||||
try {
|
||||
unlock=PrtLock(p);
|
||||
unlock=DrvLock(dv);
|
||||
buf2=MAlloc(BLK_SIZE);
|
||||
RClusters(p,buf2,cur_dir_cluster,1);
|
||||
|
||||
RBlks(dv,buf2,cur_dir_cluster,1);
|
||||
|
||||
ptr=buf2(U8 *)-offset(CDirEntry.start);
|
||||
buf=MAlloc(ptr->size);
|
||||
RClustersBlks(p,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS);
|
||||
RBlks(dv,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS);
|
||||
Free(buf2);
|
||||
|
||||
|
||||
ptr=buf(U8 *)-offset(CDirEntry.start);
|
||||
*ptr->name='.';
|
||||
ptr->name[1]=0;
|
||||
@@ -185,60 +186,60 @@ Bool RedSeaFSFileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I6
|
||||
if (!(ch=*ptr->name))
|
||||
break;
|
||||
else if (!(ptr->attr & RS_ATTR_DELETED) &&
|
||||
!(fuf_flags&FUF_JUST_DIRS && !(ptr->attr & RS_ATTR_DIR)) &&
|
||||
!(fuf_flags&FUF_JUST_FILES && ptr->attr & RS_ATTR_DIR) &&
|
||||
!StrCmp(dname,ptr->name)) {
|
||||
!(fuf_flags&FUF_JUST_DIRS && !(ptr->attr & RS_ATTR_DIR)) &&
|
||||
!(fuf_flags&FUF_JUST_FILES && ptr->attr & RS_ATTR_DIR) &&
|
||||
!StrCmp(dname,ptr->name)) {
|
||||
MemCpy(&_result->attr,&ptr->attr,CDIR_SIZE);
|
||||
result=TRUE;
|
||||
goto exit_this;
|
||||
goto rsff_done;
|
||||
}
|
||||
ptr(U8 *)+=CDIR_SIZE;
|
||||
}
|
||||
exit_this:
|
||||
rsff_done:
|
||||
Free(buf);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *RedSeaFSFileRead(CPrt *p,U8 *cur_dir,U8 *filename,I64 *_size,I64 *_attr)
|
||||
U8 *RedSeaFileRead(CDrv *dv,U8 *cur_dir,U8 *filename,I64 *_size,I64 *_attr)
|
||||
{
|
||||
U8 *buf=NULL;
|
||||
CDirEntry de;
|
||||
I64 c,blk_cnt,cur_dir_cluster;
|
||||
PrtChk(p);
|
||||
DrvChk(dv);
|
||||
*_size=0;
|
||||
*_attr=0;
|
||||
if (p->type!=PT_REDSEA)
|
||||
PrintErr("Not RedSea Partition\n");
|
||||
if (dv->type!=DVT_REDSEA)
|
||||
PrintErr("Not RedSea Drv\n");
|
||||
else
|
||||
try {
|
||||
PrtLock(p);
|
||||
cur_dir_cluster=Name2DirCluster(p,cur_dir);
|
||||
if (RedSeaFSFileFind(p,cur_dir_cluster,filename,&de,FUF_JUST_FILES)) {
|
||||
DrvLock(dv);
|
||||
cur_dir_cluster=Name2DirCluster(dv,cur_dir);
|
||||
if (RedSeaFileFind(dv,cur_dir_cluster,filename,&de,FUF_JUST_FILES)) {
|
||||
blk_cnt=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS;
|
||||
buf=MAlloc(blk_cnt<<BLK_SIZE_BITS+1);
|
||||
c=de.cluster;
|
||||
c=RClustersBlks(p,buf,c,blk_cnt);
|
||||
c=RBlks(dv,buf,c,blk_cnt);
|
||||
buf[de.size]=0; //Terminate
|
||||
*_size=de.size;
|
||||
*_attr=FileAttr(de.name,de.attr);
|
||||
}
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
return buf;
|
||||
}
|
||||
|
||||
Bool RedSeaFSCd(U8 *name,I64 cur_dir_cluster)
|
||||
Bool RedSeaCd(U8 *name,I64 cur_dir_cluster)
|
||||
{
|
||||
CDirEntry de;
|
||||
if (Fs->cur_prt->type!=PT_REDSEA)
|
||||
PrintErr("Not RedSea Partition\n");
|
||||
else if (RedSeaFSFileFind(Fs->cur_prt,cur_dir_cluster,name,&de,FUF_JUST_DIRS))
|
||||
if (Fs->cur_dv->type!=DVT_REDSEA)
|
||||
PrintErr("Not RedSea Drv\n");
|
||||
else if (RedSeaFileFind(Fs->cur_dv,cur_dir_cluster,name,&de,FUF_JUST_DIRS))
|
||||
return TRUE;
|
||||
else {
|
||||
"%s ",name;
|
||||
@@ -247,22 +248,22 @@ Bool RedSeaFSCd(U8 *name,I64 cur_dir_cluster)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
U0 RedSeaFSFreeClusters(CPrt *p,I64 c,I64 cnt)
|
||||
U0 RedSeaFreeClusters(CDrv *dv,I64 c,I64 cnt)
|
||||
{
|
||||
CFreeLst *tempf;
|
||||
Bool found=FALSE,unlock,unlock_break;
|
||||
PrtChk(p);
|
||||
DrvChk(dv);
|
||||
if (!c) return;
|
||||
if (p->type!=PT_REDSEA)
|
||||
PrintErr("Not RedSea Partition\n");
|
||||
if (dv->type!=DVT_REDSEA)
|
||||
PrintErr("Not RedSea Drv\n");
|
||||
else
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
unlock=PrtLock(p);
|
||||
if (!p->next_free)
|
||||
RedSeaFSFreeLstBuild(p);
|
||||
tempf=p->next_free;
|
||||
while (!found && tempf!=&p->next_free) {
|
||||
unlock=DrvLock(dv);
|
||||
if (!dv->next_free)
|
||||
RedSeaFreeLstBuild(dv);
|
||||
tempf=dv->next_free;
|
||||
while (!found && tempf!=&dv->next_free) {
|
||||
if (tempf->start+tempf->size==c) {
|
||||
tempf->size+=cnt;
|
||||
found=TRUE;
|
||||
@@ -277,42 +278,42 @@ U0 RedSeaFSFreeClusters(CPrt *p,I64 c,I64 cnt)
|
||||
tempf=AMAlloc(sizeof(CFreeLst));
|
||||
tempf->size=cnt;
|
||||
tempf->start=c;
|
||||
QueIns(tempf,p->last_free);
|
||||
QueIns(tempf,dv->last_free);
|
||||
}
|
||||
while (cnt-->0) {
|
||||
SetFSBuf(p,c);
|
||||
LBtr(p->cur_map_blk,c&(BLK_SIZE<<3-1));
|
||||
LBts(p->buffered_map_dirty_bits,0);
|
||||
DrvMapBlkSet(dv,c);
|
||||
LBtr(dv->cur_map_blk,(c-dv->data_area)&(BLK_SIZE<<3-1));
|
||||
LBts(&dv->map_blk_dirty,0);
|
||||
c++;
|
||||
}
|
||||
CleanMAPBuf(p);
|
||||
DrvMapBlkClean(dv);
|
||||
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
} catch {
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
}
|
||||
}
|
||||
|
||||
I64 RedSeaFSAllocClusters(CPrt *p,I64 cnt)
|
||||
I64 RedSeaAllocClusters(CDrv *dv,I64 cnt)
|
||||
{
|
||||
CFreeLst *tempf,*best_free=NULL;
|
||||
I64 i,first,best_size=MAX_I64;
|
||||
Bool unlock,unlock_break;
|
||||
if (cnt<=0)
|
||||
Dbg;
|
||||
throw('Drv');
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
unlock=PrtLock(p);
|
||||
if (!p->next_free)
|
||||
RedSeaFSFreeLstBuild(p);
|
||||
tempf=p->next_free;
|
||||
while (tempf!=&p->next_free) {
|
||||
unlock=DrvLock(dv);
|
||||
if (!dv->next_free)
|
||||
RedSeaFreeLstBuild(dv);
|
||||
tempf=dv->next_free;
|
||||
while (tempf!=&dv->next_free) {
|
||||
if (tempf->size>=cnt && tempf->size<best_size) {
|
||||
best_free=tempf;
|
||||
best_size=tempf->size;
|
||||
@@ -322,14 +323,14 @@ I64 RedSeaFSAllocClusters(CPrt *p,I64 cnt)
|
||||
tempf=tempf->next;
|
||||
}
|
||||
if (!best_free)
|
||||
Dbg;
|
||||
throw('Drv');
|
||||
first=best_free->start;
|
||||
for (i=0;i<cnt;i++) {
|
||||
SetFSBuf(p,first+i);
|
||||
LBts(p->cur_map_blk,(first+i)&(BLK_SIZE<<3-1));
|
||||
LBts(p->buffered_map_dirty_bits,0);
|
||||
DrvMapBlkSet(dv,first+i);
|
||||
LBts(dv->cur_map_blk,(first+i-dv->data_area)&(BLK_SIZE<<3-1));
|
||||
LBts(&dv->map_blk_dirty,0);
|
||||
}
|
||||
CleanMAPBuf(p);
|
||||
DrvMapBlkClean(dv);
|
||||
if (best_free->size-=cnt)
|
||||
best_free->start+=cnt;
|
||||
else {
|
||||
@@ -337,36 +338,36 @@ I64 RedSeaFSAllocClusters(CPrt *p,I64 cnt)
|
||||
Free(best_free);
|
||||
}
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
} catch {
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
}
|
||||
return first;
|
||||
}
|
||||
|
||||
Bool RedSeaFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain)
|
||||
Bool RedSeaDirNew(CDrv *dv,U8 *cur_dir,CDirEntry *de,Bool free_old_chain)
|
||||
{
|
||||
CDirEntry *buf,*buf2,*ptr,de2;
|
||||
CBootStruct *br;
|
||||
CRedSeaBoot *br;
|
||||
I64 c,ch,i=1,j=0,n=BLK_SIZE/CDIR_SIZE,dir_size,cur_dir_cluster;
|
||||
Bool written=FALSE,unlock,unlock_break;
|
||||
U8 *temp,*parent_dir;
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
de->attr|=RS_ATTR_CONTIGUOUS;
|
||||
unlock=PrtLock(p);
|
||||
cur_dir_cluster=Name2DirCluster(p,cur_dir);
|
||||
unlock=DrvLock(dv);
|
||||
cur_dir_cluster=Name2DirCluster(dv,cur_dir);
|
||||
buf2=MAlloc(BLK_SIZE);
|
||||
RClusters(p,buf2,cur_dir_cluster,1);
|
||||
RBlks(dv,buf2,cur_dir_cluster,1);
|
||||
|
||||
ptr=buf2(U8 *)-offset(CDirEntry.start);
|
||||
buf=MAlloc(ptr->size);
|
||||
RClustersBlks(p,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS);
|
||||
RBlks(dv,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS);
|
||||
|
||||
dir_size=ptr->size;
|
||||
ptr=buf(U8 *)-offset(CDirEntry.start)+CDIR_SIZE;
|
||||
@@ -376,26 +377,26 @@ Bool RedSeaFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain)
|
||||
if (!written)
|
||||
MemCpy(&ptr->start,&de->start,CDIR_SIZE);
|
||||
if ((i+1)*CDIR_SIZE+j<<BLK_SIZE_BITS<dir_size)
|
||||
WBlks(p,buf(U8 *)+j<<BLK_SIZE_BITS,p->data+cur_dir_cluster+j,1);
|
||||
WBlks(dv,buf(U8 *)+j<<BLK_SIZE_BITS,cur_dir_cluster+j,1);
|
||||
else {
|
||||
buf2=CAlloc(dir_size+BLK_SIZE);
|
||||
MemCpy(buf2,buf,dir_size);
|
||||
RedSeaFSFreeClusters(p,cur_dir_cluster,dir_size>>BLK_SIZE_BITS);
|
||||
RedSeaFreeClusters(dv,cur_dir_cluster,dir_size>>BLK_SIZE_BITS);
|
||||
dir_size+=BLK_SIZE;
|
||||
c=ClustersAlloc(p,0,dir_size>>BLK_SIZE_BITS,TRUE);
|
||||
c=ClustersAlloc(dv,0,dir_size>>BLK_SIZE_BITS,TRUE);
|
||||
Free(buf);
|
||||
buf=buf2;
|
||||
ptr=buf(U8 *)-offset(CDirEntry.start);
|
||||
ptr->size=dir_size;
|
||||
ptr->cluster=c;
|
||||
WClustersBlks(p,buf,c,dir_size>>BLK_SIZE_BITS);
|
||||
if (cur_dir_cluster==p->root_cluster) {
|
||||
WBlks(dv,buf,c,dir_size>>BLK_SIZE_BITS);
|
||||
if (cur_dir_cluster==dv->root_cluster) {
|
||||
br=CAlloc(BLK_SIZE);
|
||||
RBlks(p,br,p->offset,1);
|
||||
RBlks(dv,br,dv->base_offset,1);
|
||||
br->root_cluster=c;
|
||||
WBlks(p,br,p->offset,1);
|
||||
WBlks(dv,br,dv->base_offset,1);
|
||||
Free(br);
|
||||
p->root_cluster=c;
|
||||
dv->root_cluster=c;
|
||||
} else {
|
||||
temp=StrNew(cur_dir);
|
||||
parent_dir=StrNew(cur_dir);
|
||||
@@ -404,13 +405,13 @@ Bool RedSeaFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain)
|
||||
Free(parent_dir);
|
||||
parent_dir=StrNew("/");
|
||||
}
|
||||
if (RedSeaFSFileFind(p,Name2DirCluster(p,parent_dir),
|
||||
if (RedSeaFileFind(dv,Name2DirCluster(dv,parent_dir),
|
||||
temp,&de2,FUF_JUST_DIRS)) {
|
||||
de2.cluster=c;
|
||||
de2.size=dir_size;
|
||||
RedSeaFSDirNew(p,parent_dir,&de2,FALSE);
|
||||
RedSeaDirNew(dv,parent_dir,&de2,FALSE);
|
||||
} else
|
||||
Dbg;
|
||||
throw('Drv');
|
||||
Free(temp);
|
||||
Free(parent_dir);
|
||||
}
|
||||
@@ -419,19 +420,19 @@ Bool RedSeaFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain)
|
||||
} else if (ptr->attr & RS_ATTR_DELETED) {
|
||||
if (!written) {
|
||||
MemCpy(&ptr->start,&de->start,CDIR_SIZE);
|
||||
WBlks(p,buf(U8 *)+j<<BLK_SIZE_BITS,p->data+cur_dir_cluster+j,1);
|
||||
WBlks(dv,buf(U8 *)+j<<BLK_SIZE_BITS,cur_dir_cluster+j,1);
|
||||
written=TRUE;
|
||||
}
|
||||
} else {
|
||||
if (!StrCmp(de->name,ptr->name)) {
|
||||
if (free_old_chain)
|
||||
RedSeaFSFreeClusters(p,ptr->cluster,
|
||||
RedSeaFreeClusters(dv,ptr->cluster,
|
||||
(ptr->size+BLK_SIZE-1)>>BLK_SIZE_BITS);
|
||||
if (!written)
|
||||
MemCpy(&ptr->start,&de->start,CDIR_SIZE);
|
||||
else
|
||||
ptr->attr|=RS_ATTR_DELETED;
|
||||
WBlks(p,buf(U8 *)+j<<BLK_SIZE_BITS,p->data+cur_dir_cluster+j,1);
|
||||
WBlks(dv,buf(U8 *)+j<<BLK_SIZE_BITS,cur_dir_cluster+j,1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -443,19 +444,19 @@ Bool RedSeaFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain)
|
||||
}
|
||||
Free(buf);
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
} catch {
|
||||
if (unlock)
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
I64 RedSeaFSFilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
I64 RedSeaFilesDel(CDrv *dv,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
Bool del_dir,Bool print_msg)
|
||||
{
|
||||
CDirEntry *buf,*buf2,*ptr;
|
||||
@@ -463,14 +464,14 @@ I64 RedSeaFSFilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
Bool unlock_break;
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
PrtLock(p);
|
||||
cur_dir_cluster=Name2DirCluster(p,cur_dir);
|
||||
DrvLock(dv);
|
||||
cur_dir_cluster=Name2DirCluster(dv,cur_dir);
|
||||
buf2=MAlloc(BLK_SIZE);
|
||||
RClusters(p,buf2,cur_dir_cluster,1);
|
||||
RBlks(dv,buf2,cur_dir_cluster,1);
|
||||
|
||||
ptr=buf2(U8 *)-offset(CDirEntry.start);
|
||||
buf=MAlloc(ptr->size);
|
||||
RClustersBlks(p,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS);
|
||||
RBlks(dv,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS);
|
||||
Free(buf2);
|
||||
|
||||
ptr=buf(U8 *)-offset(CDirEntry.start);
|
||||
@@ -486,8 +487,8 @@ I64 RedSeaFSFilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
if (print_msg)
|
||||
"Del %s\n",ptr->name;
|
||||
ptr->attr|=RS_ATTR_DELETED;
|
||||
WBlks(p,buf(U8 *)+j<<BLK_SIZE_BITS,p->data+cur_dir_cluster+j,1);
|
||||
RedSeaFSFreeClusters(p,ptr->cluster,(ptr->size+BLK_SIZE-1)>>BLK_SIZE_BITS);
|
||||
WBlks(dv,buf(U8 *)+j<<BLK_SIZE_BITS,cur_dir_cluster+j,1);
|
||||
RedSeaFreeClusters(dv,ptr->cluster,(ptr->size+BLK_SIZE-1)>>BLK_SIZE_BITS);
|
||||
}
|
||||
ptr(U8 *)+=CDIR_SIZE;
|
||||
if (++i>=n) {
|
||||
@@ -496,68 +497,68 @@ I64 RedSeaFSFilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags,
|
||||
}
|
||||
}
|
||||
Free(buf);
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
} catch {
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
I64 RedSeaFSFileWrite(CPrt *p,U8 *cur_dir,U8 *name,U8 *buf,I64 size,
|
||||
I64 RedSeaFileWrite(CDrv *dv,U8 *cur_dir,U8 *name,U8 *buf,I64 size,
|
||||
CDate cdt,I64 attr)
|
||||
{
|
||||
CDirEntry de;
|
||||
I64 c=0,blk_cnt;
|
||||
MemSet(&de,0,sizeof(CDirEntry));
|
||||
if (size<0) size=0;
|
||||
if (p->type!=PT_REDSEA)
|
||||
PrintErr("Not RedSea Partition\n");
|
||||
if (dv->type!=DVT_REDSEA)
|
||||
PrintErr("Not RedSea Drv\n");
|
||||
else if (!CFileNameTo(de.name,name))
|
||||
PrintErr("Invalid FileName.\n");
|
||||
else {
|
||||
RedSeaFSFilesDel(p,cur_dir,de.name,0,FALSE,FALSE);
|
||||
RedSeaFilesDel(dv,cur_dir,de.name,0,FALSE,FALSE);
|
||||
de.size=size;
|
||||
if (blk_cnt=(size+BLK_SIZE-1)>>BLK_SIZE_BITS)
|
||||
c=ClustersAlloc(p,0,blk_cnt,TRUE); //Always contiguous
|
||||
c=ClustersAlloc(dv,0,blk_cnt,TRUE); //Always contiguous
|
||||
else
|
||||
c=INVALID_CLUSTER;
|
||||
de.cluster=c;
|
||||
de.attr=attr|RS_ATTR_CONTIGUOUS;
|
||||
de.datetime=cdt;
|
||||
if (blk_cnt)
|
||||
WClustersBlks(p,buf,c,blk_cnt);
|
||||
RedSeaFSDirNew(p,cur_dir,&de,TRUE);
|
||||
WBlks(dv,buf,c,blk_cnt);
|
||||
RedSeaDirNew(dv,cur_dir,&de,TRUE);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
CDirEntry *RedSeaFSFilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL)
|
||||
CDirEntry *RedSeaFilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL)
|
||||
{
|
||||
CPrt *p=Fs->cur_prt;
|
||||
CDrv *dv=Fs->cur_dv;
|
||||
CDirEntry *buf,*buf2,*ptr,*result=NULL,*tempde;
|
||||
I64 ch,cur_dir_cluster;
|
||||
if (fuf_flags&~FUG_FILES_FIND)
|
||||
throw('FUF');
|
||||
try {
|
||||
PrtLock(p);
|
||||
cur_dir_cluster=Name2DirCluster(p,Fs->cur_dir);
|
||||
DrvLock(dv);
|
||||
cur_dir_cluster=Name2DirCluster(dv,Fs->cur_dir);
|
||||
buf2=MAlloc(BLK_SIZE);
|
||||
RClusters(p,buf2,cur_dir_cluster,1);
|
||||
RBlks(dv,buf2,cur_dir_cluster,1);
|
||||
|
||||
ptr=buf2(U8 *)-offset(CDirEntry.start);
|
||||
buf=MAlloc(ptr->size);
|
||||
RClustersBlks(p,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS);
|
||||
RBlks(dv,buf,cur_dir_cluster,ptr->size>>BLK_SIZE_BITS);
|
||||
Free(buf2);
|
||||
|
||||
ptr=buf(U8 *)-offset(CDirEntry.start);
|
||||
*ptr->name='.';
|
||||
ptr->name[1]=0;
|
||||
ptr(U8 *)+=CDIR_SIZE;
|
||||
ptr->cluster=Name2ParentDirCluster(p,Fs->cur_dir);
|
||||
ptr->cluster=Name2ParentDirCluster(dv,Fs->cur_dir);
|
||||
ptr(U8 *)-=CDIR_SIZE;
|
||||
while (TRUE) {
|
||||
if (!(ch=*ptr->name))
|
||||
@@ -570,12 +571,12 @@ CDirEntry *RedSeaFSFilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent
|
||||
tempde->next=result;
|
||||
result=tempde;
|
||||
tempde->full_name=DirNameAbs(tempde->name);
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
if (Cd(tempde->name)) {
|
||||
tempde->sub=RedSeaFSFilesFind(files_find_mask,fuf_flags,tempde);
|
||||
tempde->sub=RedSeaFilesFind(files_find_mask,fuf_flags,tempde);
|
||||
Cd("..");
|
||||
}
|
||||
PrtLock(p);
|
||||
DrvLock(dv);
|
||||
} else if ((tempde->attr&RS_ATTR_DIR || !Bt(&fuf_flags,FUf_JUST_DIRS)) &&
|
||||
!(Bt(&fuf_flags,FUf_RECURSE) && *tempde->name=='.' && tempde->attr&RS_ATTR_DIR) &&
|
||||
FilesFindMatch(tempde->name,files_find_mask,fuf_flags)) {
|
||||
@@ -588,22 +589,22 @@ CDirEntry *RedSeaFSFilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent
|
||||
ptr(U8 *)+=CDIR_SIZE;
|
||||
}
|
||||
Free(buf);
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
} catch
|
||||
PrtUnlock(p);
|
||||
DrvUnlock(dv);
|
||||
return result;
|
||||
}
|
||||
|
||||
Bool RedSeaFSMkDir(CPrt *p,U8 *cur_dir,U8 *name)
|
||||
Bool RedSeaMkDir(CDrv *dv,U8 *cur_dir,U8 *name)
|
||||
{
|
||||
I64 size=BLK_SIZE,c,cur_dir_cluster=Name2DirCluster(p,cur_dir);
|
||||
I64 size=BLK_SIZE,c,cur_dir_cluster=Name2DirCluster(dv,cur_dir);
|
||||
U8 *buf=CAlloc(size);
|
||||
CDirEntry *d_native=buf-offset(CDirEntry.start);
|
||||
Bool unlock_break;
|
||||
|
||||
try {
|
||||
unlock_break=BreakLock;
|
||||
c=FileWrite(name,buf,size,0,RS_ATTR_DIR,FALSE);
|
||||
c=FileWrite(name,buf,size,0,RS_ATTR_DIR);
|
||||
d_native->attr=RS_ATTR_DIR|RS_ATTR_CONTIGUOUS;
|
||||
StrCpy(d_native->name,name);
|
||||
d_native->cluster=c;
|
||||
@@ -618,7 +619,7 @@ Bool RedSeaFSMkDir(CPrt *p,U8 *cur_dir,U8 *name)
|
||||
d_native->cluster=cur_dir_cluster;
|
||||
d_native->size=0;
|
||||
d_native->datetime=Now;
|
||||
WClusters(p,buf,c,1);
|
||||
WBlks(dv,buf,c,1);
|
||||
Free(buf);
|
||||
if (unlock_break)
|
||||
BreakUnlock;
|
||||
|
||||
+30
-13
@@ -45,7 +45,7 @@ U0 EdLiteUpdate(CLine *root,CLine *cur_line,I64 cur_col,I64 line_start_col)
|
||||
templ=templ->next;
|
||||
} else {
|
||||
if (!done_eof) {
|
||||
"<EOF>";
|
||||
'<EOF>';
|
||||
done_eof=TRUE;
|
||||
}
|
||||
'\n';
|
||||
@@ -55,13 +55,14 @@ U0 EdLiteUpdate(CLine *root,CLine *cur_line,I64 cur_col,I64 line_start_col)
|
||||
RawPutChar(0x7F);
|
||||
}
|
||||
|
||||
U0 EdLite(U8 *filename,I64 num=1)
|
||||
Bool EdLite(U8 *filename,I64 num=1,I64 edf_dof_flags=0)
|
||||
{//Light weight text editor for debugging.
|
||||
U8 *src,*src2,*src3,*dst,*buf,*bin_data=NULL;
|
||||
I64 i,cnt=0,ch,sc,size,bin_size=0,line_start_col=0,cur_col=0,
|
||||
old_raw_flags=text.raw_flags;
|
||||
CLine root,*templ,*templ1,*cur_line;
|
||||
Bool old_raw=Raw(ON),
|
||||
Bool result=FALSE,
|
||||
old_raw=Raw(ON),
|
||||
old_debug=InDbg(ON),
|
||||
old_single=SingleUser(ON);
|
||||
|
||||
@@ -103,15 +104,20 @@ U0 EdLite(U8 *filename,I64 num=1)
|
||||
MemCpy(bin_data,src,bin_size);
|
||||
}
|
||||
Free(buf);
|
||||
result=TRUE;
|
||||
}
|
||||
|
||||
cur_line=root.next;
|
||||
if (0<--num) {
|
||||
if (num<cnt)
|
||||
if (--num<0)
|
||||
result=FALSE;
|
||||
else {
|
||||
if (num<=cnt)
|
||||
while (num--)
|
||||
cur_line=cur_line->next;
|
||||
else
|
||||
else {
|
||||
cur_line=&root;
|
||||
result=FALSE;
|
||||
}
|
||||
}
|
||||
do {
|
||||
if (cur_line==&root)
|
||||
@@ -246,7 +252,10 @@ U0 EdLite(U8 *filename,I64 num=1)
|
||||
}
|
||||
} while (ch!=CH_SHIFT_ESC && ch!=CH_ESC);
|
||||
|
||||
if (ch==CH_ESC) {
|
||||
if (ch!=CH_ESC) {
|
||||
if (edf_dof_flags&EDF_WAS_WRITE)
|
||||
result=FALSE;
|
||||
} else {
|
||||
size=bin_size;
|
||||
|
||||
templ=root.next;
|
||||
@@ -268,6 +277,9 @@ U0 EdLite(U8 *filename,I64 num=1)
|
||||
MemCpy(dst,bin_data,bin_size);
|
||||
FileWrite(filename,buf,size);
|
||||
Free(buf);
|
||||
|
||||
if (edf_dof_flags&EDF_WAS_WRITE)
|
||||
result=TRUE;
|
||||
}
|
||||
|
||||
templ=root.next;
|
||||
@@ -285,6 +297,7 @@ U0 EdLite(U8 *filename,I64 num=1)
|
||||
SingleUser(old_single);
|
||||
text.raw_flags=text.raw_flags&~RWF_SHOW_DOLLAR|old_raw_flags&RWF_SHOW_DOLLAR;
|
||||
POPFD
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 ToFileLine(U8 *_fl_file_line,U8 **_filename,I64 *_linenum)
|
||||
@@ -300,16 +313,18 @@ U0 ToFileLine(U8 *_fl_file_line,U8 **_filename,I64 *_linenum)
|
||||
*_linenum=linenum;
|
||||
}
|
||||
|
||||
U0 EdLiteFileLine(U8 *fl_file_line)
|
||||
Bool EdLiteFileLine(U8 *fl_file_line,I64 edf_dof_flags=0)
|
||||
{
|
||||
Bool result;
|
||||
U8 *filename;
|
||||
I64 linenum;
|
||||
ToFileLine(fl_file_line,&filename,&linenum);
|
||||
EdLite(filename,linenum);
|
||||
result=EdLite(filename,linenum,edf_dof_flags);
|
||||
Free(filename);
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 SetFix(U8 *filename,I64 line)
|
||||
U0 FixSet(U8 *filename,I64 line)
|
||||
{//Compiler calls this to set file line for Fix
|
||||
U8 *st=MStrPrint("FL:%s,%d",filename,line);
|
||||
while (LBts(&sys_semas[SYS_SEMA_FIX],0))
|
||||
@@ -319,9 +334,10 @@ U0 SetFix(U8 *filename,I64 line)
|
||||
LBtr(&sys_semas[SYS_SEMA_FIX],0);
|
||||
}
|
||||
|
||||
U0 Fix()
|
||||
Bool Fix(I64 edf_dof_flags=0)
|
||||
{//Jump to last err src code to fix it.
|
||||
U8 *st;
|
||||
Bool result=FALSE;
|
||||
|
||||
while (LBts(&sys_semas[SYS_SEMA_FIX],0))
|
||||
Yield;
|
||||
@@ -330,9 +346,10 @@ U0 Fix()
|
||||
|
||||
if (st) {
|
||||
if (IsRaw)
|
||||
EdLiteFileLine(st);
|
||||
result=EdLiteFileLine(st,edf_dof_flags);
|
||||
else
|
||||
Ed(st);
|
||||
result=Ed(st,edf_dof_flags);
|
||||
}
|
||||
Free(st);
|
||||
return result;
|
||||
}
|
||||
+1
-1
@@ -115,7 +115,7 @@ U0 SysThrowBreak()
|
||||
else {//TODO: Might want lock
|
||||
Fs->wake_jiffy=0;
|
||||
TaskRstAwaitingMsg;
|
||||
PrtsRelease();
|
||||
DrvsRelease();
|
||||
BlkDevsRelease();
|
||||
FlushMsgs;
|
||||
throw('Break');
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
//See $LK,"::/Doc/Acknowledgements.TXT"$.
|
||||
//See $LK,"::/Doc/Credits.TXT"$.
|
||||
|
||||
U8 sys_font_8x8[256*8]= {
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
|
||||
@@ -1,488 +0,0 @@
|
||||
I64 HashTypeNum(CHash *temph)
|
||||
{//Return bit num of hash type, limited to just types.
|
||||
if (temph)
|
||||
return Bsf(temph->type&HTG_TYPE_MASK);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
I64 HashVal(CHash *temph)
|
||||
{//Returns most likely desired value.
|
||||
nobound_switch (HashTypeNum(temph)) {
|
||||
case HTt_EXPORT_SYS_SYM:
|
||||
return temph(CHashExport *)->val;
|
||||
case HTt_IMPORT_SYS_SYM:
|
||||
return temph(CHashImport *)->module_base;
|
||||
case HTt_DEFINE_STR:
|
||||
case HTt_CLASS:
|
||||
case HTt_INTERNAL_TYPE:
|
||||
case HTt_WORD:
|
||||
case HTt_DICT_WORD:
|
||||
case HTt_OPCODE:
|
||||
case HTt_HELP_FILE:
|
||||
return temph;
|
||||
case HTt_GLBL_VAR:
|
||||
if (temph(CHashGlblVar *)->flags&GVF_EXTERN)
|
||||
return &temph(CHashGlblVar *)->data_addr;
|
||||
else
|
||||
return temph(CHashGlblVar *)->data_addr;
|
||||
case HTt_FUN:
|
||||
if (Bt(&temph(CHashFun *)->flags,Cf_EXTERN))
|
||||
return temph;
|
||||
else
|
||||
return temph(CHashFun *)->executable_addr;
|
||||
case HTt_REG:
|
||||
return temph(CHashReg *)->reg_num|temph(CHashReg *)->reg_type<<8;
|
||||
case HTt_KEYWORD:
|
||||
case HTt_ASM_KEYWORD:
|
||||
case HTt_MODULE:
|
||||
case HTt_FILE:
|
||||
case HTt_FRAME_PTR:
|
||||
return temph(CHashGeneric *)->user_data0;
|
||||
|
||||
case -1: //nobound_switch
|
||||
case HTt_NUM_TYPES: //nobound_switch
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
CHashTable *HashTableNew(I64 size,CTask *mem_task=NULL)
|
||||
{//New hash table, power-of-two in size.
|
||||
CHashTable *table;
|
||||
table=CAlloc(sizeof(CHashTable),mem_task);
|
||||
table->body=CAlloc(size<<3,mem_task);
|
||||
table->mask=size-1;
|
||||
table->next_added=table->last_added=table;
|
||||
return table;
|
||||
}
|
||||
|
||||
U0 HashDel(CHashSrcSym *temph)
|
||||
{//Free a std TempleOS system hash entry.
|
||||
if (!temph) return;
|
||||
if (!(temph->type&HTT_DICT_WORD))
|
||||
Free(temph->str);
|
||||
if (temph->type & HTG_SRC_SYM) {
|
||||
Free(temph->src_link);
|
||||
Free(temph->index);
|
||||
Free(temph->import_name);
|
||||
LinkedLstDel(temph->ie_lst);
|
||||
if (temph->type & (HTT_FUN | HTT_EXPORT_SYS_SYM))
|
||||
Free(temph->dbg_info);
|
||||
if (temph->type & (HTT_FUN | HTT_CLASS))
|
||||
//Assumes code not on heap, so doesn't Free.
|
||||
//$LK,"MemberLstDel",A="MN:MemberLstDel"$() is an import to the Kernel module
|
||||
MemberLstDel(temph);
|
||||
else if (temph->type&HTT_DEFINE_STR)
|
||||
Free(temph(CHashDefineStr *)->data);
|
||||
else if (temph->type & HTT_GLBL_VAR) {
|
||||
if (!(temph(CHashGlblVar *)->flags&GVF_ALIAS))
|
||||
Free(temph(CHashGlblVar *)->data_addr);
|
||||
LinkedLstDel(temph(CHashGlblVar *)->dim.next);
|
||||
if (temph(CHashGlblVar *)->fun_ptr)
|
||||
HashDel(temph(CHashGlblVar *)->fun_ptr-temph(CHashGlblVar *)->fun_ptr->ptr_cnt);
|
||||
}
|
||||
} else if (temph->type & HTT_FILE)
|
||||
Free(temph(CHashGeneric *)->user_data0);
|
||||
Free(temph);
|
||||
}
|
||||
|
||||
U0 HashTableDel(CHashTable *table)
|
||||
{//Free std system hash table, calling $LK,"HashDel",A="MN:HashDel"$() on entries.
|
||||
CHashSrcSym *temph,*temph1;
|
||||
if (!table) return;
|
||||
temph=table->next_added;
|
||||
while (temph!=table) {
|
||||
temph1=temph->next_added;
|
||||
HashDel(temph);
|
||||
temph=temph1;
|
||||
}
|
||||
Free(table->body);
|
||||
Free(table);
|
||||
}
|
||||
|
||||
I64 HashTablePurge(CHashTable *table)
|
||||
{//Eliminate ExportSysSyms that have been usurped.
|
||||
I64 result=0;
|
||||
CHashSrcSym *temph,*temph1,*temph2;
|
||||
if (!table) return 0;
|
||||
PUSHFD
|
||||
CLI //Precaution
|
||||
temph=table->next_added;
|
||||
while (temph!=table) {
|
||||
temph1=temph->next_added; //We delete only older ones
|
||||
if (temph->type&(HTT_FUN|HTT_GLBL_VAR)) {
|
||||
temph2=temph->next; //Older always later in chain
|
||||
while (temph2) {
|
||||
if ((temph2->type&HTT_EXPORT_SYS_SYM || temph2->type&HTG_TYPE_MASK==HTT_INVALID) &&
|
||||
!StrCmp(temph2->str,temph->str)) {
|
||||
if (temph2->type&HTG_TYPE_MASK==HTT_INVALID)
|
||||
temph2->type=HTT_KEYWORD;//Won't delete HTT_INVALID
|
||||
HashRemDel(temph2,table);
|
||||
result++;
|
||||
break;
|
||||
}
|
||||
temph2=temph2->next;
|
||||
}
|
||||
}
|
||||
temph=temph1;
|
||||
}
|
||||
POPFD
|
||||
return result;
|
||||
}
|
||||
|
||||
CHashGeneric *HashGenericAdd(U8 *name,I64 type,I64 u0=0,I64 u1=0,I64 u2=0,CTask *task=NULL)
|
||||
{//Add any type to task hash_table, 3 user_data values.
|
||||
if (!task) task=Fs;
|
||||
CHashGeneric *result=CAlloc(sizeof(CHashGeneric),task);
|
||||
result->type=type;
|
||||
result->user_data0=u0;
|
||||
result->user_data1=u1;
|
||||
result->user_data2=u2;
|
||||
result->str=StrNew(name,task);
|
||||
HashAdd(result,task->hash_table);
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 SetSrcFileInfo(CLex *lx,CHashSrcSym *h,I64 line_num_offset=0)
|
||||
{//Set $LK,"CHashSrcSym",A="MN:CHashSrcSym"$ link and help_index by cur lx pos.
|
||||
CLexFile *tempf=lx->cur_lfn;
|
||||
I64 line_num=tempf->line_num+line_num_offset;
|
||||
if (line_num<1) line_num=1;
|
||||
Free(h->src_link);
|
||||
h->src_link=MStrPrint("FL:%s,%d",tempf->name,line_num);
|
||||
if (Bt(&lx->opts,OPTf_KEEP_PRIVATE))
|
||||
h->type|=HTF_PRIVATE;
|
||||
Free(h->index);
|
||||
if (lx->cur_help_index)
|
||||
h->index=StrNew(lx->cur_help_index);
|
||||
else
|
||||
h->index=NULL;
|
||||
}
|
||||
|
||||
CHashGeneric *HashPublic(U8 *st,I64 mask,Bool val=TRUE)
|
||||
{//Mark a hash entry as public and $LK,"SetSrcFileInfo",A="MN:SetSrcFileInfo"$().
|
||||
CHashGeneric *result;
|
||||
if (result=HashFind(st,Fs->hash_table,mask)) {
|
||||
if (val)
|
||||
result->type|=HTF_PUBLIC;
|
||||
else
|
||||
result->type&=~HTF_PUBLIC;
|
||||
if (result->type&HTG_SRC_SYM)
|
||||
SetSrcFileInfo(Fs->last_lex,result);
|
||||
return result;
|
||||
} else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
I64 HashLstAdd(U8 *lst,I64 type,CHashTable *table)
|
||||
{//Add a list to a hash table.
|
||||
I64 i=0;
|
||||
CHashGeneric *temph;
|
||||
if (lst) {
|
||||
while (*lst) {
|
||||
if (*lst=='@')
|
||||
lst++;
|
||||
else
|
||||
i++;
|
||||
temph=CAlloc(sizeof(CHashGeneric));
|
||||
temph->user_data0=i-1;
|
||||
temph->str=StrNew(lst);
|
||||
temph->type=type;
|
||||
HashAdd(temph,table);
|
||||
while (*lst++);
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
I64 HashDefineLstAdd(U8 *name,I64 type,CHashTable *table)
|
||||
{//Add define list to a hash table. See $LK,"::/Adam/DolDoc/DocInit.CPP",A="FF:::/Adam/DolDoc/DocInit.CPP,HashDefineLstAdd"$.
|
||||
CHashDefineStr *temph;
|
||||
if (temph=HashFind(name,Fs->hash_table,HTT_DEFINE_STR))
|
||||
return HashLstAdd(temph->data,type,table);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
I64 FramePtr(U8 *name,CTask *task=NULL)
|
||||
{//Find entry in task->hash_table, Return user_data.
|
||||
CHashGeneric *temph;
|
||||
if (!task) task=Fs;
|
||||
if (temph=HashFind(name,task->hash_table,HTT_FRAME_PTR))
|
||||
return temph->user_data0;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
CHashGeneric *FramePtrAdd(U8 *name,I64 val,CTask *task=NULL)
|
||||
{//Add named value to task->hash_table.
|
||||
return HashGenericAdd(name,HTT_FRAME_PTR,val,0,0,task);
|
||||
}
|
||||
|
||||
I64 FramePtrSet(U8 *name,I64 val,CTask *task=NULL)
|
||||
{//Find hash entry in task->hash_table. Change user_data0.
|
||||
CHashGeneric *temph;
|
||||
if (!task) task=Fs;
|
||||
if (temph=HashFind(name,task->hash_table,HTT_FRAME_PTR))
|
||||
return LXchgI64(&temph->user_data0,val);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
I64 FramePtrDel(U8 *name,CTask *task=NULL)
|
||||
{//Remove entry and delete.
|
||||
CHashGeneric *temph;
|
||||
I64 result=0;
|
||||
if (!task) task=Fs;
|
||||
if (temph=HashFind(name,task->hash_table,HTT_FRAME_PTR)) {
|
||||
result=temph->user_data0;
|
||||
HashRemDel(temph,task->hash_table);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 LoadOneImport(U8 **_src,U8 *module_base,I64 ld_flags)
|
||||
{
|
||||
U8 *src=*_src,*ptr2,*st_ptr;
|
||||
I64 i,etype;
|
||||
CHashExport *tempex=NULL;
|
||||
CHashImport *tempiss;
|
||||
Bool first=TRUE;
|
||||
|
||||
while (etype=*src++) {
|
||||
i=*src(U32 *)++;
|
||||
st_ptr=src;
|
||||
src+=StrLen(st_ptr)+1;
|
||||
if (*st_ptr) {
|
||||
if (!first) {
|
||||
*_src=st_ptr-5;
|
||||
return;
|
||||
} else {
|
||||
first=FALSE;
|
||||
if (!(tempex=HashFind(st_ptr,Fs->hash_table,HTG_ALL-HTT_IMPORT_SYS_SYM))) {
|
||||
if (!(ld_flags & LDF_SILENT))
|
||||
"Unresolved Reference:%s\n",st_ptr;
|
||||
tempiss=CAlloc(sizeof(CHashImport));
|
||||
tempiss->str=StrNew(st_ptr);
|
||||
tempiss->type=HTT_IMPORT_SYS_SYM;
|
||||
tempiss->module_header_entry=st_ptr-5;
|
||||
tempiss->module_base=module_base;
|
||||
HashAdd(tempiss,Fs->hash_table);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tempex) {
|
||||
ptr2=module_base+i;
|
||||
if (tempex->type & HTT_FUN)
|
||||
i=tempex(CHashFun *)->executable_addr;
|
||||
else if (tempex->type & HTT_GLBL_VAR)
|
||||
i=tempex(CHashGlblVar *)->data_addr;
|
||||
else
|
||||
i=tempex->val;
|
||||
switch (etype) {
|
||||
case EIT_REL_I8: *ptr2(U8 *) =i-ptr2-1; break;
|
||||
case EIT_IMM_U8: *ptr2(U8 *) =i; break;
|
||||
case EIT_REL_I16: *ptr2(U16 *)=i-ptr2-2; break;
|
||||
case EIT_IMM_U16: *ptr2(U16 *)=i; break;
|
||||
case EIT_REL_I32: *ptr2(U32 *)=i-ptr2-4; break;
|
||||
case EIT_IMM_U32: *ptr2(U32 *)=i; break;
|
||||
case EIT_REL_I64: *ptr2(I64 *)=i-ptr2-8; break;
|
||||
case EIT_IMM_U64: *ptr2(I64 *)=i; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*_src=src-1;
|
||||
}
|
||||
|
||||
U0 SysSymImportsResolve(U8 *st_ptr,I64 ld_flags)
|
||||
{
|
||||
CHashImport *tempiss;
|
||||
U8 *ptr;
|
||||
while (tempiss=HashSingleTableFind(st_ptr,Fs->hash_table,HTT_IMPORT_SYS_SYM)) {
|
||||
ptr=tempiss->module_header_entry;
|
||||
LoadOneImport(&ptr,tempiss->module_base,ld_flags);
|
||||
tempiss->type=HTT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
U0 LoadPass1(U8 *src,U8 *module_base,I64 ld_flags)
|
||||
{
|
||||
U8 *ptr2,*ptr3,*st_ptr;
|
||||
I64 i,j,cnt,etype;
|
||||
CHashExport *tempex=NULL;
|
||||
while (etype=*src++) {
|
||||
i=*src(U32 *)++;
|
||||
st_ptr=src;
|
||||
src+=StrLen(st_ptr)+1;
|
||||
switch (etype) {
|
||||
case EIT_REL32_EXPORT:
|
||||
case EIT_IMM32_EXPORT:
|
||||
case EIT_REL64_EXPORT:
|
||||
case EIT_IMM64_EXPORT:
|
||||
tempex=CAlloc(sizeof(CHashExport));
|
||||
tempex->str=StrNew(st_ptr);
|
||||
tempex->type=HTT_EXPORT_SYS_SYM|HTF_IMM;
|
||||
if (etype==EIT_IMM32_EXPORT||etype==EIT_IMM64_EXPORT)
|
||||
tempex->val=i;
|
||||
else
|
||||
tempex->val=i+module_base;
|
||||
HashAdd(tempex,Fs->hash_table);
|
||||
SysSymImportsResolve(st_ptr,ld_flags);
|
||||
break;
|
||||
case EIT_REL_I0...EIT_IMM_U64:
|
||||
src=st_ptr-5;
|
||||
LoadOneImport(&src,module_base,ld_flags);
|
||||
break;
|
||||
case EIT_ABS_ADDR:
|
||||
if (ld_flags & LDF_NO_ABSS)
|
||||
src+=i*sizeof(U32);
|
||||
else {
|
||||
cnt=i;
|
||||
for (j=0;j<cnt;j++) {
|
||||
ptr2=module_base+*src(U32 *)++;
|
||||
*ptr2(U32 *)+=module_base;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
sub_switch_start:
|
||||
case EIT_CODE_HEAP:
|
||||
ptr3=MAlloc(*src(I32 *)++,Fs->code_heap);
|
||||
break;
|
||||
case EIT_ZEROED_CODE_HEAP:
|
||||
ptr3=CAlloc(*src(I32 *)++,Fs->code_heap);
|
||||
break;
|
||||
sub_switch_end:
|
||||
if (*st_ptr) {
|
||||
tempex=CAlloc(sizeof(CHashExport));
|
||||
tempex->str=StrNew(st_ptr);
|
||||
tempex->type=HTT_EXPORT_SYS_SYM|HTF_IMM;
|
||||
tempex->val=ptr3;
|
||||
HashAdd(tempex,Fs->hash_table);
|
||||
}
|
||||
cnt=i;
|
||||
for (j=0;j<cnt;j++) {
|
||||
ptr2=module_base+*src(U32 *)++;
|
||||
*ptr2(I32 *)+=ptr3;
|
||||
}
|
||||
break;
|
||||
|
||||
sub_switch_start:
|
||||
case EIT_DATA_HEAP:
|
||||
ptr3=MAlloc(*src(I64 *)++);
|
||||
break;
|
||||
case EIT_ZEROED_DATA_HEAP:
|
||||
ptr3=CAlloc(*src(I64 *)++);
|
||||
break;
|
||||
sub_switch_end:
|
||||
if (*st_ptr) {
|
||||
tempex=CAlloc(sizeof(CHashExport));
|
||||
tempex->str=StrNew(st_ptr);
|
||||
tempex->type=HTT_EXPORT_SYS_SYM|HTF_IMM;
|
||||
tempex->val=ptr3;
|
||||
HashAdd(tempex,Fs->hash_table);
|
||||
}
|
||||
cnt=i;
|
||||
for (j=0;j<cnt;j++) {
|
||||
ptr2=module_base+*src(U32 *)++;
|
||||
*ptr2(I64 *)+=ptr3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 LoadPass2(U8 *src,U8 *module_base,I64)
|
||||
{
|
||||
U8 *st_ptr;
|
||||
I64 i,etype;
|
||||
while (etype=*src++) {
|
||||
i=*src(U32 *)++;
|
||||
st_ptr=src;
|
||||
src+=StrLen(st_ptr)+1;
|
||||
switch (etype) {
|
||||
case EIT_MAIN:
|
||||
Call(i+module_base);
|
||||
break;
|
||||
case EIT_ABS_ADDR:
|
||||
src+=sizeof(U32)*i;
|
||||
break;
|
||||
case EIT_CODE_HEAP:
|
||||
case EIT_ZEROED_CODE_HEAP:
|
||||
src+=4+sizeof(U32)*i;
|
||||
break;
|
||||
case EIT_DATA_HEAP:
|
||||
case EIT_ZEROED_DATA_HEAP:
|
||||
src+=8+sizeof(U32)*i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U8 *Load(U8 *filename,I64 ld_flags=0,CBinFile *bfh_addr=INVALID_PTR)
|
||||
{//Load a .BIN file module into memory.
|
||||
//bfh_addr==INVALID_PTR means don't care what load addr.
|
||||
U8 *fbuf,*module_base,*absname;
|
||||
I64 size,module_align;
|
||||
CBinFile *bfh;
|
||||
|
||||
fbuf=DftExt(filename,"BIN.Z");
|
||||
if (!(bfh=FileRead(fbuf,&size))) {
|
||||
Free(fbuf);
|
||||
return NULL;
|
||||
}
|
||||
//See $LK,"Patch Table Generation",A="FF:::/Compiler/CmpMain.CPP,EIT_ABS_ADDR"$
|
||||
module_align=1<<bfh->module_align_bits;
|
||||
if (!module_align || bfh->bin_signature!=BIN_SIGNATURE_VAL) {
|
||||
Free(bfh);
|
||||
Free(fbuf);
|
||||
throw('BinModul');
|
||||
}
|
||||
if (bfh_addr==INVALID_PTR) {
|
||||
if (bfh->module_org==INVALID_PTR) {
|
||||
if (Fs->code_heap!=Fs->data_heap) {
|
||||
if (module_align<16)
|
||||
module_align=16;
|
||||
bfh_addr=MAllocAligned(size,module_align,Fs->code_heap,module_align-sizeof(CBinFile));
|
||||
} else if (module_align>8)
|
||||
bfh_addr=MAllocAligned(size,module_align,,module_align-sizeof(CBinFile));
|
||||
else {//Less than 2Gig system memory
|
||||
bfh_addr=bfh;
|
||||
goto lo_skip; //File is already in code heap area, don't copy.
|
||||
}
|
||||
} else
|
||||
bfh_addr=bfh->module_org;
|
||||
}
|
||||
MemCpy(bfh_addr,bfh,size);
|
||||
Free(bfh);
|
||||
|
||||
lo_skip:
|
||||
module_base=bfh_addr(U8 *)+sizeof(CBinFile);
|
||||
|
||||
absname=FileNameAbs(fbuf);
|
||||
Free(fbuf);
|
||||
fbuf=StrNew(absname);
|
||||
FileExtRem(fbuf);
|
||||
if (fbuf[1]==':' && StrLen(fbuf)>2)
|
||||
HashGenericAdd(fbuf+2,HTT_MODULE|HTF_PUBLIC,bfh_addr);
|
||||
|
||||
LoadPass1(bfh_addr(U8 *)+bfh_addr->patch_table_offset,module_base,ld_flags);
|
||||
if (!(ld_flags&LDF_JUST_LOAD))
|
||||
LoadPass2(bfh_addr(U8 *)+bfh_addr->patch_table_offset,module_base,ld_flags);
|
||||
|
||||
Free(absname);
|
||||
Free(fbuf);
|
||||
return bfh_addr;
|
||||
}
|
||||
|
||||
U0 LoadKernel()
|
||||
{
|
||||
HashGenericAdd(KERNEL_MODULE_NAME,HTT_MODULE|HTF_PUBLIC,sys_boot_base-sizeof(CBinFile));
|
||||
|
||||
//Abs patches done here $LK,"CPatchTableAbsAddr",A="FF:D:/Kernel/KStart.CPP,CPatchTableAbsAddr"$.
|
||||
LoadPass1(sys_boot_patch_table_base,sys_boot_base,LDF_NO_ABSS|LDF_SILENT);
|
||||
|
||||
//No main routines
|
||||
// LoadPass2(sys_boot_patch_table_base,sys_boot_base,0);
|
||||
}
|
||||
+8
-10
@@ -84,7 +84,7 @@ SYS_IRQ_FAULT::
|
||||
PUSH U64 CTask.fault_err_code[RSI]
|
||||
PUSH U64 CTask.fault_num[RSI]
|
||||
MOV RSI,CTask.rsi[RSI]
|
||||
CALL &Fault2 //See $LK,"Fault2",A="FF:::/Kernel/Dbg1a.CPP,Fault2"$
|
||||
CALL &Fault2 //See $LK,"Fault2",A="FF:::/Kernel/KDbg.CPP,Fault2"$
|
||||
JMP I32 RESTORE_FS_TASK_WITH_KEY_CHECK
|
||||
|
||||
SYS_FAULT_ERR_CODE_BITMAP::
|
||||
@@ -109,10 +109,10 @@ U8 *IntEntrySet(I64 irq,U0 (*fp_new_handler)(),I64 type=IDTET_IRQ,I64 dpl=0)
|
||||
//See $LK,"::/Demo/MultiCore/Interrupts.CPP"$.
|
||||
I64 fp=fp_new_handler;
|
||||
U8 *result,*dst;
|
||||
result=IntEntryGet(irq);
|
||||
dst=dev.idt(U8 *)+irq*16;
|
||||
PUSHFD
|
||||
CLI
|
||||
result=IntEntryGet(irq);
|
||||
dst=dev.idt(U8 *)+irq*16;
|
||||
*dst(U16 *)++=fp.u16[0];
|
||||
*dst(U16 *)++=offset(CGDT.cs64);
|
||||
*dst(U16 *)++=0x8000+type<<8+dpl<<13;
|
||||
@@ -160,18 +160,16 @@ U8 *IntFaultHandlersNew()
|
||||
|
||||
U0 IntInit1()
|
||||
{//Interrupt descriptor table part1.
|
||||
I64 i,temp_ptr[2];
|
||||
U32 *ptr;
|
||||
I64 i;
|
||||
CSysLimitBase temp_ptr;
|
||||
if (!Gs->num) {//Gs cur $LK,"CCPU",A="MN:CCPU"$ struct
|
||||
dev.idt=CAlloc(16*256);
|
||||
for (i=0;i<256;i++)
|
||||
IntEntrySet(i,&IntNop);
|
||||
}
|
||||
ptr=temp_ptr;
|
||||
*ptr(U16 *)++=256*16-1; //Typecasting is postfix
|
||||
*ptr(I64 *)++=dev.idt;
|
||||
*ptr(U16 *)=0;
|
||||
SetRAX(temp_ptr);
|
||||
temp_ptr.limit=256*16-1;
|
||||
temp_ptr.base =dev.idt;
|
||||
SetRAX(&temp_ptr);
|
||||
LIDT U64 [RAX]
|
||||
}
|
||||
|
||||
|
||||
+16
-19
@@ -17,19 +17,18 @@ U8 *kernel_cfg_options="MemInit\0HeapInit\0VarInit\0"
|
||||
|
||||
class CKernelCfg
|
||||
{
|
||||
U8 *acct_name;
|
||||
U8 *dsk_cache_size_exp;
|
||||
CDoc *add_dev;
|
||||
U8 *boot_rescue_drv_file,*boot_rescue_drv_start;
|
||||
Bool opts[CFG_NUM_OPTIONS];
|
||||
U8 mem_init_val,heap_init_val,var_init_val,
|
||||
sys_acct_drv,auto_mount_ide_hd_let,auto_mount_ide_cd_let;
|
||||
boot_drv_let,auto_mount_ide_hd_let,auto_mount_ide_cd_let;
|
||||
Bool cdrom_ports_pmt;
|
||||
};
|
||||
|
||||
CDoc *KernelCfgAddDev(CKernelCfg *c)
|
||||
{
|
||||
I64 ch,num_hints,first_prt_num,type,unit,cnt=0;
|
||||
I64 ch,num_hints,first_drv_num,type,unit,cnt=0;
|
||||
U8 blks_buf[256],addr_buf[256],base0_buf[128],base1_buf[128];
|
||||
CATARep *root=NULL,*tempha;
|
||||
CDoc *doc=DocNew;
|
||||
@@ -38,12 +37,12 @@ CDoc *KernelCfgAddDev(CKernelCfg *c)
|
||||
"\n\nIn anticipation of the drives you will\n"
|
||||
"define shortly, enter the drive letter\n"
|
||||
"of the drive with the account directory.\n"
|
||||
"\n($$PURPLE$$<ENTER>$$FG$$ for cur drv) Acct Drv:";
|
||||
"\n($$PURPLE$$<ENTER>$$FG$$ for cur drv) Home Drv:";
|
||||
ch=ToUpper(GetChar);
|
||||
if ('A'<=ch<='Z')
|
||||
c->sys_acct_drv=ch;
|
||||
c->boot_drv_let=ch;
|
||||
else
|
||||
c->sys_acct_drv=Fs->cur_prt->drv_let;
|
||||
c->boot_drv_let=Drv2Let(Fs->cur_dv);
|
||||
|
||||
"\n\n$$BK,1$$$$PURPLE$$Mount drives so they will be present when "
|
||||
"you boot.$$FG$$$$BK,0$$\n";
|
||||
@@ -55,9 +54,9 @@ CDoc *KernelCfgAddDev(CKernelCfg *c)
|
||||
"If more than one partition is present\n"
|
||||
"they will be lettered in sequence.\n"
|
||||
"\nFirst Drive Letter ($$PURPLE$$<ENTER>$$FG$$ to exit):";
|
||||
first_prt_num=ToUpper(GetChar)-'A';
|
||||
first_drv_num=ToUpper(GetChar)-'A';
|
||||
'\n';
|
||||
if (0<=first_prt_num<NUM_PRTS) {
|
||||
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:";
|
||||
type=GetChar-'0';
|
||||
@@ -111,30 +110,30 @@ CDoc *KernelCfgAddDev(CKernelCfg *c)
|
||||
LinkedLstDel(root);
|
||||
}
|
||||
if (BDT_NULL<type<BDT_NUM_TYPES && 0<=unit<=1) {
|
||||
DocPrint(doc,"bdev=BlkDevNextFree(%d,%d);"
|
||||
"bdev->unit=%d;",first_prt_num+'A',type,unit);
|
||||
DocPrint(doc,"bd=BlkDevNextFree(%d,%d);"
|
||||
"bd->unit=%d;",first_drv_num+'A',type,unit);
|
||||
if (type==BDT_RAM) {
|
||||
if (!*addr_buf) StrCpy(addr_buf,"0");
|
||||
DocPrint(doc,"bdev->RAM_dsk=%s;",addr_buf);
|
||||
DocPrint(doc,"bdev->max_blk=(%s)-1;",blks_buf);
|
||||
DocPrint(doc,"bd->RAM_dsk=%s;",addr_buf);
|
||||
DocPrint(doc,"bd->max_blk=(%s)-1;",blks_buf);
|
||||
}
|
||||
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(bdev);");
|
||||
if (first_prt_num+'A'==c->sys_acct_drv)
|
||||
DocPrint(doc,"dsk.boot_rescue_drv_pmt=GetBaseUnit(bd);");
|
||||
if (first_drv_num+'A'==c->boot_drv_let)
|
||||
make_free=TRUE;
|
||||
} else
|
||||
DocPrint(doc,"bdev->base0=%s;bdev->base1=%s;",
|
||||
DocPrint(doc,"bd->base0=%s;bd->base1=%s;",
|
||||
base0_buf,base1_buf);
|
||||
}
|
||||
DocPrint(doc,"BlkDevAdd(bdev,FALSE,%d);",make_free);
|
||||
DocPrint(doc,"BlkDevAdd(bd,FALSE,%d);",make_free);
|
||||
cnt++;
|
||||
} else
|
||||
"\n\n$$BK,1$$$$RED$$Operation Failed$$BK,0$$$$FG$$\n\n";
|
||||
}
|
||||
} while (!cnt || 0<=first_prt_num<NUM_PRTS);
|
||||
} while (!cnt || 0<=first_drv_num<NUM_DRVS);
|
||||
return doc;
|
||||
}
|
||||
|
||||
@@ -223,7 +222,6 @@ CKernelCfg *KernelCfgNew()
|
||||
CKernelCfg *c=CAlloc(sizeof(CKernelCfg));
|
||||
|
||||
c->add_dev=KernelCfgAddDev(c);
|
||||
c->acct_name=GetStr("Start-up Acct ($$PURPLE$$<ENTER>$$FG$$ will prompt):");
|
||||
c->dsk_cache_size_exp=GetStr(
|
||||
"Disk Cache Size in Bytes,\n"
|
||||
"gets rounded-up funny,\n"
|
||||
@@ -237,7 +235,6 @@ U0 KernelCfgDel(CKernelCfg *c)
|
||||
{
|
||||
DocDel(c->add_dev);
|
||||
Free(c->boot_rescue_drv_file);
|
||||
Free(c->acct_name);
|
||||
Free(c->dsk_cache_size_exp);
|
||||
Free(c);
|
||||
}
|
||||
File renamed without changes.
@@ -7,7 +7,7 @@ Bool ChkPtr(U8 *ptr)
|
||||
return FALSE;
|
||||
} else if (ptr<sys_boot_base)
|
||||
return FALSE;
|
||||
else if (ptr<VGA_GRAPHIC_MEM_BASE)
|
||||
else if (ptr<VGAM_GRAPHICS)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
@@ -22,7 +22,7 @@ Bool ChkCodePtr(U8 *ptr)
|
||||
return FALSE;
|
||||
} else if (ptr<sys_boot_base)
|
||||
return FALSE;
|
||||
else if (ptr<VGA_GRAPHIC_MEM_BASE)
|
||||
else if (ptr<VGAM_GRAPHICS)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
@@ -110,7 +110,7 @@ U0 SysDefinesLoad()
|
||||
DefineLstLoad("ST_FILE_UTIL_FLAGS","r\0d\0i\0a\0c\0R\0p\0m\0x\0s\0"
|
||||
"D\0F\0T\0S\0A\0J\0G\0Z\0O\0P\0f\0l\0lb\0la\0");
|
||||
DefineLstLoad("ST_BLKDEV_TYPES","NULL\0RAM\0ATA\0ATAPI\0");
|
||||
DefineLstLoad("ST_PRT_TYPES","NULL\0REDSEA\0FAT32\0ISO9660\0ISO13490\0ISO13346\0NTFS\0UNKNOWN\0");
|
||||
DefineLstLoad("ST_DRV_TYPES","NULL\0REDSEA\0FAT32\0ISO9660\0ISO13490\0ISO13346\0NTFS\0UNKNOWN\0");
|
||||
DefineLstLoad("ST_COLORS","BLACK\0BLUE\0GREEN\0CYAN\0"
|
||||
"RED\0PURPLE\0BROWN\0LTGRAY\0DKGRAY\0LTBLUE\0LTGREEN\0"
|
||||
"LTCYAN\0LTRED\0LTPURPLE\0YELLOW\0WHITE\0");
|
||||
+24
-30
@@ -7,12 +7,11 @@ U0 SysGlblsInit()
|
||||
CPUId(0x1,&ee);
|
||||
sys_cache_line_width=ee.rbx.u8[1]*8;
|
||||
|
||||
sys_rnd_seed =93186752^GetTSC;
|
||||
sys_focus_task=Fs;
|
||||
QueInit(&sys_macro_root);
|
||||
|
||||
dsk.dft_iso_filename="::/Temp/CDDVD.ISO";
|
||||
StrCpy(dsk.temp_filename,"HOME/Temp.TXT.Z");
|
||||
StrCpy(dsk.temp_filename,"::/Home/Temp.TXT.Z");
|
||||
dsk.cdrom_boot_is_good=TRUE;
|
||||
#exe {
|
||||
if (!kernel_cfg->auto_mount_ide_hd_let) kernel_cfg->auto_mount_ide_hd_let='C';
|
||||
@@ -35,10 +34,7 @@ U0 SysGlblsInit()
|
||||
KeyDevInit;
|
||||
|
||||
#exe {
|
||||
if (*kernel_cfg->acct_name)
|
||||
StreamPrint("sys_acct=StrNew(\"%C:/Accts/%s\");",kernel_cfg->sys_acct_drv,kernel_cfg->acct_name);
|
||||
else
|
||||
StreamPrint("sys_acct=StrNew(\"%C:/Accts\");",kernel_cfg->sys_acct_drv);
|
||||
StreamPrint("dsk.boot_drv_let='%C';",kernel_cfg->boot_drv_let);
|
||||
StreamPrint("#exe{OptOff(OPTf_WARN_PAREN);}");
|
||||
StreamPrint("DskCacheInit(%s);",kernel_cfg->dsk_cache_size_exp);
|
||||
StreamPrint("#exe{OptOn(OPTf_WARN_PAREN);}");
|
||||
@@ -53,9 +49,9 @@ U0 SysGlblsInit()
|
||||
|
||||
ProgressBarsRst;
|
||||
|
||||
//$AN,"Independent Heap Ctrl Example",A="Independent Heap Ctrl Example"$
|
||||
//$AN,"Independent HeapCtrl Example",A="Independent HeapCtrl Example"$
|
||||
i=1; //Rqst 1 blk, we might get more.
|
||||
m=MemBlksUncachedAlloc(&i,sys_code_bp);
|
||||
m=Mem2MegUncachedAlloc(&i,sys_code_bp);
|
||||
dev.uncached_heap=HeapCtrlBPInit(m,i*0x200000/0x200);
|
||||
QueInit(&dev.pci_root);
|
||||
dev.mem64_ptr=MEM_MAPPED_SPACE;
|
||||
@@ -65,19 +61,19 @@ U0 SysGlblsInit()
|
||||
}
|
||||
|
||||
U0 SysGrInit()
|
||||
{//See $LK,"SYS_BIOS_GR_MODE",A="FF:D:/Kernel/KStart.CPP,SYS_BIOS_GR_MODE:2"$
|
||||
{
|
||||
text.font=sys_font_8x8;
|
||||
if (sys_bios_gr_mode==0x12) { //if 640x480 16 color
|
||||
text.cols=GR_WIDTH/FONT_WIDTH;
|
||||
text.rows=GR_HEIGHT/FONT_HEIGHT;
|
||||
OutU8(VGA_SC_INDEX,VGA_MAP_MASK);
|
||||
OutU8(VGA_SC_DATA,0x0F);
|
||||
MemSet(VGA_GRAPHIC_MEM_BASE,0,GR_WIDTH*GR_HEIGHT>>3);
|
||||
text.raw_screen_image=CAlloc(GR_WIDTH*GR_HEIGHT/8);
|
||||
} else {
|
||||
if (!Bt(&sys_run_level,RLf_VGA)) { //if text mode
|
||||
text.cols=80;
|
||||
text.rows=25;
|
||||
MemSet(VGA_TEXT_MEM_BASE,0,text.rows*text.cols<<1);
|
||||
MemSet(VGAM_TEXT,0,text.rows*text.cols<<1);
|
||||
} else { //if 640x480 16 color
|
||||
text.cols=GR_WIDTH/FONT_WIDTH;
|
||||
text.rows=GR_HEIGHT/FONT_HEIGHT;
|
||||
OutU8(VGAP_INDEX,VGAR_MAP_MASK);
|
||||
OutU8(VGAP_DATA,0x0F);
|
||||
MemSet(VGAM_GRAPHICS,0,GR_WIDTH*GR_HEIGHT>>3);
|
||||
text.raw_screen_image=CAlloc(GR_WIDTH*GR_HEIGHT/8);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +98,7 @@ U0 TimersInit()
|
||||
_q=HPET_GCAP_ID;
|
||||
i=*_q; //i.u32[1]= period in femtoS (10e-15)
|
||||
if (100000<i.u32[1]<1000000000) {
|
||||
cnts.HPET_freq =1000000000000000/i.u32[1];
|
||||
cnts.HPET_freq =1000000000000000/i.u32[1];
|
||||
cnts.HPET_kHz_freq=1000000000000/i.u32[1];
|
||||
_q=HPET_GEN_CONF;
|
||||
*_q|=1; //Enable counting
|
||||
@@ -134,7 +130,6 @@ U0 KernelMain()
|
||||
adam_task=Fs;
|
||||
HeapsInit;
|
||||
LBts(&sys_run_level,RLf_FULL_HEAP);
|
||||
Fs->hash_table=HashTableNew(ADAM_HASH_SIZE,Fs);
|
||||
SysGlblsInit;
|
||||
Mem32DevInit;
|
||||
MemPagesNotPresentMark;
|
||||
@@ -148,31 +143,30 @@ U0 KernelMain()
|
||||
TaskDerivedValsUpdate;
|
||||
|
||||
SysDefinesLoad;
|
||||
MPInit;
|
||||
BSPInit;
|
||||
IntInit1;
|
||||
|
||||
//Before this point use $LK,"Snd",A="MN:Snd"$() and $LK,"BusyWait",A="MN:BusyWait"$()
|
||||
//to debug. After this point, use $LK,"RawPrint",A="MN:RawPrint"$()
|
||||
LBts(&sys_run_level,RLf_RAW);
|
||||
if (BIOSTotalMem<250*0x100000)
|
||||
Dbg("Requires 256 Meg of RAM Memory");
|
||||
|
||||
TimersInit;
|
||||
IntsInit;
|
||||
if (BIOSTotalMem<ToI64(0.95*MEM_MIN_MEG*0x100000))
|
||||
RawPrint(4000,"!!! Requires $TX,"512 Meg",D="DD_MEM_MIN_MEG"$ of RAM Memory !!!");
|
||||
|
||||
IntsInit;
|
||||
"Enable IRQ's\n";
|
||||
SetRFlags(SYS_NORMAL_RFLAGS);
|
||||
BusyWait(2000);
|
||||
|
||||
IntInit2;
|
||||
LBts(&sys_run_level,RLf_INTERRUPTS);
|
||||
|
||||
TimeStampFreqCal;
|
||||
Preempt(ON);
|
||||
|
||||
#exe {
|
||||
if (!kernel_cfg->opts[CFG_NO_MP])
|
||||
StreamPrint("\"MultiCore Start\\n\\n\";"
|
||||
"MPStart;"
|
||||
"BSPStartMP;"
|
||||
"LBts(&sys_run_level,RLf_MP);");
|
||||
};
|
||||
|
||||
@@ -201,9 +195,9 @@ U0 KernelMain()
|
||||
|
||||
InDbg(OFF);
|
||||
cnts.time_stamp_freq_initial=TimeStampFreqCal;
|
||||
Cd("/Kernel");
|
||||
Cd("/");
|
||||
try
|
||||
ExeFile("Adam1"); //Continues $LK,"/Kernel/Adam1.CPP",A="FL:/Kernel/Adam1.CPP,1"$
|
||||
ExeFile("Adam"); //Continues $LK,"/Adam.CPP",A="FL:/Adam.CPP,1"$
|
||||
catch {
|
||||
Raw(ON);
|
||||
PutExcept;
|
||||
@@ -218,7 +212,7 @@ asm { ALIGN 16,OC_NOP
|
||||
SYS_KERNEL_END::
|
||||
#exe {
|
||||
if (kernel_cfg->opts[CFG_BOOT_RESCUE_DRV])
|
||||
StreamPrint("DU8 0x%X-(SYS_KERNEL_END-SYS_KERNEL_START1+"
|
||||
StreamPrint("DU8 0x%X-(SYS_KERNEL_END-SYS_KERNEL+"
|
||||
"BOOT_RAM_BASE+sizeof(CBinFile)) DUP (0);"
|
||||
"BINFILE \"%s\";",kernel_cfg->boot_rescue_drv_start,kernel_cfg->boot_rescue_drv_file);
|
||||
};
|
||||
|
||||
+29
-29
@@ -9,13 +9,12 @@ import Bool Ed(U8 *link_st,I64 edf_dof_flags=0);
|
||||
import I64 ExeFile(U8 *name,Bool just_load=FALSE);
|
||||
import I64 ExePrint(U8 *fmt,...);
|
||||
import U0 MemberLstDel(CHashClass *tempc);
|
||||
import I64 PopUp(U8 *msg,CTask *parent=NULL,CTask **_pu_task=NULL);
|
||||
extern U0 AdamErr(U8 *fmt,...);
|
||||
extern U0 AdamLog(U8 *fmt,...);
|
||||
extern I64 BlkDevAdd(CBlkDev *bdev,Bool one_prt,Bool make_free);
|
||||
extern Bool BlkDevLock(CBlkDev *bdev);
|
||||
extern I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free);
|
||||
extern Bool BlkDevLock(CBlkDev *bd);
|
||||
extern CBlkDev *BlkDevNextFree(U8 first_drv_let,I64 type);
|
||||
extern Bool BlkDevUnlock(CBlkDev *bdev,Bool rst=FALSE);
|
||||
extern Bool BlkDevUnlock(CBlkDev *bd,Bool rst=FALSE);
|
||||
extern U0 BlkDevsRelease();
|
||||
extern Bool BptS(U8 *addr,CTask *task=NULL,Bool live=TRUE);
|
||||
extern U8 *Caller(I64 num=1);
|
||||
@@ -28,51 +27,51 @@ extern I64 DefineMatch(U8 *needle,U8 *haystack_lst_name,I64 flags=0);
|
||||
extern U8 *DefineSub(I64 sub,U8 *name);
|
||||
extern U8 *DftExt(U8 *name,U8 *extension);
|
||||
extern Bool Drv(U8 drv_let);
|
||||
extern U0 DskCacheInvalidate(CPrt *p);
|
||||
extern U8 Drv2Let(CDrv *dv=NULL);
|
||||
extern U0 DrvsRelease();
|
||||
extern U0 DskCacheInvalidate(CDrv *dv);
|
||||
extern U0 Exit();
|
||||
extern I64 FAT32AllocClusters(CPrt *p,I64 c,I64 cnt);
|
||||
extern I64 FAT32AllocContiguousClusters(CPrt *p,I64 cnt);
|
||||
extern Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempdee,Bool free_old_chain);
|
||||
extern Bool FAT32FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0);
|
||||
extern I64 FAT32AllocClusters(CDrv *dv,I64 c,I64 cnt);
|
||||
extern I64 FAT32AllocContiguousClusters(CDrv *dv,I64 cnt);
|
||||
extern Bool FAT32DirNew(CDrv *dv,U8 *cur_dir,CDirEntry *tempdee,Bool free_old_chain);
|
||||
extern U0 FAT32DrvInit(CDrv *dv);
|
||||
extern Bool FAT32FileFind(CDrv *dv,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0);
|
||||
extern CDirEntry *FAT32FilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL,I64 *_dir_size=NULL);
|
||||
extern U0 FAT32PrtInit(CPrt *p);
|
||||
extern U8 *FileExtRem(U8 *src,U8 *dst=NULL);
|
||||
extern Bool FileFind(U8 *filename,CDirEntry *_de=NULL,I64 fuf_flags=0);
|
||||
extern U8 *FileNameAbs(U8 *name,I64 fuf_flags=0);
|
||||
extern U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE);
|
||||
extern I64 FileWrite(U8 *filename,U8 *fbuf,
|
||||
I64 size,CDate cdt=0,I64 attr=0,Bool raw=FALSE);
|
||||
extern U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL);
|
||||
extern I64 FileWrite(U8 *filename,U8 *fbuf,I64 size,CDate cdt=0,I64 attr=0);
|
||||
extern I64 FlushMsgs(CTask *task=NULL);
|
||||
extern I64 GetChar(I64 *scan_code=NULL,Bool echo=TRUE,Bool raw_cursor=FALSE);
|
||||
extern I64 GetS(U8 *buf,I64 size,Bool allow_ext=TRUE);
|
||||
extern Bool ISO1FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0);
|
||||
extern Bool ISO1FileFind(CDrv *dv,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0);
|
||||
extern CDirEntry *ISO1FilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL);
|
||||
extern Bool ISOPrtInit(CPrt *p,I64 blk);
|
||||
extern Bool ISODrvInit(CDrv *dv,I64 blk);
|
||||
extern Bool IsDbg();
|
||||
extern Bool IsDir(U8 *dir_name);
|
||||
extern Bool IsRaw();
|
||||
extern U0 MPInt(I64 num,I64 cpu_num=1);
|
||||
extern U8 *MStrPrint(U8 *fmt,...);
|
||||
extern Bool MkDir(U8 *filename);
|
||||
extern U0 MouseIPSet(I64 x,I64 y,I64 z,I64 l,I64 r);
|
||||
extern U0 Msg(I64 code,I64 a1,I64 a2,I64 flags=0);
|
||||
extern I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL);
|
||||
extern U0 Print(U8 *fmt,...);
|
||||
extern U0 PrtsRelease();
|
||||
extern U0 PutChars(U64 ch);
|
||||
extern U0 PutS(U8 *st); //Use $LK,"Print",A="MN:Print"$()
|
||||
extern Bool RBlks(CPrt *p,U8 *buf, I64 blk, I64 cnt);
|
||||
extern I64 RedSeaFSAllocClusters(CPrt *p,I64 cnt);
|
||||
extern Bool RedSeaFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempdee,Bool free_old_chain);
|
||||
extern Bool RedSeaFSDrvValidate(U8 drv_let);
|
||||
extern Bool RedSeaFSFileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0);
|
||||
extern CDirEntry *RedSeaFSFilesFind (U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL);
|
||||
extern U0 RedSeaFSFmt(U8 drv_let,Bool quick=TRUE);
|
||||
extern U0 RedSeaFSFreeFreeLst(CPrt *p);
|
||||
extern U0 RedSeaFSPrtInit(CPrt *p);
|
||||
extern U0 SetMouseIP(I64 x,I64 y,I64 z,I64 l,I64 r);
|
||||
extern Bool RBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt);
|
||||
extern I64 RedSeaAllocClusters(CDrv *dv,I64 cnt);
|
||||
extern Bool RedSeaDirNew(CDrv *dv,U8 *cur_dir,CDirEntry *tempdee,Bool free_old_chain);
|
||||
extern U0 RedSeaDrvInit(CDrv *dv);
|
||||
extern Bool RedSeaDrvValidate(U8 drv_let);
|
||||
extern Bool RedSeaFileFind(CDrv *dv,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0);
|
||||
extern CDirEntry *RedSeaFilesFind (U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL);
|
||||
extern U0 RedSeaFmt(U8 drv_let,Bool quick=TRUE);
|
||||
extern U0 RedSeaFreeFreeLst(CDrv *dv);
|
||||
extern CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
|
||||
U8 *task_name=NULL,I64 target_cpu,CTask *parent=NULL, //NULL means adam
|
||||
I64 stk_size=0,I64 flags=1<<SVCf_ADD_TO_QUE);
|
||||
extern CTask *SpawnUser(U8 *fmt=NULL,...);
|
||||
extern U0 SrvCmdDel(CSrvCmd *tempc);
|
||||
extern U0 SrvCmdQueDel(CSrvCmd *root);
|
||||
extern I64 SrvCmdsHandler(CTask *task=NULL);
|
||||
@@ -84,15 +83,16 @@ extern CSrvCmd *TaskMsg(CTask *_srv,CTask *master,I64 code,I64 a1,I64 a2,I64 fla
|
||||
extern U0 TaskRstAwaitingMsg(CTask *task=NULL);
|
||||
extern Bool TaskValidate(CTask *task);
|
||||
extern U0 TaskWait(CTask *task=NULL);
|
||||
extern CTask *User(U8 *fmt=NULL,...);
|
||||
extern U0 UserTaskCont();
|
||||
extern Bool WBlks(CPrt *p,U8 *buf, I64 blk, I64 cnt);
|
||||
extern Bool WBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt);
|
||||
extern U0 XTalk(CTask *task,U8 *fmt,...);
|
||||
extern U0 throw(I64 ch=0,Bool no_log=FALSE);
|
||||
#exe {
|
||||
OptOn(OPTf_KEEP_PRIVATE);
|
||||
OptOn(OPTf_EXTERNS_TO_IMPORTS);
|
||||
};
|
||||
#include "/Compiler/Cmp.HPP"
|
||||
#include "/Compiler/CompilerB.HPP"
|
||||
#exe {
|
||||
OptOff(OPTf_EXTERNS_TO_IMPORTS);
|
||||
OptOff(OPTf_KEEP_PRIVATE);
|
||||
|
||||
@@ -8,8 +8,6 @@ CTask *adam_task;
|
||||
I64 sys_num_spawned_tasks;
|
||||
|
||||
CTask *sys_winmgr_task,*sys_task_being_screen_updated;
|
||||
I64 sys_rnd_seed;
|
||||
U8 *sys_acct; // "D:/Acct/User"
|
||||
U8 *reverse_bits_table, //Table with U8 bits reversed
|
||||
*set_bits_table; //Table with count of set bits in a U8
|
||||
CDate local_time_offset=0;
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,247 @@
|
||||
I64 HashTypeNum(CHash *temph)
|
||||
{//Return bit num of hash type, limited to just types.
|
||||
if (temph)
|
||||
return Bsf(temph->type&HTG_TYPE_MASK);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
I64 HashVal(CHash *temph)
|
||||
{//Returns most likely desired value.
|
||||
nobound_switch (HashTypeNum(temph)) {
|
||||
case HTt_EXPORT_SYS_SYM:
|
||||
return temph(CHashExport *)->val;
|
||||
case HTt_IMPORT_SYS_SYM:
|
||||
return temph(CHashImport *)->module_base;
|
||||
case HTt_DEFINE_STR:
|
||||
case HTt_CLASS:
|
||||
case HTt_INTERNAL_TYPE:
|
||||
case HTt_WORD:
|
||||
case HTt_DICT_WORD:
|
||||
case HTt_OPCODE:
|
||||
case HTt_HELP_FILE:
|
||||
return temph;
|
||||
case HTt_GLBL_VAR:
|
||||
if (temph(CHashGlblVar *)->flags&GVF_EXTERN)
|
||||
return &temph(CHashGlblVar *)->data_addr;
|
||||
else
|
||||
return temph(CHashGlblVar *)->data_addr;
|
||||
case HTt_FUN:
|
||||
if (Bt(&temph(CHashFun *)->flags,Cf_EXTERN))
|
||||
return temph;
|
||||
else
|
||||
return temph(CHashFun *)->executable_addr;
|
||||
case HTt_REG:
|
||||
return temph(CHashReg *)->reg_num|temph(CHashReg *)->reg_type<<8;
|
||||
case HTt_KEYWORD:
|
||||
case HTt_ASM_KEYWORD:
|
||||
case HTt_MODULE:
|
||||
case HTt_FILE:
|
||||
case HTt_FRAME_PTR:
|
||||
return temph(CHashGeneric *)->user_data0;
|
||||
|
||||
case -1: //nobound_switch
|
||||
case HTt_NUM_TYPES: //nobound_switch
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
CHashTable *HashTableNew(I64 size,CTask *mem_task=NULL)
|
||||
{//New hash table, power-of-two in size.
|
||||
CHashTable *table;
|
||||
table=CAlloc(sizeof(CHashTable),mem_task);
|
||||
table->body=CAlloc(size<<3,mem_task);
|
||||
table->mask=size-1;
|
||||
return table;
|
||||
}
|
||||
|
||||
U0 HashDel(CHashSrcSym *temph)
|
||||
{//Free a std TempleOS system hash entry.
|
||||
if (!temph) return;
|
||||
if (!(temph->type&HTT_DICT_WORD))
|
||||
Free(temph->str);
|
||||
if (temph->type & HTG_SRC_SYM) {
|
||||
Free(temph->src_link);
|
||||
Free(temph->index);
|
||||
Free(temph->import_name);
|
||||
LinkedLstDel(temph->ie_lst);
|
||||
if (temph->type & (HTT_FUN | HTT_EXPORT_SYS_SYM))
|
||||
Free(temph->dbg_info);
|
||||
if (temph->type & (HTT_FUN | HTT_CLASS))
|
||||
//Assumes code not on heap, so doesn't Free.
|
||||
//$LK,"MemberLstDel",A="MN:MemberLstDel"$() is an import to the Kernel module
|
||||
MemberLstDel(temph);
|
||||
else if (temph->type&HTT_DEFINE_STR)
|
||||
Free(temph(CHashDefineStr *)->data);
|
||||
else if (temph->type & HTT_GLBL_VAR) {
|
||||
if (!(temph(CHashGlblVar *)->flags&GVF_ALIAS))
|
||||
Free(temph(CHashGlblVar *)->data_addr);
|
||||
LinkedLstDel(temph(CHashGlblVar *)->dim.next);
|
||||
if (temph(CHashGlblVar *)->fun_ptr)
|
||||
HashDel(temph(CHashGlblVar *)->fun_ptr-temph(CHashGlblVar *)->fun_ptr->ptr_stars_cnt);
|
||||
}
|
||||
} else if (temph->type & HTT_FILE)
|
||||
Free(temph(CHashGeneric *)->user_data0);
|
||||
Free(temph);
|
||||
}
|
||||
|
||||
U0 HashTableDel(CHashTable *table)
|
||||
{//Free std system hash table, calling $LK,"HashDel",A="MN:HashDel"$() on entries.
|
||||
I64 i;
|
||||
CHashSrcSym *temph,*temph1;
|
||||
if (!table) return;
|
||||
for (i=0;i<=table->mask;i++) {
|
||||
temph=table->body[i];
|
||||
while (temph) {
|
||||
temph1=temph->next;
|
||||
HashDel(temph);
|
||||
temph=temph1;
|
||||
}
|
||||
}
|
||||
Free(table->body);
|
||||
Free(table);
|
||||
}
|
||||
|
||||
I64 HashTablePurge(CHashTable *table)
|
||||
{//Eliminate ExportSysSyms that have been usurped.
|
||||
I64 i,result=0;
|
||||
CHashSrcSym *temph,*temph1,*temph2;
|
||||
if (!table) return 0;
|
||||
PUSHFD
|
||||
CLI //Precaution
|
||||
for (i=0;i<=table->mask;i++) {
|
||||
temph=table->body[i];
|
||||
while (temph) {
|
||||
temph1=temph->next; //We delete only older ones
|
||||
if (temph->type&(HTT_FUN|HTT_GLBL_VAR)) {
|
||||
temph2=temph->next; //Older always later in chain
|
||||
while (temph2) {
|
||||
if ((temph2->type&HTT_EXPORT_SYS_SYM || temph2->type&HTG_TYPE_MASK==HTT_INVALID) &&
|
||||
!StrCmp(temph2->str,temph->str)) {
|
||||
if (temph2->type&HTG_TYPE_MASK==HTT_INVALID)
|
||||
temph2->type=HTT_KEYWORD;//Won't delete HTT_INVALID
|
||||
HashRemDel(temph2,table);
|
||||
result++;
|
||||
break;
|
||||
}
|
||||
temph2=temph2->next;
|
||||
}
|
||||
}
|
||||
temph=temph1;
|
||||
}
|
||||
}
|
||||
POPFD
|
||||
return result;
|
||||
}
|
||||
|
||||
CHashGeneric *HashGenericAdd(U8 *name,I64 type,I64 u0=0,I64 u1=0,I64 u2=0,CTask *task=NULL)
|
||||
{//Add any type to task hash_table, 3 user_data values.
|
||||
if (!task) task=Fs;
|
||||
CHashGeneric *result=CAlloc(sizeof(CHashGeneric),task);
|
||||
result->type=type;
|
||||
result->user_data0=u0;
|
||||
result->user_data1=u1;
|
||||
result->user_data2=u2;
|
||||
result->str=StrNew(name,task);
|
||||
HashAdd(result,task->hash_table);
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 HashSrcFileSet(CLex *lx,CHashSrcSym *h,I64 line_num_offset=0)
|
||||
{//Set $LK,"CHashSrcSym",A="MN:CHashSrcSym"$ link and help_index by cur lx pos.
|
||||
CLexFile *tempf=lx->cur_lfn;
|
||||
I64 line_num=tempf->line_num+line_num_offset;
|
||||
if (line_num<1) line_num=1;
|
||||
Free(h->src_link);
|
||||
h->src_link=MStrPrint("FL:%s,%d",tempf->full_name,line_num);
|
||||
if (Bt(&lx->opts,OPTf_KEEP_PRIVATE))
|
||||
h->type|=HTF_PRIVATE;
|
||||
Free(h->index);
|
||||
if (lx->cur_help_index)
|
||||
h->index=StrNew(lx->cur_help_index);
|
||||
else
|
||||
h->index=NULL;
|
||||
}
|
||||
|
||||
CHashGeneric *HashPublic(U8 *st,I64 mask,Bool val=TRUE)
|
||||
{//Mark a hash entry as public and $LK,"HashSrcFileSet",A="MN:HashSrcFileSet"$().
|
||||
CHashGeneric *result;
|
||||
if (result=HashFind(st,Fs->hash_table,mask)) {
|
||||
if (val)
|
||||
result->type|=HTF_PUBLIC;
|
||||
else
|
||||
result->type&=~HTF_PUBLIC;
|
||||
if (result->type&HTG_SRC_SYM)
|
||||
HashSrcFileSet(Fs->last_lex,result);
|
||||
return result;
|
||||
} else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
I64 HashLstAdd(U8 *lst,I64 type,CHashTable *table)
|
||||
{//Add a list to a hash table.
|
||||
I64 i=0;
|
||||
CHashGeneric *temph;
|
||||
if (lst) {
|
||||
while (*lst) {
|
||||
if (*lst=='@')
|
||||
lst++;
|
||||
else
|
||||
i++;
|
||||
temph=CAlloc(sizeof(CHashGeneric));
|
||||
temph->user_data0=i-1;
|
||||
temph->str=StrNew(lst);
|
||||
temph->type=type;
|
||||
HashAdd(temph,table);
|
||||
while (*lst++);
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
I64 HashDefineLstAdd(U8 *name,I64 type,CHashTable *table)
|
||||
{//Add define list to a hash table. See $LK,"::/Adam/DolDoc/DocInit.CPP",A="FF:::/Adam/DolDoc/DocInit.CPP,HashDefineLstAdd"$.
|
||||
CHashDefineStr *temph;
|
||||
if (temph=HashFind(name,Fs->hash_table,HTT_DEFINE_STR))
|
||||
return HashLstAdd(temph->data,type,table);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
I64 FramePtr(U8 *name,CTask *task=NULL)
|
||||
{//Find entry in task->hash_table, Return user_data.
|
||||
CHashGeneric *temph;
|
||||
if (!task) task=Fs;
|
||||
if (temph=HashFind(name,task->hash_table,HTT_FRAME_PTR))
|
||||
return temph->user_data0;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
CHashGeneric *FramePtrAdd(U8 *name,I64 val=0,CTask *task=NULL)
|
||||
{//Add named value to task->hash_table.
|
||||
return HashGenericAdd(name,HTT_FRAME_PTR,val,0,0,task);
|
||||
}
|
||||
|
||||
I64 FramePtrSet(U8 *name,I64 val,CTask *task=NULL)
|
||||
{//Find hash entry in task->hash_table. Change user_data0.
|
||||
CHashGeneric *temph;
|
||||
if (!task) task=Fs;
|
||||
if (temph=HashFind(name,task->hash_table,HTT_FRAME_PTR))
|
||||
return LXchgI64(&temph->user_data0,val);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
I64 FramePtrDel(U8 *name,CTask *task=NULL)
|
||||
{//Remove entry and delete.
|
||||
CHashGeneric *temph;
|
||||
I64 result=0;
|
||||
if (!task) task=Fs;
|
||||
if (temph=HashFind(name,task->hash_table,HTT_FRAME_PTR)) {
|
||||
result=temph->user_data0;
|
||||
HashRemDel(temph,task->hash_table);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,247 @@
|
||||
U0 LoadOneImport(U8 **_src,U8 *module_base,I64 ld_flags)
|
||||
{
|
||||
U8 *src=*_src,*ptr2,*st_ptr;
|
||||
I64 i,etype;
|
||||
CHashExport *tempex=NULL;
|
||||
CHashImport *tempiss;
|
||||
Bool first=TRUE;
|
||||
|
||||
while (etype=*src++) {
|
||||
i=*src(U32 *)++;
|
||||
st_ptr=src;
|
||||
src+=StrLen(st_ptr)+1;
|
||||
if (*st_ptr) {
|
||||
if (!first) {
|
||||
*_src=st_ptr-5;
|
||||
return;
|
||||
} else {
|
||||
first=FALSE;
|
||||
if (!(tempex=HashFind(st_ptr,Fs->hash_table,HTG_ALL-HTT_IMPORT_SYS_SYM))) {
|
||||
if (!(ld_flags & LDF_SILENT))
|
||||
"Unresolved Reference:%s\n",st_ptr;
|
||||
tempiss=CAlloc(sizeof(CHashImport));
|
||||
tempiss->str=StrNew(st_ptr);
|
||||
tempiss->type=HTT_IMPORT_SYS_SYM;
|
||||
tempiss->module_header_entry=st_ptr-5;
|
||||
tempiss->module_base=module_base;
|
||||
HashAdd(tempiss,Fs->hash_table);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tempex) {
|
||||
ptr2=module_base+i;
|
||||
if (tempex->type & HTT_FUN)
|
||||
i=tempex(CHashFun *)->executable_addr;
|
||||
else if (tempex->type & HTT_GLBL_VAR)
|
||||
i=tempex(CHashGlblVar *)->data_addr;
|
||||
else
|
||||
i=tempex->val;
|
||||
switch (etype) {
|
||||
case EIT_REL_I8: *ptr2(U8 *) =i-ptr2-1; break;
|
||||
case EIT_IMM_U8: *ptr2(U8 *) =i; break;
|
||||
case EIT_REL_I16: *ptr2(U16 *)=i-ptr2-2; break;
|
||||
case EIT_IMM_U16: *ptr2(U16 *)=i; break;
|
||||
case EIT_REL_I32: *ptr2(U32 *)=i-ptr2-4; break;
|
||||
case EIT_IMM_U32: *ptr2(U32 *)=i; break;
|
||||
case EIT_REL_I64: *ptr2(I64 *)=i-ptr2-8; break;
|
||||
case EIT_IMM_I64: *ptr2(I64 *)=i; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*_src=src-1;
|
||||
}
|
||||
|
||||
U0 SysSymImportsResolve(U8 *st_ptr,I64 ld_flags)
|
||||
{
|
||||
CHashImport *tempiss;
|
||||
U8 *ptr;
|
||||
while (tempiss=HashSingleTableFind(st_ptr,Fs->hash_table,HTT_IMPORT_SYS_SYM)) {
|
||||
ptr=tempiss->module_header_entry;
|
||||
LoadOneImport(&ptr,tempiss->module_base,ld_flags);
|
||||
tempiss->type=HTT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
U0 LoadPass1(U8 *src,U8 *module_base,I64 ld_flags)
|
||||
{
|
||||
U8 *ptr2,*ptr3,*st_ptr;
|
||||
I64 i,j,cnt,etype;
|
||||
CHashExport *tempex=NULL;
|
||||
while (etype=*src++) {
|
||||
i=*src(U32 *)++;
|
||||
st_ptr=src;
|
||||
src+=StrLen(st_ptr)+1;
|
||||
switch (etype) {
|
||||
case EIT_REL32_EXPORT:
|
||||
case EIT_IMM32_EXPORT:
|
||||
case EIT_REL64_EXPORT:
|
||||
case EIT_IMM64_EXPORT:
|
||||
tempex=CAlloc(sizeof(CHashExport));
|
||||
tempex->str=StrNew(st_ptr);
|
||||
tempex->type=HTT_EXPORT_SYS_SYM|HTF_IMM;
|
||||
if (etype==EIT_IMM32_EXPORT||etype==EIT_IMM64_EXPORT)
|
||||
tempex->val=i;
|
||||
else
|
||||
tempex->val=i+module_base;
|
||||
HashAdd(tempex,Fs->hash_table);
|
||||
SysSymImportsResolve(st_ptr,ld_flags);
|
||||
break;
|
||||
case EIT_REL_I0...EIT_IMM_I64:
|
||||
src=st_ptr-5;
|
||||
LoadOneImport(&src,module_base,ld_flags);
|
||||
break;
|
||||
case EIT_ABS_ADDR:
|
||||
if (ld_flags & LDF_NO_ABSS)
|
||||
src+=i*sizeof(U32);
|
||||
else {
|
||||
cnt=i;
|
||||
for (j=0;j<cnt;j++) {
|
||||
ptr2=module_base+*src(U32 *)++;
|
||||
*ptr2(U32 *)+=module_base;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
sub_switch_start:
|
||||
case EIT_CODE_HEAP:
|
||||
ptr3=MAlloc(*src(I32 *)++,Fs->code_heap);
|
||||
break;
|
||||
case EIT_ZEROED_CODE_HEAP:
|
||||
ptr3=CAlloc(*src(I32 *)++,Fs->code_heap);
|
||||
break;
|
||||
sub_switch_end:
|
||||
if (*st_ptr) {
|
||||
tempex=CAlloc(sizeof(CHashExport));
|
||||
tempex->str=StrNew(st_ptr);
|
||||
tempex->type=HTT_EXPORT_SYS_SYM|HTF_IMM;
|
||||
tempex->val=ptr3;
|
||||
HashAdd(tempex,Fs->hash_table);
|
||||
}
|
||||
cnt=i;
|
||||
for (j=0;j<cnt;j++) {
|
||||
ptr2=module_base+*src(U32 *)++;
|
||||
*ptr2(I32 *)+=ptr3;
|
||||
}
|
||||
break;
|
||||
|
||||
sub_switch_start:
|
||||
case EIT_DATA_HEAP:
|
||||
ptr3=MAlloc(*src(I64 *)++);
|
||||
break;
|
||||
case EIT_ZEROED_DATA_HEAP:
|
||||
ptr3=CAlloc(*src(I64 *)++);
|
||||
break;
|
||||
sub_switch_end:
|
||||
if (*st_ptr) {
|
||||
tempex=CAlloc(sizeof(CHashExport));
|
||||
tempex->str=StrNew(st_ptr);
|
||||
tempex->type=HTT_EXPORT_SYS_SYM|HTF_IMM;
|
||||
tempex->val=ptr3;
|
||||
HashAdd(tempex,Fs->hash_table);
|
||||
}
|
||||
cnt=i;
|
||||
for (j=0;j<cnt;j++) {
|
||||
ptr2=module_base+*src(U32 *)++;
|
||||
*ptr2(I64 *)+=ptr3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 LoadPass2(U8 *src,U8 *module_base,I64)
|
||||
{
|
||||
U8 *st_ptr;
|
||||
I64 i,etype;
|
||||
while (etype=*src++) {
|
||||
i=*src(U32 *)++;
|
||||
st_ptr=src;
|
||||
src+=StrLen(st_ptr)+1;
|
||||
switch (etype) {
|
||||
case EIT_MAIN:
|
||||
Call(i+module_base);
|
||||
break;
|
||||
case EIT_ABS_ADDR:
|
||||
src+=sizeof(U32)*i;
|
||||
break;
|
||||
case EIT_CODE_HEAP:
|
||||
case EIT_ZEROED_CODE_HEAP:
|
||||
src+=4+sizeof(U32)*i;
|
||||
break;
|
||||
case EIT_DATA_HEAP:
|
||||
case EIT_ZEROED_DATA_HEAP:
|
||||
src+=8+sizeof(U32)*i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CBinFile *Load(U8 *filename,I64 ld_flags=0,CBinFile *bfh_addr=INVALID_PTR)
|
||||
{//Load a .BIN file module into memory.
|
||||
//bfh_addr==INVALID_PTR means don't care what load addr.
|
||||
U8 *fbuf,*module_base,*absname;
|
||||
I64 size,module_align,misalignment;
|
||||
CBinFile *bfh;
|
||||
|
||||
fbuf=DftExt(filename,"BIN.Z");
|
||||
if (!(bfh=FileRead(fbuf,&size))) {
|
||||
Free(fbuf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//See $LK,"Patch Table Generation",A="FF:::/Compiler/CMain.CPP,EIT_ABS_ADDR"$
|
||||
module_align=1<<bfh->module_align_bits;
|
||||
if (!module_align || bfh->bin_signature!=BIN_SIGNATURE_VAL) {
|
||||
Free(bfh);
|
||||
Free(fbuf);
|
||||
throw('BinModul');
|
||||
}
|
||||
|
||||
if (bfh_addr==INVALID_PTR) {
|
||||
if (bfh->module_org==INVALID_PTR) {
|
||||
misalignment=module_align-sizeof(CBinFile);
|
||||
if (misalignment<0)
|
||||
misalignment&=module_align-1;
|
||||
if (Fs->code_heap!=Fs->data_heap) {
|
||||
if (module_align<16)
|
||||
module_align=16;
|
||||
bfh_addr=MAllocAligned(size,module_align,Fs->code_heap,misalignment);
|
||||
} else if (module_align>8)
|
||||
bfh_addr=MAllocAligned(size,module_align,,misalignment);
|
||||
else {//Less than 2Gig system memory
|
||||
bfh_addr=bfh;
|
||||
goto lo_skip; //File is already in code heap area, don't copy.
|
||||
}
|
||||
} else
|
||||
bfh_addr=bfh->module_org;
|
||||
}
|
||||
MemCpy(bfh_addr,bfh,size);
|
||||
Free(bfh);
|
||||
|
||||
lo_skip:
|
||||
module_base=bfh_addr(U8 *)+sizeof(CBinFile);
|
||||
|
||||
absname=FileNameAbs(fbuf);
|
||||
Free(fbuf);
|
||||
fbuf=StrNew(absname);
|
||||
FileExtRem(fbuf);
|
||||
if (fbuf[1]==':' && StrLen(fbuf)>2)
|
||||
HashGenericAdd(fbuf+2,HTT_MODULE|HTF_PUBLIC,bfh_addr);
|
||||
LoadPass1(bfh_addr(U8 *)+bfh_addr->patch_table_offset,module_base,ld_flags);
|
||||
if (!(ld_flags&LDF_JUST_LOAD))
|
||||
LoadPass2(bfh_addr(U8 *)+bfh_addr->patch_table_offset,module_base,ld_flags);
|
||||
Free(absname);
|
||||
Free(fbuf);
|
||||
return bfh_addr;
|
||||
}
|
||||
|
||||
U0 LoadKernel()
|
||||
{
|
||||
HashGenericAdd(KERNEL_MODULE_NAME,HTT_MODULE|HTF_PUBLIC,sys_boot_base-sizeof(CBinFile));
|
||||
|
||||
//Abs patches done here $LK,"CPatchTableAbsAddr",A="FF:D:/Kernel/KStart.CPP,CPatchTableAbsAddr"$.
|
||||
LoadPass1(sys_boot_patch_table_base,sys_boot_base,LDF_NO_ABSS|LDF_SILENT);
|
||||
|
||||
//No main routines
|
||||
// LoadPass2(sys_boot_patch_table_base,sys_boot_base,0);
|
||||
}
|
||||
File renamed without changes.
@@ -0,0 +1,144 @@
|
||||
F64 Clamp(F64 num,F64 lo,F64 hi)
|
||||
{//Clamp to F64 [] range.
|
||||
if (num<lo)
|
||||
return lo;
|
||||
if (num>hi)
|
||||
return hi;
|
||||
return num;
|
||||
}
|
||||
|
||||
F64 Min(F64 n1,F64 n2)
|
||||
{//Min of two F64s.
|
||||
if (n1<=n2)
|
||||
return n1;
|
||||
else
|
||||
return n2;
|
||||
}
|
||||
|
||||
F64 Max(F64 n1,F64 n2)
|
||||
{//Max of two F64s.
|
||||
if (n1>=n2)
|
||||
return n1;
|
||||
else
|
||||
return n2;
|
||||
}
|
||||
|
||||
F64 Pow10I64(I64 i)
|
||||
{//F64 integer powers of ten.
|
||||
if (i>308)
|
||||
return ì;
|
||||
else if (i<-308)
|
||||
return 0.0;
|
||||
else
|
||||
return pow10_I64[i+309];
|
||||
}
|
||||
|
||||
U64 FloorU64(U64 num,U64 to)
|
||||
{//Integer multiples of num.
|
||||
return num-num%to;
|
||||
}
|
||||
|
||||
U64 CeilU64(U64 num,U64 to)
|
||||
{//Integer multiples of num.
|
||||
num+=to-1;
|
||||
return num-num%to;
|
||||
}
|
||||
|
||||
I64 RoundI64(I64 num,I64 to)
|
||||
{//Integer multiples of num.
|
||||
return num-num%to;
|
||||
}
|
||||
|
||||
I64 FloorI64(I64 num,I64 to)
|
||||
{//Integer multiples of num.
|
||||
if (num>=0)
|
||||
return num-num%to;
|
||||
else {
|
||||
num++;
|
||||
return num-num%to-to;
|
||||
}
|
||||
}
|
||||
|
||||
I64 CeilI64(I64 num,I64 to)
|
||||
{//Integer multiples of num.
|
||||
if (num>=0) {
|
||||
num+=to-1;
|
||||
return num-num%to;
|
||||
} else {
|
||||
num+=to-1;
|
||||
return num-num%to-to;
|
||||
}
|
||||
}
|
||||
|
||||
//See $LK,"::/Doc/Credits.TXT"$.
|
||||
I16 RandI16()
|
||||
{//Random I16.
|
||||
I64 result=1664525*Fs->rand_seed+1013904223;
|
||||
if (!Bt(&Fs->task_flags,TASKf_NONTIMER_RAND))
|
||||
result^=GetTSC>>4;
|
||||
Fs->rand_seed=result;
|
||||
return result.i16[0];
|
||||
}
|
||||
|
||||
U16 RandU16()
|
||||
{//Random U16.
|
||||
I64 result=1664525*Fs->rand_seed+1013904223;
|
||||
if (!Bt(&Fs->task_flags,TASKf_NONTIMER_RAND))
|
||||
result^=GetTSC>>4;
|
||||
Fs->rand_seed=result;
|
||||
return result.u16[0];
|
||||
}
|
||||
|
||||
I32 RandI32()
|
||||
{//Random I32.
|
||||
I64 result=1664525*Fs->rand_seed+1013904223;
|
||||
if (!Bt(&Fs->task_flags,TASKf_NONTIMER_RAND))
|
||||
result^=GetTSC>>4;
|
||||
Fs->rand_seed=result;
|
||||
return result.i32[0];
|
||||
}
|
||||
|
||||
U32 RandU32()
|
||||
{//Random U32.
|
||||
I64 result=1664525*Fs->rand_seed+1013904223;
|
||||
if (!Bt(&Fs->task_flags,TASKf_NONTIMER_RAND))
|
||||
result^=GetTSC>>4;
|
||||
Fs->rand_seed=result;
|
||||
return result.u32[0];
|
||||
}
|
||||
|
||||
I64 RandI64()
|
||||
{//Random I64.
|
||||
I64 result=1664525*Fs->rand_seed+1013904223;
|
||||
if (!Bt(&Fs->task_flags,TASKf_NONTIMER_RAND))
|
||||
result^=GetTSC>>4;
|
||||
Fs->rand_seed=1664525*result+1013904223;
|
||||
return result<<32+Fs->rand_seed&0xFFFFFFFF;
|
||||
}
|
||||
|
||||
U64 RandU64()
|
||||
{//Random U64.
|
||||
I64 result=1664525*Fs->rand_seed+1013904223;
|
||||
if (!Bt(&Fs->task_flags,TASKf_NONTIMER_RAND))
|
||||
result^=GetTSC>>4;
|
||||
Fs->rand_seed=1664525*result+1013904223;
|
||||
return result<<32+Fs->rand_seed&0xFFFFFFFF;
|
||||
}
|
||||
|
||||
F64 Rand()
|
||||
{//Random F64.
|
||||
I64 result=RandI64&0x3FFFFFFFFFFFFFFF;
|
||||
return result/ToF64(0x4000000000000000);
|
||||
}
|
||||
|
||||
I64 Seed(I64 seed=0,CTask *task=NULL)
|
||||
{//Set $LK,"Rand",A="MN:Rand"$() seed. Zero for timer-based.
|
||||
if (!task) task=Fs;
|
||||
if (seed) {
|
||||
LBts(&task->task_flags,TASKf_NONTIMER_RAND);
|
||||
return task->rand_seed=seed;
|
||||
} else {
|
||||
LBtr(&task->task_flags,TASKf_NONTIMER_RAND);
|
||||
return task->rand_seed=GetTSC>>4;
|
||||
}
|
||||
}
|
||||
@@ -136,8 +136,12 @@ Bool Blink(F64 Hz=2.5)
|
||||
U0 BusyWait(I64 æS)
|
||||
{//Loosely timed.
|
||||
I64 i;
|
||||
for (i=0;i<æS;i++)
|
||||
PortNop;
|
||||
if (cnts.HPET_freq) {
|
||||
i=HPET+cnts.HPET_freq*æS/1000000;
|
||||
while (HPET<i);
|
||||
} else
|
||||
for (i=0;i<æS;i++)
|
||||
PortNop;
|
||||
}
|
||||
|
||||
U0 SleepUntil(I64 wake_jiffy)
|
||||
@@ -158,17 +162,17 @@ U0 Sleep(I64 mS)
|
||||
|
||||
U0 Snd(F64 freq)
|
||||
{//Play freq. Zero means off.
|
||||
I64 p;
|
||||
I64 period;
|
||||
CSndData *d;
|
||||
if (!Bt(&sys_semas[SYS_SEMA_MUTE],0) &&
|
||||
!LBts(&sys_semas[SYS_SEMA_SND],0)) {
|
||||
!LBts(&sys_semas[SYS_SEMA_SND],0)) { //Mutex. Just throw-out if in use
|
||||
if (freq!=snd.freq) {
|
||||
snd.freq=freq;
|
||||
if (0<freq<=20000) {
|
||||
p=SYS_TIMER_FREQ/freq;
|
||||
period=SYS_TIMER_FREQ/freq;
|
||||
OutU8(0x43,0xB6);
|
||||
OutU8(0x42,p);
|
||||
OutU8(0x42,p.u8[1]);
|
||||
OutU8(0x42,period);
|
||||
OutU8(0x42,period.u8[1]);
|
||||
OutU8(0x61,3|InU8(0x61));
|
||||
} else
|
||||
OutU8(0x61,InU8(0x61)&~3);
|
||||
@@ -216,7 +220,7 @@ Bool IsMute()
|
||||
return Bt(&sys_semas[SYS_SEMA_MUTE],0);
|
||||
}
|
||||
|
||||
Bool Silent(Bool val)
|
||||
Bool Silent(Bool val=ON)
|
||||
{//Turns-off StdOut console text output, not sound.
|
||||
return LBEqu(&Fs->display_flags,DISPLAYf_SILENT,val);
|
||||
}
|
||||
@@ -300,7 +304,7 @@ U0 CtrlAltD(I64)
|
||||
|
||||
U0 CtrlAltE(I64)
|
||||
{
|
||||
SpawnUser;
|
||||
User;
|
||||
}
|
||||
|
||||
U0 CtrlAltF(I64)
|
||||
+74
-115
@@ -6,7 +6,7 @@ It continues here: $LK,"Kernel",A="FF:::/Kernel/KEnd.CPP,U0 Kernel"$.
|
||||
|
||||
The boot loader jumps here, in real-mode (16-bit).
|
||||
It actually jumps to the $LK,"CBinFile",A="MN:CBinFile"$ which is placed
|
||||
just before this $LK,"generated by the compiler",A="FF:::/Compiler/CmpMain.CPP,16 ALIGN"$.
|
||||
just before this $LK,"generated by the compiler",A="FF:::/Compiler/CMain.CPP,16 ALIGN"$.
|
||||
The header begins with a short jmp to
|
||||
the start of this file's code which begins
|
||||
with the following small jump past some data.
|
||||
@@ -15,28 +15,28 @@ This file is first in the Kernel image
|
||||
because it is #included first. $LK,"Kernel.PRJ",A="FF:::/Kernel/Kernel.PRJ,KStart:1"$
|
||||
*/
|
||||
USE16
|
||||
SYS_KERNEL_START1:: //This must match $LK,"CKernel",A="MN:CKernel"$.
|
||||
JMP U16 SYS_KERNEL_START2
|
||||
SYS_KERNEL:: //This must match $LK,"CKernel",A="MN:CKernel"$.
|
||||
JMP U16 BSP_16BIT_INIT
|
||||
|
||||
//************************************
|
||||
// ASM Global vars required for 16-bit start-up
|
||||
ALIGN 4,OC_NOP
|
||||
SYS_BOOT_BASE:: DU32 0; //Fixed offset from start used by reboot
|
||||
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+8+sizeof(CBinFile)<CD_BLK_SIZE
|
||||
#assert SYS_COMPILE_TIME+sizeof(CDate)+sizeof(CBinFile)<CD_BLK_SIZE
|
||||
|
||||
SYS_OS_32START:: DU32 SYS_INIT_OS;
|
||||
SYS_BOOT_CODE:: DU32 0xFF;
|
||||
SYS_BOOT_BASE:: DU32 0; //Offset from start used by reboot
|
||||
SYS_MEM_E801:: DU16 0,0;
|
||||
SYS_MEM_E820:: DU8 MEM_NUM_E820_ENTRIES*MEM_E820_ENTRY_SIZE DUP (0);
|
||||
|
||||
ALIGN 16,OC_NOP
|
||||
SYS_GDT:: //See $LK,"CGDT",A="MN:CGDT"$
|
||||
GDT_NULL: DU64 0,0;
|
||||
GDT_BOOT_DS: DU64 0,0; //Gets filled-in
|
||||
GDT_BOOT_CS: DU64 0,0; //Gets filled-in
|
||||
GDT_BOOT_DS: DU64 0x00CF92000000FFFF,0; //Gets patched.
|
||||
GDT_BOOT_CS: DU64 0x00CF9A000000FFFF,0; //Gets patched.
|
||||
GDT_CS32: DU64 0x00CF9A000000FFFF,0;
|
||||
GDT_CS64: DU64 0x00209A0000000000,0; //The $LK,"Charter",A="FI:::/Doc/Charter.TXT"$ says just ring0.
|
||||
GDT_CS64_RING3: DU64 0x0020FA0000000000,0; //$LK,"Ring3",A="FI:::/Demo/Lectures/Ring3.CPP"$, in case you want to play around.
|
||||
@@ -46,21 +46,19 @@ GDT_TR: DU8 MP_MAX_PROCESSORS*16 DUP(0);
|
||||
GDT_TR_RING3: DU8 MP_MAX_PROCESSORS*16 DUP(0);
|
||||
#assert $$-SYS_GDT==sizeof(CGDT)
|
||||
|
||||
SYS_BIOS_GR_MODE:: DU16 0;
|
||||
SYS_PCI_BUSSES:: DU16 0;
|
||||
#assert $$-SYS_KERNEL_START1==sizeof(CKernel)-sizeof(CBinFile)
|
||||
|
||||
SYS_RUN_LEVEL:: DU32 0;
|
||||
SYS_TEMP_PTR:: DU16 0;
|
||||
SYS_GDT_PTR:: DU16 sizeof(CGDT)-1;
|
||||
DU64 0;
|
||||
SYS_PCI_BUSSES:: DU16 0;
|
||||
#assert $$-SYS_KERNEL==sizeof(CKernel)-sizeof(CBinFile)
|
||||
|
||||
//************************************
|
||||
SYS_KERNEL_START2::
|
||||
//EBX is SYS_BOOT_CODE (val passed from boot blk)
|
||||
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"$.)
|
||||
MOV AX,(BOOT_RAM_LIMIT-BOOT_STK_SIZE)/16
|
||||
MOV SS,AX
|
||||
MOV SP,BOOT_STK_SIZE
|
||||
PUSH EBX //will be SYS_BOOT_CODE
|
||||
MOV AX,VGA_TEXT_MEM_BASE/16
|
||||
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"$.
|
||||
MOV AX,VGAM_TEXT/16
|
||||
MOV ES,AX
|
||||
MOV U32 ES:[0],'O'+BLUE<<12+('S'+GREEN<<12)<<16
|
||||
|
||||
@@ -71,26 +69,24 @@ GET_IP: POP BX
|
||||
MOV AX,CS
|
||||
ADD AX,BX
|
||||
PUSH AX
|
||||
PUSH U16 TEMPLEOS_CONT_START
|
||||
PUSH U16 @@05
|
||||
RETF
|
||||
|
||||
TEMPLEOS_CONT_START:
|
||||
STI
|
||||
@@05: STI
|
||||
MOV AX,CS
|
||||
MOV DS,AX
|
||||
|
||||
MOV U32 [SYS_RUN_LEVEL],RLF_16BIT
|
||||
|
||||
MOV BX,0x12 //640x480 16 color
|
||||
MOV U16 [SYS_BIOS_GR_MODE],BX
|
||||
MOV AX,0x4F02
|
||||
MOV BX,0x12 //640x480 16 color
|
||||
#exe {
|
||||
if (!kernel_cfg->opts[CFG_TEXT_MODE])
|
||||
StreamPrint("INT 0x10"); //Enable VGA
|
||||
};
|
||||
CMP AX,0x004F
|
||||
JE @@10
|
||||
MOV U16 [SYS_BIOS_GR_MODE],0 //failed
|
||||
JNE @@10 //Jmp if fail
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_VGA
|
||||
@@10:
|
||||
|
||||
//Get mem maps
|
||||
@@ -138,52 +134,33 @@ TEMPLEOS_CONT_START:
|
||||
OR AL,2
|
||||
OUT 0x92,AL
|
||||
|
||||
CLD //Start with known regs
|
||||
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"$.
|
||||
|
||||
CLD
|
||||
XOR EAX,EAX
|
||||
MOV AX,CS
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV FS,AX
|
||||
MOV GS,AX
|
||||
XOR EAX,EAX
|
||||
XOR EBX,EBX
|
||||
XOR ECX,ECX
|
||||
XOR EDX,EDX
|
||||
XOR ESI,ESI
|
||||
XOR EDI,EDI
|
||||
XOR EBP,EBP
|
||||
|
||||
XOR EAX,EAX
|
||||
MOV AX,CS
|
||||
SHL EAX,4
|
||||
|
||||
MOV U32 [SYS_BOOT_BASE],EAX
|
||||
|
||||
POP U32 [SYS_BOOT_CODE]
|
||||
|
||||
MOV BX,CS
|
||||
SUB BX,sizeof(CBinFile)/16
|
||||
MOV DX,CS
|
||||
SUB DX,sizeof(CBinFile)/16
|
||||
#assert !(sizeof(CBinFile)&15)
|
||||
MOV GS,BX
|
||||
MOV EBX,U32 GS:[CBinFile.patch_table_offset]
|
||||
ADD EAX,EBX
|
||||
SUB EAX,sizeof(CBinFile)
|
||||
MOV U32 [SYS_BOOT_PATCH_TABLE_BASE],EAX
|
||||
MOV GS,DX
|
||||
|
||||
MOV EDX,EAX
|
||||
ADD EDX,U32 GS:[CBinFile.patch_table_offset]
|
||||
SUB EDX,sizeof(CBinFile)
|
||||
MOV U32 [SYS_BOOT_PATCH_TABLE_BASE],EDX
|
||||
|
||||
MOV U32 [GDT_BOOT_DS],0x0000FFFF
|
||||
MOV U32 [GDT_BOOT_DS+4],0x0CF9200
|
||||
MOV U32 [GDT_BOOT_CS],0x0000FFFF
|
||||
MOV U32 [GDT_BOOT_CS+4],0x0CF9A00
|
||||
MOV EAX,U32 [SYS_BOOT_BASE]
|
||||
ADD U32 [GDT_BOOT_DS+2],EAX
|
||||
ADD U32 [GDT_BOOT_CS+2],EAX
|
||||
ADD EAX,I32 SYS_GDT
|
||||
MOV U32 [SYS_GDT_PTR+CSysLimitBase.base],EAX
|
||||
LGDT U32 [SYS_GDT_PTR]
|
||||
|
||||
//Set-up ptr to limit and base of GDT.
|
||||
MOV U16 [SYS_TEMP_PTR],sizeof(CGDT)-1
|
||||
MOV EAX,U32 [SYS_BOOT_BASE]
|
||||
ADD EAX,SYS_GDT
|
||||
MOV U32 [SYS_TEMP_PTR+2],EAX
|
||||
MOV U16 [SYS_TEMP_PTR+6],0
|
||||
|
||||
LGDT U32 [SYS_TEMP_PTR]
|
||||
MOV EAX,SYS_START_CR0
|
||||
MOV_CR0_EAX
|
||||
|
||||
@@ -195,8 +172,8 @@ The assembler doesn't support far jumps so we hand code it.
|
||||
To complete the switch to 32-bit mode, we have to load
|
||||
the code segment with a far jump.
|
||||
*/
|
||||
DU8 0x66,0xEA; //JMP CGDT.boot_cs:SYS_INIT_OS
|
||||
DU32 SYS_INIT_OS;
|
||||
DU8 0x66,0xEA; //JMP CGDT.boot_cs:BSP_32BIT_INIT
|
||||
DU32 BSP_32BIT_INIT;
|
||||
DU16 CGDT.boot_cs;
|
||||
|
||||
#assert $$+16<=0xFFFF
|
||||
@@ -254,7 +231,7 @@ SYS_CACHE_LINE_WIDTH:: DU64 DFT_CACHE_LINE_WIDTH;
|
||||
SYS_SEMAS:: DU8 NUM_SYS_SEMAS*SEMA_STRUCT_SIZE DUP(0);
|
||||
//************************************
|
||||
ALIGN 16,OC_NOP
|
||||
SYS_INIT_OS:: //Entry point for RAM reboots.
|
||||
BSP_32BIT_INIT:: //Entry point for $LK,"RAMReboot",A="MN:RAMReboot"$.
|
||||
PUSH U32 SYS_START_RFLAGS
|
||||
POPFD
|
||||
MOV EAX,SYS_START_CR0
|
||||
@@ -262,26 +239,9 @@ SYS_INIT_OS:: //Entry point for RAM reboots.
|
||||
|
||||
MOV AX,CGDT.boot_ds //LOAD DS SELECTOR
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
|
||||
MOV EAX,U32 [SYS_RUN_LEVEL]
|
||||
AND EAX,RLF_16BIT
|
||||
OR EAX,RLF_32BIT
|
||||
MOV U32 [SYS_RUN_LEVEL],EAX
|
||||
|
||||
//Patch abs addresses
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_32BIT
|
||||
MOV ESI,U32 [SYS_BOOT_PATCH_TABLE_BASE]
|
||||
MOV EDI,U32 [SYS_BOOT_BASE]
|
||||
MOV AX,CGDT.ds
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
|
||||
MOV ECX,U32 CPatchTableAbsAddr.abs_addres_cnt[ESI]
|
||||
LEA ESI,U32 CPatchTableAbsAddr.abs_addres[ESI]
|
||||
@@05: LODSD
|
||||
ADD EAX,EDI
|
||||
ADD U32 [EAX],EDI
|
||||
LOOP @@05
|
||||
|
||||
MOV AX,CGDT.ds
|
||||
MOV DS,AX
|
||||
@@ -291,13 +251,19 @@ SYS_INIT_OS:: //Entry point for RAM reboots.
|
||||
MOV SS,AX
|
||||
MOV ESP,BOOT_RAM_LIMIT //Temp Stk
|
||||
|
||||
DU8 0xEA; //JMP CGDT.cs32:SYS_CONT_INIT_OS
|
||||
DU32 SYS_CONT_INIT_OS;
|
||||
//Patch abs addresses
|
||||
MOV ECX,U32 CPatchTableAbsAddr.abs_addres_cnt[ESI]
|
||||
LEA ESI,U32 CPatchTableAbsAddr.abs_addres[ESI]
|
||||
@@05: LODSD
|
||||
ADD EAX,EDI
|
||||
ADD U32 [EAX],EDI
|
||||
LOOP @@05
|
||||
|
||||
DU8 0xEA; //JMP CGDT.cs32:@@10
|
||||
DU32 @@10;
|
||||
DU16 CGDT.cs32;
|
||||
|
||||
SYS_CONT_INIT_OS::
|
||||
LOCK
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_PATCHED
|
||||
@@10: BTS U32 [SYS_RUN_LEVEL],RLf_PATCHED
|
||||
|
||||
CALL SYS_FIND_BIOS32_SERVICE_DIR
|
||||
CALL SYS_FIND_PCI_SERVICES
|
||||
@@ -305,11 +271,9 @@ SYS_CONT_INIT_OS::
|
||||
MOV U32 [SYS_HEAP_BASE],SYS_FIXED_AREA+sizeof(CSysFixedArea)
|
||||
CALL SYS_INIT_MEM
|
||||
|
||||
PUSH U32 0
|
||||
CALL INIT_EM64T
|
||||
USE64
|
||||
LOCK
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_64BIT
|
||||
PUSH U32 0 //Return from next call will be 64-bit
|
||||
CALL SYS_EM64T
|
||||
USE64 BTS U32 [SYS_RUN_LEVEL],RLf_64BIT
|
||||
|
||||
FNINIT
|
||||
MOV RAX,SYS_FIXED_AREA+CSysFixedArea.init_fpu_mmx
|
||||
@@ -322,14 +286,13 @@ USE64
|
||||
CALL &CPUStructInit
|
||||
CALL SET_GS_BASE
|
||||
|
||||
//Init Adam heap ctrl
|
||||
//Init Adam HeapCtrl
|
||||
MOV EDI,U32 SYS_FIXED_AREA+CSysFixedArea.adam_hc
|
||||
MOV EAX,U32 SYS_FIXED_AREA+CSysFixedArea.adam_bp
|
||||
MOV U64 CHeapCtrl.bp[RDI],RAX
|
||||
MOV U32 CHeapCtrl.hc_signature[RDI],HEAP_CTRL_SIGNATURE_VAL
|
||||
|
||||
|
||||
LEA RAX,U64 CHeapCtrl.next_um-CMemUsedAllocated.next[RDI]
|
||||
LEA RAX,U64 CHeapCtrl.next_um-CMemUsed.next[RDI]
|
||||
MOV U64 CHeapCtrl.next_um[RDI],RAX
|
||||
MOV U64 CHeapCtrl.last_um[RDI],RAX
|
||||
|
||||
@@ -340,7 +303,6 @@ USE64
|
||||
MOV U32 CTask.task_signature[RAX],TASK_SIGNATURE_VAL
|
||||
MOV U32 CTask.task_in_que_signature[RAX],TASK_IN_QUE_SIGNATURE_VAL
|
||||
|
||||
LOCK
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_BOOT_HEAP
|
||||
|
||||
PUSH ADAM_STK
|
||||
@@ -353,7 +315,7 @@ USE64
|
||||
|
||||
//************************************
|
||||
USE32
|
||||
INIT_EM64T:
|
||||
SYS_EM64T:: //Switch to long 64-bit mode
|
||||
MOV_EAX_CR4
|
||||
OR EAX,0xB0
|
||||
MOV_CR4_EAX
|
||||
@@ -370,24 +332,20 @@ INIT_EM64T:
|
||||
BTS EAX,31 //enable paging (required for 64-bit mode)
|
||||
MOV_CR0_EAX
|
||||
|
||||
DU8 0xEA; //JMP CGDT.cs64:EM64T_PART3
|
||||
DU32 EM64T_PART3;
|
||||
DU8 0xEA; //JMP CGDT.cs64:@@05
|
||||
DU32 @@05;
|
||||
DU16 CGDT.cs64;
|
||||
|
||||
USE64
|
||||
EM64T_PART3:
|
||||
@@05: MOV AX,CGDT.ds
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV SS,AX
|
||||
MOV FS,AX
|
||||
MOV GS,AX
|
||||
RET
|
||||
|
||||
//************************************
|
||||
SYS_RESTART_KERNEL::
|
||||
XOR RDI,RDI
|
||||
MOV EDI,U32 SYS_BOOT_BASE
|
||||
MOV EDI,U32 [RDI]
|
||||
XOR RSI,RSI
|
||||
MOV ESI,U32 SYS_OS_32START
|
||||
MOV ESI,U32 [RSI]
|
||||
ADD ESI,EDI
|
||||
|
||||
SYS_RAM_REBOOT:: //This gets copied high. $LK,"SYS_RAM_REBOOT",A="FF:::/Adam/Boot/Boot.CPP,SYS_RAM_REBOOT:2"$
|
||||
PUSH U32 CGDT.ds //stk seg
|
||||
PUSH U32 BOOT_RAM_LIMIT //stk
|
||||
PUSH U32 0 //flags
|
||||
@@ -396,8 +354,8 @@ SYS_RESTART_KERNEL::
|
||||
PUSH RAX
|
||||
IRET
|
||||
USE32
|
||||
@@10:
|
||||
WBINVD
|
||||
@@10: WBINVD
|
||||
|
||||
//disable paging
|
||||
MOV_EAX_CR0
|
||||
BTR EAX,31
|
||||
@@ -408,8 +366,9 @@ USE32
|
||||
XOR EAX,EAX
|
||||
WRMSR
|
||||
|
||||
MOV EBX,BOOT_CODE_RAM
|
||||
JMP ESI
|
||||
MOV EBX,BOOT_SRC_RAM
|
||||
MOV EAX,I32 BSP_32BIT_INIT
|
||||
JMP EAX
|
||||
USE64
|
||||
SYS_RESTART_KERNEL_END::
|
||||
SYS_RAM_REBOOT_END::
|
||||
}
|
||||
File renamed without changes.
@@ -40,7 +40,7 @@ U0 IPVarsUpdate(I64 x,I64 y,I64 z,Bool l,Bool r)
|
||||
LBEqu(&kbd.scan_code,SCf_IP_R_DOWN,ip.rb);
|
||||
}
|
||||
|
||||
U0 SetIP(I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,I64 l=MAX_I64,I64 r=MAX_I64)
|
||||
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.
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
if (!(0<=x<GR_WIDTH))
|
||||
@@ -61,7 +61,7 @@ U0 SetIP(I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,I64 l=MAX_I64,I64 r=MAX_I64)
|
||||
IPVarsUpdate(x,y,z,l,r);
|
||||
switch (ip.dev) {
|
||||
case IP_MOUSE:
|
||||
SetMouseIP(x,y,z,l,r);
|
||||
MouseIPSet(x,y,z,l,r);
|
||||
break;
|
||||
}
|
||||
Preempt(old_preempt);
|
||||
|
||||
@@ -80,7 +80,7 @@ U0 KbdMouseCmdAck(U8 val)
|
||||
throw;
|
||||
}
|
||||
|
||||
U0 SetTypeMatic(U8 delay)
|
||||
U0 KbdTypeMatic(U8 delay)
|
||||
{//Set speed of repeated keys.
|
||||
try {
|
||||
KbdCmdSend(KBD_CTRL,0xA7); //Disable Mouse
|
||||
@@ -289,15 +289,13 @@ U8 *ScanCode2KeyName(I64 sc)
|
||||
return StrNew(buf);
|
||||
}
|
||||
|
||||
I64 KbdBuildSC(U8 raw_byte,U8 *_last_raw_byte,I64 *_last_sc,
|
||||
Bool *_set_LEDs,Bool *_ctrl_alt)
|
||||
U0 KbdBuildSC(U8 raw_byte,Bool in_irq,U8 *_last_raw_byte,I64 *_last_sc)
|
||||
{
|
||||
I64 sc_flags,sc,sc2,sc_raw;
|
||||
*_set_LEDs=FALSE;
|
||||
*_ctrl_alt=FALSE;
|
||||
I64 ch,sc_flags,sc,sc2,sc_raw;
|
||||
Bool set_LEDs=FALSE;
|
||||
if (raw_byte==0xE0) {
|
||||
*_last_raw_byte=raw_byte;
|
||||
return 0;
|
||||
return;
|
||||
} else {
|
||||
sc=raw_byte;
|
||||
BEqu(&sc,SCf_E0_PREFIX,*_last_raw_byte==0xE0);
|
||||
@@ -317,63 +315,30 @@ I64 KbdBuildSC(U8 raw_byte,U8 *_last_raw_byte,I64 *_last_sc,
|
||||
|
||||
if (sc&SCF_KEY_UP)
|
||||
switch (sc&~SCF_KEY_UP) {
|
||||
case SC_SHIFT: sc_flags&=~SCF_SHIFT; goto kb_new_key_done;
|
||||
case SC_CTRL: sc_flags&=~SCF_CTRL; goto kb_new_key_done;
|
||||
case SC_ALT: sc_flags&=~SCF_ALT; goto kb_new_key_done;
|
||||
case SC_DELETE: sc_flags&=~SCF_DELETE; goto kb_new_key_done;
|
||||
case SC_INS: sc_flags&=~SCF_INS; goto kb_new_key_done;
|
||||
case SC_CAPS:
|
||||
sc_flags^=SCF_CAPS;
|
||||
*_set_LEDs=TRUE;
|
||||
goto kb_new_key_done;
|
||||
case SC_NUM:
|
||||
sc_flags^=SCF_NUM;
|
||||
*_set_LEDs=TRUE;
|
||||
goto kb_new_key_done;
|
||||
case SC_SCROLL:
|
||||
sc_flags^=SCF_SCROLL;
|
||||
*_set_LEDs=TRUE;
|
||||
goto kb_new_key_done;
|
||||
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_CAPS: sc_flags^=SCF_CAPS; set_LEDs=TRUE; break;
|
||||
case SC_NUM: sc_flags^=SCF_NUM; set_LEDs=TRUE; break;
|
||||
case SC_SCROLL: sc_flags^=SCF_SCROLL; set_LEDs=TRUE; break;
|
||||
}
|
||||
else
|
||||
switch (sc) {
|
||||
case SC_SHIFT: sc_flags|=SCF_SHIFT; goto kb_new_key_done;
|
||||
case SC_CTRL: sc_flags|=SCF_CTRL; goto kb_new_key_done;
|
||||
case SC_ALT: sc_flags|=SCF_ALT; goto kb_new_key_done;
|
||||
case SC_DELETE: sc_flags|=SCF_DELETE; goto kb_new_key_done;
|
||||
case SC_INS: sc_flags|=SCF_INS; goto kb_new_key_done;
|
||||
case SC_CAPS: goto kb_new_key_done;
|
||||
case SC_NUM: goto kb_new_key_done;
|
||||
case SC_SCROLL: goto kb_new_key_done;
|
||||
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;
|
||||
}
|
||||
|
||||
sc_flags|=SCF_NEW_KEY;
|
||||
sc=sc_flags|sc|(sc_flags|sc_raw)<<32;
|
||||
if (sc_flags & SCF_CTRL && sc_flags & SCF_ALT) {
|
||||
sc_flags&=~SCF_NEW_KEY;
|
||||
*_ctrl_alt=TRUE;
|
||||
} else {
|
||||
kb_new_key_done:
|
||||
sc_flags|=SCF_NEW_KEY;
|
||||
}
|
||||
return *_last_sc=sc_flags|sc|(sc_flags|sc_raw)<<32;
|
||||
}
|
||||
|
||||
U0 KbdPktRead()
|
||||
{
|
||||
static U8 last_raw_byte=0;
|
||||
static I64 last_sc=0;
|
||||
U8 raw_byte;
|
||||
I64 ch,sc;
|
||||
Bool set_LEDs,ctrl_alt;
|
||||
|
||||
if (GetTSC>kbd.timestamp+cnts.time_stamp_freq>>3)
|
||||
FifoU8Flush(kbd.fifo);
|
||||
kbd.timestamp=GetTSC;
|
||||
raw_byte=InU8(KBD_PORT);
|
||||
sc=KbdBuildSC(raw_byte,&last_raw_byte,&last_sc,&set_LEDs,&ctrl_alt);
|
||||
if (ctrl_alt && sc) {
|
||||
if (!(sc & SCF_KEY_UP)) {
|
||||
if (sc&255==SC_DELETE)
|
||||
CtrlAltDel(last_sc);
|
||||
CtrlAltDel(sc);
|
||||
else {
|
||||
if (sc&255==SC_ESC)
|
||||
ch='e';
|
||||
@@ -381,14 +346,32 @@ U0 KbdPktRead()
|
||||
ch='t';
|
||||
else
|
||||
ch=ScanCode2Char(sc&255);
|
||||
if ('a'<=ch<='z' && keydev.fp_ctrl_alt_let_cbs[ch-'a'] &&
|
||||
Bt(&keydev.ctrl_alt_let_in_irq_flags,ch-'a')) {
|
||||
(*keydev.fp_ctrl_alt_let_cbs[ch-'a'])(last_sc);
|
||||
return;
|
||||
if ('a'<=ch<='z') {
|
||||
sc&=~(SCF_NEW_KEY|SCF_NEW_KEY<<32);
|
||||
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 (set_LEDs && !in_irq)
|
||||
KbdSetLEDs(sc);
|
||||
*_last_sc=sc;
|
||||
}
|
||||
|
||||
U0 KbdPktRead()
|
||||
{
|
||||
static U8 last_raw_byte=0;
|
||||
static I64 last_sc=0;
|
||||
U8 raw_byte;
|
||||
if (GetTSC>kbd.timestamp+cnts.time_stamp_freq>>3)
|
||||
FifoU8Flush(kbd.fifo);
|
||||
kbd.timestamp=GetTSC;
|
||||
raw_byte=InU8(KBD_PORT);
|
||||
KbdBuildSC(raw_byte,TRUE,&last_raw_byte,&last_sc);
|
||||
if (!FifoU8Cnt(kbd.fifo)) {
|
||||
FifoU8Ins(kbd.fifo,raw_byte);
|
||||
if (raw_byte!=0xE0) {
|
||||
@@ -415,7 +398,7 @@ interrupt U0 KbdIntHandler()
|
||||
KbdPktRead;
|
||||
}
|
||||
|
||||
U0 SetCtrlAltLetCB(U8 ch,U0 (*fp_handler)(I64 sc),U8 *desc,Bool in_irq=FALSE)
|
||||
U0 CtrlAltLetCBSet(U8 ch,U0 (*fp_handler)(I64 sc),U8 *desc,Bool in_irq=FALSE)
|
||||
{//Set callback for <CTRL-ALT-letter>.
|
||||
ch=ToUpper(ch)-'A';
|
||||
if (ch<26) {
|
||||
@@ -442,45 +425,24 @@ U0 KbdInit()
|
||||
IntEntrySet(0x21,&KbdIntHandler);
|
||||
OutU8(0x21,InU8(0x21)&~2);
|
||||
|
||||
SetCtrlAltLetCB('C',&CtrlAltC,"Sys/Break Execution",TRUE);
|
||||
SetCtrlAltLetCB('D',&CtrlAltD,"Sys/Enter Debugger",TRUE);
|
||||
SetCtrlAltLetCB('E',&CtrlAltE,"Sys/Spawn New User Task");
|
||||
SetCtrlAltLetCB('F',&CtrlAltF,"Sys/VGA Flush",TRUE);
|
||||
SetCtrlAltLetCB('M',&CtrlAltM,"Sys/Toggle Mute");
|
||||
SetCtrlAltLetCB('T',&CtrlAltT,"Sys/Switch Focus to Next Task",TRUE);
|
||||
SetCtrlAltLetCB('X',&CtrlAltX,"Sys/Kill Focused Task",TRUE);
|
||||
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);
|
||||
}
|
||||
|
||||
U0 KbdHandler()
|
||||
{
|
||||
static U8 last_raw_byte=0;
|
||||
U8 raw_byte;
|
||||
Bool set_LEDs,ctrl_alt;
|
||||
I64 ch,sc;
|
||||
|
||||
FifoU8Rem(kbd.fifo2,&raw_byte);
|
||||
sc=KbdBuildSC(raw_byte,&last_raw_byte,&kbd.scan_code,&set_LEDs,&ctrl_alt);
|
||||
if (set_LEDs)
|
||||
KbdSetLEDs(sc);
|
||||
KbdBuildSC(raw_byte,FALSE,&last_raw_byte,&kbd.scan_code);
|
||||
if (raw_byte==0xE0) {
|
||||
FifoU8Rem(kbd.fifo2,&raw_byte);
|
||||
sc=KbdBuildSC(raw_byte,&last_raw_byte,&kbd.scan_code,&set_LEDs,&ctrl_alt);
|
||||
if (set_LEDs)
|
||||
KbdSetLEDs(sc);
|
||||
}
|
||||
if (ctrl_alt) {
|
||||
if (!(sc & SCF_KEY_UP)) {
|
||||
if (sc&255==SC_ESC)
|
||||
ch='e';
|
||||
else if (sc&255==SC_TAB)
|
||||
ch='t';
|
||||
else
|
||||
ch=ScanCode2Char(sc&255);
|
||||
if ('a'<=ch<='z' && keydev.fp_ctrl_alt_let_cbs[ch-'a'] &&
|
||||
!Bt(&keydev.ctrl_alt_let_in_irq_flags,ch-'a'))
|
||||
(*keydev.fp_ctrl_alt_let_cbs[ch-'a'])(kbd.scan_code);
|
||||
}
|
||||
return;
|
||||
KbdBuildSC(raw_byte,FALSE,&last_raw_byte,&kbd.scan_code);
|
||||
}
|
||||
if (Btr(&kbd.scan_code,SCf_NEW_KEY)) {
|
||||
Btr(&kbd.scan_code,32+SCf_NEW_KEY);
|
||||
|
||||
@@ -127,7 +127,7 @@ Bool MouseRst()
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 SetMouseSpeed()
|
||||
U0 MouseSpeedSet()
|
||||
{
|
||||
I64 dd,temp;
|
||||
if ((dd=SqrI64(mouse_last.pos.x-mouse.pos.x)+SqrI64(mouse_last.pos.y-mouse.pos.y)) &&
|
||||
@@ -164,7 +164,7 @@ U0 MouseUpdatePost()
|
||||
|
||||
if (mouse.pos.x!=mouse_last.pos.x || mouse.pos.y!=mouse_last.pos.y || mouse.pos.z!=mouse_last.pos.z) {
|
||||
mouse.evt=TRUE;
|
||||
SetMouseSpeed;
|
||||
MouseSpeedSet;
|
||||
} else
|
||||
for (i=0;i<5;i++)
|
||||
if (mouse.buttons[i]!=mouse_last.buttons[i]) {
|
||||
@@ -210,7 +210,7 @@ U0 MouseHandler()
|
||||
MouseUpdatePost;
|
||||
}
|
||||
|
||||
U0 SetMouseIP(I64 x,I64 y,I64 z,I64 l,I64 r)
|
||||
U0 MouseIPSet(I64 x,I64 y,I64 z,I64 l,I64 r)
|
||||
{
|
||||
mouse.timestamp=GetTSC;
|
||||
MouseUpdatePre;
|
||||
|
||||
+3204
-3213
File diff suppressed because it is too large.
Load diff
+32
-29
@@ -1,43 +1,45 @@
|
||||
//Compile this by calling $LK,"MakeOSPrtBootInstall",A="MN:MakeOSPrtBootInstall"$().
|
||||
//Don't do it directly. See $LK,"Cmp(\"Kernel\")",A="FF:::/Adam/Boot/InsBoot.CPP,Cmp(\"Kernel\""$.
|
||||
//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\""$.
|
||||
|
||||
#exe {
|
||||
OptOn(OPTf_WARN_PAREN);
|
||||
OptOn(OPTf_WARN_DUP_TYPES);
|
||||
#include "KCfg"
|
||||
CKernelCfg *kernel_cfg;
|
||||
kernel_cfg=KernelCfgNew;
|
||||
Cd(__DIR__);;
|
||||
OptOn(OPTf_WARN_PAREN);
|
||||
OptOn(OPTf_WARN_DUP_TYPES);
|
||||
#include "KCfg"
|
||||
CKernelCfg *kernel_cfg;
|
||||
kernel_cfg=KernelCfgNew;
|
||||
};
|
||||
|
||||
#include "Adam1a.HPP"
|
||||
#include "KernelA.HPP"
|
||||
#include "KStart"
|
||||
#include "Utils1a"
|
||||
#include "Math1a"
|
||||
#include "/Compiler/CmpDefs.HPP"
|
||||
#include "Adam1b.HPP"
|
||||
#include "KUtils"
|
||||
#include "KMathA"
|
||||
#include "/Compiler/CompilerA.HPP"
|
||||
#include "KernelB.HPP"
|
||||
#include "KExts"
|
||||
#include "Str1a"
|
||||
#include "Mem1a"
|
||||
#include "StrA"
|
||||
#include "MemA"
|
||||
#include "KGlbls"
|
||||
#include "Mem1b"
|
||||
#include "Math1b"
|
||||
#include "MemB"
|
||||
#include "KMathB"
|
||||
#include "Sched"
|
||||
#include "Mem1c"
|
||||
#include "MemC"
|
||||
#include "Font8x8"
|
||||
#include "Hash1a"
|
||||
#include "Str1b"
|
||||
#include "KHashA"
|
||||
#include "StrB"
|
||||
#include "Ints"
|
||||
#include "DataTypes1a"
|
||||
#include "KDataTypes"
|
||||
#include "Compress"
|
||||
#include "Hash1b"
|
||||
#include "KHashB"
|
||||
#include "KLoad"
|
||||
#include "Date"
|
||||
#include "StrPrint"
|
||||
#include "StrScan"
|
||||
#include "Define1a"
|
||||
#include "KDefine"
|
||||
#include "Display"
|
||||
#include "KeyDev"
|
||||
#include "Misc1a"
|
||||
#include "Dbg1a"
|
||||
#include "KMisc"
|
||||
#include "KDbg"
|
||||
#include "Except"
|
||||
#include "KbdMouse/InputPointer"
|
||||
#include "KbdMouse/Keyboard"
|
||||
@@ -45,7 +47,7 @@ kernel_cfg=KernelCfgNew;
|
||||
#include "KbdMouse/Message"
|
||||
|
||||
#include "QSort"
|
||||
#include "Task1a"
|
||||
#include "Task"
|
||||
#include "SrvCmd"
|
||||
#include "BIOS32"
|
||||
|
||||
@@ -53,15 +55,16 @@ kernel_cfg=KernelCfgNew;
|
||||
#include "DskStr"
|
||||
#include "DskCache"
|
||||
#include "DskATA"
|
||||
#include "Dsk1a"
|
||||
#include "DskATAId"
|
||||
#include "DskA"
|
||||
#include "DskAddDev"
|
||||
#include "DskDir"
|
||||
#include "FileSysISO1"
|
||||
#include "FileSysISO"
|
||||
#include "FileSysRedSea"
|
||||
#include "FileSysFAT"
|
||||
#include "Dsk1b"
|
||||
#include "DskB"
|
||||
#include "DskCFile"
|
||||
#include "Dsk1c"
|
||||
#include "DskC"
|
||||
|
||||
#exe {Cd("..");};
|
||||
#include "MultiProc"
|
||||
|
||||
@@ -38,6 +38,7 @@ extern class CIntermediateCode;
|
||||
#define INVALID_PTR MAX_I64
|
||||
|
||||
//(Int to F64 conversion is signed)
|
||||
//Turn off 80-bit float constants with $LK,"OPTf_NO_BUILTIN_CONST",A="MN:OPTf_NO_BUILTIN_CONST"$.
|
||||
#define MAX_U64_F64 (0x43F0000000000000(F64))
|
||||
#define MAX_F64 (0x7FEFFFFFFFFFFFFF(F64))
|
||||
#define MIN_F64 (0xFFEFFFFFFFFFFFFF(F64))
|
||||
@@ -207,13 +208,13 @@ public class CMass
|
||||
CMass *next,*last;
|
||||
COrder2D3 *state,*DstateDt;
|
||||
|
||||
U0 start_saved_area;
|
||||
U0 start;
|
||||
U32 flags,num;
|
||||
F64 mass,drag_profile_factor;
|
||||
U0 saved_state;
|
||||
F64 x,y,z,
|
||||
DxDt,DyDt,DzDt;
|
||||
U0 end_saved_area;
|
||||
U0 end;
|
||||
};
|
||||
|
||||
#define SSF_INACTIVE 1
|
||||
@@ -225,11 +226,11 @@ public class CSpring
|
||||
CMass *end1,*end2;
|
||||
F64 f,displacement; //set for you to check
|
||||
|
||||
U0 start_saved_area;
|
||||
U0 start;
|
||||
U32 flags,num,
|
||||
end1_num,end2_num;
|
||||
F64 const,rest_len;
|
||||
U0 end_saved_area;
|
||||
U0 end;
|
||||
};
|
||||
|
||||
//Ordinary Differential Equations
|
||||
@@ -237,11 +238,9 @@ public class CSpring
|
||||
#define ODEF_PAUSED 2
|
||||
#define ODEF_STARTED 4
|
||||
|
||||
#define ODE_SIGNATURE_VAL 'ODES'
|
||||
public class CMathODE
|
||||
{
|
||||
CMathODE *next,*last;
|
||||
U32 ode_signature,pad;
|
||||
I64 flags,n,n_internal;
|
||||
CMass *next_mass,*last_mass;
|
||||
CSpring *next_spring,*last_spring;
|
||||
@@ -344,6 +343,12 @@ class CGDT
|
||||
CGDTEntry tr_ring3[MP_MAX_PROCESSORS];
|
||||
};
|
||||
|
||||
class CSysLimitBase
|
||||
{
|
||||
U16 limit; //Offset of last byte, not size.
|
||||
U8 *base; //&GDT or &IDT
|
||||
};
|
||||
|
||||
#help_index "Memory/Info"
|
||||
#define MEM_NUM_E820_ENTRIES 48
|
||||
#define MEM_E820_ENTRY_SIZE 20
|
||||
@@ -362,13 +367,13 @@ class CMemE820
|
||||
|
||||
#define BIN_SIGNATURE_VAL 'TOSB'
|
||||
class CBinFile
|
||||
{//$LK,"Bin File Header Generation",A="FF:::/Compiler/CmpMain.CPP,16 ALIGN"$ by compiler.
|
||||
{//$LK,"Bin File Header Generation",A="FF:::/Compiler/CMain.CPP,16 ALIGN"$ by compiler.
|
||||
U16 jmp;
|
||||
U8 module_align_bits,
|
||||
reserved;
|
||||
U32 bin_signature;
|
||||
I64 module_org,
|
||||
patch_table_offset, //$LK,"Patch Table Generation",A="FF:::/Compiler/CmpMain.CPP,EIT_ABS_ADDR"$
|
||||
patch_table_offset, //$LK,"Patch Table Generation",A="FF:::/Compiler/CMain.CPP,EIT_ABS_ADDR"$
|
||||
file_size;
|
||||
};
|
||||
|
||||
@@ -392,7 +397,7 @@ class CPatchTableAbsAddr
|
||||
#define EIT_REL_I32 8
|
||||
#define EIT_IMM_U32 9
|
||||
#define EIT_REL_I64 10
|
||||
#define EIT_IMM_U64 11
|
||||
#define EIT_IMM_I64 11
|
||||
//reserved
|
||||
#define EIT_REL32_EXPORT 16
|
||||
#define EIT_IMM32_EXPORT 17
|
||||
@@ -410,54 +415,56 @@ class CKernel
|
||||
{//Must match $LK,"OSStartUp",A="FF:::/Kernel/KStart.CPP,SYS_BOOT_BASE"$
|
||||
CBinFile h;
|
||||
U32 jmp,
|
||||
boot_base,
|
||||
boot_patch_table_base;
|
||||
boot_src,
|
||||
boot_patch_table_base,
|
||||
sys_run_level;
|
||||
CDate compile_time;
|
||||
U32 os_32start,
|
||||
boot_code;
|
||||
|
||||
U0 start;
|
||||
U32 boot_base;
|
||||
U16 sys_mem_E801[2];
|
||||
CMemE820 sys_mem_E820[MEM_NUM_E820_ENTRIES];
|
||||
CGDT sys_gdt;
|
||||
U16 sys_gr_mode,
|
||||
sys_pci_busses;
|
||||
CSysLimitBase sys_gdt_ptr;
|
||||
U16 sys_pci_busses;
|
||||
};
|
||||
|
||||
//Run-Levels
|
||||
#define RLf_16BIT 0
|
||||
#define RLf_32BIT 1
|
||||
#define RLf_PATCHED 2
|
||||
#define RLf_64BIT 3
|
||||
#define RLf_BOOT_HEAP 4
|
||||
#define RLf_FULL_HEAP 5
|
||||
#define RLf_RAW 6
|
||||
#define RLf_INTERRUPTS 7
|
||||
#define RLf_MP 8
|
||||
#define RLf_DSK 9
|
||||
#define RLf_COMPILER 10
|
||||
#define RLf_DOC 11
|
||||
#define RLf_WINMGR 12
|
||||
#define RLf_LOGIN 13
|
||||
#define RLf_VGA 1
|
||||
#define RLf_32BIT 2
|
||||
#define RLf_PATCHED 3
|
||||
#define RLf_64BIT 4
|
||||
#define RLf_BOOT_HEAP 5
|
||||
#define RLf_FULL_HEAP 6
|
||||
#define RLf_RAW 7
|
||||
#define RLf_INTERRUPTS 8
|
||||
#define RLf_MP 9
|
||||
#define RLf_DSK 10
|
||||
#define RLf_COMPILER 11
|
||||
#define RLf_DOC 12
|
||||
#define RLf_WINMGR 13
|
||||
#define RLf_REGISTRY 14
|
||||
#define RLf_ADAM2 15
|
||||
#define RLf_HOME 15
|
||||
#define RLf_ADAM_SERVER 16
|
||||
|
||||
#define RLF_16BIT 0x000001
|
||||
#define RLF_32BIT 0x000002
|
||||
#define RLF_PATCHED 0x000004
|
||||
#define RLF_64BIT 0x000008
|
||||
#define RLF_BOOT_HEAP 0x000010
|
||||
#define RLF_FULL_HEAP 0x000020
|
||||
#define RLF_RAW 0x000040
|
||||
#define RLF_INTERRUPTS 0x000080
|
||||
#define RLF_MP 0x000100
|
||||
#define RLF_DSK 0x000200
|
||||
#define RLF_COMPILER 0x000400
|
||||
#define RLF_DOC 0x000800
|
||||
#define RLF_WINMGR 0x001000
|
||||
#define RLF_LOGIN 0x002000
|
||||
#define RLF_REGISTRY 0x004000
|
||||
#define RLF_ADAM2 0x008000
|
||||
#define RLF_ADAM_SERVER 0x010000
|
||||
#define RLF_16BIT 0x00001
|
||||
#define RLF_VGA 0x00002
|
||||
#define RLF_32BIT 0x00004
|
||||
#define RLF_PATCHED 0x00008
|
||||
#define RLF_64BIT 0x00010
|
||||
#define RLF_BOOT_HEAP 0x00020
|
||||
#define RLF_FULL_HEAP 0x00040
|
||||
#define RLF_RAW 0x00080
|
||||
#define RLF_INTERRUPTS 0x00100
|
||||
#define RLF_MP 0x00200
|
||||
#define RLF_DSK 0x00400
|
||||
#define RLF_COMPILER 0x00800
|
||||
#define RLF_DOC 0x01000
|
||||
#define RLF_WINMGR 0x02000
|
||||
#define RLF_REGISTRY 0x04000
|
||||
#define RLF_HOME 0x08000
|
||||
#define RLF_ADAM_SERVER 0x10000
|
||||
|
||||
#help_index "Processor"
|
||||
#define LAPIC_BASE 0xFEE00000
|
||||
@@ -508,11 +515,10 @@ class CKernel
|
||||
#define IA32_FS_BASE 0xC0000100
|
||||
#define IA32_GS_BASE 0xC0000101
|
||||
|
||||
//Multi-Processor
|
||||
class CMPMain
|
||||
{
|
||||
class CAP16BitInit
|
||||
{//AP Multicore
|
||||
U32 jmp;
|
||||
I64 sys_temp_ptr;
|
||||
CSysLimitBase ap_gdt_ptr;
|
||||
};
|
||||
|
||||
#help_index "Time/CPU Cycles;Time/HPET;Time/Jiffies"
|
||||
@@ -606,7 +612,7 @@ class CSema
|
||||
|
||||
#help_index "Hash/System"
|
||||
//Hash table types
|
||||
//$LK,"ST_HTT_TYPES",A="FF:::/Kernel/Define1a.CPP,ST_HTT_TYPES"$
|
||||
//$LK,"ST_HTT_TYPES",A="FF:::/Kernel/KDefine.CPP,ST_HTT_TYPES"$
|
||||
#define HTt_EXPORT_SYS_SYM 0
|
||||
#define HTt_IMPORT_SYS_SYM 1
|
||||
#define HTt_DEFINE_STR 2
|
||||
@@ -644,8 +650,8 @@ class CSema
|
||||
#define HTT_CLASS 0x00010 //CHashClass
|
||||
#define HTT_INTERNAL_TYPE 0x00020 //CHashClass
|
||||
#define HTT_FUN 0x00040 //CHashFun
|
||||
#define HTT_WORD 0x00080 //CHashWS -- only in WS table
|
||||
#define HTT_DICT_WORD 0x00100 //CHashGeneric -- only in WS table
|
||||
#define HTT_WORD 0x00080 //CHashAC--only in AutoComplete table
|
||||
#define HTT_DICT_WORD 0x00100 //CHashGeneric--only in AutoComplete table
|
||||
#define HTT_KEYWORD 0x00200 //CHashGeneric
|
||||
#define HTT_ASM_KEYWORD 0x00400 //CHashGeneric
|
||||
#define HTT_OPCODE 0x00800 //CHashOpcode
|
||||
@@ -684,17 +690,13 @@ public class CHash
|
||||
//in front for searches. Old function code is not freed
|
||||
//because a reference might use it.
|
||||
CHash *next;
|
||||
//Sometimes, the whole hash table is traversed, for example, in $LK,"PSectFind",A="MN:PSectFind"$().
|
||||
//To speed traversal, the following links allow skipping
|
||||
//the empty slots.
|
||||
CHash *next_added,*last_added;
|
||||
U8 *str;
|
||||
U32 type,use_cnt;
|
||||
//use_cnt is never decremented. It is incremented
|
||||
//each time a node is found in a hash search.
|
||||
//One place it is used is to tell if a externed function was unused
|
||||
//before being defined. It is also used for popularity measures
|
||||
//in wordstat. You can do a $LK,"Who",A="MN:Who"$() to see
|
||||
//in autocomplete. You can do a $LK,"Who",A="MN:Who"$() to see
|
||||
//roughly how many times a symbol has been
|
||||
//referenced. Beware of instances where
|
||||
//a hash entry is continuously searched for and
|
||||
@@ -732,12 +734,11 @@ public class CHashReg:CHash
|
||||
public class CHashTable
|
||||
{
|
||||
CHashTable *next;
|
||||
CHash *next_added,*last_added;
|
||||
I64 mask,locked_flags;
|
||||
CHash **body;
|
||||
};
|
||||
|
||||
public class CHashWS:CHash
|
||||
public class CHashAC:CHash
|
||||
{
|
||||
I32 num;
|
||||
U32 hits;
|
||||
@@ -789,7 +790,8 @@ public class CMemberLstMeta
|
||||
|
||||
public class CMemberLst
|
||||
{
|
||||
CMemberLst *next,*left,*right,*left2,*right2;
|
||||
CMemberLst *next,*left,*right,
|
||||
*left2,*right2; //For finding dup class local vars, not names.
|
||||
U8 *str;
|
||||
CHashClass *member_class,*member_class2;
|
||||
CMemberLstMeta *meta;
|
||||
@@ -820,7 +822,7 @@ public class CHashClass:CHashSrcSym
|
||||
{//See $LK,"PrsClassNew",A="MN:PrsClassNew"$(). base_class of $LK,"CHashFun",A="MN:CHashFun"$
|
||||
I64 size,neg_offset;
|
||||
U32 member_cnt;
|
||||
U8 ptr_cnt,raw_type;
|
||||
U8 ptr_stars_cnt,raw_type;
|
||||
U16 flags;
|
||||
CMemberLst *member_lst,*member_lst2,
|
||||
*last_in_member_lst;
|
||||
@@ -992,20 +994,20 @@ public class CHashGlblVar:CHashSrcSym
|
||||
#define DOCEF_CHECKED_COLLAPSED 0x40000000000 //Checked or Collapsed
|
||||
#define DOCEF_CHECK_COLLAPSABLE 0x80000000000
|
||||
#define DOCEF_REFRESH_DATA 0x100000000000
|
||||
#define DOCEF_DATA_IS_PTR 0x200000000000
|
||||
#define DOCEF_HAS_TERMINATOR 0x400000000000
|
||||
#define DOCEF_ZERO_BASED 0x800000000000
|
||||
#define DOCEF_HOLD 0x1000000000000
|
||||
#define DOCEF_TREE 0x2000000000000
|
||||
#define DOCEF_LST 0x4000000000000
|
||||
#define DOCEF_SKIP 0x8000000000000
|
||||
#define DOCEF_POPUP 0x10000000000000
|
||||
#define DOCEF_SKIP_IN_FORM 0x20000000000000
|
||||
#define DOCEF_HARD_SKIP 0x40000000000000
|
||||
#define DOCEF_FILTER_SKIP 0x80000000000000
|
||||
#define DOCEF_NO_CLICK_ON 0x100000000000000
|
||||
#define DOCEF_DONT_DRAW 0x200000000000000 //only works on sprites
|
||||
#define DOCEF_UPDATE_DATA 0x400000000000000
|
||||
#define DOCEF_UPDATE_DATA 0x200000000000
|
||||
#define DOCEF_DATA_IS_PTR 0x400000000000
|
||||
#define DOCEF_HAS_TERMINATOR 0x800000000000
|
||||
#define DOCEF_ZERO_BASED 0x1000000000000
|
||||
#define DOCEF_HOLD 0x2000000000000
|
||||
#define DOCEF_TREE 0x4000000000000
|
||||
#define DOCEF_LST 0x8000000000000
|
||||
#define DOCEF_SKIP 0x10000000000000
|
||||
#define DOCEF_POPUP 0x20000000000000
|
||||
#define DOCEF_SKIP_IN_FORM 0x40000000000000
|
||||
#define DOCEF_HARD_SKIP 0x80000000000000
|
||||
#define DOCEF_FILTER_SKIP 0x100000000000000
|
||||
#define DOCEF_NO_CLICK_ON 0x200000000000000
|
||||
#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)
|
||||
@@ -1067,20 +1069,20 @@ public class CHashGlblVar:CHashSrcSym
|
||||
#define DOCEf_CHECKED_COLLAPSED 42 //Checked or Collapsed
|
||||
#define DOCEf_CHECK_COLLAPSABLE 43
|
||||
#define DOCEf_REFRESH_DATA 44
|
||||
#define DOCEf_DATA_IS_PTR 45
|
||||
#define DOCEf_HAS_TERMINATOR 46
|
||||
#define DOCEf_ZERO_BASED 47
|
||||
#define DOCEf_HOLD 48
|
||||
#define DOCEf_TREE 49
|
||||
#define DOCEf_LST 50
|
||||
#define DOCEf_SKIP 51
|
||||
#define DOCEf_POPUP 52
|
||||
#define DOCEf_SKIP_IN_FORM 53
|
||||
#define DOCEf_HARD_SKIP 54
|
||||
#define DOCEf_FILTER_SKIP 55
|
||||
#define DOCEf_NO_CLICK_ON 56
|
||||
#define DOCEf_DONT_DRAW 57 //only works on sprites
|
||||
#define DOCEf_UPDATE_DATA 58
|
||||
#define DOCEf_UPDATE_DATA 45
|
||||
#define DOCEf_DATA_IS_PTR 46
|
||||
#define DOCEf_HAS_TERMINATOR 47
|
||||
#define DOCEf_ZERO_BASED 48
|
||||
#define DOCEf_HOLD 49
|
||||
#define DOCEf_TREE 50
|
||||
#define DOCEf_LST 51
|
||||
#define DOCEf_SKIP 52
|
||||
#define DOCEf_POPUP 53
|
||||
#define DOCEf_SKIP_IN_FORM 54
|
||||
#define DOCEf_HARD_SKIP 55
|
||||
#define DOCEf_FILTER_SKIP 56
|
||||
#define DOCEf_NO_CLICK_ON 57
|
||||
#define DOCEf_DONT_DRAW 58 //only works on sprites
|
||||
#define DOCEf_NUM_FLAGS 59
|
||||
|
||||
public class CDocBin
|
||||
@@ -1217,11 +1219,13 @@ class CEdFileName
|
||||
#define EDF_BAIL 0x100
|
||||
#define EDF_COLLAPSE 0x200
|
||||
#define EDF_UNCOLLAPSE 0x400
|
||||
#define EDF_WAS_WRITE 0x800 //Was exit ESC or SHIFT_ESC?
|
||||
//Combines with $LK,"Document Flags",A="MN:DOF_MIN_SIZE"$
|
||||
|
||||
#define EDf_BAIL 8
|
||||
#define EDf_COLLAPSE 9
|
||||
#define EDf_UNCOLLAPSE 10
|
||||
#define EDf_WAS_WRITE 11
|
||||
|
||||
// DOC header flags
|
||||
#define DOCF_PLAIN_TEXT 0x1
|
||||
@@ -1334,7 +1338,7 @@ public class CDoc //Linked Text File header
|
||||
cmd_U8;
|
||||
U32 doc_signature,cur_bin_num;
|
||||
I64 max_entries,
|
||||
refresh_cnt;
|
||||
updates_cnt;
|
||||
CEdFindText *find_replace;
|
||||
|
||||
U8 *cur_sprite;
|
||||
@@ -1420,26 +1424,22 @@ class CWinMgrTimingGlbls
|
||||
I64 last_total_jiffies,
|
||||
last_idle_pt_hits[MP_MAX_PROCESSORS],
|
||||
last_swap_cnter[MP_MAX_PROCESSORS];
|
||||
F64 last_refresh_time,
|
||||
last_refresh_start_time,
|
||||
last_refresh_end_time,
|
||||
refresh_time,
|
||||
refresh_delta_time;
|
||||
I64 refresh_cnt,
|
||||
refresh_skips;
|
||||
F64 last_calc_idle_time,calc_idle_delta_time;
|
||||
I64 calc_idle_cnt;
|
||||
};
|
||||
|
||||
#define WMG_FPS 30
|
||||
|
||||
public class CWinMgrGlbls
|
||||
{
|
||||
I64 updates;
|
||||
F64 ode_time,
|
||||
last_ode_time,
|
||||
desired_fps, //This is chosen by the winmgr.
|
||||
fps; //You can read but not write this. You have no control.
|
||||
fps, //You can read but not write this. You have no control.
|
||||
last_refresh_tS;
|
||||
CTask *old_focus_task;
|
||||
CWinMgrTimingGlbls *t;
|
||||
Bool first, //First after start-up complete
|
||||
show_menu,
|
||||
Bool show_menu,
|
||||
grab_scroll,
|
||||
grab_scroll_closed;
|
||||
};
|
||||
@@ -1477,10 +1477,10 @@ public class CWinMgrGlbls
|
||||
#define RT_I32 8
|
||||
#define RT_U32 9
|
||||
#define RT_I64 10
|
||||
#define RT_PTR 10
|
||||
#define RT_PTR 10 //Signed to allow negative err codes. $LK,"DOCM_CANCEL",A="MN:DOCM_CANCEL"$
|
||||
#define RT_U64 11
|
||||
#define RT_F32 12 //Not implemented
|
||||
#define RT_UF32 13 //Not implemented
|
||||
#define RT_UF32 13 //Not implemented, Fictitious
|
||||
#define RT_F64 14
|
||||
#define RT_UF64 15 //Fictitious
|
||||
#define RT_NUM_IT 16
|
||||
@@ -1572,7 +1572,7 @@ class CIntermediateCode:CIntermediateCodeBase
|
||||
//points back to its two earlier addend instructions, not MAlloced,
|
||||
//just pointers to previous CIntermediate codes in the array.
|
||||
|
||||
//Tree links get destroyed during Pass789 when they get overwrites
|
||||
//Tree links get destroyed during Pass789A when they get overwrites
|
||||
//by machine code. (Saves room to union the output machine code buffer
|
||||
//with these links, since they are not needed after pass4.
|
||||
|
||||
@@ -1920,6 +1920,13 @@ class CLexCodeCtrl
|
||||
};
|
||||
|
||||
#help_index "Compiler/Lex"
|
||||
#define __DATE__ #exe{StreamPrint("\"%D\"",Now);}
|
||||
#define __TIME__ #exe{StreamPrint("\"%T\"",Now);}
|
||||
#define __LINE__ #exe{StreamPrint("%d",Fs->last_lex->cur_lfn->line_num);}
|
||||
#define __DEPTH__ #exe{StreamPrint("%d",Fs->last_lex->cur_lfn-&Fs->last_lex->lfns-1);}
|
||||
#define __FILE__ #exe{StreamPrint("\"%s\"",Fs->last_lex->cur_lfn->full_name);}
|
||||
#define __DIR__ #exe{StreamDir;}
|
||||
|
||||
#define LFSF_DOC 1
|
||||
#define LFSF_DEFINE 2
|
||||
class CLexFile
|
||||
@@ -1927,7 +1934,7 @@ class CLexFile
|
||||
U8 *buf,
|
||||
*buf_ptr;
|
||||
I64 line_num,flags;
|
||||
U8 *name,
|
||||
U8 *full_name,
|
||||
*line_start;
|
||||
CDoc *doc;
|
||||
CDocEntry *cur_entry;
|
||||
@@ -2065,7 +2072,7 @@ public class CLex
|
||||
U8 *cur_str;
|
||||
I64 cur_str_len,
|
||||
class_ip;
|
||||
U8 *dollar;
|
||||
U8 *dollar_buf;
|
||||
I64 dollar_cnt;
|
||||
U8 *cur_help_index;
|
||||
I64 last_U16,
|
||||
@@ -2086,7 +2093,7 @@ public class CLex
|
||||
|
||||
I64 pass,
|
||||
opts,
|
||||
pass_trace_mask,
|
||||
otrace_mask,
|
||||
error_cnt,warning_cnt;
|
||||
|
||||
//For intermediate codes with multiple float ops (int<->float conversions)
|
||||
@@ -2100,7 +2107,7 @@ public class CLex
|
||||
CAOTCtrl *a;
|
||||
I64 a_depth;
|
||||
|
||||
U0 end_of_zeroed_members;
|
||||
U0 end_zeroed;
|
||||
CLexFile lfns[LFN_CNT];
|
||||
CLexFile stk[LFN_STK_CNT];
|
||||
U0 pad;#assert !($$&7) //(compiler lags one token)
|
||||
@@ -2115,15 +2122,11 @@ public class CCmpGlbls
|
||||
CIntermediateCode ic_nop;
|
||||
U32 *dual_U16_tokens1,*dual_U16_tokens2,*dual_U16_tokens3,
|
||||
*binary_ops;
|
||||
U8 *arg_cnt,*result_cnt,
|
||||
*ic_bitmap_deref,*ic_bitmap_assign,
|
||||
*ic_bitmap_not_const,*ic_bitmap_cmp,
|
||||
*ic_bitmap_fpop;
|
||||
I64 num_stk_temps,num_reg_vars,num_non_ptr_vars,
|
||||
stk_temps_mask,reg_vars_mask,non_ptr_vars_mask;
|
||||
U8 *to_stk_temps_map_odd,*to_stk_temps_map_even,
|
||||
*to_reg_vars_map,*non_ptr_vars_map;
|
||||
I64 compiled_lines,compiled_funs,compiled_bytes;
|
||||
I64 compiled_lines;
|
||||
};
|
||||
|
||||
#help_index "Debugging/Unassemble"
|
||||
@@ -2153,7 +2156,7 @@ public class CATARep
|
||||
I64 num,type,base0,base1,unit,irq;
|
||||
};
|
||||
|
||||
//See $LK,"::/Doc/Acknowledgements.TXT"$.
|
||||
//See $LK,"::/Doc/Credits.TXT"$.
|
||||
#define ATA_NOP 0x00
|
||||
#define ATA_DEV_RST 0x08
|
||||
#define ATA_PACKET 0xA0
|
||||
@@ -2207,27 +2210,28 @@ class CMBRPrt
|
||||
end_head;
|
||||
U16 end_cyl;
|
||||
U32 offset, //Sects between MBR and first sect
|
||||
size; //Sects in partition
|
||||
size; //Sects in drv
|
||||
};
|
||||
|
||||
class CMasterBoot
|
||||
{
|
||||
U8 boot_code[440];
|
||||
U8 code[440];
|
||||
U32 media_id;
|
||||
U16 zero;
|
||||
CMBRPrt p[4];
|
||||
U16 signature; //AA55
|
||||
};
|
||||
|
||||
class CBootStruct
|
||||
class CRedSeaBoot
|
||||
{
|
||||
U8 jump_and_nop[3],
|
||||
signature,reserved[4]; //MBR_PT_REDSEA=0x88. Distinguish from real FAT32
|
||||
I64 sects,
|
||||
I64 base_offset, //For CD/DVD image copy.
|
||||
sects,
|
||||
root_cluster,
|
||||
bitmap_sects,
|
||||
unique_id;
|
||||
U8 code[470];
|
||||
U8 code[462];
|
||||
U16 signature2; //0xAA55
|
||||
};
|
||||
|
||||
@@ -2240,7 +2244,7 @@ class CFAT32Boot
|
||||
U16 reserved_sects;
|
||||
U8 copies_of_fat;
|
||||
U16 max_root_dir_entries, //Not used
|
||||
old_sects_in_prt; //Not used
|
||||
old_sects_in_drv; //Not used
|
||||
U8 media_desc; //F64 for hard disk
|
||||
U16 old_sects_per_fat, //Not used
|
||||
sects_per_track,
|
||||
@@ -2270,7 +2274,7 @@ class CFAT32FileInfoSect
|
||||
U8 unknown[480];
|
||||
U32 signature2,
|
||||
free_clusters,
|
||||
most_recently_allocated;
|
||||
most_recently_alloced;
|
||||
U8 reserved[12];
|
||||
U32 signature3;
|
||||
};
|
||||
@@ -2376,7 +2380,7 @@ class CISO1PathEntry
|
||||
#define ISO1T_BOOT_RECORD 0
|
||||
#define ISO1T_PRI_VOL_DESC 1
|
||||
#define ISO1T_SUPPLEMENTARY_DESC 2
|
||||
#define ISO1T_VOL_PRT_DESC 3
|
||||
#define ISO1T_VOL_DRV_DESC 3
|
||||
#define ISO1T_TERMINATOR 255
|
||||
|
||||
class CISO1PriDesc
|
||||
@@ -2554,7 +2558,7 @@ public class CDirEntry
|
||||
#define BD_SIGNATURE_VAL 'BDSV'
|
||||
public class CBlkDev
|
||||
{
|
||||
CBlkDev *lock_fwding;
|
||||
CBlkDev *lock_fwding; //If two blkdevs on same controller, use just one lock
|
||||
I64 locked_flags;
|
||||
U32 type,flags,
|
||||
bd_signature;
|
||||
@@ -2569,21 +2573,21 @@ public class CBlkDev
|
||||
U32 max_reads,max_writes;
|
||||
};
|
||||
|
||||
//Partition locked flags
|
||||
#define Plf_LOCKED 0
|
||||
//Drive locked flags
|
||||
#define DVlf_LOCKED 0
|
||||
|
||||
//See $LK,"ST_PRT_TYPES",A="MN:ST_PRT_TYPES"$
|
||||
#define PT_NULL 0
|
||||
#define PT_REDSEA 1 //Supported
|
||||
#define PT_FAT32 2 //Supported except for short names, to some degree
|
||||
#define PT_ISO9660 3 //Supported (CD-ROM)
|
||||
#define PT_ISO13490 4 //Not Supported (CD-ROM)
|
||||
#define PT_ISO13346 5 //Not Supported (CD-ROM)
|
||||
#define PT_NTFS 6 //Not Supported
|
||||
#define PT_UNKNOWN 7
|
||||
#define PT_NUM_TYPES 8
|
||||
//See $LK,"ST_DRV_TYPES",A="MN:ST_DRV_TYPES"$
|
||||
#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_NTFS 6 //Not Supported
|
||||
#define DVT_UNKNOWN 7
|
||||
#define DVT_NUM_TYPES 8
|
||||
|
||||
#define PTf_DISABLE 31 //High bit of type is disable
|
||||
#define DVTf_DISABLE 31 //High bit of type is disable
|
||||
|
||||
#define MBR_PT_FAT12 0x01
|
||||
#define MBR_PT_FAT32a 0x0B
|
||||
@@ -2601,33 +2605,31 @@ class CFreeLst
|
||||
I64 start,size;
|
||||
};
|
||||
|
||||
#define NUM_PRTS 32
|
||||
#define NUM_DRVS 32
|
||||
|
||||
#define PRT_SIGNATURE_VAL 'PTSV'
|
||||
public class CPrt
|
||||
#define DRV_SIGNATURE_VAL 'DVSV'
|
||||
public class CDrv
|
||||
{
|
||||
//Don't access ->drv_let directly in case a drive has been remapped.
|
||||
//Use $LK,"Prt2Drv",A="MN:Prt2Drv"$().
|
||||
//Use $LK,"Drv2Let",A="MN:Drv2Let"$().
|
||||
I64 locked_flags;
|
||||
U32 type, //Bit31 is used as a disable, since it will be unknown
|
||||
flags, //Flags not used at the moment
|
||||
pt_signature;
|
||||
U8 drv_let,text_attr,pad[2];
|
||||
I64 offset,
|
||||
dv_signature;
|
||||
U8 drv_let,text_attr,pad[6];
|
||||
I64 base_offset,
|
||||
size,
|
||||
file_system_info_sect,
|
||||
map1,map2,
|
||||
root_cluster,
|
||||
data,
|
||||
data_area,
|
||||
spc; //sectors per cluster
|
||||
CTask *owning_task;
|
||||
CBlkDev *bdev;
|
||||
CBlkDev *bd;
|
||||
|
||||
CFAT32FileInfoSect *fis;
|
||||
I64 num_buffered_map_blks,
|
||||
I64 map_blk_dirty,
|
||||
cur_map_blk_num;
|
||||
U32 *cur_map_blk;
|
||||
U8 *buffered_map_dirty_bits;
|
||||
CFreeLst *next_free,*last_free;
|
||||
};
|
||||
|
||||
@@ -2637,7 +2639,7 @@ class CCacheBlk
|
||||
{
|
||||
CCacheBlk *next_lru,*last_lru;
|
||||
CCacheBlk *next_hash,*last_hash;
|
||||
CPrt *p;
|
||||
CDrv *dv;
|
||||
I64 blk;
|
||||
U8 body[BLK_SIZE];
|
||||
};
|
||||
@@ -2649,17 +2651,17 @@ public class CDskGlbls
|
||||
CCacheBlk *cache_base,*cache_ctrl,**cache_hash_table;
|
||||
I64 cache_size,read_cnt,write_cnt;
|
||||
CBlkDev *blkdevs;
|
||||
CPrt *prts,*drv_to_prt[32];
|
||||
CDrv *drvs,*let_to_drv[32];
|
||||
I64 auto_mount_ide_cnt;
|
||||
U8 first_hd_drv_let,first_cd_drv_let,
|
||||
temp_filename[136];
|
||||
U8 temp_filename[136],boot_drv_let,
|
||||
first_hd_drv_let,first_cd_drv_let;
|
||||
Bool boot_rescue_drv_pmt,cdrom_boot_is_good;
|
||||
};
|
||||
|
||||
#help_index "File/Internal"
|
||||
public class CFileAccess
|
||||
{
|
||||
CPrt *old_prt,*p;
|
||||
CDrv *old_dv,*dv;
|
||||
U8 *old_dir,*mask;
|
||||
};
|
||||
|
||||
@@ -2677,7 +2679,7 @@ public class CFile
|
||||
{
|
||||
I64 flags;
|
||||
CDirEntry de;
|
||||
CPrt *p;
|
||||
CDrv *dv;
|
||||
I64 fblk_num,cluster,file_cluster_num,max_blk;
|
||||
U8 *cluster_buf;
|
||||
};
|
||||
@@ -2686,30 +2688,30 @@ public class CFile
|
||||
#define _CFG_HEAP_DBG FALSE
|
||||
|
||||
#if _CFG_HEAP_DBG
|
||||
class CMemUnusedAllocated
|
||||
class CMemUnused
|
||||
{
|
||||
CHeapCtrl *hc;
|
||||
U8 *caller1,*caller2;
|
||||
CMemUnusedAllocated *next;
|
||||
CMemUnused *next;
|
||||
I64 size;
|
||||
};
|
||||
class CMemUsedAllocated
|
||||
class CMemUsed
|
||||
{
|
||||
CHeapCtrl *hc;
|
||||
U8 *caller1,*caller2;
|
||||
CMemUsedAllocated *next,*last;
|
||||
CMemUsed *next,*last;
|
||||
I64 size;
|
||||
U0 start;
|
||||
};
|
||||
#else
|
||||
class CMemUnusedAllocated
|
||||
class CMemUnused
|
||||
{
|
||||
U0 hc;
|
||||
U0 caller1,caller2;
|
||||
CMemUnusedAllocated *next;
|
||||
CMemUnused *next;
|
||||
I64 size;
|
||||
};
|
||||
class CMemUsedAllocated
|
||||
class CMemUsed
|
||||
{
|
||||
CHeapCtrl *hc;
|
||||
U0 caller1,caller2;
|
||||
@@ -2719,7 +2721,7 @@ class CMemUsedAllocated
|
||||
};
|
||||
#endif
|
||||
|
||||
#help_index "Memory/Blk Pool"
|
||||
#help_index "Memory/BlkPool"
|
||||
/*TempleOS does not mess with page tables after it
|
||||
identity-maps them during boot -- $LK,"SYS_INIT_MEM",A="MN:SYS_INIT_MEM"$.
|
||||
$LK,"PAGE_SIZE",A="MN:PAGE_SIZE"$ is arbitrary, and is not related to CPU hardware.
|
||||
@@ -2773,23 +2775,20 @@ class CMemRange
|
||||
#define SETH_STK (PAGE_SIZE*512)
|
||||
#define INTERRUPT_STK (PAGE_SIZE*512)
|
||||
#define DFT_STK (PAGE_SIZE*512)
|
||||
#define MP_DFT_STK (PAGE_SIZE*512)
|
||||
|
||||
#define ADAM_HASH_SIZE (1<<18)
|
||||
#define STD_HASH_SIZE (1<<12)
|
||||
#define MP_STD_HASH_SIZE (1<<12)
|
||||
#define TASK_HASH_SIZE (1<<10)
|
||||
|
||||
//locked flags
|
||||
#define BPlf_LOCKED 0
|
||||
public class CBlkPool
|
||||
{
|
||||
I64 locked_flags,size,allocated_u8s;
|
||||
I64 locked_flags,alloced_u8s,used_u8s;
|
||||
CMemBlk *mem_free_lst,*mem_free_2meg_lst,
|
||||
*free_page_hash[FREE_PAGE_HASH_SIZE],
|
||||
*free_page_hash2[64-PAGE_BITS];
|
||||
};
|
||||
|
||||
#help_index "Memory/Heap Ctrl"
|
||||
#help_index "Memory/HeapCtrl"
|
||||
//locked flags
|
||||
#define HClf_LOCKED 0
|
||||
|
||||
@@ -2798,12 +2797,12 @@ public class CHeapCtrl
|
||||
{
|
||||
CBlkPool *bp;
|
||||
U32 hc_signature,pad;
|
||||
I64 locked_flags,used_u8s;
|
||||
I64 locked_flags,alloced_u8s,used_u8s;
|
||||
CTask *mem_task;
|
||||
CMemBlk *next_mem_blk,*last_mem_blk;
|
||||
CMemUnusedAllocated *malloc_free_lst;
|
||||
CMemUsedAllocated *next_um,*last_um;
|
||||
CMemUnusedAllocated *heap_hash[HEAP_HASH_SIZE/sizeof(U8 *)];
|
||||
CMemUnused *malloc_free_lst;
|
||||
CMemUsed *next_um,*last_um;
|
||||
CMemUnused *heap_hash[HEAP_HASH_SIZE/sizeof(U8 *)];
|
||||
};
|
||||
|
||||
#help_index "Devices"
|
||||
@@ -2885,7 +2884,7 @@ public U32i class CBGR
|
||||
U8 b,g,r,reserved;
|
||||
};
|
||||
|
||||
#help_index "Keyboard Devices"
|
||||
#help_index "Keyboard Devices;Char/Input"
|
||||
#define KBD_PORT 0x60
|
||||
#define KBD_CTRL 0x64
|
||||
public class CKbdStateGlbls
|
||||
@@ -3024,7 +3023,6 @@ public class CCtrl
|
||||
};
|
||||
|
||||
#help_index "Menus"
|
||||
#define MENU_SIGNATURE_VAL 'MnuS'
|
||||
public class CMenuEntry
|
||||
{
|
||||
CMenuEntry *next;
|
||||
@@ -3040,8 +3038,7 @@ public class CMenu
|
||||
CMenuEntry *sub;
|
||||
CTask *task;
|
||||
I64 flags;
|
||||
U32 mu_signature;
|
||||
U8 attr,checked_attr,pad[2];
|
||||
U8 attr,pad[7];
|
||||
};
|
||||
|
||||
#help_index "Task"
|
||||
@@ -3064,7 +3061,7 @@ class CFPU
|
||||
U8 body[512];
|
||||
};
|
||||
|
||||
#help_index "Task/Srv"
|
||||
#help_index "Task/Srv/Exe"
|
||||
#define SVCf_WAKE_MASTER 0
|
||||
#define SVCf_FOCUS_MASTER 1
|
||||
#define SVCf_EXIT_ON_COMPLETE 2
|
||||
@@ -3076,12 +3073,12 @@ class CFPU
|
||||
#define SVCf_FREE_ON_COMPLETE 7
|
||||
#define SVCf_ADD_TO_QUE 8
|
||||
|
||||
#define SVCT_TEXT_INPUT 0
|
||||
#define SVCT_MSG 1
|
||||
#define SVCT_EXE_STR 2
|
||||
#define SVCT_TEXT_INPUT 0 //$LK,"TaskText",A="MN:TaskText"$() Feed StdIn
|
||||
#define SVCT_MSG 1 //$LK,"TaskMsg",A="MN:TaskMsg"$() Post msg
|
||||
#define SVCT_EXE_STR 2 //$LK,"TaskExe",A="MN:TaskExe"$() Compile & execute src code text
|
||||
//MP cmds
|
||||
#define SVCT_CALL 3
|
||||
#define SVCT_SPAWN_TASK 4
|
||||
#define SVCT_CALL 3 //$LK,"JobQue",A="MN:JobQue"$() Tell MP to call function
|
||||
#define SVCT_SPAWN_TASK 4 //$LK,"Spawn",A="MN:Spawn"$() Tell MP to spawn task
|
||||
|
||||
class CSrvCmd
|
||||
{
|
||||
@@ -3145,6 +3142,7 @@ class CSrvCtrl
|
||||
public class CTaskSettings
|
||||
{
|
||||
CTaskSettings *next;
|
||||
U8 *cur_dir;
|
||||
I64 left,right,top,bottom;
|
||||
U0 (*draw_it)(CTask *task,CDC *dc);
|
||||
U0 (*task_end_cb)();
|
||||
@@ -3155,15 +3153,15 @@ public class CTaskSettings
|
||||
U8 text_attr,title_src,
|
||||
border_attr,border_src,
|
||||
task_title[TASK_TITLE_LEN+1];
|
||||
Bool border,preempt,cursor,scroll,wordstat,pad[3];
|
||||
Bool border,preempt,cursor,scroll,autocomplete,pad[3];
|
||||
U0 pad;#assert !($$&7) //(compiler lags one token)
|
||||
};
|
||||
|
||||
#help_index "Task"
|
||||
//Border ATTR src
|
||||
#define BDS_CONST 0
|
||||
#define BDS_CUR_PRT 1
|
||||
#define BDS_ED_FILENAME_PRT 2
|
||||
#define BDS_CUR_DRV 1
|
||||
#define BDS_ED_FILENAME_DRV 2
|
||||
|
||||
//Task title src
|
||||
#define TTS_CONST 0
|
||||
@@ -3187,6 +3185,7 @@ U0 pad;#assert !($$&7) //(compiler lags one token)
|
||||
#define TASKf_PENDING_BREAK 11
|
||||
#define TASKf_BREAK_TO_SHIFT_ESC 12
|
||||
#define TASKf_KILL_AFTER_DBG 13
|
||||
#define TASKf_NONTIMER_RAND 14
|
||||
|
||||
//locked flags
|
||||
#define TASKLf_TASK_LOCK 0
|
||||
@@ -3210,7 +3209,7 @@ class CTaskStk
|
||||
U0 stk_base;
|
||||
};
|
||||
|
||||
public class CTask //The Fs segment reg points to current CTask
|
||||
public class CTask //The Fs segment reg points to current CTask.
|
||||
{
|
||||
CTask *addr; //Self-addressed ptr
|
||||
U32 task_signature,task_in_que_signature;
|
||||
@@ -3224,7 +3223,7 @@ public class CTask //The Fs segment reg points to current CTask
|
||||
*border_doc;
|
||||
I64 win_left,win_right,win_top,win_bottom;
|
||||
|
||||
CPrt *cur_prt;
|
||||
CDrv *cur_dv;
|
||||
U8 *cur_dir;
|
||||
|
||||
CTask *parent_task,
|
||||
@@ -3288,7 +3287,7 @@ public class CTask //The Fs segment reg points to current CTask
|
||||
|
||||
U0 (*task_end_cb)();
|
||||
CTask *song_task,*animate_task;
|
||||
I64 rnd_seed,
|
||||
I64 rand_seed,
|
||||
task_num,
|
||||
fault_num,fault_err_code;
|
||||
CTask *popup_task;
|
||||
@@ -3335,7 +3334,7 @@ class CTSS
|
||||
#define CPUf_RAN_A_TASK 0
|
||||
#define CPUf_SETH_SLEEP 1
|
||||
|
||||
public class CCPU //The Gs segment reg points to current CCPU
|
||||
public class CCPU //The Gs segment reg points to current CCPU.
|
||||
{
|
||||
CCPU *addr; //Self-addressed ptr
|
||||
I64 num,cpu_flags,
|
||||
@@ -3357,8 +3356,9 @@ U0 pad;#assert !($$&7) //(compiler lags one token)
|
||||
};
|
||||
|
||||
#help_index "Memory/Page Tables"
|
||||
#define MEM_MAPPED_SPACE 0x2000000000 //Arbitrarily set to 128 Gig
|
||||
#define MEM_NUM_PML1 1 //First 2 Meg are 4K resolution
|
||||
#define MEM_MIN_MEG 512 //512 Meg minimum.
|
||||
#define MEM_MAPPED_SPACE 0x2000000000 //Arbitrarily set to 128 Gig.
|
||||
#define MEM_NUM_PML1 1 //First 2 Meg are 4K resolution.
|
||||
#define MEM_NUM_PML2 (MEM_MAPPED_SPACE>>(9+21))
|
||||
#define MEM_NUM_PML3 1
|
||||
#define MEM_NUM_PML4 1
|
||||
@@ -3498,7 +3498,7 @@ public class CTextGlbls
|
||||
I64 raw_col,raw_flags;
|
||||
U8 *raw_screen_image;
|
||||
I64 rows,cols; //Use TEXT_ROWS,TEXT_COLS
|
||||
U8 *font;
|
||||
U64 *font;
|
||||
};
|
||||
|
||||
#define FONT_WIDTH 8
|
||||
@@ -3546,11 +3546,11 @@ class CGrSym
|
||||
|
||||
public class CDC
|
||||
{
|
||||
U0 start_saved_area;
|
||||
I32 width,width_internal,height,
|
||||
U0 start;
|
||||
I32 width,width_internal,
|
||||
height,
|
||||
flags;
|
||||
I64 body_size;
|
||||
U0 end_saved_area;
|
||||
U0 end;
|
||||
|
||||
//public (Change directly)
|
||||
CColorROPU32 color,
|
||||
@@ -3608,41 +3608,35 @@ U0 pad;#assert !($$&7) //(compiler lags one token)
|
||||
};
|
||||
|
||||
#help_index "Devices"
|
||||
#define VGA_GRAPHIC_MEM_BASE 0xA0000
|
||||
#define VGA_TEXT_MEM_BASE 0xB8000
|
||||
//VGA Memory
|
||||
#define VGAM_GRAPHICS 0xA0000
|
||||
#define VGAM_TEXT 0xB8000
|
||||
|
||||
#define VGA_ATTR_INDEX 0x03C0
|
||||
#define VGA_ATTR_DATA_WRITE 0x03C0 //alias
|
||||
#define VGA_ATTR_DATA_READ 0x03C1
|
||||
#define VGA_MISC_OUTPUT 0x03C2
|
||||
#define VGA_SC_INDEX 0x03C4
|
||||
#define VGA_SC_DATA 0x03C5
|
||||
#define VGA_PALETTE_MASK 0x03C6
|
||||
#define VGA_REG_READ 0x03C7
|
||||
#define VGA_REG_WRITE 0x03C8
|
||||
#define VGA_PALETTE_DATA 0x03C9
|
||||
#define VGA_CRTC_INDEX 0x03D4
|
||||
#define VGA_CRTC_DATA 0x03D5
|
||||
#define VGA_INPUT_STAT 0x03DA
|
||||
#define VGA_MAP_MASK 0x02
|
||||
//VGA I/O ports
|
||||
#define VGAP_ATTR_INDEX 0x03C0
|
||||
#define VGAP_ATTR_DATA_WRITE 0x03C0 //alias
|
||||
#define VGAP_ATTR_DATA_READ 0x03C1
|
||||
#define VGAP_MISC_OUTPUT 0x03C2
|
||||
#define VGAP_INDEX 0x03C4
|
||||
#define VGAP_DATA 0x03C5
|
||||
#define VGAP_PALETTE_MASK 0x03C6
|
||||
#define VGAP_REG_READ 0x03C7
|
||||
#define VGAP_REG_WRITE 0x03C8
|
||||
#define VGAP_PALETTE_DATA 0x03C9
|
||||
#define VGAP_CRTC_INDEX 0x03D4
|
||||
#define VGAP_CRTC_DATA 0x03D5
|
||||
#define VGAP_INPUT_STAT 0x03DA
|
||||
|
||||
#define VGA_H_TOTAL 0x00
|
||||
#define VGA_H_BLANK_START 0x02
|
||||
#define VGA_H_RETRACE_START 0x04
|
||||
#define VGA_V_TOTAL 0x06
|
||||
#define VGA_MAX_SCAN_LINE 0x09
|
||||
#define VGA_V_RETRACE_END 0x11
|
||||
#define VGA_OFFSET 0x13
|
||||
#define VGA_V_BLANK_START 0x15
|
||||
#define VGA_MODE_CTRL 0x17
|
||||
//VGA Registers
|
||||
#define VGAR_MAP_MASK 0x02
|
||||
|
||||
#help_index "Compression/Piece by Piece"
|
||||
#define ARC_MAX_BITS 12
|
||||
#define ARC_MAX_ENTRY (1<<ARC_MAX_BITS-1)
|
||||
|
||||
#define CT_NONE 0
|
||||
#define CT_7_BIT 1
|
||||
#define CT_8_BIT 2
|
||||
#define CT_NONE 1
|
||||
#define CT_7_BIT 2
|
||||
#define CT_8_BIT 3
|
||||
class CArcEntry
|
||||
{
|
||||
CArcEntry *next;
|
||||
@@ -3673,7 +3667,7 @@ public class CArcCtrl
|
||||
public class CArcCompress
|
||||
{
|
||||
I64 compressed_size,expanded_size;
|
||||
U16 compression_type,flags;
|
||||
U8 compression_type;
|
||||
U0 body;
|
||||
};
|
||||
|
||||
@@ -3780,12 +3774,13 @@ public class CDbgGlbls
|
||||
#define BOOT_RAM_LIMIT 0x97000
|
||||
#define BOOT_STK_SIZE BLK_SIZE
|
||||
|
||||
#define BOOT_CODE_RAM 1
|
||||
#define BOOT_CODE_HARDDRV 2
|
||||
#define BOOT_CODE_CDROM 3
|
||||
#define BOOT_SRC_NULL 0
|
||||
#define BOOT_SRC_RAM 1
|
||||
#define BOOT_SRC_HARDDRV 2
|
||||
#define BOOT_SRC_CDROM 3
|
||||
|
||||
// $LK,"Auto",A="MN:Auto"$("") StdIn for call to $LK,"MakeOSPrtBootInstall",A="MN:MakeOSPrtBootInstall"$().
|
||||
#define STD_DISTRO_CDROM_CFG "Tb1\nScale2Mem(2048,0x40000)\nt3 \n\n\n\n\n"
|
||||
// $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"
|
||||
|
||||
#help_index "Misc/Accts"
|
||||
//Acct Registry sys_msg_flags. $LK,"AcctOneTimePopUp",A="MN:AcctOneTimePopUp"$()
|
||||
@@ -1,7 +1,7 @@
|
||||
/* Kernel ASM symbols.
|
||||
$LK,"Adam1b",A="FF:::/Kernel/Kernel.PRJ,Adam1b"$ Kernel.PRJ
|
||||
$LK,"Adam1b",A="FF:::/Compiler/Compiler.PRJ,Adam1b"$ Compiler.PRJ
|
||||
$LK,"Adam1b",A="FF:::/Kernel/Adam1.CPP,Adam1b"$ Adam1.CPP
|
||||
$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
|
||||
*/
|
||||
|
||||
#help_index "Bit"
|
||||
@@ -22,8 +22,8 @@ public _extern _LBEQU Bool LBEqu(U8 *bit_field,I64 bit,Bool val); //Locked Set b
|
||||
|
||||
#help_index "Boot"
|
||||
_extern SYS_BOOT_BASE U32 sys_boot_base;
|
||||
_extern SYS_BOOT_CODE U32 sys_boot_code;
|
||||
_extern SYS_BOOT_PATCH_TABLE_BASE U32 sys_boot_patch_table_base;
|
||||
_extern SYS_BOOT_SRC U32 sys_boot_src;
|
||||
_extern SYS_RUN_LEVEL U32 sys_run_level;
|
||||
|
||||
#help_index "Call"
|
||||
@@ -50,9 +50,6 @@ public _intern IC_QUE_INS_REV U0 QueInsRev(CQue *entry,CQue *succ);//Reversed in
|
||||
//Ins item into que before successor.
|
||||
public _intern IC_QUE_REM U0 QueRem(CQue *entry); //Remove Item from queue.
|
||||
|
||||
#help_index "Graphics/Screen"
|
||||
public _extern SYS_BIOS_GR_MODE U16 sys_bios_gr_mode; //INT 0x10 mode number.
|
||||
|
||||
#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.
|
||||
@@ -93,8 +90,8 @@ public _intern IC_TO_F64 F64 ToF64(I64 i); //Convert to F64.
|
||||
public _intern IC_TO_I64 I64 ToI64(F64 d); //Convert to I64. Truncates.
|
||||
public _extern _ARG F64 Arg(F64 x,F64 y); //Polar coordinate angle.
|
||||
public _extern _CEIL F64 Ceil(F64 d); //Ceiling of F64.
|
||||
public _extern _CLAMP_I64 I64 ClampI64(I64 p,I64 lo,I64 hi); //Clamp to I64 [] range.
|
||||
public _extern _CLAMP_U64 U64 ClampU64(U64 p,U64 lo,U64 hi); //Clamp to U64 [] range.
|
||||
public _extern _CLAMP_I64 I64 ClampI64(I64 dv,I64 lo,I64 hi); //Clamp to I64 [] range.
|
||||
public _extern _CLAMP_U64 U64 ClampU64(U64 dv,U64 lo,U64 hi); //Clamp to U64 [] range.
|
||||
public _extern _EXP F64 Exp(F64 d); //Exponential function.
|
||||
_extern _FCLEX U0 Fclex();
|
||||
_extern _FLDCW U0 Fldcw(U16 w);
|
||||
@@ -129,8 +126,8 @@ public _extern _D3_MUL_EQU CD3 *D3MulEqu(CD3 *prod,F64 s); //prod *= s
|
||||
public _extern _D3_NORM F64 D3Norm(CD3 *d); //Norm d
|
||||
public _extern _D3_NORM_SQR F64 D3NormSqr(CD3 *d); //Norm Squared d
|
||||
public _extern _D3_SUB CD3 *D3Sub(CD3 *d1,CD3 *d2,CD3 *diff); //d1-d2 -->diff
|
||||
public _extern _D3_SUB_EQU CD3 *D3SubEqu(CD3 *diff,CD3 *d); //diff-=d
|
||||
public _extern _D3_UNIT CD3 *D3Unit(CD3 *d); //Convert to unit vect
|
||||
public _extern _D3_SUB_EQU CD3 *D3SubEqu(CD3 *diff,CD3 *d); //diff-=d
|
||||
public _extern _D3_ZERO CD3 *D3Zero(CD3 *dst); //Convert to zero
|
||||
|
||||
#help_index "Memory"
|
||||
@@ -146,12 +143,12 @@ _extern SYS_HEAP_INIT_FLAG U8 sys_heap_init_flag;
|
||||
_extern SYS_HEAP_INIT_VAL U8 sys_heap_init_val;
|
||||
_extern SYS_MEM_INIT_FLAG U8 sys_mem_init_flag;
|
||||
_extern SYS_MEM_INIT_VAL U8 sys_mem_init_val;
|
||||
_extern SYS_VAR_INIT_FLAG U8 sys_var_init_flag;
|
||||
_extern SYS_VAR_INIT_VAL U8 sys_var_init_val;
|
||||
_extern SYS_VAR_INIT_FLAG U8 sys_var_init_flag;
|
||||
|
||||
#help_index "Memory/Blk Pool"
|
||||
public _extern SYS_CODE_BP CBlkPool *sys_code_bp; //System's blk pool for code.
|
||||
public _extern SYS_DATA_BP CBlkPool *sys_data_bp; //System's blk pool for data.
|
||||
#help_index "Memory/BlkPool"
|
||||
public _extern SYS_CODE_BP CBlkPool *sys_code_bp; //System's BlkPool for code.
|
||||
public _extern SYS_DATA_BP CBlkPool *sys_data_bp; //System's BlkPool for data.
|
||||
|
||||
#help_index "Memory/Info"
|
||||
_extern SYS_HEAP_BASE U8 *sys_heap_base;
|
||||
@@ -181,9 +178,9 @@ public _extern SYS_FOCUS_TASK CTask *sys_focus_task; //Current focus task.
|
||||
|
||||
#help_index "MultiCore"
|
||||
#help_file "::/Doc/MultiCore"
|
||||
public _extern SYS_CPU_STRUCTS CCPU *cpu_structs;//$LK,"Gs",A="MN:Gs"$ points to cur $LK,"CCPU",A="MN:CCPU"$.
|
||||
public _extern SYS_CPU_STRUCTS CCPU *cpu_structs; //$LK,"Gs",A="MN:Gs"$ points to cur $LK,"CCPU",A="MN:CCPU"$.
|
||||
public _extern SYS_MP_CNT I64 mp_cnt; //Count of cores
|
||||
_extern SYS_MP_CNT_INITIAL I64 mp_cnt_initial; //only used during $LK,"MPStart",A="MN:MPStart"$
|
||||
_extern SYS_MP_CNT_INITIAL I64 mp_cnt_initial; //only used during $LK,"BSPStartMP",A="MN:BSPStartMP"$
|
||||
_extern SYS_MP_CNT_LOCK I64 mp_cnt_lock;
|
||||
_extern SYS_SEMAS CSema sys_semas[NUM_SYS_SEMAS];
|
||||
|
||||
@@ -220,8 +217,10 @@ public _extern SYS_CACHE_LINE_WIDTH I64 sys_cache_line_width; //CPU's Cache line
|
||||
_extern SYS_GDT CGDT sys_gdt;
|
||||
|
||||
#help_index "Processor/Cache;Memory/Cache"
|
||||
public _intern IC_CLFLUSH U0 CLFlush(U8 *a); //Flush cache line.
|
||||
public _intern IC_INVLPG U0 InvlPg(U8 *a); //Invalidate page at addr.
|
||||
public _intern IC_CLFLUSH U0 CLFlush(U8 *a); //Flush cache line instruction.
|
||||
|
||||
#help_index "Processor/Page Tables;Memory/Page Tables"
|
||||
public _intern IC_INVLPG U0 InvlPg(U8 *a); //Invalidate page at addr instruction.
|
||||
|
||||
#help_index "Task"
|
||||
public _intern IC_PREEMPT Bool Preempt(Bool val); //Turn mutli-tasking preemption OFF/ON.
|
||||
@@ -96,28 +96,28 @@ public extern U0 PutChars(U64 ch);
|
||||
extern U0 PutHex(I64 num,I64 width);
|
||||
public extern U0 PutKey(I64 ch=0,I64 sc=0);
|
||||
extern U0 PutS(U8 *st); //Use $LK,"Print",A="MN:Print"$()
|
||||
public extern Bool Silent(Bool val);
|
||||
public extern Bool Silent(Bool val=ON);
|
||||
extern U8 *StrPrintHex(U8 *dst,I64 num;I64 width);
|
||||
|
||||
#help_index "Char;Debugging/Raw Output"
|
||||
public extern CTextGlbls text;
|
||||
|
||||
#help_index "Compiler/Lex"
|
||||
public extern U0 SetSrcFileInfo(CLex *lx,CHashSrcSym *h,I64 line_num_offset=0);
|
||||
public extern U0 HashSrcFileSet(CLex *lx,CHashSrcSym *h,I64 line_num_offset=0);
|
||||
|
||||
#help_index "Compiler;Cmd Line (Typically)"
|
||||
extern U8 *Load(U8 *filename,I64 ld_flags=0,CBinFile *bfh_addr=INVALID_PTR); //INVALID_PTR means don't care what load addr.
|
||||
|
||||
#help_index "Compression"
|
||||
public extern CArcCompress *CompressBuf(U8 *src,I64 size,I64 flags=0,CTask *mem_task=NULL);
|
||||
public extern CArcCompress *CompressBuf(U8 *src,I64 size,CTask *mem_task=NULL);
|
||||
public extern U8 *ExpandBuf(CArcCompress *r,CTask *mem_task=NULL);
|
||||
|
||||
#help_index "Compression/Piece by Piece"
|
||||
public extern U0 ArcCompressBuf(CArcCtrl *c);
|
||||
public extern U0 ArcCtrlDel(CArcCtrl *c);
|
||||
public extern CArcCtrl *ArcCtrlNew(Bool expand,Bool seven_bit);
|
||||
public extern CArcCtrl *ArcCtrlNew(Bool expand,I64 compression_type=CT_8_BIT);
|
||||
public extern U0 ArcExpandBuf(CArcCtrl *c);
|
||||
public extern U0 ArcFinishCompression(CArcCtrl *c);
|
||||
public extern Bool ArcFinishCompression(CArcCtrl *c);
|
||||
|
||||
#help_index "Data Types/Circular Queue"
|
||||
public extern I64 QueCnt(CQue *root);
|
||||
@@ -172,7 +172,7 @@ public extern I64 B2(CTask *task=NULL,Bool live=TRUE);
|
||||
extern CBpt *BptFind(U8 *needle_addr,CTask *haystack_task=NULL,Bool rem=FALSE);
|
||||
public extern Bool BptR(U8 *addr,CTask *task=NULL,Bool live=TRUE,Bool rem=TRUE);
|
||||
public extern Bool BptS(U8 *addr,CTask *task=NULL,Bool live=TRUE);
|
||||
public extern U0 E(U8 *addr,I64 cnt=512,I64 edf_dof_flags=0);
|
||||
public extern Bool E(U8 *addr,I64 cnt=512,I64 edf_dof_flags=0);
|
||||
public extern U0 G(U8 *ip=INVALID_PTR,CTask *task=NULL);
|
||||
public extern U0 G2(U8 *ip=INVALID_PTR,CTask *task=NULL);
|
||||
public extern Bool InDbg(Bool val);
|
||||
@@ -180,7 +180,7 @@ public extern Bool IsDbg();
|
||||
public extern U0 S(U8 *ip=INVALID_PTR,CTask *task=NULL);
|
||||
|
||||
#help_index "Debugging/Debugger;DolDoc/Cmd Line (Typically);Cmd Line (Typically);Training"
|
||||
public extern U0 Man(U8 *st);
|
||||
public extern Bool Man(U8 *st,I64 edf_dof_flags=0);
|
||||
|
||||
#help_index "Debugging/Dump"
|
||||
public extern U0 CallerRep(U8 **rbp=NULL,CTask *task=NULL);
|
||||
@@ -213,10 +213,10 @@ public extern U0 VGAFlush();
|
||||
|
||||
#help_index "Debugging;Debugging/Debugger"
|
||||
public extern U0 Dbg(U8 *msg=NULL,I64 msg_num=0);
|
||||
public extern U0 EdLite(U8 *filename,I64 num=1);
|
||||
extern U0 EdLiteFileLine(U8 *fl_file_line);
|
||||
public extern U0 Fix();
|
||||
public extern U0 SetFix(U8 *filename,I64 line);
|
||||
public extern Bool EdLite(U8 *filename,I64 num=1,I64 edf_dof_flags=0);
|
||||
extern Bool EdLiteFileLine(U8 *fl_file_line,I64 edf_dof_flags=0);
|
||||
public extern Bool Fix(I64 edf_dof_flags=0);
|
||||
public extern U0 FixSet(U8 *filename,I64 line);
|
||||
|
||||
#help_index "Define;Char/Define"
|
||||
#help_file "::/Doc/Define"
|
||||
@@ -264,12 +264,12 @@ public extern I64 FSize(CFile *f);
|
||||
public extern Bool FWBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1);
|
||||
|
||||
#help_index "File/Cmd Line (Typically);Cmd Line (Typically)"
|
||||
public extern Bool Cd(U8 *dirname,Bool make_dirs=FALSE);
|
||||
public extern Bool Cd(U8 *dirname=NULL,Bool make_dirs=FALSE);
|
||||
public extern U0 ChgDsk(U8 drv_let=0);
|
||||
public extern I64 Del(U8 *wild,Bool print_msg=TRUE);
|
||||
public extern I64 Dir(U8 *wild="*",Bool full=FALSE);
|
||||
public extern Bool Drv(U8 drv_let);
|
||||
public extern Bool MapDrv(U8 drv_let,CPrt *p);
|
||||
public extern Bool MapDrv(U8 drv_let,CDrv *dv);
|
||||
public extern Bool MkDir(U8 *filename);
|
||||
|
||||
#help_index "File/FileNames"
|
||||
@@ -292,52 +292,50 @@ public extern U0 PutDirLink(U8 *dirname);
|
||||
public extern U0 PutFileLink(U8 *filename,I64 line=0,Bool plain_text=FALSE);
|
||||
public extern U0 ToFileLine(U8 *_fl_file_line,U8 **_filename,I64 *_linenum);
|
||||
public extern U8 *ToggleZorNotZ(U8 *name);
|
||||
public extern U8 *sys_acct;
|
||||
|
||||
#help_index "File/FileNames;Misc"
|
||||
public extern U8 *FileNameTempTxt();
|
||||
|
||||
#help_index "File/Internal"
|
||||
public extern Bool DirNew(CPrt *p,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain=TRUE);
|
||||
public extern Bool DirNew(CDrv *dv,U8 *cur_dir,CDirEntry *tempde,Bool free_old_chain=TRUE);
|
||||
public extern U0 FileAccessDel(CFileAccess *fa);
|
||||
public extern CFileAccess *FileAccessNew(U8 *mask,Bool make_mask=FALSE,Bool make_dirs=FALSE,Bool no_mask=FALSE);
|
||||
extern I64 FileAttr(U8 *name,I64 old_attr=0);
|
||||
|
||||
#help_index "File/Low Level"
|
||||
public extern U0 BlkDevChk(CBlkDev *bdev);
|
||||
public extern Bool BlkDevLock(CBlkDev *bdev);
|
||||
public extern U0 BlkDevChk(CBlkDev *bd);
|
||||
public extern Bool BlkDevLock(CBlkDev *bd);
|
||||
public extern CBlkDev *BlkDevNextFree(U8 first_drv_let,I64 type);
|
||||
public extern Bool BlkDevUnlock(CBlkDev *bdev,Bool rst=FALSE);
|
||||
public extern Bool BlkDevUnlock(CBlkDev *bd,Bool rst=FALSE);
|
||||
public extern U0 BlkDevsRelease();
|
||||
extern U0 CleanMAPBuf(CPrt *p);
|
||||
public extern I64 Cluster2Blk(CPrt *p,I64 c);
|
||||
public extern I64 ClusterNumNext(CPrt *p,I64 c,I64 cnt=1);
|
||||
public extern I64 ClustersAlloc(CPrt *p,I64 c=0,I64 cnt=1,Bool contiguous=FALSE);
|
||||
public extern I64 Cluster2Blk(CDrv *dv,I64 c);
|
||||
public extern I64 ClusterNumNext(CDrv *dv,I64 c,I64 cnt=1);
|
||||
public extern I64 ClustersAlloc(CDrv *dv,I64 c=0,I64 cnt=1,Bool contiguous=FALSE);
|
||||
extern Bool CopySingle(U8 *f1,U8 *f2); //Just one file
|
||||
public extern CBlkDev *Drv2BlkDev(U8 drv_let=0);
|
||||
public extern CPrt *Drv2Prt(U8 drv_let=0);
|
||||
public extern U8 Drv2Let(CDrv *dv=NULL);
|
||||
public extern U0 DrvChk(CDrv *dv);
|
||||
public extern Bool DrvLock(CDrv *dv);
|
||||
public extern CDrv *DrvMakeFree(U8 drv_let);
|
||||
public extern U8 *DrvModelNum(U8 drv_let=0);
|
||||
public extern CDrv *DrvNextFree(U8 first_drv_let='C');
|
||||
public extern U8 *DrvSerialNum(U8 drv_let=0);
|
||||
extern U0 FAT32FreeClusters(CPrt *p,I64 c);
|
||||
extern I64 Name2DirCluster(CPrt *p,U8 *dirname);
|
||||
extern I64 Name2ParentDirCluster(CPrt *p,U8 *dirname);
|
||||
public extern U8 Prt2Drv(CPrt *p=NULL);
|
||||
public extern U0 PrtChk(CPrt *p);
|
||||
public extern Bool PrtLock(CPrt *p);
|
||||
public extern CPrt *PrtMakeFree(U8 drv_let);
|
||||
public extern CPrt *PrtNextFree(U8 first_drv_let='C');
|
||||
public extern Bool PrtUnlock(CPrt *p,Bool rst=FALSE);
|
||||
public extern U0 PrtsRelease();
|
||||
public extern Bool RBlks(CPrt *p,U8 *buf, I64 blk, I64 cnt);
|
||||
public extern I64 RClusters(CPrt *p,U8 *buf,I64 c,I64 cnt);
|
||||
public extern I64 RClustersBlks(CPrt *p,U8 *buf,I64 c,I64 blks);
|
||||
extern U0 RedSeaFSFreeClusters(CPrt *p,I64 c,I64 cnt);
|
||||
public extern Bool DrvUnlock(CDrv *dv,Bool rst=FALSE);
|
||||
public extern U0 DrvsRelease();
|
||||
extern U0 FAT32FreeClusters(CDrv *dv,I64 c);
|
||||
public extern CBlkDev *Let2BlkDev(U8 drv_let=0);
|
||||
public extern CDrv *Let2Drv(U8 drv_let=0);
|
||||
extern I64 Name2DirCluster(CDrv *dv,U8 *dirname);
|
||||
extern I64 Name2ParentDirCluster(CDrv *dv,U8 *dirname);
|
||||
public extern Bool RBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt);
|
||||
public extern I64 RClusters(CDrv *dv,U8 *buf,I64 c,I64 cnt);
|
||||
public extern I64 RClustersBlks(CDrv *dv,U8 *buf,I64 c,I64 blks);
|
||||
extern U0 RedSeaFreeClusters(CDrv *dv,I64 c,I64 cnt);
|
||||
extern I64 SysDel(U8 *wild,Bool make_mask); //this is dangerous
|
||||
extern CDirEntry *SysFilesFind(U8 *files_find_mask,I64 fuf_flags);
|
||||
public extern Bool WBlks(CPrt *p,U8 *buf, I64 blk, I64 cnt);
|
||||
public extern I64 WClusters(CPrt *p,U8 *buf,I64 c,I64 cnt);
|
||||
public extern I64 WClustersBlks(CPrt *p,U8 *buf,I64 c,I64 blks);
|
||||
public extern U0 WZeroBlks(CPrt *p,I64 blk,I64 cnt);
|
||||
public extern Bool WBlks(CDrv *dv,U8 *buf, I64 blk, I64 cnt);
|
||||
public extern I64 WClusters(CDrv *dv,U8 *buf,I64 c,I64 cnt);
|
||||
public extern I64 WClustersBlks(CDrv *dv,U8 *buf,I64 c,I64 blks);
|
||||
public extern U0 WZeroBlks(CDrv *dv,I64 blk,I64 cnt);
|
||||
|
||||
#help_index "File/Program Routines"
|
||||
public extern U0 DirEntryDel(CDirEntry *tempde);
|
||||
@@ -345,24 +343,23 @@ public extern U0 DirEntryDel2(CDirEntry *tempde);
|
||||
public extern U0 DirTreeDel(CDirEntry *tempde);
|
||||
public extern U0 DirTreeDel2(CDirEntry *tempde);
|
||||
public extern Bool FileFind(U8 *filename,CDirEntry *_de=NULL,I64 fuf_flags=0);
|
||||
public extern U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE);
|
||||
public extern I64 FileWrite(U8 *filename,U8 *fbuf,
|
||||
I64 size,CDate cdt=0,I64 attr=0,Bool raw=FALSE);
|
||||
public extern U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL);
|
||||
public extern I64 FileWrite(U8 *filename,U8 *fbuf,I64 size,CDate cdt=0,I64 attr=0);
|
||||
|
||||
#help_index "File/Program Routines;File/FileNames"
|
||||
public extern CDirEntry *FilesFind(U8 *files_find_mask,I64 fuf_flags=0);
|
||||
|
||||
#help_index "File/System"
|
||||
public extern CATARep *ATAIDDrvs(CATARep *root,U8 _sys_acct_drv,CATARep **_ata_drv,CATARep **_atapi_drv);
|
||||
public extern CATARep *ATAIDDrvs(CATARep *root,I64 _sys_boot_drv,CATARep **_ata_drv,CATARep **_atapi_drv);
|
||||
extern CBlkDev *ATAMount(U8 first_drv_let,I64 type,I64 base0,I64 base1,I64 unit);
|
||||
extern Bool ATAPIStartStop(CBlkDev *bdev,F64 timeout,Bool start);
|
||||
extern Bool ATAPIStartStop(CBlkDev *bd,F64 timeout,Bool start);
|
||||
extern I64 ATAProbe(I64 base0,I64 base1,I64 unit);
|
||||
extern U0 ATAReadBlks(CBlkDev *bdev,U8 *buf, I64 blk, I64 cnt);
|
||||
extern U0 ATAWriteBlks(CBlkDev *bdev,U8 *buf, I64 blk, I64 cnt);
|
||||
extern U0 ATAReadBlks(CBlkDev *bd,U8 *buf, I64 blk, I64 cnt);
|
||||
extern U0 ATAWriteBlks(CBlkDev *bd,U8 *buf, I64 blk, I64 cnt);
|
||||
public extern I64 AutoMountIDE();
|
||||
extern I64 BlkDevAdd(CBlkDev *bdev,Bool one_prt,Bool make_free);
|
||||
extern I64 BlkDevAdd(CBlkDev *bd,Bool one_drv,Bool make_free);
|
||||
extern U0 DskCacheInit(I64 size_in_U8s);
|
||||
public extern U0 DskCacheInvalidate(CPrt *p);
|
||||
public extern U0 DskCacheInvalidate(CDrv *dv);
|
||||
public extern CDskGlbls dsk;
|
||||
|
||||
#help_index "Graphics/Color"
|
||||
@@ -390,14 +387,14 @@ public _extern _HASH_STR I64 HashStr(U8 *st);
|
||||
public extern U0 HashTableDel(CHashTable *table);
|
||||
public extern CHashTable *HashTableNew(I64 size,CTask *mem_task=NULL);
|
||||
public extern I64 HashTablePurge(CHashTable *table);
|
||||
public extern I64 HashVal(CHash *temph);
|
||||
public extern I64 HashTypeNum(CHash *temph);
|
||||
public extern I64 HashVal(CHash *temph);
|
||||
extern U0 SysSymImportsResolve(U8 *sptr,I64 ld_flags=0);
|
||||
|
||||
#help_index "Hash/Frame"
|
||||
#help_file "::/Doc/Frame"
|
||||
public extern I64 FramePtr(U8 *name,CTask *task=NULL);
|
||||
public extern CHashGeneric *FramePtrAdd(U8 *name,I64 val,CTask *task=NULL);
|
||||
public extern CHashGeneric *FramePtrAdd(U8 *name,I64 val=0,CTask *task=NULL);
|
||||
public extern I64 FramePtrDel(U8 *name,CTask *task=NULL);
|
||||
public extern I64 FramePtrSet(U8 *name,I64 val,CTask *task=NULL);
|
||||
|
||||
@@ -408,12 +405,12 @@ public extern I64 HashLstAdd(U8 *lst,I64 type,CHashTable *table);
|
||||
public extern I64 HashDefineLstAdd(U8 *name,I64 type,CHashTable *table);
|
||||
|
||||
#help_index "Info;File/Cmd Line (Typically);Cmd Line (Typically);Install"
|
||||
public extern U0 PrtRep();
|
||||
public extern U0 DrvRep();
|
||||
|
||||
#help_index "Input Pointer"
|
||||
#help_file "::/Doc/InputPointer"
|
||||
public extern U0 GridInit();
|
||||
public extern U0 SetIP(I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,I64 l=MAX_I64,I64 r=MAX_I64);
|
||||
public extern U0 IPSet(I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,I64 l=MAX_I64,I64 r=MAX_I64);
|
||||
public extern CIPStateGlbls ip;
|
||||
public extern CGridGlbls ip_grid;
|
||||
extern CIPStateGlbls ip_last;
|
||||
@@ -432,18 +429,18 @@ extern CATARep *ATARepFind(CATARep *haystack_root,I64 needle_num);
|
||||
public extern Bool DrvEnable(U8 drv_let,Bool val);
|
||||
|
||||
#help_index "Install;File/Cmd Line (Typically);Cmd Line (Typically);"
|
||||
public extern U0 Fmt(U8 drv_let,Bool quick=TRUE,Bool confirm=TRUE,I64 type=PT_FAT32);
|
||||
public extern U0 Fmt(U8 drv_let,Bool quick=TRUE,Bool confirm=TRUE,I64 type=DVT_FAT32);
|
||||
public extern U0 Mount(Bool repartition=FALSE);
|
||||
|
||||
#help_index "Install;Memory/Blk Pool"
|
||||
#help_index "Install;Memory/BlkPool"
|
||||
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 KeyDescSet(U8 *fmt,...);
|
||||
public extern CKeyDevEntry *KeyDevAdd(Bool (*fp_put_key)(I64 ch,I64 sc),Bool (*fp_puts)(U8 *st),I64 priority,Bool key_descs=FALSE);
|
||||
public extern U0 KeyDevRem(CKeyDevEntry *tempp);
|
||||
public extern U0 SetCtrlAltLetCB(U8 ch,U0 (*fp_handler)(I64 sc),U8 *desc,Bool in_irq=FALSE);
|
||||
public extern U0 SetKeyDesc(U8 *fmt,...);
|
||||
extern CKeyDevGlbls keydev;
|
||||
extern CSrvCmd sys_macro_root;
|
||||
extern CTask *sys_macro_util_task;
|
||||
@@ -460,13 +457,13 @@ public extern I64 KbdMouseEvtTime();
|
||||
extern U0 KbdMouseHandler(Bool poll_kbd,Bool poll_mouse);
|
||||
extern U0 KbdMouseVarsInit();
|
||||
extern I64 KbdMsgsQue();
|
||||
public extern U0 KbdTypeMatic(U8 delay);
|
||||
extern Bool MouseDriverInstall();
|
||||
public extern I64 PressAKey();
|
||||
public extern I64 ScanChar();
|
||||
public extern Bool ScanKey(I64 *_ch=NULL,I64 *_scan_code=NULL,Bool echo=FALSE);
|
||||
public extern U0 SetTypeMatic(U8 delay);
|
||||
public extern Bool YorN();
|
||||
public extern CKbdStateGlbls kbd;
|
||||
public extern Bool ScanKey(I64 *_ch=NULL,I64 *_scan_code=NULL,Bool echo=FALSE);
|
||||
|
||||
#help_index "Math"
|
||||
public extern I64 CeilI64(I64 num,I64 to);
|
||||
@@ -478,42 +475,29 @@ public extern F64 Max(F64 n1,F64 n2);
|
||||
public extern F64 Min(F64 n1,F64 n2);
|
||||
public extern F64 Pow10I64(I64 i);
|
||||
public extern F64 Rand(); //With timestamp
|
||||
public extern F64 Rand2(); //Without timestamp
|
||||
public extern I16 Rand2I16();
|
||||
public extern I32 Rand2I32();
|
||||
public extern I64 Rand2I64();
|
||||
public extern U16 Rand2U16();
|
||||
public extern U32 Rand2U32();
|
||||
public extern U64 Rand2U64();
|
||||
public extern I16 RandI16();
|
||||
public extern I32 RandI32();
|
||||
public extern I64 RandI64();
|
||||
public extern U16 RandU16();
|
||||
public extern U32 RandU32();
|
||||
public extern U64 RandU64();
|
||||
public extern U0 Randomize(I64 seed=0);
|
||||
public extern I64 RoundI64(I64 num,I64 to);
|
||||
extern I64 sys_rnd_seed;
|
||||
public extern I64 Seed(I64 seed=0,CTask *task=NULL);
|
||||
|
||||
#help_index "Memory/Adam Heap"
|
||||
public extern U8 *ACAlloc(I64 size);
|
||||
public extern U8 *AMAlloc(I64 size);
|
||||
public extern U8 *AMAllocIdentical(U8 *src);
|
||||
|
||||
#help_index "Memory/Blk Pool"
|
||||
#help_index "Memory/BlkPool"
|
||||
public extern U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pages512);
|
||||
public extern U0 BlkPoolInit(CBlkPool *bp,I64 pages512);
|
||||
public extern U8 *MemBlks2MegAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U0 MemBlks2MegFree(CMemBlk *m,I64 pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U8 *MemBlksIndependentAlloc(I64 *_pages512,CBlkPool *bp=NULL);
|
||||
public extern U0 MemBlksNonTaskFree(CMemBlk *m,I64 pages512,CBlkPool *bp=NULL);
|
||||
public extern U8 *MemBlksUncachedAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U8 *MemBlksWriteThroughAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL);
|
||||
|
||||
#help_index "Memory/Heap Ctrl"
|
||||
public extern CHeapCtrl *HeapCtrlBPInit(CBlkPool *bp,I64 pages512);
|
||||
public extern U0 HeapCtrlDel(CHeapCtrl *hc);
|
||||
public extern CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL,CTask *task=NULL,CBlkPool *bp);
|
||||
public extern U8 *Mem2MegAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U0 Mem2MegFree(CMemBlk *m,I64 pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U8 *Mem2MegUncachedAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U8 *Mem2MegWriteThruAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL);
|
||||
public extern U8 *Mem512Alloc(I64 *_pages512,CBlkPool *bp=NULL);
|
||||
public extern U0 Mem512Free(CMemBlk *m,I64 pages512,CBlkPool *bp=NULL);
|
||||
|
||||
#help_index "Memory/Heap"
|
||||
public extern U8 *CAlloc(I64 size,CTask *mem_task=NULL);
|
||||
@@ -526,6 +510,11 @@ public _extern _MHEAP_CTRL CHeapCtrl *MHeapCtrl(U8 *src);
|
||||
public _extern _MSIZE I64 MSize(U8 *src); //size of heap object
|
||||
public _extern _MSIZE2 I64 MSize2(U8 *src); //Internal size
|
||||
|
||||
#help_index "Memory/HeapCtrl"
|
||||
public extern CHeapCtrl *HeapCtrlBPInit(CBlkPool *bp,I64 pages512);
|
||||
public extern U0 HeapCtrlDel(CHeapCtrl *hc);
|
||||
public extern CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL,CTask *task=NULL,CBlkPool *bp);
|
||||
|
||||
#help_index "Memory/Page Tables"
|
||||
public extern Bool MemLowPagesProtect(Bool val=TRUE);
|
||||
public extern Bool MemPagePresentMark(U8 *a,Bool val);
|
||||
@@ -550,11 +539,11 @@ public extern U0 QSortI64(I64 *base,I64 num, I64 (*fp_compare)(I64 e1,I64 e2));
|
||||
public extern U0 ProgressBarsRst();
|
||||
|
||||
#help_index "MultiCore"
|
||||
extern U0 APSethTask();
|
||||
extern U0 BSPStartMP();
|
||||
public extern U0 MPInt(U8 num,I64 cpu_num=1);
|
||||
public extern U0 MPIntAll(U8 num);
|
||||
public extern U0 MPNMInt();
|
||||
extern U0 MPSethServerTask();
|
||||
extern U0 MPStart();
|
||||
public extern U0 MPWake(I64 target_cpu);
|
||||
extern CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
|
||||
U8 *task_name=NULL,I64 target_cpu,
|
||||
@@ -564,7 +553,7 @@ extern CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
|
||||
#help_index "MultiCore;Boot"
|
||||
public extern U0 MPHalt();
|
||||
|
||||
#help_index "MultiCore;Task/Srv"
|
||||
#help_index "MultiCore;Task/Srv/Exe"
|
||||
public extern CSrvCmd *JobQue(I64 (*fp_addr)(U8 *data),U8 *data=NULL,
|
||||
I64 target_cpu=1,I64 flags=1<<SVCf_FREE_ON_COMPLETE,
|
||||
I64 cmd_code=SVCT_CALL,U8 *aux_str=NULL,I64 aux1=0,I64 aux2=0);
|
||||
@@ -598,8 +587,7 @@ public extern CSndGlbls snd;
|
||||
public extern U0 Exit();
|
||||
public extern Bool IsPreempt();
|
||||
public extern Bool IsSuspended(CTask *task=NULL);
|
||||
public extern U0 Kill(CTask *task,Bool wait=TRUE);
|
||||
public extern CTask *SpawnUser(U8 *fmt=NULL,...);
|
||||
public extern Bool Kill(CTask *task,Bool wait=TRUE);
|
||||
public extern Bool Suspend(CTask *task=NULL,Bool state=TRUE);
|
||||
_extern _TASK_CONTEXT_RESTORE U0 TaskContextRestore();
|
||||
_extern _TASK_END_NOW U0 TaskEndNow();
|
||||
@@ -609,6 +597,7 @@ public extern U0 TaskQueIns(CTask *task,CTask *pred=NULL);
|
||||
public extern U0 TaskQueRem(CTask *task);
|
||||
public extern Bool TaskValidate(CTask *task);
|
||||
public extern U0 TaskWait(CTask *task=NULL);
|
||||
public extern CTask *User(U8 *fmt=NULL,...);
|
||||
public extern U0 UserCmdLine();
|
||||
public _extern _YIELD U0 Yield();
|
||||
public extern CTask *adam_task;
|
||||
@@ -632,30 +621,33 @@ public extern U0 TaskDerivedValsUpdate(CTask *task=NULL,Bool update_z_buf=TRUE);
|
||||
public extern U0 WinDerivedValsUpdate(CTask *task=NULL);
|
||||
|
||||
#help_index "Task/Srv"
|
||||
#help_file "::/Doc/TaskSrv"
|
||||
|
||||
#help_index "Task/Srv/Exe"
|
||||
public extern I64 Adam(U8 *fmt,...);
|
||||
public extern U0 AdamErr(U8 *fmt,...);
|
||||
public extern U0 AdamLog(U8 *fmt,...);
|
||||
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 U0 SrvTaskCont();
|
||||
public extern I64 SrvUser(U8 *fmt,...);
|
||||
extern U0 SrvUserCmdLine();
|
||||
public extern CSrvCmd *TaskExe(CTask *srv,CTask *master,U8 *data,I64 flags);
|
||||
public extern U0 TaskRstAwaitingMsg(CTask *task=NULL);
|
||||
|
||||
#help_index "Task/Srv;Compiler"
|
||||
#help_index "Task/Srv/Exe;Compiler"
|
||||
public extern I64 ExeCmdLine(CLex *lx);
|
||||
public extern U0 UserTaskCont();
|
||||
|
||||
#help_index "Task/Srv;MultiCore"
|
||||
#help_index "Task/Srv/Exe;MultiCore"
|
||||
public extern I64 GetResult(CSrvCmd *rqst=NULL);
|
||||
public extern Bool ScanResult(CSrvCmd *rqst=NULL,I64 *_result=NULL);
|
||||
|
||||
#help_index "Task/Text & Msgs"
|
||||
public extern CSrvCmd *TaskText(CTask *srv,CTask *master,
|
||||
U8 *data,I64 flags);
|
||||
#help_index "Task/Srv/Text & Msgs"
|
||||
public extern CSrvCmd *TaskText(CTask *srv,CTask *master,U8 *data,I64 flags);
|
||||
|
||||
#help_index "Task/Text & Msgs;AutoFile"
|
||||
#help_index "Task/Srv/Text & Msgs;AutoFile"
|
||||
public extern U0 Auto(U8 *fmt,...);
|
||||
public extern U0 AutoFile(U8 *filename);
|
||||
public extern U0 AutoStr(U8 *fmt,...);
|
||||
@@ -664,14 +656,14 @@ public extern U0 XTalkStr(CTask *task,U8 *fmt,...);
|
||||
public extern U0 XTalkStrWait(CTask *task,U8 *fmt,...);
|
||||
public extern U0 XTalkWait(CTask *task,U8 *fmt,...);
|
||||
|
||||
#help_index "Task/Text & Msgs;Messages"
|
||||
#help_index "Task/Srv/Text & Msgs;Messages"
|
||||
public extern U0 Msg(I64 msg_code,I64 a1,I64 a2,I64 flags=0);
|
||||
public extern U0 PostMsg(CTask *task,I64 msg_code,I64 a1,I64 a2,I64 flags=0);
|
||||
public extern U0 SendMsg(CTask *task,I64 msg_code,I64 a1,I64 a2,I64 flags=0);
|
||||
public extern CSrvCmd *TaskMsg(CTask *srv,CTask *master,
|
||||
I64 msg_code,I64 a1,I64 a2,I64 flags);
|
||||
|
||||
#help_index "Task;MultiCore"
|
||||
#help_index "Task;Task/Srv/Exe;MultiCore"
|
||||
public extern CTask *Spawn(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
|
||||
U8 *task_name=NULL,I64 target_cpu=-1, //-1 means current CPU
|
||||
CTask *parent=NULL, //NULL means adam
|
||||
+1
-1
@@ -51,7 +51,7 @@ U0 PutS(U8 *st)
|
||||
}
|
||||
}
|
||||
|
||||
U0 SetKeyDesc(U8 *fmt,...)
|
||||
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);
|
||||
|
||||
@@ -1,178 +0,0 @@
|
||||
F64 Clamp(F64 num,F64 lo,F64 hi)
|
||||
{//Clamp to F64 [] range.
|
||||
if (num<lo)
|
||||
return lo;
|
||||
if (num>hi)
|
||||
return hi;
|
||||
return num;
|
||||
}
|
||||
|
||||
F64 Min(F64 n1,F64 n2)
|
||||
{//Min of two F64s.
|
||||
if (n1<=n2)
|
||||
return n1;
|
||||
else
|
||||
return n2;
|
||||
}
|
||||
|
||||
F64 Max(F64 n1,F64 n2)
|
||||
{//Max of two F64s.
|
||||
if (n1>=n2)
|
||||
return n1;
|
||||
else
|
||||
return n2;
|
||||
}
|
||||
|
||||
F64 Pow10I64(I64 i)
|
||||
{//F64 integer powers of ten.
|
||||
if (i>308)
|
||||
return ì;
|
||||
else if (i<-308)
|
||||
return 0.0;
|
||||
else
|
||||
return pow10_I64[i+309];
|
||||
}
|
||||
|
||||
U64 FloorU64(U64 num,U64 to)
|
||||
{//Integer multiples of num.
|
||||
return num-num%to;
|
||||
}
|
||||
|
||||
U64 CeilU64(U64 num,U64 to)
|
||||
{//Integer multiples of num.
|
||||
num+=to-1;
|
||||
return num-num%to;
|
||||
}
|
||||
|
||||
I64 RoundI64(I64 num,I64 to)
|
||||
{//Integer multiples of num.
|
||||
return num-num%to;
|
||||
}
|
||||
|
||||
I64 FloorI64(I64 num,I64 to)
|
||||
{//Integer multiples of num.
|
||||
if (num>=0)
|
||||
return num-num%to;
|
||||
else {
|
||||
num++;
|
||||
return num-num%to-to;
|
||||
}
|
||||
}
|
||||
|
||||
I64 CeilI64(I64 num,I64 to)
|
||||
{//Integer multiples of num.
|
||||
if (num>=0) {
|
||||
num+=to-1;
|
||||
return num-num%to;
|
||||
} else {
|
||||
num+=to-1;
|
||||
return num-num%to-to;
|
||||
}
|
||||
}
|
||||
|
||||
//See $LK,"::/Doc/Acknowledgements.TXT"$.
|
||||
I16 RandI16()
|
||||
{//Random I16. Xor with TimsStamp.
|
||||
sys_rnd_seed.i32[0]=(1664525*sys_rnd_seed.i32[0]+1013904223)^GetTSC>>4;
|
||||
return sys_rnd_seed.i16[0];
|
||||
}
|
||||
|
||||
U16 RandU16()
|
||||
{//Random U16. Xor with TimsStamp.
|
||||
sys_rnd_seed.i32[0]=(1664525*sys_rnd_seed.i32[0]+1013904223)^GetTSC>>4;
|
||||
return sys_rnd_seed.u16[0];
|
||||
}
|
||||
|
||||
I32 RandI32()
|
||||
{//Random I32. Xor with TimsStamp.
|
||||
sys_rnd_seed.i32[0]=(1664525*sys_rnd_seed.i32[0]+1013904223)^GetTSC>>4;
|
||||
return sys_rnd_seed.i32[0];
|
||||
}
|
||||
|
||||
U32 RandU32()
|
||||
{//Random U32. Xor with TimsStamp.
|
||||
sys_rnd_seed.i32[0]=(1664525*sys_rnd_seed.i32[0]+1013904223)^GetTSC>>4;
|
||||
return sys_rnd_seed.u32[0];
|
||||
}
|
||||
|
||||
I64 RandI64()
|
||||
{//Random I64. Xor with TimsStamp.
|
||||
I64 result;
|
||||
result.u32[0]=sys_rnd_seed.i32[0]=(1664525*sys_rnd_seed.i32[0]+1013904223)^GetTSC>>4;
|
||||
result.u32[1]=sys_rnd_seed.i32[0]= 1664525*sys_rnd_seed.i32[0]+1013904223;
|
||||
return result;
|
||||
}
|
||||
|
||||
U64 RandU64()
|
||||
{//Random U64. Xor with TimsStamp.
|
||||
U64 result;
|
||||
result.u32[0]=sys_rnd_seed.i32[0]=(1664525*sys_rnd_seed.i32[0]+1013904223)^GetTSC>>4;
|
||||
result.u32[1]=sys_rnd_seed.i32[0]= 1664525*sys_rnd_seed.i32[0]+1013904223;
|
||||
return result;
|
||||
}
|
||||
|
||||
F64 Rand()
|
||||
{//Random F64. Xor with TimsStamp. 0.0<=x<1.0
|
||||
I64 result;
|
||||
result.u32[0]=sys_rnd_seed.i32[0]=(1664525*sys_rnd_seed.i32[0]+1013904223)^GetTSC>>4;
|
||||
result.u32[1]=sys_rnd_seed.i32[0]= 1664525*sys_rnd_seed.i32[0]+1013904223;
|
||||
result&=0x3FFFFFFFFFFFFFFF;
|
||||
return result/ToF64(0x4000000000000000);
|
||||
}
|
||||
|
||||
I16 Rand2I16()
|
||||
{//Random I16. No time input.
|
||||
Fs->rnd_seed.i32[0]=1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
return Fs->rnd_seed.i16[0];
|
||||
}
|
||||
|
||||
U16 Rand2U16()
|
||||
{//Random U16. No time input.
|
||||
Fs->rnd_seed.i32[0]=1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
return Fs->rnd_seed.u16[0];
|
||||
}
|
||||
|
||||
I32 Rand2I32()
|
||||
{//Random I32. No time input.
|
||||
Fs->rnd_seed.i32[0]=1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
return Fs->rnd_seed.i32[0];
|
||||
}
|
||||
|
||||
U32 Rand2U32()
|
||||
{//Random U32. No time input.
|
||||
Fs->rnd_seed.i32[0]=1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
return Fs->rnd_seed.u32[0];
|
||||
}
|
||||
|
||||
I64 Rand2I64()
|
||||
{//Random I64. No time input.
|
||||
I64 result;
|
||||
result.u32[0]=Fs->rnd_seed.i32[0]= 1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
result.u32[1]=Fs->rnd_seed.i32[0]= 1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
return result;
|
||||
}
|
||||
|
||||
U64 Rand2U64()
|
||||
{//Random U64. No time input.
|
||||
U64 result;
|
||||
result.u32[0]=Fs->rnd_seed.i32[0]= 1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
result.u32[1]=Fs->rnd_seed.i32[0]= 1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
return result;
|
||||
}
|
||||
|
||||
F64 Rand2()
|
||||
{//Random F64. No time input. 0.0<=x<1.0
|
||||
I64 result;
|
||||
result.u32[0]=Fs->rnd_seed.i32[0]= 1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
result.u32[1]=Fs->rnd_seed.i32[0]= 1664525*Fs->rnd_seed.i32[0]+1013904223;
|
||||
result&=0x3FFFFFFFFFFFFFFF;
|
||||
return result/ToF64(0x4000000000000000);
|
||||
}
|
||||
|
||||
U0 Randomize(I64 seed=0)
|
||||
{//Randomizes $LK,"CTask",A="MN:CTask"$ seed.
|
||||
if (seed)
|
||||
Fs->rnd_seed=seed;
|
||||
else
|
||||
Fs->rnd_seed=GetTSC>>4;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
asm {
|
||||
/*See $LK,"::/Doc/Acknowledgements.TXT"$.
|
||||
/*See $LK,"::/Doc/Credits.TXT"$.
|
||||
See $LK,"::/Doc/MemOverview.TXT"$
|
||||
*/
|
||||
|
||||
@@ -9,7 +9,7 @@ SYS_INIT_MEM::
|
||||
MOV EDI,SYS_FIXED_AREA
|
||||
XOR EAX,EAX
|
||||
MOV ECX,sizeof(CSysFixedArea)/4
|
||||
REP_STOSD
|
||||
REP_STOSD //Init entire SYS_FIXED_AREA to zero
|
||||
|
||||
//PML1
|
||||
MOV EAX,0x107
|
||||
@@ -24,7 +24,7 @@ SYS_INIT_MEM::
|
||||
ADC EDX,0
|
||||
LOOP @@05
|
||||
|
||||
//0xA0000-0xBFFFF: video ram=write through
|
||||
//0xA0000-0xBFFFF: video ram=write thru
|
||||
MOV EAX,0xF
|
||||
XOR EDX,EDX
|
||||
MOV EDI,SYS_FIXED_AREA+CSysFixedArea.pml1+0xA0*8
|
||||
@@ -146,7 +146,8 @@ pain without MAlloc up-and-running.
|
||||
MOV U32 CBlkPool.mem_free_lst+4[ESI],0
|
||||
MOV U32 CMemBlk.mb_signature[EBX],MBS_UNUSED_SIGNATURE_VAL
|
||||
MOV U32 CMemBlk.pages[EBX],EAX
|
||||
ADD U32 CBlkPool.size[ESI],EAX
|
||||
SHL EAX,PAGE_BITS
|
||||
ADD U32 CBlkPool.alloced_u8s[ESI],EAX
|
||||
RET
|
||||
}
|
||||
|
||||
@@ -188,9 +189,9 @@ Bool MemPagePresentMark(U8 *a,Bool val)
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *MemBlksIndependentAlloc(I64 *_pages512,CBlkPool *bp=NULL)
|
||||
{/*Alloc 512Byte pages from bp. Don't link to task.
|
||||
(Linking to a task means it will be freed when the task dies.)
|
||||
U8 *Mem512Alloc(I64 *_pages512,CBlkPool *bp=NULL)
|
||||
{/*Alloc 512Byte pages from BlkPool. Don't link to task.
|
||||
(Linking to a task means they will be freed when the task dies.)
|
||||
It might give you more than you asked for
|
||||
so a ptr to a page count is passed.
|
||||
|
||||
@@ -255,14 +256,14 @@ Return: NULL if out of memory.
|
||||
}
|
||||
at_done:
|
||||
*_pages512=num;
|
||||
bp->allocated_u8s+=num<<PAGE_BITS;
|
||||
bp->used_u8s+=num<<PAGE_BITS;
|
||||
LBtr(&bp->locked_flags,BPlf_LOCKED);
|
||||
POPFD
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 MemBlksNonTaskFree(CMemBlk *m,I64 pages512,CBlkPool *bp=NULL)
|
||||
{//Return nontask 512Byte pages(s) to bp.
|
||||
U0 Mem512Free(CMemBlk *m,I64 pages512,CBlkPool *bp=NULL)
|
||||
{//Return non-task 512Byte pages to BlkPool.
|
||||
I64 i;
|
||||
if (m) {
|
||||
if (!bp) bp=sys_code_bp;
|
||||
@@ -272,7 +273,7 @@ U0 MemBlksNonTaskFree(CMemBlk *m,I64 pages512,CBlkPool *bp=NULL)
|
||||
PAUSE
|
||||
m->mb_signature=MBS_UNUSED_SIGNATURE_VAL;
|
||||
m->pages=pages512;
|
||||
bp->allocated_u8s-=pages512<<PAGE_BITS;
|
||||
bp->used_u8s-=pages512<<PAGE_BITS;
|
||||
if (pages512<FREE_PAGE_HASH_SIZE) {
|
||||
m->next=bp->free_page_hash[pages512];
|
||||
bp->free_page_hash[pages512]=m;
|
||||
@@ -292,8 +293,8 @@ U0 MemBlksNonTaskFree(CMemBlk *m,I64 pages512,CBlkPool *bp=NULL)
|
||||
}
|
||||
}
|
||||
|
||||
U8 *MemBlks2MegAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL)
|
||||
{/*Alloc 2Meg pages from bp. Don't link to task.
|
||||
U8 *Mem2MegAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL)
|
||||
{/*Alloc 2Meg pages from BlkPool. Don't link to task.
|
||||
(Linking to a task means they will be freed when the task dies.)
|
||||
It might give you more than you asked for
|
||||
so a ptr to a page count is passed.
|
||||
@@ -381,7 +382,7 @@ Return: NULL if out of memory.
|
||||
}
|
||||
am_done:
|
||||
i=num<<PAGE_BITS;
|
||||
bp->allocated_u8s+=i;
|
||||
bp->used_u8s+=i;
|
||||
num>>=21-PAGE_BITS;
|
||||
*_pages2Meg=num;
|
||||
m=result;
|
||||
@@ -397,9 +398,9 @@ am_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *MemBlksUncachedAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL)
|
||||
{/*Alloc 2Meg pages from bp. Don't link to task.
|
||||
(Linking to a task means it will be freed when the task dies.)
|
||||
U8 *Mem2MegUncachedAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL)
|
||||
{/*Alloc 2Meg pages from BlkPool. Don't link to task.
|
||||
(Linking to a task means they will be freed when the task dies.)
|
||||
It will be marked uncached. It might give you more than you asked for
|
||||
so a ptr to a page count is passed.
|
||||
|
||||
@@ -407,7 +408,7 @@ Return: NULL if out of memory.
|
||||
*/
|
||||
CMemBlk *result,*m,*m1;
|
||||
I64 num=*_pages2Meg,*pte;
|
||||
if (result=MemBlks2MegAlloc(_pages2Meg,bp)) {
|
||||
if (result=Mem2MegAlloc(_pages2Meg,bp)) {
|
||||
num=*_pages2Meg;
|
||||
m=result;
|
||||
m1=m(U8 *)+num<<21;
|
||||
@@ -421,8 +422,8 @@ Return: NULL if out of memory.
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *MemBlksWriteThroughAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL)
|
||||
{/*Alloc 2Meg pages from bp. Don't link to task.
|
||||
U8 *Mem2MegWriteThruAlloc(I64 *_pages2Meg,CBlkPool *bp=NULL)
|
||||
{/*Alloc 2Meg pages from BlkPool. Don't link to task.
|
||||
(Linking to a task means they will be freed when the task dies.)
|
||||
It will be marked write-through. It might give you more than you asked for
|
||||
so a ptr to a page count is passed.
|
||||
@@ -431,7 +432,7 @@ Return: NULL if out of memory.
|
||||
*/
|
||||
CMemBlk *result,*m,*m1;
|
||||
I64 num=*_pages2Meg,*pte;
|
||||
if (result=MemBlks2MegAlloc(_pages2Meg,bp)) {
|
||||
if (result=Mem2MegAlloc(_pages2Meg,bp)) {
|
||||
num=*_pages2Meg;
|
||||
m=result;
|
||||
m1=m(U8 *)+num<<21;
|
||||
@@ -445,8 +446,8 @@ Return: NULL if out of memory.
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 MemBlks2MegFree(CMemBlk *m,I64 pages2Meg,CBlkPool *bp=NULL)
|
||||
{//Return 2Meg page(s) to bp.
|
||||
U0 Mem2MegFree(CMemBlk *m,I64 pages2Meg,CBlkPool *bp=NULL)
|
||||
{//Return non-task 2Meg pages to BlkPool.
|
||||
I64 *pte;
|
||||
CMemBlk *m1,*m2;
|
||||
if (m) {
|
||||
@@ -465,7 +466,7 @@ U0 MemBlks2MegFree(CMemBlk *m,I64 pages2Meg,CBlkPool *bp=NULL)
|
||||
PAUSE
|
||||
m->mb_signature=MBS_UNUSED_SIGNATURE_VAL;
|
||||
m->pages=pages2Meg<<(21-PAGE_BITS);
|
||||
bp->allocated_u8s-=pages2Meg<<21;
|
||||
bp->used_u8s-=pages2Meg<<21;
|
||||
m->next=bp->mem_free_2meg_lst;
|
||||
bp->mem_free_2meg_lst=m;
|
||||
LBtr(&bp->locked_flags,BPlf_LOCKED);
|
||||
@@ -473,7 +474,7 @@ U0 MemBlks2MegFree(CMemBlk *m,I64 pages2Meg,CBlkPool *bp=NULL)
|
||||
}
|
||||
}
|
||||
|
||||
CMemBlk *MemBlksAlloc(I64 *_pages512,CHeapCtrl *hc)
|
||||
CMemBlk *Mem512TaskAlloc(I64 *_pages512,CHeapCtrl *hc)
|
||||
{/*hc must be locked. Interrupts should probably be off
|
||||
Currently, this is only called from $LK,"MAlloc",A="MN:MAlloc"$().
|
||||
|
||||
@@ -481,10 +482,11 @@ Return: NULL if out of memory.
|
||||
*/
|
||||
CMemBlk *result;
|
||||
I64 threshold,cnt,size;
|
||||
CMemUnusedAllocated *uum,**_uum,**_ptr;
|
||||
if (result=MemBlksIndependentAlloc(_pages512,hc->bp)) {
|
||||
CMemUnused *uum,**_uum,**_ptr;
|
||||
if (result=Mem512Alloc(_pages512,hc->bp)) {
|
||||
QueIns(result,hc->last_mem_blk);
|
||||
result->mb_signature=MBS_USED_SIGNATURE_VAL;
|
||||
hc->alloced_u8s+=*_pages512<<PAGE_BITS;
|
||||
|
||||
//Tidy-up free lst (Move into heap hash)
|
||||
//because if free lst gets long, delay causes crash
|
||||
@@ -494,7 +496,7 @@ Return: NULL if out of memory.
|
||||
cnt=0;
|
||||
_uum=&hc->malloc_free_lst;
|
||||
while (uum=*_uum) {
|
||||
#assert !offset(CMemUnusedAllocated.next)
|
||||
#assert !offset(CMemUnused.next)
|
||||
size=uum->size;
|
||||
if (size<threshold) {
|
||||
*_uum=uum->next;
|
||||
@@ -512,7 +514,7 @@ Return: NULL if out of memory.
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 MemBlksFree(CMemBlk *m,CHeapCtrl *hc)
|
||||
U0 Mem512TaskFree(CMemBlk *m,CHeapCtrl *hc)
|
||||
{//hc must be locked
|
||||
if (m) {
|
||||
PUSHFD
|
||||
@@ -521,7 +523,8 @@ U0 MemBlksFree(CMemBlk *m,CHeapCtrl *hc)
|
||||
SysBadFree(m);
|
||||
else {
|
||||
QueRem(m);
|
||||
MemBlksNonTaskFree(m,m->pages,hc->bp);
|
||||
hc->alloced_u8s-=m->pages<<PAGE_BITS;
|
||||
Mem512Free(m,m->pages,hc->bp);
|
||||
}
|
||||
POPFD
|
||||
}
|
||||
@@ -27,12 +27,12 @@ _MALLOC::
|
||||
|
||||
@@15: MOV RAX,U64 SF_ARG1[RBP]
|
||||
PUSHFD
|
||||
ADD RAX,CMemUsedAllocated.start+7 //round-up to I64
|
||||
ADD RAX,CMemUsed.start+7 //round-up to I64
|
||||
AND AL,0xF8
|
||||
#assert CMemUsedAllocated.start>=sizeof(CMemUnusedAllocated)
|
||||
CMP RAX,CMemUsedAllocated.start
|
||||
#assert CMemUsed.start>=sizeof(CMemUnused)
|
||||
CMP RAX,CMemUsed.start
|
||||
JAE @@20
|
||||
MOV RAX,CMemUsedAllocated.start
|
||||
MOV RAX,CMemUsed.start
|
||||
@@20:
|
||||
|
||||
CLI
|
||||
@@ -46,7 +46,7 @@ _MALLOC::
|
||||
MOV RSI,U64 CHeapCtrl.heap_hash[RAX+RDX]
|
||||
TEST RSI,RSI
|
||||
JZ @@35
|
||||
MOV RCX,U64 CMemUnusedAllocated.next[RSI]
|
||||
MOV RCX,U64 CMemUnused.next[RSI]
|
||||
MOV U64 CHeapCtrl.heap_hash[RAX+RDX],RCX
|
||||
JMP I32 MALLOC_ALMOST_DONE
|
||||
|
||||
@@ -54,14 +54,14 @@ _MALLOC::
|
||||
@@30: ADD RAX,sizeof(CMemBlk)+PAGE_SIZE-1
|
||||
SHR RAX,PAGE_BITS
|
||||
|
||||
PUSH RDX //preserve heap ctrl
|
||||
PUSH RDX //preserve HeapCtrl
|
||||
PUSH RAX //num blks (we must pass address of this)
|
||||
MOV RAX,RSP
|
||||
PUSH RDX
|
||||
PUSH RAX //addr of num blks
|
||||
CALL &MemBlksAlloc
|
||||
CALL &Mem512TaskAlloc
|
||||
MOV RSI,RAX
|
||||
POP RAX //blks that were allocated
|
||||
POP RAX //blks that were alloced
|
||||
POP RDX
|
||||
TEST RSI,RSI
|
||||
JZ @@45 //Out of memory
|
||||
@@ -72,24 +72,24 @@ _MALLOC::
|
||||
JMP I32 MALLOC_ALMOST_DONE
|
||||
|
||||
//Little allocation, chunk-off piece from free lst chunks
|
||||
@@35: LEA RSI,U64 CHeapCtrl.malloc_free_lst-CMemUnusedAllocated.next[RDX]
|
||||
@@35: LEA RSI,U64 CHeapCtrl.malloc_free_lst-CMemUnused.next[RDX]
|
||||
|
||||
@@40: MOV RBX,RSI
|
||||
MOV RSI,U64 CMemUnusedAllocated.next[RBX]
|
||||
MOV RSI,U64 CMemUnused.next[RBX]
|
||||
TEST RSI,RSI
|
||||
JNZ @@55
|
||||
PUSH RAX //-**** save byte size
|
||||
ADD RAX,16*PAGE_SIZE-1
|
||||
SHR RAX,PAGE_BITS
|
||||
|
||||
PUSH RDX //preserve heap ctrl
|
||||
PUSH RDX //preserve HeapCtrl
|
||||
PUSH RAX //num blks (we must pass address of this)
|
||||
MOV RAX,RSP
|
||||
PUSH RDX
|
||||
PUSH RAX //addr of num blks
|
||||
CALL &MemBlksAlloc
|
||||
CALL &Mem512TaskAlloc
|
||||
MOV RSI,RAX
|
||||
POP RAX //blks that were allocated
|
||||
POP RAX //blks that were alloced
|
||||
POP RDX
|
||||
TEST RSI,RSI
|
||||
JNZ @@50
|
||||
@@ -107,43 +107,43 @@ _MALLOC::
|
||||
@@50: LEA RSI,U64 sizeof(CMemBlk)[RSI]
|
||||
SHL RAX,PAGE_BITS
|
||||
SUB RAX,sizeof(CMemBlk)
|
||||
LEA RBX,U64 CHeapCtrl.malloc_free_lst-CMemUnusedAllocated.next[RDX]
|
||||
MOV RDI,U64 CMemUnusedAllocated.next[RBX]
|
||||
MOV U64 CMemUnusedAllocated.next[RSI],RDI
|
||||
MOV U64 CMemUnusedAllocated.size[RSI],RAX
|
||||
MOV U64 CMemUnusedAllocated.next[RBX],RSI
|
||||
LEA RBX,U64 CHeapCtrl.malloc_free_lst-CMemUnused.next[RDX]
|
||||
MOV RDI,U64 CMemUnused.next[RBX]
|
||||
MOV U64 CMemUnused.next[RSI],RDI
|
||||
MOV U64 CMemUnused.size[RSI],RAX
|
||||
MOV U64 CMemUnused.next[RBX],RSI
|
||||
POP RAX //+****
|
||||
JMP @@65
|
||||
@@55: CMP U64 CMemUnusedAllocated.size[RSI],RAX
|
||||
@@55: CMP U64 CMemUnused.size[RSI],RAX
|
||||
JB @@40
|
||||
JNE @@65
|
||||
|
||||
@@60: MOV RDI,U64 CMemUnusedAllocated.next[RSI]
|
||||
MOV U64 CMemUnusedAllocated.next[RBX],RDI
|
||||
@@60: MOV RDI,U64 CMemUnused.next[RSI]
|
||||
MOV U64 CMemUnused.next[RBX],RDI
|
||||
JMP MALLOC_ALMOST_DONE
|
||||
|
||||
@@65: SUB U64 CMemUnusedAllocated.size[RSI],RAX //UPDATE FREE ENTRY
|
||||
CMP U64 CMemUnusedAllocated.size[RSI],sizeof(CMemUnusedAllocated)
|
||||
@@65: SUB U64 CMemUnused.size[RSI],RAX //UPDATE FREE ENTRY
|
||||
CMP U64 CMemUnused.size[RSI],sizeof(CMemUnused)
|
||||
JAE @@70 //take from top of block
|
||||
ADD U64 CMemUnusedAllocated.size[RSI],RAX //doesn't fit, undo
|
||||
ADD U64 CMemUnused.size[RSI],RAX //doesn't fit, undo
|
||||
JMP I32 @@40
|
||||
|
||||
@@70: ADD RSI,U64 CMemUnusedAllocated.size[RSI]
|
||||
@@70: ADD RSI,U64 CMemUnused.size[RSI]
|
||||
|
||||
MALLOC_ALMOST_DONE:
|
||||
//RSI=result-CMemUsedAllocated.size
|
||||
//RAX=size+CMemUsedAllocated.size
|
||||
//RDX=heap ctrl
|
||||
//RSI=result-CMemUsed.size
|
||||
//RAX=size+CMemUsed.size
|
||||
//RDX=HeapCtrl
|
||||
ADD U64 CHeapCtrl.used_u8s[RDX],RAX
|
||||
|
||||
#if _CFG_HEAP_DBG
|
||||
//QueIns
|
||||
MOV RDI,U64 CHeapCtrl.last_um[RDX]
|
||||
MOV U64 CMemUsedAllocated.next[RDI],RSI
|
||||
MOV U64 CMemUsed.next[RDI],RSI
|
||||
MOV U64 CHeapCtrl.last_um[RDX],RSI
|
||||
MOV U64 CMemUsedAllocated.last[RSI],RDI
|
||||
LEA RDI,U64 CHeapCtrl.next_um-CMemUsedAllocated.next[RDX]
|
||||
MOV U64 CMemUsedAllocated.next[RSI],RDI
|
||||
MOV U64 CMemUsed.last[RSI],RDI
|
||||
LEA RDI,U64 CHeapCtrl.next_um-CMemUsed.next[RDX]
|
||||
MOV U64 CMemUsed.next[RSI],RDI
|
||||
|
||||
//Caller1/Caller2
|
||||
PUSH RDX
|
||||
@@ -152,9 +152,9 @@ MALLOC_ALMOST_DONE:
|
||||
CMP RDI,RDX
|
||||
JB @@75
|
||||
XOR RDI,RDI
|
||||
MOV U64 CMemUsedAllocated.caller1[RSI],RDI
|
||||
MOV U64 CMemUsed.caller1[RSI],RDI
|
||||
JMP @@85
|
||||
@@75: MOV U64 CMemUsedAllocated.caller1[RSI],RDI
|
||||
@@75: MOV U64 CMemUsed.caller1[RSI],RDI
|
||||
MOV RDI,U64 SF_RBP[RBP]
|
||||
CMP RDI,RDX
|
||||
JB @@80
|
||||
@@ -164,7 +164,7 @@ MALLOC_ALMOST_DONE:
|
||||
CMP RDI,RDX
|
||||
JB @@85
|
||||
XOR RDI,RDI
|
||||
@@85: MOV U64 CMemUsedAllocated.caller2[RSI],RDI
|
||||
@@85: MOV U64 CMemUsed.caller2[RSI],RDI
|
||||
POP RDX
|
||||
|
||||
#endif
|
||||
@@ -172,9 +172,9 @@ MALLOC_ALMOST_DONE:
|
||||
BTR U32 CHeapCtrl.locked_flags[RDX],HClf_LOCKED
|
||||
POPFD
|
||||
|
||||
MOV U64 CMemUsedAllocated.size[RSI],RAX
|
||||
MOV U64 CMemUsedAllocated.hc[RSI],RDX
|
||||
LEA RAX,U64 CMemUsedAllocated.start[RSI]
|
||||
MOV U64 CMemUsed.size[RSI],RAX
|
||||
MOV U64 CMemUsed.hc[RSI],RDX
|
||||
LEA RAX,U64 CMemUsed.start[RSI]
|
||||
|
||||
TEST U8 [SYS_SEMAS+SYS_SEMA_HEAPLOG_ACTIVE*SEMA_STRUCT_SIZE],1
|
||||
JZ @@100
|
||||
@@ -193,8 +193,8 @@ MALLOC_ALMOST_DONE:
|
||||
JZ MALLOC_FINAL_EXIT
|
||||
|
||||
PUSH RAX
|
||||
MOV RCX,U64 CMemUsedAllocated.size-CMemUsedAllocated.start[RAX]
|
||||
SUB RCX,CMemUsedAllocated.start
|
||||
MOV RCX,U64 CMemUsed.size-CMemUsed.start[RAX]
|
||||
SUB RCX,CMemUsed.start
|
||||
MOV RDI,RAX
|
||||
MOV AL,U8 [SYS_HEAP_INIT_VAL]
|
||||
REP_STOSB
|
||||
@@ -207,7 +207,7 @@ MALLOC_FINAL_EXIT:
|
||||
RET1 16
|
||||
//************************************
|
||||
_FREE::
|
||||
//Be aware of $LK,"heap_hash",A="FF:::/Kernel/Mem1b.CPP,heap_hash"$ in $LK,"MemBlksAlloc",A="MN:MemBlksAlloc"$().
|
||||
//Be aware of $LK,"heap_hash",A="FF:::/Kernel/MemB.CPP,heap_hash"$ in $LK,"Mem512TaskAlloc",A="MN:Mem512TaskAlloc"$().
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
PUSH RSI
|
||||
@@ -218,7 +218,7 @@ _FREE::
|
||||
MOV RBX,U64 SF_ARG1[RBP]
|
||||
TEST RBX,RBX
|
||||
JZ @@05
|
||||
MOV RAX,U64 CMemUsedAllocated.size-CMemUsedAllocated.start[RBX]
|
||||
MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX]
|
||||
TEST RAX,RAX
|
||||
JGE @@05 //Aligned alloced chunks have neg size
|
||||
ADD RBX,RAX
|
||||
@@ -240,23 +240,23 @@ _FREE::
|
||||
JZ FREE_DONE
|
||||
#endif
|
||||
|
||||
MOV RAX,U64 CMemUsedAllocated.size-CMemUsedAllocated.start[RSI]
|
||||
MOV RAX,U64 CMemUsed.size-CMemUsed.start[RSI]
|
||||
TEST RAX,RAX
|
||||
JGE @@20 //Aligned alloced chunks have neg size.
|
||||
//The neg size is offset to start of $LK,"CMemUsedAllocated",A="MN:CMemUsedAllocated"$ struct.
|
||||
//The neg size is offset to start of $LK,"CMemUsed",A="MN:CMemUsed"$ struct.
|
||||
ADD RSI,RAX
|
||||
|
||||
@@20: PUSHFD
|
||||
SUB RSI,CMemUsedAllocated.start
|
||||
MOV RDX,U64 CMemUsedAllocated.hc[RSI]
|
||||
SUB RSI,CMemUsed.start
|
||||
MOV RDX,U64 CMemUsed.hc[RSI]
|
||||
CMP U32 CHeapCtrl.hc_signature[RDX],HEAP_CTRL_SIGNATURE_VAL
|
||||
JE @@25
|
||||
ADD RSI,CMemUsedAllocated.start
|
||||
ADD RSI,CMemUsed.start
|
||||
PUSH RSI
|
||||
CALL &SysBadFree
|
||||
JMP I32 _SYS_HLT
|
||||
|
||||
@@25: MOV RAX,U64 CMemUsedAllocated.size[RSI]
|
||||
@@25: MOV RAX,U64 CMemUsed.size[RSI]
|
||||
SUB U64 CHeapCtrl.used_u8s[RDX],RAX
|
||||
CLI
|
||||
@@30: LOCK
|
||||
@@ -265,10 +265,10 @@ _FREE::
|
||||
JC @@30
|
||||
#if _CFG_HEAP_DBG
|
||||
//QueRem
|
||||
MOV RDX,U64 CMemUsedAllocated.next[RSI]
|
||||
MOV RDI,U64 CMemUsedAllocated.last[RSI]
|
||||
MOV U64 CMemUsedAllocated.last[RDX],RDI
|
||||
MOV U64 CMemUsedAllocated.next[RDI],RDX
|
||||
MOV RDX,U64 CMemUsed.next[RSI]
|
||||
MOV RDI,U64 CMemUsed.last[RSI]
|
||||
MOV U64 CMemUsed.last[RDX],RDI
|
||||
MOV U64 CMemUsed.next[RDI],RDX
|
||||
|
||||
//Caller1/Caller2
|
||||
MOV RDX,U64 [SYS_HEAP_LIMIT]
|
||||
@@ -276,9 +276,9 @@ _FREE::
|
||||
CMP RDI,RDX
|
||||
JB @@35
|
||||
XOR RDI,RDI
|
||||
MOV U64 CMemUnusedAllocated.caller1[RSI],RDI
|
||||
MOV U64 CMemUnused.caller1[RSI],RDI
|
||||
JMP @@45
|
||||
@@35: MOV U64 CMemUnusedAllocated.caller1[RSI],RDI
|
||||
@@35: MOV U64 CMemUnused.caller1[RSI],RDI
|
||||
MOV RDI,U64 SF_RBP[RBP]
|
||||
CMP RDI,RDX
|
||||
JB @@40
|
||||
@@ -288,18 +288,18 @@ _FREE::
|
||||
CMP RDI,RDX
|
||||
JB @@45
|
||||
XOR RDI,RDI
|
||||
@@45: MOV U64 CMemUnusedAllocated.caller2[RSI],RDI
|
||||
@@45: MOV U64 CMemUnused.caller2[RSI],RDI
|
||||
|
||||
MOV RDX,U64 CMemUsedAllocated.hc[RSI]
|
||||
MOV RDX,U64 CMemUsed.hc[RSI]
|
||||
#endif
|
||||
CMP RAX,HEAP_HASH_SIZE
|
||||
JAE @@50
|
||||
|
||||
#assert CMemUnusedAllocated.size==CMemUsedAllocated.size
|
||||
// MOV U64 CMemUnusedAllocated.size[RSI],RAX
|
||||
#assert CMemUnused.size==CMemUsed.size
|
||||
// MOV U64 CMemUnused.size[RSI],RAX
|
||||
|
||||
MOV RBX,U64 CHeapCtrl.heap_hash[RAX+RDX]
|
||||
MOV U64 CMemUnusedAllocated.next[RSI],RBX
|
||||
MOV U64 CMemUnused.next[RSI],RBX
|
||||
MOV U64 CHeapCtrl.heap_hash[RAX+RDX],RSI
|
||||
JMP @@55
|
||||
|
||||
@@ -307,7 +307,7 @@ _FREE::
|
||||
PUSH RDX
|
||||
PUSH RDX
|
||||
PUSH RSI
|
||||
CALL &MemBlksFree
|
||||
CALL &Mem512TaskFree
|
||||
POP RDX
|
||||
|
||||
@@55: LOCK
|
||||
@@ -326,12 +326,12 @@ _MSIZE::
|
||||
XOR RAX,RAX
|
||||
TEST RBX,RBX
|
||||
JZ @@10
|
||||
MOV RAX,U64 CMemUsedAllocated.size-CMemUsedAllocated.start[RBX]
|
||||
MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX]
|
||||
TEST RAX,RAX
|
||||
JGE @@05 //Aligned alloced chunks have neg size
|
||||
ADD RBX,RAX
|
||||
MOV RAX,U64 CMemUsedAllocated.size-CMemUsedAllocated.start[RBX]
|
||||
@@05: SUB RAX,CMemUsedAllocated.start
|
||||
MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX]
|
||||
@@05: SUB RAX,CMemUsed.start
|
||||
@@10: POP RBP
|
||||
RET1 8
|
||||
//************************************
|
||||
@@ -342,11 +342,11 @@ _MSIZE2::
|
||||
XOR RAX,RAX
|
||||
TEST RBX,RBX
|
||||
JZ @@10
|
||||
MOV RAX,U64 CMemUsedAllocated.size-CMemUsedAllocated.start[RBX]
|
||||
MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX]
|
||||
TEST RAX,RAX
|
||||
JGE @@05 //Aligned alloced chunks have neg size
|
||||
ADD RBX,RAX
|
||||
@@05: MOV RAX,U64 CMemUsedAllocated.size-CMemUsedAllocated.start[RBX]
|
||||
@@05: MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX]
|
||||
@@10: POP RBP
|
||||
RET1 8
|
||||
//************************************
|
||||
@@ -357,11 +357,11 @@ _MHEAP_CTRL::
|
||||
XOR RAX,RAX
|
||||
TEST RBX,RBX
|
||||
JZ @@10
|
||||
MOV RAX,U64 CMemUsedAllocated.size-CMemUsedAllocated.start[RBX]
|
||||
MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX]
|
||||
TEST RAX,RAX
|
||||
JGE @@05 //Aligned alloced chunks have neg size
|
||||
ADD RBX,RAX
|
||||
@@05: MOV RAX,U64 CMemUsedAllocated.hc-CMemUsedAllocated.start[RBX]
|
||||
@@05: MOV RAX,U64 CMemUsed.hc-CMemUsed.start[RBX]
|
||||
@@10: POP RBP
|
||||
RET1 8
|
||||
}
|
||||
@@ -370,11 +370,11 @@ _extern _FREE U0 Free(U8 *addr); //Free $LK,"MAlloc",A="MN:MAlloc"$()ed memory c
|
||||
_extern _MSIZE I64 MSize(U8 *src); //Size of heap object.
|
||||
_extern _MSIZE2 I64 MSize2(U8 *src); //Internal size of heap object.
|
||||
_extern _MHEAP_CTRL CHeapCtrl *MHeapCtrl(U8 *src); //$LK,"CHeapCtrl",A="MN:CHeapCtrl"$ of object.
|
||||
_extern _MALLOC U8 *MAlloc(I64 size,CTask *mem_task=NULL); //Allocate memory chunk.
|
||||
_extern _MALLOC U8 *MAlloc(I64 size,CTask *mem_task=NULL); //Alloc memory chunk.
|
||||
//Accepts a $LK,"CTask",A="MN:CTask"$ or $LK,"CHeapCtrl",A="MN:CHeapCtrl"$. NULL allocs off current task's heap.
|
||||
|
||||
U8 *AMAlloc(I64 size)
|
||||
{//Allocate memory in Adam's heap.
|
||||
{//Alloc memory in Adam's heap.
|
||||
return MAlloc(size,adam_task);
|
||||
}
|
||||
|
||||
@@ -386,7 +386,7 @@ U8 *CAlloc(I64 size,CTask *mem_task=NULL)
|
||||
}
|
||||
|
||||
U8 *ACAlloc(I64 size)
|
||||
{//Allocate and set to zero memory in Adam's heap.
|
||||
{//Alloc and set to zero memory in Adam's heap.
|
||||
return CAlloc(size,adam_task);
|
||||
}
|
||||
|
||||
@@ -402,7 +402,7 @@ U8 *MAllocIdentical(U8 *src,CTask *mem_task=NULL)
|
||||
}
|
||||
|
||||
U8 *AMAllocIdentical(U8 *src)
|
||||
{//Allocate in Adam's heap, identical copy of heap node.
|
||||
{//Alloc in Adam's heap, identical copy of heap node.
|
||||
return MAllocIdentical(src,adam_task);
|
||||
}
|
||||
|
||||
@@ -412,7 +412,7 @@ U8 *MAllocAligned(I64 size,I64 alignment,CTask *mem_task=NULL,I64 misalignment=0
|
||||
U8 *ptr=MAlloc(size+mask+sizeof(I64)+misalignment,mem_task),
|
||||
*result=(ptr+sizeof(I64)+mask)&~mask+misalignment;
|
||||
result(I64 *)[-1]=ptr-result;
|
||||
#assert offset(CMemUsedAllocated.size)==offset(CMemUsedAllocated.start)-sizeof(I64)
|
||||
#assert offset(CMemUsed.size)==offset(CMemUsed.start)-sizeof(I64)
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -422,7 +422,7 @@ U8 *CAllocAligned(I64 size,I64 alignment,CTask *mem_task=NULL,I64 misalignment=0
|
||||
U8 *ptr=MAlloc(size+mask+sizeof(I64)+misalignment,mem_task),
|
||||
*result=(ptr+sizeof(I64)+mask)&~mask+misalignment;
|
||||
result(I64 *)[-1]=ptr-result;
|
||||
#assert offset(CMemUsedAllocated.size)==offset(CMemUsedAllocated.start)-sizeof(I64)
|
||||
#assert offset(CMemUsed.size)==offset(CMemUsed.start)-sizeof(I64)
|
||||
MemSet(result,0,size);
|
||||
return result;
|
||||
}
|
||||
@@ -443,6 +443,6 @@ U8 *StrNew(U8 *buf,CTask *mem_task=NULL)
|
||||
}
|
||||
|
||||
U8 *AStrNew(U8 *buf)
|
||||
{//Allocate copy of string in Adam's heap.
|
||||
{//Alloc copy of string in Adam's heap.
|
||||
return StrNew(buf,adam_task);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pages512)
|
||||
{//Add memory to blk pool.
|
||||
{//Add mem to BlkPool.
|
||||
if (sys_mem_init_flag)
|
||||
MemSet(m,sys_mem_init_val,pages512*512);
|
||||
PUSHFD
|
||||
@@ -9,20 +9,20 @@ U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pages512)
|
||||
m->next=bp->mem_free_lst;
|
||||
m->pages=pages512;
|
||||
m->mb_signature=MBS_UNUSED_SIGNATURE_VAL;
|
||||
bp->size+=pages512;
|
||||
bp->alloced_u8s+=pages512<<PAGE_BITS;
|
||||
bp->mem_free_lst=m;
|
||||
LBtr(&bp->locked_flags,BPlf_LOCKED);
|
||||
POPFD
|
||||
}
|
||||
|
||||
U0 BlkPoolInit(CBlkPool *bp,I64 pages512)
|
||||
{//Make memory chunk into a blk pool.
|
||||
{//Make mem chunk into a BlkPool.
|
||||
I64 num;
|
||||
CMemBlk *m;
|
||||
MemSet(bp,0,sizeof(CBlkPool));
|
||||
m=(bp(U8 *)+sizeof(CBlkPool)+PAGE_SIZE-1)&~(PAGE_SIZE-1);
|
||||
num=(bp(U8 *)+pages512<<PAGE_BITS-m(U8 *))>>PAGE_BITS;
|
||||
bp->size=pages512-num; //Compensate before num added.
|
||||
bp->alloced_u8s=(pages512-num)<<PAGE_BITS; //Compensate before num added.
|
||||
BlkPoolAdd(bp,m,num);
|
||||
}
|
||||
|
||||
@@ -34,12 +34,12 @@ CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL,CTask *task=NULL,CBlkPool *bp)
|
||||
hc->mem_task=task;
|
||||
hc->bp=bp;
|
||||
QueInit(&hc->next_mem_blk);
|
||||
hc->next_um=hc->last_um=(&hc->next_um)(U8 *)-offset(CMemUsedAllocated.next);
|
||||
hc->next_um=hc->last_um=(&hc->next_um)(U8 *)-offset(CMemUsed.next);
|
||||
return hc;
|
||||
}
|
||||
|
||||
CHeapCtrl *HeapCtrlBPInit(CBlkPool *bp,I64 pages512)
|
||||
{//Make memory chunk into heap ctrl and blk pool.
|
||||
{//Make mem chunk into HeapCtrl and BlkPool.
|
||||
I64 num;
|
||||
CMemBlk *m;
|
||||
CHeapCtrl *hc;
|
||||
@@ -47,13 +47,13 @@ CHeapCtrl *HeapCtrlBPInit(CBlkPool *bp,I64 pages512)
|
||||
hc=HeapCtrlInit(bp(U8 *)+sizeof(CBlkPool),,bp);
|
||||
m=(bp(U8 *)+sizeof(CBlkPool)+sizeof(CHeapCtrl)+PAGE_SIZE-1)&~(PAGE_SIZE-1);
|
||||
num=(bp(U8 *)+pages512<<PAGE_BITS-m(U8 *))>>PAGE_BITS;
|
||||
bp->size=pages512-num;
|
||||
bp->alloced_u8s=(pages512-num)<<PAGE_BITS;
|
||||
BlkPoolAdd(bp,m,num);
|
||||
return hc;
|
||||
}
|
||||
|
||||
U0 HeapCtrlDel(CHeapCtrl *hc)
|
||||
{//Free all blks alloced to a heap ctrl.
|
||||
{//Free all blks alloced to a HeapCtrl.
|
||||
CMemBlk *m,*m1;
|
||||
if (hc) {
|
||||
PUSHFD
|
||||
@@ -63,7 +63,7 @@ U0 HeapCtrlDel(CHeapCtrl *hc)
|
||||
m=hc->next_mem_blk;
|
||||
while (m!=&hc->next_mem_blk) {
|
||||
m1=m->next;
|
||||
MemBlksFree(m,hc);
|
||||
Mem512TaskFree(m,hc);
|
||||
m=m1;
|
||||
}
|
||||
LBtr(&hc->locked_flags,HClf_LOCKED);
|
||||
@@ -305,9 +305,12 @@ U0 HeapsInit()
|
||||
|
||||
I64 Scale2Mem(I64 min,I64 max,I64 limit=2*1024*1024*1024)
|
||||
{//Helps pick DiskCache and RAMDisk sizes.
|
||||
//Can be used in $LK,"MakeOSPrtBootInstall",A="MN:MakeOSPrtBootInstall"$() config scripts.
|
||||
//Scale-back allocations if less than 2048 Meg.
|
||||
I64 i=sys_code_bp->size<<PAGE_BITS;
|
||||
//Can be used in $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$() config scripts.
|
||||
I64 i;
|
||||
if (sys_data_bp)
|
||||
i=sys_data_bp->alloced_u8s;
|
||||
else
|
||||
i=sys_code_bp->alloced_u8s;
|
||||
if (i>=limit)
|
||||
return max;
|
||||
else
|
||||
+26
-33
@@ -5,33 +5,28 @@ USE16
|
||||
|
||||
//This code gets copied to $LK,"MP_VECT_ADDR",A="MN:MP_VECT_ADDR"$.
|
||||
//See $LK,"MemCpy(MP_VECT_ADDR",A="FF:::/Kernel/MultiProc.CPP,MemCpy(mp:2"$.
|
||||
SYS_MP_INIT_START::
|
||||
JMP MP2_START2
|
||||
AP_16BIT_INIT::
|
||||
JMP @@05
|
||||
|
||||
ALIGN 4,OC_NOP
|
||||
MP2_SYS_TEMP_PTR: DU32 0,0;
|
||||
|
||||
MP2_START2:
|
||||
CLI
|
||||
AP_GDT_PTR: DU16 sizeof(CGDT)-1;
|
||||
DU64 0;
|
||||
|
||||
@@05: CLI
|
||||
WBINVD
|
||||
|
||||
MOV AX,MP_VECT_ADDR/16
|
||||
MOV DS,AX
|
||||
|
||||
//See $LK,"mp->sys_temp_ptr",A="FF:::/Kernel/MultiProc.CPP,mp->sys_temp_ptr:2"$
|
||||
#assert MP2_SYS_TEMP_PTR-SYS_MP_INIT_START==CMPMain.sys_temp_ptr
|
||||
LGDT U32 [CMPMain.sys_temp_ptr]
|
||||
LGDT U32 [CAP16BitInit.ap_gdt_ptr] //See $LK,"mp->ap_gdt_ptr",A="FF:::/Kernel/MultiProc.CPP,mp->ap_gdt_ptr:2"$
|
||||
|
||||
MOV EAX,SYS_START_CR0
|
||||
MOV_CR0_EAX
|
||||
|
||||
DU8 0x66,0xEA; //JMP CGDT.cs32:MP_INIT_OS
|
||||
DU32 MP_INIT_OS;
|
||||
DU8 0x66,0xEA; //JMP CGDT.cs32:AP_32BIT_INIT
|
||||
DU32 AP_32BIT_INIT;
|
||||
DU16 CGDT.cs32;
|
||||
AP_16BIT_INIT_END::
|
||||
|
||||
SYS_MP_INIT_END::
|
||||
USE32
|
||||
MP_INIT_OS:
|
||||
AP_32BIT_INIT:
|
||||
MOV AX,CGDT.ds
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
@@ -58,8 +53,8 @@ MP_INIT_OS:
|
||||
LEA ESP,U32 CCPU.start_stk+sizeof(CCPU.start_stk)[ESI]
|
||||
PUSH U32 SYS_START_RFLAGS
|
||||
POPFD
|
||||
PUSH U32 0
|
||||
CALL INIT_EM64T
|
||||
PUSH U32 0 //Return from next call will be 64-bit
|
||||
CALL SYS_EM64T
|
||||
USE64
|
||||
FNINIT
|
||||
MOV RAX,RSI
|
||||
@@ -193,7 +188,7 @@ U0 MPWake(I64 target_cpu)
|
||||
U0 MPAPICInit()
|
||||
{//Called by adam during start-up
|
||||
//and other cores during initialization
|
||||
//after $LK,"MPStart",A="MN:MPStart"$().
|
||||
//after $LK,"BSPStartMP",A="MN:BSPStartMP"$().
|
||||
*LAPIC_SVR(U32 *)|=LAPICF_APIC_ENABLED;
|
||||
dev.mp_apic_ids[Gs->num]=*LAPIC_APIC_ID(U32 *)>>24;
|
||||
*LAPIC_LDR(U32 *)=dev.mp_apic_ids[Gs->num]<<24;
|
||||
@@ -213,7 +208,7 @@ U0 MPAPICInit()
|
||||
|
||||
#assert !offset(CSrvCtrl.next_waiting)
|
||||
|
||||
U0 MPSethServerTask()
|
||||
U0 APSethTask()
|
||||
{
|
||||
CSrvCtrl *my_ctrl=&Fs->srv_ctrl;
|
||||
CSrvCmd *tempc,*tempc1=&my_ctrl->next_waiting;
|
||||
@@ -222,7 +217,6 @@ U0 MPSethServerTask()
|
||||
TaskFinishOffDying;
|
||||
if (!LBts(&my_ctrl->flags,SVCRf_LOCKED)) {
|
||||
tempc=tempc1->next;
|
||||
//Jobs for this core are highest priority.
|
||||
if (tempc==tempc1 || !SrvCmdRun(tempc,GetRFlags)) {
|
||||
LBtr(&my_ctrl->flags,SVCRf_LOCKED) ;
|
||||
if (my_ctrl->next_waiting==my_ctrl) {
|
||||
@@ -296,20 +290,20 @@ CTask *SpawnQue(U0 (*fp_addr)(U8 *data),U8 *data=NULL,
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 MPCPUTaskInit()
|
||||
{//Called by multicore's seth task after $LK,"MPStart",A="MN:MPStart"$()
|
||||
U0 APSethInit()
|
||||
{//Called by multicore's seth task after $LK,"BSPStartMP",A="MN:BSPStartMP"$()
|
||||
//as the first thing a CPU does before waiting for jobs.
|
||||
MPAPICInit;
|
||||
Fs->rip=&MPSethServerTask;
|
||||
Fs->rip=&APSethTask;
|
||||
Fs->time_slice_start=GetTSC;
|
||||
TaskContextRestore;
|
||||
}
|
||||
|
||||
U0 MPStart()
|
||||
{//Called by adam during $LK,"start-up",A="FF:::/Kernel/KEnd.CPP,MPStart"$.
|
||||
U0 BSPStartMP()
|
||||
{//Called by adam during $LK,"start-up",A="FF:::/Kernel/KEnd.CPP,BSPStartMP"$.
|
||||
CTask *task;
|
||||
U8 buf[128];
|
||||
CMPMain *mp=MP_VECT_ADDR;
|
||||
CAP16BitInit *mp=MP_VECT_ADDR;
|
||||
CCPU *c;
|
||||
I64 i,my_mp_cnt;
|
||||
CRAXRBCRCXRDX ee;
|
||||
@@ -334,9 +328,8 @@ U0 MPStart()
|
||||
//When you start-up other cores, they jump to an addr
|
||||
//specified by a byte vect number, $LK,"MPN_VECT",A="MN:MPN_VECT"$ which corresponds
|
||||
//to a location 4096*vect number, $LK,"MP_VECT_ADDR",A="MN:MP_VECT_ADDR"$$WW,0$.
|
||||
MemCpy(mp,SYS_MP_INIT_START,SYS_MP_INIT_END-SYS_MP_INIT_START);
|
||||
|
||||
mp->sys_temp_ptr=sizeof(CGDT)-1+(&sys_gdt)(U8 *)<<16;
|
||||
MemCpy(mp,AP_16BIT_INIT,AP_16BIT_INIT_END-AP_16BIT_INIT);
|
||||
MemCpy(&mp->ap_gdt_ptr,SYS_GDT_PTR,sizeof(CSysLimitBase));
|
||||
mp_cnt_initial=mp_cnt=1;
|
||||
mp_cnt_lock=0;
|
||||
|
||||
@@ -360,9 +353,9 @@ U0 MPStart()
|
||||
|
||||
for (i=1;i<my_mp_cnt;i++) {
|
||||
StrPrint(buf,"Seth Task CPU#%d",i);
|
||||
task=Spawn(&MPCPUTaskInit,NULL,buf,,,SETH_STK,0);
|
||||
task=Spawn(&APSethInit,NULL,buf,,,SETH_STK,0);
|
||||
task->rflags=SYS_START_RFLAGS;
|
||||
//$LK,"CTask",A="MN:CTask"$ allocated off this core's seth_task's heap (Which is Adam)
|
||||
//$LK,"CTask",A="MN:CTask"$ alloced off this core's seth_task's heap (Which is Adam)
|
||||
task->task_in_que_signature=TASK_IN_QUE_SIGNATURE_VAL;
|
||||
CPUStructInit(i,&cpu_structs[i],task);
|
||||
WBINVD //Not sure why this is needed. Might just need delay.
|
||||
@@ -379,7 +372,7 @@ U0 MPStart()
|
||||
mp_cnt=my_mp_cnt; //Finalize cnt
|
||||
}
|
||||
|
||||
U0 MPInit()
|
||||
U0 BSPInit()
|
||||
{//Called by adam during start-up
|
||||
CRAXRBCRCXRDX ee;
|
||||
CPUId(0x1,&ee);
|
||||
|
||||
+40
-34
@@ -8,46 +8,48 @@ I64 HasLower(U8 *src)
|
||||
}
|
||||
|
||||
CHash *PSectFind(U8 *addr,I64 *_offset)
|
||||
{//See $LK,"::/Kernel/Hash1a.CPP",A="FL:::/Kernel/Hash1a.CPP,1"$.
|
||||
{//See $LK,"::/Kernel/KHashA.CPP",A="FL:::/Kernel/KHashA.CPP,1"$.
|
||||
CHash *result=NULL;
|
||||
CHashExport *tempex;
|
||||
Bool has_lower=FALSE;
|
||||
CHashTable *h=Fs->hash_table;
|
||||
U64 best=0xFFFF,j;
|
||||
U64 i,j,best=0xFFFF;
|
||||
if (!ChkCodePtr(addr)) {
|
||||
*_offset=best;
|
||||
return NULL;
|
||||
}
|
||||
while (h) {
|
||||
tempex=h->next_added;
|
||||
while (tempex!=h) {
|
||||
j=0;
|
||||
if (tempex->type&HTT_FUN) {
|
||||
if (!Bt(&tempex(CHashFun *)->flags,Cf_EXTERN) &&
|
||||
!Bt(&tempex(CHashFun *)->flags,Ff_INTERNAL))
|
||||
j=tempex(CHashFun *)->executable_addr;
|
||||
} else if (tempex->type&HTT_EXPORT_SYS_SYM)
|
||||
j=tempex->val;
|
||||
if (j) {
|
||||
j=addr(I64)-j;
|
||||
if (0<=j<=best) {
|
||||
if (tempex->type&HTT_EXPORT_SYS_SYM) {
|
||||
if (j<best || j==best && !has_lower) {
|
||||
has_lower=HasLower(tempex->str);
|
||||
best=j;
|
||||
result=tempex;
|
||||
}
|
||||
} else if (tempex->type&HTT_FUN) {
|
||||
if (j<best || j==best &&
|
||||
(result && result->type&HTT_EXPORT_SYS_SYM||!has_lower)) {
|
||||
has_lower=HasLower(tempex->str);
|
||||
best=j;
|
||||
result=tempex;
|
||||
for (i=0;i<=h->mask;i++) {
|
||||
tempex=h->body[i];
|
||||
while (tempex) {
|
||||
j=0;
|
||||
if (tempex->type&HTT_FUN) {
|
||||
if (!Bt(&tempex(CHashFun *)->flags,Cf_EXTERN) &&
|
||||
!Bt(&tempex(CHashFun *)->flags,Ff_INTERNAL))
|
||||
j=tempex(CHashFun *)->executable_addr;
|
||||
} else if (tempex->type&HTT_EXPORT_SYS_SYM)
|
||||
j=tempex->val;
|
||||
if (j) {
|
||||
j=addr(I64)-j;
|
||||
if (0<=j<=best) {
|
||||
if (tempex->type&HTT_EXPORT_SYS_SYM) {
|
||||
if (j<best || j==best && !has_lower) {
|
||||
has_lower=HasLower(tempex->str);
|
||||
best=j;
|
||||
result=tempex;
|
||||
}
|
||||
} else if (tempex->type&HTT_FUN) {
|
||||
if (j<best || j==best &&
|
||||
(result && result->type&HTT_EXPORT_SYS_SYM||!has_lower)) {
|
||||
has_lower=HasLower(tempex->str);
|
||||
best=j;
|
||||
result=tempex;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tempex=tempex->next;
|
||||
}
|
||||
tempex=tempex->next_added;
|
||||
}
|
||||
h=h->next;
|
||||
}
|
||||
@@ -254,7 +256,7 @@ U8 *SrcEdLink(U8 *addr,I64 cnt=1,CTask *mem_task=NULL)
|
||||
}
|
||||
|
||||
Bool PutSrcLink(U8 *addr,I64 cnt=1,U8 *buf=NULL)
|
||||
{//Put to StdOut a $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT.Z"$ file,line link to src of addr.
|
||||
{//Put to StdOut a $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT"$ file,line link to src of addr.
|
||||
U8 *src;
|
||||
if (src=SrcEdLink(addr,cnt)) {
|
||||
if (buf)
|
||||
@@ -268,28 +270,32 @@ Bool PutSrcLink(U8 *addr,I64 cnt=1,U8 *buf=NULL)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
U0 E(U8 *addr,I64 cnt=512,I64 edf_dof_flags=0)
|
||||
Bool E(U8 *addr,I64 cnt=512,I64 edf_dof_flags=0)
|
||||
{//Edit src at addr.
|
||||
U8 *st;
|
||||
Bool result=FALSE;
|
||||
if (st=SrcEdLink(addr,cnt)) {
|
||||
if (IsRaw)
|
||||
EdLiteFileLine(st);
|
||||
result=EdLiteFileLine(st,edf_dof_flags);
|
||||
else
|
||||
Ed(st,edf_dof_flags);
|
||||
result=Ed(st,edf_dof_flags);
|
||||
Free(st);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 Man(U8 *st)
|
||||
Bool Man(U8 *st,I64 edf_dof_flags=0)
|
||||
{//Owner's manual for symbol. Edit src code for symbol.
|
||||
Bool result=FALSE;
|
||||
U8 **st2;
|
||||
CHashSrcSym *temph;
|
||||
if (IsRaw) {
|
||||
if ((temph=HashFind(st,Fs->hash_table,HTG_SRC_SYM)) && temph->src_link)
|
||||
EdLiteFileLine(temph->src_link);
|
||||
result=EdLiteFileLine(temph->src_link,edf_dof_flags);
|
||||
} else {
|
||||
st2=MStrPrint("MN:%s",st);
|
||||
Ed(st2);
|
||||
result=Ed(st2,edf_dof_flags);
|
||||
Free(st2);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
+10
-7
@@ -1,11 +1,14 @@
|
||||
/*See $LK,"TempleOS MultiTasking",A="FI:::/Doc/MultiTasking.TXT"$.
|
||||
|
||||
Tasks are ordered in a circular queue
|
||||
by front-to-back window stack order with
|
||||
the window mgr as the head (paints
|
||||
the wallpaper). The scheduler is
|
||||
round-robin. It checks if a task
|
||||
is ready and runs it or skips it.
|
||||
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
|
||||
window stack order with the window mgr
|
||||
as the wallpaper.
|
||||
|
||||
The scheduler is round-robin. It checks
|
||||
if a task is ready and runs it or skips it.
|
||||
Swapping tasks just involves storing and
|
||||
restoring regs (no disk I/O for virtual
|
||||
memory and no addr map changes). It is
|
||||
@@ -35,7 +38,7 @@ The scheduler checks for a few keys:
|
||||
Each core has its own circular task queue.
|
||||
For AP processors, they have a "Seth" task
|
||||
which stays in a loop waiting for jobs or
|
||||
requests to spawn tasks. See $LK,"MPSethServerTask",A="MN:MPSethServerTask"$().
|
||||
requests to spawn tasks. See $LK,"APSethTask",A="MN:APSethTask"$().
|
||||
$HL,1$*/
|
||||
|
||||
asm {
|
||||
|
||||
+42
-27
@@ -37,10 +37,9 @@ U0 TaskRstAwaitingMsg(CTask *task=NULL)
|
||||
}
|
||||
|
||||
CSrvCmd *TaskExe(CTask *srv,CTask *master,U8 *data,I64 flags)
|
||||
{//Queues a request to compile and execute text.
|
||||
{//Queues a request to compile and execute src code text.
|
||||
CSrvCmd *result;
|
||||
if (!data || !TaskValidate(srv) ||
|
||||
master && !TaskValidate(master) ||
|
||||
if (!data || !TaskValidate(srv) || master && !TaskValidate(master) ||
|
||||
srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT))
|
||||
return NULL;
|
||||
result=ACAlloc(sizeof(CSrvCmd));
|
||||
@@ -73,12 +72,11 @@ CSrvCmd *TaskExe(CTask *srv,CTask *master,U8 *data,I64 flags)
|
||||
}
|
||||
|
||||
CSrvCmd *TaskText(CTask *srv,CTask *master,U8 *data,I64 flags)
|
||||
{//Post text to servant task. Tell who the master task is.
|
||||
{//Post StdIn text to servant task. Tell who the master task is.
|
||||
CSrvCmd *result;
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
CTask *task;
|
||||
if (!data || !TaskValidate(srv) ||
|
||||
master && !TaskValidate(master) ||
|
||||
if (!data || !TaskValidate(srv) || master && !TaskValidate(master) ||
|
||||
srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT)) {
|
||||
Preempt(old_preempt);
|
||||
return NULL;
|
||||
@@ -126,8 +124,7 @@ CSrvCmd *TaskMsg(CTask *_srv,CTask *master,I64 msg_code,I64 a1,I64 a2,I64 flags)
|
||||
//See $LK,"flags",A="MN:SVCf_WAKE_MASTER"$ and $LK,"msg_code",A="MN:MSG_CMD"$.
|
||||
CSrvCmd *tempc1,*tempc;
|
||||
CTask *srv=_srv;
|
||||
if (!TaskValidate(srv) ||
|
||||
master && !TaskValidate(master)||
|
||||
if (!TaskValidate(srv) || master && !TaskValidate(master)||
|
||||
srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT))
|
||||
return NULL;
|
||||
tempc=ACAlloc(sizeof(CSrvCmd));
|
||||
@@ -139,8 +136,7 @@ CSrvCmd *TaskMsg(CTask *_srv,CTask *master,I64 msg_code,I64 a1,I64 a2,I64 flags)
|
||||
tempc->flags=flags;
|
||||
PUSHFD
|
||||
if (Bt(&sys_semas[SYS_SEMA_RECORD_MACRO],0) &&
|
||||
srv!=sys_macro_util_task &&
|
||||
msg_code==MSG_KEY_DOWN) {
|
||||
srv!=sys_macro_util_task && msg_code==MSG_KEY_DOWN) {
|
||||
tempc1=AMAllocIdentical(tempc);
|
||||
CLI
|
||||
QueIns(tempc1,sys_macro_root.last);
|
||||
@@ -385,17 +381,35 @@ sch_done:
|
||||
return cnt;
|
||||
}
|
||||
|
||||
I64 SrvUser(U8 *fmt,...)
|
||||
{//Spawns a visible task and sends text which gets compiled and run.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
I64 result=0;
|
||||
I64 PopUp(U8 *buf,CTask *parent=NULL,CTask **_pu_task=NULL)
|
||||
{//Execute code text in PopUp win task.
|
||||
I64 result;
|
||||
CSrvCmd *tempc;
|
||||
CTask *task=Spawn(&SrvUserCmdLine,NULL,"Servant",,Fs);
|
||||
Fs->popup_task=task;
|
||||
tempc=TaskExe(task,Fs,buf,1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
|
||||
ScanResult(tempc,&result);
|
||||
Fs->popup_task=NULL;
|
||||
Kill(task,FALSE);
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
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;
|
||||
tempc=TaskExe(task,parent,buf,1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
|
||||
if (_pu_task) *_pu_task=task;
|
||||
ScanResult(tempc,&result);
|
||||
Fs->popup_task=NULL;
|
||||
Kill(task);
|
||||
if (_pu_task) *_pu_task=NULL;
|
||||
Preempt(old_preempt);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
I64 PopUpPrint(U8 *fmt,...)
|
||||
{//Execute code text in PopUp win task.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
I64 result;
|
||||
result=PopUp(buf,Fs);
|
||||
Free(buf);
|
||||
return result;
|
||||
}
|
||||
@@ -445,7 +459,7 @@ U0 XTalk(CTask *task,U8 *fmt,...)
|
||||
{//Sends text to other task. See $LK,"::/Misc/OSTestSuite.CPP"$.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv),*st=AStrNew(buf),
|
||||
*st2=MStrPrint("\"%%s\",%d;Free(%d);",st,st);
|
||||
TaskText(task,0,st2,0);
|
||||
TaskText(task,NULL,st2,0);
|
||||
Free(st2);
|
||||
Free(buf);
|
||||
}
|
||||
@@ -454,7 +468,7 @@ U0 XTalkWait(CTask *task,U8 *fmt,...)
|
||||
{//Send text to other task and wait for it to idle.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv),*st=AStrNew(buf),
|
||||
*st2=MStrPrint("\"%%s\",%d;Free(%d);",st,st);
|
||||
TaskText(task,0,st2,0);
|
||||
TaskText(task,NULL,st2,0);
|
||||
Free(st2);
|
||||
Free(buf);
|
||||
TaskWait(task);
|
||||
@@ -466,19 +480,20 @@ U0 AutoStr(U8 *fmt,...)
|
||||
if (Bt(&Fs->task_flags,TASKf_INPUT_FILTER_TASK))
|
||||
ExePrint("%s",buf);
|
||||
else
|
||||
TaskText(Fs,0,buf,1<<SVCf_HIGHEST_PRIORITY);
|
||||
TaskText(Fs,NULL,buf,1<<SVCf_HIGHEST_PRIORITY);
|
||||
Free(buf);
|
||||
}
|
||||
|
||||
U0 AutoFile(U8 *filename)
|
||||
{//Send AutoFile code file to self.
|
||||
U8 *name=DftExt(filename,"AUT.Z");
|
||||
AutoStr("%F",name);
|
||||
AutoStr("Cd(\"%C:%s\");;#include \"%s\"",
|
||||
Drv2Let(Fs->cur_dv),Fs->cur_dir,name);
|
||||
Free(name);
|
||||
}
|
||||
|
||||
U0 Auto(U8 *fmt,...)
|
||||
{//Send text to own input buffer. See $LK,"::/Demo/AcctExample/TSDistro.CPP"$.
|
||||
{//Send text to own input buffer. See $LK,"::/Demo/AcctExample/TOSDistro.CPP"$.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv),*st=AStrNew(buf);
|
||||
AutoStr("\"%%s\",%d;Free(%d);",st,st);
|
||||
Free(buf);
|
||||
@@ -487,14 +502,14 @@ U0 Auto(U8 *fmt,...)
|
||||
U0 XTalkStr(CTask *task,U8 *fmt,...)
|
||||
{//Send AutoFile code to other task.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
TaskText(task,0,buf,0);
|
||||
TaskText(task,NULL,buf,0);
|
||||
Free(buf);
|
||||
}
|
||||
|
||||
U0 XTalkStrWait(CTask *task,U8 *fmt,...)
|
||||
{//Send AutoFile code to other task and wait for it to idle.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
TaskText(task,0,buf,0);
|
||||
TaskText(task,NULL,buf,0);
|
||||
Free(buf);
|
||||
TaskWait(task);
|
||||
}
|
||||
@@ -314,9 +314,8 @@ _extern _STRMATCH U8 *StrMatch(U8 *needle,U8 *haystack_str); //Scan for string i
|
||||
_extern _STRIMATCH U8 *StrIMatch(U8 *needle,U8 *haystack_str); //Scan for string in string, ignoring case.
|
||||
_extern _STRCPY U0 StrCpy(U8 *dst,U8 *src); //Copy string.
|
||||
|
||||
/*These bitmaps go to 0-511 so that
|
||||
$LK,"Lex",A="MN:Lex"$() can use them with $LK,"Token Codes",A="MN:TK_EOF"$.
|
||||
*/
|
||||
//These bitmaps go to 0-511 so that $LK,"Lex",A="MN:Lex"$() can use them with $LK,"Token Codes",A="MN:TK_EOF"$.
|
||||
|
||||
U32 chars_bitmap_alpha[16]=
|
||||
{0x0000000,0x00000000,0x87FFFFFF,0x07FFFFFE,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
|
||||
0,0,0,0,0,0,0,0},
|
||||
@@ -334,36 +333,29 @@ chars_bitmap_word[16]=
|
||||
0,0,0,0,0,0,0,0},
|
||||
|
||||
chars_bitmap_filename[16]=
|
||||
{0x0000000,0x03FF73FB,0xEFFFFFFF,0x2FFFFFFF,0,0,0,0,
|
||||
{0x0000000,0x03FF73FB,0xEFFFFFFF,0x2FFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
|
||||
0,0,0,0,0,0,0,0},
|
||||
|
||||
chars_bitmap_dec_numeric[16]=
|
||||
{0x0000000,0x03FF0000,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0},
|
||||
{0x0000000,0x03FF0000,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
|
||||
chars_bitmap_hex_numeric[16]=
|
||||
{0x0000000,0x03FF0000,0x7E,0x7E,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0},
|
||||
{0x0000000,0x03FF0000,0x7E,0x7E,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
|
||||
chars_bitmap_white_space[16]=
|
||||
{0x80003600,1,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0},
|
||||
{0x80003600,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
|
||||
chars_bitmap_non_eol_white_space[16]=
|
||||
{0x80001200,1,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0},
|
||||
{0x80001200,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
|
||||
chars_bitmap_zero_cr_nl_cursor[16]=
|
||||
{0x00002421,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0},
|
||||
{0x00002421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
|
||||
chars_bitmap_zero_tab_ff_cr_nl_cursor[16]=
|
||||
{0x00003621,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0},
|
||||
{0x00003621,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
|
||||
chars_bitmap_zero_tab_ff_cr_nl_cursor_dollar[16]=
|
||||
{0x00003621,0x10,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0},
|
||||
{0x00003621,0x10,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
|
||||
chars_bitmap_getkey[16]=
|
||||
{0x80002600,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
|
||||
File renamed without changes.
+26
-79
@@ -67,7 +67,7 @@ U8 *MPrintDate(CDate cdt)
|
||||
|
||||
U8 *MPrintQ(U8 *ptr,I64 flags)
|
||||
{
|
||||
U8 **_buf,*buf,**_dst,*dst;
|
||||
U8 **_buf,*buf,**_dst,*dst,buf2[8],*ptr2;
|
||||
I64 ch;
|
||||
buf=MAlloc(128);
|
||||
_buf=&buf;
|
||||
@@ -79,9 +79,9 @@ U8 *MPrintQ(U8 *ptr,I64 flags)
|
||||
case '$$':
|
||||
if (flags&SPF_DOLLAR) {
|
||||
SPutChar(_dst,'\\',_buf);
|
||||
SPutChar(_dst,'$$'>>6&7+'0',_buf);
|
||||
SPutChar(_dst,'$$'>>3&7+'0',_buf);
|
||||
SPutChar(_dst,'$$'&7+'0',_buf);
|
||||
SPutChar(_dst,'x',_buf);
|
||||
SPutChar(_dst,'2',_buf);
|
||||
SPutChar(_dst,'4',_buf);
|
||||
} else {
|
||||
SPutChar(_dst,ch,_buf);
|
||||
SPutChar(_dst,ch,_buf);
|
||||
@@ -110,13 +110,13 @@ U8 *MPrintQ(U8 *ptr,I64 flags)
|
||||
SPutChar(_dst,ch,_buf);
|
||||
break;
|
||||
default:
|
||||
if (CH_SHIFT_SPACE<=ch<=0x7F) {
|
||||
if (ch>=CH_SHIFT_SPACE && ch!=0x7F)
|
||||
SPutChar(_dst,ch,_buf);
|
||||
} else {
|
||||
SPutChar(_dst,'\\',_buf);
|
||||
SPutChar(_dst,ch>>6&7+'0',_buf);
|
||||
SPutChar(_dst,ch>>3&7+'0',_buf);
|
||||
SPutChar(_dst,ch&7+'0',_buf);
|
||||
else {
|
||||
StrPrint(buf2,"\\x%02X",ch);
|
||||
ptr2=buf2;
|
||||
while (*ptr2)
|
||||
SPutChar(_dst,*ptr2++,_buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -160,56 +160,27 @@ U8 *MPrintq(U8 *ptr,I64 flags)
|
||||
case 't':
|
||||
SPutChar(_dst,'\t',_buf);
|
||||
break;
|
||||
case '0':
|
||||
SPutChar(_dst,0,_buf);
|
||||
break;
|
||||
sub_switch_end:
|
||||
ptr++;
|
||||
break;
|
||||
|
||||
sub_switch_start:
|
||||
case 'x':
|
||||
case 'X':
|
||||
i=0;
|
||||
ptr++;
|
||||
while (TRUE) {
|
||||
ch1=ToUpper(*ptr++);
|
||||
if (Bt(chars_bitmap_hex_numeric,ch1)) {
|
||||
if (ch1<='9')
|
||||
i=i<<4+ch1-'0';
|
||||
else
|
||||
i=i<<4+ch1-'A'+10;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
case 'B':
|
||||
i=0;
|
||||
ptr++;
|
||||
while (TRUE) {
|
||||
ch1=*ptr++;
|
||||
if ('0'<=ch1<='1')
|
||||
i=i<<1+ch1-'0';
|
||||
case 'x':
|
||||
case 'X':
|
||||
i=0;
|
||||
ptr++;
|
||||
while (TRUE) {
|
||||
ch1=ToUpper(*ptr++);
|
||||
if (Bt(chars_bitmap_hex_numeric,ch1)) {
|
||||
if (ch1<='9')
|
||||
i=i<<4+ch1-'0';
|
||||
else
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
case 'O':
|
||||
i=0;
|
||||
ptr++;
|
||||
goto sq_octal;
|
||||
case '0'...'7':
|
||||
i=ch1-'0';
|
||||
ptr++;
|
||||
sq_octal:
|
||||
while (TRUE) {
|
||||
ch1=*ptr++;
|
||||
if ('0'<=ch1<='7')
|
||||
i=i<<3+ch1-'0';
|
||||
else
|
||||
break;
|
||||
}
|
||||
break;
|
||||
sub_switch_end:
|
||||
i=i<<4+ch1-'A'+10;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
SPutChar(_dst,i,_buf);
|
||||
ptr--;
|
||||
break;
|
||||
@@ -897,30 +868,6 @@ sp_out_eng: //Engineering notation
|
||||
} while (m && k<TEMP_BUF_LEN-SLOP);
|
||||
goto sp_out_num;
|
||||
}
|
||||
case 'o':
|
||||
case 'O':
|
||||
if (cur_arg>=argc)
|
||||
throw('StrPrint');
|
||||
m=argv[cur_arg++];
|
||||
if (flags&SPF_COMMA) {
|
||||
comma_fmt_cnt=comma_cnt=3;
|
||||
do {
|
||||
temp_buf[k++]= m&7 +'0';
|
||||
m>>=3;
|
||||
if (!m) break;
|
||||
if (!--comma_cnt) {
|
||||
temp_buf[k++]=',';
|
||||
comma_cnt=3;
|
||||
}
|
||||
} while (k<TEMP_BUF_LEN-SLOP);
|
||||
goto sp_out_comma_num;
|
||||
} else {
|
||||
do {
|
||||
temp_buf[k++]= m&7 +'0';
|
||||
m>>=3;
|
||||
} while (m && k<TEMP_BUF_LEN-SLOP);
|
||||
goto sp_out_num;
|
||||
}
|
||||
case '%':
|
||||
SPutChar(_dst,'%',_buf);
|
||||
break;
|
||||
|
||||
+1
-2
@@ -25,7 +25,6 @@ I64 Str2I64(U8 *st,I64 radix=10,U8 **_end_ptr=NULL)
|
||||
if (ch>='B' && (radix<=10 || ch>'A'+radix-11))
|
||||
switch (ch) {
|
||||
case 'B': radix=2; st++; break;
|
||||
case 'O': radix=8; st++; break;
|
||||
case 'D': radix=10; st++; break;
|
||||
case 'X': radix=16; st++; break;
|
||||
}
|
||||
@@ -141,7 +140,7 @@ CDate Str2Date(U8 *_src)
|
||||
It also supports some funs
|
||||
SM() start of mon
|
||||
EM() end of mon
|
||||
SM() start of year
|
||||
SY() start of year
|
||||
EY() end of year
|
||||
Full expressions are not implimented
|
||||
but you can do stuff like SM(*-7)+3
|
||||
|
||||
@@ -25,30 +25,25 @@ Bool TaskValidate(CTask *task)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
U0 Kill(CTask *task,Bool wait=TRUE)
|
||||
Bool Kill(CTask *task,Bool wait=TRUE)
|
||||
{//Terminate other task.
|
||||
I64 i;
|
||||
CCPU *c;
|
||||
Bool found,old_preempt=Preempt(OFF);
|
||||
if (TaskValidate(task)) {
|
||||
if (task==sys_winmgr_task)
|
||||
found=TRUE;
|
||||
else
|
||||
found=FALSE;
|
||||
for (i=0;i<mp_cnt;i++) {
|
||||
c=&cpu_structs[i];
|
||||
if (task==c->seth_task)
|
||||
found=TRUE;
|
||||
}
|
||||
if (!found) {
|
||||
LBts(&task->task_flags,TASKf_KILL_TASK);
|
||||
if (wait) {
|
||||
do Yield;
|
||||
while (TaskValidate(task) && Bt(&task->task_flags,TASKf_KILL_TASK));
|
||||
}
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
if (TaskValidate(task) && task!=sys_winmgr_task) {
|
||||
for (i=0;i<mp_cnt;i++)
|
||||
if (task==cpu_structs[i].seth_task)
|
||||
goto kl_fail;
|
||||
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;
|
||||
}
|
||||
|
||||
Bool Suspend(CTask *task=NULL,Bool state=TRUE)
|
||||
@@ -86,6 +81,7 @@ CTaskStk *TaskStkNew(I64 stk_size,CTask *task)
|
||||
#exe {OptOn(OPTf_NO_REG_VAR);};
|
||||
argpop I64 CallStkGrow(I64 stk_size_threshold,I64 stk_size,/*argpop*/I64 (*fp_addr)(...),...)
|
||||
{//Grow stk in call with any fixed num of args.
|
||||
//See $LK,"::/Demo/StkGrow.CPP"$.
|
||||
CTaskStk *temps,*temps2,**_stk;
|
||||
I64 result,*rsp,*rsp2,*old_stk;
|
||||
|
||||
@@ -183,22 +179,10 @@ I64 TaskInit(CTask *task,I64 stk_size)
|
||||
task->fpu_mmx=MAllocAligned(sizeof(CFPU),0x10,task);
|
||||
MemCpy(task->fpu_mmx,SYS_FIXED_AREA+offset(CSysFixedArea.init_fpu_mmx),sizeof(CFPU));
|
||||
|
||||
if (task==SYS_FIXED_AREA+offset(CSysFixedArea.adam)) {
|
||||
// Delayed until heap expanded. See $LK,"Expand Heap",A="FA:::/Kernel/Mem1a.CPP,ExpandHeap"$
|
||||
// task->hash_table=HashTableNew(ADAM_HASH_SIZE,task);
|
||||
} else {
|
||||
if (!Gs->num)
|
||||
task->hash_table=HashTableNew(STD_HASH_SIZE,task);
|
||||
else
|
||||
task->hash_table=HashTableNew(MP_STD_HASH_SIZE,task);
|
||||
}
|
||||
task->hash_table=HashTableNew(TASK_HASH_SIZE,task);
|
||||
|
||||
if (!stk_size) {
|
||||
if (!Gs->num)
|
||||
stk_size=DFT_STK;
|
||||
else
|
||||
stk_size=MP_DFT_STK;
|
||||
}
|
||||
if (!stk_size)
|
||||
stk_size=DFT_STK;
|
||||
task->stk=temps=TaskStkNew(stk_size,task);
|
||||
task->rsp=(&temps->stk_base)(U8 *)+temps->stk_size;
|
||||
|
||||
@@ -211,9 +195,11 @@ I64 TaskInit(CTask *task,I64 stk_size)
|
||||
task->win_top =13;
|
||||
task->win_bottom =text.rows-2;
|
||||
|
||||
//Beware Adam $LK,"TaskInit",A="FF:::/Kernel/KStart.CPP,TaskInit"$ gets NULL. Okay, I guess, until $LK,"ChgDsk",A="FF:::/Kernel/KEnd.CPP,ChgDsk"$().
|
||||
task->cur_prt=dsk.drv_to_prt[ToUpper(*sys_acct)-'A'];
|
||||
task->cur_dir=StrNew(sys_acct+2,task);
|
||||
if (dsk.boot_drv_let) //Beware Adam $LK,"TaskInit",A="FF:::/Kernel/KStart.CPP,TaskInit"$. Okay, I guess, until $LK,"ChgDsk",A="FF:::/Kernel/KEnd.CPP,ChgDsk"$().
|
||||
task->cur_dv=dsk.let_to_drv[ToUpper(dsk.boot_drv_let)-'A'];
|
||||
task->cur_dir=StrNew("/Home",task);
|
||||
|
||||
Seed(,task);
|
||||
|
||||
return task;
|
||||
}
|
||||
@@ -226,7 +212,7 @@ CTask *Spawn(U0 (*fp_start_addr)(U8 *data),U8 *data=NULL,
|
||||
I64 flags=1<<SVCf_ADD_TO_QUE)
|
||||
{//Create task on core running at address.
|
||||
//Alloc $LK,"CTask",A="MN:CTask"$ structure from code heap so addr will be short.
|
||||
//Could be allocated off of data heap.
|
||||
//Could be alloced off of data heap.
|
||||
CTask *task;
|
||||
if (target_cpu>=0)
|
||||
return SpawnQue(fp_start_addr,data,task_name,target_cpu,parent,stk_size,flags);
|
||||
@@ -375,7 +361,7 @@ U0 UserCmdLine(I64 dummy=0)
|
||||
UserTaskCont;
|
||||
}
|
||||
|
||||
CTask *SpawnUser(U8 *fmt=NULL,...)
|
||||
CTask *User(U8 *fmt=NULL,...)
|
||||
{//Create user term task.
|
||||
U8 *st;
|
||||
CTask *task=Spawn(&UserCmdLine);
|
||||
@@ -401,7 +387,7 @@ U0 SrvTaskCont()
|
||||
}
|
||||
}
|
||||
|
||||
U0 SrvUserCmdLine(I64 dummy=0)
|
||||
U0 SrvCmdLine(I64 dummy=0)
|
||||
{
|
||||
nounusedwarn dummy;
|
||||
Fs->win_inhibit=WIG_USER_TASK_DFT;
|
||||
@@ -440,7 +426,7 @@ I64 TaskEnd()
|
||||
return task->parent_task;
|
||||
}
|
||||
|
||||
PrtsRelease;
|
||||
DrvsRelease;
|
||||
BlkDevsRelease;
|
||||
tempt1=(&task->next_child_task)(U8 *)-offset(CTask.next_sibling_task);
|
||||
tempt=tempt1->next_sibling_task;
|
||||
Reference in new issue
Block a user