hschumann2/TempleOS-Source-Code
0847
1 2#help_index "Install;File/Cmd Line (Typically);Cmd Line (Typically);"3U8 Mount2(U8 boot_drv_let,CDoc *_doc,Bool _caller_is_prtdsk)4{//If _doc, called by ::/Kernel/KCfg.HC else called by Mount().5 I64 cnt,total=0,num_hints,drv_let,type,unit,prt_num;6 U8 blks_buf[STR_LEN],addr_buf[STR_LEN],base0_buf[STR_LEN],base1_buf[STR_LEN],7 *filename=NULL,*filename2=NULL,res=0;8 CATARep *head=NULL,*tmpha;9 Bool whole_drv,make_free;10 CDoc *doc;11 if (boot_drv_let)12 boot_drv_let=Let2Let(boot_drv_let);13 do {14 cnt=0;15 if (!_doc)16 DrvRep;17 "\n****** Mount Drives ******\n"18 "$GREEN$A$FG$-$GREEN$B$FG$ are RAM drives.\n"19 "$GREEN$C$FG$-$GREEN$L$FG$ are ATA hard drives.\n"20 "$GREEN$M$FG$-$GREEN$P$FG$ are ISO file read drives.\n"21 "$GREEN$Q$FG$-$GREEN$S$FG$ are ISO file write drives.\n"22 "$GREEN$T$FG$-$GREEN$Z$FG$ are ATAPI CD/DVD drives.\n"23 "\nDrive Letter ($PURPLE$<ENTER>$FG$ to exit):";24 drv_let=Let2Let(GetChar);25 '\n';26 if (type=Let2BlkDevType(drv_let)) {27 whole_drv=FALSE;28 if (_doc) { //Called by ::/Kernel/KCfg.HC29 doc=_doc;30 make_free=FALSE;31 } else { //Called by Mount()32 doc=DocNew;33 DocPrint(doc,"CBlkDev *bd;\n");34 make_free=TRUE;35 }36 unit=0;37 prt_num=I64_MIN;38 switch (type) {39 case BDT_RAM:40 "Addr of RAM disk ($PURPLE$<ENTER>$FG$ to MAlloc):";41 GetS(addr_buf,STR_LEN);42 case BDT_ISO_FILE_WRITE:43 "Blks of 512 bytes:";44 GetS(blks_buf,STR_LEN);45 break;46 case BDT_ISO_FILE_READ:47 filename=GetStr("File Name:");48 break;49 case BDT_ATA:50 prt_num=GetI64("Partition Num (Default=All):",prt_num);51 case BDT_ATAPI:52 num_hints=ATARep(,,&head);53 if (type==BDT_ATAPI && boot_drv_let)54 "<ENTER> to use booted CD/DVD\n"; //Only ::/Kernel/KCfg.HC55 do {56 if (num_hints)57 "Enter dev number or\nport with $PURPLE$0x$FG$ prefix.\n"58 "I/O Port Base0:\n";59 else60 "Include $PURPLE$0x$FG$ prefix.\nI/O Port Base0:\n";61 GetS(base0_buf,STR_LEN);62 } while (!Str2I64(base0_buf) && (type!=BDT_ATAPI || !boot_drv_let));63 if (1<=Str2I64(base0_buf)<=num_hints) {64 tmpha=ATARepFind(head,Str2I64(base0_buf));65 StrPrint(base0_buf,"0x%X",tmpha->base0);66 StrPrint(base1_buf,"0x%X",tmpha->base1);67 unit=tmpha->unit;68 } else if (type!=BDT_ATAPI || *base0_buf) {69 if (type==BDT_ATAPI)70 StrCpy(base1_buf,"0");71 else72 do {73 "I/O Port Base1:\n";74 GetS(base1_buf,STR_LEN);75 } while (!Str2I64(base1_buf));76 do {77 "\t$PURPLE$0$FG$=Master\n\t$PURPLE$1$FG$=Slave\nUnit:";78 unit=GetChar-'0';79 } while (!(0<=unit<=1));80 '\n';81 }82 LinkedLstDel(head);83 break;84 }85 DocPrint(doc,"bd=BlkDevNextFreeSlot(\'%C\',%d);bd->unit=%d;\n",86 drv_let,type,unit);87 switch (type) {88 case BDT_RAM:89 if (!*addr_buf) StrCpy(addr_buf,"0");90 DocPrint(doc,"bd->RAM_dsk=%s;\n",addr_buf);91 case BDT_ISO_FILE_WRITE:92 if (!*blks_buf) StrCpy(blks_buf,"0");93 DocPrint(doc,"bd->max_blk=(%s)-1;\n",blks_buf);94 DocPrint(doc,"bd->drv_offset=19<<2+"95 "(DVD_BLK_SIZE*2+DVD_BOOT_LOADER_SIZE)/BLK_SIZE;\n");96 break;97 case BDT_ISO_FILE_READ:98 filename2=FileNameAbs(filename);99 DocPrint(doc,"bd->file_dsk_name=AStrNew(\"%s\");\n",filename2);100 DocPrint(doc,"bd->drv_offset=19<<2+"101 "(DVD_BLK_SIZE*2+DVD_BOOT_LOADER_SIZE)/BLK_SIZE;\n");102 break;103 case BDT_ATA:104 case BDT_ATAPI:105 if (type==BDT_ATAPI && !*base0_buf) {106 DocPrint(doc,"GetBaseUnit(bd);\n"); //Only ::/Kernel/KCfg.HC107 if (drv_let==boot_drv_let)108 make_free=TRUE;109 } else110 DocPrint(doc,"bd->base0=%s;bd->base1=%s;\n",base0_buf,base1_buf);111 if (type==BDT_ATA && _caller_is_prtdsk) {112 "\nReformat WHOLE drive!";113 whole_drv=YorN;114 }115 break;116 }117 DocPrint(doc,"BlkDevAdd(bd,%d,%d,%d);\n",prt_num,whole_drv,make_free);118 if (_doc) //Called by ::/Kernel/KCfg.HC119 cnt++;120 else { //Called by Mount()121 if ((cnt=ExeDoc(doc)) && whole_drv) {122 if (_caller_is_prtdsk) {123 res=drv_let;124 DskPrt(drv_let,1.0); //First mount whole drive.125 } else126 DskPrt(drv_let);127 }128 DocDel(doc);129 }130 }131 total+=cnt;132 } while (cnt && !_caller_is_prtdsk ||133 !total && _doc); //At least 1 if Called by ::/Kernel/KCfg.HC134 Free(filename);135 Free(filename2);136 return res;137}138 139public U8 Mount(Bool caller_is_prtdsk=FALSE)140{//Mount drives. Called from DskPrt(Mount).141 return Mount2(0,NULL,caller_is_prtdsk);142}143 144public U0 Unmount(U8 drv_let=0)145{//Unmount drive(s).146 BlkDevDel(Let2BlkDev(drv_let));147}148 149public U8 MountFile(U8 *filename)150{//Mount ISO.C file.151 U8 *filename2=ExtDft(filename,"ISO.C"),*filename3=FileNameAbs(filename2);152 CDrv *dv=DrvMakeFreeSlot(DrvNextFreeLet('M')); //First BDT_ISO_FILE_READ153 CBlkDev *bd=BlkDevNextFreeSlot(dv->drv_let,BDT_ISO_FILE_READ);154 bd->drv_offset=19<<2+(DVD_BLK_SIZE*2+DVD_BOOT_LOADER_SIZE)/BLK_SIZE;155 bd->file_dsk_name=AStrNew(filename3);156 BlkDevAdd(bd,,TRUE,TRUE);157 Free(filename3);158 Free(filename2);159 return dv->drv_let;160}161 