📄 config.c
字号:
COUNT major, minor; char *p = strchr(pLine, '.'); if (p == NULL) return; p++; /* Get major number */ if (GetNumArg(pLine, &major) == (BYTE *) 0) return; /* Get minor number */ if (GetNumArg(p, &minor) == (BYTE *) 0) return; printf("Changing reported version to %d.%d\n", major, minor); LoL->os_major = major; LoL->os_minor = minor;}STATIC VOID Files(BYTE * pLine){ COUNT nFiles; /* Get the argument */ if (GetNumArg(pLine, &nFiles) == (BYTE *) 0) return; /* Got the value, assign either default or new value */ Config.cfgFiles = max(Config.cfgFiles, nFiles); Config.cfgFilesHigh = 0;}STATIC VOID FilesHigh(BYTE * pLine){ Files(pLine); Config.cfgFilesHigh = 1;}STATIC VOID CfgLastdrive(BYTE * pLine){ /* Format: LASTDRIVE = letter */ BYTE drv; pLine = skipwh(pLine); drv = toupper(*pLine); if (drv < 'A' || drv > 'Z') { CfgFailure(pLine); return; } drv -= 'A' - 1; /* Make real number */ if (drv > Config.cfgLastdrive) Config.cfgLastdrive = drv; Config.cfgLastdriveHigh = 0;}STATIC VOID CfgLastdriveHigh(BYTE * pLine){ /* Format: LASTDRIVEHIGH = letter */ CfgLastdrive(pLine); Config.cfgLastdriveHigh = 1;}/* UmbState of confidence, 1 is sure, 2 maybe, 4 unknown and 0 no way.*/STATIC VOID Dosmem(BYTE * pLine){ BYTE *pTmp; BYTE UMBwanted = FALSE; pLine = GetStringArg(pLine, szBuf); strupr(szBuf); /* printf("DOS called with %s\n", szBuf); */ for (pTmp = szBuf;;) { if (memcmp(pTmp, "UMB", 3) == 0) { UMBwanted = TRUE; pTmp += 3; } if (memcmp(pTmp, "HIGH", 4) == 0) { HMAState = HMA_REQ; pTmp += 4; }/* if (memcmp(pTmp, "CLAIMINIT",9) == 0) { INITDataSegmentClaimed = 0; pTmp += 9; }*/ pTmp = skipwh(pTmp); if (*pTmp != ',') break; pTmp++; } if (UmbState == 0) { LoL->uppermem_link = 0; LoL->uppermem_root = 0xffff; UmbState = UMBwanted ? 2 : 0; } /* Check if HMA is available straight away */ if (HMAState == HMA_REQ && MoveKernelToHMA()) { HMAState = HMA_DONE; }}STATIC VOID DosData(BYTE * pLine){ pLine = GetStringArg(pLine, szBuf); strupr(szBuf); if (memcmp(szBuf, "UMB", 3) == 0) Config.cfgDosDataUmb = TRUE;}STATIC VOID CfgSwitchar(BYTE * pLine){ /* Format: SWITCHAR = character */ GetStringArg(pLine, szBuf); init_switchar(*szBuf);}STATIC VOID CfgSwitches(BYTE * pLine){ pLine = skipwh(pLine); if (*pLine == '=') { pLine = skipwh(pLine + 1); } while (*pLine) { if (*pLine == '/') { pLine++; switch(toupper(*pLine)) { case 'K': if (commands[0].pass == 1) kbdType = 0; /* force conv keyb */ break; case 'N': InitKernelConfig.SkipConfigSeconds = -1; break; case 'F': InitKernelConfig.SkipConfigSeconds = 0; break; case 'E': /* /E[[:]nnnn] Set the desired EBDA amount to move in bytes */ { /* Note that if there is no EBDA, this will have no effect */ int n = 0; if (*++pLine == ':') pLine++; /* skip optional separator */ if (!isnum(*pLine)) { pLine--; break; } pLine = GetNumArg(pLine, &n) - 1; /* allowed values: [48..1024] bytes, multiples of 16 * e.g. AwardBIOS: 48, AMIBIOS: 1024 * (Phoenix, MRBIOS, Unicore = ????) */ if (n == -1) { Config.ebda2move = 0xffff; break; } else if (n >= 48 && n <= 1024) { Config.ebda2move = (n + 15) & 0xfff0; break; } /* else fall through (failure) */ } default: CfgFailure(pLine); } } else { CfgFailure(pLine); } pLine = skipwh(pLine+1); } commands[0].pass = 1;}STATIC VOID Fcbs(BYTE * pLine){ /* Format: FCBS = totalFcbs [,protectedFcbs] */ COUNT fcbs; if ((pLine = GetNumArg(pLine, &fcbs)) == 0) return; Config.cfgFcbs = fcbs; pLine = skipwh(pLine); if (*pLine == ',') { GetNumArg(++pLine, &fcbs); Config.cfgProtFcbs = fcbs; } if (Config.cfgProtFcbs > Config.cfgFcbs) Config.cfgProtFcbs = Config.cfgFcbs;}/* LoadCountryInfo(): * Searches a file in the COUNTRY.SYS format for an entry * matching the specified code page and country code, and loads * the corresponding information into memory. If code page is 0, * the default code page for the country will be used. * * Returns TRUE if successful, FALSE if not. */#if 0STATIC BOOL LoadCountryInfo(char *filename, UWORD ctryCode, UWORD codePage){ printf("Sorry, the COUNTRY= statement has been temporarily disabled\n"); UNREFERENCED_PARAMETER(codePage); UNREFERENCED_PARAMETER(ctryCode); UNREFERENCED_PARAMETER(filename); return FALSE;} #endifSTATIC VOID Country(BYTE * pLine){ /* Format: COUNTRY = countryCode, [codePage], filename */ COUNT ctryCode; COUNT codePage = NLS_DEFAULT; char *filename = ""; if ((pLine = GetNumArg(pLine, &ctryCode)) == 0) goto error; /* currently 'implemented' COUNTRY=49 */#if 0 pLine = skipwh(pLine); if (*pLine == ',') { pLine = skipwh(pLine + 1); if (*pLine != ',') if ((pLine = GetNumArg(pLine, &codePage)) == 0) goto error; pLine = skipwh(pLine); if (*pLine == ',') { GetStringArg(++pLine, szBuf); filename = szBuf; } } #endif if (!LoadCountryInfoHardCoded(filename, ctryCode, codePage)) return; error: CfgFailure(pLine);}STATIC VOID Stacks(BYTE * pLine){ COUNT stacks; /* Format: STACKS = stacks [, stackSize] */ pLine = GetNumArg(pLine, &stacks); Config.cfgStacks = stacks; pLine = skipwh(pLine); if (*pLine == ',') { GetNumArg(++pLine, &stacks); Config.cfgStackSize = stacks; } if (Config.cfgStacks) { if (Config.cfgStackSize < 32) Config.cfgStackSize = 32; if (Config.cfgStackSize > 512) Config.cfgStackSize = 512; if (Config.cfgStacks > 64) Config.cfgStacks = 64; } Config.cfgStacksHigh = 0;}STATIC VOID StacksHigh(BYTE * pLine){ Stacks(pLine); Config.cfgStacksHigh = 1;}STATIC VOID InitPgmHigh(BYTE * pLine){ InitPgm(pLine); Config.cfgP_0_startmode = 0x80;}STATIC VOID InitPgm(BYTE * pLine){ static char init[NAMEMAX]; static char inittail[NAMEMAX]; Config.cfgInit = init; Config.cfgInitTail = inittail; /* Get the string argument that represents the new init pgm */ pLine = GetStringArg(pLine, Config.cfgInit); /* Now take whatever tail is left and add it on as a single */ /* string. */ strcpy(Config.cfgInitTail, pLine); /* and add a DOS new line just to be safe */ strcat(Config.cfgInitTail, "\r\n"); Config.cfgP_0_startmode = 0;}STATIC VOID CfgBreak(BYTE * pLine){ /* Format: BREAK = (ON | OFF) */ GetStringArg(pLine, szBuf); break_ena = strcaseequal(szBuf, "OFF") ? 0 : 1;}STATIC VOID Numlock(BYTE * pLine){ /* Format: NUMLOCK = (ON | OFF) */ BYTE FAR *keyflags = (BYTE FAR *) MK_FP(0x40, 0x17); GetStringArg(pLine, szBuf); *keyflags &= ~32; if (!strcaseequal(szBuf, "OFF")) *keyflags |= 32; keycheck();}STATIC VOID DeviceHigh(BYTE * pLine){ if (UmbState == 1) { if (LoadDevice(pLine, MK_FP(umb_start + UMB_top, 0), TRUE) == DE_NOMEM) { printf("Not enough free memory in UMB's: loading low\n"); LoadDevice(pLine, lpTop, FALSE); } } else { printf("UMB's unavailable!\n"); LoadDevice(pLine, lpTop, FALSE); }}STATIC void Device(BYTE * pLine){ LoadDevice(pLine, lpTop, FALSE);}STATIC BOOL LoadDevice(BYTE * pLine, char FAR *top, COUNT mode){ exec_blk eb; struct dhdr FAR *dhp; struct dhdr FAR *next_dhp; BOOL result; seg base, start; if (mode) { base = umb_base_seg; start = umb_start; } else { base = base_seg; start = LoL->first_mcb; } if (base == start) base++; base++; /* Get the device driver name */ GetStringArg(pLine, szBuf); /* The driver is loaded at the top of allocated memory. */ /* The device driver is paragraph aligned. */ eb.load.reloc = eb.load.load_seg = base;#ifdef DEBUG printf("Loading device driver %s at segment %04x\n", szBuf, base);#endif if ((result = init_DosExec(3, &eb, szBuf)) != SUCCESS) { CfgFailure(pLine); return result; } strcpy(szBuf, pLine); /* uppercase the device driver command */ strupr(szBuf); /* TE this fixes the loading of devices drivers with multiple devices in it. NUMEGA's SoftIce is such a beast */ /* add \r\n to the command line */ strcat(szBuf, " \r\n"); dhp = MK_FP(base, 0); /* NOTE - Modification for multisegmented device drivers: */ /* In order to emulate the functionallity experienced with other */ /* DOS operating systems, the original 'top' end address is */ /* updated with the end address returned from the INIT request. */ /* The updated end address is then used when issuing the next */ /* INIT request for the following device driver within the file */ for (next_dhp = NULL; FP_OFF(next_dhp) != 0xffff && (result = init_device(dhp, szBuf, mode, &top)) == SUCCESS; dhp = next_dhp) { next_dhp = MK_FP(FP_SEG(dhp), FP_OFF(dhp->dh_next)); /* Link in device driver and save LoL->nul_dev pointer to next */ dhp->dh_next = LoL->nul_dev.dh_next; LoL->nul_dev.dh_next = dhp; } /* might have been the UMB driver or DOS=UMB */ if (UmbState == 2) umb_init(); return result;}STATIC VOID CfgFailure(BYTE * pLine){ BYTE *pTmp = pLineStart; /* suppress multiple printing of same unrecognized lines */ if (nCfgLine < sizeof(ErrorAlreadyPrinted)*8) { if (ErrorAlreadyPrinted[nCfgLine/8] & (1 << (nCfgLine%8))) return; ErrorAlreadyPrinted[nCfgLine/8] |= (1 << (nCfgLine%8)); } printf("CONFIG.SYS error in line %d\n", nCfgLine); printf(">>>%s\n ", pTmp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -