//This is run in a $LK,"#exe",A="FF:::/Kernel/Kernel.PRJ,KCfg"${}. U8 *kernel_cfg_options="MemInit\0HeapInit\0VarInit\0" "NoMP\0TextMode\0DontProbe\0AutoMountIDE\0BootRescueDrv\0Help\0"; #define CFG_MEM_INIT 0 #define CFG_HEAP_INIT 1 #define CFG_VAR_INIT 2 #define CFG_NO_MP 3 #define CFG_TEXT_MODE 4 #define CFG_DONT_PROBE 5 #define CFG_AUTO_MOUNT_IDE 6 #define CFG_BOOT_RESCUE_DRV 7 #define CFG_NUM_OPTIONS 8 #define CFG_HELP 8 class CKernelCfg { 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, 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_drv_num,type,unit,cnt=0; U8 blks_buf[STR_LEN],addr_buf[STR_LEN],base0_buf[STR_LEN],base1_buf[STR_LEN]; CATARep *root=NULL,*tempha; CDoc *doc=DocNew; Bool make_free; "\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$$$$FG$$ for cur drv) Home Drv:"; ch=ToUpper(GetChar); if ('A'<=ch<='Z') c->boot_drv_let=ch; else 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"; do { "\n****** Mount Drives ******\n" "The first drive letter is the letter\n" "of the first partition. If adding\n" "a hard drive, you should pick 'C'.\n" "If more than one partition is present\n" "they will be lettered in sequence.\n" "\nFirst Drive Letter ($$PURPLE$$$$FG$$ to exit):"; first_drv_num=ToUpper(GetChar)-'A'; '\n'; if (0<=first_drv_num$$FG$$ to MAlloc):"; GetS(addr_buf,STR_LEN); "Blks of 512 bytes:"; GetS(blks_buf,STR_LEN); } else if (type==BDT_ATA || type==BDT_ATAPI) { num_hints=ATARep(,,&root); if (type==BDT_ATAPI) { " to use booted CD-ROM\n"; if (num_hints) "Enter dev number or\nport with $$PURPLE$$0x$$FG$$ prefix.\n" "I/O Port Base0:\n"; else "Include $$PURPLE$$0x$$FG$$ prefix.\nI/O Port Base0:\n"; GetS(base0_buf,STR_LEN); } else do { if (num_hints) "Enter dev number or\nport with $$PURPLE$$0x$$FG$$ prefix.\n" "I/O Port Base0:\n"; else "Include $$PURPLE$$0x$$FG$$ prefix.\nI/O Port Base0:\n"; GetS(base0_buf,STR_LEN); } while (!Str2I64(base0_buf)); if (1<=Str2I64(base0_buf)<=num_hints) { tempha=ATARepFind(root,Str2I64(base0_buf)); StrPrint(base0_buf,"0x%X",tempha->base0); StrPrint(base1_buf,"0x%X",tempha->base1); unit=tempha->unit; } else if (type!=BDT_ATAPI || *base0_buf) { if (type==BDT_ATAPI) StrCpy(base1_buf,"0"); else do { "I/O Port Base1:\n"; GetS(base1_buf,STR_LEN); } while (!Str2I64(base1_buf)); do { "\t$$PURPLE$$0$$FG$$=Master\n\t$$PURPLE$$1$$FG$$=Slave\nUnit:"; unit=GetChar-'0'; } while (!(0<=unit<=1)); '\n'; } LinkedLstDel(root); } if (BDT_NULLunit=%d;",first_drv_num+'A',type,unit); if (type==BDT_RAM) { if (!*addr_buf) StrCpy(addr_buf,"0"); 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(bd);"); if (first_drv_num+'A'==c->boot_drv_let) make_free=TRUE; } else DocPrint(doc,"bd->base0=%s;bd->base1=%s;", base0_buf,base1_buf); } 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_drv_numopts[i],"ST_OFF_ON"; "\nType '$$PURPLE$$Help$$FG$$' for help.\n"; st=GetStr("Option ($$PURPLE$$$$FG$$ when done):",""); i=LstMatch(st,kernel_cfg_options,LMF_IGNORE_CASE); if (i==CFG_HELP) "\n" "$$PURPLE$$MemInit$$FG$$ Initializes memory above 0x100000 " "to a val at boot.\n" "$$PURPLE$$HeapInit$$FG$$ Initializes MAlloc() memory to a val.\n" "$$PURPLE$$VarInit$$FG$$ Initializes glbl var memory to a val.\n" "$$PURPLE$$NoMP$$FG$$ No multicore.\n" "$$PURPLE$$TextMode$$FG$$ Text Mode (requires hard reboot).\n" "$$PURPLE$$DontProbe$$FG$$ Just prompt CD-ROM ports, don't probe.\n" "$$PURPLE$$AutoMountIDE$$FG$$ AutoMount IDE drives to 'C' and 'T'.\n" "$$PURPLE$$BootRescueDrv$$FG$$ Include RAM Drv in Kernel.BIN.\n" "\n"; else if (0<=iopts[i]=!c->opts[i]; switch (i) { case CFG_MEM_INIT: if (state) c->mem_init_val=GetI64("Val (0-255):",255,0,255); break; case CFG_HEAP_INIT: if (state) c->heap_init_val=GetI64("Val (0-255):",255,0,255); break; case CFG_VAR_INIT: if (state) c->var_init_val=GetI64("Val (0-255):",255,0,255); break; case CFG_AUTO_MOUNT_IDE: if (state) { "First HD Drive Let:"; c->auto_mount_ide_hd_let=ToUpper(GetChar); if (!('A'<=c->auto_mount_ide_hd_let<='Z')) c->auto_mount_ide_hd_let=0; '\n'; if (c->auto_mount_ide_hd_let) "First HD Drive:%C\n",c->auto_mount_ide_hd_let; else "First HD Drive:%C\n",'C'; "First CD Drive Let:"; c->auto_mount_ide_cd_let=ToUpper(GetChar); if (!('A'<=c->auto_mount_ide_cd_let<='Z')) c->auto_mount_ide_cd_let=0; '\n'; if (c->auto_mount_ide_cd_let) "First CD Drive:%C\n",c->auto_mount_ide_cd_let; else "First CD Drive:%C\n",'T'; } else { c->auto_mount_ide_hd_let=0; c->auto_mount_ide_cd_let=0; } break; case CFG_BOOT_RESCUE_DRV: Free(c->boot_rescue_drv_file); c->boot_rescue_drv_file=0; c->boot_rescue_drv_start=0; if (state) { c->boot_rescue_drv_file=GetStr("Boot Rescue Drv File:"); c->boot_rescue_drv_start=GetI64("Boot Rescue Drv Start:"); } break; } } } while (*st); Free(st); } CKernelCfg *KernelCfgNew() { CKernelCfg *c=CAlloc(sizeof(CKernelCfg)); c->add_dev=KernelCfgAddDev(c); c->dsk_cache_size_exp=GetStr( "Disk Cache Size in Bytes,\n" "gets rounded-up funny,\n" "($$PURPLE$$$$FG$$ will use default.):", "Scale2Mem(0x80000,0x8000000)"); KernelCfgOptions(c); return c; } U0 KernelCfgDel(CKernelCfg *c) { DocDel(c->add_dev); Free(c->boot_rescue_drv_file); Free(c->dsk_cache_size_exp); Free(c); }