⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config.c

📁 GNU FreeDOS兼容MS DOS很好的东东.
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -