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

📄 inthndlr.c

📁 GNU FreeDOS兼容MS DOS很好的东东.
💻 C
📖 第 1 页 / 共 4 页
字号:
      /* Load and Execute Program */    case 0x4b:      break_flg = FALSE;      rc = DosExec(lr.AL, MK_FP(lr.ES, lr.BX), FP_DS_DX);      goto short_check;      /* Terminate Program                                            */    case 0x00:      lr.AX = 0x4c00;      /* End Program                                                  */    case 0x4c:      if (((psp FAR *)MK_FP(cu_psp, 0))->ps_parent == cu_psp)        break;      tsr = FALSE;      rc = 0;      if (ErrorMode)      {        ErrorMode = FALSE;        rc = 0x200;      }      else if (break_flg)      {        break_flg = FALSE;        rc = 0x100;      }      return_code = lr.AL | rc;      if (DosMemCheck() != SUCCESS)        panic("MCB chain corrupted");#ifdef TSC      StartTrace();#endif      return_user();      break;      /* Get Child-program Return Value                               */    case 0x4d:      lr.AX = return_code;      /* needs to be cleared (RBIL) */      return_code = 0;      break;      /* Dos Find First                                               */    case 0x4e:      /* dta for this call is set on entry.  This     */      /* needs to be changed for new versions.        */      rc = DosFindFirst(lr.CX, FP_DS_DX);      lr.AX = 0;      goto short_check;      /* Dos Find Next                                                */    case 0x4f:      /* dta for this call is set on entry.  This     */      /* needs to be changed for new versions.        */      rc = DosFindNext();      lr.AX = 0;      goto short_check;/*    case 0x50:      case 0x51:    see int21_syscall*/      /* ************UNDOCUMENTED************************************* */      /* Get List of Lists                                            */    case 0x52:      lr.ES = FP_SEG(&DPBp);      lr.BX = FP_OFF(&DPBp);      break;    case 0x53:      /*  DOS 2+ internal - TRANSLATE BIOS PARAMETER BLOCK TO DRIVE PARAM BLOCK */      bpb_to_dpb((bpb FAR *) MK_FP(lr.DS, lr.SI),                 (struct dpb FAR *)MK_FP(lr.ES, r->BP)#ifdef WITHFAT32                 , (lr.CX == 0x4558 && lr.DX == 0x4152)#endif          );      break;      /* Get verify state                                             */    case 0x54:      lr.AL = verify_ena;      break;      /* ************UNDOCUMENTED************************************* */      /* Dos Create New Psp & set p_size                              */    case 0x55:      child_psp(lr.DX, cu_psp, lr.SI);      cu_psp = lr.DX;      break;      /* Dos Rename                                                   */    case 0x56:      rc = DosRename(FP_DS_DX, FP_ES_DI);      goto short_check;      /* Get/Set File Date and Time                                   */    case 0x57:      switch (lr.AL)      {        case 0x00:          rc = DosGetFtime((COUNT) lr.BX,       /* Handle               */                           &lr.DX,        /* FileDate             */                           &lr.CX);       /* FileTime             */          break;        case 0x01:          rc = DosSetFtime((COUNT) lr.BX,       /* Handle               */                           (date) lr.DX,        /* FileDate             */                           (time) lr.CX);       /* FileTime             */          break;        default:          goto error_invalid;      }      goto short_check;      /* Get/Set Allocation Strategy                                  */    case 0x58:      switch (lr.AL)      {        case 0x00:          lr.AL = mem_access_mode;          lr.AH = 0;          break;        case 0x01:          if (lr.BL > LAST_FIT_U ||                 /* 0x82       */              (lr.BL & FIT_MASK) > LAST_FIT)        /* 0x3f, 0x02 */            goto error_invalid;          mem_access_mode = lr.BL;          break;        case 0x02:          lr.AL = uppermem_link;          break;        case 0x03:	  if (uppermem_root != 0xffff)	  /* always error if not exists */          {            DosUmbLink(lr.BX);            break;          }          /* else fall through */        default:          goto error_invalid;#ifdef DEBUG        case 0xff:          show_chain();          break;#endif      }      break;      /* Get Extended Error */    case 0x59:      lr.AX = CritErrCode;      lr.ES = FP_SEG(CritErrDev);      lr.DI = FP_OFF(CritErrDev);      lr.CH = CritErrLocus;      lr.BH = CritErrClass;      lr.BL = CritErrAction;      break;      /* Create Temporary File */    case 0x5a:      lrc = DosMkTmp(FP_DS_DX, lr.CX);      goto long_check;      /* Create New File */    case 0x5b:      lrc = DosOpen(FP_DS_DX, O_LEGACY | O_RDWR | O_CREAT, lr.CX);      goto long_check;/* /// Added for SHARE.  - Ron Cemer */      /* Lock/unlock file access */    case 0x5c:      rc = DosLockUnlock           (lr.BX, ((unsigned long)lr.CX << 16) | lr.DX,                   ((unsigned long)lr.SI << 16) | lr.DI, lr.AL != 0);      if (rc != SUCCESS)        goto error_exit;      break;/* /// End of additions for SHARE.  - Ron Cemer */      /* UNDOCUMENTED: server, share.exe and sda function             */    case 0x5d:      switch (lr.AL)      {          /* Remote Server Call */        case 0x00:          fmemcpy(&lr, FP_DS_DX, sizeof(lr));          goto dispatch;        case 0x06:          lr.DS = FP_SEG(internal_data);          lr.SI = FP_OFF(internal_data);          lr.CX = swap_indos - internal_data;          lr.DX = swap_always - internal_data;          CLEAR_CARRY_FLAG();          break;        case 0x07:        case 0x08:        case 0x09:          rc = remote_printredir(lr.DX, Int21AX);          CLEAR_CARRY_FLAG();          if (rc != SUCCESS)            goto error_exit;          break;          /* Set Extended Error */        case 0x0a:          {            #define er (* MK_PTR (lregs, lr.DS, lr.DX))            CritErrCode        = er.AX;            CritErrDev         = MK_FP(er.ES, er.DI);            CritErrLocus       = er.CH;            CritErrClass       = er.BH;            CritErrAction      = er.BL;            #undef er            CLEAR_CARRY_FLAG();            break;          }        default:          CritErrCode = SUCCESS;          goto error_invalid;      }      break;    case 0x5e:      switch (lr.AL)      {        case 0x00:          lr.CX = get_machine_name(FP_DS_DX);          break;        case 0x01:          set_machine_name(FP_DS_DX, lr.CX);          break;        default:          rc = (int)network_redirector_mx(REM_PRINTSET, &lr, (void *)Int21AX);          goto short_check;      }      break;    case 0x5f:      if (lr.AL == 7 || lr.AL == 8)      {        if (lr.DL < lastdrive)        {          struct cds FAR *cdsp = CDSp + lr.DL;          if (FP_OFF(cdsp->cdsDpb))	/* letter of physical drive?	*/          {            cdsp->cdsFlags &= ~CDSPHYSDRV;            if (lr.AL == 7)              cdsp->cdsFlags |= CDSPHYSDRV;            break;          }        }        rc = DE_INVLDDRV;        goto error_exit;      }      else      {        rc = (int)network_redirector_mx(REM_DOREDIRECT, &lr, (void *)Int21AX);        /* the remote function manipulates *r directly !,           so we should not copy lr to r here            */        if (rc != SUCCESS)        {          CritErrCode = -rc;      /* Maybe set */          SET_CARRY_FLAG();        }        r->AX = -rc;        goto real_exit;      }    case 0x60:                 /* TRUENAME */      rc = DosTruename(MK_FP(lr.DS, lr.SI), adjust_far(FP_ES_DI));      goto short_check;#ifdef TSC      /* UNDOCUMENTED: no-op                                          */      /*                                                              */      /* DOS-C: tsc support                                           */    case 0x61:#ifdef DEBUG      switch (lr.AL)      {        case 0x01:          bTraceNext = TRUE;          break;        case 0x02:          bDumpRegs = FALSE;          break;      }#endif      lr.AL = 0x00;      break;#endif      /* UNDOCUMENTED: return current psp                                      case 0x62: is in int21_syscall         lr.BX = cu_psp;         break;       */      /* UNDOCUMENTED: Double byte and korean tables                  */    case 0x63:      {#if 0        /* not really supported, but will pass.                 */        lr.AL = 0x00;           /*jpp: according to interrupt list */        /*Bart: fails for PQDI and WATCOM utilities:            use the above again */#endif        switch (lr.AL)        {          case 0:            lr.DS = FP_SEG(&nlsDBCSHardcoded);            lr.SI = FP_OFF(&nlsDBCSHardcoded);            break;          case 1: /* set Korean Hangul input method to DL 0/1 */            lr.AL = 0xff;	/* flag error (AL would be 0 if okay) */            break;          case 2: /* get Korean Hangul input method setting to DL */            lr.AL = 0xff;	/* flag error, do not set DL */            break;          default:	/* is this the proper way to handle invalid AL? */            rc = -1;            goto error_exit;        }        break;      }/*    case 0x64:      see above (invalid)*/      /* Extended country info                                        */    case 0x65:      switch (lr.AL)      {        case 0x20:             /* upcase single character */          lr.DL = DosUpChar(lr.DL);          break;        case 0x21:             /* upcase memory area */          DosUpMem(FP_DS_DX, lr.CX);          break;        case 0x22:             /* upcase ASCIZ */          DosUpString(FP_DS_DX);          break;        case 0xA0:             /* upcase single character of filenames */          lr.DL = DosUpFChar(lr.DL);          break;        case 0xA1:             /* upcase memory area of filenames */          DosUpFMem(FP_DS_DX, lr.CX);          break;        case 0xA2:             /* upcase ASCIZ of filenames */          DosUpFString(FP_DS_DX);          break;        case 0x23:             /* check Yes/No response */          lr.AX = DosYesNo(lr.DL);          break;        default:#ifdef NLS_DEBUG          if ((rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI)) < 0)          {            printf("DosGetData() := %d\n", rc);            goto error_exit;          }          printf("DosGetData() returned successfully\n");          break;#else          rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI);          goto short_check;#endif      }      break;      /* Code Page functions */    case 0x66:        switch (lr.AL)        {          case 1:            rc = DosGetCodepage(&lr.BX, &lr.DX);            break;          case 2:            rc = DosSetCodepage(lr.BX, lr.DX);            break;          default:            goto error_invalid;        }        if (rc != SUCCESS)          goto error_exit;        break;      /* Set Max file handle count */    case 0x67:      rc = SetJFTSize(lr.BX);      goto short_check;      /* Flush file buffer -- COMMIT FILE.  */    case 0x68:    case 0x6a:      rc = DosCommit(lr.BX);      goto short_check;      /* Get/Set Serial Number */    case 0x69:      rc = (lr.BL == 0 ? default_drive : lr.BL - 1);      if (lr.AL < 2)      {        if (get_cds(rc) == NULL)        {          rc = DE_INVLDDRV;          goto error_exit;        }        if (get_dpb(rc) != NULL)        {          UWORD saveCX = lr.CX;          lr.CX = lr.AL == 0 ? 0x0866 : 0x0846;          lr.AL = 0x0d;          rc = DosDevIOctl(&lr);          lr.CX = saveCX;          goto short_check;        }      }      goto error_invalid;/*    case 0x6a: see case 0x68    case 0x6b: dummy func: return AL=0*/      /* Extended Open-Creat, not fully functional. (bits 4,5,6 of BH) */    case 0x6c:      /* high nibble must be <= 1, low nibble must be <= 2 */      if ((lr.DL & 0xef) > 0x2)        goto error_invalid;      lrc = DosOpen(MK_FP(lr.DS, lr.SI),                    (lr.BX & 0x70ff) | ((lr.DL & 3) << 8) |                    ((lr.DL & 0x10) << 6), lr.CL);      if (lrc >= SUCCESS)        /* action */        lr.CX = (UWORD)(lrc >> 16);      goto long_check;      /* case 0x6d and above not implemented : see default; return AL=0 */#ifdef WITHFAT32      /* LFN functions - fail with "function not supported" error code */    case 0x71:      lr.AL = 00;      goto error_carry;      /* DOS 7.0+ FAT32 extended functions */    case 0x73:      CLEAR_CARRY_FLAG();      CritErrCode = SUCCESS;      rc = int21_fat32(&lr);      goto short_check;#endif#ifdef WITHLFNAPI      /* FreeDOS LFN helper API functions */    case 0x74:      {        switch (lr.AL)        {          /* Allocate LFN inode */          case 0x01:            rc = lfn_allocate_inode();            break;          /* Free LFN inode */          case 0x02:            rc = lfn_free_inode(lr.BX);            break;          /* Setup LFN inode */          case 0x03:            rc = lfn_setup_inode(lr.BX, ((ULONG)lr.CX << 16) | lr.DX, ((ULONG)lr.SI << 16) | lr.DI);            break;          /* Create LFN entries */          case 0x04:            rc = lfn_create_entries(lr.BX, (lfn_inode_ptr)FP_DS_DX);            break;          /* Read next LFN */          case 0x05:            rc = lfn_dir_read(lr.BX, (lfn_inode_ptr)FP_DS_DX);            break;          /* Write SFN pointed by LFN inode */          case 0x06:            rc = lfn_dir_write(lr.BX);            break;          default:            goto error_invalid;        }        lr.AX = rc;        CLEAR_CARRY_FLAG();        goto short_check;      }#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -